annotate mod_auto156/mod_auto156.lua @ 4651:8231774f5bfd

mod_cloud_notify_encrypted: Ensure body substring remains valid UTF-8 The `body:sub()` call risks splitting the string in the middle of a multi-byte UTF-8 sequence. This should have been caught by util.stanza validation, but that would have caused some havoc, at the very least causing the notification to not be sent. There have been no reports of this happening. Likely because this module isn't widely deployed among users with languages that use many longer UTF-8 sequences. The util.encodings.utf8.valid() function is O(n) where only the last sequence really needs to be checked, but it's in C and expected to be fast.
author Kim Alvefur <zash@zash.se>
date Sun, 22 Aug 2021 13:22:59 +0200
parents 5d494dba9c02
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4613
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 -- Synthesize XEP-0156 JSON from DNS
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 local array = require "util.array";
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 local encodings = require "util.encodings";
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 local json = require "util.json";
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 local promise = require "util.promise";
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 local dns = require"net.adns".resolver();
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9 local function check_dns(domain)
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 return dns:lookup_promise("_xmppconnect." .. domain, "TXT");
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 end
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 local function check_domain(domain)
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 return promise.resolve(domain):next(encodings.stringprep.nameprep):next(encodings.idna.to_ascii):next(
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 function(domain_A)
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 if not domain_A then
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 return promise.reject(400);
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 else
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 return domain_A;
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 end
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 end):next(check_dns):next(function(txt)
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 local uris = array();
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 for _, cm in ipairs(txt) do
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 local kind, uri = tostring(cm.txt):match("^_xmpp%-client%-(%w+)=([hpstw]+s?://.*)");
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 if kind then
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 uris:push({rel = "urn:xmpp:alt-connections:" .. kind, href = uri});
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 end
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 end
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 if #uris == 0 then
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 return promise.reject(404);
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 end
4614
5d494dba9c02 mod_auto156: Include the containing object in command output
Kim Alvefur <zash@zash.se>
parents: 4613
diff changeset
32 return {links=uris};
4613
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33 end);
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 end
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 module:depends("http");
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 module:provides("http", {
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38 route = {
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 ["GET /*"] = function(_, domain)
4614
5d494dba9c02 mod_auto156: Include the containing object in command output
Kim Alvefur <zash@zash.se>
parents: 4613
diff changeset
40 return check_domain(domain):next(function(altmethods)
5d494dba9c02 mod_auto156: Include the containing object in command output
Kim Alvefur <zash@zash.se>
parents: 4613
diff changeset
41 return {headers = {content_type = "application/json"}, body = json.encode(altmethods)};
4613
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 end);
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
43 end,
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
44 },
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45 });
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
46
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
47 function module.command(args)
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48 local async = require "util.async";
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
49 for _, domain in ipairs(args) do
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
50 print(assert(async.wait_for(check_domain(domain):next(json.encode))));
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 end
6478442d217f mod_auto156: Queries for XEP-0156 TXT records and prints in JSON format
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 end