use auths_core::storage::keychain::{IdentityDID, KeyAlias};
use auths_verifier::Capability;
use auths_verifier::types::CanonicalDid;
use std::path::PathBuf;
use crate::domains::ci::types::{CiEnvironment, CiIdentityConfig};
#[derive(Debug, Clone, Default)]
pub enum IdentityConflictPolicy {
#[default]
Error,
ReuseExisting,
ForceNew,
}
#[derive(Debug)]
pub struct CreateDeveloperIdentityConfig {
pub key_alias: KeyAlias,
pub platform: Option<crate::types::PlatformVerification>,
pub git_signing_scope: crate::types::GitSigningScope,
pub register_on_registry: bool,
pub registry_url: Option<String>,
pub conflict_policy: IdentityConflictPolicy,
pub witness_config: Option<auths_id::witness_config::WitnessConfig>,
pub metadata: Option<serde_json::Value>,
pub sign_binary_path: Option<PathBuf>,
pub curve: auths_crypto::CurveType,
}
impl CreateDeveloperIdentityConfig {
pub fn builder(key_alias: KeyAlias) -> CreateDeveloperIdentityConfigBuilder {
CreateDeveloperIdentityConfigBuilder {
key_alias,
platform: None,
git_signing_scope: crate::types::GitSigningScope::Global,
register_on_registry: false,
registry_url: None,
conflict_policy: IdentityConflictPolicy::Error,
witness_config: None,
metadata: None,
sign_binary_path: None,
curve: auths_crypto::CurveType::default(),
}
}
}
#[derive(Debug)]
pub struct CreateDeveloperIdentityConfigBuilder {
key_alias: KeyAlias,
platform: Option<crate::types::PlatformVerification>,
git_signing_scope: crate::types::GitSigningScope,
register_on_registry: bool,
registry_url: Option<String>,
conflict_policy: IdentityConflictPolicy,
witness_config: Option<auths_id::witness_config::WitnessConfig>,
metadata: Option<serde_json::Value>,
sign_binary_path: Option<PathBuf>,
curve: auths_crypto::CurveType,
}
impl CreateDeveloperIdentityConfigBuilder {
pub fn with_platform(mut self, platform: crate::types::PlatformVerification) -> Self {
self.platform = Some(platform);
self
}
pub fn with_git_signing_scope(mut self, scope: crate::types::GitSigningScope) -> Self {
self.git_signing_scope = scope;
self
}
pub fn with_registration(mut self, url: impl Into<String>) -> Self {
self.register_on_registry = true;
self.registry_url = Some(url.into());
self
}
pub fn with_conflict_policy(mut self, policy: IdentityConflictPolicy) -> Self {
self.conflict_policy = policy;
self
}
pub fn with_witness_config(mut self, config: auths_id::witness_config::WitnessConfig) -> Self {
self.witness_config = Some(config);
self
}
pub fn with_metadata(mut self, metadata: serde_json::Value) -> Self {
self.metadata = Some(metadata);
self
}
pub fn with_sign_binary_path(mut self, path: PathBuf) -> Self {
self.sign_binary_path = Some(path);
self
}
pub fn with_curve(mut self, curve: auths_crypto::CurveType) -> Self {
self.curve = curve;
self
}
pub fn build(self) -> CreateDeveloperIdentityConfig {
CreateDeveloperIdentityConfig {
key_alias: self.key_alias,
platform: self.platform,
git_signing_scope: self.git_signing_scope,
register_on_registry: self.register_on_registry,
registry_url: self.registry_url,
conflict_policy: self.conflict_policy,
witness_config: self.witness_config,
metadata: self.metadata,
sign_binary_path: self.sign_binary_path,
curve: self.curve,
}
}
}
#[derive(Debug)]
pub enum IdentityConfig {
Developer(CreateDeveloperIdentityConfig),
Ci(CiIdentityConfig),
Agent(CreateAgentIdentityConfig),
}
impl IdentityConfig {
pub fn developer(alias: KeyAlias) -> Self {
Self::Developer(CreateDeveloperIdentityConfig::builder(alias).build())
}
pub fn ci(registry_path: impl Into<PathBuf>) -> Self {
let registry_path = registry_path.into();
let keychain_file = registry_path.join("keys.enc");
Self::Ci(CiIdentityConfig {
ci_environment: CiEnvironment::Unknown,
registry_path,
keychain_file,
passphrase: crate::domains::ci::types::DEFAULT_CI_PASSPHRASE.to_string(),
})
}
pub fn agent(alias: KeyAlias, registry_path: impl Into<PathBuf>) -> Self {
Self::Agent(CreateAgentIdentityConfig::builder(alias, registry_path).build())
}
}
#[derive(Debug)]
pub struct CreateAgentIdentityConfig {
pub alias: KeyAlias,
pub capabilities: Vec<Capability>,
pub parent_identity_did: Option<String>,
pub registry_path: PathBuf,
pub expires_in: Option<u64>,
pub dry_run: bool,
}
impl CreateAgentIdentityConfig {
pub fn builder(
alias: KeyAlias,
registry_path: impl Into<PathBuf>,
) -> CreateAgentIdentityConfigBuilder {
CreateAgentIdentityConfigBuilder {
alias,
capabilities: Vec::new(),
parent_identity_did: None,
registry_path: registry_path.into(),
expires_in: None,
dry_run: false,
}
}
}
#[derive(Debug)]
pub struct CreateAgentIdentityConfigBuilder {
alias: KeyAlias,
capabilities: Vec<Capability>,
parent_identity_did: Option<String>,
registry_path: PathBuf,
expires_in: Option<u64>,
dry_run: bool,
}
impl CreateAgentIdentityConfigBuilder {
pub fn with_parent_did(mut self, did: impl Into<String>) -> Self {
self.parent_identity_did = Some(did.into());
self
}
pub fn with_capabilities(mut self, capabilities: Vec<Capability>) -> Self {
self.capabilities = capabilities;
self
}
pub fn with_expiry(mut self, secs: u64) -> Self {
self.expires_in = Some(secs);
self
}
pub fn dry_run(mut self, enabled: bool) -> Self {
self.dry_run = enabled;
self
}
pub fn build(self) -> CreateAgentIdentityConfig {
CreateAgentIdentityConfig {
alias: self.alias,
capabilities: self.capabilities,
parent_identity_did: self.parent_identity_did,
registry_path: self.registry_path,
expires_in: self.expires_in,
dry_run: self.dry_run,
}
}
}
#[derive(Debug)]
pub struct IdentityRotationConfig {
pub repo_path: PathBuf,
pub identity_key_alias: Option<KeyAlias>,
pub next_key_alias: Option<KeyAlias>,
}
#[derive(Debug, Clone)]
pub struct DeveloperIdentityResult {
pub identity_did: IdentityDID,
pub device_did: CanonicalDid,
pub key_alias: KeyAlias,
pub platform_claim: Option<crate::result::PlatformClaimResult>,
pub git_signing_configured: bool,
pub registered: Option<RegistrationOutcome>,
}
#[derive(Debug, Clone)]
pub struct CiIdentityResult {
pub identity_did: IdentityDID,
pub device_did: CanonicalDid,
pub env_block: Vec<String>,
}
#[derive(Debug, Clone)]
pub struct AgentIdentityResult {
pub agent_did: Option<IdentityDID>,
pub parent_did: Option<IdentityDID>,
pub capabilities: Vec<Capability>,
}
#[derive(Debug, Clone)]
pub enum InitializeResult {
Developer(DeveloperIdentityResult),
Ci(CiIdentityResult),
Agent(AgentIdentityResult),
}
#[derive(Debug, Clone)]
pub struct IdentityRotationResult {
pub controller_did: IdentityDID,
pub new_key_fingerprint: String,
pub previous_key_fingerprint: String,
pub sequence: u128,
}
#[derive(Debug, Clone)]
pub struct RegistrationOutcome {
pub did: IdentityDID,
pub registry: String,
pub platform_claims_indexed: usize,
}