Gentoo Archives: gentoo-commits

From: "Peter Volkov (pva)" <pva@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] gentoo-x86 commit in net-im/ejabberd/files: ejabberd-2.0.4-fix-EJAB-890.patch
Date: Sat, 28 Mar 2009 08:16:42
Message-Id: E1LnTia-0004Pf-CS@stork.gentoo.org
1 pva 09/03/28 08:16:40
2
3 Added: ejabberd-2.0.4-fix-EJAB-890.patch
4 Log:
5 Fixed EJAB-890 (subscription request produces many authorization requests with some clients and transports), bug #263950, thank Vadim Efimov for report and fix.
6 (Portage version: 2.2_rc26/cvs/Linux i686)
7
8 Revision Changes Path
9 1.1 net-im/ejabberd/files/ejabberd-2.0.4-fix-EJAB-890.patch
10
11 file : http://sources.gentoo.org/viewcvs.py/gentoo-x86/net-im/ejabberd/files/ejabberd-2.0.4-fix-EJAB-890.patch?rev=1.1&view=markup
12 plain: http://sources.gentoo.org/viewcvs.py/gentoo-x86/net-im/ejabberd/files/ejabberd-2.0.4-fix-EJAB-890.patch?rev=1.1&content-type=text/plain
13
14 Index: ejabberd-2.0.4-fix-EJAB-890.patch
15 ===================================================================
16 diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
17 index 9bd5ba5..40cba2a 100644
18 --- ejabberd_c2s.erl
19 +++ ejabberd_c2s.erl
20 @@ -1091,21 +1091,16 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
21 Attrs1 = lists:keydelete("type", 1, Attrs),
22 {true, [{"type", "unavailable"} | Attrs1], StateData};
23 "subscribe" ->
24 - Reason = xml:get_path_s(Packet,[{elem,"status"},cdata]),
25 - SRes = check_privacy_subs(in, subscribe, From, To,
26 - Packet, Reason, StateData),
27 + SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list),
28 {SRes, Attrs, StateData};
29 "subscribed" ->
30 - SRes = check_privacy_subs(in, subscribed, From, To,
31 - Packet, "", StateData),
32 + SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list),
33 {SRes, Attrs, StateData};
34 "unsubscribe" ->
35 - SRes = check_privacy_subs(in, unsubscribe, From, To,
36 - Packet, "", StateData),
37 + SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list),
38 {SRes, Attrs, StateData};
39 "unsubscribed" ->
40 - SRes = check_privacy_subs(in, unsubscribed, From, To,
41 - Packet, "", StateData),
42 + SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list),
43 {SRes, Attrs, StateData};
44 _ ->
45 case ejabberd_hooks:run_fold(
46 @@ -1628,35 +1623,18 @@ presence_track(From, To, Packet, StateData) ->
47 pres_a = A}
48 end.
49
50 -%% Check privacy rules for subscription requests and call the roster storage
51 -check_privacy_subs(Dir, Type, From, To, Packet, Reason, StateData) ->
52 - case is_privacy_allow(From, To, Dir, Packet, StateData) of
53 - true ->
54 - ejabberd_hooks:run_fold(
55 - roster_in_subscription,
56 - To#jid.lserver,
57 - false,
58 - [To#jid.user, To#jid.server, From, Type, Reason]),
59 - true;
60 - false ->
61 - false
62 - end.
63 -
64 -%% Check if privacy rules allow this delivery, then push to roster
65 -is_privacy_allow(From, To, Dir, Packet, StateData) ->
66 - case ejabberd_hooks:run_fold(
67 - privacy_check_packet, StateData#state.server,
68 - allow,
69 - [StateData#state.user,
70 - StateData#state.server,
71 - StateData#state.privacy_list,
72 - {From, To, Packet},
73 - Dir]) of
74 - deny ->
75 - false;
76 - allow ->
77 - true
78 - end.
79 +%% Check if privacy rules allow this delivery
80 +is_privacy_allow(From, To, Packet, PrivacyList) ->
81 + User = To#jid.user,
82 + Server = To#jid.server,
83 + allow == ejabberd_hooks:run_fold(
84 + privacy_check_packet, Server,
85 + allow,
86 + [User,
87 + Server,
88 + PrivacyList,
89 + {From, To, Packet},
90 + in]).
91
92 presence_broadcast(StateData, From, JIDSet, Packet) ->
93 lists:foreach(fun(JID) ->
94 diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl
95 index 9a56e5f..148ef5a 100644
96 --- ejabberd_sm.erl
97 +++ ejabberd_sm.erl
98 @@ -59,6 +59,7 @@
99 -include("ejabberd.hrl").
100 -include("jlib.hrl").
101 -include("ejabberd_ctl.hrl").
102 +-include("mod_privacy.hrl").
103
104 -record(session, {sid, usr, us, priority, info}).
105 -record(state, {}).
106 @@ -381,13 +382,40 @@ do_route(From, To, Packet) ->
107 {Pass, _Subsc} =
108 case xml:get_attr_s("type", Attrs) of
109 "subscribe" ->
110 - {true, true};
111 + Reason = xml:get_path_s(
112 + Packet,
113 + [{elem, "status"}, cdata]),
114 + {is_privacy_allow(From, To, Packet) andalso
115 + ejabberd_hooks:run_fold(
116 + roster_in_subscription,
117 + LServer,
118 + false,
119 + [User, Server, From, subscribe, Reason]),
120 + true};
121 "subscribed" ->
122 - {true, true};
123 + {is_privacy_allow(From, To, Packet) andalso
124 + ejabberd_hooks:run_fold(
125 + roster_in_subscription,
126 + LServer,
127 + false,
128 + [User, Server, From, subscribed, ""]),
129 + true};
130 "unsubscribe" ->
131 - {true, true};
132 + {is_privacy_allow(From, To, Packet) andalso
133 + ejabberd_hooks:run_fold(
134 + roster_in_subscription,
135 + LServer,
136 + false,
137 + [User, Server, From, unsubscribe, ""]),
138 + true};
139 "unsubscribed" ->
140 - {true, true};
141 + {is_privacy_allow(From, To, Packet) andalso
142 + ejabberd_hooks:run_fold(
143 + roster_in_subscription,
144 + LServer,
145 + false,
146 + [User, Server, From, unsubscribed, ""]),
147 + true};
148 _ ->
149 {true, false}
150 end,
151 @@ -446,6 +474,31 @@ do_route(From, To, Packet) ->
152 end
153 end.
154
155 +%% The default list applies to the user as a whole,
156 +%% and is processed if there is no active list set
157 +%% for the target session/resource to which a stanza is addressed,
158 +%% or if there are no current sessions for the user.
159 +is_privacy_allow(From, To, Packet) ->
160 + User = To#jid.user,
161 + Server = To#jid.server,
162 + PrivacyList = ejabberd_hooks:run_fold(privacy_get_user_list, Server,
163 + #userlist{}, [User, Server]),
164 + is_privacy_allow(From, To, Packet, PrivacyList).
165 +
166 +%% Check if privacy rules allow this delivery
167 +%% Function copied from ejabberd_c2s.erl
168 +is_privacy_allow(From, To, Packet, PrivacyList) ->
169 + User = To#jid.user,
170 + Server = To#jid.server,
171 + allow == ejabberd_hooks:run_fold(
172 + privacy_check_packet, Server,
173 + allow,
174 + [User,
175 + Server,
176 + PrivacyList,
177 + {From, To, Packet},
178 + in]).
179 +
180 route_message(From, To, Packet) ->
181 LUser = To#jid.luser,
182 LServer = To#jid.lserver,