]> nmode's Git Repositories - signal-cli/commitdiff
Reset pre key offset if it somehow gets corrupted
authorAsamK <asamk@gmx.de>
Tue, 18 Oct 2022 15:55:51 +0000 (17:55 +0200)
committerAsamK <asamk@gmx.de>
Tue, 18 Oct 2022 15:55:51 +0000 (17:55 +0200)
Fixes #1055

lib/src/main/java/org/asamk/signal/manager/helper/PreKeyHelper.java
lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java

index 3fc1a5bf10e6b640524cb9f3cf4eceac2ba9ea74..30ab919e08b0454ff94871562805611c206cf3ea 100644 (file)
@@ -53,6 +53,18 @@ public class PreKeyHelper {
         if (accountId == null) {
             return;
         }
         if (accountId == null) {
             return;
         }
+        try {
+            refreshPreKeys(serviceIdType, identityKeyPair);
+        } catch (Exception e) {
+            logger.warn("Failed to store new pre keys, resetting preKey id offset", e);
+            account.resetPreKeyOffsets(serviceIdType);
+            refreshPreKeys(serviceIdType, identityKeyPair);
+        }
+    }
+
+    private void refreshPreKeys(
+            final ServiceIdType serviceIdType, final IdentityKeyPair identityKeyPair
+    ) throws IOException {
         final var oneTimePreKeys = generatePreKeys(serviceIdType);
         final var signedPreKeyRecord = generateSignedPreKey(serviceIdType, identityKeyPair);
 
         final var oneTimePreKeys = generatePreKeys(serviceIdType);
         final var signedPreKeyRecord = generateSignedPreKey(serviceIdType, identityKeyPair);
 
index 730fe85ac95726628dbc4b528c11459cd8c5b7b5..db919269db5c693b5c6f844fca2993f415206abb 100644 (file)
@@ -294,10 +294,8 @@ public class SignalAccount implements Closeable {
     }
 
     private void clearAllPreKeys() {
     }
 
     private void clearAllPreKeys() {
-        this.aciPreKeyIdOffset = new SecureRandom().nextInt(Medium.MAX_VALUE);
-        this.aciNextSignedPreKeyId = new SecureRandom().nextInt(Medium.MAX_VALUE);
-        this.pniPreKeyIdOffset = new SecureRandom().nextInt(Medium.MAX_VALUE);
-        this.pniNextSignedPreKeyId = new SecureRandom().nextInt(Medium.MAX_VALUE);
+        resetPreKeyOffsets(ServiceIdType.ACI);
+        resetPreKeyOffsets(ServiceIdType.PNI);
         this.getAciPreKeyStore().removeAllPreKeys();
         this.getAciSignedPreKeyStore().removeAllSignedPreKeys();
         this.getPniPreKeyStore().removeAllPreKeys();
         this.getAciPreKeyStore().removeAllPreKeys();
         this.getAciSignedPreKeyStore().removeAllSignedPreKeys();
         this.getPniPreKeyStore().removeAllPreKeys();
@@ -998,6 +996,17 @@ public class SignalAccount implements Closeable {
         }
     }
 
         }
     }
 
+    public void resetPreKeyOffsets(final ServiceIdType serviceIdType) {
+        if (serviceIdType.equals(ServiceIdType.ACI)) {
+            this.aciPreKeyIdOffset = new SecureRandom().nextInt(Medium.MAX_VALUE);
+            this.aciNextSignedPreKeyId = new SecureRandom().nextInt(Medium.MAX_VALUE);
+        } else {
+            this.pniPreKeyIdOffset = new SecureRandom().nextInt(Medium.MAX_VALUE);
+            this.pniNextSignedPreKeyId = new SecureRandom().nextInt(Medium.MAX_VALUE);
+        }
+        save();
+    }
+
     public void addPreKeys(ServiceIdType serviceIdType, List<PreKeyRecord> records) {
         if (serviceIdType.equals(ServiceIdType.ACI)) {
             addAciPreKeys(records);
     public void addPreKeys(ServiceIdType serviceIdType, List<PreKeyRecord> records) {
         if (serviceIdType.equals(ServiceIdType.ACI)) {
             addAciPreKeys(records);