mod_group_bookmarks/mod_group_bookmarks.lua
author Matthew Wild <mwild1@gmail.com>
Fri, 23 Sep 2022 22:41:15 +0100
changeset 5058 62480053c87b
parent 3270 ebd78514bbec
permissions -rw-r--r--
mod_cloud_notify_encrypted: Additional debug logging when enabling/skipping
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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