[OCaml] High Intensity Training Online
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