use std::fmt::Debug;
use std::str::FromStr;
use url::Url;
use crate::kdc::detect_kdc_url;
use crate::kerberos::ServerProperties;
use crate::negotiate::{NegotiatedProtocol, ProtocolConfig};
use crate::{Kerberos, Result};
#[derive(Clone, Debug)]
pub struct KerberosConfig {
pub kdc_url: Option<Url>,
pub client_computer_name: String,
}
impl ProtocolConfig for KerberosConfig {
fn new_instance(&self) -> Result<NegotiatedProtocol> {
Ok(NegotiatedProtocol::Kerberos(Kerberos::new_client_from_config(
self.clone(),
)?))
}
fn box_clone(&self) -> Box<dyn ProtocolConfig> {
Box::new(self.clone())
}
}
pub fn parse_kdc_url(kdc_url: &str) -> Option<Url> {
if !kdc_url.contains("://") {
Url::from_str(&format!("tcp://{kdc_url}")).ok()
} else {
Url::from_str(kdc_url).ok()
}
}
impl KerberosConfig {
pub fn new(kdc_url: &str, client_computer_name: String) -> Self {
let kdc_url = parse_kdc_url(kdc_url);
Self {
kdc_url,
client_computer_name,
}
}
pub fn get_kdc_url(self, domain: &str) -> Option<Url> {
if let Some(kdc_url) = self.kdc_url {
Some(kdc_url)
} else {
detect_kdc_url(domain)
}
}
}
#[derive(Clone, Debug)]
pub struct KerberosServerConfig {
pub kerberos_config: KerberosConfig,
pub server_properties: ServerProperties,
}
impl ProtocolConfig for KerberosServerConfig {
fn new_instance(&self) -> Result<NegotiatedProtocol> {
Ok(NegotiatedProtocol::Kerberos(Kerberos::new_server_from_config(
self.kerberos_config.clone(),
self.server_properties.clone(),
)?))
}
fn box_clone(&self) -> Box<dyn ProtocolConfig> {
Box::new(self.clone())
}
}