Skip to content

Commit 5e2e5a8

Browse files
committed
token_index: move index files into a subdirectory (`data')
Signed-off-by: Alban Gruin <alban.gruin@univ-tlse3.fr>
1 parent c052775 commit 5e2e5a8

File tree

2 files changed

+26
-19
lines changed

2 files changed

+26
-19
lines changed

src/state/dune

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
(name token_index)
3131
(wrapped false)
3232
(modules Token_index)
33-
(libraries lwt lwt.unix learnocaml_api learnocaml_data cryptokit netstring safepass)
33+
(libraries lwt lwt.unix lwt_utils learnocaml_api learnocaml_data cryptokit netstring safepass)
3434
)
3535

3636
(library

src/state/token_index.ml

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ open Lwt
22
open Learnocaml_data
33

44
let ( / ) dir f = if dir = "" then f else Filename.concat dir f
5+
let indexes_subdir = "data"
56

67
module J = Json_encoding
78

@@ -42,6 +43,12 @@ module IndexFile: IndexRW = struct
4243

4344
let write mutex filename serialise data =
4445
Lwt_mutex.lock mutex >>= fun () ->
46+
let path = Filename.dirname filename in
47+
Lwt_utils.is_directory path >>= fun is_directory ->
48+
(if is_directory then
49+
Lwt.return_unit
50+
else
51+
Lwt_unix.mkdir path 0o755) >>= fun () ->
4552
Lwt_io.open_file ~mode:Lwt_io.Output filename >>= fun channel ->
4653
Lwt_io.write channel (serialise data) >>= fun () ->
4754
Lwt_io.close channel >>= fun () ->
@@ -64,7 +71,7 @@ module BaseTokenIndex (RW: IndexRW) = struct
6471
let rec aux s acc =
6572
Lwt.catch (fun () ->
6673
Lwt_stream.get s >>= function
67-
| Some ("." | "..") -> aux s acc
74+
| Some ("." | ".." | "data") -> aux s acc
6875
| Some x -> scan f (d / x) acc >>= aux s
6976
| None -> Lwt.return acc)
7077
@@ function
@@ -86,10 +93,10 @@ module BaseTokenIndex (RW: IndexRW) = struct
8693
Lwt.return acc
8794
) "" [] in
8895
Lwt_io.printl "Regenerating the token index..." >>= fun () ->
89-
found_indexes >>= RW.write rw (sync_dir / file) serialise_str
96+
found_indexes >>= RW.write rw (sync_dir / indexes_subdir / file) serialise_str
9097

9198
let get_file sync_dir name =
92-
let filename = (sync_dir / name) in
99+
let filename = (sync_dir / indexes_subdir / name) in
93100
let create () =
94101
create_index sync_dir >>= fun () ->
95102
RW.read filename parse in
@@ -109,7 +116,7 @@ module BaseTokenIndex (RW: IndexRW) = struct
109116

110117
let add_token sync_dir token =
111118
get_tokens sync_dir >>= fun tokens ->
112-
RW.write rw (sync_dir / file) serialise (token :: tokens)
119+
RW.write rw (sync_dir / indexes_subdir / file) serialise (token :: tokens)
113120
end
114121

115122
module TokenIndex = BaseTokenIndex (IndexFile)
@@ -124,11 +131,11 @@ module BaseMoodleIndex (RW: IndexRW) = struct
124131
let serialise = Json_codec.encode ?minify:(Some(false)) enc
125132

126133
let create_index sync_dir =
127-
RW.write rw (sync_dir / file) serialise []
134+
RW.write rw (sync_dir / indexes_subdir / file) serialise []
128135

129136
let get_users sync_dir =
130137
Lwt.catch
131-
(fun () -> RW.read (sync_dir / file) parse)
138+
(fun () -> RW.read (sync_dir / indexes_subdir / file) parse)
132139
(fun _exn -> Lwt.return [])
133140

134141
let user_exists sync_dir id =
@@ -141,7 +148,7 @@ module BaseMoodleIndex (RW: IndexRW) = struct
141148
Lwt.return ()
142149
else
143150
let users = (id, token) :: users in
144-
RW.write rw (sync_dir / file) serialise users
151+
RW.write rw (sync_dir / indexes_subdir / file) serialise users
145152

146153
let get_user_token sync_dir id =
147154
get_users sync_dir >|= fun users ->
@@ -168,7 +175,7 @@ module BaseOauthIndex (RW: IndexRW) = struct
168175

169176
let create_index sync_dir =
170177
let secret = gen_secret 32 in
171-
RW.write rw (sync_dir / file) serialise [(secret, [])] >|= fun () ->
178+
RW.write rw (sync_dir / indexes_subdir / file) serialise [(secret, [])] >|= fun () ->
172179
secret
173180

174181
let get_first_oauth sync_dir =
@@ -177,7 +184,7 @@ module BaseOauthIndex (RW: IndexRW) = struct
177184
(secret, []) in
178185
Lwt.catch
179186
(fun () ->
180-
RW.read (sync_dir / file) parse >>= function
187+
RW.read (sync_dir / indexes_subdir / file) parse >>= function
181188
| oauth :: _ -> Lwt.return oauth
182189
| [] -> create ())
183190
(fun _exn -> create ())
@@ -188,15 +195,15 @@ module BaseOauthIndex (RW: IndexRW) = struct
188195

189196
let purge sync_dir =
190197
get_first_oauth sync_dir >>= fun oauth ->
191-
RW.write rw (sync_dir / file) serialise [oauth]
198+
RW.write rw (sync_dir / indexes_subdir / file) serialise [oauth]
192199

193200
let add_nonce sync_dir nonce =
194-
RW.read (sync_dir / file) parse >>= fun oauth ->
201+
RW.read (sync_dir / indexes_subdir / file) parse >>= fun oauth ->
195202
let oauth =
196203
match oauth with
197204
| (secret, nonces) :: r -> (secret, nonce :: nonces) :: r
198205
| [] -> [(gen_secret 32, [nonce])] in
199-
RW.write rw (sync_dir / file) serialise oauth
206+
RW.write rw (sync_dir / indexes_subdir / file) serialise oauth
200207

201208
let check_nonce sync_dir nonce =
202209
get_first_oauth sync_dir >|= fun (_secret, nonces) ->
@@ -306,15 +313,15 @@ module BaseUserIndex (RW: IndexRW) = struct
306313

307314
let create_index sync_dir tokens =
308315
token_list_to_users tokens
309-
|> RW.write rw (sync_dir / file) serialise
316+
|> RW.write rw (sync_dir / indexes_subdir / file) serialise
310317

311318
let get_data sync_dir =
312319
Lwt.catch
313-
(fun () -> RW.read (sync_dir / file) parse)
320+
(fun () -> RW.read (sync_dir / indexes_subdir / file) parse)
314321
(fun _exn ->
315322
TokenIndex.get_tokens sync_dir >>= fun tokens ->
316323
let users = token_list_to_users tokens in
317-
RW.write rw (sync_dir / file) serialise users >|= fun () ->
324+
RW.write rw (sync_dir / indexes_subdir / file) serialise users >|= fun () ->
318325
users)
319326

320327
let authenticate sync_dir auth =
@@ -345,7 +352,7 @@ module BaseUserIndex (RW: IndexRW) = struct
345352
| Password (token, name, passwd) ->
346353
let hash = Bcrypt.string_of_hash @@ Bcrypt.hash passwd in
347354
Password (token, name, hash) in
348-
RW.write rw (sync_dir / file) serialise (new_user :: users)
355+
RW.write rw (sync_dir / indexes_subdir / file) serialise (new_user :: users)
349356

350357
let upgrade sync_dir token name passwd =
351358
get_data sync_dir >|=
@@ -355,10 +362,10 @@ module BaseUserIndex (RW: IndexRW) = struct
355362
| Password (found_token, name, _passwd) when found_token = token ->
356363
Password (token, name, passwd)
357364
| elt -> elt) >>=
358-
RW.write rw (sync_dir / file) serialise
365+
RW.write rw (sync_dir / indexes_subdir / file) serialise
359366

360367
let can_login sync_dir token =
361-
RW.read (sync_dir / file) parse >|= fun users ->
368+
RW.read (sync_dir / indexes_subdir / file) parse >|= fun users ->
362369
List.find_opt (function
363370
| Token (found_token, use_moodle) -> found_token = token && not use_moodle
364371
| _ -> false) users <> None

0 commit comments

Comments
 (0)