local args=... local vfs = require("vfs") local DLCMD="wget --no-check-certificate -O" if not args then args = REQUEST end local result = function(data) return { error = false, result = data } end local error = function(data) return { error = data, result = false } end local handle = {} handle.token = function(data) local file = vfs.ospath(data.file) local stat = ulib.file_stat(file) local ret = { sid = "sessionid="..SESSION.sessionid, key = std.sha1(file..":"..stat.mtime) } return result(ret) end handle.history = function(data) local file = vfs.ospath(data.file) local history_file = vfs.ospath("home://.office/"..std.sha1(file).."/history.json") if(ulib.exists(history_file)) then local obj = JSON.decodeFile(history_file) obj.hash = std.sha1(file) return result(obj) else return error("No history found") end end handle.clean_up_version = function(basepath, h,v) if not h then return nil end if h.version == v then return h else --delete this version local cmd = 'rm '..basepath.."/"..h.key.."*" print(cmd) os.execute(cmd) if h.previous then return handle.clean_up_version(basepath, h.previous,v) else return nil end end end handle.restore = function(data) local version = data.version local file = vfs.ospath(data.file) local basepath = vfs.ospath("home://.office/"..std.sha1(file)) if ulib.exists(basepath.."/history.json") then local history = JSON.decodeFile(basepath.."/history.json") local obj = handle.clean_up_version(basepath, history,version) if obj then -- restore the file local cmd = 'cp '..basepath.."/"..obj.key..' "'..file..'"' os.execute(cmd) local cmd = 'rm '..basepath.."/"..obj.key os.execute(cmd) local f = io.open(basepath.."/history.json", "w") if f then f:write(JSON.encode(obj)) f:close() return result("File restored") else return error("Cannot save history") end else local cmd = "rm "..basepath.."/history.json" os.execute(cmd) return result("File restored") end else return error("Unable to restore: no history meta-data found") end end handle.duplicate = function(data) local file = vfs.ospath(data.as) local tmpfile = "/tmp/"..std.sha1(file) local cmd = DLCMD.." "..tmpfile..' "'..data.remote..'"' os.execute(cmd) -- move file to correct position if ulib.exists(tmpfile) then cmd = "mv "..tmpfile.." "..file os.execute(cmd) print("File "..file.." is duplicated with remote") else return error("Unable to duplicate file") end return result("File duplicated") end handle.save = function() --print(JSON.encode(REQUEST)) if not REQUEST.json then return error("Invalid request") end local data = JSON.decodeString(REQUEST.json) if not data then return error("Invalid request") end if not REQUEST.file then return error("No file found") end local file = vfs.ospath(REQUEST.file) if data.status == 2 then local tmpfile = "/tmp/"..std.sha1(file) local cmd = DLCMD.." "..tmpfile..' "'..data.url..'"' os.execute(cmd) -- move file to correct position if ulib.exists(tmpfile) then -- back up the file version local history_dir = "home://.office" vfs.mkdir(history_dir) history_dir = history_dir.."/"..std.sha1(file) vfs.mkdir(history_dir) history_dir = vfs.ospath(history_dir) -- backup old version cmd = 'cp "'..file..'" "'..history_dir.."/"..data.key..'"' os.execute(cmd) -- create new version local old_stat = ulib.file_stat(file) cmd = 'mv "'..tmpfile..'" "'..file..'"' os.execute(cmd) -- get the new key local stat = ulib.file_stat(file) local new_key = std.sha1(file..":"..stat.mtime) -- save changes if(data.changesurl) then cmd = DLCMD.." "..history_dir.."/"..new_key..'.zip "'..data.changesurl..'"' os.execute(cmd) end -- now save version object local history_file = history_dir.."/history.json" local history = {} if ulib.exists(history_file) then history.previous = JSON.decodeFile(history_file) history.version = history.previous.version + 1 else history.version = 1 history.previous = { key = data.key, version = 0, create = old_stat.mtime } end history.key = new_key history.changes = data.history.changes history.serverVersion = data.history.serverVersion history.create = stat.mtime history.user = { id = ulib.uid(SESSION.user).id, name = SESSION.user } -- save the history to file local f = io.open(history_file, "w") if f then f:write(JSON.encode(history)) f:close() else return error("Cannot save history") end print("File "..file.." sync with remote") else return error("Unable to download") end end return result("OK") end --print(JSON.encode(args)) if args.action and handle[args.action] then return handle[args.action](args.args) else return error("Invalid action parameter") end