Skip to main content

authy/vault/
secret.rs

1use crate::types::*;
2use zeroize::{Zeroize, ZeroizeOnDrop};
3
4/// A single secret entry in the vault.
5#[derive(Debug, Clone, Serialize, Deserialize, Zeroize, ZeroizeOnDrop)]
6pub struct SecretEntry {
7    /// The secret value (plaintext once vault is decrypted).
8    pub value: String,
9    /// Metadata about this secret.
10    #[zeroize(skip)]
11    pub metadata: SecretMetadata,
12}
13
14/// Metadata associated with a secret (non-sensitive).
15#[derive(Debug, Clone, Serialize, Deserialize)]
16pub struct SecretMetadata {
17    pub created_at: DateTime<Utc>,
18    pub modified_at: DateTime<Utc>,
19    pub version: u32,
20    #[serde(default)]
21    pub tags: Vec<String>,
22    #[serde(default)]
23    pub description: Option<String>,
24}
25
26impl Default for SecretMetadata {
27    fn default() -> Self {
28        Self::new()
29    }
30}
31
32impl SecretMetadata {
33    pub fn new() -> Self {
34        let now = Utc::now();
35        Self {
36            created_at: now,
37            modified_at: now,
38            version: 1,
39            tags: Vec::new(),
40            description: None,
41        }
42    }
43
44    pub fn bump_version(&mut self) {
45        self.version += 1;
46        self.modified_at = Utc::now();
47    }
48}
49
50impl SecretEntry {
51    pub fn new(value: String) -> Self {
52        Self {
53            value,
54            metadata: SecretMetadata::new(),
55        }
56    }
57}