Fix handling of unknown storage id types that become known

Fixes #2112
This commit is contained in:
AsamK 2026-09-10 17:31:00 +02:00
parent 45cbe82d7f
commit 76fee5dda2
3 changed files with 23 additions and 8 deletions

View File

@ -293,8 +293,7 @@ public class StorageHelper {
logger.debug("Found {} of the known-unknowns remotely.", remote.size());
processKnownRecords(connection, remote, identityConflictsPendingRepair);
account.getUnknownStorageIdStore()
.deleteUnknownStorageIds(connection, remote.stream().map(SignalStorageRecord::getId).toList());
account.getUnknownStorageIdStore().deleteUnknownStorageIds(connection, knownUnknownIds);
}
connection.commit();
} catch (SQLException e) {
@ -317,10 +316,8 @@ public class StorageHelper {
var idDifference = findIdDifference(remoteManifest.storageIds, localStorageIds);
logger.debug("ID Difference :: {}", idDifference);
final var unknownOnlyLocal = idDifference.localOnlyIds()
.stream()
.filter(id -> !KNOWN_TYPES.contains(id.getType()))
.toList();
final var unknownStorageIds = account.getUnknownStorageIdStore().getUnknownStorageIds(connection);
final var unknownOnlyLocal = findUnknownOnlyLocalStorageIds(idDifference.localOnlyIds(), unknownStorageIds);
if (!unknownOnlyLocal.isEmpty()) {
logger.debug("Storage ids with unknown type: {} to delete", unknownOnlyLocal.size());
@ -406,6 +403,13 @@ public class StorageHelper {
}
}
static List<StorageId> findUnknownOnlyLocalStorageIds(
final List<StorageId> localOnlyStorageIds,
final Set<StorageId> unknownStorageIds
) {
return localOnlyStorageIds.stream().filter(unknownStorageIds::contains).toList();
}
static boolean containsOnlyIdentityConflictsPendingRepair(
final WriteOperationResult writeOperation,
final Set<StorageId> identityConflictsPendingRepair

View File

@ -98,8 +98,7 @@ public class ContactRecordProcessor extends DefaultStorageRecordProcessor<Signal
) {
return remoteIdentityKeySize > 0 && (
statesDiffer || localIdentityKeySize == 0 || localUnregisteredAtTimestamp > 0 || (
unrepairableIdentityKeyConflict
&& !isPrimaryDevice
unrepairableIdentityKeyConflict && !isPrimaryDevice
)
);
}

View File

@ -9,11 +9,23 @@ import org.whispersystems.signalservice.internal.storage.protos.StorageRecord;
import java.util.List;
import java.util.Set;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
class StorageHelperTest {
@Test
void removesKnownTypeLocalOnlyIdsStoredAsUnknown() {
final var staleStickerPackId = StorageId.forStickerPack(new byte[]{1});
final var localContactId = StorageId.forContact(new byte[]{2});
final var result = StorageHelper.findUnknownOnlyLocalStorageIds(List.of(staleStickerPackId, localContactId),
Set.of(staleStickerPackId));
assertEquals(List.of(staleStickerPackId), result);
}
@Test
void defersWritesContainingOnlyIdentityConflictsPendingRepair() {
final var pendingId = StorageId.forContact(new byte[]{1});