Annotate

plugins/muc/register.lib.lua @ 10303:c434bff22b14

mod_csi_simple: Always remove session filters when disabling CSI Only guard the actual pausing of outgoing data on the method existing. This prevents the filters from lingering in case something happened to the connection. Removing already removed filters should be a safe noop.
author Kim Alvefur <zash@zash.se>
date Sat, 05 Oct 2019 16:55:58 +0200
parent 10225:9bdd9b6bf362
child 10342:dab2a7a82170
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:add_feature("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
51
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 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
53 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
54 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
55
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
56 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
57 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/muc#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
58 { name = "muc#register_roomnick", type = "text-single", label = "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
59 };
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
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 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
62 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
63 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
64 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
65
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 -- 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
67 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
68 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
69 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
70 module:log("debug", "%s attempted to use nick %s reserved by %s", stanza.attr.from, requested_nick, reserved_by);
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 local reply = st.error_reply(stanza, "cancel", "conflict"):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
72 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
73 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
74 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
75
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 -- 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
77 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
78 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
79 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
80 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
81 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
82 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
83 module:log("debug", "Attempt by %s to join as %s, but their reserved nick is %s", stanza.attr.from, requested_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
84 local reply = st.error_reply(stanza, "cancel", "not-acceptable"):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
85 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
86 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
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 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
90 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
91
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 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
93 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
94
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 -- 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
96 -- 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
97 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
98 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
99 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
100 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
101 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
102 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
103
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 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
105 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
106 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
107 if affiliation == "outcast" 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
108 origin.send(st.error_reply(stanza, "auth", "forbidden"));
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 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
110 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
111 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
112 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
113 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
114 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
115 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
116 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
117 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
118 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
119 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
120 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
121 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
122 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
123 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
124 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
125 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
126 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
127 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
128 -- 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
129 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
130 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
131 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
132 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
133 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
134 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
135 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
136 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
137 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
138 local form_tag = query:get_child("x", "jabber:x:data");
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
139 local reg_data = form_tag and registration_form:data(form_tag);
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
140 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
141 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
142 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
143 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
144 -- 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
145 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
146 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
147 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
148 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
149 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
150 -- 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
151 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
152 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
153 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
154 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
155 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
156 -- 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
157 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
158 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
159 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
160 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
161 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
162
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 if enforce_nick then
9262
37b7cf3470f1 MUC: Move comment for clarity
Matthew Wild <mwild1@gmail.com>
parents: 9240
diff changeset
164 -- 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
165 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
166 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
167 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
168 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
169 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
170 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
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 -- 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
174 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
175 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
176 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
177 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
178 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
179 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
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 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
182 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
183 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
184 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
185 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
186 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
187 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
188 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
189
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 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
191 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
192 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
193 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
194 }