Use opaque type for auth token
So we cannot accidentially output it, as it does not implement `Display`.
This commit is contained in:
14
src/auth.rs
14
src/auth.rs
@@ -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()))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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()))?;
|
||||||
|
|||||||
Reference in New Issue
Block a user