comparison mod_bookmarks/mod_bookmarks.lua @ 3229:e8963e328b26

mod_bookmarks: New module synchronising bookmarks to the new persistent mod_pep
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Sat, 18 Aug 2018 13:48:45 +0100
parents
children ba0d444b64aa
comparison
equal deleted inserted replaced
3228:bada43f3a546 3229:e8963e328b26
1 local st = require "util.stanza"
2
3 local mod_pep = module:depends "pep";
4 local private_storage = module:open_store("private", "map");
5
6 module:hook("account-disco-info", function (event)
7 event.reply:tag("feature", { var = "urn:xmpp:bookmarks-conversion:0" }):up();
8 end);
9
10 local function on_retrieve_private_xml(event)
11 local stanza, session = event.stanza, event.origin;
12 local query = stanza:get_child("query", "jabber:iq:private");
13 if query == nil then
14 return;
15 end
16
17 local bookmarks = query:get_child("storage", "storage:bookmarks");
18 if bookmarks == nil then
19 return;
20 end
21
22 module:log("debug", "Getting private %s", bookmarks);
23
24 local username = session.username;
25 local service = mod_pep.get_pep_service(username);
26 module:log("debug", "%s", session.full_jid);
27 local ok, id = service:get_last_item("storage:bookmarks", session.full_jid);
28 if not ok then
29 module:log("error", "Failed to PEP bookmarks’ last id of %s: %s", username, id);
30 session.send(st.error_reply(stanza, "cancel", "internal-server-error", "Failed to retrive bookmarks from PEP"));
31 return;
32 end
33
34 local ok, data = service:get_items("storage:bookmarks", session.full_jid, id);
35 if not ok then
36 module:log("error", "Failed to retrieve PEP bookmarks of %s: %s", username, data);
37 session.send(st.error_reply(stanza, "cancel", "internal-server-error", "Failed to retrive bookmarks from PEP"));
38 return;
39 end
40
41 local item = data[id];
42 local content = item.tags[1];
43 module:log("debug", "Sending back private for %s: %s", username, content);
44 session.send(st.reply(stanza):query("jabber:iq:private"):add_child(content));
45 return true;
46 end
47
48 local function publish_to_pep(username, jid, bookmarks)
49 local service = mod_pep.get_pep_service(username);
50 local item = st.stanza("item", { xmlns = "http://jabber.org/protocol/pubsub", id = "current" })
51 :add_child(bookmarks);
52 return service:publish("storage:bookmarks", jid, "current", item);
53 end
54
55 -- Synchronise Private XML to PEP.
56 local function on_publish_private_xml(event)
57 local stanza, session = event.stanza, event.origin;
58 local query = stanza:get_child("query", "jabber:iq:private");
59 if query == nil then
60 return;
61 end
62
63 local bookmarks = query:get_child("storage", "storage:bookmarks");
64 if bookmarks == nil then
65 return;
66 end
67
68 module:log("debug", "Private bookmarks set by client, publishing to pep");
69 local ok, err = publish_to_pep(session.username, session.full_jid, bookmarks);
70 if not ok then
71 module:log("error", "Failed to publish to PEP bookmarks for %s: %s", session.username, err);
72 session.send(st.error_reply(stanza, "cancel", "internal-server-error", "Failed to store bookmarks to PEP"));
73 return;
74 end
75
76 session.send(st.reply(stanza));
77 return true;
78 end
79
80 local function on_resource_bind(event)
81 local session = event.session;
82 local username = session.username;
83
84 local data, err = private_storage:get(username, "storage:storage:bookmarks");
85 if not data then
86 module:log("debug", "No existing Private XML bookmarks for %s, migration already done: %s", username, err);
87 return;
88 end
89 local bookmarks = st.deserialize(data);
90 module:log("debug", "Got private bookmarks of %s: %s", username, bookmarks);
91
92 module:log("debug", "Going to store PEP item for %s", username);
93 local ok, err = publish_to_pep(username, session.host, bookmarks);
94 if not ok then
95 module:log("error", "Failed to store bookmarks to PEP for %s, aborting migration: %s", username, err);
96 return;
97 end
98 module:log("debug", "Stored bookmarks to PEP for %s", username);
99
100 local ok, err = private_storage:set(username, "storage:storage:bookmarks", nil);
101 if not ok then
102 module:log("error", "Failed to remove private bookmarks of %s: %s", username, err);
103 return;
104 end
105 module:log("debug", "Removed private bookmarks of %s, migration done!", username);
106 end
107
108 module:hook("iq-get/bare/jabber:iq:private:query", on_retrieve_private_xml)
109 module:hook("iq-set/bare/jabber:iq:private:query", on_publish_private_xml)
110 module:hook("resource-bind", on_resource_bind)