Annotate

plugins/muc/register.lib.lua @ 10688:83668e16b9a3

MUC: Switch to new storage format by default Changing the default setting of `new_muc_storage_format` from false to true. The code supports reading both formats since 0.11, but servers with MUCs stored using the new format will not be able to downgrade to 0.10 or earlier. The new format is clearer (less nesting for the most commonly-accessed data), and combined with the new map-store methods, allows for some operations to become more efficient (such as finding out which MUCs on a service a given user is affiliated with).
author Matthew Wild <mwild1@gmail.com>
date Thu, 12 Mar 2020 16:10:44 +0000
parent 10448:cbe524ed1a6a
child 10794:4585fe53e21f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9240
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 local jid_bare = require "util.jid".bare;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 local jid_resource = require "util.jid".resource;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local resourceprep = require "util.encodings".stringprep.resourceprep;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 local st = require "util.stanza";
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 local dataforms = require "util.dataforms";
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 local allow_unaffiliated = module:get_option_boolean("allow_unaffiliated_register", false);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 local enforce_nick = module:get_option_boolean("enforce_registered_nickname", false);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 -- reserved_nicks[nick] = jid
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local function get_reserved_nicks(room)
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 if room._reserved_nicks then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 return room._reserved_nicks;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 module:log("debug", "Refreshing reserved nicks...");
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 local reserved_nicks = {};
10225
9bdd9b6bf362 MUC: Simplify nickname refresh loop
Kim Alvefur <zash@zash.se>
parents: 9298
diff changeset
18 for jid, _, data in room:each_affiliation() do
9240
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 local nick = data and data.reserved_nickname;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 module:log("debug", "Refreshed for %s: %s", jid, nick);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 if nick then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 reserved_nicks[nick] = jid;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 room._reserved_nicks = reserved_nicks;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 return reserved_nicks;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 -- Returns the registered nick, if any, for a JID
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 -- Note: this is just the *nick* part, i.e. the resource of the in-room JID
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 local function get_registered_nick(room, jid)
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 local registered_data = room._affiliation_data[jid];
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 if not registered_data then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 return;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 return registered_data.reserved_nickname;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 -- Returns the JID, if any, that registered a nick (not in-room JID)
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 local function get_registered_jid(room, nick)
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 local reserved_nicks = get_reserved_nicks(room);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 return reserved_nicks[nick];
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 module:hook("muc-set-affiliation", function (event)
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 -- Clear reserved nick cache
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 event.room._reserved_nicks = nil;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 end);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 module:hook("muc-disco#info", function (event)
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 event.reply:tag("feature", { var = "jabber:iq:register" }):up();
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 end);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 local registration_form = dataforms.new {
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/muc#register" },
10373
51ea82f55322 MUC: Make nickname field in registration form required
Kim Alvefur <zash@zash.se>
parents: 10343
diff changeset
56 { name = "muc#register_roomnick", type = "text-single", required = true, label = "Nickname"},
9240
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 };
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 local function enforce_nick_policy(event)
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 local origin, stanza = event.origin, event.stanza;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 local room = assert(event.room); -- FIXME
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 if not room then return; end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 -- Check if the chosen nickname is reserved
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 local requested_nick = jid_resource(stanza.attr.to);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 local reserved_by = get_registered_jid(room, requested_nick);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 if reserved_by and reserved_by ~= jid_bare(stanza.attr.from) then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 module:log("debug", "%s attempted to use nick %s reserved by %s", stanza.attr.from, requested_nick, reserved_by);
10448
cbe524ed1a6a MUC: Indicate origin of registration related errors
Kim Alvefur <zash@zash.se>
parents: 10373
diff changeset
69 local reply = st.error_reply(stanza, "cancel", "conflict", nil, room.jid):up();
9240
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 origin.send(reply:tag("x", {xmlns = "http://jabber.org/protocol/muc"}));
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 return true;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 -- Check if the occupant has a reservation they must use
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 if enforce_nick then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 local nick = get_registered_nick(room, jid_bare(stanza.attr.from));
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 if nick then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 if event.occupant then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 event.occupant.nick = jid_bare(event.occupant.nick) .. "/" .. nick;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 elseif event.dest_occupant.nick ~= jid_bare(event.dest_occupant.nick) .. "/" .. nick then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 module:log("debug", "Attempt by %s to join as %s, but their reserved nick is %s", stanza.attr.from, requested_nick, nick);
10448
cbe524ed1a6a MUC: Indicate origin of registration related errors
Kim Alvefur <zash@zash.se>
parents: 10373
diff changeset
82 local reply = st.error_reply(stanza, "cancel", "not-acceptable", nil, room.jid):up();
9240
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 origin.send(reply:tag("x", {xmlns = "http://jabber.org/protocol/muc"}));
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 return true;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 module:hook("muc-occupant-pre-join", enforce_nick_policy);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 module:hook("muc-occupant-pre-change", enforce_nick_policy);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 -- Discovering Reserved Room Nickname
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 -- http://xmpp.org/extensions/xep-0045.html#reservednick
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 module:hook("muc-disco#info/x-roomuser-item", function (event)
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 local nick = get_registered_nick(event.room, jid_bare(event.stanza.attr.from));
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 if nick then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 event.reply:tag("identity", { category = "conference", type = "text", name = nick })
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 end);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 local function handle_register_iq(room, origin, stanza)
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 local user_jid = jid_bare(stanza.attr.from)
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 local affiliation = room:get_affiliation(user_jid);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 if affiliation == "outcast" then
10448
cbe524ed1a6a MUC: Indicate origin of registration related errors
Kim Alvefur <zash@zash.se>
parents: 10373
diff changeset
106 origin.send(st.error_reply(stanza, "auth", "forbidden", room.jid));
9240
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 return true;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 elseif not (affiliation or allow_unaffiliated) then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109 origin.send(st.error_reply(stanza, "auth", "registration-required"));
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 return true;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 local reply = st.reply(stanza);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 local registered_nick = get_registered_nick(room, user_jid);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 if stanza.attr.type == "get" then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 reply:query("jabber:iq:register");
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 if registered_nick then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 reply:tag("registered"):up();
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 reply:tag("username"):text(registered_nick);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 origin.send(reply);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 return true;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 reply:add_child(registration_form:form());
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 else -- type == set -- handle registration form
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 local query = stanza.tags[1];
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 if query:get_child("remove") then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 -- Remove "member" affiliation, but preserve if any other
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127 local new_affiliation = affiliation ~= "member" and affiliation;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128 local ok, err_type, err_condition = room:set_affiliation(true, user_jid, new_affiliation, nil, false);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129 if not ok then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130 origin.send(st.error_reply(stanza, err_type, err_condition));
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
131 return true;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
132 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133 origin.send(reply);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 return true;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136 local form_tag = query:get_child("x", "jabber:x:data");
10342
dab2a7a82170 MUC: Validate registration dataform more carefully
Kim Alvefur <zash@zash.se>
parents: 10225
diff changeset
137 if not form_tag then
dab2a7a82170 MUC: Validate registration dataform more carefully
Kim Alvefur <zash@zash.se>
parents: 10225
diff changeset
138 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing dataform"));
dab2a7a82170 MUC: Validate registration dataform more carefully
Kim Alvefur <zash@zash.se>
parents: 10225
diff changeset
139 return true;
dab2a7a82170 MUC: Validate registration dataform more carefully
Kim Alvefur <zash@zash.se>
parents: 10225
diff changeset
140 end
dab2a7a82170 MUC: Validate registration dataform more carefully
Kim Alvefur <zash@zash.se>
parents: 10225
diff changeset
141 local form_type, err = dataforms.get_type(form_tag);
dab2a7a82170 MUC: Validate registration dataform more carefully
Kim Alvefur <zash@zash.se>
parents: 10225
diff changeset
142 if not form_type then
dab2a7a82170 MUC: Validate registration dataform more carefully
Kim Alvefur <zash@zash.se>
parents: 10225
diff changeset
143 origin.send(st.error_reply(stanza, "modify", "bad-request", "Error with form: "..err));
dab2a7a82170 MUC: Validate registration dataform more carefully
Kim Alvefur <zash@zash.se>
parents: 10225
diff changeset
144 return true;
dab2a7a82170 MUC: Validate registration dataform more carefully
Kim Alvefur <zash@zash.se>
parents: 10225
diff changeset
145 elseif form_type ~= "http://jabber.org/protocol/muc#register" then
dab2a7a82170 MUC: Validate registration dataform more carefully
Kim Alvefur <zash@zash.se>
parents: 10225
diff changeset
146 origin.send(st.error_reply(stanza, "modify", "bad-request", "Error in form"));
dab2a7a82170 MUC: Validate registration dataform more carefully
Kim Alvefur <zash@zash.se>
parents: 10225
diff changeset
147 return true;
dab2a7a82170 MUC: Validate registration dataform more carefully
Kim Alvefur <zash@zash.se>
parents: 10225
diff changeset
148 end
dab2a7a82170 MUC: Validate registration dataform more carefully
Kim Alvefur <zash@zash.se>
parents: 10225
diff changeset
149 local reg_data = registration_form:data(form_tag);
9240
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 if not reg_data then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151 origin.send(st.error_reply(stanza, "modify", "bad-request", "Error in form"));
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
152 return true;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
153 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
154 -- Is the nickname valid?
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
155 local desired_nick = resourceprep(reg_data["muc#register_roomnick"]);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
156 if not desired_nick then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
157 origin.send(st.error_reply(stanza, "modify", "bad-request", "Invalid Nickname"));
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
158 return true;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
160 -- Is the nickname currently in use by another user?
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
161 local current_occupant = room:get_occupant_by_nick(room.jid.."/"..desired_nick);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
162 if current_occupant and current_occupant.bare_jid ~= user_jid then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
163 origin.send(st.error_reply(stanza, "cancel", "conflict"));
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
164 return true;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166 -- Is the nickname currently reserved by another user?
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
167 local reserved_by = get_registered_jid(room, desired_nick);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
168 if reserved_by and reserved_by ~= user_jid then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169 origin.send(st.error_reply(stanza, "cancel", "conflict"));
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
170 return true;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
171 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
173 if enforce_nick then
9262
37b7cf3470f1 MUC: Move comment for clarity
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
174 -- Kick any sessions that are not using this nick before we register it
9240
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
175 local required_room_nick = room.jid.."/"..desired_nick;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176 for room_nick, occupant in room:each_occupant() do
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
177 if occupant.bare_jid == user_jid and room_nick ~= required_room_nick then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
178 room:set_role(true, room_nick, nil); -- Kick (TODO: would be nice to use 333 code)
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
179 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
180 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
181 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
182
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
183 -- Checks passed, save the registration
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
184 if registered_nick ~= desired_nick then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
185 local registration_data = { reserved_nickname = desired_nick };
9298
2d71040a959f MUC: If a user with an existing affiliation registers, preserve that affiliation (thanks jc)
Matthew Wild <mwild1@gmail.com>
parents: 9262
diff changeset
186 local ok, err_type, err_condition = room:set_affiliation(true, user_jid, affiliation or "member", nil, registration_data);
9240
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
187 if not ok then
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
188 origin.send(st.error_reply(stanza, err_type, err_condition));
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
189 return true;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
190 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
191 module:log("debug", "Saved nick registration for %s: %s", user_jid, desired_nick);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
192 origin.send(reply);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
193 return true;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
194 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
195 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
196 origin.send(reply);
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
197 return true;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
198 end
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
199
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
200 return {
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
201 get_registered_nick = get_registered_nick;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
202 get_registered_jid = get_registered_jid;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
203 handle_register_iq = handle_register_iq;
f9a83aca4421 MUC: Add support for registering with a MUC, including reserving a nickname as per XEP-0045
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
204 }