* (bug 12296) Simplify cache epoch in default LocalSettings.php
[lhc/web/wiklou.git] / config / index.php
index 48ca26b..c24b963 100644 (file)
@@ -29,19 +29,28 @@ $wgRequestTime = microtime( true );
 # Attempt to set up the include path, to fix problems with relative includes
 $IP = dirname( dirname( __FILE__ ) );
 define( 'MW_INSTALL_PATH', $IP );
-$sep = PATH_SEPARATOR;
-if( !ini_set( "include_path", ".$sep$IP$sep$IP/includes$sep$IP/languages" ) ) {
-       set_include_path( ".$sep$IP$sep$IP/includes$sep$IP/languages" );
-}
 
 # Define an entry point and include some files
 define( "MEDIAWIKI", true );
 define( "MEDIAWIKI_INSTALL", true );
-require_once( "includes/Defines.php" );
-require_once( "includes/DefaultSettings.php" );
-require_once( "includes/MagicWord.php" );
-require_once( "includes/Namespace.php" );
-require_once( "includes/ProfilerStub.php" );
+
+// Run version checks before including other files
+// so people don't see a scary parse error.
+require_once( "$IP/install-utils.inc" );
+install_version_checks();
+
+require_once( "$IP/includes/Defines.php" );
+require_once( "$IP/includes/DefaultSettings.php" );
+require_once( "$IP/includes/AutoLoader.php" );
+require_once( "$IP/includes/MagicWord.php" );
+require_once( "$IP/includes/Namespace.php" );
+require_once( "$IP/includes/ProfilerStub.php" );
+require_once( "$IP/includes/GlobalFunctions.php" );
+require_once( "$IP/includes/Hooks.php" );
+
+# If we get an exception, the user needs to know
+# all the details
+$wgShowExceptionDetails = true;
 
 ## Databases we support:
 
@@ -140,6 +149,15 @@ $ourdb['postgres']['rootuser']   = 'postgres';
                        font-size: 85%;
                        padding-top: 3em;
                }
+               
+               span.success-message {
+                       font-weight: bold;
+                       font-size: 110%;
+                       color: green;
+               }
+               .success-box {
+                       font-size: 130%;
+               }
 
        </style>
        <script type="text/javascript">
