From cd7865342ec7b96cf5a70de2c8fd021d8951cf4f Mon Sep 17 00:00:00 2001
From: bontric <benjohnwie@gmail.com>
Date: Mon, 10 Sep 2018 20:09:07 +0200
Subject: [PATCH] (WIP) Add error fragment when user uses wrong screen to pair
 mailbox/contact

---
 .../api/contact/ContactExchangeListener.java  |  7 +++++
 .../contact/ContactExchangeTaskImpl.java      | 29 +++++++++++++------
 .../keyagreement/ContactExchangeActivity.java |  7 +++++
 .../keyagreement/MailboxExchangeActivity.java |  9 ++++++
 briar-android/src/main/res/values/strings.xml |  2 ++
 .../keyagreement/MailboxExchangeActivity.java |  8 +++++
 .../src/main/res/values/strings.xml           |  1 +
 7 files changed, 54 insertions(+), 9 deletions(-)

diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactExchangeListener.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactExchangeListener.java
index 66a79c1e2..81b7320e6 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactExchangeListener.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactExchangeListener.java
@@ -13,6 +13,13 @@ public interface ContactExchangeListener {
 	 */
 	void duplicateContact(Author remoteAuthor);
 
+	/**
+	 * The exchange has failed because the contact type does not match the
+	 * selected contact exchange
+	 *
+	 */
+	void invalidContactTypeScanned();
+
 	/**
 	 * A general failure.
 	 */
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java
index fb71f9a77..4b61735d0 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java
@@ -45,6 +45,7 @@ import java.util.logging.Logger;
 
 import javax.inject.Inject;
 
+import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
 import static org.briarproject.bramble.api.contact.ContactType.CONTACT;
 import static org.briarproject.bramble.api.contact.ContactType.MAILBOX_OWNER;
@@ -163,11 +164,12 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
 			return;
 		}
 
+		// TODO/FIXME handle protocol version in headerkeys/ nonce
 		// Derive the header keys for the transport streams
 		SecretKey aliceHeaderKey = crypto.deriveKey(ALICE_KEY_LABEL,
-				masterSecret, new byte[] {protocolVersion});
+				masterSecret, new byte[] {1});
 		SecretKey bobHeaderKey = crypto.deriveKey(BOB_KEY_LABEL, masterSecret,
-				new byte[] {protocolVersion});
+				new byte[] {1});
 
 		// Create the readers
 		InputStream streamReader =
@@ -185,10 +187,8 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
 						.createRecordWriter(streamWriter.getOutputStream());
 
 		// Derive the nonces to be signed
-		byte[] aliceNonce = crypto.mac(ALICE_NONCE_LABEL, masterSecret,
-				new byte[] {protocolVersion});
-		byte[] bobNonce = crypto.mac(BOB_NONCE_LABEL, masterSecret,
-				new byte[] {protocolVersion});
+		byte[] aliceNonce = crypto.mac(ALICE_NONCE_LABEL, masterSecret, new byte[] {1});
+		byte[] bobNonce = crypto.mac(BOB_NONCE_LABEL, masterSecret, new byte[] {1});
 		byte[] localNonce = alice ? aliceNonce : bobNonce;
 		byte[] remoteNonce = alice ? bobNonce : aliceNonce;
 
@@ -218,6 +218,12 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
 			} catch (EOFException expected) {
 				LOG.info("End of stream");
 			}
+		} catch (WrongExchangeUsedException e) {
+			if (LOG.isLoggable(INFO))
+				LOG.info("Used wrong contact exchange screen");
+			listener.invalidContactTypeScanned();
+			tryToClose(conn);
+			return;
 		} catch (IOException e) {
 			logException(LOG, WARNING, e);
 			listener.contactExchangeFailed();
@@ -299,12 +305,14 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
 	}
 
 	private ContactInfo receiveContactInfo(RecordReader recordReader)
-			throws IOException {
+			throws IOException, WrongExchangeUsedException {
 		Record record;
 		do {
 			record = recordReader.readRecord();
+			// Note: This can currently only occur if the wrong exchange
+			// is used but may change in future
 			if (record.getProtocolVersion() != protocolVersion)
-				throw new FormatException();
+				throw new WrongExchangeUsedException();
 		} while (record.getRecordType() != CONTACT_INFO);
 		LOG.info("Received contact info");
 		BdfList payload = clientHelper.toList(record.getPayload());
@@ -325,7 +333,7 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
 			ContactType type =
 					ContactType.fromValue(payload.getLong(4).intValue());
 			if (type != remoteType)
-				throw new FormatException();
+				throw new WrongExchangeUsedException();
 		}
 		return new ContactInfo(author, properties, signature, timestamp,
 				remoteType);
@@ -377,4 +385,7 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
 			logException(LOG, WARNING, e);
 		}
 	}
