annotate mod_auto156/mod_auto156.lua @ 5608:1893ae742f66

mod_http_oauth2: Show errors on device flow user code entry page If the user enters the code incorrectly, having to click back to try again is no fun. Instead, show the error and the code entry form again.
author Kim Alvefur <zash@zash.se>
date Wed, 19 Jul 2023 13:05:47 +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