From 4f92c540b6a40b892601b37c93e802e328c47259 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Wed, 21 Feb 2018 21:02:16 +0100 Subject: mod_mam: Implement option to enable MAM implicitly when client support is detected (#867) --- plugins/mod_mam/mamprefs.lib.lua | 25 +++++++++++++++++++++++-- plugins/mod_mam/mod_mam.lua | 4 +++- 2 files changed, 26 insertions(+), 3 deletions(-) (limited to 'plugins') 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 -- cgit v1.2.3