diff options
author | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2010-03-09 14:03:27 +0900 |
---|---|---|
committer | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2010-03-09 14:03:27 +0900 |
commit | 839b406903e49170fd266e8143249c926f552612 (patch) | |
tree | 36e2627fed90d31fbf7d4b283723f1b88eede2ba | |
parent | More compliance with LSB (diff) |
don't route PEP error messsages to a client
-rw-r--r-- | src/mod_pubsub/mod_pubsub.erl | 31 | ||||
-rw-r--r-- | src/mod_pubsub/mod_pubsub_odbc.erl | 31 |
2 files changed, 48 insertions, 14 deletions
diff --git a/src/mod_pubsub/mod_pubsub.erl b/src/mod_pubsub/mod_pubsub.erl index e0b54ded2..b7d45b7e1 100644 --- a/src/mod_pubsub/mod_pubsub.erl +++ b/src/mod_pubsub/mod_pubsub.erl @@ -3769,7 +3769,9 @@ extended_headers(Jids) -> [{xmlelement, "address", [{"type", "replyto"}, {"jid", Jid}], []} || Jid <- Jids]. -feature_check_packet(allow, _User, Server, Pres, {#jid{lserver = LServer}, _To, {xmlelement, "message", _, _} = El}, in) -> +feature_check_packet(allow, _User, Server, Pres, + {#jid{lserver = LServer}, _To, + {xmlelement, "message", MsgAttrs, _} = El}, in) -> Host = host(Server), case LServer of %% If the sender Server equals Host, the message comes from the Pubsub server @@ -3781,12 +3783,27 @@ feature_check_packet(allow, _User, Server, Pres, {#jid{lserver = LServer}, _To, {xmlelement, _, Attrs, _} = EventEl -> case xml:get_attr_s("xmlns", Attrs) of ?NS_PUBSUB_EVENT -> - Feature = xml:get_path_s(EventEl, [{elem, "items"}, {attr, "node"}]), - case is_feature_supported(Pres, Feature) of - true -> - allow; - false -> - deny + case xml:get_attr_s("type", MsgAttrs) of + "error" -> + %% Filter error-repsonse of PEP message + %% to avoid routing it to client + deny; + _ when Pres /= undefined -> + %% Yes, sometimes Pres = undefined, + %% very rare though. + %% Seems like this is a bug: should + %% be fixed in ejabberd_s2s.erl + Feature = xml:get_path_s( + EventEl, [{elem, "items"}, + {attr, "node"}]), + case is_feature_supported(Pres, Feature) of + true -> + allow; + false -> + deny + end; + _ -> + allow end; _ -> allow diff --git a/src/mod_pubsub/mod_pubsub_odbc.erl b/src/mod_pubsub/mod_pubsub_odbc.erl index a6dca0035..cc783913b 100644 --- a/src/mod_pubsub/mod_pubsub_odbc.erl +++ b/src/mod_pubsub/mod_pubsub_odbc.erl @@ -3634,7 +3634,9 @@ extended_headers(Jids) -> [{xmlelement, "address", [{"type", "replyto"}, {"jid", Jid}], []} || Jid <- Jids]. -feature_check_packet(allow, _User, Server, Pres, {#jid{lserver = LServer}, _To, {xmlelement, "message", _, _} = El}, in) -> +feature_check_packet(allow, _User, Server, Pres, + {#jid{lserver = LServer}, _To, + {xmlelement, "message", MsgAttrs, _} = El}, in) -> Host = host(Server), case LServer of %% If the sender Server equals Host, the message comes from the Pubsub server @@ -3646,12 +3648,27 @@ feature_check_packet(allow, _User, Server, Pres, {#jid{lserver = LServer}, _To, {xmlelement, _, Attrs, _} = EventEl -> case xml:get_attr_s("xmlns", Attrs) of ?NS_PUBSUB_EVENT -> - Feature = xml:get_path_s(EventEl, [{elem, "items"}, {attr, "node"}]), - case is_feature_supported(Pres, Feature) of - true -> - allow; - false -> - deny + case xml:get_attr_s("type", MsgAttrs) of + "error" -> + %% Filter error-repsonse of PEP message + %% to avoid routing it to client + deny; + _ when Pres /= undefined -> + %% Yes, sometimes Pres = undefined, + %% very rare though. + %% Seems like this is a bug: should + %% be fixed in ejabberd_s2s.erl + Feature = xml:get_path_s( + EventEl, [{elem, "items"}, + {attr, "node"}]), + case is_feature_supported(Pres, Feature) of + true -> + allow; + false -> + deny + end; + _ -> + allow end; _ -> allow |