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