PageRenderTime 49ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/setup/lib/ConfigGenerator.php

https://gitlab.com/trungthao379/phpmyadmin
PHP | 182 lines | 112 code | 12 blank | 58 comment | 16 complexity | 4f10ae2723c3ccb3e519f89b698336a5 MD5 | raw file
  1. <?php
  2. /* vim: set expandtab sw=4 ts=4 sts=4: */
  3. /**
  4. * Config file generator
  5. *
  6. * @package PhpMyAdmin-Setup
  7. */
  8. namespace PMA\setup\lib;
  9. use PMA\libraries\config\ConfigFile;
  10. /**
  11. * Config file generation class
  12. *
  13. * @package PhpMyAdmin
  14. */
  15. class ConfigGenerator
  16. {
  17. /**
  18. * Creates config file
  19. *
  20. * @param ConfigFile $cf Config file instance
  21. *
  22. * @return string
  23. */
  24. public static function getConfigFile(ConfigFile $cf)
  25. {
  26. $crlf = (isset($_SESSION['eol']) && $_SESSION['eol'] == 'win')
  27. ? "\r\n"
  28. : "\n";
  29. $conf = $cf->getConfig();
  30. // header
  31. $ret = '<?php' . $crlf
  32. . '/*' . $crlf
  33. . ' * Generated configuration file' . $crlf
  34. . ' * Generated by: phpMyAdmin '
  35. . $GLOBALS['PMA_Config']->get('PMA_VERSION')
  36. . ' setup script' . $crlf
  37. . ' * Date: ' . date(DATE_RFC1123) . $crlf
  38. . ' */' . $crlf . $crlf;
  39. //servers
  40. if (! empty($conf['Servers'])) {
  41. $ret .= self::getServerPart($cf, $crlf, $conf['Servers']);
  42. unset($conf['Servers']);
  43. }
  44. // other settings
  45. $persistKeys = $cf->getPersistKeysMap();
  46. foreach ($conf as $k => $v) {
  47. $k = preg_replace('/[^A-Za-z0-9_]/', '_', $k);
  48. $ret .= self::_getVarExport($k, $v, $crlf);
  49. if (isset($persistKeys[$k])) {
  50. unset($persistKeys[$k]);
  51. }
  52. }
  53. // keep 1d array keys which are present in $persist_keys (config.values.php)
  54. foreach (array_keys($persistKeys) as $k) {
  55. if (mb_strpos($k, '/') === false) {
  56. $k = preg_replace('/[^A-Za-z0-9_]/', '_', $k);
  57. $ret .= self::_getVarExport($k, $cf->getDefault($k), $crlf);
  58. }
  59. }
  60. $ret .= '?' . '>';
  61. return $ret;
  62. }
  63. /**
  64. * Returns exported configuration variable
  65. *
  66. * @param string $var_name configuration name
  67. * @param mixed $var_value configuration value(s)
  68. * @param string $crlf line ending
  69. *
  70. * @return string
  71. */
  72. private static function _getVarExport($var_name, $var_value, $crlf)
  73. {
  74. if (!is_array($var_value) || empty($var_value)) {
  75. return "\$cfg['$var_name'] = "
  76. . var_export($var_value, true) . ';' . $crlf;
  77. }
  78. $ret = '';
  79. if (self::_isZeroBasedArray($var_value)) {
  80. $ret = "\$cfg['$var_name'] = "
  81. . self::_exportZeroBasedArray($var_value, $crlf)
  82. . ';' . $crlf;
  83. } else {
  84. // string keys: $cfg[key][subkey] = value
  85. foreach ($var_value as $k => $v) {
  86. $k = preg_replace('/[^A-Za-z0-9_]/', '_', $k);
  87. $ret .= "\$cfg['$var_name']['$k'] = "
  88. . var_export($v, true) . ';' . $crlf;
  89. }
  90. }
  91. return $ret;
  92. }
  93. /**
  94. * Check whether $array is a continuous 0-based array
  95. *
  96. * @param array $array Array to check
  97. *
  98. * @return boolean
  99. */
  100. private static function _isZeroBasedArray(array $array)
  101. {
  102. for ($i = 0, $nb = count($array); $i < $nb; $i++) {
  103. if (! isset($array[$i])) {
  104. return false;
  105. }
  106. }
  107. return true;
  108. }
  109. /**
  110. * Exports continuous 0-based array
  111. *
  112. * @param array $array Array to export
  113. * @param string $crlf Newline string
  114. *
  115. * @return string
  116. */
  117. private static function _exportZeroBasedArray(array $array, $crlf)
  118. {
  119. $retv = array();
  120. foreach ($array as $v) {
  121. $retv[] = var_export($v, true);
  122. }
  123. $ret = "array(";
  124. if (count($retv) <= 4) {
  125. // up to 4 values - one line
  126. $ret .= implode(', ', $retv);
  127. } else {
  128. // more than 4 values - value per line
  129. $imax = count($retv);
  130. for ($i = 0; $i < $imax; $i++) {
  131. $ret .= ($i > 0 ? ',' : '') . $crlf . ' ' . $retv[$i];
  132. }
  133. }
  134. $ret .= ')';
  135. return $ret;
  136. }
  137. /**
  138. * Generate server part of config file
  139. *
  140. * @param ConfigFile $cf Config file
  141. * @param string $crlf Carriage return char
  142. * @param array $servers Servers list
  143. *
  144. * @return string
  145. */
  146. protected static function getServerPart(ConfigFile $cf, $crlf, $servers)
  147. {
  148. if ($cf->getServerCount() === 0) {
  149. return null;
  150. }
  151. $ret = "/* Servers configuration */$crlf\$i = 0;" . $crlf . $crlf;
  152. foreach ($servers as $id => $server) {
  153. $ret .= '/* Server: '
  154. . strtr($cf->getServerName($id) . " [$id] ", '*/', '-')
  155. . "*/" . $crlf
  156. . '$i++;' . $crlf;
  157. foreach ($server as $k => $v) {
  158. $k = preg_replace('/[^A-Za-z0-9_]/', '_', $k);
  159. $ret .= "\$cfg['Servers'][\$i]['$k'] = "
  160. . (is_array($v) && self::_isZeroBasedArray($v)
  161. ? self::_exportZeroBasedArray($v, $crlf)
  162. : var_export($v, true))
  163. . ';' . $crlf;
  164. }
  165. $ret .= $crlf;
  166. }
  167. $ret .= '/* End of servers configuration */' . $crlf . $crlf;
  168. return $ret;
  169. }
  170. }