Skip to main content

coven_storage/providers/
mod.rs

1//! Built-in provider network implementations.
2mod access;
3mod error_text;
4mod http;
5mod http_body;
6mod http_client;
7mod oauth;
8mod oauth_folders;
9pub use oauth_folders::StorageFolder;
10mod object_metadata;
11mod onedrive_item;
12mod pagination;
13pub use http::{OAuthSession, ProviderResponse};
14pub use oauth::{
15    DropboxClients, OAuthClients, OAuthError, OAuthExchange, OAuthFlow, OAuthPresenter,
16    OAuthRedirectError, OAuthTokenRefresh,
17};
18#[cfg(not(any(target_os = "ios", target_os = "android")))]
19mod desktop_oauth;
20#[cfg(not(any(target_os = "ios", target_os = "android")))]
21pub use desktop_oauth::DesktopOAuthPresenter;
22mod s3;
23/// The policy a member key needs, as guided console steps show it (§20.10).
24pub fn s3_member_policy(config: &crate::StorageConfig) -> Result<String, crate::StorageError> {
25    s3::member_policy(config)
26}
27/// Dropbox's API, for its RPC endpoints.
28pub(crate) const DROPBOX_API: &str = "https://api.dropboxapi.com/2";
29/// Dropbox's content endpoints, for uploads and downloads.
30pub(crate) const DROPBOX_CONTENT: &str = "https://content.dropboxapi.com/2";
31/// Microsoft Graph, OneDrive's API.
32pub(crate) const GRAPH_API: &str = "https://graph.microsoft.com/v1.0";
33
34/// The API an OAuth provider's account and folder requests go to; none for
35/// a provider without OAuth sign-in.
36pub(crate) fn oauth_api(provider: crate::CloudProvider) -> Option<&'static str> {
37    match provider {
38        crate::CloudProvider::Dropbox => Some(DROPBOX_API),
39        crate::CloudProvider::OneDrive => Some(GRAPH_API),
40        _ => None,
41    }
42}
43
44/// Whether a provider failure's native cause is a response the provider sent,
45/// even an error one (E5).
46pub(crate) fn response_arrived(source: &(dyn std::error::Error + 'static)) -> bool {
47    #[cfg(target_vendor = "apple")]
48    if let Some(native) = source.downcast_ref::<cloudkit::NativeError>() {
49        return native.answered();
50    }
51    source.is::<ProviderResponse>()
52        || source.is::<OAuthRedirectError>()
53        || s3::response_status(source).is_some()
54}
55/// The wait a provider failure's native response asked every consumer to
56/// observe: HTTP `Retry-After`, Dropbox's `retry_after`, or CloudKit's
57/// `CKErrorRetryAfterKey` (§6.7).
58pub(crate) fn retry_after(
59    provider: crate::CloudProvider,
60    source: &(dyn std::error::Error + 'static),
61) -> Option<crate::RetryAfter> {
62    #[cfg(target_vendor = "apple")]
63    if let Some(native) = source.downcast_ref::<cloudkit::NativeError>() {
64        return native.retry_after();
65    }
66    if let Some(response) = source.downcast_ref::<ProviderResponse>() {
67        return response.retry_after(provider);
68    }
69    s3::response_retry_after(source)
70}
71#[cfg(feature = "dev-tools")]
72pub(crate) use s3::empty_bucket as empty_s3_bucket;
73#[cfg(any(test, feature = "dev-tools"))]
74pub use s3::EmptiedS3Bucket;
75#[cfg(feature = "dev-tools")]
76pub use s3::EmptyS3BucketError;
77pub(crate) use s3::{
78    check_new_store as check_new_s3_store, check_s3_profile, check_s3_versioning,
79    detect as detect_s3, s3_settings, S3Storage,
80};
81mod dropbox;
82mod dropbox_access;
83mod dropbox_job;
84pub(crate) use dropbox::DropboxStorage;
85mod onedrive;
86mod onedrive_access;
87pub(crate) use onedrive::OneDriveStorage;
88#[cfg(target_vendor = "apple")]
89mod cloudkit;
90#[cfg(target_vendor = "apple")]
91pub(crate) use cloudkit::CloudKitStorage;
92
93#[cfg(test)]
94#[path = "mod_tests.rs"]
95mod tests;
96
97mod connector;
98pub use connector::{ProviderConnector, StorageConnector};