aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2018-02-21 21:02:16 +0100
committerKim Alvefur <zash@zash.se>2018-02-21 21:02:16 +0100
commit6946a55f8f301da7521536a4ff79edcf690f4aaa (patch)
treeb997afd9f4fb6de3f4df1d13a8b68bf15943e5c0
parent9cbd3fdfb49dc7cc8685edaa49d4f95988325ac0 (diff)
downloadprosody-6946a55f8f301da7521536a4ff79edcf690f4aaa.tar.gz
prosody-6946a55f8f301da7521536a4ff79edcf690f4aaa.zip
mod_mam: Implement option to enable MAM implicitly when client support is detected (#867)
-rw-r--r--plugins/mod_mam/mamprefs.lib.lua25
-rw-r--r--plugins/mod_mam/mod_mam.lua4
2 files changed, 26 insertions, 3 deletions
diff --git a/plugins/mod_mam/mamprefs.lib.lua b/plugins/mod_mam/mamprefs.lib.lua
index 1e05b9d1..dd82b626 100644
--- a/plugins/mod_mam/mamprefs.lib.lua
+++ b/plugins/mod_mam/mamprefs.lib.lua
@@ -14,6 +14,7 @@ local global_default_policy = module:get_option_string("default_archive_policy",
if global_default_policy ~= "roster" then
global_default_policy = module:get_option_boolean("default_archive_policy", global_default_policy);
end
+local smart_enable = module:get_option_boolean("mam_smart_enable", false);
do
-- luacheck: ignore 211/prefs_format
@@ -30,17 +31,37 @@ local sessions = prosody.hosts[module.host].sessions;
local archive_store = module:get_option_string("archive_store", "archive");
local prefs = module:open_store(archive_store .. "_prefs");
-local function get_prefs(user)
+local function get_prefs(user, explicit)
local user_sessions = sessions[user];
local user_prefs = user_sessions and user_sessions.archive_prefs
if not user_prefs then
+ -- prefs not cached
user_prefs = prefs:get(user);
+ if not user_prefs then
+ -- prefs not set
+ if smart_enable and explicit then
+ -- a mam-capable client was involved in this action, set defaults
+ user_prefs = { [false] = global_default_policy };
+ prefs:set(user, user_prefs);
+ end
+ end
if user_sessions then
+ -- cache settings if they originate from user action
user_sessions.archive_prefs = user_prefs;
end
+ if not user_prefs then
+ if smart_enable then
+ -- not yet enabled, either explicitly or "smart"
+ user_prefs = { [false] = false };
+ else
+ -- no explicit settings, return defaults
+ user_prefs = { [false] = global_default_policy };
+ end
+ end
end
- return user_prefs or { [false] = global_default_policy };
+ return user_prefs;
end
+
local function set_prefs(user, user_prefs)
local user_sessions = sessions[user];
if user_sessions then
diff --git a/plugins/mod_mam/mod_mam.lua b/plugins/mod_mam/mod_mam.lua
index 7499c9ea..353fe1a2 100644
--- a/plugins/mod_mam/mod_mam.lua
+++ b/plugins/mod_mam/mod_mam.lua
@@ -76,7 +76,7 @@ module:hook("iq/self/"..xmlns_mam..":prefs", function(event)
return true;
end
end
- local prefs = prefs_to_stanza(get_prefs(user));
+ local prefs = prefs_to_stanza(get_prefs(user, true));
local reply = st.reply(stanza):add_child(prefs);
origin.send(reply);
return true;
@@ -92,6 +92,7 @@ local query_form = dataform {
-- Serve form
module:hook("iq-get/self/"..xmlns_mam..":query", function(event)
local origin, stanza = event.origin, event.stanza;
+ get_prefs(origin.username, true);
origin.send(st.reply(stanza):query(xmlns_mam):add_child(query_form:form()));
return true;
end);
@@ -102,6 +103,7 @@ module:hook("iq-set/self/"..xmlns_mam..":query", function(event)
local query = stanza.tags[1];
local qid = query.attr.queryid;
+ get_prefs(origin.username, true);
schedule_cleanup(origin.username);
-- Search query parameters