@@ -12,6 +12,7 @@ pub mod storage;
1212#[ cfg( target_os = "macos" ) ]
1313pub use openconnect_sys:: helper_reluanch_as_root;
1414
15+ use cert:: OpenSSLCert ;
1516use config:: { Config , Entrypoint , LogLevel } ;
1617use events:: { EventHandlers , Events } ;
1718use form:: FormContext ;
@@ -46,6 +47,7 @@ pub struct VpnClient {
4647 callbacks : EventHandlers ,
4748 entrypoint : RwLock < Option < Entrypoint > > ,
4849 form_context : FormContext ,
50+ certs : OpenSSLCert ,
4951}
5052
5153unsafe impl Send for VpnClient { }
@@ -71,13 +73,13 @@ impl VpnClient {
7173 }
7274 }
7375
74- pub ( crate ) extern "C" fn validate_peer_cert (
75- _privdata : * mut :: std:: os:: raw:: c_void ,
76- _reason : * const :: std:: os:: raw:: c_char ,
77- ) -> :: std:: os:: raw:: c_int {
78- println ! ( "validate_peer_cert" ) ;
79- 0
80- }
76+ // pub(crate) extern "C" fn validate_peer_cert(
77+ // _privdata: *mut ::std::os::raw::c_void,
78+ // _reason: *const ::std::os::raw::c_char,
79+ // ) -> ::std::os::raw::c_int {
80+ // println!("validate_peer_cert");
81+ // 0
82+ // }
8183
8284 pub ( crate ) extern "C" fn default_setup_tun_vfn ( privdata : * mut :: std:: os:: raw:: c_void ) {
8385 let client = VpnClient :: from_c_void ( privdata) ;
@@ -155,6 +157,30 @@ impl VpnClient {
155157 println ! ( "stats: {:?}, {:?}" , dlts, stats) ;
156158 }
157159
160+ pub ( crate ) fn handle_accept_insecure_cert ( & self , fingerprint : & str ) -> bool {
161+ let entrypoint = self . entrypoint . read ( ) ;
162+ let accept_in_entrypoint_config = {
163+ if let Ok ( entrypoint) = entrypoint {
164+ ( * entrypoint)
165+ . as_ref ( )
166+ . map ( |entrypoint| entrypoint. accept_insecure_cert )
167+ . unwrap_or ( false )
168+ } else {
169+ false
170+ }
171+ } ;
172+
173+ if accept_in_entrypoint_config {
174+ return true ;
175+ }
176+
177+ if let Some ( ref handler) = self . callbacks . handle_peer_cert_invalid {
178+ handler ( fingerprint)
179+ } else {
180+ false
181+ }
182+ }
183+
158184 pub fn set_loglevel ( & self , level : LogLevel ) {
159185 unsafe {
160186 openconnect_set_loglevel ( self . vpninfo , level as i32 ) ;
@@ -408,6 +434,7 @@ impl Connectable for VpnClient {
408434 callbacks,
409435 entrypoint : RwLock :: new ( None ) ,
410436 form_context : FormContext :: default ( ) ,
437+ certs : OpenSSLCert :: default ( ) ,
411438 } ) ;
412439
413440 let instance = Arc :: into_raw ( instance) as * mut VpnClient ; // dangerous, leak for assign to vpninfo
@@ -423,7 +450,7 @@ impl Connectable for VpnClient {
423450
424451 let vpninfo = openconnect_vpninfo_new (
425452 useragent. as_ptr ( ) ,
426- Some ( Self :: validate_peer_cert) ,
453+ Some ( cert :: validate_peer_cert) ,
427454 None ,
428455 Some ( FormContext :: process_auth_form_cb) ,
429456 Some ( helper_format_vargs) , // format args on C side
0 commit comments