MediaWiki  master
WebInstallerName.php
Go to the documentation of this file.
1 <?php
23 
25 
29  public function execute() {
30  $r = $this->parent->request;
31  if ( $r->wasPosted() && $this->submit() ) {
32  return 'continue';
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' => [ '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' )->plain() ) .
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 
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  $nsIndex = MediaWikiServices::getInstance()->getContentLanguage()->getNsIndex( $name );
190  if ( $nsIndex !== false && $nsIndex !== NS_PROJECT ) {
191  $this->parent->showError( 'config-ns-conflict', $name );
192  $retVal = false;
193  }
194 
195  $this->setVar( 'wgMetaNamespace', $name );
196 
197  // Validate username for creation
198  $name = $this->getVar( '_AdminName' );
199  if ( strval( $name ) === '' ) {
200  $this->parent->showError( 'config-admin-name-blank' );
201  $cname = $name;
202  $retVal = false;
203  } else {
204  $cname = User::getCanonicalName( $name, 'creatable' );
205  if ( $cname === false ) {
206  $this->parent->showError( 'config-admin-name-invalid', $name );
207  $retVal = false;
208  } else {
209  $this->setVar( '_AdminName', $cname );
210  }
211  }
212 
213  // Validate password
214  $msg = false;
215  $pwd = $this->getVar( '_AdminPassword' );
216  $user = User::newFromName( $cname );
217  if ( $user ) {
218  $upp = new UserPasswordPolicy(
219  $wgPasswordPolicy['policies'],
220  $wgPasswordPolicy['checks']
221  );
222  $status = $upp->checkUserPasswordForGroups(
223  $user,
224  $pwd,
225  [ 'bureaucrat', 'sysop', 'interface-admin' ] // per Installer::createSysop()
226  );
227  $valid = $status->isGood() ? true : $status->getMessage();
228  } else {
229  $valid = 'config-admin-name-invalid';
230  }
231  if ( strval( $pwd ) === '' ) {
232  // Provide a more specific and helpful message if password field is left blank
233  $msg = 'config-admin-password-blank';
234  } elseif ( $pwd !== $this->getVar( '_AdminPasswordConfirm' ) ) {
235  $msg = 'config-admin-password-mismatch';
236  } elseif ( $valid !== true ) {
237  $msg = $valid;
238  }
239  if ( $msg !== false ) {
240  call_user_func( [ $this->parent, 'showError' ], $msg );
241  $this->setVar( '_AdminPassword', '' );
242  $this->setVar( '_AdminPasswordConfirm', '' );
243  $retVal = false;
244  }
245 
246  // Validate e-mail if provided
247  $email = $this->getVar( '_AdminEmail' );
248  if ( $email && !Sanitizer::validateEmail( $email ) ) {
249  $this->parent->showError( 'config-admin-error-bademail' );
250  $retVal = false;
251  }
252  // If they asked to subscribe to mediawiki-announce but didn't give
253  // an e-mail, show an error. T31332
254  if ( !$email && $this->getVar( '_Subscribe' ) ) {
255  $this->parent->showError( 'config-subscribe-noemail' );
256  $retVal = false;
257  }
258 
259  return $retVal;
260  }
261 
262 }
Abstract class to define pages for the web installer.
setVar( $name, $value)
Check if a user&#39;s password complies with any password policies that apply to that user...
static encode( $value, $pretty=false, $escaping=0)
Returns the JSON representation of a value.
Definition: FormatJson.php:115
static validateEmail( $addr)
Does a string look like an e-mail address?
Definition: Sanitizer.php:2165
static getCanonicalName( $name, $validate='valid')
Given unvalidated user input, return a canonical username, or false if the username is invalid...
Definition: User.php:1139
$wgPasswordPolicy
Password policy for the wiki.
const NS_PROJECT
Definition: Defines.php:64
getFieldsetStart( $legend)
Get the starting tags of a fieldset.
getVar( $var, $default=null)
endForm( $continue='continue', $back='back')
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
getFieldsetEnd()
Get the end tag of a fieldset.
static newFromName( $name, $validate='valid')
Static factory method for creation from username.
Definition: User.php:515
return true
Definition: router.php:92
Send information about this MediaWiki instance to MediaWiki.org.
Definition: Pingback.php:32
static newFromText( $text, $defaultNamespace=NS_MAIN)
Create a new Title from text, such as what one would find in a link.
Definition: Title.php:319