Completed
Push — bootstrap4 ( c24853...dc7ca1 )
by Simon
06:16
created
includes/IdentificationVerifier.php 3 patches
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.
Braces   +2 added lines, -1 removed lines patch added patch discarded remove patch
@@ -187,7 +187,8 @@
 block discarded – undo
187 187
             $endpoint = $this->siteConfiguration->getMetaWikimediaWebServiceEndpoint();
188 188
             $response = $this->httpHelper->get($endpoint, $parameters);
189 189
             $response = json_decode($response, true);
190
-        } catch (CurlException $ex) {
190
+        }
191
+        catch (CurlException $ex) {
191 192
             // failed getting identification status, so throw a nicer error.
192 193
             $m = 'Could not contact metawiki API to determine user\' identification status. '
193 194
                 . 'This is probably a transient error, so please try again.';
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -181,7 +181,7 @@  discard block
 block discarded – undo
181 181
         $onWikiName = $strings->ucfirst($onWikiName);
182 182
 
183 183
         $parameters = self::$apiQueryParameters;
184
-        $parameters['pltitles'] = "User:" . $onWikiName;
184
+        $parameters['pltitles'] = "User:".$onWikiName;
185 185
 
186 186
         try {
187 187
             $endpoint = $this->siteConfiguration->getMetaWikimediaWebServiceEndpoint();
@@ -197,6 +197,6 @@  discard block
 block discarded – undo
197 197
 
198 198
         $page = @array_pop($response['query']['pages']);
199 199
 
200
-        return @$page['links'][0]['title'] === "User:" . $onWikiName;
200
+        return @$page['links'][0]['title'] === "User:".$onWikiName;
201 201
     }
202 202
 }
Please login to merge, or discard this patch.
includes/Exceptions/AccessDeniedException.php 3 patches
Unused Use Statements   -2 removed lines patch added patch discarded remove patch
@@ -11,9 +11,7 @@
 block discarded – undo
11 11
 use Waca\DataObjects\Log;
12 12
 use Waca\DataObjects\User;
13 13
 use Waca\Fragments\NavigationMenuAccessControl;
14
-use Waca\Helpers\HttpHelper;
15 14
 use Waca\Helpers\SearchHelpers\LogSearchHelper;
16
-use Waca\IdentificationVerifier;
17 15
 use Waca\PdoDatabase;
18 16
 use Waca\Security\SecurityManager;
19 17
 
Please login to merge, or discard this 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.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -57,7 +57,7 @@
 block discarded – undo
57 57
         $this->assign('currentUser', $currentUser);
58 58
         $this->assign("loggedIn", (!$currentUser->isCommunityUser()));
59 59
 
60
-        if($this->securityManager !== null) {
60
+        if ($this->securityManager !== null) {
61 61
             $this->setupNavMenuAccess($currentUser);
62 62
         }
63 63
 
Please login to merge, or discard this patch.
includes/Fragments/NavigationMenuAccessControl.php 2 patches
Doc Comments   +5 added lines, -1 removed lines patch added patch discarded remove patch
@@ -24,6 +24,10 @@  discard block
 block discarded – undo
24 24
 
25 25
 trait NavigationMenuAccessControl
26 26
 {
27
+    /**
28
+     * @param string $name
29
+     * @param boolean $value
30
+     */
27 31
     protected abstract function assign($name, $value);
28 32
 
29 33
     /**
@@ -32,7 +36,7 @@  discard block
 block discarded – undo
32 36
     protected abstract function getSecurityManager();
33 37
 
34 38
     /**
35
-     * @param $currentUser
39
+     * @param \Waca\DataObjects\User $currentUser
36 40
      */
37 41
     protected function setupNavMenuAccess($currentUser)
38 42
     {
Please login to merge, or discard this patch.
Indentation   +36 added lines, -36 removed lines patch added patch discarded remove patch
@@ -24,45 +24,45 @@
 block discarded – undo
24 24
 
25 25
 trait NavigationMenuAccessControl
26 26
 {
27
-    protected abstract function assign($name, $value);
27
+	protected abstract function assign($name, $value);
28 28
 
29
-    /**
30
-     * @return SecurityManager
31
-     */
32
-    protected abstract function getSecurityManager();
29
+	/**
30
+	 * @return SecurityManager
31
+	 */
32
+	protected abstract function getSecurityManager();
33 33
 
34
-    /**
35
-     * @param $currentUser
36
-     */
37
-    protected function setupNavMenuAccess($currentUser)
38
-    {
39
-        $this->assign('nav__canRequests', $this->getSecurityManager()
40
-                ->allows(PageMain::class, RoleConfiguration::MAIN, $currentUser) === SecurityManager::ALLOWED);
34
+	/**
35
+	 * @param $currentUser
36
+	 */
37
+	protected function setupNavMenuAccess($currentUser)
38
+	{
39
+		$this->assign('nav__canRequests', $this->getSecurityManager()
40
+				->allows(PageMain::class, RoleConfiguration::MAIN, $currentUser) === SecurityManager::ALLOWED);
41 41
 
42
-        $this->assign('nav__canLogs', $this->getSecurityManager()
43
-                ->allows(PageLog::class, RoleConfiguration::MAIN, $currentUser) === SecurityManager::ALLOWED);
44
-        $this->assign('nav__canUsers', $this->getSecurityManager()
45
-                ->allows(StatsUsers::class, RoleConfiguration::MAIN, $currentUser) === SecurityManager::ALLOWED);
46
-        $this->assign('nav__canSearch', $this->getSecurityManager()
47
-                ->allows(PageSearch::class, RoleConfiguration::MAIN, $currentUser) === SecurityManager::ALLOWED);
48
-        $this->assign('nav__canStats', $this->getSecurityManager()
49
-                ->allows(StatsMain::class, RoleConfiguration::MAIN, $currentUser) === SecurityManager::ALLOWED);
42
+		$this->assign('nav__canLogs', $this->getSecurityManager()
43
+				->allows(PageLog::class, RoleConfiguration::MAIN, $currentUser) === SecurityManager::ALLOWED);
44
+		$this->assign('nav__canUsers', $this->getSecurityManager()
45
+				->allows(StatsUsers::class, RoleConfiguration::MAIN, $currentUser) === SecurityManager::ALLOWED);
46
+		$this->assign('nav__canSearch', $this->getSecurityManager()
47
+				->allows(PageSearch::class, RoleConfiguration::MAIN, $currentUser) === SecurityManager::ALLOWED);
48
+		$this->assign('nav__canStats', $this->getSecurityManager()
49
+				->allows(StatsMain::class, RoleConfiguration::MAIN, $currentUser) === SecurityManager::ALLOWED);
50 50
 
51
-        $this->assign('nav__canBan', $this->getSecurityManager()
52
-                ->allows(PageBan::class, RoleConfiguration::MAIN, $currentUser) === SecurityManager::ALLOWED);
53
-        $this->assign('nav__canEmailMgmt', $this->getSecurityManager()
54
-                ->allows(PageEmailManagement::class, RoleConfiguration::MAIN,
55
-                    $currentUser) === SecurityManager::ALLOWED);
56
-        $this->assign('nav__canWelcomeMgmt', $this->getSecurityManager()
57
-                ->allows(PageWelcomeTemplateManagement::class, RoleConfiguration::MAIN,
58
-                    $currentUser) === SecurityManager::ALLOWED);
59
-        $this->assign('nav__canSiteNoticeMgmt', $this->getSecurityManager()
60
-                ->allows(PageSiteNotice::class, RoleConfiguration::MAIN, $currentUser) === SecurityManager::ALLOWED);
61
-        $this->assign('nav__canUserMgmt', $this->getSecurityManager()
62
-                ->allows(PageUserManagement::class, RoleConfiguration::MAIN,
63
-                    $currentUser) === SecurityManager::ALLOWED);
51
+		$this->assign('nav__canBan', $this->getSecurityManager()
52
+				->allows(PageBan::class, RoleConfiguration::MAIN, $currentUser) === SecurityManager::ALLOWED);
53
+		$this->assign('nav__canEmailMgmt', $this->getSecurityManager()
54
+				->allows(PageEmailManagement::class, RoleConfiguration::MAIN,
55
+					$currentUser) === SecurityManager::ALLOWED);
56
+		$this->assign('nav__canWelcomeMgmt', $this->getSecurityManager()
57
+				->allows(PageWelcomeTemplateManagement::class, RoleConfiguration::MAIN,
58
+					$currentUser) === SecurityManager::ALLOWED);
59
+		$this->assign('nav__canSiteNoticeMgmt', $this->getSecurityManager()
60
+				->allows(PageSiteNotice::class, RoleConfiguration::MAIN, $currentUser) === SecurityManager::ALLOWED);
61
+		$this->assign('nav__canUserMgmt', $this->getSecurityManager()
62
+				->allows(PageUserManagement::class, RoleConfiguration::MAIN,
63
+					$currentUser) === SecurityManager::ALLOWED);
64 64
 
65
-        $this->assign('nav__canViewRequest', $this->getSecurityManager()
66
-                ->allows(PageViewRequest::class, RoleConfiguration::MAIN, $currentUser) === SecurityManager::ALLOWED);
67
-    }
65
+		$this->assign('nav__canViewRequest', $this->getSecurityManager()
66
+				->allows(PageViewRequest::class, RoleConfiguration::MAIN, $currentUser) === SecurityManager::ALLOWED);
67
+	}
68 68
 }
69 69
\ No newline at end of file
Please login to merge, or discard this patch.
includes/Pages/Registration/PageRegisterBase.php 2 patches
Doc Comments   +8 added lines, -5 removed lines patch added patch discarded remove patch
@@ -44,6 +44,9 @@  discard block
 block discarded – undo
44 44
         }
45 45
     }
46 46
 
47
+    /**
48
+     * @return string
49
+     */
47 50
     protected abstract function getRegistrationTemplate();
48 51
 
49 52
     protected function isProtectedPage()
@@ -70,12 +73,12 @@  discard block
 block discarded – undo
70 73
     }
