'ModifyCoreSettings', 'other' => 'ModifyOtherSettings', 'cache' => 'ModifyCacheSettings', ); // By default we're editing the core settings $_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'core'; $context['sub_action'] = $_REQUEST['sa']; // Load up all the tabs... $context['admin_tabs'] = array( 'title' => &$txt[222], 'help' => 'serversettings', 'description' => $txt[347], 'tabs' => array( 'core' => array( 'title' => $txt['core_configuration'], 'href' => $scripturl . '?action=serversettings;sa=core;sesc=' . $context['session_id'], ), 'other' => array( 'title' => $txt['other_configuration'], 'href' => $scripturl . '?action=serversettings;sa=other;sesc=' . $context['session_id'], ), 'cache' => array( 'title' => $txt['caching_settings'], 'href' => $scripturl . '?action=serversettings;sa=cache;sesc=' . $context['session_id'], 'is_last' => true, ), ), ); // Select the right tab based on the sub action. if (isset($context['admin_tabs']['tabs'][$context['sub_action']])) $context['admin_tabs']['tabs'][$context['sub_action']]['is_selected'] = true; // Call the right function for this sub-acton. $subActions[$_REQUEST['sa']](); } // This function basically just redirects to the right save function. function ModifySettings2() { global $context, $txt, $scripturl, $modSettings; isAllowedTo('admin_forum'); // Quick session check... checkSession(); $subActions = array( 'core' => 'ModifyCoreSettings2', 'other' => 'ModifyOtherSettings', 'cache' => 'ModifyCacheSettings', ); // Default to core (I assume) $_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'core'; // Actually call the saving function. $subActions[$_REQUEST['sa']](); } // Basic forum settings - database name, host, etc. function ModifyCoreSettings() { global $scripturl, $context, $settings, $txt, $sc, $boarddir, $func; // Warn the user if the backup of Settings.php failed. $settings_not_writable = !is_writable($boarddir . '/Settings.php'); $settings_backup_fail = !@is_writable($boarddir . '/Settings_bak.php') || !@copy($boarddir . '/Settings.php', $boarddir . '/Settings_bak.php'); /* If you're writing a mod, it's a bad idea to add things here.... For each option: variable name, description, type (constant), size/possible values, helptext. OR an empty string for a horizontal rule. OR a string for a titled section. */ $config_vars = array( array('db_server', &$txt['smf5'], 'text'), array('db_user', &$txt['smf6'], 'text'), array('db_passwd', &$txt['smf7'], 'password'), array('db_name', &$txt['smf8'], 'text'), array('db_prefix', &$txt['smf54'], 'text'), array('db_persist', &$txt['db_persist'], 'check', null, 'db_persist'), array('db_error_send', &$txt['db_error_send'], 'check'), '', array('maintenance', &$txt[348], 'check'), array('mtitle', &$txt['maintenance1'], 'text', 36), array('mmessage', &$txt['maintenance2'], 'text', 36), '', array('mbname', &$txt[350], 'text', 30), array('webmaster_email', &$txt[355], 'text', 30), array('cookiename', &$txt[352], 'text', 20), 'language' => array('language', &$txt['default_language'], 'select', array()), '', array('boardurl', &$txt[351], 'text', 36), array('boarddir', &$txt[356], 'text', 36), array('sourcedir', &$txt[360], 'text', 36), '', ); // Find the available language files. $language_directories = array( $settings['default_theme_dir'] . '/languages', $settings['actual_theme_dir'] . '/languages', ); if (!empty($settings['base_theme_dir'])) $language_directories[] = $settings['base_theme_dir'] . '/languages'; $language_directories = array_unique($language_directories); foreach ($language_directories as $language_dir) { if (!file_exists($language_dir)) continue; $dir = dir($language_dir); while ($entry = $dir->read()) if (preg_match('~^index\.(.+)\.php$~', $entry, $matches)) $config_vars['language'][3][$matches[1]] = array($matches[1], $func['ucwords'](strtr($matches[1], '_', ' '))); $dir->close(); } // Setup the template stuff. $context['post_url'] = $scripturl . '?action=serversettings2;sa=core'; $context['settings_title'] = $txt['core_configuration']; $context['save_disabled'] = $settings_not_writable; if ($settings_not_writable) $context['settings_message'] = '
' . $txt['settings_not_writable'] . '

'; elseif ($settings_backup_fail) $context['settings_message'] = '
' . $txt['smf1'] . '

