view mod_auto156/mod_auto156.lua @ 5715:8488ebde5739

mod_http_oauth2: Skip consent screen if requested by client and same scopes already granted This follows the intent behind the OpenID Connect 'prompt' parameter when it does not include the 'consent' keyword, that is the client wishes to skip the consent screen. If the user has already granted the exact same scopes to the exact same client in the past, then one can assume that they may grant it again.
author Kim Alvefur <zash@zash.se>
date Tue, 14 Nov 2023 23:03:37 +0100
parents 5d494dba9c02
children
line wrap: on
line source

-- Synthesize XEP-0156 JSON from DNS
local array = require "util.array";
local encodings = require "util.encodings";
local json = require "util.json";
local promise = require "util.promise";

local dns = require"net.adns".resolver();

local function check_dns(domain)
	return dns:lookup_promise("_xmppconnect." .. domain, "TXT");
end

local function check_domain(domain)
	return promise.resolve(domain):next(encodings.stringprep.nameprep):next(encodings.idna.to_ascii):next(
		function(domain_A)
			if not domain_A then
				return promise.reject(400);
			else
				return domain_A;
			end
		end):next(check_dns):next(function(txt)
		local uris = array();
		for _, cm in ipairs(txt) do
			local kind, uri = tostring(cm.txt):match("^_xmpp%-client%-(%w+)=([hpstw]+s?://.*)");
			if kind then
				uris:push({rel = "urn:xmpp:alt-connections:" .. kind, href = uri});
			end
		end
		if #uris == 0 then
			return promise.reject(404);
		end
		return {links=uris};
	end);
end

module:depends("http");
module:provides("http", {
	route = {
		["GET /*"] = function(_, domain)
			return check_domain(domain):next(function(altmethods)
				return {headers = {content_type = "application/json"}, body = json.encode(altmethods)};
			end);
		end,
	},
});

function module.command(args)
	local async = require "util.async";
	for _, domain in ipairs(args) do
		print(assert(async.wait_for(check_domain(domain):next(json.encode))));
	end
end