server: Clarify logging of login attempts and failures

This commit is contained in:
Valentin Tolmer
2024-09-26 20:23:52 +02:00
committed by nitnelave
parent 120ad34f92
commit 0c6a92a8fa
3 changed files with 43 additions and 60 deletions
+1 -1
View File
@@ -3,7 +3,7 @@ use thiserror::Error;
#[allow(clippy::enum_variant_names)] #[allow(clippy::enum_variant_names)]
#[derive(Error, Debug)] #[derive(Error, Debug)]
pub enum DomainError { pub enum DomainError {
#[error("Authentication error: `{0}`")] #[error("Authentication error {0}")]
AuthenticationError(String), AuthenticationError(String),
#[error("Database error: `{0}`")] #[error("Database error: `{0}`")]
DatabaseError(#[from] sea_orm::DbErr), DatabaseError(#[from] sea_orm::DbErr),
+7 -5
View File
@@ -9,6 +9,7 @@ use super::{
use async_trait::async_trait; use async_trait::async_trait;
use base64::Engine; use base64::Engine;
use lldap_auth::opaque; use lldap_auth::opaque;
use log::info;
use sea_orm::{ActiveModelTrait, ActiveValue, EntityTrait, QuerySelect}; use sea_orm::{ActiveModelTrait, ActiveValue, EntityTrait, QuerySelect};
use secstr::SecUtf8; use secstr::SecUtf8;
use tracing::{debug, instrument}; use tracing::{debug, instrument};
@@ -70,14 +71,15 @@ impl LoginHandler for SqlBackendHandler {
.get_password_file_for_user(request.name.clone()) .get_password_file_for_user(request.name.clone())
.await? .await?
{ {
if let Err(e) = passwords_match( info!(r#"Login attempt for "{}""#, &request.name);
if passwords_match(
&password_hash, &password_hash,
&request.password, &request.password,
self.config.get_server_setup(), self.config.get_server_setup(),
&request.name, &request.name,
) { )
debug!(r#"Invalid password for "{}": {}"#, &request.name, e); .is_ok()
} else { {
return Ok(()); return Ok(());
} }
} else { } else {
@@ -87,7 +89,7 @@ impl LoginHandler for SqlBackendHandler {
); );
} }
Err(DomainError::AuthenticationError(format!( Err(DomainError::AuthenticationError(format!(
" for user '{}'", r#"for user "{}""#,
request.name request.name
))) )))
} }
+35 -54
View File
@@ -345,6 +345,7 @@ async fn opaque_login_start<Backend>(
where where
Backend: OpaqueHandler + 'static, Backend: OpaqueHandler + 'static,
{ {
info!(r#"OPAQUE login attempt for "{}""#, &request.username);
data.get_opaque_handler() data.get_opaque_handler()
.login_start(request.into_inner()) .login_start(request.into_inner())
.await .await
@@ -401,11 +402,20 @@ async fn opaque_login_finish<Backend>(
where where
Backend: TcpBackendHandler + BackendHandler + OpaqueHandler + 'static, Backend: TcpBackendHandler + BackendHandler + OpaqueHandler + 'static,
{ {
let name = data match data
.get_opaque_handler() .get_opaque_handler()
.login_finish(request.into_inner()) .login_finish(request.into_inner())
.await?; .await
get_login_successful_response(&data, &name).await {
Ok(name) => {
info!(r#"OPAQUE login successful"#);
get_login_successful_response(&data, &name).await
}
Err(e) => {
warn!(r#"OPAQUE login attempt failed"#);
Err(e.into())
}
}
} }
async fn opaque_login_finish_handler<Backend>( async fn opaque_login_finish_handler<Backend>(
@@ -449,31 +459,6 @@ where
.unwrap_or_else(error_to_http_response) .unwrap_or_else(error_to_http_response)
} }
#[instrument(skip_all, level = "debug", fields(name = %request.name))]
async fn post_authorize<Backend>(
data: web::Data<AppState<Backend>>,
request: web::Json<BindRequest>,
) -> TcpResult<HttpResponse>
where
Backend: TcpBackendHandler + BackendHandler + LoginHandler + 'static,
{
let name = request.name.clone();
data.get_login_handler().bind(request.into_inner()).await?;
get_login_successful_response(&data, &name).await
}
async fn post_authorize_handler<Backend>(
data: web::Data<AppState<Backend>>,
request: web::Json<BindRequest>,
) -> HttpResponse
where
Backend: TcpBackendHandler + BackendHandler + LoginHandler + 'static,
{
post_authorize(data, request)
.await
.unwrap_or_else(error_to_http_response)
}
#[instrument(skip_all, level = "debug")] #[instrument(skip_all, level = "debug")]
async fn opaque_register_start<Backend>( async fn opaque_register_start<Backend>(
request: actix_web::HttpRequest, request: actix_web::HttpRequest,
@@ -648,32 +633,28 @@ pub fn configure_server<Backend>(cfg: &mut web::ServiceConfig, enable_password_r
where where
Backend: TcpBackendHandler + LoginHandler + OpaqueHandler + BackendHandler + 'static, Backend: TcpBackendHandler + LoginHandler + OpaqueHandler + BackendHandler + 'static,
{ {
cfg.service(web::resource("").route(web::post().to(post_authorize_handler::<Backend>))) cfg.service(
.service( web::resource("/opaque/login/start").route(web::post().to(opaque_login_start::<Backend>)),
web::resource("/opaque/login/start") )
.route(web::post().to(opaque_login_start::<Backend>)), .service(
) web::resource("/opaque/login/finish")
.service( .route(web::post().to(opaque_login_finish_handler::<Backend>)),
web::resource("/opaque/login/finish") )
.route(web::post().to(opaque_login_finish_handler::<Backend>)), .service(web::resource("/simple/login").route(web::post().to(simple_login_handler::<Backend>)))
) .service(web::resource("/refresh").route(web::get().to(get_refresh_handler::<Backend>)))
.service( .service(web::resource("/logout").route(web::get().to(get_logout_handler::<Backend>)))
web::resource("/simple/login").route(web::post().to(simple_login_handler::<Backend>)), .service(
) web::scope("/opaque/register")
.service(web::resource("/refresh").route(web::get().to(get_refresh_handler::<Backend>))) .wrap(CookieToHeaderTranslatorFactory)
.service(web::resource("/logout").route(web::get().to(get_logout_handler::<Backend>))) .service(
.service( web::resource("/start")
web::scope("/opaque/register") .route(web::post().to(opaque_register_start_handler::<Backend>)),
.wrap(CookieToHeaderTranslatorFactory) )
.service( .service(
web::resource("/start") web::resource("/finish")
.route(web::post().to(opaque_register_start_handler::<Backend>)), .route(web::post().to(opaque_register_finish_handler::<Backend>)),
) ),
.service( );
web::resource("/finish")
.route(web::post().to(opaque_register_finish_handler::<Backend>)),
),
);
if enable_password_reset { if enable_password_reset {
cfg.service( cfg.service(
web::resource("/reset/step1/{user_id}") web::resource("/reset/step1/{user_id}")