SpecialUserLogout::execute()   B
last analyzed

Complexity

Conditions 4
Paths 3

Size

Total Lines 43
Code Lines 23

Duplication

Lines 9
Ratio 20.93 %

Importance

Changes 0
Metric Value
cc 4
eloc 23
c 0
b 0
f 0
nc 3
nop 1
dl 9
loc 43
rs 8.5806
1
<?php
2
/**
3
 * Implements Special:Userlogout
4
 *
5
 * This program is free software; you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation; either version 2 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License along
16
 * with this program; if not, write to the Free Software Foundation, Inc.,
17
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18
 * http://www.gnu.org/copyleft/gpl.html
19
 *
20
 * @file
21
 * @ingroup SpecialPage
22
 */
23
24
/**
25
 * Implements Special:Userlogout
26
 *
27
 * @ingroup SpecialPage
28
 */
29
class SpecialUserLogout extends UnlistedSpecialPage {
30
	function __construct() {
31
		parent::__construct( 'Userlogout' );
32
	}
33
34
	public function doesWrites() {
35
		return true;
36
	}
37
38
	function execute( $par ) {
0 ignored issues
show
Coding Style introduced by
execute uses the super-global variable $_SERVER which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
39
		/**
40
		 * Some satellite ISPs use broken precaching schemes that log people out straight after
41
		 * they're logged in (bug 17790). Luckily, there's a way to detect such requests.
42
		 */
43
		if ( isset( $_SERVER['REQUEST_URI'] ) && strpos( $_SERVER['REQUEST_URI'], '&amp;' ) !== false ) {
44
			wfDebug( "Special:UserLogout request {$_SERVER['REQUEST_URI']} looks suspicious, denying.\n" );
45
			throw new HttpError( 400, $this->msg( 'suspicious-userlogout' ), $this->msg( 'loginerror' ) );
46
		}
47
48
		$this->setHeaders();
49
		$this->outputHeader();
50
51
		// Make sure it's possible to log out
52
		$session = MediaWiki\Session\SessionManager::getGlobalSession();
53 View Code Duplication
		if ( !$session->canSetUser() ) {
54
			throw new ErrorPageError(
55
				'cannotlogoutnow-title',
56
				'cannotlogoutnow-text',
57
				[
58
					$session->getProvider()->describe( RequestContext::getMain()->getLanguage() )
59
				]
60
			);
61
		}
62
63
		$user = $this->getUser();
64
		$oldName = $user->getName();
65
66
		$user->logout();
67
68
		$loginURL = SpecialPage::getTitleFor( 'Userlogin' )->getFullURL(
69
			$this->getRequest()->getValues( 'returnto', 'returntoquery' ) );
70
71
		$out = $this->getOutput();
72
		$out->addWikiMsg( 'logouttext', $loginURL );
73
74
		// Hook.
75
		$injected_html = '';
76
		Hooks::run( 'UserLogoutComplete', [ &$user, &$injected_html, $oldName ] );
77
		$out->addHTML( $injected_html );
78
79
		$out->returnToMain();
80
	}
81
82
	protected function getGroupName() {
83
		return 'login';
84
	}
85
}
86