diff --git a/build.gradle b/build.gradle
index 0e4ed3c78f..d7117579c0 100644
--- a/build.gradle
+++ b/build.gradle
@@ -73,7 +73,7 @@ dependencies {
compile 'org.whispersystems:jobmanager:1.0.2'
compile 'org.whispersystems:libpastelog:1.0.7'
compile 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
- compile 'org.whispersystems:signal-service-android:2.3.1'
+ compile 'org.whispersystems:signal-service-android:2.4.0'
compile 'com.h6ah4i.android.compat:mulsellistprefcompat:1.0.0'
compile 'com.google.zxing:core:3.2.1'
@@ -131,7 +131,7 @@ dependencyVerification {
'org.whispersystems:jobmanager:506f679fc2fcf7bb6d10f00f41d6f6ea0abf75c70dc95b913398661ad538a181',
'org.whispersystems:libpastelog:bb331d9a98240fc139101128ba836c1edec3c40e000597cdbb29ebf4cbf34d88',
'com.amulyakhare:com.amulyakhare.textdrawable:54c92b5fba38cfd316a07e5a30528068f45ce8515a6890f1297df4c401af5dcb',
- 'org.whispersystems:signal-service-android:8e6517280a2ad4417a48a47c5c4c99d7d3d142c9568d81ce3af9fb704b1ecf50',
+ 'org.whispersystems:signal-service-android:b765192b37290551f11dcbc9321761073be13ae64b46d4e57a806e52decc7308',
'com.h6ah4i.android.compat:mulsellistprefcompat:47167c5cb796de1a854788e9ff318358e36c8fb88123baaa6e38fb78511dfabe',
'com.google.zxing:core:b4d82452e7a6bf6ec2698904b332431717ed8f9a850224f295aec89de80f2259',
'cn.carbswang.android:NumberPickerView:18b3c316d62c7c277978a8d4ed57a5b8f4e943762264960f579a8a549c756729',
@@ -140,24 +140,23 @@ dependencyVerification {
'com.nineoldandroids:library:68025a14e3e7673d6ad2f95e4b46d78d7d068343aa99256b686fe59de1b3163a',
'javax.inject:javax.inject:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
'com.madgag.spongycastle:core:8d6240b974b0aca4d3da9c7dd44d42339d8a374358aca5fc98e50a995764511f',
- 'org.whispersystems:signal-service-java:1f268ea089d82c3a13e6cad3f4da10d63d3789f750894f9e50dae2bf7999aa71',
- 'org.whispersystems:signal-protocol-android:d83cb3d15b667fc2543fa18ce80791c72c053e8ac54fc2941f0429a5944ca691',
+ 'org.whispersystems:signal-service-java:dda6c3b15872fee7a8980e0898a813aca6a603f8dc142d5354f30e2cc005ea17',
+ 'org.whispersystems:signal-protocol-android:1b4b9d557c8eaf861797ff683990d482d4aa8e9f23d9b17ff0cc67a02f38cb19',
'com.google.android.gms:play-services-basement:e1d29b21e02fd2a63e5a31807415cbb17a59568e27e3254181c01ffae10659bf',
'com.googlecode.libphonenumber:libphonenumber:9625de9d2270e9a280ff4e6d9ef3106573fb4828773fd32c9b7614f4e17d2811',
'com.google.protobuf:protobuf-java:e0c1c64575c005601725e7c6a02cebf9e1285e888f756b2a1d73ffa8d725cc74',
'com.squareup.okhttp:okhttp:89b7f63e2e5b6c410266abc14f50fe52ea8d2d8a57260829e499b1cd9f0e61af',
'com.fasterxml.jackson.core:jackson-databind:835097bcdd11f5bc8a08378c70d4c8054dfa4b911691cc2752063c75534d198d',
- 'org.whispersystems:curve25519-android:d6a3ef3a70622af4c728b7fe5f8fdfc9e6cd39b1d39b2c77e7a2add9d876bc23',
- 'org.whispersystems:signal-protocol-java:d518d52eeb3c44210e0b6c687360848a87afbaee0bdf42e2a8dd9974d54fdb3a',
+ 'org.whispersystems:curve25519-android:bf6c34223d45d2f2813a8efcab9923caf99115115c760c9acea680bcb42d23c0',
+ 'org.whispersystems:signal-protocol-java:a835cd0609cf116a74651bd0aa748db9392bba48c2d2af787757b8a1b50d131c',
'com.squareup.okio:okio:5e1098bd3fdee4c3347f5ab815b40ba851e4ab1b348c5e49a5b0362f0ce6e978',
'com.fasterxml.jackson.core:jackson-annotations:0ca408c24202a7626ec8b861e99d85eca5e38b73311dd6dd12e3e9deecc3fe94',
'com.fasterxml.jackson.core:jackson-core:cbf4604784b4de226262845447a1ad3bb38a6728cebe86562e2c5afada8be2c0',
- 'org.whispersystems:curve25519-java:08cc3be52723e0fc4148e5e7002d51d6d7e495b2130022237f2d47b90af6ae0b',
+ 'org.whispersystems:curve25519-java:00f1d4919f759055f41f7853a3d475dc7c8decf0dbf045ae93414f8f23b066cc',
'com.android.support:support-v4:c62f0d025dafa86f423f48df9185b0d89496adbc5f6a9be5a7c394d84cf91423',
]
}
-
android {
compileSdkVersion 22
buildToolsVersion '23.0.2'
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 66ebac6b09..f01fbfece9 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -563,6 +563,7 @@
Your contact is running an old version of Signal, please ask them to update before verifying safety numbers.
+ Your contact is running a newer version of Signal with an incompatible QR code format. Please update to compare.
You\'re attempting to verify safety numbers with %1$s, but scanned %2$s instead.
The scanned QR code is not a correctly formatted safety number verification code. Please try scanning again.
Share safety numbers via...
@@ -937,7 +938,7 @@
Add members
- If you wish to verify the security of your end-to-end encryption with %s, compare the numbers above with the numbers on their device. Alternately, you can scan the code on their phone, or ask them to scan your code.
+ Learn more about verifying safety numbers.]]>
Tap to scan
@@ -1267,6 +1268,7 @@
Transport icon
+
diff --git a/src/org/thoughtcrime/securesms/VerifyIdentityActivity.java b/src/org/thoughtcrime/securesms/VerifyIdentityActivity.java
index 960d24343d..22284bc805 100644
--- a/src/org/thoughtcrime/securesms/VerifyIdentityActivity.java
+++ b/src/org/thoughtcrime/securesms/VerifyIdentityActivity.java
@@ -33,6 +33,8 @@ import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
+import android.text.Html;
+import android.text.method.LinkMovementMethod;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -66,7 +68,6 @@ import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.whispersystems.libsignal.IdentityKey;
import org.whispersystems.libsignal.fingerprint.Fingerprint;
-import org.whispersystems.libsignal.fingerprint.FingerprintIdentifierMismatchException;
import org.whispersystems.libsignal.fingerprint.FingerprintParsingException;
import org.whispersystems.libsignal.fingerprint.FingerprintVersionMismatchException;
import org.whispersystems.libsignal.fingerprint.NumericFingerprintGenerator;
@@ -313,10 +314,11 @@ public class VerifyIdentityActivity extends PassphraseRequiredActionBarActivity
}
} catch (FingerprintVersionMismatchException e) {
Log.w(TAG, e);
- Toast.makeText(getActivity(), R.string.VerifyIdentityActivity_your_contact_is_running_an_old_version_of_signal, Toast.LENGTH_LONG).show();
- } catch (FingerprintIdentifierMismatchException e) {
- Log.w(TAG, e);
- Toast.makeText(getActivity(), getActivity().getString(R.string.VerifyIdentityActivity_you_re_attempting_to_verify_safety_numbers_with, e.getRemoteIdentifier(), e.getScannedLocalIdentifier()), Toast.LENGTH_LONG).show();
+ if (e.getOurVersion() < e.getTheirVersion()) {
+ Toast.makeText(getActivity(), R.string.VerifyIdentityActivity_your_contact_is_running_a_newer_version_of_Signal, Toast.LENGTH_LONG).show();
+ } else {
+ Toast.makeText(getActivity(), R.string.VerifyIdentityActivity_your_contact_is_running_an_old_version_of_signal, Toast.LENGTH_LONG).show();
+ }
} catch (FingerprintParsingException e) {
Log.w(TAG, e);
Toast.makeText(getActivity(), R.string.VerifyIdentityActivity_the_scanned_qr_code_is_not_a_correctly_formatted_safety_number, Toast.LENGTH_LONG).show();
@@ -357,7 +359,8 @@ public class VerifyIdentityActivity extends PassphraseRequiredActionBarActivity
Bitmap qrCodeBitmap = QrCode.create(qrCodeString);
qrCode.setImageBitmap(qrCodeBitmap);
- description.setText(getActivity().getString(R.string.verify_display_fragment__scan_the_code_on_your_contact_s_phone_or_ask_them_to_scan_your_code_to_verify_that_your_messages_are_end_to_end_encrypted_you_can_alternately_compare_the_number_above, recipient.toShortString()));
+ description.setText(Html.fromHtml(String.format(getActivity().getString(R.string.verify_display_fragment__scan_the_code_on_your_contact_s_phone_or_ask_them_to_scan_your_code_to_verify_that_your_messages_are_end_to_end_encrypted_you_can_alternately_compare_the_number_above), recipient.toShortString())));
+ description.setMovementMethod(LinkMovementMethod.getInstance());
}
private Bitmap createVerifiedBitmap(int width, int height, @DrawableRes int id) {
diff --git a/src/org/thoughtcrime/securesms/crypto/storage/SignalProtocolStoreImpl.java b/src/org/thoughtcrime/securesms/crypto/storage/SignalProtocolStoreImpl.java
index 797bf4b029..b4b65c790f 100644
--- a/src/org/thoughtcrime/securesms/crypto/storage/SignalProtocolStoreImpl.java
+++ b/src/org/thoughtcrime/securesms/crypto/storage/SignalProtocolStoreImpl.java
@@ -2,16 +2,16 @@ package org.thoughtcrime.securesms.crypto.storage;
import android.content.Context;
-import org.whispersystems.libsignal.SignalProtocolAddress;
import org.whispersystems.libsignal.IdentityKey;
import org.whispersystems.libsignal.IdentityKeyPair;
import org.whispersystems.libsignal.InvalidKeyIdException;
-import org.whispersystems.libsignal.state.SignalProtocolStore;
+import org.whispersystems.libsignal.SignalProtocolAddress;
import org.whispersystems.libsignal.state.IdentityKeyStore;
import org.whispersystems.libsignal.state.PreKeyRecord;
import org.whispersystems.libsignal.state.PreKeyStore;
import org.whispersystems.libsignal.state.SessionRecord;
import org.whispersystems.libsignal.state.SessionStore;
+import org.whispersystems.libsignal.state.SignalProtocolStore;
import org.whispersystems.libsignal.state.SignedPreKeyRecord;
import org.whispersystems.libsignal.state.SignedPreKeyStore;
@@ -42,13 +42,13 @@ public class SignalProtocolStoreImpl implements SignalProtocolStore {
}
@Override
- public void saveIdentity(String number, IdentityKey identityKey) {
- identityKeyStore.saveIdentity(number, identityKey);
+ public void saveIdentity(SignalProtocolAddress address, IdentityKey identityKey) {
+ identityKeyStore.saveIdentity(address, identityKey);
}
@Override
- public boolean isTrustedIdentity(String number, IdentityKey identityKey) {
- return identityKeyStore.isTrustedIdentity(number, identityKey);
+ public boolean isTrustedIdentity(SignalProtocolAddress address, IdentityKey identityKey) {
+ return identityKeyStore.isTrustedIdentity(address, identityKey);
}
@Override
diff --git a/src/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java b/src/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java
index 63b9e5a5a8..2c12347c7d 100644
--- a/src/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java
+++ b/src/org/thoughtcrime/securesms/crypto/storage/TextSecureIdentityKeyStore.java
@@ -10,6 +10,7 @@ import org.thoughtcrime.securesms.recipients.RecipientFactory;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.whispersystems.libsignal.IdentityKey;
import org.whispersystems.libsignal.IdentityKeyPair;
+import org.whispersystems.libsignal.SignalProtocolAddress;
import org.whispersystems.libsignal.state.IdentityKeyStore;
public class TextSecureIdentityKeyStore implements IdentityKeyStore {
@@ -31,21 +32,21 @@ public class TextSecureIdentityKeyStore implements IdentityKeyStore {
}
@Override
- public void saveIdentity(String name, IdentityKey identityKey) {
- long recipientId = RecipientFactory.getRecipientsFromString(context, name, true).getPrimaryRecipient().getRecipientId();
+ public void saveIdentity(SignalProtocolAddress address, IdentityKey identityKey) {
+ long recipientId = RecipientFactory.getRecipientsFromString(context, address.getName(), true).getPrimaryRecipient().getRecipientId();
DatabaseFactory.getIdentityDatabase(context).saveIdentity(recipientId, identityKey);
}
@Override
- public boolean isTrustedIdentity(String name, IdentityKey identityKey) {
- long recipientId = RecipientFactory.getRecipientsFromString(context, name, true).getPrimaryRecipient().getRecipientId();
+ public boolean isTrustedIdentity(SignalProtocolAddress address, IdentityKey identityKey) {
+ long recipientId = RecipientFactory.getRecipientsFromString(context, address.getName(), true).getPrimaryRecipient().getRecipientId();
boolean trusted = DatabaseFactory.getIdentityDatabase(context)
.isValidIdentity(recipientId, identityKey);
if (trusted) {
return true;
} else if (!TextSecurePreferences.isBlockingIdentityUpdates(context)) {
- saveIdentity(name, identityKey);
+ saveIdentity(address, identityKey);
ApplicationContext.getInstance(context)
.getJobManager()