Completed
Pull Request — master (#89)
by Matt
31:03
created

admin_input::validate_ad_code()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 10
ccs 10
cts 10
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 5
nc 2
nop 1
crap 2
1
<?php
2
/**
3
 *
4
 * Advertisement management. An extension for the phpBB Forum Software package.
5
 *
6
 * @copyright (c) 2017 phpBB Limited <https://www.phpbb.com>
7
 * @license GNU General Public License, version 2 (GPL-2.0)
8
 *
9
 */
10
11
namespace phpbb\ads\controller;
12
13
use phpbb\ads\ext;
14
15
/**
16
 * Admin input
17
 */
18
class admin_input
19
{
20
	/** @var \phpbb\user */
21
	protected $user;
22
23
	/** @var \phpbb\user_loader */
24
	protected $user_loader;
25
26
	/** @var \phpbb\language\language */
27
	protected $language;
28
29
	/** @var \phpbb\request\request */
30
	protected $request;
31
32
	/** @var \phpbb\ads\banner\banner */
33
	protected $banner;
34
35
	/** @var array Form validation errors */
36
	protected $errors = array();
37
38
	/**
39
	 * Constructor
40
	 *
41
	 * @param \phpbb\user              $user        User object
42
	 * @param \phpbb\user_loader       $user_loader User loader object
43 19
	 * @param \phpbb\language\language $language    Language object
44
	 * @param \phpbb\request\request   $request     Request object
45 19
	 * @param \phpbb\ads\banner\banner $banner      Banner upload object
46 19
	 */
47 19
	public function __construct(\phpbb\user $user, \phpbb\user_loader $user_loader, \phpbb\language\language $language, \phpbb\request\request $request, \phpbb\ads\banner\banner $banner)
48 19
	{
49
		$this->user = $user;
50 19
		$this->user_loader = $user_loader;
51 19
		$this->language = $language;
52
		$this->request = $request;
53
		$this->banner = $banner;
54
55
		add_form_key('phpbb_ads');
56
	}
57
58 14
	/**
59
	 * Gets all errors
60 14
	 *
61
	 * @return	array	Errors
62
	 */
63
	public function get_errors()
64
	{
65
		return $this->errors;
66
	}
67
68 14
	/**
69
	 * Returns number of errors.
70 14
	 *
71
	 * @return	int	Number of errors
72
	 */
73
	public function has_errors()
74
	{
75
		return count($this->errors);
76
	}
77
78 12
	/**
79
	 * Get admin form data.
80
	 *
81 12
	 * @return	array	Form data
82 12
	 */
83 12
	public function get_form_data()
84 12
	{
85 12
		$data = array(
86 12
			'ad_name'         => $this->request->variable('ad_name', '', true),
87 12
			'ad_note'         => $this->request->variable('ad_note', '', true),
88 12
			'ad_code'         => $this->request->variable('ad_code', '', true),
89 12
			'ad_enabled'      => $this->request->variable('ad_enabled', 0),
90 12
			'ad_locations'    => $this->request->variable('ad_locations', array('')),
91 12
			'ad_end_date'     => $this->request->variable('ad_end_date', ''),
92
			'ad_priority'     => $this->request->variable('ad_priority', ext::DEFAULT_PRIORITY),
93
			'ad_views_limit'  => $this->request->variable('ad_views_limit', 0),
94 12
			'ad_clicks_limit' => $this->request->variable('ad_clicks_limit', 0),
95 12
			'ad_owner'        => $this->request->variable('ad_owner', '', true),
96 2
		);
97 2
98
		// Validate form key
99
		if (!check_form_key('phpbb_ads'))
100 12
		{
101
			$this->errors[] = 'FORM_INVALID';
102 12
		}
103 12
104 12
		// Validate each property. Some validators update the property value. Errors are added to $this->errors.
105 12
		foreach ($data as $prop_name => &$prop_val)
106 12
		{
107
			$method = 'validate_' . $prop_name;
108
			if (method_exists($this, $method))
109 12
			{
110 12
				$prop_val = $this->{$method}($prop_val);
111 12
			}
112 10
		}
113 10
114
		unset($prop_val);
115 12
116
		return $data;
117
	}
118
119
	/**
120
	 * Upload image and return updated ad code or <img> of new banner when using ajax.
121
	 *
122
	 * @param	 string	 $ad_code	 Current ad code
123
	 * @return	 string	 \phpbb\json_response when request is ajax or updated ad code otherwise.
124 7
	 */
125
	public function banner_upload($ad_code)
126
	{
127
		try
128 7
		{
129 4
			$this->banner->create_storage_dir();
130
			$realname = $this->banner->upload();
131 3
132
			$banner_html = '<img src="' . generate_board_url() . '/images/phpbb_ads/' . $realname . '" />';
133 3
134 3
			if ($this->request->is_ajax())
135 1
			{
136
				$this->send_ajax_response(true, $banner_html);
137
			}
138 2
139
			$ad_code = ($ad_code ? $ad_code . "\n\n" : '') . $banner_html;
140 7
		}
141
		catch (\phpbb\exception\runtime_exception $e)
0 ignored issues
show
Bug introduced by
The class phpbb\exception\runtime_exception does not exist. Did you forget a USE statement, or did you not list all dependencies?

Scrutinizer analyzes your composer.json/composer.lock file if available to determine the classes, and functions that are defined by your dependencies.

It seems like the listed class was neither found in your dependencies, nor was it found in the analyzed files in your repository. If you are using some other form of dependency management, you might want to disable this analysis.

Loading history...
142 4
		{
143
			$this->banner->remove();
144 4
145 4
			if ($this->request->is_ajax())
146 1
			{
147
				$this->send_ajax_response(false, $this->language->lang($e->getMessage()));
148
			}
149 3
150
			$this->errors[] = $this->language->lang($e->getMessage());
151
		}
152 5
153
		return $ad_code;
154
	}
155
156
	/**
157
	 * Validate advertisement name
158
	 *
159
	 * @param string $ad_name Advertisement name
160 12
	 * @return string Advertisement name
161
	 */
162 12
	protected function validate_ad_name($ad_name)
163 12
	{
164 2
		if ($ad_name === '')
165 2
		{
166 12
			$this->errors[] = 'AD_NAME_REQUIRED';
167 12
		}
168 1
169 1
		if (truncate_string($ad_name, ext::MAX_NAME_LENGTH) !== $ad_name)
170 12
		{
171
			$this->errors[] = $this->language->lang('AD_NAME_TOO_LONG', ext::MAX_NAME_LENGTH);
172
		}
173
174
		return $ad_name;
175
	}
176
177 12
	/**
178
	 * Validate advertisement code
179 12
	 *
180 12
	 * @param string $ad_code Advertisement code
181 2
	 * @return string Advertisement code
182
	 */
183 2
	protected function validate_ad_code($ad_code)
184 2
	{
185 1
		if (preg_match_all('/[\x{10000}-\x{10FFFF}]/u', $ad_code, $matches))
186 1
		{
187 2
			$characters = implode(' ', $matches[0]);
188 10
			$this->errors[] = $this->language->lang('AD_CODE_ILLEGAL_CHARS', $characters);
189 10
		}
190 2
191 2
		return $ad_code;
192 12
	}
193
194
	/**
195
	 * Validate advertisement end date
196
	 *
197
	 * @param string $end_date Advertisement end date
198
	 * @return int The end date converted to timestamp if valid, otherwise 0.
199 12
	 */
200
	protected function validate_ad_end_date($end_date)
201 12
	{
202 12
		$timestamp = 0;
203 3
		if (preg_match('#^\d{4}\-\d{2}\-\d{2}$#', $end_date))
204 3
		{
205 12
			$timestamp = (int) $this->user->get_timestamp_from_format(ext::DATE_FORMAT, $end_date);
206
207
			if ($timestamp < time())
208
			{
209
				$this->errors[] = 'AD_END_DATE_INVALID';
210
			}
211
		}
212 12
		else if ($end_date !== '')
213
		{
214 12
			$this->errors[] = 'AD_END_DATE_INVALID';
215 12
		}
216 2
217 2
		return $timestamp;
218 12
	}
219
220
	/**
221
	 * Validate advertisement priority
222
	 *
223
	 * @param int $ad_priority Advertisement priority
224
	 * @return int Advertisement priority
225 12
	 */
226
	protected function validate_ad_priority($ad_priority)
227 12
	{
228 12
		if ($ad_priority < 1 || $ad_priority > 10)
229 2
		{
230 2
			$this->errors[] = 'AD_PRIORITY_INVALID';
231 12
		}
232
233
		return $ad_priority;
234
	}
235
236
	/**
237
	 * Validate advertisement views limit
238 12
	 *
239
	 * @param int $ad_views_limit Advertisement views limit
240
	 * @return int Advertisement views limit
241 12
	 */
242 12
	protected function validate_ad_views_limit($ad_views_limit)
243 2
	{
244 2
		if ($ad_views_limit < 0)
245 12
		{
246
			$this->errors[] = 'AD_VIEWS_LIMIT_INVALID';
247
		}
248
249
		return $ad_views_limit;
250
	}
251
252
	/**
253 12
	 * Validate advertisement clicks limit
254
	 *
255 12
	 * @param int $ad_clicks_limit Advertisement clicks limit
256
	 * @return int Advertisement clicks limit
257
	 */
258
	protected function validate_ad_clicks_limit($ad_clicks_limit)
259
	{
260
		if ($ad_clicks_limit < 0)
261
		{
262
			$this->errors[] = 'AD_CLICKS_LIMIT_INVALID';
263
		}
264 10
265
		return $ad_clicks_limit;
266 10
	}
267 10
268 9
	/**
269
	 * Validate advertisement owner
270
	 *
271 1
	 * @param string $ad_owner User name
272 1
	 * @return int User id if user exists, otherwise 0.
273
	 */
274
	protected function validate_ad_owner($ad_owner)
275
	{
276
		if (!empty($ad_owner) && ANONYMOUS === ($ad_owner = (int) $this->user_loader->load_user_by_username($ad_owner)))
277
		{
278
			$this->errors[] = 'AD_OWNER_INVALID';
279
		}
280
281 2
		return ANONYMOUS === $ad_owner ? 0 : (int) $ad_owner;
282
	}
283 2
284 2
	/**
285 2
	 * Send ajax response
286 2
	 *
287 2
	 * @param bool $success Is request successful?
288 2
	 * @param string $text Text to return
289
	 */
290
	protected function send_ajax_response($success, $text)
291
	{
292
		$json_response = new \phpbb\json_response;
293
		$json_response->send(array(
294
			'success'	=> $success,
295
			'title'		=> $this->language->lang('INFORMATION'),
296
			'text'		=> $text,
297
		));
298
	}
299
}
300