Comparison

mod_clean_roster/mod_clean_roster.lua @ 5085:e384b91d0aa7

mod_clean_roster: Clean out invalid characters from roster entires
author Kim Alvefur <zash@zash.se>
date Tue, 22 Nov 2022 16:59:52 +0100
comparison
equal deleted inserted replaced
5084:dda2af7ed02f 5085:e384b91d0aa7
1 local s_find = string.find;
2
3 local pctl = require "util.prosodyctl";
4
5 local rostermanager = require "core.rostermanager";
6 local storagemanager = require "core.storagemanager";
7 local usermanager = require "core.usermanager";
8
9 -- copypaste from util.stanza
10 local function valid_xml_cdata(str, attr)
11 return not s_find(str, attr and "[^\1\9\10\13\20-~\128-\247]" or "[^\9\10\13\20-~\128-\247]");
12 end
13
14 function module.command(_arg)
15 if select(2, pctl.isrunning()) then
16 pctl.show_warning("Stop Prosody before running this command");
17 return 1;
18 end
19
20 for hostname, host in pairs(prosody.hosts) do
21 if hostname ~= "*" then
22 if host.users.name == "null" then
23 storagemanager.initialize_host(hostname);
24 usermanager.initialize_host(hostname);
25 end
26 local fixes = 0;
27 for username in host.users.users() do
28 local roster = rostermanager.load_roster(username, hostname);
29 local changed = false;
30 for contact, item in pairs(roster) do
31 if contact ~= false then
32 if item.name and not valid_xml_cdata(item.name, false) then
33 item.name = item.name:gsub("[^\9\10\13\20-~\128-\247]", "�");
34 fixes = fixes + 1;
35 changed = true;
36 end
37 local clean_groups = {};
38 for group in pairs(item.groups) do
39 if valid_xml_cdata(group, false) then
40 clean_groups[group] = true;
41 else
42 clean_groups[group:gsub("[^\9\10\13\20-~\128-\247]", "�")] = true;
43 fixes = fixes + 1;
44 changed = true;
45 end
46 end
47 item.groups = clean_groups;
48 else
49 -- pending entries etc
50 end
51 end
52 if changed then
53 assert(rostermanager.save_roster(username, hostname, roster));
54 end
55 end
56 pctl.show_message("Fixed %d items on host %s", fixes, hostname);
57 end
58 end
59 return 0;
60 end