Mercurial > prosody-modules
comparison mod_default_bookmarks/mod_default_bookmarks.lua @ 4860:4a34ed2bb9a2
mod_default_bookmarks: Improve validation
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 08 Jan 2022 02:28:16 +0100 |
| parents | 33208c3ae586 |
| children | 62006f4022e9 |
comparison
equal
deleted
inserted
replaced
| 4859:33208c3ae586 | 4860:4a34ed2bb9a2 |
|---|---|
| 8 -- COPYING file in the source package for more information. | 8 -- COPYING file in the source package for more information. |
| 9 -- | 9 -- |
| 10 | 10 |
| 11 local st = require "util.stanza" | 11 local st = require "util.stanza" |
| 12 local dm_load = require "util.datamanager".load | 12 local dm_load = require "util.datamanager".load |
| 13 local jid_split = require "util.jid".split | 13 local jid = require "util.jid" |
| 14 | 14 |
| 15 -- COMPAT w/trunk | 15 -- COMPAT w/trunk |
| 16 local mod_bookmarks_available = false; | 16 local mod_bookmarks_available = false; |
| 17 local mm = require "core.modulemanager"; | 17 local mm = require "core.modulemanager"; |
| 18 if mm.get_modules_for_host then | 18 if mm.get_modules_for_host then |
| 23 mod_bookmarks_available = "bookmarks2"; | 23 mod_bookmarks_available = "bookmarks2"; |
| 24 end | 24 end |
| 25 end | 25 end |
| 26 | 26 |
| 27 local function get_default_bookmarks(nickname) | 27 local function get_default_bookmarks(nickname) |
| 28 local bookmarks = module:get_option("default_bookmarks"); | 28 local bookmarks = module:get_option_array("default_bookmarks"); |
| 29 if not bookmarks or #bookmarks == 0 then | 29 if not bookmarks or #bookmarks == 0 then |
| 30 return false; | 30 return false; |
| 31 end | 31 end |
| 32 local reply = st.stanza("storage", { xmlns = "storage:bookmarks" }); | 32 local reply = st.stanza("storage", { xmlns = "storage:bookmarks" }); |
| 33 local nick = nickname and st.stanza("nick"):text(nickname); | 33 local nick = nickname and st.stanza("nick"):text(nickname); |
| 34 for _, bookmark in ipairs(bookmarks) do | 34 for _, bookmark in ipairs(bookmarks) do |
| 35 if type(bookmark) ~= "table" then -- assume it's only a jid | 35 if type(bookmark) ~= "table" then -- assume it's only a jid |
| 36 bookmark = { jid = bookmark, name = jid_split(bookmark) }; | 36 bookmark = { jid = bookmark, name = jid.split(bookmark) }; |
| 37 end | 37 end |
| 38 reply:tag("conference", { | 38 reply:tag("conference", { |
| 39 jid = bookmark.jid, | 39 jid = bookmark.jid, |
| 40 name = bookmark.name, | 40 name = bookmark.name, |
| 41 autojoin = "1", | 41 autojoin = "1", |
| 77 -- 0.11 or earlier not supporting max_items="max" trows an error here | 77 -- 0.11 or earlier not supporting max_items="max" trows an error here |
| 78 module:log("debug", "Setting max_items=pep_max_items because 'max' is not supported in this version"); | 78 module:log("debug", "Setting max_items=pep_max_items because 'max' is not supported in this version"); |
| 79 publish_options["max_items"] = module:get_option_number("pep_max_items", 256); | 79 publish_options["max_items"] = module:get_option_number("pep_max_items", 256); |
| 80 end | 80 end |
| 81 local service = mod_pep.get_pep_service(session.username); | 81 local service = mod_pep.get_pep_service(session.username); |
| 82 local bookmarks = module:get_option("default_bookmarks"); | 82 local bookmarks = module:get_option_array("default_bookmarks"); |
| 83 local ns = event.version or "urn:xmpp:bookmarks:1"; | 83 local ns = event.version or "urn:xmpp:bookmarks:1"; |
| 84 for i, bookmark in ipairs(bookmarks) do | 84 for i, bookmark in ipairs(bookmarks) do |
| 85 local item = st.stanza("item", { xmlns = "http://jabber.org/protocol/pubsub"; id = bookmark.jid }); | 85 local bm_jid = jid.prep(bookmark.jid); |
| 86 item:tag("conference", { xmlns = ns; name = bookmark.name; autojoin = bookmark.autojoin and "true" or nil }); | 86 if not bm_jid then |
| 87 if bookmark.nick then item:text_tag("nick", bookmarks.nick); end | 87 module:log("error", "Invalid JID in default_bookmarks[%d].jid = %q", i, bookmark.jid); |
| 88 if bookmark.password then item:text_tag("password", bookmarks.password); end | 88 else |
| 89 service:publish("urn:xmpp:bookmarks:1", session.full_jid, bookmark.jid, item, publish_options); | 89 local item = st.stanza("item", { xmlns = "http://jabber.org/protocol/pubsub"; id = bm_jid }); |
| 90 item:tag("conference", { xmlns = ns; name = bookmark.name; autojoin = bookmark.autojoin and "true" or nil }); | |
| 91 if bookmark.nick then item:text_tag("nick", bookmarks.nick); end | |
| 92 if bookmark.password then item:text_tag("password", bookmarks.password); end | |
| 93 local ok, err = service:publish("urn:xmpp:bookmarks:1", session.full_jid, bm_jid, item, publish_options); | |
| 94 if not ok then | |
| 95 module:log("error", "Could not add default bookmark %s to %s: %s", bm_jid, session.username, err); | |
| 96 end | |
| 97 end | |
| 90 end | 98 end |
| 91 end | 99 end |
| 92 module:hook("bookmarks/empty", publish_bookmarks2); | 100 module:hook("bookmarks/empty", publish_bookmarks2); |
| 93 end | 101 end |
| 94 else | 102 else |
