Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 79
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
WebInstallerExistingWiki
0.00% covered (danger)
0.00%
0 / 79
0.00% covered (danger)
0.00%
0 / 4
462
0.00% covered (danger)
0.00%
0 / 1
 execute
0.00% covered (danger)
0.00%
0 / 41
0.00% covered (danger)
0.00%
0 / 1
156
 showKeyForm
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
2
 importVariables
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
12
 handleExistingUpgrade
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 1
30
1<?php
2
3/**
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 * http://www.gnu.org/copyleft/gpl.html
18 *
19 * @file
20 * @ingroup Installer
21 */
22
23namespace MediaWiki\Installer;
24
25use MediaWiki\Status\Status;
26
27class WebInstallerExistingWiki extends WebInstallerPage {
28
29    /**
30     * @return string
31     */
32    public function execute() {
33        // If there is no LocalSettings.php, continue to the installer welcome page
34        $vars = Installer::getExistingLocalSettings();
35        if ( !$vars ) {
36            return 'skip';
37        }
38
39        // Check if the upgrade key supplied to the user has appeared in LocalSettings.php
40        if ( $vars['wgUpgradeKey'] !== false
41            && $this->getVar( '_UpgradeKeySupplied' )
42            && $this->getVar( 'wgUpgradeKey' ) === $vars['wgUpgradeKey']
43        ) {
44            // It's there, so the user is authorized
45            $status = $this->handleExistingUpgrade( $vars );
46            if ( $status->isOK() ) {
47                return 'skip';
48            } else {
49                $this->startForm();
50                $this->parent->showStatusBox( $status );
51                $this->endForm( 'continue' );
52
53                return 'output';
54            }
55        }
56
57        // If there is no $wgUpgradeKey, tell the user to add one to LocalSettings.php
58        if ( $vars['wgUpgradeKey'] === false ) {
59            if ( $this->getVar( 'wgUpgradeKey', false ) === false ) {
60                $secretKey = $this->getVar( 'wgSecretKey' ); // preserve $wgSecretKey
61                $this->parent->generateKeys();
62                $this->setVar( 'wgSecretKey', $secretKey );
63                $this->setVar( '_UpgradeKeySupplied', true );
64            }
65            $this->startForm();
66            $this->addHTML( $this->parent->getInfoBox(
67                wfMessage( 'config-upgrade-key-missing', "<pre dir=\"ltr\">\$wgUpgradeKey = '" .
68                    $this->getVar( 'wgUpgradeKey' ) . "';</pre>" )->plain()
69            ) );
70            $this->endForm( 'continue' );
71
72            return 'output';
73        }
74
75        // If there is an upgrade key, but it wasn't supplied, prompt the user to enter it
76
77        $r = $this->parent->request;
78        if ( $r->wasPosted() ) {
79            $key = $r->getText( 'config_wgUpgradeKey' );
80            if ( !$key || $key !== $vars['wgUpgradeKey'] ) {
81                $this->parent->showError( 'config-localsettings-badkey' );
82                $this->showKeyForm();
83
84                return 'output';
85            }
86            // Key was OK
87            $status = $this->handleExistingUpgrade( $vars );
88            if ( $status->isOK() ) {
89                return 'continue';
90            } else {
91                $this->parent->showStatusBox( $status );
92                $this->showKeyForm();
93
94                return 'output';
95            }
96        } else {
97            $this->showKeyForm();
98
99            return 'output';
100        }
101    }
102
103    /**
104     * Show the "enter key" form
105     */
106    protected function showKeyForm() {
107        $this->startForm();
108        $this->addHTML(
109            $this->parent->getInfoBox( wfMessage( 'config-localsettings-upgrade' )->plain() ) .
110            '<br />' .
111            $this->parent->getTextBox( [
112                'var' => 'wgUpgradeKey',
113                'label' => 'config-localsettings-key',
114                'attribs' => [ 'autocomplete' => 'off' ],
115            ] )
116        );
117        $this->endForm( 'continue' );
118    }
119
120    /**
121     * @param string[] $names
122     * @param mixed[] $vars
123     *
124     * @return Status
125     */
126    protected function importVariables( $names, $vars ) {
127        $status = Status::newGood();
128        foreach ( $names as $name ) {
129            if ( !isset( $vars[$name] ) ) {
130                $status->fatal( 'config-localsettings-incomplete', $name );
131            }
132            $this->setVar( $name, $vars[$name] );
133        }
134
135        return $status;
136    }
137
138    /**
139     * Initiate an upgrade of the existing database
140     *
141     * @param mixed[] $vars Variables from LocalSettings.php
142     *
143     * @return Status
144     */
145    protected function handleExistingUpgrade( $vars ) {
146        // Check $wgDBtype
147        if ( !isset( $vars['wgDBtype'] ) ||
148            !in_array( $vars['wgDBtype'], Installer::getDBTypes() )
149        ) {
150            return Status::newFatal( 'config-localsettings-connection-error', '' );
151        }
152
153        // Set the relevant variables from LocalSettings.php
154        $requiredVars = [ 'wgDBtype' ];
155        $status = $this->importVariables( $requiredVars, $vars );
156        $installer = $this->parent->getDBInstaller();
157        $status->merge( $this->importVariables( $installer->getGlobalNames(), $vars ) );
158        if ( !$status->isOK() ) {
159            return $status;
160        }
161
162        $this->setVar( '_InstallUser', $vars['wgDBadminuser'] ?? $vars['wgDBuser'] );
163        $this->setVar( '_InstallPassword', $vars['wgDBadminpassword'] ?? $vars['wgDBpassword'] );
164
165        // Test the database connection
166        $status = $installer->getConnection();
167        if ( !$status->isOK() ) {
168            // Adjust the error message to explain things correctly
169            $status->replaceMessage( 'config-connection-error',
170                'config-localsettings-connection-error' );
171
172            return $status;
173        }
174
175        // All good
176        $this->setVar( '_ExistingDBSettings', true );
177
178        // Copy $wgAuthenticationTokenVersion too, if it exists
179        $this->setVar( 'wgAuthenticationTokenVersion',
180            $vars['wgAuthenticationTokenVersion'] ?? null
181        );
182
183        return $status;
184    }
185
186}