From 4cadfd736ff3b1dcc85b57dbd63aff8f0c7b3d0a Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 2 Nov 2021 15:55:26 -0700 Subject: [PATCH] move ffi code into its own file --- zeroidc/src/ext.rs | 132 +++++++++++++++++++++++++++++++++++++++++++++ zeroidc/src/lib.rs | 130 +------------------------------------------- 2 files changed, 134 insertions(+), 128 deletions(-) create mode 100644 zeroidc/src/ext.rs diff --git a/zeroidc/src/ext.rs b/zeroidc/src/ext.rs new file mode 100644 index 000000000..f76c4ef60 --- /dev/null +++ b/zeroidc/src/ext.rs @@ -0,0 +1,132 @@ +mod ext { + + use std::ffi::{CStr, CString}; + use std::os::raw::c_char; + + use crate::{AuthInfo, ZeroIDC}; + + #[no_mangle] + pub extern "C" fn zeroidc_new( + issuer: *const c_char, + client_id: *const c_char, + auth_endpoint: *const c_char, + web_listen_port: u16, + ) -> *mut ZeroIDC { + if issuer.is_null() { + println!("issuer is null"); + return std::ptr::null_mut(); + } + + if client_id.is_null() { + println!("client_id is null"); + return std::ptr::null_mut(); + } + + if auth_endpoint.is_null() { + println!("auth_endpoint is null"); + return std::ptr::null_mut(); + } + + let iss = unsafe { CStr::from_ptr(issuer) }; + let c_id = unsafe { CStr::from_ptr(client_id) }; + let auth_endpoint = unsafe { CStr::from_ptr(auth_endpoint) }; + match ZeroIDC::new( + iss.to_str().unwrap(), + c_id.to_str().unwrap(), + auth_endpoint.to_str().unwrap(), + web_listen_port, + ) { + Ok(idc) => { + return Box::into_raw(Box::new(idc)); + } + Err(s) => { + println!("Error creating ZeroIDC instance: {}", s); + return std::ptr::null_mut(); + } + } + } + + #[no_mangle] + pub extern "C" fn zeroidc_delete(ptr: *mut ZeroIDC) { + if ptr.is_null() { + return; + } + unsafe { + Box::from_raw(ptr); + } + } + + #[no_mangle] + pub extern "C" fn zeroidc_start(ptr: *mut ZeroIDC) { + let idc = unsafe { + assert!(!ptr.is_null()); + &mut *ptr + }; + idc.start(); + } + + #[no_mangle] + pub extern "C" fn zeroidc_stop(ptr: *mut ZeroIDC) { + let idc = unsafe { + assert!(!ptr.is_null()); + &mut *ptr + }; + idc.stop(); + } + + #[no_mangle] + pub extern "C" fn zeroidc_get_auth_info( + ptr: *mut ZeroIDC, + csrf_token: *const c_char, + nonce: *const c_char, + ) -> *mut AuthInfo { + let idc = unsafe { + assert!(!ptr.is_null()); + &mut *ptr + }; + + if csrf_token.is_null() { + println!("csrf_token is null"); + return std::ptr::null_mut(); + } + + if nonce.is_null() { + println!("nonce is null"); + return std::ptr::null_mut(); + } + + let csrf_token = unsafe { CStr::from_ptr(csrf_token) } + .to_str() + .unwrap() + .to_string(); + let nonce = unsafe { CStr::from_ptr(nonce) } + .to_str() + .unwrap() + .to_string(); + + match idc.get_auth_info(csrf_token, nonce) { + Some(a) => Box::into_raw(Box::new(a)), + None => std::ptr::null_mut(), + } + } + + #[no_mangle] + pub extern "C" fn zeroidc_auth_info_delete(ptr: *mut AuthInfo) { + if ptr.is_null() { + return; + } + unsafe { + Box::from_raw(ptr); + } + } + + #[no_mangle] + pub extern "C" fn zeroidc_get_auth_url(ptr: *mut AuthInfo) -> *const c_char { + let ai = unsafe { + assert!(!ptr.is_null()); + &mut *ptr + }; + let s = CString::new(ai.url.to_string()).unwrap(); + return s.as_ptr(); + } +} diff --git a/zeroidc/src/lib.rs b/zeroidc/src/lib.rs index fe27274dd..7de1f4abe 100644 --- a/zeroidc/src/lib.rs +++ b/zeroidc/src/lib.rs @@ -1,3 +1,5 @@ +pub mod ext; + extern crate base64; extern crate openidconnect; extern crate url; @@ -13,9 +15,6 @@ use openidconnect::{ClientId, CsrfToken, IssuerUrl, Nonce, PkceCodeChallenge, Re use url::Url; -use std::ffi::{CStr, CString}; -use std::os::raw::c_char; - pub struct ZeroIDC { inner: Arc>, } @@ -145,128 +144,3 @@ impl ZeroIDC { r } } - -#[no_mangle] -pub extern "C" fn zeroidc_new( - issuer: *const c_char, - client_id: *const c_char, - auth_endpoint: *const c_char, - web_listen_port: u16, -) -> *mut ZeroIDC { - if issuer.is_null() { - println!("issuer is null"); - return std::ptr::null_mut(); - } - - if client_id.is_null() { - println!("client_id is null"); - return std::ptr::null_mut(); - } - - if auth_endpoint.is_null() { - println!("auth_endpoint is null"); - return std::ptr::null_mut(); - } - - let iss = unsafe { CStr::from_ptr(issuer) }; - let c_id = unsafe { CStr::from_ptr(client_id) }; - let auth_endpoint = unsafe { CStr::from_ptr(auth_endpoint) }; - match ZeroIDC::new( - iss.to_str().unwrap(), - c_id.to_str().unwrap(), - auth_endpoint.to_str().unwrap(), - web_listen_port, - ) { - Ok(idc) => { - return Box::into_raw(Box::new(idc)); - } - Err(s) => { - println!("Error creating ZeroIDC instance: {}", s); - return std::ptr::null_mut(); - } - } -} - -#[no_mangle] -pub extern "C" fn zeroidc_delete(ptr: *mut ZeroIDC) { - if ptr.is_null() { - return; - } - unsafe { - Box::from_raw(ptr); - } -} - -#[no_mangle] -pub extern "C" fn zeroidc_start(ptr: *mut ZeroIDC) { - let idc = unsafe { - assert!(!ptr.is_null()); - &mut *ptr - }; - idc.start(); -} - -#[no_mangle] -pub extern "C" fn zeroidc_stop(ptr: *mut ZeroIDC) { - let idc = unsafe { - assert!(!ptr.is_null()); - &mut *ptr - }; - idc.stop(); -} - -#[no_mangle] -pub extern "C" fn zeroidc_get_auth_info( - ptr: *mut ZeroIDC, - csrf_token: *const c_char, - nonce: *const c_char, -) -> *mut AuthInfo { - let idc = unsafe { - assert!(!ptr.is_null()); - &mut *ptr - }; - - if csrf_token.is_null() { - println!("csrf_token is null"); - return std::ptr::null_mut(); - } - - if nonce.is_null() { - println!("nonce is null"); - return std::ptr::null_mut(); - } - - let csrf_token = unsafe { CStr::from_ptr(csrf_token) } - .to_str() - .unwrap() - .to_string(); - let nonce = unsafe { CStr::from_ptr(nonce) } - .to_str() - .unwrap() - .to_string(); - - match idc.get_auth_info(csrf_token, nonce) { - Some(a) => Box::into_raw(Box::new(a)), - None => std::ptr::null_mut(), - } -} - -#[no_mangle] -pub extern "C" fn zeroidc_auth_info_delete(ptr: *mut AuthInfo) { - if ptr.is_null() { - return; - } - unsafe { - Box::from_raw(ptr); - } -} - -#[no_mangle] -pub extern "C" fn zeroidc_get_auth_url(ptr: *mut AuthInfo) -> *const c_char { - let ai = unsafe { - assert!(!ptr.is_null()); - &mut *ptr - }; - let s = CString::new(ai.url.to_string()).unwrap(); - return s.as_ptr(); -}