diff options
author | Evgeny Khramtsov <xramtsov@gmail.com> | 2014-11-25 14:20:11 +0300 |
---|---|---|
committer | Evgeny Khramtsov <xramtsov@gmail.com> | 2014-11-25 14:20:11 +0300 |
commit | e97e56d776a8ad8ddc074bf62eeeaf8b0a68dead (patch) | |
tree | 7dc7c39776fe269d9dc2bc0b28e1ad090c22b5ac /src | |
parent | Merge pull request #354 from weiss/pep-privacy (diff) | |
parent | Don't route PEP error messages to clients (diff) |
Merge pull request #363 from weiss/drop-pep-errors
Don't route PEP error messages to clients
Diffstat (limited to 'src')
-rw-r--r-- | src/ejabberd_c2s.erl | 21 | ||||
-rw-r--r-- | src/mod_pubsub.erl | 34 | ||||
-rw-r--r-- | src/mod_pubsub_odbc.erl | 34 |
3 files changed, 82 insertions, 7 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 3bb8a04ac..601d07443 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -1694,12 +1694,23 @@ handle_info({route, From, To, jlib:replace_from_to_attrs(jlib:jid_to_string(From), jlib:jid_to_string(To), NewAttrs), FixedPacket = #xmlel{name = Name, attrs = Attrs2, children = Els}, - SentStateData = send_packet(NewState, FixedPacket), - ejabberd_hooks:run(user_receive_packet, - SentStateData#state.server, - [SentStateData#state.jid, From, To, FixedPacket]), + FinalState = + case ejabberd_hooks:run_fold(c2s_filter_packet_in, + NewState#state.server, FixedPacket, + [NewState#state.jid, From, To]) + of + drop -> + NewState; + FinalPacket = #xmlel{} -> + SentState = send_packet(NewState, FinalPacket), + ejabberd_hooks:run(user_receive_packet, + SentState#state.server, + [SentState#state.jid, From, To, + FinalPacket]), + SentState + end, ejabberd_hooks:run(c2s_loop_debug, [{route, From, To, Packet}]), - fsm_next_state(StateName, SentStateData); + fsm_next_state(StateName, FinalState); true -> ejabberd_hooks:run(c2s_loop_debug, [{route, From, To, Packet}]), fsm_next_state(StateName, NewState) diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl index 8ba28e051..5f16fed7e 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, @@ -1283,6 +1286,33 @@ unsubscribe_user(Entity, Owner) -> 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 %% @@ -1422,6 +1452,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 30016c24a..c953e26a9 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, @@ -934,6 +937,33 @@ unsubscribe_user(Entity, Owner) -> 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 %% @@ -1073,6 +1103,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, |