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:
Nathan Bruning 2018-10-27 15:26:37 +02:00
parent ed1cbc2c31
commit 570800a540
1 changed files with 21 additions and 0 deletions

View File

@ -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.