summaryrefslogtreecommitdiff
path: root/cli/auth_tokens.rs
diff options
context:
space:
mode:
authorBasiqueEvangelist <basiqueevangelist@yandex.ru>2021-09-08 07:18:11 +0300
committerGitHub <noreply@github.com>2021-09-08 06:18:11 +0200
commit08e12380a06509e64e69a1b165f3c007373494c1 (patch)
tree6663b4d38a8d2fd5daf1b3f189a1a1bc67270e64 /cli/auth_tokens.rs
parentbf6dbf9855cb21d27838c56932c7536c0cd80a55 (diff)
feat(cli): Support Basic authentication in DENO_AUTH_TOKENS (#11910)
Diffstat (limited to 'cli/auth_tokens.rs')
-rw-r--r--cli/auth_tokens.rs55
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);
+ }
}