Software /
code /
prosody-modules
Annotate
mod_group_bookmarks/mod_group_bookmarks.lua @ 4876:0f5f2d4475b9
mod_http_xep227: Add support for import via APIs rather than direct store manipulation
In particular this transitions PEP nodes and data to be imported via mod_pep's
APIs, fixing issues with importing at runtime while PEP data may already be
live in RAM.
Next obvious candidate for this approach is rosters, so clients get immediate
roster pushes and other special handling (such as emitting subscribes to reach
the desired subscription state).
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Tue, 18 Jan 2022 17:01:18 +0000 |
parent | 3266:ebd78514bbec |
rev | line source |
---|---|
289
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 -- Prosody IM |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 -- Copyright (C) 2008-2010 Matthew Wild |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 -- Copyright (C) 2008-2010 Waqas Hussain |
3262
0ccdd3f31435
mod_group_bookmarks: Add my copyright.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3261
diff
changeset
|
4 -- Copyright (C) 2018 Emmanuel Gil Peyrot |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
679
diff
changeset
|
5 -- |
289
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 -- This project is MIT/X11 licensed. Please see the |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 -- COPYING file in the source package for more information. |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 -- |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 local st = require "util.stanza" |
3259
6824a1f3d8c0
mod_group_bookmarks: Remove duplicated requires.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1343
diff
changeset
|
11 local dm_load = require "util.datamanager".load |
3266
ebd78514bbec
mod_group_bookmarks: Remove unused requires.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3262
diff
changeset
|
12 local jid_prep = require "util.jid".prep; |
289
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 local rooms; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 local members; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 local bookmarks_file; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 module:add_feature("jabber:iq:private"); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 |
3266
ebd78514bbec
mod_group_bookmarks: Remove unused requires.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3262
diff
changeset
|
21 local function inject_bookmarks(username, host, data) |
289
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 local jid = username.."@"..host; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 data:reset(); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 if members[jid] then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 for _, room in ipairs(members[jid]) do |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 data:tag("conference", { |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 name = room; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 jid = room; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 autojoin = "1"; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 }); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 local nick = rooms[room][jid]; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 if nick then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 data:tag("nick"):text(nick):up(); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 data:up(); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 return data; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 |
3260
9bb317400c4c
mod_group_bookmarks: Use iq-get event instead of checking for stanza.attr.type == "get".
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3259
diff
changeset
|
41 module:hook("iq-get/self/jabber:iq:private:query", function(event) |
289
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 local origin, stanza = event.origin, event.stanza; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 local query = stanza.tags[1]; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 if #query.tags == 1 then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 local tag = query.tags[1]; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 local key = tag.name..":"..tag.attr.xmlns; |
3261
c2b1f64aaf97
mod_group_bookmarks: Return early when the key is not bookmarks.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3260
diff
changeset
|
47 if key ~= "storage:storage:bookmarks" then |
c2b1f64aaf97
mod_group_bookmarks: Return early when the key is not bookmarks.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3260
diff
changeset
|
48 return; |
c2b1f64aaf97
mod_group_bookmarks: Return early when the key is not bookmarks.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3260
diff
changeset
|
49 end |
3259
6824a1f3d8c0
mod_group_bookmarks: Remove duplicated requires.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
1343
diff
changeset
|
50 local data, err = dm_load(origin.username, origin.host, "private"); |
289
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 if err then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 origin.send(st.error_reply(stanza, "wait", "internal-server-error")); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 return true; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 end |
3260
9bb317400c4c
mod_group_bookmarks: Use iq-get event instead of checking for stanza.attr.type == "get".
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3259
diff
changeset
|
55 local data = data and data[key]; |
3261
c2b1f64aaf97
mod_group_bookmarks: Return early when the key is not bookmarks.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3260
diff
changeset
|
56 if not data then |
3260
9bb317400c4c
mod_group_bookmarks: Use iq-get event instead of checking for stanza.attr.type == "get".
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3259
diff
changeset
|
57 data = st.stanza("storage", { xmlns = "storage:bookmarks" }); |
9bb317400c4c
mod_group_bookmarks: Use iq-get event instead of checking for stanza.attr.type == "get".
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3259
diff
changeset
|
58 end |
3261
c2b1f64aaf97
mod_group_bookmarks: Return early when the key is not bookmarks.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3260
diff
changeset
|
59 data = st.deserialize(data); |
c2b1f64aaf97
mod_group_bookmarks: Return early when the key is not bookmarks.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3260
diff
changeset
|
60 data = inject_bookmarks(origin.username, origin.host, data); |
c2b1f64aaf97
mod_group_bookmarks: Return early when the key is not bookmarks.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3260
diff
changeset
|
61 origin.send(st.reply(stanza):tag("query", {xmlns = "jabber:iq:private"}) |
c2b1f64aaf97
mod_group_bookmarks: Return early when the key is not bookmarks.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3260
diff
changeset
|
62 :add_child(data)); |
3260
9bb317400c4c
mod_group_bookmarks: Use iq-get event instead of checking for stanza.attr.type == "get".
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3259
diff
changeset
|
63 return true; |
289
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 end, 1); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 function module.load() |
679
dcddd9195098
mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents:
290
diff
changeset
|
68 bookmarks_file = module:get_option_string("group_bookmarks_file"); |
dcddd9195098
mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents:
290
diff
changeset
|
69 |
289
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 rooms = { default = {} }; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 members = { }; |
679
dcddd9195098
mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents:
290
diff
changeset
|
72 |
dcddd9195098
mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents:
290
diff
changeset
|
73 if not bookmarks_file then |
dcddd9195098
mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents:
290
diff
changeset
|
74 module:log("error", "Please specify group_bookmarks_file in your configuration"); |
dcddd9195098
mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents:
290
diff
changeset
|
75 return; |
dcddd9195098
mod_group_bookmarks: Log error when group_bookmarks_file not specified
Matthew Wild <mwild1@gmail.com>
parents:
290
diff
changeset
|
76 end |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
679
diff
changeset
|
77 |
289
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
78 local curr_room; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
79 for line in io.lines(bookmarks_file) do |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 if line:match("^%s*%[.-%]%s*$") then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 curr_room = line:match("^%s*%[(.-)%]%s*$"); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
82 if curr_room:match("^%+") then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 curr_room = curr_room:gsub("^%+", ""); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 if not members[false] then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 members[false] = {}; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
86 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 members[false][#members[false]+1] = curr_room; -- Is a public group |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
88 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
89 module:log("debug", "New group: %s", tostring(curr_room)); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
90 rooms[curr_room] = rooms[curr_room] or {}; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 elseif curr_room then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 -- Add JID |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 local entryjid, name = line:match("([^=]*)=?(.*)"); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 module:log("debug", "entryjid = '%s', name = '%s'", entryjid, name); |
3266
ebd78514bbec
mod_group_bookmarks: Remove unused requires.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3262
diff
changeset
|
95 local jid = jid_prep(entryjid:match("%S+")); |
289
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
96 if jid then |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
97 module:log("debug", "New member of %s: %s", tostring(curr_room), tostring(jid)); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
98 rooms[curr_room][jid] = name or false; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
99 members[jid] = members[jid] or {}; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
100 members[jid][#members[jid]+1] = curr_room; |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
101 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
103 end |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
104 module:log("info", "Group bookmarks loaded successfully"); |
415034fd38c2
mod_group_bookmarks: Module to inject room bookmarks to user private XML stores
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 end |