Failed Conditions
Pull Request — oauthcreation (#531)
by Simon
18:38 queued 08:37
created
includes/Tasks/IRoutedTask.php 1 patch
Indentation   +16 added lines, -16 removed lines patch added patch discarded remove patch
@@ -12,21 +12,21 @@
 block discarded – undo
12 12
 
13 13
 interface IRoutedTask extends ITask
14 14
 {
15
-    /**
16
-     * Sets the route the request will take. Only should be called from the request router.
17
-     *
18
-     * @param $routeName string
19
-     *
20
-     * @return void
21
-     *
22
-     * @throws Exception
23
-     * @category Security-Critical
24
-     */
25
-    public function setRoute($routeName);
15
+	/**
16
+	 * Sets the route the request will take. Only should be called from the request router.
17
+	 *
18
+	 * @param $routeName string
19
+	 *
20
+	 * @return void
21
+	 *
22
+	 * @throws Exception
23
+	 * @category Security-Critical
24
+	 */
25
+	public function setRoute($routeName);
26 26
 
27
-    /**
28
-     * Gets the name of the route that has been passed from the request router.
29
-     * @return string
30
-     */
31
-    public function getRouteName();
27
+	/**
28
+	 * Gets the name of the route that has been passed from the request router.
29
+	 * @return string
30
+	 */
31
+	public function getRouteName();
32 32
 }
33 33
\ No newline at end of file
Please login to merge, or discard this patch.
includes/Tasks/ApiPageBase.php 1 patch
Indentation   +93 added lines, -93 removed lines patch added patch discarded remove patch
@@ -16,97 +16,97 @@
 block discarded – undo
16 16
 
17 17
 abstract class ApiPageBase extends TaskBase implements IRoutedTask, IApiAction
18 18
 {
19
-    /**
20
-     * API result document
21
-     * @var DOMDocument
22
-     */
23
-    protected $document;
24
-
25
-    public function __construct()
26
-    {
27
-        $this->document = new DOMDocument('1.0');
28
-    }
29
-
30
-    final public function execute()
31
-    {
32
-        $this->main();
33
-    }
34
-
35
-    /**
36
-     * @param string $routeName
37
-     */
38
-    public function setRoute($routeName)
39
-    {
40
-        // no-op
41
-    }
42
-
43
-    /**
44
-     * @return string
45
-     */
46
-    public function getRouteName()
47
-    {
48
-        return 'main';
49
-    }
50
-
51
-    /**
52
-     * Main function for this page, when no specific actions are called.
53
-     *
54
-     * @throws ApiException
55
-     * @return void
56
-     */
57
-    final protected function main()
58
-    {
59
-        if (headers_sent()) {
60
-            throw new ApiException('Headers have already been sent - this indicates a bug in the application!');
61
-        }
62
-
63
-        header("Content-Type: text/xml");
64
-
65
-        // javascript access control
66
-        $httpOrigin = WebRequest::origin();
67
-
68
-        if ($httpOrigin !== null) {
69
-            $CORSallowed = $this->getSiteConfiguration()->getCrossOriginResourceSharingHosts();
70
-
71
-            if (in_array($httpOrigin, $CORSallowed)) {
72
-                header("Access-Control-Allow-Origin: " . $httpOrigin);
73
-            }
74
-        }
75
-
76
-        $responseData = $this->runApiPage();
77
-
78
-        ob_end_clean();
79
-        print($responseData);
80
-        ob_start();
81
-    }
82
-
83
-    /**
84
-     * Method that runs API action
85
-     *
86
-     * @param DOMElement $apiDocument
87
-     *
88
-     * @return DOMElement
89
-     */
90
-    abstract public function executeApiAction(DOMElement $apiDocument);
91
-
92
-    /**
93
-     * @return string
94
-     */
95
-    final public function runApiPage()
96
-    {
97
-        $apiDocument = $this->document->createElement("api");
98
-
99
-        try {
100
-            $apiDocument = $this->executeApiAction($apiDocument);
101
-        }
102
-        catch (ApiException $ex) {
103
-            $exception = $this->document->createElement("error");
104
-            $exception->setAttribute("message", $ex->getMessage());
105
-            $apiDocument->appendChild($exception);
106
-        }
107
-
108
-        $this->document->appendChild($apiDocument);
109
-
110
-        return $this->document->saveXML();
111
-    }
19
+	/**
20
+	 * API result document
21
+	 * @var DOMDocument
22
+	 */
23
+	protected $document;
24
+
25
+	public function __construct()
26
+	{
27
+		$this->document = new DOMDocument('1.0');
28
+	}
29
+
30
+	final public function execute()
31
+	{
32
+		$this->main();
33
+	}
34
+
35
+	/**
36
+	 * @param string $routeName
37
+	 */
38
+	public function setRoute($routeName)
39
+	{
40
+		// no-op
41
+	}
42
+
43
+	/**
44
+	 * @return string
45
+	 */
46
+	public function getRouteName()
47
+	{
48
+		return 'main';
49
+	}
50
+
51
+	/**
52
+	 * Main function for this page, when no specific actions are called.
53
+	 *
54
+	 * @throws ApiException
55
+	 * @return void
56
+	 */
57
+	final protected function main()
58
+	{
59
+		if (headers_sent()) {
60
+			throw new ApiException('Headers have already been sent - this indicates a bug in the application!');
61
+		}
62
+
63
+		header("Content-Type: text/xml");
64
+
65
+		// javascript access control
66
+		$httpOrigin = WebRequest::origin();
67
+
68
+		if ($httpOrigin !== null) {
69
+			$CORSallowed = $this->getSiteConfiguration()->getCrossOriginResourceSharingHosts();
70
+
71
+			if (in_array($httpOrigin, $CORSallowed)) {
72
+				header("Access-Control-Allow-Origin: " . $httpOrigin);
73
+			}
74
+		}
75
+
76
+		$responseData = $this->runApiPage();
77
+
78
+		ob_end_clean();
79
+		print($responseData);
80
+		ob_start();
81
+	}
82
+
83
+	/**
84
+	 * Method that runs API action
85
+	 *
86
+	 * @param DOMElement $apiDocument
87
+	 *
88
+	 * @return DOMElement
89
+	 */
90
+	abstract public function executeApiAction(DOMElement $apiDocument);
91
+
92
+	/**
93
+	 * @return string
94
+	 */
95
+	final public function runApiPage()
96
+	{
97
+		$apiDocument = $this->document->createElement("api");
98
+
99
+		try {
100
+			$apiDocument = $this->executeApiAction($apiDocument);
101
+		}
102
+		catch (ApiException $ex) {
103
+			$exception = $this->document->createElement("error");
104
+			$exception->setAttribute("message", $ex->getMessage());
105
+			$apiDocument->appendChild($exception);
106
+		}
107
+
108
+		$this->document->appendChild($apiDocument);
109
+
110
+		return $this->document->saveXML();
111
+	}
112 112
 }
113 113
\ No newline at end of file
Please login to merge, or discard this patch.
includes/Tasks/PublicInterfacePageBase.php 1 patch
Indentation   +15 added lines, -15 removed lines patch added patch discarded remove patch
@@ -10,21 +10,21 @@
 block discarded – undo
10 10
 
11 11
 abstract class PublicInterfacePageBase extends PageBase
12 12
 {
13
-    /**
14
-     * PublicInterfaceInternalPageBase constructor.
15
-     */
16
-    public function __construct()
17
-    {
18
-        $this->template = 'publicbase.tpl';
19
-    }
13
+	/**
14
+	 * PublicInterfaceInternalPageBase constructor.
15
+	 */
16
+	public function __construct()
17
+	{
18
+		$this->template = 'publicbase.tpl';
19
+	}
20 20
 
21
-    final public function execute()
22
-    {
23
-        parent::execute();
24
-    }
21
+	final public function execute()
22
+	{
23
+		parent::execute();
24
+	}
25 25
 
26
-    final public function finalisePage()
27
-    {
28
-        parent::finalisePage();
29
-    }
26
+	final public function finalisePage()
27
+	{
28
+		parent::finalisePage();
29
+	}
30 30
 }
31 31
\ No newline at end of file
Please login to merge, or discard this patch.
includes/DataObject.php 1 patch
Indentation   +120 added lines, -120 removed lines patch added patch discarded remove patch
@@ -23,124 +23,124 @@
 block discarded – undo
23 23
  */
24 24
 abstract class DataObject
25 25
 {
26
-    /** @var int ID of the object */
27
-    protected $id = null;
28
-    /** @var int update version for optimistic locking */
29
-    protected $updateversion = 0;
30
-    /**
31
-     * @var PdoDatabase
32
-     */
33
-    protected $dbObject;
34
-
35
-    /**
36
-     * Retrieves a data object by it's row ID.
37
-     *
38
-     * @param int         $id
39
-     * @param PdoDatabase $database
40
-     *
41
-     * @return DataObject|false
42
-     */
43
-    public static function getById($id, PdoDatabase $database)
44
-    {
45
-        $array = explode('\\', get_called_class());
46
-        $realClassName = strtolower(end($array));
47
-
48
-        $statement = $database->prepare("SELECT * FROM {$realClassName} WHERE id = :id LIMIT 1;");
49
-        $statement->bindValue(":id", $id);
50
-
51
-        $statement->execute();
52
-
53
-        $resultObject = $statement->fetchObject(get_called_class());
54
-
55
-        if ($resultObject != false) {
56
-            $resultObject->setDatabase($database);
57
-        }
58
-
59
-        return $resultObject;
60
-    }
61
-
62
-    public function setDatabase(PdoDatabase $db)
63
-    {
64
-        $this->dbObject = $db;
65
-    }
66
-
67
-    /**
68
-     * Gets the database associated with this data object.
69
-     * @return PdoDatabase
70
-     */
71
-    public function getDatabase()
72
-    {
73
-        return $this->dbObject;
74
-    }
75
-
76
-    /**
77
-     * Saves a data object to the database, either updating or inserting a record.
78
-     *
79
-     * @return void
80
-     */
81
-    abstract public function save();
82
-
83
-    /**
84
-     * Retrieves the ID attribute
85
-     */
86
-    public function getId()
87
-    {
88
-        return (int)$this->id;
89
-    }
90
-
91
-    /**
92
-     * Deletes the object from the database
93
-     */
94
-    public function delete()
95
-    {
96
-        if ($this->id === null) {
97
-            // wtf?
98
-            return;
99
-        }
100
-
101
-        $array = explode('\\', get_called_class());
102
-        $realClassName = strtolower(end($array));
103
-
104
-        $deleteQuery = "DELETE FROM {$realClassName} WHERE id = :id AND updateversion = :updateversion LIMIT 1;";
105
-        $statement = $this->dbObject->prepare($deleteQuery);
106
-
107
-        $statement->bindValue(":id", $this->id);
108
-        $statement->bindValue(":updateversion", $this->updateversion);
109
-        $statement->execute();
110
-
111
-        if ($statement->rowCount() !== 1) {
112
-            throw new OptimisticLockFailedException();
113
-        }
114
-
115
-        $this->id = null;
116
-    }
117
-
118
-    /**
119
-     * @return int
120
-     */
121
-    public function getUpdateVersion()
122
-    {
123
-        return $this->updateversion;
124
-    }
125
-
126
-    /**
127
-     * Sets the update version.
128
-     *
129
-     * You should never call this to change the value of the update version. You should only call it when passing user
130
-     * input through.
131
-     *
132
-     * @param int $updateVersion
133
-     */
134
-    public function setUpdateVersion($updateVersion)
135
-    {
136
-        $this->updateversion = $updateVersion;
137
-    }
138
-
139
-    /**
140
-     * @return bool
141
-     */
142
-    public function isNew()
143
-    {
144
-        return $this->id === null;
145
-    }
26
+	/** @var int ID of the object */
27
+	protected $id = null;
28
+	/** @var int update version for optimistic locking */
29
+	protected $updateversion = 0;
30
+	/**
31
+	 * @var PdoDatabase
32
+	 */
33
+	protected $dbObject;
34
+
35
+	/**
36
+	 * Retrieves a data object by it's row ID.
37
+	 *
38
+	 * @param int         $id
39
+	 * @param PdoDatabase $database
40
+	 *
41
+	 * @return DataObject|false
42
+	 */
43
+	public static function getById($id, PdoDatabase $database)
44
+	{
45
+		$array = explode('\\', get_called_class());
46
+		$realClassName = strtolower(end($array));
47
+
48
+		$statement = $database->prepare("SELECT * FROM {$realClassName} WHERE id = :id LIMIT 1;");
49
+		$statement->bindValue(":id", $id);
50
+
51
+		$statement->execute();
52
+
53
+		$resultObject = $statement->fetchObject(get_called_class());
54
+
55
+		if ($resultObject != false) {
56
+			$resultObject->setDatabase($database);
57
+		}
58
+
59
+		return $resultObject;
60
+	}
61
+
62
+	public function setDatabase(PdoDatabase $db)
63
+	{
64
+		$this->dbObject = $db;
65
+	}
66
+
67
+	/**
68
+	 * Gets the database associated with this data object.
69
+	 * @return PdoDatabase
70
+	 */
71
+	public function getDatabase()
72
+	{
73
+		return $this->dbObject;
74
+	}
75
+
76
+	/**
77
+	 * Saves a data object to the database, either updating or inserting a record.
78
+	 *
79
+	 * @return void
80
+	 */
81
+	abstract public function save();
82
+
83
+	/**
84
+	 * Retrieves the ID attribute
85
+	 */
86
+	public function getId()
87
+	{
88
+		return (int)$this->id;
89
+	}
90
+
91
+	/**
92
+	 * Deletes the object from the database
93
+	 */
94
+	public function delete()
95
+	{
96
+		if ($this->id === null) {
97
+			// wtf?
98
+			return;
99
+		}
100
+
101
+		$array = explode('\\', get_called_class());
102
+		$realClassName = strtolower(end($array));
103
+
104
+		$deleteQuery = "DELETE FROM {$realClassName} WHERE id = :id AND updateversion = :updateversion LIMIT 1;";
105
+		$statement = $this->dbObject->prepare($deleteQuery);
106
+
107
+		$statement->bindValue(":id", $this->id);
108
+		$statement->bindValue(":updateversion", $this->updateversion);
109
+		$statement->execute();
110
+
111
+		if ($statement->rowCount() !== 1) {
112
+			throw new OptimisticLockFailedException();
113
+		}
114
+
115
+		$this->id = null;
116
+	}
117
+
118
+	/**
119
+	 * @return int
120
+	 */
121
+	public function getUpdateVersion()
122
+	{
123
+		return $this->updateversion;
124
+	}
125
+
126
+	/**
127
+	 * Sets the update version.
128
+	 *
129
+	 * You should never call this to change the value of the update version. You should only call it when passing user
130
+	 * input through.
131
+	 *
132
+	 * @param int $updateVersion
133
+	 */
134
+	public function setUpdateVersion($updateVersion)
135
+	{
136
+		$this->updateversion = $updateVersion;
137
+	}
138
+
139
+	/**
140
+	 * @return bool
141
+	 */
142
+	public function isNew()
143
+	{
144
+		return $this->id === null;
145
+	}
146 146
 }
Please login to merge, or discard this patch.
includes/Offline.php 1 patch
Indentation   +43 added lines, -43 removed lines patch added patch discarded remove patch
@@ -15,55 +15,55 @@
 block discarded – undo
15 15
  */
16 16
 class Offline
17 17
 {
18
-    /**
19
-     * Determines if the tool is offline
20
-     * @return bool
21
-     */
22
-    public static function isOffline()
23
-    {
24
-        global $dontUseDb;
18
+	/**
19
+	 * Determines if the tool is offline
20
+	 * @return bool
21
+	 */
22
+	public static function isOffline()
23
+	{
24
+		global $dontUseDb;
25 25
 
26
-        return (bool)$dontUseDb;
27
-    }
26
+		return (bool)$dontUseDb;
27
+	}
28 28
 
29
-    /**
30
-     * Gets the offline message
31
-     *
32
-     * @param bool $external
33
-     * @param null $message
34
-     *
35
-     * @return string
36
-     */
37
-    public static function getOfflineMessage($external, $message = null)
38
-    {
39
-        global $dontUseDbCulprit, $dontUseDbReason, $baseurl;
29
+	/**
30
+	 * Gets the offline message
31
+	 *
32
+	 * @param bool $external
33
+	 * @param null $message
34
+	 *
35
+	 * @return string
36
+	 */
37
+	public static function getOfflineMessage($external, $message = null)
38
+	{
39
+		global $dontUseDbCulprit, $dontUseDbReason, $baseurl;
40 40
 
41
-        $smarty = new Smarty();
42
-        $smarty->assign("baseurl", $baseurl);
43
-        $smarty->assign("toolversion", Environment::getToolVersion());
41
+		$smarty = new Smarty();
42
+		$smarty->assign("baseurl", $baseurl);
43
+		$smarty->assign("toolversion", Environment::getToolVersion());
44 44
 
45
-        if (!headers_sent()) {
46
-            header("HTTP/1.1 503 Service Unavailable");
47
-        }
45
+		if (!headers_sent()) {
46
+			header("HTTP/1.1 503 Service Unavailable");
47
+		}
48 48
 
49
-        if ($external) {
50
-            return $smarty->fetch("offline/external.tpl");
51
-        }
52
-        else {
53
-            $hideCulprit = true;
49
+		if ($external) {
50
+			return $smarty->fetch("offline/external.tpl");
51
+		}
52
+		else {
53
+			$hideCulprit = true;
54 54
 
55
-            // Use the provided message if possible
56
-            if ($message === null) {
57
-                $hideCulprit = false;
58
-                $message = $dontUseDbReason;
59
-            }
55
+			// Use the provided message if possible
56
+			if ($message === null) {
57
+				$hideCulprit = false;
58
+				$message = $dontUseDbReason;
59
+			}
60 60
 
61
-            $smarty->assign("hideCulprit", $hideCulprit);
62
-            $smarty->assign("dontUseDbCulprit", $dontUseDbCulprit);
63
-            $smarty->assign("dontUseDbReason", $message);
64
-            $smarty->assign("alerts", array());
61
+			$smarty->assign("hideCulprit", $hideCulprit);
62
+			$smarty->assign("dontUseDbCulprit", $dontUseDbCulprit);
63
+			$smarty->assign("dontUseDbReason", $message);
64
+			$smarty->assign("alerts", array());
65 65
 
66
-            return $smarty->fetch("offline/internal.tpl");
67
-        }
68
-    }
66
+			return $smarty->fetch("offline/internal.tpl");
67
+		}
68
+	}
69 69
 }
Please login to merge, or discard this patch.
includes/Pages/Request/PageEmailConfirmationRequired.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 PageEmailConfirmationRequired 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-confirmation.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-confirmation.tpl');
22
+	}
23 23
 }
