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