Set h1 width to 95% to avoid horizontal scrollbar.
[cocanwiki.git] / scripts / lib / cocanwiki.ml
index 553c03a..b4f6c20 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.2 2004/10/30 10:16:10 rich Exp $
+ * $Id: cocanwiki.ml,v 1.8 2005/11/24 14:54:15 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
@@ -27,7 +27,7 @@ open Printf
 open Cocanwiki_ok
 open Cocanwiki_strings
 
-module Pool = DbiPool (Dbi_postgres)
+module Pool = DbiPool (Dbi_postgresql)
 
 (* This function is used to grab a database handle.  It's used in a couple
  * of very special places, and is not for general consumption.
@@ -53,7 +53,6 @@ type permissions_t = CanView | CanEdit | CanManageUsers | CanManageContacts
 type prefs_t = {
   email : string option;               (* Email address. *)
   email_notify : bool;                 (* Email notification. *)
-  diff_sidebyside : bool;              (* Shows diffs side-by-side. *)
 }
 
 (* The "user object". *)
@@ -105,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" dbh (-1) 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 =
@@ -123,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" dbh (-1) 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;
@@ -144,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. *)
@@ -161,7 +171,7 @@ let register_script ?(restrict = []) ?(anonymous = true) run =
               "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.email, u.email_notify, u.diff_sidebyside
+                       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];
@@ -170,8 +180,7 @@ let register_script ?(restrict = []) ?(anonymous = true) run =
                  `Bool can_edit; `Bool can_manage_users;
                  `Bool can_manage_contacts; `Bool can_manage_site;
                  `Bool can_edit_global_css; `Bool can_import_mail;
-                 (`Null | `String _) as email; `Bool email_notify;
-                 `Bool diff_sidebyside ] ->
+                 (`Null | `String _) as email; `Bool email_notify ] ->
                  (* Every logged in user can view. *)
                  let perms = [CanView] in
                  let perms =
@@ -198,8 +207,7 @@ let register_script ?(restrict = []) ?(anonymous = true) run =
                        `Null -> None
                      | `String email -> Some email in
                  let prefs = { email = email;
-                               email_notify = email_notify;
-                               diff_sidebyside = diff_sidebyside } in
+                               email_notify = email_notify; } in
                  User (userid, name, perms, prefs)
              | _ -> assert false)
         with
@@ -222,12 +230,38 @@ let register_script ?(restrict = []) ?(anonymous = true) run =
         (* Call the actual CGI script. *)
         run r q dbh hostid host user
        ) else (
-        if user = Anonymous then
-          q#redirect ("http://" ^ hostname ^ "/_login")
-        else
+        if user = Anonymous then (
+          (* Not logged in and no permission to do the requested action,
+           * so redirect to the login script.  If possible set the
+           * redirect parameter so that we return to the right URL.
+           *)
+          let redirect =
+            try
+              (* If we passed through mod_rewrite, then it saved the
+               * unmodified original URL in a subprocess environment
+               * variable called SCRIPT_URL:
+               *)
+              let tbl = Request.subprocess_env r in
+              Some (Table.get tbl "SCRIPT_URL")
+            with
+              Not_found ->
+                try
+                  (* Otherwise try the ordinary uri field in request_rec. *)
+                  Some (Request.uri r)
+                with Not_found ->
+                  None in
+
+          let url =
+            "http://" ^ hostname ^ "/_login" ^
+              match redirect with
+              | None -> ""
+              | Some url -> "?redirect=" ^ Cgi_escape.escape_url url in
+          q#redirect url
+        ) else
           error ~back_button:true
             ~title:"Access denied"
-            q "You do not have permission to access this part of the site."
+            dbh hostid q
+            "You do not have permission to access this part of the site."
        )
     )