View raw

1 type id = string 2 3 let id s = s 4 let id_to_string s = s 5 6 type username = string 7 type username_error = Too_short | Too_long 8 9 let username_min_length = 4 10 let username_max_length = 20 11 12 let pp_username_error ppf = function 13 | Too_short -> 14 Format.fprintf ppf "a username needs at least %d characters" 15 username_min_length 16 | Too_long -> 17 Format.fprintf ppf "a username can have at most %d characters" 18 username_max_length 19 20 let username raw = 21 let normalized = String.trim raw |> String.lowercase_ascii in 22 let n = String.length normalized in 23 if n < username_min_length then Error Too_short 24 else if n > username_max_length then Error Too_long 25 else Ok normalized 26 27 let username_to_string u = u 28 29 type credential = string (* the bcrypt hash string *) 30 31 let credential_of_hash h = h 32 let credential_to_hash h = h 33 let hash_password password = Bcrypt.string_of_hash (Bcrypt.hash password) 34 35 let verify_password credential password = 36 match Bcrypt.hash_of_string credential with 37 | hash -> Bcrypt.verify password hash 38 | exception _ -> false 39 40 type t = { id : id; username : username; credential : credential } 41