ockam_command 0.104.0

End-to-end encryption and mutual authentication for distributed applications.
Documentation
use std::path::Path;

use miette::{Context as _, IntoDiagnostic};
use serde::{Deserialize, Serialize};

use ockam::identity::Identifier;
use ockam_api::DefaultAddress;

use crate::Result;

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SecureChannelListenerConfig {
    #[serde(default = "sec_listener_default_addr")]
    pub(crate) address: String,

    #[serde(default)]
    pub(crate) authorized_identifiers: Option<Vec<Identifier>>,

    #[serde(default)]
    pub(crate) disabled: bool,

    #[serde(default)]
    pub(crate) identity: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuthenticatorConfig {
    #[serde(default = "authenticator_default_addr")]
    pub(crate) address: String,

    pub(crate) project: String,

    #[serde(default)]
    pub(crate) disabled: bool,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OktaIdentityProviderConfig {
    #[serde(default = "okta_identity_provider_default_addr")]
    pub(crate) address: String,

    pub(crate) tenant_base_url: String,

    pub(crate) certificate: String,

    pub(crate) project: String,

    pub(crate) attributes: Vec<String>,

    #[serde(default)]
    pub(crate) disabled: bool,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServiceConfigs {
    pub(crate) secure_channel_listener: Option<SecureChannelListenerConfig>,
    pub(crate) authenticator: Option<AuthenticatorConfig>,
    pub(crate) okta_identity_provider: Option<OktaIdentityProviderConfig>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Config {
    pub(crate) startup_services: Option<ServiceConfigs>,
}

impl Config {
    pub(crate) fn read<P: AsRef<Path>>(path: P) -> Result<Self> {
        let s = std::fs::read_to_string(path.as_ref())
            .into_diagnostic()
            .context(format!("failed to read {:?}", path.as_ref()))?;
        let c = serde_json::from_str(&s)
            .into_diagnostic()
            .context(format!("invalid config {:?}", path.as_ref()))?;
        Ok(c)
    }
}

fn sec_listener_default_addr() -> String {
    DefaultAddress::SECURE_CHANNEL_LISTENER.to_string()
}

fn authenticator_default_addr() -> String {
    DefaultAddress::DIRECT_AUTHENTICATOR.to_string()
}

fn okta_identity_provider_default_addr() -> String {
    DefaultAddress::OKTA_IDENTITY_PROVIDER.to_string()
}