Mercurial > prosody-modules
annotate mod_storage_ldap/ldap/vcard.lib.lua @ 2430:a2625a36c092
mod_storage_appendmap: Fix pattern meant to match valid Lua Names so such are escaped correctly
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 02 Jan 2017 21:03:56 +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; |