diff --git a/src/org/thoughtcrime/securesms/ConfirmIdentityDialog.java b/src/org/thoughtcrime/securesms/ConfirmIdentityDialog.java index bcb143647c..98e3eef272 100644 --- a/src/org/thoughtcrime/securesms/ConfirmIdentityDialog.java +++ b/src/org/thoughtcrime/securesms/ConfirmIdentityDialog.java @@ -11,6 +11,7 @@ import android.text.method.LinkMovementMethod; import android.widget.TextView; import org.thoughtcrime.securesms.crypto.MasterSecret; +import org.thoughtcrime.securesms.crypto.storage.TextSecureSessionStore; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.IdentityDatabase; import org.thoughtcrime.securesms.database.MmsAddressDatabase; @@ -27,8 +28,10 @@ import org.thoughtcrime.securesms.recipients.RecipientFactory; import org.thoughtcrime.securesms.recipients.Recipients; import org.thoughtcrime.securesms.sms.MessageSender; import org.thoughtcrime.securesms.util.Base64; +import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.VerifySpan; import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope; +import org.whispersystems.signalservice.api.util.InvalidNumberException; import org.whispersystems.signalservice.internal.push.SignalServiceProtos; import java.io.IOException; @@ -45,21 +48,27 @@ public class ConfirmIdentityDialog extends AlertDialog { IdentityKeyMismatch mismatch) { super(context); - Recipient recipient = RecipientFactory.getRecipientForId(context, mismatch.getRecipientId(), false); - String name = recipient.toShortString(); - String introduction = String.format(context.getString(R.string.ConfirmIdentityDialog_your_safety_number_with_s_has_changed), name, name); - SpannableString spannableString = new SpannableString(introduction + " " + - context.getString(R.string.ConfirmIdentityDialog_you_may_wish_to_verify_your_safety_number_with_this_contact)); - spannableString.setSpan(new VerifySpan(context, mismatch), - introduction.length()+1, spannableString.length(), - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + try { + Recipient recipient = RecipientFactory.getRecipientForId(context, mismatch.getRecipientId(), false); + String name = recipient.toShortString(); + String number = Util.canonicalizeNumber(context, recipient.getNumber()); + String introduction = String.format(context.getString(R.string.ConfirmIdentityDialog_your_safety_number_with_s_has_changed), name, name); + SpannableString spannableString = new SpannableString(introduction + " " + + context.getString(R.string.ConfirmIdentityDialog_you_may_wish_to_verify_your_safety_number_with_this_contact)); - setTitle(name); - setMessage(spannableString); + spannableString.setSpan(new VerifySpan(context, mismatch), + introduction.length()+1, spannableString.length(), + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - setButton(AlertDialog.BUTTON_POSITIVE, context.getString(R.string.ConfirmIdentityDialog_accept), new AcceptListener(masterSecret, messageRecord, mismatch)); - setButton(AlertDialog.BUTTON_NEGATIVE, context.getString(android.R.string.cancel), new CancelListener()); + setTitle(name); + setMessage(spannableString); + + setButton(AlertDialog.BUTTON_POSITIVE, context.getString(R.string.ConfirmIdentityDialog_accept), new AcceptListener(masterSecret, messageRecord, mismatch, number)); + setButton(AlertDialog.BUTTON_NEGATIVE, context.getString(android.R.string.cancel), new CancelListener()); + } catch (InvalidNumberException e) { + throw new AssertionError(e); + } } @Override @@ -78,11 +87,13 @@ public class ConfirmIdentityDialog extends AlertDialog { private final MasterSecret masterSecret; private final MessageRecord messageRecord; private final IdentityKeyMismatch mismatch; + private final String number; - private AcceptListener(MasterSecret masterSecret, MessageRecord messageRecord, IdentityKeyMismatch mismatch) { + private AcceptListener(MasterSecret masterSecret, MessageRecord messageRecord, IdentityKeyMismatch mismatch, String number) { this.masterSecret = masterSecret; this.messageRecord = messageRecord; this.mismatch = mismatch; + this.number = number; } @Override @@ -96,6 +107,8 @@ public class ConfirmIdentityDialog extends AlertDialog { identityDatabase.saveIdentity(mismatch.getRecipientId(), mismatch.getIdentityKey()); + new TextSecureSessionStore(getContext()).deleteAllSessions(number); + processMessageRecord(messageRecord); processPendingMessageRecords(messageRecord.getThreadId(), mismatch); diff --git a/src/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java b/src/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java index 2c12347c7d..597e3d6278 100644 --- a/src/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java +++ b/src/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java @@ -4,6 +4,7 @@ import android.content.Context; import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.crypto.IdentityKeyUtil; +import org.thoughtcrime.securesms.crypto.SessionUtil; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.jobs.IdentityUpdateJob; import org.thoughtcrime.securesms.recipients.RecipientFactory; @@ -47,6 +48,7 @@ public class TextSecureIdentityKeyStore implements IdentityKeyStore { return true; } else if (!TextSecurePreferences.isBlockingIdentityUpdates(context)) { saveIdentity(address, identityKey); + new TextSecureSessionStore(context).deleteAllSessions(address.getName()); ApplicationContext.getInstance(context) .getJobManager()