71 74
 
72 75
     /**
73
-     * @param $emailAddress
74
-     * @param $password
75
-     * @param $username
76
+     * @param null|string $emailAddress
77
+     * @param null|string $password
78
+     * @param null|string $username
76 79
      * @param $useOAuthSignup
77
-     * @param $confirmationId
78
-     * @param $onwikiUsername
80
+     * @param null|integer $confirmationId
81
+     * @param null|string $onwikiUsername
79 82
      *
80 83
      * @throws ApplicationLogicException
81 84
      */
Please login to merge, or discard this patch.
Indentation   +198 added lines, -198 removed lines patch added patch discarded remove patch
@@ -18,202 +18,202 @@
 block discarded – undo
18 18
 
19 19
 abstract class PageRegisterBase extends InternalPageBase
20 20
 {
21
-    /**
22
-     * Main function for this page, when no specific actions are called.
23
-     */
24
-    protected function main()
25
-    {
26
-        $useOAuthSignup = $this->getSiteConfiguration()->getUseOAuthSignup();
27
-
28
-        // Dual-mode page
29
-        if (WebRequest::wasPosted()) {
30
-            $this->validateCSRFToken();
31
-
32
-            try {
33
-                $this->handlePost($useOAuthSignup);
34
-            }
35
-            catch (ApplicationLogicException $ex) {
36
-                SessionAlert::error($ex->getMessage());
37
-                $this->redirect('register');
38
-            }
39
-        }
40
-        else {
41
-            $this->assignCSRFToken();
42
-            $this->assign("useOAuthSignup", $useOAuthSignup);
43
-            $this->setTemplate($this->getRegistrationTemplate());
44
-        }
45
-    }
46
-
47
-    protected abstract function getRegistrationTemplate();
48
-
49
-    protected function isProtectedPage()
50
-    {
51
-        return false;
52
-    }
53
-
54
-    /**
55
-     * @param string $emailAddress
56
-     *
57
-     * @throws ApplicationLogicException
58
-     */
59
-    protected function validateUniqueEmail($emailAddress)
60
-    {
61
-        $query = 'SELECT COUNT(id) FROM user WHERE email = :email';
62
-        $statement = $this->getDatabase()->prepare($query);
63
-        $statement->execute(array(':email' => $emailAddress));
64
-
65
-        if ($statement->fetchColumn() > 0) {
66
-            throw new ApplicationLogicException('That email address is already in use on this system.');
67
-        }
68
-
69
-        $statement->closeCursor();
70
-    }
71
-
72
-    /**
73
-     * @param $emailAddress
74
-     * @param $password
75
-     * @param $username
76
-     * @param $useOAuthSignup
77
-     * @param $confirmationId
78
-     * @param $onwikiUsername
79
-     *
80
-     * @throws ApplicationLogicException
81
-     */
82
-    protected function validateRequest(
83
-        $emailAddress,
84
-        $password,
85
-        $username,
86
-        $useOAuthSignup,
87
-        $confirmationId,
88
-        $onwikiUsername
89
-    ) {
90
-        if (!WebRequest::postBoolean('guidelines')) {
91
-            throw new ApplicationLogicException('You must read the interface guidelines before your request may be submitted.');
92
-        }
93
-
94
-        $this->validateGeneralInformation($emailAddress, $password, $username);
95
-        $this->validateUniqueEmail($emailAddress);
96
-        $this->validateNonOAuthFields($useOAuthSignup, $confirmationId, $onwikiUsername);
97
-    }
98
-
99
-    /**
100
-     * @param $useOAuthSignup
101
-     * @param $confirmationId
102
-     * @param $onwikiUsername
103
-     *
104
-     * @throws ApplicationLogicException
105
-     */
106
-    protected function validateNonOAuthFields($useOAuthSignup, $confirmationId, $onwikiUsername)
107
-    {
108
-        if (!$useOAuthSignup) {
109
-            if ($confirmationId === null || $confirmationId <= 0) {
110
-                throw new ApplicationLogicException('Please enter the revision id of your confirmation edit.');
111
-            }
112
-
113
-            if ($onwikiUsername === null) {
114
-                throw new ApplicationLogicException('Please specify your on-wiki username.');
115
-            }
116
-        }
117
-    }
118
-
119
-    /**
120
-     * @param $emailAddress
121
-     * @param $password
122
-     * @param $username
123
-     *
124
-     * @throws ApplicationLogicException
125
-     */
126
-    protected function validateGeneralInformation($emailAddress, $password, $username)
127
-    {
128
-        if ($emailAddress === null) {
129
-            throw new ApplicationLogicException('Your email address appears to be invalid!');
130
-        }
131
-
132
-        if ($password !== WebRequest::postString('pass2')) {
133
-            throw new ApplicationLogicException('Your passwords did not match, please try again.');
134
-        }
135
-
136
-        if (User::getByUsername($username, $this->getDatabase()) !== false) {
137
-            throw new ApplicationLogicException('That username is already in use on this system.');
138
-        }
139
-    }
140
-
141
-    /**
142
-     * @param $useOAuthSignup
143
-     *
144
-     * @throws ApplicationLogicException
145
-     * @throws \Exception
146
-     */
147
-    protected function handlePost($useOAuthSignup)
148
-    {
149
-        // Get the data
150
-        $emailAddress = WebRequest::postEmail('email');
151
-        $password = WebRequest::postString('pass');
152
-        $username = WebRequest::postString('name');
153
-
154
-        // Only set if OAuth is disabled
155
-        $confirmationId = WebRequest::postInt('conf_revid');
156
-        $onwikiUsername = WebRequest::postString('wname');
157
-
158
-        // Do some validation
159
-        $this->validateRequest($emailAddress, $password, $username, $useOAuthSignup, $confirmationId,
160
-            $onwikiUsername);
161
-
162
-        $database = $this->getDatabase();
163
-
164
-        $user = new User();
165
-        $user->setDatabase($database);
166
-
167
-        $user->setUsername($username);
168
-        $user->setPassword($password);
169
-        $user->setEmail($emailAddress);
170
-
171
-        if (!$useOAuthSignup) {
172
-            $user->setOnWikiName($onwikiUsername);
173
-            $user->setConfirmationDiff($confirmationId);
174
-        }
175
-
176
-        $user->save();
177
-
178
-        $defaultRole = $this->getDefaultRole();
179
-
180
-        $role = new UserRole();
181
-        $role->setDatabase($database);
182
-        $role->setUser($user->getId());
183
-        $role->setRole($defaultRole);
184
-        $role->save();
185
-
186
-        // Log now to get the signup date.
187
-        Logger::newUser($database, $user);
188
-        Logger::userRolesEdited($database, $user, 'Registration', array($defaultRole), array());
189
-
190
-        if ($useOAuthSignup) {
191
-            $oauthHelper = $this->getOAuthHelper();
192
-
193
-            $requestToken = $oauthHelper->getRequestToken();
194
-            $user->setOAuthRequestToken($requestToken->key);
195
-            $user->setOAuthRequestSecret($requestToken->secret);
196
-            $user->save();
197
-
198
-            WebRequest::setPartialLogin($user);
199
-
200
-            $this->redirectUrl($oauthHelper->getAuthoriseUrl($requestToken->key));
201
-        }
202
-        else {
203
-            // only notify if we're not using the oauth signup.
204
-            $this->getNotificationHelper()->userNew($user);
205
-            WebRequest::setLoggedInUser($user);
206
-            $this->redirect('preferences');
207
-        }
208
-    }
209
-
210
-    protected abstract function getDefaultRole();
211
-
212
-    /**
213
-     * Entry point for registration complete
214
-     */
215
-    protected function done()
216
-    {
217
-        $this->setTemplate('registration/alert-registrationcomplete.tpl');
218
-    }
21
+	/**
22
+	 * Main function for this page, when no specific actions are called.
23
+	 */
24
+	protected function main()
25
+	{
26
+		$useOAuthSignup = $this->getSiteConfiguration()->getUseOAuthSignup();
27
+
28
+		// Dual-mode page
29
+		if (WebRequest::wasPosted()) {
30
+			$this->validateCSRFToken();
31
+
32
+			try {
33
+				$this->handlePost($useOAuthSignup);
34
+			}
35
+			catch (ApplicationLogicException $ex) {
36
+				SessionAlert::error($ex->getMessage());
37
+				$this->redirect('register');
38
+			}
39
+		}
40
+		else {
41
+			$this->assignCSRFToken();
42
+			$this->assign("useOAuthSignup", $useOAuthSignup);
43
+			$this->setTemplate($this->getRegistrationTemplate());
44
+		}
45
+	}
46
+
47
+	protected abstract function getRegistrationTemplate();
48
+
49
+	protected function isProtectedPage()
50
+	{
51
+		return false;
52
+	}
53
+
54
+	/**
55
+	 * @param string $emailAddress
56
+	 *
57
+	 * @throws ApplicationLogicException
58
+	 */
59
+	protected function validateUniqueEmail($emailAddress)
60
+	{
61
+		$query = 'SELECT COUNT(id) FROM user WHERE email = :email';
62
+		$statement = $this->getDatabase()->prepare($query);
63
+		$statement->execute(array(':email' => $emailAddress));
64
+
65
+		if ($statement->fetchColumn() > 0) {
66
+			throw new ApplicationLogicException('That email address is already in use on this system.');
67
+		}
68
+
69
+		$statement->closeCursor();
70
+	}
71
+
72
+	/**
73
+	 * @param $emailAddress
74
+	 * @param $password
75
+	 * @param $username
76
+	 * @param $useOAuthSignup
77
+	 * @param $confirmationId
78
+	 * @param $onwikiUsername
79
+	 *
80
+	 * @throws ApplicationLogicException
81
+	 */
82
+	protected function validateRequest(
83
+		$emailAddress,
84
+		$password,
85
+		$username,
86
+		$useOAuthSignup,
87
+		$confirmationId,
88
+		$onwikiUsername
89
+	) {
90
+		if (!WebRequest::postBoolean('guidelines')) {
91
+			throw new ApplicationLogicException('You must read the interface guidelines before your request may be submitted.');
92
+		}
93
+
94
+		$this->validateGeneralInformation($emailAddress, $password, $username);
95
+		$this->validateUniqueEmail($emailAddress);
96
+		$this->validateNonOAuthFields($useOAuthSignup, $confirmationId, $onwikiUsername);
97
+	}
98
+
99
+	/**
100
+	 * @param $useOAuthSignup
101
+	 * @param $confirmationId
102
+	 * @param $onwikiUsername
103
+	 *
104
+	 * @throws ApplicationLogicException
105
+	 */
106
+	protected function validateNonOAuthFields($useOAuthSignup, $confirmationId, $onwikiUsername)
107
+	{
108
+		if (!$useOAuthSignup) {
109
+			if ($confirmationId === null || $confirmationId <= 0) {
110
+				throw new ApplicationLogicException('Please enter the revision id of your confirmation edit.');
111
+			}
112
+
113
+			if ($onwikiUsername === null) {
114
+				throw new ApplicationLogicException('Please specify your on-wiki username.');
115
+			}
116
+		}
117
+	}
118
+
119
+	/**
120
+	 * @param $emailAddress
121
+	 * @param $password
122
+	 * @param $username
123
+	 *
124
+	 * @throws ApplicationLogicException
125
+	 */
126
+	protected function validateGeneralInformation($emailAddress, $password, $username)
127
+	{
128
+		if ($emailAddress === null) {
129
+			throw new ApplicationLogicException('Your email address appears to be invalid!');
130
+		}
131
+
132
+		if ($password !== WebRequest::postString('pass2')) {
133
+			throw new ApplicationLogicException('Your passwords did not match, please try again.');
134
+		}
135
+
136
+		if (User::getByUsername($username, $this->getDatabase()) !== false) {
137
+			throw new ApplicationLogicException('That username is already in use on this system.');
138
+		}
139
+	}
140
+
141
+	/**
142
+	 * @param $useOAuthSignup
143
+	 *
144
+	 * @throws ApplicationLogicException
145
+	 * @throws \Exception
146
+	 */
147
+	protected function handlePost($useOAuthSignup)
148
+	{
149
+		// Get the data
150
+		$emailAddress = WebRequest::postEmail('email');
151
+		$password = WebRequest::postString('pass');
152
+		$username = WebRequest::postString('name');
153
+
154
+		// Only set if OAuth is disabled
155
+		$confirmationId = WebRequest::postInt('conf_revid');
156
+		$onwikiUsername = WebRequest::postString('wname');
157
+
158
+		// Do some validation
159
+		$this->validateRequest($emailAddress, $password, $username, $useOAuthSignup, $confirmationId,
160
+			$onwikiUsername);
161
+
162
+		$database = $this->getDatabase();
163
+
164
+		$user = new User();
165
+		$user->setDatabase($database);
166
+
167
+		$user->setUsername($username);
168
+		$user->setPassword($password);
169
+		$user->setEmail($emailAddress);
170
+
171
+		if (!$useOAuthSignup) {
172
+			$user->setOnWikiName($onwikiUsername);
173
+			$user->setConfirmationDiff($confirmationId);
174
+		}
175
+
176
+		$user->save();
177
+
178
+		$defaultRole = $this->getDefaultRole();
179
+
180
+		$role = new UserRole();
181
+		$role->setDatabase($database);
182
+		$role->setUser($user->getId());
183
+		$role->setRole($defaultRole);
184
+		$role->save();
185
+
186
+		// Log now to get the signup date.
187
+		Logger::newUser($database, $user);
188
+		Logger::userRolesEdited($database, $user, 'Registration', array($defaultRole), array());
189
+
190
+		if ($useOAuthSignup) {
191
+			$oauthHelper = $this->getOAuthHelper();
192
+
193
+			$requestToken = $oauthHelper->getRequestToken();
194
+			$user->setOAuthRequestToken($requestToken->key);
195
+			$user->setOAuthRequestSecret($requestToken->secret);
196
+			$user->save();
197
+
198
+			WebRequest::setPartialLogin($user);
199
+
200
+			$this->redirectUrl($oauthHelper->getAuthoriseUrl($requestToken->key));
201
+		}
202
+		else {
203
+			// only notify if we're not using the oauth signup.
204
+			$this->getNotificationHelper()->userNew($user);
205
+			WebRequest::setLoggedInUser($user);
206
+			$this->redirect('preferences');
207
+		}
208
+	}
209
+
210
+	protected abstract function getDefaultRole();
211
+
212
+	/**
213
+	 * Entry point for registration complete
214
+	 */
215
+	protected function done()
216
+	{
217
+		$this->setTemplate('registration/alert-registrationcomplete.tpl');
218
+	}
219 219
 }
