Completed
Push — bootstrap4 ( 7cff64...76c876 )
by Simon
08:41
created
includes/Pages/Request/PageRequestSubmitted.php 1 patch
Indentation   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -12,12 +12,12 @@
 block discarded – undo
12 12
 
13 13
 class PageRequestSubmitted extends PublicInterfacePageBase
14 14
 {
15
-    /**
16
-     * Main function for this page, when no specific actions are called.
17
-     * @return void
18
-     */
19
-    protected function main()
20
-    {
21
-        $this->setTemplate('request/email-confirmed.tpl');
22
-    }
15
+	/**
16
+	 * Main function for this page, when no specific actions are called.
17
+	 * @return void
18
+	 */
19
+	protected function main()
20
+	{
21
+		$this->setTemplate('request/email-confirmed.tpl');
22
+	}
23 23
 }
24 24
\ No newline at end of file
Please login to merge, or discard this patch.
includes/Pages/Request/PageConfirmEmail.php 1 patch
Indentation   +63 added lines, -63 removed lines patch added patch discarded remove patch
@@ -18,67 +18,67 @@
 block discarded – undo
18 18
 
19 19
 class PageConfirmEmail extends PublicInterfacePageBase
20 20
 {
21
-    /**
22
-     * Main function for this page, when no specific actions are called.
23
-     * @throws ApplicationLogicException
24
-     * @throws Exception
25
-     */
26
-    protected function main()
27
-    {
28
-        $id = WebRequest::getInt('id');
29
-        $si = WebRequest::getString('si');
30
-
31
-        if ($id === null || $si === null) {
32
-            throw new ApplicationLogicException('Link incomplete - please double check the link you received.');
33
-        }
34
-
35
-        /** @var Request|false $request */
36
-        $request = Request::getById($id, $this->getDatabase());
37
-
38
-        if ($request === false) {
39
-            throw new ApplicationLogicException('Request not found');
40
-        }
41
-
42
-        if ($request->getEmailConfirm() === 'Confirmed') {
43
-            // request has already been confirmed. Bomb out silently.
44
-            $this->redirect('requestSubmitted');
45
-
46
-            return;
47
-        }
48
-
49
-        if ($request->getEmailConfirm() === $si) {
50
-            $request->setEmailConfirm('Confirmed');
51
-        }
52
-        else {
53
-            throw new ApplicationLogicException('The confirmation value does not appear to match the expected value');
54
-        }
55
-
56
-        try {
57
-            $request->save();
58
-        }
59
-        catch (OptimisticLockFailedException $ex) {
60
-            // Okay. Someone's edited this in the time between us loading this page and doing the checks, and us getting
61
-            // to saving the page. We *do not* want to show an optimistic lock failure, the most likely problem is they
62
-            // double-loaded this page (see #255). Let's confirm this, and bomb out with a success message if it's the
63
-            // case.
64
-
65
-            $request = Request::getById($id, $this->getDatabase());
66
-            if ($request->getEmailConfirm() === 'Confirmed') {
67
-                // we've already done the sanity checks above
68
-
69
-                $this->redirect('requestSubmitted');
70
-
71
-                // skip the log and notification
72
-                return;
73
-            }
74
-
75
-            // something really weird happened. Another race condition?
76
-            throw $ex;
77
-        }
78
-
79
-        Logger::emailConfirmed($this->getDatabase(), $request);
80
-        $this->getNotificationHelper()->requestReceived($request);
81
-
82
-        $this->redirect('requestSubmitted');
83
-    }
21
+	/**
22
+	 * Main function for this page, when no specific actions are called.
23
+	 * @throws ApplicationLogicException
24
+	 * @throws Exception
25
+	 */
26
+	protected function main()
27
+	{
28
+		$id = WebRequest::getInt('id');
29
+		$si = WebRequest::getString('si');
30
+
31
+		if ($id === null || $si === null) {
32
+			throw new ApplicationLogicException('Link incomplete - please double check the link you received.');
33
+		}
34
+
35
+		/** @var Request|false $request */
36
+		$request = Request::getById($id, $this->getDatabase());
37
+
38
+		if ($request === false) {
39
+			throw new ApplicationLogicException('Request not found');
40
+		}
41
+
42
+		if ($request->getEmailConfirm() === 'Confirmed') {
43
+			// request has already been confirmed. Bomb out silently.
44
+			$this->redirect('requestSubmitted');
45
+
46
+			return;
47
+		}
48
+
49
+		if ($request->getEmailConfirm() === $si) {
50
+			$request->setEmailConfirm('Confirmed');
51
+		}
52
+		else {
53
+			throw new ApplicationLogicException('The confirmation value does not appear to match the expected value');
54
+		}
55
+
56
+		try {
57
+			$request->save();
58
+		}
59
+		catch (OptimisticLockFailedException $ex) {
60
+			// Okay. Someone's edited this in the time between us loading this page and doing the checks, and us getting
61
+			// to saving the page. We *do not* want to show an optimistic lock failure, the most likely problem is they
62
+			// double-loaded this page (see #255). Let's confirm this, and bomb out with a success message if it's the
63
+			// case.
64
+
65
+			$request = Request::getById($id, $this->getDatabase());
66
+			if ($request->getEmailConfirm() === 'Confirmed') {
67
+				// we've already done the sanity checks above
68
+
69
+				$this->redirect('requestSubmitted');
70
+
71
+				// skip the log and notification
72
+				return;
73
+			}
74
+
75
+			// something really weird happened. Another race condition?
76
+			throw $ex;
77
+		}
78
+
79
+		Logger::emailConfirmed($this->getDatabase(), $request);
80
+		$this->getNotificationHelper()->requestReceived($request);
81
+
82
+		$this->redirect('requestSubmitted');
83
+	}
84 84
 }
