Annotate

plugins/mod_disco.lua @ 5524:e9090966c803

util.prosodyctl: Initialize storagemanager on the host before initializing usermanager. This fixes brokenness when the auth provider opens the store on load (as they all do since eeea0eb2602a) (thanks nulani)
author Matthew Wild <mwild1@gmail.com>
date Sat, 27 Apr 2013 13:11:03 +0100
parent 5081:c0c060e450be
child 5627:0439d1349dc1
child 8002:57060d0cee4b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1523
841d61be198f Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents: 1510
diff changeset
1 -- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1704
diff changeset
2 -- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1704
diff changeset
3 -- Copyright (C) 2008-2010 Waqas Hussain
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
4 --
758
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
5 -- This project is MIT/X11 licensed. Please see the
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
6 -- COPYING file in the source package for more information.
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
7 --
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
8
3600
c888328ae6b3 mod_disco: Updated to use hostmanager.get_children instead of componentmanager.get_children.
Waqas Hussain <waqas20@gmail.com>
parents: 3572
diff changeset
9 local get_children = require "core.hostmanager".get_children;
2383
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
10 local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed;
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
11 local jid_split = require "util.jid".split;
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
12 local jid_bare = require "util.jid".bare;
1704
9b445d2427e2 mod_disco: Rearranged some lines, and added a FIXME comment
Waqas Hussain <waqas20@gmail.com>
parents: 1703
diff changeset
13 local st = require "util.stanza"
3343
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
14 local calculate_hash = require "util.caps".calculate_hash;
1510
83b2e07e9039 mod_disco: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
15
2491
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
16 local disco_items = module:get_option("disco_items") or {};
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
17 do -- validate disco_items
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
18 for _, item in ipairs(disco_items) do
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
19 local err;
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
20 if type(item) ~= "table" then
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
21 err = "item is not a table";
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
22 elseif type(item[1]) ~= "string" then
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
23 err = "item jid is not a string";
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
24 elseif item[2] and type(item[2]) ~= "string" then
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
25 err = "item name is not a string";
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
26 end
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
27 if err then
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
28 module:log("error", "option disco_items is malformed: %s", err);
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
29 disco_items = {}; -- TODO clean up data instead of removing it?
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
30 break;
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
31 end
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
32 end
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
33 end
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
34
4985
0f72123ff513 mod_disco: Allow configurable name in disco identity (defaults to 'Prosody')
Matthew Wild <mwild1@gmail.com>
parents: 4337
diff changeset
35 module:add_identity("server", "im", module:get_option_string("name", "Prosody")); -- FIXME should be in the non-existing mod_router
1510
83b2e07e9039 mod_disco: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
36 module:add_feature("http://jabber.org/protocol/disco#info");
83b2e07e9039 mod_disco: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
37 module:add_feature("http://jabber.org/protocol/disco#items");
83b2e07e9039 mod_disco: Convert from Windows line endings
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
38
3347
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
39 -- Generate and cache disco result and caps hash
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
40 local _cached_server_disco_info, _cached_server_caps_feature, _cached_server_caps_hash;
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
41 local function build_server_disco_info()
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
42 local query = st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#info" });
3343
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
43 local done = {};
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
44 for _,identity in ipairs(module:get_host_items("identity")) do
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
45 local identity_s = identity.category.."\0"..identity.type;
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
46 if not done[identity_s] then
3347
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
47 query:tag("identity", identity):up();
3343
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
48 done[identity_s] = true;
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
49 end
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
50 end
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
51 for _,feature in ipairs(module:get_host_items("feature")) do
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
52 if not done[feature] then
3347
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
53 query:tag("feature", {var=feature}):up();
3343
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
54 done[feature] = true;
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
55 end
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
56 end
4337
a2ee8ab82dd9 core.modulemanager, mod_disco: Add support for XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3695
diff changeset
57 for _,extension in ipairs(module:get_host_items("extension")) do
a2ee8ab82dd9 core.modulemanager, mod_disco: Add support for XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3695
diff changeset
58 if not done[extension] then
a2ee8ab82dd9 core.modulemanager, mod_disco: Add support for XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3695
diff changeset
59 query:add_child(extension);
a2ee8ab82dd9 core.modulemanager, mod_disco: Add support for XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3695
diff changeset
60 done[extension] = true;
a2ee8ab82dd9 core.modulemanager, mod_disco: Add support for XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3695
diff changeset
61 end
a2ee8ab82dd9 core.modulemanager, mod_disco: Add support for XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3695
diff changeset
62 end
3347
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
63 _cached_server_disco_info = query;
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
64 _cached_server_caps_hash = calculate_hash(query);
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
65 _cached_server_caps_feature = st.stanza("c", {
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
66 xmlns = "http://jabber.org/protocol/caps";
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
67 hash = "sha-1";
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
68 node = "http://prosody.im";
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
69 ver = _cached_server_caps_hash;
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
70 });
3343
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
71 end
3347
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
72 local function clear_disco_cache()
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
73 _cached_server_disco_info, _cached_server_caps_feature, _cached_server_caps_hash = nil, nil, nil;
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
74 end
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
75 local function get_server_disco_info()
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
76 if not _cached_server_disco_info then build_server_disco_info(); end
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
77 return _cached_server_disco_info;
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
78 end
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
79 local function get_server_caps_feature()
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
80 if not _cached_server_caps_feature then build_server_disco_info(); end
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
81 return _cached_server_caps_feature;
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
82 end
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
83 local function get_server_caps_hash()
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
84 if not _cached_server_caps_hash then build_server_disco_info(); end
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
85 return _cached_server_caps_hash;
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
86 end
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
87
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
88 module:hook("item-added/identity", clear_disco_cache);
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
89 module:hook("item-added/feature", clear_disco_cache);
4337
a2ee8ab82dd9 core.modulemanager, mod_disco: Add support for XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3695
diff changeset
90 module:hook("item-added/extension", clear_disco_cache);
3665
98b55c3a3deb mod_disco: Fixed: Service discovery features were not being removed on module unload (issue #205).
Waqas Hussain <waqas20@gmail.com>
parents: 3600
diff changeset
91 module:hook("item-removed/identity", clear_disco_cache);
98b55c3a3deb mod_disco: Fixed: Service discovery features were not being removed on module unload (issue #205).
Waqas Hussain <waqas20@gmail.com>
parents: 3600
diff changeset
92 module:hook("item-removed/feature", clear_disco_cache);
4337
a2ee8ab82dd9 core.modulemanager, mod_disco: Add support for XEP-0128: Service Discovery Extensions
Kim Alvefur <zash@zash.se>
parents: 3695
diff changeset
93 module:hook("item-removed/extension", clear_disco_cache);
3347
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
94
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
95 -- Handle disco requests to the server
1699
53d16a28ee00 mod_disco: Handle disco#info queries using new APIs
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
96 module:hook("iq/host/http://jabber.org/protocol/disco#info:query", function(event)
53d16a28ee00 mod_disco: Handle disco#info queries using new APIs
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
97 local origin, stanza = event.origin, event.stanza;
53d16a28ee00 mod_disco: Handle disco#info queries using new APIs
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
98 if stanza.attr.type ~= "get" then return; end
53d16a28ee00 mod_disco: Handle disco#info queries using new APIs
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
99 local node = stanza.tags[1].attr.node;
3348
3b84a84f472a mod_disco: Respond to disco#info to the correct caps hash node ("node#ver").
Waqas Hussain <waqas20@gmail.com>
parents: 3347
diff changeset
100 if node and node ~= "" and node ~= "http://prosody.im#"..get_server_caps_hash() then return; end -- TODO fire event?
3349
a416d714a905 mod_disco: Reflect requested 'node' attribute in the disco#info reply.
Waqas Hussain <waqas20@gmail.com>
parents: 3348
diff changeset
101 local reply_query = get_server_disco_info();
a416d714a905 mod_disco: Reflect requested 'node' attribute in the disco#info reply.
Waqas Hussain <waqas20@gmail.com>
parents: 3348
diff changeset
102 reply_query.node = node;
a416d714a905 mod_disco: Reflect requested 'node' attribute in the disco#info reply.
Waqas Hussain <waqas20@gmail.com>
parents: 3348
diff changeset
103 local reply = st.reply(stanza):add_child(reply_query);
1699
53d16a28ee00 mod_disco: Handle disco#info queries using new APIs
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
104 origin.send(reply);
53d16a28ee00 mod_disco: Handle disco#info queries using new APIs
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
105 return true;
53d16a28ee00 mod_disco: Handle disco#info queries using new APIs
Waqas Hussain <waqas20@gmail.com>
parents: 1523
diff changeset
106 end);
1701
ceab61010f87 mod_disco: Handle disco#items queries using new APIs
Waqas Hussain <waqas20@gmail.com>
parents: 1700
diff changeset
107 module:hook("iq/host/http://jabber.org/protocol/disco#items:query", function(event)
ceab61010f87 mod_disco: Handle disco#items queries using new APIs
Waqas Hussain <waqas20@gmail.com>
parents: 1700
diff changeset
108 local origin, stanza = event.origin, event.stanza;
ceab61010f87 mod_disco: Handle disco#items queries using new APIs
Waqas Hussain <waqas20@gmail.com>
parents: 1700
diff changeset
109 if stanza.attr.type ~= "get" then return; end
ceab61010f87 mod_disco: Handle disco#items queries using new APIs
Waqas Hussain <waqas20@gmail.com>
parents: 1700
diff changeset
110 local node = stanza.tags[1].attr.node;
ceab61010f87 mod_disco: Handle disco#items queries using new APIs
Waqas Hussain <waqas20@gmail.com>
parents: 1700
diff changeset
111 if node and node ~= "" then return; end -- TODO fire event?
ceab61010f87 mod_disco: Handle disco#items queries using new APIs
Waqas Hussain <waqas20@gmail.com>
parents: 1700
diff changeset
112
ceab61010f87 mod_disco: Handle disco#items queries using new APIs
Waqas Hussain <waqas20@gmail.com>
parents: 1700
diff changeset
113 local reply = st.reply(stanza):query("http://jabber.org/protocol/disco#items");
5081
c0c060e450be hostmanager, mod_disco: Show optional 'name' option from the config in disco#items queries (fixes use-case in #292) (thanks diSabler, mva)
Matthew Wild <mwild1@gmail.com>
parents: 4985
diff changeset
114 for jid, name in pairs(get_children(module.host)) do
c0c060e450be hostmanager, mod_disco: Show optional 'name' option from the config in disco#items queries (fixes use-case in #292) (thanks diSabler, mva)
Matthew Wild <mwild1@gmail.com>
parents: 4985
diff changeset
115 reply:tag("item", {jid = jid, name = name~=true and name or nil}):up();
1701
ceab61010f87 mod_disco: Handle disco#items queries using new APIs
Waqas Hussain <waqas20@gmail.com>
parents: 1700
diff changeset
116 end
2491
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
117 for _, item in ipairs(disco_items) do
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
118 reply:tag("item", {jid=item[1], name=item[2]}):up();
4be6810914eb mod_disco: Added option 'disco_items' to allow appending items to a host's disco#items result.
Waqas Hussain <waqas20@gmail.com>
parents: 2383
diff changeset
119 end
1701
ceab61010f87 mod_disco: Handle disco#items queries using new APIs
Waqas Hussain <waqas20@gmail.com>
parents: 1700
diff changeset
120 origin.send(reply);
ceab61010f87 mod_disco: Handle disco#items queries using new APIs
Waqas Hussain <waqas20@gmail.com>
parents: 1700
diff changeset
121 return true;
ceab61010f87 mod_disco: Handle disco#items queries using new APIs
Waqas Hussain <waqas20@gmail.com>
parents: 1700
diff changeset
122 end);
3343
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
123
3347
99f56bed5228 mod_disco: Cache disco#info reply and caps hash for host, return correct caps hash, and respond to disco#info to the caps hash node.
Waqas Hussain <waqas20@gmail.com>
parents: 3343
diff changeset
124 -- Handle caps stream feature
3343
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
125 module:hook("stream-features", function (event)
3695
d2c4856c7ed5 mod_disco: Don't add caps hash to stream features on unauthenticated connections.
Waqas Hussain <waqas20@gmail.com>
parents: 3665
diff changeset
126 if event.origin.type == "c2s" then
d2c4856c7ed5 mod_disco: Don't add caps hash to stream features on unauthenticated connections.
Waqas Hussain <waqas20@gmail.com>
parents: 3665
diff changeset
127 event.features:add_child(get_server_caps_feature());
d2c4856c7ed5 mod_disco: Don't add caps hash to stream features on unauthenticated connections.
Waqas Hussain <waqas20@gmail.com>
parents: 3665
diff changeset
128 end
3343
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
129 end);
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
130
c70c6d5bf270 mod_disco: Support for putting the server's caps hash in stream:features to allow the client to cache disco#info for the server instead of requesting it at each login.
Matthew Wild <mwild1@gmail.com>
parents: 2925
diff changeset
131 -- Handle disco requests to user accounts
2383
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
132 module:hook("iq/bare/http://jabber.org/protocol/disco#info:query", function(event)
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
133 local origin, stanza = event.origin, event.stanza;
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
134 if stanza.attr.type ~= "get" then return; end
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
135 local node = stanza.tags[1].attr.node;
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
136 if node and node ~= "" then return; end -- TODO fire event?
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
137 local username = jid_split(stanza.attr.to) or origin.username;
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
138 if not stanza.attr.to or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
139 local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#info'});
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
140 if not reply.attr.from then reply.attr.from = origin.username.."@"..origin.host; end -- COMPAT To satisfy Psi when querying own account
3572
fb7fc154a56a mod_disco: Renamed the 'session' property of the account-disco-info and account-disco-items events to 'origin' for consistency.
Waqas Hussain <waqas20@gmail.com>
parents: 3349
diff changeset
141 module:fire_event("account-disco-info", { origin = origin, stanza = reply });
2383
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
142 origin.send(reply);
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
143 return true;
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
144 end
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
145 end);
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
146 module:hook("iq/bare/http://jabber.org/protocol/disco#items:query", function(event)
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
147 local origin, stanza = event.origin, event.stanza;
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
148 if stanza.attr.type ~= "get" then return; end
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
149 local node = stanza.tags[1].attr.node;
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
150 if node and node ~= "" then return; end -- TODO fire event?
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
151 local username = jid_split(stanza.attr.to) or origin.username;
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
152 if not stanza.attr.to or is_contact_subscribed(username, module.host, jid_bare(stanza.attr.from)) then
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
153 local reply = st.reply(stanza):tag('query', {xmlns='http://jabber.org/protocol/disco#items'});
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
154 if not reply.attr.from then reply.attr.from = origin.username.."@"..origin.host; end -- COMPAT To satisfy Psi when querying own account
3572
fb7fc154a56a mod_disco: Renamed the 'session' property of the account-disco-info and account-disco-items events to 'origin' for consistency.
Waqas Hussain <waqas20@gmail.com>
parents: 3349
diff changeset
155 module:fire_event("account-disco-items", { origin = origin, stanza = reply });
2383
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
156 origin.send(reply);
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
157 return true;
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
158 end
29a30884aadd mod_disco: Handle and fire events for service discovery queries for bare account JIDs (thanks darkrain).
Waqas Hussain <waqas20@gmail.com>
parents: 1704
diff changeset
159 end);