Annotate

util/rsm.lua @ 13261:7c62370dee9a

net.http.server: Fix typo in previous commit
author Kim Alvefur <zash@zash.se>
date Sat, 23 Sep 2023 15:48:21 +0200
parent 12975:d10957394a3c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7852
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7837
diff changeset
1 -- Prosody IM
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7837
diff changeset
2 -- Copyright (C) 2008-2017 Matthew Wild
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7837
diff changeset
3 -- Copyright (C) 2008-2017 Waqas Hussain
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7837
diff changeset
4 -- Copyright (C) 2011-2017 Kim Alvefur
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7837
diff changeset
5 --
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7837
diff changeset
6 -- This project is MIT/X11 licensed. Please see the
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7837
diff changeset
7 -- COPYING file in the source package for more information.
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7837
diff changeset
8 --
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7837
diff changeset
9 -- XEP-0313: Message Archive Management for Prosody
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7837
diff changeset
10 --
e594010e1ba0 util.rsm: Add copyright header
Kim Alvefur <zash@zash.se>
parents: 7837
diff changeset
11
12975
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 11428
diff changeset
12 local stanza = require"prosody.util.stanza".stanza;
10764
1fbfcc2f6805 util.rsm: Don't convert values to strings that should already be strings
Kim Alvefur <zash@zash.se>
parents: 10763
diff changeset
13 local tonumber = tonumber;
10761
b53193bb21cc util.rsm: Fix passing number as attribute
Kim Alvefur <zash@zash.se>
parents: 7852
diff changeset
14 local s_format = string.format;
7836
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
10761
b53193bb21cc util.rsm: Fix passing number as attribute
Kim Alvefur <zash@zash.se>
parents: 7852
diff changeset
18 local function inttostr(n)
b53193bb21cc util.rsm: Fix passing number as attribute
Kim Alvefur <zash@zash.se>
parents: 7852
diff changeset
19 return s_format("%d", n);
b53193bb21cc util.rsm: Fix passing number as attribute
Kim Alvefur <zash@zash.se>
parents: 7852
diff changeset
20 end
b53193bb21cc util.rsm: Fix passing number as attribute
Kim Alvefur <zash@zash.se>
parents: 7852
diff changeset
21
7836
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
10761
b53193bb21cc util.rsm: Fix passing number as attribute
Kim Alvefur <zash@zash.se>
parents: 7852
diff changeset
53 st:tag("first", { index = inttostr(data.index) }):text(data[1]):up();
7836
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 else
11426
c7948491c5e4 util.rsm: Improve readability using compacter stanza building API
Kim Alvefur <zash@zash.se>
parents: 10764
diff changeset
55 st:text_tag("first", data);
7836
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
11426
c7948491c5e4 util.rsm: Improve readability using compacter stanza building API
Kim Alvefur <zash@zash.se>
parents: 10764
diff changeset
62 st:text_tag("before", data);
7836
30fac9154fd4 mod_mam: Import from prosody-modules
Kim Alvefur <zash@zash.se>
parents:
diff changeset
63 end
10763
e0e2ae050d65 util.rsm: Explicitly serialize numbers in correct format
Kim Alvefur <zash@zash.se>
parents: 10761
diff changeset
64 end;
e0e2ae050d65 util.rsm: Explicitly serialize numbers in correct format
Kim Alvefur <zash@zash.se>
parents: 10761
diff changeset
65 max = function (st, data)
11426
c7948491c5e4 util.rsm: Improve readability using compacter stanza building API
Kim Alvefur <zash@zash.se>
parents: 10764
diff changeset
66 st:text_tag("max", inttostr(data));
10763
e0e2ae050d65 util.rsm: Explicitly serialize numbers in correct format
Kim Alvefur <zash@zash.se>
parents: 10761
diff changeset
67 end;
11428
d91def9fcfdd util.rsm: Correctly coerce integer value for <index> (fix #1642)
Kim Alvefur <zash@zash.se>
parents: 11426
diff changeset
68 index = function (st, data)
d91def9fcfdd util.rsm: Correctly coerce integer value for <index> (fix #1642)
Kim Alvefur <zash@zash.se>
parents: 11426
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: 11426
diff changeset
70 end;
10763
e0e2ae050d65 util.rsm: Explicitly serialize numbers in correct format
Kim Alvefur <zash@zash.se>
parents: 10761
diff changeset
71 count = function (st, data)
11426
c7948491c5e4 util.rsm: Improve readability using compacter stanza building API
Kim Alvefur <zash@zash.se>
parents: 10764
diff changeset
72 st:text_tag("count", inttostr(data));
10763
e0e2ae050d65 util.rsm: Explicitly serialize numbers in correct format
Kim Alvefur <zash@zash.se>
parents: 10761
diff changeset
73 end;
7836
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)
11426
c7948491c5e4 util.rsm: Improve readability using compacter stanza building API
Kim Alvefur <zash@zash.se>
parents: 10764
diff changeset
77 st:text_tag(name, data);
7836
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 };