Compare commits

...

76 Commits

Author SHA1 Message Date
J-Jamet
964f4ae236 fix: Passkey subdomain #2291 2025-11-26 12:36:24 +01:00
J-Jamet
9146315001 fix: Remove Passkey error to be able to select search elements #2282 2025-11-26 11:22:47 +01:00
J-Jamet
ed095ad0a7 fix: Passwordless for multiple CredentialIds 2025-11-25 13:06:19 +01:00
J-Jamet
82a8776911 fix: Update Credential API code #2141 #2283 2025-11-25 12:24:59 +01:00
J-Jamet
753e9c4721 fix: Update Changelog #2282 2025-11-24 20:42:43 +01:00
J-Jamet
b64094ed20 fix: Show toast error in passwordless mode 2025-11-24 20:35:54 +01:00
J-Jamet
bc854c63f7 fix: Select passkey in passwordless mode #2282 2025-11-24 15:25:37 +01:00
J-Jamet
3b793a72b8 fix: Autofill username detection #2276 2025-11-17 17:28:08 +01:00
J-Jamet
f19afbdb2e Manual change of app language #1884 #1990 2025-11-17 12:08:26 +01:00
J-Jamet
622e9cefdd Merge tag '4.2.4' into develop
4.2.4
2025-11-14 11:53:15 +01:00
J-Jamet
3ba56677ba Merge branch 'release/4.2.4' 2025-11-14 11:52:56 +01:00
J-Jamet
39b4b4df70 fix: Tags 2025-11-14 11:42:18 +01:00
J-Jamet
4180ca92b0 Merge branch 'develop' of https://hosted.weblate.org/projects/keepass-dx/strings into translations 2025-11-14 11:38:55 +01:00
Artyom Rybakov
bc9d00a1e1 Translated using Weblate (Russian)
Currently translated at 100.0% (3 of 3 strings)

Translation: KeePassDX/Metadata
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/metadata/ru/
2025-11-14 06:51:17 +01:00
J-Jamet
5bdc72aa67 fix: Remembering database location #2262 2025-11-13 10:59:16 +01:00
J-Jamet
2be32e6884 fix: Upgrade to 4.2.4 2025-11-13 10:31:11 +01:00
Tadas L
612db4a6fc Translated using Weblate (Lithuanian)
Currently translated at 100.0% (3 of 3 strings)

