plugins/muc/muc.lib.lua
changeset 3591 dff4a77ee285
parent 3590 dcc5f3402f5b
child 3592 3adac5780c5a
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);