85 85
\ No newline at end of file
Please login to merge, or discard this patch.
includes/Pages/RequestAction/RequestActionBase.php 1 patch
Indentation   +33 added lines, -33 removed lines patch added patch discarded remove patch
@@ -16,37 +16,37 @@
 block discarded – undo
16 16
 
17 17
 abstract class RequestActionBase extends InternalPageBase
18 18
 {
19
-    /**
20
-     * @param PdoDatabase $database
21
-     *
22
-     * @return Request
23
-     * @throws ApplicationLogicException
24
-     */
25
-    protected function getRequest(PdoDatabase $database)
26
-    {
27
-        $requestId = WebRequest::postInt('request');
28
-        if ($requestId === null) {
29
-            throw new ApplicationLogicException('Request ID not found');
30
-        }
31
-
32
-        /** @var Request $request */
33
-        $request = Request::getById($requestId, $database);
34
-
35
-        if ($request === false) {
36
-            throw new ApplicationLogicException('Request not found');
37
-        }
38
-
39
-        return $request;
40
-    }
41
-
42
-    final protected function checkPosted()
43
-    {
44
-        // if the request was not posted, send the user away.
45
-        if (!WebRequest::wasPosted()) {
46
-            throw new ApplicationLogicException('This page does not support GET methods.');
47
-        }
48
-
49
-        // validate the CSRF token
50
-        $this->validateCSRFToken();
51
-    }
19
+	/**
20
+	 * @param PdoDatabase $database
21
+	 *
22
+	 * @return Request
23
+	 * @throws ApplicationLogicException
24
+	 */
25
+	protected function getRequest(PdoDatabase $database)
26
+	{
27
+		$requestId = WebRequest::postInt('request');
28
+		if ($requestId === null) {
29
+			throw new ApplicationLogicException('Request ID not found');
30
+		}
31
+
32
+		/** @var Request $request */
33
+		$request = Request::getById($requestId, $database);
34
+
35
+		if ($request === false) {
36
+			throw new ApplicationLogicException('Request not found');
37
+		}
38
+
39
+		return $request;
40
+	}
41
+
42
+	final protected function checkPosted()
43
+	{
44
+		// if the request was not posted, send the user away.
45
+		if (!WebRequest::wasPosted()) {
46
+			throw new ApplicationLogicException('This page does not support GET methods.');
47
+		}
48
+
49
+		// validate the CSRF token
50
+		$this->validateCSRFToken();
51
+	}
52 52
 }
