plugins/mod_disco.lua
changeset 9226 80dbb60d81e4
parent 8837 b0093d3b2d04
child 11208 ae2a11066001
equal deleted inserted replaced
9225:fe8abac62682 9226:80dbb60d81e4
    93 module:hook("item-removed/identity", clear_disco_cache);
    93 module:hook("item-removed/identity", clear_disco_cache);
    94 module:hook("item-removed/feature", clear_disco_cache);
    94 module:hook("item-removed/feature", clear_disco_cache);
    95 module:hook("item-removed/extension", clear_disco_cache);
    95 module:hook("item-removed/extension", clear_disco_cache);
    96 
    96 
    97 -- Handle disco requests to the server
    97 -- Handle disco requests to the server
    98 module:hook("iq/host/http://jabber.org/protocol/disco#info:query", function(event)
    98 module:hook("iq-get/host/http://jabber.org/protocol/disco#info:query", function(event)
    99 	local origin, stanza = event.origin, event.stanza;
    99 	local origin, stanza = event.origin, event.stanza;
   100 	if stanza.attr.type ~= "get" then return; end
       
   101 	local node = stanza.tags[1].attr.node;
   100 	local node = stanza.tags[1].attr.node;
   102 	if node and node ~= "" and node ~= "http://prosody.im#"..get_server_caps_hash() then
   101 	if node and node ~= "" and node ~= "http://prosody.im#"..get_server_caps_hash() then
   103 		local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#info', node=node});
   102 		local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#info', node=node});
   104 		local node_event = { origin = origin, stanza = stanza, reply = reply, node = node, exists = false};
   103 		local node_event = { origin = origin, stanza = stanza, reply = reply, node = node, exists = false};
   105 		local ret = module:fire_event("host-disco-info-node", node_event);
   104 		local ret = module:fire_event("host-disco-info-node", node_event);
   115 	reply_query.attr.node = node;
   114 	reply_query.attr.node = node;
   116 	local reply = st.reply(stanza):add_child(reply_query);
   115 	local reply = st.reply(stanza):add_child(reply_query);
   117 	origin.send(reply);
   116 	origin.send(reply);
   118 	return true;
   117 	return true;
   119 end);
   118 end);
   120 module:hook("iq/host/http://jabber.org/protocol/disco#items:query", function(event)
   119 module:hook("iq-get/host/http://jabber.org/protocol/disco#items:query", function(event)
   121 	local origin, stanza = event.origin, event.stanza;
   120 	local origin, stanza = event.origin, event.stanza;
   122 	if stanza.attr.type ~= "get" then return; end
       
   123 	local node = stanza.tags[1].attr.node;
   121 	local node = stanza.tags[1].attr.node;
   124 	if node and node ~= "" then
   122 	if node and node ~= "" then
   125 		local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#items', node=node});
   123 		local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#items', node=node});
   126 		local node_event = { origin = origin, stanza = stanza, reply = reply, node = node, exists = false};
   124 		local node_event = { origin = origin, stanza = stanza, reply = reply, node = node, exists = false};
   127 		local ret = module:fire_event("host-disco-items-node", node_event);
   125 		local ret = module:fire_event("host-disco-items-node", node_event);
   153 	end
   151 	end
   154 end);
   152 end);
   155 
   153 
   156 -- Handle disco requests to user accounts
   154 -- Handle disco requests to user accounts
   157 if module:get_host_type() ~= "local" then	return end -- skip for components
   155 if module:get_host_type() ~= "local" then	return end -- skip for components
   158 module:hook("iq/bare/http://jabber.org/protocol/disco#info:query", function(event)
   156 module:hook("iq-get/bare/http://jabber.org/protocol/disco#info:query", function(event)
   159 	local origin, stanza = event.origin, event.stanza;
   157 	local origin, stanza = event.origin, event.stanza;
   160 	if stanza.attr.type ~= "get" then return; end
       
   161 	local node = stanza.tags[1].attr.node;
   158 	local node = stanza.tags[1].attr.node;
   162 	local username = jid_split(stanza.attr.to) or origin.username;
   159 	local username = jid_split(stanza.attr.to) or origin.username;
   163 	if not stanza.attr.to or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then
   160 	if not stanza.attr.to or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then
   164 		if node and node ~= "" then
   161 		if node and node ~= "" then
   165 			local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#info', node=node});
   162 			local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#info', node=node});
   180 		module:fire_event("account-disco-info", { origin = origin, reply = reply });
   177 		module:fire_event("account-disco-info", { origin = origin, reply = reply });
   181 		origin.send(reply);
   178 		origin.send(reply);
   182 		return true;
   179 		return true;
   183 	end
   180 	end
   184 end);
   181 end);
   185 module:hook("iq/bare/http://jabber.org/protocol/disco#items:query", function(event)
   182 module:hook("iq-get/bare/http://jabber.org/protocol/disco#items:query", function(event)
   186 	local origin, stanza = event.origin, event.stanza;
   183 	local origin, stanza = event.origin, event.stanza;
   187 	if stanza.attr.type ~= "get" then return; end
       
   188 	local node = stanza.tags[1].attr.node;
   184 	local node = stanza.tags[1].attr.node;
   189 	local username = jid_split(stanza.attr.to) or origin.username;
   185 	local username = jid_split(stanza.attr.to) or origin.username;
   190 	if not stanza.attr.to or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then
   186 	if not stanza.attr.to or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then
   191 		if node and node ~= "" then
   187 		if node and node ~= "" then
   192 			local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#items', node=node});
   188 			local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#items', node=node});