Skip to content

Commit 9e5ced8

Browse files
committed
feat: impl naive logger
1 parent 677d486 commit 9e5ced8

File tree

9 files changed

+352
-104
lines changed

9 files changed

+352
-104
lines changed

Cargo.lock

Lines changed: 232 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ members = [
99

1010
[workspace.dependencies]
1111
lazy_static = "1.4.0"
12-
reqwest = { version = "0.11.25", features = [
12+
reqwest = { version = "0.12.2", features = [
1313
"multipart",
1414
"blocking",
1515
"cookies",
@@ -34,4 +34,6 @@ sha2 = "0.10.8"
3434
rand = "0.8.5"
3535
hex = "0.4.3"
3636
machine-uid = "0.5.1"
37-
chacha20poly1305 = "0.10.1"
37+
chacha20poly1305 = "0.10.1"
38+
tracing = "0.1.40"
39+
tracing-subscriber = "0.3.18"

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,13 @@ Special thanks to (MORE THAN) the following projects and technologies for making
5656
- [x] implement safe ffi
5757
- [x] implement password login
5858
- [x] implement cookie login
59+
- [x] implement ssl certificate validation
5960
- [ ] implement public key login
60-
- [ ] implement ssl certificate validation
6161

6262
### Client
6363

6464
- [x] implement password login
6565
- [x] implement oidc login
66-
- [ ] implement logs
66+
- [x] implement logs
67+
- [ ] waiting tracing file rotation
6768
- [ ] implement CLI

crates/openconnect-core/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ hex = { workspace = true }
3030
rand = { workspace = true }
3131
machine-uid = { workspace = true }
3232
chacha20poly1305 = { workspace = true }
33+
tracing = { workspace = true }
34+
tracing-subscriber = { workspace = true }
3335

3436
[target.'cfg(windows)'.dependencies]
3537
windows-sys = { workspace = true }

crates/openconnect-core/src/cert.rs

Lines changed: 41 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

crates/openconnect-core/src/form.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ impl FormManager {
9090
privdata: *mut ::std::os::raw::c_void,
9191
form: *mut openconnect_sys::oc_auth_form,
9292
) -> ::std::os::raw::c_int {
93-
println!("process_auth_form_cb");
93+
tracing::debug!("Calling process_auth_form_cb");
94+
9495
let client = unsafe { VpnClient::ref_from_raw(privdata) };
9596
unsafe {
9697
// TODO: review this
@@ -225,8 +226,8 @@ impl FormManager {
225226
return OC_FORM_RESULT_CANCELLED as i32;
226227
}
227228
}
228-
println!("Submitting form");
229-
println!();
229+
230+
tracing::debug!("Successfully processed auth form");
230231
OC_FORM_RESULT_OK as i32
231232
}
232233
}

crates/openconnect-core/src/lib.rs

Lines changed: 14 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,23 @@ pub mod elevator;
55
pub mod events;
66
pub mod form;
77
pub mod ip_info;
8+
pub mod log;
89
pub mod protocols;
910
pub mod result;
1011
pub mod stats;
1112
pub mod storage;
1213

13-
use cert::PeerCerts;
14-
use command::{CmdPipe, SIGNAL_HANDLE};
15-
use config::{Config, Entrypoint, LogLevel};
16-
use events::{EventHandlers, Events};
17-
use form::FormManager;
18-
use ip_info::IpInfo;
14+
use crate::cert::PeerCerts;
15+
use crate::command::{CmdPipe, SIGNAL_HANDLE};
16+
use crate::config::{Config, Entrypoint, LogLevel};
17+
use crate::events::{EventHandlers, Events};
18+
use crate::form::FormManager;
19+
use crate::ip_info::IpInfo;
20+
use crate::log::Logger;
21+
use crate::result::{EmitError, OpenconnectError, OpenconnectResult};
22+
use crate::stats::Stats;
23+
1924
use openconnect_sys::*;
20-
use result::{EmitError, OpenconnectError, OpenconnectResult};
21-
use stats::Stats;
2225
use std::{
2326
ffi::CString,
2427
sync::{
@@ -53,25 +56,6 @@ unsafe impl Send for VpnClient {}
5356
unsafe impl Sync for VpnClient {}
5457

5558
impl VpnClient {
56-
pub(crate) unsafe extern "C" fn handle_process_log(
57-
_privdata: *mut ::std::os::raw::c_void,
58-
level: ::std::os::raw::c_int,
59-
buf: *const ::std::os::raw::c_char,
60-
) {
61-
let buf = std::ffi::CStr::from_ptr(buf).to_str().ok();
62-
let level = level as u32;
63-
let level = match level {
64-
PRG_ERR => "ERR",
65-
PRG_INFO => "INFO",
66-
PRG_DEBUG => "DEBUG",
67-
PRG_TRACE => "TRACE",
68-
_ => "UNKNOWN",
69-
};
70-
if buf.is_some() {
71-
println!("{}: {}", level, buf.unwrap_or(""));
72-
}
73-
}
74-
7559
pub(crate) extern "C" fn default_setup_tun_vfn(privdata: *mut ::std::os::raw::c_void) {
7660
let client = unsafe { VpnClient::ref_from_raw(privdata) };
7761

@@ -410,7 +394,7 @@ impl VpnClient {
410394
unsafe {
411395
openconnect_vpninfo_free(self.vpninfo);
412396
}
413-
println!("free context");
397+
tracing::debug!("Client instance is dropped");
414398
}
415399
}
416400

@@ -454,11 +438,11 @@ impl Connectable for VpnClient {
454438
}
455439

456440
// format args on C side
457-
helper_set_global_progress_vfn(Some(Self::handle_process_log));
441+
helper_set_global_progress_vfn(Some(Logger::raw_handle_process_log));
458442

459443
let vpninfo = openconnect_vpninfo_new(
460444
useragent.as_ptr(),
461-
Some(cert::validate_peer_cert),
445+
Some(PeerCerts::validate_peer_cert),
462446
None,
463447
Some(FormManager::process_auth_form_cb),
464448
Some(helper_format_vargs), // format args on C side

crates/openconnect-core/src/log.rs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
use openconnect_sys::{PRG_DEBUG, PRG_ERR, PRG_INFO, PRG_TRACE};
2+
use tracing::{
3+
event,
4+
subscriber::{set_global_default, SetGlobalDefaultError},
5+
Level,
6+
};
7+
8+
pub struct Logger;
9+
10+
impl Logger {
11+
pub fn init() -> Result<(), SetGlobalDefaultError> {
12+
// for file based logging, waiting https://github.com/tokio-rs/tracing/pull/2497 to be merged
13+
let subscriber = tracing_subscriber::fmt()
14+
.compact()
15+
.with_level(true)
16+
.with_target(true)
17+
.with_max_level(Level::TRACE)
18+
.finish();
19+
20+
set_global_default(subscriber)
21+
}
22+
23+
pub(crate) unsafe extern "C" fn raw_handle_process_log(
24+
_privdata: *mut ::std::os::raw::c_void,
25+
level: ::std::os::raw::c_int,
26+
buf: *const ::std::os::raw::c_char,
27+
) {
28+
let buf = std::ffi::CStr::from_ptr(buf).to_str().ok();
29+
let level = level as u32;
30+
let level = match level {
31+
PRG_ERR => Level::ERROR,
32+
PRG_INFO => Level::INFO,
33+
PRG_DEBUG => Level::DEBUG,
34+
PRG_TRACE => Level::TRACE,
35+
_ => unreachable!("unknown log level: {}", level),
36+
};
37+
if buf.is_some() {
38+
Logger::log(level, buf.unwrap_or(""));
39+
}
40+
}
41+
42+
pub fn log(level: Level, message: &str) {
43+
match level {
44+
Level::ERROR => event!(Level::ERROR, "{}", message),
45+
Level::WARN => event!(Level::WARN, "{}", message),
46+
Level::INFO => event!(Level::INFO, "{}", message),
47+
Level::DEBUG => event!(Level::DEBUG, "{}", message),
48+
Level::TRACE => event!(Level::TRACE, "{}", message),
49+
}
50+
}
51+
}

crates/openconnect-gui/src-tauri/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ fn main() {
7676
.body(b"Authenticated, close this window and return to the application.".to_vec())
7777
})
7878
.setup(move |app| {
79+
openconnect_core::log::Logger::init().expect("failed to init logger");
7980
// This is to fully remove dock icon, temp disable
8081
// #[cfg(target_os = "macos")]
8182
// app.set_activation_policy(tauri::ActivationPolicy::Accessory);

0 commit comments

Comments
 (0)