'; // Fill the config array. $context['config_vars'] = array(); foreach ($config_vars as $config_var) { if (!is_array($config_var)) $context['config_vars'][] = $config_var; else { $varname = $config_var[0]; global $$varname; $context['config_vars'][] = array( 'label' => $config_var[1], 'help' => isset($config_var[4]) ? $config_var[4] : '', 'type' => $config_var[2], 'size' => empty($config_var[3]) ? 0 : $config_var[3], 'data' => isset($config_var[3]) && is_array($config_var[3]) ? $config_var[3] : array(), 'name' => $config_var[0], 'value' => htmlspecialchars($$varname), 'disabled' => $settings_not_writable, ); } } } // Put the core settings in Settings.php. function ModifyCoreSettings2() { global $boarddir, $sc, $cookiename, $modSettings, $user_settings, $sourcedir; global $context; // Strip the slashes off of the post vars. foreach ($_POST as $key => $val) $_POST[$key] = stripslashes__recursive($val); // Fix the darn stupid cookiename! (more may not be allowed, but these for sure!) if (isset($_POST['cookiename'])) $_POST['cookiename'] = preg_replace('~[,;\s\.$]+~' . ($context['utf8'] ? 'u' : ''), '', $_POST['cookiename']); // Fix the forum's URL if necessary. if (substr($_POST['boardurl'], -10) == '/index.php') $_POST['boardurl'] = substr($_POST['boardurl'], 0, -10); elseif (substr($_POST['boardurl'], -1) == '/') $_POST['boardurl'] = substr($_POST['boardurl'], 0, -1); if (substr($_POST['boardurl'], 0, 7) != 'http://' && substr($_POST['boardurl'], 0, 7) != 'file://' && substr($_POST['boardurl'], 0, 8) != 'https://') $_POST['boardurl'] = 'http://' . $_POST['boardurl']; // Any passwords? $config_passwords = array( 'db_passwd', ); // All the strings to write. $config_strs = array( 'mtitle', 'mmessage', 'language', 'mbname', 'boardurl', 'cookiename', 'webmaster_email', 'db_name', 'db_user', 'db_server', 'db_prefix', 'boarddir', 'sourcedir', ); // All the numeric variables. $config_ints = array( ); // All the checkboxes. $config_bools = array( 'db_persist', 'db_error_send', 'maintenance', ); // Now sort everything into a big array, and figure out arrays and etc. $config_vars = array(); foreach ($config_passwords as $config_var) { if (isset($_POST[$config_var][1]) && $_POST[$config_var][0] == $_POST[$config_var][1]) $config_vars[$config_var] = '\'' . addcslashes($_POST[$config_var][0], "'\\") . '\''; } foreach ($config_strs as $config_var) { if (isset($_POST[$config_var])) $config_vars[$config_var] = '\'' . addcslashes($_POST[$config_var], "'\\") . '\''; } foreach ($config_ints as $config_var) { if (isset($_POST[$config_var])) $config_vars[$config_var] = (int) $_POST[$config_var]; } foreach ($config_bools as $key) { if (!empty($_POST[$key])) $config_vars[$key] = '1'; else $config_vars[$key] = '0'; } require_once($sourcedir . '/Admin.php'); updateSettingsFile($config_vars); // If the cookie name was changed, reset the cookie. if (isset($config_vars['cookiename']) && $cookiename != $_POST['cookiename']) { include_once($sourcedir . '/Subs-Auth.php'); $cookiename = $_POST['cookiename']; setLoginCookie(60 * $modSettings['cookieTime'], $user_settings['ID_MEMBER'], sha1($user_settings['passwd'] . $user_settings['passwordSalt'])); redirectexit('action=serversettings;sa=core;sesc=' . $sc, $context['server']['needs_login_fix']); } redirectexit('action=serversettings;sa=core;sesc=' . $sc); } // This function basically edits anything which is configuration and stored in the database, except for caching. function ModifyOtherSettings() { global $context, $scripturl, $txt, $helptxt, $sc, $modSettings; // In later life we may move the setting definitions out of the language files, but for now it's RC2 and I can't be bothered. loadLanguage('ModSettings'); loadLanguage('Help'); // Define the variables we want to edit. $config_vars = array( // SMTP stuff. array('select', 'mail_type', array($txt['mail_type_default'], 'SMTP')), array('text', 'smtp_host'), array('text', 'smtp_port'), array('text', 'smtp_username'), array('password', 'smtp_password'), '', // Cookies... array('int', 'cookieTime'), array('check', 'localCookies'), array('check', 'globalCookies'), '', // Database reapir, optimization, etc. array('int', 'autoOptDatabase'), array('int', 'autoOptMaxOnline'), array('check', 'autoFixDatabase'), '', array('check', 'enableCompressedOutput'), array('check', 'databaseSession_enable'), array('check', 'databaseSession_loose'), array('int', 'databaseSession_lifetime'), ); // Are we saving? if (isset($_GET['save'])) { // Make the SMTP password a little harder to see in a backup etc. if (!empty($_POST['smtp_password'][1])) { $_POST['smtp_password'][0] = base64_encode($_POST['smtp_password'][0]); $_POST['smtp_password'][1] = base64_encode($_POST['smtp_password'][1]); } saveDBSettings($config_vars); redirectexit('action=serversettings;sa=other;sesc=' . $sc); } $context['post_url'] = $scripturl . '?action=serversettings2;save;sa=other'; $context['settings_title'] = $txt['other_configuration']; // Prepare the template. prepareDBSettingContext($config_vars); } // Simply modifying cache functions function ModifyCacheSettings() { global $context, $scripturl, $txt, $helptxt, $sc, $modSettings; // Cache information is in here, honest. loadLanguage('ModSettings'); loadLanguage('Help'); // Define the variables we want to edit. $config_vars = array( // Only a couple of settings, but they are important array('select', 'cache_enable', array($txt['cache_off'], $txt['cache_level1'], $txt['cache_level2'], $txt['cache_level3'])), array('text', 'cache_memcached'), ); // Saving again? if (isset($_GET['save'])) { saveDBSettings($config_vars); redirectexit('action=serversettings;sa=cache;sesc=' . $sc); } $context['post_url'] = $scripturl . '?action=serversettings2;save;sa=cache'; $context['settings_title'] = $txt['caching_settings']; $context['settings_message'] = $txt['caching_information']; // Detect an optimizer? if (function_exists('eaccelerator_put')) $detected = 'eAccelerator'; elseif (function_exists('mmcache_put')) $detected = 'MMCache'; elseif (function_exists('apc_store')) $detected = 'APC'; elseif (function_exists('output_cache_put')) $detected = 'Zend'; elseif (function_exists('memcache_set')) $detected = 'Memcached'; else $detected = 'no_caching'; $context['settings_message'] = sprintf($context['settings_message'], $txt['detected_' . $detected]); // Prepare the template. prepareDBSettingContext($config_vars); } // Helper function, it sets up the context for database settings. function prepareDBSettingContext(&$config_vars) { global $txt, $helptxt, $context, $modSettings; $context['config_vars'] = array(); foreach ($config_vars as $config_var) { if (!is_array($config_var) || !isset($config_var[1])) $context['config_vars'][] = $config_var; else { $context['config_vars'][$config_var[1]] = array( 'label' => isset($txt[$config_var[1]]) ? $txt[$config_var[1]] : (isset($config_var[3]) && !is_array($config_var[3]) ? $config_var[3] : ''), 'help' => isset($helptxt[$config_var[1]]) ? $config_var[1] : '', 'type' => $config_var[0], 'size' => !empty($config_var[2]) && !is_array($config_var[2]) ? $config_var[2] : (in_array($config_var[0], array('int', 'float')) ? 6 : 0), 'data' => array(), 'name' => $config_var[1], 'value' => isset($modSettings[$config_var[1]]) ? htmlspecialchars($modSettings[$config_var[1]]) : '', 'disabled' => false, ); // If this is a select box handle any data. if (!empty($config_var[2]) && is_array($config_var[2])) { // If it's associative if (isset($config_var[2][0]) && is_array($config_var[2][0])) $context['config_vars'][$config_var[1]]['data'] = $config_var[2]; else { foreach ($config_var[2] as $key => $item) $context['config_vars'][$config_var[1]]['data'][] = array($key, $item); } } } } } // Helper function for saving database settings. function saveDBSettings(&$config_vars) { foreach ($config_vars as $var) { if (!isset($var[1]) || !isset($_POST[$var[1]])) continue; // Checkboxes! elseif ($var[0] == 'check') $setArray[$var[1]] = !empty($_POST[$var[1]]) ? '1' : '0'; // Select boxes! elseif ($var[0] == 'select' && in_array($_POST[$var[1]], array_keys($var[2]))) $setArray[$var[1]] = $_POST[$var[1]]; // Integers! elseif ($var[0] == 'int') $setArray[$var[1]] = (int) $_POST[$var[1]]; // Floating point! elseif ($var[0] == 'float') $setArray[$var[1]] = (float) $_POST[$var[1]]; // Text! elseif ($var[0] == 'text' || $var[0] == 'large_text') $setArray[$var[1]] = $_POST[$var[1]]; // Passwords! elseif ($var[0] == 'password') { if (isset($_POST[$var[1]][1]) && $_POST[$var[1]][0] == $_POST[$var[1]][1]) $setArray[$var[1]] = $_POST[$var[1]][0]; } } updateSettings($setArray); } ?>