Compare commits

..

21 Commits
2.7.2 ... 2.7.4

Author SHA1 Message Date
Jonathan White
63b2394ed0 Update translations 2022-10-29 15:07:50 -04:00
Jonathan White
cdb10dce0c Fix typo in release-tool.ps1 2022-10-29 15:07:28 -04:00
Jonathan White
9b5b1d6dce Browser: second fix for linked socket path
* Fix #8702
2022-10-29 14:12:16 -04:00
Jonathan White
c231abe13d Version bump to 2.7.4 2022-10-29 12:45:17 -04:00
Jonathan White
d81f6ea1c0 Fix powershell merge with no changes to translations 2022-10-29 12:45:17 -04:00
Jonathan White
1012d715b2 Fix launching proxy service with Flatpak
* Fixes #8655
2022-10-29 12:45:17 -04:00
Jonathan White
a1a5e21834 Prevent expired entries search if no results returned
* Fixes #8626
* Also remove old feature to set the title of a new entry to the current search text. This only made sense before advanced searching was made available.
2022-10-29 12:45:17 -04:00
Maurizio Pasquinelli
bc147070b6 Point INSTALL.md checkout reference to latest tag (#8470) 2022-10-29 12:45:17 -04:00
Matthew Donoughe
9176ddc3e1 CLI: Add Unicode support on Windows (#8618) 2022-10-29 12:45:17 -04:00
Sami Vänttinen
4f07a6592c Revert async Access Confirm Dialog 2022-10-29 12:45:17 -04:00
varjolintu
3ad205f733 Fix deleting existing socket file before making a new symbolic link 2022-10-29 12:45:17 -04:00
YAMASAKI Masahide
f01608f2bb SSH Agent: Fix CreateFileMappingA Parameter (#8619)
The last argument of CreateFileMappingA is of type string.
2022-10-29 12:45:17 -04:00
Hoai-Thu Vuong
fa4837c67b Add entry 2 months to preset menu (#8687) 2022-10-29 12:45:17 -04:00
Jonathan White
af466b120e Fix clicking links in entry preview panel
* Fixes #8636
2022-10-29 12:45:17 -04:00
Jonathan White
ce790dcd3a Fix crash on macOS when unlocking database
* Fix #8639
2022-10-29 12:45:17 -04:00
Jonathan White
e1d9a4fb53 Fix display of passwords in preview panel
* Fix #8627 - don't HTML escape plain text...
* Fix #8624 - ensure use of monospace font when displaying passwords in preview panel
2022-10-29 12:45:17 -04:00
Janek Bevendorff
d8483d3350 Update translations 2022-10-23 17:56:57 +02:00
Jonathan White
2d13588c95 Fix creating tag with powershell release tool
* The original method dumped the changelog lines into the command which overflowed the command line length. This method uses a temporary file for the tag message.
2022-10-23 14:48:40 +02:00
Janek Bevendorff
acf1d6b1ac Update minimum macOS deployment target to 10.15
Fixes compilation warnings about some macOS APIs not being available in 10.13.
2022-10-23 14:48:27 +02:00
Janek Bevendorff
2ac1e0ed49 Fix macOS window activation issues
Reverts part of 34b7d08a5, which introduced a regression.
2022-10-23 14:48:04 +02:00
Janek Bevendorff
0a0389ad56 Bump version number 2022-10-23 14:45:32 +02:00
34 changed files with 1120 additions and 630 deletions

View File

@@ -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]

View File

@@ -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")

View File

@@ -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

View File

@@ -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"
# -----------------------------------------------------------------------

View File

@@ -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

View File

@@ -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>

View File

@@ -11,7 +11,7 @@
</message>
<message>
<source>Report bugs at: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</source>
<translation>Reporteu errors a: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</translation>
<translation>Informeu d&apos;errors a: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</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&apos;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 &amp;&amp; Future</source>
<translation type="unfinished"/>
<translation>Denegar-ho tot &amp; Futur</translation>
</message>
<message>
<source>Allow All &amp;&amp; &amp;Future</source>
<translation type="unfinished"/>
<translation>Permet-ho tot &amp; 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&apos;aplicació</translation>
<translation>Paràmetres de l&apos;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)&lt;/p&gt;</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)&lt;/p&gt;</source>
</message>
<message>
<source>Copy Username</source>
<translation type="unfinished"/>
<translation>Copia el nom d&apos;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)&lt;/p&gt;</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>&lt;p&gt;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&apos;s security settings.&lt;/p&gt;&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; your *.kdbx database file!&lt;br&gt;If you do not have a key file, leave this field empty.&lt;/p&gt;&lt;p&gt;Click for more information&lt;/p&gt;</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>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
&lt;p&gt;Click for more information&lt;/p&gt;</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>&lt;p&gt;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&apos;s security settings.&lt;/p&gt;&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; your *.kdbx database file!&lt;br&gt;If you do not have a key file, leave this field empty.&lt;/p&gt;&lt;p&gt;Click for more information&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
<source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
&lt;p&gt;Click for more information&lt;/p&gt;</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 &amp;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>&amp;Lock Database</source>
<translation type="unfinished"/>
<translation>B&amp;loqueja la base de dades</translation>
</message>
<message>
<source>Lock &amp;All Databases</source>
<translation type="unfinished"/>
<translation>Bloqueja totes les bases de dades</translation>
</message>
<message>
<source>&amp;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 &amp;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>&amp;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: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</source>
<translation type="unfinished"/>
</message>
<message>
<source>Exclude look-alike characters</source>
<translation>Excloure caràcters d&apos;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: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</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 &quot;-a totp&quot;).</source>
<translation type="unfinished"/>
<translation>Copia el TOTP actual al porta-retalls (equivalent a &quot;-a totp&quot;).</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&apos;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&apos;s current TOTP.</source>
<translation type="unfinished"/>
<translation>Mostra el TOTP actual de l&apos;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&apos;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 &quot;%1&quot; 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&apos;eliminació de la configuració de TOTP</translation>
</message>
<message>
<source>Are you sure you want to delete TOTP settings for this entry?</source>

