# HG changeset patch # User Emmanuel Gil Peyrot # Date 1567293192 -7200 # Node ID d43623bdf91bf1022d68c3d78855692d03eb6f6e # Parent a6c51f380777ee216c7c8a0a29a08ecaa8a5dcc4 mod_upload_file_management: Add this new module, for now only listing files uploaded by a user as an admin. diff -r a6c51f380777 -r d43623bdf91b mod_file_management/README.markdown --- /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. diff -r a6c51f380777 -r d43623bdf91b mod_file_management/mod_file_management.lua --- /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"));