X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/19e297c21b10b1b8a3acad5e73fc71dcb35db44a..6932310fd58ebef145fa01eb76edf7150284d8ea:/includes/installer/WebInstallerExistingWiki.php diff --git a/includes/installer/WebInstallerExistingWiki.php b/includes/installer/WebInstallerExistingWiki.php new file mode 100644 index 00000000..df68be8e --- /dev/null +++ b/includes/installer/WebInstallerExistingWiki.php @@ -0,0 +1,191 @@ +getVar( '_UpgradeKeySupplied' ) + && $this->getVar( 'wgUpgradeKey' ) === $vars['wgUpgradeKey'] + ) { + // It's there, so the user is authorized + $status = $this->handleExistingUpgrade( $vars ); + if ( $status->isOK() ) { + return 'skip'; + } else { + $this->startForm(); + $this->parent->showStatusBox( $status ); + $this->endForm( 'continue' ); + + return 'output'; + } + } + + // If there is no $wgUpgradeKey, tell the user to add one to LocalSettings.php + if ( $vars['wgUpgradeKey'] === false ) { + if ( $this->getVar( 'wgUpgradeKey', false ) === false ) { + $secretKey = $this->getVar( 'wgSecretKey' ); // preserve $wgSecretKey + $this->parent->generateKeys(); + $this->setVar( 'wgSecretKey', $secretKey ); + $this->setVar( '_UpgradeKeySupplied', true ); + } + $this->startForm(); + $this->addHTML( $this->parent->getInfoBox( + wfMessage( 'config-upgrade-key-missing', "
\$wgUpgradeKey = '" .
+					$this->getVar( 'wgUpgradeKey' ) . "';
" )->plain() + ) ); + $this->endForm( 'continue' ); + + return 'output'; + } + + // If there is an upgrade key, but it wasn't supplied, prompt the user to enter it + + $r = $this->parent->request; + if ( $r->wasPosted() ) { + $key = $r->getText( 'config_wgUpgradeKey' ); + if ( !$key || $key !== $vars['wgUpgradeKey'] ) { + $this->parent->showError( 'config-localsettings-badkey' ); + $this->showKeyForm(); + + return 'output'; + } + // Key was OK + $status = $this->handleExistingUpgrade( $vars ); + if ( $status->isOK() ) { + return 'continue'; + } else { + $this->parent->showStatusBox( $status ); + $this->showKeyForm(); + + return 'output'; + } + } else { + $this->showKeyForm(); + + return 'output'; + } + } + + /** + * Show the "enter key" form + */ + protected function showKeyForm() { + $this->startForm(); + $this->addHTML( + $this->parent->getInfoBox( wfMessage( 'config-localsettings-upgrade' )->plain() ) . + '
' . + $this->parent->getTextBox( [ + 'var' => 'wgUpgradeKey', + 'label' => 'config-localsettings-key', + 'attribs' => [ 'autocomplete' => 'off' ], + ] ) + ); + $this->endForm( 'continue' ); + } + + /** + * @param string[] $names + * @param mixed[] $vars + * + * @return Status + */ + protected function importVariables( $names, $vars ) { + $status = Status::newGood(); + foreach ( $names as $name ) { + if ( !isset( $vars[$name] ) ) { + $status->fatal( 'config-localsettings-incomplete', $name ); + } + $this->setVar( $name, $vars[$name] ); + } + + return $status; + } + + /** + * Initiate an upgrade of the existing database + * + * @param mixed[] $vars Variables from LocalSettings.php + * + * @return Status + */ + protected function handleExistingUpgrade( $vars ) { + // Check $wgDBtype + if ( !isset( $vars['wgDBtype'] ) || + !in_array( $vars['wgDBtype'], Installer::getDBTypes() ) + ) { + return Status::newFatal( 'config-localsettings-connection-error', '' ); + } + + // Set the relevant variables from LocalSettings.php + $requiredVars = [ 'wgDBtype' ]; + $status = $this->importVariables( $requiredVars, $vars ); + $installer = $this->parent->getDBInstaller(); + $status->merge( $this->importVariables( $installer->getGlobalNames(), $vars ) ); + if ( !$status->isOK() ) { + return $status; + } + + if ( isset( $vars['wgDBadminuser'] ) ) { + $this->setVar( '_InstallUser', $vars['wgDBadminuser'] ); + } else { + $this->setVar( '_InstallUser', $vars['wgDBuser'] ); + } + if ( isset( $vars['wgDBadminpassword'] ) ) { + $this->setVar( '_InstallPassword', $vars['wgDBadminpassword'] ); + } else { + $this->setVar( '_InstallPassword', $vars['wgDBpassword'] ); + } + + // Test the database connection + $status = $installer->getConnection(); + if ( !$status->isOK() ) { + // Adjust the error message to explain things correctly + $status->replaceMessage( 'config-connection-error', + 'config-localsettings-connection-error' ); + + return $status; + } + + // All good + $this->setVar( '_ExistingDBSettings', true ); + + // Copy $wgAuthenticationTokenVersion too, if it exists + $this->setVar( 'wgAuthenticationTokenVersion', + isset( $vars['wgAuthenticationTokenVersion'] ) + ? $vars['wgAuthenticationTokenVersion'] + : null + ); + + return $status; + } + +}