diff --git a/app/src/main/java/com/beemdevelopment/aegis/Preferences.java b/app/src/main/java/com/beemdevelopment/aegis/Preferences.java
index 18c2e5e9..cf3ab407 100644
--- a/app/src/main/java/com/beemdevelopment/aegis/Preferences.java
+++ b/app/src/main/java/com/beemdevelopment/aegis/Preferences.java
@@ -316,6 +316,29 @@ public class Preferences {
return _prefs.getBoolean("pref_backups_reminder_needed", false);
}
+ public void setIsPlaintextBackupWarningNeeded(boolean needed) {
+ if (isPlaintextBackupWarningNeeded() != needed) {
+ _prefs.edit().putBoolean("pref_plaintext_backup_warning_needed", needed).apply();
+ }
+ }
+
+ public boolean isPlaintextBackupWarningNeeded() {
+ if (canShowPlaintextBackupWarning()) {
+ return _prefs.getBoolean("pref_plaintext_backup_warning_needed", false);
+ }
+ return false;
+ }
+
+ public void setCanShowPlaintextBackupWarning(boolean canShow) {
+ if (canShowPlaintextBackupWarning() != canShow) {
+ _prefs.edit().putBoolean("pref_can_show_plaintext_backup_warning", canShow).apply();
+ }
+ }
+
+ public boolean canShowPlaintextBackupWarning() {
+ return _prefs.getBoolean("pref_can_show_plaintext_backup_warning", true);
+ }
+
public boolean isPinKeyboardEnabled() {
return _prefs.getBoolean("pref_pin_keyboard", false);
}
diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java
index c03decd2..c37dfc57 100644
--- a/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java
+++ b/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java
@@ -9,14 +9,18 @@ import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.view.KeyEvent;
+import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
+import android.widget.Button;
+import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
+import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.view.ActionMode;
import androidx.appcompat.widget.SearchView;
@@ -683,11 +687,46 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene
startPreferencesActivity();
});
_btnErrorBar.setVisibility(View.VISIBLE);
+ } else if (_prefs.isPlaintextBackupWarningNeeded()) {
+ _textErrorBar.setText(R.string.backup_plaintext_export_warning);
+ _btnErrorBar.setOnClickListener(view -> {
+ showPlaintextExportWarningOptions();
+ });
+ _btnErrorBar.setVisibility(View.VISIBLE);
} else {
_btnErrorBar.setVisibility(View.GONE);
}
}
+ private void showPlaintextExportWarningOptions() {
+ View view = LayoutInflater.from(this).inflate(R.layout.dialog_plaintext_warning_options, null);
+
+ AlertDialog dialog = new AlertDialog.Builder(this)
+ .setTitle(R.string.backup_plaintext_export_warning)
+ .setView(view)
+ .setPositiveButton(android.R.string.ok, null)
+ .setNegativeButton(android.R.string.cancel, null)
+ .create();
+
+ CheckBox checkBox = view.findViewById(R.id.checkbox_dont_show_plaintext_warning_again);
+ checkBox.setChecked(false);
+
+ dialog.setOnShowListener(d -> {
+ Button btnPos = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
+
+ btnPos.setOnClickListener(l -> {
+ dialog.dismiss();
+
+ _prefs.setCanShowPlaintextBackupWarning(!checkBox.isChecked());
+ _prefs.setIsPlaintextBackupWarningNeeded(false);
+
+ updateErrorBar();
+ });
+ });
+
+ Dialogs.showSecureDialog(dialog);
+ }
+
@Override
public void onEntryClick(VaultEntry entry) {
if (_actionMode != null) {
diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/ImportExportPreferencesFragment.java b/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/ImportExportPreferencesFragment.java
index 0e5a7c6f..fae5d7d6 100644
--- a/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/ImportExportPreferencesFragment.java
+++ b/app/src/main/java/com/beemdevelopment/aegis/ui/fragments/preferences/ImportExportPreferencesFragment.java
@@ -292,9 +292,11 @@ public class ImportExportPreferencesFragment extends PreferencesFragment {
break;
case CODE_EXPORT_PLAIN:
cb.exportVault((stream) -> _vaultManager.getVault().export(stream, null));
+ _prefs.setIsPlaintextBackupWarningNeeded(true);
break;
case CODE_EXPORT_GOOGLE_URI:
cb.exportVault((stream) -> _vaultManager.getVault().exportGoogleUris(stream));
+ _prefs.setIsPlaintextBackupWarningNeeded(true);
break;
}
}
diff --git a/app/src/main/res/layout/dialog_plaintext_warning_options.xml b/app/src/main/res/layout/dialog_plaintext_warning_options.xml
new file mode 100644
index 00000000..9b61b635
--- /dev/null
+++ b/app/src/main/res/layout/dialog_plaintext_warning_options.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 90a77022..c13a57a4 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -321,6 +321,9 @@
Expected QR code #%d, but scanned #%d instead
Vault backup failed recently
Recent vault changes are not backed up
+ The vault was recently exported in plain text
+ Don\'t show this warning again
+ This warning is shown because you recently exported an unencrypted copy of the vault. To maintain security of your tokens, we recommend deleting this file once it\'s no longer needed.
Switch camera