aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaweł Chmielowski <pchmielowski@process-one.net>2019-03-14 15:12:39 +0100
committerPaweł Chmielowski <pchmielowski@process-one.net>2019-03-14 15:17:25 +0100
commit89db022da47e5a0e376e0cfe88583a2248875257 (patch)
treedd036f0629e1de6667bc8361287cec38cacf689b
parentUse jid() instead of ljid() (diff)
Add option to mod_offline to make it not bounce mucsub/groupchat messages
-rw-r--r--src/misc.erl23
-rw-r--r--src/mod_offline.erl48
2 files changed, 59 insertions, 12 deletions
diff --git a/src/misc.erl b/src/misc.erl
index d2f0a5784..8cca30d5d 100644
--- a/src/misc.erl
+++ b/src/misc.erl
@@ -38,7 +38,8 @@
compile_exprs/2, join_atoms/2, try_read_file/1, get_descr/2,
css_dir/0, img_dir/0, js_dir/0, msgs_dir/0, sql_dir/0, lua_dir/0,
read_css/1, read_img/1, read_js/1, read_lua/1, try_url/1,
- intersection/2, format_val/1, cancel_timer/1, unique_timestamp/0]).
+ intersection/2, format_val/1, cancel_timer/1, unique_timestamp/0,
+ is_mucsub_message/1]).
%% Deprecated functions
-export([decode_base64/1, encode_base64/1]).
@@ -109,6 +110,26 @@ unwrap_mucsub_message(#message{} = OuterMsg) ->
unwrap_mucsub_message(_Packet) ->
false.
+-spec is_mucsub_message(xmpp_element()) -> boolean().
+is_mucsub_message(#message{} = OuterMsg) ->
+ case xmpp:get_subtag(OuterMsg, #ps_event{}) of
+ #ps_event{
+ items = #ps_items{
+ node = Node}}
+ when Node == ?NS_MUCSUB_NODES_MESSAGES;
+ Node == ?NS_MUCSUB_NODES_SUBJECT;
+ Node == ?NS_MUCSUB_NODES_AFFILIATIONS;
+ Node == ?NS_MUCSUB_NODES_CONFIG;
+ Node == ?NS_MUCSUB_NODES_PARTICIPANTS;
+ Node == ?NS_MUCSUB_NODES_PRESENCE;
+ Node == ?NS_MUCSUB_NODES_SUBSCRIBERS ->
+ true;
+ _ ->
+ false
+ end;
+is_mucsub_message(_Packet) ->
+ false.
+
-spec is_standalone_chat_state(stanza()) -> boolean().
is_standalone_chat_state(Stanza) ->
case unwrap_carbon(Stanza) of
diff --git a/src/mod_offline.erl b/src/mod_offline.erl
index 7150d2972..e2a087ce0 100644
--- a/src/mod_offline.erl
+++ b/src/mod_offline.erl
@@ -576,19 +576,42 @@ remove_user(User, Server) ->
%% Helper functions:
+-spec check_if_message_should_be_bounced(message()) -> boolean().
+check_if_message_should_be_bounced(Packet) ->
+ case Packet of
+ #message{type = groupchat, to = #jid{lserver = LServer}} ->
+ gen_mod:get_module_opt(LServer, ?MODULE, bounce_groupchat);
+ #message{to = #jid{lserver = LServer}} ->
+ case misc:is_mucsub_message(Packet) of
+ true ->
+ gen_mod:get_module_opt(LServer, ?MODULE, bounce_groupchat);
+ _ ->
+ true
+ end;
+ _ ->
+ true
+ end.
+
%% Warn senders that their messages have been discarded:
+
-spec discard_warn_sender(message(), full | any()) -> ok.
-discard_warn_sender(Packet, full) ->
- ErrText = <<"Your contact offline message queue is "
- "full. The message has been discarded.">>,
- Lang = xmpp:get_lang(Packet),
- Err = xmpp:err_resource_constraint(ErrText, Lang),
- ejabberd_router:route_error(Packet, Err);
-discard_warn_sender(Packet, _) ->
- ErrText = <<"Database failure">>,
- Lang = xmpp:get_lang(Packet),
- Err = xmpp:err_internal_server_error(ErrText, Lang),
- ejabberd_router:route_error(Packet, Err).
+discard_warn_sender(Packet, Reason) ->
+ case check_if_message_should_be_bounced(Packet) of
+ true ->
+ Lang = xmpp:get_lang(Packet),
+ Err = case Reason of
+ full ->
+ ErrText = <<"Your contact offline message queue is "
+ "full. The message has been discarded.">>,
+ xmpp:err_resource_constraint(ErrText, Lang);
+ _ ->
+ ErrText = <<"Database failure">>,
+ xmpp:err_internal_server_error(ErrText, Lang)
+ end,
+ ejabberd_router:route_error(Packet, Err);
+ _ ->
+ ok
+ end.
webadmin_page(_, Host,
#request{us = _US, path = [<<"user">>, U, <<"queue">>],
@@ -855,6 +878,8 @@ mod_opt_type(access_max_user_messages) ->
mod_opt_type(db_type) -> fun(T) -> ejabberd_config:v_db(?MODULE, T) end;
mod_opt_type(store_groupchat) ->
fun(V) when is_boolean(V) -> V end;
+mod_opt_type(bounce_groupchat) ->
+ fun(V) when is_boolean(V) -> V end;
mod_opt_type(store_empty_body) ->
fun (V) when is_boolean(V) -> V;
(unless_chat_state) -> unless_chat_state
@@ -864,4 +889,5 @@ mod_options(Host) ->
[{db_type, ejabberd_config:default_db(Host, ?MODULE)},
{access_max_user_messages, max_user_offline_messages},
{store_empty_body, unless_chat_state},
+ {bounce_groupchat, true},
{store_groupchat, false}].