+#!/usr/bin/lua
+
+local uci = require "uci"
+local fs = require "nixio.fs"
+local u_c = uci.cursor()
+local basepath = u_c.get("filemanager","config","basedir")
+
+local _M = {}
+
+local bp = basepath:match("(.*)/")
+if bp and bp ~= "" then
+ basepath = bp
+end
+_M.basepath = basepath;
+
+function _M.is_in_dir(file, dir)
+ if file == dir then
+ return true
+ else
+ return file:sub(1, #dir) == dir
+ end
+end
+
+function _M.path_valid(path)
+ return _M.is_in_dir(path,_M.basepath) and fs.access(path,"r")
+end
+
+function _M.dir_path_valid(path)
+ return _M.is_in_dir(path,_M.basepath) and fs.stat(path,"type")=="dir" and fs.access(path,"w")
+end
+
+function _M.new_path_valid(path)
+ local dirpath = fs.dirname(path)
+ return _M.is_in_dir(dirpath,_M.basepath) and fs.access(dirpath,"w")
+end
+
+function _M.make_path(path)
+ local realpath = fs.realpath(_M.basepath..'/'..path)
+ if _M.path_valid(realpath) then
+ return realpath
+ else
+ return nil
+ end
+end
+
+function _M.make_new_path(path)
+ local realpath = fs.realpath(fs.dirname(_M.basepath..'/'..path))..'/'..fs.basename(path)
+ if _M.new_path_valid(realpath) then
+ return realpath
+ else
+ return nil
+ end
+end
+
+function _M.make_dir_path(path)
+ local realpath = fs.realpath(_M.basepath..'/'..path)
+ if _M.dir_path_valid(realpath) then
+ return realpath
+ else
+ return nil
+ end
+end
+
+function _M.rm(item)
+ local ftype = fs.stat(item,"type")
+ if ftype == "reg" then
+ return fs.remove(item)
+ elseif ftype == "dir" then
+ local dir = fs.dir(item)
+ for file in dir do
+ if not _M.rm(item..'/'..file) then
+ return false
+ end
+ end
+ return fs.rmdir(item)
+ else
+ return false
+ end
+end
+
+function _M.chmod(item,mode,recursive)
+ local result = fs.chmod(item,mode)
+ if result and recursive then
+ local dir = fs.dir(item)
+ if dir then
+ for file in dir do
+ local ftype = fs.stat(item..'/'..file,"type")
+ if ftype == "dir" then
+ result = _M.chmod(item..'/'..file,mode,recursive)
+ elseif ftype == "reg" then
+ result = _M.chmod(item..'/'..file,string.gsub(mode,"x","-"),false)
+ end
+ if not result then
+ break
+ end
+ end
+ end
+ end
+ return result
+end
+
+return _M