53 53
\ No newline at end of file
Please login to merge, or discard this patch.
includes/Pages/RequestAction/PageDropRequest.php 1 patch
Indentation   +15 added lines, -15 removed lines patch added patch discarded remove patch
@@ -15,22 +15,22 @@
 block discarded – undo
15 15
 
16 16
 class PageDropRequest extends PageCloseRequest
17 17
 {
18
-    protected function getTemplate(PdoDatabase $database)
19
-    {
20
-        return EmailTemplate::getDroppedTemplate();
21
-    }
18
+	protected function getTemplate(PdoDatabase $database)
19
+	{
20
+		return EmailTemplate::getDroppedTemplate();
21
+	}
22 22
 
23
-    protected function confirmEmailAlreadySent(Request $request, EmailTemplate $template)
24
-    {
25
-        return false;
26
-    }
23
+	protected function confirmEmailAlreadySent(Request $request, EmailTemplate $template)
24
+	{
25
+		return false;
26
+	}
27 27
 
28
-    protected function confirmAccountCreated(Request $request, EmailTemplate $template)
29
-    {
30
-        return false;
31
-    }
28
+	protected function confirmAccountCreated(Request $request, EmailTemplate $template)
29
+	{
30
+		return false;
31
+	}
32 32
 
33
-    protected function sendMail(Request $request, EmailTemplate $template, User $currentUser, $ccMailingList)
34
-    {
35
-    }
33
+	protected function sendMail(Request $request, EmailTemplate $template, User $currentUser, $ccMailingList)
34
+	{
35
+	}
36 36
 }
37 37
\ No newline at end of file
Please login to merge, or discard this patch.
includes/IrcColourCode.php 1 patch
Indentation   +23 added lines, -23 removed lines patch added patch discarded remove patch
@@ -10,27 +10,27 @@
 block discarded – undo
10 10
 
11 11
 class IrcColourCode
12 12
 {
13
-    const BOLD = "\x02";
14
-    const ITALIC = "\x09";
15
-    const STRIKE = "\x13";
16
-    const UNDERLINE = "\x15";
17
-    const UNDERLINE2 = "\x1f";
18
-    const REVERSE = "\x16";
19
-    const RESET = "\x0f";
20
-    const WHITE = "\x0300";
21
-    const BLACK = "\x0301";
22
-    const DARK_BLUE = "\x0302";
23
-    const DARK_GREEN = "\x0303";
24
-    const RED = "\x0304";
25
-    const DARK_RED = "\x0305";
26
-    const DARK_VIOLET = "\x0306";
27
-    const ORANGE = "\x0307";
28
-    const YELLOW = "\x0308";
29
-    const LIGHT_GREEN = "\x0309";
30
-    const CYAN = "\x0310";
31
-    const LIGHT_CYAN = "\x0311";
32
-    const BLUE = "\x0312";
33
-    const VIOLET = "\x0313";
34
-    const DARK_GREY = "\x0314";
35
-    const LIGHT_GREY = "\x0315";
13
+	const BOLD = "\x02";
14
+	const ITALIC = "\x09";
15
+	const STRIKE = "\x13";
16
+	const UNDERLINE = "\x15";
17
+	const UNDERLINE2 = "\x1f";
18
+	const REVERSE = "\x16";
19
+	const RESET = "\x0f";
20
+	const WHITE = "\x0300";
21
+	const BLACK = "\x0301";
22
+	const DARK_BLUE = "\x0302";
23
+	const DARK_GREEN = "\x0303";
24
+	const RED = "\x0304";
25
+	const DARK_RED = "\x0305";
26
+	const DARK_VIOLET = "\x0306";
27
+	const ORANGE = "\x0307";
28
+	const YELLOW = "\x0308";
29
+	const LIGHT_GREEN = "\x0309";
30
+	const CYAN = "\x0310";
31
+	const LIGHT_CYAN = "\x0311";
32
+	const BLUE = "\x0312";
33
+	const VIOLET = "\x0313";
34
+	const DARK_GREY = "\x0314";
35
+	const LIGHT_GREY = "\x0315";
36 36
 }
Please login to merge, or discard this patch.
includes/Exceptions/ReadableException.php 1 patch
Indentation   +15 added lines, -15 removed lines patch added patch discarded remove patch
@@ -21,22 +21,22 @@
 block discarded – undo
21 21
  */
