]> matita.cs.unibo.it Git - helm.git/blobdiff - matitaB/matita/matitaAuthentication.ml
Matitaweb: added a function MatitaAuthentication.get_users returning
[helm.git] / matitaB / matita / matitaAuthentication.ml
index d51eb2e4fae4a4ff7c0d2b0bb9ea508f049a7b3c..7ae548058abea4efed9272e96645776ec3b03cc4 100644 (file)
@@ -25,6 +25,8 @@
 
 type session_id = Uuidm.t
 
+type matita_file = MatitaFilesystem.matita_flag * string
+
 (* user table: user id, (password, optional session id) *)
 type user = string * (string * session_id option)
 
@@ -41,6 +43,8 @@ let lookup_user uid = List.assoc uid !user_tbl
 
 let user_of_session sid = let res,_,_ = List.assoc sid !session_tbl in res
 
+let get_users () = List.map fst !user_tbl
+
 let create_session uid =
   let status = new MatitaEngine.status (Some uid) "cic:/matita" in
   let history = [status] in
@@ -109,18 +113,52 @@ let deserialize () =
     user_tbl := Marshal.from_channel utbl_ch;
     close_in utbl_ch;
   with
-    | Sys_error _ -> user_tbl := []);
+    | Sys_error _ -> 
+       user_tbl := []; serialize());
   (* old_sessions are now invalid *)
   session_tbl := [];
 ;;
 
+let write_ft uid ft =
+  let ft_ch = open_out (config_path () ^ "/ft_" ^ uid ^ ".dump") in
+  Marshal.to_channel ft_ch ft [];
+  close_out ft_ch;
+;;
+
+let read_ft uid =
+  try
+    let ft_ch = open_in (config_path () ^ "/ft_" ^ uid ^ ".dump") in
+    let ft = Marshal.from_channel ft_ch in
+    close_in ft_ch;
+    ft
+  with
+    | Sys_error _ -> 
+      (* this is an error, we should rebuild the table by a diff of
+         the directory listing and svn stat *) 
+      [] 
+;;
+
+let set_file_flag uid files_flags =
+  let ft = read_ft uid in
+  let files = List.map fst files_flags in
+  let ft = List.filter (fun (x,_) -> not (List.mem x files)) ft in
+  let ft' = List.fold_left (fun acc (filename,flag) ->  
+      let filename = MatitaFilesystem.normalize_qfn filename in 
+      try
+        (filename,HExtlib.unopt flag)::acc
+      with Failure _ -> acc) [] files_flags
+  in
+  write_ft uid (ft'@ft)
+;;
+
 let add_user uid pw =
   try
     let _ = lookup_user uid in
     raise (UsernameCollision uid)
   with Not_found -> 
-    MatitaFilesystem.checkout uid;
+    let ft = MatitaFilesystem.checkout uid in
     user_tbl := (uid,(pw,None))::!user_tbl;
+    write_ft uid ft;
     serialize ()
 ;;