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, |