Completed
Push — master ( 435892...45f10c )
by Matt
20:55
created

admin_input   A

Complexity

Total Complexity 33

Size/Duplication

Total Lines 299
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Test Coverage

Coverage 97.46%

Importance

Changes 8
Bugs 0 Features 0
Metric Value
wmc 33
c 8
b 0
f 0
lcom 1
cbo 1
dl 0
loc 299
ccs 115
cts 118
cp 0.9746
rs 9.3999

13 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 10 1
A get_errors() 0 4 1
A has_errors() 0 4 1
B banner_upload() 0 30 5
A validate_ad_code() 0 10 2
B get_form_data() 0 33 4
A validate_ad_name() 0 14 3
A validate_ad_end_date() 0 19 4
A validate_ad_priority() 0 9 3
A validate_ad_views_limit() 0 9 2
A validate_ad_clicks_limit() 0 9 2
A validate_ad_owner() 0 10 4
A send_ajax_response() 0 9 1
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
	 * @param \phpbb\language\language $language    Language object
44
	 * @param \phpbb\request\request   $request     Request object
45
	 * @param \phpbb\ads\banner\banner $banner      Banner upload object
46
	 */
47 20
	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
	{
49 20
		$this->user = $user;
50 20
		$this->user_loader = $user_loader;
51 20
		$this->language = $language;
52 20
		$this->request = $request;
53 20
		$this->banner = $banner;
54
55 20
		add_form_key('phpbb_ads');
56 20
	}
57
58
	/**
59
	 * Gets all errors
60
	 *
61
	 * @return	array	Errors
62
	 */
63 15
	public function get_errors()
64
	{
65 15
		return $this->errors;
66
	}
67
68
	/**
69
	 * Returns number of errors.
70
	 *
71
	 * @return	int	Number of errors
72
	 */
73 15
	public function has_errors()
74
	{
75 15
		return count($this->errors);
76
	}
77
78
	/**
79
	 * Get admin form data.
80
	 *
81
	 * @return	array	Form data
82
	 */
83 13
	public function get_form_data()
84
	{
85
		$data = array(
86 13
			'ad_name'         => $this->request->variable('ad_name', '', true),
87 13
			'ad_note'         => $this->request->variable('ad_note', '', true),
88 13
			'ad_code'         => $this->request->variable('ad_code', '', true),
89 13
			'ad_enabled'      => $this->request->variable('ad_enabled', 0),
90 13
			'ad_locations'    => $this->request->variable('ad_locations', array('')),
91 13
			'ad_end_date'     => $this->request->variable('ad_end_date', ''),
92 13
			'ad_priority'     => $this->request->variable('ad_priority', ext::DEFAULT_PRIORITY),
93 13
			'ad_views_limit'  => $this->request->variable('ad_views_limit', 0),
94 13
			'ad_clicks_limit' => $this->request->variable('ad_clicks_limit', 0),
95 13
			'ad_owner'        => $this->request->variable('ad_owner', '', true),
96 13
		);
97
98
		// Validate form key
99 13
		if (!check_form_key('phpbb_ads'))
100 13
		{
101 2
			$this->errors[] = 'FORM_INVALID';
102 2
		}
103
104
		// Validate each property. Some validators update the property value. Errors are added to $this->errors.
105 13
		foreach ($data as $prop_name => $prop_val)
106
		{
107 13
			$method = 'validate_' . $prop_name;
108 13
			if (method_exists($this, $method))
109 13
			{
110 13
				$data[$prop_name] = $this->{$method}($prop_val);
111 13
			}
112 13
		}
113
114 13
		return $data;
115
	}
116
117
	/**
118
	 * Upload image and return updated ad code or <img> of new banner when using ajax.
119
	 *
120
	 * @param	 string	 $ad_code	 Current ad code
121
	 * @return	 string	 \phpbb\json_response when request is ajax or updated ad code otherwise.
122
	 */
123 7
	public function banner_upload($ad_code)
124
	{
125
		try
126
		{
127 7
			$this->banner->create_storage_dir();
128 4
			$realname = $this->banner->upload();
129
130 3
			$banner_html = '<img src="' . generate_board_url() . '/images/phpbb_ads/' . $realname . '" />';
131
132 3
			if ($this->request->is_ajax())
133 3
			{
134 1
				$this->send_ajax_response(true, $banner_html);
135
			}
136
137 2
			$ad_code = ($ad_code ? $ad_code . "\n\n" : '') . $banner_html;
138
		}
139 7
		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...
140
		{
141 4
			$this->banner->remove();
142
143 4
			if ($this->request->is_ajax())
144 4
			{
145 1
				$this->send_ajax_response(false, $this->language->lang($e->getMessage()));
146
			}
147
148 3
			$this->errors[] = $this->language->lang($e->getMessage());
149
		}
150
151 5
		return $ad_code;
152
	}
153
154
	/**
155
	 * Validate advertisement name
156
	 *
157
	 * Ad name is required and must not be empty. Ad name must
158
	 * also be less than 255 characters.
159
	 *
160
	 * @param string $ad_name Advertisement name
161
	 * @return string Advertisement name
162
	 */
163 13
	protected function validate_ad_name($ad_name)
