util/rsm.lua
author Kim Alvefur <zash@zash.se>
Sun, 24 Mar 2024 21:31:47 +0100
changeset 13467 3ce550ce44ce
parent 12979 d10957394a3c
permissions -rw-r--r--
util.startup: Don't use not yet existent shutdown procedure when started as root (thanks SigmaTel71)
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 };