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}