Skip to content

Commit 793ebc8

Browse files
committed
feat(ui): auto-migrate legacy to v2 session auth
1 parent 6c4996e commit 793ebc8

File tree

3 files changed

+48
-0
lines changed

3 files changed

+48
-0
lines changed

src/app/learnocaml_index_main.ml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,41 @@ let init_sync_session button_group =
799799
Lwt.return (Some session))
800800
(fun _ -> Lwt.return None)
801801

802+
(** [migrate_from_legacy_token] runs once to move old browsers
803+
that still keep the old [sync-token] (v 1.x and earlier)
804+
over to the new session-based login used since Learn-OCaml 2.0. *)
805+
let migrate_from_legacy_token () =
806+
let token =
807+
try
808+
Some (Learnocaml_local_storage.(retrieve sync_token))
809+
with Not_found -> None
810+
in
811+
match token with
812+
| None -> Lwt.return ()
813+
| Some token ->
814+
Server_caller.request (Learnocaml_api.Login token) >>= function
815+
| Error e ->
816+
Learnocaml_common.alert
817+
~title:[%i"Migration error"]
818+
(Server_caller.string_of_error e);
819+
Lwt.return_unit
820+
821+
| Ok session ->
822+
Learnocaml_local_storage.(delete sync_token);
823+
Learnocaml_local_storage.(store sync_session session);
824+
Learnocaml_local_storage.(store is_teacher (Learnocaml_data.Token.is_teacher token));
825+
826+
Server_caller.request (Learnocaml_api.Fetch_save_s session) >>= (function
827+
| Ok save ->
828+
set_state_from_save_file ~session save;
829+
Learnocaml_common.alert
830+
~title:[%i"Connection preserved"]
831+
[%i"The application has been upgraded to a session-based \
832+
authentication. Your previous connection was restored"];
833+
Lwt.return_unit
834+
| Error _ ->
835+
Lwt.return_unit)
836+
802837
let set_string_translations () =
803838
let configured v s = Js.Optdef.case v (fun () -> s) Js.to_string in
804839
let translations = [
@@ -855,6 +890,7 @@ let () =
855890
Js.string ("Learn OCaml" ^ " v"^Learnocaml_api.version);
856891
Manip.setInnerText El.version ("v"^Learnocaml_api.version);
857892
Learnocaml_local_storage.init () ;
893+
migrate_from_legacy_token () >>= fun () ->
858894
let sync_button_group = button_group () in
859895
disable_button_group sync_button_group;
860896
let menu_hidden = ref true in

src/app/learnocaml_local_storage.ml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,16 @@ let server_id =
142142
{ key = Some key ; dependent_keys = (=) key ;
143143
store ; retrieve ; delete ; listeners = [] }
144144

145+
146+
let sync_token =
147+
let key = mangle [ "sync-token" ] in
148+
let enc = Json_encoding.(obj1 (req "token" string)) in
149+
let store value = store_single key enc (Token.to_string value)
150+
and retrieve () = retrieve_single key enc () |> Token.parse
151+
and delete () = delete_single key enc () in
152+
{ key = Some key ; dependent_keys = (=) key ;
153+
store ; retrieve ; delete ; listeners = [] }
154+
145155
let sync_session =
146156
let key = mangle [ "sync-session" ] in
147157
let enc = Json_encoding.(obj1 (req "session" string)) in

src/app/learnocaml_local_storage.mli

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ val all_toplevel_histories : Learnocaml_toplevel_history.snapshot SMap.t storage
5555

5656
val server_id : int storage_key
5757

58+
val sync_token : Token.t storage_key
59+
5860
val sync_session : Session.t storage_key
5961

6062
val is_teacher : bool storage_key

0 commit comments

Comments
 (0)