kanidm/kanidmd/src/lib/config.rs

138 lines
4.2 KiB
Rust
Raw Normal View History

2019-07-27 08:54:31 +02:00
use rand::prelude::*;
use std::fmt;
use std::path::PathBuf;
#[derive(Serialize, Deserialize, Debug)]
pub struct IntegrationTestConfig {
pub admin_password: String,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct TlsConfiguration {
pub ca: String,
pub cert: String,
pub key: String,
}
#[derive(Serialize, Deserialize, Debug, Default)]
2018-11-26 07:13:22 +01:00
pub struct Configuration {
pub address: String,
pub ldapaddress: Option<String>,
2018-11-26 07:13:22 +01:00
pub threads: usize,
2019-07-27 08:54:31 +02:00
// db type later
2018-11-26 07:13:22 +01:00
pub db_path: String,
pub maximum_request: usize,
pub secure_cookies: bool,
pub tls_config: Option<TlsConfiguration>,
2019-07-27 08:54:31 +02:00
pub cookie_key: [u8; 32],
pub integration_test_config: Option<Box<IntegrationTestConfig>>,
2018-11-26 07:13:22 +01:00
}
impl fmt::Display for Configuration {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "address: {}, ", self.address)
.and_then(|_| match &self.ldapaddress {
Some(la) => write!(f, "ldap address: {}, ", la),
None => write!(f, "ldap address: disabled, "),
})
.and_then(|_| write!(f, "thread count: {}, ", self.threads))
.and_then(|_| write!(f, "dbpath: {}, ", self.db_path))
.and_then(|_| write!(f, "max request size: {}b, ", self.maximum_request))
.and_then(|_| write!(f, "secure cookies: {}, ", self.secure_cookies))
.and_then(|_| write!(f, "with TLS: {}, ", self.tls_config.is_some()))
.and_then(|_| {
write!(
f,
"integration mode: {}",
self.integration_test_config.is_some()
)
})
}
}
2018-11-26 07:13:22 +01:00
impl Configuration {
pub fn new() -> Self {
2019-07-27 08:54:31 +02:00
let mut c = Configuration {
2018-11-26 07:13:22 +01:00
address: String::from("127.0.0.1:8080"),
ldapaddress: None,
threads: num_cpus::get(),
2018-11-26 07:13:22 +01:00
db_path: String::from(""),
maximum_request: 262_144, // 256k
// log type
// log path
2019-07-27 08:54:31 +02:00
// TODO #63: default true in prd
secure_cookies: !cfg!(test),
tls_config: None,
2019-07-27 08:54:31 +02:00
cookie_key: [0; 32],
integration_test_config: None,
2019-07-27 08:54:31 +02:00
};
let mut rng = StdRng::from_entropy();
rng.fill(&mut c.cookie_key);
c
2018-11-26 07:13:22 +01:00
}
pub fn update_db_path(&mut self, p: &PathBuf) {
match p.to_str() {
Some(p) => self.db_path = p.to_string(),
None => {
error!("Invalid DB path supplied");
std::process::exit(1);
}
}
}
pub fn update_bind(&mut self, b: &Option<String>) {
self.address = b
.as_ref()
.cloned()
.unwrap_or_else(|| String::from("127.0.0.1:8080"));
}
pub fn update_ldapbind(&mut self, l: &Option<String>) {
self.ldapaddress = l.clone();
}
pub fn update_tls(
&mut self,
ca: &Option<PathBuf>,
cert: &Option<PathBuf>,
key: &Option<PathBuf>,
) {
match (ca, cert, key) {
(None, None, None) => {}
(Some(cap), Some(certp), Some(keyp)) => {
let cas = match cap.to_str() {
Some(cav) => cav.to_string(),
None => {
error!("Invalid CA path");
std::process::exit(1);
}
};
let certs = match certp.to_str() {
Some(certv) => certv.to_string(),
None => {
error!("Invalid Cert path");
std::process::exit(1);
}
};
let keys = match keyp.to_str() {
Some(keyv) => keyv.to_string(),
None => {
error!("Invalid Key path");
std::process::exit(1);
}
};
self.tls_config = Some(TlsConfiguration {
ca: cas,
cert: certs,
key: keys,
})
}
_ => {
error!("Invalid TLS configuration - must provide ca, cert and key!");
std::process::exit(1);
}
}
}
2018-11-26 07:13:22 +01:00
}