Mercurial > prosody-modules
comparison mod_bookmarks2/mod_bookmarks2.lua @ 4837:1f1acb7f3c10
mod_bookmarks2: Use constants for namespaces
| author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
|---|---|
| date | Sun, 26 Dec 2021 14:51:02 +0100 |
| parents | 60b2dbe032c0 |
| children | fd2e48d4ac94 |
comparison
equal
deleted
inserted
replaced
| 4836:5fc306239db3 | 4837:1f1acb7f3c10 |
|---|---|
| 8 | 8 |
| 9 local mod_pep = module:depends "pep"; | 9 local mod_pep = module:depends "pep"; |
| 10 local private_storage = module:open_store("private", "map"); | 10 local private_storage = module:open_store("private", "map"); |
| 11 | 11 |
| 12 local namespace = "urn:xmpp:bookmarks:1"; | 12 local namespace = "urn:xmpp:bookmarks:1"; |
| 13 local namespace_private = "jabber:iq:private"; | |
| 14 local namespace_legacy = "storage:bookmarks"; | |
| 13 | 15 |
| 14 local default_options = { | 16 local default_options = { |
| 15 ["persist_items"] = true; | 17 ["persist_items"] = true; |
| 16 -- This should be much higher, the XEP recommends 10000 but mod_pep rejects that. | 18 -- This should be much higher, the XEP recommends 10000 but mod_pep rejects that. |
| 17 ["max_items"] = "max"; | 19 ["max_items"] = "max"; |
| 30 event.reply:tag("feature", { var = namespace.."#compat" }):up(); | 32 event.reply:tag("feature", { var = namespace.."#compat" }):up(); |
| 31 event.reply:tag("feature", { var = namespace.."#compat-pep" }):up(); | 33 event.reply:tag("feature", { var = namespace.."#compat-pep" }):up(); |
| 32 end); | 34 end); |
| 33 | 35 |
| 34 local function generate_legacy_storage(items) | 36 local function generate_legacy_storage(items) |
| 35 local storage = st.stanza("storage", { xmlns = "storage:bookmarks" }); | 37 local storage = st.stanza("storage", { xmlns = namespace_legacy }); |
| 36 for _, item_id in ipairs(items) do | 38 for _, item_id in ipairs(items) do |
| 37 local item = items[item_id]; | 39 local item = items[item_id]; |
| 38 local conference = st.stanza("conference"); | |
| 39 conference.attr.jid = item.attr.id; | |
| 40 local bookmark = item:get_child("conference", namespace); | 40 local bookmark = item:get_child("conference", namespace); |
| 41 conference.attr.name = bookmark.attr.name; | 41 local conference = st.stanza("conference", { |
| 42 conference.attr.autojoin = bookmark.attr.autojoin; | 42 jid = item.attr.id, |
| 43 name = bookmark.attr.name, | |
| 44 autojoin = bookmark.attr.autojoin, | |
| 45 }); | |
| 43 local nick = bookmark:get_child_text("nick"); | 46 local nick = bookmark:get_child_text("nick"); |
| 44 if nick ~= nil then | 47 if nick ~= nil then |
| 45 conference:text_tag("nick", nick, { xmlns = "storage:bookmarks" }):up(); | 48 conference:text_tag("nick", nick):up(); |
| 46 end | 49 end |
| 47 local password = bookmark:get_child_text("password"); | 50 local password = bookmark:get_child_text("password"); |
| 48 if password ~= nil then | 51 if password ~= nil then |
| 49 conference:text_tag("password", password):up(); | 52 conference:text_tag("password", password):up(); |
| 50 end | 53 end |
| 65 if items == nil then | 68 if items == nil then |
| 66 return; | 69 return; |
| 67 end | 70 end |
| 68 | 71 |
| 69 local node = items.attr.node; | 72 local node = items.attr.node; |
| 70 if node ~= "storage:bookmarks" then | 73 if node ~= namespace_legacy then |
| 71 return; | 74 return; |
| 72 end | 75 end |
| 73 | 76 |
| 74 local username = session.username; | 77 local username = session.username; |
| 75 local jid = username.."@"..session.host; | 78 local jid = username.."@"..session.host; |
| 89 local storage = generate_legacy_storage(ret); | 92 local storage = generate_legacy_storage(ret); |
| 90 | 93 |
| 91 module:log("debug", "Sending back legacy PEP for %s: %s", jid, storage); | 94 module:log("debug", "Sending back legacy PEP for %s: %s", jid, storage); |
| 92 session.send(st.reply(stanza) | 95 session.send(st.reply(stanza) |
| 93 :tag("pubsub", {xmlns = "http://jabber.org/protocol/pubsub"}) | 96 :tag("pubsub", {xmlns = "http://jabber.org/protocol/pubsub"}) |
| 94 :tag("items", {node = "storage:bookmarks"}) | 97 :tag("items", {node = namespace_legacy}) |
| 95 :tag("item", {id = "current"}) | 98 :tag("item", {id = "current"}) |
| 96 :add_child(storage)); | 99 :add_child(storage)); |
| 97 return true; | 100 return true; |
| 98 end | 101 end |
| 99 | 102 |
| 100 local function on_retrieve_private_xml(event) | 103 local function on_retrieve_private_xml(event) |
| 101 local stanza, session = event.stanza, event.origin; | 104 local stanza, session = event.stanza, event.origin; |
| 102 local query = stanza:get_child("query", "jabber:iq:private"); | 105 local query = stanza:get_child("query", namespace_private); |
| 103 if query == nil then | 106 if query == nil then |
| 104 return; | 107 return; |
| 105 end | 108 end |
| 106 | 109 |
| 107 local bookmarks = query:get_child("storage", "storage:bookmarks"); | 110 local bookmarks = query:get_child("storage", namespace_legacy); |
| 108 if bookmarks == nil then | 111 if bookmarks == nil then |
| 109 return; | 112 return; |
| 110 end | 113 end |
| 111 | 114 |
| 112 module:log("debug", "Getting private bookmarks: %s", bookmarks); | 115 module:log("debug", "Getting private bookmarks: %s", bookmarks); |
| 127 end | 130 end |
| 128 | 131 |
| 129 local storage = generate_legacy_storage(ret); | 132 local storage = generate_legacy_storage(ret); |
| 130 | 133 |
| 131 module:log("debug", "Sending back private for %s: %s", jid, storage); | 134 module:log("debug", "Sending back private for %s: %s", jid, storage); |
| 132 session.send(st.reply(stanza):query("jabber:iq:private"):add_child(storage)); | 135 session.send(st.reply(stanza):query(namespace_private):add_child(storage)); |
| 133 return true; | 136 return true; |
| 134 end | 137 end |
| 135 | 138 |
| 136 local function compare_bookmark2(a, b) | 139 local function compare_bookmark2(a, b) |
| 137 if a == nil or b == nil then | 140 if a == nil or b == nil then |
| 187 local to_remove = {}; | 190 local to_remove = {}; |
| 188 for i in ipairs(bookmarks2) do | 191 for i in ipairs(bookmarks2) do |
| 189 to_remove[bookmarks2[i]] = true; | 192 to_remove[bookmarks2[i]] = true; |
| 190 end | 193 end |
| 191 | 194 |
| 192 for bookmark in bookmarks:childtags("conference", "storage:bookmarks") do | 195 for bookmark in bookmarks:childtags("conference", namespace_legacy) do |
| 193 -- Create the new conference element by copying everything from the legacy one. | 196 -- Create the new conference element by copying everything from the legacy one. |
| 194 local conference = st.stanza("conference", { xmlns = namespace }); | 197 local conference = st.stanza("conference", { |
| 195 conference.attr.name = bookmark.attr.name; | 198 xmlns = namespace, |
| 196 conference.attr.autojoin = bookmark.attr.autojoin; | 199 name = bookmark.attr.name, |
| 197 local nick = bookmark:get_child_text("nick", "storage:bookmarks"); | 200 autojoin = bookmark.attr.autojoin, |
| 201 }); | |
| 202 local nick = bookmark:get_child_text("nick"); | |
| 198 if nick ~= nil then | 203 if nick ~= nil then |
| 199 conference:text_tag("nick", nick):up(); | 204 conference:text_tag("nick", nick):up(); |
| 200 end | 205 end |
| 201 local password = bookmark:get_child_text("password", "storage:bookmarks"); | 206 local password = bookmark:get_child_text("password"); |
| 202 if password ~= nil then | 207 if password ~= nil then |
| 203 conference:text_tag("password", password):up(); | 208 conference:text_tag("password", password):up(); |
| 204 end | 209 end |
| 205 | 210 |
| 206 -- Create its wrapper. | 211 -- Create its wrapper. |
| 247 if pubsub == nil then | 252 if pubsub == nil then |
| 248 return; | 253 return; |
| 249 end | 254 end |
| 250 | 255 |
| 251 local publish = pubsub:get_child("publish"); | 256 local publish = pubsub:get_child("publish"); |
| 252 if publish == nil or publish.attr.node ~= "storage:bookmarks" then | 257 if publish == nil or publish.attr.node ~= namespace_legacy then |
| 253 return; | 258 return; |
| 254 end | 259 end |
| 255 | 260 |
| 256 local item = publish:get_child("item"); | 261 local item = publish:get_child("item"); |
| 257 if item == nil then | 262 if item == nil then |
| 258 return; | 263 return; |
| 259 end | 264 end |
| 260 | 265 |
| 261 -- Here we ignore the item id, it’ll be generated as 'current' anyway. | 266 -- Here we ignore the item id, it’ll be generated as 'current' anyway. |
| 262 | 267 |
| 263 local bookmarks = item:get_child("storage", "storage:bookmarks"); | 268 local bookmarks = item:get_child("storage", namespace_legacy); |
| 264 if bookmarks == nil then | 269 if bookmarks == nil then |
| 265 return; | 270 return; |
| 266 end | 271 end |
| 267 | 272 |
| 268 -- We also ignore the publish-options. | 273 -- We also ignore the publish-options. |
| 281 end | 286 end |
| 282 | 287 |
| 283 -- Synchronise Private XML to PEP. | 288 -- Synchronise Private XML to PEP. |
| 284 local function on_publish_private_xml(event) | 289 local function on_publish_private_xml(event) |
| 285 local stanza, session = event.stanza, event.origin; | 290 local stanza, session = event.stanza, event.origin; |
| 286 local query = stanza:get_child("query", "jabber:iq:private"); | 291 local query = stanza:get_child("query", namespace_private); |
| 287 if query == nil then | 292 if query == nil then |
| 288 return; | 293 return; |
| 289 end | 294 end |
| 290 | 295 |
| 291 local bookmarks = query:get_child("storage", "storage:bookmarks"); | 296 local bookmarks = query:get_child("storage", namespace_legacy); |
| 292 if bookmarks == nil then | 297 if bookmarks == nil then |
| 293 return; | 298 return; |
| 294 end | 299 end |
| 295 | 300 |
| 296 module:log("debug", "Private bookmarks set by client, publishing to PEP."); | 301 module:log("debug", "Private bookmarks set by client, publishing to PEP."); |
| 310 local session = event.session; | 315 local session = event.session; |
| 311 local username = session.username; | 316 local username = session.username; |
| 312 local service = mod_pep.get_pep_service(username); | 317 local service = mod_pep.get_pep_service(username); |
| 313 local jid = username.."@"..session.host; | 318 local jid = username.."@"..session.host; |
| 314 | 319 |
| 315 local ok, ret = service:get_items("storage:bookmarks", session.full_jid); | 320 local ok, ret = service:get_items(namespace_legacy, session.full_jid); |
| 316 if ok then | 321 if ok then |
| 317 module:log("debug", "Legacy PEP bookmarks found for %s, migrating.", jid); | 322 module:log("debug", "Legacy PEP bookmarks found for %s, migrating.", jid); |
| 318 local failed = false; | 323 local failed = false; |
| 319 for _, item_id in ipairs(ret) do | 324 for _, item_id in ipairs(ret) do |
| 320 local item = ret[item_id]; | 325 local item = ret[item_id]; |
| 321 if item.attr.id ~= "current" then | 326 if item.attr.id ~= "current" then |
| 322 module:log("warn", "Legacy PEP bookmarks for %s isn’t using 'current' as its id: %s", jid, item.attr.id); | 327 module:log("warn", "Legacy PEP bookmarks for %s isn’t using 'current' as its id: %s", jid, item.attr.id); |
| 323 end | 328 end |
| 324 local bookmarks = item:get_child("storage", "storage:bookmarks"); | 329 local bookmarks = item:get_child("storage", namespace_legacy); |
| 325 module:log("debug", "Got legacy PEP bookmarks of %s: %s", jid, bookmarks); | 330 module:log("debug", "Got legacy PEP bookmarks of %s: %s", jid, bookmarks); |
| 326 | 331 |
| 327 local ok, err = publish_to_pep(session.full_jid, bookmarks, false); | 332 local ok, err = publish_to_pep(session.full_jid, bookmarks, false); |
| 328 if not ok then | 333 if not ok then |
| 329 module:log("error", "Failed to store legacy PEP bookmarks to bookmarks 2 for %s, aborting migration: %s", jid, err); | 334 module:log("error", "Failed to store legacy PEP bookmarks to bookmarks 2 for %s, aborting migration: %s", jid, err); |
| 331 break; | 336 break; |
| 332 end | 337 end |
| 333 end | 338 end |
| 334 if not failed then | 339 if not failed then |
| 335 module:log("debug", "Successfully migrated legacy PEP bookmarks of %s to bookmarks 2, attempting deletion of the node.", jid); | 340 module:log("debug", "Successfully migrated legacy PEP bookmarks of %s to bookmarks 2, attempting deletion of the node.", jid); |
| 336 local ok, err = service:delete("storage:bookmarks", jid); | 341 local ok, err = service:delete(namespace_legacy, jid); |
| 337 if not ok then | 342 if not ok then |
| 338 module:log("error", "Failed to delete legacy PEP bookmarks for %s: %s", jid, err); | 343 module:log("error", "Failed to delete legacy PEP bookmarks for %s: %s", jid, err); |
| 339 end | 344 end |
| 340 end | 345 end |
| 341 end | 346 end |
| 369 module:log("debug", "Removed legacy bookmarks of %s, migration done!", jid); | 374 module:log("debug", "Removed legacy bookmarks of %s, migration done!", jid); |
| 370 end | 375 end |
| 371 | 376 |
| 372 local function on_node_created(event) | 377 local function on_node_created(event) |
| 373 local service, node, actor = event.service, event.node, event.actor; | 378 local service, node, actor = event.service, event.node, event.actor; |
| 374 if node ~= "storage:bookmarks" then | 379 if node ~= namespace_legacy then |
| 375 return; | 380 return; |
| 376 end | 381 end |
| 377 | 382 |
| 378 module:log("debug", "Something tried to create legacy PEP bookmarks for %s.", actor); | 383 module:log("debug", "Something tried to create legacy PEP bookmarks for %s.", actor); |
| 379 local ok, err = service:delete("storage:bookmarks", actor); | 384 local ok, err = service:delete(namespace_legacy, actor); |
| 380 if not ok then | 385 if not ok then |
| 381 module:log("error", "Failed to delete legacy PEP bookmarks for %s: %s", actor, err); | 386 module:log("error", "Failed to delete legacy PEP bookmarks for %s: %s", actor, err); |
| 382 end | 387 end |
| 383 module:log("debug", "Legacy PEP bookmarks node of %s deleted.", actor); | 388 module:log("debug", "Legacy PEP bookmarks node of %s deleted.", actor); |
| 384 end | 389 end |
