pub mod storage;
use std::io::IsTerminal;
use std::sync::Arc;
use anyhow::Result;
use auths_sdk::core_config::{EnvironmentConfig, load_config};
use auths_sdk::keychain::{get_passphrase_cache, parse_duration_str};
use auths_sdk::paths::auths_home;
use auths_sdk::ports::agent::AgentSigningPort;
use auths_sdk::signing::{KeychainPassphraseProvider, PassphraseProvider};
use auths_telemetry::TelemetryShutdown;
use auths_telemetry::config::{build_sinks_from_config, load_audit_config};
use auths_telemetry::sinks::composite::CompositeSink;
use crate::adapters::config_store::FileConfigStore;
use crate::cli::AuthsCli;
use crate::config::{CliConfig, OutputFormat};
use crate::core::provider::{CliPassphraseProvider, PrefilledPassphraseProvider};
pub fn build_config(cli: &AuthsCli) -> Result<CliConfig> {
let output_format = if cli.json {
OutputFormat::Json
} else {
OutputFormat::Text
};
let env_config = EnvironmentConfig::from_env();
let passphrase_provider: Arc<dyn PassphraseProvider + Send + Sync> =
if let Some(passphrase) = env_config.keychain.passphrase.clone() {
Arc::new(PrefilledPassphraseProvider::new(zeroize::Zeroizing::new(
passphrase,
)))
} else {
let config = load_config(&FileConfigStore);
let cache = get_passphrase_cache(config.passphrase.biometric);
let ttl_secs = config
.passphrase
.duration
.as_deref()
.and_then(parse_duration_str);
let inner = Arc::new(CliPassphraseProvider::new());
Arc::new(KeychainPassphraseProvider::new(
inner,
cache,
"default".to_string(),
config.passphrase.cache,
ttl_secs,
))
};
let is_interactive = std::io::stdout().is_terminal();
let repo_path = cli.repo.clone().or_else(|| {
std::env::var("AUTHS_REPO")
.ok()
.filter(|s| !s.is_empty())
.map(std::path::PathBuf::from)
});
Ok(CliConfig {
repo_path,
output_format,
is_interactive,
passphrase_provider,
env_config,
})
}
pub fn init_audit_sinks() -> Option<TelemetryShutdown> {
let audit_path = match auths_home() {
Ok(h) => h.join("audit.toml"),
Err(_) => return None,
};
let config = load_audit_config(&audit_path);
#[allow(clippy::disallowed_methods)] let sinks = build_sinks_from_config(&config, |name| std::env::var(name).ok());
if sinks.is_empty() {
return None;
}
let composite = Arc::new(CompositeSink::new(sinks));
Some(auths_telemetry::init_telemetry_with_sink(composite))
}
pub fn build_agent_provider() -> Arc<dyn AgentSigningPort + Send + Sync> {
#[cfg(unix)]
{
Arc::new(crate::adapters::agent::CliAgentAdapter)
}
#[cfg(not(unix))]
{
Arc::new(auths_sdk::ports::agent::NoopAgentProvider)
}
}