6172541eff589386c3974db02480694ffa384559
[atutor.git] / mods / wiki / plugins / auth / userdb_userregistry.php
1 <?php
2
3 /*
4    This plugin works basically the same as "userdb_systempasswd", but adds a
5    page, where users can register themselfes into the "UserRegistry" to get
6    access with permission ring level 2 ("editing"). You could use this one
7    in conjunction with "userdb_systempasswd" (to separate ordinary users from
8    higher level moderators).
9
10    The virtual page "UserRegistry" (you can change this name) can be used
11    by users to create an account and to change its settings (you could add
12    data fields). The _SYSTEM page "system/UserRegistry" can only be edited
13    by a superuser (ring level 0), and the permission/ring level could also
14    be changed for individual users therein (making use of "_systempasswd"
15    plugin optional).
16 */
17
18 #-- settings
19 define("EWIKI_PAGE_USERREGISTRY", "UserRegistry");
20 define("EWIKI_USERDB_USERREGISTRY", "system/UserRegistry");
21 define("EWIKI_REGISTERED_LEVEL", 2);     # ordinary users
22
23 #-- glue
24 $ewiki_plugins["auth_userdb"][] = "ewiki_auth_userdb_userregistry";
25 $ewiki_plugins["page"][EWIKI_PAGE_USERREGISTRY] = "ewiki_page_userregistry";
26
27
28 #-- text
29 $ewiki_t["en"]["PLEASE_RETRY"] = "Please retry.";
30 $ewiki_t["en"]["WRONG_PW"] = "You supplied the wrong password!";
31 $ewiki_t["en"]["RETYPE_PW"] = "Password and retyped password do not match!";
32 $ewiki_t["en"]["PW_ONLY_LETTERS"] = "Only letters and numbers are allowed in user names and passwords.";
33 $ewiki_t["en"]["USERNAME_MIN"] = "User names must be at least 3 characters long.";
34 $ewiki_t["en"]["USERNAME_ALREADY_USED"] = "This user name is already used.";
35 #-- translations
36 $ewiki_t["de"]["PLEASE_RETRY"] = "Bitte, versuch's nochmal.";
37 $ewiki_t["de"]["WRONG_PW"] = "Du hast ein falsches Paßwort eingegeben!";
38 $ewiki_t["de"]["RETYPE_PW"] = "Paßwort und Wiederholung stimmen nicht überein!";
39 $ewiki_t["de"]["PW_ONLY_LETTERS"] = "Nur Buchstaben und Zahlen sind im Paßwort und Benutzernamen erlaubt.";
40 $ewiki_t["en"]["USERNAME_MIN"] = "Benutzernamen müssen wenigstens 3 Zeichen lang sein.";
41 $ewiki_t["en"]["USERNAME_ALREADY_USED"] = "Dieser Benutzername wird schon verwendet.";
42 // partial text _{snippets}
43 $ewiki_t["de"]["New Account"] = "Neues Konto";
44 $ewiki_t["de"]["Account Settings"] = "Konto Einstellungen";
45 $ewiki_t["de"]["change password"] = "Paßwort Ändern";
46 $ewiki_t["de"]["new password"] = "neues Paßwort";
47 $ewiki_t["de"]["password"] = "Paßwort";
48 $ewiki_t["de"]["retype"] = "wiederholen";
49 $ewiki_t["de"]["user/login name"] = "Benutzer/Login-Name";
50 $ewiki_t["de"]["name"] = "Name";
51 $ewiki_t["de"]["save"] = "Speichern";
52 $ewiki_t["de"]["optional infos"] = "Optionale Angaben";
53 $ewiki_t["de"]["personal WikiPage"] = "persönliche WikiSeite";
54 $ewiki_t["de"]["email address"] = "EMail-Adresse";
55 $ewiki_t["de"]["create account"] = "Konto anlegen";
56 $ewiki_t["de"]["change settings"] = "Einstellungen ändern";
57 $ewiki_t["de"]["Data saved"] = "Daten gespeichert";
58 $ewiki_t["de"]["Error saving"] = "Fehler beim Speichern";
59
60
61 #-- user database query
62 function ewiki_auth_userdb_userregistry($username, $password=NULL) {
63
64    global $ewiki_config;
65
66    #-- get pw list
67    $data = ewiki_db::GET(EWIKI_USERDB_USERREGISTRY);
68    
69    #-- search user
70    $entry = array();
71    foreach (explode("\n",$data["content"]) as $line) {
72       $line = trim($line);
73       if (strtok($line, ":") == $username) {
74          $line = substr($line, strpos($line, ":") + 1);
75          $entry = explode(":", $line);
76          break;
77       }
78    }
79
80    return($entry);
81 }
82
83
84
85 #-- virtual registration page -------------------------------------------
86 function ewiki_page_userregistry($id, &$data, $action) {
87
88    global $ewiki_plugins, $ewiki_config, $ewiki_auth_user;
89
90    $o = ewiki_make_title($id, $id, 2, $action);
91    $url = ewiki_script("", $id);
92
93    #-- auto-login
94    if ($ewiki_auth_user && empty($_REQUEST["userreg_name"])) {
95       $user = $ewiki_auth_user;
96       $uu = ewiki_auth_userdb_userregistry($ewiki_auth_user);
97       $pw = $uu[0];
98       $_REQUEST["userreg_login"] = 1;
99    }
100    else {
101       $user = trim($_REQUEST["userreg_name"]);
102       $pw = $_REQUEST["userreg_pw"];
103    }
104
105    #-- try to get user entry
106    $ue = ewiki_auth_userdb_userregistry($user);
107
108    #-- account creation ---------------------------------------------------
109    if ($_REQUEST["userreg_register"] && empty($ue)) {
110
111       $o .= ewiki_t(<<< END
112 <h4>_{New Account}</h4>
113 <form action="$url" method="POST" enctype="multipart/form-data" accept-encoding="ISO-8859-1">
114 _{user/login name} <input type="text" size="14" name="userreg_name" value="$user"> <br />
115 <input type="hidden" name="userreg_pw" value="">
116 <br />
117 _{password} <input type="password" name="new_pw" size="10" maxsize="12" value="$pw"> <br />
118 _{retype} <input type="password" name="new_pw2" size="10" maxsize="12" value=""> <br />
119 <br />
120 <input type="submit" name="userreg_store" value="_{create account}">
121 </form><br /><br />
122 END
123       );
124
125       return($o);  // finished here, prevent fallthrough-display of login-form
126    }
127
128    #-- check password
129    if ($ue && $user && !ewiki_auth_user($user,$pw)) {
130       $o .= $_REQUEST["userreg_register"]
131                ? ewiki_t("USERNAME_ALREADY_USED")
132                : (ewiki_t("WRONG_PW") . "\n" . ewiki_t("PLEASE_RETRY"));
133       return($o);
134    }
135
136    #-- set fallback settings for account creation
137    if (empty($ue) && $_REQUEST["userreg_store"]) {
138       $ue =
139       $_REQUEST["userreg_ue"] =
140       array(
141          $pw,
142          EWIKI_REGISTERED_LEVEL,
143          "", "", ""
144       );
145    }
146    
147    #-- check username
148    if (preg_match("/[^".EWIKI_CHARS_U.EWIKI_CHARS_L."]/", $user.$pw)) {
149       $o .= ewiki_t("PW_ONLY_LETTERS") . "\n" . ewiki_t("PLEASE_RETRY");
150       return($o);
151    }
152    elseif ($name && (strlen($user) < 3)) {
153       return($o . ewiki_t("USERNAME_MIN"));
154    }
155
156    #-- save changes -------------------------------------------------------
157    if ($_REQUEST["userreg_store"] && $user) {
158
159       #-- new user entry
160       ($new_ue = $_REQUEST["userreg_ue"]) or ($new_ue = array());
161       $new_ue[0] = $pw;
162       ($new_ue[1] = $ue[1]) or ($new_ue[1] = EWIKI_REGISTERED_LEVEL);
163       if ($new_pw = $_REQUEST["new_pw"]) {
164          if ($new_pw == $_REQUEST["new_pw2"]) {
165             $new_ue[0] = md5($new_pw);
166          }
167          else {
168             $o .= ewiki_t("RETYPE_PW") ."\n<br />";
169             return($o);
170          }
171       }
172       foreach ($new_ue as $i=>$v) {
173          $new_ue[$i] = preg_replace("/[^-@._ \w\d".EWIKI_CHARS_L.EWIKI_CHARS_U."]/", " ", $v);
174       }
175
176       #-- get user db page
177       ($data = ewiki_db::GET(EWIKI_USERDB_USERREGISTRY))
178       or ($data = array(
179         "id" => EWIKI_USERDB_USERREGISTRY,
180         "version" => 1, flags => 0,
181         "created" => time(), "lastmodified" => time(),
182         "content" => "nobody:*:3::", "meta" => "",
183         "author" => ewiki_author("$user@$id"),
184       ));
185       $data["flags"] |= EWIKI_DB_F_SYSTEM;
186       $list = explode("\n", $data["content"]);
187
188       #-- update entry
189       ksort($new_ue);
190       $new_ue = $user . ":" . implode(":", $new_ue);
191       $found = 0;
192       foreach ($list as $i=>$line) {
193          $line = trim($line);
194          if (strtok($line, ":") == $user) {
195             $list[$i] = $new_ue;
196             $found = 1;
197          }
198       }
199       if (!$found) {
200          $list[] = $new_ue;
201       }
202
203       #-- save back
204       $data["content"] = implode("\n", $list);
205       $retry = 3;
206       while ($retry--) {
207          $data["version"]++;
208          if ($ok = ewiki_db::WRITE($data)) {
209             break;
210          }
211       }
212       if ($ok) {
213          $o .= ewiki_t("Data saved")."\n<br />";
214       }
215       else {
216          $o .= ewiki_t("Error saving")."\n<br />";
217          ewiki_log("_userdb_userregistry: failed to update db for user $user, retries=$retry", 2);
218       }
219
220       #-- fallthru to view_settings
221       $_REQUEST["userreg_login"] = 1;
222       $ue = ewiki_auth_userdb_userregistry($user);
223    }
224
225
226    #-- view settings ----------------------------------------------------
227    if ($_REQUEST["userreg_login"]) {
228
229       #-- edit <form>
230       $o .= ewiki_t(<<< END
231 <h4>_{Account Settings}</h4>
232 <form action="$url" method="POST" enctype="multipart/form-data" accept-encoding="ISO-8859-1">
233 <input type="hidden" name="userreg_name" value="$user">
234 <input type="hidden" name="userreg_pw" value="$pw">
235 <b>_{change password}</b><br />
236 _{new password} <input type="password" size="10" maxsize="12" name="new_pw" value=""> <br />
237 _{retype} <input type="password" size="10" maxsize="12" name="new_pw2" value=""> <br />
238 <br />
239 <b>_{optional infos}</b><br />
240 _{personal WikiPage} <input type="text" name="userreg_ue[2]" value="{$ue[2]}"><br />
241 _{email address} <input type="text" name="userreg_ue[3]" value="{$ue[3]}"><br />
242 <!--
243 opt string <input type="text" name="userreg_ue[4]" value="{$ue[4]}"><br />
244 opt string <input type="text" name="userreg_ue[5]" value="{$ue[5]}"><br />
245 opt string <input type="text" name="userreg_ue[6]" value="{$ue[6]}"><br />
246 -->
247 <br />
248 <input type="submit" name="userreg_store" value="_{save}">
249 </form><br /><br />
250 END
251       );
252    }
253
254    #-- print login <form> ---------------------------------------------
255    else {
256
257       $url = ewiki_script("", $id);
258       $o .= ewiki_t(<<< END
259 <form action="$url" method="POST" enctype="multipart/form-data" accept-encoding="ISO-8859-1">
260 <div class="userreg-form-settings">
261 <div class="userreg-form-register">
262 _{name} <input type="text" size="14" name="userreg_name"> &nbsp;
263 <input type="submit" name="userreg_register" value="_{create account}"><br />
264 </div>
265 <br />
266 _{password} <input type="password" size="10" maxsize="12" name="userreg_pw"><br />
267 <br />
268 <input type="submit" name="userreg_login" value="_{change settings}">
269 </div>
270 </form><br /><br />
271 END
272       );
273    }
274
275    return($o);
276 }
277
278
279 ?>