Skip to main content

coven_storage/
connection_credentials.rs

1//! The configured location and device credentials used to construct a provider.
2
3use crate::{CloudProvider, StorageConfig, StorageCredentials, StorageError, StorageFailure};
4
5/// Connection data used between coven crates; credentials never enter restore codes.
6#[derive(Clone)]
7pub struct ConnectionCredentials {
8    /// The shared store's location.
9    pub location: StorageConfig,
10    /// Credentials for this member, never persisted in public settings.
11    pub credentials: StorageCredentials,
12}
13
14impl ConnectionCredentials {
15    /// Validate both location and credential kind before encoding or connecting.
16    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}