use ockam::identity::models::ChangeHistory;
use ockam::identity::Identifier;
use ockam_core::compat::collections::HashMap;
use ockam_core::compat::fmt;
use ockam_core::compat::fmt::{Display, Formatter};
use ockam_node::database::DatabaseConfiguration;
use serde::{Deserialize, Serialize};
use url::Url;
use crate::authenticator::PreTrustedIdentities;
use crate::config::lookup::InternetAddress;
use crate::nodes::service::default_address::DefaultAddress;
#[derive(Debug, Clone)]
pub struct Configuration {
pub identifier: Identifier,
pub database_configuration: DatabaseConfiguration,
pub project_identifier: String,
pub tcp_listener_address: InternetAddress,
pub secure_channel_listener_name: Option<String>,
pub authenticator_name: Option<String>,
pub trusted_identities: PreTrustedIdentities,
pub no_direct_authentication: bool,
pub no_token_enrollment: bool,
pub okta: Option<OktaConfiguration>,
pub account_authority: Option<ChangeHistory>,
pub enforce_admin_checks: bool,
pub disable_trust_context_id: bool,
pub telemetry_endpoint_url: Option<Url>,
}
impl Configuration {
pub(crate) fn identifier(&self) -> Identifier {
self.identifier.clone()
}
pub(crate) fn project_identifier(&self) -> String {
self.project_identifier.clone()
}
pub(crate) fn tcp_listener_address(&self) -> InternetAddress {
self.tcp_listener_address.clone()
}
pub(crate) fn secure_channel_listener_name(&self) -> String {
self.secure_channel_listener_name
.clone()
.unwrap_or(DefaultAddress::SECURE_CHANNEL_LISTENER.into())
}
pub(crate) fn authenticator_name(&self) -> String {
self.authenticator_name
.clone()
.unwrap_or(DefaultAddress::DIRECT_AUTHENTICATOR.to_string())
}
}
#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
pub struct OktaConfiguration {
pub address: String,
pub tenant_base_url: String,
pub certificate: String,
pub attributes: Vec<String>,
}
impl OktaConfiguration {
pub(crate) fn tenant_base_url(&self) -> &str {
self.tenant_base_url.as_str()
}
pub(crate) fn certificate(&self) -> &str {
self.certificate.as_str()
}
pub(crate) fn attributes(&self) -> Vec<String> {
self.attributes.clone()
}
}
#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
pub struct TrustedIdentity {
identifier: Identifier,
attributes: HashMap<String, String>,
}
impl Display for TrustedIdentity {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
f.write_str(
serde_json::to_string(self)
.map_err(|_| fmt::Error)?
.as_str(),
)
}
}
impl TrustedIdentity {
pub fn new(identifier: &Identifier, attributes: &HashMap<String, String>) -> TrustedIdentity {
TrustedIdentity {
identifier: identifier.clone(),
attributes: attributes.clone(),
}
}
pub fn identifier(&self) -> Identifier {
self.identifier.clone()
}
}