Skip to main content

rusty_stack/installers/common/
sealed_token.rs

1use std::fmt;
2
3#[derive(Clone)]
4pub struct SealedToken(String);
5
6impl SealedToken {
7    pub fn new(value: impl Into<String>) -> Self {
8        Self(value.into())
9    }
10
11    pub fn from_env() -> Self {
12        Self(std::env::var("GITHUB_INSTALLER_TOKEN").unwrap_or_default())
13    }
14
15    pub fn as_str(&self) -> &str {
16        &self.0
17    }
18
19    pub fn purge(&mut self) {
20        let len = self.0.len();
21        self.0.clear();
22        self.0.extend(std::iter::repeat_n('\0', len));
23        self.0.clear();
24    }
25}
26
27impl fmt::Debug for SealedToken {
28    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
29        f.write_str("[REDACTED]")
30    }
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[test]
38    fn debug_is_redacted() {
39        let token = SealedToken::new("abc");
40        assert_eq!(format!("{:?}", token), "[REDACTED]");
41    }
42}