use base64::{Engine as _, engine::{general_purpose}};
use crate::models::AuthData;
pub fn validate_auth(auth_data: Option<String>, auth_header: Option<String>) -> bool {
if let Some(header) = auth_header {
if header.starts_with("Basic ") {
return validate_basic_auth(auth_data, header);
}
if header.starts_with("Bearer ") {
return validate_bearer_token(auth_data, header);
}
}
false
}
fn validate_basic_auth(auth_data: Option<String>, header: String) -> bool {
if let Some(auth_data) = auth_data {
let encoded_credentials = header.trim_start_matches("Basic ").to_string();
if let Ok(decoded) = general_purpose::STANDARD.decode(&encoded_credentials) {
if let Ok(creds) = String::from_utf8(decoded) {
let mut parts = creds.split(':');
if let (Some(username), Some(password)) = (parts.next(), parts.next()) {
if let Ok(auth_struct) = serde_json::from_str::<AuthData>(&auth_data) {
let username_matches = auth_struct.username
.map_or(false, |u| u == username);
let password_matches = auth_struct.password
.map_or(false, |p| p == password);
return username_matches && password_matches;
}
}
}
}
}
false
}
fn validate_bearer_token(auth_data: Option<String>, header: String) -> bool {
if let Some(auth_data) = auth_data {
if let Ok(auth_struct) = serde_json::from_str::<AuthData>(&auth_data) {
if let Some(expected_token) = auth_struct.token_data {
let token = header.trim_start_matches("Bearer ").to_string();
return token == expected_token;
}
}
}
false
}