Completed
Push — master ( 0ea243...da58d4 )
by Henry
10:25 queued 33s
created

includes/Controller/Comment.php (2 issues)

call_checks.maybe_mismatching_type_passed_with_def

Bug Minor

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
namespace Redaxscript\Controller;
3
4
use Redaxscript\Filter;
5
use Redaxscript\Html;
6
use Redaxscript\Mailer;
7
use Redaxscript\Model;
8
use Redaxscript\Validator;
9
10
/**
11
 * children class to process the comment request
12
 *
13
 * @since 3.0.0
14
 *
15
 * @package Redaxscript
16
 * @category Controller
17
 * @author Henry Ruhs
18
 * @author Balázs Szilágyi
19
 */
20
21
class Comment extends ControllerAbstract
22
{
23
	/**
24
	 * process the class
25
	 *
26
	 * @since 3.3.0
27
	 *
28
	 * @return string
29
	 */
30
31 7
	public function process() : string
32
	{
33 7
		$articleModel = new Model\Article();
34 7
		$settingModel = new Model\Setting();
35 7
		$postArray = $this->_normalizePost($this->_sanitizePost());
36 7
		$validateArray = $this->_validatePost($postArray);
0 ignored issues
show
It seems like $postArray defined by $this->_normalizePost($this->_sanitizePost()) on line 35 can also be of type null; however, Redaxscript\Controller\Comment::_validatePost() does only seem to accept array, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
37 7
		$route = $postArray['article'] ? $articleModel->getRouteById($postArray['article']) : null;
38
39
		/* handle validate */
40
41 7
		if ($validateArray)
42
		{
43 3
			return $this->_error(
44
			[
45 3
				'route' => $route,
46 3
				'message' => $validateArray
47
			]);
48
		}
49
50
		/* handle create */
51
52
		$createArray =
53
		[
54 4
			'author' => $postArray['author'],
55 4
			'email' => $postArray['email'],
56 4
			'url' => $postArray['url'],
57 4
			'text' => $postArray['text'],
58 4
			'language' => $articleModel->getById($postArray['article'])->language,
59 4
			'article' => $postArray['article'],
60 4
			'status' => $settingModel->get('verification') ? 0 : 1
61
		];
62 4
		if (!$this->_create($createArray))
63
		{
64 1
			return $this->_error(
65
			[
66 1
				'route' => $route
67
			]);
68
		}
69
70
		/* handle mail */
71
72
		$mailArray =
73
		[
74 3
			'email' => $postArray['email'],
75 3
			'url' => $postArray['url'],
76 3
			'route' => $route,
77 3
			'author' => $postArray['author'],
78 3
			'text' => $postArray['text'],
79 3
			'article' => $articleModel->getById($postArray['article'])->title
80
		];
81 3
		if (!$this->_mail($mailArray))
82
		{
83 1
			return $this->_warning(
84
			[
85 1
				'route' => $route,
86 1
				'timeout' => $settingModel->get('notification') ? 2 : 0,
87 1
				'message' => $this->_language->get('email_failed')
88
			]);
89
		}
90
91
		/* handle success */
92
93 2
		return $this->_success(
94
		[
95 2
			'route' => $route,
96 2
			'timeout' => $settingModel->get('notification') ? 2 : 0,
97 2
			'message' => $settingModel->get('moderation') ? $this->_language->get('comment_moderation') : $this->_language->get('comment_sent')
98
		]);
99
	}
100
101
	/**
102
	 * sanitize the post
103
	 *
104
	 * @since 4.0.0
105
	 *
106
	 * @return array
107
	 */
108
109 7
	protected function _sanitizePost() : array
110
	{
111 7
		$numberFilter = new Filter\Number();
112 7
		$specialFilter = new Filter\Special();
113 7
		$emailFilter = new Filter\Email();
114 7
		$urlFilter = new Filter\Url();
115 7
		$htmlFilter = new Filter\Html();
116
117
		/* sanitize post */
118
119
		return
120
		[
121 7
			'author' => $specialFilter->sanitize($this->_request->getPost('author')),
122 7
			'email' => $emailFilter->sanitize($this->_request->getPost('email')),
123 7
			'url' => $urlFilter->sanitize($this->_request->getPost('url')),
124 7
			'text' => $htmlFilter->sanitize($this->_request->getPost('text')),
125 7
			'article' => $numberFilter->sanitize($this->_request->getPost('article')),
126 7
			'task' => $numberFilter->sanitize($this->_request->getPost('task')),
127 7
			'solution' => $this->_request->getPost('solution')
128
		];
129
	}
130
131
	/**
132
	 * validate the post
133
	 *
134
	 * @since 3.3.0
135
	 *
136
	 * @param array $postArray array of the post
137
	 *
138
	 * @return array
139
	 */
140
141 7
	protected function _validatePost(array $postArray = []) : array
142
	{
143 7
		$emailValidator = new Validator\Email();
144 7
		$captchaValidator = new Validator\Captcha();
145 7
		$urlValidator = new Validator\Url();
146 7
		$settingModel = new Model\Setting();
147 7
		$validateArray = [];
148
149
		/* validate post */
150
151 7
		if (!$postArray['author'])
152
		{
153 2
			$validateArray[] = $this->_language->get('author_empty');
154
		}
155 7
		if (!$postArray['email'])
156
		{
157 1
			$validateArray[] = $this->_language->get('email_empty');
158
		}
159 6
		else if (!$emailValidator->validate($postArray['email']))
160
		{
161 1
			$validateArray[] = $this->_language->get('email_incorrect');
162
		}
163 7
		if ($postArray['url'] && !$urlValidator->validate($postArray['url']))
164
		{
165 1
			$validateArray[] = $this->_language->get('url_incorrect');
166
		}
167 7
		if (!$postArray['text'])
168
		{
169 2
			$validateArray[] = $this->_language->get('comment_empty');
170
		}
171 7
		if (!$postArray['article'])
172
		{
173 2
			$validateArray[] = $this->_language->get('article_empty');
174
		}
175 7
		if ($settingModel->get('captcha') > 0 && !$captchaValidator->validate($postArray['task'], $postArray['solution']))
176
		{
177 2
			$validateArray[] = $this->_language->get('captcha_incorrect');
178
		}
179 7
		return $validateArray;
180
	}
181
182
	/**
183
	 * create the comment
184
	 *
185
	 * @since 3.0.0
186
	 *
187
	 * @param array $createArray array of the create
188
	 *
189
	 * @return bool
190
	 */
191
192 3
	protected function _create(array $createArray = []) : bool
193
	{
194 3
		$commentModel = new Model\Comment();
195 3
		return $commentModel->createByArray($createArray);
196
	}
197
198
	/**
199
	 * send the mail
200
	 *
201
	 * @since 3.3.0
202
	 *
203
	 * @param array $mailArray array of the mail
204
	 *
205
	 * @return bool
206
	 */
207
208 2
	protected function _mail(array $mailArray = []) : bool
209
	{
210 2
		$settingModel = new Model\Setting();
211 2
		$urlArticle = $this->_registry->get('root') . '/' . $this->_registry->get('parameterRoute') . $mailArray['route'];
212
213
		/* html element */
214
215 2
		$element = new Html\Element();
216
		$linkEmail = $element
217 2
			->copy()
218 2
			->init('a',
219
			[
220 2
				'href' => 'mailto:' . $mailArray['email']
221
			])
222 2
			->text($mailArray['email']);
223
		$linkUrl = $element
224 2
			->copy()
225 2
			->init('a',
226
			[
227 2
				'href' => $mailArray['url']
228
			])
229 2
			->text($mailArray['url'] ? : $this->_language->get('none'));
230
		$linkArticle = $element
231 2
			->copy()
232 2
			->init('a',
233
			[
234 2
				'href' => $urlArticle
235
			])
236 2
			->text($urlArticle);
237
238
		/* prepare mail */
239
240
		$toArray =
241
		[
242 2
			$this->_language->get('author') => $settingModel->get('email')
243
		];
244
		$fromArray =
245
		[
246 2
			$mailArray['author'] => $mailArray['email']
247
		];
248 2
		$subject = $this->_language->get('comment_new');
249
		$bodyArray =
250
		[
251 2
			$this->_language->get('author') . $this->_language->get('colon') . ' ' . $mailArray['author'],
252 2
			'<br />',
253 2
			$this->_language->get('email') . $this->_language->get('colon') . ' ' . $linkEmail,
254 2
			'<br />',
255 2
			$this->_language->get('url') . $this->_language->get('colon') . ' ' . $linkUrl,
256 2
			'<br />',
257 2
			$this->_language->get('article') . $this->_language->get('colon') . ' ' . $linkArticle,
258 2
			'<br />',
259 2
			$this->_language->get('comment') . $this->_language->get('colon') . ' ' . $mailArray['text']
260
		];
261
262
		/* send mail */
263
264 2
		$mailer = new Mailer();
265 2
		$mailer->init($toArray, $fromArray, $subject, $bodyArray);
0 ignored issues
show
It seems like $subject defined by $this->_language->get('comment_new') on line 248 can also be of type array; however, Redaxscript\Mailer::init() does only seem to accept null|string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
266 2
		return $mailer->send();
267
	}
268
}
269