Move superuser section above DB-specific area, combine wording into one paragraph.
[lhc/web/wiklou.git] / config / index.php
1 <?php
2
3 # MediaWiki web-based config/installation
4 # Copyright (C) 2004 Brion Vibber <brion@pobox.com>, 2006 Rob Church <robchur@gmail.com>
5 # http://www.mediawiki.org/
6 #
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 2 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License along
18 # with this program; if not, write to the Free Software Foundation, Inc.,
19 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 # http://www.gnu.org/copyleft/gpl.html
21
22 error_reporting( E_ALL );
23 header( "Content-type: text/html; charset=utf-8" );
24 @ini_set( "display_errors", true );
25
26 # In case of errors, let output be clean.
27 $wgRequestTime = microtime( true );
28
29 # Attempt to set up the include path, to fix problems with relative includes
30 $IP = dirname( dirname( __FILE__ ) );
31 define( 'MW_INSTALL_PATH', $IP );
32 $sep = PATH_SEPARATOR;
33 if( !ini_set( "include_path", ".$sep$IP$sep$IP/includes$sep$IP/languages" ) ) {
34 set_include_path( ".$sep$IP$sep$IP/includes$sep$IP/languages" );
35 }
36
37 # Define an entry point and include some files
38 define( "MEDIAWIKI", true );
39 define( "MEDIAWIKI_INSTALL", true );
40 require_once( "includes/Defines.php" );
41 require_once( "includes/DefaultSettings.php" );
42 require_once( "includes/MagicWord.php" );
43 require_once( "includes/Namespace.php" );
44 require_once( "includes/ProfilerStub.php" );
45
46 ## Databases we support:
47
48 $ourdb = array();
49 $ourdb['mysql']['fullname'] = 'MySQL';
50 $ourdb['mysql']['havedriver'] = 0;
51 $ourdb['mysql']['compile'] = 'mysql';
52 $ourdb['mysql']['bgcolor'] = '#ffe5a7';
53 $ourdb['mysql']['rootuser'] = 'root';
54
55 $ourdb['postgres']['fullname'] = 'PostgreSQL';
56 $ourdb['postgres']['havedriver'] = 0;
57 $ourdb['postgres']['compile'] = 'pgsql';
58 $ourdb['postgres']['bgcolor'] = '#aaccff';
59 $ourdb['postgres']['rootuser'] = 'postgres';
60
61 ?>
62 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
63 <html>
64 <head>
65 <meta http-equiv="Content-type" content="text/html; charset=utf-8">
66 <title>MediaWiki <?php echo( $wgVersion ); ?> Installation</title>
67 <style type="text/css">
68
69 @import "../skins/monobook/main.css";
70
71 .env-check {
72 font-size: 90%;
73 margin: 1em 0 1em 2.5em;
74 }
75
76 .config-section {
77 margin-top: 2em;
78 }
79
80 .config-section label.column {
81 clear: left;
82 font-weight: bold;
83 width: 13em;
84 float: left;
85 text-align: right;
86 padding-right: 1em;
87 padding-top: .2em;
88 }
89
90 .config-input {
91 clear: left;
92 zoom: 100%; /* IE hack */
93 }
94
95 .config-section .config-desc {
96 clear: left;
97 margin: 0 0 2em 18em;
98 padding-top: 1em;
99 font-size: 85%;
100 }
101
102 .iput-text, .iput-password {
103 width: 14em;
104 margin-right: 1em;
105 }
106
107 .error {
108 color: red;
109 background-color: #fff;
110 font-weight: bold;
111 left: 1em;
112 font-size: 100%;
113 }
114
115 .error-top {
116 color: red;
117 background-color: #FFF0F0;
118 border: 2px solid red;
119 font-size: 130%;
120 font-weight: bold;
121 padding: 1em 1.5em;
122 margin: 2em 0 1em;
123 }
124
125 ul.plain {
126 list-style-type: none;
127 list-style-image: none;
128 float: left;
129 margin: 0;
130 padding: 0;
131 }
132
133 .btn-install {
134 font-weight: bold;
135 font-size: 110%;
136 padding: .2em .3em;
137 }
138
139 .license {
140 font-size: 85%;
141 padding-top: 3em;
142 }
143
144 </style>
145 <script type="text/javascript">
146 <!--
147 function hideall() {
148 <?php foreach (array_keys($ourdb) as $db) {
149 echo "\n document.getElementById('$db').style.display='none';";
150 }
151 ?>
152
153 }
154 function toggleDBarea(id,defaultroot) {
155 hideall();
156 var dbarea = document.getElementById(id).style;
157 dbarea.display = (dbarea.display == 'none') ? 'block' : 'none';
158 var db = document.getElementById('RootUser');
159 if (defaultroot) {
160 <?php foreach (array_keys($ourdb) as $db) {
161 echo " if (id == '$db') { db.value = '".$ourdb[$db]['rootuser']."';}\n";
162 }?>
163 }
164 }
165 // -->
166 </script>
167 </head>
168
169 <body>
170 <div id="globalWrapper">
171 <div id="column-content">
172 <div id="content">
173 <div id="bodyContent">
174
175 <h1>MediaWiki <?php print $wgVersion ?> Installation</h1>
176
177 <?php
178
179 /* Check for existing configurations and bug out! */
180
181 if( file_exists( "../LocalSettings.php" ) ) {
182 dieout( "<p><strong>Setup has completed, <a href='../index.php'>your wiki</a> is configured.</strong></p>
183
184 <p>Please delete the /config directory for extra security.</p></div></div></div></div>" );
185 }
186
187 if( file_exists( "./LocalSettings.php" ) ) {
188 writeSuccessMessage();
189
190 dieout( '' );
191 }
192
193 if( !is_writable( "." ) ) {
194 dieout( "<h2>Can't write config file, aborting</h2>
195
196 <p>In order to configure the wiki you have to make the <tt>config</tt> subdirectory
197 writable by the web server. Once configuration is done you'll move the created
198 <tt>LocalSettings.php</tt> to the parent directory, and for added safety you can
199 then remove the <tt>config</tt> subdirectory entirely.</p>
200
201 <p>To make the directory writable on a Unix/Linux system:</p>
202
203 <pre>
204 cd <i>/path/to/wiki</i>
205 chmod a+w config
206 </pre>" );
207 }
208
209
210 require_once( "install-utils.inc" );
211 require_once( "maintenance/updaters.inc" );
212
213 class ConfigData {
214 function getEncoded( $data ) {
215 # removing latin1 support, no need...
216 return $data;
217 }
218 function getSitename() { return $this->getEncoded( $this->Sitename ); }
219 function getSysopName() { return $this->getEncoded( $this->SysopName ); }
220 function getSysopPass() { return $this->getEncoded( $this->SysopPass ); }
221 }
222
223 ?>
224
225 <ul>
226 <li>
227 <b>Don't forget security updates!</b> Keep an eye on the
228 <a href="http://mail.wikimedia.org/mailman/listinfo/mediawiki-announce">low-traffic
229 release announcements mailing list</a>.
230 </li>
231 </ul>
232
233
234 <h2>Checking environment...</h2>
235 <p><em>Please include all of the lines below when reporting installation problems.</em></p>
236 <ul class="env-check">
237 <?php
238 $endl = "
239 ";
240 $wgNoOutputBuffer = true;
241 $conf = new ConfigData;
242
243 install_version_checks();
244
245 print "<li>PHP " . phpversion() . " installed</li>\n";
246
247 ## Temporarily turn off all errors as we try to discover installed databases
248 $olderrnum = error_reporting(0);
249
250 $phpdatabases = array();
251 foreach (array_keys($ourdb) as $db) {
252 $compname = $ourdb[$db]['compile'];
253 if (extension_loaded($compname) or dl($compname . '.' . PHP_SHLIB_SUFFIX)) {
254 array_push($phpdatabases, $db);
255 $ourdb[$db]['havedriver'] = 1;
256 }
257 }
258
259 error_reporting($olderrornum);
260
261 if (!$phpdatabases) {
262 print "Could not find a suitable database driver!<ul>";
263 foreach (array_keys($ourdb) AS $db) {
264 $comp = $ourdb[$db]['compile'];
265 $full = $ourdb[$db]['fullname'];
266 print "<li>For <b>$full</b>, compile PHP using <b>--with-$comp</b>, "
267 ."or install the $comp.so module</li>\n";
268 }
269 dieout( "</ul></ul>" );
270 }
271
272 print "<li>Found database drivers for:";
273 foreach (array_keys($ourdb) AS $db) {
274 if ($ourdb[$db]['havedriver']) {
275 $DefaultDBtype = $db;
276 print " ".$ourdb[$db]['fullname'];
277 }
278 }
279 print "</li>\n";
280 if (count($phpdatabases) != 1)
281 $DefaultDBtype = '';
282
283 if( ini_get( "register_globals" ) ) {
284 ?>
285 <li>
286 <div style="font-size:110%">
287 <strong class="error">Warning:</strong>
288 <strong>PHP's <tt><a href="http://php.net/register_globals">register_globals</a></tt> option is enabled. Disable it if you can.</strong>
289 </div>
290 MediaWiki will work, but your server is more exposed to PHP-based security vulnerabilities.
291 </li>
292 <?php
293 }
294
295 $fatal = false;
296
297 if( ini_get( "magic_quotes_runtime" ) ) {
298 $fatal = true;
299 ?><li class='error'><strong>Fatal: <a href='http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime'>magic_quotes_runtime</a> is active!</strong>
300 This option corrupts data input unpredictably; you cannot install or use
301 MediaWiki unless this option is disabled.
302 <?php
303 }
304
305 if( ini_get( "magic_quotes_sybase" ) ) {
306 $fatal = true;
307 ?><li class='error'><strong>Fatal: <a href='http://www.php.net/manual/en/ref.sybase.php#ini.magic-quotes-sybase'>magic_quotes_sybase</a> is active!</strong>
308 This option corrupts data input unpredictably; you cannot install or use
309 MediaWiki unless this option is disabled.
310 <?php
311 }
312
313 if( ini_get( "mbstring.func_overload" ) ) {
314 $fatal = true;
315 ?><li class='error'><strong>Fatal: <a href='http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload'>mbstring.func_overload</a> is active!</strong>
316 This option causes errors and may corrupt data unpredictably;
317 you cannot install or use MediaWiki unless this option is disabled.
318 <?php
319 }
320
321 if( $fatal ) {
322 dieout( "</ul><p>Cannot install MediaWiki.</p>" );
323 }
324
325 if( ini_get( "safe_mode" ) ) {
326 $conf->safeMode = true;
327 ?>
328 <li><b class='error'>Warning:</b> <strong>PHP's
329 <a href='http://www.php.net/features.safe-mode'>safe mode</a> is active.</strong>
330 You may have problems caused by this, particularly if using image uploads.
331 </li>
332 <?php
333 } else {
334 $conf->safeMode = false;
335 }
336
337 $sapi = php_sapi_name();
338 $conf->prettyURLs = true;
339 print "<li>PHP server API is $sapi; ";
340 switch( $sapi ) {
341 case "apache":
342 case "apache2handler":
343 print "ok, using pretty URLs (<tt>index.php/Page_Title</tt>)";
344 break;
345 default:
346 print "unknown; ";
347 case "cgi":
348 case "cgi-fcgi":
349 case "apache2filter":
350 case "isapi":
351 print "using ugly URLs (<tt>index.php?title=Page_Title</tt>)";
352 $conf->prettyURLs = false;
353 break;
354 }
355 print "</li>\n";
356
357 $conf->xml = function_exists( "utf8_encode" );
358 if( $conf->xml ) {
359 print "<li>Have XML / Latin1-UTF-8 conversion support.</li>\n";
360 } else {
361 dieout( "PHP's XML module is missing; the wiki requires functions in
362 this module and won't work in this configuration.
363 If you're running Mandrake, install the php-xml package." );
364 }
365
366 # Crude check for session support
367 if( !function_exists( 'session_name' ) )
368 dieout( "PHP's session module is missing. MediaWiki requires session support in order to function." );
369
370 # Likewise for PCRE
371 if( !function_exists( 'preg_match' ) )
372 dieout( "The PCRE regular expression functions are missing. MediaWiki requires these in order to function." );
373
374 $memlimit = ini_get( "memory_limit" );
375 $conf->raiseMemory = false;
376 if( empty( $memlimit ) || $memlimit == -1 ) {
377 print "<li>PHP is configured with no <tt>memory_limit</tt>.</li>\n";
378 } else {
379 print "<li>PHP's <tt>memory_limit</tt> is " . htmlspecialchars( $memlimit ) . ". <strong>If this is too low, installation may fail!</strong> ";
380 $n = intval( $memlimit );
381 if( preg_match( '/^([0-9]+)[Mm]$/', trim( $memlimit ), $m ) ) {
382 $n = intval( $m[1] * (1024*1024) );
383 }
384 if( $n < 20*1024*1024 ) {
385 print "Attempting to raise limit to 20M... ";
386 if( false === ini_set( "memory_limit", "20M" ) ) {
387 print "failed.";
388 } else {
389 $conf->raiseMemory = true;
390 print "ok.";
391 }
392 }
393 print "</li>\n";
394 }
395
396 $conf->zlib = function_exists( "gzencode" );
397 if( $conf->zlib ) {
398 print "<li>Have zlib support; enabling output compression.</li>\n";
399 } else {
400 print "<li>No zlib support.</li>\n";
401 }
402
403 $conf->turck = function_exists( 'mmcache_get' );
404 if ( $conf->turck ) {
405 print "<li><a href=\"http://turck-mmcache.sourceforge.net/\">Turck MMCache</a> installed</li>\n";
406 }
407
408 $conf->apc = function_exists('apc_fetch');
409 if ($conf->apc ) {
410 print "<li><a href=\"http://www.php.net/apc\">APC</a> installed</li>";
411 }
412
413 $conf->eaccel = function_exists( 'eaccelerator_get' );
414 if ( $conf->eaccel ) {
415 $conf->turck = 'eaccelerator';
416 print "<li><a href=\"http://eaccelerator.sourceforge.net/\">eAccelerator</a> installed</li>\n";
417 }
418
419 if( !$conf->turck && !$conf->eaccel && !$conf->apc ) {
420 echo( '<li>Couldn\'t find <a href="http://turck-mmcache.sourceforge.net">Turck MMCache</a>,
421 <a href="http://eaccelerator.sourceforge.net">eAccelerator</a> or
422 <a href="http://www.php.net/apc">APC</a>. Object caching functions cannot be used.</li>' );
423 }
424
425 $conf->diff3 = false;
426 $diff3locations = array( "/usr/bin", "/usr/local/bin", "/opt/csw/bin", "/usr/gnu/bin", "/usr/sfw/bin" ) + explode( $sep, getenv( "PATH" ) );
427 $diff3names = array( "gdiff3", "diff3", "diff3.exe" );
428
429 $diff3versioninfo = array( '$1 --version 2>&1', 'diff3 (GNU diffutils)' );
430 foreach ($diff3locations as $loc) {
431 $exe = locate_executable($loc, $diff3names, $diff3versioninfo);
432 if ($exe !== false) {
433 $conf->diff3 = $exe;
434 break;
435 }
436 }
437
438 if ($conf->diff3)
439 print "<li>Found GNU diff3: <tt>$conf->diff3</tt>.</li>";
440 else
441 print "<li>GNU diff3 not found.</li>";
442
443 $conf->ImageMagick = false;
444 $imcheck = array( "/usr/bin", "/opt/csw/bin", "/usr/local/bin", "/sw/bin", "/opt/local/bin" );
445 foreach( $imcheck as $dir ) {
446 $im = "$dir/convert";
447 if( file_exists( $im ) ) {
448 print "<li>Found ImageMagick: <tt>$im</tt>; image thumbnailing will be enabled if you enable uploads.</li>\n";
449 $conf->ImageMagick = $im;
450 break;
451 }
452 }
453
454 $conf->HaveGD = function_exists( "imagejpeg" );
455 if( $conf->HaveGD ) {
456 print "<li>Found GD graphics library built-in";
457 if( !$conf->ImageMagick ) {
458 print ", image thumbnailing will be enabled if you enable uploads";
459 }
460 print ".</li>\n";
461 } else {
462 if( !$conf->ImageMagick ) {
463 print "<li>Couldn't find GD library or ImageMagick; image thumbnailing disabled.</li>\n";
464 }
465 }
466
467 $conf->UseImageResize = $conf->HaveGD || $conf->ImageMagick;
468
469 $conf->IP = dirname( dirname( __FILE__ ) );
470 print "<li>Installation directory: <tt>" . htmlspecialchars( $conf->IP ) . "</tt></li>\n";
471
472 $conf->ScriptPath = preg_replace( '{^(.*)/config.*$}', '$1', $_SERVER["PHP_SELF"] ); # was SCRIPT_NAME
473 print "<li>Script URI path: <tt>" . htmlspecialchars( $conf->ScriptPath ) . "</tt></li>\n";
474
475 print "<li style='font-weight:bold;color:green;font-size:110%'>Environment checked. You can install MediaWiki.</li>\n";
476 $conf->posted = ($_SERVER["REQUEST_METHOD"] == "POST");
477
478 $conf->Sitename = ucfirst( importPost( "Sitename", "" ) );
479 $defaultEmail = empty( $_SERVER["SERVER_ADMIN"] )
480 ? 'root@localhost'
481 : $_SERVER["SERVER_ADMIN"];
482 $conf->EmergencyContact = importPost( "EmergencyContact", $defaultEmail );
483 $conf->DBtype = importPost( "DBtype", $DefaultDBtype );
484 ?>
485
486 <?php
487 $conf->DBserver = importPost( "DBserver", "localhost" );
488 $conf->DBname = importPost( "DBname", "wikidb" );
489 $conf->DBuser = importPost( "DBuser", "wikiuser" );
490 $conf->DBpassword = importPost( "DBpassword" );
491 $conf->DBpassword2 = importPost( "DBpassword2" );
492 $conf->SysopName = importPost( "SysopName", "WikiSysop" );
493 $conf->SysopPass = importPost( "SysopPass" );
494 $conf->SysopPass2 = importPost( "SysopPass2" );
495 $conf->RootUser = importPost( "RootUser", "root" );
496 $conf->RootPW = importPost( "RootPW", "-" );
497
498 ## MySQL specific:
499 $conf->DBprefix = importPost( "DBprefix" );
500 $conf->DBmysql5 = (importPost( "DBmysql5" ) == "true") ? "true" : "false";
501 $conf->LanguageCode = importPost( "LanguageCode", "en" );
502
503 ## Postgres specific:
504 $conf->DBport = importPost( "DBport", "5432" );
505 $conf->DBmwschema = importPost( "DBmwschema", "mediawiki" );
506 $conf->DBts2schema = importPost( "DBts2schema", "public" );
507
508 /* Check for validity */
509 $errs = array();
510
511 if( $conf->Sitename == "" || $conf->Sitename == "MediaWiki" || $conf->Sitename == "Mediawiki" ) {
512 $errs["Sitename"] = "Must not be blank or \"MediaWiki\"";
513 }
514 if( $conf->DBuser == "" ) {
515 $errs["DBuser"] = "Must not be blank";
516 }
517 if( $conf->DBpassword == "" ) {
518 $errs["DBpassword"] = "Must not be blank";
519 }
520 if( $conf->DBpassword != $conf->DBpassword2 ) {
521 $errs["DBpassword2"] = "Passwords don't match!";
522 }
523 if( !preg_match( '/^[A-Za-z_0-9]*$/', $conf->DBprefix ) ) {
524 $errs["DBprefix"] = "Invalid table prefix";
525 }
526
527 if( $conf->SysopPass == "" ) {
528 $errs["SysopPass"] = "Must not be blank";
529 }
530 if( $conf->SysopPass != $conf->SysopPass2 ) {
531 $errs["SysopPass2"] = "Passwords don't match!";
532 }
533
534 $conf->License = importRequest( "License", "none" );
535 if( $conf->License == "gfdl" ) {
536 $conf->RightsUrl = "http://www.gnu.org/copyleft/fdl.html";
537 $conf->RightsText = "GNU Free Documentation License 1.2";
538 $conf->RightsCode = "gfdl";
539 $conf->RightsIcon = '${wgStylePath}/common/images/gnu-fdl.png';
540 } elseif( $conf->License == "none" ) {
541 $conf->RightsUrl = $conf->RightsText = $conf->RightsCode = $conf->RightsIcon = "";
542 } else {
543 $conf->RightsUrl = importRequest( "RightsUrl", "" );
544 $conf->RightsText = importRequest( "RightsText", "" );
545 $conf->RightsCode = importRequest( "RightsCode", "" );
546 $conf->RightsIcon = importRequest( "RightsIcon", "" );
547 }
548
549 $conf->Shm = importRequest( "Shm", "none" );
550 $conf->MCServers = importRequest( "MCServers" );
551
552 /* Test memcached servers */
553
554 if ( $conf->Shm == 'memcached' && $conf->MCServers ) {
555 $conf->MCServerArray = array_map( 'trim', explode( ',', $conf->MCServers ) );
556 foreach ( $conf->MCServerArray as $server ) {
557 $error = testMemcachedServer( $server );
558 if ( $error ) {
559 $errs["MCServers"] = $error;
560 break;
561 }
562 }
563 } else if ( $conf->Shm == 'memcached' ) {
564 $errs["MCServers"] = "Please specify at least one server if you wish to use memcached";
565 }
566
567 /* default values for installation */
568 $conf->Email = importRequest("Email", "email_enabled");
569 $conf->Emailuser = importRequest("Emailuser", "emailuser_enabled");
570 $conf->Enotif = importRequest("Enotif", "enotif_allpages");
571 $conf->Eauthent = importRequest("Eauthent", "eauthent_enabled");
572
573 if( $conf->posted && ( 0 == count( $errs ) ) ) {
574 do { /* So we can 'continue' to end prematurely */
575 $conf->Root = ($conf->RootPW != "");
576
577 /* Load up the settings and get installin' */
578 $local = writeLocalSettings( $conf );
579 echo "<p><b>Generating configuration file...</b></p>\n";
580 // for debugging: // echo "<pre>" . htmlspecialchars( $local ) . "</pre>\n";
581
582 $wgCommandLineMode = false;
583 chdir( ".." );
584 eval($local);
585 $conf->DBtypename = '';
586 foreach (array_keys($ourdb) as $db) {
587 if ($conf->DBtype === $db)
588 $conf->DBtypename = $ourdb[$db]['fullname'];
589 }
590 if ( ! strlen($conf->DBtype)) {
591 $errs["DBpicktype"] = "Please choose a database type";
592 continue;
593 }
594
595 if (! $conf->DBtypename) {
596 $errs["DBtype"] = "Unknown database type '$conf->DBtype'";
597 continue;
598 }
599 print "<li>Database type: {$conf->DBtypename}</li>\n";
600 $dbclass = 'Database'.ucfirst($conf->DBtype);
601 $wgDBtype = $conf->DBtype;
602 $wgDBadminuser = "root";
603 $wgDBadminpassword = $conf->RootPW;
604
605 ## Mysql specific:
606 $wgDBprefix = $conf->DBprefix;
607
608 ## Postgres specific:
609 $wgDBport = $conf->DBport;
610 $wgDBmwschema = $conf->DBmwschema;
611 $wgDBts2schema = $conf->DBts2schema;
612
613 $wgCommandLineMode = true;
614 $wgUseDatabaseMessages = false; /* FIXME: For database failure */
615 require_once( "includes/Setup.php" );
616 chdir( "config" );
617
618 require_once( "maintenance/InitialiseMessages.inc" );
619
620 $wgTitle = Title::newFromText( "Installation script" );
621 error_reporting( E_ALL );
622 print "<li>Loading class: $dbclass";
623 $dbc = new $dbclass;
624
625 if( $conf->DBtype == 'mysql' ) {
626 $mysqlOldClient = version_compare( mysql_get_client_info(), "4.1.0", "lt" );
627 if( $mysqlOldClient ) {
628 print "<li><b>PHP is linked with old MySQL client libraries. If you are
629 using a MySQL 4.1 server and have problems connecting to the database,
630 see <a href='http://dev.mysql.com/doc/mysql/en/old-client.html'
631 >http://dev.mysql.com/doc/mysql/en/old-client.html</a> for help.</b></li>\n";
632 }
633 $ok = true; # Let's be optimistic
634
635 # Decide if we're going to use the superuser or the regular database user
636 if( $conf->RootPW == '-' ) {
637 # Regular user
638 $conf->Root = false;
639 $db_user = $wgDBuser;
640 $db_pass = $wgDBpassword;
641 } else {
642 # Superuser
643 $conf->Root = true;
644 $db_user = $conf->RootUser;
645 $db_pass = $conf->RootPW;
646 }
647
648 # Attempt to connect
649 echo( "<li>Attempting to connect to database server as $db_user..." );
650 $wgDatabase = Database::newFromParams( $wgDBserver, $db_user, $db_pass, '', 1 );
651
652 # Check the connection and respond to errors
653 if( $wgDatabase->isOpen() ) {
654 # Seems OK
655 $ok = true;
656 $wgDBadminuser = $db_user;
657 $wgDBadminpassword = $db_pass;
658 echo( "success.</li>\n" );
659 $wgDatabase->ignoreErrors( true );
660 $myver = $wgDatabase->getServerVersion();
661 } else {
662 # There were errors, report them and back out
663 $ok = false;
664 $errno = mysql_errno();
665 $errtx = htmlspecialchars( mysql_error() );
666 switch( $errno ) {
667 case 1045:
668 case 2000:
669 echo( "failed due to authentication errors. Check passwords.</li>" );
670 if( $conf->Root ) {
671 # The superuser details are wrong
672 $errs["RootUser"] = "Check username";
673 $errs["RootPW"] = "and password";
674 } else {
675 # The regular user details are wrong
676 $errs["DBuser"] = "Check username";
677 $errs["DBpassword"] = "and password";
678 }
679 break;
680 case 2002:
681 case 2003:
682 default:
683 # General connection problem
684 echo( "failed with error [$errno] $errtx.</li>\n" );
685 $errs["DBserver"] = "Connection failed";
686 break;
687 } # switch
688 } #conn. att.
689
690 if( !$ok ) { continue; }
691
692 } else /* not mysql */ {
693 error_reporting( E_ALL );
694 $wgSuperUser = '';
695 ## Possible connect as a superuser
696 if( $conf->RootPW != '-' and strlen($conf->RootPW)) {
697 $wgDBsuperuser = $conf->RootUser;
698 echo( "<li>Attempting to connect to database \"postgres\" as superuser \"$wgDBsuperuser\"..." );
699 $wgDatabase = $dbc->newFromParams($wgDBserver, $wgDBsuperuser, $conf->RootPW, "postgres", 1);
700 if (!$wgDatabase->isOpen()) {
701 print " error: " . $wgDatabase->lastError() . "</li>\n";
702 $errs["DBserver"] = "Could not connect to database as superuser";
703 $errs["RootUser"] = "Check username";
704 $errs["RootPW"] = "and password";
705 continue;
706 }
707 }
708 echo( "<li>Attempting to connect to database \"$wgDBname\" as \"$wgDBuser\"..." );
709 $wgDatabase = $dbc->newFromParams($wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1);
710 if (!$wgDatabase->isOpen()) {
711 print " error: " . $wgDatabase->lastError() . "</li>\n";
712 } else {
713 $myver = $wgDatabase->getServerVersion();
714 }
715 }
716
717 if ( !$wgDatabase->isOpen() ) {
718 $errs["DBserver"] = "Couldn't connect to database";
719 continue;
720 }
721
722 print "<li>Connected to $myver";
723 if ($conf->DBtype == 'mysql') {
724 if( version_compare( $myver, "4.0.14" ) < 0 ) {
725 dieout( " -- mysql 4.0.14 or later required. Aborting." );
726 }
727 $mysqlNewAuth = version_compare( $myver, "4.1.0", "ge" );
728 if( $mysqlNewAuth && $mysqlOldClient ) {
729 print "; <b class='error'>You are using MySQL 4.1 server, but PHP is linked
730 to old client libraries; if you have trouble with authentication, see
731 <a href='http://dev.mysql.com/doc/mysql/en/old-client.html'
732 >http://dev.mysql.com/doc/mysql/en/old-client.html</a> for help.</b>";
733 }
734 if( $wgDBmysql5 ) {
735 if( $mysqlNewAuth ) {
736 print "; enabling MySQL 4.1/5.0 charset mode";
737 } else {
738 print "; <b class='error'>MySQL 4.1/5.0 charset mode enabled,
739 but older version detected; will likely fail.</b>";
740 }
741 }
742 print "</li>\n";
743
744 @$sel = $wgDatabase->selectDB( $wgDBname );
745 if( $sel ) {
746 print "<li>Database <tt>" . htmlspecialchars( $wgDBname ) . "</tt> exists</li>\n";
747 } else {
748 $err = mysql_errno();
749 if ( $err != 1049 ) {
750 print "<ul><li>Error selecting database $wgDBname: $err " .
751 htmlspecialchars( mysql_error() ) . "</li></ul>";
752 continue;
753 }
754 $res = $wgDatabase->query( "CREATE DATABASE `$wgDBname`" );
755 if( !$res ) {
756 print "<li>Couldn't create database <tt>" .
757 htmlspecialchars( $wgDBname ) .
758 "</tt>; try with root access or check your username/pass.</li>\n";
759 $errs["RootPW"] = "&lt;- Enter";
760 continue;
761 }
762 print "<li>Created database <tt>" . htmlspecialchars( $wgDBname ) . "</tt></li>\n";
763 }
764 $wgDatabase->selectDB( $wgDBname );
765 }
766 else if ($conf->DBtype == 'postgres') {
767 if( version_compare( $myver, "PostgreSQL 8.0" ) < 0 ) {
768 dieout( " <b>Postgres 8.0 or later is required</b>. Aborting.</li></ul>" );
769 }
770 }
771
772 if( $wgDatabase->tableExists( "cur" ) || $wgDatabase->tableExists( "revision" ) ) {
773 print "<li>There are already MediaWiki tables in this database. Checking if updates are needed...</li>\n";
774
775 # Create user if required (todo: other databases)
776 if ( $conf->Root && $conf->DBtype == 'mysql') {
777 $conn = $dbc->newFromParams( $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1 );
778 if ( $conn->isOpen() ) {
779 print "<li>DB user account ok</li>\n";
780 $conn->close();
781 } else {
782 print "<li>Granting user permissions...";
783 if( $mysqlOldClient && $mysqlNewAuth ) {
784 print " <b class='error'>If the next step fails, see <a href='http://dev.mysql.com/doc/mysql/en/old-client.html'>http://dev.mysql.com/doc/mysql/en/old-client.html</a> for help.</b>";
785 }
786 print "</li>\n";
787 dbsource( "../maintenance/users.sql", $wgDatabase );
788 }
789 }
790 if ( $conf->DBtype == 'mysql') {
791 print "<pre>\n";
792 chdir( ".." );
793 flush();
794 do_all_updates();
795 chdir( "config" );
796 print "</pre>\n";
797 }
798 print "<li>Finished update checks.</li>\n";
799 } else {
800 # FIXME: Check for errors
801 print "<li>Creating tables...";
802 if ($conf->DBtype == 'mysql') {
803 if( $wgDBmysql5 ) {
804 print " using MySQL 5 table defs...";
805 dbsource( "../maintenance/mysql5/tables.sql", $wgDatabase );
806 } else {
807 print " using MySQL 4 table defs...";
808 dbsource( "../maintenance/tables.sql", $wgDatabase );
809 }
810 dbsource( "../maintenance/interwiki.sql", $wgDatabase );
811 } else if ($conf->DBtype == 'postgres') {
812 $wgDatabase->setup_database();
813 }
814 else {
815 $errs["DBtype"] = "Do not know how to handle database type '$conf->DBtype'";
816 continue;
817 }
818
819 print " done.</li>\n";
820
821 print "<li>Initializing data...";
822 $wgDatabase->insert( 'site_stats',
823 array ( 'ss_row_id' => 1,
824 'ss_total_views' => 0,
825 'ss_total_edits' => 0,
826 'ss_good_articles' => 0 ) );
827
828 # Set up the "regular user" account *if we can, and if we need to*
829 if( $conf->Root and $conf->DBtype == 'mysql') {
830 # See if we need to
831 $wgDatabase2 = $dbc->newFromParams( $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1 );
832 if( $wgDatabase2->isOpen() ) {
833 # Nope, just close the test connection and continue
834 $wgDatabase2->close();
835 echo( "<li>User $wgDBuser exists. Skipping grants.</li>" );
836 } else {
837 # Yes, so run the grants
838 echo( "<li>Granting user permissions to $wgDBuser on $wgDBname..." );
839 dbsource( "../maintenance/users.sql", $wgDatabase );
840 echo( "success.</li>" );
841 }
842 }
843
844 if( $conf->SysopName ) {
845 $u = User::newFromName( $conf->getSysopName() );
846 if ( 0 == $u->idForName() ) {
847 $u->addToDatabase();
848 $u->setPassword( $conf->getSysopPass() );
849 $u->saveSettings();
850
851 $u->addGroup( "sysop" );
852 $u->addGroup( "bureaucrat" );
853
854 print "<li>Created sysop account <tt>" .
855 htmlspecialchars( $conf->SysopName ) . "</tt>.</li>\n";
856 } else {
857 print "<li>Could not create user - already exists!</li>\n";
858 }
859 } else {
860 print "<li>Skipped sysop account creation, no name given.</li>\n";
861 }
862
863 $titleobj = Title::newFromText( wfMsgNoDB( "mainpage" ) );
864 $article = new Article( $titleobj );
865 $newid = $article->insertOn( $wgDatabase );
866 $revision = new Revision( array(
867 'page' => $newid,
868 'text' => wfMsg( 'mainpagetext' ) . "\n\n" . wfMsg( 'mainpagedocfooter' ),
869 'comment' => '',
870 'user' => 0,
871 'user_text' => 'MediaWiki default',
872 ) );
873 $revid = $revision->insertOn( $wgDatabase );
874 $article->updateRevisionOn( $wgDatabase, $revision );
875
876 initialiseMessages( false, false, 'printListItem' );
877 }
878
879 /* Write out the config file now that all is well */
880 print "<p>Creating LocalSettings.php...</p>\n\n";
881 $localSettings = "<" . "?php$endl$local$endl?" . ">\r\n";
882 // Fix up a common line-ending problem (due to CVS on Windows)
883 $localSettings = str_replace( "\r\n", "\n", $localSettings );
884 $f = fopen( "LocalSettings.php", 'xt' );
885
886 if( $f == false ) {
887 dieout( "<p>Couldn't write out LocalSettings.php. Check that the directory permissions are correct and that there isn't already a file of that name here...</p>\n" .
888 "<p>Here's the file that would have been written, try to paste it into place manually:</p>\n" .
889 "<pre>\n" . htmlspecialchars( $localSettings ) . "</pre>\n" );
890 }
891 if(fwrite( $f, $localSettings ) ) {
892 fclose( $f );
893 writeSuccessMessage();
894 } else {
895 fclose( $f );
896 die("<p class='error'>An error occured while writing the config/LocalSettings.php file. Check user rights and disk space then try again.</p>\n");
897
898 }
899
900 } while( false );
901 }
902 ?>
903 </ul>
904
905
906 <?php
907
908 if( count( $errs ) ) {
909 /* Display options form */
910
911 if( $conf->posted ) {
912 echo "<p class='error-top'>Something's not quite right yet; make sure everything below is filled out correctly.</p>\n";
913 }
914 ?>
915
916 <form action="index.php" name="config" method="post">
917
918
919 <h2>Site config</h2>
920
921 <div class="config-section">
922 <div class="config-input">
923 <?php
924 aField( $conf, "Sitename", "Wiki name:" );
925 ?>
926 </div>
927 <p class="config-desc">
928 Preferably a short word without punctuation, i.e. "Wikipedia".<br />
929 Will appear as the namespace name for "meta" pages, and throughout the interface.
930 </p>
931
932 <div class="config-input">
933 <?php
934 aField( $conf, "EmergencyContact", "Contact e-mail:" );
935 ?>
936 </div>
937 <p class="config-desc">
938 Displayed to users in some error messages, used as the return address for password reminders, and used as the default sender address of e-mail notifications.
939 </p>
940
941 <div class="config-input">
942 <label class='column' for="LanguageCode">Language:</label>
943 <select id="LanguageCode" name="LanguageCode">
944
945 <?php
946 $list = getLanguageList();
947 foreach( $list as $code => $name ) {
948 $sel = ($code == $conf->LanguageCode) ? 'selected="selected"' : '';
949 echo "\t\t<option value=\"$code\" $sel>$name</option>\n";
950 }
951 ?>
952 </select>
953 </div>
954 <p class="config-desc">
955 Select the language for your wiki's interface. Some localizations aren't fully complete. Unicode (UTF-8) used for all localizations.
956 </p>
957
958 <div class="config-input">
959 <label class='column'>Copyright/license:</label>
960
961 <ul class="plain">
962 <li><?php aField( $conf, "License", "No license metadata", "radio", "none" ); ?></li>
963 <li><?php aField( $conf, "License", "GNU Free Documentation License 1.2 (Wikipedia-compatible)", "radio", "gfdl" ); ?></li>
964 <li><?php
965 aField( $conf, "License", "A Creative Commons license - ", "radio", "cc" );
966 $partner = "MediaWiki";
967 $exit = urlencode( "$wgServer{$conf->ScriptPath}/config/index.php?License=cc&RightsUrl=[license_url]&RightsText=[license_name]&RightsCode=[license_code]&RightsIcon=[license_button]" );
968 $icon = urlencode( "$wgServer$wgUploadPath/wiki.png" );
969 $ccApp = htmlspecialchars( "http://creativecommons.org/license/?partner=$partner&exit_url=$exit&partner_icon_url=$icon" );
970 print "<a href=\"$ccApp\" target='_blank'>choose</a>";
971 ?>
972 <?php if( $conf->License == "cc" ) { ?>
973 <ul>
974 <li><?php aField( $conf, "RightsIcon", "<img src=\"" . htmlspecialchars( $conf->RightsIcon ) . "\" alt='icon' />", "hidden" ); ?></li>
975 <li><?php aField( $conf, "RightsText", htmlspecialchars( $conf->RightsText ), "hidden" ); ?></li>
976 <li><?php aField( $conf, "RightsCode", "code: " . htmlspecialchars( $conf->RightsCode ), "hidden" ); ?></li>
977 <li><?php aField( $conf, "RightsUrl", "<a href=\"" . htmlspecialchars( $conf->RightsUrl ) . "\">" . htmlspecialchars( $conf->RightsUrl ) . "</a>", "hidden" ); ?></li>
978 </ul>
979 <?php } ?>
980 </li>
981 </ul>
982 </div>
983 <p class="config-desc">
984 A notice, icon, and machine-readable copyright metadata will be displayed for the license you pick.
985 </p>
986
987
988 <div class="config-input">
989 <?php aField( $conf, "SysopName", "Admin username:" ) ?>
990 </div>
991 <div class="config-input">
992 <?php aField( $conf, "SysopPass", "Password:", "password" ) ?>
993 </div>
994 <div class="config-input">
995 <?php aField( $conf, "SysopPass2", "Password confirm:", "password" ) ?>
996 </div>
997 <p class="config-desc">
998 An admin can lock/delete pages, block users from editing, and other maintenance tasks.<br />
999 A new account will be added only when creating a new wiki database.
1000 </p>
1001
1002 <div class="config-input">
1003 <label class='column'>Shared memory caching:</label>
1004
1005 <ul class="plain">
1006 <li><?php aField( $conf, "Shm", "No caching", "radio", "none" ); ?></li>
1007 <?php
1008 if ( $conf->turck ) {
1009 echo "<li>";
1010 aField( $conf, "Shm", "Turck MMCache", "radio", "turck" );
1011 echo "</li>";
1012 }
1013 if ( $conf->apc ) {
1014 echo "<li>";
1015 aField( $conf, "Shm", "APC", "radio", "apc" );
1016 echo "</li>";
1017 }
1018 if ( $conf->eaccel ) {
1019 echo "<li>";
1020 aField( $conf, "Shm", "eAccelerator", "radio", "eaccel" );
1021 echo "</li>";
1022 }
1023 ?>
1024 <li><?php aField( $conf, "Shm", "Memcached", "radio", "memcached" ); ?></li>
1025 </ul>
1026 <div style="clear:left"><?php aField( $conf, "MCServers", "Memcached servers:", "text" ) ?></div>
1027 </div>
1028 <p class="config-desc">
1029 Using a shared memory system such as Turck MMCache, APC, eAccelerator, or Memcached
1030 will speed up MediaWiki significantly. Memcached is the best solution but needs to be
1031 installed. Specify the server addresses and ports in a comma-separted list. Only
1032 use Turck shared memory if the wiki will be running on a single Apache server.
1033 </p>
1034 </div>
1035
1036 <h2>E-mail, e-mail notification and authentication setup</h2>
1037
1038 <div class="config-section">
1039 <div class="config-input">
1040 <label class='column'>E-mail features (global):</label>
1041 <ul class="plain">
1042 <li><?php aField( $conf, "Email", "Enabled", "radio", "email_enabled" ); ?></li>
1043 <li><?php aField( $conf, "Email", "Disabled", "radio", "email_disabled" ); ?></li>
1044 </ul>
1045 </div>
1046 <p class="config-desc">
1047 Use this to disable all e-mail functions (password reminders, user-to-user e-mail and e-mail notifications)
1048 if sending mail doesn't work on your server.
1049 </p>
1050
1051 <div class="config-input">
1052 <label class='column'>User-to-user e-mail:</label>
1053 <ul class="plain">
1054 <li><?php aField( $conf, "Emailuser", "Enabled", "radio", "emailuser_enabled" ); ?></li>
1055 <li><?php aField( $conf, "Emailuser", "Disabled", "radio", "emailuser_disabled" ); ?></li>
1056 </ul>
1057 </div>
1058 <p class="config-desc">
1059 The user-to-user e-mail feature (Special:Emailuser) lets the wiki act as a relay to allow users to exchange e-mail without publicly advertising their e-mail address.
1060 </p>
1061 <div class="config-input">
1062 <label class='column'>E-mail notification about changes:</label>
1063 <ul class="plain">
1064 <li><?php aField( $conf, "Enotif", "Disabled", "radio", "enotif_disabled" ); ?></li>
1065 <li><?php aField( $conf, "Enotif", "Enabled for changes to user discussion pages only", "radio", "enotif_usertalk" ); ?></li>
1066 <li><?php aField( $conf, "Enotif", "Enabled for changes to user discussion pages, and to pages on watchlists (not recommended for large wikis)", "radio", "enotif_allpages" ); ?></li>
1067 </ul>
1068 </div>
1069 <div class="config-desc">
1070 <p>
1071 For this feature to work, an e-mail address must be present for the user account, and the notification
1072 options in the user's preferences must be enabled. Also note the
1073 authentication option below. When testing the feature, keep in mind that your own changes will never trigger notifications to be sent to yourself.</p>
1074
1075 <p>There are additional options for fine tuning in /includes/DefaultSettings.php; copy these to your LocalSettings.php and edit them there to change them.</p>
1076 </div>
1077
1078 <div class="config-input">
1079 <label class='column'>E-mail address authentication:</label>
1080 <ul class="plain">
1081 <li><?php aField( $conf, "Eauthent", "Disabled", "radio", "eauthent_disabled" ); ?></li>
1082 <li><?php aField( $conf, "Eauthent", "Enabled", "radio", "eauthent_enabled" ); ?></li>
1083 </ul>
1084 </div>
1085 <div class="config-desc">
1086 <p>If this option is enabled, users have to confirm their e-mail address using a magic link sent to them whenever they set or change it, and only authenticated e-mail addresses can receive mails from other users and/or
1087 change notification mails. Setting this option is <B>recommended</B> for public wikis because of potential abuse of the e-mail features above.</p>
1088 </div>
1089
1090 </div>
1091
1092 <h2>Database config</h2>
1093
1094 <div class="config-section">
1095 <div class="config-input">
1096 <label class='column'>Database type:</label>
1097 <?php if (isset($errs['DBpicktype'])) print "<span class='error'>$errs[DBpicktype]</span>\n"; ?>
1098 <ul class='plain'><?php database_picker($conf) ?></ul>
1099 </div>
1100
1101 <div class="config-input" style="clear:left"><?php
1102 aField( $conf, "DBserver", "Database host:" );
1103 ?></div>
1104 <p class="config-desc">
1105 If your database server isn't on your web server, enter the name or IP address here.
1106 </p>
1107
1108 <div class="config-input"><?php
1109 aField( $conf, "DBname", "Database name:" );
1110 ?></div>
1111 <div class="config-input"><?php
1112 aField( $conf, "DBuser", "DB username:" );
1113 ?></div>
1114 <div class="config-input"><?php
1115 aField( $conf, "DBpassword", "DB password:", "password" );
1116 ?></div>
1117 <div class="config-input"><?php
1118 aField( $conf, "DBpassword2", "DB password confirm:", "password" );
1119 ?></div>
1120 <p class="config-desc">
1121 If you only have a single user account and database available,
1122 enter those here. If you have database root access (see below)
1123 you can specify new accounts/databases to be created. This account
1124 will not be created if it pre-exists. If this is the case, ensure that it
1125 has SELECT, INSERT, UPDATE and DELETE permissions on the MediaWiki database.
1126 </p>
1127
1128 <div class="config-input">
1129 <?php
1130 aField( $conf, "RootUser", "Superuser account:", "superuser" );
1131 ?>
1132 </div>
1133 <div class="config-input">
1134 <?php
1135 aField( $conf, "RootPW", "Superuser password:", "password" );
1136 ?>
1137 </div>
1138
1139 <p class="config-desc">
1140 If the database user specified above does not exist, or does not have access to create
1141 the database (if needed) or tables within it, please provide details of a superuser account,
1142 such as <strong>root</strong>, which does. Leave the password set to <strong>-</strong> if this is not needed.
1143 </p>
1144
1145 <?php database_switcher('mysql'); ?>
1146 <div class="config-input"><?php
1147 aField( $conf, "DBprefix", "Database table prefix:" );
1148 ?></div>
1149 <div class="config-desc">
1150 <p>If you need to share one database between multiple wikis, or
1151 MediaWiki and another web application, you may choose to
1152 add a prefix to all the table names to avoid conflicts.</p>
1153
1154 <p>Avoid exotic characters; something like <tt>mw_</tt> is good.</p>
1155 </div>
1156
1157 <div class="config-input"><label class="column">Database charset</label>
1158 <div>Select one:</div>
1159 <ul class="plain">
1160 <li><?php aField( $conf, "DBmysql5", "Backwards-compatible UTF-8", "radio", "false" ); ?></li>
1161 <li><?php aField( $conf, "DBmysql5", "Experimental MySQL 4.1/5.0 UTF-8", "radio", "true" ); ?></li>
1162 </ul>
1163 </div>
1164 <p class="config-desc">
1165 <b>EXPERIMENTAL:</b> You can enable explicit Unicode charset support
1166 for MySQL 4.1 and 5.0 servers. This is not well tested and may
1167 cause things to break. <b>If upgrading an older installation, leave
1168 in backwards-compatible mode.</b>
1169 </p>
1170 </div>
1171
1172 <?php database_switcher('postgres'); ?>
1173 <div class="config-input"><?php
1174 aField( $conf, "DBport", "Database port:" );
1175 ?></div>
1176 <div class="config-input"><?php
1177 aField( $conf, "DBmwschema", "Schema for mediawiki:" );
1178 ?></div>
1179 <div class="config-input"><?php
1180 aField( $conf, "DBts2schema", "Schema for tsearch2:" );
1181 ?></div>
1182 <div class="config-desc">
1183 <p>The username specified above will have it's search path set to the above schemas,
1184 so it is recommended that you create a new user.</p>
1185 </div>
1186 </div>
1187
1188 <div class="config-input" style="padding:2em 0 3em">
1189 <label class='column'>&nbsp;</label>
1190 <input type="submit" value="Install MediaWiki!" class="btn-install" />
1191 </div>
1192
1193 </div>
1194
1195 <script type="text/javascript">
1196 window.onload = toggleDBarea('<?php echo $conf->DBtype; ?>',
1197 <?php
1198 ## If they passed in a root user name, don't populate it on page load
1199 echo strlen(importPost('RootUser', '')) ? 0 : 1;
1200 ?>);
1201 </script>
1202
1203 </form>
1204
1205 <?php
1206 }
1207
1208 /* -------------------------------------------------------------------------------------- */
1209 function writeSuccessMessage() {
1210 if ( ini_get( 'safe_mode' ) && !ini_get( 'open_basedir' ) ) {
1211 echo <<<EOT
1212 <p>Installation successful!</p>
1213 <p>To complete the installation, please do the following:
1214 <ol>
1215 <li>Download config/LocalSettings.php with your FTP client or file manager</li>
1216 <li>Upload it to the parent directory</li>
1217 <li>Delete config/LocalSettings.php</li>
1218 <li>Start using <a href='../index.php'>your wiki</a>!
1219 </ol>
1220 <p>If you are in a shared hosting environment, do <strong>not</strong> just move LocalSettings.php
1221 remotely. LocalSettings.php is currently owned by the user your webserver is running under,
1222 which means that anyone on the same server can read your database password! Downloading
1223 it and uploading it again will hopefully change the ownership to a user ID specific to you.</p>
1224 EOT;
1225 } else {
1226 echo "<p>Installation successful! Move the config/LocalSettings.php file into the parent directory, then follow
1227 <a href='../index.php'>this link</a> to your wiki.</p>\n";
1228 }
1229 }
1230
1231
1232 function escapePhpString( $string ) {
1233 return strtr( $string,
1234 array(
1235 "\n" => "\\n",
1236 "\r" => "\\r",
1237 "\t" => "\\t",
1238 "\\" => "\\\\",
1239 "\$" => "\\\$",
1240 "\"" => "\\\""
1241 ));
1242 }
1243
1244 function writeLocalSettings( $conf ) {
1245 $conf->UseImageResize = $conf->UseImageResize ? 'true' : 'false';
1246 $conf->PasswordSender = $conf->EmergencyContact;
1247 $zlib = ($conf->zlib ? "" : "# ");
1248 $magic = ($conf->ImageMagick ? "" : "# ");
1249 $convert = ($conf->ImageMagick ? $conf->ImageMagick : "/usr/bin/convert" );
1250 $pretty = ($conf->prettyURLs ? "" : "# ");
1251 $ugly = ($conf->prettyURLs ? "# " : "");
1252 $rights = ($conf->RightsUrl) ? "" : "# ";
1253 $hashedUploads = $conf->safeMode ? '' : '# ';
1254
1255 switch ( $conf->Shm ) {
1256 case 'memcached':
1257 $cacheType = 'CACHE_MEMCACHED';
1258 $mcservers = var_export( $conf->MCServerArray, true );
1259 break;
1260 case 'turck':
1261 case 'apc':
1262 case 'eaccel':
1263 $cacheType = 'CACHE_ACCEL';
1264 $mcservers = 'array()';
1265 break;
1266 default:
1267 $cacheType = 'CACHE_NONE';
1268 $mcservers = 'array()';
1269 }
1270
1271 if ( $conf->Email == 'email_enabled' ) {
1272 $enableemail = 'true';
1273 $enableuseremail = ( $conf->Emailuser == 'emailuser_enabled' ) ? 'true' : 'false' ;
1274 $eauthent = ( $conf->Eauthent == 'eauthent_enabled' ) ? 'true' : 'false' ;
1275 switch ( $conf->Enotif ) {
1276 case 'enotif_usertalk':
1277 $enotifusertalk = 'true';
1278 $enotifwatchlist = 'false';
1279 break;
1280 case 'enotif_allpages':
1281 $enotifusertalk = 'true';
1282 $enotifwatchlist = 'true';
1283 break;
1284 default:
1285 $enotifusertalk = 'false';
1286 $enotifwatchlist = 'false';
1287 }
1288 } else {
1289 $enableuseremail = 'false';
1290 $enableemail = 'false';
1291 $eauthent = 'false';
1292 $enotifusertalk = 'false';
1293 $enotifwatchlist = 'false';
1294 }
1295
1296 $file = @fopen( "/dev/urandom", "r" );
1297 if ( $file ) {
1298 $secretKey = bin2hex( fread( $file, 32 ) );
1299 fclose( $file );
1300 } else {
1301 $secretKey = "";
1302 for ( $i=0; $i<8; $i++ ) {
1303 $secretKey .= dechex(mt_rand(0, 0x7fffffff));
1304 }
1305 print "<li>Warning: \$wgSecretKey key is insecure, generated with mt_rand(). Consider changing it manually.</li>\n";
1306 }
1307
1308 # Add slashes to strings for double quoting
1309 $slconf = array_map( "escapePhpString", get_object_vars( $conf ) );
1310 if( $conf->License == 'gfdl' ) {
1311 # Needs literal string interpolation for the current style path
1312 $slconf['RightsIcon'] = $conf->RightsIcon;
1313 }
1314
1315 $localsettings = "
1316 # This file was automatically generated by the MediaWiki installer.
1317 # If you make manual changes, please keep track in case you need to
1318 # recreate them later.
1319 #
1320 # See includes/DefaultSettings.php for all configurable settings
1321 # and their default values, but don't forget to make changes in _this_
1322 # file, not there.
1323
1324 # If you customize your file layout, set \$IP to the directory that contains
1325 # the other MediaWiki files. It will be used as a base to locate files.
1326 if( defined( 'MW_INSTALL_PATH' ) ) {
1327 \$IP = MW_INSTALL_PATH;
1328 } else {
1329 \$IP = dirname( __FILE__ );
1330 }
1331
1332 \$path = array( \$IP, \"\$IP/includes\", \"\$IP/languages\" );
1333 set_include_path( implode( PATH_SEPARATOR, \$path ) . PATH_SEPARATOR . get_include_path() );
1334
1335 require_once( \"includes/DefaultSettings.php\" );
1336
1337 # If PHP's memory limit is very low, some operations may fail.
1338 " . ($conf->raiseMemory ? '' : '# ' ) . "ini_set( 'memory_limit', '20M' );" . "
1339
1340 if ( \$wgCommandLineMode ) {
1341 if ( isset( \$_SERVER ) && array_key_exists( 'REQUEST_METHOD', \$_SERVER ) ) {
1342 die( \"This script must be run from the command line\\n\" );
1343 }
1344 } elseif ( empty( \$wgNoOutputBuffer ) ) {
1345 ## Compress output if the browser supports it
1346 {$zlib}if( !ini_get( 'zlib.output_compression' ) ) @ob_start( 'ob_gzhandler' );
1347 }
1348
1349 \$wgSitename = \"{$slconf['Sitename']}\";
1350
1351 \$wgScriptPath = \"{$slconf['ScriptPath']}\";
1352 \$wgScript = \"\$wgScriptPath/index.php\";
1353 \$wgRedirectScript = \"\$wgScriptPath/redirect.php\";
1354
1355 ## For more information on customizing the URLs please see:
1356 ## http://meta.wikimedia.org/wiki/Eliminating_index.php_from_the_url
1357 ## If using PHP as a CGI module, the ?title= style usually must be used.
1358 {$pretty}\$wgArticlePath = \"\$wgScript/\$1\";
1359 {$ugly}\$wgArticlePath = \"\$wgScript?title=\$1\";
1360
1361 \$wgStylePath = \"\$wgScriptPath/skins\";
1362 \$wgStyleDirectory = \"\$IP/skins\";
1363 \$wgLogo = \"\$wgStylePath/common/images/wiki.png\";
1364
1365 \$wgUploadPath = \"\$wgScriptPath/images\";
1366 \$wgUploadDirectory = \"\$IP/images\";
1367
1368 \$wgEnableEmail = $enableemail;
1369 \$wgEnableUserEmail = $enableuseremail;
1370
1371 \$wgEmergencyContact = \"{$slconf['EmergencyContact']}\";
1372 \$wgPasswordSender = \"{$slconf['PasswordSender']}\";
1373
1374 ## For a detailed description of the following switches see
1375 ## http://meta.wikimedia.org/Enotif and http://meta.wikimedia.org/Eauthent
1376 ## There are many more options for fine tuning available see
1377 ## /includes/DefaultSettings.php
1378 ## UPO means: this is also a user preference option
1379 \$wgEnotifUserTalk = $enotifusertalk; # UPO
1380 \$wgEnotifWatchlist = $enotifwatchlist; # UPO
1381 \$wgEmailAuthentication = $eauthent;
1382
1383 \$wgDBserver = \"{$slconf['DBserver']}\";
1384 \$wgDBname = \"{$slconf['DBname']}\";
1385 \$wgDBuser = \"{$slconf['DBuser']}\";
1386 \$wgDBpassword = \"{$slconf['DBpassword']}\";
1387 \$wgDBprefix = \"{$slconf['DBprefix']}\";
1388 \$wgDBtype = \"{$slconf['DBtype']}\";
1389 \$wgDBport = \"{$slconf['DBport']}\";
1390
1391 # Experimental charset support for MySQL 4.1/5.0.
1392 \$wgDBmysql5 = {$conf->DBmysql5};
1393
1394 ## Shared memory settings
1395 \$wgMainCacheType = $cacheType;
1396 \$wgMemCachedServers = $mcservers;
1397
1398 ## To enable image uploads, make sure the 'images' directory
1399 ## is writable, then set this to true:
1400 \$wgEnableUploads = false;
1401 \$wgUseImageResize = {$conf->UseImageResize};
1402 {$magic}\$wgUseImageMagick = true;
1403 {$magic}\$wgImageMagickConvertCommand = \"{$convert}\";
1404
1405 ## If you want to use image uploads under safe mode,
1406 ## create the directories images/archive, images/thumb and
1407 ## images/temp, and make them all writable. Then uncomment
1408 ## this, if it's not already uncommented:
1409 {$hashedUploads}\$wgHashedUploadDirectory = false;
1410
1411 ## If you have the appropriate support software installed
1412 ## you can enable inline LaTeX equations:
1413 \$wgUseTeX = false;
1414 \$wgMathPath = \"{\$wgUploadPath}/math\";
1415 \$wgMathDirectory = \"{\$wgUploadDirectory}/math\";
1416 \$wgTmpDirectory = \"{\$wgUploadDirectory}/tmp\";
1417
1418 \$wgLocalInterwiki = \$wgSitename;
1419
1420 \$wgLanguageCode = \"{$slconf['LanguageCode']}\";
1421
1422 \$wgProxyKey = \"$secretKey\";
1423
1424 ## Default skin: you can change the default skin. Use the internal symbolic
1425 ## names, ie 'standard', 'nostalgia', 'cologneblue', 'monobook':
1426 \$wgDefaultSkin = 'monobook';
1427
1428 ## For attaching licensing metadata to pages, and displaying an
1429 ## appropriate copyright notice / icon. GNU Free Documentation
1430 ## License and Creative Commons licenses are supported so far.
1431 {$rights}\$wgEnableCreativeCommonsRdf = true;
1432 \$wgRightsPage = \"\"; # Set to the title of a wiki page that describes your license/copyright
1433 \$wgRightsUrl = \"{$slconf['RightsUrl']}\";
1434 \$wgRightsText = \"{$slconf['RightsText']}\";
1435 \$wgRightsIcon = \"{$slconf['RightsIcon']}\";
1436 # \$wgRightsCode = \"{$slconf['RightsCode']}\"; # Not yet used
1437
1438 \$wgDiff3 = \"{$slconf['diff3']}\";
1439
1440 # When you make changes to this configuration file, this will make
1441 # sure that cached pages are cleared.
1442 \$configdate = gmdate( 'YmdHis', @filemtime( __FILE__ ) );
1443 \$wgCacheEpoch = max( \$wgCacheEpoch, \$configdate );
1444 "; ## End of setting the $localsettings string
1445
1446 // Keep things in Unix line endings internally;
1447 // the system will write out as local text type.
1448 return str_replace( "\r\n", "\n", $localsettings );
1449 }
1450
1451 function dieout( $text ) {
1452 die( $text . "\n\n</body>\n</html>" );
1453 }
1454
1455 function importVar( &$var, $name, $default = "" ) {
1456 if( isset( $var[$name] ) ) {
1457 $retval = $var[$name];
1458 if ( get_magic_quotes_gpc() ) {
1459 $retval = stripslashes( $retval );
1460 }
1461 } else {
1462 $retval = $default;
1463 }
1464 return $retval;
1465 }
1466
1467 function importPost( $name, $default = "" ) {
1468 return importVar( $_POST, $name, $default );
1469 }
1470
1471 function importRequest( $name, $default = "" ) {
1472 return importVar( $_REQUEST, $name, $default );
1473 }
1474
1475 $radioCount = 0;
1476
1477 function aField( &$conf, $field, $text, $type = "text", $value = "", $onclick = '' ) {
1478 global $radioCount;
1479 if( $type != "" ) {
1480 $xtype = "type=\"$type\"";
1481 } else {
1482 $xtype = "";
1483 }
1484
1485 $id = $field;
1486 $nolabel = ($type == "radio") || ($type == "hidden");
1487
1488 if ($type == 'radio')
1489 $id .= $radioCount++;
1490
1491 if( $nolabel ) {
1492 echo "\t\t<label>";
1493 } else {
1494 echo "\t\t<label class='column' for=\"$id\">$text</label>\n";
1495 }
1496
1497 if( $type == "radio" && $value == $conf->$field ) {
1498 $checked = "checked='checked'";
1499 } else {
1500 $checked = "";
1501 }
1502 echo "\t\t<input $xtype name=\"$field\" id=\"$id\" class=\"iput-$type\" $checked ";
1503 if ($onclick) {
1504 echo " onclick='toggleDBarea(\"$value\",1)' " ;
1505 }
1506 echo "value=\"";
1507 if( $type == "radio" ) {
1508 echo htmlspecialchars( $value );
1509 } else {
1510 echo htmlspecialchars( $conf->$field );
1511 }
1512
1513
1514 echo "\" />\n";
1515 if( $nolabel ) {
1516 echo " $text</label>\n";
1517 }
1518
1519 global $errs;
1520 if(isset($errs[$field])) echo "<span class='error'>" . $errs[$field] . "</span>\n";
1521 }
1522
1523 function getLanguageList() {
1524 global $wgLanguageNames;
1525 if( !isset( $wgLanguageNames ) ) {
1526 require_once( "languages/Names.php" );
1527 }
1528
1529 $codes = array();
1530
1531 $d = opendir( "../languages" );
1532 /* In case we are called from the root directory */
1533 if (!$d)
1534 $d = opendir( "languages");
1535 while( false !== ($f = readdir( $d ) ) ) {
1536 $m = array();
1537 if( preg_match( '/Messages([A-Z][a-z_]+)\.php$/', $f, $m ) ) {
1538 $code = str_replace( '_', '-', strtolower( $m[1] ) );
1539 if( isset( $wgLanguageNames[$code] ) ) {
1540 $name = $code . ' - ' . $wgLanguageNames[$code];
1541 } else {
1542 $name = $code;
1543 }
1544 $codes[$code] = $name;
1545 }
1546 }
1547 closedir( $d );
1548 ksort( $codes );
1549 return $codes;
1550 }
1551
1552 #Check for location of an executable
1553 # @param string $loc single location to check
1554 # @param array $names filenames to check for.
1555 # @param mixed $versioninfo array of details to use when checking version, use false for no version checking
1556 function locate_executable($loc, $names, $versioninfo = false) {
1557 if (!is_array($names))
1558 $names = array($names);
1559
1560 foreach ($names as $name) {
1561 $command = "$loc".DIRECTORY_SEPARATOR."$name";
1562 if (file_exists($command)) {
1563 if (!$versioninfo)
1564 return $command;
1565
1566 $file = str_replace('$1', $command, $versioninfo[0]);
1567 if (strstr(`$file`, $versioninfo[1]) !== false)
1568 return $command;
1569 }
1570 }
1571 return false;
1572 }
1573
1574 # Test a memcached server
1575 function testMemcachedServer( $server ) {
1576 $hostport = explode(":", $server);
1577 $errstr = false;
1578 $fp = false;
1579 if ( !function_exists( 'fsockopen' ) ) {
1580 $errstr = "Can't connect to memcached, fsockopen() not present";
1581 }
1582 if ( !$errstr && count( $hostport ) != 2 ) {
1583 $errstr = 'Please specify host and port';
1584 var_dump( $hostport );
1585 }
1586 if ( !$errstr ) {
1587 list( $host, $port ) = $hostport;
1588 $errno = 0;
1589 $fsockerr = '';
1590
1591 $fp = @fsockopen( $host, $port, $errno, $fsockerr, 1.0 );
1592 if ( $fp === false ) {
1593 $errstr = "Cannot connect to memcached on $host:$port : $fsockerr";
1594 }
1595 }
1596 if ( !$errstr ) {
1597 $command = "version\r\n";
1598 $bytes = fwrite( $fp, $command );
1599 if ( $bytes != strlen( $command ) ) {
1600 $errstr = "Cannot write to memcached socket on $host:$port";
1601 }
1602 }
1603 if ( !$errstr ) {
1604 $expected = "VERSION ";
1605 $response = fread( $fp, strlen( $expected ) );
1606 if ( $response != $expected ) {
1607 $errstr = "Didn't get correct memcached response from $host:$port";
1608 }
1609 }
1610 if ( $fp ) {
1611 fclose( $fp );
1612 }
1613 if ( !$errstr ) {
1614 echo "<li>Connected to memcached on $host:$port successfully";
1615 }
1616 return $errstr;
1617 }
1618
1619 function database_picker($conf) {
1620 global $ourdb;
1621 print "\n";
1622 foreach(array_keys($ourdb) as $db) {
1623 if ($ourdb[$db]['havedriver']) {
1624 print "<li>";
1625 aField( $conf, "DBtype", $ourdb[$db]['fullname'], 'radio', $db, 'onclick');
1626 print "</li>\n";
1627 }
1628 }
1629 print "\n";
1630 }
1631
1632 function database_switcher($db) {
1633 global $ourdb;
1634 $color = $ourdb[$db]['bgcolor'];
1635 $full = $ourdb[$db]['fullname'];
1636 print "<div id='$db' style='display:none; background: $color'>\n";
1637 print "<h3>$full specific options:</h3>\n";
1638 }
1639
1640 function printListItem( $item ) {
1641 print "<li>$item</li>";
1642 }
1643
1644 ?>
1645
1646 <div class="license">
1647 <hr>
1648 <p>This program is free software; you can redistribute it and/or modify
1649 it under the terms of the GNU General Public License as published by
1650 the Free Software Foundation; either version 2 of the License, or
1651 (at your option) any later version.</p>
1652
1653 <p>This program is distributed in the hope that it will be useful,
1654 but WITHOUT ANY WARRANTY; without even the implied warranty of
1655 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1656 GNU General Public License for more details.</p>
1657
1658 <p>You should have received <a href="../COPYING">a copy of the GNU General Public License</a>
1659 along with this program; if not, write to the Free Software
1660 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1661 or <a href="http://www.gnu.org/copyleft/gpl.html">read it online</a></p>
1662 </div>
1663
1664 </div></div></div>
1665
1666
1667 <div id="column-one">
1668 <div class="portlet" id="p-logo">
1669 <a style="background-image: url(../skins/common/images/mediawiki.png);"
1670 href="http://www.mediawiki.org/"
1671 title="Main Page"></a>
1672 </div>
1673 <script type="text/javascript"> if (window.isMSIE55) fixalpha(); </script>
1674 <div class='portlet'><div class='pBody'>
1675 <ul>
1676 <li><strong><a href="http://www.mediawiki.org/">MediaWiki home</a></strong></li>
1677 <li><a href="../README">Readme</a></li>
1678 <li><a href="../RELEASE-NOTES">Release notes</a></li>
1679 <li><a href="../docs/">Documentation</a></li>
1680 <li><a href="http://meta.wikipedia.org/wiki/MediaWiki_User's_Guide">User's Guide</a></li>
1681 <li><a href="http://meta.wikimedia.org/wiki/MediaWiki_FAQ">FAQ</a></li>
1682 </ul>
1683 <p style="font-size:90%;margin-top:1em">MediaWiki is Copyright &copy; 2001-2006 by Magnus Manske, Brion Vibber, Lee Daniel Crocker, Tim Starling, Erik M&ouml;ller, Gabriel Wicke and others.</p>
1684 </div></div>
1685 </div>
1686
1687 </div>
1688
1689 </body>
1690 </html>