Fixed to match ChriS's API changes to mod_caml.
[cocanwiki.git] / scripts / lib / cocanwiki.ml
index dfa44eb..33eb3b5 100644 (file)
@@ -1,7 +1,7 @@
 (* COCANWIKI - a wiki written in Objective CAML.
  * Written by Richard W.M. Jones <rich@merjis.com>.
  * Copyright (C) 2004 Merjis Ltd.
- * $Id: cocanwiki.ml,v 1.1 2004/10/21 11:42:05 rich Exp $
+ * $Id: cocanwiki.ml,v 1.5 2005/03/31 14:24:04 rich Exp $
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -49,17 +49,23 @@ type host_t = { hostname : string;
 type permissions_t = CanView | CanEdit | CanManageUsers | CanManageContacts
                   | CanManageSite | CanEditGlobalCSS | CanImportMail
 
+(* User preferences and other settings (some cannot be changed by the user). *)
+type prefs_t = {
+  email : string option;               (* Email address. *)
+  email_notify : bool;                 (* Email notification. *)
+}
+
 (* The "user object". *)
 type user_t = Anonymous                        (* Not logged in. *)
-           | User of int * string * permissions_t list
-                                       (* Userid, name, permissions. *)
+           | User of int * string * permissions_t list * prefs_t
+                                       (* Userid, name, perms, prefs. *)
 
 let test_permission {edit_anon = edit_anon; view_anon = view_anon} perm user =
   if perm = CanEdit && edit_anon then true
   else if perm = CanView && view_anon then true
   else match user with
       Anonymous -> false
-    | User (_, _, perms) -> List.mem perm perms
+    | User (_, _, perms, _) -> List.mem perm perms
 
 let can_edit host = test_permission host CanEdit
 let can_manage_users host = test_permission host CanManageUsers
@@ -98,7 +104,13 @@ let register_script ?(restrict = []) ?(anonymous = true) run =
        *)
        let hostid, hostname, canonical_hostname, edit_anon, view_anon =
         let hostname = try Request.hostname r
-        with Not_found -> failwith "No ``Host:'' header in request" in
+        with Not_found ->
+          error ~back_button:true
+            ~title:"Browser problem" q
+            ("Your browser didn't send a \"Host\" header as part of " ^
+             "the HTTP request.  Unfortunately this web server cannot " ^
+             "handle HTTP requests without a \"Host\" header.");
+          return () in
         let hostname = String.lowercase hostname in
 
         let sth =
@@ -116,8 +128,13 @@ let register_script ?(restrict = []) ?(anonymous = true) run =
              | _ -> assert false)
         with
             Not_found ->
-              failwith ("Hostname ``" ^ hostname ^ "'' not found in " ^
-                        "the hosts/hostnames tables in the database.") in
+              error ~back_button:true
+                ~title:"Unknown website" q
+                ("No website called \"" ^ hostname ^ "\" can be found.  " ^
+                 "If you are the administrator of this site, check that " ^
+                 "the hostname is listed in the \"hostnames\" table " ^
+                 "in the database.");
+              return () in
 
        (* Create the host object. *)
        let host = { hostname = hostname;
@@ -137,8 +154,8 @@ let register_script ?(restrict = []) ?(anonymous = true) run =
              *)
             if q#param_exists "cookie" then (
               let value = q#param "cookie" in
-              let cookie = Cookie.cookie ~name:"auth" ~value ~path:"/" () in
-              Table.set (Request.headers_out r) "Set-Cookie" cookie#as_string;
+              let cookie = Cookie.cookie "auth" value ~path:"/" in
+              Table.set (Request.headers_out r) "Set-Cookie" cookie#to_string;
               value
             ) else (
               (* Normal cookie, from the headers. *)
@@ -153,7 +170,8 @@ let register_script ?(restrict = []) ?(anonymous = true) run =
             dbh#prepare_cached
               "select u.id, u.name, u.can_edit, u.can_manage_users,
                        u.can_manage_contacts, u.can_manage_site,
-                       u.can_edit_global_css, u.can_import_mail
+                       u.can_edit_global_css, u.can_import_mail,
+                       u.email, u.email_notify
                   from usercookies uc, users u
                  where uc.cookie = ? and uc.userid = u.id and u.hostid = ?" in
           sth#execute [`String cookie; `Int hostid];
@@ -161,7 +179,8 @@ let register_script ?(restrict = []) ?(anonymous = true) run =
                [ `Int userid; `String name;
                  `Bool can_edit; `Bool can_manage_users;
                  `Bool can_manage_contacts; `Bool can_manage_site;
-                 `Bool can_edit_global_css; `Bool can_import_mail ] ->
+                 `Bool can_edit_global_css; `Bool can_import_mail;
+                 (`Null | `String _) as email; `Bool email_notify ] ->
                  (* Every logged in user can view. *)
                  let perms = [CanView] in
                  let perms =
@@ -182,7 +201,14 @@ let register_script ?(restrict = []) ?(anonymous = true) run =
                  let perms =
                    if can_import_mail then CanImportMail :: perms
                    else perms in
-                 User (userid, name, perms)
+                 (* Preferences. *)
+                 let email =
+                   match email with
+                       `Null -> None
+                     | `String email -> Some email in
+                 let prefs = { email = email;
+                               email_notify = email_notify; } in
+                 User (userid, name, perms, prefs)
              | _ -> assert false)
         with
             Not_found -> Anonymous