ConfigGenerator.php 5.3 KB

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