aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2012-12-11 23:40:30 +0100
committerKim Alvefur <zash@zash.se>2012-12-11 23:40:30 +0100
commitb1a53ef20d19985ca866feb386e63cc8282828b0 (patch)
tree01480064b551797a731a1c5e9711d20bace32942
parente33b0e3602ed44b47bddc3122915eb7a5eef874c (diff)
downloadprosody-b1a53ef20d19985ca866feb386e63cc8282828b0.tar.gz
prosody-b1a53ef20d19985ca866feb386e63cc8282828b0.zip
mod_http_files: Generate simple directory index.
-rw-r--r--plugins/mod_http_files.lua25
1 files changed, 23 insertions, 2 deletions
diff --git a/plugins/mod_http_files.lua b/plugins/mod_http_files.lua
index f4246fd5..764991b8 100644
--- a/plugins/mod_http_files.lua
+++ b/plugins/mod_http_files.lua
@@ -15,6 +15,7 @@ local stat = lfs.attributes;
local http_base = module:get_option_string("http_files_dir", module:get_option_string("http_path", "www_files"));
local dir_indices = module:get_option("http_files_index", { "index.html", "index.htm" });
+local show_file_list = module:get_option_boolean("http_files_show_list");
local mime_map = module:shared("mime").types;
if not mime_map then
@@ -79,8 +80,28 @@ function serve_file(event, path)
end
end
- -- TODO File listing
- return 403;
+ if not show_file_list then
+ return 403;
+ else
+ local html = require"util.stanza".stanza("html")
+ :tag("head"):tag("title"):text(path):up()
+ :tag("meta", { charset="utf-8" }):up()
+ :up()
+ :tag("body"):tag("h1"):text(path):up()
+ :tag("ul");
+ for file in lfs.dir(full_path) do
+ if file:sub(1,1) ~= "." then
+ local attr = stat(full_path..file) or {};
+ html:tag("li", { class = attr.mode })
+ :tag("a", { href = file }):text(file)
+ :up():up();
+ end
+ end
+ data = "<!DOCTYPE html>\n"..tostring(html);
+ cache[path] = { data = html, content_type = mime_map.html; hits = 0 };
+ response.headers.content_type = mime_map.html;
+ end
+
else
local f = open(full_path, "rb");
data = f and f:read("*a");