summaryrefslogtreecommitdiff
path: root/src/token/app.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/token/app.rs')
-rw-r--r--src/token/app.rs44
1 files changed, 12 insertions, 32 deletions
diff --git a/src/token/app.rs b/src/token/app.rs
index b8af637..04f8747 100644
--- a/src/token/app.rs
+++ b/src/token/app.rs
@@ -12,27 +12,17 @@ use super::{
use crate::{
clock::DateTime,
db::NotFound as _,
- event::{self, repo::Provider as _, Event as ServiceEvent},
- login::{repo::Provider as _, Login, Password},
+ login::{Login, Password},
};
pub struct Tokens<'a> {
db: &'a SqlitePool,
- events: &'a event::Broadcaster,
token_events: &'a Broadcaster,
}
impl<'a> Tokens<'a> {
- pub const fn new(
- db: &'a SqlitePool,
- events: &'a event::Broadcaster,
- token_events: &'a Broadcaster,
- ) -> Self {
- Self {
- db,
- events,
- token_events,
- }
+ pub const fn new(db: &'a SqlitePool, token_events: &'a Broadcaster) -> Self {
+ Self { db, token_events }
}
pub async fn login(
@@ -42,31 +32,21 @@ impl<'a> Tokens<'a> {
login_at: &DateTime,
) -> Result<Secret, LoginError> {
let mut tx = self.db.begin().await?;
+ let (login, stored_hash) = tx
+ .auth()
+ .for_name(name)
+ .await
+ .optional()?
+ .ok_or(LoginError::Rejected)?;
- let (login, created) = if let Some((login, stored_hash)) = tx.auth().for_name(name).await? {
- if stored_hash.verify(password)? {
- // Password verified, proceed with login
- (login, false)
- } else {
- // Password NOT verified.
- return Err(LoginError::Rejected);
- }
+ let token = if stored_hash.verify(password)? {
+ tx.tokens().issue(&login, login_at).await?
} else {
- let password_hash = password.hash()?;
- let created = tx.sequence().next(login_at).await?;
- let login = tx.logins().create(name, &password_hash, &created).await?;
-
- (login, true)
+ Err(LoginError::Rejected)?
};
- let token = tx.tokens().issue(&login, login_at).await?;
tx.commit().await?;
- if created {
- self.events
- .broadcast(login.events().map(ServiceEvent::from).collect::<Vec<_>>());
- }
-
Ok(token)
}