1 | <?php |
||
2 | /** |
||
3 | * |
||
4 | * phpBB Media Embed PlugIn extension for the phpBB Forum Software package. |
||
5 | * |
||
6 | * @copyright (c) 2016 phpBB Limited <https://www.phpbb.com> |
||
7 | * @license GNU General Public License, version 2 (GPL-2.0) |
||
8 | * |
||
9 | */ |
||
10 | |||
11 | namespace phpbb\mediaembed\controller; |
||
12 | |||
13 | use phpbb\config\config; |
||
0 ignored issues
–
show
|
|||
14 | use phpbb\config\db_text; |
||
0 ignored issues
–
show
The type
phpbb\config\db_text was not found. Maybe you did not declare it correctly or list all dependencies?
The issue could also be caused by a filter entry in the build configuration.
If the path has been excluded in your configuration, e.g. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||
15 | use phpbb\language\language; |
||
0 ignored issues
–
show
The type
phpbb\language\language was not found. Maybe you did not declare it correctly or list all dependencies?
The issue could also be caused by a filter entry in the build configuration.
If the path has been excluded in your configuration, e.g. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||
16 | use phpbb\log\log; |
||
0 ignored issues
–
show
The type
phpbb\log\log was not found. Maybe you did not declare it correctly or list all dependencies?
The issue could also be caused by a filter entry in the build configuration.
If the path has been excluded in your configuration, e.g. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||
17 | use phpbb\mediaembed\cache\cache as media_cache; |
||
18 | use phpbb\request\request; |
||
0 ignored issues
–
show
The type
phpbb\request\request was not found. Maybe you did not declare it correctly or list all dependencies?
The issue could also be caused by a filter entry in the build configuration.
If the path has been excluded in your configuration, e.g. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||
19 | use phpbb\template\template; |
||
0 ignored issues
–
show
The type
phpbb\template\template was not found. Maybe you did not declare it correctly or list all dependencies?
The issue could also be caused by a filter entry in the build configuration.
If the path has been excluded in your configuration, e.g. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||
20 | use phpbb\textformatter\s9e\factory as textformatter; |
||
0 ignored issues
–
show
The type
phpbb\textformatter\s9e\factory was not found. Maybe you did not declare it correctly or list all dependencies?
The issue could also be caused by a filter entry in the build configuration.
If the path has been excluded in your configuration, e.g. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||
21 | use phpbb\user; |
||
0 ignored issues
–
show
The type
phpbb\user was not found. Maybe you did not declare it correctly or list all dependencies?
The issue could also be caused by a filter entry in the build configuration.
If the path has been excluded in your configuration, e.g. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||
22 | |||
23 | /** |
||
24 | * phpBB Media Embed ACP module controller. |
||
25 | */ |
||
26 | class acp_controller implements acp_controller_interface |
||
27 | { |
||
28 | /** @var config $config */ |
||
29 | protected $config; |
||
30 | |||
31 | /** @var db_text $config_text */ |
||
32 | protected $config_text; |
||
33 | |||
34 | /** @var language $language */ |
||
35 | protected $language; |
||
36 | |||
37 | /** @var log $log */ |
||
38 | protected $log; |
||
39 | |||
40 | /** @var media_cache $media_cache */ |
||
41 | protected $media_cache; |
||
42 | |||
43 | /** @var request $request */ |
||
44 | protected $request; |
||
45 | |||
46 | /** @var template $template */ |
||
47 | protected $template; |
||
48 | |||
49 | /** @var textformatter $textformatter */ |
||
50 | protected $textformatter; |
||
51 | |||
52 | /** @var user $user */ |
||
53 | protected $user; |
||
54 | |||
55 | /** @var array $enabled_sites */ |
||
56 | protected $enabled_sites; |
||
57 | |||
58 | /** @var string $u_action */ |
||
59 | public $u_action; |
||
60 | |||
61 | /** @var array An array of errors */ |
||
62 | protected $errors = []; |
||
63 | |||
64 | /** |
||
65 | * Constructor |
||
66 | */ |
||
67 | public function __construct(config $config, db_text $config_text, language $language, log $log, media_cache $media_cache, request $request, template $template, textformatter $textformatter, user $user) |
||
68 | { |
||
69 | $this->config = $config; |
||
70 | $this->config_text = $config_text; |
||
71 | $this->language = $language; |
||
72 | $this->log = $log; |
||
73 | $this->media_cache = $media_cache; |
||
74 | $this->request = $request; |
||
75 | $this->template = $template; |
||
76 | $this->textformatter = $textformatter; |
||
77 | $this->user = $user; |
||
78 | |||
79 | $this->language->add_lang('acp', 'phpbb/mediaembed'); |
||
80 | } |
||
81 | |||
82 | /** |
||
83 | * Set page url |
||
84 | * |
||
85 | * @param string $u_action Custom form action |
||
86 | */ |
||
87 | public function set_page_url($u_action) |
||
88 | { |
||
89 | $this->u_action = $u_action; |
||
90 | } |
||
91 | |||
92 | /** |
||
93 | * Add settings template vars to the form |
||
94 | */ |
||
95 | public function display_settings() |
||
96 | { |
||
97 | $this->template->assign_vars([ |
||
98 | 'S_MEDIA_EMBED_BBCODE' => $this->config['media_embed_bbcode'], |
||
99 | 'S_MEDIA_EMBED_ALLOW_SIG' => $this->config['media_embed_allow_sig'], |
||
100 | 'S_MEDIA_EMBED_PARSE_URLS' => $this->config['media_embed_parse_urls'], |
||
101 | 'S_MEDIA_EMBED_ENABLE_CACHE' => $this->config['media_embed_enable_cache'], |
||
102 | 'S_MEDIA_EMBED_FULL_WIDTH' => $this->config['media_embed_full_width'], |
||
103 | 'S_MEDIA_EMBED_MAX_WIDTHS' => $this->get_media_embed_max_width(), |
||
104 | 'U_ACTION' => $this->u_action, |
||
105 | ]); |
||
106 | } |
||
107 | |||
108 | /** |
||
109 | * Add manage sites template vars to the form |
||
110 | */ |
||
111 | public function display_manage() |
||
112 | { |
||
113 | $this->template->assign_vars([ |
||
114 | 'MEDIA_SITES' => $this->get_sites(), |
||
115 | 'U_ACTION' => $this->u_action, |
||
116 | 'ERRORS' => $this->errors, |
||
117 | ]); |
||
118 | } |
||
119 | |||
120 | /** |
||
121 | * Save settings data to the database |
||
122 | * |
||
123 | * @return array Message and code for trigger error |
||
124 | */ |
||
125 | public function save_settings() |
||
126 | { |
||
127 | $this->config->set('media_embed_bbcode', $this->request->variable('media_embed_bbcode', 0)); |
||
128 | $this->config->set('media_embed_allow_sig', $this->request->variable('media_embed_allow_sig', 0)); |
||
129 | $this->config->set('media_embed_parse_urls', $this->request->variable('media_embed_parse_urls', 0)); |
||
130 | $this->config->set('media_embed_enable_cache', $this->request->variable('media_embed_enable_cache', 0)); |
||
131 | $this->config->set('media_embed_full_width', $this->request->variable('media_embed_full_width', 0)); |
||
132 | |||
133 | $this->set_media_embed_max_width(); |
||
134 | |||
135 | $this->media_cache->purge_textformatter_cache(); |
||
136 | |||
137 | $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_PHPBB_MEDIA_EMBED_SETTINGS'); |
||
138 | |||
139 | if (count($this->errors)) |
||
140 | { |
||
141 | return [ |
||
142 | 'code' => E_USER_WARNING, |
||
143 | 'message' => $this->language->lang('ACP_MEDIA_ERROR_MSG', implode('<br>', $this->errors)) |
||
144 | ]; |
||
145 | } |
||
146 | |||
147 | return [ |
||
148 | 'code' => E_USER_NOTICE, |
||
149 | 'message' => $this->language->lang('CONFIG_UPDATED') |
||
150 | ]; |
||
151 | } |
||
152 | |||
153 | /** |
||
154 | * Save site managed data to the database |
||
155 | * |
||
156 | * @return array Message and code for trigger error |
||
157 | */ |
||
158 | public function save_manage() |
||
159 | { |
||
160 | $this->config_text->set('media_embed_sites', json_encode($this->request->variable('mark', ['']))); |
||
161 | |||
162 | $this->media_cache->purge_textformatter_cache(); |
||
163 | |||
164 | $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_PHPBB_MEDIA_EMBED_MANAGE'); |
||
165 | |||
166 | return [ |
||
167 | 'code' => E_USER_NOTICE, |
||
168 | 'message' => $this->language->lang('CONFIG_UPDATED') |
||
169 | ]; |
||
170 | } |
||
171 | |||
172 | /** |
||
173 | * Purge all Media Embed cache files |
||
174 | */ |
||
175 | public function purge_mediaembed_cache() |
||
176 | { |
||
177 | $this->media_cache->purge_mediaembed_cache(); |
||
178 | |||
179 | $this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_PHPBB_MEDIA_EMBED_CACHE_PURGED'); |
||
180 | |||
181 | return [ |
||
182 | 'code' => E_USER_NOTICE, |
||
183 | 'message' => $this->language->lang('PURGE_CACHE_SUCCESS') |
||
184 | ]; |
||
185 | |||
186 | } |
||
187 | |||
188 | /** |
||
189 | * Get a list of available sites |
||
190 | * |
||
191 | * @return array An array of available sites |
||
192 | */ |
||
193 | protected function get_sites() |
||
194 | { |
||
195 | $sites = []; |
||
196 | |||
197 | $configurator = $this->textformatter->get_configurator(); |
||
198 | foreach ($configurator->MediaEmbed->defaultSites as $siteId => $siteConfig) |
||
199 | { |
||
200 | $disabled = isset($configurator->BBCodes[$siteId]); |
||
201 | $sites[$siteId] = [ |
||
202 | 'id' => $siteId, |
||
203 | 'name' => $siteConfig['name'], |
||
204 | 'title' => $this->language->lang($disabled ? 'ACP_MEDIA_SITE_DISABLED' : 'ACP_MEDIA_SITE_TITLE', $siteId), |
||
205 | 'enabled' => in_array($siteId, $this->get_enabled_sites()), |
||
206 | 'disabled' => $disabled, |
||
207 | ]; |
||
208 | } |
||
209 | |||
210 | ksort($sites); |
||
211 | |||
212 | $this->errors = array_diff($this->get_enabled_sites(), array_keys($sites)); |
||
213 | |||
214 | return $sites; |
||
215 | } |
||
216 | |||
217 | /** |
||
218 | * Get enabled media sites stored in the database |
||
219 | * |
||
220 | * @return array An array of enabled sites |
||
221 | */ |
||
222 | protected function get_enabled_sites() |
||
223 | { |
||
224 | if ($this->enabled_sites === null) |
||
225 | { |
||
226 | $sites = json_decode($this->config_text->get('media_embed_sites'), true); |
||
227 | $this->enabled_sites = is_array($sites) ? $sites : []; |
||
228 | } |
||
229 | |||
230 | return $this->enabled_sites; |
||
231 | } |
||
232 | |||
233 | /** |
||
234 | * Store the media embed max width value to the config text as JSON, |
||
235 | * with some basic input validation and array formatting. |
||
236 | */ |
||
237 | protected function set_media_embed_max_width() |
||
238 | { |
||
239 | $input = $this->request->variable('media_embed_max_width', ''); |
||
240 | |||
241 | if ($input) |
||
242 | { |
||
243 | $lines = array_unique(explode("\n", $input)); |
||
244 | |||
245 | foreach ($lines as $key => $line) |
||
246 | { |
||
247 | $parts = explode(':', $line); |
||
248 | if (count($parts) !== 2) |
||
249 | { |
||
250 | unset($lines[$key]); |
||
251 | continue; |
||
252 | } |
||
253 | |||
254 | $lines[$key] = array_combine(['site', 'width'], array_map('trim', $parts)); |
||
255 | } |
||
256 | |||
257 | $input = json_encode(array_filter($lines, [$this, 'validate'])); |
||
258 | } |
||
259 | |||
260 | $this->config_text->set('media_embed_max_width', strtolower($input)); |
||
261 | } |
||
262 | |||
263 | /** |
||
264 | * Get the stored media embed max width data from config text and convert |
||
265 | * from JSON to the formatting used in the ACP textarea field. |
||
266 | * |
||
267 | * @return string |
||
268 | */ |
||
269 | protected function get_media_embed_max_width() |
||
270 | { |
||
271 | $config = json_decode($this->config_text->get('media_embed_max_width'), true); |
||
272 | |||
273 | if ($config) |
||
274 | { |
||
275 | foreach ($config as &$item) |
||
276 | { |
||
277 | $item = implode(':', $item); |
||
278 | } |
||
279 | |||
280 | unset($item); |
||
281 | } |
||
282 | |||
283 | return $config ? implode("\n", $config) : ''; |
||
284 | } |
||
285 | |||
286 | /** |
||
287 | * Validate the input for media embed max widths |
||
288 | * 'site' key value should be a word |
||
289 | * 'width' key value should be a number appended with either px or % |
||
290 | * |
||
291 | * @param array $input The array to check |
||
292 | * @return bool True if array contains valid values, false if not |
||
293 | * @throws \Exception |
||
294 | */ |
||
295 | protected function validate($input) |
||
296 | { |
||
297 | // First, lets get all the available media embed site IDs |
||
298 | static $default_sites; |
||
299 | |||
300 | if (null === $default_sites) |
||
301 | { |
||
302 | $configurator = $this->textformatter->get_configurator(); |
||
303 | $default_sites = array_keys(iterator_to_array($configurator->MediaEmbed->defaultSites)); |
||
304 | } |
||
305 | |||
306 | // Next create an array to hold any errors |
||
307 | $errors = []; |
||
308 | |||
309 | // Check to see if the site id provided exists in Media Embed |
||
310 | if (!in_array($input['site'], $default_sites)) |
||
311 | { |
||
312 | $errors[] = $this->language->lang('ACP_MEDIA_INVALID_SITE', $input['site'], $input['width']); |
||
313 | } |
||
314 | |||
315 | // Check to see if the width provided is a valid number followed px or % |
||
316 | if (!preg_match('/^\d+(?:%|px)$/', $input['width'])) |
||
317 | { |
||
318 | $errors[] = $this->language->lang('ACP_MEDIA_INVALID_WIDTH', $input['site'], $input['width']); |
||
319 | } |
||
320 | |||
321 | // Update the errors object with any new errors |
||
322 | $this->errors = array_merge($this->errors, $errors); |
||
323 | |||
324 | return empty($errors); |
||
325 | } |
||
326 | } |
||
327 |
The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g.
excluded_paths: ["lib/*"]
, you can move it to the dependency path list as follows:For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths