Add additional log around change number and set PNI.

This commit is contained in:
Cody Henthorne
2022-01-26 15:13:52 -05:00
committed by GitHub
parent 8e5500826c
commit 053b19846b
5 changed files with 45 additions and 8 deletions

View File

@@ -17,6 +17,7 @@ import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme
import org.thoughtcrime.securesms.util.DynamicTheme import org.thoughtcrime.securesms.util.DynamicTheme
import org.thoughtcrime.securesms.util.LifecycleDisposable import org.thoughtcrime.securesms.util.LifecycleDisposable
import org.whispersystems.signalservice.api.push.PNI
import java.util.Objects import java.util.Objects
private val TAG: String = Log.tag(ChangeNumberLockActivity::class.java) private val TAG: String = Log.tag(ChangeNumberLockActivity::class.java)
@@ -57,7 +58,7 @@ class ChangeNumberLockActivity : PassphraseRequiredActivity() {
Single.just(false) Single.just(false)
} else { } else {
Log.i(TAG, "Local (${SignalStore.account().e164}) and remote (${whoAmI.number}) numbers do not match, updating local.") Log.i(TAG, "Local (${SignalStore.account().e164}) and remote (${whoAmI.number}) numbers do not match, updating local.")
changeNumberRepository.changeLocalNumber(whoAmI.number) changeNumberRepository.changeLocalNumber(whoAmI.number, PNI.parseOrThrow(whoAmI.pni))
.map { true } .map { true }
} }
} }

View File

