596 local query = stanza.tags[1]; |
600 local query = stanza.tags[1]; |
597 local form; |
601 local form; |
598 for _, tag in ipairs(query.tags) do if tag.name == "x" and tag.attr.xmlns == "jabber:x:data" then form = tag; break; end end |
602 for _, tag in ipairs(query.tags) do if tag.name == "x" and tag.attr.xmlns == "jabber:x:data" then form = tag; break; end end |
599 if not form then origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); return; end |
603 if not form then origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); return; end |
600 if form.attr.type == "cancel" then origin.send(st.reply(stanza)); return; end |
604 if form.attr.type == "cancel" then origin.send(st.reply(stanza)); return; end |
601 if form.attr.type ~= "submit" then origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end |
605 if form.attr.type ~= "submit" then origin.send(st.error_reply(stanza, "cancel", "bad-request", "Not a submitted form")); return; end |
602 local fields = {}; |
606 |
603 for _, field in pairs(form.tags) do |
607 local fields = self:get_form_layout():data(form); |
604 if field.name == "field" and field.attr.var then |
608 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 |
605 if field.tags[1] and field.tags[1].name == "value" and #field.tags[1].tags == 0 then |
|
606 fields[field.attr.var] = field.tags[1][1] or ""; |
|
607 elseif field.attr.type == "boolean" then |
|
608 fields[field.attr.var] = "false"; |
|
609 end |
|
610 end |
|
611 end |
|
612 if fields.FORM_TYPE ~= "http://jabber.org/protocol/muc#roomconfig" then origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end |
|
613 |
609 |
614 local dirty = false |
610 local dirty = false |
615 |
611 |
616 local name = fields['muc#roomconfig_roomname']; |
612 local name = fields['muc#roomconfig_roomname']; |
617 if name then |
613 if name then |
622 if description then |
618 if description then |
623 self:set_description(description); |
619 self:set_description(description); |
624 end |
620 end |
625 |
621 |
626 local persistent = fields['muc#roomconfig_persistentroom']; |
622 local persistent = fields['muc#roomconfig_persistentroom']; |
627 if persistent == "0" or persistent == "false" then persistent = nil; elseif persistent == "1" or persistent == "true" then persistent = true; |
|
628 else origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end |
|
629 dirty = dirty or (self:is_persistent() ~= persistent) |
623 dirty = dirty or (self:is_persistent() ~= persistent) |
630 module:log("debug", "persistent=%s", tostring(persistent)); |
624 module:log("debug", "persistent=%s", tostring(persistent)); |
631 |
625 |
632 local moderated = fields['muc#roomconfig_moderatedroom']; |
626 local moderated = fields['muc#roomconfig_moderatedroom']; |
633 if moderated == "0" or moderated == "false" then moderated = nil; elseif moderated == "1" or moderated == "true" then moderated = true; |
|
634 else origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end |
|
635 dirty = dirty or (self:is_moderated() ~= moderated) |
627 dirty = dirty or (self:is_moderated() ~= moderated) |
636 module:log("debug", "moderated=%s", tostring(moderated)); |
628 module:log("debug", "moderated=%s", tostring(moderated)); |
637 |
629 |
638 local membersonly = fields['muc#roomconfig_membersonly']; |
630 local membersonly = fields['muc#roomconfig_membersonly']; |
639 if membersonly == "0" or membersonly == "false" then membersonly = nil; elseif membersonly == "1" or membersonly == "true" then membersonly = true; |
|
640 else origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end |
|
641 dirty = dirty or (self:is_members_only() ~= membersonly) |
631 dirty = dirty or (self:is_members_only() ~= membersonly) |
642 module:log("debug", "membersonly=%s", tostring(membersonly)); |
632 module:log("debug", "membersonly=%s", tostring(membersonly)); |
643 |
633 |
644 local public = fields['muc#roomconfig_publicroom']; |
634 local public = fields['muc#roomconfig_publicroom']; |
645 if public == "0" or public == "false" then public = nil; elseif public == "1" or public == "true" then public = true; |
|
646 else origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end |
|
647 dirty = dirty or (self:is_hidden() ~= (not public and true or nil)) |
635 dirty = dirty or (self:is_hidden() ~= (not public and true or nil)) |
648 |
636 |
649 local whois = fields['muc#roomconfig_whois']; |
637 local whois = fields['muc#roomconfig_whois']; |
650 if not valid_whois[whois] then |
638 if not valid_whois[whois] then |
651 origin.send(st.error_reply(stanza, 'cancel', 'bad-request')); |
639 origin.send(st.error_reply(stanza, 'cancel', 'bad-request', "Invalid value for 'whois'")); |
652 return; |
640 return; |
653 end |
641 end |
654 local whois_changed = self._data.whois ~= whois |
642 local whois_changed = self._data.whois ~= whois |
655 self._data.whois = whois |
643 self._data.whois = whois |
656 module:log('debug', 'whois=%s', whois) |
644 module:log('debug', 'whois=%s', whois) |
657 |
645 |
658 local password = fields['muc#roomconfig_roomsecret']; |
646 local password = fields['muc#roomconfig_roomsecret']; |
659 if password then |
647 if self:get_password() ~= password then |
660 self:set_password(password); |
648 self:set_password(password); |
661 end |
649 end |
662 self:set_moderated(moderated); |
650 self:set_moderated(moderated); |
663 self:set_members_only(membersonly); |
651 self:set_members_only(membersonly); |
664 self:set_persistent(persistent); |
652 self:set_persistent(persistent); |