From: Wilmer Ricciotti Date: Wed, 15 Jun 2011 14:13:24 +0000 (+0000) Subject: Logout (partial work) (multi-user matita) X-Git-Tag: make_still_working~2438 X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=commitdiff_plain;h=2ab54291cd9038c81b82ddb29936e966c66a480c;p=helm.git Logout (partial work) (multi-user matita) --- diff --git a/matitaB/matita/matitaAuthentication.ml b/matitaB/matita/matitaAuthentication.ml index 1b9a91b71..7d6471df5 100644 --- a/matitaB/matita/matitaAuthentication.ml +++ b/matitaB/matita/matitaAuthentication.ml @@ -30,8 +30,8 @@ type user = string * (string * session_id option) let user_tbl = (ref [] : user list ref) -(* session table: (user id, session id), matita status *) -type session = session_id * (MatitaEngine.status * MatitaEngine.status list) +(* session table: session id, (user id, matita status, matita history *) +type session = session_id * (string * MatitaEngine.status * MatitaEngine.status list) let session_tbl = (ref [] : session list ref) @@ -51,28 +51,35 @@ let create_session uid = List.remove_assoc sid' !session_tbl | _ -> !session_tbl in - session_tbl := (new_session,(status,history))::clean_stbl; + session_tbl := (new_session,(uid,status,history))::clean_stbl; new_session ;; -let get_status sid = fst (List.assoc sid !session_tbl) +let get_session_owner sid = + let uid,_,_ = List.assoc sid !session_tbl + in uid -let get_history sid = snd (List.assoc sid !session_tbl) +let get_status sid = + let _,st,_ = List.assoc sid !session_tbl + in st + +let get_history sid = + let _,_,hist = List.assoc sid !session_tbl + in hist let set_status sid st = - let oldst, hist = List.assoc sid !session_tbl in - session_tbl := (sid,(st,hist))::(List.remove_assoc sid !session_tbl) + let uid, oldst, hist = List.assoc sid !session_tbl in + session_tbl := (sid,(uid,st,hist))::(List.remove_assoc sid !session_tbl) let set_history sid hist = - let st, oldhist = List.assoc sid !session_tbl in - session_tbl := (sid,(st,hist))::(List.remove_assoc sid !session_tbl) - -let logout_user uid = - match List.assoc uid !user_tbl with - | _,None -> () - | pw, Some sid -> - user_tbl := (uid,(pw,None))::List.remove_assoc uid !user_tbl; - session_tbl := List.remove_assoc sid !session_tbl + let uid, st, oldhist = List.assoc sid !session_tbl in + session_tbl := (sid,(uid,st,hist))::(List.remove_assoc sid !session_tbl) + +let logout_user sid = + let uid,st,hist = List.assoc sid !session_tbl in + let pw,_ = List.assoc uid !user_tbl in + user_tbl := (uid,(pw,None))::List.remove_assoc uid !user_tbl; + session_tbl := List.remove_assoc sid !session_tbl ;; let remove_user uid = diff --git a/matitaB/matita/matitaAuthentication.mli b/matitaB/matita/matitaAuthentication.mli index c1c2cf489..3bd1bc0aa 100644 --- a/matitaB/matita/matitaAuthentication.mli +++ b/matitaB/matita/matitaAuthentication.mli @@ -31,6 +31,8 @@ val lookup_user : string -> (string * session_id option) val create_session : string -> session_id +val get_session_owner : session_id -> string + val get_status : session_id -> MatitaEngine.status val get_history : session_id -> MatitaEngine.status list @@ -39,7 +41,7 @@ val set_status : session_id -> MatitaEngine.status -> unit val set_history : session_id -> MatitaEngine.status list -> unit -val logout_user : string -> unit +val logout_user : session_id -> unit val remove_user : string -> unit diff --git a/matitaB/matita/matitadaemon.ml b/matitaB/matita/matitadaemon.ml index 664a7301c..07b03207a 100644 --- a/matitaB/matita/matitadaemon.ml +++ b/matitaB/matita/matitadaemon.ml @@ -3,6 +3,8 @@ open Http_types;; module Stack = Continuationals.Stack +let rt_path () = Helm_registry.get "matita.rt_base_dir" + let utf8_length = Netconversion.ustring_length `Enc_utf8 let utf8_parsed_text s floc = @@ -251,6 +253,29 @@ let login (cgi : Netcgi1_compat.Netcgi_types.cgi_activation) = ;; +let logout (cgi : Netcgi1_compat.Netcgi_types.cgi_activation) = + let cgi = Netcgi1_compat.Netcgi_types.of_compat_activation cgi in + let env = cgi#environment in + (try + let sid = Uuidm.of_string (Netcgi.Cookie.value (env#cookie "session")) in + let sid = HExtlib.unopt sid in + MatitaAuthentication.logout_user sid; + cgi # set_header + ~cache:`No_cache + ~content_type:"text/html; charset=\"utf-8\"" + (); + let text = read_file (rt_path () ^ "/logout.html") in + cgi#out_channel#output_string text + with + | Not_found _ -> + cgi # set_header + ~status:`Internal_server_error + ~cache:`No_cache + ~content_type:"text/xml; charset=\"utf-8\"" + ()); + cgi#out_channel#commit_work() +;; + (* returns the length of the executed text and an html representation of the * current metasenv*) let advance (cgi : Netcgi1_compat.Netcgi_types.cgi_activation) = @@ -420,6 +445,13 @@ let start() = dyn_translator = (fun _ -> ""); (* not needed *) dyn_accept_all_conditionals = false; } in + (*let do_logout = + { Nethttpd_services.dyn_handler = (fun _ -> logout); + dyn_activation = Nethttpd_services.std_activation `Std_activation_buffered; + dyn_uri = None; (* not needed *) + dyn_translator = (fun _ -> ""); (* not needed *) + dyn_accept_all_conditionals = false; + } in *) let nethttpd_factory = Nethttpd_plex.nethttpd_factory @@ -427,7 +459,8 @@ let start() = ; "retract", do_retract ; "bottom", goto_bottom ; "open", retrieve - ; "login", do_login ] + ; "login", do_login + (*; "logout", do_logout *)] () in MatitaInit.initialize_all (); (* test begin *) diff --git a/matitaB/matita/matitaweb.js b/matitaB/matita/matitaweb.js index 0c661623b..423eda674 100644 --- a/matitaB/matita/matitaweb.js +++ b/matitaB/matita/matitaweb.js @@ -514,3 +514,15 @@ function readCookie(name) { } return null; } + +function delete_cookie ( cookie_name ) +{ + var cookie_date = new Date(); // current date & time + cookie_date.setTime ( cookie_date.getTime() - 1 ); + document.cookie = cookie_name += "=; expires=" + cookie_date.toGMTString(); +} + +function delete_session() +{ + delete_cookie("session"); +} diff --git a/matitaB/matita/netplex.conf b/matitaB/matita/netplex.conf index a42f4c359..0728b01ca 100644 --- a/matitaB/matita/netplex.conf +++ b/matitaB/matita/netplex.conf @@ -12,7 +12,7 @@ netplex { name = "http"; address { type = "internet"; - bind = "0.0.0.0:9999"; (* Port 80 on all interfaces *) + bind = "0.0.0.0:9999"; (* Port 9999 on all interfaces *) }; }; processor { @@ -67,6 +67,13 @@ netplex { handler = "login"; } }; + (* uri { + path = "/logout"; + service { + type = "dynamic"; + handler = "logout"; + } + };*) }; }; workload_manager {