Diff

mod_http_oauth2/mod_http_oauth2.lua @ 6240:ab14e7ecb82f

mod_http_oauth2: Allow JIDs as username for password grant
author magicfelix <felix@felix-zauberer.de>
date Sat, 19 Apr 2025 20:32:37 +0200
parent 6239:a931a95e363e
child 6245:ea58d2893afb
line wrap: on
line diff
--- a/mod_http_oauth2/mod_http_oauth2.lua	Sat Apr 19 18:30:57 2025 +0200
+++ b/mod_http_oauth2/mod_http_oauth2.lua	Sat Apr 19 20:32:37 2025 +0200
@@ -134,6 +134,7 @@
 
 local pkce_required = module:get_option_boolean("oauth2_require_code_challenge", true);
 local respect_prompt = module:get_option_boolean("oauth2_respect_oidc_prompt", false);
+local expect_username_jid = module:get_option_boolean("oauth2_expect_username_jid", false);
 
 local verification_key;
 local sign_client, verify_client;
@@ -419,7 +420,21 @@
 		return oauth_error("invalid_client", "incorrect credentials");
 	end
 
-	local request_username = assert(params.username, oauth_error("invalid_request", "missing 'username'"));
+	local request_username
+
+	if expect_username_jid then
+		local request_jid = assert(params.username, oauth_error("invalid_request", "missing 'username' (JID)"));
+		local _request_username, request_host, request_resource = jid.prepped_split(request_jid);
+
+		if not (_request_username and request_host) or request_host ~= module.host then
+			return oauth_error("invalid_request", "invalid JID");
+		end
+
+		request_username = _request_username
+	else
+		request_username = assert(params.username, oauth_error("invalid_request", "missing 'username'"));
+	end
+
 	local request_password = assert(params.password, oauth_error("invalid_request", "missing 'password'"));
 
 	if not usermanager.test_password(request_username, module.host, request_password) then