PageRenderTime 42ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/libraries/classes/Setup/ConfigGenerator.php

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