Comparison

plugins/muc/register.lib.lua @ 11286:336cba957c88

MUC: Allow modules to add to the room registration form, and handle the result
author Matthew Wild <mwild1@gmail.com>
date Fri, 15 Jan 2021 18:42:45 +0000
parent 10794:4585fe53e21f
child 11906:ba3344926e18
comparison
equal deleted inserted replaced
11285:5d61fc3cd194 11286:336cba957c88
53 53
54 local registration_form = dataforms.new { 54 local registration_form = dataforms.new {
55 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/muc#register" }, 55 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/muc#register" },
56 { name = "muc#register_roomnick", type = "text-single", required = true, label = "Nickname"}, 56 { name = "muc#register_roomnick", type = "text-single", required = true, label = "Nickname"},
57 }; 57 };
58
59 module:handle_items("muc-registration-field", function (event)
60 module:log("debug", "Adding MUC registration form field: %s", event.item.name);
61 table.insert(registration_form, event.item);
62 end, function (event)
63 module:log("debug", "Removing MUC registration form field: %s", event.item.name);
64 local removed_field_name = event.item.name;
65 for i, field in ipairs(registration_form) do
66 if field.name == removed_field_name then
67 table.remove(registration_form, i);
68 break;
69 end
70 end
71 end);
58 72
59 local function enforce_nick_policy(event) 73 local function enforce_nick_policy(event)
60 local origin, stanza = event.origin, event.stanza; 74 local origin, stanza = event.origin, event.stanza;
61 local room = assert(event.room); -- FIXME 75 local room = assert(event.room); -- FIXME
62 if not room then return; end 76 if not room then return; end
112 local reply = st.reply(stanza); 126 local reply = st.reply(stanza);
113 local registered_nick = get_registered_nick(room, user_jid); 127 local registered_nick = get_registered_nick(room, user_jid);
114 if stanza.attr.type == "get" then 128 if stanza.attr.type == "get" then
115 reply:query("jabber:iq:register"); 129 reply:query("jabber:iq:register");
116 if registered_nick then 130 if registered_nick then
131 -- I find it strange, but XEP-0045 says not to include
132 -- the current registration data (only the registered name)
117 reply:tag("registered"):up(); 133 reply:tag("registered"):up();
118 reply:tag("username"):text(registered_nick); 134 reply:tag("username"):text(registered_nick);
119 origin.send(reply); 135 origin.send(reply);
120 return true; 136 return true;
121 end 137 end
181 end 197 end
182 198
183 -- Checks passed, save the registration 199 -- Checks passed, save the registration
184 if registered_nick ~= desired_nick then 200 if registered_nick ~= desired_nick then
185 local registration_data = { reserved_nickname = desired_nick }; 201 local registration_data = { reserved_nickname = desired_nick };
202 module:fire_event("muc-registration-submitted", {
203 room = room;
204 origin = origin;
205 stanza = stanza;
206 submitted_data = reg_data;
207 affiliation_data = registration_data;
208 });
186 local ok, err_type, err_condition = room:set_affiliation(true, user_jid, affiliation or "member", nil, registration_data); 209 local ok, err_type, err_condition = room:set_affiliation(true, user_jid, affiliation or "member", nil, registration_data);
187 if not ok then 210 if not ok then
188 origin.send(st.error_reply(stanza, err_type, err_condition)); 211 origin.send(st.error_reply(stanza, err_type, err_condition));
189 return true; 212 return true;
190 end 213 end