#!/usr/bin/lua

nixio = require "nixio"
fs = require "nixio.fs"
uci = require("uci")
util = require "luci.util"
ltn12 = require "ltn12"

local function is_in_dir(file, dir)
  if file == dir then
    return true
  else   
    return file:sub(1, #dir) == dir
  end  
end

args = {}

for dummy,param in pairs(util.split(nixio.getenv('QUERY_STRING'),'&')) do
  val = util.split(param,'=')
  args[val[1]] = util.urldecode(val[2],true)
end

local u_c = uci.cursor()
local basepath = u_c.get("filemanager","config","basedir")

path = fs.realpath(basepath..'/'..args["path"])
if path then
  file = io.open(path,"rb")
else
  file = nil
end  

if file and is_in_dir(path,basepath) then
  print("Content-Type: application/octet-stream")
  print('Content-Disposition: attachment; filename="'..fs.basename(args["path"])..'"')
  print("\r")
  ltn12.pump.all(
    ltn12.source.file(file),
    ltn12.sink.file(io.stdout)
  )
else
  print("Status: 404 Not Found")
  print("Content-Type: text/plain")
  print("\r")
  print("File not found")
end