X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=plugins%2Fmod_http_files.lua;h=bdc3a01144959d92cbacac9b112484dca20cd94a;hb=d631eea82c5144b9c2142b32affdb0ba4f878a43;hp=437633e7bc23e19c5826fb995c4ac5ab7b023355;hpb=3b635da220bdbe28712f7007be430eb6e1283912;p=prosody.git diff --git a/plugins/mod_http_files.lua b/plugins/mod_http_files.lua index 437633e7..bdc3a011 100644 --- a/plugins/mod_http_files.lua +++ b/plugins/mod_http_files.lua @@ -12,11 +12,7 @@ local lfs = require "lfs"; local open = io.open; local stat = lfs.attributes; -local http_base = module:get_option_string("http_path", "www_files"); - -local response_400 = "

Bad Request

Sorry, we didn't understand your request :("; -local response_403 = "

Forbidden

You don't have permission to view the contents of this directory :("; -local response_404 = "

Page Not Found

Sorry, we couldn't find what you were looking for :("; +local http_base = module:get_option_string("http_files_dir", module:get_option_string("http_path", "www_files")); -- TODO: Should we read this from /etc/mime.types if it exists? (startup time...?) local mime_map = { @@ -29,49 +25,31 @@ local mime_map = { css = "text/css"; }; -local function preprocess_path(path) - if path:sub(1,1) ~= "/" then - path = "/"..path; - end - local level = 0; - for component in path:gmatch("([^/]+)/") do - if component == ".." then - level = level - 1; - elseif component ~= "." then - level = level + 1; - end - if level < 0 then - return nil; - end - end - return path; -end - function serve_file(event, path) local response = event.response; - path = path and preprocess_path(path); - if not path then - response.status = 400; - return response:send(response_400); - end - local full_path = http_base..path; + local orig_path = event.request.path; + local full_path = http_base.."/"..path; if stat(full_path, "mode") == "directory" then - if stat(full_path.."/index.html", "mode") == "file" then - return serve_file(event, path.."/index.html"); + if full_path:sub(-1) ~= "/" then + response.headers.location = orig_path.."/"; + return 301; end - response.status = 403; - return response:send(response_403); + if stat(full_path.."index.html", "mode") == "file" then + return serve_file(event, path.."index.html"); + end + + -- TODO File listing + return 403; end local f, err = open(full_path, "rb"); if not f then - response.status = 404; - return response:send(response_404.."
"..tostring(err)); + module:log("warn", "Failed to open file: %s", err); + return 404; end local data = f:read("*a"); f:close(); if not data then - response.status = 403; - return response:send(response_403); + return 403; end local ext = path:match("%.([^.]*)$"); response.headers.content_type = mime_map[ext]; -- Content-Type should be nil when not known @@ -80,7 +58,7 @@ end module:provides("http", { route = { - ["/*"] = serve_file; + ["GET /*"] = serve_file; }; });