+
+	private class WrongExchangeUsedException extends Throwable {
+	}
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ContactExchangeActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ContactExchangeActivity.java
index 2a50b55a3..408d30e08 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ContactExchangeActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ContactExchangeActivity.java
@@ -95,6 +95,13 @@ public class ContactExchangeActivity extends KeyAgreementActivity implements
 		});
 	}
 
+	@Override
+	public void invalidContactTypeScanned() {
+		runOnUiThreadUnlessDestroyed(() ->
+				showErrorFragment(
+						R.string.should_scan_mailbox));
+	}
+
 	@Override
 	public void contactExchangeFailed() {
 		runOnUiThreadUnlessDestroyed(() -> {
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/MailboxExchangeActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/MailboxExchangeActivity.java
index 638c11017..4978d306c 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/MailboxExchangeActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/MailboxExchangeActivity.java
@@ -6,6 +6,7 @@ import android.widget.Toast;
 
 import org.briarproject.bramble.api.contact.ContactExchangeListener;
 import org.briarproject.bramble.api.contact.ContactExchangeTask;
+import org.briarproject.bramble.api.contact.ContactType;
 import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.identity.Author;
 import org.briarproject.bramble.api.identity.IdentityManager;
@@ -92,6 +93,14 @@ public class MailboxExchangeActivity extends KeyAgreementActivity implements
 		});
 	}
 
+	@Override
+	public void invalidContactTypeScanned() {
+		runOnUiThreadUnlessDestroyed(() ->
+				showErrorFragment(
+						R.string.should_scan_contact));
+	}
+
+
 	@Override
 	public void contactExchangeFailed() {
 		runOnUiThreadUnlessDestroyed(() -> {
diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml
index bda751e60..681c93e2b 100644
--- a/briar-android/src/main/res/values/strings.xml
+++ b/briar-android/src/main/res/values/strings.xml
@@ -484,4 +484,6 @@
 	<string name="mailbox_paired">Successfully paired with mailbox</string>
 	<string name="mailbox_already_paired">Already paired with this mailbox</string>
 	<string name="mailbox_info">Show mailbox</string>
+	<string name="should_scan_contact">To add a contact press the \"+\" symbol on the home screen</string>
+	<string name="should_scan_mailbox">To add a mailbox press the \"+\" symbol in the mailbox menu option in the briar app</string>
 </resources>
diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/keyagreement/MailboxExchangeActivity.java b/mailbox-android/src/main/java/org/briarproject/mailbox/android/keyagreement/MailboxExchangeActivity.java
index add34227b..600af9da3 100644
--- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/keyagreement/MailboxExchangeActivity.java
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/keyagreement/MailboxExchangeActivity.java
@@ -6,6 +6,7 @@ import android.widget.Toast;
 
 import org.briarproject.bramble.api.contact.ContactExchangeListener;
 import org.briarproject.bramble.api.contact.ContactExchangeTask;
+import org.briarproject.bramble.api.contact.ContactType;
 import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.identity.Author;
 import org.briarproject.bramble.api.identity.IdentityManager;
@@ -92,6 +93,13 @@ public class MailboxExchangeActivity extends KeyAgreementActivity implements
 		});
 	}
 
+	@Override
+	public void invalidContactTypeScanned() {
+		runOnUiThreadUnlessDestroyed(() ->
+				showErrorFragment(
+						R.string.should_scan_mailbox));
+	}
+
 	@Override
 	public void contactExchangeFailed() {
 		runOnUiThreadUnlessDestroyed(() -> {
diff --git a/mailbox-android/src/main/res/values/strings.xml b/mailbox-android/src/main/res/values/strings.xml
index 7fa90ec95..9d2e17325 100644
--- a/mailbox-android/src/main/res/values/strings.xml
+++ b/mailbox-android/src/main/res/values/strings.xml
@@ -485,4 +485,5 @@
 	<string name="mailbox_already_paired">Your Mailbox is already paired with this Briar account</string>
 	<string name="mailbox_unpaired">not paired</string>
 	<string name="mailbox_setup_explanation">Brief explanation of what the mailbox is and does</string>
+	<string name="should_scan_mailbox">To add a mailbox press the \"+\" symbol in the mailbox menu option in the briar app</string>
 </resources>
-- 
GitLab