add override mechanism to ui
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user