mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2025-12-04 15:39:34 +01:00
Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
63b2394ed0 | ||
|
|
cdb10dce0c | ||
|
|
9b5b1d6dce | ||
|
|
c231abe13d | ||
|
|
d81f6ea1c0 | ||
|
|
1012d715b2 | ||
|
|
a1a5e21834 | ||
|
|
bc147070b6 | ||
|
|
9176ddc3e1 | ||
|
|
4f07a6592c | ||
|
|
3ad205f733 | ||
|
|
f01608f2bb | ||
|
|
fa4837c67b | ||
|
|
af466b120e | ||
|
|
ce790dcd3a | ||
|
|
e1d9a4fb53 | ||
|
|
d8483d3350 | ||
|
|
2d13588c95 | ||
|
|
acf1d6b1ac | ||
|
|
2ac1e0ed49 | ||
|
|
0a0389ad56 |
18
CHANGELOG.md
18
CHANGELOG.md
@@ -1,6 +1,22 @@
|
||||
# Changelog
|
||||
|
||||
## 2.7.2 (2022-10-22)
|
||||
## 2.7.4 (2022-10-29)
|
||||
|
||||
### Changes
|
||||
- Add 2 months expiration preset [#8687]
|
||||
- CLI: Add Unicode support on Windows [#8618]
|
||||
|
||||
### Fixes
|
||||
- Fix crash on macOS when unlocking database [#8676]
|
||||
- Fix display of passwords in preview panel [#8633]
|
||||
- Fix clicking links in entry preview panel [#8644]
|
||||
- Prevent expired entries search if no results returned [#8643]
|
||||
- Browser: Revert code causing connection problems [#8665]
|
||||
- Browser: Fix socket file symbolic link on Linux [#8656]
|
||||
- Flatpak: Fix launching browser proxy service [#8680]
|
||||
- SSH Agent: Fix paegent support on Windows [#8619]
|
||||
|
||||
## 2.7.3 (2022-10-23)
|
||||
|
||||
### Changes
|
||||
- Enhance Tags Support and Add Saved Searches [#8435, #8607]
|
||||
|
||||
@@ -119,7 +119,7 @@ endif()
|
||||
|
||||
set(KEEPASSXC_VERSION_MAJOR "2")
|
||||
set(KEEPASSXC_VERSION_MINOR "7")
|
||||
set(KEEPASSXC_VERSION_PATCH "2")
|
||||
set(KEEPASSXC_VERSION_PATCH "4")
|
||||
set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION_MAJOR}.${KEEPASSXC_VERSION_MINOR}.${KEEPASSXC_VERSION_PATCH}")
|
||||
set(OVERRIDE_VERSION "" CACHE STRING "Override the KeePassXC Version for Snapshot builds")
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ To compile from source, open a **Terminal (Linux/MacOS)**, the **MSVC Tools Comm
|
||||
git pull
|
||||
```
|
||||
|
||||
For a stable build, it is recommended to check out the `latest` branch.
|
||||
For a stable build, it is recommended to check out the `latest` tag.
|
||||
|
||||
```
|
||||
git checkout latest
|
||||
|
||||
@@ -51,7 +51,7 @@ BUILD_PLUGINS="all"
|
||||
INSTALL_PREFIX="/usr/local"
|
||||
ORIG_BRANCH=""
|
||||
ORIG_CWD="$(pwd)"
|
||||
MACOSX_DEPLOYMENT_TARGET=10.13
|
||||
MACOSX_DEPLOYMENT_TARGET=10.15
|
||||
TIMESTAMP_SERVER="http://timestamp.sectigo.com"
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
@@ -290,8 +290,8 @@ if ($Merge) {
|
||||
Invoke-Cmd "tx" "pull -af --minimum-perc=60 --parallel -r keepassxc.share-translations-keepassxc-en-ts--develop"
|
||||
|
||||
# Only commit if there are changes
|
||||
& git diff-index --quiet HEAD --
|
||||
if ($LASTEXITCODE) {
|
||||
$changes = & git status --porcelain
|
||||
if ($changes.Length -gt 0) {
|
||||
Write-Host "Committing translation updates..."
|
||||
Invoke-Cmd "git" "add -A ./share/translations/" -quiet
|
||||
Invoke-Cmd "git" "commit -m `"Update translations`"" -quiet
|
||||
@@ -313,7 +313,10 @@ if ($Merge) {
|
||||
}
|
||||
|
||||
Write-Host "Creating tag for '$Version'..."
|
||||
Invoke-Cmd "git" "tag -a `"$Version`" -m `"Release $Version`" -m `"$Changelog`" -s" -quiet
|
||||
$tmp = New-TemporaryFile
|
||||
"Release $Version`n$Changelog" | Out-File $tmp.FullName
|
||||
Invoke-Cmd "git" "tag -a `"$Version`" -F `"$tmp`" -s" -quiet
|
||||
Remove-Item $tmp.FullName -Force
|
||||
|
||||
Write-Host "Moving latest tag..."
|
||||
Invoke-Cmd "git" "tag -f -a `"latest`" -m `"Latest stable release`" -s" -quiet
|
||||
@@ -426,8 +429,8 @@ if ($Merge) {
|
||||
# SIG # Begin signature block
|
||||
# MIIkvgYJKoZIhvcNAQcCoIIkrzCCJKsCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
|
||||
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
|
||||
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUnpid/gstN4AYrCj6S7yIdM81
|
||||
# ooyggh6mMIIFOjCCBCKgAwIBAgIQWKLXLYzA/YnM/yHg1O3HSjANBgkqhkiG9w0B
|
||||
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUccSicCrmJ6HTiKZr9ZV5mT6i
|
||||
# 9sqggh6mMIIFOjCCBCKgAwIBAgIQWKLXLYzA/YnM/yHg1O3HSjANBgkqhkiG9w0B
|
||||
# AQsFADB8MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVy
|
||||
# MRAwDgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxJDAi
|
||||
# BgNVBAMTG1NlY3RpZ28gUlNBIENvZGUgU2lnbmluZyBDQTAeFw0yMTAzMTUwMDAw
|
||||
@@ -596,29 +599,29 @@ if ($Merge) {
|
||||
# dGlnbyBSU0EgQ29kZSBTaWduaW5nIENBAhBYotctjMD9icz/IeDU7cdKMAkGBSsO
|
||||
# AwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEM
|
||||
# BgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqG
|
||||
# SIb3DQEJBDEWBBSZJ80qMlLk4Zhy/gTyz1Eiqy6OwTANBgkqhkiG9w0BAQEFAASC
|
||||
# AQB+oJYmsNbzil5lp3gzcbEM1xPjk2TZW2ScDiE7Fnlj6rK974qG3WSivwDDVdIV
|
||||
# zr0kwgufXZ5KxwMV2nBBVQj2rmaVLOV0HpbYgOna+o3VFGCaxK+XI0ZqP2SaIOAZ
|
||||
# fDLjyuTXaz3VG1iZyjQnjX7TLCdU8eOVMLpxJ5yL8GuCf9uGbdFC4f33oixrSebw
|
||||
# cNjl/8sDaW6wPepQZ/xoN4PM+eEYPlA9sww4VMl7nYc2dYWPdAMpHknquLjncXJQ
|
||||
# EJNs5z3un+TOKeD3zBZyAuLIAR5GoxojQXw7us0Cak5+bbL40CfS6xbvKuJoJt87
|
||||
# eJqrFFMOwP1hy/wZLIr7Ahh7oYIDTDCCA0gGCSqGSIb3DQEJBjGCAzkwggM1AgEB
|
||||
# SIb3DQEJBDEWBBQyqMslxaPRHhE8POQX8uLV4mnwLjANBgkqhkiG9w0BAQEFAASC
|
||||
# AQBhQUgt7fRTbF1rGUv7z9sdfZzNQiLWg2LYMURLZAWcZRFBW6RoP6rTSbpquyRZ
|
||||
# Bs4BlK7JkxCHBXrCeYl5qMx7b6N7twsgyz8OR+EPnYIkEoaKafeqO6B/Q0NhhdOW
|
||||
# vd0wK2YsD5Sb7135a0trAQtS+fnhRr9y9LgMHePBq3iJAo8BWtcUYF5eBbLmJjZU
|
||||
# yzu6aUlXgVakBm8fso0NqLNAVn0vQizJHqsnK610+zCVlzPQ/2HflRpwLgF4X1kQ
|
||||
# Jewj42T2kjzn1Worzcsj3v7WJgbuqThnVR1NIhi+bhfpkrCr4iC/+4QIZZLkzUHl
|
||||
# cS3DhzvxAQ62whQsUAB9z2HBoYIDTDCCA0gGCSqGSIb3DQEJBjGCAzkwggM1AgEB
|
||||
# MIGSMH0xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIx
|
||||
# EDAOBgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDElMCMG
|
||||
# A1UEAxMcU2VjdGlnbyBSU0EgVGltZSBTdGFtcGluZyBDQQIRAJA5f5rSSjoT8r2R
|
||||
# Xwg4qUMwDQYJYIZIAWUDBAICBQCgeTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcB
|
||||
# MBwGCSqGSIb3DQEJBTEPFw0yMjA5MzAxNDE0MzJaMD8GCSqGSIb3DQEJBDEyBDCc
|
||||
# JZ3ePkhATE2oLTys2mumH7O56gR5wtTAf/eMLF0Ms+v7xF2NqM+c2Cl5hRtpzQww
|
||||
# DQYJKoZIhvcNAQEBBQAEggIAY2G7lysggDTjF92DNnsp5pSnS3tjP4rUC9kv1+Ob
|
||||
# Ji1gxFqP2MO59TB6T/PVmjDWZtKNL4hJYcycIE6lNkhcajzrQ7siVTMzUVs/4JOi
|
||||
# NRWVDyCOjOu2lUIzXP1nHGo4Y51/TtH70JqtjNz7nrZR/T7IviNO/d4d/BKnG83V
|
||||
# IZttYsOVEp44ix3bBal7jRbL+axiHHfCe0vf1n8CVoxUIBjXt45Ul3nKW6oYKVwh
|
||||
# FPPm59k2DcnWinUtyIJrp19dzA0DVI3zZGwyDSVQ+yRyUkdxDfpN/mOkVqpUYrgd
|
||||
# Hh62D/2a4Zfi5nOkO6qsVuu7qrsbZOGIYKkRsFYDcQqU06TuTrfrwiqD/mo5ZdcE
|
||||
# L+vgOfYmZ1qjTLtOqsibX9Md/GbZlDF5GCkU5cGOHHYw3a7nZ8bSt/lD8KjCQ2j1
|
||||
# YcFF4+gOCBUc2IhrKzirFaM3GrZCDvP4WxTUnVun5uObockXAJiTw0trfNLulZsM
|
||||
# iuEguGBqfTuEO1VO0+UnTQEypTG4z38Asu9Pb+M9T4nQWXb1L2C5flg5hVRe/Yrp
|
||||
# skXf5zJ6Ml7VmmsxfS8cEZWaSeAmoLhpafDOpcubi4Mm8s13naOBe8Kyu+FUt+d9
|
||||
# dBrC6BZUwXbhdbJIbpHfdF55iT3nzZ9Wsim6284NcnM9Ca3kZ+/SogSO+/Tjl5Ak
|
||||
# hfc=
|
||||
# MBwGCSqGSIb3DQEJBTEPFw0yMjEwMjMxMzE4MTZaMD8GCSqGSIb3DQEJBDEyBDAi
|
||||
# pcegfL2b7n0V2o/qV4vNL3exKvlIIxuSCCqMkqibj2h04kPtwOkjhJ064uMHSwcw
|
||||
# DQYJKoZIhvcNAQEBBQAEggIAWMkT++gXvrUNBmS62Sw9TekX6fEKJIOFwLHO5wzh
|
||||
# AdBv/NavsMLB+PNrKizKLL02+Q9v+kyKaeFFlReWa50S+meM2L+wW5YRMGggBKRB
|
||||
# Xhos4qL0ZffKPDbrjmCW0+HdRj408yyNCNB5aPSS6ZLjPpSa6mqVyySfnSdZnyaC
|
||||
# zXYQ2Y4qD3JGSk1MbRvCYB+jCaMM4unyJAS4IA6nWQ97184KLm5U2ktn9ygeWLlG
|
||||
# ujQ2plQ7HuHD+/rMSqesQT6OcwGtERYyfDs+hndpONjKBIulbJJDM1mN6uLQpkfZ
|
||||
# f/TPTZQBDx6EA1oUZ3Evx4cReQFZJjnVlsAJBnKmu3mHheisdlxuFv1DZfu2OD/M
|
||||
# nqY2DeCCgmeC212fosI8ZHUupaKRXVjfcVNElt34lK+3FMzYSKr6rCxiFEXbjq8u
|
||||
# WTG45ZMmcLzs7l9Yaz0eTc642SyBa+5OoTTXs3t9G5z9lVbGonOhfGVbJM+l8JNc
|
||||
# txM+CnQt/OOcjTMDKcjOwG9gcxHjYQhpK8PKiXmPmgpaGYn5vCL5fLvR+s+vTsm4
|
||||
# DJjUTHY87VVXt2IwOu45n1+RBJynewLeaXkwo+79R+/Dn/xoqVVGLRRU6c3yCIiW
|
||||
# qKmsdlIziAr/Fou7jzKcaPFhVJ/NMsI/2c8bkfi6Baoh+go3j39nA3/oDtb4vHWk
|
||||
# Y2E=
|
||||
# SIG # End signature block
|
||||
|
||||
@@ -59,7 +59,22 @@
|
||||
</screenshots>
|
||||
|
||||
<releases>
|
||||
<release version="2.7.2" date="2022-10-22">
|
||||
<release version="2.7.4" date="2022-10-29">
|
||||
<description>
|
||||
<ul>
|
||||
<li>Add 2 months expiration preset [#8687]</li>
|
||||
<li>CLI: Add Unicode support on Windows [#8618]</li>
|
||||
<li>Fix crash on macOS when unlocking database [#8676]</li>
|
||||
<li>Fix display of passwords in preview panel [#8633]</li>
|
||||
<li>Fix clicking links in entry preview panel [#8644]</li>
|
||||
<li>Prevent expired entries search if no results returned [#8643]</li>
|
||||
<li>Browser: Revert code causing connection problems [#8665]</li>
|
||||
<li>Browser: Fix socket file symbolic link on Linux [#8656]</li>
|
||||
<li>Flatpak: Fix launching browser proxy service [#8680]</li>
|
||||
<li>SSH Agent: Fix paegent support on Windows [#8619]</li>
|
||||
</ul>
|
||||
</description
|
||||
<release version="2.7.3" date="2022-10-23">
|
||||
<description>
|
||||
<ul>
|
||||
<li>Enhance Tags Support and Add Saved Searches [#8435, #8607]</li>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source>
|
||||
<translation>Reporteu errors a: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation>
|
||||
<translation>Informeu d'errors a: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
|
||||
@@ -50,7 +50,7 @@
|
||||
<name>AccessControlDialog</name>
|
||||
<message>
|
||||
<source>KeePassXC - Access Request</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>KeePassXC - Sol·licitud d'accés</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Non-existing/inaccessible executable path. Please double-check the client is legit.</source>
|
||||
@@ -78,7 +78,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Details</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Detalls</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remember</source>
|
||||
@@ -94,18 +94,18 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Deny All && Future</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Denegar-ho tot & Futur</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Allow All && &Future</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Permet-ho tot & Futur</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>AccessControlDialog::DenyButton</name>
|
||||
<message>
|
||||
<source>Deny for this program</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Denega per a aquest programa</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -116,7 +116,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Use Pageant</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Usa Pageant</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use OpenSSH</source>
|
||||
@@ -124,7 +124,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>SSH_AUTH_SOCK override</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>SSH_AUTH_SOCK override</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SSH_AUTH_SOCK value</source>
|
||||
@@ -140,7 +140,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>SSH_SK_PROVIDER override</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>SSH_SK_PROVIDER override</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No SSH Agent socket available. Either make sure SSH_AUTH_SOCK environment variable exists or set an override.</source>
|
||||
@@ -150,12 +150,16 @@
|
||||
<source>SSH Agent connection is working!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use both agents</source>
|
||||
<translation>Usa ambdós agents</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidget</name>
|
||||
<message>
|
||||
<source>Application Settings</source>
|
||||
<translation>Configuració de l'aplicació</translation>
|
||||
<translation>Paràmetres de l'aplicació</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>General</source>
|
||||
@@ -221,6 +225,10 @@
|
||||
<source>Select backup storage directory</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>This setting cannot be enabled when minimize on unlock is enabled.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidgetGeneral</name>
|
||||
@@ -270,12 +278,12 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>On database unlock, show entries that </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Al desbloquejar la base de dades, mostra les entrades que </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>have expired</source>
|
||||
<comment>On database unlock, show entries that...</comment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ha caducat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> days</source>
|
||||
@@ -406,7 +414,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Use monospaced font for notes</source>
|
||||
<translation>Usa lletra monoespaiada per a les notes</translation>
|
||||
<translation>Fer servir fonts monoespaiada per les notes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Minimize instead of app exit</source>
|
||||
@@ -489,6 +497,14 @@
|
||||
<source>Remember last typed entry for:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source> recent files</source>
|
||||
<translation> fitxers recents</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show passwords in color</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidgetSecurity</name>
|
||||
@@ -587,7 +603,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-Type Error</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Error de tecleig automàtic</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Permission Required</source>
|
||||
@@ -603,7 +619,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid entry provided</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Entrada proporcionada no vàlida</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bracket imbalance detected, found extra { or }</source>
|
||||
@@ -638,6 +654,10 @@
|
||||
<source>Invalid placeholder: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Entry does not have attribute for PICKCHARS: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>AutoTypeAssociationsModel</name>
|
||||
@@ -685,7 +705,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Sequence aborted: Caps Lock is on</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Seqüència avortada: el bloqueig de majúscules està activat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sequence aborted: Modifier keys held by user</source>
|
||||
@@ -717,11 +737,11 @@ Ctrl+4 - Use Virtual Keyboard (Windows Only)</p></source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Search all open databases</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Cerca totes les bases de dades obertes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Search…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Cerca...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type Sequence</source>
|
||||
@@ -745,19 +765,19 @@ Ctrl+4 - Use Virtual Keyboard (Windows Only)</p></source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy Username</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Copia el nom d'usuari</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy Password</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Copia la contrasenya</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Copia TOTP</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use Virtual Keyboard</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Utilitza el teclat virtual</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -784,11 +804,11 @@ Ctrl+4 - Use Virtual Keyboard (Windows Only)</p></source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Allow Selected</source>
|
||||
<translation>Permet els seleccionats</translation>
|
||||
<translation>Permet la selecció</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Deny All</source>
|
||||
<translation>Denega-ho tot</translation>
|
||||
<translation>Denegar tot</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Disable for this site</source>
|
||||
@@ -1075,7 +1095,7 @@ Would you like to migrate your existing settings now?</source>
|
||||
<message>
|
||||
<source>Browse…</source>
|
||||
<extracomment>Button for opening file dialog</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Explora...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use a custom browser configuration location:</source>
|
||||
@@ -1409,10 +1429,6 @@ Còpia de seguretat de la base de dades situada a %2</translation>
|
||||
<source>Key File:</source>
|
||||
<translation>Fitxer clau:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database's security settings.</p><p>This is <strong>not</strong> your *.kdbx database file!<br>If you do not have a key file, leave this field empty.</p><p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key file help</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1425,18 +1441,13 @@ Còpia de seguretat de la base de dades situada a %2</translation>
|
||||
<source>Hardware Key:</source>
|
||||
<translation>Motxilla:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>You can use a hardware security key such as a <strong>YubiKey</strong> or <strong>OnlyKey</strong> with slots configured for HMAC-SHA1.</p>
|
||||
<p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hardware key help</source>
|
||||
<translation>Ajuda de la motxilla</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key file to unlock the database</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fitxer clau per desbloquejar la base de dades</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse for key file</source>
|
||||
@@ -1444,7 +1455,7 @@ Còpia de seguretat de la base de dades situada a %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Explora...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Refresh hardware tokens</source>
|
||||
@@ -1456,7 +1467,7 @@ Còpia de seguretat de la base de dades situada a %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unlock Database</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Desbloqueja la base de dades</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cancel</source>
|
||||
@@ -1464,7 +1475,7 @@ Còpia de seguretat de la base de dades situada a %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unlock</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Desbloqueja</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please present or touch your YubiKey to continue…</source>
|
||||
@@ -1490,7 +1501,7 @@ We recommend you update your KeePassXC installation.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database unlock canceled.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Desbloqueig de la base de dades cancel·lat.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unlock failed and no password given</source>
|
||||
@@ -1564,6 +1575,15 @@ If you do not have a key file, please leave the field empty.</source>
|
||||
<source>Select hardware key…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database's security settings.</p><p>This is <strong>not</strong> your *.kdbx database file!<br>If you do not have a key file, leave this field empty.</p><p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>You can use a hardware security key such as a <strong>YubiKey</strong> or <strong>OnlyKey</strong> with slots configured for HMAC-SHA1.</p>
|
||||
<p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DatabaseSettingWidgetMetaData</name>
|
||||
@@ -1588,7 +1608,7 @@ If you do not have a key file, please leave the field empty.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database Credentials</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Credencials de la base de dades</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Encryption Settings</source>
|
||||
@@ -1643,7 +1663,7 @@ If you do not have a key file, please leave the field empty.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove</source>
|
||||
<translation>Suprimeix</translation>
|
||||
<translation>Suprimiu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete the selected key?</source>
|
||||
@@ -2203,13 +2223,21 @@ This is definitely a bug, please report it to the developers.</source>
|
||||
<comment>Database tab name modifier</comment>
|
||||
<translation>%1 [bloquejat]</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Export database to XML file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>XML file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Writing the XML file failed</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DatabaseWidget</name>
|
||||
<message>
|
||||
<source>Database Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Searching…</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -2256,7 +2284,7 @@ This is definitely a bug, please report it to the developers.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expired entries</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Entrades caducades</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No current database.</source>
|
||||
@@ -2376,6 +2404,22 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
|
||||
<source>Entries expiring within %1 day(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Searches and Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter a unique name or overwrite an existing search from the list:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save</source>
|
||||
<translation>Desa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditEntryWidget</name>
|
||||
@@ -2512,10 +2556,6 @@ Would you like to correct it?</source>
|
||||
<source>Hide</source>
|
||||
<translation>Oculta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tomorrow</source>
|
||||
<translation>Demà</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%n week(s)</source>
|
||||
<translation><numerusform>% n setmana/es</numerusform><numerusform>%n setmana/es</numerusform></translation>
|
||||
@@ -2528,6 +2568,10 @@ Would you like to correct it?</source>
|
||||
<source>%n year(s)</source>
|
||||
<translation><numerusform>% n any/s</numerusform><numerusform>%n any/s</numerusform></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%n hour(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditEntryWidgetAdvanced</name>
|
||||
@@ -2915,7 +2959,7 @@ Would you like to correct it?</source>
|
||||
<message>
|
||||
<source>Browse…</source>
|
||||
<extracomment>Button for opening file dialog</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Explora...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Attachment</source>
|
||||
@@ -3043,6 +3087,14 @@ Would you like to correct it?</source>
|
||||
<source>Do not use HTTP Auth toggle for this and sub groups</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Omit WWW subdomain from matching:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Omit WWW subdomain from matching toggle for this and sub groups</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditGroupWidgetKeeShare</name>
|
||||
@@ -3076,7 +3128,7 @@ Would you like to correct it?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Explora...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear fields</source>
|
||||
@@ -3624,6 +3676,10 @@ Error: %1</source>
|
||||
<source>Auto-Type</source>
|
||||
<translation>Compleció automàtica</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EntryModel</name>
|
||||
@@ -3730,14 +3786,14 @@ Error: %1</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Has TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Disposa de TOTP</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EntryPreviewWidget</name>
|
||||
<message>
|
||||
<source>Display current TOTP value</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Mostra el valor actual de TOTP</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Close</source>
|
||||
@@ -3831,6 +3887,10 @@ Error: %1</source>
|
||||
<source>Disabled</source>
|
||||
<translation>Inhabilitat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Double click to copy value</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EntryURLModel</name>
|
||||
@@ -4748,7 +4808,7 @@ If this reoccurs, then your database file may be corrupt.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Note: Do NOT use a file that may change as that will prevent you from unlocking your database.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Nota: NO utilitzeu un fitxer que pugui canviar, ja que us impedirà desbloquejar la base de dades.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse for key file</source>
|
||||
@@ -4756,7 +4816,7 @@ If this reoccurs, then your database file may be corrupt.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Explora...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Old key file format</source>
|
||||
@@ -5000,7 +5060,7 @@ Are you sure you want to continue with this file?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database &Reports…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Informes de la base de dades</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Statistics, health check, etc.</source>
|
||||
@@ -5072,11 +5132,11 @@ Are you sure you want to continue with this file?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Lock Database</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>B&loqueja la base de dades</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Lock &All Databases</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Bloqueja totes les bases de dades</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Title</source>
|
||||
@@ -5140,11 +5200,11 @@ Are you sure you want to continue with this file?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show QR Code</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Mostra el codi QR</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set up TOTP…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Configura el TOTP...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy &TOTP</source>
|
||||
@@ -5192,7 +5252,7 @@ Are you sure you want to continue with this file?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Database Backup…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Desa una còpia de seguretat...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Add key to SSH Agent</source>
|
||||
@@ -5216,11 +5276,11 @@ Are you sure you want to continue with this file?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Dark</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fosc</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Classic (Platform-native)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Clàssic (natiu de la plataforma)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show Toolbar</source>
|
||||
@@ -5314,6 +5374,30 @@ We recommend you use the AppImage available on our downloads page.</source>
|
||||
<source>You must restart the application to apply this setting. Would you like to restart now?</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>No Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 Entry(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy Password and TOTP</source>
|
||||
<translation>Copia la contrasenya i el TOTP</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&XML File…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>XML File…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ManageDatabase</name>
|
||||
@@ -5463,7 +5547,7 @@ We recommend you use the AppImage available on our downloads page.</source>
|
||||
<name>NewDatabaseWizardPageDatabaseKey</name>
|
||||
<message>
|
||||
<source>Database Credentials</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Credencials de la base de dades</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A set of credentials known only to you that protects your database.</source>
|
||||
@@ -5684,29 +5768,6 @@ We recommend you use the AppImage available on our downloads page.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PasswordEdit</name>
|
||||
<message>
|
||||
<source>Passwords do not match</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Passwords match so far</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toggle Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Caps Lock enabled!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PasswordEditWidget</name>
|
||||
<message>
|
||||
@@ -5885,10 +5946,6 @@ We recommend you use the AppImage available on our downloads page.</source>
|
||||
<source>Also choose from:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excluded characters: "0", "1", "l", "I", "O", "|", "﹒"</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exclude look-alike characters</source>
|
||||
<translation>Excloure caràcters d'aspecte semblant</translation>
|
||||
@@ -6038,6 +6095,57 @@ Do you want to overwrite it?</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Excel·lent</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excluded characters: "0", "1", "l", "I", "O", "|", "﹒"</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PasswordWidget</name>
|
||||
<message>
|
||||
<source>Passwords do not match</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Passwords match so far</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toggle Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Caps Lock enabled!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Quality: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Poor</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Pobre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Weak</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Feble</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Good</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Bona</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excellent</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Excel·lent</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PickcharsDialog</name>
|
||||
@@ -6382,7 +6490,7 @@ Do you want to overwrite it?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy the current TOTP to the clipboard (equivalent to "-a totp").</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Copia el TOTP actual al porta-retalls (equivalent a "-a totp").</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Must match only one entry, otherwise a list of possible matches is shown.</source>
|
||||
@@ -6419,11 +6527,11 @@ Do you want to overwrite it?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>ERROR: Please specify one of --attribute or --totp, not both.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ERROR: Especifiqueu un, --atribut o --totp, no tots dos.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Entry with path %1 has no TOTP set up.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>L'entrada amb la ruta %1 no té configurat TOTP.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>ERROR: attribute %1 is ambiguous, it matches %2.</source>
|
||||
@@ -7095,7 +7203,7 @@ Available commands:
|
||||
</message>
|
||||
<message>
|
||||
<source>Show the entry's current TOTP.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Mostra el TOTP actual de l'entrada.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show the protected attributes in clear text.</source>
|
||||
@@ -7168,10 +7276,6 @@ Please consider generating a new key file.</source>
|
||||
<source>Invalid YubiKey serial %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please present or touch your YubiKey to continue…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter password to encrypt database (optional): </source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -7319,7 +7423,7 @@ Nucli: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Quick Unlock</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Desbloqueig ràpid</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Secret Service Integration</source>
|
||||
@@ -7545,11 +7649,11 @@ Nucli: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browser Statistics</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Estadístiques del navegador</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Health Check</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Informe de salut</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>HIBP</source>
|
||||
@@ -7557,7 +7661,7 @@ Nucli: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Statistics</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Estadístiques</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unsupported key file version: %1</source>
|
||||
@@ -7589,7 +7693,7 @@ Nucli: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>lock all open databases</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>bloqueja totes les bases de dades obertes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>key file of the database</source>
|
||||
@@ -7605,11 +7709,11 @@ Nucli: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Locked databases.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Bases de dades bloquejades.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database failed to lock.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>La base de dades no s'ha pogut bloquejar.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Another instance of KeePassXC is already running.</source>
|
||||
@@ -7649,6 +7753,67 @@ Nucli: %3 %4</translation>
|
||||
<source>Failed to sign challenge using Windows Hello.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please present or touch your YubiKey to continue.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show all the attributes of the entry.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Edit a database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not change the database key.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database was not modified.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Successfully edited the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Loading the new key file failed: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unset the password for the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unset the key file for the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot use %1 and %2 at the same time.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot remove all the keys from a database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot remove password: The database does not have a password.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot remove file key: The database does not have a file key.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Found unexpected Key type %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the key file for the database.
|
||||
This options is deprecated, use --set-key-file instead.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QtIOCompressor</name>
|
||||
@@ -8196,6 +8361,10 @@ Nucli: %3 %4</translation>
|
||||
<source>Limit search to selected group</source>
|
||||
<translation>Limitar la cerca al grup seleccionat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsClientModel</name>
|
||||
@@ -8408,16 +8577,39 @@ Nucli: %3 %4</translation>
|
||||
</context>
|
||||
<context>
|
||||
<name>TagModel</name>
|
||||
<message>
|
||||
<source>All</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expired</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Caducades</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Weak Passwords</source>
|
||||
<translation>Contrasenyes febles</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>All Entries</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TagView</name>
|
||||
<message>
|
||||
<source>Remove Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove Tag</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Confirm Remove Tag</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove tag "%1" from all entries in this database?</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
@@ -8449,7 +8641,7 @@ Nucli: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>There was an error creating the QR code.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Hi hagut un error creant el codi QR</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Closing in %1 seconds.</source>
|
||||
@@ -8517,7 +8709,7 @@ Nucli: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid TOTP Secret</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Secret de TOTP no vàlid</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>You have entered an invalid secret key. The key must be in Base32 format.
|
||||
@@ -8526,7 +8718,7 @@ Example: JBSWY3DPEHPK3PXP</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Confirm Remove TOTP Settings</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Confirma l'eliminació de la configuració de TOTP</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Are you sure you want to delete TOTP settings for this entry?</source>
|
||||
|
||||
@@ -278,7 +278,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>On database unlock, show entries that </source>
|
||||
<translation>Ved åbning af database, hvis punkter der</translation>
|
||||
<translation>Ved åbning af database, vis punkter der</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>have expired</source>
|
||||
@@ -293,7 +293,7 @@
|
||||
<message>
|
||||
<source>will expire within </source>
|
||||
<comment>On database unlock, show entries that...</comment>
|
||||
<translation>vil udløbe inden for</translation>
|
||||
<translation>vil udløbe inden for </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File Management</source>
|
||||
@@ -1040,7 +1040,7 @@ Vil du migrere dine eksisterende indstillinger nu?</translation>
|
||||
<message>
|
||||
<source>Search in all opened databases for matching credentials</source>
|
||||
<extracomment>Credentials mean login data requested via browser extension</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Søg i alle åbne databaser for matchende legitimationsoplysninger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Advanced</source>
|
||||
@@ -1105,7 +1105,7 @@ Vil du migrere dine eksisterende indstillinger nu?</translation>
|
||||
<message>
|
||||
<source>Browse…</source>
|
||||
<extracomment>Button for opening file dialog</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Gennemse…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use a custom browser configuration location:</source>
|
||||
@@ -1432,7 +1432,7 @@ Backup database located at %2</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter Additional Credentials (if any):</source>
|
||||
<translation>Angiv yderligere legitimationsoplysninger (hvis nogen):</translation>
|
||||
<translation>Angiv yderligere legitimationsoplysninger (hvis der er nogen):</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key File:</source>
|
||||
@@ -1460,11 +1460,11 @@ Backup database located at %2</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse for key file</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Find nøglefil</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Gennemse…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Refresh hardware tokens</source>
|
||||
@@ -2045,7 +2045,7 @@ If you keep this number, your database will not be protected from brute force at
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable compression (recommended)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Aktiver komprimering (anbefales)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete Recycle Bin</source>
|
||||
@@ -2258,7 +2258,7 @@ Det er helt sikkert en fejl. Rapportér det venligst til udviklerne.</translatio
|
||||
<name>DatabaseWidget</name>
|
||||
<message>
|
||||
<source>Searching…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Søger…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Shared group…</source>
|
||||
@@ -2424,7 +2424,7 @@ Så sikre gem fra og prøv igen?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Searches and Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Søgninger og etiketter</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter a unique name or overwrite an existing search from the list:</source>
|
||||
@@ -2436,7 +2436,7 @@ Så sikre gem fra og prøv igen?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Search</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Gem søgning</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2865,11 +2865,11 @@ Would you like to correct it?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expiration field</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Udløbsfelt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expiration Presets</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Forudindstillinger for udløb</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expiration presets</source>
|
||||
@@ -2921,11 +2921,11 @@ Would you like to correct it?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Mærker:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags list</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Etiketteliste</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2977,7 +2977,7 @@ Would you like to correct it?</source>
|
||||
<message>
|
||||
<source>Browse…</source>
|
||||
<extracomment>Button for opening file dialog</extracomment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Gennemse…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Attachment</source>
|
||||
@@ -3146,7 +3146,7 @@ Would you like to correct it?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Gennemse…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear fields</source>
|
||||
@@ -3243,7 +3243,7 @@ Supported extensions are: %1.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expiration field</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Udløbsfelt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use default Auto-Type sequence of parent group</source>
|
||||
@@ -3298,7 +3298,7 @@ Supported extensions are: %1.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Choose icon…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Vælg ikon…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the URL to use to search for a favicon</source>
|
||||
@@ -3417,7 +3417,7 @@ Supported extensions are: %1.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Plugin Data</source>
|
||||
<translation>Plugindata</translation>
|
||||
<translation>Plugin-data</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Plugin data</source>
|
||||
@@ -3503,11 +3503,11 @@ Det kan få de påvirkede plugins til at svigte.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Rename selected attachment</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Omdøb valgte vedhæftning</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Rename</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Omdøb</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open selected attachment</source>
|
||||
@@ -3639,11 +3639,11 @@ Error: %1</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Age</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Alder</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Difference</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Forskel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Size</source>
|
||||
@@ -3703,7 +3703,7 @@ Error: %1</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Etiketter</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -3842,11 +3842,11 @@ Error: %1</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Etiketter</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags list</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Etiketteliste</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Username</source>
|
||||
@@ -4842,11 +4842,11 @@ If this reoccurs, then your database file may be corrupt.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse for key file</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Find nøglefil</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Gennemse…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Old key file format</source>
|
||||
@@ -4920,7 +4920,7 @@ Meddelelse: %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Suspicious Key File</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Mistænkelig nøglefil</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The chosen key file looks like a password database file. A key file must be a static file that never changes or you will lose access to your database forever.
|
||||
@@ -5407,11 +5407,11 @@ We recommend you use the AppImage available on our downloads page.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Etiketter</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ingen etiketter</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 Entry(s)</source>
|
||||
@@ -6606,7 +6606,7 @@ Do you want to overwrite it?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Deactivate password key for the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Deaktiver adgangsnøglen til databasen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Yubikey slot and optional serial used to access the database (e.g., 1:7370001).</source>
|
||||
@@ -6985,7 +6985,7 @@ Do you want to overwrite it?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Description: </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Beskrivelse: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cipher: </source>
|
||||
@@ -6997,7 +6997,7 @@ Do you want to overwrite it?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Recycle bin is enabled.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Papirkurv er aktiveret.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Recycle bin is not enabled.</source>
|
||||
@@ -7049,7 +7049,7 @@ Do you want to overwrite it?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maximum password reuse</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Maksimalt genbrug af adgangskoder</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Number of short passwords</source>
|
||||
@@ -7951,7 +7951,7 @@ This options is deprecated, use --set-key-file instead.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Edit Entry…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Rediger post…</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Delete Entry(s)…</source>
|
||||
@@ -8037,7 +8037,7 @@ This options is deprecated, use --set-key-file instead.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Edit Entry…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Rediger post…</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Delete Entry(s)…</source>
|
||||
@@ -8132,7 +8132,7 @@ This options is deprecated, use --set-key-file instead.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Edit Entry…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Rediger post…</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Delete Entry(s)…</source>
|
||||
@@ -8227,7 +8227,7 @@ This options is deprecated, use --set-key-file instead.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maximum password reuse</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Maksimalt genbrug af adgangskoder</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Some passwords are used more than three times. Use unique passwords when possible.</source>
|
||||
@@ -8385,7 +8385,7 @@ This options is deprecated, use --set-key-file instead.</source>
|
||||
<message>
|
||||
<source>Search (%1)…</source>
|
||||
<comment>Search placeholder text, %1 is the keyboard shortcut</comment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Søg (%1)…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Case sensitive</source>
|
||||
@@ -8397,7 +8397,7 @@ This options is deprecated, use --set-key-file instead.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Search</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Gem søgning</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -8621,26 +8621,26 @@ This options is deprecated, use --set-key-file instead.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>All Entries</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Alle poster</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear Search</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ryd søgning</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TagView</name>
|
||||
<message>
|
||||
<source>Remove Search</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fjern søgning</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove Tag</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fjern etikette</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Confirm Remove Tag</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Bekræft fjernelse af etikette</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove tag "%1" from all entries in this database?</source>
|
||||
|
||||
@@ -5459,7 +5459,7 @@ We recommend you use the AppImage available on our downloads page.</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 Entry(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
<translation><numerusform>%1 Entry</numerusform><numerusform>%1 Entries</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy Password and TOTP</source>
|
||||
|
||||
@@ -150,6 +150,10 @@
|
||||
<source>SSH Agent connection is working!</source>
|
||||
<translation>SSH Agent veza radi!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use both agents</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidget</name>
|
||||
@@ -221,6 +225,10 @@
|
||||
<source>Select backup storage directory</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>This setting cannot be enabled when minimize on unlock is enabled.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidgetGeneral</name>
|
||||
@@ -489,6 +497,14 @@
|
||||
<source>Remember last typed entry for:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source> recent files</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show passwords in color</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidgetSecurity</name>
|
||||
@@ -638,6 +654,10 @@
|
||||
<source>Invalid placeholder: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Entry does not have attribute for PICKCHARS: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>AutoTypeAssociationsModel</name>
|
||||
@@ -1417,10 +1437,6 @@ Sigurnosna kopija baza podataka nalazi se na %2</translation>
|
||||
<source>Key File:</source>
|
||||
<translation>Datoteka ključa:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database's security settings.</p><p>This is <strong>not</strong> your *.kdbx database file!<br>If you do not have a key file, leave this field empty.</p><p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key file help</source>
|
||||
<translation>Datoteka ključa pomoć</translation>
|
||||
@@ -1433,11 +1449,6 @@ Sigurnosna kopija baza podataka nalazi se na %2</translation>
|
||||
<source>Hardware Key:</source>
|
||||
<translation>Hardverski ključ:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>You can use a hardware security key such as a <strong>YubiKey</strong> or <strong>OnlyKey</strong> with slots configured for HMAC-SHA1.</p>
|
||||
<p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hardware key help</source>
|
||||
<translation>Hardverski ključ pomoć</translation>
|
||||
@@ -1573,6 +1584,15 @@ Ako nemate datoteku ključa, ostavite polje prazno.</translation>
|
||||
<source>Select hardware key…</source>
|
||||
<translation>Odaberite hardverski ključ...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database's security settings.</p><p>This is <strong>not</strong> your *.kdbx database file!<br>If you do not have a key file, leave this field empty.</p><p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>You can use a hardware security key such as a <strong>YubiKey</strong> or <strong>OnlyKey</strong> with slots configured for HMAC-SHA1.</p>
|
||||
<p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DatabaseSettingWidgetMetaData</name>
|
||||
@@ -2219,13 +2239,21 @@ Ovo je definitivno pogreška, molimo prijavite to programerima.</translation>
|
||||
<comment>Database tab name modifier</comment>
|
||||
<translation>%1 [Zaključano]</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Export database to XML file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>XML file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Writing the XML file failed</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DatabaseWidget</name>
|
||||
<message>
|
||||
<source>Database Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Searching…</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -2390,6 +2418,22 @@ Disable safe saves and try again?</source>
|
||||
<source>Entries expiring within %1 day(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Searches and Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter a unique name or overwrite an existing search from the list:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save</source>
|
||||
<translation>Spremi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditEntryWidget</name>
|
||||
@@ -2526,10 +2570,6 @@ Would you like to correct it?</source>
|
||||
<source>Hide</source>
|
||||
<translation>Sakrij</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tomorrow</source>
|
||||
<translation>Sutra</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%n week(s)</source>
|
||||
<translation><numerusform>%n tjedan</numerusform><numerusform>%n tjedana</numerusform><numerusform>%n tjedana</numerusform></translation>
|
||||
@@ -2542,6 +2582,10 @@ Would you like to correct it?</source>
|
||||
<source>%n year(s)</source>
|
||||
<translation><numerusform>%n godina</numerusform><numerusform>%n godine</numerusform><numerusform>%n godina</numerusform></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%n hour(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditEntryWidgetAdvanced</name>
|
||||
@@ -3057,6 +3101,14 @@ Would you like to correct it?</source>
|
||||
<source>Do not use HTTP Auth toggle for this and sub groups</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Omit WWW subdomain from matching:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Omit WWW subdomain from matching toggle for this and sub groups</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditGroupWidgetKeeShare</name>
|
||||
@@ -3638,6 +3690,10 @@ Error: %1</source>
|
||||
<source>Auto-Type</source>
|
||||
<translation>Auto-tipkanje</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EntryModel</name>
|
||||
@@ -3845,6 +3901,10 @@ Error: %1</source>
|
||||
<source>Disabled</source>
|
||||
<translation>Onemogući</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Double click to copy value</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EntryURLModel</name>
|
||||
@@ -5329,6 +5389,30 @@ We recommend you use the AppImage available on our downloads page.</source>
|
||||
<source>You must restart the application to apply this setting. Would you like to restart now?</source>
|
||||
<translation>Morate ponovno pokrenuti aplikaciju da biste primijenili tu postavku. Želite li ju ponovno pokrenuti sada?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>No Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 Entry(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy Password and TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&XML File…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>XML File…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ManageDatabase</name>
|
||||
@@ -5699,29 +5783,6 @@ We recommend you use the AppImage available on our downloads page.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PasswordEdit</name>
|
||||
<message>
|
||||
<source>Passwords do not match</source>
|
||||
<translation>Lozinke se ne podudaraju</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Passwords match so far</source>
|
||||
<translation>Lozinke se zasad podudaraju</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toggle Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate Password (%1)</source>
|
||||
<translation>Proizvedi Lozinku (%1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Caps Lock enabled!</source>
|
||||
<translation>Upozorenje: Caps Lock uključen!</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PasswordEditWidget</name>
|
||||
<message>
|
||||
@@ -5900,10 +5961,6 @@ We recommend you use the AppImage available on our downloads page.</source>
|
||||
<source>Also choose from:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excluded characters: "0", "1", "l", "I", "O", "|", "﹒"</source>
|
||||
<translation>Izostavi znakove: "0", "1", "l", "I", "O", "|", "".</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exclude look-alike characters</source>
|
||||
<translation>Izostavi slične znakove</translation>
|
||||
@@ -6053,6 +6110,57 @@ Do you want to overwrite it?</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Izvrsna</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excluded characters: "0", "1", "l", "I", "O", "|", "﹒"</source>
|
||||
<translation>Izostavi znakove: "0", "1", "l", "I", "O", "|", "".</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PasswordWidget</name>
|
||||
<message>
|
||||
<source>Passwords do not match</source>
|
||||
<translation>Lozinke se ne podudaraju</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Passwords match so far</source>
|
||||
<translation>Lozinke se zasad podudaraju</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toggle Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate Password (%1)</source>
|
||||
<translation>Proizvedi Lozinku (%1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Caps Lock enabled!</source>
|
||||
<translation>Upozorenje: Caps Lock uključen!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Quality: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Poor</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>bijedna</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Weak</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Slaba</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Good</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Dobra</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excellent</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Izvrsna</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PickcharsDialog</name>
|
||||
@@ -7185,10 +7293,6 @@ Please consider generating a new key file.</source>
|
||||
<source>Invalid YubiKey serial %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please present or touch your YubiKey to continue…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter password to encrypt database (optional): </source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -7664,6 +7768,67 @@ Kernel: %3 %4</source>
|
||||
<source>Failed to sign challenge using Windows Hello.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please present or touch your YubiKey to continue.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show all the attributes of the entry.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Edit a database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not change the database key.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database was not modified.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Successfully edited the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Loading the new key file failed: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unset the password for the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unset the key file for the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot use %1 and %2 at the same time.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot remove all the keys from a database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot remove password: The database does not have a password.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot remove file key: The database does not have a file key.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Found unexpected Key type %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the key file for the database.
|
||||
This options is deprecated, use --set-key-file instead.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QtIOCompressor</name>
|
||||
@@ -8211,6 +8376,10 @@ Kernel: %3 %4</source>
|
||||
<source>Limit search to selected group</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsClientModel</name>
|
||||
@@ -8423,10 +8592,6 @@ Kernel: %3 %4</source>
|
||||
</context>
|
||||
<context>
|
||||
<name>TagModel</name>
|
||||
<message>
|
||||
<source>All</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expired</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -8435,6 +8600,33 @@ Kernel: %3 %4</source>
|
||||
<source>Weak Passwords</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>All Entries</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TagView</name>
|
||||
<message>
|
||||
<source>Remove Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove Tag</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Confirm Remove Tag</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove tag "%1" from all entries in this database?</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TotpDialog</name>
|
||||
|
||||
@@ -5293,7 +5293,7 @@ Weet je zeker dat je dit bestand wilt gebruiken?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Getting Started</source>
|
||||
<translation>Aan de sla&g</translation>
|
||||
<translation>Snelstart&gids</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Getting Started Guide</source>
|
||||
@@ -5417,7 +5417,7 @@ Wij raden je aan om de AppImage te gebruiken. Je kun dit bestand downloaden van
|
||||
</message>
|
||||
<message>
|
||||
<source>Check for updates on startup?</source>
|
||||
<translation>Controleren op updates na opstarten</translation>
|
||||
<translation>Bij start controleren op updates?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Would you like KeePassXC to check for updates on startup?</source>
|
||||
|
||||
@@ -150,6 +150,10 @@
|
||||
<source>SSH Agent connection is working!</source>
|
||||
<translation>Povezava s SSH agentom deluje!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use both agents</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidget</name>
|
||||
@@ -221,6 +225,10 @@
|
||||
<source>Select backup storage directory</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>This setting cannot be enabled when minimize on unlock is enabled.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidgetGeneral</name>
|
||||
@@ -489,6 +497,14 @@
|
||||
<source>Remember last typed entry for:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source> recent files</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show passwords in color</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidgetSecurity</name>
|
||||
@@ -638,6 +654,10 @@
|
||||
<source>Invalid placeholder: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Entry does not have attribute for PICKCHARS: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>AutoTypeAssociationsModel</name>
|
||||
@@ -1407,10 +1427,6 @@ Varnostna kopija baze se nahaja na %2</translation>
|
||||
<source>Key File:</source>
|
||||
<translation>Datoteka s ključi:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database's security settings.</p><p>This is <strong>not</strong> your *.kdbx database file!<br>If you do not have a key file, leave this field empty.</p><p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key file help</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1423,11 +1439,6 @@ Varnostna kopija baze se nahaja na %2</translation>
|
||||
<source>Hardware Key:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>You can use a hardware security key such as a <strong>YubiKey</strong> or <strong>OnlyKey</strong> with slots configured for HMAC-SHA1.</p>
|
||||
<p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hardware key help</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1562,6 +1573,15 @@ If you do not have a key file, please leave the field empty.</source>
|
||||
<source>Select hardware key…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database's security settings.</p><p>This is <strong>not</strong> your *.kdbx database file!<br>If you do not have a key file, leave this field empty.</p><p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>You can use a hardware security key such as a <strong>YubiKey</strong> or <strong>OnlyKey</strong> with slots configured for HMAC-SHA1.</p>
|
||||
<p>Click for more information…</p></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DatabaseSettingWidgetMetaData</name>
|
||||
@@ -2202,13 +2222,21 @@ This is definitely a bug, please report it to the developers.</source>
|
||||
<comment>Database tab name modifier</comment>
|
||||
<translation>%1 [Zaklenjeno]</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Export database to XML file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>XML file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Writing the XML file failed</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DatabaseWidget</name>
|
||||
<message>
|
||||
<source>Database Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Searching…</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -2373,6 +2401,22 @@ Disable safe saves and try again?</source>
|
||||
<source>Entries expiring within %1 day(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Searches and Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter a unique name or overwrite an existing search from the list:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save</source>
|
||||
<translation>Shrani</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditEntryWidget</name>
|
||||
@@ -2510,10 +2554,6 @@ Would you like to correct it?</source>
|
||||
<source>Hide</source>
|
||||
<translation>Skrij</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tomorrow</source>
|
||||
<translation>Jutri</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%n week(s)</source>
|
||||
<translation><numerusform>%n ted(ov)</numerusform><numerusform>%n ted(ov)</numerusform><numerusform>%n ted(ov)</numerusform><numerusform>%n teden(ov)</numerusform></translation>
|
||||
@@ -2526,6 +2566,10 @@ Would you like to correct it?</source>
|
||||
<source>%n year(s)</source>
|
||||
<translation><numerusform>%n let</numerusform><numerusform>%n let</numerusform><numerusform>%n let</numerusform><numerusform>%n let</numerusform></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%n hour(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditEntryWidgetAdvanced</name>
|
||||
@@ -3041,6 +3085,14 @@ Would you like to correct it?</source>
|
||||
<source>Do not use HTTP Auth toggle for this and sub groups</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Omit WWW subdomain from matching:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Omit WWW subdomain from matching toggle for this and sub groups</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditGroupWidgetKeeShare</name>
|
||||
@@ -3623,6 +3675,10 @@ Error: %1</source>
|
||||
<source>Auto-Type</source>
|
||||
<translation>Samodejno tipkanje</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EntryModel</name>
|
||||
@@ -3830,6 +3886,10 @@ Error: %1</source>
|
||||
<source>Disabled</source>
|
||||
<translation>Onemogočen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Double click to copy value</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EntryURLModel</name>
|
||||
@@ -5319,6 +5379,30 @@ We recommend you use the AppImage available on our downloads page.</source>
|
||||
<source>You must restart the application to apply this setting. Would you like to restart now?</source>
|
||||
<translation>Če želite uporabiti to nastavitev, morate znova zagnati aplikacijo. Ali želite znova zagnati zdaj?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>No Tags</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 Entry(s)</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy Password and TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&XML File…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>XML File…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ManageDatabase</name>
|
||||
@@ -5689,29 +5773,6 @@ We recommend you use the AppImage available on our downloads page.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PasswordEdit</name>
|
||||
<message>
|
||||
<source>Passwords do not match</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Passwords match so far</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toggle Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Caps Lock enabled!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PasswordEditWidget</name>
|
||||
<message>
|
||||
@@ -5890,10 +5951,6 @@ We recommend you use the AppImage available on our downloads page.</source>
|
||||
<source>Also choose from:</source>
|
||||
<translation>Izberi tudi med:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excluded characters: "0", "1", "l", "I", "O", "|", "﹒"</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exclude look-alike characters</source>
|
||||
<translation>Izključi podobne znake</translation>
|
||||
@@ -6043,6 +6100,57 @@ Do you want to overwrite it?</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Odlična</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excluded characters: "0", "1", "l", "I", "O", "|", "﹒"</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PasswordWidget</name>
|
||||
<message>
|
||||
<source>Passwords do not match</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Passwords match so far</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toggle Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Caps Lock enabled!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Quality: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Poor</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Slabo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Weak</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Šibko</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Good</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Dobra</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excellent</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation>Odlična</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PickcharsDialog</name>
|
||||
@@ -7171,10 +7279,6 @@ Please consider generating a new key file.</source>
|
||||
<source>Invalid YubiKey serial %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please present or touch your YubiKey to continue…</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter password to encrypt database (optional): </source>
|
||||
<translation>Vnesite geslo za šifriranje baze (neobvezno): </translation>
|
||||
@@ -7652,6 +7756,67 @@ Jedro: %3 %4</translation>
|
||||
<source>Failed to sign challenge using Windows Hello.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please present or touch your YubiKey to continue.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show all the attributes of the entry.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Edit a database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not change the database key.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database was not modified.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Successfully edited the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Loading the new key file failed: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unset the password for the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unset the key file for the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot use %1 and %2 at the same time.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot remove all the keys from a database.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot remove password: The database does not have a password.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot remove file key: The database does not have a file key.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Found unexpected Key type %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the key file for the database.
|
||||
This options is deprecated, use --set-key-file instead.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QtIOCompressor</name>
|
||||
@@ -8199,6 +8364,10 @@ Jedro: %3 %4</translation>
|
||||
<source>Limit search to selected group</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsClientModel</name>
|
||||
@@ -8411,10 +8580,6 @@ Jedro: %3 %4</translation>
|
||||
</context>
|
||||
<context>
|
||||
<name>TagModel</name>
|
||||
<message>
|
||||
<source>All</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expired</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -8423,6 +8588,33 @@ Jedro: %3 %4</translation>
|
||||
<source>Weak Passwords</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>All Entries</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TagView</name>
|
||||
<message>
|
||||
<source>Remove Search</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove Tag</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Confirm Remove Tag</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove tag "%1" from all entries in this database?</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TotpDialog</name>
|
||||
|
||||
@@ -32,30 +32,16 @@ BrowserAccessControlDialog::BrowserAccessControlDialog(QWidget* parent)
|
||||
|
||||
m_ui->setupUi(this);
|
||||
|
||||
connect(m_ui->allowButton, SIGNAL(clicked()), SLOT(acceptSelections()));
|
||||
connect(m_ui->denyButton, SIGNAL(clicked()), SLOT(rejectSelections()));
|
||||
connect(this, SIGNAL(rejected()), this, SIGNAL(closed()));
|
||||
connect(m_ui->allowButton, SIGNAL(clicked()), SLOT(accept()));
|
||||
connect(m_ui->denyButton, SIGNAL(clicked()), SLOT(reject()));
|
||||
}
|
||||
|
||||
BrowserAccessControlDialog::~BrowserAccessControlDialog()
|
||||
{
|
||||
}
|
||||
|
||||
void BrowserAccessControlDialog::closeEvent(QCloseEvent* event)
|
||||
void BrowserAccessControlDialog::setItems(const QList<Entry*>& items, const QString& urlString, bool httpAuth)
|
||||
{
|
||||
// Emits closed signal when clicking X from title bar
|
||||
emit closed();
|
||||
event->accept();
|
||||
}
|
||||
|
||||
void BrowserAccessControlDialog::setItems(const QList<Entry*>& entriesToConfirm,
|
||||
const QList<Entry*>& allowedEntries,
|
||||
const QString& urlString,
|
||||
bool httpAuth)
|
||||
{
|
||||
m_entriesToConfirm = entriesToConfirm;
|
||||
m_allowedEntries = allowedEntries;
|
||||
|
||||
QUrl url(urlString);
|
||||
m_ui->siteLabel->setText(m_ui->siteLabel->text().arg(
|
||||
url.toDisplayString(QUrl::RemoveUserInfo | QUrl::RemovePath | QUrl::RemoveQuery | QUrl::RemoveFragment)));
|
||||
@@ -63,11 +49,11 @@ void BrowserAccessControlDialog::setItems(const QList<Entry*>& entriesToConfirm,
|
||||
m_ui->rememberDecisionCheckBox->setVisible(!httpAuth);
|
||||
m_ui->rememberDecisionCheckBox->setChecked(false);
|
||||
|
||||
m_ui->itemsTable->setRowCount(entriesToConfirm.count());
|
||||
m_ui->itemsTable->setRowCount(items.count());
|
||||
m_ui->itemsTable->setColumnCount(2);
|
||||
|
||||
int row = 0;
|
||||
for (const auto& entry : entriesToConfirm) {
|
||||
for (const auto& entry : items) {
|
||||
auto item = new QTableWidgetItem();
|
||||
item->setText(entry->title() + " - " + entry->username());
|
||||
item->setData(Qt::UserRole, row);
|
||||
@@ -77,23 +63,18 @@ void BrowserAccessControlDialog::setItems(const QList<Entry*>& entriesToConfirm,
|
||||
|
||||
auto disableButton = new QPushButton(tr("Disable for this site"));
|
||||
disableButton->setAutoDefault(false);
|
||||
|
||||
connect(disableButton, &QAbstractButton::pressed, [&, item] {
|
||||
emit disableAccess(item);
|
||||
m_ui->itemsTable->removeRow(item->row());
|
||||
|
||||
if (m_ui->itemsTable->rowCount() == 0) {
|
||||
emit closed();
|
||||
reject();
|
||||
}
|
||||
});
|
||||
m_ui->itemsTable->setCellWidget(row, 1, disableButton);
|
||||
|
||||
++row;
|
||||
}
|
||||
|
||||
m_ui->itemsTable->resizeColumnsToContents();
|
||||
m_ui->itemsTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
|
||||
|
||||
m_ui->allowButton->setFocus();
|
||||
}
|
||||
|
||||
@@ -102,11 +83,6 @@ bool BrowserAccessControlDialog::remember() const
|
||||
return m_ui->rememberDecisionCheckBox->isChecked();
|
||||
}
|
||||
|
||||
bool BrowserAccessControlDialog::entriesAccepted() const
|
||||
{
|
||||
return m_entriesAccepted;
|
||||
}
|
||||
|
||||
QList<QTableWidgetItem*> BrowserAccessControlDialog::getSelectedEntries() const
|
||||
{
|
||||
QList<QTableWidgetItem*> selected;
|
||||
@@ -130,19 +106,3 @@ QList<QTableWidgetItem*> BrowserAccessControlDialog::getNonSelectedEntries() con
|
||||
}
|
||||
return notSelected;
|
||||
}
|
||||
|
||||
void BrowserAccessControlDialog::acceptSelections()
|
||||
{
|
||||
auto selectedEntries = getSelectedEntries();
|
||||
|
||||
m_entriesAccepted = true;
|
||||
emit acceptEntries(selectedEntries, m_entriesToConfirm, m_allowedEntries);
|
||||
emit closed();
|
||||
}
|
||||
|
||||
void BrowserAccessControlDialog::rejectSelections()
|
||||
{
|
||||
auto rejectedEntries = getNonSelectedEntries();
|
||||
emit rejectEntries(rejectedEntries, m_entriesToConfirm);
|
||||
emit closed();
|
||||
}
|
||||
|
||||
@@ -37,28 +37,14 @@ public:
|
||||
explicit BrowserAccessControlDialog(QWidget* parent = nullptr);
|
||||
~BrowserAccessControlDialog() override;
|
||||
|
||||
void setItems(const QList<Entry*>& entriesToConfirm,
|
||||
const QList<Entry*>& allowedEntries,
|
||||
const QString& urlString,
|
||||
bool httpAuth);
|
||||
void setItems(const QList<Entry*>& items, const QString& urlString, bool httpAuth);
|
||||
bool remember() const;
|
||||
bool entriesAccepted() const;
|
||||
|
||||
QList<QTableWidgetItem*> getSelectedEntries() const;
|
||||
QList<QTableWidgetItem*> getNonSelectedEntries() const;
|
||||
|
||||
signals:
|
||||
void disableAccess(QTableWidgetItem* item);
|
||||
void acceptEntries(QList<QTableWidgetItem*> items, QList<Entry*> entriesToConfirm, QList<Entry*> allowedEntries);
|
||||
void rejectEntries(QList<QTableWidgetItem*> items, QList<Entry*> entriesToConfirm);
|
||||
void closed();
|
||||
|
||||
public slots:
|
||||
void acceptSelections();
|
||||
void rejectSelections();
|
||||
|
||||
private:
|
||||
void closeEvent(QCloseEvent* event) override;
|
||||
|
||||
private:
|
||||
QScopedPointer<Ui::BrowserAccessControlDialog> m_ui;
|
||||
|
||||
@@ -76,7 +76,7 @@ QJsonObject BrowserAction::handleAction(QLocalSocket* socket, const QJsonObject&
|
||||
} else if (action.compare("test-associate") == 0) {
|
||||
return handleTestAssociate(json, action);
|
||||
} else if (action.compare("get-logins") == 0) {
|
||||
return handleGetLogins(socket, json, action);
|
||||
return handleGetLogins(json, action);
|
||||
} else if (action.compare("generate-password") == 0) {
|
||||
return handleGeneratePassword(socket, json, action);
|
||||
} else if (action.compare("set-login") == 0) {
|
||||
@@ -231,7 +231,7 @@ QJsonObject BrowserAction::handleTestAssociate(const QJsonObject& json, const QS
|
||||
return buildResponse(action, message, newNonce);
|
||||
}
|
||||
|
||||
QJsonObject BrowserAction::handleGetLogins(QLocalSocket* socket, const QJsonObject& json, const QString& action)
|
||||
QJsonObject BrowserAction::handleGetLogins(const QJsonObject& json, const QString& action)
|
||||
{
|
||||
const QString hash = browserService()->getDatabaseHash();
|
||||
const QString nonce = json.value("nonce").toString();
|
||||
@@ -264,31 +264,19 @@ QJsonObject BrowserAction::handleGetLogins(QLocalSocket* socket, const QJsonObje
|
||||
const QString formUrl = decrypted.value("submitUrl").toString();
|
||||
const QString auth = decrypted.value("httpAuth").toString();
|
||||
const bool httpAuth = auth.compare(TRUE_STR) == 0;
|
||||
auto requestId = decrypted.value("requestID").toString();
|
||||
|
||||
if (browserService()->isAccessConfirmRequested()) {
|
||||
auto errorReply = getErrorReply(action, ERROR_KEEPASS_ACTION_CANCELLED_OR_DENIED);
|
||||
|
||||
if (!requestId.isEmpty()) {
|
||||
errorReply["requestID"] = requestId;
|
||||
}
|
||||
|
||||
return errorReply;
|
||||
const QJsonArray users = browserService()->findMatchingEntries(id, siteUrl, formUrl, "", keyList, httpAuth);
|
||||
if (users.isEmpty()) {
|
||||
return getErrorReply(action, ERROR_KEEPASS_NO_LOGINS_FOUND);
|
||||
}
|
||||
|
||||
browserService()->findEntries(socket,
|
||||
incrementedNonce,
|
||||
m_clientPublicKey,
|
||||
m_secretKey,
|
||||
id,
|
||||
hash,
|
||||
requestId,
|
||||
siteUrl,
|
||||
formUrl,
|
||||
"",
|
||||
keyList,
|
||||
httpAuth);
|
||||
return QJsonObject();
|
||||
QJsonObject message = browserMessageBuilder()->buildMessage(incrementedNonce);
|
||||
message["count"] = users.count();
|
||||
message["entries"] = users;
|
||||
message["hash"] = hash;
|
||||
message["id"] = id;
|
||||
|
||||
return buildResponse(action, message, incrementedNonce);
|
||||
}
|
||||
|
||||
QJsonObject BrowserAction::handleGeneratePassword(QLocalSocket* socket, const QJsonObject& json, const QString& action)
|
||||
|
||||
@@ -37,7 +37,7 @@ private:
|
||||
QJsonObject handleGetDatabaseHash(const QJsonObject& json, const QString& action);
|
||||
QJsonObject handleAssociate(const QJsonObject& json, const QString& action);
|
||||
QJsonObject handleTestAssociate(const QJsonObject& json, const QString& action);
|
||||
QJsonObject handleGetLogins(QLocalSocket* socket, const QJsonObject& json, const QString& action);
|
||||
QJsonObject handleGetLogins(const QJsonObject& json, const QString& action);
|
||||
QJsonObject handleGeneratePassword(QLocalSocket* socket, const QJsonObject& json, const QString& action);
|
||||
QJsonObject handleSetLogin(const QJsonObject& json, const QString& action);
|
||||
QJsonObject handleLockDatabase(const QJsonObject& json, const QString& action);
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Francois Ferrand
|
||||
* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com>
|
||||
* Copyright (C) 2022 KeePassXC Team <team@keepassxc.org>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
@@ -64,9 +63,9 @@ Q_GLOBAL_STATIC(BrowserService, s_browserService);
|
||||
BrowserService::BrowserService()
|
||||
: QObject()
|
||||
, m_browserHost(new BrowserHost)
|
||||
, m_dialogActive(false)
|
||||
, m_bringToFrontRequested(false)
|
||||
, m_passwordGeneratorRequested(false)
|
||||
, m_accessConfirmRequested(false)
|
||||
, m_prevWindowState(WindowState::Normal)
|
||||
, m_keepassBrowserUUID(Tools::hexToUuid("de887cc3036343b8974b5911b8816224"))
|
||||
{
|
||||
@@ -314,18 +313,12 @@ QString BrowserService::getCurrentTotp(const QString& uuid)
|
||||
return {};
|
||||
}
|
||||
|
||||
void BrowserService::findEntries(QLocalSocket* socket,
|
||||
const QString& nonce,
|
||||
const QString& publicKey,
|
||||
const QString& secretKey,
|
||||
const QString& dbid,
|
||||
const QString& hash,
|
||||
const QString& requestId,
|
||||
const QString& siteUrl,
|
||||
const QString& formUrl,
|
||||
const QString& realm,
|
||||
const StringPairList& keyList,
|
||||
const bool httpAuth)
|
||||
QJsonArray BrowserService::findMatchingEntries(const QString& dbid,
|
||||
const QString& siteUrl,
|
||||
const QString& formUrl,
|
||||
const QString& realm,
|
||||
const StringPairList& keyList,
|
||||
const bool httpAuth)
|
||||
{
|
||||
Q_UNUSED(dbid);
|
||||
const bool alwaysAllowAccess = browserSettings()->alwaysAllowAccess();
|
||||
@@ -334,8 +327,8 @@ void BrowserService::findEntries(QLocalSocket* socket,
|
||||
const QString formHost = QUrl(formUrl).host();
|
||||
|
||||
// Check entries for authorization
|
||||
QList<Entry*> entriesToConfirm;
|
||||
QList<Entry*> allowedEntries;
|
||||
QList<Entry*> pwEntriesToConfirm;
|
||||
QList<Entry*> pwEntries;
|
||||
for (auto* entry : searchEntries(siteUrl, formUrl, keyList)) {
|
||||
auto entryCustomData = entry->customData();
|
||||
|
||||
@@ -355,7 +348,7 @@ void BrowserService::findEntries(QLocalSocket* socket,
|
||||
|
||||
// HTTP Basic Auth always needs a confirmation
|
||||
if (!ignoreHttpAuth && httpAuth) {
|
||||
entriesToConfirm.append(entry);
|
||||
pwEntriesToConfirm.append(entry);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -365,166 +358,87 @@ void BrowserService::findEntries(QLocalSocket* socket,
|
||||
|
||||
case Unknown:
|
||||
if (alwaysAllowAccess) {
|
||||
allowedEntries.append(entry);
|
||||
pwEntries.append(entry);
|
||||
} else {
|
||||
entriesToConfirm.append(entry);
|
||||
pwEntriesToConfirm.append(entry);
|
||||
}
|
||||
break;
|
||||
|
||||
case Allowed:
|
||||
allowedEntries.append(entry);
|
||||
pwEntries.append(entry);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (entriesToConfirm.isEmpty()) {
|
||||
sendCredentialsToClient(allowedEntries, socket, nonce, publicKey, secretKey, hash, dbid, siteUrl, formUrl);
|
||||
return;
|
||||
// Confirm entries
|
||||
QList<Entry*> selectedEntriesToConfirm =
|
||||
confirmEntries(pwEntriesToConfirm, siteUrl, siteHost, formHost, realm, httpAuth);
|
||||
if (!selectedEntriesToConfirm.isEmpty()) {
|
||||
pwEntries.append(selectedEntriesToConfirm);
|
||||
}
|
||||
|
||||
confirmEntries(socket,
|
||||
nonce,
|
||||
publicKey,
|
||||
secretKey,
|
||||
dbid,
|
||||
hash,
|
||||
requestId,
|
||||
allowedEntries,
|
||||
entriesToConfirm,
|
||||
siteUrl,
|
||||
siteHost,
|
||||
formHost,
|
||||
realm,
|
||||
httpAuth);
|
||||
}
|
||||
|
||||
void BrowserService::confirmEntries(QLocalSocket* socket,
|
||||
const QString& incrementedNonce,
|
||||
const QString& publicKey,
|
||||
const QString& secretKey,
|
||||
const QString& id,
|
||||
const QString& hash,
|
||||
const QString& requestId,
|
||||
QList<Entry*>& allowedEntries,
|
||||
QList<Entry*>& entriesToConfirm,
|
||||
const QString& siteUrl,
|
||||
const QString& siteHost,
|
||||
const QString& formUrl,
|
||||
const QString& realm,
|
||||
const bool httpAuth)
|
||||
{
|
||||
if (entriesToConfirm.isEmpty() || m_accessConfirmRequested) {
|
||||
return;
|
||||
if (pwEntries.isEmpty()) {
|
||||
return {};
|
||||
}
|
||||
|
||||
if (!m_accessControlDialog) {
|
||||
|
||||
m_accessControlDialog.reset(new BrowserAccessControlDialog());
|
||||
|
||||
connect(
|
||||
m_currentDatabaseWidget, SIGNAL(databaseLockRequested()), m_accessControlDialog.data(), SIGNAL(closed()));
|
||||
|
||||
connect(m_accessControlDialog.data(),
|
||||
&BrowserAccessControlDialog::disableAccess,
|
||||
m_accessControlDialog.data(),
|
||||
[=](QTableWidgetItem* item) {
|
||||
auto entry = entriesToConfirm[item->row()];
|
||||
denyEntry(entry, siteHost, formUrl, realm);
|
||||
});
|
||||
|
||||
connect(m_accessControlDialog.data(), &BrowserAccessControlDialog::closed, m_accessControlDialog.data(), [=] {
|
||||
if (!m_accessControlDialog->entriesAccepted()) {
|
||||
auto errorMessage =
|
||||
browserMessageBuilder()->getErrorReply("get-logins", ERROR_KEEPASS_ACTION_CANCELLED_OR_DENIED);
|
||||
errorMessage["requestID"] = requestId;
|
||||
m_browserHost->sendClientMessage(socket, errorMessage);
|
||||
}
|
||||
|
||||
m_accessControlDialog.reset();
|
||||
hideWindow();
|
||||
m_accessConfirmRequested = false;
|
||||
});
|
||||
|
||||
connect(m_accessControlDialog.data(),
|
||||
&BrowserAccessControlDialog::acceptEntries,
|
||||
m_accessControlDialog.data(),
|
||||
[=](QList<QTableWidgetItem*> items, QList<Entry*> entries, QList<Entry*> allowed) {
|
||||
QList<Entry*> selectedEntries;
|
||||
|
||||
for (auto item : items) {
|
||||
auto entry = entries[item->row()];
|
||||
if (m_accessControlDialog->remember()) {
|
||||
allowEntry(entry, siteHost, formUrl, realm);
|
||||
}
|
||||
|
||||
selectedEntries.append(entry);
|
||||
}
|
||||
|
||||
hideWindow();
|
||||
|
||||
if (!selectedEntries.isEmpty()) {
|
||||
allowed.append(selectedEntries);
|
||||
}
|
||||
|
||||
if (allowed.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Ensure that database is not locked when the popup was visible
|
||||
if (!isDatabaseOpened()) {
|
||||
return;
|
||||
}
|
||||
|
||||
sendCredentialsToClient(
|
||||
allowed, socket, incrementedNonce, publicKey, secretKey, hash, id, siteUrl, formUrl);
|
||||
});
|
||||
|
||||
connect(m_accessControlDialog.data(),
|
||||
&BrowserAccessControlDialog::rejectEntries,
|
||||
m_accessControlDialog.data(),
|
||||
[=](QList<QTableWidgetItem*> items, QList<Entry*> entries) {
|
||||
Q_UNUSED(items); // We might need this later if single entries can be denied from the list
|
||||
for (auto entry : entries) {
|
||||
if (m_accessControlDialog->remember()) {
|
||||
denyEntry(entry, siteHost, formUrl, realm);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
m_accessControlDialog->setItems(entriesToConfirm, allowedEntries, siteUrl, httpAuth);
|
||||
m_accessControlDialog->show();
|
||||
// Ensure that database is not locked when the popup was visible
|
||||
if (!isDatabaseOpened()) {
|
||||
return {};
|
||||
}
|
||||
|
||||
m_accessConfirmRequested = true;
|
||||
updateWindowState();
|
||||
}
|
||||
|
||||
void BrowserService::sendCredentialsToClient(QList<Entry*>& allowedEntries,
|
||||
QLocalSocket* socket,
|
||||
const QString& incrementedNonce,
|
||||
const QString& publicKey,
|
||||
const QString& secretKey,
|
||||
const QString& hash,
|
||||
const QString& id,
|
||||
const QString siteUrl,
|
||||
const QString& formUrl)
|
||||
{
|
||||
allowedEntries = sortEntries(allowedEntries, siteUrl, formUrl);
|
||||
// Sort results
|
||||
pwEntries = sortEntries(pwEntries, siteUrl, formUrl);
|
||||
|
||||
// Fill the list
|
||||
QJsonArray result;
|
||||
for (auto* entry : allowedEntries) {
|
||||
for (auto* entry : pwEntries) {
|
||||
result.append(prepareEntry(entry));
|
||||
}
|
||||
|
||||
QJsonObject message = browserMessageBuilder()->buildMessage(incrementedNonce);
|
||||
message["count"] = result.count();
|
||||
message["entries"] = result;
|
||||
message["hash"] = hash;
|
||||
message["id"] = id;
|
||||
return result;
|
||||
}
|
||||
|
||||
m_browserHost->sendClientMessage(
|
||||
socket, browserMessageBuilder()->buildResponse("get-logins", message, incrementedNonce, publicKey, secretKey));
|
||||
QList<Entry*> BrowserService::confirmEntries(QList<Entry*>& pwEntriesToConfirm,
|
||||
const QString& siteUrl,
|
||||
const QString& siteHost,
|
||||
const QString& formUrl,
|
||||
const QString& realm,
|
||||
const bool httpAuth)
|
||||
{
|
||||
if (pwEntriesToConfirm.isEmpty() || m_dialogActive) {
|
||||
return {};
|
||||
}
|
||||
|
||||
m_dialogActive = true;
|
||||
updateWindowState();
|
||||
BrowserAccessControlDialog accessControlDialog;
|
||||
|
||||
connect(m_currentDatabaseWidget, SIGNAL(databaseLockRequested()), &accessControlDialog, SLOT(reject()));
|
||||
|
||||
connect(&accessControlDialog, &BrowserAccessControlDialog::disableAccess, [&](QTableWidgetItem* item) {
|
||||
auto entry = pwEntriesToConfirm[item->row()];
|
||||
denyEntry(entry, siteHost, formUrl, realm);
|
||||
});
|
||||
|
||||
accessControlDialog.setItems(pwEntriesToConfirm, siteUrl, httpAuth);
|
||||
|
||||
QList<Entry*> allowedEntries;
|
||||
auto ret = accessControlDialog.exec();
|
||||
if (ret == QDialog::Accepted) {
|
||||
for (auto item : accessControlDialog.getSelectedEntries()) {
|
||||
auto entry = pwEntriesToConfirm[item->row()];
|
||||
if (accessControlDialog.remember()) {
|
||||
allowEntry(entry, siteHost, formUrl, realm);
|
||||
}
|
||||
allowedEntries.append(entry);
|
||||
}
|
||||
}
|
||||
|
||||
// Re-hide the application if it wasn't visible before
|
||||
hideWindow();
|
||||
m_dialogActive = false;
|
||||
|
||||
return allowedEntries;
|
||||
}
|
||||
|
||||
void BrowserService::showPasswordGenerator(QLocalSocket* socket,
|
||||
@@ -572,11 +486,6 @@ bool BrowserService::isPasswordGeneratorRequested() const
|
||||
return m_passwordGeneratorRequested;
|
||||
}
|
||||
|
||||
bool BrowserService::isAccessConfirmRequested() const
|
||||
{
|
||||
return m_accessConfirmRequested;
|
||||
}
|
||||
|
||||
QString BrowserService::storeKey(const QString& key)
|
||||
{
|
||||
auto db = getDatabase();
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2013 Francois Ferrand
|
||||
* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com>
|
||||
* Copyright (C) 2022 KeePassXC Team <team@keepassxc.org>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
@@ -63,9 +62,7 @@ public:
|
||||
const QString& nonce,
|
||||
const QString& publicKey,
|
||||
const QString& secretKey);
|
||||
void sendPassword(QLocalSocket* socket, const QJsonObject& message);
|
||||
bool isPasswordGeneratorRequested() const;
|
||||
bool isAccessConfirmRequested() const;
|
||||
|
||||
void addEntry(const QString& dbid,
|
||||
const QString& login,
|
||||
@@ -84,18 +81,12 @@ public:
|
||||
const QString& siteUrl,
|
||||
const QString& formUrl);
|
||||
bool deleteEntry(const QString& uuid);
|
||||
void findEntries(QLocalSocket* socket,
|
||||
const QString& nonce,
|
||||
const QString& publicKey,
|
||||
const QString& secretKey,
|
||||
const QString& dbid,
|
||||
const QString& hash,
|
||||
const QString& requestId,
|
||||
const QString& siteUrl,
|
||||
const QString& formUrl,
|
||||
const QString& realm,
|
||||
const StringPairList& keyList,
|
||||
const bool httpAuth = false);
|
||||
QJsonArray findMatchingEntries(const QString& dbid,
|
||||
const QString& siteUrlStr,
|
||||
const QString& formUrlStr,
|
||||
const QString& realm,
|
||||
const StringPairList& keyList,
|
||||
const bool httpAuth = false);
|
||||
void requestGlobalAutoType(const QString& search);
|
||||
static void convertAttributesToCustomData(QSharedPointer<Database> db);
|
||||
|
||||
@@ -138,29 +129,12 @@ private:
|
||||
QList<Entry*> searchEntries(const QSharedPointer<Database>& db, const QString& siteUrl, const QString& formUrl);
|
||||
QList<Entry*> searchEntries(const QString& siteUrl, const QString& formUrl, const StringPairList& keyList);
|
||||
QList<Entry*> sortEntries(QList<Entry*>& pwEntries, const QString& siteUrl, const QString& formUrl);
|
||||
void confirmEntries(QLocalSocket* socket,
|
||||
const QString& incrementedNonce,
|
||||
const QString& publicKey,
|
||||
const QString& secretKey,
|
||||
const QString& id,
|
||||
const QString& hash,
|
||||
const QString& requestId,
|
||||
QList<Entry*>& allowedEntries,
|
||||
QList<Entry*>& entriesToConfirm,
|
||||
const QString& siteUrl,
|
||||
const QString& siteHost,
|
||||
const QString& formUrl,
|
||||
const QString& realm,
|
||||
const bool httpAuth);
|
||||
void sendCredentialsToClient(QList<Entry*>& allowedEntries,
|
||||
QLocalSocket* socket,
|
||||
const QString& incrementedNonce,
|
||||
const QString& publicKey,
|
||||
const QString& secretKey,
|
||||
const QString& hash,
|
||||
const QString& id,
|
||||
const QString siteUrl,
|
||||
const QString& formUrl);
|
||||
QList<Entry*> confirmEntries(QList<Entry*>& pwEntriesToConfirm,
|
||||
const QString& siteUrl,
|
||||
const QString& siteHost,
|
||||
const QString& formUrl,
|
||||
const QString& realm,
|
||||
const bool httpAuth);
|
||||
QJsonObject prepareEntry(const Entry* entry);
|
||||
void allowEntry(Entry* entry, const QString& siteHost, const QString& formUrl, const QString& realm);
|
||||
void denyEntry(Entry* entry, const QString& siteHost, const QString& formUrl, const QString& realm);
|
||||
@@ -196,15 +170,14 @@ private:
|
||||
QPointer<BrowserHost> m_browserHost;
|
||||
QHash<QString, QSharedPointer<BrowserAction>> m_browserClients;
|
||||
|
||||
bool m_dialogActive;
|
||||
bool m_bringToFrontRequested;
|
||||
bool m_passwordGeneratorRequested;
|
||||
bool m_accessConfirmRequested;
|
||||
WindowState m_prevWindowState;
|
||||
QUuid m_keepassBrowserUUID;
|
||||
|
||||
QPointer<DatabaseWidget> m_currentDatabaseWidget;
|
||||
QScopedPointer<PasswordGeneratorWidget> m_passwordGenerator;
|
||||
QScopedPointer<BrowserAccessControlDialog> m_accessControlDialog;
|
||||
|
||||
Q_DISABLE_COPY(BrowserService);
|
||||
|
||||
|
||||
@@ -38,13 +38,15 @@ namespace BrowserShared
|
||||
|
||||
// Put the socket in a dedicated directory.
|
||||
// This directory will be easily mountable by sandbox containers.
|
||||
QString subPath = path + "/app/org.keepassxc.KeePassXC/";
|
||||
QString subPath = path + "/app/org.keepassxc.KeePassXC";
|
||||
QDir().mkpath(subPath);
|
||||
|
||||
QString socketPath = subPath + serverName;
|
||||
#ifndef KEEPASSXC_DIST_FLATPAK
|
||||
// Create a symlink at the legacy location for backwards compatibility.
|
||||
QFile::link(socketPath, path + serverName);
|
||||
const auto origSocketPath = path + serverName;
|
||||
QFile::remove(origSocketPath);
|
||||
QFile::link(socketPath, origSocketPath);
|
||||
#endif
|
||||
|
||||
return socketPath;
|
||||
|
||||
@@ -65,6 +65,9 @@ install(TARGETS keepassxc-cli
|
||||
RUNTIME DESTINATION ${CLI_INSTALL_DIR} COMPONENT Runtime)
|
||||
|
||||
if(WIN32)
|
||||
target_sources(keepassxc-cli
|
||||
PRIVATE keepassxc-cli.exe.manifest)
|
||||
|
||||
# install(CODE "include(BundleUtilities)
|
||||
# fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/keepassxc-cli.exe\" \"\" \"\")"
|
||||
# COMPONENT Runtime)
|
||||
|
||||
@@ -63,6 +63,13 @@ namespace Utils
|
||||
fd->open(fopen("/dev/null", "w"), QIODevice::WriteOnly);
|
||||
#endif
|
||||
DEVNULL.setDevice(fd);
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
// On Windows, we ask via keepassxc-cli.exe.manifest to use UTF-8,
|
||||
// but the console code-page isn't automatically changed to match.
|
||||
SetConsoleCP(GetACP());
|
||||
SetConsoleOutputCP(GetACP());
|
||||
#endif
|
||||
}
|
||||
|
||||
void setStdinEcho(bool enable = true)
|
||||
|
||||
8
src/cli/keepassxc-cli.exe.manifest
Normal file
8
src/cli/keepassxc-cli.exe.manifest
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<application>
|
||||
<windowsSettings>
|
||||
<activeCodePage xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">UTF-8</activeCodePage>
|
||||
</windowsSettings>
|
||||
</application>
|
||||
</assembly>
|
||||
@@ -212,6 +212,12 @@ bool Application::event(QEvent* event)
|
||||
emit openFile(static_cast<QFileOpenEvent*>(event)->file());
|
||||
return true;
|
||||
}
|
||||
#ifdef Q_OS_MACOS
|
||||
// restore main window when clicking on the docker icon
|
||||
else if (event->type() == QEvent::ApplicationActivate) {
|
||||
emit applicationActivated();
|
||||
}
|
||||
#endif
|
||||
|
||||
return QApplication::event(event);
|
||||
}
|
||||
|
||||
@@ -197,7 +197,6 @@ DatabaseWidget::DatabaseWidget(QSharedPointer<Database> db, QWidget* parent)
|
||||
connect(m_groupSplitter, SIGNAL(splitterMoved(int,int)), SIGNAL(splitterSizesChanged()));
|
||||
connect(m_previewSplitter, SIGNAL(splitterMoved(int,int)), SIGNAL(splitterSizesChanged()));
|
||||
connect(this, SIGNAL(currentModeChanged(DatabaseWidget::Mode)), m_previewView, SLOT(setDatabaseMode(DatabaseWidget::Mode)));
|
||||
connect(m_previewView, SIGNAL(errorOccurred(QString)), SLOT(showErrorMessage(QString)));
|
||||
connect(m_previewView, SIGNAL(entryUrlActivated(Entry*)), SLOT(openUrlForEntry(Entry*)));
|
||||
connect(m_entryView, SIGNAL(viewStateChanged()), SIGNAL(entryViewStateChanged()));
|
||||
connect(m_groupView, SIGNAL(groupSelectionChanged()), SLOT(onGroupChanged()));
|
||||
@@ -392,10 +391,6 @@ void DatabaseWidget::createEntry()
|
||||
|
||||
m_newEntry.reset(new Entry());
|
||||
|
||||
if (isSearchActive()) {
|
||||
m_newEntry->setTitle(getCurrentSearch());
|
||||
endSearch();
|
||||
}
|
||||
m_newEntry->setUuid(QUuid::createUuid());
|
||||
m_newEntry->setUsername(m_db->metadata()->defaultUserName());
|
||||
m_newParent = m_groupView->currentGroup();
|
||||
@@ -1415,25 +1410,33 @@ void DatabaseWidget::search(const QString& searchtext)
|
||||
return;
|
||||
}
|
||||
|
||||
emit searchModeAboutToActivate();
|
||||
auto searchGroup = m_db->rootGroup();
|
||||
if (m_searchLimitGroup && m_nextSearchLabelText.isEmpty()) {
|
||||
searchGroup = currentGroup();
|
||||
}
|
||||
|
||||
Group* searchGroup = m_searchLimitGroup ? currentGroup() : m_db->rootGroup();
|
||||
|
||||
QList<Entry*> searchResult = m_entrySearcher->search(searchtext, searchGroup);
|
||||
|
||||
m_entryView->displaySearch(searchResult);
|
||||
m_lastSearchText = searchtext;
|
||||
auto results = m_entrySearcher->search(searchtext, searchGroup);
|
||||
|
||||
// Display a label detailing our search results
|
||||
if (!m_nextSearchLabelText.isEmpty()) {
|
||||
// Custom searches don't display if there are no results
|
||||
if (results.isEmpty()) {
|
||||
endSearch();
|
||||
return;
|
||||
}
|
||||
m_searchingLabel->setText(m_nextSearchLabelText);
|
||||
m_nextSearchLabelText.clear();
|
||||
} else if (!searchResult.isEmpty()) {
|
||||
m_searchingLabel->setText(tr("Search Results (%1)").arg(searchResult.size()));
|
||||
} else if (!results.isEmpty()) {
|
||||
m_searchingLabel->setText(tr("Search Results (%1)").arg(results.size()));
|
||||
} else {
|
||||
m_searchingLabel->setText(tr("No Results"));
|
||||
}
|
||||
|
||||
emit searchModeAboutToActivate();
|
||||
|
||||
m_entryView->displaySearch(results);
|
||||
m_lastSearchText = searchtext;
|
||||
|
||||
m_searchingLabel->setVisible(true);
|
||||
#ifdef WITH_XC_KEESHARE
|
||||
m_shareLabel->setVisible(false);
|
||||
|
||||
@@ -66,8 +66,6 @@ EntryPreviewWidget::EntryPreviewWidget(QWidget* parent)
|
||||
m_ui->entryNotesTextEdit->document()->setDocumentMargin(0);
|
||||
m_ui->groupNotesTextEdit->document()->setDocumentMargin(0);
|
||||
|
||||
connect(m_ui->entryUrlLabel, SIGNAL(linkActivated(QString)), SLOT(openEntryUrl()));
|
||||
|
||||
connect(m_ui->entryTotpButton, SIGNAL(toggled(bool)), m_ui->entryTotpLabel, SLOT(setVisible(bool)));
|
||||
connect(m_ui->entryTotpButton, SIGNAL(toggled(bool)), m_ui->entryTotpProgress, SLOT(setVisible(bool)));
|
||||
connect(m_ui->entryCloseButton, SIGNAL(clicked()), SLOT(hide()));
|
||||
@@ -77,7 +75,10 @@ EntryPreviewWidget::EntryPreviewWidget(QWidget* parent)
|
||||
connect(m_ui->toggleGroupNotesButton, SIGNAL(clicked(bool)), SLOT(setGroupNotesVisible(bool)));
|
||||
connect(m_ui->entryTabWidget, SIGNAL(tabBarClicked(int)), SLOT(updateTabIndexes()), Qt::QueuedConnection);
|
||||
// Prevent the url from being focused after clicked to allow the Copy Password button to work properly
|
||||
connect(m_ui->entryUrlLabel, &QLabel::linkActivated, this, [this] { m_ui->entryTabWidget->setFocus(); });
|
||||
connect(m_ui->entryUrlLabel, &QLabel::linkActivated, this, [this] {
|
||||
openEntryUrl();
|
||||
m_ui->entryTabWidget->setFocus();
|
||||
});
|
||||
connect(&m_totpTimer, SIGNAL(timeout()), SLOT(updateTotpLabel()));
|
||||
|
||||
connect(m_ui->entryAttributesTable, &QTableWidget::itemDoubleClicked, this, [](QTableWidgetItem* item) {
|
||||
@@ -120,8 +121,12 @@ void EntryPreviewWidget::clear()
|
||||
|
||||
void EntryPreviewWidget::setEntry(Entry* selectedEntry)
|
||||
{
|
||||
disconnect(m_currentEntry);
|
||||
disconnect(m_currentGroup);
|
||||
if (m_currentEntry) {
|
||||
disconnect(m_currentEntry);
|
||||
}
|
||||
if (m_currentGroup) {
|
||||
disconnect(m_currentGroup);
|
||||
}
|
||||
|
||||
m_currentEntry = selectedEntry;
|
||||
m_currentGroup = nullptr;
|
||||
@@ -137,8 +142,12 @@ void EntryPreviewWidget::setEntry(Entry* selectedEntry)
|
||||
|
||||
void EntryPreviewWidget::setGroup(Group* selectedGroup)
|
||||
{
|
||||
disconnect(m_currentEntry);
|
||||
disconnect(m_currentGroup);
|
||||
if (m_currentEntry) {
|
||||
disconnect(m_currentEntry);
|
||||
}
|
||||
if (m_currentGroup) {
|
||||
disconnect(m_currentGroup);
|
||||
}
|
||||
|
||||
m_currentEntry = nullptr;
|
||||
m_currentGroup = selectedGroup;
|
||||
@@ -250,6 +259,8 @@ void EntryPreviewWidget::setUsernameVisible(bool state)
|
||||
|
||||
void EntryPreviewWidget::setPasswordVisible(bool state)
|
||||
{
|
||||
m_ui->entryPasswordLabel->setFont(Font::fixedFont());
|
||||
|
||||
const QString password = m_currentEntry->resolveMultiplePlaceholders(m_currentEntry->password());
|
||||
if (state) {
|
||||
if (config()->get(Config::GUI_ColorPasswords).toBool()) {
|
||||
@@ -268,7 +279,7 @@ void EntryPreviewWidget::setPasswordVisible(bool state)
|
||||
m_ui->entryPasswordLabel->setHtml(html);
|
||||
} else {
|
||||
// No color
|
||||
m_ui->entryPasswordLabel->setPlainText(password.toHtmlEscaped());
|
||||
m_ui->entryPasswordLabel->setPlainText(password);
|
||||
}
|
||||
} else if (password.isEmpty() && !config()->get(Config::Security_PasswordEmptyPlaceholder).toBool()) {
|
||||
m_ui->entryPasswordLabel->setPlainText("");
|
||||
@@ -276,7 +287,6 @@ void EntryPreviewWidget::setPasswordVisible(bool state)
|
||||
m_ui->entryPasswordLabel->setPlainText(QString("\u25cf").repeated(6));
|
||||
}
|
||||
|
||||
m_ui->entryPasswordLabel->setFont(Font::fixedFont());
|
||||
m_ui->togglePasswordButton->setIcon(icons()->onOffIcon("password-show", state));
|
||||
}
|
||||
|
||||
|
||||
@@ -44,7 +44,6 @@ public slots:
|
||||
void clear();
|
||||
|
||||
signals:
|
||||
void errorOccurred(const QString& error);
|
||||
void entryUrlActivated(Entry* entry);
|
||||
|
||||
private slots:
|
||||
|
||||
@@ -1584,6 +1584,7 @@ QMenu* EditEntryWidget::createPresetsMenu()
|
||||
expirePresetsMenu->addAction(tr("%n week(s)", nullptr, 3))->setData(QVariant::fromValue(TimeDelta::fromDays(21)));
|
||||
expirePresetsMenu->addSeparator();
|
||||
expirePresetsMenu->addAction(tr("%n month(s)", nullptr, 1))->setData(QVariant::fromValue(TimeDelta::fromMonths(1)));
|
||||
expirePresetsMenu->addAction(tr("%n month(s)", nullptr, 2))->setData(QVariant::fromValue(TimeDelta::fromMonths(2)));
|
||||
expirePresetsMenu->addAction(tr("%n month(s)", nullptr, 3))->setData(QVariant::fromValue(TimeDelta::fromMonths(3)));
|
||||
expirePresetsMenu->addAction(tr("%n month(s)", nullptr, 6))->setData(QVariant::fromValue(TimeDelta::fromMonths(6)));
|
||||
expirePresetsMenu->addSeparator();
|
||||
|
||||
@@ -211,7 +211,7 @@ bool SSHAgent::sendMessagePageant(const QByteArray& in, QByteArray& out)
|
||||
}
|
||||
|
||||
QByteArray mapName =
|
||||
(QString("SSHAgentRequest") + reinterpret_cast<intptr_t>(QThread::currentThreadId())).toLatin1();
|
||||
(QString("SSHAgentRequest%1").arg(int(QThread::currentThreadId()), 8, 16, QChar('0'))).toLatin1();
|
||||
|
||||
HANDLE handle = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, AGENT_MAX_MSGLEN, mapName.data());
|
||||
|
||||
|
||||
@@ -31,7 +31,11 @@ inline std::string StatusToErrorMessage(OSStatus status)
|
||||
return std::to_string(status);
|
||||
}
|
||||
|
||||
std::string result(CFStringGetCStringPtr(text, kCFStringEncodingUTF8));
|
||||
auto msg = CFStringGetCStringPtr(text, kCFStringEncodingUTF8);
|
||||
std::string result;
|
||||
if (msg) {
|
||||
result = msg;
|
||||
}
|
||||
CFRelease(text);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -233,6 +233,7 @@ endif()
|
||||
|
||||
add_unit_test(NAME testcli SOURCES TestCli.cpp
|
||||
LIBS testsupport cli ${TEST_LIBRARIES})
|
||||
target_compile_definitions(testcli PRIVATE KEEPASSX_CLI_PATH="$<TARGET_FILE:keepassxc-cli>")
|
||||
|
||||
if(WITH_GUI_TESTS)
|
||||
add_subdirectory(gui)
|
||||
|
||||
@@ -102,6 +102,9 @@ void TestCli::init()
|
||||
m_yubiKeyProtectedDbFile.reset(new TemporaryFile());
|
||||
m_yubiKeyProtectedDbFile->copyFromFile(file.arg("YubiKeyProtectedPasswords.kdbx"));
|
||||
|
||||
m_nonAsciiDbFile.reset(new TemporaryFile());
|
||||
m_nonAsciiDbFile->copyFromFile(file.arg("NonAscii.kdbx"));
|
||||
|
||||
m_stdout.reset(new QBuffer());
|
||||
m_stdout->open(QIODevice::ReadWrite);
|
||||
Utils::STDOUT.setDevice(m_stdout.data());
|
||||
@@ -2316,6 +2319,29 @@ void TestCli::testYubiKeyOption()
|
||||
QCOMPARE(m_stdout->readAll(), QByteArray());
|
||||
}
|
||||
|
||||
void TestCli::testNonAscii()
|
||||
{
|
||||
QProcess process;
|
||||
process.setProcessChannelMode(QProcess::MergedChannels);
|
||||
process.start(
|
||||
KEEPASSX_CLI_PATH,
|
||||
QStringList(
|
||||
{"show", "-a", "password", m_nonAsciiDbFile->fileName(), QString::fromUtf8("\xe7\xa7\x98\xe5\xaf\x86")}));
|
||||
process.waitForStarted();
|
||||
QCOMPARE(process.state(), QProcess::ProcessState::Running);
|
||||
|
||||
// Write password.
|
||||
process.write("\xce\x94\xc3\xb6\xd8\xb6\n");
|
||||
process.closeWriteChannel();
|
||||
|
||||
process.waitForFinished();
|
||||
|
||||
process.readLine(); // skip password prompt
|
||||
QByteArray password = process.readLine();
|
||||
QCOMPARE(QString::fromUtf8(password).trimmed(),
|
||||
QString::fromUtf8("\xf0\x9f\x9a\x97\xf0\x9f\x90\x8e\xf0\x9f\x94\x8b\xf0\x9f\x93\x8e"));
|
||||
}
|
||||
|
||||
void TestCli::testCommandParsing_data()
|
||||
{
|
||||
QTest::addColumn<QString>("input");
|
||||
|
||||
@@ -80,6 +80,7 @@ private slots:
|
||||
void testShow();
|
||||
void testInvalidDbFiles();
|
||||
void testYubiKeyOption();
|
||||
void testNonAscii();
|
||||
|
||||
private:
|
||||
QScopedPointer<QFile> m_devNull;
|
||||
@@ -90,6 +91,7 @@ private:
|
||||
QScopedPointer<TemporaryFile> m_keyFileProtectedDbFile;
|
||||
QScopedPointer<TemporaryFile> m_keyFileProtectedNoPasswordDbFile;
|
||||
QScopedPointer<TemporaryFile> m_yubiKeyProtectedDbFile;
|
||||
QScopedPointer<TemporaryFile> m_nonAsciiDbFile;
|
||||
|
||||
QScopedPointer<QBuffer> m_stdout;
|
||||
QScopedPointer<QBuffer> m_stderr;
|
||||
|
||||
Binary file not shown.
@@ -23,26 +23,18 @@
|
||||
# For format of parsed arguments, see "Connection-based messaging" at:
|
||||
# https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/Native_messaging
|
||||
|
||||
readonly appId='org.keepassxc.KeePassXC'
|
||||
# Chromium, Google Chrome, Vivaldi & Brave
|
||||
readonly arg1='chrome-extension://oboonakemofpalcgghocfoadofidjkkk'
|
||||
# Firefox & Tor Browser
|
||||
readonly arg2='keepassxc-browser@keepassxc.org'
|
||||
|
||||
# Browser integration is enabled if unix socket exists
|
||||
if [[ -S "${XDG_RUNTIME_DIR}/app/${appId}/${appId}.BrowserServer" ]]; then
|
||||
# Using the =~ operator is intended to allow small variations
|
||||
# in the parameters, like and ending slash.
|
||||
# shellcheck disable=2076
|
||||
if [[ "$1" =~ "${arg1}" ]] || [[ "$2" =~ "${arg2}" ]]; then
|
||||
exec keepassxc-proxy "$@"
|
||||
fi
|
||||
fi
|
||||
|
||||
# If the first argument is "cli", execute keepassxc-cli instead.
|
||||
if [[ "$1" == "cli" ]]; then
|
||||
# Check arguments to see if this was a proxy launch from the browser
|
||||
# Use =~ to account for minor variations in the chrome extension
|
||||
if [[ "$1" =~ "$arg1" || "$2" == "$arg2" ]]; then
|
||||
exec keepassxc-proxy "$@"
|
||||
elif [[ "$1" == "cli" ]]; then
|
||||
exec keepassxc-cli "${@:2}"
|
||||
else
|
||||
# If no arguments are matched or browser integration is off, execute keepassxc
|
||||
exec keepassxc "$@"
|
||||
fi
|
||||
|
||||
# If no arguments are matched or browser integration is off, execute keepassxc
|
||||
exec keepassxc "$@"
|
||||
|
||||
Reference in New Issue
Block a user