Mercurial > prosody-modules
annotate mod_storage_ldap/ldap/vcard.lib.lua @ 5383:df11a2cbc7b7
mod_http_oauth2: Implement RFC 7628 Proof Key for Code Exchange
Likely to become mandatory in OAuth 2.1.
Backwards compatible since the default 'plain' verifier would compare
nil with nil if the relevant parameters are left out.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 29 Apr 2023 13:09:46 +0200 |
parents | f160166612c2 |
children |
rev | line source |
---|---|
809 | 1 -- vim:sts=4 sw=4 |
2 | |
3 -- Prosody IM | |
4 -- Copyright (C) 2008-2010 Matthew Wild | |
5 -- Copyright (C) 2008-2010 Waqas Hussain | |
6 -- Copyright (C) 2012 Rob Hoelz | |
7 -- | |
8 -- This project is MIT/X11 licensed. Please see the | |
9 -- COPYING file in the source package for more information. | |
10 -- | |
11 | |
12 local st = require 'util.stanza'; | |
13 | |
14 local VCARD_NS = 'vcard-temp'; | |
15 | |
16 local builder_methods = {}; | |
17 | |
830
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
18 local base64_encode = require('util.encodings').base64.encode; |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
19 |
809 | 20 function builder_methods:addvalue(key, value) |
21 self.vcard:tag(key):text(value):up(); | |
22 end | |
23 | |
830
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
24 function builder_methods:addphotofield(tagname, format_section) |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
25 local record = self.record; |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
26 local format = self.format; |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
27 local vcard = self.vcard; |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
28 local config = format[format_section]; |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
29 |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
30 if not config then |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
31 return; |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
32 end |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
33 |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
34 if config.extval then |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
35 if record[config.extval] then |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
36 local tag = vcard:tag(tagname); |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
37 tag:tag('EXTVAL'):text(record[config.extval]):up(); |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
38 end |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
39 elseif config.type and config.binval then |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
40 if record[config.binval] then |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
41 local tag = vcard:tag(tagname); |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
42 tag:tag('TYPE'):text(config.type):up(); |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
43 tag:tag('BINVAL'):text(base64_encode(record[config.binval])):up(); |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
44 end |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
45 else |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
46 module:log('error', 'You have an invalid %s config section', tagname); |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
47 return; |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
48 end |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
49 |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
50 vcard:up(); |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
51 end |
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
52 |
809 | 53 function builder_methods:addregularfield(tagname, format_section) |
54 local record = self.record; | |
55 local format = self.format; | |
56 local vcard = self.vcard; | |
57 | |
58 if not format[format_section] then | |
59 return; | |
60 end | |
61 | |
62 local tag = vcard:tag(tagname); | |
63 | |
64 for k, v in pairs(format[format_section]) do | |
65 tag:tag(string.upper(k)):text(record[v]):up(); | |
66 end | |
67 | |
68 vcard:up(); | |
69 end | |
70 | |
71 function builder_methods:addmultisectionedfield(tagname, format_section) | |
72 local record = self.record; | |
73 local format = self.format; | |
74 local vcard = self.vcard; | |
75 | |
76 if not format[format_section] then | |
77 return; | |
78 end | |
79 | |
80 for k, v in pairs(format[format_section]) do | |
81 local tag = vcard:tag(tagname); | |
82 | |
83 if type(k) == 'string' then | |
84 tag:tag(string.upper(k)):up(); | |
85 end | |
86 | |
87 for k2, v2 in pairs(v) do | |
88 if type(v2) == 'boolean' then | |
89 tag:tag(string.upper(k2)):up(); | |
90 else | |
91 tag:tag(string.upper(k2)):text(record[v2]):up(); | |
92 end | |
93 end | |
94 | |
95 vcard:up(); | |
96 end | |
97 end | |
98 | |
99 function builder_methods:build() | |
100 local record = self.record; | |
101 local format = self.format; | |
102 | |
103 self:addvalue( 'VERSION', '2.0'); | |
104 self:addvalue( 'FN', record[format.displayname]); | |
105 self:addregularfield( 'N', 'name'); | |
106 self:addvalue( 'NICKNAME', record[format.nickname]); | |
830
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
107 self:addphotofield( 'PHOTO', 'photo'); |
809 | 108 self:addvalue( 'BDAY', record[format.birthday]); |
109 self:addmultisectionedfield('ADR', 'address'); | |
110 self:addvalue( 'LABEL', nil); -- we don't support LABEL...yet. | |
111 self:addmultisectionedfield('TEL', 'telephone'); | |
112 self:addmultisectionedfield('EMAIL', 'email'); | |
113 self:addvalue( 'JABBERID', record.jid); | |
114 self:addvalue( 'MAILER', record[format.mailer]); | |
115 self:addvalue( 'TZ', record[format.timezone]); | |
116 self:addregularfield( 'GEO', 'geo'); | |
117 self:addvalue( 'TITLE', record[format.title]); | |
118 self:addvalue( 'ROLE', record[format.role]); | |
830
f160166612c2
Properly handle avatar/logo BINVALs
Rob Hoelz <rob@hoelz.ro>
parents:
809
diff
changeset
|
119 self:addphotofield( 'LOGO', 'logo'); |
809 | 120 self:addvalue( 'AGENT', nil); -- we don't support AGENT...yet. |
121 self:addregularfield( 'ORG', 'org'); | |
122 self:addvalue( 'CATEGORIES', nil); -- we don't support CATEGORIES...yet. | |
123 self:addvalue( 'NOTE', record[format.note]); | |
124 self:addvalue( 'PRODID', nil); -- we don't support PRODID...yet. | |
125 self:addvalue( 'REV', record[format.rev]); | |
126 self:addvalue( 'SORT-STRING', record[format.sortstring]); | |
127 self:addregularfield( 'SOUND', 'sound'); | |
128 self:addvalue( 'UID', record[format.uid]); | |
129 self:addvalue( 'URL', record[format.url]); | |
130 self:addvalue( 'CLASS', nil); -- we don't support CLASS...yet. | |
131 self:addregularfield( 'KEY', 'key'); | |
132 self:addvalue( 'DESC', record[format.description]); | |
133 | |
134 return self.vcard; | |
135 end | |
136 | |
137 local function new_builder(params) | |
138 local vcard_tag = st.stanza('vCard', { xmlns = VCARD_NS }); | |
139 | |
140 local object = { | |
141 vcard = vcard_tag, | |
142 __index = builder_methods, | |
143 }; | |
144 | |
145 for k, v in pairs(params) do | |
146 object[k] = v; | |
147 end | |
148 | |
149 setmetatable(object, object); | |
150 | |
151 return object; | |
152 end | |
153 | |
154 local _M = {}; | |
155 | |
156 function _M.create(params) | |
157 local builder = new_builder(params); | |
158 | |
159 return builder:build(); | |
160 end | |
161 | |
162 return _M; |