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:
authorBadlop <badlop@process-one.net>2009-03-24 21:02:13 +0300
committerBadlop <badlop@process-one.net>2009-03-24 21:02:13 +0300
commit1e3faf8bd924dfbc5edf15023c15af2b47f344b9 (patch)
tree905048740ad0f789125820968be542c74f97bd52
parent3fce8ed570123552dfcbb77c0704d181cf582035 (diff)
Merge 1998 from trunk.
* 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
-rw-r--r--ChangeLog8
-rw-r--r--src/ejabberd_c2s.erl54
-rw-r--r--src/ejabberd_sm.erl61
3 files changed, 81 insertions, 42 deletions
diff --git a/ChangeLog b/ChangeLog
index 7c06cd100..9d4eba62a 100644
--- a/ChangeLog
+++ b/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
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index 9bd5ba535..40cba2a2c 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -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(
@@ -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) ->
diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl
index 9a56e5fb1..148ef5a3b 100644
--- a/src/ejabberd_sm.erl
+++ b/src/ejabberd_sm.erl
@@ -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, {}).
@@ -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,
@@ -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,