use trait object for database
This commit is contained in:
parent
e5b95a1f8e
commit
c887378476
5 changed files with 16 additions and 8 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -576,6 +576,7 @@ dependencies = [
|
|||
name = "factoriauth"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"axum",
|
||||
"base64",
|
||||
"clap",
|
||||
|
|
|
@ -39,3 +39,4 @@ tracing-subscriber = { version = "0.3.18", features = ["env-filter"] }
|
|||
rustls = "=0.21.7"
|
||||
rustls-webpki = "=0.101.6"
|
||||
sct = "=0.7.0"
|
||||
async-trait = "0.1.77"
|
||||
|
|
|
@ -16,7 +16,7 @@ use tracing::{event, instrument, Level};
|
|||
|
||||
use crate::{
|
||||
config::AuthBackendConfig,
|
||||
db::{Database, SqliteDatabase, UserTokenEntry},
|
||||
db::{Database, UserTokenEntry},
|
||||
secrets::{
|
||||
PadlockGenerationSecret, Password, ServerHash, ServerPadlock, UserServerKey, UserToken,
|
||||
},
|
||||
|
@ -69,14 +69,17 @@ impl ValidateLogin for AuthenticationBackend {
|
|||
|
||||
#[derive(Debug)]
|
||||
pub struct UserAuthenticator {
|
||||
db: Arc<Mutex<SqliteDatabase>>,
|
||||
db: Arc<Mutex<Box<dyn Database + Send>>>,
|
||||
backends: Vec<AuthenticationBackend>,
|
||||
}
|
||||
|
||||
impl UserAuthenticator {
|
||||
const TOKEN_LEN: usize = 30;
|
||||
|
||||
pub fn new(db: Arc<Mutex<SqliteDatabase>>, backends: Vec<AuthenticationBackend>) -> Self {
|
||||
pub fn new(
|
||||
db: Arc<Mutex<Box<dyn Database + Send>>>,
|
||||
backends: Vec<AuthenticationBackend>,
|
||||
) -> Self {
|
||||
Self { db, backends }
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use std::str::FromStr;
|
||||
use std::{fmt::Debug, str::FromStr};
|
||||
|
||||
use axum::async_trait;
|
||||
use secrecy::ExposeSecret;
|
||||
use sqlx::{query, query_as, sqlite::SqliteConnectOptions, Connection, SqliteConnection};
|
||||
use tracing::instrument;
|
||||
|
@ -22,7 +23,8 @@ pub enum UserTokenEntry {
|
|||
),
|
||||
}
|
||||
|
||||
pub trait Database {
|
||||
#[async_trait]
|
||||
pub trait Database: Debug {
|
||||
async fn get_token(&mut self, username: &str) -> Result<Option<UserTokenEntry>, sqlx::Error>;
|
||||
|
||||
async fn save_token(&mut self, username: &str, token: &UserToken) -> Result<(), sqlx::Error>;
|
||||
|
@ -69,6 +71,7 @@ impl SqliteDatabase {
|
|||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl Database for SqliteDatabase {
|
||||
#[instrument]
|
||||
async fn get_token(&mut self, username: &str) -> Result<Option<UserTokenEntry>, sqlx::Error> {
|
||||
|
|
|
@ -33,7 +33,7 @@ use auth::{
|
|||
use clap::Parser;
|
||||
use color_eyre::Result;
|
||||
use config::Config;
|
||||
use db::SqliteDatabase;
|
||||
use db::{Database, SqliteDatabase};
|
||||
use tokio::sync::Mutex;
|
||||
use tracing::{event, instrument, Level};
|
||||
use tracing_error::ErrorLayer;
|
||||
|
@ -82,9 +82,9 @@ async fn main() -> Result<()> {
|
|||
|
||||
let config = load_config(&args.config).await?;
|
||||
|
||||
let database = Arc::new(Mutex::new(
|
||||
let database: Arc<Mutex<Box<dyn Database + Send>>> = Arc::new(Mutex::new(Box::new(
|
||||
SqliteDatabase::open(&config.database.connection_string).await,
|
||||
));
|
||||
)));
|
||||
|
||||
let mut auth_backends = vec![];
|
||||
for c in config.auth_backends {
|
||||
|
|
Loading…
Reference in a new issue