Mercurial > prosody-hg
comparison plugins/mod_vcard_legacy.lua @ 9814:5eb4ef537e98 0.11
mod_vcard_legacy: Handle partial migration
Eg in case the user already published an avatar, migrate only the vcard,
and vice versa.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 26 Jan 2019 13:32:26 +0100 |
| parents | 071aaaa5cb34 |
| children | 8643b784626c 210278d5f995 |
comparison
equal
deleted
inserted
replaced
| 9813:071aaaa5cb34 | 9814:5eb4ef537e98 |
|---|---|
| 243 end | 243 end |
| 244 return vcard4, avatars; | 244 return vcard4, avatars; |
| 245 end | 245 end |
| 246 | 246 |
| 247 function save_to_pep(pep_service, actor, vcard4, avatars) | 247 function save_to_pep(pep_service, actor, vcard4, avatars) |
| 248 | 248 if avatars then |
| 249 if pep_service:purge("urn:xmpp:avatar:metadata", actor) then | 249 |
| 250 pep_service:purge("urn:xmpp:avatar:data", actor); | 250 if pep_service:purge("urn:xmpp:avatar:metadata", actor) then |
| 251 end | 251 pep_service:purge("urn:xmpp:avatar:data", actor); |
| 252 | 252 end |
| 253 local avatar_defaults = node_defaults; | 253 |
| 254 if #avatars > 1 then | 254 local avatar_defaults = node_defaults; |
| 255 avatar_defaults = {}; | 255 if #avatars > 1 then |
| 256 for k,v in pairs(node_defaults) do | 256 avatar_defaults = {}; |
| 257 avatar_defaults[k] = v; | 257 for k,v in pairs(node_defaults) do |
| 258 end | 258 avatar_defaults[k] = v; |
| 259 avatar_defaults.max_items = #avatars; | 259 end |
| 260 end | 260 avatar_defaults.max_items = #avatars; |
| 261 for _, avatar in ipairs(avatars) do | 261 end |
| 262 local ok, err = pep_service:publish("urn:xmpp:avatar:data", actor, avatar.hash, avatar.data, avatar_defaults); | 262 for _, avatar in ipairs(avatars) do |
| 263 if ok then | 263 local ok, err = pep_service:publish("urn:xmpp:avatar:data", actor, avatar.hash, avatar.data, avatar_defaults); |
| 264 ok, err = pep_service:publish("urn:xmpp:avatar:metadata", actor, avatar.hash, avatar.meta, avatar_defaults); | 264 if ok then |
| 265 end | 265 ok, err = pep_service:publish("urn:xmpp:avatar:metadata", actor, avatar.hash, avatar.meta, avatar_defaults); |
| 266 if not ok then | 266 end |
| 267 return ok, err; | 267 if not ok then |
| 268 end | 268 return ok, err; |
| 269 end | 269 end |
| 270 | 270 end |
| 271 return pep_service:publish("urn:xmpp:vcard4", actor, "current", vcard4, node_defaults); | 271 end |
| 272 | |
| 273 if vcard4 then | |
| 274 return pep_service:publish("urn:xmpp:vcard4", actor, "current", vcard4, node_defaults); | |
| 275 end | |
| 276 | |
| 277 return true; | |
| 272 end | 278 end |
| 273 | 279 |
| 274 module:hook("iq-set/self/vcard-temp:vCard", function (event) | 280 module:hook("iq-set/self/vcard-temp:vCard", function (event) |
| 275 local origin, stanza = event.origin, event.stanza; | 281 local origin, stanza = event.origin, event.stanza; |
| 276 local pep_service = mod_pep.get_pep_service(origin.username); | 282 local pep_service = mod_pep.get_pep_service(origin.username); |
| 315 if not vcard_temp then | 321 if not vcard_temp then |
| 316 session.log("debug", "No legacy vCard to migrate or already migrated"); | 322 session.log("debug", "No legacy vCard to migrate or already migrated"); |
| 317 return; | 323 return; |
| 318 end | 324 end |
| 319 local pep_service = mod_pep.get_pep_service(username); | 325 local pep_service = mod_pep.get_pep_service(username); |
| 320 if pep_service:get_last_item("urn:xmpp:vcard4", true) | 326 vcard_temp = st.deserialize(vcard_temp); |
| 321 or pep_service:get_last_item("urn:xmpp:avatar:metadata", true) | 327 local vcard4, avatars = vcard_to_pep(vcard_temp); |
| 328 if pep_service:get_last_item("urn:xmpp:vcard4", true) then | |
| 329 vcard4 = nil; | |
| 330 end | |
| 331 if pep_service:get_last_item("urn:xmpp:avatar:metadata", true) | |
| 322 or pep_service:get_last_item("urn:xmpp:avatar:data", true) then | 332 or pep_service:get_last_item("urn:xmpp:avatar:data", true) then |
| 333 avatars = nil; | |
| 334 end | |
| 335 if not (vcard4 or avatars) then | |
| 323 session.log("debug", "Already PEP data, not overwriting with migrated data"); | 336 session.log("debug", "Already PEP data, not overwriting with migrated data"); |
| 324 vcards:set(username, nil); | 337 vcards:set(username, nil); |
| 325 return; | 338 return; |
| 326 end | 339 end |
| 327 vcard_temp = st.deserialize(vcard_temp); | 340 local ok, err = save_to_pep(pep_service, true, vcard4, avatars); |
| 328 local ok, err = save_to_pep(pep_service, true, vcard_to_pep(vcard_temp)); | |
| 329 if ok and vcards:set(username, nil) then | 341 if ok and vcards:set(username, nil) then |
| 330 session.log("info", "Migrated vCard-temp to PEP"); | 342 session.log("info", "Migrated vCard-temp to PEP"); |
| 331 else | 343 else |
| 332 session.log("info", "Failed to migrate vCard-temp to PEP: %s", err or "problem emptying 'vcard' store"); | 344 session.log("info", "Failed to migrate vCard-temp to PEP: %s", err or "problem emptying 'vcard' store"); |
| 333 end | 345 end |
