Software /
code /
prosody
Comparison
plugins/mod_vcard_legacy.lua @ 11120:b2331f3dfeea
Merge 0.11->trunk
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Wed, 30 Sep 2020 09:50:33 +0100 |
parent | 10865:9c27b2385fad |
child | 11944:8b5e646dfaa6 |
comparison
equal
deleted
inserted
replaced
11119:68df52bf08d5 | 11120:b2331f3dfeea |
---|---|
36 } | 36 } |
37 | 37 |
38 module:hook("iq-get/bare/vcard-temp:vCard", function (event) | 38 module:hook("iq-get/bare/vcard-temp:vCard", function (event) |
39 local origin, stanza = event.origin, event.stanza; | 39 local origin, stanza = event.origin, event.stanza; |
40 local pep_service = mod_pep.get_pep_service(jid_split(stanza.attr.to) or origin.username); | 40 local pep_service = mod_pep.get_pep_service(jid_split(stanza.attr.to) or origin.username); |
41 local ok, id, vcard4_item = pep_service:get_last_item("urn:xmpp:vcard4", stanza.attr.from); | 41 local ok, _, vcard4_item = pep_service:get_last_item("urn:xmpp:vcard4", stanza.attr.from); |
42 | 42 |
43 local vcard_temp = st.stanza("vCard", { xmlns = "vcard-temp" }); | 43 local vcard_temp = st.stanza("vCard", { xmlns = "vcard-temp" }); |
44 if ok and vcard4_item then | 44 if ok and vcard4_item then |
45 local vcard4 = vcard4_item.tags[1]; | 45 local vcard4 = vcard4_item.tags[1]; |
46 | 46 |
103 vcard_temp:tag("HOME"):up(); | 103 vcard_temp:tag("HOME"):up(); |
104 elseif tag:find"parameters/type/text#" == "work" then | 104 elseif tag:find"parameters/type/text#" == "work" then |
105 vcard_temp:tag("WORK"):up(); | 105 vcard_temp:tag("WORK"):up(); |
106 end | 106 end |
107 vcard_temp:up(); | 107 vcard_temp:up(); |
108 end | 108 elseif tag.name == "impp" then |
109 end | 109 local uri = tag:get_child_text("uri"); |
110 end | 110 if uri and uri:sub(1, 5) == "xmpp:" then |
111 | 111 vcard_temp:text_tag("JABBERID", uri:sub(6)) |
112 local meta_ok, avatar_meta = pep_service:get_items("urn:xmpp:avatar:metadata", stanza.attr.from); | 112 end |
113 local data_ok, avatar_data = pep_service:get_items("urn:xmpp:avatar:data", stanza.attr.from); | 113 elseif tag.name == "org" then |
114 | 114 vcard_temp:tag("ORG") |
115 if data_ok then | 115 :text_tag("ORGNAME", tag:get_child_text("text")) |
116 for _, hash in ipairs(avatar_data) do | 116 :up(); |
117 local meta = meta_ok and avatar_meta[hash]; | 117 end |
118 local data = avatar_data[hash]; | 118 end |
119 local info = meta and meta.tags[1]:get_child("info"); | 119 else |
120 local ok, _, nick_item = pep_service:get_last_item("http://jabber.org/protocol/nick", stanza.attr.from); | |
121 if ok and nick_item then | |
122 local nickname = nick_item:get_child_text("nick", "http://jabber.org/protocol/nick"); | |
123 if nickname then | |
124 vcard_temp:text_tag("NICKNAME", nickname); | |
125 end | |
126 end | |
127 end | |
128 | |
129 local ok, avatar_hash, meta = pep_service:get_last_item("urn:xmpp:avatar:metadata", true); | |
130 if ok and avatar_hash then | |
131 | |
132 local info = meta.tags[1]:get_child("info"); | |
133 if info then | |
120 vcard_temp:tag("PHOTO"); | 134 vcard_temp:tag("PHOTO"); |
121 if info and info.attr.type then | 135 |
136 if info.attr.type then | |
122 vcard_temp:text_tag("TYPE", info.attr.type); | 137 vcard_temp:text_tag("TYPE", info.attr.type); |
123 end | 138 end |
124 if data then | 139 |
125 vcard_temp:text_tag("BINVAL", data.tags[1]:get_text()); | 140 if info.attr.url then |
126 elseif info and info.attr.url then | |
127 vcard_temp:text_tag("EXTVAL", info.attr.url); | 141 vcard_temp:text_tag("EXTVAL", info.attr.url); |
142 elseif info.attr.id then | |
143 local data_ok, avatar_data = pep_service:get_items("urn:xmpp:avatar:data", stanza.attr.from, { info.attr.id }); | |
144 if data_ok and avatar_data and avatar_data[info.attr.id] then | |
145 local data = avatar_data[info.attr.id]; | |
146 vcard_temp:text_tag("BINVAL", data.tags[1]:get_text()); | |
147 end | |
128 end | 148 end |
129 vcard_temp:up(); | 149 vcard_temp:up(); |
130 end | 150 end |
131 end | 151 end |
132 | 152 |
138 access_model = "open"; | 158 access_model = "open"; |
139 _defaults_only = true; | 159 _defaults_only = true; |
140 }; | 160 }; |
141 | 161 |
142 function vcard_to_pep(vcard_temp) | 162 function vcard_to_pep(vcard_temp) |
143 local avatars = {}; | 163 local avatar = {}; |
144 | 164 |
145 local vcard4 = st.stanza("item", { xmlns = "http://jabber.org/protocol/pubsub", id = "current" }) | 165 local vcard4 = st.stanza("item", { xmlns = "http://jabber.org/protocol/pubsub", id = "current" }) |
146 :tag("vcard", { xmlns = 'urn:ietf:params:xml:ns:vcard-4.0' }); | 166 :tag("vcard", { xmlns = 'urn:ietf:params:xml:ns:vcard-4.0' }); |
147 | 167 |
148 vcard4:tag("fn"):text_tag("text", vcard_temp:get_child_text("FN")):up(); | 168 vcard4:tag("fn"):text_tag("text", vcard_temp:get_child_text("FN")):up(); |
214 vcard4:text_tag("text", "home"); | 234 vcard4:text_tag("text", "home"); |
215 elseif tag:get_child("WORK") then | 235 elseif tag:get_child("WORK") then |
216 vcard4:text_tag("text", "work"); | 236 vcard4:text_tag("text", "work"); |
217 end | 237 end |
218 vcard4:up():up():up(); | 238 vcard4:up():up():up(); |
239 elseif tag.name == "JABBERID" then | |
240 vcard4:tag("impp") | |
241 :text_tag("uri", "xmpp:" .. tag:get_text()) | |
242 :up(); | |
219 elseif tag.name == "PHOTO" then | 243 elseif tag.name == "PHOTO" then |
220 local avatar_type = tag:get_child_text("TYPE"); | 244 local avatar_type = tag:get_child_text("TYPE"); |
221 local avatar_payload = tag:get_child_text("BINVAL"); | 245 local avatar_payload = tag:get_child_text("BINVAL"); |
222 -- Can EXTVAL be translated? No way to know the sha1 of the data? | 246 -- Can EXTVAL be translated? No way to know the sha1 of the data? |
223 | 247 |
224 if avatar_payload then | 248 if avatar_payload then |
225 local avatar_raw = base64_decode(avatar_payload); | 249 local avatar_raw = base64_decode(avatar_payload); |
226 local avatar_hash = sha1(avatar_raw, true); | 250 local avatar_hash = sha1(avatar_raw, true); |
227 | 251 |
228 local avatar_meta = st.stanza("item", { id = avatar_hash, xmlns = "http://jabber.org/protocol/pubsub" }) | 252 avatar.hash = avatar_hash; |
253 | |
254 avatar.meta = st.stanza("item", { id = avatar_hash, xmlns = "http://jabber.org/protocol/pubsub" }) | |
229 :tag("metadata", { xmlns="urn:xmpp:avatar:metadata" }) | 255 :tag("metadata", { xmlns="urn:xmpp:avatar:metadata" }) |
230 :tag("info", { | 256 :tag("info", { |
231 bytes = tostring(#avatar_raw), | 257 bytes = tostring(#avatar_raw), |
232 id = avatar_hash, | 258 id = avatar_hash, |
233 type = avatar_type, | 259 type = avatar_type, |
234 }); | 260 }); |
235 | 261 |
236 local avatar_data = st.stanza("item", { id = avatar_hash, xmlns = "http://jabber.org/protocol/pubsub" }) | 262 avatar.data = st.stanza("item", { id = avatar_hash, xmlns = "http://jabber.org/protocol/pubsub" }) |
237 :tag("data", { xmlns="urn:xmpp:avatar:data" }) | 263 :tag("data", { xmlns="urn:xmpp:avatar:data" }) |
238 :text(avatar_payload); | 264 :text(avatar_payload); |
239 | 265 |
240 table.insert(avatars, { hash = avatar_hash, meta = avatar_meta, data = avatar_data }); | 266 end |
241 end | 267 end |
242 end | 268 end |
243 end | 269 return vcard4, avatar; |
244 return vcard4, avatars; | 270 end |
245 end | 271 |
246 | 272 function save_to_pep(pep_service, actor, vcard4, avatar) |
247 function save_to_pep(pep_service, actor, vcard4, avatars) | 273 if avatar then |
248 if avatars then | |
249 | 274 |
250 if pep_service:purge("urn:xmpp:avatar:metadata", actor) then | 275 if pep_service:purge("urn:xmpp:avatar:metadata", actor) then |
251 pep_service:purge("urn:xmpp:avatar:data", actor); | 276 pep_service:purge("urn:xmpp:avatar:data", actor); |
252 end | 277 end |
253 | 278 |
254 local avatar_defaults = node_defaults; | 279 if avatar.data and avatar.meta then |
255 if #avatars > 1 then | 280 local ok, err = assert(pep_service:publish("urn:xmpp:avatar:data", actor, avatar.hash, avatar.data, node_defaults)); |
256 avatar_defaults = {}; | |
257 for k,v in pairs(node_defaults) do | |
258 avatar_defaults[k] = v; | |
259 end | |
260 avatar_defaults.max_items = #avatars; | |
261 end | |
262 for _, avatar in ipairs(avatars) do | |
263 local ok, err = pep_service:publish("urn:xmpp:avatar:data", actor, avatar.hash, avatar.data, avatar_defaults); | |
264 if ok then | 281 if ok then |
265 ok, err = pep_service:publish("urn:xmpp:avatar:metadata", actor, avatar.hash, avatar.meta, avatar_defaults); | 282 ok, err = assert(pep_service:publish("urn:xmpp:avatar:metadata", actor, avatar.hash, avatar.meta, node_defaults)); |
266 end | 283 end |
267 if not ok then | 284 if not ok then |
268 return ok, err; | 285 return ok, err; |
269 end | 286 end |
270 end | 287 end |