ConfigGenerator.php 5.5 KB

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