From 07580e6787d1f68fe6f657c3eaeeb785c80ec6db Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 19 Feb 2026 21:48:01 +0100 Subject: [PATCH] mod_mam: Allow backend modules to add fulltext namespace in Service Discovery --- src/mod_mam.erl | 18 ++++++++++++------ src/mod_mam_mnesia.erl | 4 ++++ src/mod_mam_sql.erl | 9 +++++++++ src/mod_muc_room.erl | 7 +++++-- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/mod_mam.erl b/src/mod_mam.erl index 49e780b48..b79966cb3 100644 --- a/src/mod_mam.erl +++ b/src/mod_mam.erl @@ -30,8 +30,8 @@ -protocol({xep, 359, '0.7.0', '15.09', "complete", ""}). -protocol({xep, 424, '0.4.2', '24.02', "partial", "Tombstones not implemented"}). -protocol({xep, 425, '0.3.0', '24.06', "complete", ""}). --protocol({xep, 441, '0.2.0', '15.06', "complete", ""}). -protocol({xep, 431, '0.2.0', '24.12', "complete", ""}). +-protocol({xep, 441, '0.2.0', '15.06', "complete", ""}). -behaviour(gen_mod). @@ -79,6 +79,7 @@ -callback delete_old_messages(binary() | global, erlang:timestamp(), all | chat | groupchat) -> any(). +-callback additional_namespaces(binary()) -> [binary()]. -callback extended_fields(binary()) -> [mam_query:property() | #xdata_field{}]. -callback store(xmlel(), binary(), {binary(), binary()}, chat | groupchat, jid(), binary(), recv | send, integer(), binary(), @@ -627,12 +628,15 @@ parse_query(#mam_query{}, _Lang) -> disco_local_features({error, _Error} = Acc, _From, _To, _Node, _Lang) -> Acc; -disco_local_features(Acc, _From, _To, <<"">>, _Lang) -> +disco_local_features(Acc, _From, #jid{lserver = LServer} = _To, <<"">>, _Lang) -> Features = case Acc of {result, Fs} -> Fs; empty -> [] end, - {result, [?NS_MESSAGE_RETRACT | Features]}; + Mod = gen_mod:db_mod(LServer, ?MODULE), + AdditionalNamespaces = Mod:additional_namespaces(LServer), + Namespaces = [?NS_MESSAGE_RETRACT], + {result, lists:append([Namespaces, AdditionalNamespaces, Features])}; disco_local_features(empty, _From, _To, _Node, Lang) -> Txt = ?T("No features available"), {error, xmpp:err_item_not_found(Txt, Lang)}; @@ -644,9 +648,11 @@ disco_sm_features(empty, From, To, Node, Lang) -> disco_sm_features({result, OtherFeatures}, #jid{luser = U, lserver = S}, #jid{luser = U, lserver = S}, <<"">>, _Lang) -> - {result, [?NS_MAM_TMP, ?NS_MAM_0, ?NS_MAM_1, ?NS_MAM_2, ?NS_SID_0, - ?NS_MESSAGE_RETRACT | - OtherFeatures]}; + Mod = gen_mod:db_mod(S, ?MODULE), + AdditionalNamespaces = Mod:additional_namespaces(S), + Namespaces = [?NS_MAM_TMP, ?NS_MAM_0, ?NS_MAM_1, ?NS_MAM_2, ?NS_SID_0, + ?NS_MESSAGE_RETRACT], + {result, lists:append([Namespaces, AdditionalNamespaces, OtherFeatures])}; disco_sm_features(Acc, _From, _To, _Node, _Lang) -> Acc. diff --git a/src/mod_mam_mnesia.erl b/src/mod_mam_mnesia.erl index f268e327e..41f41f5d0 100644 --- a/src/mod_mam_mnesia.erl +++ b/src/mod_mam_mnesia.erl @@ -29,6 +29,7 @@ %% API -export([init/2, remove_user/2, remove_room/3, delete_old_messages/3, + additional_namespaces/1, extended_fields/1, store/10, write_prefs/4, get_prefs/2, select/6, remove_from_archive/3, is_empty_for_user/2, is_empty_for_room/3, delete_old_messages_batch/5, @@ -189,6 +190,9 @@ delete_old_messages_batch(LServer, TimeStamp, Type, Batch, LastUS) -> {error, Err} end. +additional_namespaces(_) -> + []. + extended_fields(_) -> []. diff --git a/src/mod_mam_sql.erl b/src/mod_mam_sql.erl index d4788a86e..7c247e2a6 100644 --- a/src/mod_mam_sql.erl +++ b/src/mod_mam_sql.erl @@ -30,6 +30,7 @@ %% API -export([init/2, remove_user/2, remove_room/3, delete_old_messages/3, + additional_namespaces/1, extended_fields/1, store/10, write_prefs/4, get_prefs/2, select/7, export/1, remove_from_archive/3, is_empty_for_user/2, is_empty_for_room/3, select_with_mucsub/6, delete_old_messages_batch/4, count_messages_to_delete/3]). @@ -283,6 +284,14 @@ delete_old_messages(ServerHost, TimeStamp, Type) -> end, ok. +additional_namespaces(LServer) -> + case ejabberd_option:sql_type(LServer) of + mysql -> + [?NS_MAM_FULLTEXT_0]; + _ -> + [] + end. + extended_fields(LServer) -> case ejabberd_option:sql_type(LServer) of mysql -> diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl index 798a5bfa9..113d17327 100644 --- a/src/mod_muc_room.erl +++ b/src/mod_muc_room.erl @@ -4496,10 +4496,13 @@ make_disco_info(From, StateData) -> true -> [?NS_HATS]; false -> [] end - ++ case {gen_mod:is_loaded(StateData#state.server_host, mod_mam), + ++ case {gen_mod:is_loaded(ServerHost, mod_mam), Config#config.mam} of {true, true} -> - [?NS_MAM_TMP, ?NS_MAM_0, ?NS_MAM_1, ?NS_MAM_2, ?NS_SID_0]; + Mod = gen_mod:db_mod(ServerHost, mod_mam), + AdditionalNamespaces = Mod:additional_namespaces(ServerHost), + [?NS_MAM_TMP, ?NS_MAM_0, ?NS_MAM_1, ?NS_MAM_2, ?NS_SID_0 + | AdditionalNamespaces]; _ -> [] end,