Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/processone/ejabberd.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Köhler <andreas.koehler@1und1.de>2010-11-05 17:44:22 +0300
committerBadlop <badlop@process-one.net>2010-11-10 17:41:08 +0300
commit7d93cad452553b2d02c2b5978ef63506ccc5e102 (patch)
tree1822bfc0da3a891ac67a697c7ca55e608962c440 /src/ejabberd_c2s.erl
parent860d8525ee474a1994ed08c149a0e2ac3f7f6953 (diff)
Before forwarding last activity requests to a user, check that the user's presence is visible for From
According to XEP-0012, 4. Online User Query, "if the requesting entity is not authorized to view the user's presence information (normally via a presence subscription as defined in XMPP IM), the user's server MUST NOT deliver the IQ-get to an available resource but instead MUST return a <forbidden/> error in response to the last activity request." So check for a subscription of from of the jid and bare jid and whether outgoing presences to From are allowed. Fixes problem 3 of EJAB-1158.
Diffstat (limited to 'src/ejabberd_c2s.erl')
-rw-r--r--src/ejabberd_c2s.erl19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index 55b42fa6c..8af5f47a7 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -1291,6 +1291,25 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
case exmpp_iq:is_request(Packet) of
true ->
case exmpp_iq:get_request(Packet) of
+ #xmlel{ns = ?NS_LAST_ACTIVITY} ->
+ LFrom = jlib:short_prepd_jid(From),
+ LBFrom = jlib:short_prepd_bare_jid(From),
+ DummyPresence = exmpp_presence:presence(available, ""),
+ HasFromSub = (?SETS:is_element(LFrom, StateData#state.pres_f) orelse ?SETS:is_element(LBFrom, StateData#state.pres_f))
+ andalso is_privacy_allow(StateData, To, From, DummyPresence, out),
+ case HasFromSub of
+ true ->
+ case privacy_check_packet(StateData, From, To, Packet, in) of
+ allow ->
+ {true, Attrs, StateData};
+ deny ->
+ {false, Attrs, StateData}
+ end;
+ _ ->
+ Err = exmpp_server_session:error(Packet, 'forbidden'),
+ send_element(StateData, Err),
+ {false, Attrs, StateData}
+ end;
_ ->
case privacy_check_packet(StateData, From, To, Packet, in) of
allow ->