mirror of
https://github.com/processone/ejabberd.git
synced 2025-01-03 18:02:28 +01:00
Fix mod_privacy race condition
mod_privacy updates the c2s state in user_receive_packet, which tracks the *result* of the IQ set for active privacy lists. When a second stanza is sent directly after a privacy list request, the second stanza will be processed using the old privacy list, because the IQ result has not yet been routed.
This commit is contained in:
parent
ed1cbc2c31
commit
570800a540
@ -419,6 +419,27 @@ user_send_packet({#iq{type = Type,
|
|||||||
false -> IQ
|
false -> IQ
|
||||||
end,
|
end,
|
||||||
{NewIQ, State};
|
{NewIQ, State};
|
||||||
|
|
||||||
|
user_send_packet({#iq{type = Type,
|
||||||
|
from = #jid{luser = U, lserver = S},
|
||||||
|
to = #jid{luser = U, lserver = S},
|
||||||
|
sub_els = [_]} = IQ,
|
||||||
|
State})
|
||||||
|
when Type == set ->
|
||||||
|
case xmpp:get_subtag(IQ, #privacy_query{}) of
|
||||||
|
#privacy_query{active = undefined} -> {IQ, State};
|
||||||
|
#privacy_query{default = undefined, active = Active} ->
|
||||||
|
case get_user_list(U, S, Active) of
|
||||||
|
{ok, _} ->
|
||||||
|
% Adjust the client's state directly, so the next to-be-processed
|
||||||
|
% packet will take the active list into account.
|
||||||
|
{IQ, State#{privacy_active_list => Active}};
|
||||||
|
true ->
|
||||||
|
{IQ, State}
|
||||||
|
end;
|
||||||
|
_ -> {IQ, State}
|
||||||
|
end;
|
||||||
|
|
||||||
user_send_packet(Acc) ->
|
user_send_packet(Acc) ->
|
||||||
Acc.
|
Acc.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user