]> granicus.if.org Git - ejabberd/commitdiff
Don't route PEP error messages to clients
authorHolger Weiss <holger@zedat.fu-berlin.de>
Mon, 24 Nov 2014 20:19:32 +0000 (21:19 +0100)
committerHolger Weiss <holger@zedat.fu-berlin.de>
Mon, 24 Nov 2014 20:19:32 +0000 (21:19 +0100)
src/mod_pubsub.erl
src/mod_pubsub_odbc.erl

index e6437199be9a63cb86afb40d4eb5f69785aecd53..a9a68e7c3031561b79da1a1a4eec830f002452a9 100644 (file)
@@ -74,7 +74,8 @@
         on_user_offline/3, remove_user/2,
         disco_local_identity/5, disco_local_features/5,
         disco_local_items/5, disco_sm_identity/5,
-        disco_sm_features/5, disco_sm_items/5]).
+        disco_sm_features/5, disco_sm_items/5,
+        drop_pep_error/4]).
 
 %% exported iq handlers
 -export([iq_sm/3]).
@@ -344,6 +345,8 @@ init([ServerHost, Opts]) ->
                             ?MODULE, disco_sm_features, 75),
          ejabberd_hooks:add(disco_sm_items, ServerHost, ?MODULE,
                             disco_sm_items, 75),
+         ejabberd_hooks:add(c2s_filter_packet_in, ServerHost, ?MODULE,
+                            drop_pep_error, 75),
          gen_iq_handler:add_iq_handler(ejabberd_sm, ServerHost,
                                        ?NS_PUBSUB, ?MODULE, iq_sm, IQDisc),
          gen_iq_handler:add_iq_handler(ejabberd_sm, ServerHost,
@@ -1278,6 +1281,33 @@ unsubscribe_user(Entity, Owner) ->
                                plugins(Host))
          end).
 
+%% -------
+%% packet receive hook handling function
+%%
+
+drop_pep_error(#xmlel{name = <<"message">>, attrs = Attrs} = Packet, _JID, From,
+              #jid{lresource = <<"">>} = To) ->
+    case xml:get_attr_s(<<"type">>, Attrs) of
+      <<"error">> ->
+         case xml:get_subtag(Packet, <<"event">>) of
+           #xmlel{attrs = EventAttrs} ->
+               case xml:get_attr_s(<<"xmlns">>, EventAttrs) of
+                 ?NS_PUBSUB_EVENT ->
+                     ?DEBUG("Dropping PEP error message from ~s to ~s",
+                            [jlib:jid_to_string(From),
+                             jlib:jid_to_string(To)]),
+                     drop;
+                 _ ->
+                     Packet
+               end;
+           false ->
+               Packet
+         end;
+      _ ->
+         Packet
+    end;
+drop_pep_error(Acc, _JID, _From, _To) -> Acc.
+
 %% -------
 %% user remove hook handling function
 %%
@@ -1418,6 +1448,8 @@ terminate(_Reason,
                                ?MODULE, disco_sm_features, 75),
          ejabberd_hooks:delete(disco_sm_items, ServerHost,
                                ?MODULE, disco_sm_items, 75),
+         ejabberd_hooks:delete(c2s_filter_packet_in, ServerHost,
+                               ?MODULE, drop_pep_error, 75),
          gen_iq_handler:remove_iq_handler(ejabberd_sm,
                                           ServerHost, ?NS_PUBSUB),
          gen_iq_handler:remove_iq_handler(ejabberd_sm,
index e2b357f032c635ce0f06336dcd5b52097a5934c2..99d8948ee9f541d61f9abbbec4e16e93c0826b94 100644 (file)
@@ -74,7 +74,8 @@
         on_user_offline/3, remove_user/2,
         disco_local_identity/5, disco_local_features/5,
         disco_local_items/5, disco_sm_identity/5,
-        disco_sm_features/5, disco_sm_items/5]).
+        disco_sm_features/5, disco_sm_items/5,
+        drop_pep_error/4]).
 
 %% exported iq handlers
 -export([iq_sm/3]).
@@ -344,6 +345,8 @@ init([ServerHost, Opts]) ->
                             ?MODULE, disco_sm_features, 75),
          ejabberd_hooks:add(disco_sm_items, ServerHost, ?MODULE,
                             disco_sm_items, 75),
+         ejabberd_hooks:add(c2s_filter_packet_in, ServerHost, ?MODULE,
+                            drop_pep_error, 75),
          gen_iq_handler:add_iq_handler(ejabberd_sm, ServerHost,
                                        ?NS_PUBSUB, ?MODULE, iq_sm, IQDisc),
          gen_iq_handler:add_iq_handler(ejabberd_sm, ServerHost,
@@ -929,6 +932,33 @@ unsubscribe_user(Entity, Owner) ->
                                plugins(Host))
          end).
 
+%% -------
+%% packet receive hook handling function
+%%
+
+drop_pep_error(#xmlel{name = <<"message">>, attrs = Attrs} = Packet, _JID, From,
+              #jid{lresource = <<"">>} = To) ->
+    case xml:get_attr_s(<<"type">>, Attrs) of
+      <<"error">> ->
+         case xml:get_subtag(Packet, <<"event">>) of
+           #xmlel{attrs = EventAttrs} ->
+               case xml:get_attr_s(<<"xmlns">>, EventAttrs) of
+                 ?NS_PUBSUB_EVENT ->
+                     ?DEBUG("Dropping PEP error message from ~s to ~s",
+                            [jlib:jid_to_string(From),
+                             jlib:jid_to_string(To)]),
+                     drop;
+                 _ ->
+                     Packet
+               end;
+           false ->
+               Packet
+         end;
+      _ ->
+         Packet
+    end;
+drop_pep_error(Acc, _JID, _From, _To) -> Acc.
+
 %% -------
 %% user remove hook handling function
 %%
@@ -1069,6 +1099,8 @@ terminate(_Reason,
                                ?MODULE, disco_sm_features, 75),
          ejabberd_hooks:delete(disco_sm_items, ServerHost,
                                ?MODULE, disco_sm_items, 75),
+         ejabberd_hooks:delete(c2s_filter_packet_in, ServerHost,
+                               ?MODULE, drop_pep_error, 75),
          gen_iq_handler:remove_iq_handler(ejabberd_sm,
                                           ServerHost, ?NS_PUBSUB),
          gen_iq_handler:remove_iq_handler(ejabberd_sm,