samotop_with_native_tls/
lib.rs

1use async_native_tls::TlsAcceptor;
2use async_native_tls::TlsConnector;
3use samotop_core::io::tls::TlsProvider;
4use samotop_core::io::tls::TlsUpgrade;
5use samotop_core::{common::*, io::tls::Io};
6use std::fmt;
7
8pub struct NativeTlsProvider<T> {
9    inner: Arc<T>,
10}
11
12impl<T> Clone for NativeTlsProvider<T> {
13    fn clone(&self) -> Self {
14        NativeTlsProvider {
15            inner: self.inner.clone(),
16        }
17    }
18}
19
20impl From<TlsAcceptor> for NativeTlsProvider<TlsAcceptor> {
21    fn from(acceptor: TlsAcceptor) -> Self {
22        NativeTlsProvider {
23            inner: Arc::new(acceptor),
24        }
25    }
26}
27impl From<TlsConnector> for NativeTlsProvider<TlsConnector> {
28    fn from(connector: TlsConnector) -> Self {
29        NativeTlsProvider {
30            inner: Arc::new(connector),
31        }
32    }
33}
34
35impl TlsUpgrade for NativeTlsProvider<TlsAcceptor> {
36    fn upgrade_to_tls(
37        &self,
38        io: Box<dyn Io>,
39        _name: String,
40    ) -> S3Fut<std::io::Result<Box<dyn Io>>> {
41        let acceptor = self.inner.clone();
42        let fut = async move {
43            match acceptor.accept(io).await {
44                Ok(encrypted) => {
45                    // match encrypted.peer_certificate() {
46                    //     Err(e) => trace!("peer cert error: {:?}", e),
47                    //     Ok(None) => trace!("peer cert None."),
48                    //     Ok(Some(cert)) => {
49                    //         let cert = cert.to_der().unwrap();
50                    //         trace!("peer cert present: {:?}", cert.len());
51                    //         let mut f = std::fs::File::create("client.crt")?;
52                    //         use std::io::Write;
53                    //         f.write_all(cert.as_slice())?;
54                    //     }
55                    // }
56                    let encrypted: Box<dyn Io> = Box::new(encrypted);
57                    Ok(encrypted)
58                }
59                Err(e) => Err(std::io::Error::new(
60                    std::io::ErrorKind::BrokenPipe,
61                    format!("Failed to get TLS - {}", e),
62                )),
63            }
64        };
65        Box::pin(fut)
66    }
67}
68
69impl TlsProvider for NativeTlsProvider<TlsAcceptor> {
70    fn get_tls_upgrade(&self) -> Option<Box<dyn TlsUpgrade>> {
71        Some(Box::new(self.clone()))
72    }
73}
74
75impl fmt::Debug for NativeTlsProvider<TlsAcceptor> {
76    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
77        f.debug_struct("NativeTlsProvider<TlsAcceptor>").finish()
78    }
79}
80
81impl TlsProvider for NativeTlsProvider<TlsConnector> {
82    fn get_tls_upgrade(&self) -> Option<Box<dyn TlsUpgrade>> {
83        Some(Box::new(NativeTlsProvider::clone(self)))
84    }
85}
86
87impl TlsUpgrade for NativeTlsProvider<TlsConnector> {
88    fn upgrade_to_tls(
89        &self,
90        stream: Box<dyn Io>,
91        name: String,
92    ) -> S3Fut<std::io::Result<Box<dyn Io>>> {
93        let connector = self.inner.clone();
94        Box::pin(async move {
95            match connector.connect(name, stream).await {
96                Ok(s) => {
97                    let s: Box<dyn Io> = Box::new(s);
98                    Ok(s)
99                }
100                Err(e) => Err(std::io::Error::new(std::io::ErrorKind::BrokenPipe, e)),
101            }
102        })
103    }
104}
105
106impl fmt::Debug for NativeTlsProvider<TlsConnector> {
107    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
108        f.debug_struct("NativeTlsProvider<TlsAcceptor>").finish()
109    }
110}