FileListing.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <?php
  2. declare(strict_types=1);
  3. namespace PhpMyAdmin;
  4. use function asort;
  5. use function closedir;
  6. use function file_exists;
  7. use function function_exists;
  8. use function is_file;
  9. use function is_link;
  10. use function opendir;
  11. use function preg_match;
  12. use function readdir;
  13. use function substr;
  14. /**
  15. * Functions for listing directories
  16. */
  17. class FileListing
  18. {
  19. /**
  20. * Returns array of filtered file names
  21. *
  22. * @param string $dir directory to list
  23. * @param string $expression regular expression to match files
  24. *
  25. * @return array|bool sorted file list on success, false on failure
  26. */
  27. public function getDirContent(string $dir, string $expression = '')
  28. {
  29. if (! @file_exists($dir)) {
  30. return false;
  31. }
  32. $handle = @opendir($dir);
  33. if ($handle === false) {
  34. return false;
  35. }
  36. $result = [];
  37. if (substr($dir, -1) !== '/') {
  38. $dir .= '/';
  39. }
  40. while ($file = @readdir($handle)) {
  41. if (! @is_file($dir . $file)
  42. || @is_link($dir . $file)
  43. || ($expression != '' && ! preg_match($expression, $file))
  44. ) {
  45. continue;
  46. }
  47. $result[] = $file;
  48. }
  49. closedir($handle);
  50. asort($result);
  51. return $result;
  52. }
  53. /**
  54. * Returns options of filtered file names
  55. *
  56. * @param string $dir directory to list
  57. * @param string $extensions regular expression to match files
  58. * @param string $active currently active choice
  59. *
  60. * @return string|false Html <option> field, false if not files in dir
  61. */
  62. public function getFileSelectOptions(
  63. string $dir,
  64. string $extensions = '',
  65. string $active = ''
  66. ) {
  67. $list = $this->getDirContent($dir, $extensions);
  68. if ($list === false) {
  69. return false;
  70. }
  71. $template = new Template();
  72. return $template->render('file_select_options', [
  73. 'filesList' => $list,
  74. 'active' => $active,
  75. ]);
  76. }
  77. /**
  78. * Get currently supported decompressions.
  79. *
  80. * @return string separated list of extensions usable in getDirContent
  81. */
  82. public function supportedDecompressions(): string
  83. {
  84. global $cfg;
  85. $compressions = '';
  86. if ($cfg['GZipDump'] && function_exists('gzopen')) {
  87. $compressions = 'gz';
  88. }
  89. if ($cfg['BZipDump'] && function_exists('bzopen')) {
  90. if (! empty($compressions)) {
  91. $compressions .= '|';
  92. }
  93. $compressions .= 'bz2';
  94. }
  95. if ($cfg['ZipDump'] && function_exists('gzinflate')) {
  96. if (! empty($compressions)) {
  97. $compressions .= '|';
  98. }
  99. $compressions .= 'zip';
  100. }
  101. return $compressions;
  102. }
  103. }