Mercurial > prosody-modules
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); |