Software /
code /
prosody-modules
Comparison
mod_oidc_userinfo_vcard4/mod_oidc_userinfo_vcard4.lua @ 5350:f8ec43db580b
mod_oidc_userinfo_vcard4: Provide profile details in mod_http_oauth2
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 17 Apr 2023 08:01:09 +0200 |
child | 5360:f05de5ac219f |
comparison
equal
deleted
inserted
replaced
5349:ac9710126e1a | 5350:f8ec43db580b |
---|---|
1 -- Provide OpenID UserInfo data to mod_http_oauth2 | |
2 -- Alternatively, separate module for the whole HTTP endpoint? | |
3 -- | |
4 local nodeprep = require "util.encodings".stringprep.nodeprep; | |
5 | |
6 local mod_pep = module:depends "pep"; | |
7 | |
8 local gender_map = { M = "male"; F = "female"; O = "other"; N = "nnot applicable"; U = "unknown" } | |
9 | |
10 module:hook("token/userinfo", function(event) | |
11 local pep_service = mod_pep.get_pep_service(event.username); | |
12 | |
13 local vcard4 = select(3, pep_service:get_last_item("urn:xmpp:vcard4", true)); | |
14 | |
15 local userinfo = event.userinfo; | |
16 if vcard4 and event.claims:contains("profile") then | |
17 userinfo.name = vcard4:find("fn/text#"); | |
18 userinfo.family_name = vcard4:find("n/surname#"); | |
19 userinfo.given_name = vcard4:find("n/given#"); | |
20 userinfo.middle_name = vcard4:find("n/additional#"); | |
21 | |
22 userinfo.nickname = vcard4:find("nickname/text#"); | |
23 if not userinfo.nickname then | |
24 local ok, _, nick_item = pep_service:get_last_item("http://jabber.org/protocol/nick", true); | |
25 if ok and nick_item then | |
26 userinfo.nickname = nick_item:get_child_text("nick", "http://jabber.org/protocol/nick"); | |
27 end | |
28 end | |
29 | |
30 userinfo.preferred_username = event.username; | |
31 | |
32 -- profile -- page? not their website | |
33 -- picture -- mod_http_pep_avatar? | |
34 userinfo.website = vcard4:find("url/uri#"); | |
35 userinfo.birthdate = vcard4:find("bday/date#"); | |
36 userinfo.zoneinfo = vcard4:find("tz/text#"); | |
37 userinfo.locale = vcard4:find("lang/language-tag#"); | |
38 | |
39 userinfo.gender = gender_map[vcard4:find("gender/sex#")] or vcard4:find("gender/text#"); | |
40 | |
41 -- updated_at -- we don't keep a vcard change timestamp? | |
42 end | |
43 | |
44 if not userinfo.nickname and event.claims:contains("profile") then | |
45 local ok, _, nick_item = pep_service:get_last_item("http://jabber.org/protocol/nick", true); | |
46 if ok and nick_item then | |
47 userinfo.nickname = nick_item:get_child_text("nick", "http://jabber.org/protocol/nick"); | |
48 end | |
49 end | |
50 | |
51 if vcard4 and event.claims:contains("email") then | |
52 userinfo.email = vcard4:find("email/text#") | |
53 if userinfo.email then | |
54 userinfo.email_verified = false; | |
55 end | |
56 end | |
57 | |
58 if vcard4 and event.claims:contains("address") then | |
59 local adr = vcard4:get_child("adr"); | |
60 if adr then | |
61 userinfo.address = { | |
62 formatted = nil; | |
63 street_address = adr:get_child_text("street"); | |
64 locality = adr:get_child_text("locality"); | |
65 region = adr:get_child_text("region"); | |
66 postal_code = adr:get_child_text("code"); | |
67 country = adr:get_child_text("country"); | |
68 } | |
69 end | |
70 end | |
71 | |
72 if vcard4 and event.claims:contains("phone") then | |
73 userinfo.phone = vcard4:find("email/text#") | |
74 if userinfo.phone then | |
75 userinfo.phone_number_verified = false; | |
76 end | |
77 end | |
78 | |
79 | |
80 end, 10); |