From a99c0d438e535561fce3e40a74610885e7f6d677 Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Fri, 29 May 2020 14:35:40 -0300 Subject: [PATCH] Rename GV2 "version" to "revision". --- .../securesms/database/GroupDatabase.java | 4 +- .../model/GroupsV2UpdateMessageProducer.java | 2 +- .../database/model/MessageRecord.java | 2 +- .../securesms/groups/GroupManager.java | 4 +- .../securesms/groups/GroupManagerV2.java | 6 +- .../securesms/groups/GroupProtoUtil.java | 14 +-- .../v2/processing/GlobalGroupState.java | 6 +- .../groups/v2/processing/GroupLogEntry.java | 2 +- .../v2/processing/GroupStateMapper.java | 18 ++-- .../v2/processing/GroupsV2StateProcessor.java | 19 ++-- .../GroupsV2UpdateMessageProducerTest.java | 4 +- .../v2/processing/GlobalGroupStateTest.java | 22 ++-- .../v2/processing/GroupStateMapperTest.java | 14 +-- .../groupsv2/DecryptedGroupHistoryEntry.java | 2 +- .../api/groupsv2/DecryptedGroupUtil.java | 6 +- .../api/groupsv2/GroupsV2Api.java | 2 +- .../api/groupsv2/GroupsV2Operations.java | 16 +-- .../src/main/proto/DecryptedGroups.proto | 12 +-- libsignal/service/src/main/proto/Groups.proto | 14 +-- .../DecryptedGroupUtil_apply_Test.java | 102 +++++++++--------- 20 files changed, 135 insertions(+), 136 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java index b482fcc36c7..97944756d40 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java @@ -336,7 +336,7 @@ private void create(@NonNull GroupId groupId, } groupId.requireV2(); contentValues.put(V2_MASTER_KEY, groupMasterKey.serialize()); - contentValues.put(V2_REVISION, groupState.getVersion()); + contentValues.put(V2_REVISION, groupState.getRevision()); contentValues.put(V2_DECRYPTED_GROUP, groupState.toByteArray()); contentValues.put(MEMBERS, serializeV2GroupMembers(groupState)); } else { @@ -394,7 +394,7 @@ public void update(@NonNull GroupId.V2 groupId, @NonNull DecryptedGroup decrypte UUID uuid = Recipient.self().getUuid().get(); contentValues.put(TITLE, title); - contentValues.put(V2_REVISION, decryptedGroup.getVersion()); + contentValues.put(V2_REVISION, decryptedGroup.getRevision()); contentValues.put(V2_DECRYPTED_GROUP, decryptedGroup.toByteArray()); contentValues.put(MEMBERS, serializeV2GroupMembers(decryptedGroup)); contentValues.put(ACTIVE, DecryptedGroupUtil.findMemberByUuid(decryptedGroup.getMembersList(), uuid).isPresent() || diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducer.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducer.java index a4157f2b5d5..249d435fecc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducer.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducer.java @@ -56,7 +56,7 @@ String describeNewGroup(@NonNull DecryptedGroup group) { return context.getString(R.string.MessageRecord_s_invited_you_to_the_group, describe(selfPending.get().getAddedByUuid())); } - if (group.getVersion() == 0) { + if (group.getRevision() == 0) { Optional foundingMember = DecryptedGroupUtil.firstMember(group.getMembersList()); if (foundingMember.isPresent()) { ByteString foundingMemberUuid = foundingMember.get().getUuid(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java index 1119c84ecc8..97843d2cfcb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java @@ -157,7 +157,7 @@ public SpannableString getDisplayBody(@NonNull Context context) { DecryptedGroupV2Context decryptedGroupV2Context = DecryptedGroupV2Context.parseFrom(decoded); GroupsV2UpdateMessageProducer updateMessageProducer = new GroupsV2UpdateMessageProducer(context, descriptionStrategy, Recipient.self().getUuid().get()); - if (decryptedGroupV2Context.hasChange() && decryptedGroupV2Context.getGroupState().getVersion() > 0) { + if (decryptedGroupV2Context.hasChange() && decryptedGroupV2Context.getGroupState().getRevision() > 0) { DecryptedGroupChange change = decryptedGroupV2Context.getChange(); List strings = updateMessageProducer.describeChange(change); StringBuilder result = new StringBuilder(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java index badc9a32ce9..1a7b80b6982 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java @@ -147,13 +147,13 @@ public static void ejectFromGroup(@NonNull Context context, @NonNull GroupId.V2 @WorkerThread public static void updateGroupFromServer(@NonNull Context context, @NonNull GroupMasterKey groupMasterKey, - int version, + int revision, long timestamp, @Nullable byte[] signedGroupChange) throws GroupChangeBusyException, IOException, GroupNotAMemberException { try (GroupManagerV2.GroupUpdater updater = new GroupManagerV2(context).updater(groupMasterKey)) { - updater.updateLocalToServerVersion(version, timestamp, signedGroupChange); + updater.updateLocalToServerRevision(revision, timestamp, signedGroupChange); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java index 341c0f30915..7a9393f3bb0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java @@ -375,7 +375,7 @@ private GroupManager.GroupActionResult commitChange(@NonNull GroupChange.Actions final GroupDatabase.GroupRecord groupRecord = groupDatabase.requireGroup(groupId); final GroupDatabase.V2GroupProperties v2GroupProperties = groupRecord.requireV2GroupProperties(); final int nextRevision = v2GroupProperties.getGroupRevision() + 1; - final GroupChange.Actions changeActions = change.setVersion(nextRevision).build(); + final GroupChange.Actions changeActions = change.setRevision(nextRevision).build(); final DecryptedGroupChange decryptedChange; final DecryptedGroup decryptedGroupState; @@ -427,11 +427,11 @@ class GroupUpdater implements Closeable { } @WorkerThread - void updateLocalToServerVersion(int version, long timestamp, @Nullable byte[] signedGroupChange) + void updateLocalToServerRevision(int revision, long timestamp, @Nullable byte[] signedGroupChange) throws IOException, GroupNotAMemberException { new GroupsV2StateProcessor(context).forGroup(groupMasterKey) - .updateLocalGroupToRevision(version, timestamp, getDecryptedGroupChange(signedGroupChange)); + .updateLocalGroupToRevision(revision, timestamp, getDecryptedGroupChange(signedGroupChange)); } private DecryptedGroupChange getDecryptedGroupChange(@Nullable byte[] signedGroupChange) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupProtoUtil.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupProtoUtil.java index 43b5706f039..df354e8c95d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupProtoUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupProtoUtil.java @@ -15,11 +15,11 @@ import org.signal.storageservice.protos.groups.local.DecryptedPendingMember; import org.signal.zkgroup.groups.GroupMasterKey; import org.signal.zkgroup.util.UUIDUtil; +import org.thoughtcrime.securesms.database.model.databaseprotos.DecryptedGroupV2Context; import org.thoughtcrime.securesms.recipients.Recipient; -import org.whispersystems.signalservice.api.util.UuidUtil; import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations; +import org.whispersystems.signalservice.api.util.UuidUtil; import org.whispersystems.signalservice.internal.push.SignalServiceProtos; -import org.thoughtcrime.securesms.database.model.databaseprotos.DecryptedGroupV2Context; import java.util.List; import java.util.UUID; @@ -29,19 +29,19 @@ public final class GroupProtoUtil { private GroupProtoUtil() { } - public static int findVersionWeWereAdded(@NonNull DecryptedGroup group, @NonNull UUID uuid) + public static int findRevisionWeWereAdded(@NonNull DecryptedGroup group, @NonNull UUID uuid) throws GroupNotAMemberException { ByteString bytes = UuidUtil.toByteString(uuid); for (DecryptedMember decryptedMember : group.getMembersList()) { if (decryptedMember.getUuid().equals(bytes)) { - return decryptedMember.getJoinedAtVersion(); + return decryptedMember.getJoinedAtRevision(); } } for (DecryptedPendingMember decryptedMember : group.getPendingMembersList()) { if (decryptedMember.getUuid().equals(bytes)) { // Assume latest, we don't have any information about when pending members were invited - return group.getVersion(); + return group.getRevision(); } } throw new GroupNotAMemberException(); @@ -52,10 +52,10 @@ public static DecryptedGroupV2Context createDecryptedGroupV2Context(@NonNull Gro @Nullable DecryptedGroupChange plainGroupChange, @Nullable GroupChange signedServerChange) { - int version = plainGroupChange != null ? plainGroupChange.getVersion() : decryptedGroup.getVersion(); + int revision = plainGroupChange != null ? plainGroupChange.getRevision() : decryptedGroup.getRevision(); SignalServiceProtos.GroupContextV2.Builder contextBuilder = SignalServiceProtos.GroupContextV2.newBuilder() .setMasterKey(ByteString.copyFrom(masterKey.serialize())) - .setRevision(version); + .setRevision(revision); if (signedServerChange != null) { contextBuilder.setGroupChange(signedServerChange.toByteString()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GlobalGroupState.java b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GlobalGroupState.java index a7966c4cb40..48529b18a78 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GlobalGroupState.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GlobalGroupState.java @@ -31,13 +31,13 @@ final class GlobalGroupState { return history; } - int getLatestVersionNumber() { + int getLatestRevisionNumber() { if (history.isEmpty()) { if (localState == null) { throw new AssertionError(); } - return localState.getVersion(); + return localState.getRevision(); } - return history.get(history.size() - 1).getGroup().getVersion(); + return history.get(history.size() - 1).getGroup().getRevision(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupLogEntry.java b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupLogEntry.java index d12476154c5..b211ab3f24f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupLogEntry.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupLogEntry.java @@ -17,7 +17,7 @@ final class GroupLogEntry { @Nullable private final DecryptedGroupChange change; GroupLogEntry(@NonNull DecryptedGroup group, @Nullable DecryptedGroupChange change) { - if (change != null && group.getVersion() != change.getVersion()) { + if (change != null && group.getRevision() != change.getRevision()) { throw new AssertionError(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapper.java b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapper.java index e4f327bd312..8ab8d4894f2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapper.java @@ -12,20 +12,20 @@ final class GroupStateMapper { static final int LATEST = Integer.MAX_VALUE; - private static final Comparator BY_VERSION = (o1, o2) -> Integer.compare(o1.getGroup().getVersion(), o2.getGroup().getVersion()); + private static final Comparator BY_REVISION = (o1, o2) -> Integer.compare(o1.getGroup().getRevision(), o2.getGroup().getRevision()); private GroupStateMapper() { } /** - * Given an input {@link GlobalGroupState} and a {@param maximumVersionToApply}, returns a result - * containing what the new local group state should be, and any remaining version history to apply. + * Given an input {@link GlobalGroupState} and a {@param maximumRevisionToApply}, returns a result + * containing what the new local group state should be, and any remaining revision history to apply. *

* Function is pure. - * @param maximumVersionToApply Use {@link #LATEST} to apply the very latest. + * @param maximumRevisionToApply Use {@link #LATEST} to apply the very latest. */ static @NonNull AdvanceGroupStateResult partiallyAdvanceGroupState(@NonNull GlobalGroupState inputState, - int maximumVersionToApply) + int maximumRevisionToApply) { final ArrayList statesToApplyNow = new ArrayList<>(inputState.getHistory().size()); final ArrayList statesToApplyLater = new ArrayList<>(inputState.getHistory().size()); @@ -34,20 +34,20 @@ private GroupStateMapper() { for (GroupLogEntry entry : inputState.getHistory()) { if (inputState.getLocalState() != null && - inputState.getLocalState().getVersion() >= entry.getGroup().getVersion()) + inputState.getLocalState().getRevision() >= entry.getGroup().getRevision()) { continue; } - if (entry.getGroup().getVersion() > maximumVersionToApply) { + if (entry.getGroup().getRevision() > maximumRevisionToApply) { statesToApplyLater.add(entry); } else { statesToApplyNow.add(entry); } } - Collections.sort(statesToApplyNow, BY_VERSION); - Collections.sort(statesToApplyLater, BY_VERSION); + Collections.sort(statesToApplyNow, BY_REVISION); + Collections.sort(statesToApplyLater, BY_REVISION); if (statesToApplyNow.size() > 0) { newLocalState = statesToApplyNow.get(statesToApplyNow.size() - 1) diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java index 7460f35c5bd..a1facf5a158 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java @@ -13,7 +13,6 @@ import org.signal.zkgroup.VerificationFailedException; import org.signal.zkgroup.groups.GroupMasterKey; import org.signal.zkgroup.groups.GroupSecretParams; -import org.signal.zkgroup.util.UUIDUtil; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.GroupDatabase; import org.thoughtcrime.securesms.database.MmsDatabase; @@ -150,8 +149,8 @@ public GroupUpdateResult updateLocalGroupToRevision(final int revision, if (signedGroupChange != null && localState != null && - localState.getVersion() + 1 == signedGroupChange.getVersion() && - revision == signedGroupChange.getVersion()) + localState.getRevision() + 1 == signedGroupChange.getRevision() && + revision == signedGroupChange.getRevision()) { try { Log.i(TAG, "Applying P2P group change"); @@ -188,7 +187,7 @@ public GroupUpdateResult updateLocalGroupToRevision(final int revision, GlobalGroupState remainingWork = advanceGroupStateResult.getNewGlobalGroupState(); if (remainingWork.getHistory().size() > 0) { - Log.i(TAG, String.format(Locale.US, "There are more versions on the server for this group, not applying at this time, V[%d..%d]", newLocalState.getVersion() + 1, remainingWork.getLatestVersionNumber())); + Log.i(TAG, String.format(Locale.US, "There are more revisions on the server for this group, not applying at this time, V[%d..%d]", newLocalState.getRevision() + 1, remainingWork.getLatestRevisionNumber())); } return new GroupUpdateResult(GroupState.GROUP_UPDATED, newLocalState); @@ -206,10 +205,10 @@ private void insertGroupLeave() { .requireV2GroupProperties() .getDecryptedGroup(); - DecryptedGroup simulatedGroupState = DecryptedGroupUtil.removeMember(decryptedGroup, selfUuid, decryptedGroup.getVersion() + 1); + DecryptedGroup simulatedGroupState = DecryptedGroupUtil.removeMember(decryptedGroup, selfUuid, decryptedGroup.getRevision() + 1); DecryptedGroupChange simulatedGroupChange = DecryptedGroupChange.newBuilder() .setEditor(UuidUtil.toByteString(UuidUtil.UNKNOWN_UUID)) - .setVersion(simulatedGroupState.getVersion()) + .setRevision(simulatedGroupState.getRevision()) .addDeleteMembers(UuidUtil.toByteString(selfUuid)) .build(); @@ -315,8 +314,8 @@ private void persistLearnedProfileKeys(@NonNull GlobalGroupState globalGroupStat if (latestOnly || !GroupProtoUtil.isMember(selfUuid, latestServerGroup.getMembersList())) { history = Collections.singletonList(new GroupLogEntry(latestServerGroup, null)); } else { - int versionWeWereAdded = GroupProtoUtil.findVersionWeWereAdded(latestServerGroup, selfUuid); - int logsNeededFrom = localState != null ? Math.max(localState.getVersion(), versionWeWereAdded) : versionWeWereAdded; + int revisionWeWereAdded = GroupProtoUtil.findRevisionWeWereAdded(latestServerGroup, selfUuid); + int logsNeededFrom = localState != null ? Math.max(localState.getRevision(), revisionWeWereAdded) : revisionWeWereAdded; history = getFullMemberHistory(selfUuid, logsNeededFrom); } @@ -324,9 +323,9 @@ private void persistLearnedProfileKeys(@NonNull GlobalGroupState globalGroupStat return new GlobalGroupState(localState, history); } - private List getFullMemberHistory(@NonNull UUID selfUuid, int logsNeededFrom) throws IOException { + private List getFullMemberHistory(@NonNull UUID selfUuid, int logsNeededFromRevision) throws IOException { try { - Collection groupStatesFromRevision = groupsV2Api.getGroupHistory(groupSecretParams, logsNeededFrom, groupsV2Authorization.getAuthorizationForToday(selfUuid, groupSecretParams)); + Collection groupStatesFromRevision = groupsV2Api.getGroupHistory(groupSecretParams, logsNeededFromRevision, groupsV2Authorization.getAuthorizationForToday(selfUuid, groupSecretParams)); ArrayList history = new ArrayList<>(groupStatesFromRevision.size()); for (DecryptedGroupHistoryEntry entry : groupStatesFromRevision) { diff --git a/app/src/test/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducerTest.java b/app/src/test/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducerTest.java index fcacf954ef5..422d21f54f5 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducerTest.java +++ b/app/src/test/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducerTest.java @@ -545,9 +545,9 @@ private static class GroupStateBuilder { private final DecryptedGroup.Builder builder; - GroupStateBuilder(@NonNull UUID foundingMember, int version) { + GroupStateBuilder(@NonNull UUID foundingMember, int revision) { builder = DecryptedGroup.newBuilder() - .setVersion(version) + .setRevision(revision) .addMembers(DecryptedMember.newBuilder() .setUuid(UuidUtil.toByteString(foundingMember))); } diff --git a/app/src/test/java/org/thoughtcrime/securesms/groups/v2/processing/GlobalGroupStateTest.java b/app/src/test/java/org/thoughtcrime/securesms/groups/v2/processing/GlobalGroupStateTest.java index 377b85158ac..6b36da06966 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/groups/v2/processing/GlobalGroupStateTest.java +++ b/app/src/test/java/org/thoughtcrime/securesms/groups/v2/processing/GlobalGroupStateTest.java @@ -14,32 +14,32 @@ public final class GlobalGroupStateTest { public void cannot_ask_latestVersionNumber_of_empty_state() { GlobalGroupState emptyState = new GlobalGroupState(null, emptyList()); - emptyState.getLatestVersionNumber(); + emptyState.getLatestRevisionNumber(); } @Test - public void latestVersionNumber_of_state_and_empty_list() { + public void latestRevisionNumber_of_state_and_empty_list() { GlobalGroupState emptyState = new GlobalGroupState(state(10), emptyList()); - assertEquals(10, emptyState.getLatestVersionNumber()); + assertEquals(10, emptyState.getLatestRevisionNumber()); } @Test - public void latestVersionNumber_of_state_and_list() { + public void latestRevisionNumber_of_state_and_list() { GlobalGroupState emptyState = new GlobalGroupState(state(2), asList(logEntry(3), logEntry(4))); - assertEquals(4, emptyState.getLatestVersionNumber()); + assertEquals(4, emptyState.getLatestRevisionNumber()); } - private static GroupLogEntry logEntry(int version) { - return new GroupLogEntry(state(version), change(version)); + private static GroupLogEntry logEntry(int revision) { + return new GroupLogEntry(state(revision), change(revision)); } - private static DecryptedGroup state(int version) { - return DecryptedGroup.newBuilder().setVersion(version).build(); + private static DecryptedGroup state(int revision) { + return DecryptedGroup.newBuilder().setRevision(revision).build(); } - private static DecryptedGroupChange change(int version) { - return DecryptedGroupChange.newBuilder().setVersion(version).build(); + private static DecryptedGroupChange change(int revision) { + return DecryptedGroupChange.newBuilder().setRevision(revision).build(); } } diff --git a/app/src/test/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapperTest.java b/app/src/test/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapperTest.java index 940f625f808..a06ad449ec1 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapperTest.java +++ b/app/src/test/java/org/thoughtcrime/securesms/groups/v2/processing/GroupStateMapperTest.java @@ -115,7 +115,7 @@ public void known_group_three_states_to_update_update_latest() { } @Test - public void apply_maximum_group_versions() { + public void apply_maximum_group_revisions() { DecryptedGroup currentState = state(Integer.MAX_VALUE - 2); GroupLogEntry log1 = logEntry(Integer.MAX_VALUE - 1); GroupLogEntry log2 = logEntry(Integer.MAX_VALUE); @@ -132,15 +132,15 @@ private static void assertNewState(GlobalGroupState expected, GlobalGroupState a assertThat(actual.getHistory(), is(expected.getHistory())); } - private static GroupLogEntry logEntry(int version) { - return new GroupLogEntry(state(version), change(version)); + private static GroupLogEntry logEntry(int revision) { + return new GroupLogEntry(state(revision), change(revision)); } - private static DecryptedGroup state(int version) { - return DecryptedGroup.newBuilder().setVersion(version).build(); + private static DecryptedGroup state(int revision) { + return DecryptedGroup.newBuilder().setRevision(revision).build(); } - private static DecryptedGroupChange change(int version) { - return DecryptedGroupChange.newBuilder().setVersion(version).build(); + private static DecryptedGroupChange change(int revision) { + return DecryptedGroupChange.newBuilder().setRevision(revision).build(); } } \ No newline at end of file diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupHistoryEntry.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupHistoryEntry.java index a58d6325747..1210fd51286 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupHistoryEntry.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupHistoryEntry.java @@ -12,7 +12,7 @@ public final class DecryptedGroupHistoryEntry { private final DecryptedGroupChange change; DecryptedGroupHistoryEntry(DecryptedGroup group, DecryptedGroupChange change) { - if (group.getVersion() != change.getVersion()) { + if (group.getRevision() != change.getRevision()) { throw new AssertionError(); } diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupUtil.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupUtil.java index 7971e8cd778..669aa34228e 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupUtil.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupUtil.java @@ -171,7 +171,7 @@ public static DecryptedGroup removeMember(DecryptedGroup group, UUID uuid, int r if (removed) { return builder.clearMembers() .addAllMembers(decryptedMembers) - .setVersion(revision) + .setRevision(revision) .build(); } else { return group; @@ -181,7 +181,7 @@ public static DecryptedGroup removeMember(DecryptedGroup group, UUID uuid, int r public static DecryptedGroup apply(DecryptedGroup group, DecryptedGroupChange change) throws NotAbleToApplyChangeException { - if (change.getVersion() != group.getVersion() + 1) { + if (change.getRevision() != group.getRevision() + 1) { throw new NotAbleToApplyChangeException(); } @@ -266,7 +266,7 @@ public static DecryptedGroup apply(DecryptedGroup group, DecryptedGroupChange ch .build()); } - return builder.setVersion(change.getVersion()).build(); + return builder.setRevision(change.getRevision()).build(); } private static int indexOfUuid(List memberList, ByteString uuid) { diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/GroupsV2Api.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/GroupsV2Api.java index 954587efd9e..e0b7dfdfa83 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/GroupsV2Api.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/GroupsV2Api.java @@ -103,7 +103,7 @@ public List getGroupHistory(GroupSecretParams groupS DecryptedGroup decryptedGroup = groupOperations.decryptGroup(change.getGroupState()); DecryptedGroupChange decryptedChange = groupOperations.decryptChange(change.getGroupChange(), false); - if (decryptedChange.getVersion() != decryptedGroup.getVersion()) { + if (decryptedChange.getRevision() != decryptedGroup.getRevision()) { throw new InvalidGroupStateException(); } diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/GroupsV2Operations.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/GroupsV2Operations.java index 3a2b692b07f..f7e8e7848e5 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/GroupsV2Operations.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/groupsv2/GroupsV2Operations.java @@ -83,7 +83,7 @@ public NewGroup createNewGroup(final String title, final GroupOperations groupOperations = forGroup(groupSecretParams); Group.Builder group = Group.newBuilder() - .setVersion(0) + .setRevision(0) .setPublicKey(ByteString.copyFrom(groupSecretParams.getPublicParams().serialize())) .setTitle(groupOperations.encryptTitle(title)) .setDisappearingMessagesTimer(groupOperations.encryptTimer(0)) @@ -281,7 +281,7 @@ public DecryptedGroup decryptGroup(Group group) .setTitle(decryptTitle(group.getTitle())) .setAvatar(group.getAvatar()) .setAccessControl(group.getAccessControl()) - .setVersion(group.getVersion()) + .setRevision(group.getRevision()) .addAllMembers(decryptedMembers) .addAllPendingMembers(decryptedPendingMembers) .setDisappearingMessagesTimer(DecryptedTimer.newBuilder().setDuration(decryptDisappearingMessagesTimer(group.getDisappearingMessagesTimer()))) @@ -322,12 +322,12 @@ public DecryptedGroupChange decryptChange(GroupChange.Actions actions, UUID sour } // Field 2 - builder.setVersion(actions.getVersion()); + builder.setRevision(actions.getRevision()); // Field 3 for (GroupChange.Actions.AddMemberAction addMemberAction : actions.getAddMembersList()) { try { - builder.addNewMembers(decryptMember(addMemberAction.getAdded()).setJoinedAtVersion(actions.getVersion())); + builder.addNewMembers(decryptMember(addMemberAction.getAdded()).setJoinedAtRevision(actions.getRevision())); } catch (InvalidInputException e) { throw new InvalidGroupStateException(e); } @@ -354,7 +354,7 @@ public DecryptedGroupChange decryptChange(GroupChange.Actions actions, UUID sour UUID uuid = decryptUuid(ByteString.copyFrom(presentation.getUuidCiphertext().serialize())); builder.addModifiedProfileKeys(DecryptedMember.newBuilder() .setRole(Member.Role.UNKNOWN) - .setJoinedAtVersion(-1) + .setJoinedAtRevision(-1) .setUuid(UuidUtil.toByteString(uuid)) .setProfileKey(ByteString.copyFrom(decryptProfileKey(ByteString.copyFrom(presentation.getProfileKeyCiphertext().serialize()), uuid).serialize()))); } catch (InvalidInputException e) { @@ -398,7 +398,7 @@ public DecryptedGroupChange decryptChange(GroupChange.Actions actions, UUID sour UUID uuid = clientZkGroupCipher.decryptUuid(profileKeyCredentialPresentation.getUuidCiphertext()); ProfileKey profileKey = clientZkGroupCipher.decryptProfileKey(profileKeyCredentialPresentation.getProfileKeyCiphertext(), uuid); builder.addPromotePendingMembers(DecryptedMember.newBuilder() - .setJoinedAtVersion(-1) + .setJoinedAtRevision(-1) .setRole(Member.Role.DEFAULT) .setUuid(UuidUtil.toByteString(uuid)) .setProfileKey(ByteString.copyFrom(profileKey.serialize()))); @@ -441,7 +441,7 @@ private DecryptedMember.Builder decryptMember(Member member) return DecryptedMember.newBuilder() .setUuid(UuidUtil.toByteString(uuid)) - .setJoinedAtVersion(member.getJoinedAtVersion()) + .setJoinedAtRevision(member.getJoinedAtRevision()) .setProfileKey(decryptProfileKeyToByteString(member.getProfileKey(), uuid)) .setRole(member.getRole()); } else { @@ -451,7 +451,7 @@ private DecryptedMember.Builder decryptMember(Member member) return DecryptedMember.newBuilder() .setUuid(UuidUtil.toByteString(uuid)) - .setJoinedAtVersion(member.getJoinedAtVersion()) + .setJoinedAtRevision(member.getJoinedAtRevision()) .setProfileKey(ByteString.copyFrom(profileKey.serialize())) .setRole(member.getRole()); } diff --git a/libsignal/service/src/main/proto/DecryptedGroups.proto b/libsignal/service/src/main/proto/DecryptedGroups.proto index 5445cb0e4bf..e6bac4ab2cd 100644 --- a/libsignal/service/src/main/proto/DecryptedGroups.proto +++ b/libsignal/service/src/main/proto/DecryptedGroups.proto @@ -13,10 +13,10 @@ import "Groups.proto"; // Decrypted version of Member // Keep field numbers in step message DecryptedMember { - bytes uuid = 1; - Member.Role role = 2; - bytes profileKey = 3; - uint32 joinedAtVersion = 5; + bytes uuid = 1; + Member.Role role = 2; + bytes profileKey = 3; + uint32 joinedAtRevision = 5; } message DecryptedPendingMember { @@ -44,7 +44,7 @@ message DecryptedGroup { string avatar = 3; DecryptedTimer disappearingMessagesTimer = 4; AccessControl accessControl = 5; - uint32 version = 6; + uint32 revision = 6; repeated DecryptedMember members = 7; repeated DecryptedPendingMember pendingMembers = 8; } @@ -53,7 +53,7 @@ message DecryptedGroup { // Keep field numbers in step message DecryptedGroupChange { bytes editor = 1; - uint32 version = 2; + uint32 revision = 2; repeated DecryptedMember newMembers = 3; repeated bytes deleteMembers = 4; repeated DecryptedModifyMemberRole modifyMemberRoles = 5; diff --git a/libsignal/service/src/main/proto/Groups.proto b/libsignal/service/src/main/proto/Groups.proto index 49aa1757266..b3e11d985d8 100644 --- a/libsignal/service/src/main/proto/Groups.proto +++ b/libsignal/service/src/main/proto/Groups.proto @@ -25,11 +25,11 @@ message Member { ADMINISTRATOR = 2; } - bytes userId = 1; - Role role = 2; - bytes profileKey = 3; - bytes presentation = 4; - uint32 joinedAtVersion = 5; + bytes userId = 1; + Role role = 2; + bytes profileKey = 3; + bytes presentation = 4; + uint32 joinedAtRevision = 5; } message PendingMember { @@ -56,7 +56,7 @@ message Group { string avatar = 3; bytes disappearingMessagesTimer = 4; AccessControl accessControl = 5; - uint32 version = 6; + uint32 revision = 6; repeated Member members = 7; repeated PendingMember pendingMembers = 8; } @@ -115,7 +115,7 @@ message GroupChange { } bytes sourceUuid = 1; - uint32 version = 2; + uint32 revision = 2; repeated AddMemberAction addMembers = 3; repeated DeleteMemberAction deleteMembers = 4; repeated ModifyMemberRoleAction modifyMemberRoles = 5; diff --git a/libsignal/service/src/test/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupUtil_apply_Test.java b/libsignal/service/src/test/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupUtil_apply_Test.java index 0d63aa2e70c..721488d7246 100644 --- a/libsignal/service/src/test/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupUtil_apply_Test.java +++ b/libsignal/service/src/test/java/org/whispersystems/signalservice/api/groupsv2/DecryptedGroupUtil_apply_Test.java @@ -27,15 +27,15 @@ public final class DecryptedGroupUtil_apply_Test { @Test - public void apply_version() throws DecryptedGroupUtil.NotAbleToApplyChangeException { + public void apply_revision() throws DecryptedGroupUtil.NotAbleToApplyChangeException { DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() - .setVersion(9) + .setRevision(9) .build(), DecryptedGroupChange.newBuilder() - .setVersion(10) + .setRevision(10) .build()); - assertEquals(10, newGroup.getVersion()); + assertEquals(10, newGroup.getRevision()); } @Test @@ -44,16 +44,16 @@ public void apply_new_member() throws DecryptedGroupUtil.NotAbleToApplyChangeExc DecryptedMember member2 = member(UUID.randomUUID()); DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() - .setVersion(10) + .setRevision(10) .addMembers(member1) .build(), DecryptedGroupChange.newBuilder() - .setVersion(11) + .setRevision(11) .addNewMembers(member2) .build()); assertEquals(DecryptedGroup.newBuilder() - .setVersion(11) + .setRevision(11) .addMembers(member1) .addMembers(member2) .build(), @@ -66,17 +66,17 @@ public void apply_remove_member() throws DecryptedGroupUtil.NotAbleToApplyChange DecryptedMember member2 = member(UUID.randomUUID()); DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() - .setVersion(13) + .setRevision(13) .addMembers(member1) .addMembers(member2) .build(), DecryptedGroupChange.newBuilder() - .setVersion(14) + .setRevision(14) .addDeleteMembers(member1.getUuid()) .build()); assertEquals(DecryptedGroup.newBuilder() - .setVersion(14) + .setRevision(14) .addMembers(member2) .build(), newGroup); @@ -88,18 +88,18 @@ public void apply_remove_members() throws DecryptedGroupUtil.NotAbleToApplyChang DecryptedMember member2 = member(UUID.randomUUID()); DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() - .setVersion(13) + .setRevision(13) .addMembers(member1) .addMembers(member2) .build(), DecryptedGroupChange.newBuilder() - .setVersion(14) + .setRevision(14) .addDeleteMembers(member1.getUuid()) .addDeleteMembers(member2.getUuid()) .build()); assertEquals(DecryptedGroup.newBuilder() - .setVersion(14) + .setRevision(14) .build(), newGroup); } @@ -110,11 +110,11 @@ public void apply_remove_members_not_found() throws DecryptedGroupUtil.NotAbleTo DecryptedMember member2 = member(UUID.randomUUID()); DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() - .setVersion(13) + .setRevision(13) .addMembers(member1) .build(), DecryptedGroupChange.newBuilder() - .setVersion(14) + .setRevision(14) .addDeleteMembers(member2.getUuid()) .build()); } @@ -125,18 +125,18 @@ public void apply_modify_member_role() throws DecryptedGroupUtil.NotAbleToApplyC DecryptedMember member2 = admin(UUID.randomUUID()); DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() - .setVersion(13) + .setRevision(13) .addMembers(member1) .addMembers(member2) .build(), DecryptedGroupChange.newBuilder() - .setVersion(14) + .setRevision(14) .addModifyMemberRoles(DecryptedModifyMemberRole.newBuilder().setUuid(member1.getUuid()).setRole(Member.Role.ADMINISTRATOR)) .addModifyMemberRoles(DecryptedModifyMemberRole.newBuilder().setUuid(member2.getUuid()).setRole(Member.Role.DEFAULT)) .build()); assertEquals(DecryptedGroup.newBuilder() - .setVersion(14) + .setRevision(14) .addMembers(asAdmin(member1)) .addMembers(asMember(member2)) .build(), @@ -153,17 +153,17 @@ public void apply_modify_member_profile_keys() throws DecryptedGroupUtil.NotAble DecryptedMember member2b = withProfileKey(member2a, profileKey2b); DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() - .setVersion(13) + .setRevision(13) .addMembers(member1) .addMembers(member2a) .build(), DecryptedGroupChange.newBuilder() - .setVersion(14) + .setRevision(14) .addModifiedProfileKeys(member2b) .build()); assertEquals(DecryptedGroup.newBuilder() - .setVersion(14) + .setRevision(14) .addMembers(member1) .addMembers(member2b) .build(), @@ -176,16 +176,16 @@ public void apply_new_pending_member() throws DecryptedGroupUtil.NotAbleToApplyC DecryptedPendingMember pending = pendingMember(UUID.randomUUID()); DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() - .setVersion(10) + .setRevision(10) .addMembers(member1) .build(), DecryptedGroupChange.newBuilder() - .setVersion(11) + .setRevision(11) .addNewPendingMembers(pending) .build()); assertEquals(DecryptedGroup.newBuilder() - .setVersion(11) + .setRevision(11) .addMembers(member1) .addPendingMembers(pending) .build(), @@ -199,19 +199,19 @@ public void remove_pending_member() throws DecryptedGroupUtil.NotAbleToApplyChan DecryptedPendingMember pending = pendingMember(pendingUuid); DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() - .setVersion(10) + .setRevision(10) .addMembers(member1) .addPendingMembers(pending) .build(), DecryptedGroupChange.newBuilder() - .setVersion(11) + .setRevision(11) .addDeletePendingMembers(DecryptedPendingMemberRemoval.newBuilder() .setUuidCipherText(ProtoTestUtils.encrypt(pendingUuid)) .build()) .build()); assertEquals(DecryptedGroup.newBuilder() - .setVersion(11) + .setRevision(11) .addMembers(member1) .build(), newGroup); @@ -226,17 +226,17 @@ public void promote_pending_member() throws DecryptedGroupUtil.NotAbleToApplyCha DecryptedMember member2 = member(pending2Uuid, profileKey2); DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() - .setVersion(10) + .setRevision(10) .addMembers(member1) .addPendingMembers(pending2) .build(), DecryptedGroupChange.newBuilder() - .setVersion(11) + .setRevision(11) .addPromotePendingMembers(member2) .build()); assertEquals(DecryptedGroup.newBuilder() - .setVersion(11) + .setRevision(11) .addMembers(member1) .addMembers(member2) .build(), @@ -252,17 +252,17 @@ public void promote_direct_to_admin() throws DecryptedGroupUtil.NotAbleToApplyCh DecryptedMember member2 = withProfileKey(admin(pending2Uuid), profileKey2); DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() - .setVersion(10) + .setRevision(10) .addMembers(member1) .addPendingMembers(pending2) .build(), DecryptedGroupChange.newBuilder() - .setVersion(11) + .setRevision(11) .addPromotePendingMembers(member2) .build()); assertEquals(DecryptedGroup.newBuilder() - .setVersion(11) + .setRevision(11) .addMembers(member1) .addMembers(member2) .build(), @@ -272,16 +272,16 @@ public void promote_direct_to_admin() throws DecryptedGroupUtil.NotAbleToApplyCh @Test public void title() throws DecryptedGroupUtil.NotAbleToApplyChangeException { DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() - .setVersion(10) + .setRevision(10) .setTitle("Old title") .build(), DecryptedGroupChange.newBuilder() - .setVersion(11) + .setRevision(11) .setNewTitle(DecryptedString.newBuilder().setValue("New title").build()) .build()); assertEquals(DecryptedGroup.newBuilder() - .setVersion(11) + .setRevision(11) .setTitle("New title") .build(), newGroup); @@ -290,16 +290,16 @@ public void title() throws DecryptedGroupUtil.NotAbleToApplyChangeException { @Test public void avatar() throws DecryptedGroupUtil.NotAbleToApplyChangeException { DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() - .setVersion(10) + .setRevision(10) .setAvatar("https://cnd/oldavatar") .build(), DecryptedGroupChange.newBuilder() - .setVersion(11) + .setRevision(11) .setNewAvatar(DecryptedString.newBuilder().setValue("https://cnd/newavatar").build()) .build()); assertEquals(DecryptedGroup.newBuilder() - .setVersion(11) + .setRevision(11) .setAvatar("https://cnd/newavatar") .build(), newGroup); @@ -308,16 +308,16 @@ public void avatar() throws DecryptedGroupUtil.NotAbleToApplyChangeException { @Test public void timer() throws DecryptedGroupUtil.NotAbleToApplyChangeException { DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() - .setVersion(10) + .setRevision(10) .setDisappearingMessagesTimer(DecryptedTimer.newBuilder().setDuration(100)) .build(), DecryptedGroupChange.newBuilder() - .setVersion(11) + .setRevision(11) .setNewTimer(DecryptedTimer.newBuilder().setDuration(2000)) .build()); assertEquals(DecryptedGroup.newBuilder() - .setVersion(11) + .setRevision(11) .setDisappearingMessagesTimer(DecryptedTimer.newBuilder().setDuration(2000)) .build(), newGroup); @@ -326,19 +326,19 @@ public void timer() throws DecryptedGroupUtil.NotAbleToApplyChangeException { @Test public void attribute_access() throws DecryptedGroupUtil.NotAbleToApplyChangeException { DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() - .setVersion(10) + .setRevision(10) .setAccessControl(AccessControl.newBuilder() .setAttributes(AccessControl.AccessRequired.ADMINISTRATOR) .setMembers(AccessControl.AccessRequired.MEMBER) .build()) .build(), DecryptedGroupChange.newBuilder() - .setVersion(11) + .setRevision(11) .setNewAttributeAccess(AccessControl.AccessRequired.MEMBER) .build()); assertEquals(DecryptedGroup.newBuilder() - .setVersion(11) + .setRevision(11) .setAccessControl(AccessControl.newBuilder() .setAttributes(AccessControl.AccessRequired.MEMBER) .setMembers(AccessControl.AccessRequired.MEMBER) @@ -350,19 +350,19 @@ public void attribute_access() throws DecryptedGroupUtil.NotAbleToApplyChangeExc @Test public void membership_access() throws DecryptedGroupUtil.NotAbleToApplyChangeException { DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() - .setVersion(10) + .setRevision(10) .setAccessControl(AccessControl.newBuilder() .setAttributes(AccessControl.AccessRequired.ADMINISTRATOR) .setMembers(AccessControl.AccessRequired.MEMBER) .build()) .build(), DecryptedGroupChange.newBuilder() - .setVersion(11) + .setRevision(11) .setNewMemberAccess(AccessControl.AccessRequired.ADMINISTRATOR) .build()); assertEquals(DecryptedGroup.newBuilder() - .setVersion(11) + .setRevision(11) .setAccessControl(AccessControl.newBuilder() .setAttributes(AccessControl.AccessRequired.ADMINISTRATOR) .setMembers(AccessControl.AccessRequired.ADMINISTRATOR) @@ -374,20 +374,20 @@ public void membership_access() throws DecryptedGroupUtil.NotAbleToApplyChangeEx @Test public void change_both_access_levels() throws DecryptedGroupUtil.NotAbleToApplyChangeException { DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() - .setVersion(10) + .setRevision(10) .setAccessControl(AccessControl.newBuilder() .setAttributes(AccessControl.AccessRequired.ADMINISTRATOR) .setMembers(AccessControl.AccessRequired.MEMBER) .build()) .build(), DecryptedGroupChange.newBuilder() - .setVersion(11) + .setRevision(11) .setNewAttributeAccess(AccessControl.AccessRequired.MEMBER) .setNewMemberAccess(AccessControl.AccessRequired.ADMINISTRATOR) .build()); assertEquals(DecryptedGroup.newBuilder() - .setVersion(11) + .setRevision(11) .setAccessControl(AccessControl.newBuilder() .setAttributes(AccessControl.AccessRequired.MEMBER) .setMembers(AccessControl.AccessRequired.ADMINISTRATOR)