Software / code / prosody
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 |