Annotate

plugins/mod_external_services.lua @ 11763:e273ef869794

net.server: Pikc server_epoll as unconditional default Previously it would have gone for server_select if util.poll was for some reason not available, which should be never these days. And even if it was, best to flush it out by throwing loud errors so users notice. Then they can work around it by using select until we delete that one.
author Kim Alvefur <zash@zash.se>
date Fri, 03 Sep 2021 17:39:00 +0200
parent 11756:a0e17b7c8b05
child 11933:f752427a5214
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11036
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 local dt = require "util.datetime";
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 local base64 = require "util.encodings".base64;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 local hashes = require "util.hashes";
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 local st = require "util.stanza";
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 local jid = require "util.jid";
11040
c560531d9a6e mod_external_services: Validate services added via events
Kim Alvefur <zash@zash.se>
parents: 11039
diff changeset
7 local array = require "util.array";
11754
21a9b3f2a728 mod_external_services: Filter services by requested credentials using a Set
Kim Alvefur <zash@zash.se>
parents: 11753
diff changeset
8 local set = require "util.set";
11036
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 local default_host = module:get_option_string("external_service_host", module.host);
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 local default_port = module:get_option_number("external_service_port");
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 local default_secret = module:get_option_string("external_service_secret");
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 local default_ttl = module:get_option_number("external_service_ttl", 86400);
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 local configured_services = module:get_option_array("external_services", {});
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 local access = module:get_option_set("external_service_access", {});
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18
11038
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
19 -- https://tools.ietf.org/html/draft-uberti-behave-turn-rest-00
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
20 local function behave_turn_rest_credentials(srv, item, secret)
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
21 local ttl = default_ttl;
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
22 if type(item.ttl) == "number" then
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
23 ttl = item.ttl;
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
24 end
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
25 local expires = srv.expires or os.time() + ttl;
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
26 local username;
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
27 if type(item.username) == "string" then
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
28 username = string.format("%d:%s", expires, item.username);
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
29 else
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
30 username = string.format("%d", expires);
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
31 end
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
32 srv.username = username;
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
33 srv.password = base64.encode(hashes.hmac_sha1(secret, srv.username));
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
34 end
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
35
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
36 local algorithms = {
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
37 turn = behave_turn_rest_credentials;
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
38 }
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
39
11036
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 -- filter config into well-defined service records
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 local function prepare(item)
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 if type(item) ~= "table" then
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 module:log("error", "Service definition is not a table: %q", item);
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 return nil;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
47 local srv = {
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48 type = nil;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 transport = nil;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 host = default_host;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 port = default_port;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 username = nil;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
53 password = nil;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 restricted = nil;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
55 expires = nil;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56 };
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
58 if type(item.type) == "string" then
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
59 srv.type = item.type;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
60 else
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
61 module:log("error", "Service missing mandatory 'type' field: %q", item);
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
62 return nil;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
63 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
64 if type(item.transport) == "string" then
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65 srv.transport = item.transport;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
67 if type(item.host) == "string" then
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 srv.host = item.host;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70 if type(item.port) == "number" then
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
71 srv.port = item.port;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73 if type(item.username) == "string" then
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
74 srv.username = item.username;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 if type(item.password) == "string" then
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
77 srv.password = item.password;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
78 srv.restricted = true;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
79 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
80 if item.restricted == true then
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81 srv.restricted = true;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
82 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
83 if type(item.expires) == "number" then
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
84 srv.expires = item.expires;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
85 elseif type(item.ttl) == "number" then
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
86 srv.expires = os.time() + item.ttl;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
87 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
88 if (item.secret == true and default_secret) or type(item.secret) == "string" then
11039
ec6919401790 mod_external_services: Allow specifying a credential generation callback
Kim Alvefur <zash@zash.se>
parents: 11038
diff changeset
89 local secret_cb = item.credentials_cb or algorithms[item.algorithm] or algorithms[srv.type];
11036
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
90 local secret = item.secret;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
91 if secret == true then
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
92 secret = default_secret;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
93 end
11038
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
94 if secret_cb then
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
95 secret_cb(srv, item, secret);
efefdf71373b mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents: 11037
diff changeset
96 srv.restricted = true;
11036
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
97 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
98 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
99 return srv;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
100 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
101
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
102 function module.load()
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
103 -- Trigger errors on startup
11626
ef62d29c8fdc mod_external_services: Also validate services added by other modules
Kim Alvefur <zash@zash.se>
parents: 11040
diff changeset
104 local extras = module:get_host_items("external_service");
ef62d29c8fdc mod_external_services: Also validate services added by other modules
Kim Alvefur <zash@zash.se>
parents: 11040
diff changeset
105 local services = ( configured_services + extras ) / prepare;
11036
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
106 if #services == 0 then
11628
0807e835d3b5 mod_external_services: Report overall status as a module status
Kim Alvefur <zash@zash.se>
parents: 11627
diff changeset
107 module:set_status("warn", "No services configured or all had errors");
11036
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
108 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
109 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
110
11627
3a5212fd7e8e mod_external_services: Validate items as they are added
Kim Alvefur <zash@zash.se>
parents: 11626
diff changeset
111 module:handle_items("external_service", function(added)
11628
0807e835d3b5 mod_external_services: Report overall status as a module status
Kim Alvefur <zash@zash.se>
parents: 11627
diff changeset
112 if prepare(added.item) then
0807e835d3b5 mod_external_services: Report overall status as a module status
Kim Alvefur <zash@zash.se>
parents: 11627
diff changeset
113 module:set_status("core", "OK");
0807e835d3b5 mod_external_services: Report overall status as a module status
Kim Alvefur <zash@zash.se>
parents: 11627
diff changeset
114 end
11627
3a5212fd7e8e mod_external_services: Validate items as they are added
Kim Alvefur <zash@zash.se>
parents: 11626
diff changeset
115 end, module.load);
3a5212fd7e8e mod_external_services: Validate items as they are added
Kim Alvefur <zash@zash.se>
parents: 11626
diff changeset
116
11040
c560531d9a6e mod_external_services: Validate services added via events
Kim Alvefur <zash@zash.se>
parents: 11039
diff changeset
117 -- Ensure only valid items are added in events
c560531d9a6e mod_external_services: Validate services added via events
Kim Alvefur <zash@zash.se>
parents: 11039
diff changeset
118 local services_mt = {
c560531d9a6e mod_external_services: Validate services added via events
Kim Alvefur <zash@zash.se>
parents: 11039
diff changeset
119 __index = getmetatable(array()).__index;
c560531d9a6e mod_external_services: Validate services added via events
Kim Alvefur <zash@zash.se>
parents: 11039
diff changeset
120 __newindex = function (self, i, v)
c560531d9a6e mod_external_services: Validate services added via events
Kim Alvefur <zash@zash.se>
parents: 11039
diff changeset
121 rawset(self, i, assert(prepare(v), "Invalid service entry added"));
c560531d9a6e mod_external_services: Validate services added via events
Kim Alvefur <zash@zash.se>
parents: 11039
diff changeset
122 end;
c560531d9a6e mod_external_services: Validate services added via events
Kim Alvefur <zash@zash.se>
parents: 11039
diff changeset
123 }
c560531d9a6e mod_external_services: Validate services added via events
Kim Alvefur <zash@zash.se>
parents: 11039
diff changeset
124
11755
ae565e49289a mod_external_services: Factor out public function returning current services
Kim Alvefur <zash@zash.se>
parents: 11754
diff changeset
125 function get_services()
ae565e49289a mod_external_services: Factor out public function returning current services
Kim Alvefur <zash@zash.se>
parents: 11754
diff changeset
126 local extras = module:get_host_items("external_service");
ae565e49289a mod_external_services: Factor out public function returning current services
Kim Alvefur <zash@zash.se>
parents: 11754
diff changeset
127 local services = ( configured_services + extras ) / prepare;
ae565e49289a mod_external_services: Factor out public function returning current services
Kim Alvefur <zash@zash.se>
parents: 11754
diff changeset
128
ae565e49289a mod_external_services: Factor out public function returning current services
Kim Alvefur <zash@zash.se>
parents: 11754
diff changeset
129 setmetatable(services, services_mt);
ae565e49289a mod_external_services: Factor out public function returning current services
Kim Alvefur <zash@zash.se>
parents: 11754
diff changeset
130
ae565e49289a mod_external_services: Factor out public function returning current services
Kim Alvefur <zash@zash.se>
parents: 11754
diff changeset
131 return services;
ae565e49289a mod_external_services: Factor out public function returning current services
Kim Alvefur <zash@zash.se>
parents: 11754
diff changeset
132 end
ae565e49289a mod_external_services: Factor out public function returning current services
Kim Alvefur <zash@zash.se>
parents: 11754
diff changeset
133
11756
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
134 function services_xml(services, name, namespace)
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
135 local reply = st.stanza(name or "services", { xmlns = namespace or "urn:xmpp:extdisco:2" });
11036
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
136
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
137 for _, srv in ipairs(services) do
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
138 reply:tag("service", {
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
139 type = srv.type;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
140 transport = srv.transport;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
141 host = srv.host;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
142 port = srv.port and string.format("%d", srv.port) or nil;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
143 username = srv.username;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
144 password = srv.password;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
145 expires = srv.expires and dt.datetime(srv.expires) or nil;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
146 restricted = srv.restricted and "1" or nil;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
147 }):up();
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
148 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
149
11756
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
150 return reply;
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
151 end
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
152
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
153 local function handle_services(event)
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
154 local origin, stanza = event.origin, event.stanza;
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
155 local action = stanza.tags[1];
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
156
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
157 local user_bare = jid.bare(stanza.attr.from);
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
158 local user_host = jid.host(user_bare);
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
159 if not ((access:empty() and origin.type == "c2s") or access:contains(user_bare) or access:contains(user_host)) then
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
160 origin.send(st.error_reply(stanza, "auth", "forbidden"));
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
161 return true;
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
162 end
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
163
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
164 local services = get_services();
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
165
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
166 local requested_type = action.attr.type;
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
167 if requested_type then
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
168 services:filter(function(item)
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
169 return item.type == requested_type;
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
170 end);
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
171 end
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
172
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
173 module:fire_event("external_service/services", {
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
174 origin = origin;
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
175 stanza = stanza;
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
176 requested_type = requested_type;
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
177 services = services;
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
178 });
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
179
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
180 local reply = st.reply(stanza):add_child(services_xml(services, action.name, action.attr.xmlns));
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
181
11036
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
182 origin.send(reply);
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
183 return true;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
184 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
185
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
186 local function handle_credentials(event)
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
187 local origin, stanza = event.origin, event.stanza;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
188 local action = stanza.tags[1];
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
189
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
190 if origin.type ~= "c2s" then
11753
c4599a7c534c mod_external_services: Validate required attributes on credentials requests
Kim Alvefur <zash@zash.se>
parents: 11628
diff changeset
191 origin.send(st.error_reply(stanza, "auth", "forbidden", "The 'port' and 'type' attributes are required."));
11036
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
192 return true;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
193 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
194
11755
ae565e49289a mod_external_services: Factor out public function returning current services
Kim Alvefur <zash@zash.se>
parents: 11754
diff changeset
195 local services = get_services();
11036
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
196 services:filter(function (item)
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
197 return item.restricted;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
198 end)
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
199
11754
21a9b3f2a728 mod_external_services: Filter services by requested credentials using a Set
Kim Alvefur <zash@zash.se>
parents: 11753
diff changeset
200 local requested_credentials = set.new();
11036
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
201 for service in action:childtags("service") do
11753
c4599a7c534c mod_external_services: Validate required attributes on credentials requests
Kim Alvefur <zash@zash.se>
parents: 11628
diff changeset
202 if not service.attr.type or not service.attr.host then
c4599a7c534c mod_external_services: Validate required attributes on credentials requests
Kim Alvefur <zash@zash.se>
parents: 11628
diff changeset
203 origin.send(st.error_reply(stanza, "modify", "bad-request"));
c4599a7c534c mod_external_services: Validate required attributes on credentials requests
Kim Alvefur <zash@zash.se>
parents: 11628
diff changeset
204 return true;
c4599a7c534c mod_external_services: Validate required attributes on credentials requests
Kim Alvefur <zash@zash.se>
parents: 11628
diff changeset
205 end
c4599a7c534c mod_external_services: Validate required attributes on credentials requests
Kim Alvefur <zash@zash.se>
parents: 11628
diff changeset
206
11754
21a9b3f2a728 mod_external_services: Filter services by requested credentials using a Set
Kim Alvefur <zash@zash.se>
parents: 11753
diff changeset
207 requested_credentials:add(string.format("%s:%s:%d", service.attr.type, service.attr.host,
21a9b3f2a728 mod_external_services: Filter services by requested credentials using a Set
Kim Alvefur <zash@zash.se>
parents: 11753
diff changeset
208 tonumber(service.attr.port) or 0));
11036
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
209 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
210
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
211 module:fire_event("external_service/credentials", {
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
212 origin = origin;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
213 stanza = stanza;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
214 requested_credentials = requested_credentials;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
215 services = services;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
216 });
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
217
11754
21a9b3f2a728 mod_external_services: Filter services by requested credentials using a Set
Kim Alvefur <zash@zash.se>
parents: 11753
diff changeset
218 services:filter(function (srv)
21a9b3f2a728 mod_external_services: Filter services by requested credentials using a Set
Kim Alvefur <zash@zash.se>
parents: 11753
diff changeset
219 local port_key = string.format("%s:%s:%d", srv.type, srv.host, srv.port or 0);
21a9b3f2a728 mod_external_services: Filter services by requested credentials using a Set
Kim Alvefur <zash@zash.se>
parents: 11753
diff changeset
220 local portless_key = string.format("%s:%s:%d", srv.type, srv.host, 0);
21a9b3f2a728 mod_external_services: Filter services by requested credentials using a Set
Kim Alvefur <zash@zash.se>
parents: 11753
diff changeset
221 return requested_credentials:contains(port_key) or requested_credentials:contains(portless_key);
21a9b3f2a728 mod_external_services: Filter services by requested credentials using a Set
Kim Alvefur <zash@zash.se>
parents: 11753
diff changeset
222 end);
21a9b3f2a728 mod_external_services: Filter services by requested credentials using a Set
Kim Alvefur <zash@zash.se>
parents: 11753
diff changeset
223
11756
a0e17b7c8b05 mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents: 11755
diff changeset
224 local reply = st.reply(stanza):add_child(services_xml(services, action.name, action.attr.xmlns));
11036
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
225
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
226 origin.send(reply);
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
227 return true;
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
228 end
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
229
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
230 -- XEP-0215 v0.7
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
231 module:add_feature("urn:xmpp:extdisco:2");
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
232 module:hook("iq-get/host/urn:xmpp:extdisco:2:services", handle_services);
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
233 module:hook("iq-get/host/urn:xmpp:extdisco:2:credentials", handle_credentials);
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
234
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
235 -- COMPAT XEP-0215 v0.6
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
236 -- Those still on the old version gets to deal with undefined attributes until they upgrade.
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
237 module:add_feature("urn:xmpp:extdisco:1");
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
238 module:hook("iq-get/host/urn:xmpp:extdisco:1:services", handle_services);
79e410cd7f6e mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff changeset
239 module:hook("iq-get/host/urn:xmpp:extdisco:1:credentials", handle_credentials);