]> nmode's Git Repositories - signal-cli/commitdiff
Do a full recipients refresh every day
authorAsamK <asamk@gmx.de>
Mon, 16 Oct 2023 15:43:03 +0000 (17:43 +0200)
committerAsamK <asamk@gmx.de>
Mon, 16 Oct 2023 17:01:31 +0000 (19:01 +0200)
lib/src/main/java/org/asamk/signal/manager/helper/RecipientHelper.java
lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java
lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java

index 133aab5bd83ae0e28de2983cc41f18a8c7ccd522..a27aca646480409f8545eabe18d2e43ccf5c9162 100644 (file)
@@ -214,6 +214,7 @@ public class RecipientHelper {
                                     }};
                                     account.getCdsiStore().updateAfterFullCdsQuery(fullNumbers, seenNumbers);
                                     account.setCdsiToken(newToken);
+                                    account.setLastRecipientsRefresh(System.currentTimeMillis());
                                 }
                             });
         } catch (CdsiInvalidTokenException e) {
index 189e4fe951fc670ccab5ea1822fdca7aa0bd31c0..841fd791f119ca07136410a32888f6f5e74c83e6 100644 (file)
@@ -115,6 +115,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.function.Function;
@@ -215,6 +216,18 @@ public class ManagerImpl implements Manager {
 
     public void checkAccountState() throws IOException {
         context.getAccountHelper().checkAccountState();
+        final var lastRecipientsRefresh = account.getLastRecipientsRefresh();
+        if (lastRecipientsRefresh == null
+                || lastRecipientsRefresh < System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1)) {
+            try {
+                context.getRecipientHelper().refreshUsers();
+            } catch (Exception e) {
+                logger.warn("Full CDSI recipients refresh failed, ignoring: {} ({})",
+                        e.getMessage(),
+                        e.getClass().getSimpleName());
+                logger.debug("Full CDSI refresh failed", e);
+            }
+        }
     }
 
     @Override
index fbfd88f62aeb58ccbd081dcde75a8b57255ec8df..a51136a064975b9721fe3e0fcaa82c4a0091f360 100644 (file)
@@ -147,6 +147,8 @@ public class SignalAccount implements Closeable {
             long.class,
             0L);
     private final KeyValueEntry<byte[]> cdsiToken = new KeyValueEntry<>("cdsi-token", byte[].class);
+    private final KeyValueEntry<Long> lastRecipientsRefresh = new KeyValueEntry<>("last-recipients-refresh",
+            long.class);
     private final KeyValueEntry<Long> storageManifestVersion = new KeyValueEntry<>("storage-manifest-version",
             long.class,
             -1L);
@@ -374,6 +376,7 @@ public class SignalAccount implements Closeable {
         this.storageKey = null;
         trustSelfIdentity(ServiceIdType.ACI);
         trustSelfIdentity(ServiceIdType.PNI);
+        getKeyValueStore().storeEntry(lastRecipientsRefresh, null);
     }
 
     public void finishRegistration(
@@ -406,6 +409,7 @@ public class SignalAccount implements Closeable {
         getRecipientTrustedResolver().resolveSelfRecipientTrusted(getSelfRecipientAddress());
         trustSelfIdentity(ServiceIdType.ACI);
         trustSelfIdentity(ServiceIdType.PNI);
+        getKeyValueStore().storeEntry(lastRecipientsRefresh, null);
     }
 
     public void initDatabase() {
@@ -1586,6 +1590,14 @@ public class SignalAccount implements Closeable {
         getKeyValueStore().storeEntry(cdsiToken, value);
     }
 
+    public Long getLastRecipientsRefresh() {
+        return getKeyValueStore().getEntry(lastRecipientsRefresh);
+    }
+
+    public void setLastRecipientsRefresh(final Long value) {
+        getKeyValueStore().storeEntry(lastRecipientsRefresh, value);
+    }
+
     public ProfileKey getProfileKey() {
         return profileKey;
     }