From: AsamK Date: Mon, 24 May 2021 10:14:44 +0000 (+0200) Subject: Add hint that messages must be regularly received X-Git-Tag: v0.8.4~17 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/cfc818872f26ea30f92f79291103253a422211ea Add hint that messages must be regularly received --- diff --git a/README.md b/README.md index 4bd49c17..fa2c40f7 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,8 @@ Important: The USERNAME is your phone number in international format and must in signal-cli -u USERNAME receive +**Hint**: The Signal protocol expects that incoming messages are regularly received (using `daemon` or `receive` command). +This is required for the encryption to work efficiently and for getting updates to groups, expiration timer and other features. ## Storage diff --git a/lib/src/main/java/org/asamk/signal/manager/Manager.java b/lib/src/main/java/org/asamk/signal/manager/Manager.java index 2f38c0c7..87b0f30a 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -330,6 +330,17 @@ public class Manager implements Closeable { } public void checkAccountState() throws IOException { + if (account.getLastReceiveTimestamp() == 0) { + logger.warn("The Signal protocol expects that incoming messages are regularly received."); + } else { + var diffInMilliseconds = new Date().getTime() - account.getLastReceiveTimestamp(); + long days = TimeUnit.DAYS.convert(diffInMilliseconds, TimeUnit.MILLISECONDS); + if (days > 7) { + logger.warn( + "Messages have been last received {} days ago. The Signal protocol expects that incoming messages are regularly received.", + days); + } + } if (accountManager.getPreKeysCount() < ServiceConfig.PREKEY_MINIMUM_COUNT) { refreshPreKeys(); } @@ -1982,6 +1993,7 @@ public class Manager implements Closeable { SignalServiceContent content = null; Exception exception = null; final CachedMessage[] cachedMessage = {null}; + account.setLastReceiveTimestamp(new Date().getTime()); try { var result = messagePipe.readOrEmpty(timeout, unit, envelope1 -> { final var recipientId = envelope1.hasSource() diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java index 386d2287..a19459c0 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java @@ -84,6 +84,7 @@ public class SignalAccount implements Closeable { private ProfileKey profileKey; private int preKeyIdOffset; private int nextSignedPreKeyId; + private long lastReceiveTimestamp = 0; private boolean registered = false; @@ -261,6 +262,7 @@ public class SignalAccount implements Closeable { this.deviceId = deviceId; this.registered = true; this.isMultiDevice = true; + this.lastReceiveTimestamp = 0; } private void migrateLegacyConfigs() { @@ -368,6 +370,9 @@ public class SignalAccount implements Closeable { if (rootNode.hasNonNull("isMultiDevice")) { isMultiDevice = rootNode.get("isMultiDevice").asBoolean(); } + if (rootNode.hasNonNull("lastReceiveTimestamp")) { + lastReceiveTimestamp = rootNode.get("lastReceiveTimestamp").asLong(); + } int registrationId = 0; if (rootNode.hasNonNull("registrationId")) { registrationId = rootNode.get("registrationId").asInt(); @@ -637,6 +642,7 @@ public class SignalAccount implements Closeable { .put("deviceName", encryptedDeviceName) .put("deviceId", deviceId) .put("isMultiDevice", isMultiDevice) + .put("lastReceiveTimestamp", lastReceiveTimestamp) .put("password", password) .put("registrationId", identityKeyStore.getLocalRegistrationId()) .put("identityPrivateKey", @@ -870,6 +876,15 @@ public class SignalAccount implements Closeable { save(); } + public long getLastReceiveTimestamp() { + return lastReceiveTimestamp; + } + + public void setLastReceiveTimestamp(final long lastReceiveTimestamp) { + this.lastReceiveTimestamp = lastReceiveTimestamp; + save(); + } + public boolean isUnrestrictedUnidentifiedAccess() { // TODO make configurable return false; @@ -893,6 +908,7 @@ public class SignalAccount implements Closeable { this.registered = true; this.uuid = uuid; this.registrationLockPin = pin; + this.lastReceiveTimestamp = 0; save(); getSessionStore().archiveAllSessions(); diff --git a/src/main/java/org/asamk/signal/util/DateUtils.java b/src/main/java/org/asamk/signal/util/DateUtils.java index 7f2974ae..e421c849 100644 --- a/src/main/java/org/asamk/signal/util/DateUtils.java +++ b/src/main/java/org/asamk/signal/util/DateUtils.java @@ -14,7 +14,7 @@ public class DateUtils { public static String formatTimestamp(long timestamp) { var date = new Date(timestamp); - final DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX"); // Quoted "Z" to indicate UTC, no timezone offset + final DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX"); df.setTimeZone(tzUTC); return timestamp + " (" + df.format(date) + ")"; }