mod_oidc_userinfo_vcard4/mod_oidc_userinfo_vcard4.lua
author Nicholas George <wirlaburla@worlio.com>
Tue, 21 May 2024 01:09:12 -0500
changeset 5915 e7584fd5b191
parent 5560 dfade0e38930
permissions -rw-r--r--
mod_muc_restrict_pm: fix table in README
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5354
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
-- Provide OpenID UserInfo data to mod_http_oauth2
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
-- Alternatively, separate module for the whole HTTP endpoint?
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
--
5507
320593cf7d90 mod_oidc_userinfo_vcard4: Advertise OpenID scopes via new mechanism
Kim Alvefur <zash@zash.se>
parents: 5365
diff changeset
     4
module:add_item("openid-claim", "address");
320593cf7d90 mod_oidc_userinfo_vcard4: Advertise OpenID scopes via new mechanism
Kim Alvefur <zash@zash.se>
parents: 5365
diff changeset
     5
module:add_item("openid-claim", "email");
320593cf7d90 mod_oidc_userinfo_vcard4: Advertise OpenID scopes via new mechanism
Kim Alvefur <zash@zash.se>
parents: 5365
diff changeset
     6
module:add_item("openid-claim", "phone");
320593cf7d90 mod_oidc_userinfo_vcard4: Advertise OpenID scopes via new mechanism
Kim Alvefur <zash@zash.se>
parents: 5365
diff changeset
     7
module:add_item("openid-claim", "profile");
320593cf7d90 mod_oidc_userinfo_vcard4: Advertise OpenID scopes via new mechanism
Kim Alvefur <zash@zash.se>
parents: 5365
diff changeset
     8
5354
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
local mod_pep = module:depends "pep";
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
5559
34b63d0144c3 mod_oidc_userinfo_vcard4: Fix typo
Kim Alvefur <zash@zash.se>
parents: 5507
diff changeset
    11
local gender_map = { M = "male"; F = "female"; O = "other"; N = "not applicable"; U = "unknown" }
5354
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
module:hook("token/userinfo", function(event)
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
	local pep_service = mod_pep.get_pep_service(event.username);
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
	local vcard4 = select(3, pep_service:get_last_item("urn:xmpp:vcard4", true));
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
	local userinfo = event.userinfo;
5364
f05de5ac219f mod_oidc_userinfo_vcard4: Unpack <vcard> from PubSub <item>
Kim Alvefur <zash@zash.se>
parents: 5354
diff changeset
    19
	vcard4 = vcard4 and vcard4:get_child("vcard", "urn:ietf:params:xml:ns:vcard-4.0");
5354
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
	if vcard4 and event.claims:contains("profile") then
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
		userinfo.name = vcard4:find("fn/text#");
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
		userinfo.family_name = vcard4:find("n/surname#");
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
		userinfo.given_name = vcard4:find("n/given#");
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
		userinfo.middle_name = vcard4:find("n/additional#");
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
		userinfo.nickname = vcard4:find("nickname/text#");
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
		if not userinfo.nickname then
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
			local ok, _, nick_item = pep_service:get_last_item("http://jabber.org/protocol/nick", true);
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
			if ok and nick_item then
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
				userinfo.nickname = nick_item:get_child_text("nick", "http://jabber.org/protocol/nick");
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
			end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
		end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
		userinfo.preferred_username = event.username;
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    35
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    36
		-- profile -- page? not their website
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
		-- picture -- mod_http_pep_avatar?
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
		userinfo.website = vcard4:find("url/uri#");
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
		userinfo.birthdate = vcard4:find("bday/date#");
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
		userinfo.zoneinfo = vcard4:find("tz/text#");
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
		userinfo.locale = vcard4:find("lang/language-tag#");
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
		userinfo.gender = gender_map[vcard4:find("gender/sex#")] or vcard4:find("gender/text#");
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
		-- updated_at -- we don't keep a vcard change timestamp?
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
	end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    48
	if not userinfo.nickname and event.claims:contains("profile") then
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    49
		local ok, _, nick_item = pep_service:get_last_item("http://jabber.org/protocol/nick", true);
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
		if ok and nick_item then
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    51
			userinfo.nickname = nick_item:get_child_text("nick", "http://jabber.org/protocol/nick");
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
		end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    53
	end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
	if vcard4 and event.claims:contains("email") then
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    56
		userinfo.email = vcard4:find("email/text#")
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    57
		if userinfo.email then
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    58
			userinfo.email_verified = false;
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    59
		end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    60
	end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    61
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    62
	if vcard4 and event.claims:contains("address") then
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    63
		local adr = vcard4:get_child("adr");
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
		if adr then
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    65
			userinfo.address = {
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    66
				formatted = nil;
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    67
				street_address = adr:get_child_text("street");
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    68
				locality = adr:get_child_text("locality");
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    69
				region = adr:get_child_text("region");
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    70
				postal_code = adr:get_child_text("code");
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    71
				country = adr:get_child_text("country");
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    72
			}
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    73
		end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    74
	end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    75
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    76
	if vcard4 and event.claims:contains("phone") then
5365
cec1b0b0adef mod_oidc_userinfo_vcard4: Fix phone number claim
Kim Alvefur <zash@zash.se>
parents: 5364
diff changeset
    77
		userinfo.phone = vcard4:find("tel/text#")
5354
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    78
		if userinfo.phone then
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    79
			userinfo.phone_number_verified = false;
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    80
		end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    81
	end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    82
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    83
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    84
end, 10);