Remove 4.3.2 php version check, as we require 5 now.
[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?" . ">";
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.
1124 </p>
1125 <p>
1126 This account will not be created if it pre-exists. If this is the case, ensure that it
1127 has SELECT, INSERT, UPDATE and DELETE permissions on the MediaWiki database.
1128 </p>
1129
1130 <?php database_switcher('mysql'); ?>
1131 <div class="config-input"><?php
1132 aField( $conf, "DBprefix", "Database table prefix:" );
1133 ?></div>
1134 <div class="config-desc">
1135 <p>If you need to share one database between multiple wikis, or
1136 MediaWiki and another web application, you may choose to
1137 add a prefix to all the table names to avoid conflicts.</p>
1138
1139 <p>Avoid exotic characters; something like <tt>mw_</tt> is good.</p>
1140 </div>
1141
1142 <div class="config-input"><label class="column">Database charset</label>
1143 <div>Select one:</div>
1144 <ul class="plain">
1145 <li><?php aField( $conf, "DBmysql5", "Backwards-compatible UTF-8", "radio", "false" ); ?></li>
1146 <li><?php aField( $conf, "DBmysql5", "Experimental MySQL 4.1/5.0 UTF-8", "radio", "true" ); ?></li>
1147 </ul>
1148 </div>
1149 <p class="config-desc">
1150 <b>EXPERIMENTAL:</b> You can enable explicit Unicode charset support
1151 for MySQL 4.1 and 5.0 servers. This is not well tested and may
1152 cause things to break. <b>If upgrading an older installation, leave
1153 in backwards-compatible mode.</b>
1154 </p>
1155 </div>
1156
1157 <?php database_switcher('postgres'); ?>
1158 <div class="config-input"><?php
1159 aField( $conf, "DBport", "Database port:" );
1160 ?></div>
1161 <div class="config-input"><?php
1162 aField( $conf, "DBmwschema", "Schema for mediawiki:" );
1163 ?></div>
1164 <div class="config-input"><?php
1165 aField( $conf, "DBts2schema", "Schema for tsearch2:" );
1166 ?></div>
1167 <div class="config-desc">
1168 <p>The username specified above will have it's search path set to the above schemas,
1169 so it is recommended that you create a new user.</p>
1170 </div>
1171 </div>
1172
1173 <div class="config-input">
1174 <?php
1175 aField( $conf, "RootUser", "Superuser account:", "superuser" );
1176 ?>
1177 </div>
1178 <div class="config-input">
1179 <?php
1180 aField( $conf, "RootPW", "Superuser password:", "password" );
1181 ?>
1182 </div>
1183
1184 <p class="config-desc">
1185 If the database user specified above does not exist, or does not have access to create
1186 the database (if needed) or tables within it, please provide details of a superuser account,
1187 such as <strong>root</strong>, which does. Leave the password set to <strong>-</strong> if this is not needed.
1188 </p>
1189
1190 <div class="config-input" style="padding:2em 0 3em">
1191 <label class='column'>&nbsp;</label>
1192 <input type="submit" value="Install MediaWiki!" class="btn-install" />
1193 </div>
1194
1195 </div>
1196
1197 <script type="text/javascript">
1198 window.onload = toggleDBarea('<?php echo $conf->DBtype; ?>',
1199 <?php
1200 ## If they passed in a root user name, don't populate it on page load
1201 echo strlen(importPost('RootUser', '')) ? 0 : 1;
1202 ?>);
1203 </script>
1204
1205 </form>
1206
1207 <?php
1208 }
1209
1210 /* -------------------------------------------------------------------------------------- */
1211 function writeSuccessMessage() {
1212 if ( ini_get( 'safe_mode' ) && !ini_get( 'open_basedir' ) ) {
1213 echo <<<EOT
1214 <p>Installation successful!</p>
1215 <p>To complete the installation, please do the following:
1216 <ol>
1217 <li>Download config/LocalSettings.php with your FTP client or file manager</li>
1218 <li>Upload it to the parent directory</li>
1219 <li>Delete config/LocalSettings.php</li>
1220 <li>Start using <a href='../index.php'>your wiki</a>!
1221 </ol>
1222 <p>If you are in a shared hosting environment, do <strong>not</strong> just move LocalSettings.php
1223 remotely. LocalSettings.php is currently owned by the user your webserver is running under,
1224 which means that anyone on the same server can read your database password! Downloading
1225 it and uploading it again will hopefully change the ownership to a user ID specific to you.</p>
1226 EOT;
1227 } else {
1228 echo "<p>Installation successful! Move the config/LocalSettings.php file into the parent directory, then follow
1229 <a href='../index.php'>this link</a> to your wiki.</p>\n";
1230 }
1231 }
1232
1233
1234 function escapePhpString( $string ) {
1235 return strtr( $string,
1236 array(
1237 "\n" => "\\n",
1238 "\r" => "\\r",
1239 "\t" => "\\t",
1240 "\\" => "\\\\",
1241 "\$" => "\\\$",
1242 "\"" => "\\\""
1243 ));
1244 }
1245
1246 function writeLocalSettings( $conf ) {
1247 $conf->UseImageResize = $conf->UseImageResize ? 'true' : 'false';
1248 $conf->PasswordSender = $conf->EmergencyContact;
1249 $zlib = ($conf->zlib ? "" : "# ");
1250 $magic = ($conf->ImageMagick ? "" : "# ");
1251 $convert = ($conf->ImageMagick ? $conf->ImageMagick : "/usr/bin/convert" );
1252 $pretty = ($conf->prettyURLs ? "" : "# ");
1253 $ugly = ($conf->prettyURLs ? "# " : "");
1254 $rights = ($conf->RightsUrl) ? "" : "# ";
1255 $hashedUploads = $conf->safeMode ? '' : '# ';
1256
1257 switch ( $conf->Shm ) {
1258 case 'memcached':
1259 $cacheType = 'CACHE_MEMCACHED';
1260 $mcservers = var_export( $conf->MCServerArray, true );
1261 break;
1262 case 'turck':
1263 case 'apc':
1264 case 'eaccel':
1265 $cacheType = 'CACHE_ACCEL';
1266 $mcservers = 'array()';
1267 break;
1268 default:
1269 $cacheType = 'CACHE_NONE';
1270 $mcservers = 'array()';
1271 }
1272
1273 if ( $conf->Email == 'email_enabled' ) {
1274 $enableemail = 'true';
1275 $enableuseremail = ( $conf->Emailuser == 'emailuser_enabled' ) ? 'true' : 'false' ;
1276 $eauthent = ( $conf->Eauthent == 'eauthent_enabled' ) ? 'true' : 'false' ;
1277 switch ( $conf->Enotif ) {
1278 case 'enotif_usertalk':
1279 $enotifusertalk = 'true';
1280 $enotifwatchlist = 'false';
1281 break;
1282 case 'enotif_allpages':
1283 $enotifusertalk = 'true';
1284 $enotifwatchlist = 'true';
1285 break;
1286 default:
1287 $enotifusertalk = 'false';
1288 $enotifwatchlist = 'false';
1289 }
1290 } else {
1291 $enableuseremail = 'false';
1292 $enableemail = 'false';
1293 $eauthent = 'false';
1294 $enotifusertalk = 'false';
1295 $enotifwatchlist = 'false';
1296 }
1297
1298 $file = @fopen( "/dev/urandom", "r" );
1299 if ( $file ) {
1300 $secretKey = bin2hex( fread( $file, 32 ) );
1301 fclose( $file );
1302 } else {
1303 $secretKey = "";
1304 for ( $i=0; $i<8; $i++ ) {
1305 $secretKey .= dechex(mt_rand(0, 0x7fffffff));
1306 }
1307 print "<li>Warning: \$wgSecretKey key is insecure, generated with mt_rand(). Consider changing it manually.</li>\n";
1308 }
1309
1310 # Add slashes to strings for double quoting
1311 $slconf = array_map( "escapePhpString", get_object_vars( $conf ) );
1312 if( $conf->License == 'gfdl' ) {
1313 # Needs literal string interpolation for the current style path
1314 $slconf['RightsIcon'] = $conf->RightsIcon;
1315 }
1316
1317 $localsettings = "
1318 # This file was automatically generated by the MediaWiki installer.
1319 # If you make manual changes, please keep track in case you need to
1320 # recreate them later.
1321 #
1322 # See includes/DefaultSettings.php for all configurable settings
1323 # and their default values, but don't forget to make changes in _this_
1324 # file, not there.
1325
1326 # If you customize your file layout, set \$IP to the directory that contains
1327 # the other MediaWiki files. It will be used as a base to locate files.
1328 if( defined( 'MW_INSTALL_PATH' ) ) {
1329 \$IP = MW_INSTALL_PATH;
1330 } else {
1331 \$IP = dirname( __FILE__ );
1332 }
1333
1334 \$path = array( \$IP, \"\$IP/includes\", \"\$IP/languages\" );
1335 set_include_path( implode( PATH_SEPARATOR, \$path ) . PATH_SEPARATOR . get_include_path() );
1336
1337 require_once( \"includes/DefaultSettings.php\" );
1338
1339 # If PHP's memory limit is very low, some operations may fail.
1340 " . ($conf->raiseMemory ? '' : '# ' ) . "ini_set( 'memory_limit', '20M' );" . "
1341
1342 if ( \$wgCommandLineMode ) {
1343 if ( isset( \$_SERVER ) && array_key_exists( 'REQUEST_METHOD', \$_SERVER ) ) {
1344 die( \"This script must be run from the command line\\n\" );
1345 }
1346 } elseif ( empty( \$wgNoOutputBuffer ) ) {
1347 ## Compress output if the browser supports it
1348 {$zlib}if( !ini_get( 'zlib.output_compression' ) ) @ob_start( 'ob_gzhandler' );
1349 }
1350
1351 \$wgSitename = \"{$slconf['Sitename']}\";
1352
1353 \$wgScriptPath = \"{$slconf['ScriptPath']}\";
1354 \$wgScript = \"\$wgScriptPath/index.php\";
1355 \$wgRedirectScript = \"\$wgScriptPath/redirect.php\";
1356
1357 ## For more information on customizing the URLs please see:
1358 ## http://meta.wikimedia.org/wiki/Eliminating_index.php_from_the_url
1359 ## If using PHP as a CGI module, the ?title= style usually must be used.
1360 {$pretty}\$wgArticlePath = \"\$wgScript/\$1\";
1361 {$ugly}\$wgArticlePath = \"\$wgScript?title=\$1\";
1362
1363 \$wgStylePath = \"\$wgScriptPath/skins\";
1364 \$wgStyleDirectory = \"\$IP/skins\";
1365 \$wgLogo = \"\$wgStylePath/common/images/wiki.png\";
1366
1367 \$wgUploadPath = \"\$wgScriptPath/images\";
1368 \$wgUploadDirectory = \"\$IP/images\";
1369
1370 \$wgEnableEmail = $enableemail;
1371 \$wgEnableUserEmail = $enableuseremail;
1372
1373 \$wgEmergencyContact = \"{$slconf['EmergencyContact']}\";
1374 \$wgPasswordSender = \"{$slconf['PasswordSender']}\";
1375
1376 ## For a detailed description of the following switches see
1377 ## http://meta.wikimedia.org/Enotif and http://meta.wikimedia.org/Eauthent
1378 ## There are many more options for fine tuning available see
1379 ## /includes/DefaultSettings.php
1380 ## UPO means: this is also a user preference option
1381 \$wgEnotifUserTalk = $enotifusertalk; # UPO
1382 \$wgEnotifWatchlist = $enotifwatchlist; # UPO
1383 \$wgEmailAuthentication = $eauthent;
1384
1385 \$wgDBserver = \"{$slconf['DBserver']}\";
1386 \$wgDBname = \"{$slconf['DBname']}\";
1387 \$wgDBuser = \"{$slconf['DBuser']}\";
1388 \$wgDBpassword = \"{$slconf['DBpassword']}\";
1389 \$wgDBprefix = \"{$slconf['DBprefix']}\";
1390 \$wgDBtype = \"{$slconf['DBtype']}\";
1391 \$wgDBport = \"{$slconf['DBport']}\";
1392
1393 # Experimental charset support for MySQL 4.1/5.0.
1394 \$wgDBmysql5 = {$conf->DBmysql5};
1395
1396 ## Shared memory settings
1397 \$wgMainCacheType = $cacheType;
1398 \$wgMemCachedServers = $mcservers;
1399
1400 ## To enable image uploads, make sure the 'images' directory
1401 ## is writable, then set this to true:
1402 \$wgEnableUploads = false;
1403 \$wgUseImageResize = {$conf->UseImageResize};
1404 {$magic}\$wgUseImageMagick = true;
1405 {$magic}\$wgImageMagickConvertCommand = \"{$convert}\";
1406
1407 ## If you want to use image uploads under safe mode,
1408 ## create the directories images/archive, images/thumb and
1409 ## images/temp, and make them all writable. Then uncomment
1410 ## this, if it's not already uncommented:
1411 {$hashedUploads}\$wgHashedUploadDirectory = false;
1412
1413 ## If you have the appropriate support software installed
1414 ## you can enable inline LaTeX equations:
1415 \$wgUseTeX = false;
1416 \$wgMathPath = \"{\$wgUploadPath}/math\";
1417 \$wgMathDirectory = \"{\$wgUploadDirectory}/math\";
1418 \$wgTmpDirectory = \"{\$wgUploadDirectory}/tmp\";
1419
1420 \$wgLocalInterwiki = \$wgSitename;
1421
1422 \$wgLanguageCode = \"{$slconf['LanguageCode']}\";
1423
1424 \$wgProxyKey = \"$secretKey\";
1425
1426 ## Default skin: you can change the default skin. Use the internal symbolic
1427 ## names, ie 'standard', 'nostalgia', 'cologneblue', 'monobook':
1428 \$wgDefaultSkin = 'monobook';
1429
1430 ## For attaching licensing metadata to pages, and displaying an
1431 ## appropriate copyright notice / icon. GNU Free Documentation
1432 ## License and Creative Commons licenses are supported so far.
1433 {$rights}\$wgEnableCreativeCommonsRdf = true;
1434 \$wgRightsPage = \"\"; # Set to the title of a wiki page that describes your license/copyright
1435 \$wgRightsUrl = \"{$slconf['RightsUrl']}\";
1436 \$wgRightsText = \"{$slconf['RightsText']}\";
1437 \$wgRightsIcon = \"{$slconf['RightsIcon']}\";
1438 # \$wgRightsCode = \"{$slconf['RightsCode']}\"; # Not yet used
1439
1440 \$wgDiff3 = \"{$slconf['diff3']}\";
1441
1442 # When you make changes to this configuration file, this will make
1443 # sure that cached pages are cleared.
1444 \$configdate = gmdate( 'YmdHis', @filemtime( __FILE__ ) );
1445 \$wgCacheEpoch = max( \$wgCacheEpoch, \$configdate );
1446 "; ## End of setting the $localsettings string
1447
1448 // Keep things in Unix line endings internally;
1449 // the system will write out as local text type.
1450 return str_replace( "\r\n", "\n", $localsettings );
1451 }
1452
1453 function dieout( $text ) {
1454 die( $text . "\n\n</body>\n</html>" );
1455 }
1456
1457 function importVar( &$var, $name, $default = "" ) {
1458 if( isset( $var[$name] ) ) {
1459 $retval = $var[$name];
1460 if ( get_magic_quotes_gpc() ) {
1461 $retval = stripslashes( $retval );
1462 }
1463 } else {
1464 $retval = $default;
1465 }
1466 return $retval;
1467 }
1468
1469 function importPost( $name, $default = "" ) {
1470 return importVar( $_POST, $name, $default );
1471 }
1472
1473 function importRequest( $name, $default = "" ) {
1474 return importVar( $_REQUEST, $name, $default );
1475 }
1476
1477 $radioCount = 0;
1478
1479 function aField( &$conf, $field, $text, $type = "text", $value = "", $onclick = '' ) {
1480 global $radioCount;
1481 if( $type != "" ) {
1482 $xtype = "type=\"$type\"";
1483 } else {
1484 $xtype = "";
1485 }
1486
1487 $id = $field;
1488 $nolabel = ($type == "radio") || ($type == "hidden");
1489
1490 if ($type == 'radio')
1491 $id .= $radioCount++;
1492
1493 if( $nolabel ) {
1494 echo "\t\t<label>";
1495 } else {
1496 echo "\t\t<label class='column' for=\"$id\">$text</label>\n";
1497 }
1498
1499 if( $type == "radio" && $value == $conf->$field ) {
1500 $checked = "checked='checked'";
1501 } else {
1502 $checked = "";
1503 }
1504 echo "\t\t<input $xtype name=\"$field\" id=\"$id\" class=\"iput-$type\" $checked ";
1505 if ($onclick) {
1506 echo " onclick='toggleDBarea(\"$value\",1)' " ;
1507 }
1508 echo "value=\"";
1509 if( $type == "radio" ) {
1510 echo htmlspecialchars( $value );
1511 } else {
1512 echo htmlspecialchars( $conf->$field );
1513 }
1514
1515
1516 echo "\" />\n";
1517 if( $nolabel ) {
1518 echo " $text</label>\n";
1519 }
1520
1521 global $errs;
1522 if(isset($errs[$field])) echo "<span class='error'>" . $errs[$field] . "</span>\n";
1523 }
1524
1525 function getLanguageList() {
1526 global $wgLanguageNames;
1527 if( !isset( $wgLanguageNames ) ) {
1528 require_once( "languages/Names.php" );
1529 }
1530
1531 $codes = array();
1532
1533 $d = opendir( "../languages" );
1534 /* In case we are called from the root directory */
1535 if (!$d)
1536 $d = opendir( "languages");
1537 while( false !== ($f = readdir( $d ) ) ) {
1538 $m = array();
1539 if( preg_match( '/Messages([A-Z][a-z_]+)\.php$/', $f, $m ) ) {
1540 $code = str_replace( '_', '-', strtolower( $m[1] ) );
1541 if( isset( $wgLanguageNames[$code] ) ) {
1542 $name = $code . ' - ' . $wgLanguageNames[$code];
1543 } else {
1544 $name = $code;
1545 }
1546 $codes[$code] = $name;
1547 }
1548 }
1549 closedir( $d );
1550 ksort( $codes );
1551 return $codes;
1552 }
1553
1554 #Check for location of an executable
1555 # @param string $loc single location to check
1556 # @param array $names filenames to check for.
1557 # @param mixed $versioninfo array of details to use when checking version, use false for no version checking
1558 function locate_executable($loc, $names, $versioninfo = false) {
1559 if (!is_array($names))
1560 $names = array($names);
1561
1562 foreach ($names as $name) {
1563 $command = "$loc".DIRECTORY_SEPARATOR."$name";
1564 if (file_exists($command)) {
1565 if (!$versioninfo)
1566 return $command;
1567
1568 $file = str_replace('$1', $command, $versioninfo[0]);
1569 if (strstr(`$file`, $versioninfo[1]) !== false)
1570 return $command;
1571 }
1572 }
1573 return false;
1574 }
1575
1576 # Test a memcached server
1577 function testMemcachedServer( $server ) {
1578 $hostport = explode(":", $server);
1579 $errstr = false;
1580 $fp = false;
1581 if ( !function_exists( 'fsockopen' ) ) {
1582 $errstr = "Can't connect to memcached, fsockopen() not present";
1583 }
1584 if ( !$errstr && count( $hostport ) != 2 ) {
1585 $errstr = 'Please specify host and port';
1586 var_dump( $hostport );
1587 }
1588 if ( !$errstr ) {
1589 list( $host, $port ) = $hostport;
1590 $errno = 0;
1591 $fsockerr = '';
1592
1593 $fp = @fsockopen( $host, $port, $errno, $fsockerr, 1.0 );
1594 if ( $fp === false ) {
1595 $errstr = "Cannot connect to memcached on $host:$port : $fsockerr";
1596 }
1597 }
1598 if ( !$errstr ) {
1599 $command = "version\r\n";
1600 $bytes = fwrite( $fp, $command );
1601 if ( $bytes != strlen( $command ) ) {
1602 $errstr = "Cannot write to memcached socket on $host:$port";
1603 }
1604 }
1605 if ( !$errstr ) {
1606 $expected = "VERSION ";
1607 $response = fread( $fp, strlen( $expected ) );
1608 if ( $response != $expected ) {
1609 $errstr = "Didn't get correct memcached response from $host:$port";
1610 }
1611 }
1612 if ( $fp ) {
1613 fclose( $fp );
1614 }
1615 if ( !$errstr ) {
1616 echo "<li>Connected to memcached on $host:$port successfully";
1617 }
1618 return $errstr;
1619 }
1620
1621 function database_picker($conf) {
1622 global $ourdb;
1623 print "\n";
1624 foreach(array_keys($ourdb) as $db) {
1625 if ($ourdb[$db]['havedriver']) {
1626 print "<li>";
1627 aField( $conf, "DBtype", $ourdb[$db]['fullname'], 'radio', $db, 'onclick');
1628 print "</li>\n";
1629 }
1630 }
1631 print "\n";
1632 }
1633
1634 function database_switcher($db) {
1635 global $ourdb;
1636 $color = $ourdb[$db]['bgcolor'];
1637 $full = $ourdb[$db]['fullname'];
1638 print "<div id='$db' style='display:none; background: $color'>\n";
1639 print "<h3>$full specific options:</h3>\n";
1640 }
1641
1642 function printListItem( $item ) {
1643 print "<li>$item</li>";
1644 }
1645
1646 ?>
1647
1648 <div class="license">
1649 <hr>
1650 <p>This program is free software; you can redistribute it and/or modify
1651 it under the terms of the GNU General Public License as published by
1652 the Free Software Foundation; either version 2 of the License, or
1653 (at your option) any later version.</p>
1654
1655 <p>This program is distributed in the hope that it will be useful,
1656 but WITHOUT ANY WARRANTY; without even the implied warranty of
1657 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1658 GNU General Public License for more details.</p>
1659
1660 <p>You should have received <a href="../COPYING">a copy of the GNU General Public License</a>
1661 along with this program; if not, write to the Free Software
1662 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1663 or <a href="http://www.gnu.org/copyleft/gpl.html">read it online</a></p>
1664 </div>
1665
1666 </div></div></div>
1667
1668
1669 <div id="column-one">
1670 <div class="portlet" id="p-logo">
1671 <a style="background-image: url(../skins/common/images/mediawiki.png);"
1672 href="http://www.mediawiki.org/"
1673 title="Main Page"></a>
1674 </div>
1675 <script type="text/javascript"> if (window.isMSIE55) fixalpha(); </script>
1676 <div class='portlet'><div class='pBody'>
1677 <ul>
1678 <li><strong><a href="http://www.mediawiki.org/">MediaWiki home</a></strong></li>
1679 <li><a href="../README">Readme</a></li>
1680 <li><a href="../RELEASE-NOTES">Release notes</a></li>
1681 <li><a href="../docs/">Documentation</a></li>
1682 <li><a href="http://meta.wikipedia.org/wiki/MediaWiki_User's_Guide">User's Guide</a></li>
1683 <li><a href="http://meta.wikimedia.org/wiki/MediaWiki_FAQ">FAQ</a></li>
1684 </ul>
1685 <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>
1686 </div></div>
1687 </div>
1688
1689 </div>
1690
1691 </body>
1692 </html>