From c386b3bcf78ae591eab2f4ac5ad4bf26f158140a Mon Sep 17 00:00:00 2001 From: Baelyk Date: Sat, 25 Aug 2018 17:07:59 -0500 Subject: [PATCH] Add IP and Username to failed login attempts Resolves #119 --- src/api/identity.rs | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/api/identity.rs b/src/api/identity.rs index fb6120e..e1994c0 100644 --- a/src/api/identity.rs +++ b/src/api/identity.rs @@ -1,4 +1,5 @@ use std::collections::HashMap; +use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use rocket::request::{self, Form, FormItems, FromForm, FromRequest, Request}; use rocket::{Outcome, Route}; @@ -21,12 +22,12 @@ pub fn routes() -> Vec { } #[post("/connect/token", data = "")] -fn login(connect_data: Form, device_type: DeviceType, conn: DbConn) -> JsonResult { +fn login(connect_data: Form, device_type: DeviceType, conn: DbConn, socket: Option) -> JsonResult { let data = connect_data.get(); match data.grant_type { GrantType::RefreshToken => _refresh_login(data, device_type, conn), - GrantType::Password => _password_login(data, device_type, conn), + GrantType::Password => _password_login(data, device_type, conn, socket), } } @@ -57,7 +58,13 @@ fn _refresh_login(data: &ConnectData, _device_type: DeviceType, conn: DbConn) -> }))) } -fn _password_login(data: &ConnectData, device_type: DeviceType, conn: DbConn) -> JsonResult { +fn _password_login(data: &ConnectData, device_type: DeviceType, conn: DbConn, remote: Option) -> JsonResult { + // Get the ip for error reporting + let ip = match remote { + Some(ip) => ip.ip(), + None => IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), + }; + // Validate scope let scope = data.get("scope"); if scope != "api offline_access" { @@ -68,13 +75,19 @@ fn _password_login(data: &ConnectData, device_type: DeviceType, conn: DbConn) -> let username = data.get("username"); let user = match User::find_by_mail(username, &conn) { Some(user) => user, - None => err!("Username or password is incorrect. Try again."), + None => err!(format!( + "Username or password is incorrect. Try again. IP: {}. Username: {}.", + ip, username + )), }; // Check password let password = data.get("password"); if !user.check_valid_password(password) { - err!("Username or password is incorrect. Try again.") + err!(format!( + "Username or password is incorrect. Try again. IP: {}. Username: {}.", + ip, username + )) } // Let's only use the header and ignore the 'devicetype' parameter