Добавлена проверка прав, чтобы не пытаться читать недоступный каталог.
[lua-filemanager.git] / www / cgi-bin / fs-download
1 #!/usr/bin/lua
2
3 nixio = require "nixio"
4 fs = require "nixio.fs"
5 uci = require("uci")
6 util = require "luci.util"
7 ltn12 = require "ltn12"
8
9 local function is_in_dir(file, dir)
10   if file == dir then
11     return true
12   else   
13     return file:sub(1, #dir) == dir
14   end  
15 end
16
17 args = {}
18
19 for dummy,param in pairs(util.split(nixio.getenv('QUERY_STRING'),'&')) do
20   val = util.split(param,'=')
21   args[val[1]] = util.urldecode(val[2],true)
22 end
23
24 local u_c = uci.cursor()
25 local basepath = u_c.get("filemanager","config","basedir")
26
27 path = fs.realpath(basepath..'/'..args["path"])
28 if path then
29   file = io.open(path,"rb")
30 else
31   file = nil
32 end  
33
34 if file and is_in_dir(path,basepath) then
35   print("Content-Type: application/octet-stream")
36   print('Content-Disposition: attachment; filename="'..fs.basename(args["path"])..'"')
37   print("\r")
38   ltn12.pump.all(
39     ltn12.source.file(file),
40     ltn12.sink.file(io.stdout)
41   )
42 else
43   print("Status: 404 Not Found")
44   print("Content-Type: text/plain")
45   print("\r")
46   print("File not found")
47 end