From 7a27b6e40f97708fd8c732a8e8c10cd22288b7bf Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Sat, 29 Aug 2026 22:50:55 -0400 Subject: [PATCH] Support nullable number in whoami response. --- .../settings/app/changenumber/ChangeNumberViewModel.kt | 6 +++--- .../migrations/FixChangeNumberErrorMigrationJob.kt | 10 ++++++++-- .../signalservice/internal/push/WhoAmIResponse.kt | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModel.kt index d02435ed97..0b79fd3b53 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModel.kt @@ -210,9 +210,9 @@ class ChangeNumberViewModel : ViewModel() { return@launch } - if (reattempt) { - Log.i(TAG, "Reattempting local change.\n Local state (e164=${SignalStore.account.e164}, pni=${SignalStore.account.pni})\n Remote state (e164=${whoAmI.number}, pni=$remotePni)") - repository.changeLocalNumber(whoAmI.number, remotePni) + if (reattempt && remoteE164 != null) { + Log.i(TAG, "Reattempting local change.\n Local state (e164=${SignalStore.account.e164}, pni=${SignalStore.account.pni})\n Remote state (e164=$remoteE164, pni=$remotePni)") + repository.changeLocalNumber(remoteE164, remotePni) } SignalStore.misc.unlockChangeNumber() diff --git a/app/src/main/java/org/thoughtcrime/securesms/migrations/FixChangeNumberErrorMigrationJob.kt b/app/src/main/java/org/thoughtcrime/securesms/migrations/FixChangeNumberErrorMigrationJob.kt index 94a2262d05..4661a2d0d3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/migrations/FixChangeNumberErrorMigrationJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/FixChangeNumberErrorMigrationJob.kt @@ -56,8 +56,14 @@ internal class FixChangeNumberErrorMigrationJob( when (val result = SignalNetwork.account.whoAmI()) { is NetworkResult.Success -> { val serverPni = result.result.pni?.let { ServiceId.PNI.parseOrNull(it) } ?: return + val serverE164 = result.result.number - if (result.result.number == SignalStore.account.e164 && serverPni == SignalStore.account.pni) { + if (serverE164 == null) { + Log.i(TAG, "Server reports no e164 for this account, skipping.") + return + } + + if (serverE164 == SignalStore.account.e164 && serverPni == SignalStore.account.pni) { Log.i(TAG, "No number or PNI mismatch detected.") return } @@ -66,7 +72,7 @@ internal class FixChangeNumberErrorMigrationJob( if (pendingPniIdentityMatchesServer(pendingChangeNumberMetadata, serverPni)) { Log.w(TAG, "PNI identity key matches server. Fixing local number/PNI...") - ChangeNumberRepository().changeLocalNumber(result.result.number, serverPni) + ChangeNumberRepository().changeLocalNumber(serverE164, serverPni) Log.w(TAG, "Done!") } else { Log.w(TAG, "Server PNI identity does not match pending metadata (or could not be verified); cannot safely reconcile. Enqueuing AccountConsistencyWorkerJob.") diff --git a/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/WhoAmIResponse.kt b/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/WhoAmIResponse.kt index 31265cb30b..3baff9b1d6 100644 --- a/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/WhoAmIResponse.kt +++ b/lib/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/push/WhoAmIResponse.kt @@ -9,7 +9,7 @@ import com.fasterxml.jackson.annotation.JsonProperty data class WhoAmIResponse @JsonCreator constructor( @JsonProperty("uuid") val aci: String? = null, @JsonProperty val pni: String? = null, - @JsonProperty val number: String, + @JsonProperty val number: String? = null, @JsonProperty val usernameHash: String? = null, @JsonProperty val entitlements: Entitlements? = null ) {