22 22
 abstract class ReadableException extends Exception
23 23
 {
24
-    use TemplateOutput;
24
+	use TemplateOutput;
25 25
 
26
-    /**
27
-     * Returns a readable HTML error message that's displayable to the user using templates.
28
-     * @return string
29
-     */
30
-    abstract public function getReadableError();
26
+	/**
27
+	 * Returns a readable HTML error message that's displayable to the user using templates.
28
+	 * @return string
29
+	 */
30
+	abstract public function getReadableError();
31 31
 
32
-    /**
33
-     * @return SiteConfiguration
34
-     */
35
-    protected function getSiteConfiguration()
36
-    {
37
-        // Uck. However, we have encountered an exception.
38
-        global $siteConfiguration;
32
+	/**
33
+	 * @return SiteConfiguration
34
+	 */
35
+	protected function getSiteConfiguration()
36
+	{
37
+		// Uck. However, we have encountered an exception.
38
+		global $siteConfiguration;
39 39
 
40
-        return $siteConfiguration;
41
-    }
40
+		return $siteConfiguration;
41
+	}
42 42
 }
43 43
\ No newline at end of file
Please login to merge, or discard this patch.
includes/Exceptions/EnvironmentException.php 1 patch
Indentation   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -21,13 +21,13 @@
 block discarded – undo
21 21
  */
22 22
 class EnvironmentException extends Exception
23 23
 {
24
-    /**
25
-     * EnvironmentException constructor.
26
-     *
27
-     * @param string $friendlyMessage
28
-     */
29
-    public function __construct($friendlyMessage)
30
-    {
31
-        parent::__construct($friendlyMessage);
32
-    }
24
+	/**
25
+	 * EnvironmentException constructor.
26
+	 *
27
+	 * @param string $friendlyMessage
28
+	 */
29
+	public function __construct($friendlyMessage)
30
+	{
31
+		parent::__construct($friendlyMessage);
32
+	}
33 33
 }
34 34
\ No newline at end of file
Please login to merge, or discard this patch.
includes/PdoDatabase.php 1 patch
Indentation   +108 added lines, -108 removed lines patch added patch discarded remove patch
@@ -15,112 +15,112 @@
 block discarded – undo
15 15
 
16 16
 class PdoDatabase extends PDO
