mirror of
https://github.com/AsamK/signal-cli.git
synced 2026-09-01 06:28:11 +00:00
Improve handling of pni change number messages
This commit is contained in:
parent
6fa1d1bf90
commit
ecc76ec52b
@ -324,10 +324,14 @@ public class AccountHelper {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
handlePniChangeNumberMessage(selfChangeNumber, updatePni);
|
handlePniChangeNumberMessage(selfChangeNumber, updatePni, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handlePniChangeNumberMessage(final SyncMessage.PniChangeNumber pniChangeNumber, final PNI updatedPni) {
|
public boolean handlePniChangeNumberMessage(
|
||||||
|
final SyncMessage.PniChangeNumber pniChangeNumber,
|
||||||
|
final PNI updatedPni,
|
||||||
|
final boolean forcePniPreKeyRotation
|
||||||
|
) {
|
||||||
if (pniChangeNumber.identityKeyPair != null
|
if (pniChangeNumber.identityKeyPair != null
|
||||||
&& pniChangeNumber.registrationId != null
|
&& pniChangeNumber.registrationId != null
|
||||||
&& pniChangeNumber.signedPreKey != null) {
|
&& pniChangeNumber.signedPreKey != null) {
|
||||||
@ -341,10 +345,19 @@ public class AccountHelper {
|
|||||||
pniChangeNumber.lastResortKyberPreKey != null
|
pniChangeNumber.lastResortKyberPreKey != null
|
||||||
? new KyberPreKeyRecord(pniChangeNumber.lastResortKyberPreKey.toByteArray())
|
? new KyberPreKeyRecord(pniChangeNumber.lastResortKyberPreKey.toByteArray())
|
||||||
: null);
|
: null);
|
||||||
|
if (forcePniPreKeyRotation) {
|
||||||
|
try {
|
||||||
|
context.getPreKeyHelper().forceRefreshPreKeys(ServiceIdType.PNI);
|
||||||
|
} catch (IOException e) {
|
||||||
|
logger.warn("Failed to force refresh PNI pre keys after PNI change sync", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.warn("Failed to handle change number message", e);
|
logger.warn("Failed to handle change number message", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final int USERNAME_MIN_LENGTH = 3;
|
public static final int USERNAME_MIN_LENGTH = 3;
|
||||||
|
|||||||
@ -717,11 +717,30 @@ public final class IncomingMessageHandler {
|
|||||||
}
|
}
|
||||||
if (syncMessage.getPniChangeNumber().isPresent()) {
|
if (syncMessage.getPniChangeNumber().isPresent()) {
|
||||||
final var pniChangeNumber = syncMessage.getPniChangeNumber().get();
|
final var pniChangeNumber = syncMessage.getPniChangeNumber().get();
|
||||||
logger.debug("Received PNI change number sync message, applying.");
|
if (account.isPrimaryDevice()) {
|
||||||
final var updatedPniString = envelope.getUpdatedPni();
|
logger.warn("Received PNI change number sync message on primary device, ignoring.");
|
||||||
if (updatedPniString != null && !updatedPniString.isEmpty()) {
|
} else if (sender.deviceId() != SignalServiceAddress.DEFAULT_DEVICE_ID) {
|
||||||
final var updatedPni = ServiceId.PNI.parseOrThrow(updatedPniString);
|
logger.warn("Received PNI change number sync message from non-primary device {}, ignoring.",
|
||||||
context.getAccountHelper().handlePniChangeNumberMessage(pniChangeNumber, updatedPni);
|
sender.deviceId());
|
||||||
|
} else {
|
||||||
|
final var envelopeServerTimestamp = envelope.getServerDeliveredTimestamp();
|
||||||
|
final var lastAppliedServerTimestamp = account.getLastAppliedPniChangeServerTimestamp();
|
||||||
|
if (envelopeServerTimestamp <= lastAppliedServerTimestamp) {
|
||||||
|
logger.warn(
|
||||||
|
"PNI change number sync server timestamp ({}) is not newer than last applied ({}), treating as replay.",
|
||||||
|
envelopeServerTimestamp,
|
||||||
|
lastAppliedServerTimestamp);
|
||||||
|
} else {
|
||||||
|
final var updatedPniString = envelope.getUpdatedPni();
|
||||||
|
if (updatedPniString != null && !updatedPniString.isEmpty()) {
|
||||||
|
final var updatedPni = ServiceId.PNI.parseOrThrow(updatedPniString);
|
||||||
|
final var applied = context.getAccountHelper()
|
||||||
|
.handlePniChangeNumberMessage(pniChangeNumber, updatedPni, true);
|
||||||
|
if (applied) {
|
||||||
|
account.setLastAppliedPniChangeServerTimestamp(envelopeServerTimestamp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (syncMessage.getDeviceNameChange().isPresent()) {
|
if (syncMessage.getDeviceNameChange().isPresent()) {
|
||||||
|
|||||||
@ -153,6 +153,10 @@ public class SignalAccount implements Closeable {
|
|||||||
private final KeyValueEntry<Long> lastReceiveTimestamp = new KeyValueEntry<>("last-receive-timestamp",
|
private final KeyValueEntry<Long> lastReceiveTimestamp = new KeyValueEntry<>("last-receive-timestamp",
|
||||||
long.class,
|
long.class,
|
||||||
0L);
|
0L);
|
||||||
|
private final KeyValueEntry<Long> lastAppliedPniChangeServerTimestamp = new KeyValueEntry<>(
|
||||||
|
"last-applied-pni-change-server-timestamp",
|
||||||
|
long.class,
|
||||||
|
0L);
|
||||||
private final KeyValueEntry<Boolean> needsToRetryFailedMessages = new KeyValueEntry<>("retry-failed-messages",
|
private final KeyValueEntry<Boolean> needsToRetryFailedMessages = new KeyValueEntry<>("retry-failed-messages",
|
||||||
Boolean.class,
|
Boolean.class,
|
||||||
true);
|
true);
|
||||||
@ -313,6 +317,7 @@ public class SignalAccount implements Closeable {
|
|||||||
this.registered = false;
|
this.registered = false;
|
||||||
this.isMultiDevice = true;
|
this.isMultiDevice = true;
|
||||||
setLastReceiveTimestamp(0L);
|
setLastReceiveTimestamp(0L);
|
||||||
|
setLastAppliedPniChangeServerTimestamp(0L);
|
||||||
if (accountEntropyPool != null) {
|
if (accountEntropyPool != null) {
|
||||||
this.pinMasterKey = null;
|
this.pinMasterKey = null;
|
||||||
this.accountEntropyPool = accountEntropyPool;
|
this.accountEntropyPool = accountEntropyPool;
|
||||||
@ -368,6 +373,7 @@ public class SignalAccount implements Closeable {
|
|||||||
init();
|
init();
|
||||||
this.registrationLockPin = pin;
|
this.registrationLockPin = pin;
|
||||||
setLastReceiveTimestamp(0L);
|
setLastReceiveTimestamp(0L);
|
||||||
|
setLastAppliedPniChangeServerTimestamp(0L);
|
||||||
save();
|
save();
|
||||||
|
|
||||||
setPreKeys(ServiceIdType.ACI, aciPreKeys);
|
setPreKeys(ServiceIdType.ACI, aciPreKeys);
|
||||||
@ -1753,6 +1759,14 @@ public class SignalAccount implements Closeable {
|
|||||||
getKeyValueStore().storeEntry(lastReceiveTimestamp, value);
|
getKeyValueStore().storeEntry(lastReceiveTimestamp, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long getLastAppliedPniChangeServerTimestamp() {
|
||||||
|
return getKeyValueStore().getEntry(lastAppliedPniChangeServerTimestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastAppliedPniChangeServerTimestamp(final long value) {
|
||||||
|
getKeyValueStore().storeEntry(lastAppliedPniChangeServerTimestamp, value);
|
||||||
|
}
|
||||||
|
|
||||||
public void setNeedsToRetryFailedMessages(final boolean value) {
|
public void setNeedsToRetryFailedMessages(final boolean value) {
|
||||||
getKeyValueStore().storeEntry(needsToRetryFailedMessages, value);
|
getKeyValueStore().storeEntry(needsToRetryFailedMessages, value);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user