Skip to main content

vault_client_rs/types/
response.rs

1use std::collections::HashMap;
2use std::fmt;
3
4use secrecy::{ExposeSecret, SecretString};
5use serde::Deserialize;
6use zeroize::{Zeroize, ZeroizeOnDrop};
7
8use super::redaction::redact;
9
10#[derive(Debug, Deserialize, Clone)]
11#[non_exhaustive]
12pub struct VaultResponse<T> {
13    pub request_id: Option<String>,
14    pub lease_id: Option<String>,
15    pub lease_duration: Option<u64>,
16    pub renewable: Option<bool>,
17    pub data: Option<T>,
18    pub auth: Option<AuthInfo>,
19    pub warnings: Option<Vec<String>>,
20    pub wrap_info: Option<WrapInfo>,
21}
22
23#[derive(Deserialize, Zeroize, ZeroizeOnDrop)]
24#[non_exhaustive]
25pub struct AuthInfo {
26    pub client_token: SecretString,
27    pub accessor: String,
28    #[serde(default)]
29    pub policies: Vec<String>,
30    #[serde(default)]
31    pub token_policies: Vec<String>,
32    #[zeroize(skip)]
33    pub metadata: Option<HashMap<String, String>>,
34    pub lease_duration: u64,
35    pub renewable: bool,
36    pub entity_id: String,
37    pub token_type: String,
38    #[serde(default)]
39    pub orphan: bool,
40    #[zeroize(skip)]
41    pub mfa_requirement: Option<serde_json::Value>,
42    pub num_uses: Option<u64>,
43}
44
45impl Clone for AuthInfo {
46    fn clone(&self) -> Self {
47        Self {
48            client_token: self.client_token.clone(),
49            accessor: self.accessor.clone(),
50            policies: self.policies.clone(),
51            token_policies: self.token_policies.clone(),
52            metadata: self.metadata.clone(),
53            lease_duration: self.lease_duration,
54            renewable: self.renewable,
55            entity_id: self.entity_id.clone(),
56            token_type: self.token_type.clone(),
57            orphan: self.orphan,
58            mfa_requirement: self.mfa_requirement.clone(),
59            num_uses: self.num_uses,
60        }
61    }
62}
63
64impl fmt::Debug for AuthInfo {
65    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
66        f.debug_struct("AuthInfo")
67            .field("client_token", &redact(self.client_token.expose_secret()))
68            .field("accessor", &self.accessor)
69            .field("policies", &self.policies)
70            .field("token_policies", &self.token_policies)
71            .field("metadata", &self.metadata)
72            .field("lease_duration", &self.lease_duration)
73            .field("renewable", &self.renewable)
74            .field("entity_id", &self.entity_id)
75            .field("token_type", &self.token_type)
76            .field("orphan", &self.orphan)
77            .field("mfa_requirement", &self.mfa_requirement)
78            .field("num_uses", &self.num_uses)
79            .finish()
80    }
81}
82
83#[derive(Deserialize, Zeroize, ZeroizeOnDrop)]
84#[non_exhaustive]
85pub struct WrapInfo {
86    pub token: SecretString,
87    pub accessor: String,
88    pub ttl: u64,
89    pub creation_time: String,
90    pub creation_path: String,
91    pub wrapped_accessor: Option<String>,
92}
93
94impl Clone for WrapInfo {
95    fn clone(&self) -> Self {
96        Self {
97            token: self.token.clone(),
98            accessor: self.accessor.clone(),
99            ttl: self.ttl,
100            creation_time: self.creation_time.clone(),
101            creation_path: self.creation_path.clone(),
102            wrapped_accessor: self.wrapped_accessor.clone(),
103        }
104    }
105}
106
107impl fmt::Debug for WrapInfo {
108    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
109        f.debug_struct("WrapInfo")
110            .field("token", &redact(self.token.expose_secret()))
111            .field("accessor", &self.accessor)
112            .field("ttl", &self.ttl)
113            .field("creation_time", &self.creation_time)
114            .field("creation_path", &self.creation_path)
115            .field("wrapped_accessor", &self.wrapped_accessor)
116            .finish()
117    }
118}