···2233let request_password_reset (actor : Data_store.Types.actor) db =
44 let did = actor.did in
55- let code =
66- "pwd-"
77- ^ String.sub
88- Digestif.SHA256.(
99- digest_string (did ^ Int.to_string @@ Util.now_ms ()) |> to_hex )
1010- 0 8
1111- in
55+ let code = Util.make_code () in
126 let expires_at = Util.now_ms () + (10 * 60 * 1000) in
137 let%lwt () = Data_store.set_auth_code ~did ~code ~expires_at db in
148 Util.send_email_or_log ~recipients:[To actor.email]
+1-3
pegasus/lib/api/server/resetPassword.ml
···99 | Some actor -> (
1010 match (actor.auth_code, actor.auth_code_expires_at) with
1111 | Some auth_code, Some auth_expires_at
1212- when String.starts_with ~prefix:"pwd-" auth_code
1313- && token = auth_code
1414- && Util.now_ms () < auth_expires_at ->
1212+ when token = auth_code && Util.now_ms () < auth_expires_at ->
1513 let%lwt () = Data_store.update_password ~did:actor.did ~password db in
1614 Lwt.return_ok actor.did
1715 | _ ->
+5-10
pegasus/lib/util.ml
···473473 with Not_found -> false
474474475475let make_code () =
476476- let () = Random.self_init () in
477477- let chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" in
478478- let len = String.length chars in
479479- let s = Bytes.create 10 in
480480- for i = 0 to 9 do
481481- let random_index = Random.int len in
482482- Bytes.set s i chars.[random_index]
483483- done ;
484484- let str = Bytes.to_string s in
485485- String.sub str 0 5 ^ "-" ^ String.sub str 5 5
476476+ let () = Mirage_crypto_rng_unix.use_default () in
477477+ let token =
478478+ Multibase.Base32.encode_string @@ Mirage_crypto_rng_unix.getrandom 32
479479+ in
480480+ String.sub token 0 5 ^ "-" ^ String.sub token 5 5
486481487482module type Template = sig
488483 type props