[ Index ]

PHP Cross Reference of MyBB 1.8.40

title

Body

[close]

/admin/modules/config/ -> settings.php (source)

   1  <?php
   2  /**
   3   * MyBB 1.8
   4   * Copyright 2014 MyBB Group, All Rights Reserved
   5   *
   6   * Website: http://www.mybb.com
   7   * License: http://www.mybb.com/about/license
   8   *
   9   */
  10  
  11  // Disallow direct access to this file for security reasons
  12  if(!defined("IN_MYBB"))
  13  {
  14      die("Direct initialization of this file is not allowed.<br /><br />Please make sure IN_MYBB is defined.");
  15  }
  16  
  17  $page->add_breadcrumb_item($lang->board_settings, "index.php?module=config-settings");
  18  
  19  $plugins->run_hooks("admin_config_settings_begin");
  20  
  21  // Creating a new setting group
  22  if($mybb->input['action'] == "addgroup")
  23  {
  24      $plugins->run_hooks("admin_config_settings_addgroup");
  25  
  26      if($mybb->request_method == "post")
  27      {
  28          // Validate title
  29          if(!trim($mybb->input['title']))
  30          {
  31              $errors[] = $lang->error_missing_group_title;
  32          }
  33  
  34          // Validate identifier
  35          if(!trim($mybb->input['name']))
  36          {
  37              $errors[] = $lang->error_missing_group_name;
  38          }
  39          $query = $db->simple_select("settinggroups", "title", "name='".$db->escape_string($mybb->input['name'])."'");
  40          if($db->num_rows($query) > 0)
  41          {
  42              $dup_group_title = $db->fetch_field($query, 'title');
  43              $errors[] = $lang->sprintf($lang->error_duplicate_group_name, $dup_group_title);
  44          }
  45  
  46          if(!$errors)
  47          {
  48              $new_setting_group = array(
  49                  "name" => $db->escape_string($mybb->input['name']),
  50                  "title" => $db->escape_string($mybb->input['title']),
  51                  "description" => $db->escape_string($mybb->input['description']),
  52                  "disporder" => $mybb->get_input('disporder', MyBB::INPUT_INT),
  53                  "isdefault" => 0
  54              );
  55              $gid = $db->insert_query("settinggroups", $new_setting_group);
  56  
  57              $plugins->run_hooks("admin_config_settings_addgroup_commit");
  58  
  59              // Log admin action
  60              log_admin_action($gid, $mybb->input['name']);
  61  
  62              flash_message($lang->success_setting_group_added, 'success');
  63              admin_redirect("index.php?module=config-settings&action=manage");
  64          }
  65      }
  66  
  67      $page->add_breadcrumb_item($lang->add_new_setting_group);
  68      $page->output_header($lang->board_settings." - ".$lang->add_new_setting_group);
  69  
  70      $sub_tabs['change_settings'] = array(
  71          'title' => $lang->change_settings,
  72          'link' => "index.php?module=config-settings"
  73      );
  74  
  75      $sub_tabs['add_setting'] = array(
  76          'title' => $lang->add_new_setting,
  77          'link' => "index.php?module=config-settings&amp;action=add"
  78      );
  79  
  80      $sub_tabs['add_setting_group'] = array(
  81          'title' => $lang->add_new_setting_group,
  82          'link' => "index.php?module=config-settings&amp;action=addgroup",
  83          'description' => $lang->add_new_setting_group_desc
  84      );
  85  
  86      $sub_tabs['modify_setting'] = array(
  87          'title' => $lang->modify_existing_settings,
  88          'link' => "index.php?module=config-settings&amp;action=manage"
  89      );
  90  
  91      $page->output_nav_tabs($sub_tabs, 'add_setting_group');
  92  
  93      $form = new Form("index.php?module=config-settings&amp;action=addgroup", "post", "add");
  94  
  95      if($errors)
  96      {
  97          $page->output_inline_error($errors);
  98      }
  99  
 100      $form_container = new FormContainer($lang->add_new_setting_group);
 101      $form_container->output_row($lang->title." <em>*</em>", "", $form->generate_text_box('title', $mybb->get_input('title'), array('id' => 'title')), 'title');
 102      $form_container->output_row($lang->description, "", $form->generate_text_area('description', $mybb->get_input('description'), array('id' => 'description')), 'description');
 103      $form_container->output_row($lang->display_order, "", $form->generate_numeric_field('disporder', $mybb->get_input('disporder'), array('id' => 'disporder', 'min' => 0)), 'disporder');
 104      $form_container->output_row($lang->name." <em>*</em>", $lang->group_name_desc, $form->generate_text_box('name', $mybb->get_input('name'), array('id' => 'name')), 'name');
 105      $form_container->end();
 106  
 107      $buttons[] = $form->generate_submit_button($lang->insert_new_setting_group);
 108      $form->output_submit_wrapper($buttons);
 109      $form->end();
 110  
 111      $page->output_footer();
 112  }
 113  
 114  // Edit setting group
 115  if($mybb->input['action'] == "editgroup")
 116  {
 117      $query = $db->simple_select("settinggroups", "*", "gid='".$mybb->get_input('gid', MyBB::INPUT_INT)."'");
 118      $group = $db->fetch_array($query);
 119  
 120      // Does the setting not exist?
 121      if(!$group)
 122      {
 123          flash_message($lang->error_invalid_gid2, 'error');
 124          admin_redirect("index.php?module=config-settings&action=manage");
 125      }
 126      // Prevent editing of default
 127      if($group['isdefault'] == 1)
 128      {
 129          flash_message($lang->error_cannot_edit_default, 'error');
 130          admin_redirect("index.php?module=config-settings&action=manage");
 131      }
 132  
 133      $plugins->run_hooks("admin_config_settings_editgroup");
 134  
 135      // Do edit?
 136      if($mybb->request_method == "post")
 137      {
 138          // Validate title
 139          if(!trim($mybb->input['title']))
 140          {
 141              $errors[] = $lang->error_missing_group_title;
 142          }
 143  
 144          // Validate identifier
 145          if(!trim($mybb->input['name']))
 146          {
 147              $errors[] = $lang->error_missing_group_name;
 148          }
 149          $query = $db->simple_select("settinggroups", "title", "name='".$db->escape_string($mybb->input['name'])."' AND gid != '{$group['gid']}'");
 150          if($db->num_rows($query) > 0)
 151          {
 152              $dup_group_title = $db->fetch_field($query, 'title');
 153              $errors[] = $lang->sprintf($lang->error_duplicate_group_name, $dup_group_title);
 154          }
 155  
 156          if(!$errors)
 157          {
 158              $update_setting_group = array(
 159                  "name" => $db->escape_string($mybb->input['name']),
 160                  "title" => $db->escape_string($mybb->input['title']),
 161                  "description" => $db->escape_string($mybb->input['description']),
 162                  "disporder" => $mybb->get_input('disporder', MyBB::INPUT_INT),
 163              );
 164  
 165              $plugins->run_hooks("admin_config_settings_editgroup_commit");
 166  
 167              $db->update_query("settinggroups", $update_setting_group, "gid='{$group['gid']}'");
 168  
 169              // Log admin action
 170              log_admin_action($group['gid'], $mybb->input['name']);
 171  
 172              flash_message($lang->success_setting_group_updated, 'success');
 173              admin_redirect("index.php?module=config-settings&action=manage");
 174          }
 175      }
 176  
 177      $page->add_breadcrumb_item($lang->edit_setting_group);
 178      $page->output_header($lang->board_settings." - ".$lang->edit_setting_group);
 179  
 180      $sub_tabs['edit_setting_group'] = array(
 181          'title' => $lang->edit_setting_group,
 182          'link' => "index.php?module=config-settings&amp;action=editgroup&amp;gid={$group['gid']}",
 183          'description' => $lang->edit_setting_group_desc
 184      );
 185  
 186      $page->output_nav_tabs($sub_tabs, 'edit_setting_group');
 187  
 188      $form = new Form("index.php?module=config-settings&amp;action=editgroup", "post", "editgroup");
 189  
 190      echo $form->generate_hidden_field("gid", $group['gid']);
 191  
 192      if($errors)
 193      {
 194          $group_data = $mybb->input;
 195          $page->output_inline_error($errors);
 196      }
 197      else
 198      {
 199          $group_data = $group;
 200      }
 201  
 202      $form_container = new FormContainer($lang->edit_setting_group);
 203      $form_container->output_row($lang->title." <em>*</em>", "", $form->generate_text_box('title', $group_data['title'], array('id' => 'title')), 'title');
 204      $form_container->output_row($lang->description, "", $form->generate_text_area('description', $group_data['description'], array('id' => 'description')), 'description');
 205      $form_container->output_row($lang->display_order, "", $form->generate_numeric_field('disporder', $group_data['disporder'], array('id' => 'disporder', 'min' => 0)), 'disporder');
 206      $form_container->output_row($lang->name." <em>*</em>", $lang->group_name_desc, $form->generate_text_box('name', $group_data['name'], array('id' => 'name')), 'name');
 207      $form_container->end();
 208  
 209      $buttons[] = $form->generate_submit_button($lang->update_setting_group);
 210      $form->output_submit_wrapper($buttons);
 211      $form->end();
 212  
 213      $page->output_footer();
 214  }
 215  
 216  // Delete Setting Group
 217  if($mybb->input['action'] == "deletegroup")
 218  {
 219      $query = $db->simple_select("settinggroups", "*", "gid='".$mybb->get_input('gid', MyBB::INPUT_INT)."'");
 220      $group = $db->fetch_array($query);
 221  
 222      // Does the setting group not exist?
 223      if(!$group)
 224      {
 225          flash_message($lang->error_invalid_gid2, 'error');
 226          admin_redirect("index.php?module=config-settings&action=manage");
 227      }
 228      // Prevent deletion of default
 229      if($group['isdefault'] == 1)
 230      {
 231          flash_message($lang->error_cannot_edit_default, 'error');
 232          admin_redirect("index.php?module=config-settings&action=manage");
 233      }
 234  
 235      // User clicked no
 236      if($mybb->get_input('no'))
 237      {
 238          admin_redirect("index.php?module=config-settings&action=manage");
 239      }
 240  
 241      $plugins->run_hooks("admin_config_settings_deletegroup");
 242  
 243      if($mybb->request_method == "post")
 244      {
 245          // Delete the setting group and its settings
 246          $db->delete_query("settinggroups", "gid='{$group['gid']}'");
 247          $db->delete_query("settings", "gid='{$group['gid']}'");
 248  
 249          rebuild_settings();
 250  
 251          $plugins->run_hooks("admin_config_settings_deletegroup_commit");
 252  
 253          // Log admin action
 254          log_admin_action($group['gid'], $group['name']);
 255  
 256          flash_message($lang->success_setting_group_deleted, 'success');
 257          admin_redirect("index.php?module=config-settings&action=manage");
 258      }
 259      else
 260      {
 261          $page->output_confirm_action("index.php?module=config-settings&amp;action=deletegroup&amp;gid={$group['gid']}", $lang->confirm_setting_group_deletion);
 262      }
 263  }
 264  
 265  // Creating a new setting
 266  if($mybb->input['action'] == "add")
 267  {
 268      $plugins->run_hooks("admin_config_settings_add");
 269  
 270      if($mybb->request_method == "post")
 271      {
 272          if(!trim($mybb->input['title']))
 273          {
 274              $errors[] = $lang->error_missing_title;
 275          }
 276  
 277          $query = $db->simple_select("settinggroups", "gid", "gid='".$mybb->get_input('gid', MyBB::INPUT_INT)."'");
 278          $gid = $db->fetch_field($query, 'gid');
 279          if(!$gid)
 280          {
 281              $errors[] = $lang->error_invalid_gid;
 282          }
 283  
 284          if(!trim($mybb->input['name']))
 285          {
 286              $errors[] = $lang->error_missing_name;
 287          }
 288          $query = $db->simple_select("settings", "title", "name='".$db->escape_string($mybb->input['name'])."'");
 289          if($db->num_rows($query) > 0)
 290          {
 291              $dup_setting_title = $db->fetch_field($query, 'title');
 292              $errors[] = $lang->sprintf($lang->error_duplicate_name, $dup_setting_title);
 293          }
 294  
 295          // do some type filtering
 296          $mybb->input['type'] = $mybb->get_input('type');
 297          if(!ctype_alnum($mybb->input['type']) || strtolower($mybb->input['type']) == "php")
 298          {
 299              $mybb->input['type'] = "";
 300          }
 301  
 302          if(!$mybb->input['type'])
 303          {
 304              $errors[] = $lang->error_invalid_type;
 305          }
 306  
 307          if(!$errors)
 308          {
 309              if($mybb->input['extra'])
 310              {
 311                  $options_code = "{$mybb->input['type']}\n{$mybb->input['extra']}";
 312              }
 313              else
 314              {
 315                  $options_code = $mybb->input['type'];
 316              }
 317  
 318              $mybb->input['name'] = str_replace("\\", '', $mybb->input['name']);
 319              $mybb->input['name'] = str_replace('$', '', $mybb->input['name']);
 320              $mybb->input['name'] = str_replace("'", '', $mybb->input['name']);
 321  
 322              if($options_code == "numeric")
 323              {
 324                  $value = $mybb->get_input('value', MyBB::INPUT_INT);
 325              }
 326              else
 327              {
 328                  $value = $db->escape_string($mybb->input['value']);
 329              }
 330  
 331              $new_setting = array(
 332                  "name" => $db->escape_string($mybb->input['name']),
 333                  "title" => $db->escape_string($mybb->input['title']),
 334                  "description" => $db->escape_string($mybb->input['description']),
 335                  "optionscode" => $db->escape_string($options_code),
 336                  "value" => $value,
 337                  "disporder" => $mybb->get_input('disporder', MyBB::INPUT_INT),
 338                  "gid" => $mybb->get_input('gid', MyBB::INPUT_INT)
 339              );
 340  
 341              $sid = $db->insert_query("settings", $new_setting);
 342              rebuild_settings();
 343  
 344              $plugins->run_hooks("admin_config_settings_add_commit");
 345  
 346              // Log admin action
 347              log_admin_action($sid, $mybb->input['title']);
 348  
 349              flash_message($lang->success_setting_added, 'success');
 350              admin_redirect("index.php?module=config-settings&action=manage");
 351          }
 352      }
 353  
 354      $page->add_breadcrumb_item($lang->add_new_setting);
 355      $page->output_header($lang->board_settings." - ".$lang->add_new_setting);
 356  
 357      $sub_tabs['change_settings'] = array(
 358          'title' => $lang->change_settings,
 359          'link' => "index.php?module=config-settings"
 360      );
 361  
 362      $sub_tabs['add_setting'] = array(
 363          'title' => $lang->add_new_setting,
 364          'link' => "index.php?module=config-settings&amp;action=add",
 365          'description' => $lang->add_new_setting_desc
 366      );
 367  
 368      $sub_tabs['add_setting_group'] = array(
 369          'title' => $lang->add_new_setting_group,
 370          'link' => "index.php?module=config-settings&amp;action=addgroup"
 371      );
 372  
 373      $sub_tabs['modify_setting'] = array(
 374          'title' => $lang->modify_existing_settings,
 375          'link' => "index.php?module=config-settings&amp;action=manage"
 376      );
 377  
 378      $page->output_nav_tabs($sub_tabs, 'add_setting');
 379  
 380      $form = new Form("index.php?module=config-settings&amp;action=add", "post", "add");
 381  
 382      if($errors)
 383      {
 384          $page->output_inline_error($errors);
 385      }
 386  
 387      $form_container = new FormContainer($lang->add_new_setting);
 388      $form_container->output_row($lang->title." <em>*</em>", "", $form->generate_text_box('title', $mybb->get_input('title'), array('id' => 'title')), 'title');
 389      $form_container->output_row($lang->description, "", $form->generate_text_area('description', $mybb->get_input('description'), array('id' => 'description')), 'description');
 390  
 391      $query = $db->simple_select("settinggroups", "*", "", array('order_by' => 'disporder'));
 392      while($group = $db->fetch_array($query))
 393      {
 394          $group_lang_var = "setting_group_{$group['name']}";
 395          if(!empty($lang->$group_lang_var))
 396          {
 397              $options[$group['gid']] = htmlspecialchars_uni($lang->$group_lang_var);
 398          }
 399          else
 400          {
 401              $options[$group['gid']] = htmlspecialchars_uni($group['title']);
 402          }
 403      }
 404      $form_container->output_row($lang->group." <em>*</em>", "", $form->generate_select_box("gid", $options, $mybb->get_input('gid'), array('id' => 'gid')), 'gid');
 405      $form_container->output_row($lang->display_order, "", $form->generate_numeric_field('disporder', $mybb->get_input('disporder'), array('id' => 'disporder', 'min' => 0)), 'disporder');
 406  
 407      $form_container->output_row($lang->name." <em>*</em>", $lang->name_desc, $form->generate_text_box('name', $mybb->get_input('name'), array('id' => 'name')), 'name');
 408  
 409      $setting_types = array(
 410          "text" => $lang->text,
 411          "numeric" => $lang->numeric_text,
 412          "textarea" => $lang->textarea,
 413          "yesno" => $lang->yesno,
 414          "onoff" => $lang->onoff,
 415          "select" => $lang->select,
 416          "forumselect" => $lang->forum_selection_box,
 417          "forumselectsingle" => $lang->forum_selection_single,
 418          "groupselect" => $lang->group_selection_box,
 419          "groupselectsingle" => $lang->group_selection_single,
 420          "radio" => $lang->radio,
 421          "checkbox" => $lang->checkbox,
 422          "language" => $lang->language_selection_box,
 423          "adminlanguage" => $lang->adminlanguage,
 424          "cpstyle" => $lang->cpstyle,
 425          "prefixselect" => $lang->prefix_selection_box
 426          //"php" => $lang->php // Internal Use Only
 427      );
 428  
 429      $form_container->output_row($lang->type." <em>*</em>", "", $form->generate_select_box("type", $setting_types, $mybb->get_input('type'), array('id' => 'type')), 'type');
 430      $form_container->output_row($lang->extra, $lang->extra_desc, $form->generate_text_area('extra', $mybb->get_input('extra'), array('id' => 'extra')), 'extra', array(), array('id' => 'row_extra'));
 431      $form_container->output_row($lang->value, "", $form->generate_text_area('value', $mybb->get_input('value'), array('id' => 'value')), 'value');
 432      $form_container->end();
 433  
 434      $buttons[] = $form->generate_submit_button($lang->insert_new_setting);
 435      $form->output_submit_wrapper($buttons);
 436      $form->end();
 437  
 438      echo '<script type="text/javascript" src="./jscripts/peeker.js?ver=1821"></script>
 439      <script type="text/javascript">
 440          $(function() {
 441              new Peeker($("#type"), $("#row_extra"), /^(select|radio|checkbox|php)$/, false);
 442          });
 443          // Add a star to the extra row since the "extra" is required if the box is shown
 444          add_star("row_extra");
 445      </script>';
 446  
 447      $page->output_footer();
 448  }
 449  
 450  // Editing a particular setting
 451  if($mybb->input['action'] == "edit")
 452  {
 453      $query = $db->simple_select("settings", "*", "sid='".$mybb->get_input('sid', MyBB::INPUT_INT)."'");
 454      $setting = $db->fetch_array($query);
 455  
 456      // Does the setting not exist?
 457      if(!$setting)
 458      {
 459          flash_message($lang->error_invalid_sid, 'error');
 460          admin_redirect("index.php?module=config-settings");
 461      }
 462  
 463      // Prevent editing of default
 464      if($setting['isdefault'] == 1)
 465      {
 466          flash_message($lang->error_cannot_edit_default, 'error');
 467          admin_redirect("index.php?module=config-settings&action=manage");
 468      }
 469  
 470      $plugins->run_hooks("admin_config_settings_edit");
 471  
 472      $type = explode("\n", $setting['optionscode'], 2);
 473      $type = trim($type[0]);
 474      if($type == "php")
 475      {
 476          flash_message($lang->error_cannot_edit_php, 'error');
 477          admin_redirect("index.php?module=config-settings&action=manage");
 478      }
 479  
 480      if($mybb->request_method == "post")
 481      {
 482          if(!trim($mybb->input['title']))
 483          {
 484              $errors[] = $lang->error_missing_title;
 485          }
 486  
 487          if(!trim($mybb->input['name']))
 488          {
 489              $errors[] = $lang->error_missing_name;
 490          }
 491          $query = $db->simple_select("settings", "title", "name='".$db->escape_string($mybb->input['name'])."' AND sid != '{$setting['sid']}'");
 492          if($db->num_rows($query) > 0)
 493          {
 494              $dup_setting_title = $db->fetch_field($query, 'title');
 495              $errors[] = $lang->sprintf($lang->error_duplicate_name, $dup_setting_title);
 496          }
 497  
 498          // do some type filtering
 499          $mybb->input['type'] = $mybb->get_input('type');
 500          if(!ctype_alnum($mybb->input['type']) || strtolower($mybb->input['type']) == "php")
 501          {
 502              $mybb->input['type'] = "";
 503          }
 504  
 505          if(!$mybb->input['type'])
 506          {
 507              $errors[] = $lang->error_invalid_type;
 508          }
 509  
 510          if(!$errors)
 511          {
 512              if($mybb->input['extra'])
 513              {
 514                  $options_code = "{$mybb->input['type']}\n{$mybb->input['extra']}";
 515              }
 516              else
 517              {
 518                  $options_code = $mybb->input['type'];
 519              }
 520  
 521              $mybb->input['name'] = str_replace("\\", '', $mybb->input['name']);
 522              $mybb->input['name'] = str_replace('$', '', $mybb->input['name']);
 523              $mybb->input['name'] = str_replace("'", '', $mybb->input['name']);
 524  
 525              if($options_code == "numeric")
 526              {
 527                  $value = $mybb->get_input('value', MyBB::INPUT_INT);
 528              }
 529              else
 530              {
 531                  $value = $db->escape_string($mybb->input['value']);
 532              }
 533  
 534              $updated_setting = array(
 535                  "name" => $db->escape_string($mybb->input['name']),
 536                  "title" => $db->escape_string($mybb->input['title']),
 537                  "description" => $db->escape_string($mybb->input['description']),
 538                  "optionscode" => $db->escape_string($options_code),
 539                  "value" => $value,
 540                  "disporder" => $mybb->get_input('disporder', MyBB::INPUT_INT),
 541                  "gid" => $mybb->get_input('gid', MyBB::INPUT_INT)
 542              );
 543  
 544              $plugins->run_hooks("admin_config_settings_edit_commit");
 545  
 546              $db->update_query("settings", $updated_setting, "sid='{$setting['sid']}'");
 547              rebuild_settings();
 548  
 549              // Log admin action
 550              log_admin_action($setting['sid'], $mybb->input['title']);
 551  
 552              flash_message($lang->success_setting_updated, 'success');
 553              admin_redirect("index.php?module=config-settings&action=manage");
 554          }
 555      }
 556  
 557      $page->add_breadcrumb_item($lang->edit_setting);
 558      $page->output_header($lang->board_settings." - ".$lang->edit_setting);
 559  
 560      $sub_tabs['change_settings'] = array(
 561          'title' => $lang->change_settings,
 562          'link' => "index.php?module=config-settings",
 563      );
 564  
 565      $sub_tabs['add_setting'] = array(
 566          'title' => $lang->add_new_setting,
 567          'link' => "index.php?module=config-settings&amp;action=add"
 568      );
 569  
 570      $sub_tabs['add_setting_group'] = array(
 571          'title' => $lang->add_new_setting_group,
 572          'link' => "index.php?module=config-settings&amp;action=addgroup"
 573      );
 574  
 575      $sub_tabs['modify_setting'] = array(
 576          'title' => $lang->modify_existing_settings,
 577          'link' => "index.php?module=config-settings&amp;action=manage",
 578          'description' => $lang->modify_existing_settings_desc
 579      );
 580  
 581      $page->output_nav_tabs($sub_tabs, 'modify_setting');
 582  
 583      $form = new Form("index.php?module=config-settings&amp;action=edit", "post", "edit");
 584  
 585      echo $form->generate_hidden_field("sid", $setting['sid']);
 586  
 587      if($errors)
 588      {
 589          $setting_data = $mybb->input;
 590          $page->output_inline_error($errors);
 591      }
 592      else
 593      {
 594          $setting_data = $setting;
 595          $type = explode("\n", $setting['optionscode'], 2);
 596          $setting_data['type'] = trim($type[0]);
 597  
 598          if(isset($type[1]))
 599          {
 600              $setting_data['extra'] = trim($type[1]);
 601          }
 602      }
 603  
 604      $form_container = new FormContainer($lang->modify_setting);
 605      $form_container->output_row($lang->title." <em>*</em>", "", $form->generate_text_box('title', $setting_data['title'], array('id' => 'title')), 'title');
 606      $form_container->output_row($lang->description, "", $form->generate_text_area('description', $setting_data['description'], array('id' => 'description')), 'description');
 607  
 608      $query = $db->simple_select("settinggroups", "*", "", array('order_by' => 'disporder'));
 609      while($group = $db->fetch_array($query))
 610      {
 611          $group_lang_var = "setting_group_{$group['name']}";
 612          if(!empty($lang->$group_lang_var))
 613          {
 614              $options[$group['gid']] = htmlspecialchars_uni($lang->$group_lang_var);
 615          }
 616          else
 617          {
 618              $options[$group['gid']] = htmlspecialchars_uni($group['title']);
 619          }
 620      }
 621      $form_container->output_row($lang->group." <em>*</em>", "", $form->generate_select_box("gid", $options, $setting_data['gid'], array('id' => 'gid')), 'gid');
 622      $form_container->output_row($lang->display_order, "", $form->generate_numeric_field('disporder', $setting_data['disporder'], array('id' => 'disporder', 'min' => 0)), 'disporder');
 623      $form_container->end();
 624  
 625      $form_container = new FormContainer($lang->setting_configuration, 1);
 626      $form_container->output_row($lang->name." <em>*</em>", $lang->name_desc, $form->generate_text_box('name', $setting_data['name'], array('id' => 'name')), 'name');
 627  
 628      $setting_types = array(
 629          "text" => $lang->text,
 630          "numeric" => $lang->numeric_text,
 631          "textarea" => $lang->textarea,
 632          "yesno" => $lang->yesno,
 633          "onoff" => $lang->onoff,
 634          "select" => $lang->select,
 635          "forumselect" => $lang->forum_selection_box,
 636          "forumselectsingle" => $lang->forum_selection_single,
 637          "groupselect" => $lang->group_selection_box,
 638          "groupselectsingle" => $lang->group_selection_single,
 639          "radio" => $lang->radio,
 640          "checkbox" => $lang->checkbox,
 641          "language" => $lang->language_selection_box,
 642          "adminlanguage" => $lang->adminlanguage,
 643          "cpstyle" => $lang->cpstyle,
 644          "prefixselect" => $lang->prefix_selection_box
 645          //"php" => $lang->php // Internal Use Only
 646      );
 647  
 648      $form_container->output_row($lang->type." <em>*</em>", "", $form->generate_select_box("type", $setting_types, $setting_data['type'], array('id' => 'type')), 'type');
 649      $form_container->output_row($lang->extra, $lang->extra_desc, $form->generate_text_area('extra', !empty($setting_data['extra']) ? $setting_data['extra'] : null, array('id' => 'extra')), 'extra', array(), array('id' => 'row_extra'));
 650      $form_container->output_row($lang->value, '', $form->generate_text_area('value', $setting_data['value'], array('id' => 'value')), 'value');
 651      $form_container->end();
 652  
 653      $buttons[] = $form->generate_submit_button($lang->update_setting);
 654      $form->output_submit_wrapper($buttons);
 655      $form->end();
 656  
 657      echo '<script type="text/javascript" src="./jscripts/peeker.js?ver=1821"></script>
 658      <script type="text/javascript">
 659          $(function() {
 660              new Peeker($("#type"), $("#row_extra"), /^(select|radio|checkbox|php)$/, false);
 661          });
 662          // Add a star to the extra row since the "extra" is required if the box is shown
 663          add_star("row_extra");
 664      </script>';
 665  
 666      $page->output_footer();
 667  }
 668  
 669  // Delete Setting
 670  if($mybb->input['action'] == "delete")
 671  {
 672      $query = $db->simple_select("settings", "*", "sid='".$mybb->get_input('sid', MyBB::INPUT_INT)."'");
 673      $setting = $db->fetch_array($query);
 674  
 675      // Does the setting not exist?
 676      if(!$setting)
 677      {
 678          flash_message($lang->error_invalid_sid, 'error');
 679          admin_redirect("index.php?module=config-settings&action=manage");
 680      }
 681  
 682      // Prevent editing of default
 683      if($setting['isdefault'] == 1)
 684      {
 685          flash_message($lang->error_cannot_edit_default, 'error');
 686          admin_redirect("index.php?module=config-settings&action=manage");
 687      }
 688  
 689      // User clicked no
 690      if($mybb->get_input('no'))
 691      {
 692          admin_redirect("index.php?module=config-settings&action=manage");
 693      }
 694  
 695      $plugins->run_hooks("admin_config_settings_delete");
 696  
 697      if($mybb->request_method == "post")
 698      {
 699          // Delete the setting
 700          $db->delete_query("settings", "sid='{$setting['sid']}'");
 701  
 702          rebuild_settings();
 703  
 704          $plugins->run_hooks("admin_config_settings_delete_commit");
 705  
 706          // Log admin action
 707          log_admin_action($setting['sid'], $setting['title']);
 708  
 709          flash_message($lang->success_setting_deleted, 'success');
 710          admin_redirect("index.php?module=config-settings&action=manage");
 711      }
 712      else
 713      {
 714          $page->output_confirm_action("index.php?module=config-settings&amp;action=delete&amp;sid={$setting['sid']}", $lang->confirm_setting_deletion);
 715      }
 716  }
 717  
 718  // Modify Existing Settings
 719  if($mybb->input['action'] == "manage")
 720  {
 721      $plugins->run_hooks("admin_config_settings_manage");
 722  
 723      // Update orders
 724      if($mybb->request_method == "post")
 725      {
 726          if(is_array($mybb->input['group_disporder']))
 727          {
 728              foreach($mybb->input['group_disporder'] as $gid => $new_order)
 729              {
 730                  $gid = (int)$gid;
 731                  $update_group = array('disporder' => (int)$new_order);
 732                  $db->update_query("settinggroups", $update_group, "gid={$gid}");
 733              }
 734          }
 735  
 736          if(is_array($mybb->input['setting_disporder']))
 737          {
 738              foreach($mybb->input['setting_disporder'] as $sid => $new_order)
 739              {
 740                  $sid = (int)$sid;
 741                  $update_setting = array('disporder' => (int)$new_order);
 742                  $db->update_query("settings", $update_setting, "sid={$sid}");
 743              }
 744          }
 745  
 746          $plugins->run_hooks("admin_config_settings_manage_commit");
 747  
 748          // Log admin action
 749          log_admin_action();
 750  
 751          flash_message($lang->success_display_orders_updated, 'success');
 752          admin_redirect("index.php?module=config-settings&action=manage");
 753      }
 754  
 755      $page->add_breadcrumb_item($lang->modify_existing_settings);
 756      $page->output_header($lang->board_settings." - ".$lang->modify_existing_settings);
 757  
 758      $sub_tabs['change_settings'] = array(
 759          'title' => $lang->change_settings,
 760          'link' => "index.php?module=config-settings",
 761      );
 762  
 763      $sub_tabs['add_setting'] = array(
 764          'title' => $lang->add_new_setting,
 765          'link' => "index.php?module=config-settings&amp;action=add"
 766      );
 767  
 768      $sub_tabs['add_setting_group'] = array(
 769          'title' => $lang->add_new_setting_group,
 770          'link' => "index.php?module=config-settings&amp;action=addgroup"
 771      );
 772  
 773      $sub_tabs['modify_setting'] = array(
 774          'title' => $lang->modify_existing_settings,
 775          'link' => "index.php?module=config-settings&amp;action=manage",
 776          'description' => $lang->modify_existing_settings_desc
 777      );
 778  
 779      $page->output_nav_tabs($sub_tabs, 'modify_setting');
 780  
 781      // Cache settings
 782      $settings_cache = array();
 783      $query = $db->simple_select("settings", "sid, name, title, disporder, gid, isdefault", "", array('order_by' => 'disporder', 'order_dir' => 'asc'));
 784      while($setting = $db->fetch_array($query))
 785      {
 786          $settings_cache[$setting['gid']][] = $setting;
 787      }
 788  
 789      $form = new Form("index.php?module=config-settings&amp;action=manage", "post", "edit");
 790  
 791      $table = new Table;
 792  
 793      $table->construct_header($lang->setting_group_setting);
 794      $table->construct_header($lang->order, array('class' => 'align_center', 'style' => 'width: 5%'));
 795      $table->construct_header($lang->controls, array('class' => 'align_center', 'style' => 'width: 200px'));
 796  
 797      // Generate table
 798      $query = $db->simple_select("settinggroups", "*", "", array('order_by' => 'disporder', 'order_dir' => 'asc'));
 799      while($group = $db->fetch_array($query))
 800      {
 801          // Make setting group row
 802          // Translated?
 803          $group_lang_var = "setting_group_{$group['name']}";
 804          if(!empty($lang->$group_lang_var))
 805          {
 806              $group_title = htmlspecialchars_uni($lang->$group_lang_var);
 807          }
 808          else
 809          {
 810              $group_title = htmlspecialchars_uni($group['title']);
 811          }
 812          $table->construct_cell("<strong>{$group_title}</strong>", array('id' => "group{$group['gid']}"));
 813          $table->construct_cell($form->generate_numeric_field("group_disporder[{$group['gid']}]", $group['disporder'], array('style' => 'width: 80%; font-weight: bold', 'class' => 'align_center', 'min' => 0)));
 814          // Only show options if not a default setting group
 815          if($group['isdefault'] != 1)
 816          {
 817              $popup = new PopupMenu("group_{$group['gid']}", $lang->options);
 818              $popup->add_item($lang->edit_setting_group, "index.php?module=config-settings&amp;action=editgroup&amp;gid={$group['gid']}");
 819              $popup->add_item($lang->delete_setting_group, "index.php?module=config-settings&amp;action=deletegroup&amp;gid={$group['gid']}&amp;my_post_key={$mybb->post_code}", "return AdminCP.deleteConfirmation(this, '{$lang->confirm_setting_group_deletion}')");
 820              $table->construct_cell($popup->fetch(), array('class' => 'align_center'));
 821          }
 822          else
 823          {
 824              $table->construct_cell('');
 825          }
 826          $table->construct_row(array('class' => 'alt_row', 'no_alt_row' => 1));
 827  
 828          // Make rows for each setting in the group
 829          if(isset($settings_cache[$group['gid']]) && is_array($settings_cache[$group['gid']]))
 830          {
 831              foreach($settings_cache[$group['gid']] as $setting)
 832              {
 833                  $setting_lang_var = "setting_{$setting['name']}";
 834                  if(!empty($lang->$setting_lang_var))
 835                  {
 836                      $setting_title = htmlspecialchars_uni($lang->$setting_lang_var);
 837                  }
 838                  else
 839                  {
 840                      $setting_title = htmlspecialchars_uni($setting['title']);
 841                  }
 842                  $table->construct_cell($setting_title, array('style' => 'padding-left: 40px;'));
 843                  $table->construct_cell($form->generate_numeric_field("setting_disporder[{$setting['sid']}]", $setting['disporder'], array('style' => 'width: 80%', 'class' => 'align_center', 'min' => 0)));
 844                  // Only show options if not a default setting group or is a custom setting
 845                  if($group['isdefault'] != 1 || $setting['isdefault'] != 1)
 846                  {
 847                      $popup = new PopupMenu("setting_{$setting['sid']}", $lang->options);
 848                      $popup->add_item($lang->edit_setting, "index.php?module=config-settings&amp;action=edit&amp;sid={$setting['sid']}");
 849                      $popup->add_item($lang->delete_setting, "index.php?module=config-settings&amp;action=delete&amp;sid={$setting['sid']}&amp;my_post_key={$mybb->post_code}", "return AdminCP.deleteConfirmation(this, '{$lang->confirm_setting_deletion}')");
 850                      $table->construct_cell($popup->fetch(), array('class' => 'align_center'));
 851                  }
 852                  else
 853                  {
 854                      $table->construct_cell('');
 855                  }
 856                  $table->construct_row(array('no_alt_row' => 1, 'class' => "group{$group['gid']}"));
 857              }
 858          }
 859      }
 860  
 861      $table->output($lang->modify_existing_settings);
 862  
 863      $buttons[] = $form->generate_submit_button($lang->save_display_orders);
 864      $form->output_submit_wrapper($buttons);
 865      $form->end();
 866  
 867      $page->output_footer();
 868  }
 869  
 870  // Change settings for a specified group.
 871  if($mybb->input['action'] == "change")
 872  {
 873      $plugins->run_hooks("admin_config_settings_change");
 874  
 875      if($mybb->request_method == "post")
 876      {
 877          if(!is_writable(MYBB_ROOT.'inc/settings.php'))
 878          {
 879              flash_message($lang->error_chmod_settings_file, 'error');
 880              admin_redirect("index.php?module=config-settings");
 881          }
 882  
 883          // Not allowed to be hidden captcha fields
 884          $disallowed_fields = array(
 885              'username',
 886              'password',
 887              'password2',
 888              'email',
 889              'email2',
 890              'imagestring',
 891              'imagehash',
 892              'answer',
 893              'question_id',
 894              'allownotices',
 895              'hideemail',
 896              'receivepms',
 897              'pmnotice',
 898              'emailpmnotify',
 899              'invisible',
 900              'subscriptionmethod',
 901              'timezoneoffset',
 902              'dstcorrection',
 903              'language',
 904              'step',
 905              'action',
 906              'agree',
 907              'regtime',
 908              'regcheck1',
 909              'regcheck2',
 910              'regsubmit'
 911          );
 912  
 913          $is_current_hiddencaptcha_wrong = in_array($mybb->settings['hiddencaptchaimagefield'], $disallowed_fields);
 914          if(
 915              (isset($mybb->input['upsetting']['hiddencaptchaimagefield']) && in_array($mybb->input['upsetting']['hiddencaptchaimagefield'], $disallowed_fields)) ||
 916              $is_current_hiddencaptcha_wrong
 917          )
 918          {
 919              if(isset($mybb->input['upsetting']['hiddencaptchaimagefield']) && $mybb->input['upsetting']['hiddencaptchaimagefield'] != $mybb->settings['hiddencaptchaimagefield'] && !$is_current_hiddencaptcha_wrong)
 920              {
 921                  $wrong_value = $mybb->input['upsetting']['hiddencaptchaimagefield'];
 922                  $mybb->input['upsetting']['hiddencaptchaimagefield'] = $mybb->settings['hiddencaptchaimagefield'];
 923              }
 924              else
 925              {
 926                  $wrong_value = $mybb->settings['hiddencaptchaimagefield'];
 927                  $mybb->input['upsetting']['hiddencaptchaimagefield'] = 'email3';
 928              }
 929  
 930              $lang->success_settings_updated .= $lang->sprintf($lang->success_settings_updated_hiddencaptchaimage, htmlspecialchars_uni($mybb->input['upsetting']['hiddencaptchaimagefield']), htmlspecialchars_uni($wrong_value));
 931          }
 932  
 933          // Validate avatar dimension inputs
 934          $gid = (int)$mybb->input['gid'];
 935          $dimfields = array(
 936              8 => array('postmaxavatarsize'),
 937              10 => array('useravatardims', 'maxavatardims'),
 938              13 => array('memberlistmaxavatarsize')
 939          );
 940          if(in_array($gid, array_keys($dimfields)))
 941          {
 942              foreach($dimfields[$gid] as $field)
 943              {
 944                  if(isset($mybb->input['upsetting'][$field]))
 945                  {
 946                      if(preg_match("/\b\d+[|x]{1}\d+\b/i", $mybb->input['upsetting'][$field]) || ($field == 'maxavatardims' && trim($mybb->input['upsetting'][$field]) == ""))
 947                      {
 948                          // If pipe (|) is used normalize to 'x'
 949                          $mybb->input['upsetting'][$field] = str_replace('|', 'x', my_strtolower($mybb->input['upsetting'][$field]));
 950                      }
 951                      else
 952                      {
 953                          flash_message($lang->sprintf($lang->error_format_dimension, $lang->{'error_field_'.$field}), 'error');
 954                          admin_redirect("index.php?module=config-settings&action=change&gid=".$gid);
 955                      }
 956                  }
 957              }
 958          }
 959  
 960          // Validate minnamelength, maxnamelength, minpasswordlength (complex and regular) and maxpasswordlength
 961          if ($gid == 9)
 962          {
 963              if (
 964                  isset($mybb->input['upsetting']['minnamelength'], $mybb->input['upsetting']['maxnamelength']) &&
 965                  $mybb->input['upsetting']['minnamelength'] > 0 && $mybb->input['upsetting']['maxnamelength'] > 0 &&
 966                  $mybb->input['upsetting']['minnamelength'] > $mybb->input['upsetting']['maxnamelength'])
 967              {
 968                  flash_message($lang->error_field_minnamelength, 'error');
 969                  admin_redirect("index.php?module=config-settings&action=change&gid=".$gid);
 970              }
 971  
 972              if (
 973                  isset($mybb->input['upsetting']['minpasswordlength'], $mybb->input['upsetting']['maxpasswordlength']) &&
 974                  $mybb->input['upsetting']['minpasswordlength'] > 0 && $mybb->input['upsetting']['maxpasswordlength'] > 0 &&
 975                  $mybb->input['upsetting']['minpasswordlength'] > $mybb->input['upsetting']['maxpasswordlength']
 976              )
 977              {
 978                  flash_message($lang->error_field_minpasswordlength, 'error');
 979                  admin_redirect("index.php?module=config-settings&action=change&gid=".$gid);
 980              }
 981  
 982              if (
 983                  isset($mybb->input['upsetting']['minpasswordlength'], $mybb->input['upsetting']['requirecomplexpasswords']) &&
 984                  $mybb->input['upsetting']['requirecomplexpasswords'] && $mybb->input['upsetting']['minpasswordlength'] < 3
 985              )
 986              {
 987                  flash_message($lang->error_field_minpasswordlength_complex, 'error');
 988                  admin_redirect("index.php?module=config-settings&action=change&gid=".$gid);
 989              }
 990          }
 991          
 992          require_once  MYBB_ROOT.'inc/class_captcha.php';
 993          
 994          // Have we opted for a reCAPTCHA or hCaptcha and not set a public/private key in input?
 995          $set_captcha_image = false;
 996          if(isset(
 997              $mybb->input['upsetting']['captchaimage'],
 998              $mybb->input['upsetting']['recaptchaprivatekey'],
 999              $mybb->input['upsetting']['recaptchapublickey'],
1000              $mybb->input['upsetting']['recaptchascore'],
1001              $mybb->input['upsetting']['hcaptchaprivatekey'],
1002              $mybb->input['upsetting']['hcaptchapublickey'],
1003              $mybb->input['upsetting']['cfturnstileprivatekey'],
1004              $mybb->input['upsetting']['cfturnstilepublickey']
1005          ))
1006          {
1007              $captchaimage = $mybb->input['upsetting']['captchaimage'];
1008              $recaptchaprivatekey = $mybb->input['upsetting']['recaptchaprivatekey'];
1009              $recaptchapublickey = $mybb->input['upsetting']['recaptchapublickey'];
1010              $recaptchascore = $mybb->input['upsetting']['recaptchascore'];
1011              $hcaptchaprivatekey = $mybb->input['upsetting']['hcaptchaprivatekey'];
1012              $hcaptchapublickey = $mybb->input['upsetting']['hcaptchapublickey'];
1013              $cfturnstileprivatekey = $mybb->input['upsetting']['cfturnstileprivatekey'];
1014              $cfturnstilepublickey = $mybb->input['upsetting']['cfturnstilepublickey'];
1015  
1016              if(in_array($captchaimage, array(captcha::NOCAPTCHA_RECAPTCHA, captcha::RECAPTCHA_INVISIBLE)) && (!$recaptchaprivatekey || !$recaptchapublickey))
1017              {
1018                  $set_captcha_image = true;
1019              }
1020              else if(in_array($captchaimage, array(captcha::RECAPTCHA_V3)) && (!$recaptchaprivatekey || !$recaptchapublickey || !$recaptchascore))
1021              {
1022                  $set_captcha_image = true;
1023              }
1024              else if(in_array($captchaimage, array(captcha::HCAPTCHA, captcha::HCAPTCHA_INVISIBLE)) && (!$hcaptchaprivatekey || !$hcaptchapublickey))
1025              {
1026                  $set_captcha_image = true;
1027              }
1028              else if($captchaimage == captcha::CFTURNSTILE && (!$cfturnstileprivatekey || !$cfturnstilepublickey))
1029              {
1030                  $set_captcha_image = true;
1031              }
1032          }
1033  
1034          //Checking settings for reCAPTCHA or hCaptcha and public/private key not set?
1035          $captchaimage = $mybb->settings['captchaimage'];
1036          $recaptchaprivatekey = $mybb->settings['recaptchaprivatekey'];
1037          $recaptchapublickey = $mybb->settings['recaptchapublickey'];
1038          $recaptchascore = $mybb->settings['recaptchascore'];
1039          $hcaptchaprivatekey = $mybb->settings['hcaptchaprivatekey'];
1040          $hcaptchapublickey = $mybb->settings['hcaptchapublickey'];
1041          $cfturnstileprivatekey = $mybb->settings['cfturnstileprivatekey'];
1042          $cfturnstilepublickey = $mybb->settings['cfturnstilepublickey'];
1043  
1044          if(in_array($captchaimage, array(captcha::NOCAPTCHA_RECAPTCHA, captcha::RECAPTCHA_INVISIBLE)) && (!$recaptchaprivatekey || !$recaptchapublickey))
1045          {
1046              $set_captcha_image = true;
1047          }
1048          else if(in_array($captchaimage, array(captcha::RECAPTCHA_V3)) && (!$recaptchaprivatekey || !$recaptchapublickey || !$recaptchascore))
1049          {
1050              $set_captcha_image = true;
1051          }
1052          else if(in_array($captchaimage, array(captcha::HCAPTCHA, captcha::HCAPTCHA_INVISIBLE)) && (!$hcaptchaprivatekey || !$hcaptchapublickey))
1053          {
1054              $set_captcha_image = true;
1055          }
1056          else if($captchaimage == captcha::CFTURNSTILE && ( !$cfturnstileprivatekey || !$cfturnstilepublickey))
1057          {
1058              $set_captcha_image = true;
1059          }
1060          if($set_captcha_image){
1061              $mybb->input['upsetting']['captchaimage'] = captcha::DEFAULT_CAPTCHA;
1062              $lang->success_settings_updated .= $lang->success_settings_updated_captchaimage;
1063          }
1064  
1065          // If using fulltext then enforce minimum word length given by database
1066          if(isset($mybb->input['upsetting']['minsearchword']) && $mybb->input['upsetting']['minsearchword'] > 0 && $mybb->input['upsetting']['searchtype'] == "fulltext" && $db->supports_fulltext_boolean("posts") && $db->supports_fulltext("threads"))
1067          {
1068              // Attempt to determine minimum word length from MySQL for fulltext searches
1069              $query = $db->query("SHOW VARIABLES LIKE 'ft_min_word_len';");
1070              $min_length = $db->fetch_field($query, 'Value');
1071              if(is_numeric($min_length) && $mybb->input['upsetting']['minsearchword'] < $min_length)
1072              {
1073                  $mybb->input['upsetting']['minsearchword'] = $min_length;
1074                  $lang->success_settings_updated .= $lang->success_settings_updated_minsearchword;
1075              }
1076          }
1077  
1078          // Get settings which optionscode is a forum/group select, checkbox or numeric
1079          // We cannot rely on user input to decide this
1080          $checkbox_settings = $forum_group_select = $prefix_select = array();
1081          $query = $db->simple_select('settings', 'name, optionscode', "optionscode IN('forumselect', 'groupselect', 'prefixselect') OR optionscode LIKE 'checkbox%' OR optionscode LIKE 'numeric%'");
1082  
1083          while($multisetting = $db->fetch_array($query))
1084          {
1085              $options = array();
1086  
1087              if(substr($multisetting['optionscode'], 0, 8) == 'checkbox')
1088              {
1089                  $checkbox_settings[] = $multisetting['name'];
1090  
1091                  // All checkboxes deselected = no $mybb->input['upsetting'] for them, we need to initialize it manually then, but only on pages where the setting is shown
1092                  if(empty($mybb->input['upsetting'][$multisetting['name']]) && isset($mybb->input["isvisible_{$multisetting['name']}"]))
1093                  {
1094                      $mybb->input['upsetting'][$multisetting['name']] = array();
1095                  }
1096              }
1097              elseif(substr($multisetting['optionscode'], 0, 7) == 'numeric')
1098              {
1099                  if(isset($mybb->input['upsetting'][$multisetting['name']]))
1100                  {
1101                      $type = explode("\n", $multisetting['optionscode']);
1102                      for($i=1; $i < count($type); $i++)
1103                      {
1104                          $optionsexp = explode("=", $type[$i]);
1105                          $opt = array_map('trim', $optionsexp);
1106                          if(in_array($opt[0], array('min', 'max', 'step')))
1107                          {
1108                              if($opt[0] != 'step' || $opt[1] != 'any')
1109                              {
1110                                  $opt[1] = (float)$opt[1];
1111                              }
1112                              $options[$opt[0]] = $opt[1];
1113                          }
1114                      }
1115  
1116                      $value = (float)$mybb->input['upsetting'][$multisetting['name']];
1117  
1118                      if(isset($options['min']))
1119                      {
1120                          $value = max($value, $options['min']);
1121                      }
1122  
1123                      if(isset($options['max']))
1124                      {
1125                          $value = min($value, $options['max']);
1126                      }
1127  
1128                      $mybb->input['upsetting'][$multisetting['name']] = $value;
1129                  }
1130              }
1131              else
1132              {
1133                  $forum_group_select[] = $multisetting['name'];
1134              }
1135          }
1136  
1137          // Verify for admin email that can't be empty
1138          if(isset($mybb->input['upsetting']['adminemail']) && !validate_email_format($mybb->input['upsetting']['adminemail']))
1139          {
1140              unset($mybb->input['upsetting']['adminemail']);
1141              $lang->success_settings_updated .= $lang->error_admin_email_settings_empty;
1142          }
1143  
1144          // Administrator is changing the login method.
1145          if(isset($mybb->input['upsetting']['username_method']) && (int)$mybb->input['upsetting']['username_method'] > 0)
1146          {
1147              if((int)$mybb->settings['allowmultipleemails'] == 1)
1148              {
1149                  $mybb->input['upsetting']['username_method'] = 0;
1150                  $lang->success_settings_updated .= $lang->success_settings_updated_username_method_conflict;
1151              }
1152              else
1153              {
1154                  $query = $db->simple_select('users', 'email', "email != ''", array('group_by' => 'email HAVING COUNT(email)>1'));
1155                  if($db->num_rows($query))
1156                  {
1157                      $mybb->input['upsetting']['username_method'] = 0;
1158                      $lang->success_settings_updated .= $lang->success_settings_updated_username_method;
1159                  }
1160              }
1161          }
1162  
1163          if(isset($mybb->input['upsetting']['username_method'], $mybb->input['upsetting']['allowmultipleemails']))
1164          {
1165              // Administrator is changing registration email allowance
1166              if((int)$mybb->settings['username_method'] > 0 && (int)$mybb->input['upsetting']['allowmultipleemails'] !== 0)
1167              {
1168                  $mybb->input['upsetting']['allowmultipleemails'] = 0;
1169                  $lang->success_settings_updated .= $lang->success_settings_updated_allowmultipleemails;
1170              }
1171  
1172              // Reset conflict silently, if by chance
1173              if((int)$mybb->settings['username_method'] > 0 && (int)$mybb->settings['allowmultipleemails'] == 1)
1174              {
1175                  $mybb->input['upsetting']['allowmultipleemails'] = 0;
1176              }
1177          }
1178  
1179          // reject dangerous/unsupported upload paths
1180          $fields = array(
1181              'uploadspath',
1182              'cdnpath',
1183              'avataruploadpath',
1184          );
1185  
1186          $dynamic_include_directories = array(
1187              MYBB_ROOT.'cache/',
1188              MYBB_ROOT.'inc/plugins/',
1189              MYBB_ROOT.'inc/languages/',
1190              MYBB_ROOT.'inc/tasks/',
1191          );
1192          $dynamic_include_directories_realpath = array_map('realpath', $dynamic_include_directories);
1193  
1194          foreach($fields as $field)
1195          {
1196              if(isset($mybb->input['upsetting'][$field]))
1197              {
1198                  if(
1199                      is_string($mybb->input['upsetting'][$field]) &&
1200                      strpos($mybb->input['upsetting'][$field], '://') !== false)
1201                  {
1202                      unset($mybb->input['upsetting'][$field]);
1203                      continue;
1204                  }
1205  
1206                  $realpath = realpath(mk_path_abs($mybb->input['upsetting'][$field]));
1207  
1208                  if ($realpath === false)
1209                  {
1210                      unset($mybb->input['upsetting'][$field]);
1211                      continue;
1212                  }
1213  
1214                  foreach ($dynamic_include_directories_realpath as $forbidden_realpath)
1215                  {
1216                      if ($realpath === $forbidden_realpath || strpos($realpath, $forbidden_realpath.DIRECTORY_SEPARATOR) === 0)
1217                      {
1218                          unset($mybb->input['upsetting'][$field]);
1219                          continue 2;
1220                      }
1221                  }
1222              }
1223          }
1224  
1225          // reject dangerous/unsupported file paths
1226          $field = 'errorloglocation';
1227  
1228          if(isset($mybb->input['upsetting'][$field]) && is_string($mybb->input['upsetting'][$field]))
1229          {
1230              if(
1231                  strpos($mybb->input['upsetting'][$field], '://') !== false ||
1232                  substr($mybb->input['upsetting'][$field], -4) === '.php'
1233              )
1234              {
1235                  unset($mybb->input['upsetting'][$field]);
1236              }
1237          }
1238  
1239          if(is_array($mybb->input['upsetting']))
1240          {
1241              foreach($mybb->input['upsetting'] as $name => $value)
1242              {
1243                  if($forum_group_select && in_array($name, $forum_group_select))
1244                  {
1245                      if($value == 'all')
1246                      {
1247                          $value = -1;
1248                      }
1249                      elseif($value == 'custom')
1250                      {
1251                          if(isset($mybb->input['select'][$name]) && is_array($mybb->input['select'][$name]))
1252                          {
1253                              foreach($mybb->input['select'][$name] as &$val)
1254                              {
1255                                  $val = (int)$val;
1256                              }
1257                              unset($val);
1258  
1259                              $value = implode(',', $mybb->input['select'][$name]);
1260                          }
1261                          else
1262                          {
1263                              $value = '';
1264                          }
1265                      }
1266                      else
1267                      {
1268                          $value = '';
1269                      }
1270                  }
1271                  elseif($checkbox_settings && in_array($name, $checkbox_settings))
1272                  {
1273                      $value = '';
1274  
1275                      if(is_array($mybb->input['upsetting'][$name]))
1276                      {
1277                          $value = implode(',', $mybb->input['upsetting'][$name]);
1278                      }
1279                  }
1280  
1281                  $db->update_query("settings", array('value' => $db->escape_string($value)), "name='".$db->escape_string($name)."'");
1282              }
1283          }
1284  
1285          // Check if we need to create our fulltext index after changing the search mode
1286          if(
1287              isset($mybb->input['upsetting']['searchtype']) &&
1288              $mybb->settings['searchtype'] != $mybb->input['upsetting']['searchtype'] &&
1289              $mybb->input['upsetting']['searchtype'] == "fulltext"
1290          )
1291          {
1292              if(!$db->is_fulltext("posts") && $db->supports_fulltext_boolean("posts"))
1293              {
1294                  $db->create_fulltext_index("posts", "message");
1295              }
1296              if(!$db->is_fulltext("threads") && $db->supports_fulltext("threads"))
1297              {
1298                  $db->create_fulltext_index("threads", "subject");
1299              }
1300          }
1301  
1302          // If the delayedthreadviews setting was changed, enable or disable the tasks for it.
1303          if(isset($mybb->input['upsetting']['delayedthreadviews']) && $mybb->settings['delayedthreadviews'] != $mybb->input['upsetting']['delayedthreadviews'])
1304          {
1305              $db->update_query("tasks", array('enabled' => (int)$mybb->input['upsetting']['delayedthreadviews']), "file='threadviews'");
1306          }
1307  
1308          // Have we changed our cookie prefix? If so, update our adminsid so we're not logged out
1309          if(isset($mybb->input['upsetting']['cookieprefix']) && $mybb->input['upsetting']['cookieprefix'] != $mybb->settings['cookieprefix'])
1310          {
1311              my_unsetcookie("adminsid");
1312              $mybb->settings['cookieprefix'] = $mybb->input['upsetting']['cookieprefix'];
1313              my_setcookie("adminsid", $admin_session['sid'], '', true, "strict");
1314          }
1315  
1316          if(isset($mybb->input['upsetting']['statstopreferrer']) && $mybb->input['upsetting']['statstopreferrer'] != $mybb->settings['statstopreferrer'])
1317          {
1318              $cache->update_statistics();
1319          }
1320  
1321          $statslimit = $mybb->settings['statslimit'];
1322  
1323          rebuild_settings();
1324  
1325          if(isset($mybb->input['upsetting']['statslimit']) && $mybb->input['upsetting']['statslimit'] != $statslimit)
1326          {
1327              $cache->update_most_replied_threads();
1328              $cache->update_most_viewed_threads();
1329          }
1330  
1331          $plugins->run_hooks("admin_config_settings_change_commit");
1332  
1333          // Log admin action
1334          log_admin_action();
1335  
1336          flash_message($lang->success_settings_updated, 'success');
1337          admin_redirect("index.php?module=config-settings");
1338      }
1339  
1340      // What type of page
1341      $cache_groups = $cache_settings = array();
1342      if(isset($mybb->input['search']))
1343      {
1344          // Search
1345  
1346          // Search for settings
1347          $search = trim($mybb->input['search']);
1348          if(!empty($search))
1349          {
1350              $query = $db->query("
1351                  SELECT s.* , g.name as gname, g.title as gtitle, g.description as gdescription
1352                  FROM ".TABLE_PREFIX."settings s
1353                  LEFT JOIN ".TABLE_PREFIX."settinggroups g ON(s.gid=g.gid)
1354                  ORDER BY s.disporder
1355              ");
1356              while($setting = $db->fetch_array($query))
1357              {
1358                  $search_in = $setting['name'] . ' ' . $setting['title'] . ' ' . $setting['description'] . ' ' . $setting['gname'] . ' ' . $setting['gtitle'] . ' ' . $setting['gdescription'];
1359                  foreach(array("setting_{$setting['name']}", "setting_{$setting['name']}_desc", "setting_group_{$setting['gname']}", "setting_group_{$setting['gname']}_desc") as $search_in_lang_key)
1360                  {
1361                      if(!empty($lang->$search_in_lang_key))
1362                      {
1363                          $search_in .= ' ' . $lang->$search_in_lang_key;
1364                      }
1365                  }
1366                  if(my_stripos($search_in, $search) !== false)
1367                  {
1368                      $cache_settings[$setting['gid']][$setting['sid']] = $setting;
1369                  }
1370              }
1371          }
1372          if(!count($cache_settings))
1373          {
1374              if(isset($mybb->input['ajax_search']))
1375              {
1376                  echo json_encode(array("errors" => array($lang->error_no_settings_found)));
1377                  exit;
1378              }
1379              else
1380              {
1381                  flash_message($lang->error_no_settings_found, 'error');
1382                  admin_redirect("index.php?module=config-settings");
1383              }
1384          }
1385  
1386          // Cache groups
1387          $groups = array_keys($cache_settings);
1388          $groups = implode(',', $groups);
1389          $query = $db->simple_select("settinggroups", "*", "gid IN ({$groups})", array('order_by' => 'disporder'));
1390          while($group = $db->fetch_array($query))
1391          {
1392              $cache_groups[$group['gid']] = $group;
1393          }
1394  
1395          // Page header only if not AJAX
1396          if(!isset($mybb->input['ajax_search']))
1397          {
1398              $page->add_breadcrumb_item($lang->settings_search);
1399              $page->output_header($lang->board_settings." - {$lang->settings_search}");
1400          }
1401      }
1402      elseif(($mybb->get_input('gid')))
1403      {
1404          // Group listing
1405          // Cache groups
1406          $query = $db->simple_select("settinggroups", "*", "gid = '".$mybb->get_input('gid', MyBB::INPUT_INT)."'");
1407          $groupinfo = $db->fetch_array($query);
1408          $cache_groups[$groupinfo['gid']] = $groupinfo;
1409  
1410          if(!$db->num_rows($query))
1411          {
1412              $page->output_error($lang->error_invalid_gid2);
1413          }
1414  
1415          // Cache settings
1416          $query = $db->simple_select("settings", "*", "gid='".$mybb->get_input('gid', MyBB::INPUT_INT)."'", array('order_by' => 'disporder'));
1417          while($setting = $db->fetch_array($query))
1418          {
1419              $cache_settings[$setting['gid']][$setting['sid']] = $setting;
1420          }
1421  
1422          if(!$db->num_rows($query))
1423          {
1424              flash_message($lang->error_no_settings_found, 'error');
1425              admin_redirect("index.php?module=config-settings");
1426          }
1427  
1428          $group_lang_var = "setting_group_{$groupinfo['name']}";
1429          if(isset($lang->$group_lang_var))
1430          {
1431              $groupinfo['title'] = $lang->$group_lang_var;
1432          }
1433  
1434          $groupinfo['title'] = htmlspecialchars_uni($groupinfo['title']);
1435  
1436          // Page header
1437          $page->add_breadcrumb_item($groupinfo['title']);
1438          $page->output_header($lang->board_settings." - {$groupinfo['title']}");
1439      }
1440      else
1441      {
1442          // All settings list
1443          // Cache groups
1444          $query = $db->simple_select("settinggroups", "*", "", array('order_by' => 'disporder'));
1445          while($group = $db->fetch_array($query))
1446          {
1447              $cache_groups[$group['gid']] = $group;
1448          }
1449  
1450          if(!$db->num_rows($query))
1451          {
1452              $page->output_error($lang->error_invalid_gid2);
1453          }
1454  
1455          // Cache settings
1456          $query = $db->simple_select("settings", "*", "", array('order_by' => 'disporder'));
1457          while($setting = $db->fetch_array($query))
1458          {
1459              $cache_settings[$setting['gid']][$setting['sid']] = $setting;
1460          }
1461  
1462          // Page header
1463          $page->add_breadcrumb_item($lang->show_all_settings);
1464          $page->output_header($lang->board_settings." - {$lang->show_all_settings}");
1465      }
1466  
1467      // Build individual forms as per settings group
1468      foreach($cache_groups as $groupinfo)
1469      {
1470          $form = new Form("index.php?module=config-settings&amp;action=change", "post", "change");
1471          echo $form->generate_hidden_field("gid", $groupinfo['gid']);
1472          $buttons = array($form->generate_submit_button($lang->save_settings));
1473          $group_lang_var = "setting_group_{$groupinfo['name']}";
1474          if(isset($lang->$group_lang_var))
1475          {
1476              $groupinfo['title'] = $lang->$group_lang_var;
1477          }
1478  
1479          $groupinfo['title'] = htmlspecialchars_uni($groupinfo['title']);
1480  
1481          $form_container = new FormContainer($groupinfo['title']);
1482  
1483          if(empty($cache_settings[$groupinfo['gid']]))
1484          {
1485              $form_container->output_cell($lang->error_no_settings_found);
1486              $form_container->construct_row();
1487  
1488              $form_container->end();
1489              echo '<br />';
1490  
1491              continue;
1492          }
1493  
1494          foreach($cache_settings[$groupinfo['gid']] as $setting)
1495          {
1496              $setting['name'] = htmlspecialchars_uni($setting['name']);
1497  
1498              $options = "";
1499              $type = explode("\n", $setting['optionscode']);
1500              $type[0] = trim($type[0]);
1501              $element_name = "upsetting[{$setting['name']}]";
1502              $element_id = "setting_{$setting['name']}";
1503              if($type[0] == "text" || $type[0] == "")
1504              {
1505                  $setting_code = $form->generate_text_box($element_name, $setting['value'], array('id' => $element_id));
1506              }
1507              else if($type[0] == "numeric")
1508              {
1509                  $field_options = array('id' => $element_id);
1510                  if(count($type) > 1)
1511                  {
1512                      for($i=1; $i < count($type); $i++)
1513                      {
1514                          $optionsexp = explode("=", $type[$i]);
1515                          $opt = array_map('trim', $optionsexp);
1516                          if(in_array($opt[0], array('min', 'max', 'step')))
1517                          {
1518                              if($opt[0] != 'step' || $opt[1] != 'any')
1519                              {
1520                                  $opt[1] = (float)$opt[1];
1521                              }
1522                              $field_options[$opt[0]] = $opt[1];
1523                          }
1524                      }
1525                  }
1526                  $setting_code = $form->generate_numeric_field($element_name, $setting['value'], $field_options);
1527              }
1528              else if($type[0] == "textarea")
1529              {
1530                  $setting_code = $form->generate_text_area($element_name, $setting['value'], array('id' => $element_id));
1531              }
1532              else if($type[0] == "yesno")
1533              {
1534                  $setting_code = $form->generate_yes_no_radio($element_name, $setting['value'], true, array('id' => $element_id.'_yes', 'class' => $element_id), array('id' => $element_id.'_no', 'class' => $element_id));
1535              }
1536              else if($type[0] == "onoff")
1537              {
1538                  $setting_code = $form->generate_on_off_radio($element_name, $setting['value'], true, array('id' => $element_id.'_on', 'class' => $element_id), array('id' => $element_id.'_off', 'class' => $element_id));
1539              }
1540              else if($type[0] == "cpstyle")
1541              {
1542                  $dir = @opendir(MYBB_ROOT.$config['admin_dir']."/styles");
1543  
1544                  $folders = array();
1545                  while($folder = readdir($dir))
1546                  {
1547                      if($folder != "." && $folder != ".." && @file_exists(MYBB_ROOT.$config['admin_dir']."/styles/$folder/main.css"))
1548                      {
1549                          $folders[$folder] = ucfirst($folder);
1550                      }
1551                  }
1552                  closedir($dir);
1553                  ksort($folders);
1554                  $setting_code = $form->generate_select_box($element_name, $folders, $setting['value'], array('id' => $element_id));
1555              }
1556              else if($type[0] == "language")
1557              {
1558                  $languages = $lang->get_languages();
1559                  $setting_code = $form->generate_select_box($element_name, $languages, $setting['value'], array('id' => $element_id));
1560              }
1561              else if($type[0] == "adminlanguage")
1562              {
1563                  $languages = $lang->get_languages(1);
1564                  $setting_code = $form->generate_select_box($element_name, $languages, $setting['value'], array('id' => $element_id));
1565              }
1566              else if($type[0] == "passwordbox")
1567              {
1568                  $setting_code = $form->generate_password_box($element_name, $setting['value'], array('id' => $element_id));
1569              }
1570              else if($type[0] == "php")
1571              {
1572                  $setting['optionscode'] = substr($setting['optionscode'], 3);
1573                  eval("\$setting_code = \"".$setting['optionscode']."\";");
1574              }
1575              else if($type[0] == "forumselect")
1576              {
1577                  $selected_values = '';
1578                  if($setting['value'] != '' && $setting['value'] != -1)
1579                  {
1580                      $selected_values = explode(',', (string)$setting['value']);
1581  
1582                      foreach($selected_values as &$value)
1583                      {
1584                          $value = (int)$value;
1585                      }
1586                      unset($value);
1587                  }
1588  
1589                  $forum_checked = array('all' => '', 'custom' => '', 'none' => '');
1590                  if($setting['value'] == -1)
1591                  {
1592                      $forum_checked['all'] = 'checked="checked"';
1593                  }
1594                  elseif($setting['value'] != '')
1595                  {
1596                      $forum_checked['custom'] = 'checked="checked"';
1597                  }
1598                  else
1599                  {
1600                      $forum_checked['none'] = 'checked="checked"';
1601                  }
1602  
1603                  print_selection_javascript();
1604  
1605                  $setting_code = "
1606                  <dl style=\"margin-top: 0; margin-bottom: 0; width: 100%\">
1607                      <dt><label style=\"display: block;\"><input type=\"radio\" name=\"{$element_name}\" value=\"all\" {$forum_checked['all']} class=\"{$element_id}_forums_groups_check\" onclick=\"checkAction('{$element_id}');\" style=\"vertical-align: middle;\" /> <strong>{$lang->all_forums}</strong></label></dt>
1608                      <dt><label style=\"display: block;\"><input type=\"radio\" name=\"{$element_name}\" value=\"custom\" {$forum_checked['custom']} class=\"{$element_id}_forums_groups_check\" onclick=\"checkAction('{$element_id}');\" style=\"vertical-align: middle;\" /> <strong>{$lang->select_forums}</strong></label></dt>
1609                      <dd style=\"margin-top: 4px;\" id=\"{$element_id}_forums_groups_custom\" class=\"{$element_id}_forums_groups\">
1610                          <table cellpadding=\"4\">
1611                              <tr>
1612                                  <td valign=\"top\"><small>{$lang->forums_colon}</small></td>
1613                                  <td>".$form->generate_forum_select('select['.$setting['name'].'][]', $selected_values, array('id' => $element_id, 'multiple' => true, 'size' => 5))."</td>
1614                              </tr>
1615                          </table>
1616                      </dd>
1617                      <dt><label style=\"display: block;\"><input type=\"radio\" name=\"{$element_name}\" value=\"none\" {$forum_checked['none']} class=\"{$element_id}_forums_groups_check\" onclick=\"checkAction('{$element_id}');\" style=\"vertical-align: middle;\" /> <strong>{$lang->none}</strong></label></dt>
1618                  </dl>
1619                  <script type=\"text/javascript\">
1620                      checkAction('{$element_id}');
1621                  </script>";
1622              }
1623              else if($type[0] == "forumselectsingle")
1624              {
1625                  $selected_value = (int)$setting['value']; // No need to check if empty, int will give 0
1626                  $setting_code = $form->generate_forum_select($element_name, $selected_value, array('id' => $element_id, 'main_option' => $lang->none));
1627              }
1628              else if($type[0] == "groupselect")
1629              {
1630                  $selected_values = '';
1631                  if($setting['value'] != '' && $setting['value'] != -1)
1632                  {
1633                      $selected_values = explode(',', (string)$setting['value']);
1634  
1635                      foreach($selected_values as &$value)
1636                      {
1637                          $value = (int)$value;
1638                      }
1639                      unset($value);
1640                  }
1641  
1642                  $group_checked = array('all' => '', 'custom' => '', 'none' => '');
1643                  if($setting['value'] == -1)
1644                  {
1645                      $group_checked['all'] = 'checked="checked"';
1646                  }
1647                  elseif($setting['value'] != '')
1648                  {
1649                      $group_checked['custom'] = 'checked="checked"';
1650                  }
1651                  else
1652                  {
1653                      $group_checked['none'] = 'checked="checked"';
1654                  }
1655  
1656                  print_selection_javascript();
1657  
1658                  $setting_code = "
1659                  <dl style=\"margin-top: 0; margin-bottom: 0; width: 100%\">
1660                      <dt><label style=\"display: block;\"><input type=\"radio\" name=\"{$element_name}\" value=\"all\" {$group_checked['all']} class=\"{$element_id}_forums_groups_check\" onclick=\"checkAction('{$element_id}');\" style=\"vertical-align: middle;\" /> <strong>{$lang->all_groups}</strong></label></dt>
1661                      <dt><label style=\"display: block;\"><input type=\"radio\" name=\"{$element_name}\" value=\"custom\" {$group_checked['custom']} class=\"{$element_id}_forums_groups_check\" onclick=\"checkAction('{$element_id}');\" style=\"vertical-align: middle;\" /> <strong>{$lang->select_groups}</strong></label></dt>
1662                      <dd style=\"margin-top: 4px;\" id=\"{$element_id}_forums_groups_custom\" class=\"{$element_id}_forums_groups\">
1663                          <table cellpadding=\"4\">
1664                              <tr>
1665                                  <td valign=\"top\"><small>{$lang->groups_colon}</small></td>
1666                                  <td>".$form->generate_group_select('select['.$setting['name'].'][]', $selected_values, array('id' => $element_id, 'multiple' => true, 'size' => 5))."</td>
1667                              </tr>
1668                          </table>
1669                      </dd>
1670                      <dt><label style=\"display: block;\"><input type=\"radio\" name=\"{$element_name}\" value=\"none\" {$group_checked['none']} class=\"{$element_id}_forums_groups_check\" onclick=\"checkAction('{$element_id}');\" style=\"vertical-align: middle;\" /> <strong>{$lang->none}</strong></label></dt>
1671                  </dl>
1672                  <script type=\"text/javascript\">
1673                      checkAction('{$element_id}');
1674                  </script>";
1675              }
1676              else if($type[0] == "groupselectsingle")
1677              {
1678                  $selected_value = (int)$setting['value']; // No need to check if empty, int will give 0
1679                  $setting_code = $form->generate_group_select($element_name, $selected_value, array('id' => $element_id, 'main_option' => $lang->none));
1680              }
1681              else if($type[0] == "prefixselect")
1682              {
1683                  $selected_values = '';
1684                  if($setting['value'] != '' && $setting['value'] != -1)
1685                  {
1686                      $selected_values = explode(',', (string)$setting['value']);
1687                      foreach($selected_values as &$value)
1688                      {
1689                          $value = (int)$value;
1690                      }
1691                      unset($value);
1692                  }
1693                  $prefix_checked = array('all' => '', 'custom' => '', 'none' => '');
1694                  if($setting['value'] == -1)
1695                  {
1696                      $prefix_checked['all'] = 'checked="checked"';
1697                  }
1698                  elseif($setting['value'] != '')
1699                  {
1700                      $prefix_checked['custom'] = 'checked="checked"';
1701                  }
1702                  else
1703                  {
1704                      $prefix_checked['none'] = 'checked="checked"';
1705                  }
1706                  print_selection_javascript();
1707                  $setting_code = "
1708                  <dl style=\"margin-top: 0; margin-bottom: 0; width: 100%\">
1709                      <dt><label style=\"display: block;\"><input type=\"radio\" name=\"{$element_name}\" value=\"all\" {$prefix_checked['all']} class=\"{$element_id}_forums_groups_check\" onclick=\"checkAction('{$element_id}');\" style=\"vertical-align: middle;\" /> <strong>{$lang->all_prefix}</strong></label></dt>
1710                      <dt><label style=\"display: block;\"><input type=\"radio\" name=\"{$element_name}\" value=\"custom\" {$prefix_checked['custom']} class=\"{$element_id}_forums_groups_check\" onclick=\"checkAction('{$element_id}');\" style=\"vertical-align: middle;\" /> <strong>{$lang->select_prefix}</strong></label></dt>
1711                      <dd style=\"margin-top: 4px;\" id=\"{$element_id}_forums_groups_custom\" class=\"{$element_id}_forums_groups\">
1712                          <table cellpadding=\"4\">
1713                              <tr>
1714                                  <td valign=\"top\"><small>{$lang->prefix_colon}</small></td>
1715                                  <td>".$form->generate_prefix_select('select['.$setting['name'].'][]', $selected_values, array('id' => $element_id, 'multiple' => true, 'size' => 5))."</td>
1716                              </tr>
1717                          </table>
1718                      </dd>
1719                      <dt><label style=\"display: block;\"><input type=\"radio\" name=\"{$element_name}\" value=\"none\" {$prefix_checked['none']} class=\"{$element_id}_forums_groups_check\" onclick=\"checkAction('{$element_id}');\" style=\"vertical-align: middle;\" /> <strong>{$lang->none}</strong></label></dt>
1720                  </dl>
1721                  <script type=\"text/javascript\">
1722                      checkAction('{$element_id}');
1723                  </script>";
1724              }
1725              else
1726              {
1727                  $typecount = count($type);
1728  
1729                  if($type[0] == 'checkbox')
1730                  {
1731                      $multivalue = explode(',', $setting['value']);
1732                  }
1733  
1734                  $option_list = array();
1735                  for($i = 0; $i < $typecount; $i++)
1736                  {
1737                      $optionsexp = explode("=", $type[$i]);
1738                      if(!isset($optionsexp[1]))
1739                      {
1740                          continue;
1741                      }
1742                      $title_lang = "setting_{$setting['name']}_{$optionsexp[0]}";
1743                      if(isset($lang->$title_lang))
1744                      {
1745                          $optionsexp[1] = $lang->$title_lang;
1746                      }
1747  
1748                      if($type[0] == "select")
1749                      {
1750                          $option_list[$optionsexp[0]] = htmlspecialchars_uni($optionsexp[1]);
1751                      }
1752                      else if($type[0] == "radio")
1753                      {
1754                          if($setting['value'] == $optionsexp[0])
1755                          {
1756                              $option_list[$i] = $form->generate_radio_button($element_name, $optionsexp[0], htmlspecialchars_uni($optionsexp[1]), array('id' => $element_id.'_'.$i, "checked" => 1, 'class' => $element_id));
1757                          }
1758                          else
1759                          {
1760                              $option_list[$i] = $form->generate_radio_button($element_name, $optionsexp[0], htmlspecialchars_uni($optionsexp[1]), array('id' => $element_id.'_'.$i, 'class' => $element_id));
1761                          }
1762                      }
1763                      else if($type[0] == "checkbox")
1764                      {
1765                          if(in_array($optionsexp[0], $multivalue))
1766                          {
1767                              $option_list[$i] = $form->generate_check_box("{$element_name}[]", $optionsexp[0], htmlspecialchars_uni($optionsexp[1]), array('id' => $element_id.'_'.$i, "checked" => 1, 'class' => $element_id));
1768                          }
1769                          else
1770                          {
1771                              $option_list[$i] = $form->generate_check_box("{$element_name}[]", $optionsexp[0], htmlspecialchars_uni($optionsexp[1]), array('id' => $element_id.'_'.$i, 'class' => $element_id));
1772                          }
1773                      }
1774                  }
1775  
1776                  if($type[0] == "select")
1777                  {
1778                      $setting_code = $form->generate_select_box($element_name, $option_list, $setting['value'], array('id' => $element_id));
1779                  }
1780                  else
1781                  {
1782                      $setting_code = implode("<br />", $option_list);
1783  
1784                      if($type[0] == 'checkbox')
1785                      {
1786                          $setting_code .= $form->generate_hidden_field("isvisible_{$setting['name']}", 1);
1787                      }
1788                  }
1789              }
1790  
1791              // Do we have a custom language variable for this title or description?
1792              $title_lang = "setting_".$setting['name'];
1793              $desc_lang = $title_lang."_desc";
1794              if(isset($lang->$title_lang))
1795              {
1796                  $setting['title'] = $lang->$title_lang;
1797              }
1798              if(isset($lang->$desc_lang))
1799              {
1800                  $setting['description'] = $lang->$desc_lang;
1801              }
1802              $form_container->output_row(htmlspecialchars_uni($setting['title']), $setting['description'], $setting_code, '', array(), array('id' => 'row_'.$element_id));
1803          }
1804          $form_container->end();
1805  
1806          $form->output_submit_wrapper($buttons);
1807          $form->end();
1808          echo '<br />';
1809      }
1810  
1811      print_setting_peekers();
1812  
1813      if(!isset($mybb->input['ajax_search']))
1814      {
1815          $page->output_footer();
1816      }
1817  }
1818  
1819  if(!$mybb->input['action'])
1820  {
1821      $plugins->run_hooks("admin_config_settings_start");
1822  
1823      $page->extra_header .= <<<EOF
1824      <script type="text/javascript">
1825      <!--
1826      lang.searching = "{$lang->searching}";
1827      lang.search_error = "{$lang->search_error}";
1828      lang.search_done = "{$lang->search_done}";
1829      // -->
1830      </script>
1831  EOF;
1832  
1833      $page->output_header($lang->board_settings);
1834      if(isset($message))
1835      {
1836          $page->output_inline_message($message);
1837      }
1838  
1839      $sub_tabs['change_settings'] = array(
1840          'title' => $lang->change_settings,
1841          'link' => "index.php?module=config-settings",
1842          'description' => $lang->change_settings_desc
1843      );
1844  
1845      $sub_tabs['add_setting'] = array(
1846          'title' => $lang->add_new_setting,
1847          'link' => "index.php?module=config-settings&amp;action=add"
1848      );
1849  
1850      $sub_tabs['add_setting_group'] = array(
1851          'title' => $lang->add_new_setting_group,
1852          'link' => "index.php?module=config-settings&amp;action=addgroup"
1853      );
1854  
1855      $sub_tabs['modify_setting'] = array(
1856          'title' => $lang->modify_existing_settings,
1857          'link' => "index.php?module=config-settings&amp;action=manage",
1858      );
1859  
1860      $page->output_nav_tabs($sub_tabs, 'change_settings');
1861  
1862      // Search form
1863      echo "<div style=\"text-align: right; margin-bottom: 3px;\">";
1864      $search = new Form("index.php", 'get', 'settings_search', 0, 'settings_search');
1865      echo $search->generate_hidden_field('module', 'config/settings');
1866      echo $search->generate_hidden_field('action', 'change');
1867      echo $search->generate_text_box('search', $lang->settings_search, array('id' => 'search', 'class' => 'search_default field150 field_small'));
1868      echo "<input type=\"submit\" class=\"search_button\" value=\"{$lang->search}\" />";
1869      $search->end();
1870      echo "</div>\n";
1871  
1872      echo '<div id="search_results">&nbsp;</div><div id="group_list">';
1873      $table = new Table;
1874      $table->construct_header($lang->setting_groups);
1875  
1876      switch($db->type)
1877      {
1878          case "pgsql":
1879          $query = $db->query("
1880              SELECT g.*, COUNT(s.sid) AS settingcount
1881              FROM ".TABLE_PREFIX."settinggroups g
1882              LEFT JOIN ".TABLE_PREFIX."settings s ON (s.gid=g.gid)
1883              WHERE g.isdefault = 1
1884              GROUP BY ".$db->build_fields_string("settinggroups", "g.")."
1885              ORDER BY g.disporder
1886          ");
1887          break;
1888          default:
1889          $query = $db->query("
1890              SELECT g.*, COUNT(s.sid) AS settingcount
1891              FROM ".TABLE_PREFIX."settinggroups g
1892              LEFT JOIN ".TABLE_PREFIX."settings s ON (s.gid=g.gid)
1893              WHERE g.isdefault = 1
1894              GROUP BY g.gid
1895              ORDER BY g.disporder
1896          ");
1897      }
1898      while($group = $db->fetch_array($query))
1899      {
1900          $group_lang_var = "setting_group_{$group['name']}";
1901          if(isset($lang->$group_lang_var))
1902          {
1903              $group_title = htmlspecialchars_uni($lang->$group_lang_var);
1904          }
1905          else
1906          {
1907              $group_title = htmlspecialchars_uni($group['title']);
1908          }
1909  
1910          $group_desc_lang_var = "setting_group_{$group['name']}_desc";
1911          if(isset($lang->$group_desc_lang_var))
1912          {
1913              $group_desc = htmlspecialchars_uni($lang->$group_desc_lang_var);
1914          }
1915          else
1916          {
1917              $group_desc = htmlspecialchars_uni($group['description']);
1918          }
1919  
1920          $table->construct_cell("<strong><a href=\"index.php?module=config-settings&amp;action=change&amp;gid={$group['gid']}\">{$group_title}</a></strong> ({$group['settingcount']} {$lang->bbsettings})<br /><small>{$group_desc}</small>");
1921          $table->construct_row();
1922      }
1923  
1924      $table->output("<span style=\"float: right;\"><small><a href=\"index.php?module=config-settings&amp;action=change\">{$lang->show_all_settings}</a></small></span>{$lang->board_settings}");
1925  
1926      // Plugin Settings
1927      switch($db->type)
1928      {
1929          case "pgsql":
1930          $query = $db->query("
1931              SELECT g.*, COUNT(s.sid) AS settingcount
1932              FROM ".TABLE_PREFIX."settinggroups g
1933              LEFT JOIN ".TABLE_PREFIX."settings s ON (s.gid=g.gid)
1934              WHERE g.isdefault <> 1
1935              GROUP BY ".$db->build_fields_string("settinggroups", "g.")."
1936              ORDER BY g.disporder
1937          ");
1938          break;
1939          default:
1940          $query = $db->query("
1941              SELECT g.*, COUNT(s.sid) AS settingcount
1942              FROM ".TABLE_PREFIX."settinggroups g
1943              LEFT JOIN ".TABLE_PREFIX."settings s ON (s.gid=g.gid)
1944              WHERE g.isdefault <> 1
1945              GROUP BY g.gid
1946              ORDER BY g.disporder
1947          ");
1948      }
1949  
1950      if($db->num_rows($query))
1951      {
1952          $table = new Table;
1953          $table->construct_header($lang->setting_groups);
1954  
1955          while($group = $db->fetch_array($query))
1956          {
1957              $group_lang_var = "setting_group_{$group['name']}";
1958              if(isset($lang->$group_lang_var))
1959              {
1960                  $group_title = htmlspecialchars_uni($lang->$group_lang_var);
1961              }
1962              else
1963              {
1964                  $group_title = htmlspecialchars_uni($group['title']);
1965              }
1966  
1967              $group_desc_lang_var = "setting_group_{$group['name']}_desc";
1968              if(isset($lang->$group_desc_lang_var))
1969              {
1970                  $group_desc = htmlspecialchars_uni($lang->$group_desc_lang_var);
1971              }
1972              else
1973              {
1974                  $group_desc = htmlspecialchars_uni($group['description']);
1975              }
1976  
1977              $table->construct_cell("<strong><a href=\"index.php?module=config-settings&amp;action=change&amp;gid={$group['gid']}\">{$group_title}</a></strong> ({$group['settingcount']} {$lang->bbsettings})<br /><small>{$group_desc}</small>");
1978              $table->construct_row();
1979          }
1980  
1981          $table->output($lang->plugin_settings);
1982      }
1983  
1984      echo '</div>';
1985  
1986      echo '
1987  <script type="text/javascript" src="./jscripts/search.js?ver=1821"></script>
1988  <script type="text/javascript">
1989  //<!--
1990  $(function(){
1991      SettingSearch.init("'.$lang->settings_search.'","'.$lang->error_ajax_unknown.'");
1992  });
1993  //-->
1994  </script>';
1995  
1996      print_setting_peekers();
1997      $page->output_footer();
1998  }
1999  
2000  /**
2001   * Print all the peekers for all of the default settings
2002   */
2003  function print_setting_peekers()
2004  {
2005      global $plugins;
2006  
2007      $peekers = array(
2008          'new Peeker($(".setting_boardclosed"), $("#row_setting_boardclosed_reason"), 1, true)',
2009          'new Peeker($(".setting_gzipoutput"), $("#row_setting_gziplevel"), 1, true)',
2010          'new Peeker($(".setting_useerrorhandling"), $("#row_setting_errorlogmedium, #row_setting_errorloglocation"), 1, true)',
2011          'new Peeker($("#setting_subforumsindex"), $("#row_setting_subforumsstatusicons"), /[^0+|]/, false)',
2012          'new Peeker($(".setting_showsimilarthreads"), $("#row_setting_similarityrating, #row_setting_similarlimit"), 1, true)',
2013          'new Peeker($(".setting_disableregs"), $("#row_setting_regtype, #row_setting_securityquestion, #row_setting_regtime, #row_setting_allowmultipleemails, #row_setting_hiddencaptchaimage, #row_setting_betweenregstime"), 0, true)',
2014          'new Peeker($(".setting_hiddencaptchaimage"), $("#row_setting_hiddencaptchaimagefield"), 1, true)',
2015          'new Peeker($("#setting_failedlogincount"), $("#row_setting_failedlogintime, #row_setting_failedlogintext"), /[^0+|]/, false)',
2016          'new Peeker($(".setting_postfloodcheck"), $("#row_setting_postfloodsecs"), 1, true)',
2017          'new Peeker($("#setting_postmergemins"), $("#row_setting_postmergefignore, #row_setting_postmergeuignore, #row_setting_postmergesep"), /[^0+|]/, false)',
2018          'new Peeker($(".setting_enablememberlist"), $("#row_setting_membersperpage, #row_setting_default_memberlist_sortby, #row_setting_default_memberlist_order, #row_setting_memberlistmaxavatarsize"), 1, true)',
2019          'new Peeker($(".setting_enablereputation"), $("#row_setting_repsperpage, #row_setting_posrep, #row_setting_neurep, #row_setting_negrep, #row_setting_postrep, #row_setting_multirep, #row_setting_maxreplength, #row_setting_minreplength"), 1, true)',
2020          'new Peeker($(".setting_enablewarningsystem"), $("#row_setting_allowcustomwarnings, #row_setting_canviewownwarning, #row_setting_maxwarningpoints, #row_setting_allowanonwarningpms"), 1, true)',
2021          'new Peeker($(".setting_enablepms"), $("#row_setting_pmsallowhtml, #row_setting_pmsallowmycode, #row_setting_pmsallowsmilies, #row_setting_pmsallowimgcode, #row_setting_pmsallowvideocode, #row_setting_pmquickreply, #row_setting_pmfloodsecs, #row_setting_showpmip, #row_setting_maxpmquotedepth"), 1, true)',
2022          'new Peeker($(".setting_smilieinserter"), $("#row_setting_smilieinsertertot, #row_setting_smilieinsertercols"), 1, true)',
2023          'new Peeker($("#setting_mail_handler"), $("#row_setting_smtp_host, #row_setting_smtp_port, #row_setting_smtp_user, #row_setting_smtp_pass, #row_setting_secure_smtp"), "smtp", false)',
2024          'new Peeker($("#setting_mail_handler"), $("#row_setting_mail_parameters"), "mail", false)',
2025          'new Peeker($("#setting_captchaimage"), $("#row_setting_recaptchapublickey, #row_setting_recaptchaprivatekey"), /(4|5|8)/, false)',
2026          'new Peeker($("#setting_captchaimage"), $("#row_setting_recaptchascore"), /(8)/, false)',
2027          'new Peeker($("#setting_captchaimage"), $("#row_setting_hcaptchapublickey, #row_setting_hcaptchaprivatekey"), /(6|7)/, false)',
2028          'new Peeker($("#setting_captchaimage"), $("#row_setting_hcaptchaprivatekey, #row_setting_hcaptchaprivatekey"), /(6|7)/, false)',
2029          'new Peeker($("#setting_captchaimage"), $("#row_setting_hcaptchatheme"), 6, false)',
2030          'new Peeker($("#setting_captchaimage"), $("#row_setting_hcaptchasize"), 6, false)',
2031          'new Peeker($("#setting_captchaimage"), $("#row_setting_cfturnstilepublickey, #row_setting_cfturnstileprivatekey"), 9, false)',
2032          'new Peeker($("#setting_captchaimage"), $("#row_setting_cfturnstiletheme"), 9, false)',
2033          'new Peeker($("#setting_captchaimage"), $("#row_setting_cfturnstilesize"), 9, false)',
2034          'new Peeker($(".setting_contact"), $("#row_setting_contact_guests, #row_setting_contact_badwords, #row_setting_contact_maxsubjectlength, #row_setting_contact_minmessagelength, #row_setting_contact_maxmessagelength"), 1, true)',
2035          'new Peeker($(".setting_enablepruning"), $("#row_setting_enableprunebyposts, #row_setting_pruneunactived, #row_setting_prunethreads"), 1, true)',
2036          'new Peeker($(".setting_enableprunebyposts"), $("#row_setting_prunepostcount, #row_setting_dayspruneregistered, #row_setting_prunepostcountall"), 1, true)',
2037          'new Peeker($(".setting_pruneunactived"), $("#row_setting_dayspruneunactivated"), 1, true)',
2038          'new Peeker($(".setting_statsenabled"), $("#row_setting_statscachetime, #row_setting_statslimit, #row_setting_statstopreferrer"), 1, true)',
2039          'new Peeker($(".setting_purgespammergroups_forums_groups_check"), $("#row_setting_purgespammerpostlimit, #row_setting_purgespammerbandelete, #row_setting_purgespammerapikey"), /^(?!none)/, true)',
2040          'new Peeker($(".setting_purgespammerbandelete"),$("#row_setting_purgespammerbangroup, #row_setting_purgespammerbanreason"), "ban", true)',
2041          'new Peeker($("#setting_maxloginattempts"), $("#row_setting_loginattemptstimeout"), /[^0+|]/, false)',
2042          'new Peeker($(".setting_bbcodeinserter"), $("#row_setting_partialmode, #row_setting_smilieinserter"), 1, true)',
2043          'new Peeker($(".setting_portal"), $("#row_setting_portal_announcementsfid, #row_setting_portal_showwelcome, #row_setting_portal_showpms, #row_setting_portal_showstats, #row_setting_portal_showwol, #row_setting_portal_showsearch, #row_setting_portal_showdiscussions"), 1, true)',
2044          'new Peeker($(".setting_portal_announcementsfid_forums_groups_check"), $("#row_setting_portal_numannouncements"), /^(?!none)/, true)',
2045          'new Peeker($(".setting_portal_showdiscussions"), $("#row_setting_portal_showdiscussionsnum, #row_setting_portal_excludediscussion"), 1, true)',
2046          'new Peeker($(".setting_enableattachments"), $("#row_setting_maxattachments, #row_setting_attachthumbnails"), 1, true)',
2047          'new Peeker($(".setting_attachthumbnails"), $("#row_setting_attachthumbh, #row_setting_attachthumbw"), "yes", true)',
2048          'new Peeker($(".setting_showbirthdays"), $("#row_setting_showbirthdayspostlimit"), 1, true)',
2049          'new Peeker($("#setting_betweenregstime"), $("#row_setting_maxregsbetweentime"), /[^0+|]/, false)',
2050          'new Peeker($(".setting_usecdn"), $("#row_setting_cdnurl, #row_setting_cdnpath"), 1, true)',
2051          'new Peeker($("#setting_errorlogmedium"), $("#row_setting_errorloglocation"), /^(log|both)/, false)',
2052          'new Peeker($(".setting_sigmycode"), $("#row_setting_sigcountmycode, #row_setting_sigimgcode"), 1, true)',
2053          'new Peeker($(".setting_pmsallowmycode"), $("#row_setting_pmsallowimgcode, #row_setting_pmsallowvideocode"), 1, true)',
2054          'new Peeker($(".setting_enableshowteam"), $("#row_setting_showaddlgroups, #row_setting_showgroupleaders"), 1, true)',
2055          'new Peeker($(".setting_usereferrals"), $("#row_setting_referralsperpage"), 1, true)',
2056      );
2057  
2058      $peekers = $plugins->run_hooks("admin_settings_print_peekers", $peekers);
2059  
2060      $setting_peekers = implode("\n            ", $peekers);
2061  
2062      echo '<script type="text/javascript" src="./jscripts/peeker.js?ver=1821"></script>
2063      <script type="text/javascript">
2064          $(function() {
2065              ' . $setting_peekers . '
2066          });
2067      </script>';
2068  }


2005 - 2021 © MyBB.de | Alle Rechte vorbehalten! | Sponsor: netcup Cross-referenced by PHPXref