Fix race condition when joining a group call.

fork-5.53.8
Cody Henthorne 2022-08-23 16:48:57 -04:00 zatwierdzone przez Greyson Parrelli
rodzic 05c16e4c70
commit 40c52a31c9
4 zmienionych plików z 50 dodań i 27 usunięć

Wyświetl plik

@ -125,8 +125,30 @@ public class GroupActionProcessor extends DeviceAwareActionProcessor {
}
@Override
protected @NonNull WebRtcServiceState handleGroupRequestMembershipProof(@NonNull WebRtcServiceState currentState, int groupCallHash, @NonNull byte[] groupMembershipToken) {
protected @NonNull WebRtcServiceState handleGroupRequestMembershipProof(@NonNull WebRtcServiceState currentState, int groupCallHashCode) {
Log.i(tag, "handleGroupRequestMembershipProof():");
Recipient recipient = currentState.getCallInfoState().getCallRecipient();
if (!recipient.isPushV2Group()) {
Log.i(tag, "Request membership proof for non-group");
return currentState;
}
GroupCall currentGroupCall = currentState.getCallInfoState().getGroupCall();
if (currentGroupCall == null || currentGroupCall.hashCode() != groupCallHashCode) {
Log.i(tag, "Skipping group membership proof request, requested group call does not match current group call");
return currentState;
}
//noinspection OptionalGetWithoutIsPresent
webRtcInteractor.requestGroupMembershipProof(recipient.getGroupId().get().requireV2(), groupCallHashCode);
return currentState;
}
@Override
protected @NonNull WebRtcServiceState handleGroupMembershipProofResponse(@NonNull WebRtcServiceState currentState, int groupCallHash, @NonNull byte[] groupMembershipToken) {
Log.i(tag, "handleGroupMembershipProofResponse():");
GroupCall groupCall = currentState.getCallInfoState().getGroupCall();

Wyświetl plik

@ -388,6 +388,21 @@ private void processStateless(@NonNull Function1<WebRtcEphemeralState, WebRtcEph
});
}
void requestGroupMembershipToken(@NonNull GroupId.V2 groupId, int groupCallHashCode) {
networkExecutor.execute(() -> {
try {
GroupExternalCredential credential = GroupManager.getGroupExternalCredential(context, groupId);
process((s, p) -> p.handleGroupMembershipProofResponse(s, groupCallHashCode, credential.getTokenBytes().toByteArray()));
} catch (IOException e) {
Log.w(TAG, "Unable to get group membership proof from service", e);
process((s, p) -> p.handleGroupCallEnded(s, groupCallHashCode, GroupCall.GroupCallEndReason.SFU_CLIENT_FAILED_TO_JOIN));
} catch (VerificationFailedException e) {
Log.w(TAG, "Unable to verify group membership proof", e);
process((s, p) -> p.handleGroupCallEnded(s, groupCallHashCode, GroupCall.GroupCallEndReason.DEVICE_EXPLICITLY_DISCONNECTED));
}
});
}
public boolean startCallCardActivityIfPossible() {
if (Build.VERSION.SDK_INT >= 29 && !ApplicationDependencies.getAppForegroundObserver().isForegrounded()) {
return false;
@ -744,31 +759,7 @@ private void processStateless(@NonNull Function1<WebRtcEphemeralState, WebRtcEph
@Override
public void requestMembershipProof(@NonNull final GroupCall groupCall) {
Log.i(TAG, "requestMembershipProof():");
Recipient recipient = serviceState.getCallInfoState().getCallRecipient();
if (!recipient.isPushV2Group()) {
Log.i(TAG, "Request membership proof for non-group");
return;
}
GroupCall currentGroupCall = serviceState.getCallInfoState().getGroupCall();
if (currentGroupCall == null || currentGroupCall.hashCode() != groupCall.hashCode()) {
Log.i(TAG, "Skipping group membership proof request, requested group call does not match current group call");
return;
}
networkExecutor.execute(() -> {
try {
GroupExternalCredential credential = GroupManager.getGroupExternalCredential(context, recipient.getGroupId().get().requireV2());
process((s, p) -> p.handleGroupRequestMembershipProof(s, groupCall.hashCode(), credential.getTokenBytes().toByteArray()));
} catch (IOException e) {
Log.w(TAG, "Unable to get group membership proof from service", e);
onEnded(groupCall, GroupCall.GroupCallEndReason.SFU_CLIENT_FAILED_TO_JOIN);
} catch (VerificationFailedException e) {
Log.w(TAG, "Unable to verify group membership proof", e);
onEnded(groupCall, GroupCall.GroupCallEndReason.DEVICE_EXPLICITLY_DISCONNECTED);
}
});
process((s, p) -> p.handleGroupRequestMembershipProof(s, groupCall.hashCode()));
}
@Override

Wyświetl plik

@ -726,11 +726,16 @@ public abstract class WebRtcActionProcessor {
return currentState;
}
protected @NonNull WebRtcServiceState handleGroupRequestMembershipProof(@NonNull WebRtcServiceState currentState, int groupCallHash, @NonNull byte[] groupMembershipToken) {
protected @NonNull WebRtcServiceState handleGroupRequestMembershipProof(@NonNull WebRtcServiceState currentState, int groupCallHashCode) {
Log.i(tag, "handleGroupRequestMembershipProof not processed");
return currentState;
}
protected @NonNull WebRtcServiceState handleGroupMembershipProofResponse(@NonNull WebRtcServiceState currentState, int groupCallHash, @NonNull byte[] groupMembershipToken) {
Log.i(tag, "handleGroupMembershipProofResponse not processed");
return currentState;
}
protected @NonNull WebRtcServiceState handleGroupRequestUpdateMembers(@NonNull WebRtcServiceState currentState) {
Log.i(tag, "handleGroupRequestUpdateMembers not processed");
return currentState;

Wyświetl plik

@ -8,6 +8,7 @@ import androidx.annotation.Nullable;
import org.signal.ringrtc.CallManager;
import org.signal.ringrtc.GroupCall;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.ringrtc.CameraEventListener;
@ -182,4 +183,8 @@ public class WebRtcInteractor {
public boolean addNewOutgoingCall(RecipientId recipientId, long callId, boolean isVideoCall) {
return AndroidTelecomUtil.addOutgoingCall(recipientId, callId, isVideoCall);
}
public void requestGroupMembershipProof(GroupId.V2 groupId, int groupCallHashCode) {
signalCallManager.requestGroupMembershipToken(groupId, groupCallHashCode);
}
}