Failed Conditions
Pull Request — oauthcreation (#531)
by Simon
18:38 queued 08:37
created
backup.php 1 patch
Indentation   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -7,7 +7,7 @@  discard block
 block discarded – undo
7 7
  ******************************************************************************/
8 8
 
9 9
 if (isset($_SERVER['REQUEST_METHOD'])) {
10
-    die();
10
+	die();
11 11
 } //Web clients die.
12 12
 
13 13
 // Get all the classes.
@@ -19,12 +19,12 @@  discard block
 block discarded – undo
19 19
 
20 20
 $arg = $argv['1'];
21 21
 if ($arg == "--monthly") {
22
-    echo "running monthly backups.\n";
23
-    $dateModifier = date("FY");
24
-    $cmdLine = "$BUtar $BUmonthdir/mBackup-$dateModifier.tar $BUdir/*.sql.gz; rm $BUdir/*.sql.gz";
25
-    echo "running command $cmdLine\n";
26
-    shell_exec($cmdLine);
27
-    die("done.");
22
+	echo "running monthly backups.\n";
23
+	$dateModifier = date("FY");
24
+	$cmdLine = "$BUtar $BUmonthdir/mBackup-$dateModifier.tar $BUdir/*.sql.gz; rm $BUdir/*.sql.gz";
25
+	echo "running command $cmdLine\n";
26
+	shell_exec($cmdLine);
27
+	die("done.");
28 28
 }
29 29
 
30 30
 echo "running nightly backups\n";
Please login to merge, or discard this patch.
smarty-plugins/modifier.relativedate.php 1 patch
Indentation   +57 added lines, -57 removed lines patch added patch discarded remove patch
@@ -16,68 +16,68 @@
 block discarded – undo
16 16
  */
17 17
 function smarty_modifier_relativedate($input)
18 18
 {
19
-    $now = new DateTime();
19
+	$now = new DateTime();
20 20
 
21
-    if (gettype($input) === 'object'
22
-        && (get_class($input) === DateTime::class || get_class($input) === DateTimeImmutable::class)
23
-    ) {
24
-        $then = $input;
25
-    }
26
-    else {
27
-        $then = new DateTime($input);
28
-    }
21
+	if (gettype($input) === 'object'
22
+		&& (get_class($input) === DateTime::class || get_class($input) === DateTimeImmutable::class)
23
+	) {
24
+		$then = $input;
25
+	}
26
+	else {
27
+		$then = new DateTime($input);
28
+	}
29 29
 
30
-    $secs = $now->getTimestamp() - $then->getTimestamp();
30
+	$secs = $now->getTimestamp() - $then->getTimestamp();
31 31
 
32
-    $second = 1;
33
-    $minute = 60 * $second;
34
-    $minuteCut = 60 * $second;
35
-    $hour = 60 * $minute;
36
-    $hourCut = 90 * $minute;
37
-    $day = 24 * $hour;
38
-    $dayCut = 48 * $hour;
39
-    $week = 7 * $day;
40
-    $weekCut = 14 * $day;
41
-    $month = 30 * $day;
42
-    $monthCut = 60 * $day;
43
-    $year = 365 * $day;
44
-    $yearCut = $year * 2;
32
+	$second = 1;
33
+	$minute = 60 * $second;
34
+	$minuteCut = 60 * $second;
35
+	$hour = 60 * $minute;
36
+	$hourCut = 90 * $minute;
37
+	$day = 24 * $hour;
38
+	$dayCut = 48 * $hour;
39
+	$week = 7 * $day;
40
+	$weekCut = 14 * $day;
41
+	$month = 30 * $day;
42
+	$monthCut = 60 * $day;
43
+	$year = 365 * $day;
44
+	$yearCut = $year * 2;
45 45
 
46
-    $pluralise = true;
46
+	$pluralise = true;
47 47
 
48
-    if ($secs <= 10) {
49
-        $output = "just now";
50
-        $pluralise = false;
51
-    }
52
-    elseif ($secs > 10 && $secs < $minuteCut) {
53
-        $output = round($secs / $second) . " second";
54
-    }
55
-    elseif ($secs >= $minuteCut && $secs < $hourCut) {
56
-        $output = round($secs / $minute) . " minute";
57
-    }
58
-    elseif ($secs >= $hourCut && $secs < $dayCut) {
59
-        $output = round($secs / $hour) . " hour";
60
-    }
61
-    elseif ($secs >= $dayCut && $secs < $weekCut) {
62
-        $output = round($secs / $day) . " day";
63
-    }
64
-    elseif ($secs >= $weekCut && $secs < $monthCut) {
65
-        $output = round($secs / $week) . " week";
66
-    }
67
-    elseif ($secs >= $monthCut && $secs < $yearCut) {
68
-        $output = round($secs / $month) . " month";
69
-    }
70
-    elseif ($secs >= $yearCut && $secs < $year * 10) {
71
-        $output = round($secs / $year) . " year";
72
-    }
73
-    else {
74
-        $output = "a long time ago";
75
-        $pluralise = false;
76
-    }
48
+	if ($secs <= 10) {
49
+		$output = "just now";
50
+		$pluralise = false;
51
+	}
52
+	elseif ($secs > 10 && $secs < $minuteCut) {
53
+		$output = round($secs / $second) . " second";
54
+	}
55
+	elseif ($secs >= $minuteCut && $secs < $hourCut) {
56
+		$output = round($secs / $minute) . " minute";
57
+	}
58
+	elseif ($secs >= $hourCut && $secs < $dayCut) {
59
+		$output = round($secs / $hour) . " hour";
60
+	}
61
+	elseif ($secs >= $dayCut && $secs < $weekCut) {
62
+		$output = round($secs / $day) . " day";
63
+	}
64
+	elseif ($secs >= $weekCut && $secs < $monthCut) {
65
+		$output = round($secs / $week) . " week";
66
+	}
67
+	elseif ($secs >= $monthCut && $secs < $yearCut) {
68
+		$output = round($secs / $month) . " month";
69
+	}
70
+	elseif ($secs >= $yearCut && $secs < $year * 10) {
71
+		$output = round($secs / $year) . " year";
72
+	}
73
+	else {
74
+		$output = "a long time ago";
75
+		$pluralise = false;
76
+	}
77 77
 
78
-    if ($pluralise) {
79
-        $output = (substr($output, 0, 2) <> "1 ") ? $output . "s ago" : $output . " ago";
80
-    }
78
+	if ($pluralise) {
79
+		$output = (substr($output, 0, 2) <> "1 ") ? $output . "s ago" : $output . " ago";
80
+	}
81 81
 
82
-    return $output;
82
+	return $output;
83 83
 }
84 84
\ No newline at end of file
Please login to merge, or discard this patch.
smarty-plugins/modifier.date.php 1 patch
Indentation   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -16,16 +16,16 @@
 block discarded – undo
16 16
  */
17 17
 function smarty_modifier_date($input)
18 18
 {
19
-    if (gettype($input) === 'object'
20
-        && (get_class($input) === DateTime::class || get_class($input) === DateTimeImmutable::class)
21
-    ) {
22
-        /** @var $date DateTime|DateTimeImmutable */
23
-        $date = $input;
24
-        $dateString = $date->format('Y-m-d H:i:s');
19
+	if (gettype($input) === 'object'
20
+		&& (get_class($input) === DateTime::class || get_class($input) === DateTimeImmutable::class)
21
+	) {
22
+		/** @var $date DateTime|DateTimeImmutable */
23
+		$date = $input;
24
+		$dateString = $date->format('Y-m-d H:i:s');
25 25
 
26
-        return $dateString;
27
-    }
28
-    else {
29
-        return $input;
30
-    }
26
+		return $dateString;
27
+	}
28
+	else {
29
+		return $input;
30
+	}
31 31
 }
32 32
\ No newline at end of file
Please login to merge, or discard this patch.
includes/Helpers/SearchHelpers/LogSearchHelper.php 1 patch
Indentation   +73 added lines, -73 removed lines patch added patch discarded remove patch
@@ -13,87 +13,87 @@
 block discarded – undo
13 13
 
14 14
 class LogSearchHelper extends SearchHelperBase
15 15
 {
16
-    /**
17
-     * LogSearchHelper constructor.
18
-     *
19
-     * @param PdoDatabase $database
20
-     */
21
-    protected function __construct(PdoDatabase $database)
22
-    {
23
-        parent::__construct($database, 'log', Log::class, 'timestamp DESC');
24
-    }
16
+	/**
17
+	 * LogSearchHelper constructor.
18
+	 *
19
+	 * @param PdoDatabase $database
20
+	 */
21
+	protected function __construct(PdoDatabase $database)
22
+	{
23
+		parent::__construct($database, 'log', Log::class, 'timestamp DESC');
24
+	}
25 25
 
26
-    /**
27
-     * Initiates a search for requests
28
-     *
29
-     * @param PdoDatabase $database
30
-     *
31
-     * @return LogSearchHelper
32
-     */
33
-    public static function get(PdoDatabase $database)
34
-    {
35
-        $helper = new LogSearchHelper($database);
26
+	/**
27
+	 * Initiates a search for requests
28
+	 *
29
+	 * @param PdoDatabase $database
30
+	 *
31
+	 * @return LogSearchHelper
32
+	 */
33
+	public static function get(PdoDatabase $database)
34
+	{
35
+		$helper = new LogSearchHelper($database);
36 36
 
37
-        return $helper;
38
-    }
37
+		return $helper;
38
+	}
39 39
 
40
-    /**
41
-     * Filters the results by user
42
-     *
43
-     * @param int $userId
44
-     *
45
-     * @return $this
46
-     */
47
-    public function byUser($userId)
48
-    {
49
-        $this->whereClause .= ' AND user = ?';
50
-        $this->parameterList[] = $userId;
40
+	/**
41
+	 * Filters the results by user
42
+	 *
43
+	 * @param int $userId
44
+	 *
45
+	 * @return $this
46
+	 */
47
+	public function byUser($userId)
48
+	{
49
+		$this->whereClause .= ' AND user = ?';
50
+		$this->parameterList[] = $userId;
51 51
 
52
-        return $this;
53
-    }
52
+		return $this;
53
+	}
54 54
 
55
-    /**
56
-     * Filters the results by log action
57
-     *
58
-     * @param string $action
59
-     *
60
-     * @return $this
61
-     */
62
-    public function byAction($action)
63
-    {
64
-        $this->whereClause .= ' AND action = ?';
65
-        $this->parameterList[] = $action;
55
+	/**
56
+	 * Filters the results by log action
57
+	 *
58
+	 * @param string $action
59
+	 *
60
+	 * @return $this
61
+	 */
62
+	public function byAction($action)
63
+	{
64
+		$this->whereClause .= ' AND action = ?';
65
+		$this->parameterList[] = $action;
66 66
 
67
-        return $this;
68
-    }
67
+		return $this;
68
+	}
69 69
 
70
-    /**
71
-     * Filters the results by object type
72
-     *
73
-     * @param string $objectType
74
-     *
75
-     * @return $this
76
-     */
77
-    public function byObjectType($objectType)
78
-    {
79
-        $this->whereClause .= ' AND objecttype = ?';
80
-        $this->parameterList[] = $objectType;
70
+	/**
71
+	 * Filters the results by object type
72
+	 *
73
+	 * @param string $objectType
74
+	 *
75
+	 * @return $this
76
+	 */
77
+	public function byObjectType($objectType)
78
+	{
79
+		$this->whereClause .= ' AND objecttype = ?';
80
+		$this->parameterList[] = $objectType;
81 81
 
82
-        return $this;
83
-    }
82
+		return $this;
83
+	}
84 84
 
85
-    /**
86
-     * Filters the results by object type
87
-     *
88
-     * @param integer $objectId
89
-     *
90
-     * @return $this
91
-     */
92
-    public function byObjectId($objectId)
93
-    {
94
-        $this->whereClause .= ' AND objectid = ?';
95
-        $this->parameterList[] = $objectId;
85
+	/**
86
+	 * Filters the results by object type
87
+	 *
88
+	 * @param integer $objectId
89
+	 *
90
+	 * @return $this
91
+	 */
92
+	public function byObjectId($objectId)
93
+	{
94
+		$this->whereClause .= ' AND objectid = ?';
95
+		$this->parameterList[] = $objectId;
96 96
 
97
-        return $this;
98
-    }
97
+		return $this;
98
+	}
99 99
 }
100 100
\ No newline at end of file
Please login to merge, or discard this patch.
includes/IdentificationVerifier.php 1 patch
Indentation   +157 added lines, -157 removed lines patch added patch discarded remove patch
@@ -26,131 +26,131 @@  discard block
 block discarded – undo
26 26
  */
27 27
 class IdentificationVerifier
28 28
 {
29
-    /**
30
-     * This field is an array of parameters, in key => value format, that should be appended to the Meta Wikimedia
31
-     * Web Service Endpoint URL to query if a user is listed on the Identification Noticeboard.  Note that URL encoding
32
-     * of these values is *not* necessary; this is done automatically.
33
-     *
34
-     * @var string[]
35
-     * @category Security-Critical
36
-     */
37
-    private static $apiQueryParameters = array(
38
-        'action'   => 'query',
39
-        'format'   => 'json',
40
-        'prop'     => 'links',
41
-        'titles'   => 'Access to nonpublic information policy/Noticeboard',
42
-        // Username of the user to be checked, with User: prefix, goes here!  Set in isIdentifiedOnWiki()
43
-        'pltitles' => '',
44
-    );
45
-    /** @var HttpHelper */
46
-    private $httpHelper;
47
-    /** @var SiteConfiguration */
48
-    private $siteConfiguration;
49
-    /** @var PdoDatabase */
50
-    private $dbObject;
51
-
52
-    /**
53
-     * IdentificationVerifier constructor.
54
-     *
55
-     * @param HttpHelper        $httpHelper
56
-     * @param SiteConfiguration $siteConfiguration
57
-     * @param PdoDatabase       $dbObject
58
-     */
59
-    public function __construct(HttpHelper $httpHelper, SiteConfiguration $siteConfiguration, PdoDatabase $dbObject)
60
-    {
61
-        $this->httpHelper = $httpHelper;
62
-        $this->siteConfiguration = $siteConfiguration;
63
-        $this->dbObject = $dbObject;
64
-    }
65
-
66
-    /**
67
-     * Checks if the given user is identified to the Wikimedia Foundation.
68
-     *
69
-     * @param string $onWikiName The Wikipedia username of the user
70
-     *
71
-     * @return bool
72
-     * @category Security-Critical
73
-     */
74
-    public function isUserIdentified($onWikiName)
75
-    {
76
-        if ($this->checkIdentificationCache($onWikiName)) {
77
-            return true;
78
-        }
79
-        else {
80
-            if ($this->isIdentifiedOnWiki($onWikiName)) {
81
-                $this->cacheIdentificationStatus($onWikiName);
82
-
83
-                return true;
84
-            }
85
-            else {
86
-                return false;
87
-            }
88
-        }
89
-    }
90
-
91
-    /**
92
-     * Checks if the given user has a valid entry in the idcache table.
93
-     *
94
-     * @param string $onWikiName The Wikipedia username of the user
95
-     *
96
-     * @return bool
97
-     * @category Security-Critical
98
-     */
99
-    private function checkIdentificationCache($onWikiName)
100
-    {
101
-        $interval = $this->siteConfiguration->getIdentificationCacheExpiry();
102
-
103
-        $query = <<<SQL
29
+	/**
30
+	 * This field is an array of parameters, in key => value format, that should be appended to the Meta Wikimedia
31
+	 * Web Service Endpoint URL to query if a user is listed on the Identification Noticeboard.  Note that URL encoding
32
+	 * of these values is *not* necessary; this is done automatically.
33
+	 *
34
+	 * @var string[]
35
+	 * @category Security-Critical
36
+	 */
37
+	private static $apiQueryParameters = array(
38
+		'action'   => 'query',
39
+		'format'   => 'json',
40
+		'prop'     => 'links',
41
+		'titles'   => 'Access to nonpublic information policy/Noticeboard',
42
+		// Username of the user to be checked, with User: prefix, goes here!  Set in isIdentifiedOnWiki()
43
+		'pltitles' => '',
44
+	);
45
+	/** @var HttpHelper */
46
+	private $httpHelper;
47
+	/** @var SiteConfiguration */
48
+	private $siteConfiguration;
49
+	/** @var PdoDatabase */
50
+	private $dbObject;
51
+
52
+	/**
53
+	 * IdentificationVerifier constructor.
54
+	 *
55
+	 * @param HttpHelper        $httpHelper
56
+	 * @param SiteConfiguration $siteConfiguration
57
+	 * @param PdoDatabase       $dbObject
58
+	 */
59
+	public function __construct(HttpHelper $httpHelper, SiteConfiguration $siteConfiguration, PdoDatabase $dbObject)
60
+	{
61
+		$this->httpHelper = $httpHelper;
62
+		$this->siteConfiguration = $siteConfiguration;
63
+		$this->dbObject = $dbObject;
64
+	}
65
+
66
+	/**
67
+	 * Checks if the given user is identified to the Wikimedia Foundation.
68
+	 *
69
+	 * @param string $onWikiName The Wikipedia username of the user
70
+	 *
71
+	 * @return bool
72
+	 * @category Security-Critical
73
+	 */
74
+	public function isUserIdentified($onWikiName)
75
+	{
76
+		if ($this->checkIdentificationCache($onWikiName)) {
77
+			return true;
78
+		}
79
+		else {
80
+			if ($this->isIdentifiedOnWiki($onWikiName)) {
81
+				$this->cacheIdentificationStatus($onWikiName);
82
+
83
+				return true;
84
+			}
85
+			else {
86
+				return false;
87
+			}
88
+		}
89
+	}
90
+
91
+	/**
92
+	 * Checks if the given user has a valid entry in the idcache table.
93
+	 *
94
+	 * @param string $onWikiName The Wikipedia username of the user
95
+	 *
96
+	 * @return bool
97
+	 * @category Security-Critical
98
+	 */
99
+	private function checkIdentificationCache($onWikiName)
100
+	{
101
+		$interval = $this->siteConfiguration->getIdentificationCacheExpiry();
102
+
103
+		$query = <<<SQL
104 104
 			SELECT COUNT(`id`)
105 105
 			FROM `idcache`
106 106
 			WHERE `onwikiusername` = :onwikiname
107 107
 				AND DATE_ADD(`checktime`, INTERVAL {$interval}) >= NOW();
108 108
 SQL;
109
-        $stmt = $this->dbObject->prepare($query);
110
-        $stmt->bindValue(':onwikiname', $onWikiName, PDO::PARAM_STR);
111
-        $stmt->execute();
112
-
113
-        // Guaranteed by the query to only return a single row with a single column
114
-        $results = $stmt->fetch(PDO::FETCH_NUM);
115
-
116
-        // I don't expect this to ever be a value other than 0 or 1 since the `onwikiusername` column is declared as a
117
-        // unique key - but meh.
118
-        return $results[0] != 0;
119
-    }
120
-
121
-    /**
122
-     * Does pretty much exactly what it says on the label - this method will clear all expired idcache entries from the
123
-     * idcache table.  Meant to be called periodically by a maintenance script.
124
-     *
125
-     * @param SiteConfiguration $siteConfiguration
126
-     * @param PdoDatabase       $dbObject
127
-     *
128
-     * @return void
129
-     */
130
-    public static function clearExpiredCacheEntries(SiteConfiguration $siteConfiguration, PdoDatabase $dbObject)
131
-    {
132
-        $interval = $siteConfiguration->getIdentificationCacheExpiry();
133
-
134
-        $query = <<<SQL
109
+		$stmt = $this->dbObject->prepare($query);
110
+		$stmt->bindValue(':onwikiname', $onWikiName, PDO::PARAM_STR);
111
+		$stmt->execute();
112
+
113
+		// Guaranteed by the query to only return a single row with a single column
114
+		$results = $stmt->fetch(PDO::FETCH_NUM);
115
+
116
+		// I don't expect this to ever be a value other than 0 or 1 since the `onwikiusername` column is declared as a
117
+		// unique key - but meh.
118
+		return $results[0] != 0;
119
+	}
120
+
121
+	/**
122
+	 * Does pretty much exactly what it says on the label - this method will clear all expired idcache entries from the
123
+	 * idcache table.  Meant to be called periodically by a maintenance script.
124
+	 *
125
+	 * @param SiteConfiguration $siteConfiguration
126
+	 * @param PdoDatabase       $dbObject
127
+	 *
128
+	 * @return void
129
+	 */
130
+	public static function clearExpiredCacheEntries(SiteConfiguration $siteConfiguration, PdoDatabase $dbObject)
131
+	{
132
+		$interval = $siteConfiguration->getIdentificationCacheExpiry();
133
+
134
+		$query = <<<SQL
135 135
 			DELETE FROM `idcache`
136 136
 			WHERE DATE_ADD(`checktime`, INTERVAL {$interval}) < NOW();
137 137
 SQL;
138
-        $dbObject->prepare($query)->execute();
139
-    }
140
-
141
-    /**
142
-     * This method will add an entry to the idcache that the given Wikipedia user has been verified as identified.  This
143
-     * is so we don't have to hit the API every single time we check.  The cache entry is valid for as long as specified
144
-     * in the ACC configuration (validity enforced by checkIdentificationCache() and clearExpiredCacheEntries()).
145
-     *
146
-     * @param string $onWikiName The Wikipedia username of the user
147
-     *
148
-     * @return void
149
-     * @category Security-Critical
150
-     */
151
-    private function cacheIdentificationStatus($onWikiName)
152
-    {
153
-        $query = <<<SQL
138
+		$dbObject->prepare($query)->execute();
139
+	}
140
+
141
+	/**
142
+	 * This method will add an entry to the idcache that the given Wikipedia user has been verified as identified.  This
143
+	 * is so we don't have to hit the API every single time we check.  The cache entry is valid for as long as specified
144
+	 * in the ACC configuration (validity enforced by checkIdentificationCache() and clearExpiredCacheEntries()).
145
+	 *
146
+	 * @param string $onWikiName The Wikipedia username of the user
147
+	 *
148
+	 * @return void
149
+	 * @category Security-Critical
150
+	 */
151
+	private function cacheIdentificationStatus($onWikiName)
152
+	{
153
+		$query = <<<SQL
154 154
 			INSERT INTO `idcache`
155 155
 				(`onwikiusername`)
156 156
 			VALUES
@@ -159,44 +159,44 @@  discard block
 block discarded – undo
159 159
 				`onwikiusername` = VALUES(`onwikiusername`),
160 160
 				`checktime` = CURRENT_TIMESTAMP;
161 161
 SQL;
162
-        $stmt = $this->dbObject->prepare($query);
163
-        $stmt->bindValue(':onwikiname', $onWikiName, PDO::PARAM_STR);
164
-        $stmt->execute();
165
-    }
166
-
167
-    /**
168
-     * Queries the Wikimedia API to determine if the specified user is listed on the identification noticeboard.
169
-     *
170
-     * @param string $onWikiName The Wikipedia username of the user
171
-     *
172
-     * @return bool
173
-     * @throws EnvironmentException
174
-     * @category Security-Critical
175
-     */
176
-    private function isIdentifiedOnWiki($onWikiName)
177
-    {
178
-        $strings = new StringFunctions();
179
-
180
-        // First character of Wikipedia usernames is always capitalized.
181
-        $onWikiName = $strings->ucfirst($onWikiName);
182
-
183
-        $parameters = self::$apiQueryParameters;
184
-        $parameters['pltitles'] = "User:" . $onWikiName;
185
-
186
-        try {
187
-            $endpoint = $this->siteConfiguration->getMetaWikimediaWebServiceEndpoint();
188
-            $response = $this->httpHelper->get($endpoint, $parameters);
189
-            $response = json_decode($response, true);
190
-        } catch (CurlException $ex) {
191
-            // failed getting identification status, so throw a nicer error.
192
-            $m = 'Could not contact metawiki API to determine user\' identification status. '
193
-                . 'This is probably a transient error, so please try again.';
194
-
195
-            throw new EnvironmentException($m, 0, $ex);
196
-        }
197
-
198
-        $page = @array_pop($response['query']['pages']);
199
-
200
-        return @$page['links'][0]['title'] === "User:" . $onWikiName;
201
-    }
162
+		$stmt = $this->dbObject->prepare($query);
163
+		$stmt->bindValue(':onwikiname', $onWikiName, PDO::PARAM_STR);
164
+		$stmt->execute();
165
+	}
166
+
167
+	/**
168
+	 * Queries the Wikimedia API to determine if the specified user is listed on the identification noticeboard.
169
+	 *
170
+	 * @param string $onWikiName The Wikipedia username of the user
171
+	 *
172
+	 * @return bool
173
+	 * @throws EnvironmentException
174
+	 * @category Security-Critical
175
+	 */
176
+	private function isIdentifiedOnWiki($onWikiName)
177
+	{
178
+		$strings = new StringFunctions();
179
+
180
+		// First character of Wikipedia usernames is always capitalized.
181
+		$onWikiName = $strings->ucfirst($onWikiName);
182
+
183
+		$parameters = self::$apiQueryParameters;
184
+		$parameters['pltitles'] = "User:" . $onWikiName;
185
+
186
+		try {
187
+			$endpoint = $this->siteConfiguration->getMetaWikimediaWebServiceEndpoint();
188
+			$response = $this->httpHelper->get($endpoint, $parameters);
189
+			$response = json_decode($response, true);
190
+		} catch (CurlException $ex) {
191
+			// failed getting identification status, so throw a nicer error.
192
+			$m = 'Could not contact metawiki API to determine user\' identification status. '
193
+				. 'This is probably a transient error, so please try again.';
194
+
195
+			throw new EnvironmentException($m, 0, $ex);
196
+		}
197
+
198
+		$page = @array_pop($response['query']['pages']);
199
+
200
+		return @$page['links'][0]['title'] === "User:" . $onWikiName;
201
+	}
202 202
 }
Please login to merge, or discard this patch.
includes/Security/SecurityManager.php 1 patch
Indentation   +196 added lines, -196 removed lines patch added patch discarded remove patch
@@ -14,200 +14,200 @@
 block discarded – undo
14 14
 
15 15
 final class SecurityManager
16 16
 {
17
-    const ALLOWED = 1;
18
-    const ERROR_NOT_IDENTIFIED = 2;
19
-    const ERROR_DENIED = 3;
20
-    /** @var IdentificationVerifier */
21
-    private $identificationVerifier;
22
-    /**
23
-     * @var RoleConfiguration
24
-     */
25
-    private $roleConfiguration;
26
-
27
-    /**
28
-     * SecurityManager constructor.
29
-     *
30
-     * @param IdentificationVerifier $identificationVerifier
31
-     * @param RoleConfiguration      $roleConfiguration
32
-     */
33
-    public function __construct(
34
-        IdentificationVerifier $identificationVerifier,
35
-        RoleConfiguration $roleConfiguration
36
-    ) {
37
-        $this->identificationVerifier = $identificationVerifier;
38
-        $this->roleConfiguration = $roleConfiguration;
39
-    }
40
-
41
-    /**
42
-     * Tests if a user is allowed to perform an action.
43
-     *
44
-     * This method should form a hard, deterministic security barrier, and only return true if it is absolutely sure
45
-     * that a user should have access to something.
46
-     *
47
-     * @param string $page
48
-     * @param string $route
49
-     * @param User   $user
50
-     *
51
-     * @return int
52
-     *
53
-     * @category Security-Critical
54
-     */
55
-    public function allows($page, $route, User $user)
56
-    {
57
-        $this->getActiveRoles($user, $activeRoles, $inactiveRoles);
58
-
59
-        $availableRights = $this->flattenRoles($activeRoles);
60
-        $testResult = $this->findResult($availableRights, $page, $route);
61
-
62
-        if ($testResult !== null) {
63
-            // We got a firm result here, so just return it.
64
-            return $testResult;
65
-        }
66
-
67
-        // No firm result yet, so continue testing the inactive roles so we can give a better error.
68
-        $inactiveRights = $this->flattenRoles($inactiveRoles);
69
-        $testResult = $this->findResult($inactiveRights, $page, $route);
70
-
71
-        if ($testResult === self::ALLOWED) {
72
-            // The user is allowed to access this, but their role is inactive.
73
-            return self::ERROR_NOT_IDENTIFIED;
74
-        }
75
-
76
-        // Other options from the secondary test are denied and inconclusive, which at this point defaults to denied.
77
-        return self::ERROR_DENIED;
78
-    }
79
-
80
-    /**
81
-     * @param array  $pseudoRole The role (flattened) to check
82
-     * @param string $page       The page class to check
83
-     * @param string $route      The page route to check
84
-     *
85
-     * @return int|null
86
-     */
87
-    private function findResult($pseudoRole, $page, $route)
88
-    {
89
-        if (isset($pseudoRole[$page])) {
90
-            // check for deny on catch-all route
91
-            if (isset($pseudoRole[$page][RoleConfiguration::ALL])) {
92
-                if ($pseudoRole[$page][RoleConfiguration::ALL] === RoleConfiguration::ACCESS_DENY) {
93
-                    return self::ERROR_DENIED;
94
-                }
95
-            }
96
-
97
-            // check normal route
98
-            if (isset($pseudoRole[$page][$route])) {
99
-                if ($pseudoRole[$page][$route] === RoleConfiguration::ACCESS_DENY) {
100
-                    return self::ERROR_DENIED;
101
-                }
102
-
103
-                if ($pseudoRole[$page][$route] === RoleConfiguration::ACCESS_ALLOW) {
104
-                    return self::ALLOWED;
105
-                }
106
-            }
107
-
108
-            // check for allowed on catch-all route
109
-            if (isset($pseudoRole[$page][RoleConfiguration::ALL])) {
110
-                if ($pseudoRole[$page][RoleConfiguration::ALL] === RoleConfiguration::ACCESS_ALLOW) {
111
-                    return self::ALLOWED;
112
-                }
113
-            }
114
-        }
115
-
116
-        // return indeterminate result
117
-        return null;
118
-    }
119
-
120
-    /**
121
-     * Takes an array of roles and flattens the values to a single set.
122
-     *
123
-     * @param array $activeRoles
124
-     *
125
-     * @return array
126
-     */
127
-    private function flattenRoles($activeRoles)
128
-    {
129
-        $result = array();
130
-
131
-        $roleConfig = $this->roleConfiguration->getApplicableRoles($activeRoles);
132
-
133
-        // Iterate over every page in every role
134
-        foreach ($roleConfig as $role) {
135
-            foreach ($role as $page => $pageRights) {
136
-                // Create holder in result for this page
137
-                if (!isset($result[$page])) {
138
-                    $result[$page] = array();
139
-                }
140
-
141
-                foreach ($pageRights as $action => $permission) {
142
-                    // Deny takes precedence, so if it's set, don't change it.
143
-                    if (isset($result[$page][$action])) {
144
-                        if ($result[$page][$action] === RoleConfiguration::ACCESS_DENY) {
145
-                            continue;
146
-                        }
147
-                    }
148
-
149
-                    if ($permission === RoleConfiguration::ACCESS_DEFAULT) {
150
-                        // Configured to do precisely nothing.
151
-                        continue;
152
-                    }
153
-
154
-                    $result[$page][$action] = $permission;
155
-                }
156
-            }
157
-        }
158
-
159
-        return $result;
160
-    }
161
-
162
-    /**
163
-     * @param User  $user
164
-     * @param array $activeRoles
165
-     * @param array $inactiveRoles
166
-     */
167
-    public function getActiveRoles(User $user, &$activeRoles, &$inactiveRoles)
168
-    {
169
-        // Default to the community user here, because the main user is logged out
170
-        $identified = false;
171
-        $userRoles = array('public');
172
-
173
-        // if we're not the community user, get our real rights.
174
-        if (!$user->isCommunityUser()) {
175
-            // Check the user's status - only active users are allowed the effects of roles
176
-
177
-            $userRoles[] = 'loggedIn';
178
-
179
-            if ($user->isActive()) {
180
-                $ur = UserRole::getForUser($user->getId(), $user->getDatabase());
181
-
182
-                // NOTE: public is still in this array.
183
-                foreach ($ur as $r) {
184
-                    $userRoles[] = $r->getRole();
185
-                }
186
-
187
-                $identified = $user->isIdentified($this->identificationVerifier);
188
-            }
189
-        }
190
-
191
-        $activeRoles = array();
192
-        $inactiveRoles = array();
193
-
194
-        /** @var string $v */
195
-        foreach ($userRoles as $v) {
196
-            if ($this->roleConfiguration->roleNeedsIdentification($v)) {
197
-                if ($identified) {
198
-                    $activeRoles[] = $v;
199
-                }
200
-                else {
201
-                    $inactiveRoles[] = $v;
202
-                }
203
-            }
204
-            else {
205
-                $activeRoles[] = $v;
206
-            }
207
-        }
208
-    }
209
-
210
-    public function getRoleConfiguration(){
211
-        return $this->roleConfiguration;
212
-    }
17
+	const ALLOWED = 1;
18
+	const ERROR_NOT_IDENTIFIED = 2;
19
+	const ERROR_DENIED = 3;
20
+	/** @var IdentificationVerifier */
21
+	private $identificationVerifier;
22
+	/**
23
+	 * @var RoleConfiguration
24
+	 */
25
+	private $roleConfiguration;
26
+
27
+	/**
28
+	 * SecurityManager constructor.
29
+	 *
30
+	 * @param IdentificationVerifier $identificationVerifier
31
+	 * @param RoleConfiguration      $roleConfiguration
32
+	 */
33
+	public function __construct(
34
+		IdentificationVerifier $identificationVerifier,
35
+		RoleConfiguration $roleConfiguration
36
+	) {
37
+		$this->identificationVerifier = $identificationVerifier;
38
+		$this->roleConfiguration = $roleConfiguration;
39
+	}
40
+
41
+	/**
42
+	 * Tests if a user is allowed to perform an action.
43
+	 *
44
+	 * This method should form a hard, deterministic security barrier, and only return true if it is absolutely sure
45
+	 * that a user should have access to something.
46
+	 *
47
+	 * @param string $page
48
+	 * @param string $route
49
+	 * @param User   $user
50
+	 *
51
+	 * @return int
52
+	 *
53
+	 * @category Security-Critical
54
+	 */
55
+	public function allows($page, $route, User $user)
56
+	{
57
+		$this->getActiveRoles($user, $activeRoles, $inactiveRoles);
58
+
59
+		$availableRights = $this->flattenRoles($activeRoles);
60
+		$testResult = $this->findResult($availableRights, $page, $route);
61
+
62
+		if ($testResult !== null) {
63
+			// We got a firm result here, so just return it.
64
+			return $testResult;
65
+		}
66
+
67
+		// No firm result yet, so continue testing the inactive roles so we can give a better error.
68
+		$inactiveRights = $this->flattenRoles($inactiveRoles);
69
+		$testResult = $this->findResult($inactiveRights, $page, $route);
70
+
71
+		if ($testResult === self::ALLOWED) {
72
+			// The user is allowed to access this, but their role is inactive.
73
+			return self::ERROR_NOT_IDENTIFIED;
74
+		}
75
+
76
+		// Other options from the secondary test are denied and inconclusive, which at this point defaults to denied.
77
+		return self::ERROR_DENIED;
78
+	}
79
+
80
+	/**
81
+	 * @param array  $pseudoRole The role (flattened) to check
82
+	 * @param string $page       The page class to check
83
+	 * @param string $route      The page route to check
84
+	 *
85
+	 * @return int|null
86
+	 */
87
+	private function findResult($pseudoRole, $page, $route)
88
+	{
89
+		if (isset($pseudoRole[$page])) {
90
+			// check for deny on catch-all route
91
+			if (isset($pseudoRole[$page][RoleConfiguration::ALL])) {
92
+				if ($pseudoRole[$page][RoleConfiguration::ALL] === RoleConfiguration::ACCESS_DENY) {
93
+					return self::ERROR_DENIED;
94
+				}
95
+			}
96
+
97
+			// check normal route
98
+			if (isset($pseudoRole[$page][$route])) {
99
+				if ($pseudoRole[$page][$route] === RoleConfiguration::ACCESS_DENY) {
100
+					return self::ERROR_DENIED;
101
+				}
102
+
103
+				if ($pseudoRole[$page][$route] === RoleConfiguration::ACCESS_ALLOW) {
104
+					return self::ALLOWED;
105
+				}
106
+			}
107
+
108
+			// check for allowed on catch-all route
109
+			if (isset($pseudoRole[$page][RoleConfiguration::ALL])) {
110
+				if ($pseudoRole[$page][RoleConfiguration::ALL] === RoleConfiguration::ACCESS_ALLOW) {
111
+					return self::ALLOWED;
112
+				}
113
+			}
114
+		}
115
+
116
+		// return indeterminate result
117
+		return null;
118
+	}
119
+
120
+	/**
121
+	 * Takes an array of roles and flattens the values to a single set.
122
+	 *
123
+	 * @param array $activeRoles
124
+	 *
125
+	 * @return array
126
+	 */
127
+	private function flattenRoles($activeRoles)
128
+	{
129
+		$result = array();
130
+
131
+		$roleConfig = $this->roleConfiguration->getApplicableRoles($activeRoles);
132
+
133
+		// Iterate over every page in every role
134
+		foreach ($roleConfig as $role) {
135
+			foreach ($role as $page => $pageRights) {
136
+				// Create holder in result for this page
137
+				if (!isset($result[$page])) {
138
+					$result[$page] = array();
139
+				}
140
+
141
+				foreach ($pageRights as $action => $permission) {
142
+					// Deny takes precedence, so if it's set, don't change it.
143
+					if (isset($result[$page][$action])) {
144
+						if ($result[$page][$action] === RoleConfiguration::ACCESS_DENY) {
145
+							continue;
146
+						}
147
+					}
148
+
149
+					if ($permission === RoleConfiguration::ACCESS_DEFAULT) {
150
+						// Configured to do precisely nothing.
151
+						continue;
152
+					}
153
+
154
+					$result[$page][$action] = $permission;
155
+				}
156
+			}
157
+		}
158
+
159
+		return $result;
160
+	}
161
+
162
+	/**
163
+	 * @param User  $user
164
+	 * @param array $activeRoles
165
+	 * @param array $inactiveRoles
166
+	 */
167
+	public function getActiveRoles(User $user, &$activeRoles, &$inactiveRoles)
168
+	{
169
+		// Default to the community user here, because the main user is logged out
170
+		$identified = false;
171
+		$userRoles = array('public');
172
+
173
+		// if we're not the community user, get our real rights.
174
+		if (!$user->isCommunityUser()) {
175
+			// Check the user's status - only active users are allowed the effects of roles
176
+
177
+			$userRoles[] = 'loggedIn';
178
+
179
+			if ($user->isActive()) {
180
+				$ur = UserRole::getForUser($user->getId(), $user->getDatabase());
181
+
182
+				// NOTE: public is still in this array.
183
+				foreach ($ur as $r) {
184
+					$userRoles[] = $r->getRole();
185
+				}
186
+
187
+				$identified = $user->isIdentified($this->identificationVerifier);
188
+			}
189
+		}
190
+
191
+		$activeRoles = array();
192
+		$inactiveRoles = array();
193
+
194
+		/** @var string $v */
195
+		foreach ($userRoles as $v) {
196
+			if ($this->roleConfiguration->roleNeedsIdentification($v)) {
197
+				if ($identified) {
198
+					$activeRoles[] = $v;
199
+				}
200
+				else {
201
+					$inactiveRoles[] = $v;
202
+				}
203
+			}
204
+			else {
205
+				$activeRoles[] = $v;
206
+			}
207
+		}
208
+	}
209
+
210
+	public function getRoleConfiguration(){
211
+		return $this->roleConfiguration;
212
+	}
213 213
 }
Please login to merge, or discard this patch.
includes/Tasks/InternalPageBase.php 1 patch
Indentation   +221 added lines, -221 removed lines patch added patch discarded remove patch
@@ -22,225 +22,225 @@
 block discarded – undo
22 22
 
23 23
 abstract class InternalPageBase extends PageBase
24 24
 {
25
-    use NavigationMenuAccessControl;
26
-
27
-    /** @var IdentificationVerifier */
28
-    private $identificationVerifier;
29
-    /** @var ITypeAheadHelper */
30
-    private $typeAheadHelper;
31
-    /** @var SecurityManager */
32
-    private $securityManager;
33
-    /** @var IBlacklistHelper */
34
-    private $blacklistHelper;
35
-
36
-    /**
37
-     * @return ITypeAheadHelper
38
-     */
39
-    public function getTypeAheadHelper()
40
-    {
41
-        return $this->typeAheadHelper;
42
-    }
43
-
44
-    /**
45
-     * Sets up the internal IdentificationVerifier instance.  Intended to be called from WebStart::setupHelpers().
46
-     *
47
-     * @param IdentificationVerifier $identificationVerifier
48
-     *
49
-     * @return void
50
-     */
51
-    public function setIdentificationVerifier(IdentificationVerifier $identificationVerifier)
52
-    {
53
-        $this->identificationVerifier = $identificationVerifier;
54
-    }
55
-
56
-    /**
57
-     * @param ITypeAheadHelper $typeAheadHelper
58
-     */
59
-    public function setTypeAheadHelper(ITypeAheadHelper $typeAheadHelper)
60
-    {
61
-        $this->typeAheadHelper = $typeAheadHelper;
62
-    }
63
-
64
-    /**
65
-     * Runs the page code
66
-     *
67
-     * @throws Exception
68
-     * @category Security-Critical
69
-     */
70
-    final public function execute()
71
-    {
72
-        if ($this->getRouteName() === null) {
73
-            throw new Exception("Request is unrouted.");
74
-        }
75
-
76
-        if ($this->getSiteConfiguration() === null) {
77
-            throw new Exception("Page has no configuration!");
78
-        }
79
-
80
-        $this->setupPage();
81
-
82
-        $this->touchUserLastActive();
83
-
84
-        $currentUser = User::getCurrent($this->getDatabase());
85
-
86
-        // Hey, this is also a security barrier, in addition to the below. Separated out for readability.
87
-        if (!$this->isProtectedPage()) {
88
-            // This page is /not/ a protected page, as such we can just run it.
89
-            $this->runPage();
90
-
91
-            return;
92
-        }
93
-
94
-        // Security barrier.
95
-        //
96
-        // This code essentially doesn't care if the user is logged in or not, as the security manager hides all that
97
-        // away for us
98
-        $securityResult = $this->getSecurityManager()->allows(get_called_class(), $this->getRouteName(), $currentUser);
99
-        if ($securityResult === SecurityManager::ALLOWED) {
100
-            // We're allowed to run the page, so let's run it.
101
-            $this->runPage();
102
-        }
103
-        else {
104
-            $this->handleAccessDenied($securityResult);
105
-
106
-            // Send the headers
107
-            $this->sendResponseHeaders();
108
-        }
109
-    }
110
-
111
-    /**
112
-     * Performs final tasks needed before rendering the page.
113
-     */
114
-    final public function finalisePage()
115
-    {
116
-        parent::finalisePage();
117
-
118
-        $this->assign('typeAheadBlock', $this->getTypeAheadHelper()->getTypeAheadScriptBlock());
119
-
120
-        $database = $this->getDatabase();
121
-
122
-        $currentUser = User::getCurrent($database);
123
-        if (!$currentUser->isCommunityUser()) {
124
-            $sql = 'SELECT * FROM user WHERE lastactive > DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 5 MINUTE);';
125
-            $statement = $database->query($sql);
126
-            $activeUsers = $statement->fetchAll(PDO::FETCH_CLASS, User::class);
127
-            $this->assign('onlineusers', $activeUsers);
128
-        }
129
-
130
-        $this->setupNavMenuAccess($currentUser);
131
-    }
132
-
133
-    /**
134
-     * Configures whether the page respects roles or not. You probably want this to return true.
135
-     *
136
-     * Set to false for public pages. You probably want this to return true.
137
-     *
138
-     * This defaults to true unless you explicitly set it to false. Setting it to false means anybody can do anything
139
-     * on this page, so you probably want this to return true.
140
-     *
141
-     * @return bool
142
-     * @category Security-Critical
143
-     */
144
-    protected function isProtectedPage()
145
-    {
146
-        return true;
147
-    }
148
-
149
-    protected function handleAccessDenied($denyReason)
150
-    {
151
-        $currentUser = User::getCurrent($this->getDatabase());
152
-
153
-        // Not allowed to access this resource.
154
-        // Firstly, let's check if we're even logged in.
155
-        if ($currentUser->isCommunityUser()) {
156
-            // Not logged in, redirect to login page
157
-            WebRequest::setPostLoginRedirect();
158
-            $this->redirect("login");
159
-
160
-            return;
161
-        }
162
-        else {
163
-            // Decide whether this was a rights failure, or an identification failure.
164
-
165
-            if ($denyReason === SecurityManager::ERROR_NOT_IDENTIFIED) {
166
-                // Not identified
167
-                throw new NotIdentifiedException($this->getSecurityManager());
168
-            }
169
-            elseif ($denyReason === SecurityManager::ERROR_DENIED) {
170
-                // Nope, plain old access denied
171
-                throw new AccessDeniedException($this->getSecurityManager());
172
-            }
173
-            else {
174
-                throw new Exception('Unknown response from security manager.');
175
-            }
176
-        }
177
-    }
178
-
179
-    /**
180
-     * Tests the security barrier for a specified action.
181
-     *
182
-     * Don't use within templates
183
-     *
184
-     * @param string      $action
185
-     *
186
-     * @param User        $user
187
-     * @param null|string $pageName
188
-     *
189
-     * @return bool
190
-     * @category Security-Critical
191
-     */
192
-    final public function barrierTest($action, User $user, $pageName = null)
193
-    {
194
-        $page = get_called_class();
195
-        if ($pageName !== null) {
196
-            $page = $pageName;
197
-        }
198
-
199
-        $securityResult = $this->getSecurityManager()->allows($page, $action, $user);
200
-
201
-        return $securityResult === SecurityManager::ALLOWED;
202
-    }
203
-
204
-    /**
205
-     * Updates the lastactive timestamp
206
-     */
207
-    private function touchUserLastActive()
208
-    {
209
-        if (WebRequest::getSessionUserId() !== null) {
210
-            $query = 'UPDATE user SET lastactive = CURRENT_TIMESTAMP() WHERE id = :id;';
211
-            $this->getDatabase()->prepare($query)->execute(array(":id" => WebRequest::getSessionUserId()));
212
-        }
213
-    }
214
-
215
-    /**
216
-     * @return SecurityManager
217
-     */
218
-    public function getSecurityManager()
219
-    {
220
-        return $this->securityManager;
221
-    }
222
-
223
-    /**
224
-     * @param SecurityManager $securityManager
225
-     */
226
-    public function setSecurityManager(SecurityManager $securityManager)
227
-    {
228
-        $this->securityManager = $securityManager;
229
-    }
230
-
231
-    /**
232
-     * @return IBlacklistHelper
233
-     */
234
-    public function getBlacklistHelper()
235
-    {
236
-        return $this->blacklistHelper;
237
-    }
238
-
239
-    /**
240
-     * @param IBlacklistHelper $blacklistHelper
241
-     */
242
-    public function setBlacklistHelper(IBlacklistHelper $blacklistHelper)
243
-    {
244
-        $this->blacklistHelper = $blacklistHelper;
245
-    }
25
+	use NavigationMenuAccessControl;
26
+
27
+	/** @var IdentificationVerifier */
28
+	private $identificationVerifier;
29
+	/** @var ITypeAheadHelper */
30
+	private $typeAheadHelper;
31
+	/** @var SecurityManager */
32
+	private $securityManager;
33
+	/** @var IBlacklistHelper */
34
+	private $blacklistHelper;
35
+
36
+	/**
37
+	 * @return ITypeAheadHelper
38
+	 */
39
+	public function getTypeAheadHelper()
40
+	{
41
+		return $this->typeAheadHelper;
42
+	}
43
+
44
+	/**
45
+	 * Sets up the internal IdentificationVerifier instance.  Intended to be called from WebStart::setupHelpers().
46
+	 *
47
+	 * @param IdentificationVerifier $identificationVerifier
48
+	 *
49
+	 * @return void
50
+	 */
51
+	public function setIdentificationVerifier(IdentificationVerifier $identificationVerifier)
52
+	{
53
+		$this->identificationVerifier = $identificationVerifier;
54
+	}
55
+
56
+	/**
57
+	 * @param ITypeAheadHelper $typeAheadHelper
58
+	 */
59
+	public function setTypeAheadHelper(ITypeAheadHelper $typeAheadHelper)
60
+	{
61
+		$this->typeAheadHelper = $typeAheadHelper;
62
+	}
63
+
64
+	/**
65
+	 * Runs the page code
66
+	 *
67
+	 * @throws Exception
68
+	 * @category Security-Critical
69
+	 */
70
+	final public function execute()
71
+	{
72
+		if ($this->getRouteName() === null) {
73
+			throw new Exception("Request is unrouted.");
74
+		}
75
+
76
+		if ($this->getSiteConfiguration() === null) {
77
+			throw new Exception("Page has no configuration!");
78
+		}
79
+
80
+		$this->setupPage();
81
+
82
+		$this->touchUserLastActive();
83
+
84
+		$currentUser = User::getCurrent($this->getDatabase());
85
+
86
+		// Hey, this is also a security barrier, in addition to the below. Separated out for readability.
87
+		if (!$this->isProtectedPage()) {
88
+			// This page is /not/ a protected page, as such we can just run it.
89
+			$this->runPage();
90
+
91
+			return;
92
+		}
93
+
94
+		// Security barrier.
95
+		//
96
+		// This code essentially doesn't care if the user is logged in or not, as the security manager hides all that
97
+		// away for us
98
+		$securityResult = $this->getSecurityManager()->allows(get_called_class(), $this->getRouteName(), $currentUser);
99
+		if ($securityResult === SecurityManager::ALLOWED) {
100
+			// We're allowed to run the page, so let's run it.
101
+			$this->runPage();
102
+		}
103
+		else {
104
+			$this->handleAccessDenied($securityResult);
105
+
106
+			// Send the headers
107
+			$this->sendResponseHeaders();
108
+		}
109
+	}
110
+
111
+	/**
112
+	 * Performs final tasks needed before rendering the page.
113
+	 */
114
+	final public function finalisePage()
115
+	{
116
+		parent::finalisePage();
117
+
118
+		$this->assign('typeAheadBlock', $this->getTypeAheadHelper()->getTypeAheadScriptBlock());
119
+
120
+		$database = $this->getDatabase();
121
+
122
+		$currentUser = User::getCurrent($database);
123
+		if (!$currentUser->isCommunityUser()) {
124
+			$sql = 'SELECT * FROM user WHERE lastactive > DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 5 MINUTE);';
125
+			$statement = $database->query($sql);
126
+			$activeUsers = $statement->fetchAll(PDO::FETCH_CLASS, User::class);
127
+			$this->assign('onlineusers', $activeUsers);
128
+		}
129
+
130
+		$this->setupNavMenuAccess($currentUser);
131
+	}
132
+
133
+	/**
134
+	 * Configures whether the page respects roles or not. You probably want this to return true.
135
+	 *
136
+	 * Set to false for public pages. You probably want this to return true.
137
+	 *
138
+	 * This defaults to true unless you explicitly set it to false. Setting it to false means anybody can do anything
139
+	 * on this page, so you probably want this to return true.
140
+	 *
141
+	 * @return bool
142
+	 * @category Security-Critical
143
+	 */
144
+	protected function isProtectedPage()
145
+	{
146
+		return true;
147
+	}
148
+
149
+	protected function handleAccessDenied($denyReason)
150
+	{
151
+		$currentUser = User::getCurrent($this->getDatabase());
152
+
153
+		// Not allowed to access this resource.
154
+		// Firstly, let's check if we're even logged in.
155
+		if ($currentUser->isCommunityUser()) {
156
+			// Not logged in, redirect to login page
157
+			WebRequest::setPostLoginRedirect();
158
+			$this->redirect("login");
159
+
160
+			return;
161
+		}
162
+		else {
163
+			// Decide whether this was a rights failure, or an identification failure.
164
+
165
+			if ($denyReason === SecurityManager::ERROR_NOT_IDENTIFIED) {
166
+				// Not identified
167
+				throw new NotIdentifiedException($this->getSecurityManager());
168
+			}
169
+			elseif ($denyReason === SecurityManager::ERROR_DENIED) {
170
+				// Nope, plain old access denied
171
+				throw new AccessDeniedException($this->getSecurityManager());
172
+			}
173
+			else {
174
+				throw new Exception('Unknown response from security manager.');
175
+			}
176
+		}
177
+	}
178
+
179
+	/**
180
+	 * Tests the security barrier for a specified action.
181
+	 *
182
+	 * Don't use within templates
183
+	 *
184
+	 * @param string      $action
185
+	 *
186
+	 * @param User        $user
187
+	 * @param null|string $pageName
188
+	 *
189
+	 * @return bool
190
+	 * @category Security-Critical
191
+	 */
192
+	final public function barrierTest($action, User $user, $pageName = null)
193
+	{
194
+		$page = get_called_class();
195
+		if ($pageName !== null) {
196
+			$page = $pageName;
197
+		}
198
+
199
+		$securityResult = $this->getSecurityManager()->allows($page, $action, $user);
200
+
201
+		return $securityResult === SecurityManager::ALLOWED;
202
+	}
203
+
204
+	/**
205
+	 * Updates the lastactive timestamp
206
+	 */
207
+	private function touchUserLastActive()
208
+	{
209
+		if (WebRequest::getSessionUserId() !== null) {
210
+			$query = 'UPDATE user SET lastactive = CURRENT_TIMESTAMP() WHERE id = :id;';
211
+			$this->getDatabase()->prepare($query)->execute(array(":id" => WebRequest::getSessionUserId()));
212
+		}
213
+	}
214
+
215
+	/**
216
+	 * @return SecurityManager
217
+	 */
218
+	public function getSecurityManager()
219
+	{
220
+		return $this->securityManager;
221
+	}
222
+
223
+	/**
224
+	 * @param SecurityManager $securityManager
225
+	 */
226
+	public function setSecurityManager(SecurityManager $securityManager)
227
+	{
228
+		$this->securityManager = $securityManager;
229
+	}
230
+
231
+	/**
232
+	 * @return IBlacklistHelper
233
+	 */
234
+	public function getBlacklistHelper()
235
+	{
236
+		return $this->blacklistHelper;
237
+	}
238
+
239
+	/**
240
+	 * @param IBlacklistHelper $blacklistHelper
241
+	 */
242
+	public function setBlacklistHelper(IBlacklistHelper $blacklistHelper)
243
+	{
244
+		$this->blacklistHelper = $blacklistHelper;
245
+	}
246 246
 }
Please login to merge, or discard this patch.
includes/Exceptions/AccessDeniedException.php 1 patch
Indentation   +85 added lines, -85 removed lines patch added patch discarded remove patch
@@ -26,89 +26,89 @@
 block discarded – undo
26 26
  */
27 27
 class AccessDeniedException extends ReadableException
28 28
 {
29
-    use NavigationMenuAccessControl;
30
-
31
-    /**
32
-     * @var SecurityManager
33
-     */
34
-    private $securityManager;
35
-
36
-    /**
37
-     * AccessDeniedException constructor.
38
-     *
39
-     * @param SecurityManager $securityManager
40
-     */
41
-    public function __construct(SecurityManager $securityManager = null)
42
-    {
43
-        $this->securityManager = $securityManager;
44
-    }
45
-
46
-    public function getReadableError()
47
-    {
48
-        if (!headers_sent()) {
49
-            header("HTTP/1.1 403 Forbidden");
50
-        }
51
-
52
-        $this->setUpSmarty();
53
-
54
-        // uck. We should still be able to access the database in this situation though.
55
-        $database = PdoDatabase::getDatabaseConnection('acc');
56
-        $currentUser = User::getCurrent($database);
57
-        $this->assign('currentUser', $currentUser);
58
-        $this->assign("loggedIn", (!$currentUser->isCommunityUser()));
59
-
60
-        if($this->securityManager !== null) {
61
-            $this->setupNavMenuAccess($currentUser);
62
-        }
63
-
64
-        if ($currentUser->isDeclined()) {
65
-            $this->assign('htmlTitle', 'Account Declined');
66
-            $this->assign('declineReason', $this->getLogEntry('Declined', $currentUser, $database));
67
-
68
-            return $this->fetchTemplate("exception/account-declined.tpl");
69
-        }
70
-
71
-        if ($currentUser->isSuspended()) {
72
-            $this->assign('htmlTitle', 'Account Suspended');
73
-            $this->assign('suspendReason', $this->getLogEntry('Suspended', $currentUser, $database));
74
-
75
-            return $this->fetchTemplate("exception/account-suspended.tpl");
76
-        }
77
-
78
-        if ($currentUser->isNewUser()) {
79
-            $this->assign('htmlTitle', 'Account Pending');
80
-
81
-            return $this->fetchTemplate("exception/account-new.tpl");
82
-        }
83
-
84
-        return $this->fetchTemplate("exception/access-denied.tpl");
85
-    }
86
-
87
-    /**
88
-     * @param string      $action
89
-     * @param User        $user
90
-     * @param PdoDatabase $database
91
-     *
92
-     * @return null|string
93
-     */
94
-    private function getLogEntry($action, User $user, PdoDatabase $database)
95
-    {
96
-        /** @var Log[] $logs */
97
-        $logs = LogSearchHelper::get($database)
98
-            ->byAction($action)
99
-            ->byObjectType('User')
100
-            ->byObjectId($user->getId())
101
-            ->limit(1)
102
-            ->fetch();
103
-
104
-        return $logs[0]->getComment();
105
-    }
106
-
107
-    /**
108
-     * @return SecurityManager
109
-     */
110
-    protected function getSecurityManager()
111
-    {
112
-        return $this->securityManager;
113
-    }
29
+	use NavigationMenuAccessControl;
30
+
31
+	/**
32
+	 * @var SecurityManager
33
+	 */
34
+	private $securityManager;
35
+
36
+	/**
37
+	 * AccessDeniedException constructor.
38
+	 *
39
+	 * @param SecurityManager $securityManager
40
+	 */
41
+	public function __construct(SecurityManager $securityManager = null)
42
+	{
43
+		$this->securityManager = $securityManager;
44
+	}
45
+
46
+	public function getReadableError()
47
+	{
48
+		if (!headers_sent()) {
49
+			header("HTTP/1.1 403 Forbidden");
50
+		}
51
+
52
+		$this->setUpSmarty();
53
+
54
+		// uck. We should still be able to access the database in this situation though.
55
+		$database = PdoDatabase::getDatabaseConnection('acc');
56
+		$currentUser = User::getCurrent($database);
57
+		$this->assign('currentUser', $currentUser);
58
+		$this->assign("loggedIn", (!$currentUser->isCommunityUser()));
59
+
60
+		if($this->securityManager !== null) {
61
+			$this->setupNavMenuAccess($currentUser);
62
+		}
63
+
64
+		if ($currentUser->isDeclined()) {
65
+			$this->assign('htmlTitle', 'Account Declined');
66
+			$this->assign('declineReason', $this->getLogEntry('Declined', $currentUser, $database));
67
+
68
+			return $this->fetchTemplate("exception/account-declined.tpl");
69
+		}
70
+
71
+		if ($currentUser->isSuspended()) {
72
+			$this->assign('htmlTitle', 'Account Suspended');
73
+			$this->assign('suspendReason', $this->getLogEntry('Suspended', $currentUser, $database));
74
+
75
+			return $this->fetchTemplate("exception/account-suspended.tpl");
76
+		}
77
+
78
+		if ($currentUser->isNewUser()) {
79
+			$this->assign('htmlTitle', 'Account Pending');
80
+
81
+			return $this->fetchTemplate("exception/account-new.tpl");
82
+		}
83
+
84
+		return $this->fetchTemplate("exception/access-denied.tpl");
85
+	}
86
+
87
+	/**
88
+	 * @param string      $action
89
+	 * @param User        $user
90
+	 * @param PdoDatabase $database
91
+	 *
92
+	 * @return null|string
93
+	 */
94
+	private function getLogEntry($action, User $user, PdoDatabase $database)
95
+	{
96
+		/** @var Log[] $logs */
97
+		$logs = LogSearchHelper::get($database)
98
+			->byAction($action)
99
+			->byObjectType('User')
100
+			->byObjectId($user->getId())
101
+			->limit(1)
102
+			->fetch();
103
+
104
+		return $logs[0]->getComment();
105
+	}
106
+
107
+	/**
108
+	 * @return SecurityManager
109
+	 */
110
+	protected function getSecurityManager()
111
+	{
112
+		return $this->securityManager;
113
+	}
114 114
 }
115 115
\ No newline at end of file
Please login to merge, or discard this patch.
includes/Exceptions/NotIdentifiedException.php 1 patch
Indentation   +41 added lines, -41 removed lines patch added patch discarded remove patch
@@ -15,52 +15,52 @@
 block discarded – undo
15 15
 
16 16
 class NotIdentifiedException extends ReadableException
17 17
 {
18
-    use NavigationMenuAccessControl;
19
-    /**
20
-     * @var SecurityManager
21
-     */
22
-    private $securityManager;
18
+	use NavigationMenuAccessControl;
19
+	/**
20
+	 * @var SecurityManager
21
+	 */
22
+	private $securityManager;
23 23
 
24
-    /**
25
-     * NotIdentifiedException constructor.
26
-     *
27
-     * @param SecurityManager $securityManager
28
-     */
29
-    public function __construct(SecurityManager $securityManager = null)
30
-    {
31
-        $this->securityManager = $securityManager;
32
-    }
24
+	/**
25
+	 * NotIdentifiedException constructor.
26
+	 *
27
+	 * @param SecurityManager $securityManager
28
+	 */
29
+	public function __construct(SecurityManager $securityManager = null)
30
+	{
31
+		$this->securityManager = $securityManager;
32
+	}
33 33
 
34
-    /**
35
-     * Returns a readable HTML error message that's displayable to the user using templates.
36
-     * @return string
37
-     */
38
-    public function getReadableError()
39
-    {
40
-        if (!headers_sent()) {
41
-            header("HTTP/1.1 403 Forbidden");
42
-        }
34
+	/**
35
+	 * Returns a readable HTML error message that's displayable to the user using templates.
36
+	 * @return string
37
+	 */
38
+	public function getReadableError()
39
+	{
40
+		if (!headers_sent()) {
41
+			header("HTTP/1.1 403 Forbidden");
42
+		}
43 43
 
44
-        $this->setUpSmarty();
44
+		$this->setUpSmarty();
45 45
 
46
-        // uck. We should still be able to access the database in this situation though.
47
-        $database = PdoDatabase::getDatabaseConnection('acc');
48
-        $currentUser = User::getCurrent($database);
49
-        $this->assign('currentUser', $currentUser);
50
-        $this->assign("loggedIn", (!$currentUser->isCommunityUser()));
46
+		// uck. We should still be able to access the database in this situation though.
47
+		$database = PdoDatabase::getDatabaseConnection('acc');
48
+		$currentUser = User::getCurrent($database);
49
+		$this->assign('currentUser', $currentUser);
50
+		$this->assign("loggedIn", (!$currentUser->isCommunityUser()));
51 51
 
52
-        if($this->securityManager !== null) {
53
-            $this->setupNavMenuAccess($currentUser);
54
-        }
52
+		if($this->securityManager !== null) {
53
+			$this->setupNavMenuAccess($currentUser);
54
+		}
55 55
 
56
-        return $this->fetchTemplate("exception/not-identified.tpl");
57
-    }
56
+		return $this->fetchTemplate("exception/not-identified.tpl");
57
+	}
58 58
 
59
-    /**
60
-     * @return SecurityManager
61
-     */
62
-    protected function getSecurityManager()
63
-    {
64
-        return $this->securityManager;
65
-    }
59
+	/**
60
+	 * @return SecurityManager
61
+	 */
62
+	protected function getSecurityManager()
63
+	{
64
+		return $this->securityManager;
65
+	}
66 66
 }
67 67
\ No newline at end of file
Please login to merge, or discard this patch.