|
|
|
@ -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
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|