changeset 2677:6daaa1ad2559

mod_http_upload: Add option for expiry of files after a configurable time (closes #557)
author Kim Alvefur <zash@zash.se>
date Thu, 13 Apr 2017 16:31:00 +0200
parents 1b081c8fc1d9
children 2dec7cad9218
files mod_http_upload/README.markdown mod_http_upload/mod_http_upload.lua
diffstat 2 files changed, 30 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mod_http_upload/README.markdown	Mon Apr 10 21:09:44 2017 +0200
+++ b/mod_http_upload/README.markdown	Thu Apr 13 16:31:00 2017 +0200
@@ -37,6 +37,12 @@
 
 This can not be set over the value of `http_max_content_size` (default 10M).
 
+Files can be set to be deleted after some time:
+
+``` lua
+http_upload_expire_after = 60 * 60 * 24 * 7 -- a week in seconds
+```
+
 Path
 ----
 
--- a/mod_http_upload/mod_http_upload.lua	Mon Apr 10 21:09:44 2017 +0200
+++ b/mod_http_upload/mod_http_upload.lua	Thu Apr 13 16:31:00 2017 +0200
@@ -1,6 +1,6 @@
 -- mod_http_upload
 --
--- Copyright (C) 2015 Kim Alvefur
+-- Copyright (C) 2015-2017 Kim Alvefur
 --
 -- This file is MIT/X11 licensed.
 --
@@ -13,6 +13,7 @@
 local url = require "socket.url";
 local dataform = require "util.dataforms".new;
 local datamanager = require "util.datamanager";
+local array = require "util.array";
 local t_concat = table.concat;
 local t_insert = table.insert;
 local s_upper = string.upper;
@@ -28,6 +29,7 @@
 
 -- config
 local file_size_limit = module:get_option_number(module.name .. "_file_size_limit", 1024 * 1024); -- 1 MB
+local max_age = module:get_option_number(module.name .. "_expire_after");
 
 --- sanity
 local parser_body_limit = module:context("*"):get_option_number("http_max_content_size", 10*1024*1024);
@@ -66,6 +68,26 @@
 local storage_path = module:get_option_string(module.name .. "_path", join_path(prosody.paths.data, module.name));
 lfs.mkdir(storage_path);
 
+local function expire(username, host)
+	if not max_age then return true; end
+	local uploads, err = datamanager.list_load(username, host, module.name);
+	if not uploads then return true; end
+	uploads = array(uploads);
+	local expiry = os.time() - max_age;
+	uploads:filter(function (item)
+		if item.time < expiry then
+			local deleted, whynot = os.remove(item.filename);
+			if deleted then
+				return false;
+			else
+				module:log("warn", "Could not delete expired upload %s: %s", item.filename, whynot or "delete failed");
+			end
+		end
+		return true;
+	end);
+	return datamanager.list_store(username, host, module.name, uploads);
+end
+
 local function handle_request(origin, stanza, xmlns, filename, filesize)
 	-- local clients only
 	if origin.type ~= "c2s" then
@@ -79,6 +101,7 @@
 		origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid filename"));
 		return true;
 	end
+	expire(origin.username, origin.host);
 	if not filesize then
 		module:log("debug", "Missing file size");
 		origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing or invalid file size"));