comparison mod_bookmarks2/mod_bookmarks2.lua @ 3739:1ed3d86eeaed

mod_bookmarks2: Don’t purge or remove inexistant items when synchronising existing Private XML data.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Wed, 13 Nov 2019 16:25:21 +0100
parents 9cd6d602ad1b
children b3fb32bd1f01
comparison
equal deleted inserted replaced
3738:9cd6d602ad1b 3739:1ed3d86eeaed
93 a_conference.attr.autojoin == b_conference.attr.autojoin and 93 a_conference.attr.autojoin == b_conference.attr.autojoin and
94 a_nick == b_nick and 94 a_nick == b_nick and
95 a_password == b_password); 95 a_password == b_password);
96 end 96 end
97 97
98 local function publish_to_pep(jid, bookmarks) 98 local function publish_to_pep(jid, bookmarks, synchronise)
99 local service = mod_pep.get_pep_service(jid_split(jid)); 99 local service = mod_pep.get_pep_service(jid_split(jid));
100 100
101 -- If we set zero legacy bookmarks, purge the bookmarks 2 node.
102 if #bookmarks.tags == 0 then 101 if #bookmarks.tags == 0 then
103 module:log("debug", "No bookmark in the set, purging instead."); 102 if synchronise then
104 return service:purge("urn:xmpp:bookmarks:0", jid, true); 103 -- If we set zero legacy bookmarks, purge the bookmarks 2 node.
104 module:log("debug", "No bookmark in the set, purging instead.");
105 return service:purge("urn:xmpp:bookmarks:0", jid, true);
106 else
107 return true;
108 end
105 end 109 end
106 110
107 -- Retrieve the current bookmarks2. 111 -- Retrieve the current bookmarks2.
108 module:log("debug", "Retrieving the current bookmarks 2."); 112 module:log("debug", "Retrieving the current bookmarks 2.");
109 local has_bookmarks2, ret = service:get_items("urn:xmpp:bookmarks:0", jid); 113 local has_bookmarks2, ret = service:get_items("urn:xmpp:bookmarks:0", jid);
166 end 170 end
167 end 171 end
168 end 172 end
169 173
170 -- Now handle retracting items that have been removed. 174 -- Now handle retracting items that have been removed.
171 for id in pairs(to_remove) do 175 if synchronise then
172 module:log("debug", "Item %s removed from bookmarks.", id); 176 for id in pairs(to_remove) do
173 local ok, err = service:retract("urn:xmpp:bookmarks:0", jid, id, st.stanza("retract", { id = id })); 177 module:log("debug", "Item %s removed from bookmarks.", id);
174 if not ok then 178 local ok, err = service:retract("urn:xmpp:bookmarks:0", jid, id, st.stanza("retract", { id = id }));
175 module:log("error", "Retracting item %s failed: %s", id, err); 179 if not ok then
176 return ok, err; 180 module:log("error", "Retracting item %s failed: %s", id, err);
181 return ok, err;
182 end
177 end 183 end
178 end 184 end
179 return true; 185 return true;
180 end 186 end
181 187
192 return; 198 return;
193 end 199 end
194 200
195 module:log("debug", "Private bookmarks set by client, publishing to pep."); 201 module:log("debug", "Private bookmarks set by client, publishing to pep.");
196 202
197 local ok, err = publish_to_pep(session.full_jid, bookmarks); 203 local ok, err = publish_to_pep(session.full_jid, bookmarks, true);
198 if not ok then 204 if not ok then
199 module:log("error", "Failed to publish to PEP bookmarks for %s@%s: %s", session.username, session.host, err); 205 module:log("error", "Failed to publish to PEP bookmarks for %s@%s: %s", session.username, session.host, err);
200 session.send(st.error_reply(stanza, "cancel", "internal-server-error", "Failed to store bookmarks to PEP")); 206 session.send(st.error_reply(stanza, "cancel", "internal-server-error", "Failed to store bookmarks to PEP"));
201 return true; 207 return true;
202 end 208 end
222 return; 228 return;
223 end 229 end
224 local bookmarks = st.deserialize(data); 230 local bookmarks = st.deserialize(data);
225 module:log("debug", "Got legacy bookmarks of %s: %s", jid, bookmarks); 231 module:log("debug", "Got legacy bookmarks of %s: %s", jid, bookmarks);
226 232
227 -- We don’t care if deleting succeeds or not, we only want to start with a non-existent node.
228 module:log("debug", "Deleting possibly existing PEP item for %s.", jid);
229 service:delete("urn:xmpp:bookmarks:0", jid);
230
231 module:log("debug", "Going to store PEP item for %s.", jid); 233 module:log("debug", "Going to store PEP item for %s.", jid);
232 local ok, err = publish_to_pep(session.full_jid, bookmarks); 234 local ok, err = publish_to_pep(session.full_jid, bookmarks, false);
233 if not ok then 235 if not ok then
234 module:log("error", "Failed to store bookmarks to PEP for %s, aborting migration: %s", jid, err); 236 module:log("error", "Failed to store bookmarks to PEP for %s, aborting migration: %s", jid, err);
235 return; 237 return;
236 end 238 end
237 module:log("debug", "Stored bookmarks to PEP for %s.", jid); 239 module:log("debug", "Stored bookmarks to PEP for %s.", jid);