coven_storage/
connection_credentials.rs1use crate::{CloudProvider, StorageConfig, StorageCredentials, StorageError, StorageFailure};
4
5#[derive(Clone)]
7pub struct ConnectionCredentials {
8 pub location: StorageConfig,
10 pub credentials: StorageCredentials,
12}
13
14impl ConnectionCredentials {
15 pub fn validate(&self) -> Result<(), StorageError> {
17 self.location.validate()?;
18 match (self.location.provider(), &self.credentials) {
19 (CloudProvider::S3, StorageCredentials::S3(keys)) => keys.validate(),
20 (
21 CloudProvider::Dropbox | CloudProvider::OneDrive,
22 StorageCredentials::OAuth(tokens),
23 ) if !tokens.access_token.as_str().is_empty() && !tokens.client_id.is_empty() => {
24 let required = self.location.oauth_access().expect("OAuth location");
25 if tokens.access == required {
26 Ok(())
27 } else {
28 Err(StorageFailure::AccessNotGranted { required }.into())
29 }
30 }
31 (CloudProvider::CloudKit, StorageCredentials::CloudKit) => Ok(()),
32 _ => Err(StorageFailure::InvalidConfiguration
33 .with_source("credentials do not match provider")),
34 }
35 }
36}