2021-02-09 19:41:47 +01:00
|
|
|
local args=...
|
|
|
|
local vfs = require("vfs")
|
|
|
|
|
|
|
|
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
|
|
|
|
|
2023-02-17 12:37:26 +01:00
|
|
|
local download_file = function(src, dest)
|
|
|
|
local https = require('ssl.https')
|
|
|
|
local ltn12 = require("ltn12")
|
|
|
|
local file = io.open(dest, "w")
|
|
|
|
if not file then
|
|
|
|
LOG_ERROR("Unable to open file %s to write", dest)
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
local body, code, headers = https.request{
|
|
|
|
url = src,
|
|
|
|
sink = ltn12.sink.file(file)
|
|
|
|
}
|
|
|
|
if code~=200 then
|
|
|
|
LOG_ERROR("Error: ".. (code or '') )
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
|
2021-02-09 19:41:47 +01:00
|
|
|
local handle = {}
|
|
|
|
|
2021-03-05 18:18:55 +01:00
|
|
|
handle.token = function(data)
|
|
|
|
local file = vfs.ospath(data.file)
|
|
|
|
local stat = ulib.file_stat(file)
|
|
|
|
local ret = {
|
|
|
|
sid = "sessionid="..SESSION.sessionid,
|
2023-02-17 12:37:26 +01:00
|
|
|
key = enc.sha1(file..":"..stat.mtime)
|
2021-03-05 18:18:55 +01:00
|
|
|
}
|
|
|
|
return result(ret)
|
2021-02-09 19:41:47 +01:00
|
|
|
end
|
|
|
|
|
2021-03-19 22:04:27 +01:00
|
|
|
handle.history = function(data)
|
|
|
|
local file = vfs.ospath(data.file)
|
2023-02-17 12:37:26 +01:00
|
|
|
local history_file = vfs.ospath("home://.office/"..enc.sha1(file).."/history.json")
|
2021-03-19 22:04:27 +01:00
|
|
|
if(ulib.exists(history_file)) then
|
|
|
|
local obj = JSON.decodeFile(history_file)
|
2023-02-17 12:37:26 +01:00
|
|
|
obj.hash = enc.sha1(file)
|
2021-03-19 22:04:27 +01:00
|
|
|
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)
|
2023-02-17 12:37:26 +01:00
|
|
|
local basepath = vfs.ospath("home://.office/"..enc.sha1(file))
|
2021-03-19 22:04:27 +01:00
|
|
|
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
|
2021-02-09 23:55:48 +01:00
|
|
|
handle.duplicate = function(data)
|
|
|
|
local file = vfs.ospath(data.as)
|
2023-02-17 12:37:26 +01:00
|
|
|
download_file(data.remote, file)
|
|
|
|
if not ulib.exists(file) then
|
2021-02-09 23:55:48 +01:00
|
|
|
return error("Unable to duplicate file")
|
|
|
|
end
|
|
|
|
return result("File duplicated")
|
|
|
|
end
|
|
|
|
|
2021-02-09 19:41:47 +01:00
|
|
|
handle.save = function()
|
|
|
|
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
|
2023-02-17 12:37:26 +01:00
|
|
|
local tmpfile = "/tmp/"..enc.sha1(file)
|
|
|
|
download_file(data.url, tmpfile)
|
2021-02-09 23:55:48 +01:00
|
|
|
-- move file to correct position
|
|
|
|
if ulib.exists(tmpfile) then
|
2023-02-17 12:37:26 +01:00
|
|
|
LOG_INFO("Remote file saved to %s", tmpfile)
|
2021-03-19 22:04:27 +01:00
|
|
|
-- back up the file version
|
|
|
|
local history_dir = "home://.office"
|
|
|
|
vfs.mkdir(history_dir)
|
2023-02-17 12:37:26 +01:00
|
|
|
history_dir = history_dir.."/"..enc.sha1(file)
|
2021-03-19 22:04:27 +01:00
|
|
|
vfs.mkdir(history_dir)
|
|
|
|
history_dir = vfs.ospath(history_dir)
|
|
|
|
-- backup old version
|
2023-02-17 12:37:26 +01:00
|
|
|
ulib.send_file(file,history_dir.."/"..data.key)
|
|
|
|
LOG_INFO("Backup file saved to %s", history_dir.."/"..data.key)
|
2021-03-19 22:04:27 +01:00
|
|
|
-- create new version
|
|
|
|
local old_stat = ulib.file_stat(file)
|
2023-02-17 12:37:26 +01:00
|
|
|
if not ulib.move(tmpfile, file) then
|
|
|
|
ulib.send_file(tmpfile, file)
|
|
|
|
end
|
2021-03-19 22:04:27 +01:00
|
|
|
-- get the new key
|
|
|
|
local stat = ulib.file_stat(file)
|
2023-02-17 12:37:26 +01:00
|
|
|
local new_key = enc.sha1(file..":"..stat.mtime)
|
2021-03-19 22:04:27 +01:00
|
|
|
-- save changes
|
|
|
|
if(data.changesurl) then
|
2023-02-17 12:37:26 +01:00
|
|
|
download_file(data.changesurl, history_dir.."/"..new_key..'.zip')
|
2021-03-19 22:04:27 +01:00
|
|
|
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
|
2023-02-17 12:37:26 +01:00
|
|
|
LOG_INFO("File "..file.." sync with remote")
|
2021-02-09 23:55:48 +01:00
|
|
|
else
|
|
|
|
return error("Unable to download")
|
2021-02-09 19:41:47 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
return result("OK")
|
|
|
|
end
|
|
|
|
|
2021-02-09 23:55:48 +01:00
|
|
|
--print(JSON.encode(args))
|
2021-02-09 19:41:47 +01:00
|
|
|
|
|
|
|
if args.action and handle[args.action] then
|
|
|
|
return handle[args.action](args.args)
|
|
|
|
else
|
|
|
|
return error("Invalid action parameter")
|
2023-02-17 12:37:26 +01:00
|
|
|
end
|