@@ -12,13 +12,17 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.pin.KbsRepository import org.thoughtcrime.securesms.pin.KbsRepository
import org.thoughtcrime.securesms.pin.KeyBackupSystemWrongPinException import org.thoughtcrime.securesms.pin.KeyBackupSystemWrongPinException
import org.thoughtcrime.securesms.pin.TokenData import org.thoughtcrime.securesms.pin.TokenData
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.registration.VerifyAccountRepository import org.thoughtcrime.securesms.registration.VerifyAccountRepository
import org.thoughtcrime.securesms.storage.StorageSyncHelper
import org.whispersystems.signalservice.api.KbsPinData import org.whispersystems.signalservice.api.KbsPinData
import org.whispersystems.signalservice.api.KeyBackupSystemNoDataException import org.whispersystems.signalservice.api.KeyBackupSystemNoDataException
import org.whispersystems.signalservice.api.push.PNI
import org.whispersystems.signalservice.internal.ServiceResponse import org.whispersystems.signalservice.internal.ServiceResponse
import org.whispersystems.signalservice.internal.push.VerifyAccountResponse import org.whispersystems.signalservice.internal.push.VerifyAccountResponse
import org.whispersystems.signalservice.internal.push.WhoAmIResponse import org.whispersystems.signalservice.internal.push.WhoAmIResponse
import java.io.IOException import java.io.IOException
import java.security.MessageDigest
private val TAG: String = Log.tag(ChangeNumberRepository::class.java) private val TAG: String = Log.tag(ChangeNumberRepository::class.java)
@@ -61,10 +65,26 @@ class ChangeNumberRepository(private val context: Context) {
} }
@WorkerThread @WorkerThread
fun changeLocalNumber(e164: String): Single<Unit> { fun changeLocalNumber(e164: String, pni: PNI): Single<Unit> {
val oldStorageId: ByteArray? = Recipient.self().storageServiceId
SignalDatabase.recipients.updateSelfPhone(e164) SignalDatabase.recipients.updateSelfPhone(e164)
val newStorageId: ByteArray? = Recipient.self().storageServiceId
if (MessageDigest.isEqual(oldStorageId, newStorageId)) {
Log.w(TAG, "Self storage id was not rotated, attempting to rotate again")
SignalDatabase.recipients.rotateStorageId(Recipient.self().id)
Recipient.self().live().refresh()
StorageSyncHelper.scheduleSyncForDataChange()
val secondAttemptStorageId: ByteArray? = Recipient.self().storageServiceId
if (MessageDigest.isEqual(oldStorageId, secondAttemptStorageId)) {
Log.w(TAG, "Second attempt also failed to rotate storage id")
}
}
SignalDatabase.recipients.setPni(Recipient.self().id, pni)
SignalStore.account().setE164(e164) SignalStore.account().setE164(e164)
SignalStore.account().setPni(pni)
ApplicationDependencies.closeConnections() ApplicationDependencies.closeConnections()
ApplicationDependencies.getIncomingMessageObserver() ApplicationDependencies.getIncomingMessageObserver()

View File

@@ -23,6 +23,7 @@ import org.thoughtcrime.securesms.registration.VerifyProcessor
import org.thoughtcrime.securesms.registration.viewmodel.BaseRegistrationViewModel import org.thoughtcrime.securesms.registration.viewmodel.BaseRegistrationViewModel
import org.thoughtcrime.securesms.registration.viewmodel.NumberViewState import org.thoughtcrime.securesms.registration.viewmodel.NumberViewState
import org.thoughtcrime.securesms.util.DefaultValueLiveData import org.thoughtcrime.securesms.util.DefaultValueLiveData
import org.whispersystems.signalservice.api.push.PNI
import org.whispersystems.signalservice.internal.ServiceResponse import org.whispersystems.signalservice.internal.ServiceResponse
import org.whispersystems.signalservice.internal.push.VerifyAccountResponse import org.whispersystems.signalservice.internal.push.VerifyAccountResponse
import java.util.Objects import java.util.Objects
@@ -145,7 +146,7 @@ class ChangeNumberViewModel(
@WorkerThread @WorkerThread
override fun onVerifySuccess(processor: VerifyAccountResponseProcessor): Single<VerifyAccountResponseProcessor> { override fun onVerifySuccess(processor: VerifyAccountResponseProcessor): Single<VerifyAccountResponseProcessor> {
return changeNumberRepository.changeLocalNumber(number.e164Number) return changeNumberRepository.changeLocalNumber(number.e164Number, PNI.parseOrThrow(processor.result.pni))
.map { processor } .map { processor }
.onErrorReturn { t -> .onErrorReturn { t ->
Log.w(TAG, "Error attempting to change local number", t) Log.w(TAG, "Error attempting to change local number", t)
@@ -154,7 +155,7 @@ class ChangeNumberViewModel(
} }
override fun onVerifySuccessWithRegistrationLock(processor: VerifyCodeWithRegistrationLockResponseProcessor, pin: String): Single<VerifyCodeWithRegistrationLockResponseProcessor> { override fun onVerifySuccessWithRegistrationLock(processor: VerifyCodeWithRegistrationLockResponseProcessor, pin: String): Single<VerifyCodeWithRegistrationLockResponseProcessor> {
return changeNumberRepository.changeLocalNumber(number.e164Number) return changeNumberRepository.changeLocalNumber(number.e164Number, PNI.parseOrThrow(processor.result.verifyAccountResponse.pni))
.map { processor } .map { processor }
.onErrorReturn { t -> .onErrorReturn { t ->
Log.w(TAG, "Error attempting to change local number", t) Log.w(TAG, "Error attempting to change local number", t)

View File

@@ -99,6 +99,7 @@ import java.util.LinkedHashSet
import java.util.LinkedList import java.util.LinkedList
import java.util.Objects import java.util.Objects
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import kotlin.jvm.Throws
import kotlin.math.max import kotlin.math.max
open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) : Database(context, databaseHelper) { open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) : Database(context, databaseHelper) {
@@ -418,14 +419,14 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
fetch.id fetch.id
} }
is RecipientFetch.MatchAndUpdateE164 -> { is RecipientFetch.MatchAndUpdateE164 -> {
setPhoneNumber(fetch.id, fetch.e164) setPhoneNumberOrThrowSilent(fetch.id, fetch.e164)
recipientsNeedingRefresh = listOf(fetch.id) recipientsNeedingRefresh = listOf(fetch.id)
recipientChangedNumber = fetch.changedNumber recipientChangedNumber = fetch.changedNumber
fetch.id fetch.id
} }
is RecipientFetch.MatchAndReassignE164 -> { is RecipientFetch.MatchAndReassignE164 -> {
removePhoneNumber(fetch.e164Id, db) removePhoneNumber(fetch.e164Id, db)
setPhoneNumber(fetch.id, fetch.e164) setPhoneNumberOrThrowSilent(fetch.id, fetch.e164)
recipientsNeedingRefresh = listOf(fetch.id, fetch.e164Id) recipientsNeedingRefresh = listOf(fetch.id, fetch.e164Id)
recipientChangedNumber = fetch.changedNumber recipientChangedNumber = fetch.changedNumber
fetch.id fetch.id
@@ -1749,12 +1750,16 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
putNull(PHONE) putNull(PHONE)
putNull(PNI_COLUMN) putNull(PNI_COLUMN)
} }
db.update(TABLE_NAME, values, ID_WHERE, SqlUtil.buildArgs(recipientId))
if (update(recipientId, values)) {
rotateStorageId(recipientId)
}
} }
/** /**
* Should only use if you are confident that this will not result in any contact merging. * Should only use if you are confident that this will not result in any contact merging.
*/ */
@Throws(SQLiteConstraintException::class)
fun setPhoneNumberOrThrow(id: RecipientId, e164: String) { fun setPhoneNumberOrThrow(id: RecipientId, e164: String) {
val contentValues = ContentValues(1).apply { val contentValues = ContentValues(1).apply {
put(PHONE, e164) put(PHONE, e164)
@@ -1766,6 +1771,16 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) :
} }
} }
@Throws(SQLiteConstraintException::class)
fun setPhoneNumberOrThrowSilent(id: RecipientId, e164: String) {
val contentValues = ContentValues(1).apply {
put(PHONE, e164)
}
if (update(id, contentValues)) {
rotateStorageId(id)
}
}
fun updateSelfPhone(e164: String) { fun updateSelfPhone(e164: String) {
val db = writableDatabase val db = writableDatabase

View File

@@ -365,7 +365,7 @@ public class PushServiceSocket {
String requestBody = JsonUtil.toJson(changePhoneNumberRequest); String requestBody = JsonUtil.toJson(changePhoneNumberRequest);
String responseBody = makeServiceRequest(CHANGE_NUMBER_PATH, "PUT", requestBody); String responseBody = makeServiceRequest(CHANGE_NUMBER_PATH, "PUT", requestBody);
return new VerifyAccountResponse(); return JsonUtil.fromJson(responseBody, VerifyAccountResponse.class);
} }
public void setAccountAttributes(String signalingKey, public void setAccountAttributes(String signalingKey,