Set FLAG_SECURE on all dialogs

Fixes #2
pull/120/head
Alexander Bakker 7 years ago
parent 9dc1b954d4
commit fafb1ae8d0

@ -113,12 +113,12 @@ public class AuthActivity extends AegisActivity implements FingerprintUiHelper.C
} }
private void showError() { private void showError() {
AlertDialog.Builder builder = new AlertDialog.Builder(this); Dialogs.showSecureDialog(new AlertDialog.Builder(this)
builder.setTitle(getString(R.string.unlock_vault_error)); .setTitle(getString(R.string.unlock_vault_error))
builder.setMessage(getString(R.string.unlock_vault_error_description)); .setMessage(getString(R.string.unlock_vault_error_description))
builder.setCancelable(false); .setCancelable(false)
builder.setPositiveButton(android.R.string.ok, null); .setPositiveButton(android.R.string.ok, null)
builder.create().show(); .create());
} }
private <T extends Slot> void trySlots(Class<T> type, Object obj) { private <T extends Slot> void trySlots(Class<T> type, Object obj) {

@ -1,11 +1,13 @@
package me.impy.aegis.ui.dialogs; package me.impy.aegis.ui;
import android.app.Activity; import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.view.View; import android.view.View;
import android.view.WindowManager;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.TextView; import android.widget.TextView;
@ -36,22 +38,31 @@ public class Dialogs {
} }
public static void secureDialog(Dialog dialog) {
dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
}
public static void showSecureDialog(Dialog dialog) {
secureDialog(dialog);
dialog.show();
}
public static void showDeleteEntryDialog(Activity activity, DialogInterface.OnClickListener onDelete) { public static void showDeleteEntryDialog(Activity activity, DialogInterface.OnClickListener onDelete) {
new AlertDialog.Builder(activity) showSecureDialog(new AlertDialog.Builder(activity)
.setTitle(activity.getString(R.string.delete_entry)) .setTitle(activity.getString(R.string.delete_entry))
.setMessage(activity.getString(R.string.delete_entry_description)) .setMessage(activity.getString(R.string.delete_entry_description))
.setPositiveButton(android.R.string.yes, onDelete) .setPositiveButton(android.R.string.yes, onDelete)
.setNegativeButton(android.R.string.no, null) .setNegativeButton(android.R.string.no, null)
.show(); .create());
} }
public static void showDiscardDialog(Activity activity, DialogInterface.OnClickListener onSave, DialogInterface.OnClickListener onDiscard) { public static void showDiscardDialog(Activity activity, DialogInterface.OnClickListener onSave, DialogInterface.OnClickListener onDiscard) {
new AlertDialog.Builder(activity) showSecureDialog(new AlertDialog.Builder(activity)
.setTitle(activity.getString(R.string.discard_changes)) .setTitle(activity.getString(R.string.discard_changes))
.setMessage(activity.getString(R.string.discard_changes_description)) .setMessage(activity.getString(R.string.discard_changes_description))
.setPositiveButton(R.string.save, onSave) .setPositiveButton(R.string.save, onSave)
.setNegativeButton(R.string.discard, onDiscard) .setNegativeButton(R.string.discard, onDiscard)
.show(); .create());
} }
public static void showSetPasswordDialog(Activity activity, Dialogs.SlotListener listener) { public static void showSetPasswordDialog(Activity activity, Dialogs.SlotListener listener) {
@ -59,7 +70,7 @@ public class Dialogs {
EditText textPassword = view.findViewById(R.id.text_password); EditText textPassword = view.findViewById(R.id.text_password);
EditText textPasswordConfirm = view.findViewById(R.id.text_password_confirm); EditText textPasswordConfirm = view.findViewById(R.id.text_password_confirm);
AlertDialog alert = new AlertDialog.Builder(activity) AlertDialog dialog = new AlertDialog.Builder(activity)
.setTitle(R.string.set_password) .setTitle(R.string.set_password)
.setView(view) .setView(view)
.setPositiveButton(android.R.string.ok, null) .setPositiveButton(android.R.string.ok, null)
@ -67,8 +78,8 @@ public class Dialogs {
.create(); .create();
final AtomicReference<Button> buttonOK = new AtomicReference<>(); final AtomicReference<Button> buttonOK = new AtomicReference<>();
alert.setOnShowListener(dialog -> { dialog.setOnShowListener(d -> {
Button button = alert.getButton(AlertDialog.BUTTON_POSITIVE); Button button = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
button.setEnabled(false); button.setEnabled(false);
buttonOK.set(button); buttonOK.set(button);
@ -107,7 +118,7 @@ public class Dialogs {
textPassword.addTextChangedListener(watcher); textPassword.addTextChangedListener(watcher);
textPasswordConfirm.addTextChangedListener(watcher); textPasswordConfirm.addTextChangedListener(watcher);
alert.show(); showSecureDialog(dialog);
} }
public static void showFingerprintDialog(Activity activity, Dialogs.SlotListener listener) { public static void showFingerprintDialog(Activity activity, Dialogs.SlotListener listener) {
@ -135,7 +146,7 @@ public class Dialogs {
.setOnDismissListener(d -> { .setOnDismissListener(d -> {
helper.get().stopListening(); helper.get().stopListening();
}) })
.show(); .create();
helper.set(new FingerprintUiHelper(manager, imgFingerprint, textFingerprint, new FingerprintUiHelper.Callback() { helper.set(new FingerprintUiHelper(manager, imgFingerprint, textFingerprint, new FingerprintUiHelper.Callback() {
@Override @Override
@ -151,6 +162,7 @@ public class Dialogs {
})); }));
helper.get().startListening(new FingerprintManager.CryptoObject(cipher)); helper.get().startListening(new FingerprintManager.CryptoObject(cipher));
showSecureDialog(dialog);
} }
public interface SlotListener { public interface SlotListener {

@ -52,7 +52,6 @@ import me.impy.aegis.otp.HotpInfo;
import me.impy.aegis.otp.OtpInfo; import me.impy.aegis.otp.OtpInfo;
import me.impy.aegis.otp.OtpInfoException; import me.impy.aegis.otp.OtpInfoException;
import me.impy.aegis.otp.TotpInfo; import me.impy.aegis.otp.TotpInfo;
import me.impy.aegis.ui.dialogs.Dialogs;
public class EditEntryActivity extends AegisActivity { public class EditEntryActivity extends AegisActivity {
private boolean _isNew = false; private boolean _isNew = false;
@ -457,11 +456,11 @@ public class EditEntryActivity extends AegisActivity {
} }
private void onSaveError(String msg) { private void onSaveError(String msg) {
new AlertDialog.Builder(this) Dialogs.showSecureDialog(new AlertDialog.Builder(this)
.setTitle(getString(R.string.saving_profile_error)) .setTitle(getString(R.string.saving_profile_error))
.setMessage(msg) .setMessage(msg)
.setPositiveButton(android.R.string.ok, null) .setPositiveButton(android.R.string.ok, null)
.show(); .create());
} }
private boolean onSave() { private boolean onSave() {

@ -25,7 +25,6 @@ import me.impy.aegis.db.DatabaseManagerException;
import me.impy.aegis.db.DatabaseEntry; import me.impy.aegis.db.DatabaseEntry;
import me.impy.aegis.db.DatabaseManager; import me.impy.aegis.db.DatabaseManager;
import me.impy.aegis.helpers.PermissionHelper; import me.impy.aegis.helpers.PermissionHelper;
import me.impy.aegis.ui.dialogs.Dialogs;
import me.impy.aegis.ui.views.EntryListView; import me.impy.aegis.ui.views.EntryListView;
public class MainActivity extends AegisActivity implements EntryListView.Listener { public class MainActivity extends AegisActivity implements EntryListView.Listener {

@ -42,7 +42,6 @@ import me.impy.aegis.helpers.PermissionHelper;
import me.impy.aegis.importers.AegisImporter; import me.impy.aegis.importers.AegisImporter;
import me.impy.aegis.importers.DatabaseImporter; import me.impy.aegis.importers.DatabaseImporter;
import me.impy.aegis.importers.DatabaseImporterException; import me.impy.aegis.importers.DatabaseImporterException;
import me.impy.aegis.ui.dialogs.Dialogs;
import me.impy.aegis.ui.preferences.SwitchPreference; import me.impy.aegis.ui.preferences.SwitchPreference;
import me.impy.aegis.util.ByteInputStream; import me.impy.aegis.util.ByteInputStream;
@ -148,7 +147,7 @@ public class PreferencesFragment extends PreferenceFragmentCompat {
if (!_db.isEncryptionEnabled()) { if (!_db.isEncryptionEnabled()) {
Dialogs.showSetPasswordDialog(getActivity(), new EnableEncryptionListener()); Dialogs.showSetPasswordDialog(getActivity(), new EnableEncryptionListener());
} else { } else {
new AlertDialog.Builder(getActivity()) Dialogs.showSecureDialog(new AlertDialog.Builder(getActivity())
.setTitle(getString(R.string.disable_encryption)) .setTitle(getString(R.string.disable_encryption))
.setMessage(getString(R.string.disable_encryption_description)) .setMessage(getString(R.string.disable_encryption_description))
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
@ -162,7 +161,7 @@ public class PreferencesFragment extends PreferenceFragmentCompat {
} }
}) })
.setNegativeButton(android.R.string.no, null) .setNegativeButton(android.R.string.no, null)
.show(); .create());
} }
return false; return false;
} }
@ -265,7 +264,7 @@ public class PreferencesFragment extends PreferenceFragmentCompat {
Map<String, Class<? extends DatabaseImporter>> importers = DatabaseImporter.getImporters(); Map<String, Class<? extends DatabaseImporter>> importers = DatabaseImporter.getImporters();
String[] names = importers.keySet().toArray(new String[importers.size()]); String[] names = importers.keySet().toArray(new String[importers.size()]);
new AlertDialog.Builder(getActivity()) Dialogs.showSecureDialog(new AlertDialog.Builder(getActivity())
.setTitle(getString(R.string.choose_application)) .setTitle(getString(R.string.choose_application))
.setSingleChoiceItems(names, 0, null) .setSingleChoiceItems(names, 0, null)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@ -278,7 +277,7 @@ public class PreferencesFragment extends PreferenceFragmentCompat {
startActivityForResult(intent, CODE_IMPORT); startActivityForResult(intent, CODE_IMPORT);
} }
}) })
.show(); .create());
} }
private void onImportDecryptResult(int resultCode, Intent data) { private void onImportDecryptResult(int resultCode, Intent data) {
@ -394,7 +393,7 @@ public class PreferencesFragment extends PreferenceFragmentCompat {
} else { } else {
builder.setMessage(getString(R.string.export_warning)); builder.setMessage(getString(R.string.export_warning));
} }
builder.show(); Dialogs.showSecureDialog(builder.create());
} }
private void onSlotManagerResult(int resultCode, Intent data) { private void onSlotManagerResult(int resultCode, Intent data) {

@ -23,7 +23,6 @@ import me.impy.aegis.db.slots.Slot;
import me.impy.aegis.db.slots.SlotList; import me.impy.aegis.db.slots.SlotList;
import me.impy.aegis.db.slots.SlotException; import me.impy.aegis.db.slots.SlotException;
import me.impy.aegis.helpers.FingerprintHelper; import me.impy.aegis.helpers.FingerprintHelper;
import me.impy.aegis.ui.dialogs.Dialogs;
import me.impy.aegis.ui.views.SlotAdapter; import me.impy.aegis.ui.views.SlotAdapter;
public class SlotManagerActivity extends AegisActivity implements SlotAdapter.Listener, Dialogs.SlotListener { public class SlotManagerActivity extends AegisActivity implements SlotAdapter.Listener, Dialogs.SlotListener {
@ -155,7 +154,7 @@ public class SlotManagerActivity extends AegisActivity implements SlotAdapter.Li
return; return;
} }
new AlertDialog.Builder(this) Dialogs.showSecureDialog(new AlertDialog.Builder(this)
.setTitle(R.string.remove_slot) .setTitle(R.string.remove_slot)
.setMessage(R.string.remove_slot_description) .setMessage(R.string.remove_slot_description)
.setPositiveButton(android.R.string.yes, (dialog, whichButton) -> { .setPositiveButton(android.R.string.yes, (dialog, whichButton) -> {
@ -165,7 +164,7 @@ public class SlotManagerActivity extends AegisActivity implements SlotAdapter.Li
updateFingerprintButton(); updateFingerprintButton();
}) })
.setNegativeButton(android.R.string.no, null) .setNegativeButton(android.R.string.no, null)
.show(); .create());
} }
@Override @Override

@ -5,6 +5,7 @@ import android.content.Context;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Process; import android.os.Process;
import androidx.annotation.CallSuper; import androidx.annotation.CallSuper;
import me.impy.aegis.ui.Dialogs;
public abstract class ProgressDialogTask<Params, Result> extends AsyncTask<Params, Void, Result> { public abstract class ProgressDialogTask<Params, Result> extends AsyncTask<Params, Void, Result> {
private ProgressDialog _dialog; private ProgressDialog _dialog;
@ -13,6 +14,7 @@ public abstract class ProgressDialogTask<Params, Result> extends AsyncTask<Param
_dialog = new ProgressDialog(context); _dialog = new ProgressDialog(context);
_dialog.setCancelable(false); _dialog.setCancelable(false);
_dialog.setMessage(message); _dialog.setMessage(message);
Dialogs.secureDialog(_dialog);
} }
@CallSuper @CallSuper

Loading…
Cancel
Save