/_sitemap.rss for COCANWIKI.
[cocanwiki.git] / scripts / signup.ml
1 (* COCANWIKI - a wiki written in Objective CAML.
2  * Written by Richard W.M. Jones <rich@merjis.com>.
3  * Copyright (C) 2004 Merjis Ltd.
4  * $Id: signup.ml,v 1.11 2006/03/28 16:24:08 rich Exp $
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; see the file COPYING.  If not, write to
18  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  *)
21
22 open Apache
23 open Registry
24 open Cgi
25 open Printf
26
27 open Cocanwiki
28 open Cocanwiki_ok
29 open Cocanwiki_strings
30
31 let run r (q : cgi) dbh hostid _ _ =
32   (* Verify that we're allowed to create accounts anonymously
33    * on this host.
34    *)
35   let create_account_anon = List.hd (
36     PGSQL(dbh) "select create_account_anon from hosts
37                  where id = $hostid"
38   ) in
39
40   if not create_account_anon then (
41     error ~title:"Not allowed to create accounts"
42       dbh hostid q ("To get an account on this service, please contact the " ^
43                     "administrator.");
44     return ()
45   );
46
47   let username = trim (q#param "username") in
48   let password1 = trim (q#param "password1") in
49   let password2 = trim (q#param "password2") in
50
51   if username = "" || password1 = "" || password2 = "" then (
52     error ~back_button:true ~title:"Bad username or password"
53       dbh hostid q "The username or password you gave is empty.";
54     return ()
55   );
56
57   if password1 <> password2 then (
58     error ~back_button:true ~title:"Passwords don't match"
59       dbh hostid q "The two passwords you gave aren't identical.";
60     return ()
61   );
62
63   let password = password1 in
64
65   if UTF8.length username > 32 || UTF8.length password > 128 then (
66     error ~back_button:true ~title:"Username or password too long"
67       dbh hostid q "Usernames should be less than 32 characters long.  For passwords we let you have a generous 128 characters.";
68     return ()
69   );
70
71   let email = trim (q#param "email") in
72   let email = if string_is_whitespace email then None else Some email in
73
74   (* Not a duplicate? *)
75   let rows = PGSQL(dbh)
76     "select id from users where hostid = $hostid and name = $username" in
77
78   (match rows with
79    | [_] ->
80        error ~back_button:true ~title:"Username already taken"
81          dbh hostid q
82          ("Someone, possibly you, has already taken that username. " ^
83             "If you think you have forgotten your password, try going back " ^
84             "and clicking on the 'Forgotten your password?' link.");
85        return ()
86    | [] -> ()
87    | _ -> assert false
88   );
89
90   (* Create the user account. *)
91   PGSQL(dbh) "insert into users (name, password, email, hostid)
92               values ($username, $password, $?email, $hostid)";
93
94   let userid = PGOCaml.serial4 dbh "users_id_seq" in
95
96   (* Create a cookie. *)
97   let cookie = random_sessionid () in
98   PGSQL(dbh) "insert into usercookies (userid, cookie)
99               values ($userid, $cookie)";
100
101   PGOCaml.commit dbh;
102
103   let buttons = [ ok_button "/" ] in
104   let cookie = Cookie.cookie "auth" cookie ~path:"/" in
105
106   ok ~title:"Account created"
107     ~buttons
108     ~cookie
109     dbh hostid q
110     ("An account was created for you, " ^ username ^ ". " ^
111      "We hope you enjoy using this service.")
112
113 let () =
114   register_script run