@@ -14,51 +14,53 @@ pub(crate) struct PeerCerts {
1414 pub accepted_certs : Mutex < Vec < AcceptedCert > > ,
1515}
1616
17- pub ( crate ) extern "C" fn validate_peer_cert (
18- privdata : * mut :: std:: os:: raw:: c_void ,
19- _reason : * const :: std:: os:: raw:: c_char ,
20- ) -> :: std:: os:: raw:: c_int {
21- let client = unsafe { VpnClient :: ref_from_raw ( privdata) } ;
22- let vpninfo = client. vpninfo ;
23- let host = client. get_hostname ( ) ;
24- let port = client. get_port ( ) ;
17+ impl PeerCerts {
18+ pub ( crate ) extern "C" fn validate_peer_cert (
19+ privdata : * mut :: std:: os:: raw:: c_void ,
20+ _reason : * const :: std:: os:: raw:: c_char ,
21+ ) -> :: std:: os:: raw:: c_int {
22+ let client = unsafe { VpnClient :: ref_from_raw ( privdata) } ;
23+ let vpninfo = client. vpninfo ;
24+ let host = client. get_hostname ( ) ;
25+ let port = client. get_port ( ) ;
2526
26- let openssl_cert_guard = client. peer_certs . accepted_certs . lock ( ) ;
27- if let Ok ( openssl_cert) = openssl_cert_guard {
28- for cert in openssl_cert. iter ( ) . rev ( ) {
29- if ( host. is_none ( ) || cert. host == host) && ( port == 0 || cert. port == port) {
30- let fingerprint_in_cstr =
31- CString :: new ( cert. fingerprint . as_str ( ) ) . expect ( "Invalid fingerprint" ) ;
32- let err = unsafe {
33- openconnect_check_peer_cert_hash ( vpninfo, fingerprint_in_cstr. as_ptr ( ) )
34- } ;
35- if err == 0 {
36- return 0 ;
37- }
38- if err < 0 {
39- // TODO: log error
40- println ! ( "Could not check peer cert hash: {}" , cert. fingerprint) ;
27+ let openssl_cert_guard = client. peer_certs . accepted_certs . lock ( ) ;
28+ if let Ok ( openssl_cert) = openssl_cert_guard {
29+ for cert in openssl_cert. iter ( ) . rev ( ) {
30+ if ( host. is_none ( ) || cert. host == host) && ( port == 0 || cert. port == port) {
31+ let fingerprint_in_cstr =
32+ CString :: new ( cert. fingerprint . as_str ( ) ) . expect ( "Invalid fingerprint" ) ;
33+ let err = unsafe {
34+ openconnect_check_peer_cert_hash ( vpninfo, fingerprint_in_cstr. as_ptr ( ) )
35+ } ;
36+ if err == 0 {
37+ return 0 ;
38+ }
39+ if err < 0 {
40+ // TODO: log error
41+ println ! ( "Could not check peer cert hash: {}" , cert. fingerprint) ;
42+ }
4143 }
4244 }
4345 }
44- }
4546
46- let fingerprint = client. get_peer_cert_hash ( ) ;
47+ let fingerprint = client. get_peer_cert_hash ( ) ;
4748
48- if client. handle_accept_insecure_cert ( & fingerprint) {
49- let newcert = AcceptedCert {
50- fingerprint,
51- host,
52- port,
53- } ;
54- let openssl_cert_guard = client. peer_certs . accepted_certs . lock ( ) ;
55- if let Ok ( mut openssl_cert) = openssl_cert_guard {
56- openssl_cert. push ( newcert) ;
49+ if client. handle_accept_insecure_cert ( & fingerprint) {
50+ let newcert = AcceptedCert {
51+ fingerprint,
52+ host,
53+ port,
54+ } ;
55+ let openssl_cert_guard = client. peer_certs . accepted_certs . lock ( ) ;
56+ if let Ok ( mut openssl_cert) = openssl_cert_guard {
57+ openssl_cert. push ( newcert) ;
58+ }
59+ tracing:: debug!( "User accepted insecure certificate" ) ;
60+ 0
61+ } else {
62+ tracing:: debug!( "User rejected insecure certificate" ) ;
63+ 1
5764 }
58- println ! ( "User accepted insecure certificate" ) ;
59- 0
60- } else {
61- println ! ( "User rejected insecure certificate" ) ;
62- 1
6365 }
6466}
0 commit comments