annotate mod_clean_roster/mod_clean_roster.lua @ 5536:96dec7681af8

mod_firewall: Update user marks to store instantly via map store The original approach was to keep marks in memory only, and persist them at shutdown. That saves I/O, at the cost of potentially losing marks on an unclean shutdown. This change persists marks instantly, which may have some performance overhead but should be more "correct". It also splits the marking/unmarking into an event which may be watched or even fired by other modules.
author Matthew Wild <mwild1@gmail.com>
date Thu, 08 Jun 2023 16:20:42 +0100
parents e384b91d0aa7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5085
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 local s_find = string.find;
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 local pctl = require "util.prosodyctl";
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 local rostermanager = require "core.rostermanager";
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 local storagemanager = require "core.storagemanager";
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 local usermanager = require "core.usermanager";
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9 -- copypaste from util.stanza
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 local function valid_xml_cdata(str, attr)
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 return not s_find(str, attr and "[^\1\9\10\13\20-~\128-\247]" or "[^\9\10\13\20-~\128-\247]");
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 end
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 function module.command(_arg)
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 if select(2, pctl.isrunning()) then
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 pctl.show_warning("Stop Prosody before running this command");
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 return 1;
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 end
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 for hostname, host in pairs(prosody.hosts) do
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 if hostname ~= "*" then
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 if host.users.name == "null" then
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 storagemanager.initialize_host(hostname);
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 usermanager.initialize_host(hostname);
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 end
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 local fixes = 0;
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 for username in host.users.users() do
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 local roster = rostermanager.load_roster(username, hostname);
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 local changed = false;
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 for contact, item in pairs(roster) do
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 if contact ~= false then
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 if item.name and not valid_xml_cdata(item.name, false) then
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33 item.name = item.name:gsub("[^\9\10\13\20-~\128-\247]", "�");
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 fixes = fixes + 1;
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 changed = true;
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 end
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 local clean_groups = {};
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38 for group in pairs(item.groups) do
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 if valid_xml_cdata(group, false) then
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 clean_groups[group] = true;
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 else
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 clean_groups[group:gsub("[^\9\10\13\20-~\128-\247]", "�")] = true;
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 fixes = fixes + 1;
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 changed = true;
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45 end
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46 end
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
47 item.groups = clean_groups;
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48 else
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 -- pending entries etc
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 end
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 end
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 if changed then
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53 assert(rostermanager.save_roster(username, hostname, roster));
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 end
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
55 end
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56 pctl.show_message("Fixed %d items on host %s", fixes, hostname);
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57 end
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 end
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
59 return 0;
e384b91d0aa7 mod_clean_roster: Clean out invalid characters from roster entires
Kim Alvefur <zash@zash.se>
parents:
diff changeset
60 end