changeset 3663:d43623bdf91b

mod_upload_file_management: Add this new module, for now only listing files uploaded by a user as an admin.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Sun, 01 Sep 2019 01:13:12 +0200
parents a6c51f380777
children 2bbc56a19d74
files mod_file_management/README.markdown mod_file_management/mod_file_management.lua
diffstat 2 files changed, 102 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_file_management/README.markdown	Sun Sep 01 01:13:12 2019 +0200
@@ -0,0 +1,24 @@
+---
+description: File management for uploaded files
+labels: 'Stage-Alpha'
+---
+
+Introduction
+============
+
+This module exposes ad-hoc commands [XEP-0050] for listing uploaded files, and
+later for managing them.
+
+Configuration
+=============
+
+This module depends on mod\_http\_upload, and exposes ad-hoc commands for each
+operation a user might do on their uploaded files.
+
+The module can be added to the `modules_enabled` field on a host on which
+mod\_http\_upload is loaded.
+
+Compatibility
+=============
+
+Works with Prosody trunk at least.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_file_management/mod_file_management.lua	Sun Sep 01 01:13:12 2019 +0200
@@ -0,0 +1,78 @@
+-- mod_file_management
+--
+-- Copyright (C) 2019 Emmanuel Gil Peyrot
+--
+-- This file is MIT/X11 licensed.
+--
+
+module:depends("http_upload");
+local dataform_new = require "util.dataforms".new;
+local adhoc_new = module:require "adhoc".new;
+local adhoc_simple_form = require "util.adhoc".new_simple_form;
+local adhoc_initial_data_form = require "util.adhoc".new_initial_data_form;
+local url = require "socket.url";
+local lfs = require "lfs";
+local datamanager = require "util.datamanager";
+local jid_prepped_split = require "util.jid".prepped_split;
+local join_path = require "util.paths".join;
+local t_concat = table.concat;
+local t_insert = table.insert;
+
+local storage_path = module:get_option_string("http_upload_path", join_path(prosody.paths.data, "http_upload"));
+
+local function get_url(dir, filename)
+	local slot_url = url.parse(module:http_url("upload"));
+	slot_url.path = url.parse_path(slot_url.path or "/");
+	t_insert(slot_url.path, dir);
+	t_insert(slot_url.path, filename);
+	slot_url.path.is_directory = false;
+	slot_url.path = url.build_path(slot_url.path);
+	return url.build(slot_url);
+end
+
+local list_form = dataform_new {
+	title = "List files for user";
+	instructions = "Select the JID of a user to list the files they have uploaded.";
+	{
+		type = "hidden";
+		name = "FORM_TYPE";
+		value = "http://prosody.im/protocol/file_management#list";
+	};
+	{
+		type = "jid-single";
+		name = "accountjid";
+		required = true;
+		label = "JID";
+	};
+};
+
+module:provides("adhoc", adhoc_new("File Management", "http://prosody.im/protocol/file_management#list", adhoc_simple_form(list_form, function (data, errors)
+	if errors then
+		local errmsg = {};
+		for name, text in pairs(errors) do
+			errmsg[#errmsg + 1] = name .. ": " .. text;
+		end
+		return { status = "completed", error = { message = t_concat(errmsg, "\n") } };
+	end
+
+	local jid = data.accountjid;
+	local user, host = jid_prepped_split(jid);
+
+	local uploads, err = datamanager.list_load(user, host, "http_upload");
+	if err then
+		return { status = "completed", error = "File upload data not found for user "..jid.."." };
+	end
+
+	local result = {};
+	for i, upload in ipairs(uploads) do
+		module:log("debug", "http_upload_management#list %d %q", i, upload);
+		if upload.dir ~= nil then
+			t_insert(result, get_url(upload.dir, upload.filename));
+		else
+			-- upload.filename was pointing to a path on the file system…
+			-- TODO: Try to guess the URL from that.
+		end
+	end
+
+	return { status = "completed", info = t_concat(result, "\n") };
+end), "admin"));