Completed
Push — newinternal-releasecandidate ( 410e59...fe35c3 )
by Simon
17s queued 14s
created
smarty-plugins/modifier.date.php 1 patch
Indentation   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -16,16 +16,16 @@
 block discarded – undo
16 16
  */
17 17
 function smarty_modifier_date($input)
18 18
 {
19
-    if (gettype($input) === 'object'
20
-        && (get_class($input) === DateTime::class || get_class($input) === DateTimeImmutable::class)
21
-    ) {
22
-        /** @var $date DateTime|DateTimeImmutable */
23
-        $date = $input;
24
-        $dateString = $date->format('Y-m-d H:i:s');
19
+	if (gettype($input) === 'object'
20
+		&& (get_class($input) === DateTime::class || get_class($input) === DateTimeImmutable::class)
21
+	) {
22
+		/** @var $date DateTime|DateTimeImmutable */
23
+		$date = $input;
24
+		$dateString = $date->format('Y-m-d H:i:s');
25 25
 
26
-        return $dateString;
27
-    }
28
-    else {
29
-        return $input;
30
-    }
26
+		return $dateString;
27
+	}
28
+	else {
29
+		return $input;
30
+	}
31 31
 }
32 32
\ No newline at end of file
Please login to merge, or discard this patch.
includes/Helpers/SearchHelpers/LogSearchHelper.php 1 patch
Indentation   +73 added lines, -73 removed lines patch added patch discarded remove patch
@@ -13,87 +13,87 @@
 block discarded – undo
13 13
 
14 14
 class LogSearchHelper extends SearchHelperBase
15 15
 {
16
-    /**
17
-     * LogSearchHelper constructor.
18
-     *
19
-     * @param PdoDatabase $database
20
-     */
21
-    protected function __construct(PdoDatabase $database)
22
-    {
23
-        parent::__construct($database, 'log', Log::class, 'timestamp DESC');
24
-    }
16
+	/**
17
+	 * LogSearchHelper constructor.
18
+	 *
19
+	 * @param PdoDatabase $database
20
+	 */
21
+	protected function __construct(PdoDatabase $database)
22
+	{
23
+		parent::__construct($database, 'log', Log::class, 'timestamp DESC');
24
+	}
25 25
 
26
-    /**
27
-     * Initiates a search for requests
28
-     *
29
-     * @param PdoDatabase $database
30
-     *
31
-     * @return LogSearchHelper
32
-     */
33
-    public static function get(PdoDatabase $database)
34
-    {
35
-        $helper = new LogSearchHelper($database);
26
+	/**
27
+	 * Initiates a search for requests
28
+	 *
29
+	 * @param PdoDatabase $database
30
+	 *
31
+	 * @return LogSearchHelper
32
+	 */
33
+	public static function get(PdoDatabase $database)
34
+	{
35
+		$helper = new LogSearchHelper($database);
36 36
 
37
-        return $helper;
38
-    }
37
+		return $helper;
38
+	}
39 39
 
40
-    /**
41
-     * Filters the results by user
42
-     *
43
-     * @param int $userId
44
-     *
45
-     * @return $this
46
-     */
47
-    public function byUser($userId)
48
-    {
49
-        $this->whereClause .= ' AND user = ?';
50
-        $this->parameterList[] = $userId;
40
+	/**
41
+	 * Filters the results by user
42
+	 *
43
+	 * @param int $userId
44
+	 *
45
+	 * @return $this
46
+	 */
47
+	public function byUser($userId)
48
+	{
49
+		$this->whereClause .= ' AND user = ?';
50
+		$this->parameterList[] = $userId;
51 51
 
52
-        return $this;
53
-    }
52
+		return $this;
53
+	}
54 54
 
55
-    /**
56
-     * Filters the results by log action
57
-     *
58
-     * @param string $action
59
-     *
60
-     * @return $this
61
-     */
62
-    public function byAction($action)
63
-    {
64
-        $this->whereClause .= ' AND action = ?';
65
-        $this->parameterList[] = $action;
55
+	/**
56
+	 * Filters the results by log action
57
+	 *
58
+	 * @param string $action
59
+	 *
60
+	 * @return $this
61
+	 */
62
+	public function byAction($action)
63
+	{
64
+		$this->whereClause .= ' AND action = ?';
65
+		$this->parameterList[] = $action;
66 66
 
67
-        return $this;
68
-    }
67
+		return $this;
68
+	}
69 69
 
70
-    /**
71
-     * Filters the results by object type
72
-     *
73
-     * @param string $objectType
74
-     *
75
-     * @return $this
76
-     */
77
-    public function byObjectType($objectType)
78
-    {
79
-        $this->whereClause .= ' AND objecttype = ?';
80
-        $this->parameterList[] = $objectType;
70
+	/**
71
+	 * Filters the results by object type
72
+	 *
73
+	 * @param string $objectType
74
+	 *
75
+	 * @return $this
76
+	 */
77
+	public function byObjectType($objectType)
78
+	{
79
+		$this->whereClause .= ' AND objecttype = ?';
80
+		$this->parameterList[] = $objectType;
81 81
 
82
-        return $this;
83
-    }
82
+		return $this;
83
+	}
84 84
 
85
-    /**
86
-     * Filters the results by object type
87
-     *
88
-     * @param integer $objectId
89
-     *
90
-     * @return $this
91
-     */
92
-    public function byObjectId($objectId)
93
-    {
94
-        $this->whereClause .= ' AND objectid = ?';
95
-        $this->parameterList[] = $objectId;
85
+	/**
86
+	 * Filters the results by object type
87
+	 *
88
+	 * @param integer $objectId
89
+	 *
90
+	 * @return $this
91
+	 */
92
+	public function byObjectId($objectId)
93
+	{
94
+		$this->whereClause .= ' AND objectid = ?';
95
+		$this->parameterList[] = $objectId;
96 96
 
97
-        return $this;
98
-    }
97
+		return $this;
98
+	}
99 99
 }
100 100
\ No newline at end of file
Please login to merge, or discard this patch.
includes/Tasks/PageBase.php 3 patches
Braces   +6 added lines, -4 removed lines patch added patch discarded remove patch
@@ -277,8 +277,9 @@  discard block
 block discarded – undo
277 277
      *
278 278
      * @param string $path The path (relative to the application root) of the file
279 279
      */
