|
|
@ -14,7 +14,7 @@ use crate::{ |
|
|
|
core::two_factor::{duo, email, email::EmailTokenData, yubikey}, |
|
|
|
ApiResult, EmptyResult, JsonResult, JsonUpcase, |
|
|
|
}, |
|
|
|
auth::ClientIp, |
|
|
|
auth::{ClientHeaders, ClientIp}, |
|
|
|
db::{models::*, DbConn}, |
|
|
|
error::MapResult, |
|
|
|
mail, util, CONFIG, |
|
|
@ -25,11 +25,10 @@ pub fn routes() -> Vec<Route> { |
|
|
|
} |
|
|
|
|
|
|
|
#[post("/connect/token", data = "<data>")] |
|
|
|
async fn login(data: Form<ConnectData>, mut conn: DbConn, ip: ClientIp) -> JsonResult { |
|
|
|
async fn login(data: Form<ConnectData>, client_header: ClientHeaders, mut conn: DbConn, ip: ClientIp) -> JsonResult { |
|
|
|
let data: ConnectData = data.into_inner(); |
|
|
|
|
|
|
|
let mut user_uuid: Option<String> = None; |
|
|
|
let device_type = data.device_type.clone(); |
|
|
|
|
|
|
|
let login_result = match data.grant_type.as_ref() { |
|
|
|
"refresh_token" => { |
|
|
@ -59,15 +58,20 @@ async fn login(data: Form<ConnectData>, mut conn: DbConn, ip: ClientIp) -> JsonR |
|
|
|
}; |
|
|
|
|
|
|
|
if let Some(user_uuid) = user_uuid { |
|
|
|
// When unknown or unable to parse, return 14, which is 'Unknown Browser'
|
|
|
|
let device_type = util::try_parse_string(device_type).unwrap_or(14); |
|
|
|
match &login_result { |
|
|
|
Ok(_) => { |
|
|
|
log_user_event(EventType::UserLoggedIn as i32, &user_uuid, device_type, &ip.ip, &mut conn).await; |
|
|
|
log_user_event( |
|
|
|
EventType::UserLoggedIn as i32, |
|
|
|
&user_uuid, |
|
|
|
client_header.device_type, |
|
|
|
&ip.ip, |
|
|
|
&mut conn, |
|
|
|
) |
|
|
|
.await; |
|
|
|
} |
|
|
|
Err(e) => { |
|
|
|
if let Some(ev) = e.get_event() { |
|
|
|
log_user_event(ev.event as i32, &user_uuid, device_type, &ip.ip, &mut conn).await |
|
|
|
log_user_event(ev.event as i32, &user_uuid, client_header.device_type, &ip.ip, &mut conn).await |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|