From b2054389822836284c5dcb22ab507c0578289d39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Sch=C3=A4ttgen?= Date: Sat, 2 Sep 2023 02:31:25 +0200 Subject: [PATCH 001/196] Add ability to skip duplicates during import --- .../aegis/ui/ImportEntriesActivity.java | 42 ++++++++++++++++++- .../aegis/ui/views/ImportEntriesAdapter.java | 9 ++++ app/src/main/res/values/strings.xml | 5 +++ 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/ImportEntriesActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/ImportEntriesActivity.java index 8787c419..8e126189 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/ImportEntriesActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/ImportEntriesActivity.java @@ -4,6 +4,7 @@ import android.content.pm.PackageManager; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; +import android.view.View; import android.widget.Toast; import androidx.annotation.NonNull; @@ -26,15 +27,20 @@ import com.beemdevelopment.aegis.util.UUIDMap; import com.beemdevelopment.aegis.vault.VaultEntry; import com.beemdevelopment.aegis.vault.VaultRepository; import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.android.material.snackbar.Snackbar; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.UUID; public class ImportEntriesActivity extends AegisActivity { + private View _view; private Menu _menu; private ImportEntriesAdapter _adapter; private FabScrollHelper _fabScrollHelper; @@ -48,6 +54,8 @@ public class ImportEntriesActivity extends AegisActivity { setContentView(R.layout.activity_import_entries); setSupportActionBar(findViewById(R.id.toolbar)); + _view = findViewById(R.id.importEntriesRootView); + ActionBar bar = getSupportActionBar(); bar.setHomeAsUpIndicator(R.drawable.ic_close); bar.setDisplayHomeAsUpEnabled(true); @@ -180,6 +188,7 @@ public class ImportEntriesActivity extends AegisActivity { } private void importDatabase(DatabaseImporter.State state) { + List importEntries = new ArrayList<>(); DatabaseImporter.Result result; try { result = state.convert(); @@ -191,7 +200,9 @@ public class ImportEntriesActivity extends AegisActivity { UUIDMap entries = result.getEntries(); for (VaultEntry entry : entries.getValues()) { - _adapter.addEntry(new ImportEntry(entry)); + ImportEntry importEntry = new ImportEntry(entry); + _adapter.addEntry(importEntry); + importEntries.add(importEntry); } List errors = result.getErrors(); @@ -199,6 +210,8 @@ public class ImportEntriesActivity extends AegisActivity { String message = getResources().getQuantityString(R.plurals.import_error_dialog, errors.size(), errors.size()); Dialogs.showMultiErrorDialog(this, R.string.import_error_title, message, errors, null); } + + findDuplicates(importEntries); } private void showWipeEntriesDialog() { @@ -236,6 +249,33 @@ public class ImportEntriesActivity extends AegisActivity { } } + private void findDuplicates(List importEntries) { + List duplicateEntries = new ArrayList<>(); + for (ImportEntry importEntry: importEntries) { + boolean exists = _vaultManager.getVault().getEntries().stream().anyMatch(item -> + item.getIssuer().equals(importEntry.getEntry().getIssuer()) && + Arrays.equals(item.getInfo().getSecret(), importEntry.getEntry().getInfo().getSecret())); + + if (exists) { + duplicateEntries.add(importEntry.getEntry().getUUID()); + } + } + + if (duplicateEntries.size() == 0) { + return; + } + + _adapter.setCheckboxStates(duplicateEntries, false); + Snackbar snackbar = Snackbar.make(_view, getResources().getQuantityString(R.plurals.import_duplicate_toast, duplicateEntries.size(), duplicateEntries.size()), Snackbar.LENGTH_INDEFINITE); + snackbar.setAction(R.string.undo, new View.OnClickListener() { + @Override + public void onClick(View v) { + _adapter.setCheckboxStates(duplicateEntries, true); + } + }); + snackbar.show(); + } + @Override public boolean onCreateOptionsMenu(Menu menu) { _menu = menu; diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/views/ImportEntriesAdapter.java b/app/src/main/java/com/beemdevelopment/aegis/ui/views/ImportEntriesAdapter.java index 024472b1..5f18160f 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/views/ImportEntriesAdapter.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/views/ImportEntriesAdapter.java @@ -12,6 +12,7 @@ import com.beemdevelopment.aegis.ui.models.ImportEntry; import java.util.ArrayList; import java.util.List; +import java.util.UUID; public class ImportEntriesAdapter extends RecyclerView.Adapter { private List _entries; @@ -67,6 +68,14 @@ public class ImportEntriesAdapter extends RecyclerView.Adapter uuids, boolean state) { + for (ImportEntry entry : _entries) { + if(uuids.contains(entry.getEntry().getUUID())) { + entry.setIsChecked(state); + } + } + } + public void toggleCheckboxes() { int checkedEntries = getCheckedEntries().size(); if (checkedEntries == 0 || checkedEntries != _entries.size()) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 65323954..65204e97 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -159,6 +159,7 @@ Share Yes No + Undo Unlock Advanced Counter @@ -469,6 +470,10 @@ Delete vault when a panic trigger is received from Ripple Import vault + + Unchecked %d potential duplicate. Please review the list of entries. + Unchecked %d potential duplicates. Please review the list of entries. + Supply a 2FAS Authenticator backup file. Supply an Aegis export/backup file. Supply an Authenticator Plus export file obtained through Settings -> Backup & Restore -> Export as Text and HTML. From c9cf6729e022a2abc490ebcb6233c3dee14bd789 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Sch=C3=A4ttgen?= Date: Wed, 6 Sep 2023 23:39:18 +0200 Subject: [PATCH 002/196] Fix biometrics unlock button on AuthActivity --- .../main/java/com/beemdevelopment/aegis/ui/AuthActivity.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java index b77c9eba..685aa812 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java @@ -171,6 +171,8 @@ public class AuthActivity extends AegisActivity { showBiometricPrompt(); }) .create()); + } else { + showBiometricPrompt(); } }); } From 27e56d60b5ee6e2c15b2ec27d0d6fe7132b4c216 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Sch=C3=A4ttgen?= Date: Wed, 6 Sep 2023 23:49:51 +0200 Subject: [PATCH 003/196] Release v2.2.1 --- app/build.gradle | 4 ++-- app/src/main/assets/changelog.html | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3faacee6..7caf94f9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { applicationId "${packageName}" minSdkVersion 21 targetSdkVersion 33 - versionCode 60 - versionName "2.2" + versionCode 61 + versionName "2.2.1" multiDexEnabled true buildConfigField "String", "GIT_HASH", "\"${getGitHash()}\"" buildConfigField "String", "GIT_BRANCH", "\"${getGitBranch()}\"" diff --git a/app/src/main/assets/changelog.html b/app/src/main/assets/changelog.html index 63f508dd..4500bc0d 100644 --- a/app/src/main/assets/changelog.html +++ b/app/src/main/assets/changelog.html @@ -31,6 +31,15 @@
+

Version 2.2.1

+

New

+
    +
  • Ability to automatically skip potential duplicates when importing entries
  • +
+

Fixes

+
    +
  • Biometrics button on the unlock screen was unresponsive
  • +

Version 2.2

New

    From 9cabd9f309ea8820afeb60a31998e582486dc177 Mon Sep 17 00:00:00 2001 From: Alexander Bakker Date: Thu, 7 Sep 2023 21:41:30 +0200 Subject: [PATCH 004/196] Add support for new Authenticator Pro backup format This adds support for Authenticator Pro's latest backup format changes. The format of the content itself has not changed as far as I can tell, but they do use a different cipher and KDF now: AES GCM and Argon2id, respectively. The memory cost is statically set at 64MiB. I suspect that this may cause OOM situations on some lower-end devices, but we'll see, not much we can do about that right now without making more changes. --- .../importers/AuthenticatorProImporter.java | 122 +++++++++++++++--- .../aegis/ui/tasks/Argon2Task.java | 71 ++++++++++ .../aegis/importers/DatabaseImporterTest.java | 15 ++- .../aegis/importers/authpro_encrypted.bin | Bin 1332 -> 1436 bytes .../importers/authpro_encrypted_legacy.bin | Bin 0 -> 1332 bytes 5 files changed, 187 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/com/beemdevelopment/aegis/ui/tasks/Argon2Task.java create mode 100644 app/src/test/resources/com/beemdevelopment/aegis/importers/authpro_encrypted_legacy.bin diff --git a/app/src/main/java/com/beemdevelopment/aegis/importers/AuthenticatorProImporter.java b/app/src/main/java/com/beemdevelopment/aegis/importers/AuthenticatorProImporter.java index 354ded2d..1f755962 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/importers/AuthenticatorProImporter.java +++ b/app/src/main/java/com/beemdevelopment/aegis/importers/AuthenticatorProImporter.java @@ -16,11 +16,13 @@ import com.beemdevelopment.aegis.otp.OtpInfoException; import com.beemdevelopment.aegis.otp.SteamInfo; import com.beemdevelopment.aegis.otp.TotpInfo; import com.beemdevelopment.aegis.ui.dialogs.Dialogs; +import com.beemdevelopment.aegis.ui.tasks.Argon2Task; import com.beemdevelopment.aegis.ui.tasks.PBKDFTask; import com.beemdevelopment.aegis.util.IOUtils; import com.beemdevelopment.aegis.vault.VaultEntry; import com.topjohnwu.superuser.io.SuFile; +import org.bouncycastle.crypto.params.Argon2Parameters; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -44,9 +46,8 @@ import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; public class AuthenticatorProImporter extends DatabaseImporter { - private static final String HEADER = "AuthenticatorPro"; - private static final int ITERATIONS = 64000; - private static final int KEY_SIZE = 32 * Byte.SIZE; + private static final String HEADER = "AUTHENTICATORPRO"; + private static final String HEADER_LEGACY = "AuthenticatorPro"; private static final String PKG_NAME = "me.jmh.authenticatorpro"; private static final String PKG_DB_PATH = "files/proauth.db3"; @@ -90,24 +91,19 @@ public class AuthenticatorProImporter extends DatabaseImporter { } } - private static EncryptedState readEncrypted(DataInputStream stream) throws DatabaseImporterException { + private static State readEncrypted(DataInputStream stream) throws DatabaseImporterException { try { byte[] headerBytes = new byte[HEADER.getBytes(StandardCharsets.UTF_8).length]; stream.readFully(headerBytes); String header = new String(headerBytes, StandardCharsets.UTF_8); - if (!header.equals(HEADER)) { - throw new DatabaseImporterException("Invalid file header"); + switch (header) { + case HEADER: + return EncryptedState.parseHeader(stream); + case HEADER_LEGACY: + return LegacyEncryptedState.parseHeader(stream); + default: + throw new DatabaseImporterException("Invalid file header"); } - - int saltSize = 20; - byte[] salt = new byte[saltSize]; - stream.readFully(salt); - - Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); - int ivSize = cipher.getBlockSize(); - byte[] iv = new byte[ivSize]; - stream.readFully(iv); - return new EncryptedState(cipher, salt, iv, IOUtils.readAll(stream)); } catch (UTFDataFormatException e) { throw new DatabaseImporterException("Invalid file header"); } catch (IOException | NoSuchPaddingException | NoSuchAlgorithmException e) { @@ -130,6 +126,13 @@ public class AuthenticatorProImporter extends DatabaseImporter { } static class EncryptedState extends State { + private static final int KEY_SIZE = 32; + private static final int MEMORY_COST = 16; // 2^16 KiB = 64 MiB + private static final int PARALLELISM = 4; + private static final int ITERATIONS = 3; + private static final int SALT_SIZE = 16; + private static final int IV_SIZE = 12; + private final Cipher _cipher; private final byte[] _salt; private final byte[] _iv; @@ -143,6 +146,81 @@ public class AuthenticatorProImporter extends DatabaseImporter { _data = data; } + public JsonState decrypt(char[] password) throws DatabaseImporterException { + Argon2Task.Params params = getKeyDerivationParams(password); + SecretKey key = Argon2Task.deriveKey(params); + return decrypt(key); + } + + public JsonState decrypt(SecretKey key) throws DatabaseImporterException { + try { + _cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(_iv)); + byte[] decrypted = _cipher.doFinal(_data); + return new JsonState(new JSONObject(new String(decrypted, StandardCharsets.UTF_8))); + } catch (InvalidAlgorithmParameterException | IllegalBlockSizeException + | JSONException | InvalidKeyException | BadPaddingException e) { + throw new DatabaseImporterException(e); + } + } + + @Override + public void decrypt(Context context, DecryptListener listener) throws DatabaseImporterException { + Dialogs.showPasswordInputDialog(context, R.string.enter_password_aegis_title, 0, (Dialogs.TextInputListener) password -> { + Argon2Task.Params params = getKeyDerivationParams(password); + Argon2Task task = new Argon2Task(context, key -> { + try { + AuthenticatorProImporter.JsonState state = decrypt(key); + listener.onStateDecrypted(state); + } catch (DatabaseImporterException e) { + listener.onError(e); + } + }); + Lifecycle lifecycle = ContextHelper.getLifecycle(context); + task.execute(lifecycle, params); + }, dialog -> listener.onCanceled()); + } + + private Argon2Task.Params getKeyDerivationParams(char[] password) { + Argon2Parameters argon2Params = new Argon2Parameters.Builder(Argon2Parameters.ARGON2_id) + .withIterations(ITERATIONS) + .withParallelism(PARALLELISM) + .withMemoryPowOfTwo(MEMORY_COST) + .withSalt(_salt) + .build(); + return new Argon2Task.Params(password, argon2Params, KEY_SIZE); + } + + private static EncryptedState parseHeader(DataInputStream stream) + throws IOException, NoSuchPaddingException, NoSuchAlgorithmException { + byte[] salt = new byte[SALT_SIZE]; + stream.readFully(salt); + + byte[] iv = new byte[IV_SIZE]; + stream.readFully(iv); + + Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); + return new EncryptedState(cipher, salt, iv, IOUtils.readAll(stream)); + } + } + + static class LegacyEncryptedState extends State { + private static final int ITERATIONS = 64000; + private static final int KEY_SIZE = 32 * Byte.SIZE; + private static final int SALT_SIZE = 20; + + private final Cipher _cipher; + private final byte[] _salt; + private final byte[] _iv; + private final byte[] _data; + + public LegacyEncryptedState(Cipher cipher, byte[] salt, byte[] iv, byte[] data) { + super(true); + _cipher = cipher; + _salt = salt; + _iv = iv; + _data = data; + } + public JsonState decrypt(char[] password) throws DatabaseImporterException { PBKDFTask.Params params = getKeyDerivationParams(password); SecretKey key = PBKDFTask.deriveKey(params); @@ -180,6 +258,18 @@ public class AuthenticatorProImporter extends DatabaseImporter { private PBKDFTask.Params getKeyDerivationParams(char[] password) { return new PBKDFTask.Params("PBKDF2WithHmacSHA1", KEY_SIZE, password, _salt, ITERATIONS); } + + private static LegacyEncryptedState parseHeader(DataInputStream stream) + throws IOException, NoSuchPaddingException, NoSuchAlgorithmException { + byte[] salt = new byte[SALT_SIZE]; + stream.readFully(salt); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + int ivSize = cipher.getBlockSize(); + byte[] iv = new byte[ivSize]; + stream.readFully(iv); + return new LegacyEncryptedState(cipher, salt, iv, IOUtils.readAll(stream)); + } } private static class JsonState extends State { diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/tasks/Argon2Task.java b/app/src/main/java/com/beemdevelopment/aegis/ui/tasks/Argon2Task.java new file mode 100644 index 00000000..98b35b6a --- /dev/null +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/tasks/Argon2Task.java @@ -0,0 +1,71 @@ +package com.beemdevelopment.aegis.ui.tasks; + +import android.content.Context; + +import com.beemdevelopment.aegis.R; + +import org.bouncycastle.crypto.generators.Argon2BytesGenerator; +import org.bouncycastle.crypto.params.Argon2Parameters; + +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; + +public class Argon2Task extends ProgressDialogTask { + private final Callback _cb; + + public Argon2Task(Context context, Callback cb) { + super(context, context.getString(R.string.unlocking_vault)); + _cb = cb; + } + + @Override + protected SecretKey doInBackground(Params... args) { + setPriority(); + + Params params = args[0]; + return deriveKey(params); + } + + public static SecretKey deriveKey(Params params) { + Argon2BytesGenerator gen = new Argon2BytesGenerator(); + gen.init(params.getArgon2Params()); + + byte[] key = new byte[params.getKeySize()]; + gen.generateBytes(params.getPassword(), key); + return new SecretKeySpec(key, 0, key.length, "AES"); + } + + @Override + protected void onPostExecute(SecretKey key) { + super.onPostExecute(key); + _cb.onTaskFinished(key); + } + + public interface Callback { + void onTaskFinished(SecretKey key); + } + + public static class Params { + private final char[] _password; + private final Argon2Parameters _argon2Params; + private final int _keySize; + + public Params(char[] password, Argon2Parameters argon2Params, int keySize) { + _password = password; + _argon2Params = argon2Params; + _keySize = keySize; + } + + public char[] getPassword() { + return _password; + } + + public Argon2Parameters getArgon2Params() { + return _argon2Params; + } + + public int getKeySize() { + return _keySize; + } + } +} diff --git a/app/src/test/java/com/beemdevelopment/aegis/importers/DatabaseImporterTest.java b/app/src/test/java/com/beemdevelopment/aegis/importers/DatabaseImporterTest.java index d255f68a..c9f1030a 100644 --- a/app/src/test/java/com/beemdevelopment/aegis/importers/DatabaseImporterTest.java +++ b/app/src/test/java/com/beemdevelopment/aegis/importers/DatabaseImporterTest.java @@ -146,11 +146,16 @@ public class DatabaseImporterTest { public void testImportAuthProEncrypted() throws DatabaseImporterException, IOException, OtpInfoException { List entries = importEncrypted(AuthenticatorProImporter.class, "authpro_encrypted.bin", state -> { char[] password = "test".toCharArray(); - try { - return ((AuthenticatorProImporter.EncryptedState) state).decrypt(password); - } catch (DatabaseImporterException e) { - throw new DatabaseImporterException(e); - } + return ((AuthenticatorProImporter.EncryptedState) state).decrypt(password); + }); + checkImportedEntries(entries); + } + + @Test + public void testImportAuthProEncryptedLegacy() throws DatabaseImporterException, IOException, OtpInfoException { + List entries = importEncrypted(AuthenticatorProImporter.class, "authpro_encrypted_legacy.bin", state -> { + char[] password = "test".toCharArray(); + return ((AuthenticatorProImporter.LegacyEncryptedState) state).decrypt(password); }); checkImportedEntries(entries); } diff --git a/app/src/test/resources/com/beemdevelopment/aegis/importers/authpro_encrypted.bin b/app/src/test/resources/com/beemdevelopment/aegis/importers/authpro_encrypted.bin index 25858829537f958a32974cd2bf87f7138ff4f00a..b515a7b318acd5c591ba640b3746d04c52c450c6 100644 GIT binary patch literal 1436 zcmV;N1!MX_Ra8htPE<)lK~zstP*P7Ho1RP+%K&=9j7B{Hf5$sV_M8Z$InO6s<+g2` zI7Kb3Vy$y^>h1-;ecg2+Us`A%k!B1hRZK`*`Njy1(3HHhINJHo)=BF3rwLCDs66s%Yl1bsO_aTRy>ywRc%7ge;6N5P_ zc@7S4iuIv0z?{tvAwDa$FV6BPyK9wjxD^7gXZ(Lx3*|x63o@ii!&jbQ*0Bv-Jz z!?9aJi5PH++1x~I02cao5XR?v6k&0aXmkuV?QMZad9j~IaDC=~KC*;0NUf+osOTr4 zL^VN~{aSJ&2{#f`JY8X7v-4S)uC$S9^5&u=mx-$y)3^;F#qF41${+s}q#ka20hg7A z_hicZ+|x)CP%(x z&KJe8?aspu3BAv}Au=F|jsp_VFMgFzmJ&uW2@GZEu~|ub>g9Oas_OLQ>ofyWH*{3Kq>5fa9P{DX*+)EtB2gD0qOReG2yICN+e4o>J zWaY)0L?)&-xa_*Vc+AOVmxNB7-b>g!$VmWBL`}0?U;9V7N{)apWQt6r0pDyBNQpa0 zq$;~e(+VTFNb8)y{hKX)rzA{okIoj%2QU9p^Sls2I*chop`>;)##!i~0WDtd9!1cZ z8Nn!L^BTxT#WE4P5p39V-JB!g)^irY_a{thcCN>umCKL}J=4?`XG&7Xgbx?8e^WZ{$`7}9#?r`#@8TgSxm*kH-Z$v{N%c-~8GGU@!+b4712;*% z&42-o4v_3WFG+uEKW5$n)8S`qf2aYsS4{Z`mTh28ZX17WLweI8SsC4vX^wo)0j%M7{x3;$TgE9EDapi zCNS0m!Y=Slu21+q_Y8+?`uKLC&7aRiO=zMU8JnF<5Nu6sY#ZvYAN~KSbv*d4Wi;`N zcCDW!7MietzMRp_G(}%oR$0Zi1Sc(?iZHT>-JZPu#DRbi%6OtSR@mgP7fyHnwJ*$| zOoW!&8$M)~tgi$vmmOhq-)223vZC#Legsgj!!bYXRoY|rpCHs=g4lZ1 zs>p$bM__1O+!khWA53n$vNTql0jj?KgeC_hi@Y>h%1C($iY^@&@z%BzAh1=dG|Ki< zRYOiwFz;~7^5`OkkBN&fbE3C*x3-ijPAAXhm`@cj)XMj4%OAJ!XUq;vFhzr@uj^G0 z(UQ%14&6L-^4k9fc4)uf($N1FHh}WpF8jlnDGp-kbB9$=!;H|0=;izo<;G3NfmKT- zoQnI3D!_IDl~Q-+9RJ&ZpR1c8O0S-Zyir q?#Q#~6|uU}gUTk_h(zY8|JkasTt|x54zITr!NOlM$EYOy!5SD#Da9=S literal 1332 zcmV-41uyrB^qj(fGg=FM_tG(ua!I3K6IB!|`gq2O^2gQE1Qm|`H5T+_Q za4;d?gz#pABlqi<7LO3fP_HZbV)jR#Deu;6;}T`lzO|2WnzilJiZGEo z{lu;)6r9@Agks2d7Z-i}s$4F9B*U18+x^RurPGgxlsrn;_z z+g`0+s`xx&h4lJ>U(X~+#amuQ9L;`eLwV814AdCp4M)8jR>^lPrJqCBKp!BgXWIf2 zH@E#tL`1(mmHyI!S-d!Czn^=rR(WILW-T@S`}oS3HMq!kY|NEey|eUrwEyf6pBv9A za<4;D!$IQ2FLcn?WnMp{zpte}j=AL$@6?%3_46w83S?(y0**|hoQ{@Um80DI=d+hA zVl^~{>XHY5vbkIRha9p^$)L6Stu!CnN)LZZr=qT%0-H zx;_0caNpR}xB*;>`og08s>Juu{ve6hVV4s0$mfGW&-&h9ut(G;$LsJBk{NF$h$iOw zA(SsY*m;Ai3v@25`+D{3bu;E(I{wbmQiLV|)+D3xolIq3YW*VCqS8GrPq6(u_|0=x z7$OL08UG|SrSUE{oP*9ueLXerzd_iha-7*jZKT=v8hmqQLE(?-vrNz7|C?9O!1=I} z;hlFZP>Gx)YFH^Us*BsASZht#jj`j}{VNQ?PkZd4uN6kC^+GK-eR*5+Cfvz0vsOQ{ zmt@mSn8_nkh&2*N_nyIQ)wq703% zD^CZ`V|jkhr6Y|~ZU_(Jy=|XBEqsII;(Lqeeb`z{`QR4rwEQMzghD8re7k(shjM_5 z!mZ#+$gg0bYJO4uk2;rLgm>FD9x}4CT4GI1xq)%XCuTHS?MCLzLt_%PAP-E{8GcJc zuS$ZpjAJB%`NJJOPG+-=&Vw-jB&Ygab}Kn~RI^r<6jt17lED&7F3iu9&xLqN7If@2 zuDJ<wQKuc%tT#l>BnNE12$rbM%|MF`Z&yNZ8W7}t8<~) zB)WJt@`5}Sl)dRnlF4M+r8x_eVn8os?a}nU%08R%KU86|Ja$@Te33 diff --git a/app/src/test/resources/com/beemdevelopment/aegis/importers/authpro_encrypted_legacy.bin b/app/src/test/resources/com/beemdevelopment/aegis/importers/authpro_encrypted_legacy.bin new file mode 100644 index 0000000000000000000000000000000000000000..25858829537f958a32974cd2bf87f7138ff4f00a GIT binary patch literal 1332 zcmV-41uyrB^qj(fGg=FM_tG(ua!I3K6IB!|`gq2O^2gQE1Qm|`H5T+_Q za4;d?gz#pABlqi<7LO3fP_HZbV)jR#Deu;6;}T`lzO|2WnzilJiZGEo z{lu;)6r9@Agks2d7Z-i}s$4F9B*U18+x^RurPGgxlsrn;_z z+g`0+s`xx&h4lJ>U(X~+#amuQ9L;`eLwV814AdCp4M)8jR>^lPrJqCBKp!BgXWIf2 zH@E#tL`1(mmHyI!S-d!Czn^=rR(WILW-T@S`}oS3HMq!kY|NEey|eUrwEyf6pBv9A za<4;D!$IQ2FLcn?WnMp{zpte}j=AL$@6?%3_46w83S?(y0**|hoQ{@Um80DI=d+hA zVl^~{>XHY5vbkIRha9p^$)L6Stu!CnN)LZZr=qT%0-H zx;_0caNpR}xB*;>`og08s>Juu{ve6hVV4s0$mfGW&-&h9ut(G;$LsJBk{NF$h$iOw zA(SsY*m;Ai3v@25`+D{3bu;E(I{wbmQiLV|)+D3xolIq3YW*VCqS8GrPq6(u_|0=x z7$OL08UG|SrSUE{oP*9ueLXerzd_iha-7*jZKT=v8hmqQLE(?-vrNz7|C?9O!1=I} z;hlFZP>Gx)YFH^Us*BsASZht#jj`j}{VNQ?PkZd4uN6kC^+GK-eR*5+Cfvz0vsOQ{ zmt@mSn8_nkh&2*N_nyIQ)wq703% zD^CZ`V|jkhr6Y|~ZU_(Jy=|XBEqsII;(Lqeeb`z{`QR4rwEQMzghD8re7k(shjM_5 z!mZ#+$gg0bYJO4uk2;rLgm>FD9x}4CT4GI1xq)%XCuTHS?MCLzLt_%PAP-E{8GcJc zuS$ZpjAJB%`NJJOPG+-=&Vw-jB&Ygab}Kn~RI^r<6jt17lED&7F3iu9&xLqN7If@2 zuDJ<wQKuc%tT#l>BnNE12$rbM%|MF`Z&yNZ8W7}t8<~) zB)WJt@`5}Sl)dRnlF4M+r8x_eVn8os?a}nU%08R%KU86|Ja$@Te33 literal 0 HcmV?d00001 From 9b3e7136bd7fca3f5aee1e42450a2a94f6c73b29 Mon Sep 17 00:00:00 2001 From: Alexander Bakker Date: Thu, 7 Sep 2023 22:45:58 +0200 Subject: [PATCH 005/196] Introduce optional 'name' field for iconpack icons This introduces a new (optional) 'name' field for iconpack icons. It will be used to describe the icon in the icon selection dialog. If it is not present, the name of the icon will be derived from the filename, like before. Using this new field allows usage of more exotic characters in the icon name that are not allowed in a filename. --- .../com/beemdevelopment/aegis/icons/IconPack.java | 11 +++++++++-- .../beemdevelopment/aegis/ui/EditEntryActivity.java | 3 ++- .../beemdevelopment/aegis/ui/views/IconAdapter.java | 10 +--------- docs/iconpacks.md | 4 +++- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/beemdevelopment/aegis/icons/IconPack.java b/app/src/main/java/com/beemdevelopment/aegis/icons/IconPack.java index 3e3f8424..9120a4e3 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/icons/IconPack.java +++ b/app/src/main/java/com/beemdevelopment/aegis/icons/IconPack.java @@ -3,6 +3,7 @@ package com.beemdevelopment.aegis.icons; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.beemdevelopment.aegis.util.JsonUtils; import com.google.common.base.Objects; import com.google.common.io.Files; @@ -120,13 +121,15 @@ public class IconPack { public static class Icon implements Serializable { private final String _relFilename; + private final String _name; private final String _category; private final List _issuers; private File _file; - protected Icon(String filename, String category, List issuers) { + protected Icon(String filename, String name, String category, List issuers) { _relFilename = filename; + _name = name; _category = category; _issuers = issuers; } @@ -149,6 +152,9 @@ public class IconPack { } public String getName() { + if (_name != null) { + return _name; + } return Files.getNameWithoutExtension(new File(_relFilename).getName()); } @@ -169,6 +175,7 @@ public class IconPack { public static Icon fromJson(JSONObject obj) throws JSONException { String filename = obj.getString("filename"); + String name = JsonUtils.optString(obj, "name"); String category = obj.isNull("category") ? null : obj.getString("category"); JSONArray array = obj.getJSONArray("issuer"); @@ -178,7 +185,7 @@ public class IconPack { issuers.add(issuer); } - return new Icon(filename, category, issuers); + return new Icon(filename, name, category, issuers); } } } diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java index 95de25e2..8812592b 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java @@ -852,11 +852,12 @@ public class EditEntryActivity extends AegisActivity { private final File _file; protected CustomSvgIcon(File file) { - super(file.getAbsolutePath(), null, null); + super(file.getAbsolutePath(), null, null, null); _file = file; } @Nullable + @Override public File getFile() { return _file; } diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/views/IconAdapter.java b/app/src/main/java/com/beemdevelopment/aegis/ui/views/IconAdapter.java index a35e7a01..2593197f 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/views/IconAdapter.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/views/IconAdapter.java @@ -232,16 +232,8 @@ public class IconAdapter extends RecyclerView.Adapter { } public static class DummyIcon extends IconPack.Icon { - private final String _name; - protected DummyIcon(String name) { - super(null, null, null); - _name = name; - } - - @Override - public String getName() { - return _name; + super(name, null, null, null); } @Override diff --git a/docs/iconpacks.md b/docs/iconpacks.md index 2b98fe88..a3b72f8d 100644 --- a/docs/iconpacks.md +++ b/docs/iconpacks.md @@ -15,11 +15,13 @@ is randomly generated once and stays the same across different versions. "version": 1, "icons": [ { + "name": "Google", "filename": "services/Google.png", "category": "Services", "issuer": [ "google" ] }, { + "name": "Blizzard", "filename": "services/Blizzard.png", "category": "Gaming", "issuer": [ "blizzard", "battle.net" ] @@ -32,7 +34,7 @@ Every icon definition contains the filename of the icon file, relative to the root of the .ZIP archive. Icon definitions also have a list of strings that the Issuer field in Aegis is matched against for automatic selection of an icon for new entries. Matching is done in a case-insensitive manner. There's also a -category field. +category field. Optionally, icons can also have a name. The following image formats are supported, in order of preference: From 1ccbe88ce6f8b152a62fcdbc8bb5b9b6b59809f4 Mon Sep 17 00:00:00 2001 From: Alexander Bakker Date: Thu, 7 Sep 2023 23:51:01 +0200 Subject: [PATCH 006/196] Check for null returned by getQsTile() Apparently ``getQsTile()`` can return null, which resulted in a crash. Reported through the Google Play Console: ``` Exception java.lang.NullPointerException: Attempt to invoke virtual method 'void android.service.quicksettings.Tile.setState(int)' on a null object reference at com.beemdevelopment.aegis.services.LaunchAppTileService.onStartListening at android.service.quicksettings.TileService$H.handleMessage (TileService.java:488) at android.os.Handler.dispatchMessage (Handler.java:106) at android.os.Looper.loopOnce (Looper.java:205) at android.os.Looper.loop (Looper.java:294) at android.app.ActivityThread.main (ActivityThread.java:8177) at java.lang.reflect.Method.invoke at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:552) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:971) ``` --- .../aegis/services/LaunchAppTileService.java | 6 ++++-- .../aegis/services/LaunchScannerTileService.java | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/beemdevelopment/aegis/services/LaunchAppTileService.java b/app/src/main/java/com/beemdevelopment/aegis/services/LaunchAppTileService.java index 7b86b0fa..6fac0647 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/services/LaunchAppTileService.java +++ b/app/src/main/java/com/beemdevelopment/aegis/services/LaunchAppTileService.java @@ -16,8 +16,10 @@ public class LaunchAppTileService extends TileService { public void onStartListening() { super.onStartListening(); Tile tile = getQsTile(); - tile.setState(Tile.STATE_INACTIVE); - tile.updateTile(); + if (tile != null) { + tile.setState(Tile.STATE_INACTIVE); + tile.updateTile(); + } } @Override diff --git a/app/src/main/java/com/beemdevelopment/aegis/services/LaunchScannerTileService.java b/app/src/main/java/com/beemdevelopment/aegis/services/LaunchScannerTileService.java index 99e07652..cb215a19 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/services/LaunchScannerTileService.java +++ b/app/src/main/java/com/beemdevelopment/aegis/services/LaunchScannerTileService.java @@ -16,8 +16,10 @@ public class LaunchScannerTileService extends TileService { public void onStartListening() { super.onStartListening(); Tile tile = getQsTile(); - tile.setState(Tile.STATE_INACTIVE); - tile.updateTile(); + if (tile != null) { + tile.setState(Tile.STATE_INACTIVE); + tile.updateTile(); + } } @Override From c65ecd9c54f1803fb485ddc041500672d120a9b1 Mon Sep 17 00:00:00 2001 From: Alexander Bakker Date: Sat, 9 Sep 2023 12:06:27 +0200 Subject: [PATCH 007/196] Update translations from Crowdin --- app/src/main/res/values-ar-rSA/strings.xml | 25 ++- app/src/main/res/values-bg-rBG/strings.xml | 73 +++++-- app/src/main/res/values-cs-rCZ/strings.xml | 7 + app/src/main/res/values-da-rDK/strings.xml | 225 +++++++++++---------- app/src/main/res/values-de-rDE/strings.xml | 5 + app/src/main/res/values-el-rGR/strings.xml | 5 + app/src/main/res/values-eu-rES/strings.xml | 5 + app/src/main/res/values-fr-rFR/strings.xml | 5 + app/src/main/res/values-fy-rNL/strings.xml | 5 + app/src/main/res/values-it-rIT/strings.xml | 5 + app/src/main/res/values-lv-rLV/strings.xml | 1 + app/src/main/res/values-nl-rNL/strings.xml | 5 + app/src/main/res/values-pl-rPL/strings.xml | 10 + app/src/main/res/values-ro-rRO/strings.xml | 6 + app/src/main/res/values-ru-rRU/strings.xml | 7 + app/src/main/res/values-zh-rCN/strings.xml | 4 + 16 files changed, 257 insertions(+), 136 deletions(-) diff --git a/app/src/main/res/values-ar-rSA/strings.xml b/app/src/main/res/values-ar-rSA/strings.xml index ad9b69e5..8f85171f 100644 --- a/app/src/main/res/values-ar-rSA/strings.xml +++ b/app/src/main/res/values-ar-rSA/strings.xml @@ -1,7 +1,7 @@ الإعدادات - عن + عنّا حذف نقل تعديل الأيقونة @@ -60,12 +60,12 @@ قم بعمل نسخة احتياطية يدويًّا عدد الإصدارات المراد الاحتفاظ بها - احتفظت 0 من بإصدار النسخ الاحتياطية - احتفظ بإصدار %1$d من النسخة الاحتياطية - أحتفاظ بإصدارين من النسخ الاحتياطية - احتفظ بإصدار %1$d من النسخ الاحتياطية - احتفظ بإصدار %1$d من النسخ الاحتياطية - احتفظ بـ %1$d إصدارات من النسخ الاحتياطية + احتفظ ب%1$d إصدارات من النسخ الاحتياطية + احتفظ بإصدار واحد من النسخ الاحتياطية + احتفظ بإصدارين من النسخ الاحتياطية + احتفظ ب%1$d إصدارات من النسخ الاحتياطية + احتفظ ب%1$d إصدارات من النسخ الاحتياطية + احتفظ ب%1$d إصدارات من النسخ الاحتياطية استيراد من تطبيق استيراد الرموز من تطبيق (يتطلب الوصول إلى الجذر root) @@ -164,6 +164,7 @@ شارك نعم لا + تراجع فتح القفل متقدم العداد @@ -373,7 +374,7 @@ اختر أيقونة افتح المخزن افتح الماسح - تفعيل مربعات الاختيار + تبديل خانات التأشير بحث إشعار القفل يمكن لـ Aegis عرض إشعار مستمر لتنبيهك عند قفل المخزن @@ -471,6 +472,14 @@ حذف المخزن على الزناد الذعر احذف المخزن عند تلقي مصدر ذعر من Ripple استيراد مخزن + + لم يُؤشَّر %d من التكرار المحتمل. الرجاء مراجعة قائمة الإدخالات. + لم يُؤشَّر %d من التكرار المحتمل. الرجاء مراجعة قائمة الإدخالات. + لم يُؤشَّر %d من التكرار المحتمل. الرجاء مراجعة قائمة الإدخالات. + لم يُؤشَّر %d من التكرارات المحتملة. الرجاء مراجعة قائمة الإدخالات. + لم يُؤشَّر %d من التكرارات المحتملة. الرجاء مراجعة قائمة الإدخالات. + لم يُؤشَّر %d من التكرارات المحتملة. الرجاء مراجعة قائمة الإدخالات. + توفير مِلَفّ النسخ الاحتياطي 2FAS Authenticator. توفير مِلَفّ Aegis للتصدير / النسخ الاحتياطي. توفير مِلَفّ تصدير Authenticator Plus الذي تم الحصول عليه من خلال الإعدادات -> النسخ الاحتياطي & استعادة -> تصدير كنص و HTML. diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/app/src/main/res/values-bg-rBG/strings.xml index 80a46b94..fcdf7588 100644 --- a/app/src/main/res/values-bg-rBG/strings.xml +++ b/app/src/main/res/values-bg-rBG/strings.xml @@ -13,26 +13,27 @@ Издател PIN (4–16 цифри) PIN (4 цифри) + Препоръчително Брой използвания Внимание Приложение Записи Андроид Автоматични резервни копия - Режим на работа - Персонализирайте режима на работа при взаимодействие със списъка с записи. + Поведение + Настройки на поведението при взаимодействие със списъка със записи. Външен вид Изберете темата, езика и други настройки, които влияят на външния вид на приложението. Сигурност - Настройка на шифроване, отключване с биометрични данни, автоматично заключване и други настройки за сигурност. - Импорт & Експорт - Импортирайте резервни копия на Aegis или други приложения за удостоверяване. Създайте ръчно експортиране на своя Aegis трезор. + Настройки на шифроване, отключване с биометрични данни, автоматично заключване и други настройки за сигурност. + Внасяне и изнасяне + Внасяне на резервни копия от Aegis или други приложения за удостоверяване. Ръчно изнасяне на трезора на Aegis. Резервни копия Настройте автоматични резервни копия на избрано от вас място или се възползвайте от облачната услуга за резервни копия на Андроид. Пакети с икони Управление и внасяне на пакети с икони Тема - Режим на преглед + Изглед на списъка Език Показване на икони До всеки запис да се показва икона @@ -48,6 +49,7 @@ Автоматично създавайте резервни копия на трезора във външно хранилище, когато се правят промени. Това се поддържа само за шифровани трезори. Напомняне за резервни копия Покзва напомняне да направите резервно копие, в случай че нямате копие на последните промени. + Изключване на напомняне за резервно копие Директория за архивни файлове Архивите ще се съхраняват в Задействайте архивиране @@ -59,9 +61,16 @@ Импортиране от приложение Импортиране на токени от приложение (изисква root достъп) - Експортиране - Експортирайте трезора + Изнасяне + Изнасяне на трезора Напомняне за парола + Изнасяне за Google Authenticator + Създава кодове за QR, съвместими с Google Authenticator + Няма данни, които дабъдат изнесени + + Пропуснат е %d несъвместим елемент + Пропуснати са %d несъвместими елемента + Сигурност на екрана Блокирайте екранни снимки и други опити за заснемане на екрана в приложението Докоснете, за да разкриете @@ -74,6 +83,11 @@ Бутонът за връщане назад е натиснат Приложението е минимизирано Устройството е заключено + Резервни копия и изнасяне + Отделни пароли за резервни копия и изнасяне + Ако е включено, паролата, отключваща приложението не може да бъде използвана за резервни копия и изнасяне. + Промяна на паролата за резервни копия и изнасяне + Задава нова парола за шифроване на трезора при резервни копия и изнасяне. Шифроване Шифроване на хранилището, отключване с парола или биометрични нанни Отключване с биометрични данни @@ -81,11 +95,21 @@ Смяна на паролата Задайте нова парола, която ще ви трябва, за да отключите трезора си Шифровайте трезора - Това действие ще експортира трезора от вътрешното хранилище на Aegis. Изберете формата, който искате да бъде експорта ви: - На път сте да експортирате нешифровано копие на своя Aegis трезор. Това не се препоръчва. + По този начин ще бъде изнесен трезора на Aegis от вътрешното хранилище. Изберете формата на данните, в който искате да бъдат изнесени: + На път сте да изнесете нешифровано копие на трезора на Aegis. Това е силно непрепоръчително. + Изнасяните данни се шифроват с отделна парола, която се задава в раздел Сигурност. Aegis (.JSON) Текстов файл (.TXT) - Експорт формат + Интернет страница (.HTML) + Изнасяне като + Изнасяне на всички групи + Изберете кои групи да бъдат изнесени + + %d избрана група + %d избрани групи + + Не са избрани групи, които да бъдат изнесени + Изнесени данни от Aegis Authenticator Сигурност Aegis е 2FA приложение, фокусирано върху сигурността. Токените се съхраняват в трезор, който по желание може да бъде шифрован с избрана от вас парола. Ако нападател получи вашия шифрован файл на трезора, той няма да може да осъществи достъп до съдържанието, без да знае паролата. \n\nПодбрахме опцията, която според нас най-добре пасва на вашето устройство. Нищо @@ -114,7 +138,8 @@ Сподели Да Не - Отключи + Отменяне + Отключване Разширени Брояч Цифри @@ -135,7 +160,7 @@ Паролите трябва да са еднакви и да не са празни Моля, изберете метод за удостоверяване Шифроване на трезора - Експортиране на трезора + Изнасяне на трезора Четене на файла Изтрий запис Сигурни ли сте, че искате да изтриете този запис? @@ -178,8 +203,8 @@ Изберете приложението, от което искате да импортирате Изберете желаната тема Изберете къде да бъде показано името на профила - Изберете желания режим на преглед - Изберете поведение при копиране + Изберете желания изглед на списъка + Изберете действие, което да копира Възникна грешка при опит за анализиране на файла Грешка: Файлът не е намерен Възникна грешка при опит за четене на файла @@ -189,13 +214,16 @@ Импортирани %d записа По време на импортирането възникна една или повече грешки - Възникна грешка при опит за експортиране на трезора - Трезорът е експортиран + Възникна грешка при изнасяне на трезора + Трезорът е изнесен Възникна грешка при опит за задаване на паролата. Възникна грешка при опит за активиране на биометрично отключване. Някои устройства имат лоши имплементации на биометрично удостоверяване и е вероятно вашето да е едно от тях. Помислете вместо това да преминете към конфигурация само с парола. Няма налични камери Възникна грешка при опит за четене на QR кода Aegis не е съвместим с частния 2FA алгоритъм на Microsoft. Моля, не забравяйте да изберете „Надстройка на приложение без известия“, когато конфигурирате 2FA в Office 365. + Установени са частично изнасени данни за Google Authenticator + Няколко QR кода не са внесени. Следните кодове липсват:\n\n%s\n\nМожете да продължите с частично внасяне на данни, но е препоръчително да направите нов опит с всички QR кодове без риск от загуба на маркери за достъп. + Грешка при внасяне към Google Authenticator Необработен Отключване на трезора (това устройство) @@ -273,6 +301,7 @@ Очакван QR код #%d, но вместо това е сканиран #%d Скорошно архивиране на трезора бе неуспешно + Трезорът скоро е изнесен в чист текст Смяна на камера Няма кодове за показване. Започнете да добавяте записи, като докоснете знака плюс в долния десен ъгъл Няма открити записи @@ -304,7 +333,11 @@ Aegis получи спусък за паника, но настройката е деактивирана, игнорирайки Изтрийте трезора при спусъка за паника Изтрийте трезора, когато от Ripple е получен спусък за паника - Доставете файл за експортиране/архивиране на Aegis. + + Махната е отметката на %d вероятно дублиран запис. Прегледайте списъка. + Махната е отметката на %d вероятно дублирани записа. Прегледайте списъка. + + Доставете изнесен файл или резервно копие на Aegis. Доставете файл за експортиране на Authenticator Plus, получен чрез Настройки -> Архивиране & Възстановяване -> Експортирайте като текст и HTML. Доставете копие на /data/data/com.authy.authy/shared_prefs/com.authy.storage.tokens.authenticator.xml, намиращо се във вътрешната директория за съхранение на Authy. Доставете andOTP файл за експортиране/архивиране. @@ -322,4 +355,8 @@ Скрито До издателя Под издателя + + %d избран елемент + %d избрани елемента + diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index f8a7f593..f196e2a3 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -158,6 +158,7 @@ Sdílet Ano Ne + Zpět Odemknout Pokročilé Počítadlo @@ -449,6 +450,12 @@ Smazat trezor při signálu paniky Smazat trezor při obdržení signálu paniky z aplikace Ripple Importovat trezor + + Zrušeno označení %d možné duplicity. Zkontrolujte prosím seznam položek. + Zrušeno označení %d možných duplicit. Zkontrolujte prosím seznam položek. + Zrušeno označení %d možných duplicit. Zkontrolujte prosím seznam položek. + Zrušeno označení %d možných duplicit. Zkontrolujte prosím seznam položek. + Dodejte záložní soubor 2FAS Authenticator. Dodejte soubor exportu/zálohy Aegis. Dodejte exportovaný soubor Authenticator Plus získaný přes Nastavení -> Záloha a obnovení -> Exportovat jako text a HTML. diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index 0edbc7f1..bf215aa8 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -36,7 +36,7 @@ Visningstilstand Sprog Vis ikoner - Vis ikoner ved siden af hver post + Vis ikoner ud for hver post Kodeciffergruppering Vælg antal cifre til kodegruppering Vis kontonavnet @@ -51,9 +51,9 @@ Sikkerhedskopiér automatisk Boksen Opret automatisk sikkerhedskopier af Boksen på ekstern lagerplads, når ændringer foretages. Dette understøttes kun for krypterede Bokse. Sikkerhedskopieringspåmindelse - Vis en påmindelse om at sikkerhedskopiere boksen, såfremt de seneste ændringer ikke er sikkerhedskopieret. + Vis en påmindelse om at sikkerhedskopiere Boksen, såfremt dette ikke er sket ifm. de seneste ændringer. Deaktivér sikkerhedskopieringspåmindelse - Deaktivering af denne påmindelse betyder, at Aegis ikke adviserer om endnu ikke er sikkerhedskopieret ændringer. Dette indebærer en risiko for at miste adgang til tokener. Sikker på, at påmindelsen skal deaktiveres? + Deaktivering af denne påmindelse betyder, at Aegis ikke adviserer om manglende sikkerhedskopiering af ændringer, hvilket indebærer en risiko for at miste adgang til tokener. Sikker på, at påmindelsen skal deaktiveres? Mappe til sikkerhedskopifiler Sikkerhedskopier vil blive gemt til Udløs sikkerhedskopiering @@ -63,7 +63,7 @@ Behold %1$d version af sikkerhedskopien Behold %1$d versioner af sikkerhedskopien - Import fra sti + Import fra app Importér tokens fra en app (kræver root-adgang) Export Eksportér Boksen @@ -73,44 +73,44 @@ Ingen data at eksportere %d inkompatibel post oversprunget - %d inkompatibel poster oversprunget + %d inkompatible poster oversprunget Vis %s påmindelse om at angive adgangskoden, så den ikke glemmes. Deaktiveret Skærmsikkerhed Blokér skærmfotos og andre forsøg på at optage skærmen inde i appen Tryk for at vise - Tokens vil som standard være skjulte. Tryk på dem for at afsløre kode. + Tokens vil som standard være skjulte. Tryk på dem for at få koden vist. Timeout for tryk til visning Autolås Når %s Deaktiveret - Lås automatisk Aegis når + Lås automatisk Aegis, når Der trykkes på tilbage-knappen Appen minimeres - Når enheden låses + Enheden låses Sikkerhedskopiering og Eksport Forskellig adgangskode for sikkerhedskopi og eksport - Hvis aktiveret, kan app-oplåsningskoden ikke længere bruges til sikkerhedskopidekryptering samt eksporter. - Skift adgangskode for sikkerhedskopi og eksport + Når aktiveret, kan app-oplåsningskoden ikke længere bruges til dekryptering af sikkerhedskopier og eksporter. + Skift adgangskode for sikkerhedskopiering og eksport Angiv en ny adgangskode til brug for Boks-kryptering under sikkerhedskopiering og eksport. Kryptering - Krypter boksen og lås den op med en adgangskode eller biometri + Kryptér og oplås Boksen med adgangskode/biometri Biometrisk oplåsning - Tillad biometrisk verifikation til oplåsning af boksen + Tillad biometrisk godkendelse for at oplåse Boksen Skift adgangskode - Indstil en ny adgangskode, som du skal bruge til at låse din boks op + Sæt ny adgangskode til brug for oplåsning af din Boks Kryptér boksen - Denne handling vil eksportere boksen ud af Aegis\' interne lager. Vælg det format, som du gerne vil eksportere i: + Denne handling eksporterer Boksen ud af Aegis\' interne lager. Vælg det format Boksen skal eksportere som: Du er ved at eksportere en ukrypteret kopi af din Aegis-boks. Dette er ikke anbefalet. Eksporter krypteres vha. en separat adgangskode opsat i Sikkerhedsindstillinger. Risikoen er forstået Aegis (.JSON) - Tekst fil (.TXT) + Tekstfil (.TXT) Webside (.HTML) Eksportformat Eksportér alle grupper - Vælg, hvilke grupper der skal eksporteres + Vælg de grupper, som skal eksporteres %d gruppe valgt %d grupper valgt @@ -118,32 +118,32 @@ Ingen grupper valgt til eksport Aegis Authenticator Eksport Sikkerhed - Aegis er en sikkerhedsfokuseret 2FA-app. Tokens opbevares i en boks, som kan krypteres med en adgangskode efter dit eget valg. Hvis en angriber får adgang til din krypteret boks-fil, vil de ikke kunne få adgang til indholdet uden at kende adgangskoden.\n\nVi har på forhånd valgt den indstilling, som vi mener passer bedst til din enhed. + Aegis er en sikkerhedsfokuseret 2FA-app. Tokener opbevares i en Boks, der kan krypteres med en valgfri adgangskode. Opnår en angriber adgang til den krypteret Boks-fil, vil vedkommende ikke kunne tilgå indholdet uden brug af adgangskoden.\n\nVi har på forhånd valgt den indstilling, som vi mener passer bedst til enheden. Ingen Ingen adgangskode er nødvendig for at låse op for boksen og den vil ikke blive krypteret. Denne indstilling anbefales ikke. Adgangskode - En adgangskode er nødvendig for at låse boksen op. - Advarsel: Hvis du glemmer din adgangskode, vil du miste adgang til dine tokens permanent. Der er ingen mulighed for at gendanne dem uden adgangskoden. + En adgangskode kræves til oplåsning af Boksen. + Advarsel: Glemmes adgangskoden, bliver dine tokens permanent utilgængelige. De vil ikke kunne gendannes uden brug af adgangskoden. Biometri - Ud over en adgangskode kan biometri, der er registreret på denne enhed såsom et fingeraftryk eller dit ansigt, bruges til at låse boksen op. - Lås op for boksen - Lås\nboksen op + Ud over en adgangskode kan denne enheds registrerede biometri, såsom fingeraftryk eller ansigt, bruges til oplåsning af Boksen. + Oplås Boksen + Oplås\nBoksen Eller tryk her for at bruge biometri - Indtast en adgangskode - Indtast et gruppenavn - Indtast et tal - Bekræft venligst adgangskoden + Angiv adgangskode + Angiv et gruppenavn + Angiv et tal + Bekræft adgangskoden Adgangskoden er forkert - En ændring i din enheds sikkerhedsindstillinger er detekteret. Gå til \"Aegis -> Indstillinger -> Sikkerhed -> Biometrisk oplåsning\" for at deaktivere og genaktivere biometrisk oplåsning. - Angiv din adgangskode. Vi beder dig lejlighedsvis gøre dette, så du ikke glemmer den. + En ændring i enhedens sikkerhedsindstillinger er detekteret. Gå til \"Aegis -> Indstillinger -> Sikkerhed -> Biometrisk oplåsning\" for at slå biometrisk oplåsning fra og til. + Angiv adgangskoden. Vi beder dig lejlighedsvis gøre dette, så du ikke glemmer den. Biometrisk oplåsning som standard - For at hindre, at du bliver låst ude af din boks, beder vi lejlighedsvis om din adgangskode, så du ikke glemme den. Efter du har angivet adgangskoden, fortsætter Aegis med biometrisk oplåsning som standard indtil den næste påmindelse. + For at hindre, at du låses ude af din Boks, beder vi lejlighedsvis om adgangskoden, så den ikke glemmes. Efter du har angivet adgangskoden, fortsætter Aegis med biometrisk oplåsning som standard indtil den næste påmindelse. Aldrig Ugentlig - 14-dages + 14. dag Månedligt Kvartalsvist - Det ser ud til at denne 2FAS-backup er krypteret. Indtast venligst adgangskoden nedenfor. + Det lader til, at denne 2FAS-sikkerhedskopi er krypteret. Angiv adgangskoden nedenfor. Det ser ud til at Authy-tokenerne er krypterede. Luk Aegis, åbn Authy og oplås tokener med adgangskoden. Alternativ kan Aegis forsøge at dekryptere Authy-tokenerne, hvis adgangskode angives nedenfor. Angiv importadgangskoden Periode (sekunder) @@ -152,14 +152,15 @@ Del Ja Nej - Lås op + Fortryd + Oplås Avanceret Tæller Cifre - Hemmelig - Scan QR-kode - Scan billede - Indtast manuelt + Hemmelighed + Skan QR-kode + Skan billede + Angiv manuelt Konfigurer biometrisk oplåsning Kopier Rediger @@ -171,13 +172,13 @@ Vis adgangskode Ny post Tilføj ny post - Kunne ikke låse boksen op - Forkert adgangskode. Sørg for at du ikke har indtastet din adgangskode forkert. - Adgangskoder skal være identiske og ikke-tomme - Vælg venligst en verifikationsmetode - Krypterer boksen - Eksporterer boksen - Indlæser fil + Kunne ikke oplåse Boksen + Forkert adgangskode. Tjek, at der ikke er slåfejl i adgangskoden. + Adgangskoder er obligatoriske og skal matche + Vælg bekræftelsesmetode + Krypterer Boksen + Eksporterer Boksen + Læser fil Anmoder om root-adgang Analyserer QR-kode Analyserer QR-kode %d/%d (%s) @@ -187,41 +188,41 @@ Importerer ikonpakke Slet post - Er du sikker på, du vil slette denne post? + Sikker på, at denne post skal slettes? Denne handling deaktiverer ikke 2FA for:\n%s\n\nFor at bevare adgang, så tjek, at 2FA er deaktiveret, eller at en alternativ kodegenereringsmetode til denne tjeneste findes. Slet poster - Er du sikker på, du vil slette %d post? - Er du sikker på, du vil slette %d poster? + Sikker på, at %d post skal slettes? + Sikker på, at %d poster skal slettes? Kassér ændringer? - Din ændringer er ikke blevet gemt + Ændringer blev ikke gemt Fejl under lagring af profil Velkommen Aegis er en gratis, sikker og open-source 2FA-app Opsætning fuldført - Aegis er blevet indstillet og er klar til brug. + Aegis er blevet opsat og er klar til brug. Boks ikke fundet, starter opsætning… Kopieret Fejl kopieret til udklipsholderen Version kopieret til udklipsholderen - Der opstod en fejl - Der opstod en fejl under forsøget på at låse boksen op - Der opstod en fejl under forsøget på at låse boksen op. Din boksfil kan være beskadiget. - Der opstod en fejl under forsøget på at gemme boksen - Der opstod en fejl under forsøget på at gøre boksen klar - Der opstod en fejl under forsøget på at indlæse boksen fra lager - Der opstod en fejl under forsøget på at dekryptere boksen med biometrisk godkendelse. Dette sker normalt kun hvis din enheds sikkerhedsindstillinger blev ændret. Lås boksen op med din adgangskode, og rekonfigurer biometrisk godkendelse i Aegis\' indstillinger. - Der opstod en fejl under forberedelsen af biometrisk godkendelse. Dette sker normalt kun, hvis din enheds sikkerhedsindstillinger blev ændret. Lås boksen op med din adgangskode, og rekonfigurer biometrisk godkendelse i Aegis\' indstillinger. + En fejl opstod + En fejl opstod under forsøget på at oplåse Boksen + En fejl opstod under forsøget på at oplåse Boksen. Boksfilen kan være beskadiget. + En fejl opstod under forsøget på at gemme Boksen + En fejl opstod under forsøget på at initialisere Boksen + En fejl opstod under forsøget på at indlæse Boksen fra lager + En fejl opstod under forsøget på at dekryptere Boksen via biometrisk godkendelse. Dette sker normalt kun, såfremt enhedens sikkerhedsindstillinger er blevet ændret. Oplås Boksen med adgangskoden, og genopsæt biometrisk godkendelse i Aegis-indstillingerne. + En fejl opstod under klargøring til biometrisk godkendelse. Dette sker normalt kun, såfremt enhedens sikkerhedsindstillinger er blevet ændret. Oplås Boksen med adgangskoden, og genopsæt biometrisk godkendelse i Aegis-indstillingerne. Deaktivér kryptering - Er du sikker på, at du vil deaktivere kryptering? Dermed vil boksen blive gemt i almindelig tekst. Automatiske sikkerhedskopier vil også blive deaktiveret. - Der opstod en fejl under aktivering af kryptering - Der opstod en fejl under deaktivering af kryptering - Sikkerhedskopieringen blev planlagt med succes - Der opstod en fejl under forsøget på at oprette en sikkerhedskopi + Sikker på, at kryptering skal deaktiveres? Boksen gemmes i så fald som alm. tekst. Automatiske sikkerhedskopier deaktiveres ligeledes. + En fejl opstod under aktivering af kryptering + En fejl opstod under deaktivering af kryptering + Sikkerhedskopieringen er hermed planlagt + En fejl opstod under forsøget på at oprette en sikkerhedskopi Senest gennemførte sikkerhedskopiering: %s Senest mislykket sikkerhedskopiering: %s - Ingen sikkerhedskopieringer foretaget endnu + Ingen sikkerhedskopier oprettet endnu Sikkerhedskopier krypteres vha. en separat adgangskode opsat i Sikkerhedsindstillinger DokumenterUI synes at mangle fra din enhed. Dette er en vigtig systemkomponent, der er nødvendig for udvælgelse og oprettelse af dokumenter. Hvis du brugte et værktøj til "rense" din enhed, kan du ved et uheld have slettet den og bliver nødt til at geninstallere den. En fejl opstod under forsøget på at importere en ikonpakke @@ -233,18 +234,18 @@ Tilpasset Tilladelse nægtet - Nyt format (v0.6.3 eller nyere) - Gammelt format (v0.6.2 eller ældre) - Hvilket format har andOTP backup-filen? - Er denne TOTP Authenticator backup krypteret med en adgangskode? - Vælg den applikation, du vil importere fra - Vælg dit ønskede tema + Nyt format (v0.6.3 eller senere) + Gammelt format (v0.6.2 eller tidligere) + Hvilket format har andOTP-sikkerhedskopifilen? + Er denne TOTP Authenticator-sikkerhedskopi krypteret med en adgangskode? + Vælg den applikation, der skal importeres fra + Vælg ønskede tema Vælg den ønskede position for kontonavnet - Vælg din ønskede visningstilstand - Vælg den ønskede kopieringsadfærd - Der opstod en fejl under forsøget på at tolke filen + Vælg ønskede visningstilstand + Vælg ønskede kopieringsadfærd + En fejl opstod under forsøget på at fortolke filen Fejl: Fil ikke fundet - Der opstod en fejl under forsøg på at læse filen + En fejl opstod under forsøg på at læse filen Fejl: App er ikke installeret Den installerede version af %s understøttes ikke. Nyere versioner er begyndt at kryptere visse filer i den interne lagermappe, hvilket gør Aegis ude af stand til at tilgå den information, den behøver til importen. Forsøg på import vil sandsynligvis resultere i en fejl. Fortsæt alligevel? Fejl: Kan ikke opnå root-adgang @@ -258,13 +259,13 @@ En fejl opstod under import af Boksen En eller flere fejl opstod under import - Der opstod en fejl under forsøget på at eksportere boksen - Boksen blev eksporteret - Der skete en fejl under forsøget på at indstille adgangskoden. - Der opstod en fejl under forsøget på at aktivere biometrisk oplåsning. Nogle enheder har dårlige implementeringer af biometrisk autentificering, og det er sandsynligt, at din er en af dem. Overvej i stedet at skifte til en adgangskode-konfiguration. + En fejl opstod under forsøget på at eksportere Boksen + Boksen er eksporteret + En fejl opstod under indstilling af adgangskoden. + En fejl opstod under aktivering af biometrisk oplåsning. Nogle enheder har dårlige implementeringer af biometrisk godkendelse, hvilket sandsynligvis er fejlårsagen. Overvej i stedet at skifte til en kun-adgangskode opsætning. Ingen kameraer tilgængelige - Der opstod en fejl under forsøg på at læse QR-koden - Aegis er ikke kompatibel med Microsofts proprietære 2FA-algoritme. Sørg for at vælge \"Opsæt applikation uden notifikationer\", når du konfigurerer 2FA i Office 365. + En fejl opstod under læsning af QR-koden + Aegis er inkompatibel med Microsofts proprietære 2FA-algoritme. Sørg for at vælge \"Opsæt applikation uden notifikationer\", når 2FA opsættes i Office 365. Ufuldstændig Google Authenticator-eksport detekteret Nogle QR-koder mangler i importen. Flg. koder er ikke fundet:\n\n%s\n\nMan kan fortsætte med import af denne delvise eksport, dog anbefales det at prøve igen med alle QR-koderne, så man ikke risikerer at miste adgang til nogle tokens. • QR-kode %d @@ -273,10 +274,10 @@ Eksporten indeholder information om et urelateret sæt. Prøv at importere 1 sæt ad gangen. Som konsekvens, kan ingen tokener importeres Raw - Låser boksen op + Oplåser Boksen (denne enhed) Fjern gruppe - Er du sikker på, at du vil fjerne denne gruppe? Poster i denne gruppe vil automatisk skifte til \'Ingen gruppe\'. + Sikker på, at denne gruppe skal fjernes? Poster heri vil automatisk skifte til \'Ingen gruppe\'. Fjern ikonpakke Sikker på, at du vil fjerne denne ikonpakke? Poster, som bruger ikoner fra denne pakke, påvirkes ikke. Detaljer @@ -284,7 +285,7 @@ Lås Navn Ingen gruppe - Sorter + Sortering Udsteder (A til Z) Udsteder (Z til A) Konto (A til Z) @@ -295,27 +296,27 @@ Gruppe Gruppenavn Redigér grupper - Håndtér og slet dine grupper her + Håndtér og slet grupper her Nulstil brugstæller Nulstil alle brugstællingsposter i din Boks Sikker på, at alle brugstællingsposter i din Boks skal nulstilles? Notat Ryd - Fremhæv tokens ved tryk - Gør tokens lettere at skelne fra hinanden ved midlertidigt at fremhæve dem, når der trykkes på dem + Fremhæv tokener ved tryk + Gør tokener lettere at skelne fra hinanden ved midlertidigt at fremhæve dem, når der trykkes på dem Minimér under kopiering Minimér appen efter kopiering af et token Kopiér tokens til udklipsholderen - Frys tokens ved tryk - Pausér automatisk opdatering af tokens ved at trykke på dem. Tokens opdateres ikke, så længe de er fokuseret. Kræver \"Fremhæv tokens ved tryk\" eller \"Tryk for at afsløre\". - Indtast din adgangskode for at aktivere PIN-tastaturet. Bemærk at dette kun virker, hvis din adgangskode kun består af tal + Frys tokener ved tryk + Pausér automatisk opdatering af tokener ved at trykke på dem. Tokener opdateres ikke, så længe de er fokuseret. Kræver \"Fremhæv tokener ved tryk\" eller \"Tryk for at vise\". + Angiv adgangskoden for at aktivere PIN-tastaturet. Bemærk, at dette kun virker, såfremt adgangskoden alene består af cifre Fejl under aktivering af PIN-tastatur - Det er ikke muligt at angive PIN-tastatur. Din adgangskode må kun bestå af tal. - Adgangskode ændret. PIN-tastaturet vil ikke længere blive vist. + Det er ikke muligt at angive PIN-tastatur. Adgangskoden må kun bestå af cifre. + Adgangskoden ændret. PIN-tastaturet vises ikke længere. Valgt Mørkt tema Lyst tema - AMOLED tema + AMOLED-tema Indstillet af batterisparefunktion Indstillet af batterisparefunktion (AMOLED) Normal @@ -325,10 +326,10 @@ Ukendt udsteder Ukendt kontonavn - Aegis kunne ikke importere %d token. Disse tokens vil blive sprunget over. Tryk \'detaljer\' for at se mere information om fejlene. - Aegis kunne ikke importere %d tokens. Disse tokens vil blive sprunget over. Tryk \'detaljer\' for at se mere information om fejlene. + Aegis kunne ikke importere %d token. Dette token overspringes. Tryk på \'detaljer\' for yderligere information om fejlen. + Aegis kunne ikke importere %d tokener. Disse tokener overspringes. Tryk på \'detaljer\' for yderligere information om fejlene. - Kan ikke behandle dybt link + Dybt link kan ikke behandles Kan ikke læse og behandle QR-koden fra filen: %s. Kan ikke behandle delt tekst som OTP Kan ikke læse og behandle nogle af QR-koderne. Kun %d/%d poster importeres. @@ -341,34 +342,34 @@ Søg Låsestatus Aegis kan oprette en vedvarende notifikation for at give dig besked, når boksen er låst - Boksen er låst op. Tryk her for at låse. + Boksen er oplåst. Tryk hér for at låse. Version Ændringslog - Hvad er nyt - Kildekode, problemer og oplysninger + Nyheder + Kildekode, problematikker og information Licens Aegis Authenticator er licenseret under GPLv3 Tredjepartslicenser Licenser fra tredjepartsbibliotekerne Aegis bruger Nederlandene Skriv en e-mail - Besøg vores hjemmeside + Besøg vores websted Support Bedøm - Støt os ved at lave en anmeldelse i Google Play Store - Denne enhed understøtter ikke webvisning, hvilket er nødvendigt for at se ændringslog og licensen. Den mangler en systemkomponent. + Støt os ved at skrive en anmeldelse i Google Play Store + Denne enhed understøtter ikke webvisning, hvilket kræves for at vise ændringslog og licens. En systemkomponent mangler. E-mail Automatisk tidssynkronisering - Aegis er afhængig af systemets tid for at være i synk til generering af korrekte koder. En afvigelse på kun et par sekunder kan resultere i forkerte koder. Det ser ud til, at din enhed ikke er konfigureret til automatisk at synkronisere tiden. Vil du gøre det nu? - Hold op med at advare mig. Jeg ved, hvad jeg gør. - Ikke-relateret QR-kode fundet. Prøv at genstarte scanneren. + Aegis er afhængig af systemtiden for at være i synk til generering af korrekte koder. En afvigelse på kun et par sekunder kan resultere i forkerte koder. Det ser ud til, at enheden ikke er opsat til auto-synk af tid. Opsæt dette nu? + Ophør med at advare mig. Jeg ved, hvad jeg gør. + Ikke-relateret QR-kode fundet. Prøv at genstarte skanneren. - Scannede %d/%d QR-koder - Scannede %d/%d QR-koder + Skannede %d/%d QR-koder + Skannede %d/%d QR-koder - Forventede QR kode #%d, men scannede #%d i stedet - Boks-backup mislykkedes for nylig - Et nyligt bokssikkerhedskopieringsforsøg vha. %s mislykkedes, da en fejl opstod. Sikkerhedskopieringen blev forsøgt: %s. Tjek sikkerhedskopieringsindstillingerne for at sikre, at sikkerhedskopieringer kan fuldføres. + Forventede QR kode #%d, men skannede #%d i stedet + Bokssikkerhedskopiering mislykkedes for nylig + Et nyligt Bokssikkerhedskopieringsforsøg vha. %s mislykkedes, da en fejl opstod. Sikkerhedskopieringen blev forsøgt: %s. Tjek sikkerhedskopieringsindstillingerne for at sikre, at sikkerhedskopieringer kan fuldføres. Aegis\' indbyggede automatiske sikkerhedskopieringer Android cloud-sikkerhedskopieringssystem @@ -377,12 +378,12 @@ Ændringer er ikke sikkerhedskopieret Ændringer er ikke sikkerhedskopieret - Nylige ændringer i boksen er endnu ikke sikkerhedskopieret. Regelmæssig sikkerhedskopiering er vigtig for at undgå at miste adgang til konti. Overvej opsætning af automatisk sikkerhedskopiering i indstillingsmenuen. + Nylige ændringer i Boksen er endnu ikke sikkerhedskopieret. Regelmæssig sikkerhedskopiering er vigtig for at undgå at miste adgang til konti. Overvej opsætning af automatisk sikkerhedskopiering i indstillingsmenuen. Opsæt sikkerhedskopiering - Boksen blev for nylig eksporteret som simpel tekst + Boksen blev for nylig eksporteret som alm. tekst Vis ikke denne advarsel igen - Denne advarsel vises, da en ukrypteret kopi af Boksen for nyligt er eksporteret. For at opretholde sikkerheden for tokens, anbefales det at slette denne fil, når den ikke længere behøves. + Denne advarsel vises, da en ukrypteret kopi af Boksen for nyligt er eksporteret. For at opretholde sikkerheden for tokener, anbefales det at slette denne fil, når den ikke længere behøves. Skift kamera Der er ingen koder at vise. Begynd at tilføje poster ved at trykke på plus-tegnet i nederste højre hjørne Ingen poster fundet @@ -427,6 +428,10 @@ Slet boks ved panikudløser Slet boks, når en panikudløser modtages fra Ripple Importér Boks + + Afmarkerede %d potentiel dublet. Revidér listen over poster. + Afmarkererede %d potentielle dubletter. Revidér listen over poster. + Stil en 2FAS-godkendelse sikkerhedskopifil til rådighed. Levér en Aegis eksport/backup fil. Levér en Authenticator Plus-eksportfil opnået gennem Indstillinger -> Sikkerhedskopi & Gendan -> Eksport som tekst og HTML. diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index b2cb48c0..4c0ad6ca 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -152,6 +152,7 @@ Teilen Ja Nein + Rückgängig machen Entsperren Fortgeschritten Zähler @@ -427,6 +428,10 @@ Datenbank bei Paniksignal löschen Datenbank löschen, wenn ein Paniksignal von Ripple empfangen wird Datenbank importieren + + Auswahl für %d potenzielles Duplikat aufgehoben. Bitte überprüfe die Einträge. + Auswahl für %d potenzielle Duplikate aufgehoben. Bitte überprüfe die Einträge. + Gib eine 2FAS Authenticator-Sicherungsdatei an. Gib eine Aegis-Export-/Sicherungsdatei an. Gib eine Authenticator Plus-Exportdatei an, die du über Einstellungen -> Sicherung & Rücksicherung -> Exportieren als Text und HTML Format erhältst. diff --git a/app/src/main/res/values-el-rGR/strings.xml b/app/src/main/res/values-el-rGR/strings.xml index 4b7261c4..3bf2b9a8 100644 --- a/app/src/main/res/values-el-rGR/strings.xml +++ b/app/src/main/res/values-el-rGR/strings.xml @@ -152,6 +152,7 @@ Κοινοποίηση Ναι Όχι + Αναίρεση Ξεκλείδωμα Σύνθετες Μετρητής @@ -426,6 +427,10 @@ Διαγραφή κρύπτης στο έναυσμα πανικού Διαγραφή κρύπτης όταν λαμβάνεται ένα έναυσμα πανικού από το Ripple Εισαγωγή κρύπτης + + Μη επιλεγμένο %d πιθανό διπλότυπο. Παρακαλούμε εξετάστε τη λίστα καταχωρήσεων. + Μη επιλεγμένα %d πιθανά διπλότυπα. Παρακαλούμε εξετάστε τη λίστα καταχωρήσεων. + Παρέχετε ένα αντίγραφο ασφαλείας 2FAS Authenticator. Παρέχετε ένα αρχείο εξαγωγής/αντιγράφων ασφαλείας Aegis. Παρέχετε ένα αρχείο εξαγωγής Authenticator Plus που αποκτήθηκε μέσω των Ρυθμίσεων - > Αντιγράφων ασφαλείας & Επαναφορά - > Εξαγωγή ως Κείμενο και HTML . diff --git a/app/src/main/res/values-eu-rES/strings.xml b/app/src/main/res/values-eu-rES/strings.xml index 01cf48a4..e566241d 100644 --- a/app/src/main/res/values-eu-rES/strings.xml +++ b/app/src/main/res/values-eu-rES/strings.xml @@ -152,6 +152,7 @@ Partekatu Bai Ez + Desegin Desblokeatu Aurreratua Kontagailua @@ -425,6 +426,10 @@ Ezabatu biltegia arrisku mezua jasotzean Ezabatu biltegia Rippletik arrisku mezua jasotzean Inportatu biltegia + + Bikoiztutako sarrera posible %d. Errebisatu zerrenda mesedez. + Bikoiztutako %d sarrera posible. Errebisatu zerrenda mesedez. + Aukeratu 2FAS Authenticator segurtasun-kopia fitxategia. Aegisen esportazio/segurtasun-kopia fitxategia aukeratu. Authenticator Plus esportazio fitxategia aukeratu. Lortzeko modua: Settings -> Backup & Restore -> Export as Text and HTML. diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml index ba8aada1..16e63173 100644 --- a/app/src/main/res/values-fr-rFR/strings.xml +++ b/app/src/main/res/values-fr-rFR/strings.xml @@ -152,6 +152,7 @@ Partager Oui Non + Annuler Déverrouiller Avancé Compteur @@ -426,6 +427,10 @@ Supprimer le coffre-fort lors du déclenchement de l\'alerte Supprimer le coffre-fort quand le déclenchement d\'une alerte est reçu de Ripple Importer le coffre-fort + + %d potentiel doublon décoché. Veuillez vérifier la liste des entrées. + %d potentiels doublons décochés. Veuillez vérifier la liste des entrées. + Fournir une sauvegarde 2FAS Authenticator. Fournir un export/sauvegarde Aegis. Fournir un export Authenticator Plus obtenu via Paramètres -> Sauvegarde & Restauration -> Exporter en tant que texte et HTML. diff --git a/app/src/main/res/values-fy-rNL/strings.xml b/app/src/main/res/values-fy-rNL/strings.xml index 48455875..7fbfd16b 100644 --- a/app/src/main/res/values-fy-rNL/strings.xml +++ b/app/src/main/res/values-fy-rNL/strings.xml @@ -152,6 +152,7 @@ Diele Ja Nee + Ungedien meitsje Untskoattelje Avansearre Teller @@ -427,6 +428,10 @@ Klûs fuortsmite by panyktrigger Klûs fuortsmite by ûntfangen fan Ripple-panyktrigger Klûs ymportearje + + %d potinsjele dûbeling net oanfinkt. Kontrolearje de list mei items. + %d potinsjele dûbelingen net oanfinkt. Kontrolearje de list mei items. + Leverje in 2FAS-autentikator-eksportbestân oan. Leverje in Aegis-eksport-/reservekopybestân oan. Leverje in Authenticator Plus-eksportbestân oan krigen fia Ynstellingen -> Reservekopy & Werstelle -> Eksportearje as Tekst en HTML. diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 97cc08a7..53d8f29d 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -152,6 +152,7 @@ Condividi Si No + Annulla Sblocca Avanzate Contatore @@ -426,6 +427,10 @@ Elimina cassaforte al segnale di emergenza Elimina la cassaforte quando Ripple invia un segnale di emergenza Importa cassaforte + + Deselezionato %d potenziale duplicato. Si prega di rivedere l\'elenco delle voci. + Deselezionati %d potenziali duplicati. Si prega di rivedere l\'elenco delle voci. + Seleziona un backup di 2FAS Authenticator. Seleziona un file di backup di Aegis. Seleziona un file di esportazione di Authenticator Plus ottenuto tramite Impostazioni -> Backup & Ripristino -> Esporta come testo e HTML. diff --git a/app/src/main/res/values-lv-rLV/strings.xml b/app/src/main/res/values-lv-rLV/strings.xml index bd89e526..2ab07a20 100644 --- a/app/src/main/res/values-lv-rLV/strings.xml +++ b/app/src/main/res/values-lv-rLV/strings.xml @@ -155,6 +155,7 @@ Kopīgot + Atsaukt Atslēgt Papildu Skaitītājs diff --git a/app/src/main/res/values-nl-rNL/strings.xml b/app/src/main/res/values-nl-rNL/strings.xml index 441e2963..169bd47f 100644 --- a/app/src/main/res/values-nl-rNL/strings.xml +++ b/app/src/main/res/values-nl-rNL/strings.xml @@ -152,6 +152,7 @@ Delen Ja Nee + Ongedaan maken Ontgrendel Geavanceerd Teller @@ -427,6 +428,10 @@ Kluis bij paniektrigger verwijderen Kluis bij ontvangen van Ripple-paniektrigger verwijderen Kluis importeren + + %d potentiële dubbeling niet aangevinkt. Controleer de lijst met items. + %d potentiële dubbelingen niet aangevinkt. Controleer de lijst met items. + Lever een 2FAS Authenticator-back-upbestand aan. Lever een Aegis-export/-back-upbestand aan. Lever een Authenticator Plus-exportbestand aan verkregen via Instellingen -> Back-up & Herstellen -> Exporteren als Tekst en HTML. diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml index a00567c6..73c0d547 100644 --- a/app/src/main/res/values-pl-rPL/strings.xml +++ b/app/src/main/res/values-pl-rPL/strings.xml @@ -41,6 +41,8 @@ Wybierz liczbę cyfr do grupowania według Pokaż nazwę konta Pokaż nazwę konta tylko w razie potrzeby + Pokazuj nazwy kont tylko, gdy są z tego samego wydawcy. Inne nazwy kont zostaną ukryte. + To ustawienie jest nadpisane przez tryb wyświetlania pól. Nazwa konta będzie zawsze wyświetlana pod wydawcą. Importuj z pliku Importuj tokeny z aplikacji Kopia zapasowa Android w chmurze @@ -156,6 +158,7 @@ Udostępnij Tak Nie + Cofnij Odblokuj Zaawansowane Licznik @@ -335,6 +338,7 @@ Normalny Kompaktowy Mały + Pola Nieznany wydawca Nieznana nazwa konta @@ -445,6 +449,12 @@ Usuń sejf przy wyzwalaczu paniki Usuń sejf po otrzymaniu wyzwalacza paniki z Ripple Import sejfu + + Odznaczono %d potencjalny duplikat. Sprawdź listę. + Odznaczono %d potencjalne duplikaty. Sprawdź listę. + Odznaczono %d potencjalnych duplikatów. Sprawdź listę. + Odznaczono %d potencjalnych duplikatów. Sprawdź listę. + Dostarcz plik zapasowy 2FAS Authenticator. Dostarcz plik zapasowy Aegis. Dostarcz plik eksportu Authenticator Plus uzyskany w Ustawienia -> Kopia zapasowa & Przywróć -> Eksportuj jako tekst i HTML. diff --git a/app/src/main/res/values-ro-rRO/strings.xml b/app/src/main/res/values-ro-rRO/strings.xml index 29ff5be5..f728afd7 100644 --- a/app/src/main/res/values-ro-rRO/strings.xml +++ b/app/src/main/res/values-ro-rRO/strings.xml @@ -151,6 +151,7 @@ Distribuie Da Nu + Anulare Deblocare Avansat Contor @@ -432,6 +433,11 @@ Șterge seiful la declanșatorul de panică Șterge seiful atunci când un declanșator de panică este primit de la Ripple Importă seiful + + Am detectat %d potențial duplicat ce a rămas nebifat. Te rugăm să revizuiești lista intrărilor. + Am detectat %d potențiale duplicate ce au rămas nebifate. Te rugăm să revizuiești lista intrărilor. + Am detectat %d de potențiale duplicate ce au rămas nebifate. Te rugăm să revizuiești lista intrărilor. + Furnizează un fișier de backup 2FAS autentificator. Furnizează un fișier export/copie de rezervă Aegis. Furnizează un fişier de export de Autentificator Plus obţinut prin Setări -> Copie de rezervă & Restore -> Export ca Text şi HTML. diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index 91a78e1f..e9643dae 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -158,6 +158,7 @@ Поделиться Да Нет + Отмена Разблокировать Расширенные Счётчик @@ -449,6 +450,12 @@ Удалять хранилище при панике Удалить хранилище при получении сигнала паники от Ripple Импорт хранилища + + Не выбран %d потенциальный дубликат. Проверьте список записей. + Не выбраны %d потенциальных дубликата. Проверьте список записей. + Не выбрано %d потенциальных дубликатов. Проверьте список записей. + Не выбрано %d потенциальных дубликатов. Проверьте список записей. + Необходим файл резервной копии 2FAS. Необходим файл экспорта/резервной копии Aegis. Необходим файл экспорта Authenticator Plus, полученный через «Настройки» → «Рез. копия и восстановление» → «Экспорт текста и HTML». diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 2b08d82e..1d0c031f 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -149,6 +149,7 @@ 分享 确定 取消 + 撤销 解锁 高级设置 计数器 @@ -414,6 +415,9 @@ 收到紧急触发信号时删除数据库 从 Ripple 收到紧急触发信号时删除数据库 导入数据库 + + 未选中 %d 个潜在重复项。请检视条目列表。 + 提供一个 2FAS 身份验证器备份文件。 提供一个 Aegis 导出/备份文件。 提供一个通过 设置 -> 备份 & 还原 -> 导出为纯文本和 HTML 获得的 Authenticator Plus 导出文件。 From dd9c307deacfe75c968ecb14221cb72fcf121b63 Mon Sep 17 00:00:00 2001 From: Alexander Bakker Date: Sat, 9 Sep 2023 12:15:32 +0200 Subject: [PATCH 008/196] Release v2.2.2 --- app/build.gradle | 4 ++-- app/src/main/assets/changelog.html | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7caf94f9..3cc334a0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { applicationId "${packageName}" minSdkVersion 21 targetSdkVersion 33 - versionCode 61 - versionName "2.2.1" + versionCode 62 + versionName "2.2.2" multiDexEnabled true buildConfigField "String", "GIT_HASH", "\"${getGitHash()}\"" buildConfigField "String", "GIT_BRANCH", "\"${getGitBranch()}\"" diff --git a/app/src/main/assets/changelog.html b/app/src/main/assets/changelog.html index 4500bc0d..9fef44ca 100644 --- a/app/src/main/assets/changelog.html +++ b/app/src/main/assets/changelog.html @@ -31,6 +31,16 @@
    +

    Version 2.2.2

    +

    New

    +
      +
    • An optional name field for icon packs to bypass filename character restrictions
    • +
    +

    Fixes

    +
      +
    • The Authenticator Pro importer only supported the legacy backup format
    • +
    • A crash could occur in the tile service
    • +

    Version 2.2.1

    New

      From 37964da4a578a9cfa36f525c217eecd4087579b2 Mon Sep 17 00:00:00 2001 From: Alexander Bakker Date: Sat, 9 Sep 2023 12:46:44 +0200 Subject: [PATCH 009/196] Clarify that only Aegis vaults can be imported during the intro Some users understandably get confused when they try to import a backup file from a different 2FA app during the intro and then get greeted with an error dialog. This changes the button text to "Import Aegis vault" and adds a small hint text in the hope that this makes the limitations of the intro more clear to the user. --- .../res/layout/fragment_welcome_slide.xml | 61 ++++++++++++------- app/src/main/res/values/strings.xml | 3 +- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/app/src/main/res/layout/fragment_welcome_slide.xml b/app/src/main/res/layout/fragment_welcome_slide.xml index 22a41f28..8ddd4a93 100644 --- a/app/src/main/res/layout/fragment_welcome_slide.xml +++ b/app/src/main/res/layout/fragment_welcome_slide.xml @@ -18,28 +18,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - - -