use openssl::{
ssl::{SslConnectorBuilder, SslVerifyMode},
x509::store::X509StoreBuilder,
};
use crate::{Error, tls::x509::CertStore};
pub trait SslConnectorBuilderExt {
fn configure_cert_store(self, store: Option<&CertStore>) -> crate::Result<SslConnectorBuilder>;
fn set_cert_verification(self, enable: bool) -> crate::Result<SslConnectorBuilder>;
}
impl SslConnectorBuilderExt for SslConnectorBuilder {
#[inline]
fn configure_cert_store(
mut self,
store: Option<&CertStore>,
) -> crate::Result<SslConnectorBuilder> {
if let Some(store) = store {
let mut builder = X509StoreBuilder::new().map_err(Error::tls)?;
for cert in store.0.all_certificates() {
builder.add_cert(cert).map_err(Error::tls)?;
}
self.set_verify_cert_store(builder.build())
.map_err(Error::tls)?;
} else {
self.set_default_verify_paths().map_err(Error::tls)?;
}
Ok(self)
}
#[inline]
fn set_cert_verification(mut self, enable: bool) -> crate::Result<SslConnectorBuilder> {
if enable {
self.set_verify(SslVerifyMode::PEER);
} else {
self.set_verify(SslVerifyMode::NONE);
}
Ok(self)
}
}