| 0 | 1 <?php | 
| 4 | 2   // Required for strftime(). Set to UTC because :internet:. | 
| 2 | 3   date_default_timezone_set('UTC'); | 
| 4 | 4 | 
|  | 5   // $path: actual requested path, with $alias_prefix removed, relative to $root. | 
|  | 6   $path = $_SERVER["REQUEST_URI"]; | 
|  | 7   $query_string_start = strpos($path, "?"); | 
|  | 8   if ($query_string_start !== false) { | 
|  | 9     $path = substr($path, 0, $query_string_start); | 
|  | 10   } | 
|  | 11   $path = urldecode($path); | 
|  | 12 | 
|  | 13   $prefix = $_SERVER["DL_PREFIX"]; | 
|  | 14 | 
|  | 15   $path = substr($path, strlen(utf8_decode($prefix))); | 
|  | 16   if ($path === false) { $path = "/"; } | 
|  | 17 | 
|  | 18   // root of directory listing. | 
|  | 19   $root = $_SERVER["DL_ROOT"]; | 
|  | 20   if ($root === "") { $root = $_SERVER["DOCUMENT_ROOT"]; } | 
|  | 21 | 
|  | 22   // current directory being listed. | 
|  | 23   $current_dir = $root . $path; | 
|  | 24 | 
|  | 25   if (realpath($root . $path) === false) { | 
|  | 26     header("HTTP/1.0 404 Not Found"); | 
|  | 27   } elseif (substr($current_dir, -1) !== "/") { | 
|  | 28     header("Location: " . $path . "/", false, 301); | 
|  | 29   } | 
|  | 30 | 
|  | 31   if (http_response_code() !== 200) { exit; } | 
|  | 32 | 
|  | 33   // $link_prefix = "/"; | 
|  | 34   // $link_base = rtrim(preg_replace("#/+#", "/", urldecode($_ENV["REQUEST_URI"])),'/'); | 
|  | 35   // $link_path = substr($link_base,strlen(utf8_decode($link_prefix))); | 
|  | 36   // $path = realpath("$wwwroot/".$link_path); | 
|  | 37   // if (!$path) { die("fail"); } | 
|  | 38 | 
|  | 39   $dir_handle = @opendir($root . $path); | 
| 2 | 40   $files = array(); | 
|  | 41   $dirs = array(); | 
| 4 | 42   while (($file = readdir($dir_handle)) !== false) { | 
|  | 43     if ($file === "." or $file === "..") { continue; } | 
|  | 44     elseif (is_dir($root . $path . $file)) { $dirs[] = $file; } | 
| 2 | 45     else { $files[] = $file; } | 
|  | 46   } | 
|  | 47   sort($files); | 
|  | 48   sort($dirs); | 
| 4 | 49 | 
|  | 50   // BEGIN UTILITY | 
|  | 51   function h($string) { return htmlspecialchars($string, ENT_QUOTES, "UTF-8"); } | 
| 2 | 52   function a($string) { return preg_replace("#(%2F)+#", "/", rawurlencode($string)); } | 
| 4 | 53   function link_to($target, $title) { return('<a href="' . a($target) . '">' . h($title) . "</a>"); } | 
| 3 | 54 | 
| 4 | 55   function human_size($size) { | 
|  | 56     $thousand_units = array("ko", "Mo", "Go", "To", "Po"); | 
| 3 | 57 | 
|  | 58     $return_format = "%d %s"; | 
|  | 59 | 
|  | 60     if ($size <= 1) { | 
|  | 61       $return_unit = "octet"; | 
| 4 | 62     } elseif ($size < 1000) { | 
| 3 | 63       $return_unit = "octets"; | 
|  | 64     } else { | 
|  | 65       $size /= 1000; | 
|  | 66       for ($i = 0; $size >= 1000 && $i < count($thousand_units); $i++) { $size /= 1000; } | 
|  | 67       $return_format = "%.2f %s"; | 
|  | 68       $return_unit = $thousand_units[$i]; | 
|  | 69     } | 
|  | 70     return sprintf($return_format, $size, $return_unit); | 
| 2 | 71   } | 
| 4 | 72   // END UTILITY | 
|  | 73 | 
|  | 74   function tree_link() { | 
|  | 75     global $path, $prefix; | 
|  | 76 | 
|  | 77     $path_array = explode("/", trim($path, "/")); | 
|  | 78     array_unshift($path_array, trim($prefix, "/")); | 
|  | 79 | 
|  | 80     $tree_path = "/"; | 
|  | 81     $tree_link = link_to($tree_path, "[root]") . "/"; | 
|  | 82 | 
|  | 83     foreach ($path_array as $p) { | 
|  | 84       if ($p === "") { continue; } | 
|  | 85       $tree_path .= $p . "/"; | 
|  | 86       $tree_link .= link_to($tree_path, $p) . "/"; | 
|  | 87     } | 
|  | 88 | 
|  | 89     return $tree_link; | 
|  | 90   } | 
| 3 | 91 | 
| 2 | 92   function file_rows($files, $is_dir) { | 
| 4 | 93     global $path, $root, $prefix; | 
| 3 | 94 | 
| 2 | 95     $file_rows = ""; | 
| 4 | 96     $file_suffix = ""; | 
|  | 97 | 
| 2 | 98     if ($is_dir) { | 
|  | 99       $file_suffix = "/"; | 
| 4 | 100 | 
|  | 101       if ($path !== "/") { | 
|  | 102         $file_rows .= "<tr><td colspan=3>" . link_to(dirname($prefix . $path) . "/", "..") . "</td></tr>"; | 
| 2 | 103       } | 
| 4 | 104     } | 
| 3 | 105 | 
| 2 | 106     foreach($files as $file) { | 
| 4 | 107       $file_stat = stat($root . $path . "/". $file); | 
| 3 | 108 | 
|  | 109       $file_rows .= "<tr>"; | 
| 4 | 110       $file_rows .= "<td>".link_to($file . $file_suffix, $file . $file_suffix)."</td>"; | 
| 3 | 111 | 
|  | 112       $file_rows .= "<td>"; | 
| 2 | 113       if ($is_dir) { $file_rows .= "[dir]"; } | 
| 4 | 114       else { $file_rows .= human_size($file_stat['size']); } | 
| 3 | 115       $file_rows .= "</td>"; | 
|  | 116 | 
|  | 117       $file_rows .= "<td>".h(strftime("%Y-%m-%d %H:%M %Z", $file_stat['mtime']))."</td>"; | 
|  | 118 | 
| 2 | 119       $file_rows .= "</tr>"; | 
|  | 120     } | 
|  | 121     return $file_rows; | 
|  | 122   } | 
| 0 | 123 ?> | 
| 3 | 124 <?php header('Content-Type: text/html; charset=utf-8'); ?> | 
|  | 125 <!doctype html> | 
|  | 126 <head> | 
|  | 127   <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> | 
| 4 | 128   <title>Index of <?php echo h($prefix . $path); ?></title> | 
| 3 | 129   <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> | 
|  | 130   <style type="text/css"> | 
|  | 131     * { box-sizing: border-box; } | 
|  | 132     body { | 
|  | 133       font-family: Segoe UI, sans-serif; | 
|  | 134       font-size: 14px; | 
|  | 135     } | 
|  | 136     h1 { margin: 5px; } | 
|  | 137     table { | 
|  | 138       width: 100%; | 
|  | 139     } | 
|  | 140     th:first-child, td:first-child { | 
|  | 141       width: 100%; | 
|  | 142       white-space: pre-wrap; | 
|  | 143       word-wrap: break-word; | 
|  | 144       word-break: break-all; | 
|  | 145     } | 
|  | 146     tr { | 
|  | 147       position: relative; | 
|  | 148     } | 
|  | 149     th, td { | 
|  | 150       white-space: nowrap; | 
|  | 151       padding: 2px 5px; | 
|  | 152     } | 
|  | 153 | 
|  | 154     @media (min-width: 768px) { | 
|  | 155       th { background: #ccc; } | 
|  | 156       tr:nth-child(even) { background: #eee; } | 
|  | 157       tr:hover { background: #ddd; } | 
|  | 158     } | 
|  | 159 | 
|  | 160     @media (max-width: 767px) { | 
|  | 161       table { | 
|  | 162         border-spacing: 0 10px; | 
|  | 163       } | 
|  | 164       th { display: none; } | 
|  | 165       tr { | 
|  | 166         background: #eee; | 
|  | 167       } | 
|  | 168       td { | 
|  | 169         display: inline-block; | 
|  | 170       } | 
|  | 171       td:first-child { | 
|  | 172         background: #ddd; | 
|  | 173         padding: 5px; | 
|  | 174       } | 
|  | 175       table a { | 
|  | 176         font-size: 18px; | 
|  | 177         display: block; | 
|  | 178       } | 
|  | 179     } | 
|  | 180   </style> | 
|  | 181 </head> | 
|  | 182 <body> | 
| 4 | 183   <h1>Index of <?php echo tree_link(); ?></h1> | 
| 3 | 184 | 
|  | 185   <table> | 
|  | 186     <thead><tr> | 
|  | 187       <th>File</th> | 
|  | 188       <th>Size</th> | 
|  | 189       <th>Date</th> | 
|  | 190     </tr></thead> | 
|  | 191     <tbody> | 
|  | 192       <?php echo file_rows($dirs, true); ?> | 
|  | 193       <?php echo file_rows($files, false); ?> | 
|  | 194     </tbody> | 
|  | 195   </table> | 
| 4 | 196 | 
|  | 197   <footer> | 
|  | 198     <hr> | 
|  | 199     <em> | 
|  | 200       Running <a href="https://bitbucket.org/edogawaconan/dirlist-php">dirlist-php</a>. | 
|  | 201       Powered by PHP <?php echo phpversion(); ?>. | 
|  | 202     </em> | 
| 3 | 203 </body> |