From 9cce0d8e15857272e21865e1e83c35c1706e540d Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Wed, 24 Jan 2018 12:26:47 -0200 Subject: [PATCH] Show an error fragment when an unsupported QR code is scanned --- .../api/UnsupportedVersionException.java | 9 +++ .../keyagreement/PayloadParserImpl.java | 5 +- .../briar/android/fragment/BaseFragment.java | 2 +- .../briar/android/fragment/ErrorFragment.java | 65 +++++++++++++++++++ .../keyagreement/ShowQrCodeFragment.java | 10 ++- .../res/drawable/alerts_and_states_error.xml | 12 ++-- .../src/main/res/layout/fragment_error.xml | 51 +++++++++++++++ briar-android/src/main/res/values/strings.xml | 2 + 8 files changed, 149 insertions(+), 7 deletions(-) create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/UnsupportedVersionException.java create mode 100644 briar-android/src/main/java/org/briarproject/briar/android/fragment/ErrorFragment.java create mode 100644 briar-android/src/main/res/layout/fragment_error.xml diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/UnsupportedVersionException.java b/bramble-api/src/main/java/org/briarproject/bramble/api/UnsupportedVersionException.java new file mode 100644 index 000000000..f7cf29856 --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/UnsupportedVersionException.java @@ -0,0 +1,9 @@ +package org.briarproject.bramble.api; + +import java.io.IOException; + +/** + * An exception that indicates an unrecoverable version mismatch. + */ +public class UnsupportedVersionException extends IOException { +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/keyagreement/PayloadParserImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/keyagreement/PayloadParserImpl.java index ecf519e09..334a46f31 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/keyagreement/PayloadParserImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/keyagreement/PayloadParserImpl.java @@ -1,6 +1,7 @@ package org.briarproject.bramble.keyagreement; import org.briarproject.bramble.api.FormatException; +import org.briarproject.bramble.api.UnsupportedVersionException; import org.briarproject.bramble.api.data.BdfList; import org.briarproject.bramble.api.data.BdfReader; import org.briarproject.bramble.api.data.BdfReaderFactory; @@ -46,7 +47,9 @@ class PayloadParserImpl implements PayloadParser { if (!r.eof()) throw new FormatException(); // First element: the protocol version long protocolVersion = payload.getLong(0); - if (protocolVersion != PROTOCOL_VERSION) throw new FormatException(); + if (protocolVersion != PROTOCOL_VERSION) { + throw new UnsupportedVersionException(); + } // Second element: the public key commitment byte[] commitment = payload.getRaw(1); if (commitment.length != COMMIT_LENGTH) throw new FormatException(); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/fragment/BaseFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/fragment/BaseFragment.java index 0fa3ee7b6..f45d7c54f 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/fragment/BaseFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/fragment/BaseFragment.java @@ -30,7 +30,7 @@ public abstract class BaseFragment extends Fragment } @Override - public void onCreate(Bundle savedInstanceState) { + public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // allow for "up" button to act as back button diff --git a/briar-android/src/main/java/org/briarproject/briar/android/fragment/ErrorFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/fragment/ErrorFragment.java new file mode 100644 index 000000000..81654e0aa --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/fragment/ErrorFragment.java @@ -0,0 +1,65 @@ +package org.briarproject.briar.android.fragment; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; +import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; +import org.briarproject.briar.R; +import org.briarproject.briar.android.activity.ActivityComponent; + + +@MethodsNotNullByDefault +@ParametersNotNullByDefault +public class ErrorFragment extends BaseFragment { + + private static final String TAG = ErrorFragment.class.getSimpleName(); + + private static final String ERROR_MSG = "errorMessage"; + + public static ErrorFragment newInstance(String message) { + ErrorFragment f = new ErrorFragment(); + Bundle args = new Bundle(); + args.putString(ERROR_MSG, message); + f.setArguments(args); + return f; + } + + private String errorMessage; + + @Override + public String getUniqueTag() { + return TAG; + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Bundle args = getArguments(); + if (args == null) throw new AssertionError(); + errorMessage = args.getString(ERROR_MSG); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View v = inflater + .inflate(R.layout.fragment_error, container, false); + TextView msg = v.findViewById(R.id.errorMessage); + msg.setText(errorMessage); + return v; + } + + @Override + public void injectFragment(ActivityComponent component) { + // not necessary + } + +} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ShowQrCodeFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ShowQrCodeFragment.java index 1ef7dcd23..5649354bd 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ShowQrCodeFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/keyagreement/ShowQrCodeFragment.java @@ -17,6 +17,7 @@ import android.widget.Toast; import com.google.zxing.Result; +import org.briarproject.bramble.api.UnsupportedVersionException; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.keyagreement.KeyAgreementTask; @@ -35,6 +36,7 @@ import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.fragment.BaseEventFragment; +import org.briarproject.briar.android.fragment.ErrorFragment; import java.io.IOException; import java.util.concurrent.Executor; @@ -200,8 +202,14 @@ public class ShowQrCodeFragment extends BaseEventFragment statusView.setVisibility(VISIBLE); status.setText(R.string.connecting_to_device); task.connectAndRunProtocol(remotePayload); + } catch (UnsupportedVersionException e) { + reset(); + String msg = getString(R.string.qr_code_unsupported, + getString(R.string.app_name)); + showNextFragment(ErrorFragment.newInstance(msg)); } catch (IOException | IllegalArgumentException e) { - // TODO show failure + if (LOG.isLoggable(WARNING)) LOG.log(WARNING, "QR Code Invalid", e); + reset(); Toast.makeText(getActivity(), R.string.qr_code_invalid, LENGTH_LONG).show(); } diff --git a/briar-android/src/main/res/drawable/alerts_and_states_error.xml b/briar-android/src/main/res/drawable/alerts_and_states_error.xml index b84f896b6..02056c85c 100644 --- a/briar-android/src/main/res/drawable/alerts_and_states_error.xml +++ b/briar-android/src/main/res/drawable/alerts_and_states_error.xml @@ -1,5 +1,9 @@ - - + + diff --git a/briar-android/src/main/res/layout/fragment_error.xml b/briar-android/src/main/res/layout/fragment_error.xml new file mode 100644 index 000000000..4870bf8ee --- /dev/null +++ b/briar-android/src/main/res/layout/fragment_error.xml @@ -0,0 +1,51 @@ + + + + + + + + + + diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index a990a022f..90af1aaab 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -102,6 +102,7 @@ Show Help Dialog Fix Help + Sorry It seems that you are new here and have no contacts yet.\n\nTap the + icon at the top and follow the instructions to add some friends to your list.\n\nPlease remember: You can only add new contacts face-to-face to prevent anyone from impersonating you or reading your messages in the future. @@ -125,6 +126,7 @@ Contact %s already exists Contact exchange failed The QR code is invalid + The QR code you are trying to scan belongs to an old version of %s which is no longer supported.\n\nPlease ensure that both of you are running the latest version and then try again. Camera error Connecting to device\u2026 Authenticating with device\u2026