395ef77ee7f1ff17713500785200651047ea7c44
[lhc/web/wiklou.git] / includes / SpecialPreferences.php
1 <?php
2
3 function wfSpecialPreferences()
4 {
5 global $wgUser, $wgOut, $wgUseDynamicDates, $action;
6 global $wpSaveprefs, $wpReset, $wgRequest;
7
8 # EWWWWWW temp hack
9 global $wpOldpass, $wpNewpass, $wpRetypePass, $wpNick, $wpUserEmail;
10 $wpOldpass = $wgRequest->getText( 'wpOldpass' );
11 $wpNewpass = $wgRequest->getText( 'wpNewpass' );
12 $wpRetypePass = $wgRequest->getText( 'wpRetypePass' );
13 $wpNick = $wgRequest->getText( 'wpNick' );
14 $wpUserEmail = $wgRequest->getVal( 'wpUserEmail' );
15
16 if ( 0 == $wgUser->getID() ) {
17 $wgOut->errorpage( "prefsnologin", "prefsnologintext" );
18 return;
19 }
20 if ( wfReadOnly() ) {
21 $wgOut->readOnlyPage();
22 return;
23 }
24 if ( isset( $wpReset ) ) {
25 resetPrefs();
26 mainPrefsForm( WfMsg( "prefsreset" ) );
27 } else if ( isset( $_POST['wpSaveprefs'] ) ) {
28 savePreferences();
29 } else {
30 resetPrefs();
31 mainPrefsForm( "" );
32 }
33 }
34
35 /* private */ function validateInt( &$val, $min=0, $max=0x7fffffff ) {
36 $val = intval($val);
37 $val = min($val, $max);
38 $val = max($val, $min);
39 return $val;
40 }
41
42 /* private */ function validateIntOrNull( &$val, $min=0, $max=0x7fffffff ) {
43 $val = trim($val);
44 if($val === "") {
45 return $val;
46 } else {
47 return validateInt( $val, $min, $max );
48 }
49 }
50
51
52 /* private */ function validateCheckbox( $cb )
53 {
54 if ( $cb )
55 {
56 return 1;
57 }
58 else
59 {
60 return 0;
61 }
62 }
63
64 /* private */ function validateTimeZone( $s )
65 {
66
67 if ( $s !== "" ) {
68 if ( strpos( $s, ":" ) ) {
69 # HH:MM
70 $array = explode( ":" , $s );
71 $hour = intval( $array[0] );
72 $minute = intval( $array[1] );
73 } else {
74 $minute = intval( $s * 60 );
75 $hour = intval( $minute / 60 );
76 $minute = abs( $minute ) % 60;
77 }
78 $hour = min( $hour, 15 );
79 $hour = max( $hour, -15 );
80 $minute = min( $minute, 59 );
81 $minute = max( $minute, 0 );
82 $s = sprintf( "%02d:%02d", $hour, $minute );
83 }
84 return $s;
85 }
86
87 /* private */ function savePreferences()
88 {
89 global $wgUser, $wgLang, $wgDeferredUpdateList;
90 global $wpQuickbar, $wpOldpass, $wpNewpass, $wpRetypePass;
91 global $wpSkin, $wpMath, $wpDate, $wpUserEmail, $wpEmailFlag, $wpNick, $wpSearch, $wpRecent;
92 global $wpSearchLines, $wpSearchChars, $wpStubs;
93 global $wpRows, $wpCols, $wpHourDiff, $HTTP_POST_VARS;
94
95 if ( "" != $wpNewpass ) {
96 if ( $wpNewpass != $wpRetypePass ) {
97 mainPrefsForm( wfMsg( "badretype" ) );
98 return;
99 }
100 $ep = $wgUser->encryptPassword( $wpOldpass );
101 if ( $ep != $wgUser->getPassword() ) {
102 if ( $ep != $wgUser->getNewpassword() ) {
103 mainPrefsForm( wfMsg( "wrongpassword" ) );
104 return;
105 }
106 }
107 $wgUser->setPassword( $wpNewpass );
108 }
109 $wgUser->setEmail( $wpUserEmail );
110 $wgUser->setOption( "nickname", $wpNick );
111 $wgUser->setOption( "quickbar", $wpQuickbar );
112 $wgUser->setOption( "skin", $wpSkin );
113 $wgUser->setOption( "math", $wpMath );
114 $wgUser->setOption( "date", $wpDate );
115 $wgUser->setOption( "searchlimit", validateIntOrNull( $wpSearch ) );
116 $wgUser->setOption( "contextlines", validateIntOrNull( $wpSearchLines ) );
117 $wgUser->setOption( "contextchars", validateIntOrNull( $wpSearchChars ) );
118 $wgUser->setOption( "rclimit", validateIntOrNull( $wpRecent ) );
119 $wgUser->setOption( "rows", validateInt( $wpRows, 4, 1000 ) );
120 $wgUser->setOption( "cols", validateInt( $wpCols, 4, 1000 ) );
121 $wgUser->setOption( "stubthreshold", validateIntOrNull( $wpStubs ) );
122 $wgUser->setOption( "timecorrection", validateTimeZone( $wpHourDiff, -12, 14 ) );
123
124 $namespaces = $wgLang->getNamespaces();
125 # Set search namespace options
126 # Note: namespaces don't necessarily have consecutive keys
127 foreach ( $namespaces as $i => $namespaces ) {
128 if ( $i >= 0 ) {
129 $nsvar = "wpNs$i";
130 global $$nsvar;
131 $wgUser->setOption( "searchNs{$i}", validateCheckbox( $$nsvar ) );
132 }
133 }
134
135 $wgUser->setOption( "disablemail", validateCheckbox( $wpEmailFlag ) );
136
137 $togs = $wgLang->getUserToggles();
138 foreach ( $togs as $tname => $ttext ) {
139 if ( array_key_exists( "wpOp$tname", $HTTP_POST_VARS ) ) {
140 $wgUser->setOption( $tname, 1 );
141 } else {
142 $wgUser->setOption( $tname, 0 );
143 }
144 }
145 $wgUser->setCookies();
146 $up = new UserUpdate();
147 array_push( $wgDeferredUpdateList, $up );
148 mainPrefsForm( wfMsg( "savedprefs" ) );
149 }
150
151 /* private */ function resetPrefs()
152 {
153 global $wgUser, $wgLang;
154 global $wpQuickbar, $wpOldpass, $wpNewpass, $wpRetypePass, $wpStubs;
155 global $wpRows, $wpCols, $wpSkin, $wpMath, $wpDate, $wpUserEmail, $wpEmailFlag, $wpNick;
156 global $wpSearch, $wpRecent, $HTTP_POST_VARS;
157 global $wpHourDiff, $wpSearchLines, $wpSearchChars;
158
159 $wpOldpass = $wpNewpass = $wpRetypePass = "";
160 $wpUserEmail = $wgUser->getEmail();
161 if ( 1 == $wgUser->getOption( "disablemail" ) ) { $wpEmailFlag = 1; }
162 else { $wpEmailFlag = 0; }
163 $wpNick = $wgUser->getOption( "nickname" );
164
165 $wpQuickbar = $wgUser->getOption( "quickbar" );
166 $wpSkin = $wgUser->getOption( "skin" );
167 $wpMath = $wgUser->getOption( "math" );
168 $wpDate = $wgUser->getOption( "date" );
169 $wpRows = $wgUser->getOption( "rows" );
170 $wpCols = $wgUser->getOption( "cols" );
171 $wpStubs = $wgUser->getOption( "stubthreshold" );
172 $wpHourDiff = $wgUser->getOption( "timecorrection" );
173 $wpSearch = $wgUser->getOption( "searchlimit" );
174 $wpSearchLines = $wgUser->getOption( "contextlines" );
175 $wpSearchChars = $wgUser->getOption( "contextchars" );
176 $wpRecent = $wgUser->getOption( "rclimit" );
177
178 $togs = $wgLang->getUserToggles();
179 foreach ( $togs as $tname => $ttext ) {
180 $HTTP_POST_VARS["wpOp$tname"] = $wgUser->getOption( $tname );
181 }
182 }
183
184 /* private */ function namespacesCheckboxes()
185 {
186 global $wgLang, $wgUser;
187
188 # Determine namespace checkboxes
189 $namespaces = $wgLang->getNamespaces();
190 $r1 = "";
191
192 foreach ( $namespaces as $i => $name ) {
193 # Skip special or anything similar
194 if ( $i >= 0 ) {
195 $checked = "";
196 if ( $wgUser->getOption( "searchNs$i" ) ) {
197 $checked = " checked";
198 }
199 $name = str_replace( "_", " ", $namespaces[$i] );
200 if ( "" == $name ) {
201 $name = wfMsg( "blanknamespace" );
202 }
203
204 if ( 0 != $i ) {
205 $r1 .= " ";
206 }
207 $r1 .= "<label><input type=checkbox value=\"1\" name=\"" .
208 "wpNs$i\"{$checked}>{$name}</label>\n";
209 }
210 }
211
212 return $r1;
213 }
214
215
216
217
218 /* private */ function mainPrefsForm( $err )
219 {
220 global $wgUser, $wgOut, $wgLang, $wgUseDynamicDates;
221 global $wpQuickbar, $wpOldpass, $wpNewpass, $wpRetypePass;
222 global $wpSkin, $wpMath, $wpDate, $wpUserEmail, $wpEmailFlag, $wpNick, $wpSearch, $wpRecent;
223 global $wpRows, $wpCols, $wpSaveprefs, $wpReset, $wpHourDiff;
224 global $wpSearchLines, $wpSearchChars, $wpStubs, $wgValidSkinNames;
225
226 $wgOut->setPageTitle( wfMsg( "preferences" ) );
227 $wgOut->setArticleRelated( false );
228 $wgOut->setRobotpolicy( "noindex,nofollow" );
229
230 if ( "" != $err ) {
231 $wgOut->addHTML( "<font size='+1' color='red'>$err</font>\n<p>" );
232 }
233 $uname = $wgUser->getName();
234 $uid = $wgUser->getID();
235
236 $wgOut->addWikiText( wfMsg( "prefslogintext", $uname, $uid ) );
237
238 $qbs = $wgLang->getQuickbarSettings();
239 $skins = $wgLang->getSkinNames();
240 $mathopts = $wgLang->getMathNames();
241 $dateopts = $wgLang->getDateFormats();
242 $togs = $wgLang->getUserToggles();
243
244 $titleObj = Title::makeTitle( NS_SPECIAL, "Preferences" );
245 $action = $titleObj->escapeLocalURL();
246
247 $qb = wfMsg( "qbsettings" );
248 $cp = wfMsg( "changepassword" );
249 $sk = wfMsg( "skin" );
250 $math = wfMsg( "math" );
251 $dateFormat = wfMsg("dateformat");
252 $opw = wfMsg( "oldpassword" );
253 $npw = wfMsg( "newpassword" );
254 $rpw = wfMsg( "retypenew" );
255 $svp = wfMsg( "saveprefs" );
256 $rsp = wfMsg( "resetprefs" );
257 $tbs = wfMsg( "textboxsize" );
258 $tbr = wfMsg( "rows" );
259 $tbc = wfMsg( "columns" );
260 $ltz = wfMsg( "localtime" );
261 $tzt = wfMsg( "timezonetext" );
262 $tzo = wfMsg( "timezoneoffset" );
263 $tzGuess = wfMsg( "guesstimezone" );
264 $tzServerTime = wfMsg( "servertime" );
265 $yem = wfMsg( "youremail" );
266 $emf = wfMsg( "emailflag" );
267 $ynn = wfMsg( "yournick" );
268 $stt = wfMsg ( "stubthreshold" ) ;
269 $srh = wfMsg( "searchresultshead" );
270 $rpp = wfMsg( "resultsperpage" );
271 $scl = wfMsg( "contextlines" );
272 $scc = wfMsg( "contextchars" );
273 $rcc = wfMsg( "recentchangescount" );
274 $dsn = wfMsg( "defaultns" );
275
276 $wgOut->addHTML( "<form id=\"preferences\" name=\"preferences\" action=\"$action\"
277 method=\"post\"><table border=\"1\"><tr><td valign=top nowrap><b>$qb:</b><br>\n" );
278
279 # Quickbar setting
280 #
281 for ( $i = 0; $i < count( $qbs ); ++$i ) {
282 if ( $i == $wpQuickbar ) { $checked = " checked"; }
283 else { $checked = ""; }
284 $wgOut->addHTML( "<label><input type=radio name=\"wpQuickbar\"
285 value=\"$i\"$checked> {$qbs[$i]}</label><br>\n" );
286 }
287
288 # Fields for changing password
289 #
290 $wpOldpass = wfEscapeHTML( $wpOldpass );
291 $wpNewpass = wfEscapeHTML( $wpNewpass );
292 $wpRetypePass = wfEscapeHTML( $wpRetypePass );
293
294 $wgOut->addHTML( "</td><td vaign=top nowrap><b>$cp:</b><br>
295 <label>$opw: <input type=password name=\"wpOldpass\" value=\"$wpOldpass\" size=20></label><br>
296 <label>$npw: <input type=password name=\"wpNewpass\" value=\"$wpNewpass\" size=20></label><br>
297 <label>$rpw: <input type=password name=\"wpRetypePass\" value=\"$wpRetypePass\" size=20></label><br>
298 </td></tr>\n" );
299
300 # Skin setting
301 #
302 $wgOut->addHTML( "<tr><td valign=top nowrap><b>$sk:</b><br>\n" );
303 # Only count up to count($wgValidSkinNames) rather than
304 # count($skins), to allow global disabling of experimental
305 # skins.
306 for ( $i = 0; $i < count( $wgValidSkinNames ); ++$i ) {
307 if ( $i == $wpSkin ) {
308 $checked = " checked";
309 } else {
310 $checked = "";
311 }
312 $wgOut->addHTML( "<label><input type=radio name=\"wpSkin\"
313 value=\"$i\"$checked> {$skins[$i]}</label><br>\n" );
314 }
315
316 # Various checkbox options
317 #
318 if ( $wgUseDynamicDates ) {
319 $wgOut->addHTML( "</td><td rowspan=3 valign=top nowrap>\n" );
320 } else {
321 $wgOut->addHTML( "</td><td rowspan=2 valign=top nowrap>\n" );
322 }
323 $wgOut->addHTML("<table border=0>");
324 foreach ( $togs as $tname => $ttext ) {
325 if ( 1 == $wgUser->getOption( $tname ) ) {
326 $checked = " checked";
327 } else {
328 $checked = "";
329 }
330 $wgOut->addHTML( "<tr valign=\"top\"><td><input type=checkbox value=\"1\" "
331 . "id=\"$tname\" name=\"wpOp$tname\"$checked></td><td><label for=\"$tname\">$ttext</label></td></tr>\n" );
332 }
333 $wgOut->addHTML( "</table></td>" );
334
335 # Math setting
336 #
337 $wgOut->addHTML( "<tr><td valign=top nowrap><b>$math:</b><br>\n" );
338 for ( $i = 0; $i < count( $mathopts ); ++$i ) {
339 if ( $i == $wpMath ) { $checked = " checked"; }
340 else { $checked = ""; }
341 $wgOut->addHTML( "<label><input type=radio name=\"wpMath\"
342 value=\"$i\"$checked> {$mathopts[$i]}</label><br>\n" );
343 }
344 $wgOut->addHTML( "</td></tr>" );
345
346 # Date format
347 #
348 if ( $wgUseDynamicDates ) {
349 $wgOut->addHTML( "<tr><td valign=top nowrap><b>$dateFormat:</b><br>" );
350 for ( $i = 0; $i < count( $dateopts ); ++$i) {
351 if ( $i == $wpDate ) {
352 $checked = " checked";
353 } else {
354 $checked = "";
355 }
356 $wgOut->addHTML( "<label><input type=radio name=\"wpDate\" ".
357 "value=\"$i\"$checked> {$dateopts[$i]}</label><br>\n" );
358 }
359 $wgOut->addHTML( "</td></tr>");
360 }
361 # Textbox rows, cols
362 #
363 $nowlocal = $wgLang->time( $now = wfTimestampNow(), true );
364 $nowserver = $wgLang->time( $now, false );
365 $wgOut->addHTML( "<td valign=top nowrap><b>$tbs:</b><br>
366 <label>$tbr: <input type=text name=\"wpRows\" value=\"{$wpRows}\" size=6></label><br>
367 <label>$tbc: <input type=text name=\"wpCols\" value=\"{$wpCols}\" size=6></label><br><br>
368 <b>$tzServerTime:</b> $nowserver<br />
369 <b>$ltz:</b> $nowlocal<br />
370 <label>$tzo*: <input type=text name=\"wpHourDiff\" value=\"{$wpHourDiff}\" size=6></label><br />
371 <input type=\"button\" value=\"$tzGuess\" onClick=\"javascript:guessTimezone()\" />
372 </td>" );
373
374 # Email, etc.
375 #
376 $wpUserEmail = wfEscapeHTML( $wpUserEmail );
377 $wpNick = wfEscapeHTML( $wpNick );
378 if ( $wpEmailFlag ) { $emfc = "checked"; }
379 else { $emfc = ""; }
380
381 $ps = namespacesCheckboxes();
382
383 $wgOut->addHTML( "<td valign=top nowrap>
384 <label>$yem: <input type=text name=\"wpUserEmail\" value=\"{$wpUserEmail}\" size=20></label><br>
385 <label><input type=checkbox $emfc value=\"1\" name=\"wpEmailFlag\"> $emf</label><br>
386 <label>$ynn: <input type=text name=\"wpNick\" value=\"{$wpNick}\" size=12></label><br>
387 <label>$rcc: <input type=text name=\"wpRecent\" value=\"$wpRecent\" size=6></label><br>
388 <label>$stt: <input type=text name=\"wpStubs\" value=\"$wpStubs\" size=6></label><br>
389 <strong>{$srh}:</strong><br>
390 <label>$rpp: <input type=text name=\"wpSearch\" value=\"$wpSearch\" size=6></label><br>
391 <label>$scl: <input type=text name=\"wpSearchLines\" value=\"$wpSearchLines\" size=6></label><br>
392 <label>$scc: <input type=text name=\"wpSearchChars\" value=\"$wpSearchChars\" size=6></label></td>
393 </tr><tr>
394 <td colspan=2>
395 <b>$dsn</b><br>
396 $ps
397 </td>
398 </tr><tr>
399 <td align=center><input type=submit name=\"wpSaveprefs\" value=\"$svp\"></td>
400 <td align=center><input type=submit name=\"wpReset\" value=\"$rsp\"></td>
401 </tr></table>* {$tzt} </form>\n" );
402 }
403
404 ?>