fabaccess-bffh/bffhd/authentication/mod.rs

54 lines
1.3 KiB
Rust
Raw Normal View History

2022-03-12 01:27:58 +01:00
use std::sync::Arc;
2022-03-13 22:50:37 +01:00
use rsasl::error::{SASLError, SessionError};
2022-03-12 01:27:58 +01:00
use rsasl::mechname::Mechname;
2022-03-13 22:50:37 +01:00
use rsasl::{Property, SASL};
use rsasl::session::{Session, SessionData};
use rsasl::validate::Validation;
use crate::users::db::UserDB;
use crate::users::Users;
2022-03-08 18:52:49 +01:00
2022-03-10 20:52:34 +01:00
pub mod db;
2022-03-13 22:50:37 +01:00
struct Callback {
users: Users,
}
impl Callback {
pub fn new(users: Users) -> Self {
Self { users, }
}
}
impl rsasl::callback::Callback for Callback {
fn validate(&self, session: &mut SessionData, validation: Validation, mechanism: &Mechname) -> Result<(), SessionError> {
todo!()
}
}
2022-03-12 01:27:58 +01:00
struct Inner {
rsasl: SASL,
}
impl Inner {
pub fn new(rsasl: SASL) -> Self {
Self { rsasl }
}
}
2022-03-10 20:52:34 +01:00
2022-03-12 01:27:58 +01:00
#[derive(Clone)]
2022-03-12 17:31:53 +01:00
pub struct AuthenticationHandle {
2022-03-12 01:27:58 +01:00
inner: Arc<Inner>,
2022-03-10 20:52:34 +01:00
}
2022-03-12 17:31:53 +01:00
impl AuthenticationHandle {
2022-03-13 22:50:37 +01:00
pub fn new(userdb: Users) -> Self {
let mut rsasl = SASL::new();
rsasl.install_callback(Arc::new(Callback::new(userdb)));
2022-03-12 01:27:58 +01:00
Self { inner: Arc::new(Inner::new(rsasl)) }
}
2022-03-10 20:52:34 +01:00
2022-03-12 17:31:53 +01:00
pub fn start(&self, mechanism: &Mechname) -> anyhow::Result<Session> {
Ok(self.inner.rsasl.server_start(mechanism)?)
}
pub fn list_available_mechs(&self) -> impl IntoIterator<Item=&Mechname> {
self.inner.rsasl.server_mech_list().into_iter().map(|m| m.mechanism)
2022-03-12 01:27:58 +01:00
}
2022-03-10 20:52:34 +01:00
}