dsp_cli/actions/
auth_state.rs1use crate::config::{AuthCache, ResolvedToken, TokenOrigin};
5
6pub(crate) fn read_auth_state(resolved: Option<&ResolvedToken>, cache: &AuthCache, server: &str) -> String {
25 match resolved {
26 None => "anonymous".to_string(),
27 Some(r) if r.origin == TokenOrigin::Env => "authenticated via DSP_TOKEN".to_string(),
28 Some(_) => {
29 match cache.user(server) {
31 Some(user) => format!("authenticated as {user}"),
32 None => "authenticated".to_string(),
33 }
34 }
35 }
36}
37
38#[cfg(test)]
39mod tests {
40 use super::*;
41 use crate::config::AuthCache;
42 use crate::config::token::{ResolvedToken, TokenOrigin};
43
44 const SERVER: &str = "https://api.test.dasch.swiss";
45
46 fn cache_with_user(server: &str, token: &str, user: &str) -> AuthCache {
47 let mut cache = AuthCache::default();
48 cache.set_entry(
49 server,
50 crate::config::auth_cache::ServerEntry {
51 token: token.to_string(),
52 user: Some(user.to_string()),
53 acquired_at: None,
54 expires_at: None,
55 },
56 );
57 cache
58 }
59
60 fn cache_with_token_no_user(server: &str, token: &str) -> AuthCache {
61 let mut cache = AuthCache::default();
62 cache.set_token(server.to_string(), token.to_string());
63 cache
64 }
65
66 fn env_token() -> ResolvedToken {
67 ResolvedToken { token: "env-tok".to_string(), origin: TokenOrigin::Env }
68 }
69
70 fn cache_token() -> ResolvedToken {
71 ResolvedToken { token: "cache-tok".to_string(), origin: TokenOrigin::Cache }
72 }
73
74 #[test]
76 fn no_token_is_anonymous() {
77 let cache = AuthCache::default();
78 let state = read_auth_state(None, &cache, SERVER);
79 assert_eq!(state, "anonymous");
80 }
81
82 #[test]
84 fn env_token_disclosure() {
85 let cache = AuthCache::default();
86 let tok = env_token();
87 let state = read_auth_state(Some(&tok), &cache, SERVER);
88 assert_eq!(state, "authenticated via DSP_TOKEN");
89 }
90
91 #[test]
93 fn cache_token_with_user_shows_username() {
94 let cache = cache_with_user(SERVER, "cache-tok", "alice@example.com");
95 let tok = cache_token();
96 let state = read_auth_state(Some(&tok), &cache, SERVER);
97 assert_eq!(state, "authenticated as alice@example.com");
98 }
99
100 #[test]
102 fn cache_token_without_user_is_authenticated() {
103 let cache = cache_with_token_no_user(SERVER, "cache-tok");
104 let tok = cache_token();
105 let state = read_auth_state(Some(&tok), &cache, SERVER);
106 assert_eq!(state, "authenticated");
107 }
108}