diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/SecurityProblem.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/SecurityProblem.java index e2674e02a..818767004 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/SecurityProblem.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/SecurityProblem.java @@ -30,7 +30,7 @@ import org.bouncycastle.util.encoders.Base64; public abstract class SecurityProblem implements Serializable { - String getIdentifier() { + public String getIdentifier() { if (!isIdentifiable()) { return null; } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteSecurityProblemDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteSecurityProblemDialogActivity.java index 843ad24e8..e2163d242 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteSecurityProblemDialogActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/RemoteSecurityProblemDialogActivity.java @@ -84,7 +84,9 @@ public class RemoteSecurityProblemDialogActivity extends FragmentActivity { public static final int SECONDARY_CHILD_NONE = 0; public static final int SECONDARY_CHILD_RECOMMENDATION = 1; public static final int SECONDARY_CHILD_OVERRIDE = 2; - public static final int SECONDARY_CHILD_OVERRIDE_OK = 3; + public static final int BUTTON_BAR_REGULAR = 0; + public static final int BUTTON_BAR_OVERRIDE = 1; + private SecurityProblemPresenter presenter; private RemoteSecurityProblemView mvpView; @@ -92,6 +94,8 @@ public class RemoteSecurityProblemDialogActivity extends FragmentActivity { private Button buttonViewKey; private Button buttonOverride; private Button buttonOverrideUndo; + private Button buttonOverrideBack; + private Button buttonOverrideConfirm; @NonNull @Override @@ -109,6 +113,8 @@ public class RemoteSecurityProblemDialogActivity extends FragmentActivity { buttonViewKey = (Button) view.findViewById(R.id.button_view_key); buttonOverride = (Button) view.findViewById(R.id.button_override); buttonOverrideUndo = (Button) view.findViewById(R.id.button_override_undo); + buttonOverrideBack = (Button) view.findViewById(R.id.button_override_back); + buttonOverrideConfirm = (Button) view.findViewById(R.id.button_override_confirm); setupListenersForPresenter(); mvpView = createMvpView(view); @@ -152,6 +158,8 @@ public class RemoteSecurityProblemDialogActivity extends FragmentActivity { final TextView overrideText = (TextView) insecureWarningLayout.findViewById(R.id.dialog_insecure_override_text); final ToolableViewAnimator secondaryLayoutAnimator = (ToolableViewAnimator) insecureWarningLayout.findViewById(R.id.dialog_insecure_secondary_layout); + final ToolableViewAnimator buttonBarAnimator = + (ToolableViewAnimator) view.findViewById(R.id.dialog_insecure_button_bar); return new RemoteSecurityProblemView() { private boolean layoutInitialized = false; @@ -167,6 +175,17 @@ public class RemoteSecurityProblemDialogActivity extends FragmentActivity { activity.finish(); } + @Override + public void finishAsSuppressed() { + FragmentActivity activity = getActivity(); + if (activity == null) { + return; + } + + activity.setResult(RESULT_OK); + activity.finish(); + } + @Override public void setTitleClientIcon(Drawable drawable) { iconClientApp.setImageDrawable(drawable); @@ -182,12 +201,14 @@ public class RemoteSecurityProblemDialogActivity extends FragmentActivity { private void showGeneric(@StringRes int explanationStringRes) { explanationText.setText(explanationStringRes); secondaryLayoutAnimator.setDisplayedChild(SECONDARY_CHILD_NONE, layoutInitialized); + buttonBarAnimator.setDisplayedChild(BUTTON_BAR_REGULAR, layoutInitialized); layoutInitialized = true; } private void showGeneric(String explanationString) { explanationText.setText(explanationString); secondaryLayoutAnimator.setDisplayedChild(SECONDARY_CHILD_NONE, layoutInitialized); + buttonBarAnimator.setDisplayedChild(BUTTON_BAR_REGULAR, layoutInitialized); layoutInitialized = true; } @@ -196,6 +217,7 @@ public class RemoteSecurityProblemDialogActivity extends FragmentActivity { explanationText.setText(explanationStringRes); recommendText.setText(recommendationStringRes); secondaryLayoutAnimator.setDisplayedChild(SECONDARY_CHILD_RECOMMENDATION, layoutInitialized); + buttonBarAnimator.setDisplayedChild(BUTTON_BAR_REGULAR, layoutInitialized); layoutInitialized = true; } @@ -204,6 +226,7 @@ public class RemoteSecurityProblemDialogActivity extends FragmentActivity { explanationText.setText(explanationString); recommendText.setText(recommendationStringRes); secondaryLayoutAnimator.setDisplayedChild(SECONDARY_CHILD_RECOMMENDATION, layoutInitialized); + buttonBarAnimator.setDisplayedChild(BUTTON_BAR_REGULAR, layoutInitialized); layoutInitialized = true; } @@ -267,12 +290,10 @@ public class RemoteSecurityProblemDialogActivity extends FragmentActivity { @Override public void showOverrideMessage(int countdown) { secondaryLayoutAnimator.setDisplayedChild(SECONDARY_CHILD_OVERRIDE, true); + buttonBarAnimator.setDisplayedChild(BUTTON_BAR_OVERRIDE, true); overrideText.setText(getString(R.string.dialog_insecure_override, countdown)); - } - - @Override - public void showOverrideOk() { - secondaryLayoutAnimator.setDisplayedChild(SECONDARY_CHILD_OVERRIDE_OK, true); + buttonOverrideConfirm.setText( + getString(R.string.dialog_insecure_button_override_confirm, countdown)); } @Override @@ -319,6 +340,18 @@ public class RemoteSecurityProblemDialogActivity extends FragmentActivity { presenter.onClickOverrideUndo(); } }); + buttonOverrideBack.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + presenter.onClickOverrideBack(); + } + }); + buttonOverrideConfirm.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + presenter.onClickOverrideConfirm(); + } + }); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SecurityProblemPresenter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SecurityProblemPresenter.java index af4d732a9..e06a0311c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SecurityProblemPresenter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SecurityProblemPresenter.java @@ -20,6 +20,7 @@ import org.sufficientlysecure.keychain.pgp.SecurityProblem.NotWhitelistedCurve; import org.sufficientlysecure.keychain.pgp.SecurityProblem.EncryptionAlgorithmProblem; import org.sufficientlysecure.keychain.pgp.SecurityProblem.UnidentifiedKeyProblem; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; +import org.sufficientlysecure.keychain.provider.OverriddenWarningsRepository; import org.sufficientlysecure.keychain.ui.ViewKeyActivity; @@ -29,11 +30,14 @@ class SecurityProblemPresenter { private final Context context; private final PackageManager packageManager; + private final OverriddenWarningsRepository overriddenWarningsRepository; private RemoteSecurityProblemView view; private Long viewKeyMasterKeyId; private int overrideCounter; + private String securityProblemIdentifier; + private String packageName; private Serializable securityProblem; @@ -41,6 +45,7 @@ class SecurityProblemPresenter { SecurityProblemPresenter(Context context) { this.context = context; packageManager = context.getPackageManager(); + overriddenWarningsRepository = OverriddenWarningsRepository.createOverriddenWarningsRepository(context); } public void setView(RemoteSecurityProblemView view) { @@ -79,10 +84,6 @@ class SecurityProblemPresenter { viewKeyMasterKeyId = keySecurityProblem.masterKeyId; view.showViewKeyButton(); - if (keySecurityProblem.isIdentifiable()) { - view.showOverrideButton(); - } - if (keySecurityProblem instanceof InsecureBitStrength) { InsecureBitStrength problem = (InsecureBitStrength) keySecurityProblem; view.showLayoutEncryptInsecureBitsize(problem.algorithm, problem.bitStrength); @@ -94,6 +95,11 @@ class SecurityProblemPresenter { } else { throw new IllegalArgumentException("Unhandled key security problem type!"); } + + if (keySecurityProblem.isIdentifiable()) { + securityProblemIdentifier = keySecurityProblem.getIdentifier(); + refreshOverrideStatusView(); + } } private void setupFromSigningKeySecurityProblem(KeySecurityProblem keySecurityProblem) { @@ -111,6 +117,11 @@ class SecurityProblemPresenter { } else { throw new IllegalArgumentException("Unhandled key security problem type!"); } + + if (keySecurityProblem.isIdentifiable()) { + securityProblemIdentifier = keySecurityProblem.getIdentifier(); + refreshOverrideStatusView(); + } } private void setupFromEncryptionAlgorithmSecurityProblem(EncryptionAlgorithmProblem securityProblem) { @@ -122,6 +133,19 @@ class SecurityProblemPresenter { } else { throw new IllegalArgumentException("Unhandled symmetric algorithm problem type!"); } + + if (securityProblem.isIdentifiable()) { + securityProblemIdentifier = securityProblem.getIdentifier(); + refreshOverrideStatusView(); + } + } + + private void refreshOverrideStatusView() { + if (overriddenWarningsRepository.isWarningOverridden(securityProblemIdentifier)) { + view.showOverrideUndoButton(); + } else { + view.showOverrideButton(); + } } private void setupFromSignatureSecurityProblem(InsecureSigningAlgorithm signatureSecurityProblem) { @@ -147,11 +171,16 @@ class SecurityProblemPresenter { overrideCounter++; view.showOverrideMessage(overrideCountLeft); } else { - view.showOverrideOk(); - view.showOverrideUndoButton(); + overriddenWarningsRepository.putOverride(securityProblemIdentifier); + view.finishAsSuppressed(); } } + private void resetOverrideStatus() { + overrideCounter = 0; + overriddenWarningsRepository.deleteOverride(securityProblemIdentifier); + } + void onClickGotIt() { view.finishAsCancelled(); } @@ -167,16 +196,26 @@ class SecurityProblemPresenter { } void onClickOverrideUndo() { - overrideCounter = 0; + resetOverrideStatus(); refreshSecurityProblemDisplay(); } + void onClickOverrideBack() { + resetOverrideStatus(); + refreshSecurityProblemDisplay(); + } + + void onClickOverrideConfirm() { + incrementOverrideAndDisplayOrTrigger(); + } + void onCancel() { view.finishAsCancelled(); } interface RemoteSecurityProblemView { void finishAsCancelled(); + void finishAsSuppressed(); void setTitleClientIcon(Drawable drawable); void showLayoutEncryptInsecureBitsize(int algorithmId, int bitStrength); @@ -192,7 +231,6 @@ class SecurityProblemPresenter { void showLayoutInsecureHashAlgorithm(int hashAlgorithm); void showOverrideMessage(int countdown); - void showOverrideOk(); void showViewKeyButton(); void showOverrideButton(); diff --git a/OpenKeychain/src/main/res/layout/dialog_insecure_generic.xml b/OpenKeychain/src/main/res/layout/dialog_insecure_generic.xml index f0f943be9..94e45f8f5 100644 --- a/OpenKeychain/src/main/res/layout/dialog_insecure_generic.xml +++ b/OpenKeychain/src/main/res/layout/dialog_insecure_generic.xml @@ -30,7 +30,7 @@ android:inAnimation="@anim/fade_in" android:outAnimation="@anim/fade_out" android:measureAllChildren="true" - custom:initialView="3"> + custom:initialView="1"> - - - - - - - - diff --git a/OpenKeychain/src/main/res/layout/remote_security_issue_dialog.xml b/OpenKeychain/src/main/res/layout/remote_security_issue_dialog.xml index 8caa87f17..9b81be222 100644 --- a/OpenKeychain/src/main/res/layout/remote_security_issue_dialog.xml +++ b/OpenKeychain/src/main/res/layout/remote_security_issue_dialog.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + xmlns:custom="http://schemas.android.com/apk/res-auto" android:orientation="vertical" tools:layout_marginTop="24dp" > @@ -71,55 +72,94 @@ - + custom:initialView="0"> -