use ockam_core::compat::sync::Arc;
#[cfg(feature = "storage")]
use ockam_core::Result;
#[cfg(feature = "storage")]
use ockam_node::database::SqlxDatabase;
use ockam_vault::storage::SecretsRepository;
#[cfg(feature = "storage")]
use ockam_vault::storage::SecretsSqlxDatabase;
use ockam_vault::{
SoftwareVaultForSecureChannels, SoftwareVaultForSigning, SoftwareVaultForVerifyingSignatures,
VaultForSecureChannels, VaultForSigning, VaultForVerifyingSignatures,
};
#[derive(Clone)]
pub struct Vault {
pub identity_vault: Arc<dyn VaultForSigning>,
pub secure_channel_vault: Arc<dyn VaultForSecureChannels>,
pub credential_vault: Arc<dyn VaultForSigning>,
pub verifying_vault: Arc<dyn VaultForVerifyingSignatures>,
}
impl Vault {
pub fn new(
identity_vault: Arc<dyn VaultForSigning>,
secure_channel_vault: Arc<dyn VaultForSecureChannels>,
credential_vault: Arc<dyn VaultForSigning>,
verifying_vault: Arc<dyn VaultForVerifyingSignatures>,
) -> Self {
Self {
identity_vault,
secure_channel_vault,
credential_vault,
verifying_vault,
}
}
#[cfg(feature = "storage")]
pub async fn create() -> Result<Self> {
Ok(Self::new(
Self::create_identity_vault().await?,
Self::create_secure_channel_vault().await?,
Self::create_credential_vault().await?,
Self::create_verifying_vault(),
))
}
#[cfg(feature = "storage")]
pub async fn create_identity_vault() -> Result<Arc<dyn VaultForSigning>> {
Ok(Arc::new(SoftwareVaultForSigning::new(Arc::new(
SecretsSqlxDatabase::create().await?,
))))
}
#[cfg(feature = "storage")]
pub async fn create_secure_channel_vault() -> Result<Arc<dyn VaultForSecureChannels>> {
Ok(Arc::new(SoftwareVaultForSecureChannels::new(Arc::new(
SecretsSqlxDatabase::create().await?,
))))
}
#[cfg(feature = "storage")]
pub async fn create_credential_vault() -> Result<Arc<dyn VaultForSigning>> {
Ok(Arc::new(SoftwareVaultForSigning::new(Arc::new(
SecretsSqlxDatabase::create().await?,
))))
}
pub fn create_verifying_vault() -> Arc<dyn VaultForVerifyingSignatures> {
Arc::new(SoftwareVaultForVerifyingSignatures {})
}
}
impl Vault {
#[cfg(feature = "storage")]
pub fn create_with_database(database: SqlxDatabase) -> Vault {
Self::create_with_secrets_repository(Arc::new(SecretsSqlxDatabase::new(database)))
}
pub fn create_with_secrets_repository(repository: Arc<dyn SecretsRepository>) -> Vault {
Self::new(
Arc::new(SoftwareVaultForSigning::new(repository.clone())),
Arc::new(SoftwareVaultForSecureChannels::new(repository.clone())),
Arc::new(SoftwareVaultForSigning::new(repository.clone())),
Arc::new(SoftwareVaultForVerifyingSignatures {}),
)
}
}