Please login to merge, or discard this patch.
includes/Security/SecurityManager.php 3 patches
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.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -207,7 +207,7 @@
 block discarded – undo
207 207
         }
208 208
     }
209 209
 
210
-    public function getRoleConfiguration(){
210
+    public function getRoleConfiguration() {
211 211
         return $this->roleConfiguration;
212 212
     }
213 213
 }
Please login to merge, or discard this patch.
Braces   +2 added lines, -1 removed lines patch added patch discarded remove patch
@@ -207,7 +207,8 @@
 block discarded – undo
207 207
         }
208 208
     }
209 209
 
210
-    public function getRoleConfiguration(){
210
+    public function getRoleConfiguration()
211
+    {
211 212
         return $this->roleConfiguration;
212 213
     }
213 214
 }
Please login to merge, or discard this patch.
includes/Security/RoleConfiguration.php 1 patch
Indentation   +307 added lines, -307 removed lines patch added patch discarded remove patch
@@ -41,338 +41,338 @@
 block discarded – undo
41 41
 
42 42
 class RoleConfiguration
43 43
 {
44
-    const ACCESS_ALLOW = 1;
45
-    const ACCESS_DENY = -1;
46
-    const ACCESS_DEFAULT = 0;
47
-    const MAIN = 'main';
48
-    const ALL = '*';
49
-    /**
50
-     * A map of roles to rights
51
-     *
52
-     * For example:
53
-     *
54
-     * array(
55
-     *   'myrole' => array(
56
-     *       PageMyPage::class => array(
57
-     *           'edit' => self::ACCESS_ALLOW,
58
-     *           'create' => self::ACCESS_DENY,
59
-     *       )
60
-     *   )
61
-     * )
62
-     *
63
-     * Note that DENY takes precedence over everything else when roles are combined, followed by ALLOW, followed by
64
-     * DEFAULT. Thus, if you have the following ([A]llow, [D]eny, [-] (default)) grants in different roles, this should
65
-     * be the expected result:
66
-     *
67
-     * - (-,-,-) = - (default because nothing to explicitly say allowed or denied equates to a denial)
68
-     * - (A,-,-) = A
69
-     * - (D,-,-) = D
70
-     * - (A,D,-) = D (deny takes precedence over allow)
71
-     * - (A,A,A) = A (repetition has no effect)
72
-     *
73
-     * The public role is special, and is applied to all users automatically. Avoid using deny on this role.
74
-     *
75
-     * @var array
76
-     */
77
-    private $roleConfig = array(
78
-        'public'            => array(
79
-            /*
44
+	const ACCESS_ALLOW = 1;
45
+	const ACCESS_DENY = -1;
46
+	const ACCESS_DEFAULT = 0;
47
+	const MAIN = 'main';
48
+	const ALL = '*';
49
+	/**
50
+	 * A map of roles to rights
51
+	 *
52
+	 * For example:
53
+	 *
54
+	 * array(
55
+	 *   'myrole' => array(
56
+	 *       PageMyPage::class => array(
57
+	 *           'edit' => self::ACCESS_ALLOW,
58
+	 *           'create' => self::ACCESS_DENY,
59
+	 *       )
60
+	 *   )
61
+	 * )
62
+	 *
63
+	 * Note that DENY takes precedence over everything else when roles are combined, followed by ALLOW, followed by
64
+	 * DEFAULT. Thus, if you have the following ([A]llow, [D]eny, [-] (default)) grants in different roles, this should
65
+	 * be the expected result:
66
+	 *
67
+	 * - (-,-,-) = - (default because nothing to explicitly say allowed or denied equates to a denial)
68
+	 * - (A,-,-) = A
69
+	 * - (D,-,-) = D
70
+	 * - (A,D,-) = D (deny takes precedence over allow)
71
+	 * - (A,A,A) = A (repetition has no effect)
72
+	 *
73
+	 * The public role is special, and is applied to all users automatically. Avoid using deny on this role.
74
+	 *
75
+	 * @var array
76
+	 */
77
+	private $roleConfig = array(
78
+		'public'            => array(
79
+			/*
80 80
              * THIS ROLE IS GRANTED TO ALL LOGGED *OUT* USERS IMPLICITLY.
81 81
              *
82 82
              * USERS IN THIS ROLE DO NOT HAVE TO BE IDENTIFIED TO GET THE RIGHTS CONFERRED HERE.
83 83
              * DO NOT ADD ANY SECURITY-SENSITIVE RIGHTS HERE.
84 84
              */
85
-            '_childRoles'    => array(
86
-                'publicStats',
87
-            ),
88
-            PageOAuth::class => array(
89
-                'callback' => self::ACCESS_ALLOW,
90
-            ),
91
-            PageTeam::class  => array(
92
-                self::MAIN => self::ACCESS_ALLOW,
93
-            ),
94
-        ),
95
-        'loggedIn'            => array(
96
-            /*
85
+			'_childRoles'    => array(
86
+				'publicStats',
87
+			),
88
+			PageOAuth::class => array(
89
+				'callback' => self::ACCESS_ALLOW,
90
+			),
91
+			PageTeam::class  => array(
92
+				self::MAIN => self::ACCESS_ALLOW,
93
+			),
94
+		),
95
+		'loggedIn'            => array(
96
+			/*
97 97
              * THIS ROLE IS GRANTED TO ALL LOGGED IN USERS IMPLICITLY.
98 98
              *
99 99
              * USERS IN THIS ROLE DO NOT HAVE TO BE IDENTIFIED TO GET THE RIGHTS CONFERRED HERE.
100 100
              * DO NOT ADD ANY SECURITY-SENSITIVE RIGHTS HERE.
101 101
              */
102
-            '_childRoles'    => array(
103
-                'public',
104
-            ),
105
-            PagePreferences::class               => array(
106
-                self::MAIN       => self::ACCESS_ALLOW,
107
-                'changePassword' => self::ACCESS_ALLOW,
108
-            ),
109
-            PageOAuth::class                     => array(
110
-                'attach' => self::ACCESS_ALLOW,
111
-                'detach' => self::ACCESS_ALLOW,
112
-            ),
113
-        ),
114
-        'user'              => array(
115
-            '_description' => 'A standard tool user.',
116
-            '_editableBy' => array('admin', 'toolRoot'),
117
-            '_childRoles'                        => array(
118
-                'internalStats',
119
-            ),
120
-            PageMain::class                      => array(
121
-                self::MAIN => self::ACCESS_ALLOW,
122
-            ),
123
-            PageBan::class                       => array(
124
-                self::MAIN => self::ACCESS_ALLOW,
125
-            ),
126
-            PageEditComment::class               => array(
127
-                self::MAIN => self::ACCESS_ALLOW,
128
-            ),
129
-            PageEmailManagement::class           => array(
130
-                self::MAIN => self::ACCESS_ALLOW,
131
-                'view'     => self::ACCESS_ALLOW,
132
-            ),
133
-            PageExpandedRequestList::class       => array(
134
-                self::MAIN => self::ACCESS_ALLOW,
135
-            ),
136
-            PageLog::class                       => array(
137
-                self::MAIN => self::ACCESS_ALLOW,
138
-            ),
139
-            PageSearch::class                    => array(
140
-                self::MAIN => self::ACCESS_ALLOW,
141
-            ),
142
-            PageWelcomeTemplateManagement::class => array(
143
-                self::MAIN => self::ACCESS_ALLOW,
144
-                'select'   => self::ACCESS_ALLOW,
145
-                'view'     => self::ACCESS_ALLOW,
146
-            ),
147
-            PageViewRequest::class               => array(
148
-                self::MAIN => self::ACCESS_ALLOW,
149
-            ),
150
-            'RequestData'                        => array(
151
-                'seePrivateDataWhenReserved' => self::ACCESS_ALLOW,
152
-                'seePrivateDataWithHash'     => self::ACCESS_ALLOW,
153
-            ),
154
-            PageCustomClose::class               => array(
155
-                self::MAIN => self::ACCESS_ALLOW,
156
-            ),
157
-            PageComment::class                   => array(
158
-                self::MAIN => self::ACCESS_ALLOW,
159
-            ),
160
-            PageCloseRequest::class              => array(
161
-                self::MAIN => self::ACCESS_ALLOW,
162
-            ),
163
-            PageDeferRequest::class              => array(
164
-                self::MAIN => self::ACCESS_ALLOW,
165
-            ),
166
-            PageDropRequest::class               => array(
167
-                self::MAIN => self::ACCESS_ALLOW,
168
-            ),
169
-            PageReservation::class               => array(
170
-                self::MAIN => self::ACCESS_ALLOW,
171
-            ),
172
-            PageSendToUser::class                => array(
173
-                self::MAIN => self::ACCESS_ALLOW,
174
-            ),
175
-            PageBreakReservation::class          => array(
176
-                self::MAIN => self::ACCESS_ALLOW,
177
-            ),
102
+			'_childRoles'    => array(
103
+				'public',
104
+			),
105
+			PagePreferences::class               => array(
106
+				self::MAIN       => self::ACCESS_ALLOW,
107
+				'changePassword' => self::ACCESS_ALLOW,
108
+			),
109
+			PageOAuth::class                     => array(
110
+				'attach' => self::ACCESS_ALLOW,
111
+				'detach' => self::ACCESS_ALLOW,
112
+			),
113
+		),
114
+		'user'              => array(
115
+			'_description' => 'A standard tool user.',
116
+			'_editableBy' => array('admin', 'toolRoot'),
117
+			'_childRoles'                        => array(
118
+				'internalStats',
119
+			),
120
+			PageMain::class                      => array(
121
+				self::MAIN => self::ACCESS_ALLOW,
122
+			),
123
+			PageBan::class                       => array(
124
+				self::MAIN => self::ACCESS_ALLOW,
125
+			),
126
+			PageEditComment::class               => array(
127
+				self::MAIN => self::ACCESS_ALLOW,
128
+			),
129
+			PageEmailManagement::class           => array(
130
+				self::MAIN => self::ACCESS_ALLOW,
131
+				'view'     => self::ACCESS_ALLOW,
132
+			),
133
+			PageExpandedRequestList::class       => array(
134
+				self::MAIN => self::ACCESS_ALLOW,
135
+			),
136
+			PageLog::class                       => array(
137
+				self::MAIN => self::ACCESS_ALLOW,
138
+			),
139
+			PageSearch::class                    => array(
140
+				self::MAIN => self::ACCESS_ALLOW,
141
+			),
142
+			PageWelcomeTemplateManagement::class => array(
143
+				self::MAIN => self::ACCESS_ALLOW,
144
+				'select'   => self::ACCESS_ALLOW,
145
+				'view'     => self::ACCESS_ALLOW,
146
+			),
147
+			PageViewRequest::class               => array(
148
+				self::MAIN => self::ACCESS_ALLOW,
149
+			),
150
+			'RequestData'                        => array(
151
+				'seePrivateDataWhenReserved' => self::ACCESS_ALLOW,
152
+				'seePrivateDataWithHash'     => self::ACCESS_ALLOW,
153
+			),
154
+			PageCustomClose::class               => array(
155
+				self::MAIN => self::ACCESS_ALLOW,
156
+			),
157
+			PageComment::class                   => array(
158
+				self::MAIN => self::ACCESS_ALLOW,
159
+			),
160
+			PageCloseRequest::class              => array(
161
+				self::MAIN => self::ACCESS_ALLOW,
162
+			),
163
+			PageDeferRequest::class              => array(
164
+				self::MAIN => self::ACCESS_ALLOW,
165
+			),
166
+			PageDropRequest::class               => array(
167
+				self::MAIN => self::ACCESS_ALLOW,
168
+			),
169
+			PageReservation::class               => array(
170
+				self::MAIN => self::ACCESS_ALLOW,
171
+			),
172
+			PageSendToUser::class                => array(
173
+				self::MAIN => self::ACCESS_ALLOW,
174
+			),
175
+			PageBreakReservation::class          => array(
176
+				self::MAIN => self::ACCESS_ALLOW,
177
+			),
178 178
 
179
-        ),
180
-        'admin'             => array(
181
-            '_description' => 'A tool administrator.',
182
-            '_editableBy' => array('admin', 'toolRoot'),
183
-            '_childRoles'                        => array(
184
-                'user', 'requestAdminTools',
185
-            ),
186
-            PageEmailManagement::class           => array(
187
-                'edit'   => self::ACCESS_ALLOW,
188
-                'create' => self::ACCESS_ALLOW,
189
-            ),
190
-            PageSiteNotice::class                => array(
191
-                self::MAIN => self::ACCESS_ALLOW,
192
-            ),
193
-            PageUserManagement::class            => array(
194
-                self::MAIN  => self::ACCESS_ALLOW,
195
-                'approve'   => self::ACCESS_ALLOW,
196
-                'decline'   => self::ACCESS_ALLOW,
197
-                'rename'    => self::ACCESS_ALLOW,
198
-                'editUser'  => self::ACCESS_ALLOW,
199
-                'suspend'   => self::ACCESS_ALLOW,
200
-                'editRoles' => self::ACCESS_ALLOW,
201
-            ),
202
-            PageWelcomeTemplateManagement::class => array(
203
-                'edit'   => self::ACCESS_ALLOW,
204
-                'delete' => self::ACCESS_ALLOW,
205
-                'add'    => self::ACCESS_ALLOW,
206
-            ),
207
-        ),
208
-        'checkuser'         => array(
209
-            '_description' => 'A user with CheckUser access',
210
-            '_editableBy' => array('checkuser', 'toolRoot'),
211
-            '_childRoles'             => array(
212
-                'user', 'requestAdminTools',
213
-            ),
214
-            PageUserManagement::class => array(
215
-                self::MAIN  => self::ACCESS_ALLOW,
216
-                'suspend'   => self::ACCESS_ALLOW,
217
-                'editRoles' => self::ACCESS_ALLOW,
218
-            ),
219
-            'RequestData'             => array(
220
-                'seeUserAgentData' => self::ACCESS_ALLOW,
221
-            ),
222
-        ),
223
-        'toolRoot'         => array(
224
-            '_description' => 'A user with shell access to the servers running the tool',
225
-            '_editableBy' => array('toolRoot'),
226
-            '_childRoles'             => array(
227
-                'admin', 'checkuser',
228
-            ),
229
-        ),
179
+		),
180
+		'admin'             => array(
181
+			'_description' => 'A tool administrator.',
182
+			'_editableBy' => array('admin', 'toolRoot'),
183
+			'_childRoles'                        => array(
184
+				'user', 'requestAdminTools',
185
+			),
186
+			PageEmailManagement::class           => array(
187
+				'edit'   => self::ACCESS_ALLOW,
188
+				'create' => self::ACCESS_ALLOW,
189
+			),
190
+			PageSiteNotice::class                => array(
191
+				self::MAIN => self::ACCESS_ALLOW,
192
+			),
193
+			PageUserManagement::class            => array(
194
+				self::MAIN  => self::ACCESS_ALLOW,
195
+				'approve'   => self::ACCESS_ALLOW,
196
+				'decline'   => self::ACCESS_ALLOW,
197
+				'rename'    => self::ACCESS_ALLOW,
198
+				'editUser'  => self::ACCESS_ALLOW,
199
+				'suspend'   => self::ACCESS_ALLOW,
200
+				'editRoles' => self::ACCESS_ALLOW,
201
+			),
202
+			PageWelcomeTemplateManagement::class => array(
203
+				'edit'   => self::ACCESS_ALLOW,
204
+				'delete' => self::ACCESS_ALLOW,
205
+				'add'    => self::ACCESS_ALLOW,
206
+			),
207
+		),
208
+		'checkuser'         => array(
209
+			'_description' => 'A user with CheckUser access',
210
+			'_editableBy' => array('checkuser', 'toolRoot'),
211
+			'_childRoles'             => array(
212
+				'user', 'requestAdminTools',
213
+			),
214
+			PageUserManagement::class => array(
215
+				self::MAIN  => self::ACCESS_ALLOW,
216
+				'suspend'   => self::ACCESS_ALLOW,
217
+				'editRoles' => self::ACCESS_ALLOW,
218
+			),
219
+			'RequestData'             => array(
220
+				'seeUserAgentData' => self::ACCESS_ALLOW,
221
+			),
222
+		),
223
+		'toolRoot'         => array(
224
+			'_description' => 'A user with shell access to the servers running the tool',
225
+			'_editableBy' => array('toolRoot'),
226
+			'_childRoles'             => array(
227
+				'admin', 'checkuser',
228
+			),
229
+		),
230 230
 
231
-        // Child roles go below this point
232
-        'publicStats'       => array(
233
-            '_hidden'               => true,
234
-            StatsUsers::class       => array(
235
-                self::MAIN => self::ACCESS_ALLOW,
236
-                'detail'   => self::ACCESS_ALLOW,
237
-            ),
238
-            StatsTopCreators::class => array(
239
-                self::MAIN => self::ACCESS_ALLOW,
240
-            ),
241
-        ),
242
-        'internalStats'     => array(
243
-            '_hidden'                    => true,
244
-            StatsMain::class             => array(
245
-                self::MAIN => self::ACCESS_ALLOW,
246
-            ),
247
-            StatsFastCloses::class       => array(
248
-                self::MAIN => self::ACCESS_ALLOW,
249
-            ),
250
-            StatsInactiveUsers::class    => array(
251
-                self::MAIN => self::ACCESS_ALLOW,
252
-            ),
253
-            StatsMonthlyStats::class     => array(
254
-                self::MAIN => self::ACCESS_ALLOW,
255
-            ),
256
-            StatsReservedRequests::class => array(
257
-                self::MAIN => self::ACCESS_ALLOW,
258
-            ),
259
-            StatsTemplateStats::class    => array(
260
-                self::MAIN => self::ACCESS_ALLOW,
261
-            ),
262
-        ),
263
-        'requestAdminTools' => array(
264
-            '_hidden'                   => true,
265
-            PageBan::class              => array(
266
-                self::MAIN => self::ACCESS_ALLOW,
267
-                'set'      => self::ACCESS_ALLOW,
268
-                'remove'   => self::ACCESS_ALLOW,
269
-            ),
270
-            PageEditComment::class      => array(
271
-                'editOthers' => self::ACCESS_ALLOW,
272
-            ),
273
-            PageBreakReservation::class => array(
274
-                'force' => self::ACCESS_ALLOW,
275
-            ),
276
-            PageCustomClose::class      => array(
277
-                'skipCcMailingList' => self::ACCESS_ALLOW,
278
-            ),
279
-            'RequestData'               => array(
280
-                'reopenOldRequest'      => self::ACCESS_ALLOW,
281
-                'alwaysSeePrivateData'  => self::ACCESS_ALLOW,
282
-                'alwaysSeeHash'         => self::ACCESS_ALLOW,
283
-                'seeRestrictedComments' => self::ACCESS_ALLOW,
284
-            ),
285
-        ),
286
-    );
287
-    /** @var array
288
-     * List of roles which are *exempt* from the identification requirements
289
-     *
290
-     * Think twice about adding roles to this list.
291
-     *
292
-     * @category Security-Critical
293
-     */
294
-    private $identificationExempt = array('public', 'loggedIn');
231
+		// Child roles go below this point
232
+		'publicStats'       => array(
233
+			'_hidden'               => true,
234
+			StatsUsers::class       => array(
235
+				self::MAIN => self::ACCESS_ALLOW,
236
+				'detail'   => self::ACCESS_ALLOW,
237
+			),
238
+			StatsTopCreators::class => array(
239
+				self::MAIN => self::ACCESS_ALLOW,
240
+			),
241
+		),
242
+		'internalStats'     => array(
243
+			'_hidden'                    => true,
244
+			StatsMain::class             => array(
245
+				self::MAIN => self::ACCESS_ALLOW,
246
+			),
247
+			StatsFastCloses::class       => array(
248
+				self::MAIN => self::ACCESS_ALLOW,
249
+			),
250
+			StatsInactiveUsers::class    => array(
251
+				self::MAIN => self::ACCESS_ALLOW,
252
+			),
253
+			StatsMonthlyStats::class     => array(
254
+				self::MAIN => self::ACCESS_ALLOW,
255
+			),
256
+			StatsReservedRequests::class => array(
257
+				self::MAIN => self::ACCESS_ALLOW,
258
+			),
259
+			StatsTemplateStats::class    => array(
260
+				self::MAIN => self::ACCESS_ALLOW,
261
+			),
262
+		),
263
+		'requestAdminTools' => array(
264
+			'_hidden'                   => true,
265
+			PageBan::class              => array(
266
+				self::MAIN => self::ACCESS_ALLOW,
267
+				'set'      => self::ACCESS_ALLOW,
268
+				'remove'   => self::ACCESS_ALLOW,
269
+			),
270
+			PageEditComment::class      => array(
271
+				'editOthers' => self::ACCESS_ALLOW,
272
+			),
273
+			PageBreakReservation::class => array(
274
+				'force' => self::ACCESS_ALLOW,
275
+			),
276
+			PageCustomClose::class      => array(
277
+				'skipCcMailingList' => self::ACCESS_ALLOW,
278
+			),
279
+			'RequestData'               => array(
280
+				'reopenOldRequest'      => self::ACCESS_ALLOW,
281
+				'alwaysSeePrivateData'  => self::ACCESS_ALLOW,
282
+				'alwaysSeeHash'         => self::ACCESS_ALLOW,
283
+				'seeRestrictedComments' => self::ACCESS_ALLOW,
284
+			),
285
+		),
286
+	);
287
+	/** @var array
288
+	 * List of roles which are *exempt* from the identification requirements
289
+	 *
290
+	 * Think twice about adding roles to this list.
291
+	 *
292
+	 * @category Security-Critical
293
+	 */
294
+	private $identificationExempt = array('public', 'loggedIn');
295 295
 
296
-    /**
297
-     * RoleConfiguration constructor.
298
-     *
299
-     * @param array $roleConfig           Set to non-null to override the default configuration.
300
-     * @param array $identificationExempt Set to non-null to override the default configuration.
301
-     */
302
-    public function __construct(array $roleConfig = null, array $identificationExempt = null)
303
-    {
304
-        if ($roleConfig !== null) {
305
-            $this->roleConfig = $roleConfig;
306
-        }
296
+	/**
297
+	 * RoleConfiguration constructor.
298
+	 *
299
+	 * @param array $roleConfig           Set to non-null to override the default configuration.
300
+	 * @param array $identificationExempt Set to non-null to override the default configuration.
301
+	 */
302
+	public function __construct(array $roleConfig = null, array $identificationExempt = null)
303
+	{
304
+		if ($roleConfig !== null) {
305
+			$this->roleConfig = $roleConfig;
306
+		}
307 307
 
308
-        if ($identificationExempt !== null) {
309
-            $this->identificationExempt = $identificationExempt;
310
-        }
311
-    }
308
+		if ($identificationExempt !== null) {
309
+			$this->identificationExempt = $identificationExempt;
310
+		}
311
+	}
312 312
 
313
-    /**
314
-     * @param array $roles The roles to check
315
-     *
316
-     * @return array
317
-     */
318
-    public function getApplicableRoles(array $roles)
319
-    {
320
-        $available = array();
313
+	/**
314
+	 * @param array $roles The roles to check
315
+	 *
316
+	 * @return array
317
+	 */
318
+	public function getApplicableRoles(array $roles)
319
+	{
320
+		$available = array();
321 321
 
322
-        foreach ($roles as $role) {
323
-            if (!isset($this->roleConfig[$role])) {
324
-                // wat
325
-                continue;
326
-            }
322
+		foreach ($roles as $role) {
323
+			if (!isset($this->roleConfig[$role])) {
324
+				// wat
325
+				continue;
326
+			}
327 327
 
328
-            $available[$role] = $this->roleConfig[$role];
328
+			$available[$role] = $this->roleConfig[$role];
329 329
 
330
-            if (isset($available[$role]['_childRoles'])) {
331
-                $childRoles = self::getApplicableRoles($available[$role]['_childRoles']);
332
-                $available = array_merge($available, $childRoles);
330
+			if (isset($available[$role]['_childRoles'])) {
331
+				$childRoles = self::getApplicableRoles($available[$role]['_childRoles']);
332
+				$available = array_merge($available, $childRoles);
333 333
 
334
-                unset($available[$role]['_childRoles']);
335
-            }
334
+				unset($available[$role]['_childRoles']);
335
+			}
336 336
 
337
-            foreach (array('_hidden', '_editableBy', '_description') as $item) {
338
-                if (isset($available[$role][$item])) {
339
-                    unset($available[$role][$item]);
340
-                }
341
-            }
342
-        }
337
+			foreach (array('_hidden', '_editableBy', '_description') as $item) {
338
+				if (isset($available[$role][$item])) {
339
+					unset($available[$role][$item]);
340
+				}
341
+			}
342
+		}
343 343
 
344
-        return $available;
345
-    }
344
+		return $available;
345
+	}
346 346
 
347
-    public function getAvailableRoles()
348
-    {
349
-        $possible = array_diff(array_keys($this->roleConfig), array('public', 'loggedIn'));
347
+	public function getAvailableRoles()
348
+	{
349
+		$possible = array_diff(array_keys($this->roleConfig), array('public', 'loggedIn'));
350 350
 
351
-        $actual = array();
351
+		$actual = array();
352 352
 
353
-        foreach ($possible as $role) {
354
-            if (!isset($this->roleConfig[$role]['_hidden'])) {
355
-                $actual[$role] = array(
356
-                    'description' => $this->roleConfig[$role]['_description'],
357
-                    'editableBy'  => $this->roleConfig[$role]['_editableBy'],
358
-                );
359
-            }
360
-        }
353
+		foreach ($possible as $role) {
354
+			if (!isset($this->roleConfig[$role]['_hidden'])) {
355
+				$actual[$role] = array(
356
+					'description' => $this->roleConfig[$role]['_description'],
357
+					'editableBy'  => $this->roleConfig[$role]['_editableBy'],
358
+				);
359
+			}
360
+		}
361 361
 
362
-        return $actual;
363
-    }
362
+		return $actual;
363
+	}
364 364
 
365
-    /**
366
-     * @param string $role
367
-     *
368
-     * @return bool
369
-     */
370
-    public function roleNeedsIdentification($role)
371
-    {
372
-        if (in_array($role, $this->identificationExempt)) {
373
-            return false;
374
-        }
365
+	/**
366
+	 * @param string $role
367
+	 *
368
+	 * @return bool
369
+	 */
370
+	public function roleNeedsIdentification($role)
371
+	{
372
+		if (in_array($role, $this->identificationExempt)) {
373
+			return false;
374
+		}
375 375
 
376
-        return true;
377
-    }
376
+		return true;
377
+	}
378 378
 }
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/NotIdentifiedException.php 2 patches
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.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -57,7 +57,7 @@
 block discarded – undo
