Mercurial > prosody-modules
annotate mod_storage_ldap/ldap/vcard.lib.lua @ 5536:96dec7681af8
mod_firewall: Update user marks to store instantly via map store
The original approach was to keep marks in memory only, and persist them at
shutdown. That saves I/O, at the cost of potentially losing marks on an
unclean shutdown.
This change persists marks instantly, which may have some performance overhead
but should be more "correct".
It also splits the marking/unmarking into an event which may be watched or
even fired by other modules.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Thu, 08 Jun 2023 16:20:42 +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; |