Software / code / prosody
Annotate
plugins/muc/register.lib.lua @ 10399:270cb2821566
mod_ping: Remove ad-hoc command
17:27:40 <Ge0rG> Zash: the Ping thing is absolutely worthless
17:27:55 <Zash> The command provided by mod_ping?
17:27:59 <pep.> To own server?
17:28:14 <Ge0rG> the Ping command in mod_admin_web, whatever it maps to
17:28:29 <Ge0rG> > Pong
> 2019-11-07T16:28:16Z
What am I supposed to do with that result?
17:28:29 <Zash> Yeah, mod_ping provides that
17:28:41 <Ge0rG> Is it a ping to my own server? Where's the RTT?
17:28:48 <Zash> Dunno if it's useful for more than verifying that the adhoc command system works
17:29:02 <Ge0rG> (it lags, but there is no indication of how much)
17:29:14 <Zash> It can't really test that itself
17:29:52 <Zash> Anyone opposed to deleting it?
17:30:42 <Zash> Half the module
17:42:47 <MattJ> Zash, I'm fine with removing it
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 07 Nov 2019 19:23:42 +0100 |
| parent | 10373:51ea82f55322 |
| child | 10448:cbe524ed1a6a |
| 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); |
|
f9a83aca4421
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 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
|
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); |
|
f9a83aca4421
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 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
|
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 |
|
f9a83aca4421
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 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
|
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 } |