17 17
 {
18
-    /**
19
-     * @var PdoDatabase[]
20
-     */
21
-    private static $connections = array();
22
-    /**
23
-     * @var bool True if a transaction is active
24
-     */
25
-    protected $hasActiveTransaction = false;
26
-
27
-    /**
28
-     * Unless you're doing low-level work, this is not the function you want.
29
-     *
30
-     * @param string $connectionName
31
-     *
32
-     * @return PdoDatabase
33
-     * @throws Exception
34
-     */
35
-    public static function getDatabaseConnection($connectionName)
36
-    {
37
-        if (!isset(self::$connections[$connectionName])) {
38
-            global $cDatabaseConfig;
39
-
40
-            if (!array_key_exists($connectionName, $cDatabaseConfig)) {
41
-                throw new Exception("Database configuration not found for alias $connectionName");
42
-            }
43
-
44
-            try {
45
-                $databaseObject = new PdoDatabase(
46
-                    $cDatabaseConfig[$connectionName]["dsrcname"],
47
-                    $cDatabaseConfig[$connectionName]["username"],
48
-                    $cDatabaseConfig[$connectionName]["password"]
49
-                );
50
-            }
51
-            catch (PDOException $ex) {
52
-                // wrap around any potential stack traces which may include passwords
53
-                throw new EnvironmentException("Error connecting to database '$connectionName': " . $ex->getMessage());
54
-            }
55
-
56
-            $databaseObject->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
57
-
58
-            // emulating prepared statements gives a performance boost on MySQL.
59
-            //
60
-            // however, our version of PDO doesn't seem to understand parameter types when emulating
61
-            // the prepared statements, so we're forced to turn this off for now.
62
-            // -- stw 2014-02-11
63
-            $databaseObject->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
64
-
65
-            self::$connections[$connectionName] = $databaseObject;
66
-        }
67
-
68
-        return self::$connections[$connectionName];
69
-    }
70
-
71
-    /**
72
-     * Determines if this connection has a transaction in progress or not
73
-     * @return boolean true if there is a transaction in progress.
74
-     */
75
-    public function hasActiveTransaction()
76
-    {
77
-        return $this->hasActiveTransaction;
78
-    }
79
-
80
-    /**
81
-     * Summary of beginTransaction
82
-     * @return bool
83
-     */
84
-    public function beginTransaction()
85
-    {
86
-        // Override the pre-existing method, which doesn't stop you from
87
-        // starting transactions within transactions - which doesn't work and
88
-        // will throw an exception. This eliminates the need to catch exceptions
89
-        // all over the rest of the code
90
-        if ($this->hasActiveTransaction) {
91
-            return false;
92
-        }
93
-        else {
94
-            // set the transaction isolation level for every transaction.
95
-            $this->exec("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;");
96
-
97
-            // start a new transaction, and return whether or not the start was
98
-            // successful
99
-            $this->hasActiveTransaction = parent::beginTransaction();
100
-
101
-            return $this->hasActiveTransaction;
102
-        }
103
-    }
104
-
105
-    /**
106
-     * Commits the active transaction
107
-     */
108
-    public function commit()
109
-    {
110
-        if ($this->hasActiveTransaction) {
111
-            parent::commit();
112
-            $this->hasActiveTransaction = false;
113
-        }
114
-    }
115
-
116
-    /**
117
-     * Rolls back a transaction
118
-     */
119
-    public function rollBack()
120
-    {
121
-        if ($this->hasActiveTransaction) {
122
-            parent::rollback();
123
-            $this->hasActiveTransaction = false;
124
-        }
125
-    }
18
+	/**
19
+	 * @var PdoDatabase[]
20
+	 */
21
+	private static $connections = array();
22
+	/**
23
+	 * @var bool True if a transaction is active
24
+	 */
25
+	protected $hasActiveTransaction = false;
26
+
27
+	/**
28
+	 * Unless you're doing low-level work, this is not the function you want.
29
+	 *
30
+	 * @param string $connectionName
31
+	 *
32
+	 * @return PdoDatabase
33
+	 * @throws Exception
34
+	 */
35
+	public static function getDatabaseConnection($connectionName)
36
+	{
37
+		if (!isset(self::$connections[$connectionName])) {
38
+			global $cDatabaseConfig;
39
+
40
+			if (!array_key_exists($connectionName, $cDatabaseConfig)) {
41
+				throw new Exception("Database configuration not found for alias $connectionName");
42
+			}
43
+
44
+			try {
45
+				$databaseObject = new PdoDatabase(
46
+					$cDatabaseConfig[$connectionName]["dsrcname"],
47
+					$cDatabaseConfig[$connectionName]["username"],
48
+					$cDatabaseConfig[$connectionName]["password"]
49
+				);
50
+			}
51
+			catch (PDOException $ex) {
52
+				// wrap around any potential stack traces which may include passwords
53
+				throw new EnvironmentException("Error connecting to database '$connectionName': " . $ex->getMessage());
54
+			}
55
+
56
+			$databaseObject->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
57
+
58
+			// emulating prepared statements gives a performance boost on MySQL.
59
+			//
60
+			// however, our version of PDO doesn't seem to understand parameter types when emulating
61
+			// the prepared statements, so we're forced to turn this off for now.
62
+			// -- stw 2014-02-11
63
+			$databaseObject->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
64
+
65
+			self::$connections[$connectionName] = $databaseObject;
66
+		}
67
+
68
+		return self::$connections[$connectionName];
69
+	}
70
+
71
+	/**
72
+	 * Determines if this connection has a transaction in progress or not
73
+	 * @return boolean true if there is a transaction in progress.
74
+	 */
75
+	public function hasActiveTransaction()
76
+	{
77
+		return $this->hasActiveTransaction;
78
+	}
79
+
80
+	/**
81
+	 * Summary of beginTransaction
82
+	 * @return bool
83
+	 */
84
+	public function beginTransaction()
85
+	{
86
+		// Override the pre-existing method, which doesn't stop you from
87
+		// starting transactions within transactions - which doesn't work and
88
+		// will throw an exception. This eliminates the need to catch exceptions
89
+		// all over the rest of the code
90
+		if ($this->hasActiveTransaction) {
91
+			return false;
92
+		}
93
+		else {
94
+			// set the transaction isolation level for every transaction.
95
+			$this->exec("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;");
96
+
97
+			// start a new transaction, and return whether or not the start was
98
+			// successful
99
+			$this->hasActiveTransaction = parent::beginTransaction();
100
+
101
+			return $this->hasActiveTransaction;
102
+		}
103
+	}
104
+
105
+	/**
106
+	 * Commits the active transaction
107
+	 */
108
+	public function commit()
109
+	{
110
+		if ($this->hasActiveTransaction) {
111
+			parent::commit();
112
+			$this->hasActiveTransaction = false;
113
+		}
114
+	}
115
+
116
+	/**
117
+	 * Rolls back a transaction
118
+	 */
119
+	public function rollBack()
120
+	{
121
+		if ($this->hasActiveTransaction) {
122
+			parent::rollback();
123
+			$this->hasActiveTransaction = false;
124
+		}
125
+	}
126 126
 }