57 57
         $this->assign('currentUser', $currentUser);
58 58
         $this->assign("loggedIn", (!$currentUser->isCommunityUser()));
59 59
 
60
-        if($this->securityManager !== null) {
60
+        if ($this->securityManager !== null) {
61 61
             $this->setupNavMenuAccess($currentUser);
62 62
         }
63 63
 
Please login to merge, or discard this patch.
includes/ConsoleTasks/MigrateToRoles.php 3 patches
Indentation   +41 added lines, -41 removed lines patch added patch discarded remove patch
@@ -16,55 +16,55 @@
 block discarded – undo
16 16
 
17 17
 class MigrateToRoles extends ConsoleTaskBase
18 18
 {
19
-    public function execute()
20
-    {
21
-        $communityUser = User::getCommunity();
19
+	public function execute()
20
+	{
21
+		$communityUser = User::getCommunity();
22 22
 
23
-        $database = $this->getDatabase();
24
-        $statement = $database->query('SELECT id, status, checkuser FROM user;');
25
-        $update = $database->prepare("UPDATE user SET status = 'Active' WHERE id = :id;");
23
+		$database = $this->getDatabase();
24
+		$statement = $database->query('SELECT id, status, checkuser FROM user;');
25
+		$update = $database->prepare("UPDATE user SET status = 'Active' WHERE id = :id;");
26 26
 
27
-        $users = $statement->fetchAll(PDO::FETCH_ASSOC);
27
+		$users = $statement->fetchAll(PDO::FETCH_ASSOC);
28 28
 
29
-        foreach ($users as $user) {
30
-            $toAdd = array('user');
29
+		foreach ($users as $user) {
30
+			$toAdd = array('user');
31 31
 
32
-            if($user['status'] === 'Admin'){
33
-                $toAdd[] = 'admin';
34
-            }
32
+			if($user['status'] === 'Admin'){
33
+				$toAdd[] = 'admin';
34
+			}
35 35
 
36
-            if($user['checkuser'] == 1){
37
-                $toAdd[] = 'checkuser';
38
-            }
36
+			if($user['checkuser'] == 1){
37
+				$toAdd[] = 'checkuser';
38
+			}
39 39
 
40
-            foreach ($toAdd as $x) {
41
-                $a = new UserRole();
42
-                $a->setUser($user['id']);
43
-                $a->setRole($x);
44
-                $a->setDatabase($database);
45
-                $a->save();
46
-            }
40
+			foreach ($toAdd as $x) {
41
+				$a = new UserRole();
42
+				$a->setUser($user['id']);
43
+				$a->setRole($x);
44
+				$a->setDatabase($database);
45
+				$a->save();
46
+			}
47 47
 
48
-            $logData = serialize(array(
49
-                'added' => $toAdd,
50
-                'removed' => array(),
51
-                'reason' => 'Initial migration'
52
-            ));
48
+			$logData = serialize(array(
49
+				'added' => $toAdd,
50
+				'removed' => array(),
51
+				'reason' => 'Initial migration'
52
+			));
53 53
 
54
-            $log = new Log();
55
-            $log->setDatabase($database);
56
-            $log->setAction('RoleChange');
57
-            $log->setObjectId($user['id']);
58
-            $log->setObjectType('User');
59
-            $log->setUser($communityUser);
60
-            $log->setComment($logData);
61
-            $log->save();
54
+			$log = new Log();
55
+			$log->setDatabase($database);
56
+			$log->setAction('RoleChange');
57
+			$log->setObjectId($user['id']);
58
+			$log->setObjectType('User');
59
+			$log->setUser($communityUser);
60
+			$log->setComment($logData);
61
+			$log->save();
62 62
 
63
-            if($user['status'] === 'Admin' || $user['status'] === 'User'){
64
-                $update->execute(array('id' => $user['id']));
65
-            }
66
-        }
63
+			if($user['status'] === 'Admin' || $user['status'] === 'User'){
64
+				$update->execute(array('id' => $user['id']));
65
+			}
66
+		}
67 67
 
68
-        $database->exec("UPDATE schemaversion SET version = 25;");
69
-    }
68
+		$database->exec("UPDATE schemaversion SET version = 25;");
69
+	}
70 70
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -29,11 +29,11 @@  discard block
 block discarded – undo
29 29
         foreach ($users as $user) {
30 30
             $toAdd = array('user');
31 31
 
32
-            if($user['status'] === 'Admin'){
32
+            if ($user['status'] === 'Admin') {
33 33
                 $toAdd[] = 'admin';
34 34
             }
35 35
 
36
-            if($user['checkuser'] == 1){
36
+            if ($user['checkuser'] == 1) {
37 37
                 $toAdd[] = 'checkuser';
38 38
             }
39 39
 
@@ -60,7 +60,7 @@  discard block
 block discarded – undo
60 60
             $log->setComment($logData);
61 61
             $log->save();
62 62
 
63
-            if($user['status'] === 'Admin' || $user['status'] === 'User'){
63
+            if ($user['status'] === 'Admin' || $user['status'] === 'User') {
64 64
                 $update->execute(array('id' => $user['id']));
65 65
             }
66 66
         }
Please login to merge, or discard this patch.
Braces   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -29,11 +29,11 @@  discard block
 block discarded – undo
29 29
         foreach ($users as $user) {
30 30
             $toAdd = array('user');
31 31
 
32
-            if($user['status'] === 'Admin'){
32
+            if($user['status'] === 'Admin') {
33 33
                 $toAdd[] = 'admin';
34 34
             }
35 35
 
36
-            if($user['checkuser'] == 1){
36
+            if($user['checkuser'] == 1) {
37 37
                 $toAdd[] = 'checkuser';
38 38
             }
39 39
 
@@ -60,7 +60,7 @@  discard block
 block discarded – undo
60 60
             $log->setComment($logData);
61 61
             $log->save();
62 62
 
63
-            if($user['status'] === 'Admin' || $user['status'] === 'User'){
63
+            if($user['status'] === 'Admin' || $user['status'] === 'User') {
64 64
                 $update->execute(array('id' => $user['id']));
65 65
             }
66 66
         }
Please login to merge, or discard this patch.