280
-    final protected function addCss($path) {
281
-        if(in_array($path, $this->extraCss)){
280
+    final protected function addCss($path)
281
+    {
282
+        if(in_array($path, $this->extraCss)) {
282 283
             // nothing to do
283 284
             return;
284 285
         }
@@ -291,8 +292,9 @@  discard block
 block discarded – undo
291 292
      *
292 293
      * @param string $path The path (relative to the application root) of the file
293 294
      */
294
-    final protected function addJs($path){
295
-        if(in_array($path, $this->extraJs)){
295
+    final protected function addJs($path)
296
+    {
297
+        if(in_array($path, $this->extraJs)) {
296 298
             // nothing to do
297 299
             return;
298 300
         }
Please login to merge, or discard this patch.
Indentation   +353 added lines, -353 removed lines patch added patch discarded remove patch
@@ -22,357 +22,357 @@
 block discarded – undo
22 22
 
23 23
 abstract class PageBase extends TaskBase implements IRoutedTask
24 24
 {
25
-    use TemplateOutput;
26
-    /** @var string Smarty template to display */
27
-    protected $template = "base.tpl";
28
-    /** @var string HTML title. Currently unused. */
29
-    protected $htmlTitle;
30
-    /** @var bool Determines if the page is a redirect or not */
31
-    protected $isRedirecting = false;
32
-    /** @var array Queue of headers to be sent on successful completion */
33
-    protected $headerQueue = array();
34
-    /** @var string The name of the route to use, as determined by the request router. */
35
-    private $routeName = null;
36
-    /** @var TokenManager */
37
-    protected $tokenManager;
38
-    /** @var string[] Extra CSS files to include */
39
-    private $extraCss = array();
40
-    /** @var string[] Extra JS files to include */
41
-    private $extraJs = array();
42
-
43
-    /**
44
-     * Sets the route the request will take. Only should be called from the request router or barrier test.
45
-     *
46
-     * @param string $routeName        The name of the route
47
-     * @param bool   $skipCallableTest Don't use this unless you know what you're doing, and what the implications are.
48
-     *
49
-     * @throws Exception
50
-     * @category Security-Critical
51
-     */
52
-    final public function setRoute($routeName, $skipCallableTest = false)
53
-    {
54
-        // Test the new route is callable before adopting it.
55
-        if (!$skipCallableTest && !is_callable(array($this, $routeName))) {
56
-            throw new Exception("Proposed route '$routeName' is not callable.");
57
-        }
58
-
59
-        // Adopt the new route
60
-        $this->routeName = $routeName;
61
-    }
62
-
63
-    /**
64
-     * Gets the name of the route that has been passed from the request router.
65
-     * @return string
66
-     */
67
-    final public function getRouteName()
68
-    {
69
-        return $this->routeName;
70
-    }
71
-
72
-    /**
73
-     * Performs generic page setup actions
74
-     */
75
-    final protected function setupPage()
76
-    {
77
-        $this->setUpSmarty();
78
-
79
-        $siteNoticeText = SiteNotice::get($this->getDatabase());
80
-
81
-        $this->assign('siteNoticeText', $siteNoticeText);
82
-
83
-        $currentUser = User::getCurrent($this->getDatabase());
84
-        $this->assign('currentUser', $currentUser);
85
-        $this->assign('loggedIn', (!$currentUser->isCommunityUser()));
86
-    }
87
-
88
-    /**
89
-     * Runs the page logic as routed by the RequestRouter
90
-     *
91
-     * Only should be called after a security barrier! That means only from execute().
92
-     */
93
-    final protected function runPage()
94
-    {
95
-        $database = $this->getDatabase();
96
-
97
-        // initialise a database transaction
98
-        if (!$database->beginTransaction()) {
99
-            throw new Exception('Failed to start transaction on primary database.');
100
-        }
101
-
102
-        try {
103
-            // run the page code
104
-            $this->{$this->getRouteName()}();
105
-
106
-            $database->commit();
107
-        }
108
-        catch (ApplicationLogicException $ex) {
109
-            // it's an application logic exception, so nothing went seriously wrong with the site. We can use the
110
-            // standard templating system for this.
111
-
112
-            // Firstly, let's undo anything that happened to the database.
113
-            $database->rollBack();
114
-
115
-            // Reset smarty
116
-            $this->setUpSmarty();
117
-
118
-            // Set the template
119
-            $this->setTemplate('exception/application-logic.tpl');
120
-            $this->assign('message', $ex->getMessage());
121
-
122
-            // Force this back to false
123
-            $this->isRedirecting = false;
124
-            $this->headerQueue = array();
125
-        }
126
-        catch (OptimisticLockFailedException $ex) {
127
-            // it's an optimistic lock failure exception, so nothing went seriously wrong with the site. We can use the
128
-            // standard templating system for this.
129
-
130
-            // Firstly, let's undo anything that happened to the database.
131
-            $database->rollBack();
132
-
133
-            // Reset smarty
134
-            $this->setUpSmarty();
135
-
136
-            // Set the template
137
-            $this->setTemplate('exception/optimistic-lock-failure.tpl');
138
-            $this->assign('message', $ex->getMessage());
139
-
140
-            $this->assign('debugTrace', false);
141
-
142
-            if ($this->getSiteConfiguration()->getDebuggingTraceEnabled()) {
143
-                ob_start();
144
-                var_dump(ExceptionHandler::getExceptionData($ex));
145
-                $textErrorData = ob_get_contents();
146
-                ob_end_clean();
147
-
148
-                $this->assign('exceptionData', $textErrorData);
149
-                $this->assign('debugTrace', true);
150
-            }
151
-
152
-            // Force this back to false
153
-            $this->isRedirecting = false;
154
-            $this->headerQueue = array();
155
-        }
156
-        finally {
157
-            // Catch any hanging on transactions
158
-            if ($database->hasActiveTransaction()) {
159
-                $database->rollBack();
160
-            }
161
-        }
162
-
163
-        // run any finalisation code needed before we send the output to the browser.
164
-        $this->finalisePage();
165
-
166
-        // Send the headers
167
-        $this->sendResponseHeaders();
168
-
169
-        // Check we have a template to use!
170
-        if ($this->template !== null) {
171
-            $content = $this->fetchTemplate($this->template);
172
-            ob_clean();
173
-            print($content);
174
-            ob_flush();
175
-
176
-            return;
177
-        }
178
-    }
179
-
180
-    /**
181
-     * Performs final tasks needed before rendering the page.
182
-     */
183
-    protected function finalisePage()
184
-    {
185
-        if ($this->isRedirecting) {
186
-            $this->template = null;
187
-
188
-            return;
189
-        }
190
-
191
-        $this->assign('extraCss', $this->extraCss);
192
-        $this->assign('extraJs', $this->extraJs);
193
-
194
-        // If we're actually displaying content, we want to add the session alerts here!
195
-        $this->assign('alerts', SessionAlert::getAlerts());
196
-        SessionAlert::clearAlerts();
197
-
198
-        $this->assign('htmlTitle', $this->htmlTitle);
199
-    }
200
-
201
-    /**
202
-     * @return TokenManager
203
-     */
204
-    public function getTokenManager()
205
-    {
206
-        return $this->tokenManager;
207
-    }
208
-
209
-    /**
210
-     * @param TokenManager $tokenManager
211
-     */
212
-    public function setTokenManager($tokenManager)
213
-    {
214
-        $this->tokenManager = $tokenManager;
215
-    }
216
-
217
-    /**
218
-     * Sends the redirect headers to perform a GET at the destination page.
219
-     *
220
-     * Also nullifies the set template so Smarty does not render it.
221
-     *
222
-     * @param string      $page   The page to redirect requests to (as used in the UR)
223
-     * @param null|string $action The action to use on the page.
224
-     * @param null|array  $parameters
225
-     * @param null|string $script The script (relative to index.php) to redirect to
226
-     */
227
-    final protected function redirect($page = '', $action = null, $parameters = null, $script = null)
228
-    {
229
-        $currentScriptName = WebRequest::scriptName();
230
-
231
-        // Are we changing script?
232
-        if ($script === null || substr($currentScriptName, -1 * count($script)) === $script) {
233
-            $targetScriptName = $currentScriptName;
234
-        }
235
-        else {
236
-            $targetScriptName = $this->getSiteConfiguration()->getBaseUrl() . '/' . $script;
237
-        }
238
-
239
-        $pathInfo = array($targetScriptName);
240
-
241
-        $pathInfo[1] = $page;
242
-
243
-        if ($action !== null) {
244
-            $pathInfo[2] = $action;
245
-        }
246
-
247
-        $url = implode('/', $pathInfo);
248
-
249
-        if (is_array($parameters) && count($parameters) > 0) {
250
-            $url .= '?' . http_build_query($parameters);
251
-        }
252
-
253
-        $this->redirectUrl($url);
254
-    }
255
-
256
-    /**
257
-     * Sends the redirect headers to perform a GET at the new address.
258
-     *
259
-     * Also nullifies the set template so Smarty does not render it.
260
-     *
261
-     * @param string $path URL to redirect to
262
-     */
263
-    final protected function redirectUrl($path)
264
-    {
265
-        // 303 See Other = re-request at new address with a GET.
266
-        $this->headerQueue[] = 'HTTP/1.1 303 See Other';
267
-        $this->headerQueue[] = "Location: $path";
268
-
269
-        $this->setTemplate(null);
270
-        $this->isRedirecting = true;
271
-    }
272
-
273
-    /**
274
-     * Sets the name of the template this page should display.
275
-     *
276
-     * @param string $name
277
-     *
278
-     * @throws Exception
279
-     */
280
-    final protected function setTemplate($name)
281
-    {
282
-        if ($this->isRedirecting) {
283
-            throw new Exception('This page has been set as a redirect, no template can be displayed!');
284
-        }
285
-
286
-        $this->template = $name;
287
-    }
288
-
289
-    /**
290
-     * Adds an extra CSS file to to the page
291
-     *
292
-     * @param string $path The path (relative to the application root) of the file
293
-     */
294
-    final protected function addCss($path) {
295
-        if(in_array($path, $this->extraCss)){
296
-            // nothing to do
297
-            return;
298
-        }
299
-
300
-        $this->extraCss[] = $path;
301
-    }
302
-
303
-    /**
304
-     * Adds an extra JS file to to the page
305
-     *
306
-     * @param string $path The path (relative to the application root) of the file
307
-     */
308
-    final protected function addJs($path){
309
-        if(in_array($path, $this->extraJs)){
310
-            // nothing to do
311
-            return;
312
-        }
313
-
314
-        $this->extraJs[] = $path;
315
-    }
316
-
317
-    /**
318
-     * Main function for this page, when no specific actions are called.
319
-     * @return void
320
-     */
321
-    abstract protected function main();
322
-
323
-    /**
324
-     * Takes a smarty template string and sets the HTML title to that value
325
-     *
326
-     * @param string $title
327
-     *
328
-     * @throws SmartyException
329
-     */
330
-    final protected function setHtmlTitle($title)
331
-    {
332
-        $this->htmlTitle = $this->smarty->fetch('string:' . $title);
333
-    }
334
-
335
-    public function execute()
336
-    {
337
-        if ($this->getRouteName() === null) {
338
-            throw new Exception('Request is unrouted.');
339
-        }
340
-
341
-        if ($this->getSiteConfiguration() === null) {
342
-            throw new Exception('Page has no configuration!');
343
-        }
344
-
345
-        $this->setupPage();
346
-
347
-        $this->runPage();
348
-    }
349
-
350
-    public function assignCSRFToken()
351
-    {
352
-        $token = $this->tokenManager->getNewToken();
353
-        $this->assign('csrfTokenData', $token->getTokenData());
354
-    }
355
-
356
-    public function validateCSRFToken()
357
-    {
358
-        if (!$this->tokenManager->validateToken(WebRequest::postString('csrfTokenData'))) {
359
-            throw new ApplicationLogicException('Form token is not valid, please reload and try again');
360
-        }
361
-    }
362
-
363
-    protected function sendResponseHeaders()
364
-    {
365
-        if (headers_sent()) {
366
-            throw new ApplicationLogicException          ('Headers have already been sent! This is likely a bug in the application.');
367
-        }
368
-
369
-        foreach ($this->headerQueue as $item) {
370
-            if (mb_strpos($item, "\r") !== false || mb_strpos($item, "\n") !== false) {
371
-                // Oops. We're not allowed to do this.
372
-                throw new Exception('Unable to split header');
373
-            }
374
-
375
-            header($item);
376
-        }
377
-    }
25
+	use TemplateOutput;
26
+	/** @var string Smarty template to display */
27
+	protected $template = "base.tpl";
28
+	/** @var string HTML title. Currently unused. */
29
+	protected $htmlTitle;
30
+	/** @var bool Determines if the page is a redirect or not */
31
+	protected $isRedirecting = false;
32
+	/** @var array Queue of headers to be sent on successful completion */
33
+	protected $headerQueue = array();
34
+	/** @var string The name of the route to use, as determined by the request router. */
35
+	private $routeName = null;
36
+	/** @var TokenManager */
37
+	protected $tokenManager;
38
+	/** @var string[] Extra CSS files to include */
39
+	private $extraCss = array();
40
+	/** @var string[] Extra JS files to include */
41
+	private $extraJs = array();
42
+
43
+	/**
44
+	 * Sets the route the request will take. Only should be called from the request router or barrier test.
45
+	 *
46
+	 * @param string $routeName        The name of the route
47
+	 * @param bool   $skipCallableTest Don't use this unless you know what you're doing, and what the implications are.
48
+	 *
49
+	 * @throws Exception
50
+	 * @category Security-Critical
51
+	 */
52
+	final public function setRoute($routeName, $skipCallableTest = false)
53
+	{
54
+		// Test the new route is callable before adopting it.
55
+		if (!$skipCallableTest && !is_callable(array($this, $routeName))) {
56
+			throw new Exception("Proposed route '$routeName' is not callable.");
57
+		}
58
+
59
+		// Adopt the new route
60
+		$this->routeName = $routeName;
61
+	}
62
+
63
+	/**
64
+	 * Gets the name of the route that has been passed from the request router.
65
+	 * @return string
66
+	 */
67
+	final public function getRouteName()
68
+	{
69
+		return $this->routeName;
70
+	}
71
+
72
+	/**
73
+	 * Performs generic page setup actions
74
+	 */
75
+	final protected function setupPage()
76
+	{
77
+		$this->setUpSmarty();
78
+
79
+		$siteNoticeText = SiteNotice::get($this->getDatabase());
80
+
81
+		$this->assign('siteNoticeText', $siteNoticeText);
82
+
83
+		$currentUser = User::getCurrent($this->getDatabase());
84
+		$this->assign('currentUser', $currentUser);
85
+		$this->assign('loggedIn', (!$currentUser->isCommunityUser()));
86
+	}
87
+
88
+	/**
89
+	 * Runs the page logic as routed by the RequestRouter
90
+	 *
91
+	 * Only should be called after a security barrier! That means only from execute().
92
+	 */
93
+	final protected function runPage()
94
+	{
95
+		$database = $this->getDatabase();
96
+
97
+		// initialise a database transaction
98
+		if (!$database->beginTransaction()) {
99
+			throw new Exception('Failed to start transaction on primary database.');
100
+		}
101
+
102
+		try {
103
+			// run the page code
104
+			$this->{$this->getRouteName()}();
105
+
106
+			$database->commit();
107
+		}
108
+		catch (ApplicationLogicException $ex) {
109
+			// it's an application logic exception, so nothing went seriously wrong with the site. We can use the
110
+			// standard templating system for this.
111
+
112
+			// Firstly, let's undo anything that happened to the database.
113
+			$database->rollBack();
114
+
115
+			// Reset smarty
116
+			$this->setUpSmarty();
117
+
118
+			// Set the template
119
+			$this->setTemplate('exception/application-logic.tpl');
120
+			$this->assign('message', $ex->getMessage());
121
+
122
+			// Force this back to false
123
+			$this->isRedirecting = false;
124
+			$this->headerQueue = array();
125
+		}
126
+		catch (OptimisticLockFailedException $ex) {
127
+			// it's an optimistic lock failure exception, so nothing went seriously wrong with the site. We can use the
128
+			// standard templating system for this.
129
+
130
+			// Firstly, let's undo anything that happened to the database.
131
+			$database->rollBack();
132
+
133
+			// Reset smarty
134
+			$this->setUpSmarty();
135
+
136
+			// Set the template
137
+			$this->setTemplate('exception/optimistic-lock-failure.tpl');
138
+			$this->assign('message', $ex->getMessage());
139
+
140
+			$this->assign('debugTrace', false);
141
+
142
+			if ($this->getSiteConfiguration()->getDebuggingTraceEnabled()) {
143
+				ob_start();
144
+				var_dump(ExceptionHandler::getExceptionData($ex));
145
+				$textErrorData = ob_get_contents();
146
+				ob_end_clean();
147
+
148
+				$this->assign('exceptionData', $textErrorData);
149
+				$this->assign('debugTrace', true);
150
+			}
151
+
152
+			// Force this back to false
153
+			$this->isRedirecting = false;
154
+			$this->headerQueue = array();
155
+		}
156
+		finally {
157
+			// Catch any hanging on transactions
158
+			if ($database->hasActiveTransaction()) {
159
+				$database->rollBack();
160
+			}
161
+		}
162
+
163
+		// run any finalisation code needed before we send the output to the browser.
164
+		$this->finalisePage();
165
+
166
+		// Send the headers
167
+		$this->sendResponseHeaders();
168
+
169
+		// Check we have a template to use!
170
+		if ($this->template !== null) {
171
+			$content = $this->fetchTemplate($this->template);
172
+			ob_clean();
173
+			print($content);
174
+			ob_flush();
175
+
176
+			return;
177
+		}
178
+	}
179
+
180
+	/**
181
+	 * Performs final tasks needed before rendering the page.
182
+	 */
183
+	protected function finalisePage()
184
+	{
185
+		if ($this->isRedirecting) {
186
+			$this->template = null;
187
+
188
+			return;
189
+		}
190
+
191
+		$this->assign('extraCss', $this->extraCss);
192
+		$this->assign('extraJs', $this->extraJs);
193
+
194
+		// If we're actually displaying content, we want to add the session alerts here!
195
+		$this->assign('alerts', SessionAlert::getAlerts());
196
+		SessionAlert::clearAlerts();
197
+
198
+		$this->assign('htmlTitle', $this->htmlTitle);
199
+	}
200
+
201
+	/**
202
+	 * @return TokenManager
203
+	 */
204
+	public function getTokenManager()
205
+	{
206
+		return $this->tokenManager;
207
+	}
208
+
209
+	/**
210
+	 * @param TokenManager $tokenManager
211
+	 */
212
+	public function setTokenManager($tokenManager)
213
+	{
214
+		$this->tokenManager = $tokenManager;
215
+	}
216
+
217
+	/**
218
+	 * Sends the redirect headers to perform a GET at the destination page.
219
+	 *
220
+	 * Also nullifies the set template so Smarty does not render it.
221
+	 *
222
+	 * @param string      $page   The page to redirect requests to (as used in the UR)
223
+	 * @param null|string $action The action to use on the page.
224
+	 * @param null|array  $parameters
225
+	 * @param null|string $script The script (relative to index.php) to redirect to
226
+	 */
227
+	final protected function redirect($page = '', $action = null, $parameters = null, $script = null)
228
+	{
229
+		$currentScriptName = WebRequest::scriptName();
230
+
231
+		// Are we changing script?
232
+		if ($script === null || substr($currentScriptName, -1 * count($script)) === $script) {
233
+			$targetScriptName = $currentScriptName;
234
+		}
235
+		else {
236
+			$targetScriptName = $this->getSiteConfiguration()->getBaseUrl() . '/' . $script;
237
+		}
238
+
239
+		$pathInfo = array($targetScriptName);
240
+
241
+		$pathInfo[1] = $page;
242
+
243
+		if ($action !== null) {
244
+			$pathInfo[2] = $action;
245
+		}
246
+
247
+		$url = implode('/', $pathInfo);
248
+
249
+		if (is_array($parameters) && count($parameters) > 0) {
250
+			$url .= '?' . http_build_query($parameters);
251
+		}
252
+
253
+		$this->redirectUrl($url);
254
+	}
255
+
256
+	/**
257
+	 * Sends the redirect headers to perform a GET at the new address.
258
+	 *
259
+	 * Also nullifies the set template so Smarty does not render it.
260
+	 *
261
+	 * @param string $path URL to redirect to
262
+	 */
263
+	final protected function redirectUrl($path)
264
+	{
265
+		// 303 See Other = re-request at new address with a GET.
266
+		$this->headerQueue[] = 'HTTP/1.1 303 See Other';
267
+		$this->headerQueue[] = "Location: $path";
268
+
269
+		$this->setTemplate(null);
270
+		$this->isRedirecting = true;
271
+	}
272
+
273
+	/**
274
+	 * Sets the name of the template this page should display.
275
+	 *
276
+	 * @param string $name
277
+	 *
278
+	 * @throws Exception
279
+	 */
280
+	final protected function setTemplate($name)
281
+	{
282
+		if ($this->isRedirecting) {
283
+			throw new Exception('This page has been set as a redirect, no template can be displayed!');
284
+		}
285
+
286
+		$this->template = $name;
287
+	}
288
+
289
+	/**
290
+	 * Adds an extra CSS file to to the page
291
+	 *
292
+	 * @param string $path The path (relative to the application root) of the file
293
+	 */
294
+	final protected function addCss($path) {
295
+		if(in_array($path, $this->extraCss)){
296
+			// nothing to do
297
+			return;
298
+		}
299
+
300
+		$this->extraCss[] = $path;
301
+	}
302
+
303
+	/**
304
+	 * Adds an extra JS file to to the page
305
+	 *
306
+	 * @param string $path The path (relative to the application root) of the file
307
+	 */
308
+	final protected function addJs($path){
309
+		if(in_array($path, $this->extraJs)){
310
+			// nothing to do
311
+			return;
312
+		}
313
+
314
+		$this->extraJs[] = $path;
315
+	}
316
+
317
+	/**
318
+	 * Main function for this page, when no specific actions are called.
319
+	 * @return void
320
+	 */
321
+	abstract protected function main();
322
+
323
+	/**
324
+	 * Takes a smarty template string and sets the HTML title to that value
325
+	 *
326
+	 * @param string $title
327
+	 *
328
+	 * @throws SmartyException
329
+	 */
330
+	final protected function setHtmlTitle($title)
331
+	{
332
+		$this->htmlTitle = $this->smarty->fetch('string:' . $title);
333
+	}
334
+
335
+	public function execute()
336
+	{
337
+		if ($this->getRouteName() === null) {
338
+			throw new Exception('Request is unrouted.');
339
+		}
340
+
341
+		if ($this->getSiteConfiguration() === null) {
342
+			throw new Exception('Page has no configuration!');
343
+		}
344
+
345
+		$this->setupPage();
346
+
347
+		$this->runPage();
348
+	}
349
+
350
+	public function assignCSRFToken()
351
+	{
352
+		$token = $this->tokenManager->getNewToken();
353
+		$this->assign('csrfTokenData', $token->getTokenData());
354
+	}
355
+
356
+	public function validateCSRFToken()
357
+	{
358
+		if (!$this->tokenManager->validateToken(WebRequest::postString('csrfTokenData'))) {
359
+			throw new ApplicationLogicException('Form token is not valid, please reload and try again');
360
+		}
361
+	}
362
+
363
+	protected function sendResponseHeaders()
364
+	{
365
+		if (headers_sent()) {
366
+			throw new ApplicationLogicException          ('Headers have already been sent! This is likely a bug in the application.');
367
+		}
368
+
369
+		foreach ($this->headerQueue as $item) {
370
+			if (mb_strpos($item, "\r") !== false || mb_strpos($item, "\n") !== false) {
371
+				// Oops. We're not allowed to do this.
372
+				throw new Exception('Unable to split header');
373
+			}
374
+
375
+			header($item);
376
+		}
377
+	}
378 378
 }
Please login to merge, or discard this patch.
Spacing   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -233,7 +233,7 @@  discard block
 block discarded – undo
233 233
             $targetScriptName = $currentScriptName;
234 234
         }
235 235
         else {
236
-            $targetScriptName = $this->getSiteConfiguration()->getBaseUrl() . '/' . $script;
236
+            $targetScriptName = $this->getSiteConfiguration()->getBaseUrl().'/'.$script;
237 237
         }
238 238
 
239 239
         $pathInfo = array($targetScriptName);
@@ -247,7 +247,7 @@  discard block
 block discarded – undo
247 247
         $url = implode('/', $pathInfo);
248 248
 
249 249
         if (is_array($parameters) && count($parameters) > 0) {
250
-            $url .= '?' . http_build_query($parameters);
250
+            $url .= '?'.http_build_query($parameters);
251 251
         }
252 252
 
253 253
         $this->redirectUrl($url);
@@ -292,7 +292,7 @@  discard block
 block discarded – undo
292 292
      * @param string $path The path (relative to the application root) of the file
293 293
      */
294 294
     final protected function addCss($path) {
295
-        if(in_array($path, $this->extraCss)){
295
+        if (in_array($path, $this->extraCss)) {
296 296
             // nothing to do
297 297
             return;
298 298
         }
@@ -305,8 +305,8 @@  discard block
 block discarded – undo
305 305
      *
306 306
      * @param string $path The path (relative to the application root) of the file
307 307
      */
308
-    final protected function addJs($path){
309
-        if(in_array($path, $this->extraJs)){
308
+    final protected function addJs($path) {
309
+        if (in_array($path, $this->extraJs)) {
310 310
             // nothing to do
311 311
             return;
312 312
         }
@@ -329,7 +329,7 @@  discard block
 block discarded – undo
329 329
      */
330 330
     final protected function setHtmlTitle($title)
331 331
     {
332
-        $this->htmlTitle = $this->smarty->fetch('string:' . $title);
332
+        $this->htmlTitle = $this->smarty->fetch('string:'.$title);
333 333
     }
334 334
 
335 335
     public function execute()
@@ -363,7 +363,7 @@  discard block
 block discarded – undo
363 363
     protected function sendResponseHeaders()
364 364
     {
365 365
         if (headers_sent()) {
366
-            throw new ApplicationLogicException          ('Headers have already been sent! This is likely a bug in the application.');
366
+            throw new ApplicationLogicException('Headers have already been sent! This is likely a bug in the application.');
367 367
         }
368 368
 
369 369
         foreach ($this->headerQueue as $item) {
Please login to merge, or discard this patch.
includes/IdentificationVerifier.php 3 patches
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.
Indentation   +160 added lines, -160 removed lines patch added patch discarded remove patch
@@ -26,133 +26,133 @@  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
-        // Populated from SiteConfiguration->getIdentificationNoticeboardPage
42
-        'titles'   => '',
43
-        // Username of the user to be checked, with User: prefix, goes here!  Set in isIdentifiedOnWiki()
44
-        'pltitles' => '',
45
-    );
46
-    /** @var HttpHelper */
47
-    private $httpHelper;
48
-    /** @var SiteConfiguration */
49
-    private $siteConfiguration;
50
-    /** @var PdoDatabase */
51
-    private $dbObject;
52
-
53
-    /**
54
-     * IdentificationVerifier constructor.
55
-     *
56
-     * @param HttpHelper        $httpHelper
57
-     * @param SiteConfiguration $siteConfiguration
58
-     * @param PdoDatabase       $dbObject
59
-     */
60
-    public function __construct(HttpHelper $httpHelper, SiteConfiguration $siteConfiguration, PdoDatabase $dbObject)
61
-    {
62
-        $this->httpHelper = $httpHelper;
63
-        $this->siteConfiguration = $siteConfiguration;
64
-        $this->dbObject = $dbObject;
65
-    }
66
-
67
-    /**
68
-     * Checks if the given user is identified to the Wikimedia Foundation.
69
-     *
70
-     * @param string $onWikiName The Wikipedia username of the user
71
-     *
72
-     * @return bool
73
-     * @category Security-Critical
74
-     * @throws EnvironmentException
75
-     */
76
-    public function isUserIdentified($onWikiName)
77
-    {
78
-        if ($this->checkIdentificationCache($onWikiName)) {
79
-            return true;
80
-        }
81
-        else {
82
-            if ($this->isIdentifiedOnWiki($onWikiName)) {
83
-                $this->cacheIdentificationStatus($onWikiName);
84
-
85
-                return true;
86
-            }
87
-            else {
88
-                return false;
89
-            }
90
-        }
91
-    }
92
-
93
-    /**
94
-     * Checks if the given user has a valid entry in the idcache table.
95
-     *
96
-     * @param string $onWikiName The Wikipedia username of the user
97
-     *
98
-     * @return bool
99
-     * @category Security-Critical
100
-     */
101
-    private function checkIdentificationCache($onWikiName)
102
-    {
103
-        $interval = $this->siteConfiguration->getIdentificationCacheExpiry();
104
-
105
-        $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
+		// Populated from SiteConfiguration->getIdentificationNoticeboardPage
42
+		'titles'   => '',
43
+		// Username of the user to be checked, with User: prefix, goes here!  Set in isIdentifiedOnWiki()
44
+		'pltitles' => '',
45
+	);
46
+	/** @var HttpHelper */
47
+	private $httpHelper;
48
+	/** @var SiteConfiguration */
49
+	private $siteConfiguration;
50
+	/** @var PdoDatabase */
51
+	private $dbObject;
52
+
53
+	/**
54
+	 * IdentificationVerifier constructor.
55
+	 *
56
+	 * @param HttpHelper        $httpHelper
57
+	 * @param SiteConfiguration $siteConfiguration
58
+	 * @param PdoDatabase       $dbObject
59
+	 */
60
+	public function __construct(HttpHelper $httpHelper, SiteConfiguration $siteConfiguration, PdoDatabase $dbObject)
61
+	{
62
+		$this->httpHelper = $httpHelper;
63
+		$this->siteConfiguration = $siteConfiguration;
64
+		$this->dbObject = $dbObject;
65
+	}
66
+
67
+	/**
68
+	 * Checks if the given user is identified to the Wikimedia Foundation.
69
+	 *
70
+	 * @param string $onWikiName The Wikipedia username of the user
71
+	 *
72
+	 * @return bool
73
+	 * @category Security-Critical
74
+	 * @throws EnvironmentException
75
+	 */
76
+	public function isUserIdentified($onWikiName)
77
+	{
78
+		if ($this->checkIdentificationCache($onWikiName)) {
79
+			return true;
80
+		}
81
+		else {
82
+			if ($this->isIdentifiedOnWiki($onWikiName)) {
83
+				$this->cacheIdentificationStatus($onWikiName);
84
+
85
+				return true;
86
+			}
87
+			else {
88
+				return false;
89
+			}
90
+		}
91
+	}
92
+
93
+	/**
94
+	 * Checks if the given user has a valid entry in the idcache table.
95
+	 *
96
+	 * @param string $onWikiName The Wikipedia username of the user
97
+	 *
98
+	 * @return bool
99
+	 * @category Security-Critical
100
+	 */
101
+	private function checkIdentificationCache($onWikiName)
102
+	{
103
+		$interval = $this->siteConfiguration->getIdentificationCacheExpiry();
104
+
105
+		$query = <<<SQL
106 106
 			SELECT COUNT(`id`)
107 107
 			FROM `idcache`
108 108
 			WHERE `onwikiusername` = :onwikiname
109 109
 				AND DATE_ADD(`checktime`, INTERVAL {$interval}) >= NOW();
110 110
 SQL;
111
-        $stmt = $this->dbObject->prepare($query);
112
-        $stmt->bindValue(':onwikiname', $onWikiName, PDO::PARAM_STR);
113
-        $stmt->execute();
114
-
115
-        // Guaranteed by the query to only return a single row with a single column
116
-        $results = $stmt->fetch(PDO::FETCH_NUM);
117
-
118
-        // I don't expect this to ever be a value other than 0 or 1 since the `onwikiusername` column is declared as a
119
-        // unique key - but meh.
120
-        return $results[0] != 0;
121
-    }
122
-
123
-    /**
124
-     * Does pretty much exactly what it says on the label - this method will clear all expired idcache entries from the
125
-     * idcache table.  Meant to be called periodically by a maintenance script.
126
-     *
127
-     * @param SiteConfiguration $siteConfiguration
128
-     * @param PdoDatabase       $dbObject
129
-     *
130
-     * @return void
131
-     */
132
-    public static function clearExpiredCacheEntries(SiteConfiguration $siteConfiguration, PdoDatabase $dbObject)
133
-    {
134
-        $interval = $siteConfiguration->getIdentificationCacheExpiry();
135
-
136
-        $query = <<<SQL
111
+		$stmt = $this->dbObject->prepare($query);
112
+		$stmt->bindValue(':onwikiname', $onWikiName, PDO::PARAM_STR);
113
+		$stmt->execute();
114
+
115
+		// Guaranteed by the query to only return a single row with a single column
116
+		$results = $stmt->fetch(PDO::FETCH_NUM);
117
+
118
+		// I don't expect this to ever be a value other than 0 or 1 since the `onwikiusername` column is declared as a
119
+		// unique key - but meh.
120
+		return $results[0] != 0;
121
+	}
122
+
123
+	/**
124
+	 * Does pretty much exactly what it says on the label - this method will clear all expired idcache entries from the
125
+	 * idcache table.  Meant to be called periodically by a maintenance script.
126
+	 *
127
+	 * @param SiteConfiguration $siteConfiguration
128
+	 * @param PdoDatabase       $dbObject
129
+	 *
130
+	 * @return void
131
+	 */
132
+	public static function clearExpiredCacheEntries(SiteConfiguration $siteConfiguration, PdoDatabase $dbObject)
133
+	{
134
+		$interval = $siteConfiguration->getIdentificationCacheExpiry();
135
+
136
+		$query = <<<SQL
137 137
 			DELETE FROM `idcache`
138 138
 			WHERE DATE_ADD(`checktime`, INTERVAL {$interval}) < NOW();
139 139
 SQL;
140
-        $dbObject->prepare($query)->execute();
141
-    }
142
-
143
-    /**
144
-     * This method will add an entry to the idcache that the given Wikipedia user has been verified as identified.  This
145
-     * 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
146
-     * in the ACC configuration (validity enforced by checkIdentificationCache() and clearExpiredCacheEntries()).
147
-     *
148
-     * @param string $onWikiName The Wikipedia username of the user
149
-     *
150
-     * @return void
151
-     * @category Security-Critical
152
-     */
153
-    private function cacheIdentificationStatus($onWikiName)
154
-    {
155
-        $query = <<<SQL
140
+		$dbObject->prepare($query)->execute();
141
+	}
142
+
143
+	/**
144
+	 * This method will add an entry to the idcache that the given Wikipedia user has been verified as identified.  This
145
+	 * 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
146
+	 * in the ACC configuration (validity enforced by checkIdentificationCache() and clearExpiredCacheEntries()).
147
+	 *
148
+	 * @param string $onWikiName The Wikipedia username of the user
149
+	 *
150
+	 * @return void
151
+	 * @category Security-Critical
152
+	 */
153
+	private function cacheIdentificationStatus($onWikiName)
154
+	{
155
+		$query = <<<SQL
156 156
 			INSERT INTO `idcache`
157 157
 				(`onwikiusername`)
158 158
 			VALUES
@@ -161,45 +161,45 @@  discard block
 block discarded – undo
161 161
 				`onwikiusername` = VALUES(`onwikiusername`),
162 162
 				`checktime` = CURRENT_TIMESTAMP;
163 163
 SQL;
164
-        $stmt = $this->dbObject->prepare($query);
165
-        $stmt->bindValue(':onwikiname', $onWikiName, PDO::PARAM_STR);
166
-        $stmt->execute();
167
-    }
168
-
169
-    /**
170
-     * Queries the Wikimedia API to determine if the specified user is listed on the identification noticeboard.
171
-     *
172
-     * @param string $onWikiName The Wikipedia username of the user
173
-     *
174
-     * @return bool
175
-     * @throws EnvironmentException
176
-     * @category Security-Critical
177
-     */
178
-    private function isIdentifiedOnWiki($onWikiName)
179
-    {
180
-        $strings = new StringFunctions();
181
-
182
-        // First character of Wikipedia usernames is always capitalized.
183
-        $onWikiName = $strings->ucfirst($onWikiName);
184
-
185
-        $parameters = self::$apiQueryParameters;
186
-        $parameters['pltitles'] = "User:" . $onWikiName;
187
-        $parameters['titles'] = $this->siteConfiguration->getIdentificationNoticeboardPage();
188
-
189
-        try {
190
-            $endpoint = $this->siteConfiguration->getMetaWikimediaWebServiceEndpoint();
191
-            $response = $this->httpHelper->get($endpoint, $parameters);
192
-            $response = json_decode($response, true);
193
-        } catch (CurlException $ex) {
194
-            // failed getting identification status, so throw a nicer error.
195
-            $m = 'Could not contact metawiki API to determine user\' identification status. '
196
-                . 'This is probably a transient error, so please try again.';
197
-
198
-            throw new EnvironmentException($m, 0, $ex);
199
-        }
200
-
201
-        $page = @array_pop($response['query']['pages']);
202
-
203
-        return @$page['links'][0]['title'] === "User:" . $onWikiName;
204
-    }
164
+		$stmt = $this->dbObject->prepare($query);
165
+		$stmt->bindValue(':onwikiname', $onWikiName, PDO::PARAM_STR);
166
+		$stmt->execute();
167
+	}
168
+
169
+	/**
170
+	 * Queries the Wikimedia API to determine if the specified user is listed on the identification noticeboard.
171
+	 *
172
+	 * @param string $onWikiName The Wikipedia username of the user
173
+	 *
174
+	 * @return bool
175
+	 * @throws EnvironmentException
176
+	 * @category Security-Critical
177
+	 */
178
+	private function isIdentifiedOnWiki($onWikiName)
179
+	{
180
+		$strings = new StringFunctions();
181
+
182
+		// First character of Wikipedia usernames is always capitalized.
183
+		$onWikiName = $strings->ucfirst($onWikiName);
184
+
185
+		$parameters = self::$apiQueryParameters;
186
+		$parameters['pltitles'] = "User:" . $onWikiName;
187
+		$parameters['titles'] = $this->siteConfiguration->getIdentificationNoticeboardPage();
188
+
189
+		try {
190
+			$endpoint = $this->siteConfiguration->getMetaWikimediaWebServiceEndpoint();
191
+			$response = $this->httpHelper->get($endpoint, $parameters);
192
+			$response = json_decode($response, true);
193
+		} catch (CurlException $ex) {
194
+			// failed getting identification status, so throw a nicer error.
195
+			$m = 'Could not contact metawiki API to determine user\' identification status. '
196
+				. 'This is probably a transient error, so please try again.';
197
+
198
+			throw new EnvironmentException($m, 0, $ex);
199
+		}
200
+
201
+		$page = @array_pop($response['query']['pages']);
202
+
203
+		return @$page['links'][0]['title'] === "User:" . $onWikiName;
204
+	}
205 205
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -183,7 +183,7 @@  discard block
 block discarded – undo
183 183
         $onWikiName = $strings->ucfirst($onWikiName);
184 184
 
185 185
         $parameters = self::$apiQueryParameters;
186
-        $parameters['pltitles'] = "User:" . $onWikiName;
186
+        $parameters['pltitles'] = "User:".$onWikiName;
187 187
         $parameters['titles'] = $this->siteConfiguration->getIdentificationNoticeboardPage();
188 188
 
189 189
         try {
@@ -200,6 +200,6 @@  discard block
 block discarded – undo
200 200
 
201 201
         $page = @array_pop($response['query']['pages']);
202 202
 
203
-        return @$page['links'][0]['title'] === "User:" . $onWikiName;
203
+        return @$page['links'][0]['title'] === "User:".$onWikiName;
204 204
     }
205 205
 }
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/Exceptions/AccessDeniedException.php 2 patches
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/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.
includes/DataObjects/UserRole.php 1 patch
Indentation   +79 added lines, -79 removed lines patch added patch discarded remove patch
@@ -15,95 +15,95 @@
 block discarded – undo
15 15
 
16 16
 class UserRole extends DataObject
17 17
 {
18
-    /** @var int */
19
-    private $user;
20
-    /** @var string */
21
-    private $role;
18
+	/** @var int */
19
+	private $user;
20
+	/** @var string */
21
+	private $role;
22 22
 
23
-    /**
24
-     * @param int         $userId
25
-     * @param PdoDatabase $database
26
-     *
27
-     * @return UserRole[]
28
-     */
29
-    public static function getForUser($userId, PdoDatabase $database)
30
-    {
31
-        $sql = 'SELECT * FROM userrole WHERE user = :user';
32
-        $statement = $database->prepare($sql);
33
-        $statement->bindValue(':user', $userId);
23
+	/**
24
+	 * @param int         $userId
25
+	 * @param PdoDatabase $database
26
+	 *
27
+	 * @return UserRole[]
28
+	 */
29
+	public static function getForUser($userId, PdoDatabase $database)
30
+	{
31
+		$sql = 'SELECT * FROM userrole WHERE user = :user';
32
+		$statement = $database->prepare($sql);
33
+		$statement->bindValue(':user', $userId);
34 34
 
35
-        $statement->execute();
35
+		$statement->execute();
36 36
 
37
-        $result = array();
37
+		$result = array();
38 38
 
39
-        /** @var Ban $v */
40
-        foreach ($statement->fetchAll(PDO::FETCH_CLASS, get_called_class()) as $v) {
41
-            $v->setDatabase($database);
42
-            $result[] = $v;
43
-        }
39
+		/** @var Ban $v */
40
+		foreach ($statement->fetchAll(PDO::FETCH_CLASS, get_called_class()) as $v) {
41
+			$v->setDatabase($database);
42
+			$result[] = $v;
43
+		}
44 44
 
45
-        return $result;
46
-    }
45
+		return $result;
46
+	}
47 47
 
48
-    /**
49
-     * Saves a data object to the database, either updating or inserting a record.
50
-     *
51
-     * @throws Exception
52
-     */
53
-    public function save()
54
-    {
55
-        if ($this->isNew()) {
56
-            // insert
57
-            $statement = $this->dbObject->prepare('INSERT INTO `userrole` (user, role) VALUES (:user, :role);'
58
-            );
59
-            $statement->bindValue(":user", $this->user);
60
-            $statement->bindValue(":role", $this->role);
48
+	/**
49
+	 * Saves a data object to the database, either updating or inserting a record.
50
+	 *
51
+	 * @throws Exception
52
+	 */
53
+	public function save()
54
+	{
55
+		if ($this->isNew()) {
56
+			// insert
57
+			$statement = $this->dbObject->prepare('INSERT INTO `userrole` (user, role) VALUES (:user, :role);'
58
+			);
59
+			$statement->bindValue(":user", $this->user);
60
+			$statement->bindValue(":role", $this->role);
61 61
 
62
-            if ($statement->execute()) {
63
-                $this->id = (int)$this->dbObject->lastInsertId();
64
-            }
65
-            else {
66
-                throw new Exception($statement->errorInfo());
67
-            }
68
-        }
69
-        else {
70
-            // update
71
-            throw new Exception('Updating roles is not available');
72
-        }
73
-    }
62
+			if ($statement->execute()) {
63
+				$this->id = (int)$this->dbObject->lastInsertId();
64
+			}
65
+			else {
66
+				throw new Exception($statement->errorInfo());
67
+			}
68
+		}
69
+		else {
70
+			// update
71
+			throw new Exception('Updating roles is not available');
72
+		}
73
+	}
74 74
 
75
-    #region Properties
75
+	#region Properties
76 76
 
77
-    /**
78
-     * @return int
79
-     */
80
-    public function getUser()
81
-    {
82
-        return $this->user;
83
-    }
77
+	/**
78
+	 * @return int
79
+	 */
80
+	public function getUser()
81
+	{
82
+		return $this->user;
83
+	}
84 84
 
85
-    /**
86
-     * @param int $user
87
-     */
88
-    public function setUser($user)
89
-    {
90
-        $this->user = $user;
91
-    }
85
+	/**
86
+	 * @param int $user
87
+	 */
88
+	public function setUser($user)
89
+	{
90
+		$this->user = $user;
91
+	}
92 92
 
93
-    /**
94
-     * @return string
95
-     */
96
-    public function getRole()
97
-    {
98
-        return $this->role;
99
-    }
93
+	/**
94
+	 * @return string
95
+	 */
96
+	public function getRole()
97
+	{
98
+		return $this->role;
99
+	}
100 100
 
101
-    /**
102
-     * @param string $role
103
-     */
104
-    public function setRole($role)
105
-    {
106
-        $this->role = $role;
107
-    }
108
-    #endregion
101
+	/**
102
+	 * @param string $role
103
+	 */
104
+	public function setRole($role)
105
+	{
106
+		$this->role = $role;
107
+	}
108
+	#endregion
109 109
 }
Please login to merge, or discard this patch.