Use opaque type for auth token

So we cannot accidentially output it, as it does not implement
`Display`.
This commit is contained in:
2022-05-28 22:20:53 +02:00
parent b2542b341e
commit e04e8ceeeb
4 changed files with 28 additions and 19 deletions

View File

@@ -1,6 +1,16 @@
use std::process; use std::process;
pub fn get_token_from_command(command: &str) -> Result<String, String> { #[derive(Clone)]
pub struct AuthToken(String);
impl AuthToken {
pub fn access(&self) -> &str {
&self.0
}
}
pub fn get_token_from_command(command: &str) -> Result<AuthToken, String> {
let output = process::Command::new("/usr/bin/env") let output = process::Command::new("/usr/bin/env")
.arg("sh") .arg("sh")
.arg("-c") .arg("-c")
@@ -32,5 +42,5 @@ pub fn get_token_from_command(command: &str) -> Result<String, String> {
.next() .next()
.ok_or_else(|| String::from("Output did not contain any newline"))?; .ok_or_else(|| String::from("Output did not contain any newline"))?;
Ok(token.to_string()) Ok(AuthToken(token.to_string()))
} }

View File

@@ -6,7 +6,7 @@ use super::Filter;
use super::JsonError; use super::JsonError;
use super::Project; use super::Project;
use super::Provider; use super::Provider;
use super::SecretToken; use super::auth;
const PROVIDER_NAME: &str = "github"; const PROVIDER_NAME: &str = "github";
const ACCEPT_HEADER_JSON: &str = "application/vnd.github.v3+json"; const ACCEPT_HEADER_JSON: &str = "application/vnd.github.v3+json";
@@ -67,7 +67,7 @@ impl JsonError for GithubApiErrorResponse {
pub struct Github { pub struct Github {
filter: Filter, filter: Filter,
secret_token: SecretToken, secret_token: auth::AuthToken,
} }
impl Provider for Github { impl Provider for Github {
@@ -76,7 +76,7 @@ impl Provider for Github {
fn new( fn new(
filter: Filter, filter: Filter,
secret_token: SecretToken, secret_token: auth::AuthToken,
api_url_override: Option<String>, api_url_override: Option<String>,
) -> Result<Self, String> { ) -> Result<Self, String> {
if api_url_override.is_some() { if api_url_override.is_some() {
@@ -96,8 +96,8 @@ impl Provider for Github {
self.filter.clone() self.filter.clone()
} }
fn secret_token(&self) -> SecretToken { fn secret_token(&self) -> &auth::AuthToken {
self.secret_token.clone() &self.secret_token
} }
fn auth_header_key() -> String { fn auth_header_key() -> String {

View File

@@ -6,7 +6,7 @@ use super::Filter;
use super::JsonError; use super::JsonError;
use super::Project; use super::Project;
use super::Provider; use super::Provider;
use super::SecretToken; use super::auth;
const PROVIDER_NAME: &str = "gitlab"; const PROVIDER_NAME: &str = "gitlab";
const ACCEPT_HEADER_JSON: &str = "application/json"; const ACCEPT_HEADER_JSON: &str = "application/json";
@@ -75,7 +75,7 @@ impl JsonError for GitlabApiErrorResponse {
pub struct Gitlab { pub struct Gitlab {
filter: Filter, filter: Filter,
secret_token: SecretToken, secret_token: auth::AuthToken,
api_url_override: Option<String>, api_url_override: Option<String>,
} }
@@ -95,7 +95,7 @@ impl Provider for Gitlab {
fn new( fn new(
filter: Filter, filter: Filter,
secret_token: SecretToken, secret_token: auth::AuthToken,
api_url_override: Option<String>, api_url_override: Option<String>,
) -> Result<Self, String> { ) -> Result<Self, String> {
Ok(Self { Ok(Self {
@@ -113,8 +113,8 @@ impl Provider for Gitlab {
self.filter.clone() self.filter.clone()
} }
fn secret_token(&self) -> SecretToken { fn secret_token(&self) -> &auth::AuthToken {
self.secret_token.clone() &self.secret_token
} }
fn auth_header_key() -> String { fn auth_header_key() -> String {

View File

@@ -10,6 +10,7 @@ pub use github::Github;
pub use gitlab::Gitlab; pub use gitlab::Gitlab;
use super::repo; use super::repo;
use super::auth;
use std::collections::HashMap; use std::collections::HashMap;
@@ -69,8 +70,6 @@ pub trait Project {
fn private(&self) -> bool; fn private(&self) -> bool;
} }
type SecretToken = String;
#[derive(Clone)] #[derive(Clone)]
pub struct Filter { pub struct Filter {
users: Vec<String>, users: Vec<String>,
@@ -117,7 +116,7 @@ pub trait Provider {
fn new( fn new(
filter: Filter, filter: Filter,
secret_token: SecretToken, secret_token: auth::AuthToken,
api_url_override: Option<String>, api_url_override: Option<String>,
) -> Result<Self, String> ) -> Result<Self, String>
where where
@@ -125,7 +124,7 @@ pub trait Provider {
fn name(&self) -> String; fn name(&self) -> String;
fn filter(&self) -> Filter; fn filter(&self) -> Filter;
fn secret_token(&self) -> SecretToken; fn secret_token(&self) -> &auth::AuthToken;
fn auth_header_key() -> String; fn auth_header_key() -> String;
fn get_user_projects( fn get_user_projects(
@@ -167,7 +166,7 @@ pub trait Provider {
.header("accept", accept_header.unwrap_or("application/json")) .header("accept", accept_header.unwrap_or("application/json"))
.header( .header(
"authorization", "authorization",
format!("{} {}", Self::auth_header_key(), &self.secret_token()), format!("{} {}", Self::auth_header_key(), &self.secret_token().access()),
) )
.body(()) .body(())
.map_err(|error| error.to_string())?; .map_err(|error| error.to_string())?;
@@ -308,7 +307,7 @@ pub trait Provider {
fn call<T, U>( fn call<T, U>(
uri: &str, uri: &str,
auth_header_key: &str, auth_header_key: &str,
secret_token: &str, secret_token: &auth::AuthToken,
accept_header: Option<&str>, accept_header: Option<&str>,
) -> Result<T, ApiErrorResponse<U>> ) -> Result<T, ApiErrorResponse<U>>
where where
@@ -322,7 +321,7 @@ where
.header("accept", accept_header.unwrap_or("application/json")) .header("accept", accept_header.unwrap_or("application/json"))
.header( .header(
"authorization", "authorization",
format!("{} {}", &auth_header_key, &secret_token), format!("{} {}", &auth_header_key, &secret_token.access()),
) )
.body(()) .body(())
.map_err(|error| ApiErrorResponse::String(error.to_string()))?; .map_err(|error| ApiErrorResponse::String(error.to_string()))?;