kopia lustrzana https://github.com/ryukoposting/Signal-Android
Fix race condition when joining a group call.
rodzic
05c16e4c70
commit
40c52a31c9
|
@ -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();
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue