view mod_vcard_command/mod_vcard_command.lua @ 4776:13e913471b75

mod_http_admin_api: Ensure freshness of metrics when in manual mode When in manual collection mode, as recommended for Prometheus, collection needs to be triggered manually, or they would be stale, possibly dating from the start of the server. This might vary per metric depending on how and when the metrics are gathered.
author Kim Alvefur <zash@zash.se>
date Thu, 18 Nov 2021 19:26:07 +0100
parents b2c9b832612b
children
line wrap: on
line source

-----------------------------------------------------------
-- mod_vcard_command: Manage vcards through prosodyctl
-- version 0.02
-----------------------------------------------------------
-- Copyright (C) 2013 Stefan `Sec` Zehl
--
-- This project is MIT/X11 licensed. Please see the
-- COPYING file in the source package for more information.
-----------------------------------------------------------

function module.load()
        module:log("error", "Do not load this module in Prosody");
        module.host = "*";
        return;
end


-- Workaround for lack of util.startup...
_G.bare_sessions = _G.bare_sessions or {};

local storagemanager = require "core.storagemanager";
local datamanager = require "util.datamanager";
local xml = require "util.xml";
local jid = require "util.jid";
local warn = prosodyctl.show_warning;
local st = require "util.stanza"
-- local vcards = module:open_store("vcard");

-- Print anything - including nested tables
function table_print (tt, indent, done)
  done = done or {}
  indent = indent or 0
  if type(tt) == "table" then
    for key, value in pairs (tt) do
      io.write(string.rep (" ", indent)) -- indent it
      if type (value) == "table" and not done [value] then
        done [value] = true
        io.write(string.format("[%s] => table\n", tostring (key)));
        io.write(string.rep (" ", indent+4)) -- indent it
        io.write("(\n");
        table_print (value, indent + 7, done)
        io.write(string.rep (" ", indent+4)) -- indent it
        io.write(")\n");
      else
        io.write(string.format("[%s] => %s\n",
            tostring (key), tostring(value)))
      end
    end
  else
    io.write(tt .. "\n")
  end
end

-- Make a *one-way* subscription. User will see when contact is online,
-- contact will not see when user is online.
function vcard_get(user_jid)
        local user_username, user_host = jid.split(user_jid);
        if not hosts[user_host] then
                warn("The host '%s' is not configured for this server.", user_host);
                return;
        end
        storagemanager.initialize_host(user_host);
	local vCard;
	vCard = st.deserialize(datamanager.load(user_username, user_host, "vcard"));
	if vCard then
		print(vCard);
	else
		warn("The user '%s' has no vCard configured.",user_jid);
	end
end

function vcard_set(user_jid, file)
        local user_username, user_host = jid.split(user_jid);
        if not hosts[user_host] then
                warn("The host '%s' is not configured for this server.", user_host);
                return;
        end
        storagemanager.initialize_host(user_host);
	local f = io.input(file);
	local xmldata=io.read("*all");
	io.close(f);

	local vCard=st.preserialize(xml.parse(xmldata));

	if vCard then
		datamanager.store(user_username, user_host, "vcard", vCard);
	else
		warn("Could not parse the file.");
	end
end

function vcard_delete(user_jid)
        local user_username, user_host = jid.split(user_jid);
        if not hosts[user_host] then
                warn("The host '%s' is not configured for this server.", user_host);
                return;
        end
        storagemanager.initialize_host(user_host);
	datamanager.store(user_username, user_host, "vcard", nil);
end

function module.command(arg)
        local command = arg[1];
        if not command then
                warn("Valid subcommands: get | set | delete ");
                return 0;
        end
        table.remove(arg, 1);
        if command == "get" then
                vcard_get(arg[1]);
                return 0;
        elseif command == "set" then
                vcard_set(arg[1], arg[2]);
                return 0;
        elseif command == "delete" then
                vcard_delete(arg[1]);
                return 0;
        else
                warn("Unknown command: %s", command);
                return 1;
        end
        return 0;
end