Mercurial > prosody-modules
annotate mod_storage_ldap/ldap/vcard.lib.lua @ 4931:13070c6a7ce8
mod_http_muc_log: Fix exception on lack of trailing slash in room path
A request to /room leads to the match call returning nil which in turn
calls nodeprep(nil). In Prosody 0.11.x this does nothing and simply
returns the nil, while in 0.12 it is an error.
Now it redirects to the calendar view at /room/ - even for non-existant
rooms.
Discovered at a deployment with http_paths = { muc_log = "/" } and
requests to /robots.txt and similar, which now result in a uses redirect
before returning 404.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 22 Apr 2022 14:29:32 +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; |