View File

@@ -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 &quot;%1&quot; from all entries in this database?</source>

View File

@@ -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>

View File

@@ -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>&lt;p&gt;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&apos;s security settings.&lt;/p&gt;&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; your *.kdbx database file!&lt;br&gt;If you do not have a key file, leave this field empty.&lt;/p&gt;&lt;p&gt;Click for more information&lt;/p&gt;</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>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
&lt;p&gt;Click for more information&lt;/p&gt;</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>&lt;p&gt;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&apos;s security settings.&lt;/p&gt;&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; your *.kdbx database file!&lt;br&gt;If you do not have a key file, leave this field empty.&lt;/p&gt;&lt;p&gt;Click for more information&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
<source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
&lt;p&gt;Click for more information&lt;/p&gt;</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>&amp;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: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</source>
<translation>Izostavi znakove: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;.</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: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</source>
<translation>Izostavi znakove: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;.</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 &quot;%1&quot; from all entries in this database?</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>TotpDialog</name>

View File

@@ -5293,7 +5293,7 @@ Weet je zeker dat je dit bestand wilt gebruiken?</translation>
</message>
<message>
<source>&amp;Getting Started</source>
<translation>Aan de sla&amp;g</translation>
<translation>Snelstart&amp;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>

View File

@@ -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>&lt;p&gt;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&apos;s security settings.&lt;/p&gt;&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; your *.kdbx database file!&lt;br&gt;If you do not have a key file, leave this field empty.&lt;/p&gt;&lt;p&gt;Click for more information&lt;/p&gt;</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>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
&lt;p&gt;Click for more information&lt;/p&gt;</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>&lt;p&gt;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&apos;s security settings.&lt;/p&gt;&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; your *.kdbx database file!&lt;br&gt;If you do not have a key file, leave this field empty.&lt;/p&gt;&lt;p&gt;Click for more information&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
<source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
&lt;p&gt;Click for more information&lt;/p&gt;</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>&amp;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: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</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: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</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 &quot;%1&quot; from all entries in this database?</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>TotpDialog</name>

View File

@@ -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();
}

View File

@@ -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;

View File

@@ -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)

View File

@@ -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);

View File

@@ -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();

View File

@@ -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);

View File

@@ -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;

View File

@@ -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)

View File

@@ -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)

View 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>

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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));
}

View File

@@ -44,7 +44,6 @@ public slots:
void clear();
signals:
void errorOccurred(const QString& error);
void entryUrlActivated(Entry* entry);
private slots:

View File

@@ -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();

View File

@@ -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());

View File

@@ -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;
}

View File

@@ -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)

View File

@@ -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");

View File

@@ -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.

View File

@@ -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 "$@"