diff options
author | BasiqueEvangelist <basiqueevangelist@yandex.ru> | 2021-09-08 07:18:11 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-08 06:18:11 +0200 |
commit | 08e12380a06509e64e69a1b165f3c007373494c1 (patch) | |
tree | 6663b4d38a8d2fd5daf1b3f189a1a1bc67270e64 /cli/auth_tokens.rs | |
parent | bf6dbf9855cb21d27838c56932c7536c0cd80a55 (diff) |
feat(cli): Support Basic authentication in DENO_AUTH_TOKENS (#11910)
Diffstat (limited to 'cli/auth_tokens.rs')
-rw-r--r-- | cli/auth_tokens.rs | 55 |
1 files changed, 51 insertions, 4 deletions
diff --git a/cli/auth_tokens.rs b/cli/auth_tokens.rs index 83c97e641..c81c296f3 100644 --- a/cli/auth_tokens.rs +++ b/cli/auth_tokens.rs @@ -6,14 +6,26 @@ use log::error; use std::fmt; #[derive(Debug, Clone, PartialEq, Eq)] +pub enum AuthTokenData { + Bearer(String), + Basic { username: String, password: String }, +} + +#[derive(Debug, Clone, PartialEq, Eq)] pub struct AuthToken { host: String, - token: String, + token: AuthTokenData, } impl fmt::Display for AuthToken { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "Bearer {}", self.token) + match &self.token { + AuthTokenData::Bearer(token) => write!(f, "Bearer {}", token), + AuthTokenData::Basic { username, password } => { + let credentials = format!("{}:{}", username, password); + write!(f, "Basic {}", base64::encode(credentials)) + } + } } } @@ -34,9 +46,22 @@ impl AuthTokens { for token_str in tokens_str.split(';') { if token_str.contains('@') { let pair: Vec<&str> = token_str.rsplitn(2, '@').collect(); - let token = pair[1].to_string(); + let token = pair[1]; let host = pair[0].to_lowercase(); - tokens.push(AuthToken { host, token }); + if token.contains(':') { + let pair: Vec<&str> = token.rsplitn(2, ':').collect(); + let username = pair[1].to_string(); + let password = pair[0].to_string(); + tokens.push(AuthToken { + host, + token: AuthTokenData::Basic { username, password }, + }) + } else { + tokens.push(AuthToken { + host, + token: AuthTokenData::Bearer(token.to_string()), + }); + } } else { error!("Badly formed auth token discarded."); } @@ -133,4 +158,26 @@ mod tests { "Bearer abc@123".to_string() ); } + + #[test] + fn test_auth_token_basic() { + let auth_tokens = AuthTokens::new(Some("abc:123@deno.land".to_string())); + let fixture = resolve_url("https://deno.land/x/mod.ts").unwrap(); + assert_eq!( + auth_tokens.get(&fixture).unwrap().to_string(), + "Basic YWJjOjEyMw==" + ); + let fixture = resolve_url("https://www.deno.land/x/mod.ts").unwrap(); + assert_eq!( + auth_tokens.get(&fixture).unwrap().to_string(), + "Basic YWJjOjEyMw==".to_string() + ); + let fixture = resolve_url("http://127.0.0.1:8080/x/mod.ts").unwrap(); + assert_eq!(auth_tokens.get(&fixture), None); + let fixture = + resolve_url("https://deno.land.example.com/x/mod.ts").unwrap(); + assert_eq!(auth_tokens.get(&fixture), None); + let fixture = resolve_url("https://deno.land:8080/x/mod.ts").unwrap(); + assert_eq!(auth_tokens.get(&fixture), None); + } } |