author | Kim Alvefur <zash@zash.se> |
Sat, 25 Jan 2020 01:31:49 +0100 | |
changeset 3861 | 8752e5b5dd08 |
parent 3270 | ebd78514bbec |
permissions | -rw-r--r-- |
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 |
3266
0ccdd3f31435
mod_group_bookmarks: Add my copyright.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3265
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" |
3263
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 |
3270
ebd78514bbec
mod_group_bookmarks: Remove unused requires.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3266
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 |
|
3270
ebd78514bbec
mod_group_bookmarks: Remove unused requires.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3266
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 |
|
3264
9bb317400c4c
mod_group_bookmarks: Use iq-get event instead of checking for stanza.attr.type == "get".
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3263
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; |
3265
c2b1f64aaf97
mod_group_bookmarks: Return early when the key is not bookmarks.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3264
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:
3264
diff
changeset
|
48 |
return; |
c2b1f64aaf97
mod_group_bookmarks: Return early when the key is not bookmarks.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3264
diff
changeset
|
49 |
end |
3263
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 |
3264
9bb317400c4c
mod_group_bookmarks: Use iq-get event instead of checking for stanza.attr.type == "get".
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3263
diff
changeset
|
55 |
local data = data and data[key]; |
3265
c2b1f64aaf97
mod_group_bookmarks: Return early when the key is not bookmarks.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3264
diff
changeset
|
56 |
if not data then |
3264
9bb317400c4c
mod_group_bookmarks: Use iq-get event instead of checking for stanza.attr.type == "get".
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3263
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:
3263
diff
changeset
|
58 |
end |
3265
c2b1f64aaf97
mod_group_bookmarks: Return early when the key is not bookmarks.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3264
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:
3264
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:
3264
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:
3264
diff
changeset
|
62 |
:add_child(data)); |
3264
9bb317400c4c
mod_group_bookmarks: Use iq-get event instead of checking for stanza.attr.type == "get".
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3263
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); |
3270
ebd78514bbec
mod_group_bookmarks: Remove unused requires.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
3266
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 |