Verzeichnisstruktur phpBB-3.1.0
- Veröffentlicht
- 27.10.2014
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
functions_acp.php
001 <?php
002 /**
003 *
004 * This file is part of the phpBB Forum Software package.
005 *
006 * @copyright (c) phpBB Limited <https://www.phpbb.com>
007 * @license GNU General Public License, version 2 (GPL-2.0)
008 *
009 * For full copyright and license information, please see
010 * the docs/CREDITS.txt file.
011 *
012 */
013
014 /**
015 * @ignore
016 */
017 if (!defined('IN_PHPBB'))
018 {
019 exit;
020 }
021
022 /**
023 * Header for acp pages
024 */
025 function adm_page_header($page_title)
026 {
027 global $config, $db, $user, $template;
028 global $phpbb_root_path, $phpbb_admin_path, $phpEx, $SID, $_SID;
029 global $phpbb_dispatcher;
030
031 if (defined('HEADER_INC'))
032 {
033 return;
034 }
035
036 define('HEADER_INC', true);
037
038 // A listener can set this variable to `true` when it overrides this function
039 $adm_page_header_override = false;
040
041 /**
042 * Execute code and/or overwrite adm_page_header()
043 *
044 * @event core.adm_page_header
045 * @var string page_title Page title
046 * @var bool adm_page_header_override Shall we return instead of
047 * running the rest of adm_page_header()
048 * @since 3.1.0-a1
049 */
050 $vars = array('page_title', 'adm_page_header_override');
051 extract($phpbb_dispatcher->trigger_event('core.adm_page_header', compact($vars)));
052
053 if ($adm_page_header_override)
054 {
055 return;
056 }
057
058 // gzip_compression
059 if ($config['gzip_compress'])
060 {
061 if (@extension_loaded('zlib') && !headers_sent())
062 {
063 ob_start('ob_gzhandler');
064 }
065 }
066
067 $template->assign_vars(array(
068 'PAGE_TITLE' => $page_title,
069 'USERNAME' => $user->data['username'],
070
071 'SID' => $SID,
072 '_SID' => $_SID,
073 'SESSION_ID' => $user->session_id,
074 'ROOT_PATH' => $phpbb_root_path,
075 'ADMIN_ROOT_PATH' => $phpbb_admin_path,
076
077 'U_LOGOUT' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=logout'),
078 'U_ADM_LOGOUT' => append_sid("{$phpbb_admin_path}index.$phpEx", 'action=admlogout'),
079 'U_ADM_INDEX' => append_sid("{$phpbb_admin_path}index.$phpEx"),
080 'U_INDEX' => append_sid("{$phpbb_root_path}index.$phpEx"),
081
082 'T_IMAGES_PATH' => "{$phpbb_root_path}images/",
083 'T_SMILIES_PATH' => "{$phpbb_root_path}{$config['smilies_path']}/",
084 'T_AVATAR_PATH' => "{$phpbb_root_path}{$config['avatar_path']}/",
085 'T_AVATAR_GALLERY_PATH' => "{$phpbb_root_path}{$config['avatar_gallery_path']}/",
086 'T_ICONS_PATH' => "{$phpbb_root_path}{$config['icons_path']}/",
087 'T_RANKS_PATH' => "{$phpbb_root_path}{$config['ranks_path']}/",
088 'T_UPLOAD_PATH' => "{$phpbb_root_path}{$config['upload_path']}/",
089
090 'T_ASSETS_VERSION' => $config['assets_version'],
091
092 'ICON_MOVE_UP' => '<img src="' . htmlspecialchars($phpbb_admin_path) . 'images/icon_up.gif" alt="' . $user->lang['MOVE_UP'] . '" title="' . $user->lang['MOVE_UP'] . '" />',
093 'ICON_MOVE_UP_DISABLED' => '<img src="' . htmlspecialchars($phpbb_admin_path) . 'images/icon_up_disabled.gif" alt="' . $user->lang['MOVE_UP'] . '" title="' . $user->lang['MOVE_UP'] . '" />',
094 'ICON_MOVE_DOWN' => '<img src="' . htmlspecialchars($phpbb_admin_path) . 'images/icon_down.gif" alt="' . $user->lang['MOVE_DOWN'] . '" title="' . $user->lang['MOVE_DOWN'] . '" />',
095 'ICON_MOVE_DOWN_DISABLED' => '<img src="' . htmlspecialchars($phpbb_admin_path) . 'images/icon_down_disabled.gif" alt="' . $user->lang['MOVE_DOWN'] . '" title="' . $user->lang['MOVE_DOWN'] . '" />',
096 'ICON_EDIT' => '<img src="' . htmlspecialchars($phpbb_admin_path) . 'images/icon_edit.gif" alt="' . $user->lang['EDIT'] . '" title="' . $user->lang['EDIT'] . '" />',
097 'ICON_EDIT_DISABLED' => '<img src="' . htmlspecialchars($phpbb_admin_path) . 'images/icon_edit_disabled.gif" alt="' . $user->lang['EDIT'] . '" title="' . $user->lang['EDIT'] . '" />',
098 'ICON_DELETE' => '<img src="' . htmlspecialchars($phpbb_admin_path) . 'images/icon_delete.gif" alt="' . $user->lang['DELETE'] . '" title="' . $user->lang['DELETE'] . '" />',
099 'ICON_DELETE_DISABLED' => '<img src="' . htmlspecialchars($phpbb_admin_path) . 'images/icon_delete_disabled.gif" alt="' . $user->lang['DELETE'] . '" title="' . $user->lang['DELETE'] . '" />',
100 'ICON_SYNC' => '<img src="' . htmlspecialchars($phpbb_admin_path) . 'images/icon_sync.gif" alt="' . $user->lang['RESYNC'] . '" title="' . $user->lang['RESYNC'] . '" />',
101 'ICON_SYNC_DISABLED' => '<img src="' . htmlspecialchars($phpbb_admin_path) . 'images/icon_sync_disabled.gif" alt="' . $user->lang['RESYNC'] . '" title="' . $user->lang['RESYNC'] . '" />',
102
103 'S_USER_LANG' => $user->lang['USER_LANG'],
104 'S_CONTENT_DIRECTION' => $user->lang['DIRECTION'],
105 'S_CONTENT_ENCODING' => 'UTF-8',
106 'S_CONTENT_FLOW_BEGIN' => ($user->lang['DIRECTION'] == 'ltr') ? 'left' : 'right',
107 'S_CONTENT_FLOW_END' => ($user->lang['DIRECTION'] == 'ltr') ? 'right' : 'left',
108 ));
109
110 // An array of http headers that phpbb will set. The following event may override these.
111 $http_headers = array(
112 // application/xhtml+xml not used because of IE
113 'Content-type' => 'text/html; charset=UTF-8',
114 'Cache-Control' => 'private, no-cache="set-cookie"',
115 'Expires' => gmdate('D, d M Y H:i:s', time()) . ' GMT',
116 );
117
118 /**
119 * Execute code and/or overwrite _common_ template variables after they have been assigned.
120 *
121 * @event core.adm_page_header_after
122 * @var string page_title Page title
123 * @var array http_headers HTTP headers that should be set by phpbb
124 *
125 * @since 3.1.0-RC3
126 */
127 $vars = array('page_title', 'http_headers');
128 extract($phpbb_dispatcher->trigger_event('core.adm_page_header_after', compact($vars)));
129
130 foreach ($http_headers as $hname => $hval)
131 {
132 header((string) $hname . ': ' . (string) $hval);
133 }
134
135 return;
136 }
137
138 /**
139 * Page footer for acp pages
140 */
141 function adm_page_footer($copyright_html = true)
142 {
143 global $db, $config, $template, $user, $auth, $cache;
144 global $starttime, $phpbb_root_path, $phpbb_admin_path, $phpEx;
145 global $request, $phpbb_dispatcher;
146
147 // A listener can set this variable to `true` when it overrides this function
148 $adm_page_footer_override = false;
149
150 /**
151 * Execute code and/or overwrite adm_page_footer()
152 *
153 * @event core.adm_page_footer
154 * @var bool copyright_html Shall we display the copyright?
155 * @var bool adm_page_footer_override Shall we return instead of
156 * running the rest of adm_page_footer()
157 * @since 3.1.0-a1
158 */
159 $vars = array('copyright_html', 'adm_page_footer_override');
160 extract($phpbb_dispatcher->trigger_event('core.adm_page_footer', compact($vars)));
161
162 if ($adm_page_footer_override)
163 {
164 return;
165 }
166
167 phpbb_check_and_display_sql_report($request, $auth, $db);
168
169 $template->assign_vars(array(
170 'DEBUG_OUTPUT' => phpbb_generate_debug_output($db, $config, $auth, $user, $phpbb_dispatcher),
171 'TRANSLATION_INFO' => (!empty($user->lang['TRANSLATION_INFO'])) ? $user->lang['TRANSLATION_INFO'] : '',
172 'S_COPYRIGHT_HTML' => $copyright_html,
173 'CREDIT_LINE' => $user->lang('POWERED_BY', '<a href="https://www.phpbb.com/">phpBB</a>® Forum Software © phpBB Limited'),
174 'T_JQUERY_LINK' => !empty($config['allow_cdn']) && !empty($config['load_jquery_url']) ? $config['load_jquery_url'] : "{$phpbb_root_path}assets/javascript/jquery.min.js",
175 'S_ALLOW_CDN' => !empty($config['allow_cdn']),
176 'VERSION' => $config['version'])
177 );
178
179 $template->display('body');
180
181 garbage_collection();
182 exit_handler();
183 }
184
185 /**
186 * Generate back link for acp pages
187 */
188 function adm_back_link($u_action)
189 {
190 global $user;
191 return '<br /><br /><a href="' . $u_action . '">« ' . $user->lang['BACK_TO_PREV'] . '</a>';
192 }
193
194 /**
195 * Build select field options in acp pages
196 */
197 function build_select($option_ary, $option_default = false)
198 {
199 global $user;
200
201 $html = '';
202 foreach ($option_ary as $value => $title)
203 {
204 $selected = ($option_default !== false && $value == $option_default) ? ' selected="selected"' : '';
205 $html .= '<option value="' . $value . '"' . $selected . '>' . $user->lang[$title] . '</option>';
206 }
207
208 return $html;
209 }
210
211 /**
212 * Build radio fields in acp pages
213 */
214 function h_radio($name, $input_ary, $input_default = false, $id = false, $key = false, $separator = '')
215 {
216 global $user;
217
218 $html = '';
219 $id_assigned = false;
220 foreach ($input_ary as $value => $title)
221 {
222 $selected = ($input_default !== false && $value == $input_default) ? ' checked="checked"' : '';
223 $html .= '<label><input type="radio" name="' . $name . '"' . (($id && !$id_assigned) ? ' id="' . $id . '"' : '') . ' value="' . $value . '"' . $selected . (($key) ? ' accesskey="' . $key . '"' : '') . ' class="radio" /> ' . $user->lang[$title] . '</label>' . $separator;
224 $id_assigned = true;
225 }
226
227 return $html;
228 }
229
230 /**
231 * Build configuration template for acp configuration pages
232 */
233 function build_cfg_template($tpl_type, $key, &$new, $config_key, $vars)
234 {
235 global $user, $module, $phpbb_dispatcher;
236
237 $tpl = '';
238 $name = 'config[' . $config_key . ']';
239
240 // Make sure there is no notice printed out for non-existent config options (we simply set them)
241 if (!isset($new[$config_key]))
242 {
243 $new[$config_key] = '';
244 }
245
246 switch ($tpl_type[0])
247 {
248 case 'text':
249 case 'password':
250 case 'url':
251 case 'email':
252 case 'color':
253 case 'date':
254 case 'time':
255 case 'datetime':
256 case 'datetime-local':
257 case 'month':
258 case 'range':
259 case 'search':
260 case 'tel':
261 case 'week':
262 $size = (int) $tpl_type[1];
263 $maxlength = (int) $tpl_type[2];
264
265 $tpl = '<input id="' . $key . '" type="' . $tpl_type[0] . '"' . (($size) ? ' size="' . $size . '"' : '') . ' maxlength="' . (($maxlength) ? $maxlength : 255) . '" name="' . $name . '" value="' . $new[$config_key] . '"' . (($tpl_type[0] === 'password') ? ' autocomplete="off"' : '') . ' />';
266 break;
267
268 case 'number':
269 $min = $max = $maxlength = '';
270 $min = ( isset($tpl_type[1]) ) ? (int) $tpl_type[1] : false;
271 if ( isset($tpl_type[2]) )
272 {
273 $max = (int) $tpl_type[2];
274 $maxlength = strlen( (string) $max );
275 }
276
277 $tpl = '<input id="' . $key . '" type="number" maxlength="' . (( $maxlength != '' ) ? $maxlength : 255) . '"' . (( $min != '' ) ? ' min="' . $min . '"' : '') . (( $max != '' ) ? ' max="' . $max . '"' : '') . ' name="' . $name . '" value="' . $new[$config_key] . '" />';
278 break;
279
280 case 'dimension':
281 $min = $max = $maxlength = $size = '';
282
283 $min = (int) $tpl_type[1];
284
285 if ( isset($tpl_type[2]) )
286 {
287 $max = (int) $tpl_type[2];
288 $size = $maxlength = strlen( (string) $max );
289 }
290
291 $tpl = '<input id="' . $key . '" type="number"' . (( $size != '' ) ? ' size="' . $size . '"' : '') . ' maxlength="' . (($maxlength != '') ? $maxlength : 255) . '"' . (( $min !== '' ) ? ' min="' . $min . '"' : '') . (( $max != '' ) ? ' max="' . $max . '"' : '') . ' name="config[' . $config_key . '_width]" value="' . $new[$config_key . '_width'] . '" /> x <input type="number"' . (( $size != '' ) ? ' size="' . $size . '"' : '') . ' maxlength="' . (($maxlength != '') ? $maxlength : 255) . '"' . (( $min !== '' ) ? ' min="' . $min . '"' : '') . (( $max != '' ) ? ' max="' . $max . '"' : '') . ' name="config[' . $config_key . '_height]" value="' . $new[$config_key . '_height'] . '" />';
292 break;
293
294 case 'textarea':
295 $rows = (int) $tpl_type[1];
296 $cols = (int) $tpl_type[2];
297
298 $tpl = '<textarea id="' . $key . '" name="' . $name . '" rows="' . $rows . '" cols="' . $cols . '">' . $new[$config_key] . '</textarea>';
299 break;
300
301 case 'radio':
302 $key_yes = ($new[$config_key]) ? ' checked="checked"' : '';
303 $key_no = (!$new[$config_key]) ? ' checked="checked"' : '';
304
305 $tpl_type_cond = explode('_', $tpl_type[1]);
306 $type_no = ($tpl_type_cond[0] == 'disabled' || $tpl_type_cond[0] == 'enabled') ? false : true;
307
308 $tpl_no = '<label><input type="radio" name="' . $name . '" value="0"' . $key_no . ' class="radio" /> ' . (($type_no) ? $user->lang['NO'] : $user->lang['DISABLED']) . '</label>';
309 $tpl_yes = '<label><input type="radio" id="' . $key . '" name="' . $name . '" value="1"' . $key_yes . ' class="radio" /> ' . (($type_no) ? $user->lang['YES'] : $user->lang['ENABLED']) . '</label>';
310
311 $tpl = ($tpl_type_cond[0] == 'yes' || $tpl_type_cond[0] == 'enabled') ? $tpl_yes . $tpl_no : $tpl_no . $tpl_yes;
312 break;
313
314 case 'select':
315 case 'custom':
316
317 $return = '';
318
319 if (isset($vars['method']))
320 {
321 $call = array($module->module, $vars['method']);
322 }
323 else if (isset($vars['function']))
324 {
325 $call = $vars['function'];
326 }
327 else
328 {
329 break;
330 }
331
332 if (isset($vars['params']))
333 {
334 $args = array();
335 foreach ($vars['params'] as $value)
336 {
337 switch ($value)
338 {
339 case '{CONFIG_VALUE}':
340 $value = $new[$config_key];
341 break;
342
343 case '{KEY}':
344 $value = $key;
345 break;
346 }
347
348 $args[] = $value;
349 }
350 }
351 else
352 {
353 $args = array($new[$config_key], $key);
354 }
355
356 $return = call_user_func_array($call, $args);
357
358 if ($tpl_type[0] == 'select')
359 {
360 $size = (isset($tpl_type[1])) ? (int) $tpl_type[1] : 1;
361 $data_toggle = (!empty($tpl_type[2])) ? ' data-togglable-settings="true"' : '';
362
363 $tpl = '<select id="' . $key . '" name="' . $name . '"' . (($size > 1) ? ' size="' . $size . '"' : '') . $data_toggle . '>' . $return . '</select>';
364 }
365 else
366 {
367 $tpl = $return;
368 }
369
370 break;
371
372 default:
373 break;
374 }
375
376 if (isset($vars['append']))
377 {
378 $tpl .= $vars['append'];
379 }
380
381 /**
382 * Overwrite the html code we display for the config value
383 *
384 * @event core.build_config_template
385 * @var array tpl_type Config type array:
386 * 0 => data type
387 * 1 [optional] => string: size, int: minimum
388 * 2 [optional] => string: max. length, int: maximum
389 * @var string key Should be used for the id attribute in html
390 * @var array new Array with the config values we display
391 * @var string name Should be used for the name attribute
392 * @var array vars Array with the options for the config
393 * @var string tpl The resulting html code we display
394 * @since 3.1.0-a1
395 */
396 $vars = array('tpl_type', 'key', 'new', 'name', 'vars', 'tpl');
397 extract($phpbb_dispatcher->trigger_event('core.build_config_template', compact($vars)));
398
399 return $tpl;
400 }
401
402 /**
403 * Going through a config array and validate values, writing errors to $error. The validation method accepts parameters separated by ':' for string and int.
404 * The first parameter defines the type to be used, the second the lower bound and the third the upper bound. Only the type is required.
405 */
406 function validate_config_vars($config_vars, &$cfg_array, &$error)
407 {
408 global $phpbb_root_path, $user, $phpbb_dispatcher;
409
410 $type = 0;
411 $min = 1;
412 $max = 2;
413
414 foreach ($config_vars as $config_name => $config_definition)
415 {
416 if (!isset($cfg_array[$config_name]) || strpos($config_name, 'legend') !== false)
417 {
418 continue;
419 }
420
421 if (!isset($config_definition['validate']))
422 {
423 continue;
424 }
425
426 $validator = explode(':', $config_definition['validate']);
427
428 // Validate a bit. ;) (0 = type, 1 = min, 2= max)
429 switch ($validator[$type])
430 {
431 case 'string':
432 $length = utf8_strlen($cfg_array[$config_name]);
433
434 // the column is a VARCHAR
435 $validator[$max] = (isset($validator[$max])) ? min(255, $validator[$max]) : 255;
436
437 if (isset($validator[$min]) && $length < $validator[$min])
438 {
439 $error[] = sprintf($user->lang['SETTING_TOO_SHORT'], $user->lang[$config_definition['lang']], $validator[$min]);
440 }
441 else if (isset($validator[$max]) && $length > $validator[2])
442 {
443 $error[] = sprintf($user->lang['SETTING_TOO_LONG'], $user->lang[$config_definition['lang']], $validator[$max]);
444 }
445 break;
446
447 case 'bool':
448 $cfg_array[$config_name] = ($cfg_array[$config_name]) ? 1 : 0;
449 break;
450
451 case 'int':
452 $cfg_array[$config_name] = (int) $cfg_array[$config_name];
453
454 if (isset($validator[$min]) && $cfg_array[$config_name] < $validator[$min])
455 {
456 $error[] = sprintf($user->lang['SETTING_TOO_LOW'], $user->lang[$config_definition['lang']], $validator[$min]);
457 }
458 else if (isset($validator[$max]) && $cfg_array[$config_name] > $validator[$max])
459 {
460 $error[] = sprintf($user->lang['SETTING_TOO_BIG'], $user->lang[$config_definition['lang']], $validator[$max]);
461 }
462
463 if (strpos($config_name, '_max') !== false)
464 {
465 // Min/max pairs of settings should ensure that min <= max
466 // Replace _max with _min to find the name of the minimum
467 // corresponding configuration variable
468 $min_name = str_replace('_max', '_min', $config_name);
469
470 if (isset($cfg_array[$min_name]) && is_numeric($cfg_array[$min_name]) && $cfg_array[$config_name] < $cfg_array[$min_name])
471 {
472 // A minimum value exists and the maximum value is less than it
473 $error[] = sprintf($user->lang['SETTING_TOO_LOW'], $user->lang[$config_definition['lang']], (int) $cfg_array[$min_name]);
474 }
475 }
476 break;
477
478 case 'email':
479 if (!preg_match('/^' . get_preg_expression('email') . '$/i', $cfg_array[$config_name]))
480 {
481 $error[] = $user->lang['EMAIL_INVALID_EMAIL'];
482 }
483 break;
484
485 // Absolute path
486 case 'script_path':
487 if (!$cfg_array[$config_name])
488 {
489 break;
490 }
491
492 $destination = str_replace('\\', '/', $cfg_array[$config_name]);
493
494 if ($destination !== '/')
495 {
496 // Adjust destination path (no trailing slash)
497 if (substr($destination, -1, 1) == '/')
498 {
499 $destination = substr($destination, 0, -1);
500 }
501
502 $destination = str_replace(array('../', './'), '', $destination);
503
504 if ($destination[0] != '/')
505 {
506 $destination = '/' . $destination;
507 }
508 }
509
510 $cfg_array[$config_name] = trim($destination);
511
512 break;
513
514 // Absolute path
515 case 'lang':
516 if (!$cfg_array[$config_name])
517 {
518 break;
519 }
520
521 $cfg_array[$config_name] = basename($cfg_array[$config_name]);
522
523 if (!file_exists($phpbb_root_path . 'language/' . $cfg_array[$config_name] . '/'))
524 {
525 $error[] = $user->lang['WRONG_DATA_LANG'];
526 }
527 break;
528
529 // Relative path (appended $phpbb_root_path)
530 case 'rpath':
531 case 'rwpath':
532 if (!$cfg_array[$config_name])
533 {
534 break;
535 }
536
537 $destination = $cfg_array[$config_name];
538
539 // Adjust destination path (no trailing slash)
540 if (substr($destination, -1, 1) == '/' || substr($destination, -1, 1) == '\\')
541 {
542 $destination = substr($destination, 0, -1);
543 }
544
545 $destination = str_replace(array('../', '..\\', './', '.\\'), '', $destination);
546 if ($destination && ($destination[0] == '/' || $destination[0] == "\\"))
547 {
548 $destination = '';
549 }
550
551 $cfg_array[$config_name] = trim($destination);
552
553 // Path being relative (still prefixed by phpbb_root_path), but with the ability to escape the root dir...
554 case 'path':
555 case 'wpath':
556
557 if (!$cfg_array[$config_name])
558 {
559 break;
560 }
561
562 $cfg_array[$config_name] = trim($cfg_array[$config_name]);
563
564 // Make sure no NUL byte is present...
565 if (strpos($cfg_array[$config_name], "\0") !== false || strpos($cfg_array[$config_name], '%00') !== false)
566 {
567 $cfg_array[$config_name] = '';
568 break;
569 }
570
571 if (!file_exists($phpbb_root_path . $cfg_array[$config_name]))
572 {
573 $error[] = sprintf($user->lang['DIRECTORY_DOES_NOT_EXIST'], $cfg_array[$config_name]);
574 }
575
576 if (file_exists($phpbb_root_path . $cfg_array[$config_name]) && !is_dir($phpbb_root_path . $cfg_array[$config_name]))
577 {
578 $error[] = sprintf($user->lang['DIRECTORY_NOT_DIR'], $cfg_array[$config_name]);
579 }
580
581 // Check if the path is writable
582 if ($config_definition['validate'] == 'wpath' || $config_definition['validate'] == 'rwpath')
583 {
584 if (file_exists($phpbb_root_path . $cfg_array[$config_name]) && !phpbb_is_writable($phpbb_root_path . $cfg_array[$config_name]))
585 {
586 $error[] = sprintf($user->lang['DIRECTORY_NOT_WRITABLE'], $cfg_array[$config_name]);
587 }
588 }
589
590 break;
591
592 default:
593 /**
594 * Validate a config value
595 *
596 * @event core.validate_config_variable
597 * @var array cfg_array Array with config values
598 * @var string config_name Name of the config we validate
599 * @var array config_definition Array with the options for
600 * this config
601 * @var array error Array of errors, the errors should
602 * be strings only, language keys are
603 * not replaced afterwards
604 * @since 3.1.0-a1
605 */
606 $vars = array('cfg_array', 'config_name', 'config_definition', 'error');
607 extract($phpbb_dispatcher->trigger_event('core.validate_config_variable', compact($vars)));
608 break;
609 }
610 }
611
612 return;
613 }
614
615 /**
616 * Checks whatever or not a variable is OK for use in the Database
617 * param mixed $value_ary An array of the form array(array('lang' => ..., 'value' => ..., 'column_type' =>))'
618 * param mixed $error The error array
619 */
620 function validate_range($value_ary, &$error)
621 {
622 global $user;
623
624 $column_types = array(
625 'BOOL' => array('php_type' => 'int', 'min' => 0, 'max' => 1),
626 'USINT' => array('php_type' => 'int', 'min' => 0, 'max' => 65535),
627 'UINT' => array('php_type' => 'int', 'min' => 0, 'max' => (int) 0x7fffffff),
628 // Do not use (int) 0x80000000 - it evaluates to different
629 // values on 32-bit and 64-bit systems.
630 // Apparently -2147483648 is a float on 32-bit systems,
631 // despite fitting in an int, thus explicit cast is needed.
632 'INT' => array('php_type' => 'int', 'min' => (int) -2147483648, 'max' => (int) 0x7fffffff),
633 'TINT' => array('php_type' => 'int', 'min' => -128, 'max' => 127),
634
635 'VCHAR' => array('php_type' => 'string', 'min' => 0, 'max' => 255),
636 );
637 foreach ($value_ary as $value)
638 {
639 $column = explode(':', $value['column_type']);
640 $max = $min = 0;
641 $type = 0;
642 if (!isset($column_types[$column[0]]))
643 {
644 continue;
645 }
646 else
647 {
648 $type = $column_types[$column[0]];
649 }
650
651 switch ($type['php_type'])
652 {
653 case 'string' :
654 $max = (isset($column[1])) ? min($column[1],$type['max']) : $type['max'];
655 if (utf8_strlen($value['value']) > $max)
656 {
657 $error[] = sprintf($user->lang['SETTING_TOO_LONG'], $user->lang[$value['lang']], $max);
658 }
659 break;
660
661 case 'int':
662 $min = (isset($column[1])) ? max($column[1],$type['min']) : $type['min'];
663 $max = (isset($column[2])) ? min($column[2],$type['max']) : $type['max'];
664 if ($value['value'] < $min)
665 {
666 $error[] = sprintf($user->lang['SETTING_TOO_LOW'], $user->lang[$value['lang']], $min);
667 }
668 else if ($value['value'] > $max)
669 {
670 $error[] = sprintf($user->lang['SETTING_TOO_BIG'], $user->lang[$value['lang']], $max);
671 }
672 break;
673 }
674 }
675 }
676
677 /**
678 * Inserts new config display_vars into an exisiting display_vars array
679 * at the given position.
680 *
681 * @param array $display_vars An array of existing config display vars
682 * @param array $add_config_vars An array of new config display vars
683 * @param array $where Where to place the new config vars,
684 * before or after an exisiting config, as an array
685 * of the form: array('after' => 'config_name') or
686 * array('before' => 'config_name').
687 * @return array The array of config display vars
688 */
689 function phpbb_insert_config_array($display_vars, $add_config_vars, $where)
690 {
691 if (is_array($where) && array_key_exists(current($where), $display_vars))
692 {
693 $position = array_search(current($where), array_keys($display_vars)) + ((key($where) == 'before') ? 0 : 1);
694 $display_vars = array_merge(
695 array_slice($display_vars, 0, $position),
696 $add_config_vars,
697 array_slice($display_vars, $position)
698 );
699 }
700
701 return $display_vars;
702 }
703