WebInstallerName::execute()   B
last analyzed

Complexity

Conditions 4
Paths 5

Size

Total Lines 109
Code Lines 68

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 68
c 0
b 0
f 0
nc 5
nop 0
dl 0
loc 109
rs 8.1935

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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 WebInstallerName extends WebInstallerPage {
23
24
	/**
25
	 * @return string
26
	 */
27
	public function execute() {
28
		$r = $this->parent->request;
29
		if ( $r->wasPosted() ) {
30
			if ( $this->submit() ) {
31
				return 'continue';
32
			}
33
		}
34
35
		$this->startForm();
36
37
		// Encourage people to not name their site 'MediaWiki' by blanking the
38
		// field. I think that was the intent with the original $GLOBALS['wgSitename']
39
		// but these two always were the same so had the effect of making the
40
		// installer forget $wgSitename when navigating back to this page.
41
		if ( $this->getVar( 'wgSitename' ) == 'MediaWiki' ) {
42
			$this->setVar( 'wgSitename', '' );
43
		}
44
45
		// Set wgMetaNamespace to something valid before we show the form.
46
		// $wgMetaNamespace defaults to $wgSiteName which is 'MediaWiki'
47
		$metaNS = $this->getVar( 'wgMetaNamespace' );
48
		$this->setVar(
49
			'wgMetaNamespace',
50
			wfMessage( 'config-ns-other-default' )->inContentLanguage()->text()
51
		);
52
53
		$pingbackInfo = ( new Pingback() )->getSystemInfo();
54
		// Database isn't available in config yet, so take it
55
		// from the installer
56
		$pingbackInfo['database'] = $this->getVar( 'wgDBtype' );
57
58
		$this->addHTML(
59
			$this->parent->getTextBox( [
60
				'var' => 'wgSitename',
61
				'label' => 'config-site-name',
62
				'help' => $this->parent->getHelpBox( 'config-site-name-help' )
63
			] ) .
64
			// getRadioSet() builds a set of labeled radio buttons.
65
			// For grep: The following messages are used as the item labels:
66
			// config-ns-site-name, config-ns-generic, config-ns-other
67
			$this->parent->getRadioSet( [
68
				'var' => '_NamespaceType',
69
				'label' => 'config-project-namespace',
70
				'itemLabelPrefix' => 'config-ns-',
71
				'values' => [ 'site-name', 'generic', 'other' ],
72
				'commonAttribs' => [ 'class' => 'enableForOther',
73
					'rel' => 'config_wgMetaNamespace' ],
74
				'help' => $this->parent->getHelpBox( 'config-project-namespace-help' )
75
			] ) .
76
			$this->parent->getTextBox( [
77
				'var' => 'wgMetaNamespace',
78
				'label' => '', // @todo Needs a label?
79
				'attribs' => [ 'readonly' => 'readonly', 'class' => 'enabledByOther' ]
80
			] ) .
81
			$this->getFieldsetStart( 'config-admin-box' ) .
82
			$this->parent->getTextBox( [
83
				'var' => '_AdminName',
84
				'label' => 'config-admin-name',
85
				'help' => $this->parent->getHelpBox( 'config-admin-help' )
86
			] ) .
87
			$this->parent->getPasswordBox( [
88
				'var' => '_AdminPassword',
89
				'label' => 'config-admin-password',
90
			] ) .
91
			$this->parent->getPasswordBox( [
92
				'var' => '_AdminPasswordConfirm',
93
				'label' => 'config-admin-password-confirm'
94
			] ) .
95
			$this->parent->getTextBox( [
96
				'var' => '_AdminEmail',
97
				'attribs' => [
98
					'dir' => 'ltr',
99
				],
100
				'label' => 'config-admin-email',
101
				'help' => $this->parent->getHelpBox( 'config-admin-email-help' )
102
			] ) .
103
			$this->parent->getCheckBox( [
104
				'var' => '_Subscribe',
105
				'label' => 'config-subscribe',
106
				'help' => $this->parent->getHelpBox( 'config-subscribe-help' )
107
			] ) .
108
			$this->parent->getCheckBox( [
109
				'var' => 'wgPingback',
110
				'label' => 'config-pingback',
111
				'help' => $this->parent->getHelpBox(
112
					'config-pingback-help',
113
					FormatJson::encode( $pingbackInfo, true )
114
				),
115
				'value' => true,
116
			] ) .
117
			$this->getFieldsetEnd() .
118
			$this->parent->getInfoBox( wfMessage( 'config-almost-done' )->text() ) .
119
			// getRadioSet() builds a set of labeled radio buttons.
120
			// For grep: The following messages are used as the item labels:
121
			// config-optional-continue, config-optional-skip
122
			$this->parent->getRadioSet( [
123
				'var' => '_SkipOptional',
124
				'itemLabelPrefix' => 'config-optional-',
125
				'values' => [ 'continue', 'skip' ]
126
			] )
127
		);
128
129
		// Restore the default value
130
		$this->setVar( 'wgMetaNamespace', $metaNS );
131
132
		$this->endForm();
133
134
		return 'output';
135
	}
136
137
	/**
138
	 * @return bool
139
	 */
140
	public function submit() {
141
		global $wgPasswordPolicy;
142
143
		$retVal = true;
144
		$this->parent->setVarsFromRequest( [ 'wgSitename', '_NamespaceType',
145
			'_AdminName', '_AdminPassword', '_AdminPasswordConfirm', '_AdminEmail',
146
			'_Subscribe', '_SkipOptional', 'wgMetaNamespace', 'wgPingback' ] );
147
148
		// Validate site name
149
		if ( strval( $this->getVar( 'wgSitename' ) ) === '' ) {
150
			$this->parent->showError( 'config-site-name-blank' );
151
			$retVal = false;
152
		}
153
154
		// Fetch namespace
155
		$nsType = $this->getVar( '_NamespaceType' );
156
		if ( $nsType == 'site-name' ) {
157
			$name = $this->getVar( 'wgSitename' );
158
			// Sanitize for namespace
159
			// This algorithm should match the JS one in WebInstallerOutput.php
160
			$name = preg_replace( '/[\[\]\{\}|#<>%+? ]/', '_', $name );
161
			$name = str_replace( '&', '&amp;', $name );
162
			$name = preg_replace( '/__+/', '_', $name );
163
			$name = ucfirst( trim( $name, '_' ) );
164
		} elseif ( $nsType == 'generic' ) {
165
			$name = wfMessage( 'config-ns-generic' )->text();
166
		} else { // other
167
			$name = $this->getVar( 'wgMetaNamespace' );
168
		}
169
170
		// Validate namespace
171
		if ( strpos( $name, ':' ) !== false ) {
172
			$good = false;
173
		} else {
174
			// Title-style validation
175
			$title = Title::newFromText( $name );
176
			if ( !$title ) {
177
				$good = $nsType == 'site-name';
178
			} else {
179
				$name = $title->getDBkey();
180
				$good = true;
181
			}
182
		}
183
		if ( !$good ) {
184
			$this->parent->showError( 'config-ns-invalid', $name );
185
			$retVal = false;
186
		}
187
188
		// Make sure it won't conflict with any existing namespaces
189
		global $wgContLang;
190
		$nsIndex = $wgContLang->getNsIndex( $name );
191
		if ( $nsIndex !== false && $nsIndex !== NS_PROJECT ) {
192
			$this->parent->showError( 'config-ns-conflict', $name );
193
			$retVal = false;
194
		}
195
196
		$this->setVar( 'wgMetaNamespace', $name );
197
198
		// Validate username for creation
199
		$name = $this->getVar( '_AdminName' );
200
		if ( strval( $name ) === '' ) {
201
			$this->parent->showError( 'config-admin-name-blank' );
202
			$cname = $name;
203
			$retVal = false;
204
		} else {
205
			$cname = User::getCanonicalName( $name, 'creatable' );
206
			if ( $cname === false ) {
207
				$this->parent->showError( 'config-admin-name-invalid', $name );
208
				$retVal = false;
209
			} else {
210
				$this->setVar( '_AdminName', $cname );
211
			}
212
		}
213
214
		// Validate password
215
		$msg = false;
216
		$pwd = $this->getVar( '_AdminPassword' );
217
		$user = User::newFromName( $cname );
218
		if ( $user ) {
219
			$upp = new UserPasswordPolicy(
220
				$wgPasswordPolicy['policies'],
221
				$wgPasswordPolicy['checks']
222
			);
223
			$status = $upp->checkUserPasswordForGroups(
224
				$user,
225
				$pwd,
226
				[ 'bureaucrat', 'sysop' ]  // per Installer::createSysop()
227
			);
228
			$valid = $status->isGood() ? true : $status->getMessage();
229
		} else {
230
			$valid = 'config-admin-name-invalid';
231
		}
232
		if ( strval( $pwd ) === '' ) {
233
			// Provide a more specific and helpful message if password field is left blank
234
			$msg = 'config-admin-password-blank';
235
		} elseif ( $pwd !== $this->getVar( '_AdminPasswordConfirm' ) ) {
236
			$msg = 'config-admin-password-mismatch';
237
		} elseif ( $valid !== true ) {
238
			$msg = $valid;
239
		}
240
		if ( $msg !== false ) {
241
			call_user_func( [ $this->parent, 'showError' ], $msg );
242
			$this->setVar( '_AdminPassword', '' );
243
			$this->setVar( '_AdminPasswordConfirm', '' );
244
			$retVal = false;
245
		}
246
247
		// Validate e-mail if provided
248
		$email = $this->getVar( '_AdminEmail' );
249
		if ( $email && !Sanitizer::validateEmail( $email ) ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression \Sanitizer::validateEmail($email) of type null|boolean is loosely compared to false; this is ambiguous if the boolean can be false. You might want to explicitly use !== null instead.

If an expression can have both false, and null as possible values. It is generally a good practice to always use strict comparison to clearly distinguish between those two values.

$a = canBeFalseAndNull();

// Instead of
if ( ! $a) { }

// Better use one of the explicit versions:
if ($a !== null) { }
if ($a !== false) { }
if ($a !== null && $a !== false) { }
Loading history...
250
			$this->parent->showError( 'config-admin-error-bademail' );
251
			$retVal = false;
252
		}
253
		// If they asked to subscribe to mediawiki-announce but didn't give
254
		// an e-mail, show an error. Bug 29332
255
		if ( !$email && $this->getVar( '_Subscribe' ) ) {
256
			$this->parent->showError( 'config-subscribe-noemail' );
257
			$retVal = false;
258
		}
259
260
		return $retVal;
261
	}
262
263
}
264