Comparison

plugins/muc/muc.lib.lua @ 3591:dff4a77ee285

MUC: Parse submitted form with util.dataforms
author Kim Alvefur <zash@zash.se>
date Wed, 10 Nov 2010 01:34:57 +0100
parent 3590:dcc5f3402f5b
child 3592:3adac5780c5a
comparison
equal deleted inserted replaced
3590:dcc5f3402f5b 3591:dff4a77ee285
520 end 520 end
521 end 521 end
522 end 522 end
523 523
524 function room_mt:send_form(origin, stanza) 524 function room_mt:send_form(origin, stanza)
525 origin.send(st.reply(stanza):query("http://jabber.org/protocol/muc#owner")
526 :add_child(self:get_form_layout():form())
527 );
528 end
529
530 function room_mt:get_form_layout()
525 local title = "Configuration for "..self.jid; 531 local title = "Configuration for "..self.jid;
526 origin.send(st.reply(stanza):query("http://jabber.org/protocol/muc#owner") 532 return dataform.new({
527 :add_child(dataform.new({
528 title = title, 533 title = title,
529 instructions = title, 534 instructions = title,
530 { 535 {
531 name = 'FORM_TYPE', 536 name = 'FORM_TYPE',
532 type = 'hidden', 537 type = 'hidden',
581 name = 'muc#roomconfig_membersonly', 586 name = 'muc#roomconfig_membersonly',
582 type = 'boolean', 587 type = 'boolean',
583 label = 'Make Room Members-Only?', 588 label = 'Make Room Members-Only?',
584 value = self:is_members_only() 589 value = self:is_members_only()
585 } 590 }
586 }):form()) 591 });
587 );
588 end 592 end
589 593
590 local valid_whois = { 594 local valid_whois = {
591 moderators = true, 595 moderators = true,
592 anyone = true, 596 anyone = true,
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);