From 30687c40ef681b82da42a86bbeab249ddba120fd Mon Sep 17 00:00:00 2001 From: Holger Weiss Date: Mon, 24 Nov 2014 21:19:32 +0100 Subject: [PATCH] Don't route PEP error messages to clients --- src/mod_pubsub.erl | 34 +++++++++++++++++++++++++++++++++- src/mod_pubsub_odbc.erl | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index e6437199b..a9a68e7c3 100644 --- a/src/mod_pubsub.erl +++ b/src/mod_pubsub.erl @@ -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, diff --git a/src/mod_pubsub_odbc.erl b/src/mod_pubsub_odbc.erl index e2b357f03..99d8948ee 100644 --- a/src/mod_pubsub_odbc.erl +++ b/src/mod_pubsub_odbc.erl @@ -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,