Skip to content

Commit 659b3ed

Browse files
authored
chore(keylog): separate TLS keylog responsibilities (#1166)
1 parent 5e6f06d commit 659b3ed

3 files changed

Lines changed: 80 additions & 79 deletions

File tree

src/tls/conn/ext.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ use crate::{
1010

1111
/// SslConnectorBuilderExt trait for `SslConnectorBuilder`.
1212
pub trait SslConnectorBuilderExt {
13-
/// Configure the CertStore for the given `SslConnectorBuilder`.
14-
fn set_cert_store(self, store: Option<&CertStore>) -> crate::Result<SslConnectorBuilder>;
15-
1613
/// Configure the Identity for the given `SslConnectorBuilder`.
1714
fn set_identity(self, identity: Option<&Identity>) -> crate::Result<SslConnectorBuilder>;
1815

16+
/// Configure the CertStore for the given `SslConnectorBuilder`.
17+
fn set_cert_store(self, store: Option<&CertStore>) -> crate::Result<SslConnectorBuilder>;
18+
1919
/// Configure the certificate verification for the given `SslConnectorBuilder`.
2020
fn set_cert_verification(self, enable: bool) -> SslConnectorBuilder;
2121

@@ -27,16 +27,6 @@ pub trait SslConnectorBuilderExt {
2727
}
2828

2929
impl SslConnectorBuilderExt for SslConnectorBuilder {
30-
fn set_cert_store(mut self, store: Option<&CertStore>) -> crate::Result<SslConnectorBuilder> {
31-
if let Some(store) = store {
32-
self.set_cert_store_ref(&store.0)
33-
} else {
34-
self.set_default_verify_paths().map_err(Error::tls)?;
35-
}
36-
37-
Ok(self)
38-
}
39-
4030
fn set_identity(mut self, identity: Option<&Identity>) -> crate::Result<SslConnectorBuilder> {
4131
if let Some(identity) = identity {
4232
self.set_certificate(&identity.cert).map_err(Error::tls)?;
@@ -52,6 +42,16 @@ impl SslConnectorBuilderExt for SslConnectorBuilder {
5242
Ok(self)
5343
}
5444

45+
fn set_cert_store(mut self, store: Option<&CertStore>) -> crate::Result<SslConnectorBuilder> {
46+
if let Some(store) = store {
47+
self.set_cert_store_ref(&store.0)
48+
} else {
49+
self.set_default_verify_paths().map_err(Error::tls)?;
50+
}
51+
52+
Ok(self)
53+
}
54+
5555
fn set_cert_verification(mut self, enable: bool) -> SslConnectorBuilder {
5656
self.set_verify(if enable {
5757
SslVerifyMode::PEER

src/tls/keylog.rs

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
//! `SSLKEYLOGFILE` environment variable or by specifying a custom file path. Handles are cached
88
//! globally to avoid duplicate file access.
99
10-
mod handle;
11-
1210
use std::{
1311
borrow::Cow,
1412
collections::{HashMap, hash_map::Entry},
@@ -95,3 +93,70 @@ where
9593
}
9694
ret
9795
}
96+
97+
mod handle {
98+
use std::{
99+
fs::OpenOptions,
100+
io::{Result, Write},
101+
path::Path,
102+
sync::{
103+
Arc,
104+
mpsc::{self, Sender},
105+
},
106+
};
107+
108+
/// Handle for writing to a key log file.
109+
#[derive(Debug, Clone)]
110+
pub struct Handle {
111+
#[allow(unused)]
112+
filepath: Arc<Path>,
113+
sender: Sender<String>,
114+
}
115+
116+
impl Handle {
117+
/// Create a new [`Handle`] with the specified path and sender.
118+
pub fn new(filepath: Arc<Path>) -> Result<Self> {
119+
if let Some(parent) = filepath.parent() {
120+
std::fs::create_dir_all(parent)?;
121+
}
122+
123+
let mut file = OpenOptions::new()
124+
.create(true)
125+
.append(true)
126+
.open(&filepath)?;
127+
128+
let (sender, receiver) = mpsc::channel::<String>();
129+
130+
let _path_name = filepath.clone();
131+
std::thread::spawn(move || {
132+
trace!(
133+
file = ?_path_name,
134+
"Handle: receiver task up and running",
135+
);
136+
while let Ok(line) = receiver.recv() {
137+
if let Err(_err) = file.write_all(line.as_bytes()) {
138+
error!(
139+
file = ?_path_name,
140+
error = %_err,
141+
"Handle: failed to write file",
142+
);
143+
}
144+
}
145+
});
146+
147+
Ok(Handle { filepath, sender })
148+
}
149+
150+
/// Write a line to the keylogger.
151+
pub fn write(&self, line: &str) {
152+
let line = format!("{line}\n");
153+
if let Err(_err) = self.sender.send(line) {
154+
error!(
155+
file = ?self.filepath,
156+
error = %_err,
157+
"Handle: failed to send log line for writing",
158+
);
159+
}
160+
}
161+
}
162+
}

src/tls/keylog/handle.rs

Lines changed: 0 additions & 64 deletions
This file was deleted.

0 commit comments

Comments
 (0)