Mercurial > prosody-hg
annotate plugins/mod_external_services.lua @ 13946:f5e8ab42c708
mod_http_file_share: Check that files are still there with correct size
Failed uploads can leave behind unused slots. Files shouldn't change
size after they have been successfully uploaded, but might as well
double check it.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 04 Dec 2021 18:56:51 +0100 |
| parents | 79ae4821c05e |
| children |
| rev | line source |
|---|---|
|
11036
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1 |
|
12977
74b9e05af71e
plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12685
diff
changeset
|
2 local dt = require "prosody.util.datetime"; |
|
74b9e05af71e
plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12685
diff
changeset
|
3 local base64 = require "prosody.util.encodings".base64; |
|
74b9e05af71e
plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12685
diff
changeset
|
4 local hashes = require "prosody.util.hashes"; |
|
74b9e05af71e
plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12685
diff
changeset
|
5 local st = require "prosody.util.stanza"; |
|
74b9e05af71e
plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12685
diff
changeset
|
6 local jid = require "prosody.util.jid"; |
|
74b9e05af71e
plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12685
diff
changeset
|
7 local array = require "prosody.util.array"; |
|
74b9e05af71e
plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12685
diff
changeset
|
8 local set = require "prosody.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); |
|
13213
50324f66ca2a
plugins: Use integer config API with interval specification where sensible
Kim Alvefur <zash@zash.se>
parents:
13209
diff
changeset
|
11 local default_port = module:get_option_integer("external_service_port", nil, 1, 65535); |
|
11036
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"); |
|
13209
c8d949cf6b09
plugins: Switch to :get_option_period() for time range options
Kim Alvefur <zash@zash.se>
parents:
12977
diff
changeset
|
13 local default_ttl = module:get_option_period("external_service_ttl", "1 day"); |
|
11036
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 |
|
12685
4d75663d1552
mod_external_services: Update tools.ietf.org URL
Kim Alvefur <zash@zash.se>
parents:
12431
diff
changeset
|
19 -- https://datatracker.ietf.org/doc/html/draft-uberti-behave-turn-rest-00 |
|
11038
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; |
|
13756
18f560dcc9e3
mod_external_services: Also use TURN REST credential algo for 'turns' (thanks moreroid)
Matthew Wild <mwild1@gmail.com>
parents:
13213
diff
changeset
|
38 turns = behave_turn_rest_credentials; |
|
11038
efefdf71373b
mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents:
11037
diff
changeset
|
39 } |
|
efefdf71373b
mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents:
11037
diff
changeset
|
40 |
|
11036
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
41 -- filter config into well-defined service records |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
42 local function prepare(item) |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
43 if type(item) ~= "table" then |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
44 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
|
45 return nil; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
46 end |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
47 |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 local srv = { |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 type = nil; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
50 transport = nil; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 host = default_host; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
52 port = default_port; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
53 username = nil; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 password = nil; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
55 restricted = nil; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
56 expires = nil; |
|
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 |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
59 if type(item.type) == "string" then |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
60 srv.type = item.type; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
61 else |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
62 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
|
63 return nil; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
64 end |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
65 if type(item.transport) == "string" then |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
66 srv.transport = item.transport; |
|
11933
f752427a5214
mod_external_services: Warn about missing recommended fields
Kim Alvefur <zash@zash.se>
parents:
11756
diff
changeset
|
67 else |
|
f752427a5214
mod_external_services: Warn about missing recommended fields
Kim Alvefur <zash@zash.se>
parents:
11756
diff
changeset
|
68 module:log("warn", "Service missing recommended 'transport' field: %q", item); |
|
11036
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.host) == "string" then |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
71 srv.host = item.host; |
|
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.port) == "number" then |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
74 srv.port = item.port; |
|
11933
f752427a5214
mod_external_services: Warn about missing recommended fields
Kim Alvefur <zash@zash.se>
parents:
11756
diff
changeset
|
75 elseif not srv.port then |
|
f752427a5214
mod_external_services: Warn about missing recommended fields
Kim Alvefur <zash@zash.se>
parents:
11756
diff
changeset
|
76 module:log("warn", "Service missing recommended 'port' field: %q", item); |
|
11036
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
77 end |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
78 if type(item.username) == "string" then |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
79 srv.username = item.username; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
80 end |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
81 if type(item.password) == "string" then |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
82 srv.password = item.password; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
83 srv.restricted = true; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
84 end |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 if item.restricted == true then |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 srv.restricted = true; |
|
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 type(item.expires) == "number" then |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
89 srv.expires = item.expires; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
90 elseif type(item.ttl) == "number" then |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
91 srv.expires = os.time() + item.ttl; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
92 end |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
93 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
|
94 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
|
95 local secret = item.secret; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
96 if secret == true then |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
97 secret = default_secret; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
98 end |
|
11038
efefdf71373b
mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents:
11037
diff
changeset
|
99 if secret_cb then |
|
efefdf71373b
mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents:
11037
diff
changeset
|
100 secret_cb(srv, item, secret); |
|
efefdf71373b
mod_external_services: Prepare to allow more credential algorithms
Kim Alvefur <zash@zash.se>
parents:
11037
diff
changeset
|
101 srv.restricted = true; |
|
11036
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
102 end |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
103 end |
|
13911
79ae4821c05e
mod_external_services: Allow custom XML content in service items
Matthew Wild <mwild1@gmail.com>
parents:
13902
diff
changeset
|
104 if item.extra and st.is_stanza(item.extra) then |
|
79ae4821c05e
mod_external_services: Allow custom XML content in service items
Matthew Wild <mwild1@gmail.com>
parents:
13902
diff
changeset
|
105 srv.extra = item.extra; |
|
79ae4821c05e
mod_external_services: Allow custom XML content in service items
Matthew Wild <mwild1@gmail.com>
parents:
13902
diff
changeset
|
106 end |
|
11036
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
107 return srv; |
|
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 |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
110 function module.load() |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
111 -- 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
|
112 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
|
113 local services = ( configured_services + extras ) / prepare; |
|
11036
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
114 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
|
115 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
|
116 end |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
117 end |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
118 |
|
11627
3a5212fd7e8e
mod_external_services: Validate items as they are added
Kim Alvefur <zash@zash.se>
parents:
11626
diff
changeset
|
119 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
|
120 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
|
121 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
|
122 end |
|
11627
3a5212fd7e8e
mod_external_services: Validate items as they are added
Kim Alvefur <zash@zash.se>
parents:
11626
diff
changeset
|
123 end, module.load); |
|
3a5212fd7e8e
mod_external_services: Validate items as they are added
Kim Alvefur <zash@zash.se>
parents:
11626
diff
changeset
|
124 |
|
11040
c560531d9a6e
mod_external_services: Validate services added via events
Kim Alvefur <zash@zash.se>
parents:
11039
diff
changeset
|
125 -- 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
|
126 local services_mt = { |
|
c560531d9a6e
mod_external_services: Validate services added via events
Kim Alvefur <zash@zash.se>
parents:
11039
diff
changeset
|
127 __index = getmetatable(array()).__index; |
|
c560531d9a6e
mod_external_services: Validate services added via events
Kim Alvefur <zash@zash.se>
parents:
11039
diff
changeset
|
128 __newindex = function (self, i, v) |
|
c560531d9a6e
mod_external_services: Validate services added via events
Kim Alvefur <zash@zash.se>
parents:
11039
diff
changeset
|
129 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
|
130 end; |
|
c560531d9a6e
mod_external_services: Validate services added via events
Kim Alvefur <zash@zash.se>
parents:
11039
diff
changeset
|
131 } |
|
c560531d9a6e
mod_external_services: Validate services added via events
Kim Alvefur <zash@zash.se>
parents:
11039
diff
changeset
|
132 |
|
11755
ae565e49289a
mod_external_services: Factor out public function returning current services
Kim Alvefur <zash@zash.se>
parents:
11754
diff
changeset
|
133 function get_services() |
|
ae565e49289a
mod_external_services: Factor out public function returning current services
Kim Alvefur <zash@zash.se>
parents:
11754
diff
changeset
|
134 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
|
135 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
|
136 |
|
ae565e49289a
mod_external_services: Factor out public function returning current services
Kim Alvefur <zash@zash.se>
parents:
11754
diff
changeset
|
137 setmetatable(services, services_mt); |
|
ae565e49289a
mod_external_services: Factor out public function returning current services
Kim Alvefur <zash@zash.se>
parents:
11754
diff
changeset
|
138 |
|
ae565e49289a
mod_external_services: Factor out public function returning current services
Kim Alvefur <zash@zash.se>
parents:
11754
diff
changeset
|
139 return services; |
|
ae565e49289a
mod_external_services: Factor out public function returning current services
Kim Alvefur <zash@zash.se>
parents:
11754
diff
changeset
|
140 end |
|
ae565e49289a
mod_external_services: Factor out public function returning current services
Kim Alvefur <zash@zash.se>
parents:
11754
diff
changeset
|
141 |
|
11756
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
142 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
|
143 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
|
144 |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
145 for _, srv in ipairs(services) do |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
146 reply:tag("service", { |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
147 type = srv.type; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
148 transport = srv.transport; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
149 host = srv.host; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
150 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
|
151 username = srv.username; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
152 password = srv.password; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
153 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
|
154 restricted = srv.restricted and "1" or nil; |
|
13911
79ae4821c05e
mod_external_services: Allow custom XML content in service items
Matthew Wild <mwild1@gmail.com>
parents:
13902
diff
changeset
|
155 }); |
|
79ae4821c05e
mod_external_services: Allow custom XML content in service items
Matthew Wild <mwild1@gmail.com>
parents:
13902
diff
changeset
|
156 if srv.extra then |
|
79ae4821c05e
mod_external_services: Allow custom XML content in service items
Matthew Wild <mwild1@gmail.com>
parents:
13902
diff
changeset
|
157 reply:add_child(srv.extra); |
|
79ae4821c05e
mod_external_services: Allow custom XML content in service items
Matthew Wild <mwild1@gmail.com>
parents:
13902
diff
changeset
|
158 end |
|
79ae4821c05e
mod_external_services: Allow custom XML content in service items
Matthew Wild <mwild1@gmail.com>
parents:
13902
diff
changeset
|
159 reply:up(); |
|
11036
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
160 end |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
161 |
|
11756
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
162 return reply; |
|
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
163 end |
|
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
164 |
|
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
165 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
|
166 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
|
167 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
|
168 |
|
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
169 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
|
170 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
|
171 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
|
172 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
|
173 return true; |
|
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
174 end |
|
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
175 |
|
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
176 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
|
177 |
|
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
178 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
|
179 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
|
180 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
|
181 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
|
182 end); |
|
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
183 end |
|
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
184 |
|
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
185 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
|
186 origin = origin; |
|
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
187 stanza = stanza; |
|
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
188 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
|
189 services = services; |
|
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
190 }); |
|
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
191 |
|
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
192 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
|
193 |
|
11036
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
194 origin.send(reply); |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
195 return true; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
196 end |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
197 |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
198 local function handle_credentials(event) |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
199 local origin, stanza = event.origin, event.stanza; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
200 local action = stanza.tags[1]; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
201 |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
202 if origin.type ~= "c2s" then |
|
12431
95f33a006c03
mod_external_services: Move error message to correct place (fix #1725)
Kim Alvefur <zash@zash.se>
parents:
11933
diff
changeset
|
203 origin.send(st.error_reply(stanza, "auth", "forbidden")); |
|
11036
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
204 return true; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
205 end |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
206 |
|
11755
ae565e49289a
mod_external_services: Factor out public function returning current services
Kim Alvefur <zash@zash.se>
parents:
11754
diff
changeset
|
207 local services = get_services(); |
|
11036
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
208 services:filter(function (item) |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
209 return item.restricted; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
210 end) |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
211 |
|
11754
21a9b3f2a728
mod_external_services: Filter services by requested credentials using a Set
Kim Alvefur <zash@zash.se>
parents:
11753
diff
changeset
|
212 local requested_credentials = set.new(); |
|
11036
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
213 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
|
214 if not service.attr.type or not service.attr.host then |
|
12431
95f33a006c03
mod_external_services: Move error message to correct place (fix #1725)
Kim Alvefur <zash@zash.se>
parents:
11933
diff
changeset
|
215 origin.send(st.error_reply(stanza, "modify", "bad-request", "The 'port' and 'type' attributes are required.")); |
|
11753
c4599a7c534c
mod_external_services: Validate required attributes on credentials requests
Kim Alvefur <zash@zash.se>
parents:
11628
diff
changeset
|
216 return true; |
|
c4599a7c534c
mod_external_services: Validate required attributes on credentials requests
Kim Alvefur <zash@zash.se>
parents:
11628
diff
changeset
|
217 end |
|
c4599a7c534c
mod_external_services: Validate required attributes on credentials requests
Kim Alvefur <zash@zash.se>
parents:
11628
diff
changeset
|
218 |
|
11754
21a9b3f2a728
mod_external_services: Filter services by requested credentials using a Set
Kim Alvefur <zash@zash.se>
parents:
11753
diff
changeset
|
219 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
|
220 tonumber(service.attr.port) or 0)); |
|
11036
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
221 end |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
222 |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
223 module:fire_event("external_service/credentials", { |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
224 origin = origin; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
225 stanza = stanza; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
226 requested_credentials = requested_credentials; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
227 services = services; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
228 }); |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
229 |
|
11754
21a9b3f2a728
mod_external_services: Filter services by requested credentials using a Set
Kim Alvefur <zash@zash.se>
parents:
11753
diff
changeset
|
230 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
|
231 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
|
232 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
|
233 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
|
234 end); |
|
21a9b3f2a728
mod_external_services: Filter services by requested credentials using a Set
Kim Alvefur <zash@zash.se>
parents:
11753
diff
changeset
|
235 |
|
11756
a0e17b7c8b05
mod_external_services: Factor out public function for converting to XML
Kim Alvefur <zash@zash.se>
parents:
11755
diff
changeset
|
236 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
|
237 |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
238 origin.send(reply); |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
239 return true; |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
240 end |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
241 |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
242 -- XEP-0215 v0.7 |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
243 module:add_feature("urn:xmpp:extdisco:2"); |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
244 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
|
245 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
|
246 |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
247 -- COMPAT XEP-0215 v0.6 |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
248 -- 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
|
249 module:add_feature("urn:xmpp:extdisco:1"); |
|
79e410cd7f6e
mod_external_services: XEP-0215: External Service Discovery
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
250 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
|
251 module:hook("iq-get/host/urn:xmpp:extdisco:1:credentials", handle_credentials); |
|
13902
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
252 |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
253 |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
254 module:add_item("shell-command", { |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
255 section = "services"; |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
256 section_desc = "Inspect external services"; |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
257 name = "list"; |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
258 desc = "List all external services for a host"; |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
259 args = { |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
260 { name = "host", type = "string" }; |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
261 { name = "service", type = "string" }; |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
262 }; |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
263 host_selector = "host"; |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
264 handler = function (shell, host, service_type) --luacheck: ignore 212/host |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
265 local c = 0; |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
266 local print = shell.session.print; |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
267 local services = get_services(); |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
268 for _, srv in ipairs(services) do |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
269 if not service_type or service_type:lower() == srv.type:lower() then |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
270 c = c + 1; |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
271 print(srv.type.." ("..srv.transport..")", srv.host..(srv.port and (":"..srv.port) or "")); |
|
13911
79ae4821c05e
mod_external_services: Allow custom XML content in service items
Matthew Wild <mwild1@gmail.com>
parents:
13902
diff
changeset
|
272 print(" auth:", srv.restricted and "required" or "none"); |
|
13902
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
273 for _, prop in ipairs({ "username", "password", "expires" }) do |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
274 local val = srv[prop]; |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
275 if val then |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
276 if prop == "expires" then |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
277 val = dt.datetime(val); |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
278 end |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
279 print(" "..prop..":", val); |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
280 end |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
281 end |
|
13911
79ae4821c05e
mod_external_services: Allow custom XML content in service items
Matthew Wild <mwild1@gmail.com>
parents:
13902
diff
changeset
|
282 if srv.extra then |
|
79ae4821c05e
mod_external_services: Allow custom XML content in service items
Matthew Wild <mwild1@gmail.com>
parents:
13902
diff
changeset
|
283 print(" extra:"); |
|
79ae4821c05e
mod_external_services: Allow custom XML content in service items
Matthew Wild <mwild1@gmail.com>
parents:
13902
diff
changeset
|
284 print(" "..tostring(srv.extra:indent(3, " "))); |
|
13902
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
285 end |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
286 print(""); |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
287 end |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
288 end |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
289 return true, ("%d services"):format(c); |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
290 end; |
|
7e6deed12e03
mod_external_services: Add shell command to list external services on a host
Matthew Wild <mwild1@gmail.com>
parents:
13756
diff
changeset
|
291 }); |
