diff -r dcc5f3402f5b -r dff4a77ee285 plugins/muc/muc.lib.lua --- a/plugins/muc/muc.lib.lua Wed Nov 10 05:32:09 2010 +0500 +++ b/plugins/muc/muc.lib.lua Wed Nov 10 01:34:57 2010 +0100 @@ -522,9 +522,14 @@ end function room_mt:send_form(origin, stanza) + origin.send(st.reply(stanza):query("http://jabber.org/protocol/muc#owner") + :add_child(self:get_form_layout():form()) + ); +end + +function room_mt:get_form_layout() local title = "Configuration for "..self.jid; - origin.send(st.reply(stanza):query("http://jabber.org/protocol/muc#owner") - :add_child(dataform.new({ + return dataform.new({ title = title, instructions = title, { @@ -583,8 +588,7 @@ label = 'Make Room Members-Only?', value = self:is_members_only() } - }):form()) - ); + }); end local valid_whois = { @@ -598,18 +602,10 @@ for _, tag in ipairs(query.tags) do if tag.name == "x" and tag.attr.xmlns == "jabber:x:data" then form = tag; break; end end if not form then origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); return; end if form.attr.type == "cancel" then origin.send(st.reply(stanza)); return; end - if form.attr.type ~= "submit" then origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end - local fields = {}; - for _, field in pairs(form.tags) do - if field.name == "field" and field.attr.var then - if field.tags[1] and field.tags[1].name == "value" and #field.tags[1].tags == 0 then - fields[field.attr.var] = field.tags[1][1] or ""; - elseif field.attr.type == "boolean" then - fields[field.attr.var] = "false"; - end - end - end - if fields.FORM_TYPE ~= "http://jabber.org/protocol/muc#roomconfig" then origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end + if form.attr.type ~= "submit" then origin.send(st.error_reply(stanza, "cancel", "bad-request", "Not a submitted form")); return; end + + local fields = self:get_form_layout():data(form); + if fields.FORM_TYPE ~= "http://jabber.org/protocol/muc#roomconfig" then origin.send(st.error_reply(stanza, "cancel", "bad-request", "Form is not of type room configuration")); return; end local dirty = false @@ -624,31 +620,23 @@ end local persistent = fields['muc#roomconfig_persistentroom']; - if persistent == "0" or persistent == "false" then persistent = nil; elseif persistent == "1" or persistent == "true" then persistent = true; - else origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end dirty = dirty or (self:is_persistent() ~= persistent) module:log("debug", "persistent=%s", tostring(persistent)); local moderated = fields['muc#roomconfig_moderatedroom']; - if moderated == "0" or moderated == "false" then moderated = nil; elseif moderated == "1" or moderated == "true" then moderated = true; - else origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end dirty = dirty or (self:is_moderated() ~= moderated) module:log("debug", "moderated=%s", tostring(moderated)); local membersonly = fields['muc#roomconfig_membersonly']; - if membersonly == "0" or membersonly == "false" then membersonly = nil; elseif membersonly == "1" or membersonly == "true" then membersonly = true; - else origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end dirty = dirty or (self:is_members_only() ~= membersonly) module:log("debug", "membersonly=%s", tostring(membersonly)); local public = fields['muc#roomconfig_publicroom']; - if public == "0" or public == "false" then public = nil; elseif public == "1" or public == "true" then public = true; - else origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end dirty = dirty or (self:is_hidden() ~= (not public and true or nil)) local whois = fields['muc#roomconfig_whois']; if not valid_whois[whois] then - origin.send(st.error_reply(stanza, 'cancel', 'bad-request')); + origin.send(st.error_reply(stanza, 'cancel', 'bad-request', "Invalid value for 'whois'")); return; end local whois_changed = self._data.whois ~= whois @@ -656,7 +644,7 @@ module:log('debug', 'whois=%s', whois) local password = fields['muc#roomconfig_roomsecret']; - if password then + if self:get_password() ~= password then self:set_password(password); end self:set_moderated(moderated);