use btls::ssl::{SslConnectorBuilder, SslVerifyMode};
use crate::{
Error,
tls::{
compress::{self, CertificateCompressor},
trust::{CertStore, Identity},
},
};
pub trait SslConnectorBuilderExt {
fn set_identity(self, identity: Option<&Identity>) -> crate::Result<SslConnectorBuilder>;
fn set_cert_store(self, store: Option<&CertStore>) -> crate::Result<SslConnectorBuilder>;
fn set_cert_verification(self, enable: bool) -> SslConnectorBuilder;
fn set_cert_compressors(
self,
compressors: Option<&[&'static dyn CertificateCompressor]>,
) -> crate::Result<SslConnectorBuilder>;
}
impl SslConnectorBuilderExt for SslConnectorBuilder {
fn set_identity(mut self, identity: Option<&Identity>) -> crate::Result<SslConnectorBuilder> {
if let Some(identity) = identity {
self.set_certificate(&identity.cert).map_err(Error::tls)?;
self.set_private_key(&identity.pkey).map_err(Error::tls)?;
for cert in identity.chain.iter() {
self.add_extra_chain_cert(cert.clone())
.map_err(Error::tls)?;
}
}
Ok(self)
}
fn set_cert_store(mut self, store: Option<&CertStore>) -> crate::Result<SslConnectorBuilder> {
if let Some(store) = store {
self.set_cert_store_ref(&store.0)
} else {
#[cfg(feature = "webpki-roots")]
{
static LOAD_CERTS: std::sync::LazyLock<CertStore> =
std::sync::LazyLock::new(|| {
CertStore::from_der_certs(webpki_root_certs::TLS_SERVER_ROOT_CERTS)
.expect("Failed to load webpki root certificates")
});
self.set_cert_store_ref(&LOAD_CERTS.0);
}
#[cfg(not(feature = "webpki-roots"))]
{
self.set_default_verify_paths().map_err(Error::tls)?;
}
}
Ok(self)
}
fn set_cert_verification(mut self, enable: bool) -> SslConnectorBuilder {
self.set_verify(if enable {
SslVerifyMode::PEER
} else {
SslVerifyMode::NONE
});
self
}
fn set_cert_compressors(
mut self,
compressors: Option<&[&'static dyn CertificateCompressor]>,
) -> crate::Result<SslConnectorBuilder> {
if let Some(compressors) = compressors {
for compressor in compressors {
compress::register(*compressor, &mut self).map_err(Error::tls)?;
}
}
Ok(self)
}
}