From 99bb666616c94b7d21219275b9cade4b2f124bd5 Mon Sep 17 00:00:00 2001 From: Swrup Date: Fri, 1 Apr 2022 05:24:49 +0200 Subject: [PATCH] fix login with email --- src/user.ml | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/user.ml b/src/user.ml index d099004..9be917b 100644 --- a/src/user.ml +++ b/src/user.ml @@ -164,18 +164,7 @@ let get_nick user_id = Ok nick let login ~login ~password request = - if is_banished login then Error "YOU ARE BANISHED" - else - let* user_id = - match Db.find_opt Q.get_user_id_from_nick login with - | Error e -> Error (Format.sprintf "db error: %s" (Caqti_error.show e)) - | Ok None -> ( - match Db.find_opt Q.get_user_id_from_email login with - | Error e -> Error (Format.sprintf "db error: %s" (Caqti_error.show e)) - | Ok None -> Error "wrong login" - | Ok (Some user_id) -> Ok user_id ) - | Ok (Some user_id) -> Ok user_id - in + let try_password user_id = let^ good_password = Db.find Q.get_password user_id in if Bcrypt.verify password (Bcrypt.hash_of_string good_password) then let _unit_lwt = Dream.invalidate_session request in @@ -183,7 +172,21 @@ let login ~login ~password request = let* nick = get_nick user_id in let _unit_lwt = Dream.put_session "nick" nick request in Ok () + else if is_banished login then Error "YOU ARE BANISHED" else Error "wrong password" + in + + let^ id_from_nick = Db.find_opt Q.get_user_id_from_nick login in + let^ id_from_email = Db.find_opt Q.get_user_id_from_email login in + let user_id_list = List.filter_map Fun.id [ id_from_nick; id_from_email ] in + match user_id_list with + | [] -> Error "Invalid login" + | [ id ] -> try_password id + | [ id_1; id_2 ] -> ( + match try_password id_1 with + | Ok () -> Ok () + | Error _e -> try_password id_2 ) + | _to_many_ids -> assert false let valid_nick nick = String.length nick < 64