Mercurial > prosody-modules
annotate mod_storage_ldap/ldap/vcard.lib.lua @ 5119:048e339706ba
mod_rest: Remove manual reference expansion in schema
This hack was originally added to reduce the number of definitions of
common attributes (type, to, from etc) and payloads (e.g. delay). This
predated pointers and references, and until now was needed because
parsing picked out the correct stanza kind from the schema, which broke
internal references.
Removing this hack paves the way for allowing the schema to be
configured or customized more easily.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Tue, 20 Dec 2022 21:48:28 +0100 |
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; |