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}); |