mod_auto156/mod_auto156.lua
author Matthew Wild <mwild1@gmail.com>
Fri, 23 Sep 2022 22:41:15 +0100
changeset 5058 62480053c87b
parent 4618 5d494dba9c02
permissions -rw-r--r--
mod_cloud_notify_encrypted: Additional debug logging when enabling/skipping
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4617
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
4618
5d494dba9c02 mod_auto156: Include the containing object in command output
Kim Alvefur <zash@zash.se>
parents: 4617
diff changeset
    32
		return {links=uris};
4617
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)
4618
5d494dba9c02 mod_auto156: Include the containing object in command output
Kim Alvefur <zash@zash.se>
parents: 4617
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: 4617
diff changeset
    41
				return {headers = {content_type = "application/json"}, body = json.encode(altmethods)};
4617
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