Please login to merge, or discard this patch.
includes/ExceptionHandler.php 1 patch
Indentation   +89 added lines, -89 removed lines patch added patch discarded remove patch
@@ -13,22 +13,22 @@  discard block
 block discarded – undo
13 13
 
14 14
 class ExceptionHandler
15 15
 {
16
-    /**
17
-     * Global exception handler
18
-     *
19
-     * Smarty would be nice to use, but it COULD BE smarty that throws the errors.
20
-     * Let's build something ourselves, and hope it works.
21
-     *
22
-     * @param $exception
23
-     *
24
-     * @category Security-Critical - has the potential to leak data when exception is thrown.
25
-     */
26
-    public static function exceptionHandler(Exception $exception)
27
-    {
28
-        /** @global $siteConfiguration SiteConfiguration */
29
-        global $siteConfiguration;
30
-
31
-        $errorDocument = <<<HTML
16
+	/**
17
+	 * Global exception handler
18
+	 *
19
+	 * Smarty would be nice to use, but it COULD BE smarty that throws the errors.
20
+	 * Let's build something ourselves, and hope it works.
21
+	 *
22
+	 * @param $exception
23
+	 *
24
+	 * @category Security-Critical - has the potential to leak data when exception is thrown.
25
+	 */
26
+	public static function exceptionHandler(Exception $exception)
27
+	{
28
+		/** @global $siteConfiguration SiteConfiguration */
29
+		global $siteConfiguration;
30
+
31
+		$errorDocument = <<<HTML
32 32
 <!DOCTYPE html>
33 33
 <html lang="en"><head>
34 34
 <meta charset="utf-8">
@@ -49,77 +49,77 @@  discard block
 block discarded – undo
49 49
 </div></body></html>
50 50
 HTML;
51 51
 
52
-        $errorData = self::getExceptionData($exception);
53
-        $errorData['server'] = $_SERVER;
54
-        $errorData['get'] = $_GET;
55
-        $errorData['post'] = $_POST;
56
-
57
-        $state = serialize($errorData);
58
-        $errorId = sha1($state);
59
-
60
-        // Save the error for later analysis
61
-        file_put_contents($siteConfiguration->getErrorLog() . '/' . $errorId . '.log', $state);
62
-
63
-        // clear and discard any content that's been saved to the output buffer
64
-        if (ob_get_level() > 0) {
65
-            ob_end_clean();
66
-        }
67
-
68
-        // push error ID into the document.
69
-        $message = str_replace('$1$', $errorId, $errorDocument);
70
-
71
-        if ($siteConfiguration->getDebuggingTraceEnabled()) {
72
-            ob_start();
73
-            var_dump($errorData);
74
-            $textErrorData = ob_get_contents();
75
-            ob_end_clean();
76
-
77
-            $message = str_replace('$2$', $textErrorData, $message);
78
-        }
79
-        else {
80
-            $message = str_replace('$2$', "", $message);
81
-        }
82
-
83
-        // While we *shouldn't* have sent headers by now due to the output buffering, PHPUnit does weird things.
84
-        // This is "only" needed for the tests, but it's a good idea to wrap this anyway.
85
-        if (!headers_sent()) {
86
-            header('HTTP/1.1 500 Internal Server Error');
87
-        }
88
-
89
-        // output the document
90
-        print $message;
91
-    }
92
-
93
-    /**
94
-     * @param int    $errorSeverity The severity level of the exception.
95
-     * @param string $errorMessage  The Exception message to throw.
96
-     * @param string $errorFile     The filename where the exception is thrown.
97
-     * @param int    $errorLine     The line number where the exception is thrown.
98
-     *
99
-     * @throws ErrorException
100
-     */
101
-    public static function errorHandler($errorSeverity, $errorMessage, $errorFile, $errorLine)
102
-    {
103
-        // call into the main exception handler above
104
-        throw new ErrorException($errorMessage, 0, $errorSeverity, $errorFile, $errorLine);
105
-    }
106
-
107
-    /**
108
-     * @param Exception $exception
109
-     *
110
-     * @return null|array
111
-     */
112
-    private static function getExceptionData($exception)
113
-    {
114
-        if ($exception == null) {
115
-            return null;
116
-        }
117
-
118
-        return array(
119
-            'exception' => get_class($exception),
120
-            'message'   => $exception->getMessage(),
121
-            'stack'     => $exception->getTraceAsString(),
122
-            'previous'  => self::getExceptionData($exception->getPrevious()),
123
-        );
124
-    }
52
+		$errorData = self::getExceptionData($exception);
53
+		$errorData['server'] = $_SERVER;
54
+		$errorData['get'] = $_GET;
55
+		$errorData['post'] = $_POST;
56
+
57
+		$state = serialize($errorData);
58
+		$errorId = sha1($state);
59
+
60
+		// Save the error for later analysis
61
+		file_put_contents($siteConfiguration->getErrorLog() . '/' . $errorId . '.log', $state);
62
+
63
+		// clear and discard any content that's been saved to the output buffer
64
+		if (ob_get_level() > 0) {
65
+			ob_end_clean();
66
+		}
67
+
68
+		// push error ID into the document.
69
+		$message = str_replace('$1$', $errorId, $errorDocument);
70
+
71
+		if ($siteConfiguration->getDebuggingTraceEnabled()) {
72
+			ob_start();
73
+			var_dump($errorData);
74
+			$textErrorData = ob_get_contents();
75
+			ob_end_clean();
76
+
77
+			$message = str_replace('$2$', $textErrorData, $message);
78
+		}
79
+		else {
80
+			$message = str_replace('$2$', "", $message);
81
+		}
82
+
83
+		// While we *shouldn't* have sent headers by now due to the output buffering, PHPUnit does weird things.
84
+		// This is "only" needed for the tests, but it's a good idea to wrap this anyway.
85
+		if (!headers_sent()) {
86
+			header('HTTP/1.1 500 Internal Server Error');
87
+		}
88
+
89
+		// output the document
90
+		print $message;
91
+	}
92
+
93
+	/**
94
+	 * @param int    $errorSeverity The severity level of the exception.
95
+	 * @param string $errorMessage  The Exception message to throw.
96
+	 * @param string $errorFile     The filename where the exception is thrown.
97
+	 * @param int    $errorLine     The line number where the exception is thrown.
98
+	 *
99
+	 * @throws ErrorException
100
+	 */
101
+	public static function errorHandler($errorSeverity, $errorMessage, $errorFile, $errorLine)
102
+	{
103
+		// call into the main exception handler above
104
+		throw new ErrorException($errorMessage, 0, $errorSeverity, $errorFile, $errorLine);
105
+	}
106
+
107
+	/**
108
+	 * @param Exception $exception
109
+	 *
110
+	 * @return null|array
111
+	 */
112
+	private static function getExceptionData($exception)
113
+	{
114
+		if ($exception == null) {
115
+			return null;
116
+		}
117
+
118
+		return array(
119
+			'exception' => get_class($exception),
120
+			'message'   => $exception->getMessage(),
121
+			'stack'     => $exception->getTraceAsString(),
122
+			'previous'  => self::getExceptionData($exception->getPrevious()),
123
+		);
124
+	}
125 125
 }
126 126
\ No newline at end of file
Please login to merge, or discard this patch.