Skip to main content

secrets_core/
backend.rs

1#[cfg(feature = "use_spec")]
2pub use greentic_secrets_spec::backend::{SecretVersion, SecretsBackend, VersionedSecret};
3
4#[cfg(not(feature = "use_spec"))]
5mod legacy {
6    use crate::errors::Result;
7    use crate::types::{Scope, SecretListItem, SecretRecord};
8    use crate::uri::SecretUri;
9    use serde::{Deserialize, Serialize};
10
11    #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
12    pub struct SecretVersion {
13        pub version: u64,
14        pub deleted: bool,
15    }
16
17    impl SecretVersion {
18        pub fn is_deleted(&self) -> bool {
19            self.deleted
20        }
21    }
22
23    #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
24    pub struct VersionedSecret {
25        pub version: u64,
26        pub deleted: bool,
27        pub record: Option<SecretRecord>,
28    }
29
30    impl VersionedSecret {
31        pub fn record(&self) -> Option<&SecretRecord> {
32            self.record.as_ref()
33        }
34    }
35
36    pub trait SecretsBackend: Send + Sync {
37        fn put(&self, record: SecretRecord) -> Result<SecretVersion>;
38        fn get(&self, uri: &SecretUri, version: Option<u64>) -> Result<Option<VersionedSecret>>;
39        fn list(
40            &self,
41            scope: &Scope,
42            category_prefix: Option<&str>,
43            name_prefix: Option<&str>,
44        ) -> Result<Vec<SecretListItem>>;
45        fn delete(&self, uri: &SecretUri) -> Result<SecretVersion>;
46        fn versions(&self, uri: &SecretUri) -> Result<Vec<SecretVersion>>;
47        fn exists(&self, uri: &SecretUri) -> Result<bool>;
48    }
49
50    impl<T> SecretsBackend for Box<T>
51    where
52        T: SecretsBackend + ?Sized,
53    {
54        fn put(&self, record: SecretRecord) -> Result<SecretVersion> {
55            (**self).put(record)
56        }
57        fn get(&self, uri: &SecretUri, version: Option<u64>) -> Result<Option<VersionedSecret>> {
58            (**self).get(uri, version)
59        }
60        fn list(
61            &self,
62            scope: &Scope,
63            category_prefix: Option<&str>,
64            name_prefix: Option<&str>,
65        ) -> Result<Vec<SecretListItem>> {
66            (**self).list(scope, category_prefix, name_prefix)
67        }
68        fn delete(&self, uri: &SecretUri) -> Result<SecretVersion> {
69            (**self).delete(uri)
70        }
71        fn versions(&self, uri: &SecretUri) -> Result<Vec<SecretVersion>> {
72            (**self).versions(uri)
73        }
74        fn exists(&self, uri: &SecretUri) -> Result<bool> {
75            (**self).exists(uri)
76        }
77    }
78
79    impl<T> SecretsBackend for std::sync::Arc<T>
80    where
81        T: SecretsBackend + ?Sized,
82    {
83        fn put(&self, record: SecretRecord) -> Result<SecretVersion> {
84            (**self).put(record)
85        }
86        fn get(&self, uri: &SecretUri, version: Option<u64>) -> Result<Option<VersionedSecret>> {
87            (**self).get(uri, version)
88        }
89        fn list(
90            &self,
91            scope: &Scope,
92            category_prefix: Option<&str>,
93            name_prefix: Option<&str>,
94        ) -> Result<Vec<SecretListItem>> {
95            (**self).list(scope, category_prefix, name_prefix)
96        }
97        fn delete(&self, uri: &SecretUri) -> Result<SecretVersion> {
98            (**self).delete(uri)
99        }
100        fn versions(&self, uri: &SecretUri) -> Result<Vec<SecretVersion>> {
101            (**self).versions(uri)
102        }
103        fn exists(&self, uri: &SecretUri) -> Result<bool> {
104            (**self).exists(uri)
105        }
106    }
107}
108
109#[cfg(not(feature = "use_spec"))]
110pub use legacy::{SecretVersion, SecretsBackend, VersionedSecret};
111
112#[cfg(feature = "aws")]
113pub mod aws;
114#[cfg(feature = "azure")]
115pub mod azure;
116#[cfg(feature = "env")]
117pub mod env;
118#[cfg(feature = "file")]
119pub mod file;
120#[cfg(feature = "gcp")]
121pub mod gcp;
122#[cfg(feature = "k8s")]
123pub mod k8s;