164
	{
165 13
		if ($ad_name === '')
166 13
		{
167 2
			$this->errors[] = 'AD_NAME_REQUIRED';
168 2
		}
169
170 13
		if (truncate_string($ad_name, ext::MAX_NAME_LENGTH) !== $ad_name)
171 13
		{
172 1
			$this->errors[] = $this->language->lang('AD_NAME_TOO_LONG', ext::MAX_NAME_LENGTH);
173 1
		}
174
175 13
		return $ad_name;
176
	}
177
178
	/**
179
	 * Validate advertisement code
180
	 *
181
	 * Ad code should not contain 4-byte Emoji characters.
182
	 *
183
	 * @param string $ad_code Advertisement code
184
	 * @return string Advertisement code
185
	 */
186 13
	protected function validate_ad_code($ad_code)
187
	{
188 13
		if (preg_match_all('/[\x{10000}-\x{10FFFF}]/u', $ad_code, $matches))
189 13
		{
190 1
			$characters = implode(' ', $matches[0]);
191 1
			$this->errors[] = $this->language->lang('AD_CODE_ILLEGAL_CHARS', $characters);
192 1
		}
193
194 13
		return $ad_code;
195
	}
196
197
	/**
198
	 * Validate advertisement end date
199
	 *
200
	 * End date must use the expected format of YYYY-MM-DD.
201
	 * If the date is valid, convert it to a timestamp and then
202
	 * make sure the timestamp is less than the current time.
203
	 *
204
	 * @param string $end_date Advertisement end date
205
	 * @return int The end date converted to timestamp if valid, otherwise 0.
206
	 */
207 13
	protected function validate_ad_end_date($end_date)
208
	{
209 13
		$timestamp = 0;
210 13
		if (preg_match('#^\d{4}\-\d{2}\-\d{2}$#', $end_date))
211 13
		{
212 2
			$timestamp = (int) $this->user->get_timestamp_from_format(ext::DATE_FORMAT, $end_date);
213
214 2
			if ($timestamp < time())
215 2
			{
216 1
				$this->errors[] = 'AD_END_DATE_INVALID';
217 1
			}
218 2
		}
219 11
		else if ($end_date !== '')
220 11
		{
221 2
			$this->errors[] = 'AD_END_DATE_INVALID';
222 2
		}
223
224 13
		return $timestamp;
225
	}
226
227
	/**
228
	 * Validate advertisement priority
229
	 *
230
	 * Ad priority must be an integer between 1 and 10.
231
	 *
232
	 * @param int $ad_priority Advertisement priority
233
	 * @return int Advertisement priority
234
	 */
235 13
	protected function validate_ad_priority($ad_priority)
236
	{
237 13
		if ($ad_priority < 1 || $ad_priority > 10)
238 13
		{
239 3
			$this->errors[] = 'AD_PRIORITY_INVALID';
240 3
		}
241
242 13
		return $ad_priority;
243
	}
244
245
	/**
246
	 * Validate advertisement views limit
247
	 *
248
	 * Clicks must be a positive integer.
249
	 *
250
	 * @param int $ad_views_limit Advertisement views limit
251
	 * @return int Advertisement views limit
252
	 */
253 13
	protected function validate_ad_views_limit($ad_views_limit)
254
	{
255 13
		if ($ad_views_limit < 0)
256 13
		{
257 2
			$this->errors[] = 'AD_VIEWS_LIMIT_INVALID';
258 2
		}
259
260 13
		return $ad_views_limit;
261
	}
262
263
	/**
264
	 * Validate advertisement clicks limit
265
	 *
266
	 * Clicks must be a positive integer.
267
	 *
268
	 * @param int $ad_clicks_limit Advertisement clicks limit
269
	 * @return int Advertisement clicks limit
270
	 */
271 13
	protected function validate_ad_clicks_limit($ad_clicks_limit)
272
	{
273 13
		if ($ad_clicks_limit < 0)
274 13
		{
275 2
			$this->errors[] = 'AD_CLICKS_LIMIT_INVALID';
276 2
		}
277
278 13
		return $ad_clicks_limit;
279
	}
280
281
	/**
282
	 * Validate advertisement owner
283
	 *
284
	 * If ad owner name given, get their ID. If the ID returned is ANONYMOUS,
285
	 * set an error because the user name given doesn't exist.
286
	 *
287
	 * @param string $ad_owner User name
288
	 * @return int User id if user exists, otherwise 0.
289
	 */
290 13
	protected function validate_ad_owner($ad_owner)
291
	{
292 13
		$user_id = 0;
293 13
		if (!empty($ad_owner) && ANONYMOUS === ($user_id = (int) $this->user_loader->load_user_by_username($ad_owner)))
294 13
		{
295 2
			$this->errors[] = 'AD_OWNER_INVALID';
296 2
		}
297
298 13
		return ANONYMOUS !== $user_id ? $user_id : 0;
299
	}
300
301
	/**
302
	 * Send ajax response
303
	 *
304
	 * @param bool $success Is request successful?
305
	 * @param string $text Text to return
306
	 */
307 2
	protected function send_ajax_response($success, $text)
308
	{
309 2
		$json_response = new \phpbb\json_response;
310 2
		$json_response->send(array(
311 2
			'success'	=> $success,
312 2
			'title'		=> $this->language->lang('INFORMATION'),
313 2
			'text'		=> $text,
314 2
		));
315
	}
316
}
317