diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV2Authorization.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV2Authorization.java index 6977dcb92f..2d2a461b9c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV2Authorization.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupsV2Authorization.java @@ -11,6 +11,7 @@ import org.signal.libsignal.zkgroup.calllinks.CallLinkAuthCredentialPresentation import org.signal.libsignal.zkgroup.calllinks.CallLinkAuthCredentialResponse; import org.signal.libsignal.zkgroup.calllinks.CallLinkSecretParams; import org.signal.libsignal.zkgroup.groups.GroupSecretParams; +import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.recipients.Recipient; import org.whispersystems.signalservice.api.groupsv2.GroupsV2Api; import org.whispersystems.signalservice.api.groupsv2.GroupsV2AuthorizationString; @@ -151,7 +152,7 @@ public class GroupsV2Authorization { throw new NoCredentialForRedemptionTimeException(); } - return groupsV2Api.getGroupsV2AuthorizationString(serviceIds.getAci(), serviceIds.requirePni(), todaySeconds, groupSecretParams, authCredentialWithPniResponse); + return groupsV2Api.getGroupsV2AuthorizationString(serviceIds.getAci(), serviceIds.getPni(), SignalStore.account().getAuthCredentialSalt(), todaySeconds, groupSecretParams, authCredentialWithPniResponse); } public interface ValueCache { diff --git a/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/groupsv2/GroupsV2Api.java b/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/groupsv2/GroupsV2Api.java index 82f6f6d056..f29cfc8383 100644 --- a/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/groupsv2/GroupsV2Api.java +++ b/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/api/groupsv2/GroupsV2Api.java @@ -39,6 +39,7 @@ import java.util.Objects; import java.util.Optional; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import okio.ByteString; @@ -63,16 +64,26 @@ public class GroupsV2Api { /** * Create an auth token from a credential response. + * + * @param authCredentialSalt required when the account has no PNI, provided by the server at registration/link time */ public GroupsV2AuthorizationString getGroupsV2AuthorizationString(ACI aci, - PNI pni, + @Nullable PNI pni, + @Nullable byte[] authCredentialSalt, long redemptionTimeSeconds, GroupSecretParams groupSecretParams, AuthCredentialWithPniResponse authCredentialWithPniResponse) throws VerificationFailedException { - ClientZkAuthOperations authOperations = groupsOperations.getAuthOperations(); - AuthCredentialWithPni authCredentialWithPni = authOperations.receiveAuthCredentialWithPniAsServiceId(aci.getLibSignalAci(), pni.getLibSignalPni(), redemptionTimeSeconds, authCredentialWithPniResponse); + ClientZkAuthOperations authOperations = groupsOperations.getAuthOperations(); + + AuthCredentialWithPni authCredentialWithPni; + if (pni != null) { + authCredentialWithPni = authOperations.receiveAuthCredentialWithPniAsServiceId(aci.getLibSignalAci(), pni.getLibSignalPni(), redemptionTimeSeconds, authCredentialWithPniResponse); + } else { + authCredentialWithPni = authOperations.receiveAuthCredentialWithoutPni(aci.getLibSignalAci(), Objects.requireNonNull(authCredentialSalt, "Missing auth credential salt for account without a PNI"), redemptionTimeSeconds, authCredentialWithPniResponse); + } + AuthCredentialPresentation authCredentialPresentation = authOperations.createAuthCredentialPresentation(new SecureRandom(), groupSecretParams, authCredentialWithPni); return new GroupsV2AuthorizationString(groupSecretParams, authCredentialPresentation);