Skip to main content

nethsm/cli/config/
credentials.rs

1use serde::{Deserialize, Serialize};
2use zeroize::Zeroize;
3
4use crate::{Credentials, Passphrase, UserId, UserRole};
5
6/// A set of credentials for a [`NetHsm`][`crate::NetHsm`]
7///
8/// Tracks the [`UserRole`], [`UserId`] and optionally the passphrase of the user.
9#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize, Zeroize)]
10pub struct ConfigCredentials {
11    #[zeroize(skip)]
12    role: UserRole,
13    #[zeroize(skip)]
14    name: UserId,
15    passphrase: Option<String>,
16}
17
18impl ConfigCredentials {
19    /// Creates a new [`ConfigCredentials`]
20    ///
21    /// # Examples
22    ///
23    /// ```
24    /// use nethsm::{
25    ///     UserRole,
26    ///     cli::{ConfigCredentials, ConfigInteractivity},
27    /// };
28    ///
29    /// # fn main() -> testresult::TestResult {
30    /// // credentials for an Operator user with passphrase
31    /// ConfigCredentials::new(
32    ///     UserRole::Operator,
33    ///     "user1".parse()?,
34    ///     Some("my-passphrase".into()),
35    /// );
36    ///
37    /// // credentials for an Administrator user without passphrase
38    /// ConfigCredentials::new(UserRole::Administrator, "admin1".parse()?, None);
39    /// # Ok(())
40    /// # }
41    /// ```
42    pub fn new(role: UserRole, name: UserId, passphrase: Option<String>) -> Self {
43        Self {
44            role,
45            name,
46            passphrase,
47        }
48    }
49
50    /// Returns the name (a [`UserId`])
51    pub fn get_name(&self) -> UserId {
52        self.name.clone()
53    }
54
55    /// Returns the role (a [`UserRole`])
56    pub fn get_role(&self) -> UserRole {
57        self.role
58    }
59
60    /// Returns the passphrase of the [`ConfigCredentials`]
61    pub fn get_passphrase(&self) -> Option<&str> {
62        self.passphrase.as_deref()
63    }
64
65    /// Sets the passphrase of the [`ConfigCredentials`]
66    pub fn set_passphrase(&mut self, passphrase: String) {
67        self.passphrase = Some(passphrase)
68    }
69
70    /// Returns whether a passphrase is set for the [`ConfigCredentials`]
71    pub fn has_passphrase(&self) -> bool {
72        self.passphrase.is_some()
73    }
74}
75
76impl From<ConfigCredentials> for Credentials {
77    fn from(value: ConfigCredentials) -> Self {
78        Self::new(value.name, value.passphrase.map(Passphrase::new))
79    }
80}