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
|
||||
end,
|
||||
{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) ->
|
||||
Acc.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user