use serde::{Deserialize, Serialize};
use terracotta::auth::{
middleware::{User as AuthUser, Credentials as AuthCredentials, UserProvider as AuthUserProvider},
state::StateProvider as AuthStateProvider,
};
#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct Credentials {
username: String,
password: String,
}
impl AuthCredentials for Credentials {
fn to_loggable_string(&self) -> String {
self.username.clone()
}
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct User {
pub username: String,
}
impl AuthUser for User {
type Id = String;
fn id(&self) -> &Self::Id {
&self.username
}
fn to_loggable_string(&self) -> String {
self.username.clone()
}
}
impl AuthUserProvider for User {
type Credentials = Credentials;
type User = Self;
fn find_by_credentials<SP: AuthStateProvider>(
state: &SP,
credentials: &Self::Credentials,
) -> Option<Self> {
state
.users()
.get(&credentials.username)
.filter(|&pass| pass == &credentials.password)
.map(|_| Self { username: credentials.username.clone() })
}
fn find_by_id<SP: AuthStateProvider>(
state: &SP,
id: &<Self::User as AuthUser>::Id,
) -> Option<Self> {
state
.users()
.get(id)
.map(|_| Self { username: id.to_owned() })
}
}