From 3910c248ccc141a27c01c2cce5507ed85ab2dafc Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Sat, 29 Apr 2017 02:24:46 +0200 Subject: [PATCH] communicate override state via api --- .../pgp/DecryptVerifySecurityProblem.java | 14 +++++++++++++ .../remote/ApiPendingIntentFactory.java | 4 +++- .../keychain/remote/OpenPgpService.java | 20 ++++++++++++++++--- .../RemoteSecurityProblemDialogActivity.java | 4 +++- .../remote/ui/SecurityProblemPresenter.java | 14 ++++++++----- extern/openpgp-api-lib | 2 +- 6 files changed, 47 insertions(+), 11 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/DecryptVerifySecurityProblem.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/DecryptVerifySecurityProblem.java index 36b90b93f..9d5a1f11b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/DecryptVerifySecurityProblem.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/DecryptVerifySecurityProblem.java @@ -21,6 +21,20 @@ public class DecryptVerifySecurityProblem implements Serializable { signatureSecurityProblem = builder.signatureSecurityProblem; } + public SecurityProblem getPrioritySecurityProblem() { + if (encryptionKeySecurityProblem != null) { + return encryptionKeySecurityProblem; + } else if (signingKeySecurityProblem != null) { + return signingKeySecurityProblem; + } else if (symmetricSecurityProblem != null) { + return symmetricSecurityProblem; + } else if (signatureSecurityProblem != null) { + return signatureSecurityProblem; + } else { + throw new IllegalStateException("No security problem?"); + } + } + static class DecryptVerifySecurityProblemBuilder { private KeySecurityProblem encryptionKeySecurityProblem; private KeySecurityProblem signingKeySecurityProblem; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ApiPendingIntentFactory.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ApiPendingIntentFactory.java index a6a93e404..ea26384c3 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ApiPendingIntentFactory.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ApiPendingIntentFactory.java @@ -143,10 +143,12 @@ public class ApiPendingIntentFactory { return createInternal(data, intent); } - PendingIntent createSecurityProblemIntent(String packageName, DecryptVerifySecurityProblem securityProblem) { + PendingIntent createSecurityProblemIntent(String packageName, DecryptVerifySecurityProblem securityProblem, + boolean supportOverride) { Intent intent = new Intent(mContext, RemoteSecurityProblemDialogActivity.class); intent.putExtra(RemoteSecurityProblemDialogActivity.EXTRA_PACKAGE_NAME, packageName); intent.putExtra(RemoteSecurityProblemDialogActivity.EXTRA_SECURITY_PROBLEM, securityProblem); + intent.putExtra(RemoteSecurityProblemDialogActivity.EXTRA_SUPPORT_OVERRIDE, supportOverride); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { //noinspection ResourceType, looks like lint is missing FLAG_IMMUTABLE diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java index e634be9b6..1f788a6ec 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/OpenPgpService.java @@ -61,11 +61,13 @@ import org.sufficientlysecure.keychain.pgp.PgpSignEncryptData; import org.sufficientlysecure.keychain.pgp.PgpSignEncryptInputParcel; import org.sufficientlysecure.keychain.pgp.PgpSignEncryptOperation; import org.sufficientlysecure.keychain.pgp.Progressable; +import org.sufficientlysecure.keychain.pgp.SecurityProblem; import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException; import org.sufficientlysecure.keychain.provider.ApiDataAccessObject; import org.sufficientlysecure.keychain.provider.KeyRepository; import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; +import org.sufficientlysecure.keychain.provider.OverriddenWarningsRepository; import org.sufficientlysecure.keychain.remote.OpenPgpServiceKeyIdExtractor.KeyIdResult; import org.sufficientlysecure.keychain.remote.OpenPgpServiceKeyIdExtractor.KeyIdResultStatus; import org.sufficientlysecure.keychain.service.BackupKeyringParcel; @@ -401,7 +403,7 @@ public class OpenPgpService extends Service { processDecryptionResultForResultIntent(targetApiVersion, result, pgpResult.getDecryptionResult()); processMetadataForResultIntent(result, pgpResult.getDecryptionMetadata()); processSignatureResultForResultIntent(targetApiVersion, data, result, pgpResult); - processSecurityProblemsPendingIntent(result, pgpResult); + processSecurityProblemsPendingIntent(data, result, pgpResult); result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS); return result; @@ -429,15 +431,27 @@ public class OpenPgpService extends Service { } } - private void processSecurityProblemsPendingIntent(Intent result, DecryptVerifyResult decryptVerifyResult) { + private void processSecurityProblemsPendingIntent(Intent data, Intent result, + DecryptVerifyResult decryptVerifyResult) { DecryptVerifySecurityProblem securityProblem = decryptVerifyResult.getSecurityProblem(); if (securityProblem == null) { return; } + boolean supportOverride = data.getBooleanExtra(OpenPgpApi.EXTRA_SUPPORT_OVERRIDE_CRYPTO_WARNING, false); + if (supportOverride) { + SecurityProblem prioritySecurityProblem = securityProblem.getPrioritySecurityProblem(); + if (prioritySecurityProblem.isIdentifiable()) { + String identifier = prioritySecurityProblem.getIdentifier(); + boolean isOverridden = OverriddenWarningsRepository.createOverriddenWarningsRepository(this) + .isWarningOverridden(identifier); + result.putExtra(OpenPgpApi.RESULT_OVERRIDE_CRYPTO_WARNING, isOverridden); + } + } + String packageName = mApiPermissionHelper.getCurrentCallingPackage(); result.putExtra(OpenPgpApi.RESULT_INSECURE_DETAIL_INTENT, - mApiPendingIntentFactory.createSecurityProblemIntent(packageName, securityProblem)); + mApiPendingIntentFactory.createSecurityProblemIntent(packageName, securityProblem, supportOverride)); } private void processDecryptionResultForResultIntent(int targetApiVersion, Intent result, 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 e2163d242..7ab30a20f 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 @@ -52,6 +52,7 @@ import org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator; public class RemoteSecurityProblemDialogActivity extends FragmentActivity { public static final String EXTRA_PACKAGE_NAME = "package_name"; public static final String EXTRA_SECURITY_PROBLEM = "security_problem"; + public static final String EXTRA_SUPPORT_OVERRIDE = "support_override"; private SecurityProblemPresenter presenter; @@ -76,8 +77,9 @@ public class RemoteSecurityProblemDialogActivity extends FragmentActivity { Intent intent = getIntent(); String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME); Serializable keySecurityProblem = intent.getSerializableExtra(EXTRA_SECURITY_PROBLEM); + boolean supportOverride = intent.getBooleanExtra(EXTRA_SUPPORT_OVERRIDE, false); - presenter.setupFromIntentData(packageName, keySecurityProblem); + presenter.setupFromIntentData(packageName, keySecurityProblem, supportOverride); } public static class RemoteRegisterDialogFragment extends DialogFragment { 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 e06a0311c..b325020e2 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 @@ -40,6 +40,7 @@ class SecurityProblemPresenter { private String packageName; private Serializable securityProblem; + private boolean supportOverride; SecurityProblemPresenter(Context context) { @@ -52,9 +53,10 @@ class SecurityProblemPresenter { this.view = view; } - void setupFromIntentData(String packageName, Serializable securityProblem) { + void setupFromIntentData(String packageName, Serializable securityProblem, boolean supportOverride) { this.packageName = packageName; this.securityProblem = securityProblem; + this.supportOverride = supportOverride; refreshSecurityProblemDisplay(); refreshPackageInfo(); @@ -141,10 +143,12 @@ class SecurityProblemPresenter { } private void refreshOverrideStatusView() { - if (overriddenWarningsRepository.isWarningOverridden(securityProblemIdentifier)) { - view.showOverrideUndoButton(); - } else { - view.showOverrideButton(); + if (supportOverride) { + if (overriddenWarningsRepository.isWarningOverridden(securityProblemIdentifier)) { + view.showOverrideUndoButton(); + } else { + view.showOverrideButton(); + } } } diff --git a/extern/openpgp-api-lib b/extern/openpgp-api-lib index d19cfacde..395fe837a 160000 --- a/extern/openpgp-api-lib +++ b/extern/openpgp-api-lib @@ -1 +1 @@ -Subproject commit d19cfacdeed6b4e9a9aed5ecae978b6c9268dd05 +Subproject commit 395fe837a23fc33c7a4abbb0625cb584c5dbb176