Translation: KeePassDX/Metadata
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/metadata/lt/
2025-11-11 22:13:02 +01:00
Tadas L
e74176f3bc Translated using Weblate (Lithuanian)
Currently translated at 100.0% (703 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/lt/
2025-11-10 23:18:05 +01:00
Cirno
af1fba42a0 Translated using Weblate (Vietnamese)
Currently translated at 92.8% (653 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/vi/
2025-11-10 19:47:33 +01:00
Mateus Moretto
bebf30aec1 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (703 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pt_BR/
2025-11-08 03:51:14 +01:00
Arthur Zamarin
321bb46df5 Translated using Weblate (Hebrew)
Currently translated at 99.2% (698 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/he/
2025-11-06 10:51:44 +01:00
Joonas Reinholm
429f6db93f Translated using Weblate (Finnish)
Currently translated at 64.4% (453 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/fi/
2025-11-06 10:51:25 +01:00
gryhgyjh
fc5a13160a Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.8% (702 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/pt_BR/
2025-11-04 17:55:57 +01:00
Random
c6eee8d449 Translated using Weblate (Italian)
Currently translated at 100.0% (3 of 3 strings)

Translation: KeePassDX/Metadata
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/metadata/it/
2025-11-04 11:51:39 +00:00
Alonso González Chaves
7d227f372f Translated using Weblate (Spanish)
Currently translated at 100.0% (703 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/es/
2025-11-04 11:51:33 +00:00
VfBFan
3ac56b974f Translated using Weblate (German)
Currently translated at 100.0% (703 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2025-11-04 11:51:12 +00:00
solokot
2e85ea401b Translated using Weblate (Russian)
Currently translated at 100.0% (703 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ru/
2025-11-02 08:01:45 +01:00
solokot
fd080fb952 Translated using Weblate (Russian)
Currently translated at 100.0% (703 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ru/
2025-11-01 21:44:30 +01:00
Ice Fairy ❄️
cc8e07366a Translated using Weblate (Vietnamese)
Currently translated at 92.8% (653 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/vi/
2025-10-30 09:03:14 +00:00
109247019824
c21bcbdbc2 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (703 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/bg/
2025-10-30 09:03:12 +00:00
Daniel Bencze
e2ee17dae7 Translated using Weblate (Romanian)
Currently translated at 95.4% (671 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ro/
2025-10-30 09:03:10 +00:00
Masowick
e68830fa25 Translated using Weblate (German)
Currently translated at 99.5% (700 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2025-10-30 09:03:04 +00:00
J-Jamet
9ddd66ce85 Merge tag '4.2.3' into develop
4.2.3
2025-10-29 18:37:28 +01:00
J-Jamet
e3b69789bf Merge branch 'release/4.2.3' 2025-10-29 18:37:19 +01:00
J-Jamet
54f2ed9fab fix: Small fixes 2025-10-29 18:27:54 +01:00
J-Jamet
2fea019b95 fix: Save search info if URL present #2255 2025-10-29 18:12:44 +01:00
J-Jamet
9ac7ef2d22 fix: Credential allow action during orientation change #2253 2025-10-29 17:12:27 +01:00
J-Jamet
6d452fa49c fix: Credential allow action #2253 2025-10-29 16:44:48 +01:00
J-Jamet
d99edb6b4d fix: database dialog subtitle #2254 2025-10-29 16:18:51 +01:00
J-Jamet
cb679f0d59 fix: Multiple Passkey selection #2253 2025-10-29 15:15:44 +01:00
VfBFan
2e237fba2d Translated using Weblate (German)
Currently translated at 100.0% (3 of 3 strings)

Translation: KeePassDX/Metadata
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/metadata/de/
2025-10-28 20:03:10 +01:00
John Doe
e68863a154 Translated using Weblate (German)
Currently translated at 97.5% (686 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/de/
2025-10-28 20:03:08 +01:00
J-Jamet
5dd9f75095 Merge tag '4.2.2' into develop
4.2.2
2025-10-28 17:44:51 +01:00
J-Jamet
403021d38b Merge branch 'release/4.2.2' 2025-10-28 17:44:43 +01:00
J-Jamet
fea7b30d6f Merge branch 'develop' into release/4.2.2 2025-10-28 17:19:08 +01:00
J-Jamet
ab5c859db4 fix: Tags in translations 2025-10-28 17:18:41 +01:00
J-Jamet
3fcbc65de0 Merge branch 'develop' of https://hosted.weblate.org/projects/keepass-dx/strings into translations 2025-10-28 17:16:39 +01:00
J-Jamet
3f1ee6bbea fix: Upgrade CHANGELOG 2025-10-28 17:14:44 +01:00
J-Jamet
37ce2ab781 fix: Snackbar error 2025-10-28 15:59:20 +01:00
J-Jamet
ffaf4a761a fix: Service stop 2025-10-28 15:48:07 +01:00
J-Jamet
56b7cc9118 fix: Progress message 2025-10-28 14:49:10 +01:00
J-Jamet
987f3f9047 fix: Revert fragment view 2025-10-28 14:15:19 +01:00
J-Jamet
3039efc67c fix: Cancelable during save 2025-10-28 14:07:32 +01:00
J-Jamet
26daac4637 fix: Dialog progress tasks 2025-10-28 13:28:20 +01:00
J-Jamet
88a93829a9 fix: Lock finish 2025-10-27 21:28:29 +01:00
J-Jamet
7923a63d36 fix: Database dialog stopped 2025-10-27 20:53:30 +01:00
J-Jamet
9a5c782d5d fix: Small fix, info dialog 2025-10-27 20:45:40 +01:00
J-Jamet
c39e4ba693 fix: Play service as privileged app for Passkey Cross Device Authentication #2244 2025-10-27 20:15:02 +01:00
J-Jamet
7db3d0502f fix: Save search info #2243 2025-10-27 19:32:00 +01:00
J-Jamet
d557e8b516 fix: merge algorithm #2223 2025-10-27 18:51:19 +01:00
Priit Jõerüüt
d6ae17657b Translated using Weblate (Estonian)
Currently translated at 100.0% (703 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/et/
2025-10-27 18:11:18 +01:00
solokot
3468b0f6f5 Translated using Weblate (Russian)
Currently translated at 100.0% (703 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ru/
2025-10-27 18:11:16 +01:00
J-Jamet
79777801e8 fix: merge algorithm 2025-10-27 16:34:38 +01:00
안세훈
a202f66d48 Translated using Weblate (Korean)
Currently translated at 52.6% (370 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/ko/
2025-10-27 03:02:44 +00:00
Kunzisoft
ba58d5d47c Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 33.3% (1 of 3 strings)

Translation: KeePassDX/Metadata
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/metadata/zh_Hant/
2025-10-25 16:03:05 +00:00
Kunzisoft
46685592df Translated using Weblate (Croatian)
Currently translated at 33.3% (1 of 3 strings)

Translation: KeePassDX/Metadata
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/metadata/hr/
2025-10-25 16:03:03 +00:00
Kunzisoft
ba9e2892ef Translated using Weblate (Indonesian)
Currently translated at 33.3% (1 of 3 strings)

Translation: KeePassDX/Metadata
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/metadata/id/
2025-10-25 16:03:02 +00:00
Kunzisoft
a1da3b4fbd Translated using Weblate (Italian)
Currently translated at 100.0% (3 of 3 strings)

Translation: KeePassDX/Metadata
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/metadata/it/
2025-10-25 16:03:01 +00:00
Kunzisoft
8bee0ec220 Translated using Weblate (Macedonian)
Currently translated at 33.3% (1 of 3 strings)

Translation: KeePassDX/Metadata
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/metadata/mk/
2025-10-25 16:02:59 +00:00
Kunzisoft
aebf6b21de Translated using Weblate (Arabic)
Currently translated at 66.6% (2 of 3 strings)

Translation: KeePassDX/Metadata
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/metadata/ar/
2025-10-25 16:02:58 +00:00
Kunzisoft
0cf9253ea4 Translated using Weblate (Spanish)
Currently translated at 33.3% (1 of 3 strings)

Translation: KeePassDX/Metadata
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/metadata/es/
2025-10-25 16:02:55 +00:00
Kunzisoft
b63ceb37a4 Translated using Weblate (Turkish)
Currently translated at 100.0% (3 of 3 strings)

Translation: KeePassDX/Metadata
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/metadata/tr/
2025-10-25 16:02:54 +00:00
solokot
c462dae6f5 Translated using Weblate (Russian)
Currently translated at 66.6% (2 of 3 strings)

Translation: KeePassDX/Metadata
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/metadata/ru/
2025-10-25 16:02:52 +00:00
Kunzisoft
ddf890b861 Translated using Weblate (Russian)
Currently translated at 66.6% (2 of 3 strings)

Translation: KeePassDX/Metadata
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/metadata/ru/
2025-10-25 16:02:51 +00:00
Besnik Bleta
252eb30b13 Translated using Weblate (Albanian)
Currently translated at 92.0% (647 of 703 strings)

Translation: KeePassDX/Strings
Translate-URL: https://hosted.weblate.org/projects/keepass-dx/strings/sq/
2025-10-25 16:02:43 +00:00
J-Jamet
62ab11cc56 Merge tag '4.2.1' into develop
4.2.1
2025-10-24 18:16:25 +02:00
81 changed files with 1401 additions and 462 deletions

View File

@@ -1,3 +1,23 @@
KeePassDX(4.3.0)
* Manual change of app language #1884 #1990
* Fix autofill username detection #2276
* Fix Passkey in passwordless mode #2282
KeePassDX(4.2.4)
* Fix remembering database location #2262
KeePassDX(4.2.3)
* Fix multiple Passkey selection #2253
* Fix database dialog subtitle #2254
* Fix save search info if URL present #2255
* Small fixes
KeePassDX(4.2.2)
* Fix database merge algorithm #2223
* Fix save search info #2243
* Fix Play Service as privileged app for Passkey Cross Device Authentication #2244
* Small fixes
KeePassDX(4.2.1)
* Fix Magikeyboard autosearch #2233
* Fix database merge #2223

View File

@@ -11,8 +11,8 @@ android {
applicationId "com.kunzisoft.keepass"
minSdkVersion 19
targetSdkVersion 35
versionCode = 146
versionName = "4.2.1"
versionCode = 150
versionName = "4.3.0"
multiDexEnabled true
testApplicationId = "com.kunzisoft.keepass.tests"
@@ -110,6 +110,10 @@ android {
// Bouncy castle bug https://github.com/bcgit/bc-java/issues/1685
resources.pickFirsts.add('META-INF/versions/9/OSGI-INF/MANIFEST.MF')
}
androidResources {
generateLocaleConfig true
}
}
def room_version = "2.5.1"

View File

@@ -125,6 +125,8 @@ class EntryActivity : DatabaseLockActivity() {
private var mBackgroundColor: Int? = null
private var mForegroundColor: Int? = null
override fun manageDatabaseInfo(): Boolean = true
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

View File

@@ -157,6 +157,8 @@ class EntryEditActivity : DatabaseLockActivity(),
}
}
override fun manageDatabaseInfo(): Boolean = true
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_entry_edit)

View File

@@ -55,10 +55,8 @@ import com.kunzisoft.keepass.education.FileDatabaseSelectActivityEducation
import com.kunzisoft.keepass.hardware.HardwareKey
import com.kunzisoft.keepass.model.RegisterInfo
import com.kunzisoft.keepass.model.SearchInfo
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_CREATE_TASK
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.ACTION_DATABASE_LOAD_TASK
import com.kunzisoft.keepass.services.DatabaseTaskNotificationService.Companion.DATABASE_URI_KEY
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.utils.AppUtil.isContributingUser
@@ -94,6 +92,8 @@ class FileDatabaseSelectActivity : DatabaseModeActivity(),
private var mExternalFileHelper: ExternalFileHelper? = null
override fun manageDatabaseInfo(): Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -214,6 +214,12 @@ class FileDatabaseSelectActivity : DatabaseModeActivity(),
// Retrieve settings for default database
mAdapterDatabaseHistory?.setDefaultDatabase(it)
}
// Remove all the remember locations if needed
if (PreferencesUtil.rememberDatabaseLocations(applicationContext).not()) {
FileDatabaseHistoryAction.getInstance(applicationContext)
.deleteAll()
}
}
override fun onDatabaseRetrieved(database: ContextualDatabase) {
@@ -226,22 +232,6 @@ class FileDatabaseSelectActivity : DatabaseModeActivity(),
result: ActionRunnable.Result
) {
if (result.isSuccess) {
// Update list
when (actionTask) {
ACTION_DATABASE_CREATE_TASK,
ACTION_DATABASE_LOAD_TASK -> {
result.data?.getParcelableCompat<Uri>(DATABASE_URI_KEY)?.let { databaseUri ->
val mainCredential =
result.data?.getParcelableCompat(DatabaseTaskNotificationService.MAIN_CREDENTIAL_KEY)
?: MainCredential()
databaseFilesViewModel.addDatabaseFile(
databaseUri,
mainCredential.keyFileUri,
mainCredential.hardwareKey
)
}
}
}
// Launch activity
when (actionTask) {
ACTION_DATABASE_CREATE_TASK -> {
@@ -250,13 +240,13 @@ class FileDatabaseSelectActivity : DatabaseModeActivity(),
database,
false
)
coordinatorLayout.showActionErrorIfNeeded(result)
}
ACTION_DATABASE_LOAD_TASK -> {
launchGroupActivityIfLoaded(database)
}
}
}
coordinatorLayout.showActionErrorIfNeeded(result)
}
/**

View File

@@ -274,6 +274,8 @@ class GroupActivity : DatabaseLockActivity(),
mGroupEditViewModel.selectIcon(icon)
}
override fun manageDatabaseInfo(): Boolean = true
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -839,7 +841,7 @@ class GroupActivity : DatabaseLockActivity(),
// Open child group
loadMainGroup(GroupState(group.nodeId, 0))
} catch (e: ClassCastException) {
Log.e(TAG, "Node can't be cast in Group")
Log.e(TAG, "Node can't be cast in Group", e)
}
Type.ENTRY -> try {
@@ -865,14 +867,16 @@ class GroupActivity : DatabaseLockActivity(),
if (!database.isReadOnly
&& searchInfo != null
&& PreferencesUtil.isKeyboardSaveSearchInfoEnable(this@GroupActivity)
&& entryVersioned.containsSearchInfo(database, searchInfo).not()
) {
updateEntryWithRegisterInfo(
database,
entryVersioned,
searchInfo.toRegisterInfo()
)
} else {
entrySelectedForKeyboardSelection(database, entryVersioned)
}
entrySelectedForKeyboardSelection(database, entryVersioned)
}
TypeMode.PASSKEY -> {
entrySelectedForPasskeySelection(database, entryVersioned)
@@ -881,14 +885,16 @@ class GroupActivity : DatabaseLockActivity(),
if (!database.isReadOnly
&& searchInfo != null
&& PreferencesUtil.isAutofillSaveSearchInfoEnable(this@GroupActivity)
&& entryVersioned.containsSearchInfo(database, searchInfo).not()
) {
updateEntryWithRegisterInfo(
database,
entryVersioned,
searchInfo.toRegisterInfo()
)
} else {
entrySelectedForAutofillSelection(database, entryVersioned)
}
entrySelectedForAutofillSelection(database, entryVersioned)
}
}
loadGroup()
@@ -908,7 +914,7 @@ class GroupActivity : DatabaseLockActivity(),
finish()
})
} catch (e: ClassCastException) {
Log.e(TAG, "Node can't be cast in Entry")
Log.e(TAG, "Node can't be cast in Entry", e)
}
}
}
@@ -977,6 +983,17 @@ class GroupActivity : DatabaseLockActivity(),
updateEntry(entry, newEntry)
}
private fun Entry.containsSearchInfo(
database: ContextualDatabase,
searchInfo: SearchInfo
): Boolean {
return getEntryInfo(
database,
raw = true,
removeTemplateConfiguration = false
).containsSearchInfo(searchInfo)
}
private fun finishNodeAction() {
actionNodeMode?.finish()
}

View File

@@ -78,6 +78,8 @@ class IconPickerActivity : DatabaseLockActivity() {
private var mExternalFileHelper: ExternalFileHelper? = null
override fun manageDatabaseInfo(): Boolean = true
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

View File

@@ -45,6 +45,8 @@ class ImageViewerActivity : DatabaseLockActivity() {
private lateinit var imageView: ImageView
private lateinit var progressView: View
override fun manageDatabaseInfo(): Boolean = false
@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

View File

@@ -28,6 +28,8 @@ class KeyGeneratorActivity : DatabaseLockActivity() {
private lateinit var validationButton: View
private var lockView: View? = null
override fun manageDatabaseInfo(): Boolean = true
private val keyGeneratorViewModel: KeyGeneratorViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {

View File

@@ -124,6 +124,8 @@ class MainCredentialActivity : DatabaseModeActivity() {
private var mReadOnly: Boolean = false
private var mForceReadOnly: Boolean = false
override fun manageDatabaseInfo(): Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

View File

@@ -1,13 +1,17 @@
package com.kunzisoft.keepass.activities.legacy
import android.Manifest
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContract
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.appcompat.app.AlertDialog
import androidx.core.app.ActivityCompat
import androidx.core.app.ActivityOptionsCompat
import androidx.core.content.ContextCompat
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
@@ -16,13 +20,14 @@ import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.dialogs.DatabaseChangedDialogFragment
import com.kunzisoft.keepass.activities.dialogs.DatabaseChangedDialogFragment.Companion.DATABASE_CHANGED_DIALOG_TAG
import com.kunzisoft.keepass.activities.stylish.StylishActivity
import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper.setActivityResult
import com.kunzisoft.keepass.database.ContextualDatabase
import com.kunzisoft.keepass.database.DatabaseTaskProvider.Companion.startDatabaseService
import com.kunzisoft.keepass.database.ProgressMessage
import com.kunzisoft.keepass.model.SnapFileDatabaseInfo
import com.kunzisoft.keepass.tasks.ActionRunnable
import com.kunzisoft.keepass.tasks.ProgressTaskDialogFragment
import com.kunzisoft.keepass.tasks.ProgressTaskDialogFragment.Companion.PROGRESS_TASK_DIALOG_TAG
import com.kunzisoft.keepass.tasks.ProgressTaskViewModel
import com.kunzisoft.keepass.viewmodels.DatabaseViewModel
import kotlinx.coroutines.launch
@@ -32,6 +37,7 @@ abstract class DatabaseActivity : StylishActivity(), DatabaseRetrieval {
protected val mDatabase: ContextualDatabase?
get() = mDatabaseViewModel.database
private val progressTaskViewModel: ProgressTaskViewModel by viewModels()
private var progressTaskDialogFragment: ProgressTaskDialogFragment? = null
private var databaseChangedDialogFragment: DatabaseChangedDialogFragment? = null
@@ -53,49 +59,104 @@ abstract class DatabaseActivity : StylishActivity(), DatabaseRetrieval {
}
}
/**
* Useful to only waiting for the activity result and prevent any parallel action
*/
var credentialResultLaunched = false
/**
* Utility activity result launcher,
* Used recursively, close each activity with return data
*/
protected var mCredentialActivityResultLauncher: CredentialActivityResultLauncher =
CredentialActivityResultLauncher(
registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) {
setActivityResult(
lockDatabase = false,
resultCode = it.resultCode,
data = it.data
)
}
)
/**
* Custom ActivityResultLauncher to manage the database action
*/
protected inner class CredentialActivityResultLauncher(
val builder: ActivityResultLauncher<Intent>
) : ActivityResultLauncher<Intent>() {
override fun launch(
input: Intent?,
options: ActivityOptionsCompat?
) {
credentialResultLaunched = true
builder.launch(input, options)
}
override fun unregister() {
builder.unregister()
}
override fun getContract(): ActivityResultContract<Intent?, *> {
return builder.getContract()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState != null
&& savedInstanceState.containsKey(CREDENTIAL_RESULT_LAUNCHER_KEY)
) {
credentialResultLaunched = savedInstanceState.getBoolean(CREDENTIAL_RESULT_LAUNCHER_KEY)
}
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
mDatabaseViewModel.actionState.collect { uiState ->
when (uiState) {
is DatabaseViewModel.ActionState.Loading -> {}
is DatabaseViewModel.ActionState.OnDatabaseReloaded -> {
if (finishActivityIfReloadRequested()) {
finish()
if (credentialResultLaunched.not()) {
when (uiState) {
is DatabaseViewModel.ActionState.Wait -> {}
is DatabaseViewModel.ActionState.OnDatabaseReloaded -> {
if (finishActivityIfReloadRequested()) {
finish()
}
}
}
is DatabaseViewModel.ActionState.OnDatabaseInfoChanged -> {
if (manageDatabaseInfo()) {
showDatabaseChangedDialog(
uiState.previousDatabaseInfo,
uiState.newDatabaseInfo,
uiState.readOnlyDatabase
is DatabaseViewModel.ActionState.OnDatabaseInfoChanged -> {
if (manageDatabaseInfo()) {
showDatabaseChangedDialog(
uiState.previousDatabaseInfo,
uiState.newDatabaseInfo,
uiState.readOnlyDatabase
)
}
}
is DatabaseViewModel.ActionState.OnDatabaseActionRequested -> {
startDatabasePermissionService(
uiState.bundle,
uiState.actionTask
)
}
}
is DatabaseViewModel.ActionState.OnDatabaseActionRequested -> {
startDatabasePermissionService(
uiState.bundle,
uiState.actionTask
)
}
is DatabaseViewModel.ActionState.OnDatabaseActionStarted -> {
showDialog(uiState.progressMessage)
}
is DatabaseViewModel.ActionState.OnDatabaseActionUpdated -> {
showDialog(uiState.progressMessage)
}
is DatabaseViewModel.ActionState.OnDatabaseActionStopped -> {
// nothing here, wait for the action to finish
}
is DatabaseViewModel.ActionState.OnDatabaseActionFinished -> {
onDatabaseActionFinished(
uiState.database,
uiState.actionTask,
uiState.result
)
stopDialog()
is DatabaseViewModel.ActionState.OnDatabaseActionStarted -> {
progressTaskViewModel.show(uiState.progressMessage)
}
is DatabaseViewModel.ActionState.OnDatabaseActionUpdated -> {
progressTaskViewModel.show(uiState.progressMessage)
}
is DatabaseViewModel.ActionState.OnDatabaseActionStopped -> {
progressTaskViewModel.hide()
}
is DatabaseViewModel.ActionState.OnDatabaseActionFinished -> {
onDatabaseActionFinished(
uiState.database,
uiState.actionTask,
uiState.result
)
progressTaskViewModel.hide()
}
}
}
}
@@ -103,15 +164,34 @@ abstract class DatabaseActivity : StylishActivity(), DatabaseRetrieval {
}
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.RESUMED) {
mDatabaseViewModel.databaseState.collect { database ->
// Nullable function
onUnknownDatabaseRetrieved(database)
database?.let {
onDatabaseRetrieved(database)
progressTaskViewModel.progressTaskState.collect { state ->
when (state) {
is ProgressTaskViewModel.ProgressTaskState.Show ->
startDialog()
is ProgressTaskViewModel.ProgressTaskState.Hide ->
stopDialog()
}
}
}
}
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.RESUMED) {
mDatabaseViewModel.databaseState.collect { database ->
if (credentialResultLaunched.not()) {
// Nullable function
onUnknownDatabaseRetrieved(database)
database?.let {
onDatabaseRetrieved(database)
}
}
}
}
}
}
override fun onSaveInstanceState(outState: Bundle) {
outState.putBoolean(CREDENTIAL_RESULT_LAUNCHER_KEY, credentialResultLaunched)
super.onSaveInstanceState(outState)
}
/**
@@ -194,7 +274,7 @@ abstract class DatabaseActivity : StylishActivity(), DatabaseRetrieval {
}
}
private fun showDialog(progressMessage: ProgressMessage) {
private fun startDialog() {
lifecycleScope.launch {
if (showDatabaseDialog()) {
if (progressTaskDialogFragment == null) {
@@ -208,12 +288,6 @@ abstract class DatabaseActivity : StylishActivity(), DatabaseRetrieval {
PROGRESS_TASK_DIALOG_TAG
)
}
progressTaskDialogFragment?.apply {
updateTitle(progressMessage.titleId)
updateMessage(progressMessage.messageId)
updateWarning(progressMessage.warningId)
setCancellable(progressMessage.cancelable)
}
}
}
}
@@ -226,4 +300,8 @@ abstract class DatabaseActivity : StylishActivity(), DatabaseRetrieval {
protected open fun showDatabaseDialog(): Boolean {
return true
}
companion object {
const val CREDENTIAL_RESULT_LAUNCHER_KEY = "com.kunzisoft.keepass.CREDENTIAL_RESULT_LAUNCHER_KEY"
}
}

View File

@@ -370,9 +370,11 @@ abstract class DatabaseLockActivity : DatabaseModeActivity(),
.setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(R.string.lock) { _, _ ->
sendBroadcast(Intent(LOCK_ACTION))
finish()
}.create().show()
} else {
sendBroadcast(Intent(LOCK_ACTION))
finish()
}
}

View File

@@ -1,12 +1,9 @@
package com.kunzisoft.keepass.activities.legacy
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.activity.OnBackPressedCallback
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper.isIntentSenderMode
import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper.removeInfo
@@ -15,7 +12,6 @@ import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper.retrieveReg
import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper.retrieveSearchInfo
import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper.retrieveSpecialMode
import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper.retrieveTypeMode
import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper.setActivityResult
import com.kunzisoft.keepass.credentialprovider.SpecialMode
import com.kunzisoft.keepass.credentialprovider.TypeMode
import com.kunzisoft.keepass.model.RegisterInfo
@@ -34,21 +30,6 @@ abstract class DatabaseModeActivity : DatabaseActivity() {
private var mToolbarSpecial: ToolbarSpecial? = null
/**
* Utility activity result launcher,
* Used recursively, close each activity with return data
*/
protected open var mCredentialActivityResultLauncher: ActivityResultLauncher<Intent>? =
registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) {
setActivityResult(
lockDatabase = false,
resultCode = it.resultCode,
data = it.data
)
}
open fun onDatabaseBackPressed() {
if (mSpecialMode != SpecialMode.DEFAULT)
onCancelSpecialMode()

View File

@@ -70,13 +70,11 @@ class AutofillLauncherActivity : DatabaseModeActivity() {
autofillLauncherViewModel.manageRegistrationResult(it)
}
override fun applyCustomStyle(): Boolean {
return false
}
override fun applyCustomStyle(): Boolean = false
override fun finishActivityIfReloadRequested(): Boolean {
return true
}
override fun finishActivityIfReloadRequested(): Boolean = true
override fun manageDatabaseInfo(): Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
// To apply the bypass https://github.com/Kunzisoft/KeePassDX/issues/2238

View File

@@ -56,6 +56,8 @@ class EntrySelectionLauncherActivity : DatabaseModeActivity() {
override fun finishActivityIfReloadRequested() = false
override fun manageDatabaseInfo(): Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
entrySelectionViewModel.initialize()
@@ -76,6 +78,7 @@ class EntrySelectionLauncherActivity : DatabaseModeActivity() {
context = this@EntrySelectionLauncherActivity,
searchInfo = uiState.searchInfo
)
finish()
}
is EntrySelectionViewModel.UIState.LaunchGroupActivityForSearch -> {
GroupActivity.launchForSearch(
@@ -83,6 +86,7 @@ class EntrySelectionLauncherActivity : DatabaseModeActivity() {
database = uiState.database,
searchInfo = uiState.searchInfo
)
finish()
}
}
}

View File

@@ -154,7 +154,7 @@ class StructureParser(private val structure: AssistStructure) {
it.contains(View.AUTOFILL_HINT_PASSWORD, true) -> {
// Password Id changed if it's the second times we are here,
// So the last username candidate is most appropriate
if (result?.passwordId != null) {
if (result?.passwordId != null && usernameIdCandidate != null) {
result?.usernameId = usernameIdCandidate
result?.usernameValue = usernameValueCandidate
}

View File

@@ -42,6 +42,7 @@ import androidx.credentials.provider.CredentialEntry
import androidx.credentials.provider.CredentialProviderService
import androidx.credentials.provider.ProviderClearCredentialStateRequest
import androidx.credentials.provider.PublicKeyCredentialEntry
import com.kunzisoft.encrypt.Base64Helper.Companion.b64Encode
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.credentialprovider.EntrySelectionHelper.buildIcon
import com.kunzisoft.keepass.credentialprovider.SpecialMode
@@ -90,9 +91,13 @@ class PasskeyProviderService : CredentialProviderService() {
super.onDestroy()
}
private fun buildPasskeySearchInfo(relyingParty: String): SearchInfo {
private fun buildPasskeySearchInfo(
relyingParty: String,
credentialIds: List<String> = listOf()
): SearchInfo {
return SearchInfo().apply {
this.relyingParty = relyingParty
this.credentialIds = credentialIds
}
}
@@ -108,6 +113,7 @@ class PasskeyProviderService : CredentialProviderService() {
}
} catch (e: Exception) {
Log.e(javaClass.simpleName, "onBeginGetCredentialRequest error", e)
toastError(e)
callback.onError(GetCredentialUnknownException())
}
}
@@ -136,12 +142,14 @@ class PasskeyProviderService : CredentialProviderService() {
option: BeginGetPublicKeyCredentialOption,
callback: (List<CredentialEntry>) -> Unit
) {
val passkeyEntries: MutableList<CredentialEntry> = mutableListOf()
val relyingPartyId = PublicKeyCredentialRequestOptions(option.requestJson).rpId
val searchInfo = buildPasskeySearchInfo(relyingPartyId)
Log.d(TAG, "Build passkey search for relying party $relyingPartyId")
val publicKeyCredentialRequestOptions = PublicKeyCredentialRequestOptions(option.requestJson)
val relyingPartyId = publicKeyCredentialRequestOptions.rpId
val credentialIdList = publicKeyCredentialRequestOptions.allowCredentials
.map { b64Encode(it.id) }
val searchInfo = buildPasskeySearchInfo(relyingPartyId, credentialIdList)
Log.d(TAG, "Build passkey search for relying party $relyingPartyId, credentialIds $credentialIdList")
SearchHelper.checkAutoSearchInfo(
context = this,
database = mDatabase,
@@ -175,26 +183,36 @@ class PasskeyProviderService : CredentialProviderService() {
},
onItemNotFound = { _ ->
Log.w(TAG, "No passkey found in the database with this relying party : $relyingPartyId")
Log.d(TAG, "Add pending intent for passkey selection in opened database")
PasskeyLauncherActivity.getPendingIntent(
context = applicationContext,
specialMode = SpecialMode.SELECTION,
searchInfo = searchInfo
)?.let { pendingIntent ->
passkeyEntries.add(
PublicKeyCredentialEntry(
context = applicationContext,
username = getString(R.string.passkey_database_username),
displayName = getString(R.string.passkey_selection_description),
icon = defaultIcon,
pendingIntent = pendingIntent,
beginGetPublicKeyCredentialOption = option,
lastUsedTime = Instant.now(),
isAutoSelectAllowed = isAutoSelectAllowed
if (credentialIdList.isEmpty()) {
Log.d(TAG, "Add pending intent for passkey selection in opened database")
PasskeyLauncherActivity.getPendingIntent(
context = applicationContext,
specialMode = SpecialMode.SELECTION,
searchInfo = searchInfo
)?.let { pendingIntent ->
passkeyEntries.add(
PublicKeyCredentialEntry(
context = applicationContext,
username = getString(R.string.passkey_database_username),
displayName = getString(R.string.passkey_selection_description),
icon = defaultIcon,
pendingIntent = pendingIntent,
beginGetPublicKeyCredentialOption = option,
lastUsedTime = Instant.now(),
isAutoSelectAllowed = isAutoSelectAllowed
)
)
}
callback(passkeyEntries)
} else {
throw IOException(
getString(
R.string.error_passkey_credential_id,
relyingPartyId,
credentialIdList
)
)
}
callback(passkeyEntries)
},
onDatabaseClosed = {
Log.d(TAG, "Add pending intent for passkey selection in closed database")
@@ -287,10 +305,11 @@ class PasskeyProviderService : CredentialProviderService() {
getString(R.string.passkey_database_username)
else databaseName
val createEntries: MutableList<CreateEntry> = mutableListOf()
val relyingPartyId = PublicKeyCredentialCreationOptions(
val publicKeyCredentialCreationOptions = PublicKeyCredentialCreationOptions(
requestJson = request.requestJson,
clientDataHash = request.clientDataHash
).relyingPartyEntity.id
)
val relyingPartyId = publicKeyCredentialCreationOptions.relyingPartyEntity.id
val searchInfo = buildPasskeySearchInfo(relyingPartyId)
Log.d(TAG, "Build passkey search for relying party $relyingPartyId")
SearchHelper.checkAutoSearchInfo(

View File

@@ -16,7 +16,25 @@
package com.kunzisoft.keepass.credentialprovider.passkey.data
data class PublicKeyCredentialRpEntity(val name: String, val id: String)
import com.kunzisoft.encrypt.Base64Helper
import org.json.JSONObject
data class PublicKeyCredentialRpEntity(
val name: String,
val id: String
) {
companion object {
fun JSONObject.getPublicKeyCredentialRpEntity(
parameterName: String
): PublicKeyCredentialRpEntity {
val rpJson = this.getJSONObject(parameterName)
return PublicKeyCredentialRpEntity(
rpJson.getString("name"),
rpJson.getString("id")
)
}
}
}
data class PublicKeyCredentialUserEntity(
val name: String,
@@ -42,9 +60,41 @@ data class PublicKeyCredentialUserEntity(
result = 31 * result + displayName.hashCode()
return result
}
companion object {
fun JSONObject.getPublicKeyCredentialUserEntity(
parameterName: String
): PublicKeyCredentialUserEntity {
val rpUser = this.getJSONObject(parameterName)
return PublicKeyCredentialUserEntity(
rpUser.getString("name"),
Base64Helper.b64Decode(rpUser.getString("id")),
rpUser.getString("displayName")
)
}
}
}
data class PublicKeyCredentialParameters(val type: String, val alg: Long)
data class PublicKeyCredentialParameters(
val type: String,
val alg: Long
) {
companion object {
fun JSONObject.getPublicKeyCredentialParametersList(
parameterName: String
): List<PublicKeyCredentialParameters> {
val pubKeyCredParamsJson = this.getJSONArray(parameterName)
val pubKeyCredParamsTmp: MutableList<PublicKeyCredentialParameters> = mutableListOf()
for (i in 0 until pubKeyCredParamsJson.length()) {
val e = pubKeyCredParamsJson.getJSONObject(i)
pubKeyCredParamsTmp.add(
PublicKeyCredentialParameters(e.getString("type"), e.getLong("alg"))
)
}
return pubKeyCredParamsTmp.toList()
}
}
}
data class PublicKeyCredentialDescriptor(
val type: String,
@@ -70,11 +120,97 @@ data class PublicKeyCredentialDescriptor(
result = 31 * result + transports.hashCode()
return result
}
companion object {
fun JSONObject.getPublicKeyCredentialDescriptorList(
parameterName: String
): List<PublicKeyCredentialDescriptor> {
val credentialsJson = this.getJSONArray(parameterName)
val credentialsTmp: MutableList<PublicKeyCredentialDescriptor> = mutableListOf()
for (i in 0 until credentialsJson.length()) {
val credentialJson = credentialsJson.getJSONObject(i)
val transports: MutableList<String> = mutableListOf()
val transportsJson = credentialJson.getJSONArray("transports")
for (j in 0 until transportsJson.length()) {
transports.add(transportsJson.getString(j))
}
credentialsTmp.add(
PublicKeyCredentialDescriptor(
type = credentialJson.getString("type"),
id = Base64Helper.b64Decode(credentialJson.getString("id")),
transports = transports
)
)
}
return credentialsTmp.toList()
}
}
}
data class AuthenticatorSelectionCriteria(
val authenticatorAttachment: String,
val residentKey: String,
val requireResidentKey: Boolean = false,
val userVerification: String = "preferred"
)
val authenticatorAttachment: String? = null,
val residentKey: ResidentKeyRequirement? = null,
val requireResidentKey: Boolean?,
val userVerification: UserVerificationRequirement? = UserVerificationRequirement.PREFERRED
) {
companion object {
fun JSONObject.getAuthenticatorSelectionCriteria(
parameterName: String
): AuthenticatorSelectionCriteria {
val authenticatorSelection = this.optJSONObject(parameterName)
?: return AuthenticatorSelectionCriteria(requireResidentKey = null)
val authenticatorAttachment = if (!authenticatorSelection.isNull("authenticatorAttachment"))
authenticatorSelection.getString("authenticatorAttachment") else null
var residentKey = if (!authenticatorSelection.isNull("residentKey"))
ResidentKeyRequirement.fromString(authenticatorSelection.getString("residentKey"))
else null
val requireResidentKey = authenticatorSelection.optBoolean("requireResidentKey", false)
val userVerification = UserVerificationRequirement.fromString(authenticatorSelection.optString("userVerification", "preferred"))
// https://www.w3.org/TR/webauthn-3/#enumdef-residentkeyrequirement
if (residentKey == null) {
residentKey = if (requireResidentKey) {
ResidentKeyRequirement.REQUIRED
} else {
ResidentKeyRequirement.DISCOURAGED
}
}
return AuthenticatorSelectionCriteria(
authenticatorAttachment = authenticatorAttachment,
residentKey = residentKey,
requireResidentKey = requireResidentKey,
userVerification = userVerification
)
}
}
}
// https://www.w3.org/TR/webauthn-3/#enumdef-residentkeyrequirement
enum class ResidentKeyRequirement(val value: String) {
DISCOURAGED("discouraged"),
PREFERRED("preferred"),
REQUIRED("required");
override fun toString(): String {
return value
}
companion object {
fun fromString(value: String): ResidentKeyRequirement? {
return ResidentKeyRequirement.entries.firstOrNull { it.value == value }
}
}
}
// https://www.w3.org/TR/webauthn-3/#enumdef-userverificationrequirement
enum class UserVerificationRequirement(val value: String) {
REQUIRED("required"),
PREFERRED("preferred"),
DISCOURAGED("discouraged");
override fun toString(): String {
return value
}
companion object {
fun fromString(value: String): UserVerificationRequirement? {
return UserVerificationRequirement.entries.firstOrNull { it.value == value }
}
}
}

View File

@@ -20,52 +20,42 @@
package com.kunzisoft.keepass.credentialprovider.passkey.data
import com.kunzisoft.encrypt.Base64Helper
import com.kunzisoft.keepass.credentialprovider.passkey.data.AuthenticatorSelectionCriteria.Companion.getAuthenticatorSelectionCriteria
import com.kunzisoft.keepass.credentialprovider.passkey.data.PublicKeyCredentialDescriptor.Companion.getPublicKeyCredentialDescriptorList
import com.kunzisoft.keepass.credentialprovider.passkey.data.PublicKeyCredentialParameters.Companion.getPublicKeyCredentialParametersList
import com.kunzisoft.keepass.credentialprovider.passkey.data.PublicKeyCredentialRpEntity.Companion.getPublicKeyCredentialRpEntity
import com.kunzisoft.keepass.credentialprovider.passkey.data.PublicKeyCredentialUserEntity.Companion.getPublicKeyCredentialUserEntity
import org.json.JSONObject
class PublicKeyCredentialCreationOptions(
requestJson: String,
var clientDataHash: ByteArray?
) {
val json: JSONObject = JSONObject(requestJson)
private val json: JSONObject = JSONObject(requestJson)
val relyingPartyEntity: PublicKeyCredentialRpEntity
val userEntity: PublicKeyCredentialUserEntity
val challenge: ByteArray
val pubKeyCredParams: List<PublicKeyCredentialParameters>
val relyingPartyEntity: PublicKeyCredentialRpEntity =
json.getPublicKeyCredentialRpEntity("rp")
var timeout: Long
var excludeCredentials: List<PublicKeyCredentialDescriptor>
var authenticatorSelection: AuthenticatorSelectionCriteria
var attestation: String
val userEntity: PublicKeyCredentialUserEntity =
json.getPublicKeyCredentialUserEntity("user")
init {
val rpJson = json.getJSONObject("rp")
relyingPartyEntity = PublicKeyCredentialRpEntity(rpJson.getString("name"), rpJson.getString("id"))
val rpUser = json.getJSONObject("user")
val userId = Base64Helper.b64Decode(rpUser.getString("id"))
userEntity =
PublicKeyCredentialUserEntity(
rpUser.getString("name"),
userId,
rpUser.getString("displayName")
)
challenge = Base64Helper.b64Decode(json.getString("challenge"))
val pubKeyCredParamsJson = json.getJSONArray("pubKeyCredParams")
val pubKeyCredParamsTmp: MutableList<PublicKeyCredentialParameters> = mutableListOf()
for (i in 0 until pubKeyCredParamsJson.length()) {
val e = pubKeyCredParamsJson.getJSONObject(i)
pubKeyCredParamsTmp.add(
PublicKeyCredentialParameters(e.getString("type"), e.getLong("alg"))
)
}
pubKeyCredParams = pubKeyCredParamsTmp.toList()
val challenge: ByteArray =
Base64Helper.b64Decode(json.getString("challenge"))
timeout = json.optLong("timeout", 0)
// TODO: Fix excludeCredentials and authenticatorSelection
excludeCredentials = emptyList()
authenticatorSelection = AuthenticatorSelectionCriteria("platform", "required")
attestation = json.optString("attestation", "none")
}
val pubKeyCredParams: List<PublicKeyCredentialParameters> =
json.getPublicKeyCredentialParametersList("pubKeyCredParams")
var timeout: Long =
json.optLong("timeout", 0)
var excludeCredentials: List<PublicKeyCredentialDescriptor> =
json.getPublicKeyCredentialDescriptorList("excludeCredentials")
var authenticatorSelection: AuthenticatorSelectionCriteria =
json.getAuthenticatorSelectionCriteria("authenticatorSelection")
var attestation: String =
json.optString("attestation", "none")
companion object {
private val TAG = PublicKeyCredentialCreationOptions::class.simpleName

View File

@@ -20,12 +20,33 @@
package com.kunzisoft.keepass.credentialprovider.passkey.data
import com.kunzisoft.encrypt.Base64Helper
import com.kunzisoft.keepass.credentialprovider.passkey.data.PublicKeyCredentialDescriptor.Companion.getPublicKeyCredentialDescriptorList
import org.json.JSONObject
// https://www.w3.org/TR/webauthn-3/#enumdef-residentkeyrequirement
class PublicKeyCredentialRequestOptions(requestJson: String) {
val json: JSONObject = JSONObject(requestJson)
val challenge: ByteArray = Base64Helper.b64Decode(json.getString("challenge"))
val timeout: Long = json.optLong("timeout", 0)
val rpId: String = json.optString("rpId", "")
val userVerification: String = json.optString("userVerification", "preferred")
private val json: JSONObject = JSONObject(requestJson)
val challenge: ByteArray =
Base64Helper.b64Decode(json.getString("challenge"))
val timeout: Long =
json.optLong("timeout", 0)
val rpId: String =
json.optString("rpId", "")
val allowCredentials: List<PublicKeyCredentialDescriptor> =
json.getPublicKeyCredentialDescriptorList("allowCredentials")
val userVerification: UserVerificationRequirement =
UserVerificationRequirement.fromString(
json.optString("userVerification", "preferred"))
?: UserVerificationRequirement.PREFERRED
// TODO Hints
val hints: List<String> = listOf()
// TODO Extensions
// val extensions: AuthenticationExtensionsClientInputs
}

View File

@@ -22,6 +22,7 @@ package com.kunzisoft.keepass.credentialprovider.passkey.util
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.res.Resources
import android.os.Build
import android.os.Bundle
import android.security.keystore.KeyGenParameterSpec
@@ -200,6 +201,28 @@ object PasskeyHelper {
}
}
/**
* Build the Passkey error response
*/
fun Activity.buildPasskeyErrorAndSetResult(
resources: Resources,
relyingPartyId: String?,
credentialIds: List<String>
) {
val error = resources.getString(
R.string.error_passkey_credential_id,
relyingPartyId,
credentialIds
)
Log.e(javaClass.name, error)
Toast.makeText(
this,
error,
Toast.LENGTH_SHORT
).show()
setResult(Activity.RESULT_CANCELED)
}
/**
* Check the timestamp and authentication code transmitted via PendingIntent
*/

View File

@@ -121,7 +121,6 @@ class DatabaseTaskProvider(
}
private fun initServiceConnection() {
actionTaskListener?.onActionStopped()
if (serviceConnection == null) {
serviceConnection = object : ServiceConnection {
override fun onBindingDied(name: ComponentName?) {

View File

@@ -4,7 +4,7 @@ import androidx.annotation.StringRes
data class ProgressMessage(
@StringRes
var titleId: Int,
var titleId: Int? = null,
@StringRes
var messageId: Int? = null,
@StringRes

View File

@@ -94,6 +94,7 @@ object SearchHelper {
callback.invoke(
SearchParameters().apply {
searchQuery = query
searchOptions = optionsString()
allowEmptyQuery = false
searchInTitles = false
searchInUsernames = false

View File

@@ -165,7 +165,7 @@ class AttachmentFileNotificationService: LockNotificationService() {
}
}
if (attachmentNotificationList.isEmpty()) {
stopSelf()
stopService()
}
}
}

View File

@@ -62,7 +62,7 @@ class ClipboardEntryNotificationService : LockNotificationService() {
sendBroadcast(Intent(LOCK_ACTION))
}
// Stop the service
stopSelf()
stopService()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {

View File

@@ -262,11 +262,12 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
)
}
} else {
/* Do not stopped here, service cannot be connected
mActionTaskListeners.forEach { actionTaskListener ->
actionTaskListener.onActionStopped(
database
)
}
}*/
}
}
}
@@ -338,7 +339,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
val intentAction = intent?.action
if (intentAction == null && !database.loaded) {
stopSelf()
stopService()
}
val actionRunnable: ActionRunnable? = when (intentAction) {
@@ -447,10 +448,10 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
TimeoutHelper.releaseTemporarilyDisableTimeout()
// Stop service after save if user remove task
if (save && mTaskRemovedRequested) {
actionOnLock()
stopService()
} else if (TimeoutHelper.checkTimeAndLockIfTimeout(this@DatabaseTaskNotificationService)) {
if (!database.loaded) {
stopSelf()
stopService()
} else {
// Restart the service to open lock notification
try {
@@ -535,11 +536,10 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
val notificationBuilder = buildNewNotification().apply {
setSmallIcon(iconId)
intent?.let {
setContentTitle(getString(
intent.getIntExtra(DATABASE_TASK_TITLE_KEY, mProgressMessage.titleId))
)
}
val titleId = mProgressMessage.titleId?.let {
intent?.getIntExtra(DATABASE_TASK_TITLE_KEY, it)
} ?: R.string.app_name
setContentTitle(getString(titleId))
setAutoCancel(false)
setContentIntent(null)
}
@@ -661,7 +661,9 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
}
private fun updateMessage(resId: Int) {
mProgressMessage.messageId = resId
mProgressMessage = mProgressMessage.copy(
messageId = resId
)
notifyProgressMessage()
}
@@ -673,7 +675,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
updateMessage(R.string.decrypting_db)
}
override fun actionOnLock() {
override fun stopService() {
if (!TimeoutHelper.temporarilyDisableLock) {
closeDatabase(mDatabase)
// Remove the database during the lock
@@ -685,7 +687,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
// Remove the lock timer (no more needed if it exists)
TimeoutHelper.cancelLockTimer(this)
// Service is stopped after receive the broadcast
super.actionOnLock()
super.stopService()
}
}
@@ -729,7 +731,9 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress
// Close channels
closeChallengeResponse()
// Restore previous message
mProgressMessage = previousMessage
mProgressMessage = previousMessage.apply {
cancelable = null
}
notifyProgressMessage()
}
return response

View File

@@ -55,7 +55,7 @@ class KeyboardEntryNotificationService : LockNotificationService() {
sendBroadcast(Intent(LOCK_ACTION))
}
// Stop the service
stopSelf()
stopService()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {

View File

@@ -20,7 +20,6 @@
package com.kunzisoft.keepass.services
import android.content.Intent
import androidx.core.app.ServiceCompat
import com.kunzisoft.keepass.timeout.TimeoutHelper
import com.kunzisoft.keepass.utils.LockReceiver
import com.kunzisoft.keepass.utils.registerLockReceiver
@@ -29,13 +28,7 @@ import com.kunzisoft.keepass.utils.unregisterLockReceiver
abstract class LockNotificationService : NotificationService() {
private var mLockReceiver: LockReceiver = LockReceiver {
actionOnLock()
}
protected open fun actionOnLock() {
// Stop the service in all cases
ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE)
stopSelf()
stopService()
}
override fun onCreate() {
@@ -46,7 +39,7 @@ abstract class LockNotificationService : NotificationService() {
override fun onTaskRemoved(rootIntent: Intent?) {
if (!TimeoutHelper.temporarilyDisableLock) {
actionOnLock()
stopService()
}
super.onTaskRemoved(rootIntent)
}

View File

@@ -17,6 +17,7 @@ import android.util.TypedValue
import android.widget.Toast
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.core.app.ServiceCompat
import androidx.core.content.ContextCompat
import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.activities.stylish.Stylish
@@ -114,6 +115,12 @@ abstract class NotificationService : Service() {
}
}
protected open fun stopService() {
// Stop the service in all cases
ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE)
stopSelf()
}
protected fun defineTimerJob(builder: NotificationCompat.Builder,
type: NotificationServiceType,
timeoutMilliseconds: Long,

View File

@@ -13,6 +13,8 @@ abstract class ExternalSettingsActivity : DatabaseModeActivity() {
private var lockView: FloatingActionButton? = null
override fun manageDatabaseInfo(): Boolean = true
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

View File

@@ -27,32 +27,27 @@ import android.view.View
import android.widget.Button
import android.widget.ProgressBar
import android.widget.TextView
import androidx.annotation.StringRes
import androidx.appcompat.app.AlertDialog
import androidx.core.view.isVisible
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.kunzisoft.keepass.R
import kotlinx.coroutines.launch
open class ProgressTaskDialogFragment : DialogFragment() {
@StringRes
private var title = UNDEFINED
@StringRes
private var message = UNDEFINED
@StringRes
private var warning = UNDEFINED
private var cancellable: (() -> Unit)? = null
private var titleView: TextView? = null
private var messageView: TextView? = null
private var warningView: TextView? = null
private var cancelButton: Button? = null
private var progressView: ProgressBar? = null
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
private val progressTaskViewModel: ProgressTaskViewModel by activityViewModels()
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
try {
activity?.let {
val builder = AlertDialog.Builder(it)
@@ -71,68 +66,63 @@ open class ProgressTaskDialogFragment : DialogFragment() {
cancelButton = root.findViewById(R.id.progress_dialog_cancel)
progressView = root.findViewById(R.id.progress_dialog_bar)
updateTitle(title)
updateMessage(message)
updateWarning(warning)
setCancellable(cancellable)
isCancelable = false
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
progressTaskViewModel.progressTaskState.collect { state ->
when (state) {
is ProgressTaskViewModel.ProgressTaskState.Show -> {
val value = state.value
updateView(
titleView,
value.titleId?.let { title ->
getString(title)
})
updateView(
messageView,
value.messageId?.let { message ->
getString(message)
})
updateView(
warningView,
value.warningId?.let { warning ->
getString(warning)
})
cancelButton?.apply {
isVisible = value.cancelable != null
setOnClickListener {
value.cancelable?.invoke()
}
}
}
else -> {
// Nothing here, this fragment is stopped externally
}
}
}
}
}
return builder.create()
}
} catch (e: Exception) {
Log.e(TAG, "Unable to create progress dialog")
Log.e(TAG, "Unable to create progress dialog", e)
}
return super.onCreateDialog(savedInstanceState)
}
fun setTitle(@StringRes titleId: Int) {
this.title = titleId
}
private fun updateView(textView: TextView?, @StringRes resId: Int) {
activity?.lifecycleScope?.launch {
if (resId == UNDEFINED) {
textView?.visibility = View.GONE
} else {
textView?.setText(resId)
textView?.visibility = View.VISIBLE
}
private fun updateView(textView: TextView?, value: String?) {
if (value == null) {
textView?.visibility = View.GONE
} else {
textView?.text = value
textView?.visibility = View.VISIBLE
}
}
private fun updateCancelable() {
activity?.lifecycleScope?.launch {
cancelButton?.isVisible = cancellable != null
cancelButton?.setOnClickListener {
cancellable?.invoke()
}
}
}
fun updateTitle(@StringRes resId: Int?) {
this.title = resId ?: UNDEFINED
updateView(titleView, title)
}
fun updateMessage(@StringRes resId: Int?) {
this.message = resId ?: UNDEFINED
updateView(messageView, message)
}
fun updateWarning(@StringRes resId: Int?) {
this.warning = resId ?: UNDEFINED
updateView(warningView, warning)
}
fun setCancellable(cancellable: (() -> Unit)?) {
this.cancellable = cancellable
updateCancelable()
}
companion object {
private val TAG = ProgressTaskDialogFragment::class.java.simpleName
const val PROGRESS_TASK_DIALOG_TAG = "progressDialogFragment"
const val UNDEFINED = -1
}
}

View File

@@ -0,0 +1,28 @@
package com.kunzisoft.keepass.tasks
import androidx.lifecycle.ViewModel
import com.kunzisoft.keepass.database.ProgressMessage
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
class ProgressTaskViewModel: ViewModel() {
private val mProgressTaskState = MutableStateFlow<ProgressTaskState>(ProgressTaskState.Hide)
val progressTaskState: StateFlow<ProgressTaskState> = mProgressTaskState
fun show(value: ProgressMessage) {
mProgressTaskState.update { currentState ->
ProgressTaskState.Show(value)
}
}
fun hide() {
mProgressTaskState.value = ProgressTaskState.Hide
}
sealed class ProgressTaskState {
data class Show(val value: ProgressMessage): ProgressTaskState()
object Hide: ProgressTaskState()
}
}

View File

@@ -98,25 +98,43 @@ object AppUtil {
}
val processedPackageNames = mutableSetOf<String>()
for (resolveInfo in resolveInfoList) {
val packageName = resolveInfo.activityInfo.packageName
if (packageName != null && !processedPackageNames.contains(packageName)) {
try {
val packageInfo = packageManager.getPackageInfo(
packageName,
PackageManager.GET_SIGNING_CERTIFICATES
)
val signatureFingerprints = packageInfo.signingInfo?.getAllFingerprints()
signatureFingerprints?.let {
browserList.add(AndroidPrivilegedApp(packageName, signatureFingerprints))
processedPackageNames.add(packageName)
}
} catch (e: Exception) {
Log.e(AppUtil::class.simpleName, "Error processing package: $packageName", e)
buildAndroidPrivilegedApp(packageManager, packageName)?.let { privilegedApp ->
browserList.add(privilegedApp)
processedPackageNames.add(packageName)
}
}
}
// Add the Play Service
val gServices = "com.google.android.gms"
buildAndroidPrivilegedApp(packageManager, gServices)?.let { privilegedApp ->
browserList.add(privilegedApp)
processedPackageNames.add(gServices)
}
return browserList.distinctBy { it.packageName } // Ensure uniqueness just in case
}
@RequiresApi(Build.VERSION_CODES.P)
private fun buildAndroidPrivilegedApp(
packageManager: PackageManager,
packageName: String
): AndroidPrivilegedApp? {
return try {
val packageInfo = packageManager.getPackageInfo(
packageName,
PackageManager.GET_SIGNING_CERTIFICATES
)
val signatureFingerprints = packageInfo.signingInfo?.getAllFingerprints()
signatureFingerprints?.let {
AndroidPrivilegedApp(packageName, signatureFingerprints)
}
} catch (e: Exception) {
Log.e(AppUtil::class.simpleName, "Error processing package: $packageName", e)
null
}
}
}

View File

@@ -32,7 +32,7 @@ class DatabaseViewModel(application: Application): AndroidViewModel(application)
val database: ContextualDatabase?
get() = databaseState.value
private val mActionState = MutableStateFlow<ActionState>(ActionState.Loading)
private val mActionState = MutableStateFlow<ActionState>(ActionState.Wait)
val actionState: StateFlow<ActionState> = mActionState
private var mDatabaseTaskProvider: DatabaseTaskProvider = DatabaseTaskProvider(
@@ -469,7 +469,7 @@ class DatabaseViewModel(application: Application): AndroidViewModel(application)
}
sealed class ActionState {
object Loading: ActionState()
object Wait: ActionState()
object OnDatabaseReloaded: ActionState()
data class OnDatabaseActionRequested(
val bundle: Bundle? = null,

View File

@@ -0,0 +1 @@
unqualifiedResLocale=en-US

View File

@@ -690,11 +690,11 @@
<string name="passkeys_preference_title">Настройки на ключове за достъп</string>
<string name="passkeys_close_database_title">Затваряне на хранилище</string>
<string name="passkeys_close_database_summary">Затваряне на хранилището след избор на ключ за достъп</string>
<string name="passkeys_privileged_apps_explanation">ВНИМАНИЕ: Привилегированото приложение работи като шлюз, който получава източника на удостоверяването. За да избегнете проблеми със сигурността се уверете в неговата автентичност.</string>
<string name="passkeys_privileged_apps_title">Привилегировани приложения</string>
<string name="passkeys_privileged_apps_summary">Управление на мрежови четци в потребителския списък с привилегировани приложения</string>
<string name="passkeys_privileged_apps_explanation">ВНИМАНИЕ: Приложенията с допълнителни права играят ролята на шлюз, от който се получава произхода на удостоверяването. За да избегнете проблеми със сигурността се уверете в неговата автентичност.</string>
<string name="passkeys_privileged_apps_title">Приложения с допълнителни права</string>
<string name="passkeys_privileged_apps_summary">Управление на мрежови четци в потребителския списък на приложения с допълнителни права</string>
<string name="passkeys_privileged_apps_ask_title">Неразпознато приложение</string>
<string name="passkeys_privileged_apps_ask_message">Приложението „%1$s“ опитва да извърши действия с ключ за достъп .\n\nДа бъде ли добавено в списъка с привилегировани приложения?</string>
<string name="passkeys_privileged_apps_ask_message">Приложението „%1$s“ опитва да извърши действия с ключ за достъп .\n\nДа бъде ли добавено в списъка на приложения с допълнителни права?</string>
<string name="passkeys_missing_signature_app_ask_title">Липсващ подпис</string>
<string name="passkeys_missing_signature_app_ask_message">Приложението „%1$s“ не е разпознато, но се опитва да извърши удостоверяване с ключ за достъп.</string>
<string name="passkeys_missing_signature_app_ask_question">Добавяне на подпис към запис на ключ за достъп?</string>
@@ -721,5 +721,5 @@
<string name="passkey_backup_state">Състояние на резервно копие на ключа за достъп</string>
<string name="error_passkey_result">Грешка при връщане на ключ за достъп</string>
<string name="passkey_relying_party">Доверяваща страна на ключа за достъп</string>
<string name="passkeys_missing_signature_app_ask_explanation">ВНИМАНИЕ: Ключът за достъп е създаден от друг клиент или подписът е премахнат. За да избегнете проблеми със сигурността се уверете, че приложението, което удостоверявате е част от същата услуга и е автентично.\nАко приложението е мрежов четец не добавяйте подписа му към записа, а в настройките го добавете в списъка с привилегировани приложения.</string>
<string name="passkeys_missing_signature_app_ask_explanation">ВНИМАНИЕ: Ключът за достъп е създаден от друг клиент или подписът е премахнат. За да избегнете проблеми със сигурността се уверете, че приложението, което удостоверявате е част от същата услуга и е автентично.\nАко приложението е мрежов четец не добавяйте подписа му към записа, а в настройките го добавете в списъка на приложенията с допълнителни права.</string>
</resources>

View File

@@ -22,7 +22,7 @@
Translations from David Ramiro
--><resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<string name="contact">Kontakt</string>
<string name="contribution">Beiträge</string>
<string name="contribution">Beitrag</string>
<string name="feedback">Feedback</string>
<string name="homepage">Webseite</string>
<string name="about_description">Android-Implementierung des Passwortmanagers KeePass.</string>
@@ -498,7 +498,7 @@
<string name="keyboard_save_search_info_title">Geteilte Informationen speichern</string>
<string name="warning_empty_recycle_bin">Alle Knoten unwiderruflich aus dem Papierkorb löschen\?</string>
<string name="error_field_name_already_exists">Der Feldname existiert bereits.</string>
<string name="device_unlock_prompt_store_credential_message">Du musst dich weiterhin an deinen Hauptschlüssel erinnern, wenn du die Geräteentsperrung verwendest.</string>
<string name="device_unlock_prompt_store_credential_message">Falls die Geräteentsperrung verwendet wird, ist es immer noch notwendig, sich die Hauptzugangsdaten für den Tresor zu merken.</string>
<string name="menu_keystore_remove_key">Schlüssel für Geräteentsperrung löschen</string>
<string name="device_unlock_prompt_store_credential_title">Verknüpfung mit Geräteentsperrung</string>
<string name="education_device_unlock_summary">Eigenes Passwort mit Biometrie- oder Geräteanmeldedaten verknüpfen, um die Datenbank schnell zu entsperren.</string>
@@ -728,4 +728,21 @@
<string name="passkeys_close_database_summary">Datenbank nach der Passwortauswahl schließen</string>
<string name="credential_provider">Anmeldeinformationsanbieter</string>
<string name="passkeys_explanation_summary">Passkeys für eine schnelle und sichere Anmeldung ohne Passwort konfigurieren</string>
<string name="passkeys_privileged_apps_summary">Browser in der benutzerdefinierten Liste privilegierter Apps verwalten</string>
<string name="passkeys_privileged_apps_explanation">WARNUNG: Eine privilegierte App fungiert als Gateway, um die Herkunft einer Authentifizierung abzurufen. Zur Vermeidung von Sicherheitsproblemen ist ihre Legitimität sicherzustellen.</string>
<string name="passkeys_privileged_apps_ask_message">%1$s versucht, eine Passkey-Aktion auszuführen.\n\nZur Liste der privilegierten Apps hinzufügen?</string>
<string name="passkeys_missing_signature_app_ask_explanation">WARNUNG: Der Passkey wurde von einem anderen Client erstellt oder die Signatur wurde gelöscht. Um Sicherheitsrisiken zu vermeiden, sollte die zu authentifizierende App zum selben Dienst gehören und legitimiert sein.\nWenn es sich bei der App um einen Browser handelt, dann die Signatur nicht zum Eintrag, sondern zur Liste der privilegierten Apps in den Einstellungen hinzufügen.</string>
<string name="passkeys_missing_signature_app_ask_message">%1$s wird nicht erkannt und versucht, sich mit einem vorhandenen Passkey zu authentifizieren.</string>
<string name="passkeys_missing_signature_app_ask_question">App-Signatur zum Passkey-Eintrag hinzufügen?</string>
<string name="passkeys_auto_select_summary">Automatische Auswahl, wenn nur ein Eintrag vorhanden und die Datenbank geöffnet ist, und nur, wenn die anfragende App kompatibel ist</string>
<string name="passkeys_backup_eligibility_summary">Bei der Erstellung festlegen, ob die Quelle für öffentliche Schlüssel-Anmeldeinformationen gesichert werden darf</string>
<string name="passkeys_backup_state_summary">Anzeigen, dass Anmeldedaten gesichert und gegen den Verlust eines einzelnen Geräts geschützt sind</string>
<string name="credential_provider_service_subtitle">Passkeys, Anbieter für das automatische Ausfüllen von Anmeldedaten</string>
<string name="passkey_service_name">KeePassDX-Anmeldeungsdatenanbieter</string>
<string name="passkey_locked_database_description">Zum Entsperren auswählen</string>
<string name="passkey_private_key">Passkey Privater Schlüssel</string>
<string name="passkey_credential_id">Passkey-Anmeldeinformation</string>
<string name="error_passkey_result">Passkey kann nicht zurückgegeben werden</string>
<string name="passkey_user_handle">Passkey-Benutzerkennung</string>
<string name="passkey_relying_party">Passkey-Vertrauensstelle</string>
</resources>

View File

@@ -165,7 +165,7 @@
<string name="warning_no_encryption_key">¿Continuar sin clave de cifrado\?</string>
<string name="encrypted_value_stored">Contraseña cifrada almacenada</string>
<string name="database_history">Historial</string>
<string name="autofill_explanation_summary">Habilite el servicio para rellenar formularios fácilmente desde otras aplicaciones</string>
<string name="autofill_explanation_summary">Configura el autocompletado para rellenar rápidamente formularios en otras aplicaciones</string>
<string name="unavailable">No disponible</string>
<string name="menu_appearance_settings">Apariencia</string>
<string name="general">General</string>
@@ -195,7 +195,7 @@
<string name="assign_master_key">Asignar una clave maestra</string>
<string name="create_keepass_file">Crear una nueva bóveda</string>
<string name="recycle_bin_title">Uso de la papelera de reciclaje</string>
<string name="recycle_bin_summary">Mueve los grupos y las entradas al grupo \"Papelera de reciclaje\" antes de eliminarlos</string>
<string name="recycle_bin_summary">Mueve los grupos y los apuntes al grupo \"Papelera de reciclaje\" antes de eliminarlos</string>
<string name="monospace_font_fields_enable_title">Tipografía del campo</string>
<string name="monospace_font_fields_enable_summary">Cambia la tipografía usada en los campos para una mejor visibilidad del carácter</string>
<string name="allow_copy_password_title">Portapapeles de confianza</string>
@@ -256,7 +256,7 @@
<string name="error_load_database">No se ha podido cargar la base de datos.</string>
<string name="error_load_database_KDF_memory">No se ha podido cargar la clave. Intente reducir el \"Uso de memoria\" del KDF.</string>
<string name="list_entries_show_username_title">Mostrar nombres de usuario</string>
<string name="list_entries_show_username_summary">Muestra los nombres de usuario en las listas de entrada</string>
<string name="list_entries_show_username_summary">Muestra los nombres de usuario en las listas de apuntes</string>
<string name="menu_copy">Copiar</string>
<string name="menu_move">Mover</string>
<string name="menu_paste">Pegar</string>
@@ -274,12 +274,12 @@
<string name="keyboard_name">Magikeyboard</string>
<string name="keyboard_label">Magikeyboard (KeePassDX)</string>
<string name="keyboard_setting_label">Configuración de Magikeyboard</string>
<string name="keyboard_entry_category">Entrada</string>
<string name="keyboard_entry_category">Apunte</string>
<string name="keyboard_entry_timeout_title">Tiempo límite</string>
<string name="keyboard_entry_timeout_summary">Tiempo límite para vaciar la entrada del teclado</string>
<string name="keyboard_entry_timeout_summary">Tiempo límite para vaciar el apunte del teclado</string>
<string name="keyboard_notification_entry_title">Información sobre notificación</string>
<string name="keyboard_notification_entry_summary">Muestra una notificación cuando esté disponible un apunte</string>
<string name="keyboard_notification_entry_content_title_text">Entrada</string>
<string name="keyboard_notification_entry_content_title_text">Apunte</string>
<string name="keyboard_notification_entry_content_title">%1$s disponible en Magikeyboard</string>
<string name="keyboard_notification_entry_content_text">%1$s</string>
<string name="keyboard_notification_entry_clear_close_title">Vaciar al cerrar</string>
@@ -291,11 +291,11 @@
<string name="keyboard_key_sound_title">Sonar al pulsar las teclas</string>
<string name="selection_mode">Modo de selección</string>
<string name="do_not_kill_app">No cierre la aplicación…</string>
<string name="lock_database_back_root_summary">Bloquear la base de datos cuando el usuario pulse el botón atrás en la pantalla inicial</string>
<string name="lock_database_back_root_summary">Pulse \'Atrás\' para bloquear la base de datos si se encuentra en la pantalla raíz de la base de datos</string>
<string name="clear_clipboard_notification_title">Vaciar al cerrar</string>
<string name="clear_clipboard_notification_summary">Bloquea la base de datos cuando caduque la duración del portapapeles o se cierre la notificación tras empezar a utilizarla</string>
<string name="recycle_bin">Papelera de reciclaje</string>
<string name="keyboard_selection_entry_title">Selección de entrada</string>
<string name="keyboard_selection_entry_title">Selección de apuntes</string>
<string name="keyboard_selection_entry_summary">Al visualizar un apunte en KeePassDX, rellena Magikeyboard con ese apunte</string>
<string name="delete_entered_password_title">Eliminar contraseña</string>
<string name="delete_entered_password_summary">Elimina la contraseña introducida tras un intento de conexión a una base de datos</string>
@@ -315,8 +315,8 @@
<string name="entry_UUID">UUID</string>
<string name="error_move_entry_here">No puede mover un apunte aquí.</string>
<string name="error_copy_entry_here">No puede copiar un apunte aquí.</string>
<string name="list_groups_show_number_entries_title">Mostrar número de entradas</string>
<string name="list_groups_show_number_entries_summary">Muestra el número de entradas de un grupo</string>
<string name="list_groups_show_number_entries_title">Mostrar número de apunte</string>
<string name="list_groups_show_number_entries_summary">Muestra el número de apuntes de un grupo</string>
<string name="content_description_background">Fondo</string>
<string name="content_description_update_from_list">Actualizar</string>
<string name="content_description_keyboard_close_fields">Cerrar campos</string>
@@ -498,7 +498,7 @@
<string name="keyboard_auto_go_action_title">Acción automática de la tecla</string>
<string name="keyboard_save_search_info_summary">Intente guardar información compartida cuando realice una selección manual de apunte para utilizar más fácil en el futuro</string>
<string name="keyboard_save_search_info_title">Guardar información compartida</string>
<string name="show_uuid_summary">Muestra el UUID vinculado a una entrada o a un grupo</string>
<string name="show_uuid_summary">Muestra el UUID vinculado a un apuntes o a un grupo</string>
<string name="show_uuid_title">Mostrar UUID</string>
<string name="error_rebuild_list">No se puede reconstruir correctamente la lista.</string>
<string name="error_database_uri_null">No se puede recuperar la URI de la base de datos.</string>
@@ -513,7 +513,7 @@
<string name="warning_database_info_changed_options">Fusionar los datos, sobrescribir las modificaciones externas guardando la base de datos o recargarla con los últimos cambios.</string>
<string name="warning_database_info_changed">La información contenida en su archivo de base de datos ha sido modificada fuera de la aplicación.</string>
<string name="menu_reload_database">Recargar datos</string>
<string name="error_otp_type">El tipo de OTP existente no es reconocido por este formulario, es posible que su validación ya no genere correctamente el código.</string>
<string name="error_otp_type">El tipo de OTP existente no es reconocido por este formulario, y es posible que su validación ya no genere correctamente el token.</string>
<string name="download_canceled">¡Cancelado!</string>
<string name="error_duplicate_file">Los datos del archivo ya existen.</string>
<string name="error_upload_file">Se ha producido un error al cargar los datos del archivo.</string>
@@ -539,7 +539,7 @@
<string name="error_word_reserved">Esta palabra está reservada y no se puede usar.</string>
<string name="templates">Plantillas</string>
<string name="templates_group_uuid_title">Grupo de plantillas</string>
<string name="templates_group_enable_summary">Utilice plantillas dinámicas para completar los campos de una entrada</string>
<string name="templates_group_enable_summary">Utilice plantillas dinámicas para completar los campos de un apunte</string>
<string name="templates_group_enable_title">Uso de plantillas</string>
<string name="version">Versión</string>
<string name="template">Plantilla</string>
@@ -571,12 +571,12 @@
<string name="ssid">SSID</string>
<string name="personal_identification_number">PIN</string>
<string name="card_verification_value">CVV</string>
<string name="show_otp_token_summary">Muestra los códigos OTP en la lista de entradas</string>
<string name="show_otp_token_summary">Muestra los códigos OTP en la lista de apuntes</string>
<string name="show_otp_token_title">Mostrar código OTP</string>
<string name="menu_external_icon">Icono externo</string>
<string name="autofill_manual_selection_summary">Muestra la opción para permitir al usuario seleccionar la entrada de la base de datos</string>
<string name="autofill_manual_selection_summary">Muestra la opción para permitir al usuario seleccionar el apunte de la base de datos</string>
<string name="autofill_manual_selection_title">Selección manual</string>
<string name="autofill_select_entry">Seleccionar entrada</string>
<string name="autofill_select_entry">Seleccionar apunte</string>
<string name="hint_icon_name">Nombre del icono</string>
<string name="warning_exact_alarm">No ha permitido que la app use una alarma exacta. Como resultado, las funciones que requieren un temporizador no se harán con una hora exacta.</string>
<string name="permission">Permiso</string>
@@ -587,7 +587,7 @@
<string name="warning_database_info_reloaded">La recarga de la base de datos borrará los datos modificados localmente.</string>
<string name="warning_keyfile_integrity">El hash del archivo no está garantizado porque Android puede cambiar sus datos sobre la marcha. Cambia la extensión del archivo a .bin para una integridad correcta.</string>
<string name="enable_keep_screen_on_title">Mantener pantalla encendida</string>
<string name="enable_keep_screen_on_summary">Mantiene la pantalla encendida cuando se visualiza la entrada</string>
<string name="enable_keep_screen_on_summary">Mantiene la pantalla encendida cuando se visualiza el apunte</string>
<string name="enable_screenshot_mode_title">Modo captura de pantalla</string>
<string name="enable_screenshot_mode_summary">Permite que aplicaciones de terceros graben o tomen pantallazos de la aplicación</string>
<string name="show_entry_colors_summary">Muestra los colores de primer y segundo plano de una entrada</string>
@@ -666,7 +666,7 @@
<string name="ask">Preguntar</string>
<string name="configure">Configurar</string>
<string name="unlock_and_link_biometric">Enlace de desbloqueo del dispositivo</string>
<string name="menu_appearance_settings_summary">Temas, colores, atributos</string>
<string name="menu_appearance_settings_summary">Temas, colores, iconos, fuentes, atributos</string>
<string name="unlock">Desbloquear</string>
<string name="education_validate_entry_title">Validar la entrada</string>
<string name="education_validate_entry_summary">No olvide validar tu inicio de sesión y guardar tu base de datos.\n\nSi se activa un bloqueo automático y olvidas que estabas haciendo una modificación, corres el riesgo de perder tus datos.</string>
@@ -683,11 +683,52 @@
<string name="style_name_dark">Oscuro</string>
<string name="warning_database_info_changed_options_read_only">Recargue la base de datos con los últimos cambios.</string>
<string name="nodes">Nodos</string>
<string name="recursive_number_entries_summary">Calcula recursivamente el número de entradas en un grupo</string>
<string name="recursive_number_entries_summary">Calcula recursivamente el número de apuntes en un grupo</string>
<string name="warning_large_keyfile">No se recomienda agregar un archivo de clave grande , esto puede impedir que se abra la base de datos.</string>
<string name="hide_templates_title">Ocultar plantillas</string>
<string name="generate_keyfile">Generar archivo de claves</string>
<string name="recursive_number_entries_title">Número recursivo de entradas</string>
<string name="recursive_number_entries_title">Número recursivo de apuntes</string>
<string name="hide_templates_summary">Las plantillas no se muestran</string>
<string name="error_otp_secret_length">La clave secreta debe tener al menos %1$d caracteres.</string>
<string name="entry_application_id">ID aplicación</string>
<string name="warning_overwrite_data_title">¿Desea sobrescribir los datos existentes?</string>
<string name="warning_overwrite_data_description">Esta acción sustituirá los datos existentes en el apuntes. Si el historial está habilitado, podrá recuperar los datos antiguos.</string>
<string name="credential_provider">Proveedor de credenciales</string>
<string name="passkeys_explanation_summary">Configure las claves de acceso para un inicio de sesión rápido y seguro sin contraseña</string>
<string name="passkeys">Claves de acceso</string>
<string name="passkeys_preference_title">Configuración de claves de acceso</string>
<string name="passkeys_close_database_title">Cerrar base de datos</string>
<string name="passkeys_close_database_summary">Cerrar la base de datos después de seleccionar una contraseña</string>
<string name="passkeys_privileged_apps_summary">Administrar navegadores en la lista personalizada de aplicaciones privilegiadas</string>
<string name="passkeys_privileged_apps_explanation">ADVERTENCIA: Una aplicación privilegiada actúa como puerta de enlace para recuperar el origen de una autenticación. Asegúrese de su legitimidad para evitar problemas de seguridad.</string>
<string name="passkeys_privileged_apps_title">Aplicaciones privilegiadas</string>
<string name="passkeys_privileged_apps_ask_title">Aplicación no reconocida</string>
<string name="passkeys_privileged_apps_ask_message">%1$s intenta realizar una acción de claves de acceso.\n\n¿Añadirlo a la lista de aplicaciones con privilegios?</string>
<string name="passkeys_missing_signature_app_ask_title">Falta la firma</string>
<string name="passkeys_missing_signature_app_ask_explanation">ADVERTENCIA: La clave de acceso se ha creado desde otro cliente o se ha eliminado la firma. Asegúrese de que la aplicación que desea autenticar forma parte del mismo servicio y es legítima para evitar problemas de seguridad.\nSi la aplicación es un navegador, no añada su firma al apunte, sino a la lista de aplicaciones privilegiadas en la configuración.</string>
<string name="passkeys_missing_signature_app_ask_message">%1$s no se reconoce e intenta autenticarse con una clave de acceso existente.</string>
<string name="passkeys_missing_signature_app_ask_question">¿Añadir firma de la aplicación al apunte de la clave de acceso?</string>
<string name="passkeys_auto_select_title">Selección automática</string>
<string name="passkeys_auto_select_summary">Seleccionar automáticamente si solo hay un apunte y la base de datos está abierta, solo si la aplicación solicitante es compatible</string>
<string name="passkeys_backup_eligibility_title">Requisitos para la copia de seguridad</string>
<string name="passkeys_backup_eligibility_summary">Determinar en el momento de la creación si se permite realizar copias de seguridad de la fuente de credenciales de clave pública</string>
<string name="passkeys_backup_state_title">Estado de copia de seguridad</string>
<string name="passkeys_backup_state_summary">Indique que las credenciales están respaldadas y protegidas contra la pérdida de un solo dispositivo</string>
<string name="credential_provider_service_subtitle">Claves de acceso, proveedor de credenciales de autocompletar</string>
<string name="passkey">Claves de acceso</string>
<string name="passkey_service_name">Proveedor de credenciales KeePassDX</string>
<string name="passkey_creation_description">Guardar clave de acceso en nuevo apunte</string>
<string name="passkey_update_description">Actualizar clave de acceso en %1$s</string>
<string name="passkey_selection_username">No se ha encontrado ninguna clave de acceso</string>
<string name="passkey_selection_description">Seleccionar una clave de acceso existente</string>
<string name="passkey_database_username">Base de datos KeePassDX</string>
<string name="passkey_locked_database_description">Seleccionar para desbloquear</string>
<string name="passkey_username">Nombre de usuario de clave de acceso</string>
<string name="passkey_private_key">Clave privada clave de acceso</string>
<string name="passkey_credential_id">Identificador de credencial de clave de acceso</string>
<string name="passkey_user_handle">Identificador de usuario de clave de acceso</string>
<string name="passkey_relying_party">Parte que confía en la clave de acceso</string>
<string name="passkey_backup_eligibility">Requisitos para la copia de seguridad de la clave de acceso</string>
<string name="passkey_backup_state">Estado de copia de seguridad de la clave de acceso</string>
<string name="error_passkey_result">No se puede retornar la clave de acceso</string>
</resources>

View File

@@ -666,4 +666,41 @@
<string name="passkeys_close_database_title">Sulge andmebaas</string>
<string name="passkeys_privileged_apps_ask_title">Rakendust ei õnnestu tuvastada</string>
<string name="warning_overwrite_data_title">Kas soovid olemasolevad andmed üle kirjutada?</string>
<string name="warning_overwrite_data_description">Selle toiminguga asendad kirje olemasolevad andmed, aga kui ajaloo logimine on kasutusel, siis saad vanu kirjeid ka hiljem näha.</string>
<string name="credential_provider">kasutajanime/salasõna automaattäite teenus</string>
<string name="passkeys">WebAuthn pääsuvõtmed</string>
<string name="passkeys_explanation_summary">Seadista WebAuthn pääsuvõtmed, mis võimaldavad kiiret ja turvalist salasõnadeta ligipääsu</string>
<string name="passkeys_preference_title">Pääsuvõtmete seadistused</string>
<string name="passkeys_close_database_summary">Peale pääsuvõtme valimist sulge andmebaas</string>
<string name="passkeys_privileged_apps_title">Eesõigustega rakendused</string>
<string name="passkeys_privileged_apps_summary">Halda brausereid sinu loodud eesõigustega rakenduste loendis</string>
<string name="passkeys_privileged_apps_explanation">HOIATUS: Eesõigustega rakendus toimib lüüsina autentimise algallikaga suhtlemisel. Turvaprobleemide vältimiseks palun taga, et kasutad õiget rakendust.</string>
<string name="passkeys_privileged_apps_ask_message">%1$s kaset pääsuvõtmega autentimiseks.\n\nKas lisame ta eesõigustega rakenduste loendisse?</string>
<string name="passkeys_missing_signature_app_ask_title">Allkiri on puudu</string>
<string name="passkeys_missing_signature_app_ask_explanation">HOAITUS: See pääsuluba on loodud teise kliendi poolt või on allkiri kustutatud. Turvaprobleemide vältimiseks palun kontrolli rakendus, milles soovi end tuvastada on sama teenuse osa ning sisuliselt õige.\n\nKui rakendus on veebibrauser, siis ära lisa allkirja kirje juurde vaid seadistustes leiduva eesõigustega rakenduste loendisse.</string>
<string name="passkeys_missing_signature_app_ask_message">%1$s on antud kontekstis tundmatu ja mittetunnustatud ning ta proovib autentimist olemasoleva pääsuvõtmega.</string>
<string name="passkeys_missing_signature_app_ask_question">Kas soovid lisada rakenduse allkirja pääsuvõtme kirjele?</string>
<string name="passkeys_auto_select_title">Automaatne valik</string>
<string name="passkeys_auto_select_summary">Vali automaatselt vaid siis, kui vaid üks kirje ja andmebaas on avatud ning vaid siis, kui rakendus ühildub</string>
<string name="passkeys_backup_eligibility_title">Varunduse kõlblikkus</string>
<string name="passkeys_backup_eligibility_summary">Otsusta loomise hetkel, kas avaliku võtme allikat on lubatud varundada</string>
<string name="passkeys_backup_state_title">Varunduse olek</string>
<string name="passkeys_backup_state_summary">Anna märku, kas autentimisandmed on varundatud ja kaitstud üksiku seadme kaotsimineku puhul</string>
<string name="credential_provider_service_subtitle">Pääsuvõtmed - automaattäite teenusepakkuja</string>
<string name="passkey">WebAuthn pääsuvõti</string>
<string name="passkey_service_name">KeePassDX autentimisteenusepakkuja</string>
<string name="passkey_creation_description">Salvesta pääsuvõti uue kirjena</string>
<string name="passkey_update_description">Uuenda pääsuvõtit: %1$s</string>
<string name="passkey_selection_username">Pääsuvõtit ei leidu</string>
<string name="passkey_selection_description">Vali olemasolev pääsuvõti</string>
<string name="passkey_database_username">KeePassDX-i andmebaas</string>
<string name="passkey_locked_database_description">Vali lukustuse eemaldamiseks</string>
<string name="passkey_username">Pääsuvõtme kasutajanimi</string>
<string name="passkey_private_key">Pääsuvõtme privaatvõti</string>
<string name="passkey_credential_id">Pääsuvõtme autentimisühiku tunnus</string>
<string name="passkey_user_handle">Pääsuvõtme kasutaja võrgutunnus</string>
<string name="passkey_relying_party">Pääsuvõtit edastav osapool</string>
<string name="passkey_backup_eligibility">Pääsuvõtme kõlblikkus varundamiseks</string>
<string name="passkey_backup_state">Pääsuvõtme varunduse olek</string>
<string name="error_passkey_result">Pääsuvõtme väljastamine vastuseks ei õnnestu</string>
</resources>

View File

@@ -19,7 +19,7 @@
--><resources>
<string name="feedback">Palaute</string>
<string name="homepage">Kotisivu</string>
<string name="about_description">KeePass-salasanahallintaohjelman Android-toteutus</string>
<string name="about_description">KeePass-salasanahallintaohjelman Android-toteutus.</string>
<string name="accept">Hyväksy</string>
<string name="add_entry">Lisää uusi salasanatietue</string>
<string name="add_group">Lisää ryhmä</string>
@@ -29,7 +29,7 @@
<string name="application">Sovellus</string>
<string name="menu_app_settings">Ohjelman asetukset</string>
<string name="brackets">Hakasulkeet</string>
<string name="file_manager_install_description">Tietokantojen avaamista, luomista ja tallentamista varten tarvitaan tiedostonhallintaohjelma, joka tukee ACTION_CREATE_DOCUMENT ja ACTION_OPEN_DOCUMENT Intent-toimintoja.</string>
<string name="file_manager_install_description">Tietokantojen avaamista, luomista ja tallentamista varten tarvitaan tiedostonhallintaohjelma, joka tukee ACTION_CREATE_DOCUMENT ja ACTION_OPEN_DOCUMENT intent-toimintoja.</string>
<string name="clipboard_cleared">Leikepöytä tyhjennetty</string>
<string name="clipboard_error_title">Leikepöytävirhe</string>
<string name="clipboard_error">Jotkin laitteet eivät anna sovellusten käyttää leikepöytää.</string>
@@ -145,7 +145,7 @@
<string name="edit_entry">Muokkaa merkintää</string>
<string name="error_disallow_no_credentials">Ainakin yksi pääsytieto tulee olla asetettuna.</string>
<string name="error_load_database_KDF_memory">Avainta ei pystytty lataamaan. Kokeile vähentää KDF ”Muistin käyttöä”.</string>
<string name="error_load_database">Tietokantaa ei pystytty avaamaan.</string>
<string name="error_load_database">Tietokantaa ei pystytty lataamaan.</string>
<string name="error_invalid_OTP">Virheellinen OTP salaisuus.</string>
<string name="entry_otp">OTP</string>
<string name="otp_algorithm">Algoritmi</string>
@@ -173,7 +173,7 @@
<string name="content_description_repeat_toggle_password_visibility">Toista salasanan näkyvyyden vaihto</string>
<string name="content_description_keyfile_checkbox">Avaintiedoston valintaruutu</string>
<string name="content_description_password_checkbox">Salasanan valintaruutu</string>
<string name="content_description_file_information">Tietoja tiedostosta</string>
<string name="content_description_file_information">Tiedoston tiedot</string>
<string name="content_description_add_item">Lisää esine</string>
<string name="content_description_add_group">Lisää ryhmä</string>
<string name="content_description_add_entry">Lisää kohta</string>
@@ -192,7 +192,7 @@
<string name="menu_appearance_settings">Ulkonäkö</string>
<string name="database_history">Historia</string>
<string name="biometric">Biometrinen</string>
<string name="unavailable">Tässä salasanatietokannassa ei ole vielä pääsytietoja.</string>
<string name="unavailable">Ei saatavilla</string>
<string name="keystore_not_accessible">Avainsäilöä ei ole kunnolla alustettu.</string>
<string name="build_label">Koontiversio %1$s</string>
<string name="warning_database_link_revoked">Tiedostoon pääsy evätty</string>
@@ -235,7 +235,7 @@
<string name="memory_usage_explanation">Avaimen johtamisfunktion käyttämän muistin määrä.</string>
<string name="memory_usage">Muistin käyttö</string>
<string name="kdf_explanation">Pääavain muunnetaan käyttäen satunnaista suolattua avaimen johtamisfunktiota, jotta salausalgoritmin avain voidaan generoida.</string>
<string name="encryption_explanation">Salasanatietokannan salausalgoritmi, jota käytetään kaikelle datalle.</string>
<string name="encryption_explanation">Salasanatietokannan salausalgoritmi, jota käytetään kaikelle datalle</string>
<string name="password_size_title">Generoidun salasanan pituus</string>
<string name="set_credential_provider_service_title">Aseta oletus automaattiselle täytölle</string>
<string name="autofill_sign_in_prompt">Kirjaudu sisään KeePassDX:llä</string>
@@ -257,10 +257,10 @@
<string name="sort_menu">Järjestä</string>
<string name="parallelism_explanation">Avaimen johtamisfunktion käyttämä rinnakkaisuuden aste (eli säikeiden määrä).</string>
<string name="show_recent_files_title">Näytä viimeaikaiset tiedostot</string>
<string name="remember_keyfile_locations_summary">Muista salasanatietokantojen avaintiedostojen sijainti</string>
<string name="remember_keyfile_locations_title">Tallenna avaintiedostojen sijainti</string>
<string name="remember_database_locations_summary">Muista salasanatietokantojen sijainti</string>
<string name="remember_database_locations_title">Tallenna salasatietokantojen sijainti</string>
<string name="remember_keyfile_locations_summary">Tallentaa avaintiedostojen tiedostosijannin</string>
<string name="remember_keyfile_locations_title">Muista avaintiedostojen tiedostosijainnin</string>
<string name="remember_database_locations_summary">Tallentaa tietokantojen tiedostosijainnit</string>
<string name="remember_database_locations_title">Muista tietokantojen sijainnit</string>
<string name="selection_mode">Valintatila</string>
<string name="contains_duplicate_uuid_procedure">Ratkaise ongelma generoimalla uudet UUID:t kaksoiskappaleilla jatkaaksesi\?</string>
<string name="contains_duplicate_uuid">Tietokanta sisältää päällekkäisiä UUID-tunnuksia.</string>
@@ -286,9 +286,9 @@
<string name="menu_form_filling_settings">Lomakkeen täyttö</string>
<string name="copy_field">Kopio %1$s:sta</string>
<string name="creating_database">Luodaan tietokantaa…</string>
<string name="list_groups_show_number_entries_summary">Näytä tietueiden määrä ryhmässä</string>
<string name="list_groups_show_number_entries_summary">Näytä tietueiden määrän ryhmässä</string>
<string name="list_groups_show_number_entries_title">Näytä tietueiden määrä</string>
<string name="list_entries_show_username_summary">Näytä käyttäjänimet tietuelistoissa</string>
<string name="list_entries_show_username_summary">Näytä käyttäjänimet tietuelistoissa</string>
<string name="list_entries_show_username_title">Näytä käyttäjänimet</string>
<string name="invalid_db_same_uuid">%1$s samalla UUID:lla %2$s on jo olemassa.</string>
<string name="file_not_found_content">Tiedostoa ei löytynyt. Yritä avata se uudelleen tiedostoselaimessasi.</string>
@@ -367,7 +367,7 @@
<string name="public_key">Julkinen avain</string>
<string name="private_key">Salainen avain</string>
<string name="error_word_reserved">Tämä sana on varattu eikä sitä voi käyttää.</string>
<string name="error_otp_type">Olemassaolevaa OTP-tyyppiä ei ole tunnistettu tällä lomakkeella, ja sen validointi ei välttämättä enää tuota oikein tokenia.</string>
<string name="error_otp_type">Olemassaolevaa OTP-tyyppiä ei ole tunnistettu tällä lomakkeella, ja sen validointi ei välttämättä enää tuota tokenia oikein.</string>
<string name="show_uuid_summary">Näyttää tietueen tai ryhmän UUID-tunnisteen</string>
<string name="generate_keyfile">Luo avaintiedosto</string>
<string name="nodes">Solmut</string>
@@ -388,16 +388,16 @@
<string name="error_database_uri_null">Tietokannan URI-osoitetta ei voi palauttaa.</string>
<string name="error_file_to_big">Lataamasi tiedosto on liian suuri.</string>
<string name="error_remove_file">Virhe poistaessa tiedoston tietoja.</string>
<string name="error_challenge_already_requested">Haaste on jo pyydetty</string>
<string name="error_challenge_already_requested">Haaste on jo pyydetty.</string>
<string name="error_response_already_provided">Vastaus on jo annettu.</string>
<string name="error_no_response_from_challenge">Vastausta haasteeseen ei voitu saada.</string>
<string name="error_unable_merge_database_kdb">Ei voitu yhdistää kdb-tietokantatiedostoon</string>
<string name="error_unable_merge_database_kdb">Ei voitu yhdistää kdb-tietokantatiedostoon.</string>
<string name="error_location_unknown">Tietokannan sijainti ei ole tiedossa, tietokannan toimintaa ei voida suorittaa.</string>
<string name="error_hardware_key_unsupported">Laitteistoavainta ei tueta.</string>
<string name="error_empty_key">Avain ei voi olla tyhjä.</string>
<string name="corrupted_file">Korruptoitunut tiedosto.</string>
<string name="passphrase">Salalause</string>
<string name="error_registration_read_only">Uuden tietueen tallentaminen ei ole sallittua, kun tietokanta on vain lukutilassa</string>
<string name="error_registration_read_only">Uuden tietueen tallentaminen ei ole sallittua, kun tietokanta on Vain luku -tilassa.</string>
<string name="bank_name">Pankin nimi</string>
<string name="warning_permanently_delete_nodes">Poista pysyvästi valitut solmut?</string>
<string name="warning_database_info_changed">Tietokantatiedoston sisältämää tietoa on muutettu sovelluksen ulkopuolella.</string>
@@ -416,10 +416,10 @@
<string name="menu_security_settings_summary">Salaus, avaimen johtamisfunktio</string>
<string name="master_key_settings_summary">Muutos, uudistus</string>
<string name="remember_hardware_key_title">Muista laitteistoavaimet</string>
<string name="remember_hardware_key_summary">Seuraa käytettyjä laitteistoavaimia</string>
<string name="remember_hardware_key_summary">Tallenna käytetyt laitteistoavaimet</string>
<string name="import_app_properties_title">Tuo sovellusasetukset</string>
<string name="import_app_properties_summary">Valitse tiedosto tuodaksesi sovellusasetukset</string>
<string name="error_import_app_properties">Virhe sovellusasetuksia tuodessa</string>
<string name="error_import_app_properties">Virhe sovellusasetuksia tuodessa.</string>
<string name="filter">Suodatin</string>
<string name="warning_database_already_opened">Sulje avoinna oleva tietokanta ennen uuden avaamista</string>
<string name="warning_empty_recycle_bin">Poista pysyvästi kaikki solmut roskakorista?</string>
@@ -435,7 +435,7 @@
<string name="export_app_properties_title">Vie sovellusasetukset</string>
<string name="description_app_properties">KeePassDX ominaisuudet sovellusasetusten hallintaan</string>
<string name="success_import_app_properties">Sovellusasetukset tuotu</string>
<string name="error_export_app_properties">Virhe sovellusasetuksia viedessä</string>
<string name="error_export_app_properties">Virhe sovellusasetuksia viedessä.</string>
<string name="success_export_app_properties">Sovellusasetukset tuotu</string>
<string name="error_otp_secret_length">Secret key on oltava vähintään %1$d merkkiä.</string>
<string name="warning_database_info_changed_options">Yhdistä tiedot, korvaa ulkoiset muutokset tallentamalla tietokanta tai lataa se uudelleen uusimmilla muutoksilla.</string>
@@ -463,4 +463,24 @@
<string name="properties">Ominaisuudet</string>
<string name="menu_appearance_settings_summary">Teemat, värit, kuvakkeet, fontit, attribuutit</string>
<string name="device_credential">Laitteen tunnistetiedot</string>
<string name="entry_application_id">Sovelluksen ID</string>
<string name="warning_overwrite_data_title">Tallenna olemassaolevan datan päälle?</string>
<string name="warning_overwrite_data_description">Tämä toiminto korvaa tietueessa jo olemassa olevan datan, mutta voit palauttaa vanhan datan jos historia on otettu käyttöön.</string>
<string name="configure_biometric">Biometrisiä tunnistetietoja tai laitteen lukitusta ei ole otettu käyttöön.</string>
<string name="credential_provider">Tunnistetietojen tarjoaja</string>
<string name="passkeys">Pääsyavaimet</string>
<string name="passkeys_explanation_summary">Ota pääsyavaimet käyttöön nopeaan ja turvalliseen salasanattomaan kirjautumiseen</string>
<string name="passkeys_preference_title">Pääsyavainten asetukset</string>
<string name="passkeys_close_database_title">Sulje tietokanta</string>
<string name="passkeys_close_database_summary">Sulje tietokanta pääsyavaimen valitsemisen jälkeen</string>
<string name="passkeys_privileged_apps_title">Luotetut sovellukset</string>
<string name="passkeys_privileged_apps_summary">Hallinnoi selaimia luotettujen sovellustesi listassa</string>
<string name="passkeys_privileged_apps_explanation">VAROITUS: Luotettu sovellus toimii porttina tunnistautumisen alkuperän selvittämiseen. Varmista sen aitous välttääksesi tietoturvaongelmia.</string>
<string name="passkeys_privileged_apps_ask_title">Sovellusta ei tunnistettu</string>
<string name="passkeys_privileged_apps_ask_message">%1$s yrittää pääsyavaintoimintoa.\n\nLisätäänkö se luotettujen sovellusten listaan?</string>
<string name="passkeys_missing_signature_app_ask_title">Allekirjoitus puuttuu</string>
<string name="passkeys_missing_signature_app_ask_explanation">VAROITUS: Pääsyavain joko luotiin toisessa ohjelmassa tai sen allekirjoitus on poistettu. Varmista, että sovellus jonka haluat todentaa on osana samaa palvelua, ja että se on aito tietoturvaongelmien välttämiseksi.\nJos sovellus on selain, älä lisää sen allekirjoitusta tietueeseen, vaan lisää se asetuksissa luotettujen sovellusten listaan.</string>
<string name="passkeys_missing_signature_app_ask_message">%1$s on tuntematon ja se yrittää tunnistautua jo olemassaolevalla pääsyavaimella.</string>
<string name="passkeys_missing_signature_app_ask_question">Lisätäänkö sovelluksen allekirjoitus pääsyavaimen tietueeseen?</string>
<string name="passkeys_auto_select_title">Automaattinen valinta</string>
</resources>

View File

@@ -411,7 +411,7 @@
<string name="autofill">מילוי אוטומטי</string>
<string name="autofill_sign_in_prompt">התחבר עם KeePassDX</string>
<string name="general">כללי</string>
<string name="autofill_explanation_summary">הפעל מילוי אוטומטי כדי למלא במהירות טפסים ביישומים אחרים</string>
<string name="autofill_explanation_summary">הגדר מילוי אוטומטי כדי למלא במהירות טפסים ביישומים אחרים</string>
<string name="set_credential_provider_service_title">הגדר שירות מילוי אוטומטי ברירת מחדל</string>
<string name="password_size_title">גודל סיסמה שנוצרה</string>
<string name="password_size_summary">מגדיר גודל ברירת המחדל של הסיסמאות שנוצרו</string>
@@ -420,7 +420,7 @@
<string name="clipboard_warning">אם מחיקה אוטומטית של לוח ההעתקה נכשלת, מחק את ההיסטוריה שלו ידנית.</string>
<string name="lock_database_screen_off_summary">נעל את מסד הנתונים לאחר כמה שניות ברגע שהמסך כבוי</string>
<string name="lock_database_screen_off_title">נעילת מסך</string>
<string name="lock_database_back_root_summary">נעל את מסד הנתונים כאשר המשתמש לוחץ על כפתור החזרה במסך הראשי</string>
<string name="lock_database_back_root_summary">הקש על כפתור החזרה במסך הראשי בכדי לנעול את מסד הנתונים</string>
<string name="biometric_unlock_enable_title">ביטול נעילה ביומטרית</string>
<string name="biometric_unlock_enable_summary">מאפשר לך לסרוק את האמצעי הביומטרי שלך כדי לפתוח את מסד הנתונים</string>
<string name="device_unlock_explanation_summary">השתמש בביטול נעילת המכשיר כדי לפתוח את מסד הנתונים ביתר קלות</string>
@@ -604,7 +604,7 @@
<string name="unlock_and_link_biometric">קישור ביטול נעילת מכשיר</string>
<string name="encrypted_value_stored">סיסמה מוצפנת אוחסנה</string>
<string name="unavailable">לא זמין</string>
<string name="menu_appearance_settings_summary">ערכות נושא, צבעים, תכונות</string>
<string name="menu_appearance_settings_summary">ערכות נושא, צבעים, סמלים, גופנים, תכונות</string>
<string name="autofill_select_entry">בחר רשומה…</string>
<string name="templates_group_enable_title">שימוש בתבניות</string>
<string name="templates_group_enable_summary">השתמש בתבניות דינמיות כדי למלא את השדות של רשומה</string>
@@ -686,4 +686,40 @@
<string name="html_text_buy_pro">על ידי קניית גרסת הפרו, תהיה לך גישה ל&lt;strong&gt;סגנון החזותי&lt;/strong&gt; הזה ותעזור במיוחד עם &lt;strong&gt;ההגשמה של פרויקטים קהילתיים.&lt;/strong&gt;</string>
<string name="html_text_dev_feature_buy_pro">על ידי קניית גרסת ה&lt;strong&gt;פרו&lt;/strong&gt;,</string>
<string name="error_otp_secret_length">מפתח סודי חייב להיות לפחות %1$d תווים.</string>
<string name="entry_application_id">מזהה אפליקציה</string>
<string name="warning_overwrite_data_title">להחליף נתונים קיימים?</string>
<string name="warning_overwrite_data_description">פעולה זו תחליף את הנתונים הקיימים בערך, ניתן לאחזר את הנתונים הישנים אם ההיסטוריה מופעלת.</string>
<string name="passkeys">מפתחות גישה</string>
<string name="passkeys_explanation_summary">הגדר מפתחות גישה בשביל התחברות ללא סיסמה מהירה ובטוחה</string>
<string name="passkeys_preference_title">הגדרות מפתחות גישה</string>
<string name="passkeys_close_database_title">סגור מסד נתונים</string>
<string name="passkeys_close_database_summary">סגור את מסד הנתונים לאחר בחירת מפתח גישה</string>
<string name="passkeys_privileged_apps_title">אפליקציות מורשות</string>
<string name="passkeys_privileged_apps_summary">ניהול דפדפנים ברשימה המותאמת אישית של אפליקציות מורשות</string>
<string name="passkeys_privileged_apps_ask_title">אפליקציה לא מזוהה</string>
<string name="passkeys_backup_eligibility_title">זכאות לגיבוי</string>
<string name="passkeys_backup_eligibility_summary">קבע בעת היצירה האם מותר לגבות את מפתחות הגישה</string>
<string name="passkeys_backup_state_title">מצב הגיבוי</string>
<string name="passkeys_backup_state_summary">ציון שמפתחות הגישה מגובים ומוגנים מפני אובדן של מכשיר בודד</string>
<string name="credential_provider_service_subtitle">ספק מפתחות גישה ומילוי אוטומטי</string>
<string name="passkey">מפתח גישה</string>
<string name="passkey_creation_description">שמו מפתח גישה ברשומה חדשה</string>
<string name="passkey_update_description">עדכן מפתח גישה ב-%1$s</string>
<string name="passkey_selection_username">לא נמצא מפתח גישה</string>
<string name="passkey_selection_description">בחר מפתח גישה קיים</string>
<string name="passkey_database_username">KeePassDX מסד נתונים</string>
<string name="passkey_locked_database_description">בחר בשביל לפתוח</string>
<string name="passkey_username">שם משתמש למפתח גישה</string>
<string name="passkey_private_key">מפתח פרטי למפתח גישה</string>
<string name="passkey_credential_id">מזהה ייחודי של מפתח גישה</string>
<string name="passkey_user_handle">משתמש של מפתח גישה</string>
<string name="passkey_relying_party">ספק מפתח גישה</string>
<string name="passkey_backup_eligibility">זמינות לגיבוי מפתח ראשי</string>
<string name="passkey_backup_state">מצב גיבוי מפתח ראשי</string>
<string name="error_passkey_result">לא ניתן להחזיר מפתח גישה</string>
<string name="passkeys_missing_signature_app_ask_title">חסר חתימה</string>
<string name="passkeys_missing_signature_app_ask_question">הוסף חתימת יישום לרשומת מפתח גישה?</string>
<string name="passkeys_auto_select_title">בחירה אוטומטית</string>
<string name="passkeys_auto_select_summary">בחר אוטומטית אם רק רשומה אחת מתאימה ומסד הנתונים פתוח, ורק אם היישום המבקש מתאים</string>
<string name="passkeys_privileged_apps_ask_message">%1$s מנסה לבצע פעולה עם מפתח גישה.\n\nלהוסיך אותו לרשימת יישומים מורשים?</string>
</resources>

View File

@@ -19,7 +19,7 @@
--><resources>
<string name="feedback">피드백</string>
<string name="homepage">홈페이지</string>
<string name="about_description">KeePass 암호 관리자의 Android 구현</string>
<string name="about_description">KeePass 암호 관리자의 Android 구현체.</string>
<string name="accept">확인</string>
<string name="add_entry">항목 추가</string>
<string name="edit_entry">항목 수정</string>
@@ -40,14 +40,13 @@
<string name="clipboard_error_clear">클립보드를 비울 수 없음</string>
<string name="clipboard_timeout">클립보드 시간 초과</string>
<string name="clipboard_timeout_summary">클립보드 저장이 유지될 시간 (장치가 지원한다면)</string>
<string name="select_to_copy">%1$s 을(를) 클립보드에 복사하려면 선택하십시오.</string>
<string name="select_to_copy">%1$s 을(를) 클립보드에 복사하</string>
<string name="retrieving_db_key">데이터베이스 키를 검색하는 중…</string>
<string name="database">데이터베이스</string>
<string name="decrypting_db">데이터베이스 컨텐츠 암호 해독 중…</string>
<string name="default_checkbox">기본 데이터베이스로 사용</string>
<string name="digits">단위</string>
<string name="html_about_licence">KeePassDX © %1$d Kunzisoft는 보증이 적용되지 않습니다; 이것은 자유 소프트웨어이며, 광고가 없습니다.
\n이 것은 보증 없이 있는 그대로, GPL 버전 3하에 제공됩니다.</string>
<string name="html_about_licence">KeePassDX © %1$d Kunzisoft는 보증이 적용되지 않습니다; 이것은 &lt;strong&gt;자유 소프트웨어&lt;/strong&gt;이며, &lt;strong&gt;광고가 없습니다&lt;/strong&gt;. \n이 것은 보증 없이 있는 그대로, &lt;strong&gt;GPL 버전 3&lt;/strong&gt; 라이선스로 제공됩니다.</string>
<string name="entry_accessed">접근됨</string>
<string name="entry_cancel">취소</string>
<string name="entry_notes">노트</string>
@@ -81,22 +80,22 @@
<string name="field_name">필드 이름</string>
<string name="field_value">필드 값</string>
<string name="file_not_found_content">파일을 찾을 수 없습니다. 파일 탐색기에서 열리는지 확인해 주세요.</string>
<string name="file_browser">파일 탐색기</string>
<string name="file_browser">파일 관리자</string>
<string name="generate_password">비밀번호 생성</string>
<string name="hint_conf_pass">비밀번호 확인</string>
<string name="hint_generated_password">생성된 비밀번호</string>
<string name="hint_conf_pass">패스워드 확인</string>
<string name="hint_generated_password">생성된 패스워드</string>
<string name="hint_group_name">그룹 이름</string>
<string name="hint_keyfile">키 파일</string>
<string name="hint_length">길이</string>
<string name="hint_pass">비밀번호</string>
<string name="hint_pass">패스워드</string>
<string name="password">비밀번호</string>
<string name="invalid_credentials">비밀번호나 키 파일을 읽을 수 없습니다.</string>
<string name="invalid_credentials">패스워드나 키 파일을 읽을 수 없습니다.</string>
<string name="invalid_algorithm">잘못된 알고리즘입니다.</string>
<string name="invalid_db_sig">데이터베이스 형식을 인식할 수 없습니다.</string>
<string name="keyfile_is_empty">이 키 파일은 비어 있습니다.</string>
<string name="length">길이</string>
<string name="list_entries_show_username_title">아이디 보이기</string>
<string name="list_entries_show_username_summary">엔트리 목록에 아이디 보이기</string>
<string name="list_entries_show_username_summary">항목 리스트에 사용자 이름을 표시합니다</string>
<string name="list_size_title">리스트 항목 크기</string>
<string name="list_size_summary">요소 목록 텍스트 크기</string>
<string name="loading_database">데이터베이스 로딩 중…</string>
@@ -105,7 +104,7 @@
<string name="hide_password_summary">기본 비밀번호를 (***) 로 가리기</string>
<string name="about">정보</string>
<string name="menu_change_key_settings">마스터 키 바꾸기</string>
<string name="copy_field">%1$s 복사됨</string>
<string name="copy_field">%1$s의 사본</string>
<string name="settings">설정</string>
<string name="menu_app_settings">앱 설정</string>
<string name="menu_form_filling_settings">폼 채우기</string>
@@ -129,8 +128,8 @@
<string name="never">절대 하지 않음</string>
<string name="no_results">검색 결과가 없음</string>
<string name="no_url_handler">이 URL을 열기 위해 웹 브라우저를 설치하십시오.</string>
<string name="select_database_file">가지고 있는 데이터베이스 열기</string>
<string name="create_keepass_file">데이터베이스 생성</string>
<string name="select_database_file">기존 저장소 열기</string>
<string name="create_keepass_file">저장소 생성</string>
<string name="progress_create">새 데이터베이스 생성 중…</string>
<string name="progress_title">작업 중…</string>
<string name="protection">보호</string>
@@ -138,7 +137,7 @@
<string name="read_only_warning">KeePassDX는 데이터베이스를 수정하기 위해 쓰기 권한이 필요합니다.</string>
<string name="content_description_remove_from_list">삭제</string>
<string name="root">루트</string>
<string name="encryption_explanation">데이터베이스 암호화 알고리즘이 모든 데이터에 적용됩니다.</string>
<string name="encryption_explanation">데이터베이스 암호화 알고리즘이 모든 데이터에 적용됩니다</string>
<string name="memory_usage">메모리 사용량</string>
<string name="memory_usage_explanation">바이너리 바이트 단위의 메모리 용량이 키 파생 기능에 사용됩니다.</string>
<string name="saving_database">데이터베이스 저장 중…</string>
@@ -250,10 +249,10 @@
<string name="error_field_name_already_exists">그 필드 이름은 이미 존재합니다.</string>
<string name="inherited">상속</string>
<string name="auto_type">자동입력</string>
<string name="warning_database_already_opened">데이터베이스가 이미 열려있습니다. 새 것을 열려면 지금 것을 먼저 닫아주세요.</string>
<string name="warning_database_already_opened">데이터베이스가 이미 열려있습니다. 새 것을 열려면 지금 것을 먼저 닫아주세요</string>
<string name="hide_broken_locations_summary">최근 데이터베이스 목록에서 파손된 링크를 감춤</string>
<string name="import_app_properties_summary">앱 속성을 내보낼 파일 선택</string>
<string name="success_import_app_properties">속성을 가져왔습니다.</string>
<string name="import_app_properties_summary">가져올 앱 설정 파일 선택</string>
<string name="success_import_app_properties">설정 가져옴</string>
<string name="kdf_explanation">암호화 알고리즘 용 키를 생성하기 위해, 마스터키는 임의의 솔트(salt) 키 파생 함수를 사용하여 변환됩니다.</string>
<string name="warning">경고</string>
<string name="error_challenge_already_requested">이미 요청된 시도입니다.</string>
@@ -262,14 +261,14 @@
<string name="error_response_already_provided">이미 응답했습니다.</string>
<string name="error_location_unknown">데이터 베이스 위치를 알 수 없어 데이터 베이스 액션을 수행할 수 없습니다.</string>
<string name="error_driver_required">%1$s 를 위한 드라이버가 요구됩니다.</string>
<string name="error_unable_merge_database_kdb">데이터베이스 V1로부터 병합할 수 없습니다.</string>
<string name="error_unable_merge_database_kdb">kdb 데이터베이스 파일과 병합할 수 없습니다.</string>
<string name="error_hardware_key_unsupported">하드웨어 키는 지원하지 않습니다.</string>
<string name="error_empty_key">키는 반드시 입력해야 합니다.</string>
<string name="hint_icon_name">아이콘명</string>
<string name="passphrase">암호문</string>
<string name="colorize_password_title">비밀번호에 색상 부여</string>
<string name="colorize_password_summary">타입에 따라 비밀번호 문자에 색상을 부여</string>
<string name="export_app_properties_title">속성을 내보내기</string>
<string name="export_app_properties_title">설정 내보내기</string>
<string name="uppercase">대문자</string>
<string name="menu_security_settings">보안 설정</string>
<string name="menu_reload_database">데이터 다시 읽기</string>
@@ -280,7 +279,7 @@
<string name="save_mode">저장 모드</string>
<string name="selection_mode">선택 모드</string>
<string name="remember_hardware_key_title">하드웨어 키를 기억</string>
<string name="export_app_properties_summary">속성을 내보 파일 생성</string>
<string name="export_app_properties_summary">설정을 내보내기 위해 파일 생성</string>
<string name="error_import_app_properties">앱 속성을 가져오던 중 오류 발생.</string>
<string name="contains_duplicate_uuid">데이터베이스가 중복된 UUID를 포함하고 있습니다.</string>
<string name="remember_database_locations_summary">데이터 베이스가 저장된 곳을 추적</string>
@@ -311,7 +310,7 @@
<string name="menu_restore_entry_history">이력을 복구</string>
<string name="subdomain_search_summary">보조 도메인 제한하에 웹 도메인을 검색</string>
<string name="contains_duplicate_uuid_procedure">중복에 대해 새로운 UUID를 생성하여 문제를 해결하고 진행할까요\?</string>
<string name="success_export_app_properties">속성을 내보냈습니다.</string>
<string name="success_export_app_properties">설정 내보냄</string>
<string name="parallelism">병렬 처리</string>
<string name="command_execution">명령 실행중…</string>
<string name="menu_master_key_settings">마스터 키 설정</string>
@@ -321,14 +320,14 @@
<string name="menu_device_unlock_settings">고급 잠금 해제</string>
<string name="search_mode">검색 모드</string>
<string name="rounds_explanation">추가적인 암호화 차수를 설정함으로써 무차별 대입 공격(brute force attack)에 대한 방어를 강화할 수 있습니다. 대신 읽기/저장시 느려질 수 있습니다.</string>
<string name="do_not_kill_app">앱을 강제 종료하지 마세요.</string>
<string name="do_not_kill_app">앱을 강제 종료하지 마세요</string>
<string name="sort_recycle_bin_bottom">휴지통을 바닥에</string>
<string name="warning_database_link_revoked">파일에 대한 접근이 파일 관리자에 의해 철회되었습니다.</string>
<string name="warning_database_link_revoked">파일에 대한 접근이 파일 관리자에 의해 철회되었습니다</string>
<string name="hide_broken_locations_title">파손된 데이터페이스 링크를 감춤</string>
<string name="import_app_properties_title">속성을 가져오기</string>
<string name="import_app_properties_title">설정 가져오기</string>
<string name="error_export_app_properties">앱 속성을 내보내던 중 오류 발생.</string>
<string name="rounds">변환 차수</string>
<string name="parallelism_explanation">키 파생 함수에 사용되는 병렬 처리 수준 (즉, 스레드의 갯수)</string>
<string name="parallelism_explanation">키 파생 함수에 사용되는 병렬 처리 수준(즉, 스레드의 갯수).</string>
<string name="html_about_privacy">&lt;strong&gt;사용자 데이터를 받아오지 않습니다.&lt;/strong&gt; 어떤 서버에도 연결하지 않고 로컬로만 동작하며 사용자의 사생활(프라이버시)를 최우선시합니다.</string>
<string name="error_rebuild_list">목록 재구축을 알맞게 할 수 없습니다.</string>
<string name="error_file_to_big">업로드하려는 파일이 너무 큽니다.</string>
@@ -339,50 +338,50 @@
<string name="show_otp_token_summary">항목 목록에서 OTP 토큰을 표시</string>
<string name="show_uuid_title">UUID를 표시</string>
<string name="show_uuid_summary">항목이나 그룹에 연결된 UUID를 표시</string>
<string name="creating_database">데이터 베이스 생성</string>
<string name="creating_database">데이터베이스 생성중…</string>
<string name="menu_merge_database">데이터 병합</string>
<string name="menu_merge_from">... 로부터 병합</string>
<string name="menu_save_copy_to">... 에 복사본 저장</string>
<string name="menu_keystore_remove_key">고급 잠금 해제 키 삭제</string>
<string name="menu_merge_from">로부터 병합</string>
<string name="menu_save_copy_to">에 복사본 저장</string>
<string name="menu_keystore_remove_key">디바이스 잠금 해제 키 삭제</string>
<string name="sort_last_access_time">접근</string>
<string name="invalid_db_same_uuid">%1$s 와 동일한 UUID %2$s 가 이미 존재합니다.</string>
<string name="underline">밑줄</string>
<string name="unsupported_db_version">지원하지 않는 데이터베이스 버전입니다.</string>
<string name="permission">허용</string>
<string name="permission">권한</string>
<string name="menu_appearance_settings">테마</string>
<string name="biometric">생체 인증</string>
<string name="device_credential">기기 자격 증명</string>
<string name="generate_keyfile">키 파일 생성하기</string>
<string name="menu_form_filling_settings_summary">키보드, 자동 완성, 클립보드</string>
<string name="menu_app_settings_summary">검색, 잠금, 기록, 속성</string>
<string name="merge_success">병합 성공습니다</string>
<string name="merge_success">병합 성공적으로 완료되었습니다</string>
<string name="version_label">버전 %1$s</string>
<string name="encrypted_value_stored">암호화된 비밀번호가 저장되었습니다</string>
<string name="info">정보</string>
<string name="build_label">빌드 %1$s</string>
<string name="configure_biometric">생체 인식 또는 장치 자격 증명이 등록되지 않았습니다.</string>
<string name="properties">속성</string>
<string name="menu_appearance_settings_summary">테마, 색상, 속성</string>
<string name="menu_appearance_settings_summary">테마, 색상, 아이콘, 글꼴, 속성</string>
<string name="autofill">자동 입력</string>
<string name="credential_before_click_device_unlock_button">비밀번호 입력 후 이 버튼을 눌러주세요</string>
<string name="unavailable">사용할 수 없습니다</string>
<string name="database_history">기록</string>
<string name="credential_before_click_device_unlock_button">비밀번호 입력 후 이 버튼을 눌러주세요.</string>
<string name="unavailable">사용 불가</string>
<string name="database_history">이력</string>
<string name="type">유형</string>
<string name="configure">설정</string>
<string name="biometric_security_update_required">등록된 생체정보를 업데이트해 주세요.</string>
<string name="autofill_select_entry">항목 선택하세요</string>
<string name="autofill_select_entry">항목 선택</string>
<string name="clipboard">클립보드</string>
<string name="clipboard_notifications_title">클립보드 알림</string>
<string name="lock_database_screen_off_summary">화면이 꺼지면 몇 초 후에 데이터베이스를 잠급니다.</string>
<string name="lock_database_screen_off_summary">화면이 꺼지면 몇 초 후에 데이터베이스를 잠급니다</string>
<string name="lock_database_back_root_title">\'­뒤로가기\'를 눌러 잠금</string>
<string name="unavailable_feature_text">이 기능을 사용할 수 없습니다.</string>
<string name="lock_database_show_button_summary">UI에 잠금버튼을 표시합니다</string>
<string name="lock_database_back_root_summary">사용자가 뒤로 가기 버튼을 누르면 데이터베이스를 잠급니다</string>
<string name="lock_database_back_root_summary">데이터베이스 루트 화면에 있는 경우 \'뒤로\' 버튼을 눌러 데이터베이스를 잠그십시오</string>
<string name="lock_database_show_button_title">잠금 버튼 표시</string>
<string name="unlock">잠금 해제</string>
<string name="lock">잠금</string>
<string name="autofill_sign_in_prompt">KeePassDX로 로그인</string>
<string name="password_size_title">생성된 비밀번호 크기</string>
<string name="password_size_title">생성된 패스워드 길이</string>
<string name="autofill_preference_title">자동 완성 설정</string>
<string name="set_credential_provider_service_title">기본 자동완성 서비스 설정</string>
<string name="lock_database_screen_off_title">화면 꺼짐 시 잠금</string>

View File

@@ -17,7 +17,7 @@
You should have received a copy of the GNU General Public License
along with KeePassDX. If not, see <http://www.gnu.org/licenses/>.
--><resources>
<string name="about_description">KeePass slaptažodžių tvarkyklės realizacija Android platformai</string>
<string name="about_description">KeePassDX slaptažodžių tvarkyklės realizacija Android platformai</string>
<string name="clipboard_cleared">Iškarpinė išvalyta</string>
<string name="invalid_credentials">Nepavyko perskaityti prisijungimo duomenų.</string>
<string name="feedback">Atsiliepimai</string>
@@ -296,8 +296,8 @@
<string name="menu_reload_database">Iš naujo įkelti duomenis</string>
<string name="menu_merge_from">Sujungti iš …</string>
<string name="menu_keystore_remove_key">Ištrinti įrenginio atrakinimo raktą</string>
<string name="menu_file_selection_read_only">Apsaugotas nuo rašymo</string>
<string name="menu_open_file_read_and_write">Galima keisti</string>
<string name="menu_file_selection_read_only">Apsaugotas nuo įrašymo</string>
<string name="menu_open_file_read_and_write">Modifikuojama</string>
<string name="menu_empty_recycle_bin">Ištuštinti šiukšliadėžę</string>
<string name="no_results">Nėra paieškos rezultatų</string>
<string name="no_url_handler">Įdiekite žiniatinklio naršyklę, kad atidaryti šį URL adresą.</string>
@@ -376,7 +376,7 @@
<string name="error_location_unknown">Duomenų bazės vieta nežinoma, duomenų bazės veiksmo atlikti negalima.</string>
<string name="error_empty_key">Raktas negali būti tuščias.</string>
<string name="corrupted_file">Sugadintas failas.</string>
<string name="passphrase">Slapta frazė</string>
<string name="passphrase">Slaptafrazė</string>
<string name="menu_app_settings_summary">Paieška, užraktas, istorija, savybės</string>
<string name="master_key_settings_summary">Keisti, atnaujinti</string>
<string name="parallelism">Lygiagretumas</string>
@@ -420,7 +420,7 @@
<string name="warning_empty_keyfile_explanation">Raktų failo turinys niekada neturėtų būti keičiamas, o geriausiu atveju jame turėtų būti atsitiktinai sugeneruoti duomenys.</string>
<string name="warning_remove_unlinked_attachment">Pašalinus nesusietus duomenis gali sumažėti saugyklos dydis, tačiau taip pat gali būti pašalinti \"KeePass\" papildiniams naudojami duomenys.</string>
<string name="warning_database_info_changed">Saugyklos faile esanti informacija buvo pakeista už programos ribų.</string>
<string name="rounds">Transformacijų kiekis</string>
<string name="rounds">Transformacijos etapai</string>
<string name="colorize_password_title">Slaptažodžių spalvinimas</string>
<string name="colorize_password_summary">Slaptažodžio simbolių spalvinimas pagal tipą</string>
<string name="show_otp_token_title">Rodyti OTP Token</string>
@@ -432,4 +432,297 @@
<string name="device_unlock_prompt_extract_credential_title">Įrenginio atrakinimo atpažinimas</string>
<string name="lock_database_show_button_title">Rodyti užrakto mygtuką</string>
<string name="content">Turinys</string>
<string name="content_description_node_children">Mazgo vaikai</string>
<string name="entry_application_id">Programos ID</string>
<string name="error_otp_secret_length">Slaptasis raktas turi būti mažiausiai %1$d simbolių.</string>
<string name="generate_keyfile">Generuoti rakto failą</string>
<string name="nodes">Mazgai</string>
<string name="recursive_number_entries_title">Įrašų rekursinis skaičius</string>
<string name="recursive_number_entries_summary">Rekursiškai apskaičiuoja įrašų skaičių grupėje</string>
<string name="show_otp_token_summary">Rodo OTP žetonus įrašų sąraše</string>
<string name="menu_device_unlock_settings_summary">Biometrija, prietaiso kredencialai</string>
<string name="kdf_explanation">Norint sugeneruoti raktą šifravimo algoritmui, pagrindinis raktas yra transformuojamas naudojant atsitiktinai su druska užpildytą rakto išvedimo funkciją.</string>
<string name="warning_large_keyfile">Nerekomenduojama pridėti didelio rakto failo, tai gali sutrukdyti atidaryti duomenų bazę.</string>
<string name="warning_database_notification_permission">Pranešimo leidimas leidžia rodyti duomenų bazės būseną ir užrakinti ją lengvai prieinamu mygtuku.\n\nJei neaktyvuosite šio leidimo, duomenų bazė, atidaryta fone, nebus matoma, jei priekyje yra kita programa.</string>
<string name="warning_copy_permission">Reikalingas pranešimo leidimas iškarpinės pranešimo funkcijos naudojimui.</string>
<string name="warning_overwrite_data_title">Perrašyti esamus duomenis?</string>
<string name="warning_overwrite_data_description">Šis veiksmas pakeis esamus duomenis įraše, senus duomenis galite atgauti jei įjungta istorija.</string>
<string name="build_label">Sukurta %1$s</string>
<string name="keystore_not_accessible">Raktinė nėra tinkamai inicializuota.</string>
<string name="unlock_and_link_biometric">Prietaiso atrakinimo nuoroda</string>
<string name="device_unlock_prompt_store_credential_title">Nuoroda į prietaiso atrakinimą</string>
<string name="device_unlock_prompt_extract_credential_message">Ištraukti duomenų bazės kredencialus su prietaiso atrakinimo duomenimis</string>
<string name="encrypted_value_stored">Užšifruotas slaptažodis išsaugotas</string>
<string name="device_unlock_invalid_key">Negalima perskaityti prietaiso atrakinimo rakto. Prašome jį ištrinti ir pakartoti atrakinimo atpažinimo procedūrą.</string>
<string name="device_unlock_not_recognized">Nepavyko atpažinti prietaiso atrakinimo pėdsako</string>
<string name="unavailable">Neprieinama</string>
<string name="device_unlock_prompt_not_initialized">Nepavyko inicializuoti prietaiso atrakinimo užklausos.</string>
<string name="device_credential">Prietaiso kredencialas</string>
<string name="credential_provider">Kredencialo teikėjas</string>
<string name="passkeys">Raktų sistemos</string>
<string name="passkeys_explanation_summary">Konfigūruoti raktų sistemas greitam ir saugiam prisijungimui be slaptažodžio</string>
<string name="passkeys_preference_title">Raktų sistemų nustatymai</string>
<string name="passkeys_close_database_title">Uždaryti duomenų bazę</string>
<string name="passkeys_close_database_summary">Uždaryti duomenų bazę po raktų sistemos pasirinkimo</string>
<string name="passkeys_privileged_apps_title">Privilegijuotos programos</string>
<string name="passkeys_privileged_apps_summary">Valdyti naršykles privilegijuotų programų sąraše</string>
<string name="passkeys_privileged_apps_explanation">ĮSPĖJIMAS: Privilegijuota programa veikia kaip vartai autentifikacijos šaltinio gavimui. Užtikrinkite jos teisėtumą, kad išvengtumėte saugumo problemų.</string>
<string name="passkeys_privileged_apps_ask_title">Programa neatpažinta</string>
<string name="passkeys_privileged_apps_ask_message">%1$s bando atlikti prieigos rakto veiksmą.\n\nPridėti jį prie privilegijuotų programų sąrašo?</string>
<string name="passkeys_missing_signature_app_ask_title">Parašas trūksta</string>
<string name="passkeys_missing_signature_app_ask_explanation">ĮSPĖJIMAS: Prieigos raktas buvo sukurtas iš kito kliento arba parašas buvo ištrintas. Užtikrinkite, kad programa, kurią norite autentifikuoti, yra tos pačios paslaugos dalis ir yra teisėta, kad išvengtumėte saugumo problemų.\nJei programa yra naršyklė, nepridėkite jos parašo prie įrašo, bet prie privilegijuotų programų sąrašo nustatymuose.</string>
<string name="passkeys_missing_signature_app_ask_message">%1$s neatpažinta ir bando autentifikuotis su esama raktų sistema.</string>
<string name="passkeys_missing_signature_app_ask_question">Pridėti programos parašą prie raktų sistemos įrašo?</string>
<string name="passkeys_auto_select_title">Automatinis pasirinkimas</string>
<string name="passkeys_auto_select_summary">Automatinis pasirinkimas jei tik vienas įrašas ir duomenų bazė atidaryta, tik jei prašanti programa suderinama</string>
<string name="passkeys_backup_eligibility_title">Atsarginio kopijavimo tinkamumas</string>
<string name="passkeys_backup_eligibility_summary">Nustatyti sukūrimo metu ar viešo rakto kredencialo šaltinis gali būti atsarginės kopijos</string>
<string name="passkeys_backup_state_title">Atsarginio kopijavimo būsena</string>
<string name="passkeys_backup_state_summary">Nurodyti, kad kredencialai yra atsarginėje kopijoje ir apsaugoti nuo vieno įrenginio praradimo</string>
<string name="credential_provider_service_subtitle">Raktų sistemos, automatinio pildymo kredencialų teikėjas</string>
<string name="clipboard">Iškarpinė</string>
<string name="clipboard_explanation_summary">Kopijuoti įrašų laukus naudojant jūsų prietaiso iškarpinę</string>
<string name="clipboard_notifications_title">Iškarpinės pranešimai</string>
<string name="clipboard_notifications_summary">Rodyti iškarpinės pranešimus laukų kopijavimui žiūrint įrašą</string>
<string name="clipboard_warning">Jei automatinis iškarpinės ištrynimas nepavyksta, ištrinkite jos istoriją rankiniu būdu.</string>
<string name="lock_database_back_root_summary">Paspauskite \"Atgal\", kad užrakintumėte duomenų bazę, jei esate duomenų bazės šakniniame ekrane</string>
<string name="device_unlock_tap_delete">Bakstelėkite, kad ištrintumėte įrenginio atrakinimo raktus</string>
<string name="device_unlock_explanation_summary">Naudokite įrenginio atrakinimą, kad lengviau atvertumėte duomenų bazę</string>
<string name="device_credential_unlock_enable_title">Įrenginio kredencialo atrakinimas</string>
<string name="device_credential_unlock_enable_summary">Leidžia naudoti jūsų įrenginio kredencialą duomenų bazei atverti</string>
<string name="biometric_auto_open_prompt_title">Automatinis atidarymo raginimas</string>
<string name="biometric_auto_open_prompt_summary">Automatiškai prašyti įrenginio atrakinimo, jei duomenų bazė nustatyta jį naudoti</string>
<string name="temp_device_unlock_enable_title">Laikinas įrenginio atrakinimas</string>
<string name="temp_device_unlock_enable_summary">Nesaugoti jokio užšifruoto turinio įrenginio atrakinimui naudoti</string>
<string name="temp_device_unlock_timeout_title">Įrenginio atrakinimo galiojimo pabaiga</string>
<string name="temp_device_unlock_timeout_summary">Įrenginio atrakinimo naudojimo trukmė prieš ištrinant jo turinį</string>
<string name="device_unlock_timeout">Įrenginio atrakinimo laukimo laikas</string>
<string name="biometric_delete_all_key_title">Ištrinti šifravimo raktus</string>
<string name="biometric_delete_all_key_summary">Ištrinti visus šifravimo raktus, susijusius su įrenginio atrakinimo atpažinimu</string>
<string name="device_unlock_delete_all_key_warning">Ištrinti visus šifravimo raktus, susijusius su įrenginio atrakinimo atpažinimu?</string>
<string name="device_unlock_keystore_warning">Ši funkcija išsaugos užšifruotus kredencialų duomenis jūsų įrenginio saugiam KeyStore.\n\nPriklausomai nuo operacinės sistemos vietinio API įgyvendinimo, jis gali neveikti visiškai.\n\nPatikrinkite KeyStore suderinamumą ir saugumą su jūsų įrenginio gamintoju ir naudojamos ROM kūrėju.</string>
<string name="unavailable_feature_text">Nepavyko paleisti šios funkcijos.</string>
<string name="unavailable_feature_hardware">Nepavyko rasti atitinkamos aparatinės įrangos.</string>
<string name="database_data_remove_unlinked_attachments_summary">Pašalina priedus, esančius duomenų bazėje, bet nesusietus su įrašu</string>
<string name="templates_group_enable_title">Šablonų naudojimas</string>
<string name="templates_group_enable_summary">Naudoti dinaminius šablonus įrašo laukams užpildyti</string>
<string name="templates_group_uuid_title">Šablonų grupė</string>
<string name="max_history_items_title">Maksimalus skaičius</string>
<string name="max_history_items_summary">Riboti istorijos elementų skaičių vienam įrašui</string>
<string name="max_history_size_title">Maksimalus dydis</string>
<string name="max_history_size_summary">Riboti istorijos dydį vienam įrašui</string>
<string name="settings_database_recommend_changing_master_key_title">Rekomenduoti atnaujinimą</string>
<string name="settings_database_recommend_changing_master_key_summary">Rekomenduoti pakeisti pagrindinį raktą (dienomis)</string>
<string name="settings_database_force_changing_master_key_title">Priversti atnaujinti</string>
<string name="settings_database_force_changing_master_key_summary">Reikalauti pakeisti pagrindinį raktą (dienomis)</string>
<string name="settings_database_force_changing_master_key_next_time_title">Priversti atnaujinti kitą kartą</string>
<string name="settings_database_force_changing_master_key_next_time_summary">Reikalauti pakeisti pagrindinį raktą kitą kartą (vieną kartą)</string>
<string name="monospace_font_fields_enable_title">Lauko šriftas</string>
<string name="monospace_font_fields_enable_summary">Pakeisti laukuose naudojamą šriftą geresniam simbolių matomumui</string>
<string name="allow_copy_password_title">Iškarpinės patikimumas</string>
<string name="allow_copy_password_summary">Leisti kopijuoti įrašo slaptažodį ir apsaugotus laukus į iškarpinę</string>
<string name="allow_copy_password_warning">Įspėjimas: Iškarpinė yra bendra visoms programoms. Jei nukopijuojami jautrūs duomenys, kita programinė įranga gali juos atkurti.</string>
<string name="enable">Įgalinti</string>
<string name="disable">Išjungti</string>
<string name="notification">Pranešimas</string>
<string name="clear_clipboard_notification_title">Išvalyti uždarant</string>
<string name="clear_clipboard_notification_summary">Užrakinti duomenų bazę, kai iškarpinės trukmė baigiasi arba pranešimas uždaromas po to, kai pradėjote ją naudoti</string>
<string name="database_name_title">Duomenų bazės pavadinimas</string>
<string name="database_description_title">Duomenų bazės aprašymas</string>
<string name="database_default_username_title">Numatytasis vartotojo vardas</string>
<string name="database_custom_color_title">Tinkinta duomenų bazės spalva</string>
<string name="database_version_title">Duomenų bazės versija</string>
<string name="text_appearance">Tekstas</string>
<string name="application_appearance">Sąsaja</string>
<string name="other">Kita</string>
<string name="compression">Suspaudimas</string>
<string name="compression_none">Nėra</string>
<string name="compression_gzip">Gzip</string>
<string name="recycle_bin">Šiukšliadėžė</string>
<string name="templates">Šablonai</string>
<string name="keyboard">Klaviatūra</string>
<string name="magic_keyboard_title">Magikeyboard</string>
<string name="magic_keyboard_explanation_summary">Aktyvuoti tinkintą klaviatūrą, užpildančią jūsų slaptažodžius ir visus tapatybės laukus</string>
<string name="device_keyboard_setting_title">Įrenginio klaviatūros nustatymai</string>
<string name="keyboard_name">Magikeyboard</string>
<string name="keyboard_label">Magikeyboard (KeePassDX)</string>
<string name="keyboard_setting_label">Magikeyboard nustatymai</string>
<string name="keyboard_entry_category">Įrašas</string>
<string name="keyboard_selection_entry_title">Įrašo pasirinkimas</string>
<string name="keyboard_selection_entry_summary">Kai peržiūrite įrašą KeePassDX, užpildyti Magikeyboard tuo įrašu</string>
<string name="keyboard_notification_entry_title">Pranešimo informacija</string>
<string name="keyboard_notification_entry_summary">Rodyti pranešimą, kai įrašas yra prieinamas</string>
<string name="keyboard_save_search_info_title">Išsaugoti bendrinamą informaciją</string>
<string name="keyboard_save_search_info_summary">Bandyti išsaugoti bendrinamą informaciją atliekant rankinį įrašo pasirinkimą lengvesniam būsimam naudojimui</string>
<string name="keyboard_notification_entry_clear_close_title">Išvalyti uždarant</string>
<string name="keyboard_notification_entry_clear_close_summary">Uždaryti duomenų bazę uždarant pranešimą</string>
<string name="keyboard_entry_timeout_title">Laukimo laikas</string>
<string name="keyboard_entry_timeout_summary">Laukimo laikas klaviatūros įrašui išvalyti</string>
<string name="keyboard_notification_entry_content_title_text">Įrašas</string>
<string name="keyboard_notification_entry_content_title">%1$s prieinamas Magikeyboard</string>
<string name="keyboard_notification_entry_content_text">%1$s</string>
<string name="keyboard_appearance_category">Išvaizda</string>
<string name="keyboard_theme_title">Klaviatūros tema</string>
<string name="keyboard_keys_category">Klavišai</string>
<string name="keyboard_auto_go_action_title">Automatinis klavišo veiksmas</string>
<string name="keyboard_auto_go_action_summary">\"Eiti\" klavišo veiksmas po \"Lauko\" klavišo paspaudimo</string>
<string name="keyboard_key_vibrate_title">Vibruojantys klavišų paspaudimai</string>
<string name="keyboard_key_sound_title">Girdimi klavišų paspaudimai</string>
<string name="keyboard_change">Perjungti klaviatūrą</string>
<string name="keyboard_previous_database_credentials_title">Duomenų bazės prisijungimo duomenų ekranas</string>
<string name="keyboard_previous_database_credentials_summary">Automatiškai perjungti atgal į ankstesnę klaviatūrą duomenų bazės prisijungimo duomenų ekrane</string>
<string name="keyboard_previous_search_title">Paieškos ekranas</string>
<string name="keyboard_previous_search_summary">Automatiškai perjungti atgal į ankstesnę klaviatūrą paieškos ekrane</string>
<string name="keyboard_previous_fill_in_title">Persijungti atgal</string>
<string name="keyboard_previous_fill_in_summary">Automatiškai persijungti atgal į ankstesnę klaviatūrą po \"Auto key action\" vykdymo</string>
<string name="keyboard_previous_lock_title">Užrakinti duomenų bazę</string>
<string name="keyboard_previous_lock_summary">Automatiškai persijungti atgal į ankstesnę klaviatūrą po duomenų bazės užrakinimo</string>
<string name="custom_fields">Tinkinti laukai</string>
<string name="back_to_previous_keyboard">Atgal į ankstesnę klaviatūrą</string>
<string name="select_entry">Pasirinkti įrašą</string>
<string name="backspace">Atgal</string>
<string name="enter">Įvesti</string>
<string name="autofill_close_database_title">Uždaryti duomenų bazę</string>
<string name="autofill_close_database_summary">Uždaryti duomenų bazę po automatinio pildymo pasirinkimo</string>
<string name="autofill_inline_suggestions_title">Tiesioginiai pasiūlymai</string>
<string name="autofill_inline_suggestions_summary">Bandyti rodyti automatinio pildymo pasiūlymus tiesiogiai iš suderinamos klaviatūros</string>
<string name="autofill_manual_selection_title">Rankinis pasirinkimas</string>
<string name="autofill_manual_selection_summary">Rodyti parinktį, leidžiančią naudotojui pasirinkti duomenų bazės įrašą</string>
<string name="autofill_save_search_info_title">Išsaugoti paieškos informaciją</string>
<string name="autofill_save_search_info_summary">Bandyti išsaugoti paieškos informaciją atliekant rankinį įrašo pasirinkimą, kad būtų lengviau naudoti ateityje</string>
<string name="autofill_ask_to_save_data_title">Klausti apie duomenų išsaugojimą</string>
<string name="autofill_ask_to_save_data_summary">Klausti apie duomenų išsaugojimą, kai formos pildymas užbaigiamas</string>
<string name="autofill_application_id_blocklist_title">Programų blokavimo sąrašas</string>
<string name="autofill_application_id_blocklist_summary">Blokavimo sąrašas, kuris neleidžia automatiškai pildyti programų</string>
<string name="autofill_web_domain_blocklist_title">Žiniatinklio domenų blokavimo sąrašas</string>
<string name="autofill_web_domain_blocklist_summary">Blokavimo sąrašas, kuris neleidžia automatiškai pildyti žiniatinklio domenų</string>
<string name="autofill_block">Blokuoti automatinį pildymą</string>
<string name="autofill_block_restart">Paleiskite iš naujo programą, kurioje yra forma, kad aktyvuotumėte blokavimą.</string>
<string name="error_save_read_only">Duomenų išsaugojimas neleidžiamas duomenų bazei, atidarytai tik skaitymui.</string>
<string name="autofill_inline_suggestions_keyboard">Automatinio pildymo pasiūlymai pridėti.</string>
<string name="allow_no_password_title">Leisti be pagrindinio rakto</string>
<string name="allow_no_password_summary">Leidžia paspausti \"Atidaryti\" mygtuką, jei nėra pasirinkti jokie kredencialai</string>
<string name="delete_entered_password_title">Ištrinti slaptažodį</string>
<string name="delete_entered_password_summary">Ištrina įvestą slaptažodį po bandymo prisijungti prie duomenų bazės</string>
<string name="enable_auto_save_database_title">Automatiškai išsaugoti duomenų bazę</string>
<string name="enable_auto_save_database_summary">Išsaugoti duomenų bazę po kiekvieno svarbaus veiksmo (\"Modifikuojamame\" režime)</string>
<string name="enable_keep_screen_on_title">Laikyti ekraną įjungtą</string>
<string name="enable_keep_screen_on_summary">Laikyti ekraną įjungtą žiūrint arba redaguojant įrašą</string>
<string name="enable_screenshot_mode_title">Ekrano nuotraukos režimas</string>
<string name="enable_screenshot_mode_summary">Leisti trečiųjų šalių programoms įrašyti arba daryti ekrano nuotraukas programos</string>
<string name="enable_education_screens_title">Mokomieji patarimai</string>
<string name="enable_education_screens_summary">Paryškinti elementus, kad išmokti kaip veikia programa</string>
<string name="reset_education_screens_title">Atstatyti mokomuosius patarimus</string>
<string name="reset_education_screens_summary">Rodyti visą mokomąją informaciją dar kartą</string>
<string name="reset_education_screens_text">Mokomieji patarimai atstatyti</string>
<string name="education_create_database_title">Sukurkite savo duomenų bazės failą</string>
<string name="education_create_database_summary">Sukurkite savo pirmąjį slaptažodžių valdymo failą.</string>
<string name="education_select_database_title">Atverti esamą duomenų bazę</string>
<string name="education_select_database_summary">Atverkite savo ankstesnį duomenų bazės failą iš failų naršyklės, kad tęstumėte jį naudoti.</string>
<string name="education_new_node_title">Pridėti elementus į savo duomenų bazę</string>
<string name="education_new_node_summary">Įrašai padeda valdyti jūsų skaitmenines tapatybes.\n\nGrupės (~aplankai) organizuoja įrašus jūsų duomenų bazėje.</string>
<string name="education_search_title">Ieškoti per įrašus</string>
<string name="education_search_summary">Įveskite pavadinimą, vartotojo vardą arba kitų laukelių turinį, kad gautumėte savo slaptažodžius.</string>
<string name="education_device_unlock_title">Įrenginio duomenų bazės atrakinimas</string>
<string name="education_device_unlock_summary">Susiekite savo slaptažodį su nuskaitytu biometriniu arba įrenginio kredencialu, kad greitai atrakintumėte savo duomenų bazę.</string>
<string name="education_entry_edit_title">Redaguoti įrašą</string>
<string name="education_entry_edit_summary">Redaguokite savo įrašą su tinkintais laukais. Duomenų telkinys gali būti nurodomas tarp skirtingų įrašo laukelių.</string>
<string name="education_generate_password_title">Sukurti stiprų slaptažodį</string>
<string name="education_generate_password_summary">Sugeneruokite stiprų slaptažodį, susietą su jūsų įrašu, lengvai apibrėžkite jį pagal formos kriterijus ir nepamirškite saugaus slaptažodžio.</string>
<string name="education_validate_entry_title">Patvirtinti įrašą</string>
<string name="education_validate_entry_summary">Prisiminkite patvirtinti savo įrašą ir išsaugoti savo duomenų bazę.\n\nJei automatinis užraktas yra aktyvuotas ir pamiršote, kad darėte modifikaciją, rizikuojate prarasti savo duomenis.</string>
<string name="education_entry_new_field_title">Pridėti tinkintus laukus</string>
<string name="education_entry_new_field_summary">Užregistruokite papildomą lauką, pridėkite reikšmę ir pasirinktinai apsaugokite jį.</string>
<string name="education_add_attachment_title">Pridėti priedą</string>
<string name="education_add_attachment_summary">Įkelkite priedą į savo įrašą, kad išsaugotumėte svarbius išorinius duomenis.</string>
<string name="education_setup_OTP_title">Nustatyti OTP</string>
<string name="education_setup_OTP_summary">Nustatykite vienkartinio slaptažodžio valdymą (HOTP / TOTP), kad sugeneruotumėte žetoną, reikalingą dviejų faktorių autentifikacijai (2FA).</string>
<string name="education_read_only_title">Apsaugoti savo duomenų bazę nuo rašymo</string>
<string name="education_field_copy_title">Kopijuoti lauką</string>
<string name="education_field_copy_summary">Nukopijuoti laukai gali būti įklijuoti bet kur.\n\nNaudokite formos pildymo metodą, kurį pageidaujate.</string>
<string name="education_lock_title">Užrakinti duomenų bazę</string>
<string name="education_lock_summary">Greitai užrakinkite savo duomenų bazę, galite nustatyti programą, kad ji užsirakintų po kurio laiko ir kai ekranas išsijungia.</string>
<string name="education_sort_title">Elementų rikiavimas</string>
<string name="education_sort_summary">Pasirinkite kaip rikiuojami įrašai ir grupės.</string>
<string name="education_donation_title">Dalyvauti</string>
<string name="education_donation_summary">Padėkite padidinti stabilumą, saugumą ir pridėti daugiau funkcijų.</string>
<string name="html_text_dev_feature_thanks">Labai dėkojame už jūsų indėlį.</string>
<string name="html_text_dev_feature_work_hard">Mes sunkiai dirbame, kad greitai išleistume šią funkciją.</string>
<string name="html_text_dev_feature_upgrade">Prisiminkite laikyti savo programą atnaujintą įdiegiant naujas versijas.</string>
<string name="download">Parsisiųsti</string>
<string name="contribute">Prisidėti</string>
<string name="download_attachment">Parsisiųsti %1$s</string>
<string name="upload_attachment">Įkelti %1$s</string>
<string name="download_initialization">Inicijuojama…</string>
<string name="download_progression">Vykdoma: %1$d%%</string>
<string name="download_finalization">Užbaigiama…</string>
<string name="download_complete">Užbaigta!</string>
<string name="download_canceled">Atšaukta!</string>
<string name="unit_byte">B</string>
<string name="unit_kibibyte">KiB</string>
<string name="unit_mebibyte">MiB</string>
<string name="unit_gibibyte">GiB</string>
<string name="entropy">Entropija: %1$s bit</string>
<string name="entropy_high">Entropija: Aukšta</string>
<string name="entropy_calculate">Entropija: Skaičiuojama…</string>
<string name="at_least_one_char">Bent po vieną simbolį iš kiekvienos</string>
<string name="exclude_ambiguous_chars">Neįtraukti dviprasmiškų simbolių</string>
<string name="consider_chars_filter">Apsvarstyti simbolius</string>
<string name="word_separator">Skyriklis</string>
<string name="ignore_chars_filter">Ignoruoti simbolius</string>
<string name="lower_case">mažosios raidės</string>
<string name="upper_case">DIDŽIOSIOS RAIDĖS</string>
<string name="title_case">Pavadinimo rašyba</string>
<string name="character_count">Simbolių skaičius: %1$d</string>
<string name="screenshot_mode_banner_text">Ekrano nuotraukos režimas</string>
<string name="style_choose_title">Programos tema</string>
<string name="style_choose_summary">Tema naudojama programoje</string>
<string name="style_name_forest">Miškas</string>
<string name="style_name_divine">Dieviškas</string>
<string name="style_name_classic">Klasikinis</string>
<string name="style_name_simple">Paprastas</string>
<string name="style_name_moon">Mėnulis</string>
<string name="style_name_sun">Saulė</string>
<string name="style_name_reply">Atsakymas</string>
<string name="style_name_kunzite">Kunzitas</string>
<string name="style_name_follow_system">Sekti sistemą</string>
<string name="style_brightness_title">Temos ryškumas</string>
<string name="style_brightness_summary">Pasirinkti šviesias arba tamsias temas</string>
<string name="style_name_light">Šviesi</string>
<string name="style_name_dark">Tamsi</string>
<string name="icon_section_standard">Standartinis</string>
<string name="icon_section_custom">Tinkintas</string>
<string name="icon_pack_choose_title">Piktogramų paketas</string>
<string name="icon_pack_choose_summary">Piktogramų paketas naudojamas programoje</string>
<string name="show_entry_colors_title">Įrašo spalvos</string>
<string name="show_entry_colors_summary">Rodo pirmojo plano ir fono spalvas įrašui</string>
<string name="hide_expired_entries_title">Slėpti nebegaliojančius įrašus</string>
<string name="hide_templates_title">Slėpti šablonus</string>
<string name="hide_templates_summary">Šablonai nėra rodomi</string>
<string name="passkey">Prieigos raktas</string>
<string name="passkey_service_name">KeePassDX kredencialų teikėjas</string>
<string name="passkey_creation_description">Išsaugoti prieigos raktą naujame įraše</string>
<string name="passkey_update_description">Atnaujinti prieigos raktą %1$s</string>
<string name="passkey_selection_username">Prieigos raktas nerastas</string>
<string name="passkey_selection_description">Pasirinkti esamą prieigos raktą</string>
<string name="passkey_database_username">KeePassDX duomenų bazė</string>
<string name="passkey_locked_database_description">Pasirinkti atrakinti</string>
<string name="passkey_username">Prieigos rakto vartotojo vardas</string>
<string name="passkey_private_key">Prieigos rakto privatus raktas</string>
<string name="passkey_credential_id">Prieigos rakto kredencialo ID</string>
<string name="passkey_user_handle">Prieigos rakto naudotojo rankena</string>
<string name="passkey_relying_party">Prieigos rakto pasikliaujanti šalis</string>
<string name="passkey_backup_eligibility">Prieigos rakto atsarginės kopijos tinkamumas</string>
<string name="passkey_backup_state">Prieigos rakto atsarginės kopijos būsena</string>
<string name="error_passkey_result">Nepavyko grąžinti prieigos rakto</string>
<string name="html_about_contribution">Kad &lt;strong&gt;išlaikytume savo laisvę&lt;/strong&gt;, &lt;strong&gt;ištaisytume klaidas&lt;/strong&gt;, &lt;strong&gt;pridėtume funkcijų&lt;/strong&gt; ir &lt;strong&gt;būtume visada aktyvūs&lt;/strong&gt;, mes pasikliaujame jūsų &lt;strong&gt;indėliu&lt;/strong&gt;.</string>
<string name="education_read_only_summary">Pakeiskite atidarymo režimą sesijai.\n\n\"Raišymo apsauga\" apsaugo nuo netyčinių duomenų bazės pakeitimų.\n\"Modifikuojamas\" leidžia pridėti, ištrinti arba modifikuoti visus elementus kaip norite.</string>
<string name="html_text_ad_free">Skirtingai nuo daugelio slaptažodžių valdymo programų, ši yra &lt;strong&gt;be reklamų&lt;/strong&gt;, &lt;strong&gt;copylefted libre programinė įranga&lt;/strong&gt; ir nerenka asmeninių duomenų savo serveriuose, nesvarbu kokią versiją naudojate.</string>
<string name="html_text_buy_pro">Perkant pro versiją, turėsite prieigą prie šio &lt;strong&gt;vizualinio stiliaus&lt;/strong&gt; ir ypač padėsite &lt;strong&gt;bendruomenės projektų realizacijai.&lt;/strong&gt;</string>
<string name="html_text_feature_generosity">Šis &lt;strong&gt;vizualinis stilius&lt;/strong&gt; yra prieinamas dėka jūsų dosnumo.</string>
<string name="html_text_donation">&lt;strong&gt;Prisidėdami&lt;/strong&gt; prie projekto &lt;i&gt;(pinigais, kodu, vertimu)&lt;/i&gt;, padėsite jam gyventi ir klestėti, ir taip pat turėsite teisę į &lt;strong&gt;temos&lt;/strong&gt; atrakinimo procedūrą.</string>
<string name="html_text_dev_feature">Ši funkcija yra &lt;strong&gt;kūrimo stadijoje&lt;/strong&gt; ir reikalauja jūsų &lt;strong&gt;indėlio&lt;/strong&gt;, kad būtų prieinama greitai.</string>
<string name="html_text_dev_feature_buy_pro">Perkant &lt;strong&gt;pro&lt;/strong&gt; versiją,</string>
<string name="html_text_dev_feature_contibute">&lt;strong&gt;Prisidėdami&lt;/strong&gt;,</string>
<string name="html_text_dev_feature_encourage">skatiname kūrėjus kurti &lt;strong&gt;naujas funkcijas&lt;/strong&gt; ir &lt;strong&gt;ištaisyti klaidas&lt;/strong&gt; pagal jūsų pastabas.</string>
</resources>

View File

@@ -19,7 +19,7 @@
--><resources>
<string name="feedback">Comentários</string>
<string name="homepage">Página inicial</string>
<string name="about_description">Implementação para Android do gerenciador de senhas KeePass.</string>
<string name="about_description">Implementação do gerenciador de senhas KeePass no Android.</string>
<string name="accept">Aceitar</string>
<string name="add_entry">Adicionar entrada</string>
<string name="add_group">Adicionar grupo</string>
@@ -29,7 +29,7 @@
<string name="application">Aplicativo</string>
<string name="menu_app_settings">Configurações do aplicativo</string>
<string name="brackets">Parênteses</string>
<string name="file_manager_install_description">Um gerenciador de arquivos que aceita a ação Intenção ACTION_CREATE_DOCUMENT e ACTION_OPEN_DOCUMENT é necessário para criar, abrir e salvar arquivos de banco de dados.</string>
<string name="file_manager_install_description">Um gerenciador de arquivos que aceita a ação de intenção ACTION_CREATE_DOCUMENT e ACTION_OPEN_DOCUMENT é necessário para criar, abrir e salvar arquivos de banco de dados.</string>
<string name="clipboard_cleared">Área de transferência limpa</string>
<string name="clipboard_timeout">Tempo limite para a área de transferência</string>
<string name="clipboard_timeout_summary">Duração do armazenamento na área de transferência (se suportado pelo seu dispositivo)</string>
@@ -303,7 +303,7 @@
<string name="selection_mode">Modo seleção</string>
<string name="do_not_kill_app">Não feche o aplicativo…</string>
<string name="lock_database_back_root_title">Pressionar \'Voltar\' para bloquear</string>
<string name="lock_database_back_root_summary">Se estiver na tela raiz da base de dados, o botão \"Voltar\" irá trancá-la</string>
<string name="lock_database_back_root_summary">Pressione \'Voltar\' para bloquear o banco de dados se você estiver na tela principal do banco de dados</string>
<string name="clear_clipboard_notification_title">Limpar ao fechar</string>
<string name="clear_clipboard_notification_summary">Bloquear o banco de dados quando a duração da área de transferência expirar ou a notificação for fechada depois do início do uso</string>
<string name="recycle_bin">Lixeira</string>
@@ -330,7 +330,7 @@
<string name="content_description_password_checkbox">Caixa de seleção da senha</string>
<string name="content_description_keyfile_checkbox">Caixa de seleção do arquivo-chave</string>
<string name="content_description_repeat_toggle_password_visibility">Repetir mudança de visibilidade da senha</string>
<string name="content_description_background">Plano de fundo</string>
<string name="content_description_background">Segundo plano</string>
<string name="content_description_update_from_list">Atualizar</string>
<string name="content_description_keyboard_close_fields">Campos fechados</string>
<string name="error_create_database_file">Impossibilitado de criar um banco de dados com essa senha e arquivo-chave.</string>
@@ -473,7 +473,7 @@
<string name="error_database_uri_null">O URI do banco de dados não pode ser recuperado.</string>
<string name="error_field_name_already_exists">O nome do campo já existe.</string>
<string name="error_registration_read_only">Não é permitido salvar um novo item em um banco de dados somente de leitura.</string>
<string name="error_otp_type">O tipo de OTP existente não é reconhecido por este formulário, sua validação pode não gerar mais o token corretamente.</string>
<string name="error_otp_type">O tipo de OTP existente não é reconhecido por este formulário, e sua validação pode não gerar mais o token corretamente.</string>
<string name="error_word_reserved">Esta palavra é reservada e não pode ser usada.</string>
<string name="version">Versão</string>
<string name="template">Modelo</string>
@@ -663,7 +663,7 @@
<string name="auto_type">Digitação automática</string>
<string name="content_description_hardware_key_checkbox">Caixa de verificação da chave física</string>
<string name="merge_success">Merge concluído com sucesso</string>
<string name="info">Info</string>
<string name="info">Informação</string>
<string name="menu_device_unlock_settings_summary">Biometria, credencial do dispositivo</string>
<string name="menu_database_settings_summary">Metadados, lixeira, modelos, histórico</string>
<string name="menu_security_settings_summary">Criptografia, função de derivação chave</string>
@@ -707,20 +707,42 @@
<string name="error_otp_secret_length">Chave secreta deve ter pelo menos %1$d caracteres.</string>
<string name="warning_overwrite_data_title">Sobrescrever dados existentes?</string>
<string name="warning_overwrite_data_description">Esta ação irá substituir os dados existentes na entrada, você pode recuperar os dados antigos se o histórico estiver habilitado.</string>
<string name="credential_provider">Provedor da credencial</string>
<string name="credential_provider">Provedor de credencial</string>
<string name="passkeys_privileged_apps_summary">Gerencie navegadores na lista customizada de aplicações privilegiadas</string>
<string name="passkeys_privileged_apps_explanation">AVISO: Um aplicativo privilegiado age como portão para obter a origem de uma autenticação. Certifique sua legitimidade para evitar problemas de segurança.</string>
<string name="passkeys_privileged_apps_ask_title">App não reconhecido</string>
<string name="passkeys_privileged_apps_ask_message">%1$s tenta fazer uma ação de Passkey.\n\nAdicionar à lista de aplicativos privilegiados?</string>
<string name="passkeys_missing_signature_app_ask_title">Assinatura faltando</string>
<string name="passkeys_missing_signature_app_ask_explanation">AVISO: A Passkey foi criada de outro cliente ou a assinatura foi deletada. Certifique que o aplicativo que você quer autenticar é parte do mesmo serviço e é legítimo para evitar problemas de segurança.\nSe o aplicativo é um navegador, não adicione sua assinatura à entrada, mas à lista de aplicativos privilegiados nas configurações.</string>
<string name="passkeys_missing_signature_app_ask_explanation">AVISO: A chave de acesso foi criada a partir de outro cliente ou a assinatura foi excluída. Certifique-se de que o aplicativo que você deseja autenticar faz parte do mesmo serviço e é legítimo para evitar problemas de segurança.\nSe o aplicativo for um navegador, não adicione sua assinatura à entrada, mas à lista de aplicativos privilegiados nas configurações.</string>
<string name="passkeys_missing_signature_app_ask_message">%1$s não é reconhecido e tenta autenticar com uma Passkey existente.</string>
<string name="passkeys_missing_signature_app_ask_question">Adicionar assinatura de app à entrada de Passkey?</string>
<string name="passkeys_missing_signature_app_ask_question">Adicionar a assinatura do aplicativo à entrada de chave de acesso?</string>
<string name="passkeys_auto_select_title">Auto selecionar</string>
<string name="passkeys_auto_select_summary">Auto selecionar se só uma entrada e a base de dados estiverem abertas, apenas se o app solicitante for compatível</string>
<string name="passkeys_auto_select_summary">Selecionar automaticamente se houver apenas uma entrada e o banco de dados estiver aberto, apenas se o aplicativo solicitante for compatível</string>
<string name="passkeys_backup_eligibility_title">Elegibilidade de Backup</string>
<string name="passkeys_backup_eligibility_summary">Determine no tempo de criação se é permitido que seja feito o backup da fonte da credencial de chaves públicas</string>
<string name="passkeys_backup_state_title">Estado do Backup</string>
<string name="passkey">Passkey</string>
<string name="passkey">Chave de acesso</string>
<string name="passkey_service_name">Provedor de Credenciais KeePassDX</string>
<string name="passkeys">Chaves de acesso</string>
<string name="passkeys_explanation_summary">Configure Chaves de Acesso para um login rápido e seguro sem senha</string>
<string name="passkeys_preference_title">Configurações de chaves de acesso</string>
<string name="passkeys_close_database_title">Fechar banco de dados</string>
<string name="passkeys_close_database_summary">Fechar o banco de dados após selecionar uma chave de acesso</string>
<string name="passkeys_privileged_apps_title">Aplicativos privilegiados</string>
<string name="passkeys_backup_state_summary">Indica quando as credenciais estiverem armazenadas e protegidas contra a perda de um dispositivo</string>
<string name="credential_provider_service_subtitle">Chaves de acesso, preenchimento automático provedor de credenciais</string>
<string name="passkey_creation_description">Salvar chave de acesso na nova entrada</string>
<string name="passkey_update_description">Atualizar chave de acesso em %1$s</string>
<string name="passkey_selection_username">Nenhuma chave de acesso encontrada</string>
<string name="passkey_selection_description">Selecione uma chave de acesso existente</string>
<string name="passkey_database_username">Banco de dados KeePassDX</string>
<string name="passkey_locked_database_description">Selecione para desbloquear</string>
<string name="passkey_username">Nome da chave de acesso</string>
<string name="passkey_private_key">Chavde de acesso privada</string>
<string name="passkey_credential_id">ID de credencial de chave de acesso</string>
<string name="passkey_user_handle">Nome de usuário da chave de acesso</string>
<string name="passkey_backup_eligibility">Elegibilidade para Backup de chave de acesso</string>
<string name="passkey_backup_state">Status de backup da chave de acesso</string>
<string name="error_passkey_result">Incapaz de retornar a chave de acesso</string>
<string name="passkey_relying_party">Chave de acesso com autenticador externo</string>
</resources>

View File

@@ -546,7 +546,7 @@
<string name="error_import_app_properties">Eroare în timpul importării setărilor aplicației.</string>
<string name="warning_exact_alarm">Nu ați permis aplicației să utilizeze o alarmă exactă. Ca urmare, funcțiile care necesită un cronometru nu se vor face cu o oră exactă.</string>
<string name="warning_database_info_reloaded">Reîncărcarea bazei de date va șterge datele modificate local.</string>
<string name="menu_appearance_settings_summary">Teme, culori, atribute</string>
<string name="menu_appearance_settings_summary">Teme, culori, incoane, fonturi, atribute.</string>
<string name="autofill_preference_title">Setări de autocompletare</string>
<string name="warning_replace_file">Încărcarea acestui fișier îl va înlocui pe cel existent.</string>
<string name="content">Conținut</string>
@@ -698,4 +698,17 @@
<string name="hide_templates_title">Ascundeți șabloanele</string>
<string name="hide_templates_summary">Șabloanele nu sunt afișate</string>
<string name="error_otp_secret_length">Cheia secretă trebuie să conțină cel puțin %1$d caractere.</string>
<string name="entry_application_id">ID-ul Aplicației</string>
<string name="warning_overwrite_data_title">Suprascrii datele existente?</string>
<string name="warning_overwrite_data_description">Această acțiune va înlocui datele existente din intrare, puteți recupera datele vechi dacă istoricul este activat.</string>
<string name="credential_provider">Credențialele furnizorului</string>
<string name="passkeys_privileged_apps_title">Aplicații privilegiate</string>
<string name="passkeys_privileged_apps_summary">Gestionați browserele din lista personalizată de aplicații privilegiate</string>
<string name="passkeys_privileged_apps_explanation">AVERTISMENT: O aplicație privilegiată acționează ca o poartă de acces pentru a determina originea unei autentificări. Asigurați-vă că este legitimă pentru a evita probleme de securitate.</string>
<string name="passkeys_privileged_apps_ask_title">Aplicație nerecunoscută</string>
<string name="passkeys_missing_signature_app_ask_title">Lipsește semnătura</string>
<string name="passkeys_auto_select_title">Selectare automată</string>
<string name="passkeys_auto_select_summary">Selectare automată dacă există o singură intrare și baza de date este deschisă, doar dacă aplicația solicitantă este compatibilă</string>
<string name="passkeys_backup_eligibility_title">Eligibilitate pentru copia de siguranță</string>
<string name="passkey_locked_database_description">Selectează ca să deblochezi</string>
</resources>

View File

@@ -181,9 +181,9 @@
<string name="menu_appearance_settings">Внешний вид</string>
<string name="general">Общие</string>
<string name="autofill">Автозаполнение</string>
<string name="autofill_sign_in_prompt">Войти с помощью KeePassDX</string>
<string name="autofill_sign_in_prompt">Войти с KeePassDX</string>
<string name="autofill_explanation_summary">Настройте службу для быстрого заполнения форм в других приложениях</string>
<string name="set_credential_provider_service_title">Использовать службу автозаполнения</string>
<string name="set_credential_provider_service_title">Служба автозаполнения</string>
<string name="password_size_title">Длина создаваемого пароля</string>
<string name="password_size_summary">Настройка длины создаваемых паролей по умолчанию</string>
<string name="list_password_generator_options_title">Символы пароля</string>
@@ -475,7 +475,7 @@
<string name="autofill_ask_to_save_data_summary">Запрашивать сохранение данных после завершения заполнения формы</string>
<string name="autofill_ask_to_save_data_title">Запрос сохранения данных</string>
<string name="autofill_close_database_summary">Закрывать базу после выбора автозаполнения</string>
<string name="autofill_close_database_title">Закрыть базу</string>
<string name="autofill_close_database_title">Закрывать базу</string>
<string name="notification">Уведомление</string>
<string name="biometric_security_update_required">Требуется обновление биометрической системы безопасности.</string>
<string name="warning_empty_recycle_bin">Удалить всё содержимое корзины безвозвратно\?</string>
@@ -585,7 +585,7 @@
<string name="show_otp_token_summary">Показывать токены OTP в списке записей</string>
<string name="menu_external_icon">Внешний значок</string>
<string name="autofill_select_entry">Выбор записи…</string>
<string name="autofill_manual_selection_summary">Показывать функцию, позволяющую пользователю вручную выбирать запись из базы</string>
<string name="autofill_manual_selection_summary">Показывать элемент управления для ручного выбора пользователем записи из базы</string>
<string name="autofill_manual_selection_title">Ручной выбор</string>
<string name="hint_icon_name">Название значка</string>
<string name="permission">Разрешение</string>

View File

@@ -569,7 +569,7 @@
<string name="icon_pack_choose_summary">Paketë ikonash të përdorura te aplikacioni</string>
<string name="hide_expired_entries_summary">Zërat e skaduar nuk shfaqen</string>
<string name="set_credential_provider_service_title">Caktoni shërbim parazgjedhje vetëplotësimesh</string>
<string name="autofill_explanation_summary">Aktivizoni vetëplotësimet, për të plotësuar shpejt formularë në aplikacione të tjerë</string>
<string name="autofill_explanation_summary">Formësoni vetëplotësimet, për të plotësuar shpejt formularë në aplikacione të tjerë</string>
<string name="autofill_preference_title">Rregullime vetëplotësimi</string>
<string name="password_size_summary">Cakton madhësinë parazgjedhje për fjalëkalimet e prodhuar</string>
<string name="list_password_generator_options_summary">Caktoni shenja të lejuara për prodhuesin e fjalëkalimeve</string>
@@ -623,14 +623,14 @@
<string name="education_field_copy_summary">Çkopjohet te fusha, mund të ngjitet kudo.\n\nPërdorni metodën mbushje formularësh, nëse parapëlqeni.</string>
<string name="education_donation_summary">Ndihmoni të shtohet qëndrueshmëria, siguria dhe në shtimin e më tepër veçorive.</string>
<string name="html_text_ad_free">Ndryshe nga shumë aplikacione administrimi fjalëkalimesh, ky është &lt;strong&gt;pa reklama&lt;/strong&gt;, &lt;strong&gt;<em>software</em> i lirë në <em>copylef</em>&lt;/strong&gt; dhe sgrumbullon të dhëna personale në shërbyesit e tij, pavarësisht versionit që përdorni.</string>
<string name="html_text_buy_pro">Duke blerë versionin Pro, do të mund të përdorni këtë &lt;strong&gt;stil pamor&lt;/strong&gt; dhe do të ndihmoni veçanërisht në &lt;strong&gt;realizimin e projekteve të bashkësisë.&lt;strong&gt;</string>
<string name="html_text_buy_pro">Duke blerë versionin Pro, do të mund të përdorni këtë &lt;strong&gt;stil pamor&lt;/strong&gt; dhe do të ndihmoni veçanërisht në &lt;strong&gt;realizimin e projekteve të bashkësisë.&lt;/strong&gt;</string>
<string name="error_arc4">Smbulohet shifër “Arcfour stream”.</string>
<string name="warning_file_too_big">Një bazë të dhënash KeePass supozohet se përmban vetëm kartela të vockla mjetesh (b.f., kartela kyçesh PGP).\n\nMe këtë ngarkim baza juaj e të dhënave mund të bëhet shumë e madhe dhe të ulet funksionimi i saj.</string>
<string name="education_read_only_summary">Ndryshoni mënyrë hapjeje për këtë sesion. \n \n“Mbrojtur nga shkimi” parandalon ndryshime të paqëllimta te baza e të dhënave. \n“E ndryshueshme” ju lejon të shtoni, fshini ose ndryshoni krejt elementët, sipas dëshirës.</string>
<string name="html_text_dev_feature_encourage">po i nxisni zhvilluesit të krijojnë &lt;strong&gt;veçori të reja&lt;/strong&gt; dhe të &lt;strong&gt;ndreqin të meta&lt;/strong&gt; në përputhje me sugjerimet tuaja.</string>
<string name="warning_large_keyfile">Nuk rekomandohet të shtohet një kartelë kyç e madhe, kjo mund të pengojë hapjen e bazës së të dhënave.</string>
<string name="education_entry_edit_summary">Përpunojeni zërin tuaj me fusha vetjake. Pool data can be referenced between different entry fields.</string>
<string name="error_otp_type">Lloji OTP ekzistues snjihet nga ky formular, vlerësimi i tij mund të mos prodhojë më saktë token-in.</string>
<string name="error_otp_type">Lloji OTP ekzistues snjihet nga ky formular dhe vlerësimi i tij mund të mos prodhojë më saktë token-in.</string>
<string name="warning_database_read_only">Akordo hyrje për shkrim kartelash, që të ruhen ndryshimet e bazës së të dhënave</string>
<string name="warning_database_info_changed_options">Përzieni të dhënat, mbishkruani ndryshimet që nga jashtë duke e ruajtur bazën e të dhënave, ose duke e ringarkuar me ndryshimet më të reja.</string>
<string name="warning_database_revoked">Hyrja te kartela e shfuqizuar nga përgjegjësi i kartelave, mbylleni bazën e të dhënave dhe rihapeni që prej vendndodhjes së saj.</string>

View File

@@ -22,7 +22,7 @@
<string name="contribution">Đóng góp</string>
<string name="feedback">Phản hồi</string>
<string name="homepage">Trang chủ</string>
<string name="about_description">Triển khai Android của trình quản lý mật khẩu KeePass</string>
<string name="about_description">Phiên bản Android của trình quản lý mật khẩu KeePass.</string>
<string name="accept">Chấp nhận</string>
<string name="add_entry">Thêm mục</string>
<string name="edit_entry">Chỉnh sửa mục</string>
@@ -33,7 +33,7 @@
<string name="encryption_algorithm">Thuật toán mã hóa</string>
<string name="key_derivation_function">Hàm dẫn xuất khóa</string>
<string name="app_timeout">Hết thời gian</string>
<string name="app_timeout_summary">Thời gian rảnh trước khi khóa cơ sở dữ liệu</string>
<string name="app_timeout_summary">Thời gian ngưng trước khi khóa cơ sở dữ liệu</string>
<string name="application">Ứng dụng</string>
<string name="brackets">Dấu ngoặc</string>
<string name="extended_ASCII">ASCII mở rộng</string>
@@ -43,17 +43,17 @@
<string name="clipboard_error_title">Lỗi bảng nhớ tạm</string>
<string name="clipboard_error">Một số thiết bị sẽ không cho phép ứng dụng sử dụng bảng nhớ tạm.</string>
<string name="clipboard_error_clear">Không thể xóa bảng nhớ tạm</string>
<string name="clipboard_timeout">Hết thời gian tạm dừng bảng nhớ tạm</string>
<string name="clipboard_timeout">Hết thời gian lưu trong bảng nhớ tạm</string>
<string name="clipboard_timeout_summary">Thời lượng lưu trữ trong bảng nhớ tạm (nếu được thiết bị của bạn hỗ trợ)</string>
<string name="content_description_background">Nền</string>
<string name="content_description_open_file">Mở tệp</string>
<string name="content_description_node_children">Nút con</string>
<string name="content_description_add_node">Thêm nút</string>
<string name="content_description_add_entry">Thêm mục nhập</string>
<string name="content_description_add_entry">Thêm mục</string>
<string name="content_description_add_group">Thêm nhóm</string>
<string name="content_description_add_item">Thêm mục</string>
<string name="content_description_file_information">Thông tin tệp</string>
<string name="content_description_credentials_information">Thông tin xác thực</string>
<string name="content_description_credentials_information">Thông tin đăng nhập</string>
<string name="content_description_otp_information">Thông tin mật khẩu một lần</string>
<string name="content_description_password_checkbox">Hộp kiểm mật khẩu</string>
<string name="content_description_keyfile_checkbox">Hộp kiểm tệp khóa</string>
@@ -190,7 +190,7 @@
<string name="error_otp_counter">Bộ đếm phải nằm trong khoảng từ %1$d đến %2$d.</string>
<string name="error_otp_period">Khoảng thời gian phải nằm trong khoảng từ %1$d đến %2$d giây.</string>
<string name="error_otp_digits">Mã thông báo phải chứa %1$d đến %2$d chữ số.</string>
<string name="error_otp_type">Loại OTP hiện tại không được biểu mẫu này nhận dạng, quá trình xác thực của nó có thể không tạo ra mã thông báo chính xác nữa.</string>
<string name="error_otp_type">Loại OTP hiện tại không thể được nhận dạng bởi biểu mẫu này, nó có khả năng không tạo ra mã thông báo chính xác nữa.</string>
<string name="error_string_type">Văn bản này không khớp với mục được yêu cầu.</string>
<string name="error_registration_read_only">Không được phép lưu mục mới trong cơ sở dữ liệu chỉ đọc.</string>
<string name="error_field_name_already_exists">Tên trường đã tồn tại.</string>
@@ -206,7 +206,7 @@
<string name="error_no_response_from_challenge">Không thể nhận được phản hồi từ thử thách.</string>
<string name="error_cancel_by_user">Đã bị người dùng hủy.</string>
<string name="error_driver_required">Cần có trình điều khiển cho %1$s.</string>
<string name="error_unable_merge_database_kdb">Không thể hợp nhất từ cơ sở dữ liệu V1.</string>
<string name="error_unable_merge_database_kdb">Không thể hợp nhất với cơ sở dữ liệu của tệp kdb.</string>
<string name="error_location_unknown">Vị trí cơ sở dữ liệu không xác định, hành động cơ sở dữ liệu không thể được thực hiện.</string>
<string name="error_hardware_key_unsupported">Khóa phần cứng không được hỗ trợ.</string>
<string name="error_empty_key">Khóa không được để trống.</string>
@@ -260,7 +260,7 @@
<string name="menu_device_unlock_settings_summary">Sinh trắc học, thông tin xác thực thiết bị</string>
<string name="menu_database_settings">Thiết đặt cơ sở dữ liệu</string>
<string name="menu_database_settings_summary">Siêu dữ liệu, thùng rác, mẫu, lịch sử</string>
<string name="menu_security_settings">Thiết đặt bảo mật</string>
<string name="menu_security_settings">Thiết lập bảo mật</string>
<string name="menu_security_settings_summary">Mã hóa, hàm dẫn xuất khóa</string>
<string name="menu_master_key_settings">Thiết đặt khóa chính</string>
<string name="master_key_settings_summary">Thay đổi, gia hạn</string>
@@ -726,4 +726,7 @@
<string name="hide_expired_entries_title">Ẩn các mục đã hết hạn</string>
<string name="hide_expired_entries_summary">Các mục hết hạn không được hiển thị</string>
<string name="warning_database_info_changed_options_read_only">Tải lại cơ sở dữ liệu với những thay đổi mới nhất.</string>
<string name="entry_application_id">ID ứng dụng</string>
<string name="error_otp_secret_length">Mã bí mật tối thiểu phải có %1$d ký tự.</string>
<string name="generate_keyfile">Tạo ra tệp khóa</string>
</resources>

View File

@@ -775,4 +775,5 @@
<string name="passkey_backup_eligibility">Passkey Backup Eligibility</string>
<string name="passkey_backup_state">Passkey Backup State</string>
<string name="error_passkey_result">Unable to return the passkey</string>
<string name="error_passkey_credential_id">No passkey found with relying party %1$s and credentialIds %2$s</string>
</resources>

View File

@@ -433,6 +433,32 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) {
}
}
/**
* Return the real parent in database from a group defined as parent
* If the parent is null, simply return the root group
* Guaranteed that a return group is linked to the database tree through its ancestors
*/
private fun getAttachedParent(
group: GroupKDBX?
): GroupKDBX {
var realParent: GroupKDBX = database.rootGroup!!
group?.let { parent ->
val parentInDatabase = database.getGroupById(parent.nodeId)
if (parentInDatabase == null) {
realParent = GroupKDBX().apply {
updateWith(parent, updateParents = false)
}
database.addGroupTo(
realParent,
getAttachedParent(parent.parent)
)
} else {
realParent = parentInDatabase
}
}
return realParent
}
/**
* Utility method to merge a KDBX entry
*/
@@ -443,10 +469,7 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) {
databaseToMerge.getEntryById(entryId)?.let { srcEntryToMerge ->
// Retrieve parent in current database
var parentEntryToMerge: GroupKDBX? = null
srcEntryToMerge.parent?.nodeId?.let {
parentEntryToMerge = database.getGroupById(it)
}
val parentEntryToMerge: GroupKDBX = getAttachedParent(srcEntryToMerge.parent)
val entryToMerge = EntryKDBX().apply {
updateWith(srcEntryToMerge, copyHistory = true, updateParents = false)
}
@@ -478,8 +501,7 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) {
// If it's a deleted object, but another instance was updated
// If entry parent to add exists and in current database
if ((deletedObject == null
|| deletedObject.deletionTime.isBefore(entryToMerge.lastModificationTime))
&& parentEntryToMerge != null) {
|| deletedObject.deletionTime.isBefore(entryToMerge.lastModificationTime))) {
database.addEntryTo(entryToMerge, parentEntryToMerge)
}
} else {
@@ -488,51 +510,46 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) {
// Merge by modification time
if (entry.lastModificationTime.isBefore(entryToMerge.lastModificationTime)) {
// Update entry with databaseEntryToMerge and merge history
addHistory(entry, entryToMerge)
if (parentEntryToMerge == entry.parent) {
entry.updateWith(entryToMerge, copyHistory = true, updateParents = false)
} else {
database.removeEntryFrom(entry, entry.parent)
if (parentEntryToMerge != null) {
database.addEntryTo(entryToMerge, parentEntryToMerge)
}
}
entryToMerge.addHistoryFrom(entry)
entry.updateWith(entryToMerge, copyHistory = true, updateParents = false)
// Move the current entry to the verified location
database.removeEntryFrom(entry, entry.parent)
database.addEntryTo(entry, parentEntryToMerge)
} else if (entry.lastModificationTime.isAfter(entryToMerge.lastModificationTime)) {
addHistory(entryToMerge, entry)
// Don't touch the location but update the entry history
entry.addHistoryFrom(entryToMerge)
} else if (entry.lastModificationTime.isEquals(entryToMerge.lastModificationTime)) {
// If it's the same modification time, simply move entry to the right location
parentEntryToMerge?.let {
database.removeEntryFrom(entry, entry.parent)
database.addEntryTo(entryToMerge, parentEntryToMerge)
}
// If it's the same modification time, simply move entry to the right location,
// Current entry and entry to merge are normally the same
database.removeEntryFrom(entry, entry.parent)
database.addEntryTo(entry, parentEntryToMerge)
}
}
}
}
/**
* Utility method to merge an history from an [entryA] to an [entryB],
* [entryB] is modified
* Utility method to merge an history from an [entryA]
*/
private fun addHistory(entryA: EntryKDBX, entryB: EntryKDBX) {
private fun EntryKDBX.addHistoryFrom(entryA: EntryKDBX) {
// Keep entry as history if already not present
entryA.history.forEach { history ->
// If history not present
if (!entryB.history.any {
if (!this.history.any {
it.lastModificationTime == history.lastModificationTime
}) {
entryB.addEntryToHistory(history)
this.addEntryToHistory(history)
}
}
// Last entry not present
if (entryB.history.find {
if (this.history.find {
it.lastModificationTime == entryA.lastModificationTime
} == null) {
val history = EntryKDBX().apply {
updateWith(entryA, copyHistory = false, updateParents = false)
parent = null
}
entryB.addEntryToHistory(history)
this.addEntryToHistory(history)
}
}
@@ -546,10 +563,7 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) {
databaseToMerge.getGroupById(groupId)?.let { srcGroupToMerge ->
// Retrieve parent in current database
var parentGroupToMerge: GroupKDBX? = null
srcGroupToMerge.parent?.nodeId?.let {
parentGroupToMerge = database.getGroupById(it)
}
val parentGroupToMerge: GroupKDBX = getAttachedParent(srcGroupToMerge.parent)
val groupToMerge = GroupKDBX().apply {
updateWith(srcGroupToMerge, updateParents = false)
}
@@ -557,8 +571,7 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) {
if (group == null) {
// If group parent to add exists and in current database
if ((deletedObject == null
|| deletedObject.deletionTime.isBefore(groupToMerge.lastModificationTime))
&& parentGroupToMerge != null) {
|| deletedObject.deletionTime.isBefore(groupToMerge.lastModificationTime))) {
database.addGroupTo(groupToMerge, parentGroupToMerge)
}
} else {
@@ -566,20 +579,16 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) {
mergeCustomData(group.customData, groupToMerge.customData)
// Merge by modification time
if (group.lastModificationTime.isBefore(groupToMerge.lastModificationTime)) {
if (parentGroupToMerge == group.parent) {
group.updateWith(groupToMerge, false)
} else {
database.removeGroupFrom(group, group.parent)
if (parentGroupToMerge != null) {
database.addGroupTo(groupToMerge, parentGroupToMerge)
}
}
group.updateWith(groupToMerge, updateParents = false)
// Update the current group location to the verified one
database.removeGroupFrom(group, group.parent)
database.addGroupTo(group, parentGroupToMerge)
} else if (group.lastModificationTime.isAfter(group.lastModificationTime)) {
// Don't touch the location
} else if (group.lastModificationTime.isEquals(groupToMerge.lastModificationTime)) {
// If it's the same modification time, simply move group to the right location
parentGroupToMerge?.let {
database.removeGroupFrom(group, group.parent)
database.addGroupTo(groupToMerge, parentGroupToMerge)
}
database.removeGroupFrom(group, group.parent)
database.addGroupTo(group, parentGroupToMerge)
}
}
}

View File

@@ -27,6 +27,7 @@ import com.kunzisoft.keepass.database.element.node.NodeId
import com.kunzisoft.keepass.model.AppOriginEntryField.isAppId
import com.kunzisoft.keepass.model.AppOriginEntryField.isAppIdSignature
import com.kunzisoft.keepass.model.AppOriginEntryField.isWebDomain
import com.kunzisoft.keepass.model.PasskeyEntryFields.isCredentialId
import com.kunzisoft.keepass.model.PasskeyEntryFields.isPasskey
import com.kunzisoft.keepass.model.PasskeyEntryFields.isRelyingParty
import com.kunzisoft.keepass.otp.OtpEntryFields.isOTP
@@ -176,11 +177,29 @@ class SearchHelper {
}
}
if (searchParameters.searchInRelyingParty) {
if(entry.getExtraFields().any { field ->
val relyingParty = searchParameters.searchQuery
val credentialIds = searchParameters.searchOptions
val containsRelyingParty = entry.getExtraFields().any { field ->
field.isRelyingParty()
&& checkSearchQuery(field.protectedValue.stringValue, searchParameters)
})
return true
&& field.protectedValue.stringValue
.equals(relyingParty, ignoreCase = true)
}
// Check empty to allow any credential if not defined
val containsCredentialId = if(credentialIds.isEmpty()) true
else entry.getExtraFields().any { field ->
field.isCredentialId()
&& credentialIds.any { credentialId ->
checkSearchQuery(
stringToCheck = field.protectedValue.stringValue,
searchParameters = SearchParameters().apply {
searchQuery = credentialId
caseSensitive = false
isRegex = false
}
)
}
}
return containsRelyingParty && containsCredentialId
}
if (searchParameters.searchInNotes) {
if (checkSearchQuery(entry.notes, searchParameters))

View File

@@ -27,6 +27,8 @@ import android.os.Parcelable
*/
class SearchParameters() : Parcelable{
var searchQuery: String = ""
// Add an optional string to search with the main search query
var searchOptions: List<String> = listOf()
var allowEmptyQuery = true
var caseSensitive = false
var isRegex = false

View File

@@ -71,7 +71,7 @@ object AppOriginEntryField {
/**
* Useful to detect if an other KeePass compatibility app already add a web domain or an app id
*/
private fun EntryInfo.containsDomainOrApplicationId(search: String): Boolean {
fun EntryInfo.containsDomainOrApplicationId(search: String): Boolean {
if (url.contains(search))
return true
return customFields.find {
@@ -159,5 +159,7 @@ object AppOriginEntryField {
*/
fun Field.isWebDomain(): Boolean {
return this.name.startsWith(WEB_DOMAIN_FIELD_NAME)
|| this.name.contains("_$WEB_DOMAIN_FIELD_NAME")
|| this.name.contains("${WEB_DOMAIN_FIELD_NAME}_")
}
}

View File

@@ -27,6 +27,7 @@ import com.kunzisoft.keepass.database.element.Database
import com.kunzisoft.keepass.database.element.Field
import com.kunzisoft.keepass.database.element.Tags
import com.kunzisoft.keepass.database.element.entry.AutoType
import com.kunzisoft.keepass.model.AppOriginEntryField.containsDomainOrApplicationId
import com.kunzisoft.keepass.model.AppOriginEntryField.setAppOrigin
import com.kunzisoft.keepass.model.AppOriginEntryField.setApplicationId
import com.kunzisoft.keepass.model.AppOriginEntryField.setWebDomain
@@ -183,6 +184,18 @@ class EntryInfo : NodeInfo {
}
}
/**
* True if this entry contains domain or applicationId,
* OTP is ignored and considered not present
*/
fun containsSearchInfo(searchInfo: SearchInfo): Boolean {
return searchInfo.webDomain?.let { webDomain ->
containsDomainOrApplicationId(webDomain)
} ?: searchInfo.applicationId?.let { applicationId ->
containsDomainOrApplicationId(applicationId)
} ?: false
}
/**
* Add searchInfo to current EntryInfo
*/

View File

@@ -176,6 +176,13 @@ object PasskeyEntryFields {
}
}
/**
* Detect if the current field is a Passkey credential id
*/
fun Field.isCredentialId(): Boolean {
return name == FIELD_CREDENTIAL_ID
}
/**
* Detect if the current field is a Passkey relying party
*/

View File

@@ -35,6 +35,7 @@ class SearchInfo : ObjectNameResource, Parcelable {
return if (webDomain == null) null else field
}
var relyingParty: String? = null
var credentialIds: List<String> = listOf()
var otpString: String? = null
constructor()
@@ -46,6 +47,7 @@ class SearchInfo : ObjectNameResource, Parcelable {
webDomain = toCopy?.webDomain
webScheme = toCopy?.webScheme
relyingParty = toCopy?.relyingParty
credentialIds = toCopy?.credentialIds ?: listOf()
otpString = toCopy?.otpString
}
@@ -61,6 +63,9 @@ class SearchInfo : ObjectNameResource, Parcelable {
webScheme = if (readScheme.isNullOrEmpty()) null else readScheme
val readRelyingParty = parcel.readString()
relyingParty = if (readRelyingParty.isNullOrEmpty()) null else readRelyingParty
val readCredentialIdList = mutableListOf<String>()
parcel.readStringList(readCredentialIdList)
credentialIds = readCredentialIdList.toList()
val readOtp = parcel.readString()
otpString = if (readOtp.isNullOrEmpty()) null else readOtp
}
@@ -76,6 +81,7 @@ class SearchInfo : ObjectNameResource, Parcelable {
parcel.writeString(webDomain ?: "")
parcel.writeString(webScheme ?: "")
parcel.writeString(relyingParty ?: "")
parcel.writeStringList(credentialIds)
parcel.writeString(otpString ?: "")
}
@@ -94,6 +100,7 @@ class SearchInfo : ObjectNameResource, Parcelable {
&& webDomain == null
&& webScheme == null
&& relyingParty == null
&& credentialIds.isEmpty()
&& otpString == null
}
@@ -127,6 +134,7 @@ class SearchInfo : ObjectNameResource, Parcelable {
if (webDomain != other.webDomain) return false
if (webScheme != other.webScheme) return false
if (relyingParty != other.relyingParty) return false
if (credentialIds != other.credentialIds) return false
if (otpString != other.otpString) return false
return true
@@ -139,6 +147,7 @@ class SearchInfo : ObjectNameResource, Parcelable {
result = 31 * result + (webDomain?.hashCode() ?: 0)
result = 31 * result + (webScheme?.hashCode() ?: 0)
result = 31 * result + (relyingParty?.hashCode() ?: 0)
result = 31 * result + (credentialIds.hashCode())
result = 31 * result + (otpString?.hashCode() ?: 0)
return result
}
@@ -147,6 +156,10 @@ class SearchInfo : ObjectNameResource, Parcelable {
return otpString ?: webDomain ?: applicationId ?: relyingParty ?: tag ?: ""
}
fun optionsString(): List<String> {
return if (isPasskeySearch && credentialIds.isNotEmpty()) credentialIds else listOf()
}
fun toRegisterInfo(): RegisterInfo {
return RegisterInfo(this)
}

View File

@@ -1 +1 @@
KeePassDX مدير كلمات سر مفتوح المصدر
KeePassDX

View File

@@ -22,4 +22,4 @@ Sie können spenden oder die Pro-Version kaufen, um einen besseren Service und e
Das Projekt wird ständig weiterentwickelt. Zögern Sie nicht, den Entwicklungsstand der nächsten Updates zu überprüfen: <a href="https://github.com/Kunzisoft/KeePassDX/projects">https://github.com/Kunzisoft/KeePassDX/projects</a>
Sie haben einen Bug : <a href="https://github.com/Kunzisoft/KeePassDX/issues">https://github.com/Kunzisoft/KeePassDX/issues</a>
Sie haben einen Bug : <a href="https://github.com/Kunzisoft/KeePassDX/issues">https://github.com/Kunzisoft/KeePassDX/issues</a>

View File

@@ -1 +1 @@
KeePassDX Pass(key-worttresor)
KeePassDX Pass(key/wort)-Tresor

View File

@@ -0,0 +1,4 @@
* Fix database merge algorithm #2223
* Fix save search info #2243
* Fix Play Service as privileged app for Passkey Cross Device Authentication #2244
* Small fixes

View File

@@ -0,0 +1,4 @@
* Fix multiple Passkey selection #2253
* Fix database dialog subtitle #2254
* Fix save search info if URL present #2255
* Small fixes

View File

@@ -0,0 +1 @@
* Fix remembering database location #2262

View File

@@ -0,0 +1,3 @@
* Manual change of app language #1884 #1990
* Fix autofill username detection #2276
* Fix Passkey in passwordless mode #2282

View File

@@ -1 +1 @@
KeePassDX - Contraseñas FOSS
KeePassDX Pass(key/word) Vault

View File

@@ -0,0 +1,4 @@
* Correction de l'algorithme de fusion des bases de données #2223
* Correction de la sauvegarde des infos de recherche #2243
* Correction Play Service comme appli privilégiée pour l'authentification Passkey multi-appareils #2244
* Small fixes

View File

@@ -0,0 +1,4 @@
* Correction de la selection multiple des Passkeys #2253
* Correction du sous-titre du dialogue de la base de données #2254
* Correction de la sauvegarde des infos de recherchesi l'URL est present #2255
* Petites corrections

View File

@@ -0,0 +1 @@
* Correction de la sauvegarde de l'emplacement des bases de données #2262

View File

@@ -0,0 +1,3 @@
* Changement manuel de la langue de l'appli #1884 #1990
* Correction de la détection du nom d'utilisateur pour le remplissage auto #2276
* Correction de Passkey en mode passwordless #2282

View File

@@ -1 +1 @@
KeePassDX FOSS trezor za lozinke
KeePassDX Pass(key/word) Vault

View File

@@ -1 +1 @@
KeePassDX Pengaman Sandi FOSS
KeePassDX Pass(key/word) Vault

View File

@@ -10,6 +10,7 @@ KeePassDX è un <b>gestore di password e passkey</b> open source che permette di
- Creazione di database crittografati.
- Organizzazione delle credenziali per voce e strutture ad albero.
- Apertura e copia rapida di campi URI / URL.
- Modelli dinamici per ogni tipo di voce.
- Cronologia di tutte le voci.
- Gestione precisa delle impostazioni.
- Material design con temi.

View File

@@ -1 +1 @@
Cassaforte di pass(key/word) KeePassDX
KeePassDX Pass(key/word) Vault

View File

@@ -0,0 +1,25 @@
KeePassDX yra atviro kodo <b>prieigos raktų, slaptažodžių seifas ir tvarkyklė</b>, leidžianti redaguoti <b>šifruotus duomenis viename faile</b> atvirame KeePass formate ir <b>saugiai užpildyti formas</b>, <b>nereikalaujanti interneto ryšio</b> ir integruojanti Android dizaino standartus. Programa yra <b>atviro kodo, be reklamų</b>.
<b>Funkcijos</b>
- Prieigos raktai autentifikacijai ir vietiniam privačių raktų saugojimui.
- Biometrinis atpažinimas greitam atrakinimui (pirštų atspaudas / veido atrakinimas / …).
- Vienkartinių slaptažodžių valdymas (HOTP / TOTP) dviejų faktorių autentifikacijai (2FA).
- Automatinis užpildymas lengvam formų užpildymui slaptažodžiais.
- Magikeyboard efektyviam bet kurio lauko užpildymui.
- Šifruotų duomenų bazės failų kūrimas.
- Kvalifikacijų organizavimas pagal įrašus ir grupių medžius.
- Leidžia greitai atverti ir kopijuoti URI / URL laukus.
- Dinaminiai šablonai kiekvienam įrašo tipui.
- Kiekvieno įrašo istorija.
- Tikslus nustatymų valdymas.
- Material dizainas su temomis.
- Palaikymas .kdb ir .kdbx failams (versija 1 iki 4) su AES - Twofish - ChaCha20 - Argon2 algoritmais.
- Suderinamas su dauguma alternatyvių programų (KeePass, KeePassXC, KeeWeb, …).
- Kodas parašytas gimtomis kalbomis (Kotlin / Java / JNI / C).
Galite paaukoti arba įsigyti pro versiją geresniam aptarnavimui ir greitam norimų funkcijų kūrimui: <a href="https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.pro">https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.pro</a>
Projektas nuolat evoliucionuoja. Nedvejokite patikrinti kitų atnaujinimų kūrimo būsenos: <a href="https://github.com/Kunzisoft/KeePassDX/projects">https://github.com/Kunzisoft/KeePassDX/projects</a>
Siųskite problemas į: <a href="https://github.com/Kunzisoft/KeePassDX/issues">https://github.com/Kunzisoft/KeePassDX/issues</a>

View File

@@ -0,0 +1 @@
**Valdykite prieigos raktus / slaptažodžius vietiniame ir atviro kodo seife**

View File

@@ -0,0 +1 @@
KeePassDX slaptažodžių seifas

View File

@@ -1 +1 @@
KeePassDX - Безбедносен софтвер за лозинки и е слободен софтвер
KeePassDX Pass(key/word) Vault

View File

@@ -1,19 +1,21 @@
KeePassDX — это приложение <b> для хранения и управления паролями</b>, которая позволяет редактировать <b>зашифрованные данные в одном файле</b> в открытом формате KeePass, <b>безопасно заполнять формы</b>, <b>не требует подключения к Интернету</b> и соответствует стандартам дизайна Android. Приложение с <b>открытым исходным кодом, без рекламы</b>.
KeePassDX — это приложение с открытым кодом <b>для хранения и управления паролями, ключами доступа</b>. Позволяет редактировать <b>зашифрованные данные в одном файле</b> в открытом формате KeePass, <b>безопасно заполнять формы</b>, <b>не требует подключения к Интернету</b> и соответствует стандартам дизайна Android. Приложение с <b>открытым исходным кодом, без рекламы</b>.
<b>Возможности</b>
- Создание файлов/записей и групп.
- Поддержка файлов .kdb и .kdbx (версии от 1 до 4) с алгоритмом AES — Twofish — ChaCha20 — Argon2.
- Совместим с большинством альтернативных программ (KeePass, KeePassXC, KeeWeb, …).
- Позволяет быстро открывать и копировать поля URI / URL.
- Коды доступа для аутентификации и локальное хранение закрытых ключей.
- Биометрическое распознавание для быстрой разблокировки (отпечаток пальца /разблокировка по лицу / …).
- Управление одноразовыми паролями (HOTP / TOTP) для двухфакторной аутентификации (2FA).
- Материальный дизайн с темами.
- Автозаполнение и интеграция.
- Клавиатура для заполнения полей.
- Динамические шаблоны.
- Автозаполнение для удобного заполнения форм паролями.
- Magikeyboard для эффективного заполнения любого поля.
- Создание зашифрованных файлов базы данных.
- Организация учётных данных по записям и группам.
- Позволяет быстро открывать и копировать поля URI / URL.
- Динамические шаблоны для разных типов записей.
- История каждой записи.
- Точное управление настройками.
- Материальный дизайн с темами.
- Поддержка файлов .kdb и .kdbx (версии от 1 до 4) с алгоритмом AES — Twofish — ChaCha20 — Argon2.
- Совместим с большинством альтернативных программ (KeePass, KeePassXC, KeeWeb, …).
- Код написан на родных языках для платформы (Kotlin / Java / JNI / C).
Вы можете пожертвовать или купить профессиональную версию для улучшения обслуживания и быстрой разработки нужных вам возможностей: <a href="https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.pro">https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.pro</a>

View File

@@ -1 +1 @@
KeePassDX - менеджер паролей/ключей
KeePassDX - менеджер паролей

View File

@@ -1 +1 @@
KeePassDX - Parola/Anahtar Kasası
KeePassDX Pass(key/word) Vault

View File

@@ -1 +1 @@
KeePassDX - FOSS 密碼管理器
KeePassDX Pass(key/word) Vault