]> granicus.if.org Git - ejabberd/commitdiff
Add option to mod_offline to make it not bounce mucsub/groupchat messages
authorPaweł Chmielowski <pchmielowski@process-one.net>
Thu, 14 Mar 2019 14:12:39 +0000 (15:12 +0100)
committerPaweł Chmielowski <pchmielowski@process-one.net>
Thu, 14 Mar 2019 14:17:25 +0000 (15:17 +0100)
src/misc.erl
src/mod_offline.erl

index d2f0a57841e5a3b9022f51a8c0760426c68deefd..8cca30d5db0e3fb39f367caed591a9a4062cdbec 100644 (file)
@@ -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
index 7150d29727c63f58d5567239be60474c68bb3a49..e2a087ce0bd9451c9def304278e5e8fda700c923 100644 (file)
@@ -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}].