view mod_firewall/test.lib.lua @ 5418:f2c7bb3af600

mod_http_oauth2: Add role selector to consent page List includes all roles available to the user, if more than one. Defaults to either the first role in the scope string or the users primary role. Earlier draft listed all roles, but having options that can't be selected is bad UX and the entire list of all roles on the server could be long, and perhaps even sensitive. Allows e.g. picking a role with fewer permissions than what might otherwise have been selected. UX wise, doing this with more checkboxes or possibly radio buttons would have been confusion and/or looked messier. Fixes the previous situation where unselecting a role would default to the primary role, which could be more permissions than requested.
author Kim Alvefur <zash@zash.se>
date Fri, 05 May 2023 01:23:13 +0200
parents 001c756ead7d
children
line wrap: on
line source

-- luacheck: globals load_unload_scripts
local set = require "util.set";
local ltn12 = require "ltn12";

local xmppstream = require "util.xmppstream";

local function stderr(...)
	io.stderr:write("** ", table.concat({...}, "\t", 1, select("#", ...)), "\n");
end

return function (arg)
	require "net.http".request = function (url, ex, cb)
		stderr("Making HTTP request to "..url);
		local body_table = {};
		local ok, response_status, response_headers = require "ssl.https".request({
			url = url;
			headers = ex.headers;
			method = ex.body and "POST" or "GET";
			sink = ltn12.sink.table(body_table);
			source = ex.body and ltn12.source.string(ex.body) or nil;
		});
		stderr("HTTP response "..response_status);
		cb(table.concat(body_table), response_status, { headers = response_headers });
		return true;
	end;

	local stats_dropped, stats_passed = 0, 0;

	load_unload_scripts(set.new(arg));
	local stream_callbacks = { default_ns = "jabber:client" };

	function stream_callbacks.streamopened(session)
		session.notopen = nil;
	end
	function stream_callbacks.streamclosed()
	end
	function stream_callbacks.error(session, error_name, error_message) -- luacheck: ignore 212/session
		stderr("Fatal error parsing XML stream: "..error_name..": "..tostring(error_message))
		assert(false);
	end
	function stream_callbacks.handlestanza(session, stanza)
		if not module:fire_event("firewall/chains/deliver", { origin = session, stanza = stanza }) then
			stats_passed = stats_passed + 1;
			print(stanza);
			print("");
		else
			stats_dropped = stats_dropped + 1;
		end
	end

	local session = { notopen = true };
	function session.send(stanza)
		stderr("Reply:", "\n"..tostring(stanza).."\n");
	end
	local stream = xmppstream.new(session, stream_callbacks);
	stream:feed("<stream:stream xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client'>");
	local line_count = 0;
	for line in io.lines() do
		line_count = line_count + 1;
		local ok, err = stream:feed(line.."\n");
		if not ok then
			stderr("Fatal XML parse error on line "..line_count..": "..err);
			return 1;
		end
	end

	stderr("Summary");
	stderr("-------");
	stderr("");
	stderr(stats_dropped + stats_passed, "processed");
	stderr(stats_passed, "passed");
	stderr(stats_dropped, "dropped");
	stderr(line_count, "input lines");
	stderr("");
end