WebInstallerLanguage::getLanguageSelector()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 20
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 13
nc 3
nop 4
dl 0
loc 20
rs 9.4285
c 0
b 0
f 0
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 WebInstallerLanguage extends WebInstallerPage {
23
24
	/**
25
	 * @return string|null
26
	 */
27
	public function execute() {
28
		global $wgLang;
29
		$r = $this->parent->request;
30
		$userLang = $r->getVal( 'uselang' );
31
		$contLang = $r->getVal( 'ContLang' );
32
33
		$languages = Language::fetchLanguageNames();
34
		$lifetime = intval( ini_get( 'session.gc_maxlifetime' ) );
35
		if ( !$lifetime ) {
36
			$lifetime = 1440; // PHP default
37
		}
38
39
		if ( $r->wasPosted() ) {
40
			# Do session test
41
			if ( $this->parent->getSession( 'test' ) === null ) {
42
				$requestTime = $r->getVal( 'LanguageRequestTime' );
43
				if ( !$requestTime ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $requestTime of type null|string is loosely compared to false; this is ambiguous if the string can be empty. You might want to explicitly use === null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
44
					// The most likely explanation is that the user was knocked back
45
					// from another page on POST due to session expiry
46
					$msg = 'config-session-expired';
47
				} elseif ( time() - $requestTime > $lifetime ) {
48
					$msg = 'config-session-expired';
49
				} else {
50
					$msg = 'config-no-session';
51
				}
52
				$this->parent->showError( $msg, $wgLang->formatTimePeriod( $lifetime ) );
53
			} else {
54
				if ( isset( $languages[$userLang] ) ) {
55
					$this->setVar( '_UserLang', $userLang );
56
				}
57
				if ( isset( $languages[$contLang] ) ) {
58
					$this->setVar( 'wgLanguageCode', $contLang );
59
				}
60
61
				return 'continue';
62
			}
63
		} elseif ( $this->parent->showSessionWarning ) {
64
			# The user was knocked back from another page to the start
65
			# This probably indicates a session expiry
66
			$this->parent->showError( 'config-session-expired',
67
				$wgLang->formatTimePeriod( $lifetime ) );
68
		}
69
70
		$this->parent->setSession( 'test', true );
71
72
		if ( !isset( $languages[$userLang] ) ) {
73
			$userLang = $this->getVar( '_UserLang', 'en' );
74
		}
75
		if ( !isset( $languages[$contLang] ) ) {
76
			$contLang = $this->getVar( 'wgLanguageCode', 'en' );
77
		}
78
		$this->startForm();
79
		$s = Html::hidden( 'LanguageRequestTime', time() ) .
80
			$this->getLanguageSelector( 'uselang', 'config-your-language', $userLang,
81
				$this->parent->getHelpBox( 'config-your-language-help' ) ) .
82
			$this->getLanguageSelector( 'ContLang', 'config-wiki-language', $contLang,
83
				$this->parent->getHelpBox( 'config-wiki-language-help' ) );
84
		$this->addHTML( $s );
85
		$this->endForm( 'continue', false );
86
87
		return null;
88
	}
89
90
	/**
91
	 * Get a "<select>" for selecting languages.
92
	 *
93
	 * @param string $name
94
	 * @param string $label
95
	 * @param string $selectedCode
96
	 * @param string $helpHtml
97
	 *
98
	 * @return string
99
	 */
100
	public function getLanguageSelector( $name, $label, $selectedCode, $helpHtml = '' ) {
101
		global $wgDummyLanguageCodes;
102
103
		$output = $helpHtml;
104
105
		$select = new XmlSelect( $name, $name, $selectedCode );
106
		$select->setAttribute( 'tabindex', $this->parent->nextTabIndex() );
107
108
		$languages = Language::fetchLanguageNames();
109
		ksort( $languages );
110
		foreach ( $languages as $code => $lang ) {
111
			if ( isset( $wgDummyLanguageCodes[$code] ) ) {
112
				continue;
113
			}
114
			$select->addOption( "$code - $lang", $code );
115
		}
116
117
		$output .= $select->getHTML();
118
		return $this->parent->label( $label, $name, $output );
119
	}
120
121
}
122