/** * Test for ConfigFile::getServerCount * * @return void * @test */ public function testGetServerCount() { $this->object->set('Servers/1/x', 1); $this->object->set('Servers/2/x', 2); $this->object->set('Servers/3/x', 3); $this->object->set('Servers/4/x', 4); $this->object->set('ServerDefault', 3); $this->assertEquals( 4, $this->object->getServerCount() ); $this->object->removeServer(2); $this->object->removeServer(2); $this->assertEquals( 2, $this->object->getServerCount() ); $this->assertLessThanOrEqual( 2, $this->object->get('ServerDefault') ); $this->assertEquals( array('Servers' => array(1 => array('x' => 1), 2 => array('x' => 4))), $this->object->getConfig() ); $this->assertEquals( array('Servers/1/x' => 1, 'Servers/2/x' => 4), $this->object->getConfigArray() ); }
/** * Creates config file * * @param ConfigFile $cf Config file instance * * @return string */ public static function getConfigFile(ConfigFile $cf) { $crlf = isset($_SESSION['eol']) && $_SESSION['eol'] == 'win' ? "\r\n" : "\n"; $c = $cf->getConfig(); // header $ret = '<?php' . $crlf . '/*' . $crlf . ' * Generated configuration file' . $crlf . ' * Generated by: phpMyAdmin ' . $GLOBALS['PMA_Config']->get('PMA_VERSION') . ' setup script' . $crlf . ' * Date: ' . date(DATE_RFC1123) . $crlf . ' */' . $crlf . $crlf; // servers if ($cf->getServerCount() > 0) { $ret .= "/* Servers configuration */{$crlf}\$i = 0;" . $crlf . $crlf; foreach ($c['Servers'] as $id => $server) { $ret .= '/* Server: ' . strtr($cf->getServerName($id) . " [{$id}] ", '*/', '-') . "*/" . $crlf . '$i++;' . $crlf; foreach ($server as $k => $v) { $k = preg_replace('/[^A-Za-z0-9_]/', '_', $k); $ret .= "\$cfg['Servers'][\$i]['{$k}'] = " . (is_array($v) && self::_isZeroBasedArray($v) ? self::_exportZeroBasedArray($v, $crlf) : var_export($v, true)) . ';' . $crlf; } $ret .= $crlf; } $ret .= '/* End of servers configuration */' . $crlf . $crlf; } unset($c['Servers']); // other settings $persistKeys = $cf->getPersistKeysMap(); foreach ($c as $k => $v) { $k = preg_replace('/[^A-Za-z0-9_]/', '_', $k); $ret .= self::_getVarExport($k, $v, $crlf); if (isset($persistKeys[$k])) { unset($persistKeys[$k]); } } // keep 1d array keys which are present in $persist_keys (config.values.php) foreach (array_keys($persistKeys) as $k) { if ($GLOBALS['PMA_String']->strpos($k, '/') === false) { $k = preg_replace('/[^A-Za-z0-9_]/', '_', $k); $ret .= self::_getVarExport($k, $cf->getDefault($k), $crlf); } } $ret .= '?' . '>'; return $ret; }
/** * Generate server part of config file * * @param ConfigFile $cf Config file * @param string $crlf Carriage return char * @param array $servers Servers list * * @return string */ protected static function getServerPart(ConfigFile $cf, $crlf, $servers) { if ($cf->getServerCount() === 0) { return null; } $ret = "/* Servers configuration */{$crlf}\$i = 0;" . $crlf . $crlf; foreach ($servers as $id => $server) { $ret .= '/* Server: ' . strtr($cf->getServerName($id) . " [{$id}] ", '*/', '-') . "*/" . $crlf . '$i++;' . $crlf; foreach ($server as $k => $v) { $k = preg_replace('/[^A-Za-z0-9_]/', '_', $k); $ret .= "\$cfg['Servers'][\$i]['{$k}'] = " . (is_array($v) && self::_isZeroBasedArray($v) ? self::_exportZeroBasedArray($v, $crlf) : var_export($v, true)) . ';' . $crlf; } $ret .= $crlf; } $ret .= '/* End of servers configuration */' . $crlf . $crlf; return $ret; }
/** * Validates and saves form data to session * * @param array|string $forms array of form names * @param bool $allow_partial_save allows for partial form saving on * failed validation * * @return boolean true on success (no errors and all saved) */ public function save($forms, $allow_partial_save = true) { $result = true; $forms = (array) $forms; $values = array(); $to_save = array(); $is_setup_script = defined('PMA_SETUP'); if ($is_setup_script) { $this->_loadUserprefsInfo(); } $this->_errors = array(); foreach ($forms as $form_name) { /* @var $form Form */ if (isset($this->_forms[$form_name])) { $form = $this->_forms[$form_name]; } else { continue; } // get current server id $change_index = $form->index === 0 ? $this->_configFile->getServerCount() + 1 : false; // grab POST values foreach ($form->fields as $field => $system_path) { $work_path = array_search($system_path, $this->_systemPaths); $key = $this->_translatedPaths[$work_path]; $type = $form->getOptionType($field); // skip groups if ($type == 'group') { continue; } // ensure the value is set if (!isset($_POST[$key])) { // checkboxes aren't set by browsers if they're off if ($type == 'boolean') { $_POST[$key] = false; } else { $this->_errors[$form->name][] = sprintf(__('Missing data for %s'), '<i>' . PMA_langName($system_path) . '</i>'); $result = false; continue; } } // user preferences allow/disallow if ($is_setup_script && isset($this->_userprefsKeys[$system_path])) { if (isset($this->_userprefsDisallow[$system_path]) && isset($_POST[$key . '-userprefs-allow'])) { unset($this->_userprefsDisallow[$system_path]); } else { if (!isset($_POST[$key . '-userprefs-allow'])) { $this->_userprefsDisallow[$system_path] = true; } } } // cast variables to correct type switch ($type) { case 'double': settype($_POST[$key], 'float'); break; case 'boolean': case 'integer': if ($_POST[$key] !== '') { settype($_POST[$key], $type); } break; case 'select': $successfully_validated = $this->_validateSelect($_POST[$key], $form->getOptionValueList($system_path)); if (!$successfully_validated) { $this->_errors[$work_path][] = __('Incorrect value!'); $result = false; continue; } break; case 'string': case 'short_string': $_POST[$key] = trim($_POST[$key]); break; case 'array': // eliminate empty values and ensure we have an array $post_values = is_array($_POST[$key]) ? $_POST[$key] : explode("\n", $_POST[$key]); $_POST[$key] = array(); $this->_fillPostArrayParameters($post_values, $key); break; } // now we have value with proper type $values[$system_path] = $_POST[$key]; if ($change_index !== false) { $work_path = str_replace("Servers/{$form->index}/", "Servers/{$change_index}/", $work_path); } $to_save[$work_path] = $system_path; } } // save forms if (!$allow_partial_save && !empty($this->_errors)) { // don't look for non-critical errors $this->_validate(); return $result; } foreach ($to_save as $work_path => $path) { // TrustedProxies requires changes before saving if ($path == 'TrustedProxies') { $proxies = array(); $i = 0; foreach ($values[$path] as $value) { $matches = array(); $match = preg_match("/^(.+):(?:[ ]?)(\\w+)\$/", $value, $matches); if ($match) { // correct 'IP: HTTP header' pair $ip = trim($matches[1]); $proxies[$ip] = trim($matches[2]); } else { // save also incorrect values $proxies["-{$i}"] = $value; $i++; } } $values[$path] = $proxies; } $this->_configFile->set($work_path, $values[$path], $path); } if ($is_setup_script) { $this->_configFile->set('UserprefsDisallow', array_keys($this->_userprefsDisallow)); } // don't look for non-critical errors $this->_validate(); return $result; }