comparison mod_bookmarks2/mod_bookmarks2.lua @ 4639:3da7cd77aca9

mod_bookmarks2: Factor namespace string into a variable
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Fri, 30 Jul 2021 21:13:16 +0200
parents 776eacd233b5
children d835cb7d2b47
comparison
equal deleted inserted replaced
4638:3c4cef6be45b 4639:3da7cd77aca9
6 local st = require "util.stanza"; 6 local st = require "util.stanza";
7 local jid_split = require "util.jid".split; 7 local jid_split = require "util.jid".split;
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
12 local namespace = "urn:xmpp:bookmarks:0";
11 13
12 local default_options = { 14 local default_options = {
13 ["persist_items"] = true; 15 ["persist_items"] = true;
14 -- This should be much higher, the XEP recommends 10000 but mod_pep rejects that. 16 -- This should be much higher, the XEP recommends 10000 but mod_pep rejects that.
15 ["max_items"] = 255; 17 ["max_items"] = 255;
17 ["access_model"] = "whitelist"; 19 ["access_model"] = "whitelist";
18 }; 20 };
19 21
20 module:hook("account-disco-info", function (event) 22 module:hook("account-disco-info", function (event)
21 -- This Time it’s Serious! 23 -- This Time it’s Serious!
22 event.reply:tag("feature", { var = "urn:xmpp:bookmarks:0#compat" }):up(); 24 event.reply:tag("feature", { var = namespace.."#compat" }):up();
23 end); 25 end);
24 26
25 local function on_retrieve_private_xml(event) 27 local function on_retrieve_private_xml(event)
26 local stanza, session = event.stanza, event.origin; 28 local stanza, session = event.stanza, event.origin;
27 local query = stanza:get_child("query", "jabber:iq:private"); 29 local query = stanza:get_child("query", "jabber:iq:private");
37 module:log("debug", "Getting private bookmarks: %s", bookmarks); 39 module:log("debug", "Getting private bookmarks: %s", bookmarks);
38 40
39 local username = session.username; 41 local username = session.username;
40 local jid = username.."@"..session.host; 42 local jid = username.."@"..session.host;
41 local service = mod_pep.get_pep_service(username); 43 local service = mod_pep.get_pep_service(username);
42 local ok, ret = service:get_items("urn:xmpp:bookmarks:0", session.full_jid); 44 local ok, ret = service:get_items(namespace, session.full_jid);
43 if not ok then 45 if not ok then
44 if ret == "item-not-found" then 46 if ret == "item-not-found" then
45 module:log("debug", "Got no PEP bookmarks item for %s, returning empty private bookmarks", jid); 47 module:log("debug", "Got no PEP bookmarks item for %s, returning empty private bookmarks", jid);
46 session.send(st.reply(stanza):add_child(query)); 48 session.send(st.reply(stanza):add_child(query));
47 else 49 else
54 local storage = st.stanza("storage", { xmlns = "storage:bookmarks" }); 56 local storage = st.stanza("storage", { xmlns = "storage:bookmarks" });
55 for _, item_id in ipairs(ret) do 57 for _, item_id in ipairs(ret) do
56 local item = ret[item_id]; 58 local item = ret[item_id];
57 local conference = st.stanza("conference"); 59 local conference = st.stanza("conference");
58 conference.attr.jid = item.attr.id; 60 conference.attr.jid = item.attr.id;
59 local bookmark = item:get_child("conference", "urn:xmpp:bookmarks:0"); 61 local bookmark = item:get_child("conference", namespace);
60 conference.attr.name = bookmark.attr.name; 62 conference.attr.name = bookmark.attr.name;
61 conference.attr.autojoin = bookmark.attr.autojoin; 63 conference.attr.autojoin = bookmark.attr.autojoin;
62 local nick = bookmark:get_child_text("nick", "urn:xmpp:bookmarks:0"); 64 local nick = bookmark:get_child_text("nick", namespace);
63 if nick ~= nil then 65 if nick ~= nil then
64 conference:text_tag("nick", nick, { xmlns = "storage:bookmarks" }):up(); 66 conference:text_tag("nick", nick, { xmlns = "storage:bookmarks" }):up();
65 end 67 end
66 local password = bookmark:get_child_text("password", "urn:xmpp:bookmarks:0"); 68 local password = bookmark:get_child_text("password", namespace);
67 if password ~= nil then 69 if password ~= nil then
68 conference:text_tag("password", password):up(); 70 conference:text_tag("password", password):up();
69 end 71 end
70 storage:add_child(conference); 72 storage:add_child(conference);
71 end 73 end
77 79
78 local function compare_bookmark2(a, b) 80 local function compare_bookmark2(a, b)
79 if a == nil or b == nil then 81 if a == nil or b == nil then
80 return false; 82 return false;
81 end 83 end
82 local a_conference = a:get_child("conference", "urn:xmpp:bookmarks:0"); 84 local a_conference = a:get_child("conference", namespace);
83 local b_conference = b:get_child("conference", "urn:xmpp:bookmarks:0"); 85 local b_conference = b:get_child("conference", namespace);
84 local a_nick = a:get_child_text("nick", "urn:xmpp:bookmarks:0"); 86 local a_nick = a:get_child_text("nick", namespace);
85 local b_nick = b:get_child_text("nick", "urn:xmpp:bookmarks:0"); 87 local b_nick = b:get_child_text("nick", namespace);
86 local a_password = a:get_child_text("password", "urn:xmpp:bookmarks:0"); 88 local a_password = a:get_child_text("password", namespace);
87 local b_password = b:get_child_text("password", "urn:xmpp:bookmarks:0"); 89 local b_password = b:get_child_text("password", namespace);
88 return (a.attr.id == b.attr.id and 90 return (a.attr.id == b.attr.id and
89 a_conference.attr.name == b_conference.attr.name and 91 a_conference.attr.name == b_conference.attr.name and
90 a_conference.attr.autojoin == b_conference.attr.autojoin and 92 a_conference.attr.autojoin == b_conference.attr.autojoin and
91 a_nick == b_nick and 93 a_nick == b_nick and
92 a_password == b_password); 94 a_password == b_password);
97 99
98 if #bookmarks.tags == 0 then 100 if #bookmarks.tags == 0 then
99 if synchronise then 101 if synchronise then
100 -- If we set zero legacy bookmarks, purge the bookmarks 2 node. 102 -- If we set zero legacy bookmarks, purge the bookmarks 2 node.
101 module:log("debug", "No bookmark in the set, purging instead."); 103 module:log("debug", "No bookmark in the set, purging instead.");
102 return service:purge("urn:xmpp:bookmarks:0", jid, true); 104 return service:purge(namespace, jid, true);
103 else 105 else
104 return true; 106 return true;
105 end 107 end
106 end 108 end
107 109
108 -- Retrieve the current bookmarks2. 110 -- Retrieve the current bookmarks2.
109 module:log("debug", "Retrieving the current bookmarks 2."); 111 module:log("debug", "Retrieving the current bookmarks 2.");
110 local has_bookmarks2, ret = service:get_items("urn:xmpp:bookmarks:0", jid); 112 local has_bookmarks2, ret = service:get_items(namespace, jid);
111 local bookmarks2; 113 local bookmarks2;
112 if not has_bookmarks2 and ret == "item-not-found" then 114 if not has_bookmarks2 and ret == "item-not-found" then
113 module:log("debug", "Got item-not-found, assuming it was empty until now, creating."); 115 module:log("debug", "Got item-not-found, assuming it was empty until now, creating.");
114 local ok, err = service:create("urn:xmpp:bookmarks:0", jid, default_options); 116 local ok, err = service:create(namespace, jid, default_options);
115 if not ok then 117 if not ok then
116 module:log("error", "Creating bookmarks 2 node failed: %s", err); 118 module:log("error", "Creating bookmarks 2 node failed: %s", err);
117 return ok, err; 119 return ok, err;
118 end 120 end
119 bookmarks2 = {}; 121 bookmarks2 = {};
131 to_remove[bookmarks2[i]] = true; 133 to_remove[bookmarks2[i]] = true;
132 end 134 end
133 135
134 for bookmark in bookmarks:childtags("conference", "storage:bookmarks") do 136 for bookmark in bookmarks:childtags("conference", "storage:bookmarks") do
135 -- Create the new conference element by copying everything from the legacy one. 137 -- Create the new conference element by copying everything from the legacy one.
136 local conference = st.stanza("conference", { xmlns = "urn:xmpp:bookmarks:0" }); 138 local conference = st.stanza("conference", { xmlns = namespace });
137 conference.attr.name = bookmark.attr.name; 139 conference.attr.name = bookmark.attr.name;
138 conference.attr.autojoin = bookmark.attr.autojoin; 140 conference.attr.autojoin = bookmark.attr.autojoin;
139 local nick = bookmark:get_child_text("nick", "storage:bookmarks"); 141 local nick = bookmark:get_child_text("nick", "storage:bookmarks");
140 if nick ~= nil then 142 if nick ~= nil then
141 conference:text_tag("nick", nick, { xmlns = "urn:xmpp:bookmarks:0" }):up(); 143 conference:text_tag("nick", nick):up();
142 end 144 end
143 local password = bookmark:get_child_text("password", "storage:bookmarks"); 145 local password = bookmark:get_child_text("password", "storage:bookmarks");
144 if password ~= nil then 146 if password ~= nil then
145 conference:text_tag("password", password, { xmlns = "urn:xmpp:bookmarks:0" }):up(); 147 conference:text_tag("password", password):up();
146 end 148 end
147 149
148 -- Create its wrapper. 150 -- Create its wrapper.
149 local item = st.stanza("item", { xmlns = "http://jabber.org/protocol/pubsub", id = bookmark.attr.jid }) 151 local item = st.stanza("item", { xmlns = "http://jabber.org/protocol/pubsub", id = bookmark.attr.jid })
150 :add_child(conference); 152 :add_child(conference);
158 module:log("debug", "Item %s not existing previously, publishing.", item.attr.id); 160 module:log("debug", "Item %s not existing previously, publishing.", item.attr.id);
159 else 161 else
160 module:log("debug", "Item %s different from the previous one, publishing.", item.attr.id); 162 module:log("debug", "Item %s different from the previous one, publishing.", item.attr.id);
161 to_remove[bookmark.attr.jid] = nil; 163 to_remove[bookmark.attr.jid] = nil;
162 end 164 end
163 local ok, err = service:publish("urn:xmpp:bookmarks:0", jid, bookmark.attr.jid, item, default_options); 165 local ok, err = service:publish(namespace, jid, bookmark.attr.jid, item, default_options);
164 if not ok then 166 if not ok then
165 module:log("error", "Publishing item %s failed: %s", item.attr.id, err); 167 module:log("error", "Publishing item %s failed: %s", item.attr.id, err);
166 return ok, err; 168 return ok, err;
167 end 169 end
168 end 170 end
170 172
171 -- Now handle retracting items that have been removed. 173 -- Now handle retracting items that have been removed.
172 if synchronise then 174 if synchronise then
173 for id in pairs(to_remove) do 175 for id in pairs(to_remove) do
174 module:log("debug", "Item %s removed from bookmarks.", id); 176 module:log("debug", "Item %s removed from bookmarks.", id);
175 local ok, err = service:retract("urn:xmpp:bookmarks:0", jid, id, st.stanza("retract", { id = id })); 177 local ok, err = service:retract(namespace, jid, id, st.stanza("retract", { id = id }));
176 if not ok then 178 if not ok then
177 module:log("error", "Retracting item %s failed: %s", id, err); 179 module:log("error", "Retracting item %s failed: %s", id, err);
178 return ok, err; 180 return ok, err;
179 end 181 end
180 end 182 end
243 end 245 end
244 246
245 local data, err = private_storage:get(username, "storage:storage:bookmarks"); 247 local data, err = private_storage:get(username, "storage:storage:bookmarks");
246 if not data then 248 if not data then
247 module:log("debug", "No existing legacy bookmarks for %s, migration already done: %s", jid, err); 249 module:log("debug", "No existing legacy bookmarks for %s, migration already done: %s", jid, err);
248 local ok, ret2 = service:get_items("urn:xmpp:bookmarks:0", session.full_jid); 250 local ok, ret2 = service:get_items(namespace, session.full_jid);
249 if not ok or not ret2 then 251 if not ok or not ret2 then
250 module:log("debug", "Additionally, no bookmarks 2 were existing for %s, assuming empty.", jid); 252 module:log("debug", "Additionally, no bookmarks 2 were existing for %s, assuming empty.", jid);
251 module:fire_event("bookmarks/empty", { session = session }); 253 module:fire_event("bookmarks/empty", { session = session });
252 end 254 end
253 return; 255 return;