Skip to content

Commit

Permalink
Merge 1998 from trunk.
Browse files Browse the repository at this point in the history
* src/ejabberd_sm.erl: Partially retract SVN r1976
EJAB-300 (EJAB-890). Check default privacy list when account, not
a specific session, receives a presence subscription
stanza (EJAB-300).
* src/ejabberd_c2s.erl: Likewise

SVN Revision: 1999
  • Loading branch information
badlop committed Mar 24, 2009
1 parent 3fce8ed commit 1e3faf8
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 42 deletions.
8 changes: 8 additions & 0 deletions ChangeLog
@@ -1,3 +1,11 @@
2009-03-24 Badlop <badlop@process-one.net>

* src/ejabberd_sm.erl: Partially retract SVN r1976
EJAB-300 (EJAB-890). Check default privacy list when account, not
a specific session, receives a presence subscription
stanza (EJAB-300).
* src/ejabberd_c2s.erl: Likewise

2009-03-10 Badlop <badlop@process-one.net>

* doc/release_notes_2.0.4.txt: Added file for new release
Expand Down
54 changes: 16 additions & 38 deletions src/ejabberd_c2s.erl
Expand Up @@ -1091,21 +1091,16 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
Attrs1 = lists:keydelete("type", 1, Attrs),
{true, [{"type", "unavailable"} | Attrs1], StateData};
"subscribe" ->
Reason = xml:get_path_s(Packet,[{elem,"status"},cdata]),
SRes = check_privacy_subs(in, subscribe, From, To,
Packet, Reason, StateData),
SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list),
{SRes, Attrs, StateData};
"subscribed" ->
SRes = check_privacy_subs(in, subscribed, From, To,
Packet, "", StateData),
SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list),
{SRes, Attrs, StateData};
"unsubscribe" ->
SRes = check_privacy_subs(in, unsubscribe, From, To,
Packet, "", StateData),
SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list),
{SRes, Attrs, StateData};
"unsubscribed" ->
SRes = check_privacy_subs(in, unsubscribed, From, To,
Packet, "", StateData),
SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list),
{SRes, Attrs, StateData};
_ ->
case ejabberd_hooks:run_fold(
Expand Down Expand Up @@ -1628,35 +1623,18 @@ presence_track(From, To, Packet, StateData) ->
pres_a = A}
end.

%% Check privacy rules for subscription requests and call the roster storage
check_privacy_subs(Dir, Type, From, To, Packet, Reason, StateData) ->
case is_privacy_allow(From, To, Dir, Packet, StateData) of
true ->
ejabberd_hooks:run_fold(
roster_in_subscription,
To#jid.lserver,
false,
[To#jid.user, To#jid.server, From, Type, Reason]),
true;
false ->
false
end.

%% Check if privacy rules allow this delivery, then push to roster
is_privacy_allow(From, To, Dir, Packet, StateData) ->
case ejabberd_hooks:run_fold(
privacy_check_packet, StateData#state.server,
allow,
[StateData#state.user,
StateData#state.server,
StateData#state.privacy_list,
{From, To, Packet},
Dir]) of
deny ->
false;
allow ->
true
end.
%% Check if privacy rules allow this delivery
is_privacy_allow(From, To, Packet, PrivacyList) ->
User = To#jid.user,
Server = To#jid.server,
allow == ejabberd_hooks:run_fold(
privacy_check_packet, Server,
allow,
[User,
Server,
PrivacyList,
{From, To, Packet},
in]).

presence_broadcast(StateData, From, JIDSet, Packet) ->
lists:foreach(fun(JID) ->
Expand Down
61 changes: 57 additions & 4 deletions src/ejabberd_sm.erl
Expand Up @@ -59,6 +59,7 @@
-include("ejabberd.hrl").
-include("jlib.hrl").
-include("ejabberd_ctl.hrl").
-include("mod_privacy.hrl").

-record(session, {sid, usr, us, priority, info}).
-record(state, {}).
Expand Down Expand Up @@ -381,13 +382,40 @@ do_route(From, To, Packet) ->
{Pass, _Subsc} =
case xml:get_attr_s("type", Attrs) of
"subscribe" ->
{true, true};
Reason = xml:get_path_s(
Packet,
[{elem, "status"}, cdata]),
{is_privacy_allow(From, To, Packet) andalso
ejabberd_hooks:run_fold(
roster_in_subscription,
LServer,
false,
[User, Server, From, subscribe, Reason]),
true};
"subscribed" ->
{true, true};
{is_privacy_allow(From, To, Packet) andalso
ejabberd_hooks:run_fold(
roster_in_subscription,
LServer,
false,
[User, Server, From, subscribed, ""]),
true};
"unsubscribe" ->
{true, true};
{is_privacy_allow(From, To, Packet) andalso
ejabberd_hooks:run_fold(
roster_in_subscription,
LServer,
false,
[User, Server, From, unsubscribe, ""]),
true};
"unsubscribed" ->
{true, true};
{is_privacy_allow(From, To, Packet) andalso
ejabberd_hooks:run_fold(
roster_in_subscription,
LServer,
false,
[User, Server, From, unsubscribed, ""]),
true};
_ ->
{true, false}
end,
Expand Down Expand Up @@ -446,6 +474,31 @@ do_route(From, To, Packet) ->
end
end.

%% The default list applies to the user as a whole,
%% and is processed if there is no active list set
%% for the target session/resource to which a stanza is addressed,
%% or if there are no current sessions for the user.
is_privacy_allow(From, To, Packet) ->
User = To#jid.user,
Server = To#jid.server,
PrivacyList = ejabberd_hooks:run_fold(privacy_get_user_list, Server,
#userlist{}, [User, Server]),
is_privacy_allow(From, To, Packet, PrivacyList).

%% Check if privacy rules allow this delivery
%% Function copied from ejabberd_c2s.erl
is_privacy_allow(From, To, Packet, PrivacyList) ->
User = To#jid.user,
Server = To#jid.server,
allow == ejabberd_hooks:run_fold(
privacy_check_packet, Server,
allow,
[User,
Server,
PrivacyList,
{From, To, Packet},
in]).

route_message(From, To, Packet) ->
LUser = To#jid.luser,
LServer = To#jid.lserver,
Expand Down

0 comments on commit 1e3faf8

Please sign in to comment.