@@ -179,7 +197,8 @@ $ourdb['postgres']['rootuser']   = 'postgres';
 /* Check for existing configurations and bug out! */
 
 if( file_exists( "../LocalSettings.php" ) ) {
-       dieout( "<p><strong>Setup has completed, <a href='../index.php'>your wiki</a> is configured.</strong></p>
+       $script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
+ dieout( "<p><strong>Setup has completed, <a href='../$script'>your wiki</a> is configured.</strong></p>
 
        <p>Please delete the /config directory for extra security.</p></div></div></div></div>" );
 }
@@ -203,12 +222,14 @@ if( !is_writable( "." ) ) {
        <pre>
        cd <i>/path/to/wiki</i>
        chmod a+w config
-       </pre>" );
+       </pre>
+       
+       <p>Afterwards retry to start the <a href=\"\">setup</a>.</p>" );
 }
 
 
-require_once( "install-utils.inc" );
-require_once( "maintenance/updaters.inc" );
+require_once( "$IP/install-utils.inc" );
+require_once( "$IP/maintenance/updaters.inc" );
 
 class ConfigData {
        function getEncoded( $data ) {
@@ -218,6 +239,31 @@ class ConfigData {
        function getSitename() { return $this->getEncoded( $this->Sitename ); }
        function getSysopName() { return $this->getEncoded( $this->SysopName ); }
        function getSysopPass() { return $this->getEncoded( $this->SysopPass ); }
+
+       function setSchema( $schema, $engine ) {
+               $this->DBschema = $schema;
+               if ( !preg_match( '/^\w*$/', $engine ) ){
+                       $engine = 'InnoDB';
+               }
+               switch ( $this->DBschema ) {
+                       case 'mysql5':
+                               $this->DBTableOptions = "ENGINE=$engine, DEFAULT CHARSET=utf8";
+                               $this->DBmysql5 = 'true';
+                               break;
+                       case 'mysql5-binary':
+                               $this->DBTableOptions = "ENGINE=$engine, DEFAULT CHARSET=binary";
+                               $this->DBmysql5 = 'true';
+                               break;
+                       default:
+                               $this->DBTableOptions = "TYPE=$engine";
+                               $this->DBmysql5 = 'false';
+               }
+               $this->DBengine = $engine;
+
+               # Set the global for use during install
+               global $wgDBTableOptions;
+               $wgDBTableOptions = $this->DBTableOptions;
+       }
 }
 
 ?>
@@ -225,7 +271,7 @@ class ConfigData {
 <ul>
        <li>
                <b>Don't forget security updates!</b> Keep an eye on the
-               <a href="http://mail.wikimedia.org/mailman/listinfo/mediawiki-announce">low-traffic
+               <a href="http://lists.wikimedia.org/mailman/listinfo/mediawiki-announce">low-traffic
                release announcements mailing list</a>.
        </li>
 </ul>
@@ -237,26 +283,24 @@ class ConfigData {
 <?php
 $endl = "
 ";
-$wgNoOutputBuffer = true;
+define( 'MW_NO_OUTPUT_BUFFER', 1 );
 $conf = new ConfigData;
 
 install_version_checks();
+$self = 'Installer'; # Maintenance script name, to please Setup.php
 
 print "<li>PHP " . phpversion() . " installed</li>\n";
 
-## Temporarily turn off all errors as we try to discover installed databases
-$olderrnum = error_reporting(0);
-
+error_reporting( 0 );
 $phpdatabases = array();
 foreach (array_keys($ourdb) as $db) {
        $compname = $ourdb[$db]['compile'];
-       if (extension_loaded($compname) or dl($compname . '.' . PHP_SHLIB_SUFFIX)) {
+       if( extension_loaded( $compname ) || ( mw_have_dl() && dl( "{$compname}." . PHP_SHLIB_SUFFIX ) ) ) {
                array_push($phpdatabases, $db);
                $ourdb[$db]['havedriver'] = 1;
        }
 }
-
-error_reporting($olderrornum);
+error_reporting( E_ALL );
 
 if (!$phpdatabases) {
        print "Could not find a suitable database driver!<ul>";
@@ -270,17 +314,18 @@ if (!$phpdatabases) {
 }
 
 print "<li>Found database drivers for:";
+$DefaultDBtype = '';
 foreach (array_keys($ourdb) AS $db) {
        if ($ourdb[$db]['havedriver']) {
-               $DefaultDBtype = $db;
+               if ( $DefaultDBtype == '' ) {
+                       $DefaultDBtype = $db;
+               }
                print "  ".$ourdb[$db]['fullname'];
        }
 }
 print "</li>\n";
-if (count($phpdatabases) != 1)
-       $DefaultDBtype = '';
 
-if( ini_get( "register_globals" ) ) {
+if( wfIniGetBool( "register_globals" ) ) {
        ?>
        <li>
                <div style="font-size:110%">
@@ -294,7 +339,7 @@ if( ini_get( "register_globals" ) ) {
 
 $fatal = false;
 
-if( ini_get( "magic_quotes_runtime" ) ) {
+if( wfIniGetBool( "magic_quotes_runtime" ) ) {
        $fatal = true;
        ?><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>
        This option corrupts data input unpredictably; you cannot install or use
@@ -302,7 +347,7 @@ if( ini_get( "magic_quotes_runtime" ) ) {
        <?php
 }
 
-if( ini_get( "magic_quotes_sybase" ) ) {
+if( wfIniGetBool( "magic_quotes_sybase" ) ) {
        $fatal = true;
        ?><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>
        This option corrupts data input unpredictably; you cannot install or use
@@ -310,7 +355,7 @@ if( ini_get( "magic_quotes_sybase" ) ) {
        <?php
 }
 
-if( ini_get( "mbstring.func_overload" ) ) {
+if( wfIniGetBool( "mbstring.func_overload" ) ) {
        $fatal = true;
        ?><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>
        This option causes errors and may corrupt data unpredictably;
@@ -318,11 +363,20 @@ if( ini_get( "mbstring.func_overload" ) ) {
        <?php
 }
 
+if( wfIniGetBool( "zend.ze1_compatibility_mode" ) ) {
+       $fatal = true;
+       ?><li class="error"><strong>Fatal: <a href="http://www.php.net/manual/en/ini.core.php">zend.ze1_compatibility_mode</a> is active!</strong>
+       This option causes horrible bugs with MediaWiki; you cannot install or use
+       MediaWiki unless this option is disabled.
+       <?php
+}
+
+
 if( $fatal ) {
        dieout( "</ul><p>Cannot install MediaWiki.</p>" );
 }
 
-if( ini_get( "safe_mode" ) ) {
+if( wfIniGetBool( "safe_mode" ) ) {
        $conf->safeMode = true;
        ?>
        <li><b class='error'>Warning:</b> <strong>PHP's
@@ -335,22 +389,12 @@ if( ini_get( "safe_mode" ) ) {
 }
 
 $sapi = php_sapi_name();
-$conf->prettyURLs = true;
 print "<li>PHP server API is $sapi; ";
-switch( $sapi ) {
-case "apache":
-case "apache2handler":
-       print "ok, using pretty URLs (<tt>index.php/Page_Title</tt>)";
-       break;
-default:
-       print "unknown; ";
-case "cgi":
-case "cgi-fcgi":
-case "apache2filter":
-case "isapi":
-       print "using ugly URLs (<tt>index.php?title=Page_Title</tt>)";
-       $conf->prettyURLs = false;
-       break;
+$script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
+if( $wgUsePathInfo ) {
+ print "ok, using pretty URLs (<tt>$script/Page_Title</tt>)";
+} else {
+       print "using ugly URLs (<tt>$script?title=Page_Title</tt>)";
 }
 print "</li>\n";
 
@@ -363,20 +407,41 @@ if( $conf->xml ) {
                If you're running Mandrake, install the php-xml package." );
 }
 
-# Crude check for session support
+# Check for session support
 if( !function_exists( 'session_name' ) )
        dieout( "PHP's session module is missing. MediaWiki requires session support in order to function." );
 
-# Likewise for PCRE
+# session.save_path doesn't *have* to be set, but if it is, and it's
+# not valid/writable/etc. then it can cause problems
+$sessionSavePath = mw_get_session_save_path();
+$ssp = htmlspecialchars( $sessionSavePath );
+# Warn the user if it's not set, but let them proceed
+if( !$sessionSavePath ) {
+       print "<li><strong>Warning:</strong> A value for <tt>session.save_path</tt>
+       has not been set in PHP.ini. If the default value causes problems with
+       saving session data, set it to a valid path which is read/write/execute
+       for the user your web server is running under.</li>";
+} elseif ( is_dir( $sessionSavePath ) && is_writable( $sessionSavePath ) ) {
+       # All good? Let the user know
+       print "<li>Session save path (<tt>{$ssp}</tt>) appears to be valid.</li>";
+} else {
+       # Something not right? Warn the user, but let them proceed
+       print "<li><strong>Warning:</strong> Your <tt>session.save_path</tt> value (<tt>{$ssp}</tt>)
+               appears to be invalid or is not writable. PHP needs to be able to save data to
+               this location for correct session operation.</li>";
+}
+
+# Check for PCRE support
 if( !function_exists( 'preg_match' ) )
-       dieout( "The PCRE regular expression functions are missing. MediaWiki requires these in order to function." );
+       dieout( "The PCRE support module appears to be missing. MediaWiki requires the
+       Perl-compatible regular expression functions." );
 
 $memlimit = ini_get( "memory_limit" );
 $conf->raiseMemory = false;
 if( empty( $memlimit ) || $memlimit == -1 ) {
        print "<li>PHP is configured with no <tt>memory_limit</tt>.</li>\n";
 } else {
-       print "<li>PHP's <tt>memory_limit</tt> is " . htmlspecialchars( $memlimit ) . ". <strong>If this is too low, installation may fail!</strong> ";
+       print "<li>PHP's <tt>memory_limit</tt> is " . htmlspecialchars( $memlimit ) . ". ";
        $n = intval( $memlimit );
        if( preg_match( '/^([0-9]+)[Mm]$/', trim( $memlimit ), $m ) ) {
                $n = intval( $m[1] * (1024*1024) );
@@ -384,7 +449,7 @@ if( empty( $memlimit ) || $memlimit == -1 ) {
        if( $n < 20*1024*1024 ) {
                print "Attempting to raise limit to 20M... ";
                if( false === ini_set( "memory_limit", "20M" ) ) {
-                       print "failed.";
+                       print "failed.<br /><b>" . htmlspecialchars( $memlimit ) . " seems too low, installation may fail!</b>";
                } else {
                        $conf->raiseMemory = true;
                        print "ok.";
@@ -393,18 +458,15 @@ if( empty( $memlimit ) || $memlimit == -1 ) {
        print "</li>\n";
 }
 
-$conf->zlib = function_exists( "gzencode" );
-if( $conf->zlib ) {
-       print "<li>Have zlib support; enabling output compression.</li>\n";
-} else {
-       print "<li>No zlib support.</li>\n";
-}
-
 $conf->turck = function_exists( 'mmcache_get' );
 if ( $conf->turck ) {
        print "<li><a href=\"http://turck-mmcache.sourceforge.net/\">Turck MMCache</a> installed</li>\n";
 }
 
+$conf->xcache = function_exists( 'xcache_get' );
+if( $conf->xcache )
+       print "<li><a href=\"http://trac.lighttpd.net/xcache/\">XCache</a> installed</li>";
+
 $conf->apc = function_exists('apc_fetch');
 if ($conf->apc ) {
        print "<li><a href=\"http://www.php.net/apc\">APC</a> installed</li>";
@@ -416,14 +478,22 @@ if ( $conf->eaccel ) {
        print "<li><a href=\"http://eaccelerator.sourceforge.net/\">eAccelerator</a> installed</li>\n";
 }
 
-if( !$conf->turck && !$conf->eaccel && !$conf->apc ) {
+if( !( $conf->turck || $conf->eaccel || $conf->apc || $conf->xcache ) ) {
        echo( '<li>Couldn\'t find <a href="http://turck-mmcache.sourceforge.net">Turck MMCache</a>,
-               <a href="http://eaccelerator.sourceforge.net">eAccelerator</a> or
-               <a href="http://www.php.net/apc">APC</a>. Object caching functions cannot be used.</li>' );
+               <a href="http://eaccelerator.sourceforge.net">eAccelerator</a>,
+               <a href="http://www.php.net/apc">APC</a> or <a href="http://trac.lighttpd.net/xcache/">XCache</a>;
+               cannot use these for object caching.</li>' );
 }
 
 $conf->diff3 = false;
-$diff3locations = array( "/usr/bin", "/usr/local/bin", "/opt/csw/bin", "/usr/gnu/bin", "/usr/sfw/bin" ) + explode( $sep, getenv( "PATH" ) );
+$diff3locations = array_merge(
+       array(
+               "/usr/bin",
+               "/usr/local/bin",
+               "/opt/csw/bin",
+               "/usr/gnu/bin",
+               "/usr/sfw/bin" ),
+       explode( PATH_SEPARATOR, getenv( "PATH" ) ) );
 $diff3names = array( "gdiff3", "diff3", "diff3.exe" );
 
 $diff3versioninfo = array( '$1 --version 2>&1', 'diff3 (GNU diffutils)' );
@@ -444,7 +514,7 @@ $conf->ImageMagick = false;
 $imcheck = array( "/usr/bin", "/opt/csw/bin", "/usr/local/bin", "/sw/bin", "/opt/local/bin" );
 foreach( $imcheck as $dir ) {
        $im = "$dir/convert";
-       if( file_exists( $im ) ) {
+       if( @file_exists( $im ) ) {
                print "<li>Found ImageMagick: <tt>$im</tt>; image thumbnailing will be enabled if you enable uploads.</li>\n";
                $conf->ImageMagick = $im;
                break;
@@ -464,14 +534,32 @@ if( $conf->HaveGD ) {
        }
 }
 
-$conf->UseImageResize = $conf->HaveGD || $conf->ImageMagick;
-
 $conf->IP = dirname( dirname( __FILE__ ) );
 print "<li>Installation directory: <tt>" . htmlspecialchars( $conf->IP ) . "</tt></li>\n";
 
-$conf->ScriptPath = preg_replace( '{^(.*)/config.*$}', '$1', $_SERVER["PHP_SELF"] ); # was SCRIPT_NAME
+
+// PHP_SELF isn't available sometimes, such as when PHP is CGI but
+// cgi.fix_pathinfo is disabled. In that case, fall back to SCRIPT_NAME
+// to get the path to the current script... hopefully it's reliable. SIGH
+$path = ($_SERVER["PHP_SELF"] === '')
+       ? $_SERVER["SCRIPT_NAME"]
+       : $_SERVER["PHP_SELF"];
+
+$conf->ScriptPath = preg_replace( '{^(.*)/config.*$}', '$1', $path );
 print "<li>Script URI path: <tt>" . htmlspecialchars( $conf->ScriptPath ) . "</tt></li>\n";
 
+
+
+// We may be installing from *.php5 extension file, if so, print message
+$conf->ScriptExtension = '.php';
+if (defined('MW_INSTALL_PHP5_EXT')) {
+    $conf->ScriptExtension = '.php5';
+    print "<li>Installing MediaWiki with <tt>php5</tt> file extensions</li>\n";
+} else {
+    print "<li>Installing MediaWiki with <tt>php</tt> file extensions</li>\n";
+}
+
+
 print "<li style='font-weight:bold;color:green;font-size:110%'>Environment checked. You can install MediaWiki.</li>\n";
        $conf->posted = ($_SERVER["REQUEST_METHOD"] == "POST");
 
@@ -493,12 +581,15 @@ print "<li style='font-weight:bold;color:green;font-size:110%'>Environment check
        $conf->SysopPass = importPost( "SysopPass" );
        $conf->SysopPass2 = importPost( "SysopPass2" );
        $conf->RootUser = importPost( "RootUser", "root" );
-       $conf->RootPW = importPost( "RootPW", "-" );
+       $conf->RootPW = importPost( "RootPW", "" );
+       $useRoot = importCheck( 'useroot', false );
+       $conf->LanguageCode = importPost( "LanguageCode", "en" );
 
        ## MySQL specific:
-       $conf->DBprefix     =  importPost( "DBprefix" );
-       $conf->DBmysql5     = (importPost( "DBmysql5" ) == "true") ? "true" : "false";
-       $conf->LanguageCode =  importPost( "LanguageCode", "en" );
+       $conf->DBprefix     = importPost( "DBprefix" );
+       $conf->setSchema( 
+               importPost( "DBschema", "mysql4" ), 
+               importPost( "DBengine", "InnoDB" ) );
 
        ## Postgres specific:
        $conf->DBport      = importPost( "DBport",      "5432" );
@@ -514,7 +605,10 @@ if( $conf->Sitename == "" || $conf->Sitename == "MediaWiki" || $conf->Sitename =
 if( $conf->DBuser == "" ) {
        $errs["DBuser"] = "Must not be blank";
 }
-if( $conf->DBpassword == "" ) {
+if( ($conf->DBtype == 'mysql') && (strlen($conf->DBuser) > 16) ) {
+       $errs["DBuser"] = "Username too long";
+}
+if( $conf->DBpassword == "" && $conf->DBtype != "postgres" ) {
        $errs["DBpassword"] = "Must not be blank";
 }
 if( $conf->DBpassword != $conf->DBpassword2 ) {
@@ -524,11 +618,47 @@ if( !preg_match( '/^[A-Za-z_0-9]*$/', $conf->DBprefix ) ) {
        $errs["DBprefix"] = "Invalid table prefix";
 }
 
-if( $conf->SysopPass == "" ) {
-       $errs["SysopPass"] = "Must not be blank";
-}
-if( $conf->SysopPass != $conf->SysopPass2 ) {
-       $errs["SysopPass2"] = "Passwords don't match!";
+error_reporting( E_ALL );
+
+/**
+ * Initialise $wgLang and $wgContLang to something so we can
+ * call case-folding methods. Per Brion, this is English for
+ * now, although we could be clever and initialise to the
+ * user-selected language.
+ */
+$wgContLang = Language::factory( 'en' );
+$wgLang = $wgContLang;
+
+/**
+ * We're messing about with users, so we need a stub
+ * authentication plugin...
+ */
+$wgAuth = new AuthPlugin();
+
+/**
+ * Validate the initial administrator account; username,
+ * password checks, etc.
+ */
+if( $conf->SysopName ) {
+       # Check that the user can be created
+       $u = User::newFromName( $conf->SysopName );
+       if( is_a($u, 'User') ) { // please do not use instanceof, it breaks PHP4
+               # Various password checks
+               if( $conf->SysopPass != '' ) {
+                       if( $conf->SysopPass == $conf->SysopPass2 ) {
+                               if( !$u->isValidPassword( $conf->SysopPass ) ) {
+                                       $errs['SysopPass'] = "Bad password";
+                               }
+                       } else {
+                               $errs['SysopPass2'] = "Passwords don't match";
+                       }
+               } else {
+                       $errs['SysopPass'] = "Cannot be blank";
+               }
+               unset( $u );
+       } else {
+               $errs['SysopName'] = "Bad username";
+       }
 }
 
 $conf->License = importRequest( "License", "none" );
@@ -536,7 +666,7 @@ if( $conf->License == "gfdl" ) {
        $conf->RightsUrl = "http://www.gnu.org/copyleft/fdl.html";
        $conf->RightsText = "GNU Free Documentation License 1.2";
        $conf->RightsCode = "gfdl";
-       $conf->RightsIcon = '${wgStylePath}/common/images/gnu-fdl.png';
+       $conf->RightsIcon = '${wgScriptPath}/skins/common/images/gnu-fdl.png';
 } elseif( $conf->License == "none" ) {
        $conf->RightsUrl = $conf->RightsText = $conf->RightsCode = $conf->RightsIcon = "";
 } else {
@@ -576,12 +706,22 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
 
                /* Load up the settings and get installin' */
                $local = writeLocalSettings( $conf );
+               echo "<li style=\"list-style: none\">\n";
                echo "<p><b>Generating configuration file...</b></p>\n";
-               // for debugging: // echo "<pre>" . htmlspecialchars( $local ) . "</pre>\n";
-               
+               echo "</li>\n";         
+
                $wgCommandLineMode = false;
                chdir( ".." );
-               eval($local);
+               $ok = eval( $local );
+               if( $ok === false ) {
+                       dieout( "Errors in generated configuration; " .
+                               "most likely due to a bug in the installer... " .
+                               "Config file was: " .
+                               "<pre>" .
+                               htmlspecialchars( $local ) .
+                               "</pre>" .
+                               "</ul>" );
+               }
                $conf->DBtypename = '';
                foreach (array_keys($ourdb) as $db) {
                        if ($conf->DBtype === $db)
@@ -612,11 +752,9 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
 
                $wgCommandLineMode = true;
                $wgUseDatabaseMessages = false; /* FIXME: For database failure */
-               require_once( "includes/Setup.php" );
+               require_once( "$IP/includes/Setup.php" );
                chdir( "config" );
 
-               require_once( "maintenance/InitialiseMessages.inc" );
-
                $wgTitle = Title::newFromText( "Installation script" );
                error_reporting( E_ALL );
                print "<li>Loading class: $dbclass";
@@ -631,20 +769,17 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                                        >http://dev.mysql.com/doc/mysql/en/old-client.html</a> for help.</b></li>\n";
                        }
                        $ok = true; # Let's be optimistic
-                       
+
                        # Decide if we're going to use the superuser or the regular database user
-                       if( $conf->RootPW == '-' ) {
-                               # Regular user
-                               $conf->Root = false;
-                               $db_user = $wgDBuser;
-                               $db_pass = $wgDBpassword;
-                       } else {
-                               # Superuser
-                               $conf->Root = true;
+                       $conf->Root = $useRoot;
+                       if( $conf->Root ) {
                                $db_user = $conf->RootUser;
                                $db_pass = $conf->RootPW;
+                       } else {
+                               $db_user = $wgDBuser;
+                               $db_pass = $wgDBpassword;
                        }
-                       
+
                        # Attempt to connect
                        echo( "<li>Attempting to connect to database server as $db_user..." );
                        $wgDatabase = Database::newFromParams( $wgDBserver, $db_user, $db_pass, '', 1 );
@@ -686,14 +821,14 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                                                break;
                                } # switch
                        } #conn. att.
-               
+
                        if( !$ok ) { continue; }
 
                } else /* not mysql */ {
                        error_reporting( E_ALL );
                        $wgSuperUser = '';
                        ## Possible connect as a superuser
-                       if( $conf->RootPW != '-' and strlen($conf->RootPW)) {
+                       if( $useRoot ) {
                                $wgDBsuperuser = $conf->RootUser;
                                echo( "<li>Attempting to connect to database \"postgres\" as superuser \"$wgDBsuperuser\"..." );
                                $wgDatabase = $dbc->newFromParams($wgDBserver, $wgDBsuperuser, $conf->RootPW, "postgres", 1);
@@ -704,6 +839,7 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                                        $errs["RootPW"] = "and password";
                                        continue;
                                }
+                               $wgDatabase->initial_setup($conf->RootPW, 'postgres');
                        }
                        echo( "<li>Attempting to connect to database \"$wgDBname\" as \"$wgDBuser\"..." );
                        $wgDatabase = $dbc->newFromParams($wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1);
@@ -712,6 +848,7 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                        } else {
                                $myver = $wgDatabase->getServerVersion();
                        }
+                       $wgDatabase->initial_setup('', $wgDBname);
                }
 
                if ( !$wgDatabase->isOpen() ) {
@@ -746,11 +883,16 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                                print "<li>Database <tt>" . htmlspecialchars( $wgDBname ) . "</tt> exists</li>\n";
                        } else {
                                $err = mysql_errno();
-                               if ( $err != 1049 ) {
-                                       print "<ul><li>Error selecting database $wgDBname: $err " .
-                                               htmlspecialchars( mysql_error() ) . "</li></ul>";
+                               $databaseSafe = htmlspecialchars( $wgDBname );
+                               if( $err == 1102 /* Invalid database name */ ) {
+                                       print "<ul><li><strong>{$databaseSafe}</strong> is not a valid database name.</li></ul>";
+                                       continue;
+                               } elseif( $err != 1049 /* Database doesn't exist */ ) {
+                                       print "<ul><li>Error selecting database <strong>{$databaseSafe}</strong>: {$err} ";
+                                       print htmlspecialchars( mysql_error() ) . "</li></ul>";
                                        continue;
                                }
+                               print "<li>Attempting to create database...</li>";
                                $res = $wgDatabase->query( "CREATE DATABASE `$wgDBname`" );
                                if( !$res ) {
                                        print "<li>Couldn't create database <tt>" .
@@ -772,41 +914,93 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                if( $wgDatabase->tableExists( "cur" ) || $wgDatabase->tableExists( "revision" ) ) {
                        print "<li>There are already MediaWiki tables in this database. Checking if updates are needed...</li>\n";
 
-                       # Create user if required (todo: other databases)
-                       if ( $conf->Root && $conf->DBtype == 'mysql') {
-                               $conn = $dbc->newFromParams( $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1 );
-                               if ( $conn->isOpen() ) {
-                                       print "<li>DB user account ok</li>\n";
-                                       $conn->close();
-                               } else {
-                                       print "<li>Granting user permissions...";
-                                       if( $mysqlOldClient && $mysqlNewAuth ) {
-                                               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>";
+                       if ( $conf->DBtype == 'mysql') {
+                               # Determine existing default character set
+                               if ( $wgDatabase->tableExists( "revision" ) ) {
+                                       $revision = $wgDatabase->escapeLike( $conf->DBprefix . 'revision' );
+                                       $res = $wgDatabase->query( "SHOW TABLE STATUS LIKE '$revision'" );
+                                       $row = $wgDatabase->fetchObject( $res );
+                                       if ( !$row ) {
+                                               echo "<li>SHOW TABLE STATUS query failed!</li>\n";
+                                               $existingSchema = false;
+                                               $existingEngine = false;
+                                       } else {
+                                               if ( preg_match( '/^latin1/', $row->Collation ) ) {
+                                                       $existingSchema = 'mysql4';
+                                               } elseif ( preg_match( '/^utf8/', $row->Collation ) ) {
+                                                       $existingSchema = 'mysql5';
+                                               } elseif ( preg_match( '/^binary/', $row->Collation ) ) {
+                                                       $existingSchema = 'mysql5-binary';
+                                               } else {
+                                                       $existingSchema = false;
+                                                       echo "<li><strong>Warning:</strong> Unrecognised existing collation</li>\n";
+                                               }
+                                               if ( isset( $row->Engine ) ) {
+                                                       $existingEngine = $row->Engine;
+                                               } else {
+                                                       $existingEngine = $row->Type;
+                                               }
+                                       }
+                                       if ( $existingSchema && $existingSchema != $conf->DBschema ) {
+                                               print "<li><strong>Warning:</strong> you requested the {$conf->DBschema} schema, " .
+                                                       "but the existing database has the $existingSchema schema. This upgrade script ". 
+                                                       "can't convert it, so it will remain $existingSchema.</li>\n";
+                                               $conf->setSchema( $existingSchema, $conf->DBengine );
+                                       }
+                                       if ( $existingEngine && $existingEngine != $conf->DBengine ) {
+                                               print "<li><strong>Warning:</strong> you requested the {$conf->DBengine} storage " .
+                                                       "engine, but the existing database uses the $existingEngine engine. This upgrade " .
+                                                       "script can't convert it, so it will remain $existingEngine.</li>\n";
+                                               $conf->setSchema( $conf->DBschema, $existingEngine );
+                                       }
+                               }
+
+                               # Create user if required
+                               if ( $conf->Root ) {
+                                       $conn = $dbc->newFromParams( $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1 );
+                                       if ( $conn->isOpen() ) {
+                                               print "<li>DB user account ok</li>\n";
+                                               $conn->close();
+                                       } else {
+                                               print "<li>Granting user permissions...";
+                                               if( $mysqlOldClient && $mysqlNewAuth ) {
+                                                       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>";
+                                               }
+                                               print "</li>\n";
+                                               dbsource( "../maintenance/users.sql", $wgDatabase );
                                        }
-                                       print "</li>\n";
-                                       dbsource( "../maintenance/users.sql", $wgDatabase );
                                }
                        }
-                       if ( $conf->DBtype == 'mysql') {
-                               print "<pre>\n";
-                               chdir( ".." );
-                               flush();
-                               do_all_updates();
-                               chdir( "config" );
-                               print "</pre>\n";
-                       }
-                       print "<li>Finished update checks.</li>\n";
+                       print "</ul><pre>\n";
+                       chdir( ".." );
+                       flush();
+                       do_all_updates();
+                       chdir( "config" );
+                       print "</pre>\n";
+                       print "<ul><li>Finished update checks.</li>\n";
                } else {
+                       # Determine available storage engines if possible
+                       if ( $conf->DBtype == 'mysql' && version_compare( $myver, "4.1.2", "ge" ) ) {
+                               $res = $wgDatabase->query( 'SHOW ENGINES' );
+                               $found = false;
+                               while ( $row = $wgDatabase->fetchObject( $res ) ) {
+                                       if ( $row->Engine == $conf->DBengine ) {
+                                               $found = true;
+                                               break;
+                                       }
+                               }
+                               $wgDatabase->freeResult( $res );
+                               if ( !$found && $conf->DBengine != 'MyISAM' ) {
+                                       echo "<li><strong>Warning:</strong> {$conf->DBengine} storage engine not available, " .
+                                               "using MyISAM instead</li>\n";
+                                       $conf->setSchema( $conf->DBschema, 'MyISAM' );
+                               }
+                       }
+
                        # FIXME: Check for errors
                        print "<li>Creating tables...";
                        if ($conf->DBtype == 'mysql') {
-                               if( $wgDBmysql5 ) {
-                                       print " using MySQL 5 table defs...";
-                                       dbsource( "../maintenance/mysql5/tables.sql", $wgDatabase );
-                               } else {
-                                       print " using MySQL 4 table defs...";
-                                       dbsource( "../maintenance/tables.sql", $wgDatabase );
-                               }
+                               dbsource( "../maintenance/tables.sql", $wgDatabase );
                                dbsource( "../maintenance/interwiki.sql", $wgDatabase );
                        } else if ($conf->DBtype == 'postgres') {
                                $wgDatabase->setup_database();
@@ -818,12 +1012,16 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
 
                        print " done.</li>\n";
 
-                       print "<li>Initializing data...";
+                       print "<li>Initializing statistics...</li>\n";
                        $wgDatabase->insert( 'site_stats',
                                array ( 'ss_row_id'        => 1,
                                                'ss_total_views'   => 0,
-                                               'ss_total_edits'   => 0,
-                                               'ss_good_articles' => 0 ) );
+                                               'ss_total_edits'   => 1, # Main page first edit
+                                               'ss_good_articles' => 0, # Main page is not a good article - no internal link
+                                               'ss_total_pages'   => 1, # Main page
+                                               'ss_users'         => $conf->SysopName ? 1 : 0, # Sysop account, if created
+                                               'ss_admins'        => $conf->SysopName ? 1 : 0, # Sysop account, if created
+                                               'ss_images'        => 0 ) );
 
                        # Set up the "regular user" account *if we can, and if we need to*
                        if( $conf->Root and $conf->DBtype == 'mysql') {
@@ -832,18 +1030,21 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                                if( $wgDatabase2->isOpen() ) {
                                        # Nope, just close the test connection and continue
                                        $wgDatabase2->close();
-                                       echo( "<li>User $wgDBuser exists. Skipping grants.</li>" );
+                                       echo( "<li>User $wgDBuser exists. Skipping grants.</li>\n" );
                                } else {
                                        # Yes, so run the grants
                                        echo( "<li>Granting user permissions to $wgDBuser on $wgDBname..." );
                                        dbsource( "../maintenance/users.sql", $wgDatabase );
-                                       echo( "success.</li>" );
+                                       echo( "success.</li>\n" );
                                }
                        }
 
                        if( $conf->SysopName ) {
                                $u = User::newFromName( $conf->getSysopName() );
-                               if ( 0 == $u->idForName() ) {
+                               if ( !$u ) {
+                                       print "<li><strong class=\"error\">Warning:</strong> Skipped sysop account creation - invalid username!</li>\n";
+                               }
+                               else if ( 0 == $u->idForName() ) {
                                        $u->addToDatabase();
                                        $u->setPassword( $conf->getSysopPass() );
                                        $u->saveSettings();
@@ -865,20 +1066,19 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                        $newid = $article->insertOn( $wgDatabase );
                        $revision = new Revision( array(
                                'page'      => $newid,
-                               'text'      => wfMsg( 'mainpagetext' ) . "\n\n" . wfMsg( 'mainpagedocfooter' ),
+                               'text'      => wfMsg( 'mainpagetext' ) . "\n\n" . wfMsgNoTrans( 'mainpagedocfooter' ),
                                'comment'   => '',
                                'user'      => 0,
                                'user_text' => 'MediaWiki default',
                                ) );
                        $revid = $revision->insertOn( $wgDatabase );
                        $article->updateRevisionOn( $wgDatabase, $revision );
-
-                       initialiseMessages( false, false, 'printListItem' );
                }
 
                /* Write out the config file now that all is well */
+               print "<li style=\"list-style: none\">\n";
                print "<p>Creating LocalSettings.php...</p>\n\n";
-               $localSettings = "<" . "?php$endl$local$endl?" . ">\r\n";
+               $localSettings = "<" . "?php$endl$local";
                // Fix up a common line-ending problem (due to CVS on Windows)
                $localSettings = str_replace( "\r\n", "\n", $localSettings );
                $f = fopen( "LocalSettings.php", 'xt' );
@@ -890,11 +1090,12 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                }
                if(fwrite( $f, $localSettings ) ) {
                        fclose( $f );
+                       print "</li></ul><hr/>\n";
                        writeSuccessMessage();
                } else {
                        fclose( $f );
                        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");
-
+                       print "</li></ul>\n";
                }
 
        } while( false );
@@ -913,7 +1114,7 @@ if( count( $errs ) ) {
        }
 ?>
 
-<form action="index.php" name="config" method="post">
+<form action="<?php echo defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php'; ?>" name="config" method="post">
 
 
 <h2>Site config</h2>
@@ -952,7 +1153,7 @@ if( count( $errs ) ) {
                </select>
        </div>
        <p class="config-desc">
-               Select the language for your wiki's interface. Some localizations aren't fully complete. Unicode (UTF-8) used for all localizations.
+               Select the language for your wiki's interface. Some localizations aren't fully complete. Unicode (UTF-8) is used for all localizations.
        </p>
 
        <div class="config-input">
@@ -964,14 +1165,15 @@ if( count( $errs ) ) {
                <li><?php
                        aField( $conf, "License", "A Creative Commons license - ", "radio", "cc" );
                        $partner = "MediaWiki";
-                       $exit = urlencode( "$wgServer{$conf->ScriptPath}/config/index.php?License=cc&RightsUrl=[license_url]&RightsText=[license_name]&RightsCode=[license_code]&RightsIcon=[license_button]" );
+   $script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
+                       $exit = urlencode( "$wgServer{$conf->ScriptPath}/config/$script?License=cc&RightsUrl=[license_url]&RightsText=[license_name]&RightsCode=[license_code]&RightsIcon=[license_button]" );
                        $icon = urlencode( "$wgServer$wgUploadPath/wiki.png" );
                        $ccApp = htmlspecialchars( "http://creativecommons.org/license/?partner=$partner&exit_url=$exit&partner_icon_url=$icon" );
                        print "<a href=\"$ccApp\" target='_blank'>choose</a>";
                        ?>
                <?php if( $conf->License == "cc" ) { ?>
                        <ul>
-                               <li><?php aField( $conf, "RightsIcon", "<img src=\"" . htmlspecialchars( $conf->RightsIcon ) . "\" alt='icon' />", "hidden" ); ?></li>
+                               <li><?php aField( $conf, "RightsIcon", "<img src=\"" . htmlspecialchars( $conf->RightsIcon ) . "\" alt='(Creative Commons icon)' />", "hidden" ); ?></li>
                                <li><?php aField( $conf, "RightsText", htmlspecialchars( $conf->RightsText ), "hidden" ); ?></li>
                                <li><?php aField( $conf, "RightsCode", "code: " . htmlspecialchars( $conf->RightsCode ), "hidden" ); ?></li>
                                <li><?php aField( $conf, "RightsUrl", "<a href=\"" . htmlspecialchars( $conf->RightsUrl ) . "\">" . htmlspecialchars( $conf->RightsUrl ) . "</a>", "hidden" ); ?></li>
@@ -995,8 +1197,10 @@ if( count( $errs ) ) {
                <?php aField( $conf, "SysopPass2", "Password confirm:", "password" ) ?>
        </div>
        <p class="config-desc">
-               An admin can lock/delete pages, block users from editing, and other maintenance tasks.<br />
+               An admin can lock/delete pages, block users from editing, and do other maintenance tasks.<br />
                A new account will be added only when creating a new wiki database.
+               <br /><br />
+               The password cannot be the same as the username.
        </p>
 
        <div class="config-input">
@@ -1010,6 +1214,11 @@ if( count( $errs ) ) {
                                aField( $conf, "Shm", "Turck MMCache", "radio", "turck" );
                                echo "</li>";
                        }
+                       if( $conf->xcache ) {
+                               echo( '<li>' );
+                               aField( $conf, 'Shm', 'XCache', 'radio', 'xcache' );
+                               echo( '</li>' );
+                       }
                        if ( $conf->apc ) {
                                echo "<li>";
                                aField( $conf, "Shm", "APC", "radio", "apc" );
@@ -1026,10 +1235,11 @@ if( count( $errs ) ) {
                <div style="clear:left"><?php aField( $conf, "MCServers", "Memcached servers:", "text" ) ?></div>
        </div>
        <p class="config-desc">
-               Using a shared memory system such as Turck MMCache, APC, eAccelerator, or Memcached 
-               will speed up MediaWiki significantly. Memcached is the best solution but needs to be
-               installed. Specify the server addresses and ports in a comma-separted list. Only
-               use Turck shared memory if the wiki will be running on a single Apache server.
+               An object caching system such as memcached will provide a significant performance boost,
+               but needs to be installed. Provide the server addresses and ports in a comma-separated list.
+               <br /><br />
+               MediaWiki can also detect and support eAccelerator, Turck MMCache, APC, and XCache, but
+               these should not be used if the wiki will be running on multiple application servers.
        </p>
 </div>
 
@@ -1044,7 +1254,7 @@ if( count( $errs ) ) {
                </ul>
        </div>
        <p class="config-desc">
-               Use this to disable all e-mail functions (password reminders, user-to-user e-mail and e-mail notifications)
+               Use this to disable all e-mail functions (password reminders, user-to-user e-mail, and e-mail notifications)
                if sending mail doesn't work on your server.
        </p>
 
@@ -1120,11 +1330,31 @@ if( count( $errs ) ) {
        <p class="config-desc">
                If you only have a single user account and database available,
                enter those here. If you have database root access (see below)
-               you can specify new accounts/databases to be created.
+               you can specify new accounts/databases to be created. This account 
+               will not be created if it pre-exists. If this is the case, ensure that it
+               has SELECT, INSERT, UPDATE, and DELETE permissions on the MediaWiki database.
        </p>
-       <p>
-               This account will not be created if it pre-exists. If this is the case, ensure that it
-               has SELECT, INSERT, UPDATE and DELETE permissions on the MediaWiki database.
+
+       <div class="config-input">
+               <label class="column">Superuser account:</label>
+               <input type="checkbox" name="useroot" id="useroot" <?php if( $useRoot ) { ?>checked="checked" <?php } ?>/>
+               &nbsp;<label for="useroot">Use superuser account</label>
+       </div>
+       <div class="config-input">
+               <?php
+               aField( $conf, "RootUser", "Superuser name:", "superuser" );
+               ?>
+       </div>
+       <div class="config-input">
+               <?php
+               aField( $conf, "RootPW", "Superuser password:", "password" );
+               ?>
+       </div>
+
+       <p class="config-desc">
+               If the database user specified above does not exist, or does not have access to create
+               the database (if needed) or tables within it, please check the box and provide details
+               of a superuser account, such as <strong>root</strong>, which does.
        </p>
 
        <?php database_switcher('mysql'); ?>
@@ -1133,17 +1363,30 @@ if( count( $errs ) ) {
        ?></div>
        <div class="config-desc">
                <p>If you need to share one database between multiple wikis, or
-               MediaWiki and another web application, you may choose to
+               between MediaWiki and another web application, you may choose to
                add a prefix to all the table names to avoid conflicts.</p>
 
                <p>Avoid exotic characters; something like <tt>mw_</tt> is good.</p>
        </div>
 
-       <div class="config-input"><label class="column">Database charset</label>
+       <div class="config-input"><label class="column">Storage Engine</label>
+               <div>Select one:</div>
+               <ul class="plain">
+               <li><?php aField( $conf, "DBengine", "InnoDB", "radio", "InnoDB" ); ?></li>
+               <li><?php aField( $conf, "DBengine", "MyISAM", "radio", "MyISAM" ); ?></li>
+               </ul>
+       </div>
+       <p class="config-desc">
+               InnoDB is best for public web installations, since it has good concurrency 
+               support. MyISAM may be faster in single-user installations. MyISAM databases 
+               tend to get corrupted more often than InnoDB databases.
+       </p>
+       <div class="config-input"><label class="column">Database character set</label>
                <div>Select one:</div>
                <ul class="plain">
-               <li><?php aField( $conf, "DBmysql5", "Backwards-compatible UTF-8", "radio", "false" ); ?></li>
-               <li><?php aField( $conf, "DBmysql5", "Experimental MySQL 4.1/5.0 UTF-8", "radio", "true" ); ?></li>
+               <li><?php aField( $conf, "DBschema", "Backwards-compatible UTF-8", "radio", "mysql4" ); ?></li>
+               <li><?php aField( $conf, "DBschema", "Experimental MySQL 4.1/5.0 UTF-8", "radio", "mysql5" ); ?></li>
+               <li><?php aField( $conf, "DBschema", "Experimental MySQL 4.1/5.0 binary", "radio", "mysql5-binary" ); ?></li>
                </ul>
        </div>
        <p class="config-desc">
@@ -1165,27 +1408,11 @@ if( count( $errs ) ) {
                aField( $conf, "DBts2schema", "Schema for tsearch2:" );
        ?></div>
        <div class="config-desc">
-               <p>The username specified above will have it's search path set to the above schemas, 
-               so it is recommended that you create a new user.</p>
-       </div>
+               <p>The username specified above (at "DB username") will have its search path set to the above schemas, 
+               so it is recommended that you create a new user. The above schemas are generally correct: 
+        only change them if you are sure you need to.</p>
        </div>
-
-       <div class="config-input">
-               <?php
-               aField( $conf, "RootUser", "Superuser account:", "superuser" );
-               ?>
-       </div>
-       <div class="config-input">
-               <?php
-               aField( $conf, "RootPW", "Superuser password:", "password" );
-               ?>
-       </div>
-       
-       <p class="config-desc">
-               If the database user specified above does not exist, or does not have access to create
-               the database (if needed) or tables within it, please provide details of a superuser account,
-               such as <strong>root</strong>, which does. Leave the password set to <strong>-</strong> if this is not needed.
-       </p>
+       </fieldset>
 
        <div class="config-input" style="padding:2em 0 3em">
                <label class='column'>&nbsp;</label>
@@ -1209,24 +1436,35 @@ window.onload = toggleDBarea('<?php echo $conf->DBtype; ?>',
 
 /* -------------------------------------------------------------------------------------- */
 function writeSuccessMessage() {
-       if ( ini_get( 'safe_mode' ) && !ini_get( 'open_basedir' ) ) {
+ $script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
+       if ( wfIniGetBool( 'safe_mode' ) && !ini_get( 'open_basedir' ) ) {
                echo <<<EOT
+<div class="success-box">
 <p>Installation successful!</p>
 <p>To complete the installation, please do the following:
 <ol>
        <li>Download config/LocalSettings.php with your FTP client or file manager</li>
        <li>Upload it to the parent directory</li>
        <li>Delete config/LocalSettings.php</li>
-       <li>Start using <a href='../index.php'>your wiki</a>!
+       <li>Start using <a href='../$script'>your wiki</a>!
 </ol>
 <p>If you are in a shared hosting environment, do <strong>not</strong> just move LocalSettings.php
 remotely. LocalSettings.php is currently owned by the user your webserver is running under,
 which means that anyone on the same server can read your database password! Downloading
 it and uploading it again will hopefully change the ownership to a user ID specific to you.</p>
+</div>
 EOT;
        } else {
-               echo "<p>Installation successful! Move the config/LocalSettings.php file into the parent directory, then follow
-                       <a href='../index.php'>this link</a> to your wiki.</p>\n";
+               echo <<<EOT
+<div class="success-box">
+<p>
+<span class="success-message">Installation successful!</span>
+Move the <tt>config/LocalSettings.php</tt> file to the parent directory, then follow
+<a href="../$script"> this link</a> to your wiki.</p>
+<p>You should change file permissions for <tt>LocalSettings.php</tt> as required to
+prevent other users on the server reading passwords and altering configuration data.</p>
+</div>
+EOT;
        }
 }
 
@@ -1244,13 +1482,9 @@ function escapePhpString( $string ) {
 }
 
 function writeLocalSettings( $conf ) {
-       $conf->UseImageResize = $conf->UseImageResize ? 'true' : 'false';
        $conf->PasswordSender = $conf->EmergencyContact;
-       $zlib = ($conf->zlib ? "" : "# ");
        $magic = ($conf->ImageMagick ? "" : "# ");
        $convert = ($conf->ImageMagick ? $conf->ImageMagick : "/usr/bin/convert" );
-       $pretty = ($conf->prettyURLs ? "" : "# ");
-       $ugly = ($conf->prettyURLs ? "# " : "");
        $rights = ($conf->RightsUrl) ? "" : "# ";
        $hashedUploads = $conf->safeMode ? '' : '# ';
 
@@ -1260,6 +1494,7 @@ function writeLocalSettings( $conf ) {
                        $mcservers = var_export( $conf->MCServerArray, true );
                        break;
                case 'turck':
+               case 'xcache':
                case 'apc':
                case 'eaccel':
                        $cacheType = 'CACHE_ACCEL';
@@ -1334,7 +1569,7 @@ if( defined( 'MW_INSTALL_PATH' ) ) {
 \$path = array( \$IP, \"\$IP/includes\", \"\$IP/languages\" );
 set_include_path( implode( PATH_SEPARATOR, \$path ) . PATH_SEPARATOR . get_include_path() );
 
-require_once( \"includes/DefaultSettings.php\" );
+require_once( \"\$IP/includes/DefaultSettings.php\" );
 
 # If PHP's memory limit is very low, some operations may fail.
 " . ($conf->raiseMemory ? '' : '# ' ) . "ini_set( 'memory_limit', '20M' );" . "
@@ -1343,29 +1578,19 @@ if ( \$wgCommandLineMode ) {
        if ( isset( \$_SERVER ) && array_key_exists( 'REQUEST_METHOD', \$_SERVER ) ) {
                die( \"This script must be run from the command line\\n\" );
        }
-} elseif ( empty( \$wgNoOutputBuffer ) ) {
-       ## Compress output if the browser supports it
-       {$zlib}if( !ini_get( 'zlib.output_compression' ) ) @ob_start( 'ob_gzhandler' );
 }
+## Uncomment this to disable output compression
+# \$wgDisableOutputCompression = true;
 
 \$wgSitename         = \"{$slconf['Sitename']}\";
 
+## The URL base path to the directory containing the wiki;
+## defaults for all runtime URL paths are based off of this.
 \$wgScriptPath       = \"{$slconf['ScriptPath']}\";
-\$wgScript           = \"\$wgScriptPath/index.php\";
-\$wgRedirectScript   = \"\$wgScriptPath/redirect.php\";
+\$wgScriptExtension  = \"{$slconf['ScriptExtension']}\";
 
 ## For more information on customizing the URLs please see:
-## http://meta.wikimedia.org/wiki/Eliminating_index.php_from_the_url
-## If using PHP as a CGI module, the ?title= style usually must be used.
-{$pretty}\$wgArticlePath      = \"\$wgScript/\$1\";
-{$ugly}\$wgArticlePath      = \"\$wgScript?title=\$1\";
-
-\$wgStylePath        = \"\$wgScriptPath/skins\";
-\$wgStyleDirectory   = \"\$IP/skins\";
-\$wgLogo             = \"\$wgStylePath/common/images/wiki.png\";
-
-\$wgUploadPath       = \"\$wgScriptPath/images\";
-\$wgUploadDirectory  = \"\$IP/images\";
+## http://www.mediawiki.org/wiki/Manual:Short_URL
 
 \$wgEnableEmail      = $enableemail;
 \$wgEnableUserEmail  = $enableuseremail;
@@ -1374,7 +1599,8 @@ if ( \$wgCommandLineMode ) {
 \$wgPasswordSender = \"{$slconf['PasswordSender']}\";
 
 ## For a detailed description of the following switches see
-## http://meta.wikimedia.org/Enotif and http://meta.wikimedia.org/Eauthent
+## http://www.mediawiki.org/wiki/Extension:Email_notification 
+## and http://www.mediawiki.org/wiki/Extension:Email_notification
 ## There are many more options for fine tuning available see
 ## /includes/DefaultSettings.php
 ## UPO means: this is also a user preference option
@@ -1382,17 +1608,26 @@ if ( \$wgCommandLineMode ) {
 \$wgEnotifWatchlist = $enotifwatchlist; # UPO
 \$wgEmailAuthentication = $eauthent;
 
+\$wgDBtype           = \"{$slconf['DBtype']}\";
 \$wgDBserver         = \"{$slconf['DBserver']}\";
 \$wgDBname           = \"{$slconf['DBname']}\";
 \$wgDBuser           = \"{$slconf['DBuser']}\";
 \$wgDBpassword       = \"{$slconf['DBpassword']}\";
+
+# MySQL specific settings
 \$wgDBprefix         = \"{$slconf['DBprefix']}\";
-\$wgDBtype           = \"{$slconf['DBtype']}\";
-\$wgDBport           = \"{$slconf['DBport']}\";
+
+# MySQL table options to use during installation or update
+\$wgDBTableOptions   = \"{$slconf['DBTableOptions']}\";
 
 # Experimental charset support for MySQL 4.1/5.0.
 \$wgDBmysql5 = {$conf->DBmysql5};
 
+# Postgres specific settings
+\$wgDBport           = \"{$slconf['DBport']}\";
+\$wgDBmwschema       = \"{$slconf['DBmwschema']}\";
+\$wgDBts2schema      = \"{$slconf['DBts2schema']}\";
+
 ## Shared memory settings
 \$wgMainCacheType = $cacheType;
 \$wgMemCachedServers = $mcservers;
@@ -1400,7 +1635,6 @@ if ( \$wgCommandLineMode ) {
 ## To enable image uploads, make sure the 'images' directory
 ## is writable, then set this to true:
 \$wgEnableUploads       = false;
-\$wgUseImageResize      = {$conf->UseImageResize};
 {$magic}\$wgUseImageMagick = true;
 {$magic}\$wgImageMagickConvertCommand = \"{$convert}\";
 
@@ -1413,9 +1647,6 @@ if ( \$wgCommandLineMode ) {
 ## If you have the appropriate support software installed
 ## you can enable inline LaTeX equations:
 \$wgUseTeX           = false;
-\$wgMathPath         = \"{\$wgUploadPath}/math\";
-\$wgMathDirectory    = \"{\$wgUploadDirectory}/math\";
-\$wgTmpDirectory     = \"{\$wgUploadDirectory}/tmp\";
 
 \$wgLocalInterwiki   = \$wgSitename;
 
@@ -1441,8 +1672,7 @@ if ( \$wgCommandLineMode ) {
 
 # When you make changes to this configuration file, this will make
 # sure that cached pages are cleared.
-\$configdate = gmdate( 'YmdHis', @filemtime( __FILE__ ) );
-\$wgCacheEpoch = max( \$wgCacheEpoch, \$configdate );
+\$wgCacheEpoch = max( \$wgCacheEpoch, gmdate( 'YmdHis', @filemtime( __FILE__ ) ) );
        "; ## End of setting the $localsettings string
 
        // Keep things in Unix line endings internally;
@@ -1470,6 +1700,10 @@ function importPost( $name, $default = "" ) {
        return importVar( $_POST, $name, $default );
 }
 
+function importCheck( $name ) {
+       return isset( $_POST[$name] );
+}
+
 function importRequest( $name, $default = "" ) {
        return importVar( $_REQUEST, $name, $default );
 }
@@ -1523,17 +1757,17 @@ function aField( &$conf, $field, $text, $type = "text", $value = "", $onclick =
 }
 
 function getLanguageList() {
-       global $wgLanguageNames;
+       global $wgLanguageNames, $IP;
        if( !isset( $wgLanguageNames ) ) {
-               require_once( "languages/Names.php" );
+               require_once( "$IP/languages/Names.php" );
        }
 
        $codes = array();
 
-       $d = opendir( "../languages" );
+       $d = opendir( "../languages/messages" );
        /* In case we are called from the root directory */
        if (!$d)
-               $d = opendir( "languages");
+               $d = opendir( "languages/messages");
        while( false !== ($f = readdir( $d ) ) ) {
                $m = array();
                if( preg_match( '/Messages([A-Z][a-z_]+)\.php$/', $f, $m ) ) {
@@ -1561,7 +1795,7 @@ function locate_executable($loc, $names, $versioninfo = false) {
 
        foreach ($names as $name) {
                $command = "$loc".DIRECTORY_SEPARATOR."$name";
-               if (file_exists($command)) {
+               if (@file_exists($command)) {
                        if (!$versioninfo)
                                return $command;
 
@@ -1635,8 +1869,7 @@ function database_switcher($db) {
        global $ourdb;
        $color = $ourdb[$db]['bgcolor'];
        $full = $ourdb[$db]['fullname'];
-       print "<div id='$db' style='display:none; background: $color'>\n";
-       print "<h3>$full specific options:</h3>\n";
+       print "<fieldset id='$db'><legend>$full specific options</legend>\n";
 }
 
 function printListItem( $item ) {
@@ -1682,7 +1915,7 @@ function printListItem( $item ) {
                        <li><a href="http://meta.wikipedia.org/wiki/MediaWiki_User's_Guide">User's Guide</a></li>
                        <li><a href="http://meta.wikimedia.org/wiki/MediaWiki_FAQ">FAQ</a></li>
                </ul>
-               <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>
+               <p style="font-size:90%;margin-top:1em">MediaWiki is Copyright &copy; 2001-2007 by Magnus Manske, Brion Vibber, Lee Daniel Crocker, Tim Starling, Erik M&ouml;ller, Gabriel Wicke and others.</p>
        </div></div>
 </div>