22open Learnocaml_data
33
44let ( / ) dir f = if dir = " " then f else Filename. concat dir f
5+ let indexes_subdir = " data"
56
67module 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)
113120end
114121
115122module 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