communicate override state via api

This commit is contained in:
Vincent Breitmoser 2017-04-29 02:24:46 +02:00
parent 11f10cf85f
commit 3910c248cc
6 changed files with 47 additions and 11 deletions

View file

@ -21,6 +21,20 @@ public class DecryptVerifySecurityProblem implements Serializable {
signatureSecurityProblem = builder.signatureSecurityProblem; 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 { static class DecryptVerifySecurityProblemBuilder {
private KeySecurityProblem encryptionKeySecurityProblem; private KeySecurityProblem encryptionKeySecurityProblem;
private KeySecurityProblem signingKeySecurityProblem; private KeySecurityProblem signingKeySecurityProblem;

View file

@ -143,10 +143,12 @@ public class ApiPendingIntentFactory {
return createInternal(data, intent); 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 intent = new Intent(mContext, RemoteSecurityProblemDialogActivity.class);
intent.putExtra(RemoteSecurityProblemDialogActivity.EXTRA_PACKAGE_NAME, packageName); intent.putExtra(RemoteSecurityProblemDialogActivity.EXTRA_PACKAGE_NAME, packageName);
intent.putExtra(RemoteSecurityProblemDialogActivity.EXTRA_SECURITY_PROBLEM, securityProblem); intent.putExtra(RemoteSecurityProblemDialogActivity.EXTRA_SECURITY_PROBLEM, securityProblem);
intent.putExtra(RemoteSecurityProblemDialogActivity.EXTRA_SUPPORT_OVERRIDE, supportOverride);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//noinspection ResourceType, looks like lint is missing FLAG_IMMUTABLE //noinspection ResourceType, looks like lint is missing FLAG_IMMUTABLE

View file

@ -61,11 +61,13 @@ import org.sufficientlysecure.keychain.pgp.PgpSignEncryptData;
import org.sufficientlysecure.keychain.pgp.PgpSignEncryptInputParcel; import org.sufficientlysecure.keychain.pgp.PgpSignEncryptInputParcel;
import org.sufficientlysecure.keychain.pgp.PgpSignEncryptOperation; import org.sufficientlysecure.keychain.pgp.PgpSignEncryptOperation;
import org.sufficientlysecure.keychain.pgp.Progressable; import org.sufficientlysecure.keychain.pgp.Progressable;
import org.sufficientlysecure.keychain.pgp.SecurityProblem;
import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException; import org.sufficientlysecure.keychain.pgp.exception.PgpKeyNotFoundException;
import org.sufficientlysecure.keychain.provider.ApiDataAccessObject; import org.sufficientlysecure.keychain.provider.ApiDataAccessObject;
import org.sufficientlysecure.keychain.provider.KeyRepository; import org.sufficientlysecure.keychain.provider.KeyRepository;
import org.sufficientlysecure.keychain.provider.KeychainContract; import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings; 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.KeyIdResult;
import org.sufficientlysecure.keychain.remote.OpenPgpServiceKeyIdExtractor.KeyIdResultStatus; import org.sufficientlysecure.keychain.remote.OpenPgpServiceKeyIdExtractor.KeyIdResultStatus;
import org.sufficientlysecure.keychain.service.BackupKeyringParcel; import org.sufficientlysecure.keychain.service.BackupKeyringParcel;
@ -401,7 +403,7 @@ public class OpenPgpService extends Service {
processDecryptionResultForResultIntent(targetApiVersion, result, pgpResult.getDecryptionResult()); processDecryptionResultForResultIntent(targetApiVersion, result, pgpResult.getDecryptionResult());
processMetadataForResultIntent(result, pgpResult.getDecryptionMetadata()); processMetadataForResultIntent(result, pgpResult.getDecryptionMetadata());
processSignatureResultForResultIntent(targetApiVersion, data, result, pgpResult); processSignatureResultForResultIntent(targetApiVersion, data, result, pgpResult);
processSecurityProblemsPendingIntent(result, pgpResult); processSecurityProblemsPendingIntent(data, result, pgpResult);
result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS); result.putExtra(OpenPgpApi.RESULT_CODE, OpenPgpApi.RESULT_CODE_SUCCESS);
return result; 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(); DecryptVerifySecurityProblem securityProblem = decryptVerifyResult.getSecurityProblem();
if (securityProblem == null) { if (securityProblem == null) {
return; 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(); String packageName = mApiPermissionHelper.getCurrentCallingPackage();
result.putExtra(OpenPgpApi.RESULT_INSECURE_DETAIL_INTENT, result.putExtra(OpenPgpApi.RESULT_INSECURE_DETAIL_INTENT,
mApiPendingIntentFactory.createSecurityProblemIntent(packageName, securityProblem)); mApiPendingIntentFactory.createSecurityProblemIntent(packageName, securityProblem, supportOverride));
} }
private void processDecryptionResultForResultIntent(int targetApiVersion, Intent result, private void processDecryptionResultForResultIntent(int targetApiVersion, Intent result,

View file

@ -52,6 +52,7 @@ import org.sufficientlysecure.keychain.ui.widget.ToolableViewAnimator;
public class RemoteSecurityProblemDialogActivity extends FragmentActivity { public class RemoteSecurityProblemDialogActivity extends FragmentActivity {
public static final String EXTRA_PACKAGE_NAME = "package_name"; public static final String EXTRA_PACKAGE_NAME = "package_name";
public static final String EXTRA_SECURITY_PROBLEM = "security_problem"; public static final String EXTRA_SECURITY_PROBLEM = "security_problem";
public static final String EXTRA_SUPPORT_OVERRIDE = "support_override";
private SecurityProblemPresenter presenter; private SecurityProblemPresenter presenter;
@ -76,8 +77,9 @@ public class RemoteSecurityProblemDialogActivity extends FragmentActivity {
Intent intent = getIntent(); Intent intent = getIntent();
String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME); String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME);
Serializable keySecurityProblem = intent.getSerializableExtra(EXTRA_SECURITY_PROBLEM); 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 { public static class RemoteRegisterDialogFragment extends DialogFragment {

View file

@ -40,6 +40,7 @@ class SecurityProblemPresenter {
private String packageName; private String packageName;
private Serializable securityProblem; private Serializable securityProblem;
private boolean supportOverride;
SecurityProblemPresenter(Context context) { SecurityProblemPresenter(Context context) {
@ -52,9 +53,10 @@ class SecurityProblemPresenter {
this.view = view; this.view = view;
} }
void setupFromIntentData(String packageName, Serializable securityProblem) { void setupFromIntentData(String packageName, Serializable securityProblem, boolean supportOverride) {
this.packageName = packageName; this.packageName = packageName;
this.securityProblem = securityProblem; this.securityProblem = securityProblem;
this.supportOverride = supportOverride;
refreshSecurityProblemDisplay(); refreshSecurityProblemDisplay();
refreshPackageInfo(); refreshPackageInfo();
@ -141,10 +143,12 @@ class SecurityProblemPresenter {
} }
private void refreshOverrideStatusView() { private void refreshOverrideStatusView() {
if (overriddenWarningsRepository.isWarningOverridden(securityProblemIdentifier)) { if (supportOverride) {
view.showOverrideUndoButton(); if (overriddenWarningsRepository.isWarningOverridden(securityProblemIdentifier)) {
} else { view.showOverrideUndoButton();
view.showOverrideButton(); } else {
view.showOverrideButton();
}
} }
} }

@ -1 +1 @@
Subproject commit d19cfacdeed6b4e9a9aed5ecae978b6c9268dd05 Subproject commit 395fe837a23fc33c7a4abbb0625cb584c5dbb176