util/rsm.lua
author Kim Alvefur <zash@zash.se>
Tue, 14 May 2024 17:07:47 +0200
changeset 13494 6f840763fc73
parent 12979 d10957394a3c
permissions -rw-r--r--
net.server_epoll: Add support for systemd socket activation Allows creating listening sockets and accepting client connections before Prosody starts. This is unlike normal Prosody dynamic resource management, where ports may added and removed at any time, and the ports defined by the config. Weird things happen if these are closed (e.g. due to reload) so here we prevent closing and ensure sockets are reused when opened again.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7855
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7840
diff changeset
     1
-- Prosody IM
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7840
diff changeset
     2
-- Copyright (C) 2008-2017 Matthew Wild
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7840
diff changeset
     3
-- Copyright (C) 2008-2017 Waqas Hussain
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7840
diff changeset
     4
-- Copyright (C) 2011-2017 Kim Alvefur
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7840
diff changeset
     5
--
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7840
diff changeset
     6
-- This project is MIT/X11 licensed. Please see the
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7840
diff changeset
     7
-- COPYING file in the source package for more information.
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7840
diff changeset
     8
--
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7840
diff changeset
     9
-- XEP-0313: Message Archive Management for Prosody
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7840
diff changeset
    10
--
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7840
diff changeset
    11
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 11432
diff changeset
    12
local stanza = require"prosody.util.stanza".stanza;
10768
1fbfcc2f6805 util.rsm: Don't convert values to strings that should already be strings
Kim Alvefur <zash@zash.se>
parents: 10767
diff changeset
    13
local tonumber = tonumber;
10765
b53193bb21cc util.rsm: Fix passing number as attribute
Kim Alvefur <zash@zash.se>
parents: 7855
diff changeset
    14
local s_format = string.format;
7839
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
local type = type;
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
local pairs = pairs;
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
10765
b53193bb21cc util.rsm: Fix passing number as attribute
Kim Alvefur <zash@zash.se>
parents: 7855
diff changeset
    18
local function inttostr(n)
b53193bb21cc util.rsm: Fix passing number as attribute
Kim Alvefur <zash@zash.se>
parents: 7855
diff changeset
    19
	return s_format("%d", n);
b53193bb21cc util.rsm: Fix passing number as attribute
Kim Alvefur <zash@zash.se>
parents: 7855
diff changeset
    20
end
b53193bb21cc util.rsm: Fix passing number as attribute
Kim Alvefur <zash@zash.se>
parents: 7855
diff changeset
    21
7839
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
local xmlns_rsm = 'http://jabber.org/protocol/rsm';
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
local element_parsers = {};
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
do
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
	local parsers = element_parsers;
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
	local function xs_int(st)
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
		return tonumber((st:get_text()));
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
	end
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
	local function xs_string(st)
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
		return st:get_text();
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
	end
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    35
	parsers.after = xs_string;
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    36
	parsers.before = function(st)
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
			local text = st:get_text();
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
			return text == "" or text;
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
		end;
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
	parsers.max = xs_int;
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
	parsers.index = xs_int;
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
	parsers.first = function(st)
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
			return { index = tonumber(st.attr.index); st:get_text() };
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
		end;
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
	parsers.last = xs_string;
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
	parsers.count = xs_int;
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    48
end
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    49
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
local element_generators = setmetatable({
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    51
	first = function(st, data)
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
		if type(data) == "table" then
10765
b53193bb21cc util.rsm: Fix passing number as attribute
Kim Alvefur <zash@zash.se>
parents: 7855
diff changeset
    53
			st:tag("first", { index = inttostr(data.index) }):text(data[1]):up();
7839
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
		else
11430
c7948491c5e4 util.rsm: Improve readability using compacter stanza building API
Kim Alvefur <zash@zash.se>
parents: 10768
diff changeset
    55
			st:text_tag("first", data);
7839
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    56
		end
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    57
	end;
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    58
	before = function(st, data)
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    59
		if data == true then
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    60
			st:tag("before"):up();
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    61
		else
11430
c7948491c5e4 util.rsm: Improve readability using compacter stanza building API
Kim Alvefur <zash@zash.se>
parents: 10768
diff changeset
    62
			st:text_tag("before", data);
7839
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    63
		end
10767
e0e2ae050d65 util.rsm: Explicitly serialize numbers in correct format
Kim Alvefur <zash@zash.se>
parents: 10765
diff changeset
    64
	end;
e0e2ae050d65 util.rsm: Explicitly serialize numbers in correct format
Kim Alvefur <zash@zash.se>
parents: 10765
diff changeset
    65
	max = function (st, data)
11430
c7948491c5e4 util.rsm: Improve readability using compacter stanza building API
Kim Alvefur <zash@zash.se>
parents: 10768
diff changeset
    66
		st:text_tag("max", inttostr(data));
10767
e0e2ae050d65 util.rsm: Explicitly serialize numbers in correct format
Kim Alvefur <zash@zash.se>
parents: 10765
diff changeset
    67
	end;
11432
d91def9fcfdd util.rsm: Correctly coerce integer value for <index> (fix #1642)
Kim Alvefur <zash@zash.se>
parents: 11430
diff changeset
    68
	index = function (st, data)
d91def9fcfdd util.rsm: Correctly coerce integer value for <index> (fix #1642)
Kim Alvefur <zash@zash.se>
parents: 11430
diff changeset
    69
		st:text_tag("index", inttostr(data));
d91def9fcfdd util.rsm: Correctly coerce integer value for <index> (fix #1642)
Kim Alvefur <zash@zash.se>
parents: 11430
diff changeset
    70
	end;
10767
e0e2ae050d65 util.rsm: Explicitly serialize numbers in correct format
Kim Alvefur <zash@zash.se>
parents: 10765
diff changeset
    71
	count = function (st, data)
11430
c7948491c5e4 util.rsm: Improve readability using compacter stanza building API
Kim Alvefur <zash@zash.se>
parents: 10768
diff changeset
    72
		st:text_tag("count", inttostr(data));
10767
e0e2ae050d65 util.rsm: Explicitly serialize numbers in correct format
Kim Alvefur <zash@zash.se>
parents: 10765
diff changeset
    73
	end;
7839
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    74
}, {
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    75
	__index = function(_, name)
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    76
		return function(st, data)
11430
c7948491c5e4 util.rsm: Improve readability using compacter stanza building API
Kim Alvefur <zash@zash.se>
parents: 10768
diff changeset
    77
			st:text_tag(name, data);
7839
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    78
		end
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    79
	end;
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    80
});
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    81
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    82
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    83
local function parse(set)
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    84
	local rs = {};
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    85
	for tag in set:childtags() do
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    86
		local name = tag.name;
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    87
		local parser = name and element_parsers[name];
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    88
		if parser then
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    89
			rs[name] = parser(tag);
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    90
		end
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    91
	end
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    92
	return rs;
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    93
end
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    94
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    95
local function generate(t)
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    96
	local st = stanza("set", { xmlns = xmlns_rsm });
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    97
	for k,v in pairs(t) do
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    98
		if element_parsers[k] then
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    99
			element_generators[k](st, v);
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   100
		end
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   101
	end
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   102
	return st;
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   103
end
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   104
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   105
local function get(st)
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   106
	local set = st:get_child("set", xmlns_rsm);
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   107
	if set and #set.tags > 0 then
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   108
		return parse(set);
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   109
	end
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   110
end
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   111
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   112
return { parse = parse, generate = generate, get = get };