mod_oidc_userinfo_vcard4/mod_oidc_userinfo_vcard4.lua
author Kim Alvefur <zash@zash.se>
Sun, 23 Apr 2023 14:18:25 +0200
changeset 5365 cec1b0b0adef
parent 5364 f05de5ac219f
child 5507 320593cf7d90
permissions -rw-r--r--
mod_oidc_userinfo_vcard4: Fix phone number claim Copy-paste mistake probably
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
--
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
local nodeprep = require "util.encodings".stringprep.nodeprep;
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
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
     7
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
local gender_map = { M = "male"; F = "female"; O = "other"; N = "nnot applicable"; U = "unknown" }
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
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
    11
	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
    12
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
	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
    14
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
	local userinfo = event.userinfo;
5364
f05de5ac219f mod_oidc_userinfo_vcard4: Unpack <vcard> from PubSub <item>
Kim Alvefur <zash@zash.se>
parents: 5354
diff changeset
    16
	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
    17
	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
    18
		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
    19
		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
    20
		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
    21
		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
    22
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
		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
    24
		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
    25
			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
    26
			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
    27
				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
    28
			end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
		end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
		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
    32
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
		-- 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
    34
		-- 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
    35
		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
    36
		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
    37
		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
    38
		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
    39
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
		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
    41
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
		-- 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
    43
	end
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
	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
    46
		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
    47
		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
    48
			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
    49
		end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
	end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    51
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
	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
    53
		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
    54
		if userinfo.email then
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
			userinfo.email_verified = false;
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    56
		end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    57
	end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    58
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    59
	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
    60
		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
    61
		if adr then
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    62
			userinfo.address = {
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    63
				formatted = nil;
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
				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
    65
				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
    66
				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
    67
				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
    68
				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
    69
			}
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    70
		end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    71
	end
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
	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
    74
		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
    75
		if userinfo.phone then
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    76
			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
    77
		end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    78
	end
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    79
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    80
f8ec43db580b mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    81
end, 10);