24 24
\ No newline at end of file
Please login to merge, or discard this patch.
includes/Pages/Request/PageRequestAccount.php 1 patch
Indentation   +146 added lines, -146 removed lines patch added patch discarded remove patch
@@ -19,150 +19,150 @@
 block discarded – undo
19 19
 
20 20
 class PageRequestAccount extends PublicInterfacePageBase
21 21
 {
22
-    /**
23
-     * Main function for this page, when no specific actions are called.
24
-     * @return void
25
-     */
26
-    protected function main()
27
-    {
28
-        // dual mode page
29
-        if (WebRequest::wasPosted()) {
30
-            $request = $this->createNewRequest();
31
-
32
-            $validationErrors = $this->validateRequest($request);
33
-
34
-            if (count($validationErrors) > 0) {
35
-                foreach ($validationErrors as $validationError) {
36
-                    SessionAlert::error($validationError->getErrorMessage());
37
-                }
38
-
39
-                // Preserve the data after an error
40
-                WebRequest::setSessionContext('accountReq',
41
-                    array(
42
-                        'username' => WebRequest::postString('name'),
43
-                        'email'    => WebRequest::postEmail('email'),
44
-                        'comments' => WebRequest::postString('comments'),
45
-                    )
46
-                );
47
-
48
-                // Validation error, bomb out early.
49
-                $this->redirect();
50
-
51
-                return;
52
-            }
53
-
54
-            // actually save the request to the database
55
-            if ($this->getSiteConfiguration()->getEmailConfirmationEnabled()) {
56
-                $this->saveAsEmailConfirmation($request);
57
-            }
58
-            else {
59
-                $this->saveWithoutEmailConfirmation($request);
60
-            }
61
-        }
62
-        else {
63
-            // set the form values from the session context
64
-            $context = WebRequest::getSessionContext('accountReq');
65
-            if ($context !== null && is_array($context)) {
66
-                $this->assign('username', $context['username']);
67
-                $this->assign('email', $context['email']);
68
-                $this->assign('comments', $context['comments']);
69
-            }
70
-
71
-            // Clear it for a refresh
72
-            WebRequest::setSessionContext('accountReq', null);
73
-
74
-            $this->setTemplate('request/request-form.tpl');
75
-        }
76
-    }
77
-
78
-    /**
79
-     * @return Request
80
-     */
81
-    protected function createNewRequest()
82
-    {
83
-        $request = new Request();
84
-        $request->setDatabase($this->getDatabase());
85
-
86
-        $request->setName(WebRequest::postString('name'));
87
-        $request->setEmail(WebRequest::postEmail('email'));
88
-        $request->setComment(WebRequest::postString('comments'));
89
-
90
-        $request->setIp(WebRequest::remoteAddress());
91
-        $request->setForwardedIp(WebRequest::forwardedAddress());
92
-
93
-        $request->setUserAgent(WebRequest::userAgent());
94
-
95
-        return $request;
96
-    }
97
-
98
-    /**
99
-     * @param Request $request
100
-     *
101
-     * @return ValidationError[]
102
-     */
103
-    protected function validateRequest($request)
104
-    {
105
-        $validationHelper = new RequestValidationHelper(
106
-            new BanHelper($this->getDatabase()),
107
-            $request,
108
-            WebRequest::postEmail('emailconfirm'),
109
-            $this->getDatabase(),
110
-            $this->getAntiSpoofProvider(),
111
-            $this->getXffTrustProvider(),
112
-            $this->getHttpHelper(),
113
-            $this->getSiteConfiguration()->getMediawikiWebServiceEndpoint(),
114
-            $this->getSiteConfiguration()->getTitleBlacklistEnabled(),
115
-            $this->getTorExitProvider());
116
-
117
-        // These are arrays of ValidationError.
118
-        $nameValidation = $validationHelper->validateName();
119
-        $emailValidation = $validationHelper->validateEmail();
120
-        $otherValidation = $validationHelper->validateOther();
121
-
122
-        $validationErrors = array_merge($nameValidation, $emailValidation, $otherValidation);
123
-
124
-        return $validationErrors;
125
-    }
126
-
127
-    /**
128
-     * @param Request $request
129
-     *
130
-     * @throws Exception
131
-     */
132
-    protected function saveAsEmailConfirmation(Request $request)
133
-    {
134
-        $request->generateEmailConfirmationHash();
135
-        $request->save();
136
-
137
-        $trustedIp = $this->getXffTrustProvider()->getTrustedClientIp(
138
-            $request->getIp(),
139
-            $request->getForwardedIp());
140
-
141
-        $this->assign("ip", $trustedIp);
142
-        $this->assign("id", $request->getId());
143
-        $this->assign("hash", $request->getEmailConfirm());
144
-
145
-        // Sends the confirmation email to the user.
146
-        $this->getEmailHelper()->sendMail(
147
-            $request->getEmail(),
148
-            "[ACC #{$request->getId()}] English Wikipedia Account Request",
149
-            $this->fetchTemplate('request/confirmation-mail.tpl'));
150
-
151
-        $this->redirect('emailConfirmationRequired');
152
-    }
153
-
154
-    /**
155
-     * @param Request $request
156
-     *
157
-     * @throws Exception
158
-     */
159
-    protected function saveWithoutEmailConfirmation(Request $request)
160
-    {
161
-        $request->setEmailConfirm(0); // fixme Since it can't be null
162
-        $request->save();
163
-
164
-        $this->getNotificationHelper()->requestReceived($request);
165
-
166
-        $this->redirect('requestSubmitted');
167
-    }
22
+	/**
23
+	 * Main function for this page, when no specific actions are called.
24
+	 * @return void
25
+	 */
26
+	protected function main()
27
+	{
28
+		// dual mode page
29
+		if (WebRequest::wasPosted()) {
30
+			$request = $this->createNewRequest();
31
+
32
+			$validationErrors = $this->validateRequest($request);
33
+
34
+			if (count($validationErrors) > 0) {
35
+				foreach ($validationErrors as $validationError) {
36
+					SessionAlert::error($validationError->getErrorMessage());
37
+				}
38
+
39
+				// Preserve the data after an error
40
+				WebRequest::setSessionContext('accountReq',
41
+					array(
42
+						'username' => WebRequest::postString('name'),
43
+						'email'    => WebRequest::postEmail('email'),
44
+						'comments' => WebRequest::postString('comments'),
45
+					)
46
+				);
47
+
48
+				// Validation error, bomb out early.
49
+				$this->redirect();
50
+
51
+				return;
52
+			}
53
+
54
+			// actually save the request to the database
55
+			if ($this->getSiteConfiguration()->getEmailConfirmationEnabled()) {
56
+				$this->saveAsEmailConfirmation($request);
57
+			}
58
+			else {
59
+				$this->saveWithoutEmailConfirmation($request);
60
+			}
61
+		}
62
+		else {
63
+			// set the form values from the session context
64
+			$context = WebRequest::getSessionContext('accountReq');
65
+			if ($context !== null && is_array($context)) {
66
+				$this->assign('username', $context['username']);
67
+				$this->assign('email', $context['email']);
68
+				$this->assign('comments', $context['comments']);
69
+			}
70
+
71
+			// Clear it for a refresh
72
+			WebRequest::setSessionContext('accountReq', null);
73
+
74
+			$this->setTemplate('request/request-form.tpl');
75
+		}
76
+	}
77
+
78
+	/**
79
+	 * @return Request
80
+	 */
81
+	protected function createNewRequest()
82
+	{
83
+		$request = new Request();
84
+		$request->setDatabase($this->getDatabase());
85
+
86
+		$request->setName(WebRequest::postString('name'));
87
+		$request->setEmail(WebRequest::postEmail('email'));
88
+		$request->setComment(WebRequest::postString('comments'));
89
+
90
+		$request->setIp(WebRequest::remoteAddress());
91
+		$request->setForwardedIp(WebRequest::forwardedAddress());
92
+
93
+		$request->setUserAgent(WebRequest::userAgent());
94
+
95
+		return $request;
96
+	}
97
+
98
+	/**
99
+	 * @param Request $request
100
+	 *
101
+	 * @return ValidationError[]
102
+	 */
103
+	protected function validateRequest($request)
104
+	{
105
+		$validationHelper = new RequestValidationHelper(
106
+			new BanHelper($this->getDatabase()),
107
+			$request,
108
+			WebRequest::postEmail('emailconfirm'),
109
+			$this->getDatabase(),
110
+			$this->getAntiSpoofProvider(),
111
+			$this->getXffTrustProvider(),
112
+			$this->getHttpHelper(),
113
+			$this->getSiteConfiguration()->getMediawikiWebServiceEndpoint(),
114
+			$this->getSiteConfiguration()->getTitleBlacklistEnabled(),
115
+			$this->getTorExitProvider());
116
+
117
+		// These are arrays of ValidationError.
118
+		$nameValidation = $validationHelper->validateName();
119
+		$emailValidation = $validationHelper->validateEmail();
120
+		$otherValidation = $validationHelper->validateOther();
121
+
122
+		$validationErrors = array_merge($nameValidation, $emailValidation, $otherValidation);
123
+
124
+		return $validationErrors;
125
+	}
126
+
127
+	/**
128
+	 * @param Request $request
129
+	 *
130
+	 * @throws Exception
131
+	 */
132
+	protected function saveAsEmailConfirmation(Request $request)
133
+	{
134
+		$request->generateEmailConfirmationHash();
135
+		$request->save();
136
+
137
+		$trustedIp = $this->getXffTrustProvider()->getTrustedClientIp(
138
+			$request->getIp(),
139
+			$request->getForwardedIp());
140
+
141
+		$this->assign("ip", $trustedIp);
142
+		$this->assign("id", $request->getId());
143
+		$this->assign("hash", $request->getEmailConfirm());
144
+
145
+		// Sends the confirmation email to the user.
146
+		$this->getEmailHelper()->sendMail(
147
+			$request->getEmail(),
148
+			"[ACC #{$request->getId()}] English Wikipedia Account Request",
149
+			$this->fetchTemplate('request/confirmation-mail.tpl'));
150
+
151
+		$this->redirect('emailConfirmationRequired');
152
+	}
153
+
154
+	/**
155
+	 * @param Request $request
156
+	 *
157
+	 * @throws Exception
158
+	 */
159
+	protected function saveWithoutEmailConfirmation(Request $request)
160
+	{
161
+		$request->setEmailConfirm(0); // fixme Since it can't be null
162
+		$request->save();
163
+
164
+		$this->getNotificationHelper()->requestReceived($request);
165
+
166
+		$this->redirect('requestSubmitted');
167
+	}
168 168
 }
169 169
\ No newline at end of file
Please login to merge, or discard this patch.
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.