Web installer: always autoselect some DB type
authorKevin Israel <pleasestand@live.com>
Tue, 23 Apr 2013 03:15:39 +0000 (23:15 -0400)
committerKevin Israel <pleasestand@live.com>
Tue, 23 Apr 2013 03:15:39 +0000 (23:15 -0400)
If the PHP mysql extension were not available, none of the DB type
radio buttons would be selected, and if the form were submitted
without selecting any of them, a PHP fatal error would occur
because of a lack of input validation.

So have the installer autoselect a DB type other than mysql if
necessary, and add a simple check to prevent a fatal error if all
radio buttons nevertheless end up deselected for some unknown reason.

Bug: 47489
Change-Id: Ic456899028c054a761d172df8ec32f6a26dc5b97

RELEASE-NOTES-1.21
includes/installer/WebInstallerPage.php

index 6c68d82..5adf80e 100644 (file)
@@ -209,6 +209,8 @@ production.
 * (bug 45143) jquery.badge: Treat non-Latin variants of zero as zero as well.
 * (bug 46151) mwdocgen.php should not ignore exit code of doxygen command.
 * (bug 41889) Fix $.tablesorter rowspan exploding for complex cases.
+* (bug 47489) Installer now automatically selects the next-best database type if
+  the PHP mysql extension is not loaded, preventing fatal errors in some cases.
 
 === API changes in 1.21 ===
 * prop=revisions can now report the contentmodel and contentformat.
index b640fb8..382288c 100644 (file)
@@ -467,7 +467,14 @@ class WebInstaller_DBConnect extends WebInstallerPage {
                $this->addHTML( $this->parent->getInfoBox(
                        wfMessage( 'config-support-info', trim( $dbSupport ) )->text() ) );
 
-               foreach ( $this->parent->getVar( '_CompiledDBs' ) as $type ) {
+               // It's possible that the library for the default DB type is not compiled in.
+               // In that case, instead select the first supported DB type in the list.
+               $compiledDBs = $this->parent->getVar( '_CompiledDBs' );
+               if ( !in_array( $defaultType, $compiledDBs ) ) {
+                       $defaultType = $compiledDBs[0];
+               }
+
+               foreach ( $compiledDBs as $type ) {
                        $installer = $this->parent->getDBInstaller( $type );
                        $types .=
                                '<li>' .
@@ -503,6 +510,9 @@ class WebInstaller_DBConnect extends WebInstallerPage {
        public function submit() {
                $r = $this->parent->request;
                $type = $r->getVal( 'DBType' );
+               if ( !$type ) {
+                       return Status::newFatal( 'config-invalid-db-type' );
+               }
                $this->setVar( 'wgDBtype', $type );
                $installer = $this->parent->getDBInstaller( $type );
                if ( !$installer ) {