mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2024-12-17 19:54:33 -05:00
Release 2.6.1
Added - Add menu entries for auto-typing only username or only password [#4891] - Browser: Add command for retrieving current TOTP [#5278] - Improve man pages [#5010] - Linux: Support Xfce screen lock signals [#4971] - Linux: Add OARS metadata to AppStream markup [#5031] - SSH Agent: Substitute tilde with %USERPROFILE% on Windows [#5116] Changed - Improve password generator UI and UX [#5129] - Do not prompt to restart if switching the theme back and forth [#5084] - Change actions for F1, F2, and F3 keys [#5082] - Skip referenced passwords in health check report [#5056] - Check system-wide Qt translations directory for downstream translations packaging [#5064] - macOS: Change password visibility toggle shortcut to Ctrl+H to avoid conflict with system shortcut [#5114] - Browser: Only display domain name in browser access confirm dialog to avoid overly wide window sizes [#5214] Fixed - Fix clipboard not being cleared when database is locked while timeout is still active [#5184] - Fix list of previous databases not being cleared in some cases [#5123] - Fix saving of non-data changes on database lock [#5210] - Fix search results banner theming [#5197] - Don't enforce theme palette in Classic theme mode and add hover effect for buttons [#5122,#5267] - Fix label clipping in settings on high-DPI screens [#5227] - Fix excessive memory usage by icons on systems with high-DPI screens [#5266] - Fix crash if number of TOTP digits exceeds ten [#5106] - Fix slot detection when first YubiKey is configured on the second slot [#5004] - Prevent crash if focus widget gets deleted during saving [#5005] - Always show buttons for opening or saving attachments [#4956] - Update link to Auto-Type help [#5228] - Fix build errors with Ninja [#5121] - CLI: Fix db-info command wrongly labelled as db-show in usage listing [#5140] - Windows: Use Classic theme by default if high-contrast mode is on [#5191] - Linux: Add workaround for qt5ct bug, causing icons not to show up [#5011] - Linux: Correct high-DPI display by not allowing fractional scaling [#5185] - Browser: Consider subdomain and path when requesting only "best-matching credentials" [#4832] - SSH Agent: Always forget all keys on lock [#5115]
This commit is contained in:
commit
9a35bba3b7
50
CHANGELOG.md
50
CHANGELOG.md
@ -1,11 +1,55 @@
|
||||
# Changelog
|
||||
|
||||
## 2.6.1 (2020-08-19)
|
||||
|
||||
### Added
|
||||
|
||||
- Add menu entries for auto-typing only username or only password [#4891]
|
||||
- Browser: Add command for retrieving current TOTP [#5278]
|
||||
- Improve man pages [#5010]
|
||||
- Linux: Support Xfce screen lock signals [#4971]
|
||||
- Linux: Add OARS metadata to AppStream markup [#5031]
|
||||
- SSH Agent: Substitute tilde with %USERPROFILE% on Windows [#5116]
|
||||
|
||||
### Changed
|
||||
|
||||
- Improve password generator UI and UX [#5129]
|
||||
- Do not prompt to restart if switching the theme back and forth [#5084]
|
||||
- Change actions for F1, F2, and F3 keys [#5082]
|
||||
- Skip referenced passwords in health check report [#5056]
|
||||
- Check system-wide Qt translations directory for downstream translations packaging [#5064]
|
||||
- macOS: Change password visibility toggle shortcut to Ctrl+H to avoid conflict with system shortcut [#5114]
|
||||
- Browser: Only display domain name in browser access confirm dialog to avoid overly wide window sizes [#5214]
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix clipboard not being cleared when database is locked while timeout is still active [#5184]
|
||||
- Fix list of previous databases not being cleared in some cases [#5123]
|
||||
- Fix saving of non-data changes on database lock [#5210]
|
||||
- Fix search results banner theming [#5197]
|
||||
- Don't enforce theme palette in Classic theme mode and add hover effect for buttons [#5122,#5267]
|
||||
- Fix label clipping in settings on high-DPI screens [#5227]
|
||||
- Fix excessive memory usage by icons on systems with high-DPI screens [#5266]
|
||||
- Fix crash if number of TOTP digits exceeds ten [#5106]
|
||||
- Fix slot detection when first YubiKey is configured on the second slot [#5004]
|
||||
- Prevent crash if focus widget gets deleted during saving [#5005]
|
||||
- Always show buttons for opening or saving attachments [#4956]
|
||||
- Update link to Auto-Type help [#5228]
|
||||
- Fix build errors with Ninja [#5121]
|
||||
- CLI: Fix db-info command wrongly labelled as db-show in usage listing [#5140]
|
||||
- Windows: Use Classic theme by default if high-contrast mode is on [#5191]
|
||||
- Linux: Add workaround for qt5ct bug, causing icons not to show up [#5011]
|
||||
- Linux: Correct high-DPI display by not allowing fractional scaling [#5185]
|
||||
- Browser: Consider subdomain and path when requesting only "best-matching credentials" [#4832]
|
||||
- SSH Agent: Always forget all keys on lock [#5115]
|
||||
|
||||
## 2.6.0 (2020-07-06)
|
||||
|
||||
### Added
|
||||
|
||||
- Custom Light and Dark themes [#4110, #4769, #4791, #4796, #4892, #4915]
|
||||
- Custom Light and Dark themes [#4110, #4769, #4791, #4892, #4915]
|
||||
- Compact mode to use classic Group and Entry line height [#4910]
|
||||
- New monochrome tray icons [#4796, #4803]
|
||||
- View menu to quickly switch themes, compact mode, and toggle UI elements [#4910]
|
||||
- Search for groups and scope search to matched groups [#4705]
|
||||
- Save Database Backup feature [#4550]
|
||||
@ -66,9 +110,11 @@
|
||||
- Improve search help widget displaying on macOS and Linux [#4236]
|
||||
- Return keyboard focus after editing an entry [#4287]
|
||||
- Reset database path after failed "Save As" [#4526]
|
||||
- Use SHA256 Digest for Windows code signing [#4129]
|
||||
- Make builds reproducible [#4411]
|
||||
- Improve handling of ccache when building [#4104, #4335]
|
||||
- Windows: Use correct UI font and size [#4769]
|
||||
- macOS: Properly re-hide application window after browser integration and Auto-Type usage [#4909]
|
||||
- Linux: Fix version number not embedded in AppImage [#4842]
|
||||
- Auto-Type: Fix crash when performing on new entry [#4132]
|
||||
- Browser: Send legacy HTTP settings to recycle bin [#4589]
|
||||
- Browser: Fix merging browser keys [#4685]
|
||||
|
@ -101,7 +101,7 @@ endif()
|
||||
|
||||
set(KEEPASSXC_VERSION_MAJOR "2")
|
||||
set(KEEPASSXC_VERSION_MINOR "6")
|
||||
set(KEEPASSXC_VERSION_PATCH "0")
|
||||
set(KEEPASSXC_VERSION_PATCH "1")
|
||||
set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION_MAJOR}.${KEEPASSXC_VERSION_MINOR}.${KEEPASSXC_VERSION_PATCH}")
|
||||
set(OVERRIDE_VERSION "" CACHE STRING "Override the KeePassXC Version for Snapshot builds")
|
||||
|
||||
|
@ -3,16 +3,16 @@
|
||||
[![codecov](https://codecov.io/gh/keepassxreboot/keepassxc/branch/develop/graph/badge.svg)](https://codecov.io/gh/keepassxreboot/keepassxc)
|
||||
[![GitHub release](https://img.shields.io/github/release/keepassxreboot/keepassxc)](https://github.com/keepassxreboot/keepassxc/releases/)
|
||||
|
||||
[KeePassXC](https://keepassxc.org) is a modern open-source password manager. It is used to store and manage information such as URLs, usernames, passwords, and so on for various accounts on your web and desktop applications. KeePassXC stores all data in an encrypted database format while still providing secure access to that information. KeePassXC is helpful for people with extremely high demands of secure personal data management.
|
||||
[KeePassXC](https://keepassxc.org) is a modern, secure, and open-source password manager that stores and manages your most sensitive information. You can run KeePassXC on Windows, macOS, and Linux systems. KeePassXC is for people with extremely high demands of secure personal data management. It saves many different types of information, such as usernames, passwords, URLs, attachments, and notes in an offline, encrypted file that can be stored in any location, including private and public cloud solutions. For easy identification and management, user-defined titles and icons can be specified for entries. In addition, entries are sorted in customizable groups. An integrated search function allows you to use advanced patterns to easily find any entry in your database. A customizable, fast, and easy-to-use password generator utility allows you to create passwords with any combination of characters or easy to remember passphrases.
|
||||
|
||||
## Quick Start
|
||||
The [QuickStart Guide](https://keepassxc.org/docs/KeePassXC_GettingStarted.html) gets you started using KeePassXC on your Windows, macOS, or Linux computer using pre-compiled binaries from the [downloads page](https://keepassxc.org/download). Additionally, individual Linux distributions may ship their own versions, so please check your distribution's package list to see if KeePassXC is available. Detailed documentation is available in the [User Guide](https://keepassxc.org/docs/KeePassXC_UserGuide.html).
|
||||
|
||||
## Features List
|
||||
KeePassXC has numerous features for novice and power users alike. This guide will go over the basic features to get you up and running quickly. The User Guide contains more in-depth discussions on the major features in the application.
|
||||
KeePassXC has numerous features for novice and power users alike. Our goal is to create an application that can be used by anyone while still offering advanced features to those that need them.
|
||||
|
||||
### Basic
|
||||
* Create, open, and save databases in the KDBX format (KeePass Compatible)
|
||||
* Create, open, and save databases in the KDBX format (KeePass compatible to KDBX4 and KDBX3)
|
||||
* Store sensitive information in entries that are organized by groups
|
||||
* Search for entries
|
||||
* Password generator
|
||||
|
@ -24,18 +24,20 @@ set(DOC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
set(OUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
# Build html documentation on all platforms
|
||||
file(GLOB html_depends ${DOC_DIR}/topics/* ${DOC_DIR}/styles/* ${DOC_DIR}/images/*)
|
||||
add_custom_command(OUTPUT KeePassXC_GettingStarted.html
|
||||
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_GettingStarted.html ${DOC_DIR}/GettingStarted.adoc
|
||||
DEPENDS ${DOC_DIR}/topics/* ${DOC_DIR}/styles/* ${DOC_DIR}/images/* ${DOC_DIR}/GettingStarted.adoc
|
||||
DEPENDS ${html_depends} ${DOC_DIR}/GettingStarted.adoc
|
||||
VERBATIM)
|
||||
add_custom_command(OUTPUT KeePassXC_UserGuide.html
|
||||
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_UserGuide.html ${DOC_DIR}/UserGuide.adoc
|
||||
DEPENDS ${DOC_DIR}/topics/* ${DOC_DIR}/styles/* ${DOC_DIR}/images/* ${DOC_DIR}/UserGuide.adoc
|
||||
DEPENDS ${html_depends} ${DOC_DIR}/UserGuide.adoc
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
VERBATIM)
|
||||
file(GLOB styles_depends ${DOC_DIR}/styles/*)
|
||||
add_custom_command(OUTPUT KeePassXC_KeyboardShortcuts.html
|
||||
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_KeyboardShortcuts.html ${DOC_DIR}/topics/KeyboardShortcuts.adoc
|
||||
DEPENDS ${DOC_DIR}/topics/KeyboardShortcuts.adoc ${DOC_DIR}/styles/*
|
||||
DEPENDS ${DOC_DIR}/topics/KeyboardShortcuts.adoc ${styles_depends}
|
||||
VERBATIM)
|
||||
|
||||
add_custom_target(docs ALL DEPENDS KeePassXC_GettingStarted.html KeePassXC_UserGuide.html KeePassXC_KeyboardShortcuts.html)
|
||||
@ -50,11 +52,11 @@ install(FILES
|
||||
if(APPLE OR UNIX)
|
||||
add_custom_command(OUTPUT keepassxc.1
|
||||
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -b manpage ${DOC_DIR}/man/keepassxc.1.adoc
|
||||
DEPENDS ${DOC_DIR}/man/*
|
||||
DEPENDS ${DOC_DIR}/man/keepassxc.1.adoc
|
||||
VERBATIM)
|
||||
add_custom_command(OUTPUT keepassxc-cli.1
|
||||
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -b manpage ${DOC_DIR}/man/keepassxc-cli.1.adoc
|
||||
DEPENDS ${DOC_DIR}/man/*
|
||||
DEPENDS ${DOC_DIR}/man/keepassxc-cli.1.adoc
|
||||
VERBATIM)
|
||||
add_custom_target(manpages ALL DEPENDS keepassxc.1 keepassxc-cli.1)
|
||||
|
||||
|
BIN
docs/images/autoopen.png
Normal file
BIN
docs/images/autoopen.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
BIN
docs/images/autoopen_ifdevice.png
Normal file
BIN
docs/images/autoopen_ifdevice.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 19 KiB |
@ -1,10 +1,28 @@
|
||||
// Copyright (C) 2017 Manolis Agkopian <m.agkopian@gmail.com>
|
||||
// Copyright (C) 2020 KeePassXC Team <team@keepassxc.org>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 2 or (at your option)
|
||||
// version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
= keepassxc-cli(1)
|
||||
:docdate: 2020-07-05
|
||||
:docdate: 2020-07-10
|
||||
:doctype: manpage
|
||||
:revnumber: 2.6.0
|
||||
:mansource: KeePassXC {revnumber}
|
||||
:manmanual: General Commands Manual
|
||||
|
||||
== NAME
|
||||
keepassxc-cli - command line interface for the KeePassXC password manager.
|
||||
keepassxc-cli - command line interface for the KeePassXC password manager
|
||||
|
||||
== SYNOPSIS
|
||||
*keepassxc-cli* _command_ [_options_]
|
||||
@ -16,21 +34,21 @@ It provides the ability to query and modify the entries of a KeePass database, d
|
||||
== COMMANDS
|
||||
*add* [_options_] <__database__> <__entry__>::
|
||||
Adds a new entry to a database.
|
||||
A password can be generated (_-g_ option), or a prompt can be displayed to input the password (_-p_ option).
|
||||
The same password generation options as documented for the generate command can be used when the _-g_ option is set.
|
||||
A password can be generated (*-g* option), or a prompt can be displayed to input the password (*-p* option).
|
||||
The same password generation options as documented for the generate command can be used when the *-g* option is set.
|
||||
|
||||
*analyze* [_options_] <__database__>::
|
||||
Analyzes passwords in a database for weaknesses.
|
||||
|
||||
*clip* [_options_] <__database__> <__entry__> [_timeout_]::
|
||||
Copies an attribute or the current TOTP (if the _-t_ option is specified) of a database entry to the clipboard.
|
||||
If no attribute name is specified using the _-a_ option, the password is copied.
|
||||
Copies an attribute or the current TOTP (if the *-t* option is specified) of a database entry to the clipboard.
|
||||
If no attribute name is specified using the *-a* option, the password is copied.
|
||||
If multiple entries with the same name exist in different groups, only the attribute for the first one is copied.
|
||||
For copying the attribute of an entry in a specific group, the group path to the entry should be specified as well, instead of just the name.
|
||||
Optionally, a timeout in seconds can be specified to automatically clear the clipboard.
|
||||
|
||||
*close*::
|
||||
In interactive mode, closes the currently opened database (see _open_).
|
||||
In interactive mode, closes the currently opened database (see *open*).
|
||||
|
||||
*db-create* [_options_] <__database__>::
|
||||
Creates a new database with a password and/or a key file.
|
||||
@ -45,8 +63,8 @@ It provides the ability to query and modify the entries of a KeePass database, d
|
||||
|
||||
*edit* [_options_] <__database__> <__entry__>::
|
||||
Edits a database entry.
|
||||
A password can be generated (_-g_ option), or a prompt can be displayed to input the password (_-p_ option).
|
||||
The same password generation options as documented for the generate command can be used when the _-g_ option is set.
|
||||
A password can be generated (*-g* option), or a prompt can be displayed to input the password (*-p* option).
|
||||
The same password generation options as documented for the generate command can be used when the *-g* option is set.
|
||||
|
||||
*estimate* [_options_] [_password_]::
|
||||
Estimates the entropy of a password.
|
||||
@ -54,7 +72,7 @@ It provides the ability to query and modify the entries of a KeePass database, d
|
||||
|
||||
*exit*::
|
||||
Exits interactive mode.
|
||||
Synonymous with _quit_.
|
||||
Synonymous with *quit*.
|
||||
|
||||
*export* [_options_] <__database__>::
|
||||
Exports the content of a database to standard output in the specified format (defaults to XML).
|
||||
@ -78,7 +96,7 @@ It provides the ability to query and modify the entries of a KeePass database, d
|
||||
*merge* [_options_] <__database1__> <__database2__>::
|
||||
Merges two databases together.
|
||||
The first database file is going to be replaced by the result of the merge, for that reason it is advisable to keep a backup of the two database files before attempting a merge.
|
||||
In the case that both databases make use of the same credentials, the _--same-credentials_ or _-s_ option can be used.
|
||||
In the case that both databases make use of the same credentials, the *--same-credentials* or *-s* option can be used.
|
||||
|
||||
*mkdir* [_options_] <__database__> <__group__>::
|
||||
Adds a new group to a database.
|
||||
@ -88,11 +106,11 @@ It provides the ability to query and modify the entries of a KeePass database, d
|
||||
|
||||
*open* [_options_] <__database__>::
|
||||
Opens the given database in a shell-style interactive mode.
|
||||
This is useful for performing multiple operations on a single database (e.g. _ls_ followed by _show_).
|
||||
This is useful for performing multiple operations on a single database (e.g. *ls* followed by *show*).
|
||||
|
||||
*quit*::
|
||||
Exits interactive mode.
|
||||
Synonymous with _exit_.
|
||||
Synonymous with *exit*.
|
||||
|
||||
*rm* [_options_] <__database__> <__entry__>::
|
||||
Removes an entry from a database.
|
||||
@ -107,7 +125,7 @@ It provides the ability to query and modify the entries of a KeePass database, d
|
||||
*show* [_options_] <__database__> <__entry__>::
|
||||
Shows the title, username, password, URL and notes of a database entry.
|
||||
Can also show the current TOTP.
|
||||
Regarding the occurrence of multiple entries with the same name in different groups, everything stated in the _clip_ command section also applies here.
|
||||
Regarding the occurrence of multiple entries with the same name in different groups, everything stated in the *clip* command section also applies here.
|
||||
|
||||
== OPTIONS
|
||||
=== General options
|
||||
@ -151,7 +169,7 @@ It provides the ability to query and modify the entries of a KeePass database, d
|
||||
Uses the same credentials for unlocking both databases.
|
||||
|
||||
=== Add and edit options
|
||||
The same password generation options as documented for the generate command can be used with those 2 commands when the -g option is set.
|
||||
The same password generation options as documented for the generate command can be used with those 2 commands when the *-g* option is set.
|
||||
|
||||
*-u*, *--username* <__username__>::
|
||||
Specifies the username of the entry.
|
||||
@ -183,7 +201,7 @@ The same password generation options as documented for the generate command can
|
||||
*-a*, *--attribute*::
|
||||
Copies the specified attribute to the clipboard.
|
||||
If no attribute is specified, the password attribute is the default.
|
||||
For example, "_-a_ username" would copy the username to the clipboard.
|
||||
For example, "*-a* *username*" would copy the username to the clipboard.
|
||||
[Default: password]
|
||||
|
||||
*-t*, *--totp*::
|
||||
@ -204,7 +222,7 @@ The same password generation options as documented for the generate command can
|
||||
*-a*, *--attributes* <__attribute__>...::
|
||||
Shows the named attributes.
|
||||
This option can be specified more than once, with each attribute shown one-per-line in the given order.
|
||||
If no attributes are specified and _-t_ is not specified, a summary of the default attributes is given.
|
||||
If no attributes are specified and *-t* is not specified, a summary of the default attributes is given.
|
||||
Protected attributes will be displayed in clear text if specified explicitly by this option.
|
||||
|
||||
*-s*, *--show-protected*::
|
||||
@ -274,9 +292,11 @@ The same password generation options as documented for the generate command can
|
||||
Include characters from every selected group.
|
||||
[Default: Disabled]
|
||||
|
||||
== REPORTING BUGS
|
||||
Bugs and feature requests can be reported on GitHub at https://github.com/keepassxreboot/keepassxc/issues.
|
||||
include::section-notes.adoc[]
|
||||
|
||||
== AUTHOR
|
||||
This manual page was originally written by Manolis Agkopian <m.agkopian@gmail.com>,
|
||||
and is maintained by the KeePassXC Team <team@keepassxc.org>.
|
||||
This manual page was originally written by Manolis Agkopian <m.agkopian@gmail.com>.
|
||||
|
||||
include::section-reporting-bugs.adoc[]
|
||||
|
||||
include::section-copyright.adoc[]
|
||||
|
@ -1,10 +1,28 @@
|
||||
// Copyright (C) 2019 Janek Bevendorff <janek@jbev.net>
|
||||
// Copyright (C) 2020 KeePassXC Team <team@keepassxc.org>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 2 or (at your option)
|
||||
// version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
= keepassxc(1)
|
||||
:docdate: 2020-07-05
|
||||
:docdate: 2020-07-10
|
||||
:doctype: manpage
|
||||
:revnumber: 2.6.0
|
||||
:mansource: KeePassXC {revnumber}
|
||||
:manmanual: General Commands Manual
|
||||
|
||||
== NAME
|
||||
keepassxc - password manager
|
||||
keepassxc - a modern open-source password manager
|
||||
|
||||
== SYNOPSIS
|
||||
*keepassxc* [_options_] [_filename(s)_]
|
||||
@ -23,19 +41,25 @@ Your wallet works offline and requires no Internet connection.
|
||||
Displays version information.
|
||||
|
||||
*--config* <__config__>::
|
||||
Path to a custom config file
|
||||
Path to a custom config file.
|
||||
|
||||
*--keyfile* <__keyfile__>::
|
||||
Key file of the database
|
||||
Key file of the database.
|
||||
|
||||
*--pw-stdin*::
|
||||
Read password of the database from stdin
|
||||
Read password of the database from stdin.
|
||||
|
||||
*--pw*, *--parent-window* <__handle__>::
|
||||
Parent window handle
|
||||
Parent window handle.
|
||||
|
||||
*--debug-info*::
|
||||
Displays debugging information.
|
||||
|
||||
include::section-notes.adoc[]
|
||||
|
||||
== AUTHOR
|
||||
This manual page is maintained by the KeePassXC Team <team@keepassxc.org>.
|
||||
This manual page was originally written by Janek Bevendorff <janek@jbev.net>.
|
||||
|
||||
include::section-reporting-bugs.adoc[]
|
||||
|
||||
include::section-copyright.adoc[]
|
||||
|
19
docs/man/section-copyright.adoc
Normal file
19
docs/man/section-copyright.adoc
Normal file
@ -0,0 +1,19 @@
|
||||
// Copyright (C) 2020 KeePassXC Team <team@keepassxc.org>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 2 or (at your option)
|
||||
// version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
== COPYRIGHT
|
||||
Copyright \(C) 2016-2020 KeePassXC Team <team@keepassxc.org>
|
||||
|
||||
*KeePassXC* code is licensed under GPL-2 or GPL-3.
|
27
docs/man/section-notes.adoc
Normal file
27
docs/man/section-notes.adoc
Normal file
@ -0,0 +1,27 @@
|
||||
// Copyright (C) 2020 KeePassXC Team <team@keepassxc.org>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 2 or (at your option)
|
||||
// version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
== NOTES
|
||||
*Project homepage*::
|
||||
https://keepassxc.org
|
||||
|
||||
*QuickStart Guide*::
|
||||
https://keepassxc.org/docs/KeePassXC_GettingStarted.html
|
||||
|
||||
*User Guide*::
|
||||
https://keepassxc.org/docs/KeePassXC_UserGuide.html
|
||||
|
||||
*Git repository*::
|
||||
https://github.com/keepassxreboot/keepassxc.git
|
17
docs/man/section-reporting-bugs.adoc
Normal file
17
docs/man/section-reporting-bugs.adoc
Normal file
@ -0,0 +1,17 @@
|
||||
// Copyright (C) 2020 KeePassXC Team <team@keepassxc.org>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 2 or (at your option)
|
||||
// version 3 of the License.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
== REPORTING BUGS
|
||||
Bugs and feature requests can be reported on GitHub at https://github.com/keepassxreboot/keepassxc/issues.
|
@ -470,13 +470,6 @@ video {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
@media all and (max-width: 600px) {
|
||||
table {
|
||||
width: 55vw!important;
|
||||
font-size: 3vw;
|
||||
}
|
||||
}
|
||||
|
||||
.exampleblock > .content {
|
||||
background-color: var(--background);
|
||||
}
|
||||
|
@ -7,6 +7,8 @@ The Auto-Type feature acts like a virtual keyboard to populate data from your en
|
||||
|
||||
NOTE: Auto-Type is a completely separate feature from Browser Integration. You do not need to have the KeePassXC browser extension installed in your browser to use Auto-Type.
|
||||
|
||||
WARNING: Auto-Type will be disabled when run with a Wayland compositor on Linux. To use Auto-Type in this environment, you must set `QT_QPA_PLATFORM=xcb` or start KeePassXC with the `-platform xcb` command-line flag.
|
||||
|
||||
=== Configure Global Auto-Type
|
||||
You can define a global Auto-Type hotkey that starts the Auto-Type process. To configure the hotkey, perform the following steps:
|
||||
|
||||
|
@ -141,7 +141,8 @@ KeePassXC provides an enhanced and granular search features the enables you to s
|
||||
|===
|
||||
|Modifier |Description
|
||||
|
||||
|- |Exclude this term from results
|
||||
|- |Exclude this term from results
|
||||
|! |Exclude this term from results
|
||||
|+ |Match this term exactly
|
||||
|* |Term is handled as a regular expression
|
||||
|===
|
||||
@ -235,6 +236,31 @@ image::edit_entry_history.png[]
|
||||
|
||||
NOTE: Restoring an old history item will store the current entry settings as a new history item.
|
||||
|
||||
== Automatic Database Opening
|
||||
You can setup one or more databases to open automatically when you unlock a single database. This is done by *(1)* defining a special group named `AutoOpen` with *(2)* entries that contain the file path and credentials for each database that should be opened. There is no limit to the number of databases that can be opened.
|
||||
|
||||
TIP: Case matters with auto open, the group name must be exactly `AutoOpen`.
|
||||
|
||||
.AutoOpen Group and Entries
|
||||
image::autoopen.png[]
|
||||
|
||||
To setup an entry for auto open perform the following steps:
|
||||
|
||||
1. Create a new entry and give it any title you wish.
|
||||
2. If your database has a key file, enter its absolute or relative path in the `username` field.
|
||||
3. If your database has a password, enter it in the `password` field
|
||||
4. Enter the absolute or relative path to the database file in the `url` field. You can also use the `{DB_DIR}` placeholder to reference the absolute path of the current database file.
|
||||
5. To restrict auto open to particular devices, go to the advanced category and enter the following:
|
||||
a. Create a new attribute named `IfDevice`.
|
||||
b. Enter hostnames in a comma separated list to define computers that will open this database.
|
||||
c. Prepend an exclamation mark (`!`) to explicitly exclude a device.
|
||||
d. Examples: `LAPTOP, DESKTOP` will auto open on a computer named LAPTOP or DESKTOP. `!LAPTOP` will auto open on all devices *not* named LAPTOP.
|
||||
|
||||
.Auto open IfDevice example
|
||||
image::autoopen_ifdevice.png[]
|
||||
|
||||
NOTE: You can setup an entry to open on double click of the URL field by prepending `kdbx://` to the relative or absolute path to the database file. You may also have to add `file://` to access network shares (e.g., `kdbx://file://share/database.kdbx`).
|
||||
|
||||
== Database Settings
|
||||
At any point of time, you can change the settings for your database. To make changes to the general settings, perform the following steps:
|
||||
|
||||
|
@ -33,7 +33,9 @@ include::.sharedheader[]
|
||||
|Select Previous Database Tab | Ctrl + Shift + Tab ; Ctrl + PageUp
|
||||
|Toggle Passwords Hidden | Ctrl + Shift + C
|
||||
|Toggle Usernames Hidden | Ctrl + Shift + B
|
||||
|Focus Search | Ctrl + F
|
||||
|Focus Groups (edit if focused) | F1
|
||||
|Focus Entries (edit if focused) | F2
|
||||
|Focus Search | F3 ; Ctrl + F
|
||||
|Clear Search | Escape
|
||||
|Show Keyboard Shortcuts | Ctrl + /
|
||||
|===
|
||||
|
@ -4,15 +4,12 @@ include::.sharedheader[]
|
||||
|
||||
// tag::content[]
|
||||
== Welcome
|
||||
KeePassXC is a modern open-source password manager. It is used to store and manage information such as URLs, usernames, passwords, and so on for various accounts on your web applications. KeePassXC stores all data in an encrypted format while still providing secure access to your information.
|
||||
KeePassXC is a modern, secure, and open-source password manager that stores and manages your most sensitive information. You can run KeePassXC on Windows, macOS, and Linux systems.
|
||||
|
||||
KeePassXC is helpful for people with extremely high demands of secure personal data management. It saves many different information, such as user names, passwords, URLs, attachments, and comments in one single database. For a better management, user-defined titles and icons can be specified for different entries in KeePassXC. In addition, the entries are sorted in customizable groups. The integrated search function allows to search in a single group or the complete database.
|
||||
|
||||
KeePassXC also provides a secure, customizable, fast, and easy-to-use password generator utility. This utility is very helpful to those who generate passwords frequently.
|
||||
KeePassXC is for people with extremely high demands of secure personal data management. It saves many different types of information, such as usernames, passwords, URLs, attachments, and notes in an offline, encrypted file that can be stored in any location, including private and public cloud solutions. For easy identification and management, user-defined titles and icons can be specified for entries. In addition, entries are sorted in customizable groups. An integrated search function allows you to use advanced patterns to easily find any entry in your database. A customizable, fast, and easy-to-use password generator utility allows you to create passwords with any combination of characters or easy to remember passphrases.
|
||||
|
||||
=== Overview
|
||||
You can store an unlimited number of passwords and information in a KeePassXC database. Every piece of information you store in your database is encrypted at all times within the `kdbx` file. When you are accessing your database from within KeePassXC, your information in decrypted and stored in your computer's memory. KeePassXC places controls over the access to this data so other applications cannot read it (unless they have administrative rights). The interface is designed to let you quickly access your passwords, search for the right entry, perform Auto-Type or copy/paste
|
||||
operations, make and save changes, and then get out of your way.
|
||||
You can store an unlimited number of passwords and information in a KeePassXC database. Every piece of information you store in your database is encrypted at all times within the `kdbx` file. When you are accessing your database from within KeePassXC, your information in decrypted and stored in your computer's memory. KeePassXC places controls over the access to this data so other applications cannot read it (unless they have administrative rights). The interface is designed to let you quickly access your passwords, search for the right entry, perform Auto-Type or copy/paste operations, make and save changes, and then get out of your way.
|
||||
|
||||
KeePassXC ships with light and dark themes specifically designed to meet accessibility standards. In most cases, the appropriate theme for your system will be determined automatically, but you can always set a specific theme in the application settings.
|
||||
|
||||
|
@ -28,31 +28,138 @@
|
||||
|
||||
<screenshots>
|
||||
<screenshot type="default">
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_001.png</image>
|
||||
<image>https://keepassxc.org/images/screenshots/thumbs/welcome_screen.png</image>
|
||||
<caption>Create, Import or Open Databases</caption>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_002.png</image>
|
||||
<image>https://keepassxc.org/images/screenshots/thumbs/database_view.png</image>
|
||||
<caption>Organize with Groups and Entries</caption>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_003.png</image>
|
||||
<image>https://keepassxc.org/images/screenshots/thumbs/edit_entry.png</image>
|
||||
<caption>Database Entry</caption>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_004.png</image>
|
||||
<image>https://keepassxc.org/images/screenshots/thumbs/edit_entry_icons.png</image>
|
||||
<caption>Icon Selection for Entry</caption>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_006.png</image>
|
||||
<image>https://keepassxc.org/images/screenshots/thumbs/password_generator_advanced.png</image>
|
||||
<caption>Password Generator</caption>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
|
||||
<releases>
|
||||
<release version="2.6.0" date="2020-04-01">
|
||||
<release version="2.6.1" date="2020-08-19">
|
||||
<description>
|
||||
<ul><li>TBD</li></ul>
|
||||
<ul>
|
||||
<li>Add menu entries for auto-typing only username or only password [#4891]</li>
|
||||
<li>Browser: Add command for retrieving current TOTP [#5278]</li>
|
||||
<li>Improve man pages [#5010]</li>
|
||||
<li>Linux: Support Xfce screen lock signals [#4971]</li>
|
||||
<li>Linux: Add OARS metadata to AppStream markup [#5031]</li>
|
||||
<li>SSH Agent: Substitute tilde with %USERPROFILE% on Windows [#5116]</li>
|
||||
<li>Improve password generator UI and UX [#5129]</li>
|
||||
<li>Do not prompt to restart if switching the theme back and forth [#5084]</li>
|
||||
<li>Change actions for F1, F2, and F3 keys [#5082]</li>
|
||||
<li>Skip referenced passwords in health check report [#5056]</li>
|
||||
<li>Check system-wide Qt translations directory for downstream translations packaging [#5064]</li>
|
||||
<li>macOS: Change password visibility toggle shortcut to Ctrl+H to avoid conflict with system shortcut [#5114]</li>
|
||||
<li>Browser: Only display domain name in browser access confirm dialog to avoid overly wide window sizes [#5214]</li>
|
||||
<li>Fix clipboard not being cleared when database is locked while timeout is still active [#5184]</li>
|
||||
<li>Fix list of previous databases not being cleared in some cases [#5123]</li>
|
||||
<li>Fix saving of non-data changes on database lock [#5210]</li>
|
||||
<li>Fix search results banner theming [#5197]</li>
|
||||
<li>Don't enforce theme palette in Classic theme mode and add hover effect for buttons [#5122,#5267]</li>
|
||||
<li>Fix label clipping in settings on high-DPI screens [#5227]</li>
|
||||
<li>Fix excessive memory usage by icons on systems with high-DPI screens [#5266]</li>
|
||||
<li>Fix crash if number of TOTP digits exceeds ten [#5106]</li>
|
||||
<li>Fix slot detection when first YubiKey is configured on the second slot [#5004]</li>
|
||||
<li>Prevent crash if focus widget gets deleted during saving [#5005]</li>
|
||||
<li>Always show buttons for opening or saving attachments [#4956]</li>
|
||||
<li>Update link to Auto-Type help [#5228]</li>
|
||||
<li>Fix build errors with Ninja [#5121]</li>
|
||||
<li>CLI: Fix db-info command wrongly labelled as db-show in usage listing [#5140]</li>
|
||||
<li>Windows: Use Classic theme by default if high-contrast mode is on [#5191]</li>
|
||||
<li>Linux: Add workaround for qt5ct bug, causing icons not to show up [#5011]</li>
|
||||
<li>Linux: Correct high-DPI display by not allowing fractional scaling [#5185]</li>
|
||||
<li>Browser: Consider subdomain and path when requesting only "best-matching credentials" [#4832]</li>
|
||||
<li>SSH Agent: Always forget all keys on lock [#5115]</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="2.6.0" date="2020-07-06">
|
||||
<description>
|
||||
<ul>
|
||||
<li>Custom Light and Dark themes [#4110, #4769, #4791, #4892, #4915]</li>
|
||||
<li>Compact mode to use classic Group and Entry line height [#4910]</li>
|
||||
<li>New monochrome tray icons [#4796, #4803]</li>
|
||||
<li>View menu to quickly switch themes, compact mode, and toggle UI elements [#4910]</li>
|
||||
<li>Search for groups and scope search to matched groups [#4705]</li>
|
||||
<li>Save Database Backup feature [#4550]</li>
|
||||
<li>Sort entries by "natural order" and move lines up/down [#4357]</li>
|
||||
<li>Option to launch KeePassXC on system startup/login [#4675]</li>
|
||||
<li>Caps Lock warning on password input fields [#3646]</li>
|
||||
<li>Add "Size" column to entry view [#4588]</li>
|
||||
<li>Browser-like tab experience using Ctrl+[Num] (Alt+[Num] on Linux) [#4063, #4305]</li>
|
||||
<li>Password Generator: Define additional characters to choose from [#3876]</li>
|
||||
<li>Reports: Database password health check (offline) [#3993]</li>
|
||||
<li>Reports: HIBP online service to check for breached passwords [#4438]</li>
|
||||
<li>Auto-Type: DateTime placeholders [#4409]</li>
|
||||
<li>Browser: Show group name in results sent to browser extension [#4111]</li>
|
||||
<li>Browser: Ability to define a custom browser location (macOS and Linux only) [#4148]</li>
|
||||
<li>Browser: Ability to change root group UUID and inline edit connection ID [#4315, #4591]</li>
|
||||
<li>CLI: `db-info` command [#4231]</li>
|
||||
<li>CLI: Use wl-clipboard if xclip is not available (Linux) [#4323]</li>
|
||||
<li>CLI: Incorporate xclip into snap builds [#4697]</li>
|
||||
<li>SSH Agent: Key file path env substitution, SSH_AUTH_SOCK override, and connection test [#3769, #3801, #4545]</li>
|
||||
<li>SSH Agent: Context menu actions to add/remove keys [#4290]</li>
|
||||
<li>Complete replacement of default database icons [#4699]</li>
|
||||
<li>Complete replacement of application icons [#4066, #4161, #4203, #4411]</li>
|
||||
<li>Complete rewrite of documentation and manpages using Asciidoctor [#4937]</li>
|
||||
<li>Complete refactor of config files; separate between local and roaming [#4665]</li>
|
||||
<li>Complete refactor of browser integration and proxy code [#4680]</li>
|
||||
<li>Complete refactor of hardware key integration (YubiKey and OnlyKey) [#4584, #4843]</li>
|
||||
<li>Significantly improve performance when saving and opening databases [#4309, #4833]</li>
|
||||
<li>Remove read-only detection for database files [#4508]</li>
|
||||
<li>Overhaul of password fields and password generator [#4367]</li>
|
||||
<li>Replace instances of "Master Key" with "Database Credentials" [#4929]</li>
|
||||
<li>Change settings checkboxes to positive phrasing for consistency [#4715]</li>
|
||||
<li>Improve UX of using entry actions (focus fix) [#3893]</li>
|
||||
<li>Set expiration time to Now when enabling entry expiration [#4406]</li>
|
||||
<li>Always show "New Entry" in context menu [#4617]</li>
|
||||
<li>Issue warning before adding large attachments [#4651]</li>
|
||||
<li>Improve importing OPVault [#4630]</li>
|
||||
<li>Improve AutoOpen capability [#3901, #4752]</li>
|
||||
<li>Check for updates every 7 days even while still running [#4752]</li>
|
||||
<li>Improve Windows installer UI/UX [#4675]</li>
|
||||
<li>Improve config file handling of portable distribution [#4131, #4752]</li>
|
||||
<li>macOS: Hide dock icon when application is hidden to tray [#4782]</li>
|
||||
<li>Browser: Use unlock dialog to improve UX of opening a locked database [#3698]</li>
|
||||
<li>Browser: Improve database and entry settings experience [#4392, #4591]</li>
|
||||
<li>Browser: Improve confirm access dialog [#2143, #4660]</li>
|
||||
<li>KeeShare: Improve monitoring file changes of shares [#4720]</li>
|
||||
<li>CLI: Rename `create` command to `db-create` [#4231]</li>
|
||||
<li>CLI: Cleanup `db-create` options (`--set-key-file` and `--set-password`) [#4313]</li>
|
||||
<li>CLI: Use stderr for help text and password prompts [#4086, #4623]</li>
|
||||
<li>FdoSecrets: Display existing secret service process [#4128]</li>
|
||||
<li>Fix changing focus around the main window using tab key [#4641]</li>
|
||||
<li>Fix search field clearing while still using the application [#4368]</li>
|
||||
<li>Improve search help widget displaying on macOS and Linux [#4236]</li>
|
||||
<li>Return keyboard focus after editing an entry [#4287]</li>
|
||||
<li>Reset database path after failed "Save As" [#4526]</li>
|
||||
<li>Make builds reproducible [#4411]</li>
|
||||
<li>Improve handling of ccache when building [#4104, #4335]</li>
|
||||
<li>Windows: Use correct UI font and size [#4769]</li>
|
||||
<li>macOS: Properly re-hide application window after browser integration and Auto-Type usage [#4909]</li>
|
||||
<li>Linux: Fix version number not embedded in AppImage [#4842]</li>
|
||||
<li>Auto-Type: Fix crash when performing on new entry [#4132]</li>
|
||||
<li>Browser: Send legacy HTTP settings to recycle bin [#4589]</li>
|
||||
<li>Browser: Fix merging browser keys [#4685]</li>
|
||||
<li>CLI: Fix encoding when exporting database [#3921]</li>
|
||||
<li>SSH Agent: Improve reliability and underlying code [#3833, #4256, #4549, #4595]</li>
|
||||
<li>FdoSecrets: Fix crash when editing settings before service is enabled [#4332]</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="2.5.4" date="2020-04-09">
|
||||
@ -614,4 +721,5 @@
|
||||
</description>
|
||||
</release>
|
||||
</releases>
|
||||
<content_rating type="oars-1.0" />
|
||||
</component>
|
||||
|
@ -1,13 +1,39 @@
|
||||
[Desktop Entry]
|
||||
Name=KeePassXC
|
||||
GenericName=Password Manager
|
||||
GenericName[ar]=مدير كلمات المرور
|
||||
GenericName[bg]=Мениджър на пароли
|
||||
GenericName[ca]=Gestor de contrasenyes
|
||||
GenericName[cs]=Aplikace pro správu hesel
|
||||
GenericName[da]=Adgangskodehåndtering
|
||||
GenericName[de]=Passwortverwaltung
|
||||
GenericName[es]=Gestor de contraseñas
|
||||
GenericName[et]=Paroolihaldur
|
||||
GenericName[fi]=Salasanamanageri
|
||||
GenericName[fr]=Gestionnaire de mot de passe
|
||||
GenericName[hu]=Jelszókezelő
|
||||
GenericName[id]=Pengelola Sandi
|
||||
GenericName[it]=Gestione password
|
||||
GenericName[ja]=パスワードマネージャー
|
||||
GenericName[ko]=암호 관리자
|
||||
GenericName[lt]=Slaptažodžių tvarkytuvė
|
||||
GenericName[nb]=Passordhåndterer
|
||||
GenericName[nl]=Wachtwoordbeheer
|
||||
GenericName[pl]=Menedżer haseł
|
||||
GenericName[pt_BR]=Gerenciador de Senhas
|
||||
GenericName[pt]=Gestor de palavras-passe
|
||||
GenericName[ro]=Manager de parole
|
||||
GenericName[ru]=менеджер паролей
|
||||
GenericName[sk]=Správca hesiel
|
||||
GenericName[sv]=Lösenordshanterare
|
||||
GenericName[th]=แอพจัดการรหัสผ่าน
|
||||
GenericName[tr]=Parola yöneticisi
|
||||
GenericName[uk]=Розпорядник паролів
|
||||
GenericName[zh_CN]=密码管理器
|
||||
GenericName[zh_TW]=密碼管理員
|
||||
Comment=Community-driven port of the Windows application “KeePass Password Safe”
|
||||
Comment[da]=Fællesskabsdrevet port af Windows-programmet “KeePass Password Safe”
|
||||
Comment[et]=Kogukonna arendatav port Windowsi programmist KeePass Password Safe
|
||||
Exec=keepassxc %f
|
||||
TryExec=keepassxc
|
||||
Icon=keepassxc
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -54,7 +54,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable SSH Agent integration</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Activar integració de l'agent SSH</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SSH_AUTH_SOCK value</source>
|
||||
@ -125,11 +125,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Monochrome (light)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Monocrom (clar)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Monochrome (dark)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Monocrom (fosc)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Colorful</source>
|
||||
@ -302,7 +302,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Automatically launch KeePassXC at system startup</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Executar KeePassXC a l'inici del sistema</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Mark database as modified for non-data changes (e.g., expanding groups)</source>
|
||||
@ -314,11 +314,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>User Interface</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Interfície d'usuari</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toolbar button style:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Estil de la barra d'eines</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use monospaced font for notes</source>
|
||||
@ -326,11 +326,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Tray icon type:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tipus d'icona de la safata del sistema</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reset settings to default…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Valors de configuració per defecte...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-Type typing delay:</source>
|
||||
@ -560,7 +560,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is requesting access to the following entries:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1 demana accés a les entrades següents:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remember access to checked entries</source>
|
||||
@ -568,11 +568,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Remember</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Recorda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Allow access to entries</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Permetre accés a les entrades</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Allow Selected</source>
|
||||
@ -659,11 +659,11 @@ Moved %2 keys to custom data.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>KeePassXC: No s'ha trobat cap entrada amb atributs KeePassHTTP</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The active database does not contain an entry with KeePassHTTP attributes.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>La base de dades activa no conté cap entrada amb atributs KeePassHTTP</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC: Legacy browser integration settings detected</source>
|
||||
@ -726,31 +726,31 @@ chrome-laptop.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Vivaldi</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Vivaldi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Edge</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>&Edge</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Firefox</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Firefox</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tor Browser</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tor Browser</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Brave</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Brave</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Google Chrome</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Google Chrome</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Chromium</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Chromium</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show a notification when credentials are requested</source>
|
||||
@ -875,7 +875,7 @@ chrome-laptop.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browser type:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tipus de navegador:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toolbar button style</source>
|
||||
@ -1095,7 +1095,7 @@ chrome-laptop.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Column %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Columna %1</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -54,27 +54,27 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable SSH Agent integration</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Aktivér SSH-agent (kræver genstart)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SSH_AUTH_SOCK value</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>SSH_AUTH_SOCK-værdi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SSH_AUTH_SOCK override</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>SSH_AUTH_SOCK-overstyring</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(empty)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>(tom)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No SSH Agent socket available. Either make sure SSH_AUTH_SOCK environment variable exists or set an override.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ingen SSH+agent socket tilgængelig. Sørg enten for at SSH_AUTH_SOCK eksisterer eller opsæt en overstyring.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SSH Agent connection is working!</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>SSH-agent-forbindelsen virker!</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -117,23 +117,23 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Reset Settings?</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Nulstil indstillingerne?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Are you sure you want to reset all general and security settings to default?</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Er du sikker på at du vil nulstille alle generelle og sikkerhedsindstillinger til standardværdierne?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Monochrome (light)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Monokrom (lys)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Monochrome (dark)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Monokrom (mørk)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Colorful</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Farverig</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -221,27 +221,27 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Remember previously used databases</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Husk tidligere anvendte databaser</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Load previously open databases on startup</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Indlæs tidligere anvendte databaser ved opstart</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remember database key files and security dongles</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Husk databasenøglefiler og sikkerhedsdongler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Check for updates at application startup once per week</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Søg efter opdateringer ved programstart en gang ugentligt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Include beta releases when checking for updates</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Medtag beta-udgivelser når der søges efter opdateringer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Language:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Sprog: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>(restart program to activate)</source>
|
||||
|
@ -310,7 +310,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Safely save database files (disable if experiencing problems with Dropbox, etc.)</source>
|
||||
<translation>Sicheres speichern der Datenbank (bei Problemen mit Dropbox, etc. deaktivieren)</translation>
|
||||
<translation>Sicheres Speichern der Datenbank (bei Problemen mit Dropbox, etc. deaktivieren)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>User Interface</source>
|
||||
@ -3107,7 +3107,7 @@ Das kann dazu führen, dass die betroffenen Plugins nicht mehr richtig funktioni
|
||||
</message>
|
||||
<message>
|
||||
<source>Open</source>
|
||||
<translation>Offen</translation>
|
||||
<translation>Öffnen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save</source>
|
||||
@ -6829,7 +6829,7 @@ Kernel: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> (Excluded)</source>
|
||||
<translation>(ausgeschlossen)</translation>
|
||||
<translation> (ausgeschlossen)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This entry is being excluded from reports</source>
|
||||
@ -6904,7 +6904,7 @@ Kernel: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> (Excluded)</source>
|
||||
<translation>(ausgeschlossen)</translation>
|
||||
<translation> (ausgeschlossen)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This entry is being excluded from reports</source>
|
||||
|
@ -137,6 +137,10 @@
|
||||
<source>Colorful</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>You must restart the application to set the new language. Would you like to restart now?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidgetGeneral</name>
|
||||
@ -168,10 +172,6 @@
|
||||
<source>Automatically save after every change</source>
|
||||
<translation>Automatically save after every change</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Automatically save on exit</source>
|
||||
<translation>Automatically save on exit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Automatically reload the database when modified externally</source>
|
||||
<translation>Automatically reload the database when modified externally</translation>
|
||||
@ -306,10 +306,6 @@
|
||||
<source>Automatically launch KeePassXC at system startup</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Mark database as modified for non-data changes (e.g., expanding groups)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Safely save database files (disable if experiencing problems with Dropbox, etc.)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
@ -346,6 +342,18 @@
|
||||
<source>Auto-Type start delay:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Automatically save when locking database</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Automatically save non-data changes when locking database</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tray icon type</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ApplicationSettingsWidgetSecurity</name>
|
||||
@ -4887,6 +4895,26 @@ Expect some bugs and minor issues, this version is not meant for production use.
|
||||
<source>You must restart the application to apply this setting. Would you like to restart now?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Perform Auto-Type Sequence</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>{USERNAME}</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>{USERNAME}{ENTER}</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>{PASSWORD}</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>{PASSWORD}{ENTER}</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ManageDatabase</name>
|
||||
@ -5370,10 +5398,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
|
||||
<comment>Password quality</comment>
|
||||
<translation>Excellent</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>ExtendedASCII</source>
|
||||
<translation>ExtendedASCII</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Switch to advanced mode</source>
|
||||
<translation>Switch to advanced mode</translation>
|
||||
@ -5382,58 +5406,22 @@ Expect some bugs and minor issues, this version is not meant for production use.
|
||||
<source>Advanced</source>
|
||||
<translation>Advanced</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A-Z</source>
|
||||
<translation>A-Z</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>a-z</source>
|
||||
<translation>a-z</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>0-9</source>
|
||||
<translation>0-9</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Braces</source>
|
||||
<translation>Braces</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>{[(</source>
|
||||
<translation>{[(</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Punctuation</source>
|
||||
<translation>Punctuation</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>.,:;</source>
|
||||
<translation>.,:;</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Quotes</source>
|
||||
<translation>Quotes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>" '</source>
|
||||
<translation>" '</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><*+!?=</source>
|
||||
<translation><*+!?=</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>\_|-/</source>
|
||||
<translation>\_|-/</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Logograms</source>
|
||||
<translation>Logograms</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>#$%&&@^`~</source>
|
||||
<translation>#$%&&@^`~</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Character set to exclude from generated password</source>
|
||||
<translation>Character set to exclude from generated password</translation>
|
||||
@ -5554,6 +5542,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
|
||||
<source>Regenerate password (%1)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Special Characters</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QApplication</name>
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -5883,7 +5883,7 @@ Võimalikud käsud:
|
||||
</message>
|
||||
<message>
|
||||
<source>Writing the database failed %1.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Andmebaasi kirjutamine ebaõnnestus: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Successfully added entry %1.</source>
|
||||
@ -6708,23 +6708,23 @@ Kernel: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>AES (%1 rounds)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>AES (%1 raundi)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Argon2 (%1 rounds, %2 KB)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Argon2 (%1 raundi, %2 KB)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>AES 256-bit</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>AES: 256-bitine</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Twofish 256-bit</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Twofish: 256-bitine</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>ChaCha20 256-bit</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ChaCha20: 256-bitine</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Benchmark %1 delay</source>
|
||||
|
@ -302,11 +302,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Automatically launch KeePassXC at system startup</source>
|
||||
<translation>Lance automatiquement KeepaxxXC au démarrage du système.</translation>
|
||||
<translation>Lancer automatiquement KeepassXC au démarrage du système.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Mark database as modified for non-data changes (e.g., expanding groups)</source>
|
||||
<translation>Indiquer la base de données comme modifiée pour les changements hors-données (par exemple : groupes développés)</translation>
|
||||
<translation>Considérer la base de données comme modifiée lors des modifications hors-données (par exemple : groupes développés)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Safely save database files (disable if experiencing problems with Dropbox, etc.)</source>
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -125,11 +125,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Monochrome (light)</source>
|
||||
<translation>Monochrome (licht)</translation>
|
||||
<translation>Monochroom (licht)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Monochrome (dark)</source>
|
||||
<translation>Monochrome (donker)</translation>
|
||||
<translation>Monochroom (donker)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Colorful</source>
|
||||
@ -180,7 +180,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Use group icon on entry creation</source>
|
||||
<translation>Gebruik groepspictogram voor nieuwe items</translation>
|
||||
<translation>Groepspictogram toepassen bij nieuwe items</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Minimize instead of app exit</source>
|
||||
@ -370,7 +370,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Forget TouchID after inactivity of</source>
|
||||
<translation>TouchID vergeten na inactiviteit van</translation>
|
||||
<translation>Touch ID vergeten na inactiviteit van</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Convenience</source>
|
||||
@ -382,7 +382,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Forget TouchID when session is locked or lid is closed</source>
|
||||
<translation>TouchID vergeten wanneer sessie wordt vergrendeld of deksel wordt gesloten</translation>
|
||||
<translation>Touch ID vergeten wanneer sessie wordt vergrendeld of deksel wordt gesloten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Lock databases after minimizing the window</source>
|
||||
@ -560,7 +560,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is requesting access to the following entries:</source>
|
||||
<translation>% 1 vraagt toegang tot de volgende vermeldingen:</translation>
|
||||
<translation>%1 vraagt toegang tot de volgende vermeldingen:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remember access to checked entries</source>
|
||||
@ -700,7 +700,8 @@ Wil je de bestaande instellingen nu migreren?</translation>
|
||||
|
||||
Give the connection a unique name or ID, for example:
|
||||
chrome-laptop.</source>
|
||||
<translation>Je hebt een associatieverzoek ontvangen voor de volgende database:%1
|
||||
<translation>Je hebt een associatieverzoek ontvangen voor de volgende database:
|
||||
%1
|
||||
|
||||
Geef de verbinding een unieke naam of ID, voorbeeld:
|
||||
chrome-laptop</translation>
|
||||
@ -919,7 +920,7 @@ chrome-laptop</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC-Browser is needed for the browser integration to work. <br />Download it for %1 and %2 and %3. %4</source>
|
||||
<translation>KeePassXC-Browser is vereist om de integratie van de browser te laten werken. <br /> download het voor %1 en %2 en %3. %4.</translation>
|
||||
<translation>KeePassXC-Browser is nodig om de integratie met de browser te laten werken. <br /> Download het voor %1 en %2 en %3. %4.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please see special instructions for browser extension use below</source>
|
||||
@ -1110,7 +1111,7 @@ chrome-laptop</translation>
|
||||
<name>CsvParserModel</name>
|
||||
<message numerus="yes">
|
||||
<source>%n column(s)</source>
|
||||
<translation><numerusform>1 kolom</numerusform><numerusform>%n kolom(men)</numerusform></translation>
|
||||
<translation><numerusform>%n kolom</numerusform><numerusform>%n kolom(men)</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1, %2, %3</source>
|
||||
@ -1236,7 +1237,7 @@ Het is raadzaam om een nieuw sleutelbestand te genereren.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unlock KeePassXC Database</source>
|
||||
<translation>Ontgrendel KeePassXC-database</translation>
|
||||
<translation>KeePassXC-database ontgrendelen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter Password:</source>
|
||||
@ -1272,7 +1273,7 @@ Het is raadzaam om een nieuw sleutelbestand te genereren.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>TouchID for Quick Unlock</source>
|
||||
<translation>TouchID voor snelle ontgrendeling</translation>
|
||||
<translation>Touch ID voor snelle ontgrendeling</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear</source>
|
||||
@ -1989,7 +1990,7 @@ Dit is zeker een fout, rapporteer dit aan de ontwikkelaars.</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Do you really want to move %n entry(s) to the recycle bin?</source>
|
||||
<translation><numerusform>Wil je echt %n item naar de Prullenbak verplaatsen?</numerusform><numerusform>Weet je zeker dat je %n item(s) naar de prullenbak wilt verplaatsen?</numerusform></translation>
|
||||
<translation><numerusform>Wil je echt %n item naar de Prullenbak verplaatsen?</numerusform><numerusform>Wil je echt %n items naar de Prullenbak verplaatsen?</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Execute command?</source>
|
||||
@ -2214,7 +2215,7 @@ Veilig opslaan uitschakelen en opnieuw proberen?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Edit entry</source>
|
||||
<translation>Item wijzigen</translation>
|
||||
<translation>Item bewerken</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>New attribute</source>
|
||||
@ -2361,11 +2362,11 @@ Veilig opslaan uitschakelen en opnieuw proberen?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>If checked, the entry will not appear in reports like Health Check and HIBP even if it doesn't match the quality requirements (e. g. password entropy or re-use). You can set the check mark if the password is beyond your control (e. g. if it needs to be a four-digit PIN) to prevent it from cluttering the reports.</p></body></html></source>
|
||||
<translation><html><head/><body><p>Indien aangevinkt, zal het item niet verschijnen in rapporten zoals Health Check en HIBP, zelfs als het niet voldoet aan de kwaliteitseisen (bijv. wachtwoord-entropie of hergebruik). Je kunt het vinkje plaatsen als je geen controle hebt over het wachtwoord (bijvoorbeeld als het een viercijferige pincode moet zijn) om te voorkomen dat de rapporten onoverzichtelijk worden.</p></body></html></translation>
|
||||
<translation><html><head/><body><p>Indien aangevinkt, zal het item niet verschijnen in rapportages zoals Health Check en HIBP, zelfs als het niet voldoet aan de kwaliteitseisen (bijv. wachtwoord-entropie of -hergebruik). Je kunt het vinkje plaatsen als je geen controle hebt over het wachtwoord (bijvoorbeeld als het een viercijferige pincode moet zijn) om te voorkomen dat de rapportages onoverzichtelijk worden.</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exclude from database reports</source>
|
||||
<translation>Uitsluiten van databaserapporten</translation>
|
||||
<translation>Uitsluiten van databaserapportage</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2432,7 +2433,7 @@ Veilig opslaan uitschakelen en opnieuw proberen?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Inherit default Auto-Type sequence from the group</source>
|
||||
<translation>Standaard auto-typevolgorde van de groep erven</translation>
|
||||
<translation>Standaard auto-typevolgorde van de groep overnemen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use custom Auto-Type sequence:</source>
|
||||
@ -2451,7 +2452,7 @@ Veilig opslaan uitschakelen en opnieuw proberen?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Skip Auto-Submit for this entry</source>
|
||||
<translation>Automatisch versturen uitzetten voor dit item</translation>
|
||||
<translation>Automatisch indienen uitschakelen voor dit item</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide this entry from the browser extension</source>
|
||||
@ -2553,7 +2554,7 @@ Veilig opslaan uitschakelen en opnieuw proberen?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Download favicon for URL</source>
|
||||
<translation>Pictogram downloaden voor URL</translation>
|
||||
<translation>Favicon downloaden voor URL</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password field</source>
|
||||
@ -2964,7 +2965,7 @@ Ondersteund zijn: %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Download favicon for URL</source>
|
||||
<translation>Pictogram downloaden voor URL</translation>
|
||||
<translation>Favicon downloaden voor URL</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Apply selected icon to subgroups and entries</source>
|
||||
@ -2988,11 +2989,11 @@ Ondersteund zijn: %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use default icon</source>
|
||||
<translation>Gebruik standaardicoon</translation>
|
||||
<translation>Standaardpictogram gebruiken</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use custom icon</source>
|
||||
<translation>Gebruik aangepast icoon</translation>
|
||||
<translation>Aangepast pictogram gebruiken</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Apply icon to...</source>
|
||||
@ -3610,7 +3611,7 @@ Je kunt de DuckDuckGo website pictogram dienst inschakelen in de sectie 'Be
|
||||
</message>
|
||||
<message>
|
||||
<source>Download Failed</source>
|
||||
<translation>Downloaden is mislukt</translation>
|
||||
<translation>Download is mislukt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Downloading favicons (%1/%2)...</source>
|
||||
@ -3884,7 +3885,7 @@ Deze actie is niet omkeerbaar. Je kunt de geïmporteerde database niet meer open
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid cipher uuid length: %1 (length=%2)</source>
|
||||
<translation>Ongeldige versleuteling uuid lengte: %1 (lengte=2%)</translation>
|
||||
<translation>Ongeldige versleuteling uuid lengte: %1 (lengte=%2)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to parse UUID: %1</source>
|
||||
@ -4524,11 +4525,11 @@ Wij raden je aan om de AppImage te gebruiken welke beschikbaar is op onze downlo
|
||||
</message>
|
||||
<message>
|
||||
<source>Add a new entry</source>
|
||||
<translation>Een nieuw item toevoegen</translation>
|
||||
<translation>Nieuw item toevoegen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>View or edit entry</source>
|
||||
<translation>Bekijk/bewerk item</translation>
|
||||
<translation>Item bekijken/bewerken</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Add a new group</source>
|
||||
@ -4650,15 +4651,15 @@ Houd rekening met fouten en kleine problemen. Deze versie is niet bedoeld voor r
|
||||
</message>
|
||||
<message>
|
||||
<source>&New Entry…</source>
|
||||
<translation>&Nieuw Item…</translation>
|
||||
<translation>&Nieuw item…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Edit Entry…</source>
|
||||
<translation>&Wijzig Item…</translation>
|
||||
<translation>Item &bewerken…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Delete Entry…</source>
|
||||
<translation>&Verwijder Item…</translation>
|
||||
<translation>Item &verwijderen…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&New Group…</source>
|
||||
@ -4666,7 +4667,7 @@ Houd rekening met fouten en kleine problemen. Deze versie is niet bedoeld voor r
|
||||
</message>
|
||||
<message>
|
||||
<source>&Edit Group…</source>
|
||||
<translation>&Wijzig Groep…</translation>
|
||||
<translation>Groep &bewerken…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Delete Group…</source>
|
||||
@ -4686,7 +4687,7 @@ Houd rekening met fouten en kleine problemen. Deze versie is niet bedoeld voor r
|
||||
</message>
|
||||
<message>
|
||||
<source>Database &Reports...</source>
|
||||
<translation>Database &Rapporten...</translation>
|
||||
<translation>Database-&rapportage...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Statistics, health check, etc.</source>
|
||||
@ -4834,7 +4835,8 @@ Houd rekening met fouten en kleine problemen. Deze versie is niet bedoeld voor r
|
||||
</message>
|
||||
<message>
|
||||
<source>You must restart the application to apply this setting. Would you like to restart now?</source>
|
||||
<translation>Je moet de applicatie opnieuw opstarten om deze instelling toe te passen. Wil je nu opnieuw opstarten?</translation>
|
||||
<translation>Je moet de applicatie opnieuw opstarten om deze instelling toe te passen.
|
||||
Wil je KeePassXC nu opnieuw opstarten?</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -4931,11 +4933,11 @@ Houd rekening met fouten en kleine problemen. Deze versie is niet bedoeld voor r
|
||||
</message>
|
||||
<message>
|
||||
<source>Removed custom data %1 [%2]</source>
|
||||
<translation>Gebruikersinstellingen verwijderd %1[%2]</translation>
|
||||
<translation>Gebruikersinstellingen verwijderd %1 [%2]</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Adding custom data %1 [%2]</source>
|
||||
<translation>Gebruikersinstellingen toegevoegd %1[%2]</translation>
|
||||
<translation>Gebruikersinstellingen toegevoegd %1 [%2]</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -5298,7 +5300,7 @@ Houd rekening met fouten en kleine problemen. Deze versie is niet bedoeld voor r
|
||||
</message>
|
||||
<message>
|
||||
<source>Password Quality: %1</source>
|
||||
<translation>Wachtwoordkwaliteit: %1</translation>
|
||||
<translation>Kwaliteit: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Poor</source>
|
||||
@ -5446,7 +5448,7 @@ Houd rekening met fouten en kleine problemen. Deze versie is niet bedoeld voor r
|
||||
</message>
|
||||
<message>
|
||||
<source>Regenerate password</source>
|
||||
<translation>Wachtwoord opnieuw genereren</translation>
|
||||
<translation>Opnieuw genereren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy password</source>
|
||||
@ -5502,7 +5504,7 @@ Houd rekening met fouten en kleine problemen. Deze versie is niet bedoeld voor r
|
||||
</message>
|
||||
<message>
|
||||
<source>Regenerate password (%1)</source>
|
||||
<translation>Wachtwoord opnieuw genereren (%1)</translation>
|
||||
<translation>Òpnieuw genereren (%1)</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -5561,7 +5563,7 @@ Houd rekening met fouten en kleine problemen. Deze versie is niet bedoeld voor r
|
||||
</message>
|
||||
<message>
|
||||
<source>Health Check</source>
|
||||
<translation>Gezondheidscontrole</translation>
|
||||
<translation>Gezondheid</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>HIBP</source>
|
||||
@ -5615,7 +5617,7 @@ Houd rekening met fouten en kleine problemen. Deze versie is niet bedoeld voor r
|
||||
</message>
|
||||
<message>
|
||||
<source>Database hash not available</source>
|
||||
<translation>Database-controlecijfer is niet beschikbaar</translation>
|
||||
<translation>Database-hashwaarde is niet beschikbaar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Client public key not received</source>
|
||||
@ -5728,7 +5730,7 @@ Houd rekening met fouten en kleine problemen. Deze versie is niet bedoeld voor r
|
||||
</message>
|
||||
<message>
|
||||
<source>Path of the entry to edit.</source>
|
||||
<translation>Pad van het te wijzigen item.</translation>
|
||||
<translation>Pad van het te bewerken item.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Estimate the entropy of a password.</source>
|
||||
@ -6042,7 +6044,7 @@ Beschikbare opdrachten:
|
||||
</message>
|
||||
<message>
|
||||
<source>Entropy %1 (%2)</source>
|
||||
<translation>Entropie %1 (2 %)</translation>
|
||||
<translation>Entropie %1 (%2)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>*** Password length (%1) != sum of length of parts (%2) ***</source>
|
||||
@ -6136,7 +6138,7 @@ Beschikbare opdrachten:
|
||||
</message>
|
||||
<message>
|
||||
<source>%1: (row, col) %2,%3</source>
|
||||
<translation>%1: (rij, col) 2%,3%</translation>
|
||||
<translation>%1: (rij, col) %2,%3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Argon2 (KDBX 4 – recommended)</source>
|
||||
@ -6574,7 +6576,7 @@ Kernelversie: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy the given attribute to the clipboard. Defaults to "password" if not specified.</source>
|
||||
<translation>Kopieer het gegeven kenmerk naar het klembord. Dit is "password" tenzij anders gespecificeerd.</translation>
|
||||
<translation>Kopieer het gegeven kenmerk naar het klembord. Dit is "wachtwoord" tenzij anders gespecificeerd.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy the current TOTP to the clipboard (equivalent to "-a totp").</source>
|
||||
@ -6590,7 +6592,7 @@ Kernelversie: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>ERROR: attribute %1 is ambiguous, it matches %2.</source>
|
||||
<translation>FOUT: attribuut %1 is dubbelzinnig, het komt overeen met %2.</translation>
|
||||
<translation>FOUT: kenmerk %1 is dubbelzinnig, het komt overeen met %2.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Attribute "%1" not found.</source>
|
||||
@ -6791,7 +6793,7 @@ Kernelversie: %3 %4</translation>
|
||||
<name>ReportsWidgetHealthcheck</name>
|
||||
<message>
|
||||
<source>Also show entries that have been excluded from reports</source>
|
||||
<translation>Toon ook vermeldingen die zijn uitgesloten van rapporten</translation>
|
||||
<translation>Toon ook vermeldingen die zijn uitgesloten van rapportage</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hover over reason to show additional details. Double-click entries to edit.</source>
|
||||
@ -6830,11 +6832,11 @@ Kernelversie: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This entry is being excluded from reports</source>
|
||||
<translation>Dit item wordt uitgesloten van rapporten</translation>
|
||||
<translation>Dit item wordt uitgesloten van rapportage</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please wait, health data is being calculated...</source>
|
||||
<translation>Even geduld, gezondheidsgegevens worden vergaard...</translation>
|
||||
<translation>Even geduld, gezondheidsgegevens worden verzameld...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Congratulations, everything is healthy!</source>
|
||||
@ -6862,14 +6864,14 @@ Kernelversie: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exclude from reports</source>
|
||||
<translation>Uitsluiten van rapporten</translation>
|
||||
<translation>Uitsluiten van rapportage</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ReportsWidgetHibp</name>
|
||||
<message>
|
||||
<source>CAUTION: This report requires sending information to the Have I Been Pwned online service (https://haveibeenpwned.com). If you proceed, your database passwords will be cryptographically hashed and the first five characters of those hashes will be sent securely to this service. Your database remains secure and cannot be reconstituted from this information. However, the number of passwords you send and your IP address will be exposed to this service.</source>
|
||||
<translation>LET OP: Voor dit rapport wordt informatie verzonden naar de online dienst Have I Been Pwned (https://haveibeenpwned.com). Als je doorgaat, worden je databasewachtwoorden cryptografisch gehasht en worden de eerste vijf tekens van die hashes op veilige wijze verzonden naar deze dienst. Jouw database blijft veilig en kan uit deze informatie niet worden samengesteld. Het aantal wachtwoorden dat je verzendt en je IP-adres worden wel blootgesteld aan deze dienst.</translation>
|
||||
<translation>LET OP: Voor deze rapportage wordt informatie verzonden naar de online dienst Have I Been Pwned (HIBP) (https://haveibeenpwned.com). Als je doorgaat, worden je databasewachtwoorden cryptografisch gehasht en worden de eerste vijf tekens van die hashes op veilige wijze verzonden naar deze dienst. Jouw database blijft veilig en kan uit deze informatie niet worden samengesteld. Het aantal wachtwoorden dat je verzendt en je IP-adres worden wel blootgesteld aan deze dienst.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Perform Online Analysis</source>
|
||||
@ -6877,7 +6879,7 @@ Kernelversie: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Also show entries that have been excluded from reports</source>
|
||||
<translation>Toon ook vermeldingen die zijn uitgesloten van rapporten</translation>
|
||||
<translation>Toon ook vermeldingen die zijn uitgesloten van rapportage</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This build of KeePassXC does not have network functions. Networking is required to check your passwords against Have I Been Pwned databases.</source>
|
||||
@ -6905,7 +6907,7 @@ Kernelversie: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This entry is being excluded from reports</source>
|
||||
<translation>Dit item wordt uitgesloten van rapporten</translation>
|
||||
<translation>Dit item wordt uitgesloten van rapportage</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>once</source>
|
||||
@ -6945,7 +6947,7 @@ Kernelversie: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exclude from reports</source>
|
||||
<translation>Uitsluiten van rapporten</translation>
|
||||
<translation>Uitsluiten van rapportage</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -7052,11 +7054,11 @@ Kernelversie: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Entries excluded from reports</source>
|
||||
<translation>Items die zijn uitgesloten van rapporten</translation>
|
||||
<translation>Items die zijn uitgesloten van rapportage</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excluding entries from reports, e. g. because they are known to have a poor password, isn't necessarily a problem but you should keep an eye on them.</source>
|
||||
<translation>Het uitsluiten van vermeldingen uit rapporten, bijv. omdat al bekend is dat ze een slecht wachtwoord hebben, is niet per se een probleem, maar je moet ze wel in de gaten houden.</translation>
|
||||
<translation>Het uitsluiten van vermeldingen uit rapportage, bijv. omdat al bekend is dat ze een slecht wachtwoord hebben, is niet per se een probleem, maar je moet ze wel in de gaten houden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Average password length</source>
|
||||
|
@ -302,7 +302,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Automatically launch KeePassXC at system startup</source>
|
||||
<translation>Iniciar KeePassXc ao arrancar o sistema</translation>
|
||||
<translation>Iniciar KeePassXC ao arrancar o sistema</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Mark database as modified for non-data changes (e.g., expanding groups)</source>
|
||||
@ -2991,11 +2991,11 @@ As extensões suportadas são: %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use default icon</source>
|
||||
<translation>Utilizar icon padrão</translation>
|
||||
<translation>Utilizar ícone padrão</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use custom icon</source>
|
||||
<translation>Utilizar icon padrão</translation>
|
||||
<translation>Utilizar ícone padrão</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Apply icon to...</source>
|
||||
@ -3467,7 +3467,7 @@ Tem a certeza de que deseja adicionar este ficheiro?</translation>
|
||||
<message>
|
||||
<source>Has attachments</source>
|
||||
<comment>Entry attachment icon toggle</comment>
|
||||
<translation>Tem anexosTem anexos</translation>
|
||||
<translation>Tem anexos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Has TOTP</source>
|
||||
@ -5129,7 +5129,7 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
|
||||
</message>
|
||||
<message>
|
||||
<source>Passphrase is required to decrypt this key</source>
|
||||
<translation>Necessita de uma palavra-passe para decifrar esta chave</translation>
|
||||
<translation>Necessita de uma frase-chave para decifrar esta chave</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key derivation failed, key file corrupted?</source>
|
||||
@ -5137,7 +5137,7 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
|
||||
</message>
|
||||
<message>
|
||||
<source>Decryption failed, wrong passphrase?</source>
|
||||
<translation>Falha ao decifrar, palavra-passe errada?</translation>
|
||||
<translation>Falha ao decifrar, frase-chave errada?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unexpected EOF while reading public key</source>
|
||||
@ -5283,7 +5283,7 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
|
||||
</message>
|
||||
<message>
|
||||
<source>Passphrase</source>
|
||||
<translation>Palavra-passe</translation>
|
||||
<translation>Frase-chave</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Wordlist:</source>
|
||||
@ -5589,7 +5589,7 @@ Pode encontrar erros graves e esta versão não deve ser utilizada em ambientes
|
||||
</message>
|
||||
<message>
|
||||
<source>Empty</source>
|
||||
<translation>Vazio</translation>
|
||||
<translation>Sim</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove</source>
|
||||
@ -5873,11 +5873,11 @@ Comandos disponíveis:
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate a new random diceware passphrase.</source>
|
||||
<translation>Gerar uma nova palavra-passe baseada em dados (diceware).</translation>
|
||||
<translation>Gerar uma frase-chave baseada em dados (diceware).</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Word count for the diceware passphrase.</source>
|
||||
<translation>Número de palavras para a palavra-passe.</translation>
|
||||
<translation>Número de palavras para a frase-chave.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Wordlist for the diceware generator.
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -6387,7 +6387,7 @@ Jadro: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Evaluating database entries against HIBP file, this will take a while...</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Hodnotenie položiek databázy oproti súboru HIBP, bude to chvíľu trvať…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Close the currently opened database.</source>
|
||||
@ -6467,7 +6467,7 @@ Jadro: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Only print the changes detected by the merge operation.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Vypisovať len zmeny zistený pri operácii zlúčenia.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Yubikey slot for the second database.</source>
|
||||
@ -6647,7 +6647,7 @@ Jadro: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Benchmarking key derivation function for %1ms delay.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>meranie výkonu funkcie odvodenia kľúča pre %1ms trvanie.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Setting %1 rounds for key derivation function.</source>
|
||||
@ -6748,7 +6748,7 @@ Jadro: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Benchmark %1 delay</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Meranie výkonu %1 oneskorenie</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 ms</source>
|
||||
@ -7253,7 +7253,7 @@ Jadro: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save current changes to activate the plugin and enable editing of this section.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Uložte aktuálne zmeny na aktiváciu zásuvného modulu a zapnutie úpravy tejto sekcie.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -7795,11 +7795,11 @@ Napríklad: JBSWY3DPEHPK3PXP</translation>
|
||||
<name>YubiKey</name>
|
||||
<message>
|
||||
<source>%1 [%2] Configured Slot - %3</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1 [%2] Nastavený slot – %3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 [%2] Challenge Response - Slot %3 - %4</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1[%2] Výzva – odpoveď – slot %3 – %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Press</source>
|
||||
|
@ -310,7 +310,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Safely save database files (disable if experiencing problems with Dropbox, etc.)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Spara databasfiler säkert (inaktivera vid problem med Dropbox etc)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>User Interface</source>
|
||||
@ -326,7 +326,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Tray icon type:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Typ av systemfältsikon:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reset settings to default…</source>
|
||||
@ -1092,15 +1092,15 @@ chrome-laptop.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Header lines skipped</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Rubriker undantagna</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>First line has field names</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Första raden har fältnamn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Not Present</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Inte tillgänglig</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Column %1</source>
|
||||
@ -1332,11 +1332,11 @@ Om du inte har någon nyckelfil, lämnar du fältet tomt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database's security settings.</p><p>This is <strong>not</strong> your *.kdbx database file!<br>If you do not have a key file, leave this field empty.</p><p>Click for more information...</p></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation><p>Som tillägg till ditt huvudlösenord, kan du använda en hemlig fil för att förbättra säkerheten i din databas. En sådan fil kan genereras i databasens säkerhetsinställningar.</p><p>Detta är <strong>inte</strong> din *.kdbx-databasfil!<br>Om du inte har någon nyckelfil, lämnar du fältet tomt.</p><p>Klicka för mer information...</p></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key file to unlock the database</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Nyckelfil för att låsa upp databasen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please touch the button on your YubiKey!</source>
|
||||
@ -1386,7 +1386,7 @@ Om du inte har någon nyckelfil, lämnar du fältet tomt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database Credentials</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Databasens inloggningsuppgifter</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -1562,7 +1562,7 @@ Vill du verkligen fortsätta utan lösenord?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to change database credentials</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kunde inte ändra databasens inloggningsuppgifter</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2162,7 +2162,7 @@ Vill du inaktivera "Spara säkert" och försöka igen?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not find database file: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kunde inte hitta databasfilen: %1</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -3662,22 +3662,22 @@ Om detta upprepas, kan din databasfil vara skadad.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to calculate database key</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kan inte beräkna databasnyckeln</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to issue challenge-response: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kunde inte utfärda challenge-response: %1</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Kdbx3Writer</name>
|
||||
<message>
|
||||
<source>Unable to issue challenge-response: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kunde inte utfärda challenge-response: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to calculate database key</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kan inte beräkna databasnyckeln</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -3806,7 +3806,7 @@ Om detta upprepas, kan din databasfil vara skadad.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to calculate database key: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kan inte beräkna databasnyckel: %1</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -3827,7 +3827,7 @@ Om detta upprepas, kan din databasfil vara skadad.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to calculate database key: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kunde inte beräkna databasnyckel: %1</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -4027,15 +4027,15 @@ Rad %2, kolumn: %3</translation>
|
||||
<name>KeeAgentSettings</name>
|
||||
<message>
|
||||
<source>Invalid KeeAgent settings file structure.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ogiltig KeeAgent-inställningsfilstruktur.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Private key is an attachment but no attachments provided.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Privat nyckel är en bifogad fil men inga bilagor tillhandahålls.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Private key is empty</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Privat nyckel är tom</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File too large to be a private key</source>
|
||||
@ -4212,7 +4212,7 @@ Om detta upprepas, kan din databasfil vara skadad.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to calculate database key</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kan inte beräkna databasnyckeln</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -4392,7 +4392,10 @@ Vill du verkligen fortsätta med den här filen?</translation>
|
||||
unsupported in the future.
|
||||
|
||||
Generate a new key file in the database security settings.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Du använder ett äldre nyckelfilsformat som kanske inte
|
||||
kommer att stödjas i framtiden.
|
||||
|
||||
Generera en ny nyckelfil i databasens säkerhetsinställningar.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -4683,11 +4686,11 @@ Vissa fel och mindre problem kan uppstå. Denna version är inte ämnad för dag
|
||||
</message>
|
||||
<message>
|
||||
<source>Database &Security…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Databas&säkerhet...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database &Reports...</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Databas&rapporter...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Statistics, health check, etc.</source>
|
||||
@ -4735,11 +4738,11 @@ Vissa fel och mindre problem kan uppstå. Denna version är inte ämnad för dag
|
||||
</message>
|
||||
<message>
|
||||
<source>&CSV File…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>&CSV-fil...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&HTML File…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>&HTML-fil...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePass 1 Database…</source>
|
||||
@ -4771,7 +4774,7 @@ Vissa fel och mindre problem kan uppstå. Denna version är inte ämnad för dag
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Getting Started Guide</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Öppna Kom-igång-guiden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Online Help</source>
|
||||
@ -4779,7 +4782,7 @@ Vissa fel och mindre problem kan uppstå. Denna version är inte ämnad för dag
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to online documentation</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Gå till online-dokumentationen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open User Guide</source>
|
||||
@ -4823,7 +4826,7 @@ Vissa fel och mindre problem kan uppstå. Denna version är inte ämnad för dag
|
||||
</message>
|
||||
<message>
|
||||
<source>Show Preview Panel</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Visa förhandsgranskningspanelen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Don't show again for this version</source>
|
||||
@ -4831,11 +4834,11 @@ Vissa fel och mindre problem kan uppstå. Denna version är inte ämnad för dag
|
||||
</message>
|
||||
<message>
|
||||
<source>Restart Application?</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Vill du starta om programmet?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>You must restart the application to apply this setting. Would you like to restart now?</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Du måste starta om programmet för att tillämpa den här inställningen. Vill du starta om nu?</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -4978,11 +4981,11 @@ Vissa fel och mindre problem kan uppstå. Denna version är inte ämnad för dag
|
||||
<name>NewDatabaseWizardPageDatabaseKey</name>
|
||||
<message>
|
||||
<source>Database Credentials</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Databasens inloggningsuppgifter</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A set of credentials known only to you that protects your database.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>En uppsättning inloggningsuppgifter som bara du känner till, skyddar din databas.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -5192,15 +5195,15 @@ Vissa fel och mindre problem kan uppstå. Denna version är inte ämnad för dag
|
||||
</message>
|
||||
<message>
|
||||
<source>Toggle Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Växla lösenord (%1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate Password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Generera lösenord (%1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Caps Lock enabled!</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Varning! Caps Lock aktiverat!</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -5467,19 +5470,19 @@ Vissa fel och mindre problem kan uppstå. Denna version är inte ämnad för dag
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate Password</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Generera lösenord</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Also choose from:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Välj också från:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Additional characters to use for the generated password</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fler tecken att användas för lösenordsgenerering</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Additional characters</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fler tecken</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Word Count:</source>
|
||||
@ -5491,7 +5494,7 @@ Vissa fel och mindre problem kan uppstå. Denna version är inte ämnad för dag
|
||||
</message>
|
||||
<message>
|
||||
<source>Apply Password</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tillämpa lösenordet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Ctrl+S</source>
|
||||
@ -5503,7 +5506,7 @@ Vissa fel och mindre problem kan uppstå. Denna version är inte ämnad för dag
|
||||
</message>
|
||||
<message>
|
||||
<source>Regenerate password (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Generera om lösenordet (%1)</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -5518,51 +5521,51 @@ Vissa fel och mindre problem kan uppstå. Denna version är inte ämnad för dag
|
||||
</message>
|
||||
<message>
|
||||
<source>Very weak password</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Mycket svagt lösenord</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password entropy is %1 bits</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Lösenordsentropin är %1 bitar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Weak password</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Svagt lösenord</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Used in %1/%2</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Använt i %1/%2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password is used %1 times</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Lösenordet används %1 gånger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password has expired</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Lösenordet har upphört att gälla</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password expiry was %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Lösenordet upphörde att gälla %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password is about to expire</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Lösenordet upphör snart att gälla</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password expires in %1 days</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Lösenordet upphör att gälla om %1 dagar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password will expire soon</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Lösenordet upphör snart att gälla</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password expires on %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Lösenordet upphör att gälla %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Health Check</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Hälsokontroll</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>HIBP</source>
|
||||
@ -6556,7 +6559,7 @@ Kärna: %3 %4</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Password for '%1' has been leaked %2 time(s)!</source>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
<translation><numerusform>Lösenordet för "%1" har läckts %2 gång!</numerusform><numerusform>Lösenordet för "%1" har läckts %2 gånger!</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid password generator after applying all options</source>
|
||||
@ -6568,190 +6571,191 @@ Kärna: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browser Plugin Failure</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Webbläsartillägget misslyckades</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not save the native messaging script file for %1.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kunde inte spara den inbyggda meddelandeskriptfilen för %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy the given attribute to the clipboard. Defaults to "password" if not specified.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kopiera det angivna attributet till urklipp. Standardvärdet är "password" om inget annat anges.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy the current TOTP to the clipboard (equivalent to "-a totp").</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kopiera aktuell TOTP till urklipp (motsvarar "-a totp").</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy an entry's attribute to the clipboard.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kopiera en posts attribut till urklipp.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>ERROR: Please specify one of --attribute or --totp, not both.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>FEL: Ange antingen --attribute eller --totp, inte bägge.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>ERROR: attribute %1 is ambiguous, it matches %2.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>FEL: attributet %1 är tvetydigt, det matchar %2.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Attribute "%1" not found.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kunde inte hitta attributet "%1".</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Entry's "%1" attribute copied to the clipboard!</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Attributet "%1" kopierat till urklipp!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Yubikey slot and optional serial used to access the database (e.g., 1:7370001).</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Yubikey-plats och valfritt serienummer som används för att komma åt databasen (t.ex. 1:7370001).</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>slot[:serial]</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>slot[:serial]</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Target decryption time in MS for the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Målets avkrypteringstid i ms för databasen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>time</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>tid</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set the key file for the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ange nyckelfil för databasen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set a password for the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ange lösenord för databasen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid decryption time %1.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ogiltig avkrypteringstid %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Target decryption time must be between %1 and %2.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Målets avkrypteringstid måste vara mellan %1 och %2.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to set database password.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kunde inte ange databaslösenord.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Benchmarking key derivation function for %1ms delay.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Benchmarking nyckelhärledningsfunktion för %1ms fördröjning.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Setting %1 rounds for key derivation function.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Anger %1 rundor för nyckelhärledningsfunktionen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>error while setting database key derivation settings.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>fel vid inställning av databasens nyckel härledning.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Format to use when exporting. Available choices are 'xml' or 'csv'. Defaults to 'xml'.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Format att använda vid export. Tillgängliga alternativ är "xml" eller "csv". Standardvärdet är "xml".</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to import XML database: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kunde inte importera XML-databas: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show a database's information.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Visa en databas information.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>UUID: </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>UUID: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Name: </source>
|
||||
<translation>Namn:</translation>
|
||||
<translation>Namn: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Description: </source>
|
||||
<translation>Beskrivning:</translation>
|
||||
<translation>Beskrivning: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cipher: </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Chiffer: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KDF: </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>KDF: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Recycle bin is enabled.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Papperskorgen är aktiverad.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Recycle bin is not enabled.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Papperskorgen är inte aktiverad.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid command %1.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ogiltigt kommando %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid YubiKey serial %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ogiltigt YubiKey serienummer %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please touch the button on your YubiKey to continue…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tryck på knappen på din YubiKey för att fortsätta...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do you want to create a database with an empty password? [y/N]: </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Vill du skapa en databas med ett tomt lösenord? [y/N]: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Repeat password: </source>
|
||||
<translation>Repetera lösenord:</translation>
|
||||
<translation>Upprepa lösenordet: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error: Passwords do not match.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fel: Lösenorden stämmer inte.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>All clipping programs failed. Tried %1
|
||||
</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Alla klippprogram misslyckades. Försökte med %1
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>AES (%1 rounds)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>AES (%1 rundor)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Argon2 (%1 rounds, %2 KB)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Argon2 (%1 rundor, %2 KB)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>AES 256-bit</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>AES 256-bit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Twofish 256-bit</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Twofish 256-bit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>ChaCha20 256-bit</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ChaCha20 256-bit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Benchmark %1 delay</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Benchmark %1 fördröjning</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 ms</source>
|
||||
<comment>milliseconds</comment>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
<translation><numerusform>%1 ms</numerusform><numerusform>%1 ms</numerusform></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 s</source>
|
||||
<comment>seconds</comment>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
<translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -6792,20 +6796,20 @@ Kärna: %3 %4</translation>
|
||||
<name>ReportsWidgetHealthcheck</name>
|
||||
<message>
|
||||
<source>Also show entries that have been excluded from reports</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Visa också poster som har undantagits från rapporter</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hover over reason to show additional details. Double-click entries to edit.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Håll muspekaren över anledning, för att visa fler detaljer. Dubbelklicka på posten för att redigera.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bad</source>
|
||||
<comment>Password quality</comment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Usel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Bad — password must be changed</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Usel — Lösenordet måste ändras</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Poor</source>
|
||||
@ -6814,7 +6818,7 @@ Kärna: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Poor — password should be changed</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Dålig — Lösenordet måste ändras</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Weak</source>
|
||||
@ -6823,23 +6827,23 @@ Kärna: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Weak — consider changing the password</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Svag — Överväg att ändra lösenordet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> (Excluded)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation> (Undantagen)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This entry is being excluded from reports</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Denna post undantas från rapporter</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please wait, health data is being calculated...</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Vänta, hälsodata beräknas...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Congratulations, everything is healthy!</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Grattis! Allt är friskt!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Title</source>
|
||||
@ -6851,7 +6855,7 @@ Kärna: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Score</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Poäng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reason</source>
|
||||
@ -6863,30 +6867,30 @@ Kärna: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exclude from reports</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Undanta från rapporter</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ReportsWidgetHibp</name>
|
||||
<message>
|
||||
<source>CAUTION: This report requires sending information to the Have I Been Pwned online service (https://haveibeenpwned.com). If you proceed, your database passwords will be cryptographically hashed and the first five characters of those hashes will be sent securely to this service. Your database remains secure and cannot be reconstituted from this information. However, the number of passwords you send and your IP address will be exposed to this service.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>VARNING! Denna rapport kräver att du skickar information till onlinetjänsten Have I Been Pwned (https://haveibeenpwned.com). Om du fortsätter kommer dina databaslösenord att hashas kryptografiskt och de första fem tecknen i dessa hashar kommer att skickas säkert till den här tjänsten. Databasen förblir säker och kan inte rekonstitueras från denna information. Antalet lösenord som du skickar och din IP-adress kommer dock att exponeras för den här tjänsten.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Perform Online Analysis</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Utför online-analys</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Also show entries that have been excluded from reports</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Visa även poster som har uteslutits från rapporter</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This build of KeePassXC does not have network functions. Networking is required to check your passwords against Have I Been Pwned databases.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Denna version av KeePassXC har inga nätverksfunktioner. Nätverk krävs för att kontrollera dina lösenord mot Have I Been Pwned-databaser.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Congratulations, no exposed passwords!</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Grattis, inga exponerade lösenord!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Title</source>
|
||||
@ -6898,55 +6902,55 @@ Kärna: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password exposed…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Lösenord exponerat...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> (Excluded)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation> (Undantaget)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This entry is being excluded from reports</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Denna post har undantagits från rapporter</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>once</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>en gång</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>up to 10 times</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>upp till 10 gånger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>up to 100 times</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>upp till 100 gånger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>up to 1000 times</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>upp till 1000 gånger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>up to 10,000 times</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>upp till 10000 gånger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>up to 100,000 times</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>upp till 100000 gånger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>up to a million times</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>upp till en miljon gånger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>millions of times</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>milljoner gånger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Edit Entry...</source>
|
||||
<translation>Redigera post...</translation>
|
||||
<translation>Redigera posten...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exclude from reports</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Undanta från rapporter</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -7053,11 +7057,11 @@ Kärna: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Entries excluded from reports</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Poster undantagna från rapporter</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Excluding entries from reports, e. g. because they are known to have a poor password, isn't necessarily a problem but you should keep an eye on them.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Att utesluta poster från rapporter, t.ex. för att de har ett svagt lösenord, är inte nödvändigtvis ett problem, men du bör hålla ett öga på dem.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Average password length</source>
|
||||
@ -7108,11 +7112,11 @@ Kärna: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key identity ownership conflict. Refusing to add.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Nyckelidentitets ägarskapskonflikt. Nekar att lägga till.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No agent running, cannot list identities.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tjänsten körs inte, kan inte lista identiteter.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -7234,19 +7238,19 @@ Kärna: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Don't confirm when entries are deleted by clients</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Bekräfta inte när poster tas bort av klienter</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><b>Error:</b> Failed to connect to DBus. Please check your DBus setup.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation><b>Fel:</b> Kunde inte ansluta till DBus. Kontrollera din DBus-installation.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><b>Warning:</b> </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation><b>Varning!</b> </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save current changes to activate the plugin and enable editing of this section.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Spara aktuella ändringar för att aktivera insticksmodulen och aktivera redigering av det här avsnittet.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -7788,11 +7792,11 @@ Exempel: JBSWY3DPEHPK3PXP</translation>
|
||||
<name>YubiKey</name>
|
||||
<message>
|
||||
<source>%1 [%2] Configured Slot - %3</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1 [%2] Konfigurerad plats - %3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 [%2] Challenge Response - Slot %3 - %4</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1 [%2] Challenge Response - Plats %3 - %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Press</source>
|
||||
@ -7804,31 +7808,31 @@ Exempel: JBSWY3DPEHPK3PXP</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 Invalid slot specified - %2</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1 Ogiltig plats specificerad - %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The YubiKey interface has not been initialized.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>YubiKey-gränssnittet har inte startats.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hardware key is currently in use.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Hårdvarunyckel används för närvarande.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not find hardware key with serial number %1. Please plug it in to continue.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kunde hitta hårdvarunyckel med serienummer %1. Anslut den för att fortsätta.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hardware key timed out waiting for user interaction.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Hårdvarunyckelns tidsgräns för användarinteraktion överskreds.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A USB error ocurred when accessing the hardware key: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ett USB-fel uppstod vid åtkomst till maskinvarunyckeln: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to complete a challenge-response, the specific error was: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kunde inte slutföra en challenge-response, det specifika felet var: %1</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -7855,11 +7859,11 @@ Exempel: JBSWY3DPEHPK3PXP</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not find any hardware keys!</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kunde inte hitta några hårdvarunycklar!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Selected hardware key slot does not support challenge-response!</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Den valda maskinvarunyckelplatsen stöder inte challenge-response!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Detecting hardware keys…</source>
|
||||
|
@ -66,7 +66,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>(empty)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>(ว่าง)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No SSH Agent socket available. Either make sure SSH_AUTH_SOCK environment variable exists or set an override.</source>
|
||||
@ -125,15 +125,15 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Monochrome (light)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>สีเดียว (สว่าง)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Monochrome (dark)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>สีเดียว (มืด)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Colorful</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>สีสดใส</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -221,7 +221,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Remember previously used databases</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>จำฐานข้อมูลที่ใช้ครั้งที่แล้ว</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Load previously open databases on startup</source>
|
||||
@ -229,15 +229,15 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Remember database key files and security dongles</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>จำแฟ้มกุญแจและดองเกิลความปลอดภัยที่ใช้กับฐานข้อมูล</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Check for updates at application startup once per week</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ตรวจสอบการปรับปรุงสัปดาห์ละครั้งขณะเปิดแอป</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Include beta releases when checking for updates</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ให้ตรวจสอบรุ่นทดสอบเบตาด้วย ขณะตรวจสอบการปรับปรุง</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Language:</source>
|
||||
@ -245,7 +245,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>(restart program to activate)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>(เริ่มโปรแกรมใหม่เพื่อใช้งาน)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Minimize window after unlocking database</source>
|
||||
@ -265,7 +265,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Drop to background</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>หลบไปอยู่ที่ฉากหลัง</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Favicon download timeout:</source>
|
||||
@ -273,7 +273,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Website icon download timeout in seconds</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>จำนวนวินาทีที่จะพยายามดาวน์โหลดไอคอนของเว็บไซต์</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> sec</source>
|
||||
@ -302,7 +302,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Automatically launch KeePassXC at system startup</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>เรียกให้ KeePassXC โดยอัตโนมัติเมื่อเริ่มระบบ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Mark database as modified for non-data changes (e.g., expanding groups)</source>
|
||||
@ -314,7 +314,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>User Interface</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ส่วนติดต่อผู้ใช้</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toolbar button style:</source>
|
||||
@ -326,7 +326,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Tray icon type:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ชนิดไอคอนที่ถาด:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reset settings to default…</source>
|
||||
@ -556,7 +556,7 @@
|
||||
<name>BrowserAccessControlDialog</name>
|
||||
<message>
|
||||
<source>KeePassXC - Browser Access Request</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>KeePassXC - การขอเข้าถึงเบราว์เซอร์</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is requesting access to the following entries:</source>
|
||||
@ -712,7 +712,7 @@ chrome-laptop.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable browser integration</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>เปิดใช้การผสานกับเว็บเบราว์เซอร์</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>General</source>
|
||||
@ -720,7 +720,7 @@ chrome-laptop.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browsers installed as snaps are currently not supported.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ยังไม่รองรับเบราว์เซอร์ที่ถูกติดตั้งจาก Snap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable integration for these browsers:</source>
|
||||
@ -728,31 +728,31 @@ chrome-laptop.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Vivaldi</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Vivaldi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Edge</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>&Edge</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Firefox</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Firefox</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tor Browser</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tor Browser</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Brave</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Brave</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Google Chrome</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Google Chrome</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Chromium</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Chromium</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show a notification when credentials are requested</source>
|
||||
@ -864,7 +864,7 @@ chrome-laptop.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browser for custom proxy file</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>เรียกดูแฟ้มพร็อกซีที่กำหนดเอง</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse...</source>
|
||||
@ -877,7 +877,7 @@ chrome-laptop.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browser type:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ชนิดเบราว์เซอร์:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toolbar button style</source>
|
||||
@ -897,7 +897,7 @@ chrome-laptop.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse for custom browser path</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>เบราว์เซอร์จากพาธที่ตั้งเบราว์เซอร์ที่ระบุเอง</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Custom extension ID:</source>
|
||||
@ -913,7 +913,7 @@ chrome-laptop.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC-Browser is needed for the browser integration to work. <br />Download it for %1 and %2 and %3. %4</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>จำเป็นต้องมีโปรแกรม KeePassXC-Browser เพื่อให้การผสานกับเบราว์เซอร์ทำงานได้ <br />ดาวน์โหลดมันสำหรับ %1 และ %2 และ %3. %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please see special instructions for browser extension use below</source>
|
||||
@ -1144,19 +1144,20 @@ chrome-laptop.</source>
|
||||
<message>
|
||||
<source>%1
|
||||
Backup database located at %2</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1
|
||||
พบฐานข้อมูลสำรองที่ %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not save, database does not point to a valid file.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ไม่สามารถบันทึกได้ ฐานข้อมูลไม่ได้ถูกชี้ไปยังแฟ้มที่ใช้งานได้</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not save, database file is read-only.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ไม่สามารถบันทึกได้ แฟ้มฐานข้อมูลเป็นแบบอ่านอย่างเดียว</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database file has unmerged changes.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>แฟ้มฐานข้อมูลมีความเปลี่ยนแปลงที่ยังไม่ถูกบันทึกกลับ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Recycle Bin</source>
|
||||
@ -1236,7 +1237,7 @@ Please consider generating a new key file.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password field</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ช่องรหัสผ่าน</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hardware key slot selection</source>
|
||||
@ -1244,7 +1245,7 @@ Please consider generating a new key file.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse for key file</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>เลือกแฟ้มกุญแจ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse...</source>
|
||||
@ -1287,7 +1288,7 @@ To prevent this error from appearing, you must go to "Database Settings / S
|
||||
</message>
|
||||
<message>
|
||||
<source>Retry with empty password</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ลองด้วยรหัสผ่านว่างเปล่า</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter Additional Credentials (if any):</source>
|
||||
@ -1308,7 +1309,7 @@ To prevent this error from appearing, you must go to "Database Settings / S
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot use database file as key file</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ไม่สามารถใช้แฟ้มฐานข้อมูลเป็นแฟ้มกุญแจได้</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>You cannot use your database file as a key file.
|
||||
@ -1337,7 +1338,7 @@ If you do not have a key file, please leave the field empty.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Select hardware key…</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>เลือกกุญแจกายภาพ...</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -1481,7 +1482,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Stored browser keys</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>กุญแจเบราว์เซอร์ที่ถูกเก็บอยู่</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove selected key</source>
|
||||
@ -1699,11 +1700,11 @@ If you keep this number, your database may be too easy to crack!</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>?? ms</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>?? มิลลิวินาที</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>? s</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>? วิ</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2426,7 +2427,7 @@ Disable safe saves and try again?</source>
|
||||
<name>EditEntryWidgetBrowser</name>
|
||||
<message>
|
||||
<source>These settings affect to the entry's behaviour with the browser extension.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>การตั้งค่าเหล่านี้จะส่งผลต่อพฤติกรรมการป้อนข้อมูลด้วยส่วนเสริมในเบราว์เซอร์</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>General</source>
|
||||
@ -2438,11 +2439,11 @@ Disable safe saves and try again?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide this entry from the browser extension</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ซ่อนรายการข้อมูลนี้จากส่วนเสริมในเบราว์เซอร์</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Additional URL's</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>URL เพิ่มเติม</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Add</source>
|
||||
@ -2454,7 +2455,7 @@ Disable safe saves and try again?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Edit</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>แก้ไข</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Only send this setting to the browser for HTTP Auth dialogs. If enabled, normal login forms will not show this entry for selection.</source>
|
||||
@ -2497,11 +2498,11 @@ Disable safe saves and try again?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete selected history state</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ลบช่วงประวัติที่เลือก</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete all history</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ลบประวัติทั้งหมด</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2540,15 +2541,15 @@ Disable safe saves and try again?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password field</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ช่องรหัสผ่าน</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toggle notes visible</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>สลับให้เห็นบันทึก</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expiration field</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ช่องการหมดอายุ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expiration Presets</source>
|
||||
@ -2560,19 +2561,19 @@ Disable safe saves and try again?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Notes field</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ชื่อบันทึก</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Title field</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ช่องหัวเรื่อง</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Username field</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ช่องชื่อผู้ใช้</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toggle expiration</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>สลับการหมดอายุ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Notes:</source>
|
||||
@ -2584,7 +2585,7 @@ Disable safe saves and try again?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expires:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>หมดอายุ:</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -2668,7 +2669,7 @@ Disable safe saves and try again?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browser for key file</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>เรียกดูแฟ้มกุญแจ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>External key file</source>
|
||||
@ -2812,7 +2813,7 @@ Supported extensions are: %1.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password field</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ช่องรหัสผ่าน</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear fields</source>
|
||||
@ -2820,7 +2821,7 @@ Supported extensions are: %1.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse for share file</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>เรียกดูแฟ้มที่แบ่งปัน</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse...</source>
|
||||
@ -2831,15 +2832,15 @@ Supported extensions are: %1.</source>
|
||||
<name>EditGroupWidgetMain</name>
|
||||
<message>
|
||||
<source>Name field</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ช่องชื่อ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Notes field</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ชื่อบันทึก</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toggle expiration</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>สลับการหมดอายุ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-Type toggle for this and sub groups</source>
|
||||
@ -2847,7 +2848,7 @@ Supported extensions are: %1.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expiration field</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ช่องการหมดอายุ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Search toggle for this and sub groups</source>
|
||||
@ -2859,7 +2860,7 @@ Supported extensions are: %1.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expires:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>หมดอายุ:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use default Auto-Type sequence of parent group</source>
|
||||
@ -2867,7 +2868,7 @@ Supported extensions are: %1.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-Type:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Auto-Type:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Search:</source>
|
||||
@ -2879,7 +2880,7 @@ Supported extensions are: %1.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Name:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ชื่อ:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set default Auto-Type sequence</source>
|
||||
@ -3043,7 +3044,7 @@ This may cause the affected plugins to malfunction.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unique ID</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>รหัสระบุตัวที่ไม่ซ้ำ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Plugin data</source>
|
||||
@ -3576,7 +3577,7 @@ You can enable the DuckDuckGo website icon service in the security section of th
|
||||
</message>
|
||||
<message>
|
||||
<source>Downloading...</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>กำลังดาวน์โหลด...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Ok</source>
|
||||
@ -3584,15 +3585,15 @@ You can enable the DuckDuckGo website icon service in the security section of th
|
||||
</message>
|
||||
<message>
|
||||
<source>Already Exists</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>มีอยู่แล้ว</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Download Failed</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>การดาวน์โหลดล้มเหลว</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Downloading favicons (%1/%2)...</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>กำลังดาวน์โหลด favicon (%1/%2)...</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -4224,11 +4225,11 @@ If this reoccurs, then your database file may be corrupt.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Imported from</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>นำเข้าจาก</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Exported to</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ส่งออกไป</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Synchronized with</source>
|
||||
@ -4324,11 +4325,11 @@ Message: %2</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key file selection</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>เลือกแฟ้มกุญแจ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse for key file</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>เลือกแฟ้มกุญแจ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse...</source>
|
||||
@ -4336,7 +4337,7 @@ Message: %2</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate a new key file</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>สร้างแฟ้มกุญแจใหม่</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
|
||||
@ -5197,7 +5198,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
|
||||
</message>
|
||||
<message>
|
||||
<source>Password field</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ช่องรหัสผ่าน</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Repeat password field</source>
|
||||
@ -6246,7 +6247,7 @@ Available commands:
|
||||
</message>
|
||||
<message>
|
||||
<source>Build Type: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>ชนิดรุ่นที่สร้าง: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Revision: %1</source>
|
||||
@ -6538,7 +6539,7 @@ Kernel: %3 %4</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browser Plugin Failure</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>โปรแกรมเสริมเบราว์เซอร์ล้มเหลว</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not save the native messaging script file for %1.</source>
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -5037,7 +5037,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to process clearText in place</source>
|
||||
<translation>无法直接处理纯文本。</translation>
|
||||
<translation>无法原地处理纯文本。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expected %1 bytes of clear-text, found %2</source>
|
||||
|
@ -1,5 +1,5 @@
|
||||
name: keepassxc
|
||||
version: 2.6.0
|
||||
version: 2.6.1
|
||||
grade: stable
|
||||
summary: Community-driven port of the Windows application “KeePass Password Safe”
|
||||
description: |
|
||||
|
@ -233,7 +233,7 @@ void AutoType::executeAutoTypeActions(const Entry* entry, QWidget* hideWindow, c
|
||||
macUtils()->raiseLastActiveWindow();
|
||||
m_plugin->hideOwnWindow();
|
||||
#else
|
||||
hideWindow->showMinimized();
|
||||
getMainWindow()->minimizeOrHide();
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -269,7 +269,7 @@ void AutoType::executeAutoTypeActions(const Entry* entry, QWidget* hideWindow, c
|
||||
|
||||
/**
|
||||
* Single Autotype entry-point function
|
||||
* Perfom autotype sequence in the active window
|
||||
* Look up the Auto-Type sequence for the given entry then perfom Auto-Type in the active window
|
||||
*/
|
||||
void AutoType::performAutoType(const Entry* entry, QWidget* hideWindow)
|
||||
{
|
||||
@ -285,6 +285,19 @@ void AutoType::performAutoType(const Entry* entry, QWidget* hideWindow)
|
||||
executeAutoTypeActions(entry, hideWindow, sequences.first());
|
||||
}
|
||||
|
||||
/**
|
||||
* Extra Autotype entry-point function
|
||||
* Perfom Auto-Type of the directly specified sequence in the active window
|
||||
*/
|
||||
void AutoType::performAutoTypeWithSequence(const Entry* entry, const QString& sequence, QWidget* hideWindow)
|
||||
{
|
||||
if (!m_plugin) {
|
||||
return;
|
||||
}
|
||||
|
||||
executeAutoTypeActions(entry, hideWindow, sequence);
|
||||
}
|
||||
|
||||
void AutoType::startGlobalAutoType()
|
||||
{
|
||||
m_windowForGlobal = m_plugin->activeWindow();
|
||||
|
@ -48,6 +48,7 @@ public:
|
||||
static bool checkHighDelay(const QString& string);
|
||||
static bool verifyAutoTypeSyntax(const QString& sequence);
|
||||
void performAutoType(const Entry* entry, QWidget* hideWindow = nullptr);
|
||||
void performAutoTypeWithSequence(const Entry* entry, const QString& sequence, QWidget* hideWindow = nullptr);
|
||||
|
||||
inline bool isAvailable()
|
||||
{
|
||||
|
@ -37,9 +37,11 @@ BrowserAccessControlDialog::~BrowserAccessControlDialog()
|
||||
{
|
||||
}
|
||||
|
||||
void BrowserAccessControlDialog::setItems(const QList<Entry*>& items, const QString& hostname, bool httpAuth)
|
||||
void BrowserAccessControlDialog::setItems(const QList<Entry*>& items, const QString& urlString, bool httpAuth)
|
||||
{
|
||||
m_ui->siteLabel->setText(m_ui->siteLabel->text().arg(hostname));
|
||||
QUrl url(urlString);
|
||||
m_ui->siteLabel->setText(m_ui->siteLabel->text().arg(
|
||||
url.toDisplayString(QUrl::RemoveUserInfo | QUrl::RemovePath | QUrl::RemoveQuery | QUrl::RemoveFragment)));
|
||||
|
||||
m_ui->rememberDecisionCheckBox->setVisible(!httpAuth);
|
||||
m_ui->rememberDecisionCheckBox->setChecked(false);
|
||||
|
@ -38,7 +38,7 @@ public:
|
||||
explicit BrowserAccessControlDialog(QWidget* parent = nullptr);
|
||||
~BrowserAccessControlDialog() override;
|
||||
|
||||
void setItems(const QList<Entry*>& items, const QString& hostname, bool httpAuth);
|
||||
void setItems(const QList<Entry*>& items, const QString& urlString, bool httpAuth);
|
||||
bool remember() const;
|
||||
|
||||
QList<QTableWidgetItem*> getSelectedEntries() const;
|
||||
|
@ -107,6 +107,8 @@ QJsonObject BrowserAction::handleAction(const QJsonObject& json)
|
||||
return handleGetDatabaseGroups(json, action);
|
||||
} else if (action.compare("create-new-group", Qt::CaseSensitive) == 0) {
|
||||
return handleCreateNewGroup(json, action);
|
||||
} else if (action.compare("get-totp", Qt::CaseSensitive) == 0) {
|
||||
return handleGetTotp(json, action);
|
||||
}
|
||||
|
||||
// Action was not recognized
|
||||
@ -465,6 +467,37 @@ QJsonObject BrowserAction::handleCreateNewGroup(const QJsonObject& json, const Q
|
||||
return buildResponse(action, message, newNonce);
|
||||
}
|
||||
|
||||
QJsonObject BrowserAction::handleGetTotp(const QJsonObject& json, const QString& action)
|
||||
{
|
||||
const QString nonce = json.value("nonce").toString();
|
||||
const QString encrypted = json.value("message").toString();
|
||||
|
||||
if (!m_associated) {
|
||||
return getErrorReply(action, ERROR_KEEPASS_ASSOCIATION_FAILED);
|
||||
}
|
||||
|
||||
const QJsonObject decrypted = decryptMessage(encrypted, nonce);
|
||||
if (decrypted.isEmpty()) {
|
||||
return getErrorReply(action, ERROR_KEEPASS_CANNOT_DECRYPT_MESSAGE);
|
||||
}
|
||||
|
||||
QString command = decrypted.value("action").toString();
|
||||
if (command.isEmpty() || command.compare("get-totp", Qt::CaseSensitive) != 0) {
|
||||
return getErrorReply(action, ERROR_KEEPASS_INCORRECT_ACTION);
|
||||
}
|
||||
|
||||
const QString uuid = decrypted.value("uuid").toString();
|
||||
|
||||
// Get the current TOTP
|
||||
const auto totp = browserService()->getCurrentTotp(uuid);
|
||||
const QString newNonce = incrementNonce(nonce);
|
||||
|
||||
QJsonObject message = buildMessage(newNonce);
|
||||
message["totp"] = totp;
|
||||
|
||||
return buildResponse(action, message, newNonce);
|
||||
}
|
||||
|
||||
QJsonObject BrowserAction::getErrorReply(const QString& action, const int errorCode) const
|
||||
{
|
||||
QJsonObject response;
|
||||
|
@ -41,6 +41,7 @@ private:
|
||||
QJsonObject handleLockDatabase(const QJsonObject& json, const QString& action);
|
||||
QJsonObject handleGetDatabaseGroups(const QJsonObject& json, const QString& action);
|
||||
QJsonObject handleCreateNewGroup(const QJsonObject& json, const QString& action);
|
||||
QJsonObject handleGetTotp(const QJsonObject& json, const QString& action);
|
||||
|
||||
QJsonObject buildMessage(const QString& nonce) const;
|
||||
QJsonObject buildResponse(const QString& action, const QJsonObject& message, const QString& nonce);
|
||||
|
@ -215,7 +215,6 @@ QJsonObject BrowserService::getDatabaseGroups()
|
||||
|
||||
QJsonObject BrowserService::createNewGroup(const QString& groupName)
|
||||
{
|
||||
|
||||
auto db = getDatabase();
|
||||
if (!db) {
|
||||
return {};
|
||||
@ -284,6 +283,31 @@ QJsonObject BrowserService::createNewGroup(const QString& groupName)
|
||||
return result;
|
||||
}
|
||||
|
||||
QString BrowserService::getCurrentTotp(const QString& uuid)
|
||||
{
|
||||
QList<QSharedPointer<Database>> databases;
|
||||
if (browserSettings()->searchInAllDatabases()) {
|
||||
for (auto dbWidget : getMainWindow()->getOpenDatabases()) {
|
||||
auto db = dbWidget->database();
|
||||
if (db) {
|
||||
databases << db;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
databases << getDatabase();
|
||||
}
|
||||
|
||||
auto entryUuid = Tools::hexToUuid(uuid);
|
||||
for (const auto& db : databases) {
|
||||
auto entry = db->rootGroup()->findEntryByUuid(entryUuid, true);
|
||||
if (entry) {
|
||||
return entry->totp();
|
||||
}
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
QString BrowserService::storeKey(const QString& key)
|
||||
{
|
||||
auto db = getDatabase();
|
||||
@ -413,7 +437,7 @@ QJsonArray BrowserService::findMatchingEntries(const QString& dbid,
|
||||
}
|
||||
|
||||
// Sort results
|
||||
pwEntries = sortEntries(pwEntries, host, submitUrl);
|
||||
pwEntries = sortEntries(pwEntries, host, submitUrl, url);
|
||||
|
||||
// Fill the list
|
||||
QJsonArray result;
|
||||
@ -698,7 +722,10 @@ void BrowserService::convertAttributesToCustomData(QSharedPointer<Database> db)
|
||||
}
|
||||
}
|
||||
|
||||
QList<Entry*> BrowserService::sortEntries(QList<Entry*>& pwEntries, const QString& host, const QString& entryUrl)
|
||||
QList<Entry*> BrowserService::sortEntries(QList<Entry*>& pwEntries,
|
||||
const QString& host,
|
||||
const QString& entryUrl,
|
||||
const QString& fullUrl)
|
||||
{
|
||||
QUrl url(entryUrl);
|
||||
if (url.scheme().isEmpty()) {
|
||||
@ -712,7 +739,7 @@ QList<Entry*> BrowserService::sortEntries(QList<Entry*>& pwEntries, const QStrin
|
||||
// Build map of prioritized entries
|
||||
QMultiMap<int, Entry*> priorities;
|
||||
for (auto* entry : pwEntries) {
|
||||
priorities.insert(sortPriority(entry, host, submitUrl, baseSubmitUrl), entry);
|
||||
priorities.insert(sortPriority(entry, host, submitUrl, baseSubmitUrl, fullUrl), entry);
|
||||
}
|
||||
|
||||
QList<Entry*> results;
|
||||
@ -773,7 +800,7 @@ QList<Entry*> BrowserService::confirmEntries(QList<Entry*>& pwEntriesToConfirm,
|
||||
config.save(entry);
|
||||
});
|
||||
|
||||
accessControlDialog.setItems(pwEntriesToConfirm, !submitHost.isEmpty() ? submitHost : url, httpAuth);
|
||||
accessControlDialog.setItems(pwEntriesToConfirm, url, httpAuth);
|
||||
|
||||
QList<Entry*> allowedEntries;
|
||||
if (accessControlDialog.exec() == QDialog::Accepted) {
|
||||
@ -895,7 +922,8 @@ Group* BrowserService::getDefaultEntryGroup(const QSharedPointer<Database>& sele
|
||||
int BrowserService::sortPriority(const Entry* entry,
|
||||
const QString& host,
|
||||
const QString& submitUrl,
|
||||
const QString& baseSubmitUrl) const
|
||||
const QString& baseSubmitUrl,
|
||||
const QString& fullUrl) const
|
||||
{
|
||||
QUrl url(entry->url());
|
||||
if (url.scheme().isEmpty()) {
|
||||
@ -914,9 +942,12 @@ int BrowserService::sortPriority(const Entry* entry,
|
||||
if (!url.host().contains(".") && url.host() != "localhost") {
|
||||
return 0;
|
||||
}
|
||||
if (submitUrl == entryURL) {
|
||||
if (fullUrl == entryURL) {
|
||||
return 100;
|
||||
}
|
||||
if (submitUrl == entryURL) {
|
||||
return 95;
|
||||
}
|
||||
if (submitUrl.startsWith(entryURL) && entryURL != host && baseSubmitUrl != entryURL) {
|
||||
return 90;
|
||||
}
|
||||
@ -1025,7 +1056,17 @@ bool BrowserService::handleURL(const QString& entryUrl, const QString& url, cons
|
||||
|
||||
// Match the subdomains with the limited wildcard
|
||||
if (siteQUrl.host().endsWith(entryQUrl.host())) {
|
||||
return true;
|
||||
if (!browserSettings()->bestMatchOnly()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Match the exact subdomain and path, or start of the path when entry's path is longer than plain "/"
|
||||
if (siteQUrl.host() == entryQUrl.host()) {
|
||||
if (siteQUrl.path() == entryQUrl.path()
|
||||
|| (entryQUrl.path().size() > 1 && siteQUrl.path().startsWith(entryQUrl.path()))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -58,6 +58,7 @@ public:
|
||||
|
||||
QJsonObject getDatabaseGroups();
|
||||
QJsonObject createNewGroup(const QString& groupName);
|
||||
QString getCurrentTotp(const QString& uuid);
|
||||
|
||||
void addEntry(const QString& dbid,
|
||||
const QString& login,
|
||||
@ -119,7 +120,8 @@ private:
|
||||
|
||||
QList<Entry*> searchEntries(const QSharedPointer<Database>& db, const QString& url, const QString& submitUrl);
|
||||
QList<Entry*> searchEntries(const QString& url, const QString& submitUrl, const StringPairList& keyList);
|
||||
QList<Entry*> sortEntries(QList<Entry*>& pwEntries, const QString& host, const QString& submitUrl);
|
||||
QList<Entry*>
|
||||
sortEntries(QList<Entry*>& pwEntries, const QString& host, const QString& submitUrl, const QString& fullUrl);
|
||||
QList<Entry*> confirmEntries(QList<Entry*>& pwEntriesToConfirm,
|
||||
const QString& url,
|
||||
const QString& host,
|
||||
@ -130,8 +132,11 @@ private:
|
||||
QJsonArray getChildrenFromGroup(Group* group);
|
||||
Access checkAccess(const Entry* entry, const QString& host, const QString& submitHost, const QString& realm);
|
||||
Group* getDefaultEntryGroup(const QSharedPointer<Database>& selectedDb = {});
|
||||
int
|
||||
sortPriority(const Entry* entry, const QString& host, const QString& submitUrl, const QString& baseSubmitUrl) const;
|
||||
int sortPriority(const Entry* entry,
|
||||
const QString& host,
|
||||
const QString& submitUrl,
|
||||
const QString& baseSubmitUrl,
|
||||
const QString& fullUrl) const;
|
||||
bool schemeFound(const QString& url);
|
||||
bool removeFirstDomain(QString& hostname);
|
||||
bool handleURL(const QString& entryUrl, const QString& url, const QString& submitUrl);
|
||||
|
@ -27,7 +27,7 @@
|
||||
|
||||
Info::Info()
|
||||
{
|
||||
name = QString("db-show");
|
||||
name = QString("db-info");
|
||||
description = QObject::tr("Show a database's information.");
|
||||
}
|
||||
|
||||
|
@ -58,6 +58,7 @@ static const QHash<Config::ConfigKey, ConfigDirective> configStrings = {
|
||||
{Config::AutoSaveAfterEveryChange,{QS("AutoSaveAfterEveryChange"), Roaming, true}},
|
||||
{Config::AutoReloadOnChange,{QS("AutoReloadOnChange"), Roaming, true}},
|
||||
{Config::AutoSaveOnExit,{QS("AutoSaveOnExit"), Roaming, true}},
|
||||
{Config::AutoSaveNonDataChanges,{QS("AutoSaveNonDataChanges"), Roaming, true}},
|
||||
{Config::BackupBeforeSave,{QS("BackupBeforeSave"), Roaming, false}},
|
||||
{Config::UseAtomicSaves,{QS("UseAtomicSaves"), Roaming, true}},
|
||||
{Config::SearchLimitGroup,{QS("SearchLimitGroup"), Roaming, false}},
|
||||
@ -73,7 +74,6 @@ static const QHash<Config::ConfigKey, ConfigDirective> configStrings = {
|
||||
{Config::AutoTypeStartDelay,{QS("AutoTypeStartDelay"), Roaming, 500}},
|
||||
{Config::GlobalAutoTypeKey,{QS("GlobalAutoTypeKey"), Roaming, 0}},
|
||||
{Config::GlobalAutoTypeModifiers,{QS("GlobalAutoTypeModifiers"), Roaming, 0}},
|
||||
{Config::TrackNonDataChanges,{QS("TrackNonDataChanges"), Roaming, false}},
|
||||
{Config::FaviconDownloadTimeout,{QS("FaviconDownloadTimeout"), Roaming, 10}},
|
||||
{Config::UpdateCheckMessageShown,{QS("UpdateCheckMessageShown"), Roaming, false}},
|
||||
{Config::UseTouchID,{QS("UseTouchID"), Roaming, false}},
|
||||
@ -297,7 +297,6 @@ static const QHash<QString, Config::ConfigKey> deprecationMap = {
|
||||
{QS("security/IconDownloadFallbackToGoogle"), Config::Security_IconDownloadFallback},
|
||||
|
||||
// 2.6.0
|
||||
{QS("IgnoreGroupExpansion"), Config::TrackNonDataChanges},
|
||||
{QS("security/autotypeask"), Config::Security_AutoTypeAsk},
|
||||
{QS("security/clearclipboard"), Config::Security_ClearClipboard},
|
||||
{QS("security/clearclipboardtimeout"), Config::Security_ClearClipboardTimeout},
|
||||
|
@ -42,6 +42,7 @@ public:
|
||||
AutoSaveAfterEveryChange,
|
||||
AutoReloadOnChange,
|
||||
AutoSaveOnExit,
|
||||
AutoSaveNonDataChanges,
|
||||
BackupBeforeSave,
|
||||
UseAtomicSaves,
|
||||
SearchLimitGroup,
|
||||
@ -57,7 +58,6 @@ public:
|
||||
AutoTypeStartDelay,
|
||||
GlobalAutoTypeKey,
|
||||
GlobalAutoTypeModifiers,
|
||||
TrackNonDataChanges,
|
||||
FaviconDownloadTimeout,
|
||||
UpdateCheckMessageShown,
|
||||
UseTouchID,
|
||||
|
@ -848,9 +848,14 @@ void Database::setEmitModified(bool value)
|
||||
m_emitModified = value;
|
||||
}
|
||||
|
||||
bool Database::isModified(bool includeNonDataChanges) const
|
||||
bool Database::isModified() const
|
||||
{
|
||||
return m_modified || (includeNonDataChanges && m_hasNonDataChange);
|
||||
return m_modified;
|
||||
}
|
||||
|
||||
bool Database::hasNonDataChanges() const
|
||||
{
|
||||
return m_hasNonDataChange;
|
||||
}
|
||||
|
||||
void Database::markAsModified()
|
||||
|
@ -81,7 +81,8 @@ public:
|
||||
void releaseData();
|
||||
|
||||
bool isInitialized() const;
|
||||
bool isModified(bool includeNonDataChanges = false) const;
|
||||
bool isModified() const;
|
||||
bool hasNonDataChanges() const;
|
||||
void setEmitModified(bool value);
|
||||
bool isReadOnly() const;
|
||||
void setReadOnly(bool readOnly);
|
||||
|
@ -40,9 +40,6 @@ namespace
|
||||
|
||||
DatabaseIcons::DatabaseIcons()
|
||||
{
|
||||
// Set the pixmap cache limit to 20 MB
|
||||
QPixmapCache::setCacheLimit(20480);
|
||||
|
||||
iconList = QDir(iconDir).entryList(QDir::NoFilter, QDir::Name);
|
||||
badgeList = QDir(badgeDir).entryList(QDir::NoFilter, QDir::Name);
|
||||
|
||||
@ -70,9 +67,7 @@ QPixmap DatabaseIcons::icon(int index, IconSize size)
|
||||
auto icon = m_iconCache.value(cacheKey);
|
||||
if (icon.isNull()) {
|
||||
icon.addFile(iconDir + iconList[index]);
|
||||
icon.addPixmap(icon.pixmap(iconSize(IconSize::Default)));
|
||||
icon.addPixmap(icon.pixmap(iconSize(IconSize::Medium)));
|
||||
icon.addPixmap(icon.pixmap(iconSize(IconSize::Large)));
|
||||
icon.addPixmap(icon.pixmap(64));
|
||||
m_iconCache.insert(cacheKey, icon);
|
||||
}
|
||||
|
||||
|
@ -481,6 +481,8 @@ void Entry::updateTotp()
|
||||
m_attributes->value(Totp::ATTRIBUTE_SEED));
|
||||
} else if (m_attributes->contains(Totp::ATTRIBUTE_OTP)) {
|
||||
m_data.totpSettings = Totp::parseSettings(m_attributes->value(Totp::ATTRIBUTE_OTP));
|
||||
} else {
|
||||
m_data.totpSettings.reset();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -362,11 +362,7 @@ void Group::setExpanded(bool expanded)
|
||||
{
|
||||
if (m_data.isExpanded != expanded) {
|
||||
m_data.isExpanded = expanded;
|
||||
if (config()->get(Config::TrackNonDataChanges).toBool()) {
|
||||
emit groupModified();
|
||||
} else {
|
||||
emit groupNonDataChange();
|
||||
}
|
||||
emit groupNonDataChange();
|
||||
}
|
||||
}
|
||||
|
||||
@ -972,11 +968,7 @@ void Group::moveEntryUp(Entry* entry)
|
||||
emit entryAboutToMoveUp(row);
|
||||
m_entries.move(row, row - 1);
|
||||
emit entryMovedUp();
|
||||
if (config()->get(Config::TrackNonDataChanges).toBool()) {
|
||||
emit groupModified();
|
||||
} else {
|
||||
emit groupNonDataChange();
|
||||
}
|
||||
emit groupNonDataChange();
|
||||
}
|
||||
|
||||
void Group::moveEntryDown(Entry* entry)
|
||||
@ -989,11 +981,7 @@ void Group::moveEntryDown(Entry* entry)
|
||||
emit entryAboutToMoveDown(row);
|
||||
m_entries.move(row, row + 1);
|
||||
emit entryMovedDown();
|
||||
if (config()->get(Config::TrackNonDataChanges).toBool()) {
|
||||
emit groupModified();
|
||||
} else {
|
||||
emit groupNonDataChange();
|
||||
}
|
||||
emit groupNonDataChange();
|
||||
}
|
||||
|
||||
void Group::connectDatabaseSignalsRecursive(Database* db)
|
||||
|
@ -379,11 +379,8 @@ void Metadata::addCustomIcon(const QUuid& uuid, const QImage& image)
|
||||
static bool isGui = qApp->inherits("QGuiApplication");
|
||||
if (isGui) {
|
||||
// Generate QIcon with pre-baked resolutions
|
||||
auto basePixmap = QPixmap::fromImage(image).scaled(128, 128, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||
auto basePixmap = QPixmap::fromImage(image.scaled(64, 64, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
|
||||
QIcon icon(basePixmap);
|
||||
icon.addPixmap(icon.pixmap(databaseIcons()->iconSize(IconSize::Default)));
|
||||
icon.addPixmap(icon.pixmap(databaseIcons()->iconSize(IconSize::Medium)));
|
||||
icon.addPixmap(icon.pixmap(databaseIcons()->iconSize(IconSize::Large)));
|
||||
m_customIcons.insert(uuid, icon);
|
||||
} else {
|
||||
m_customIcons.insert(uuid, QIcon());
|
||||
|
@ -106,7 +106,7 @@ HealthChecker::HealthChecker(QSharedPointer<Database> db)
|
||||
{
|
||||
// Build the cache of re-used passwords
|
||||
for (const auto* entry : db->rootGroup()->entriesRecursive()) {
|
||||
if (!entry->isRecycled()) {
|
||||
if (!entry->isRecycled() && !entry->isAttributeReference("Password")) {
|
||||
m_reuse[entry->password()]
|
||||
<< QApplication::tr("Used in %1/%2").arg(entry->group()->hierarchy().join('/'), entry->title());
|
||||
}
|
||||
|
@ -153,9 +153,20 @@ QIcon Resources::icon(const QString& name, bool recolor, const QColor& overrideC
|
||||
return icon;
|
||||
}
|
||||
|
||||
// Resetting the application theme name before calling QIcon::fromTheme() is required for hacky
|
||||
// QPA platform themes such as qt5ct, which randomly mess with the configured icon theme.
|
||||
// If we do not reset the theme name here, it will become empty at some point, causing
|
||||
// Qt to look for icons at the user-level and global default locations.
|
||||
//
|
||||
// See issue #4963: https://github.com/keepassxreboot/keepassxc/issues/4963
|
||||
// and qt5ct issue #80: https://sourceforge.net/p/qt5ct/tickets/80/
|
||||
QIcon::setThemeName("application");
|
||||
|
||||
icon = QIcon::fromTheme(name);
|
||||
if (getMainWindow() && recolor) {
|
||||
QImage img = icon.pixmap(128, 128).toImage().convertToFormat(QImage::Format_ARGB32_Premultiplied);
|
||||
const QRect rect(0, 0, 48, 48);
|
||||
QImage img = icon.pixmap(rect.width(), rect.height()).toImage();
|
||||
img = img.convertToFormat(QImage::Format_ARGB32_Premultiplied);
|
||||
icon = {};
|
||||
|
||||
QPainter painter(&img);
|
||||
@ -163,20 +174,19 @@ QIcon Resources::icon(const QString& name, bool recolor, const QColor& overrideC
|
||||
|
||||
if (!overrideColor.isValid()) {
|
||||
QPalette palette = getMainWindow()->palette();
|
||||
painter.fillRect(0, 0, img.width(), img.height(), palette.color(QPalette::Normal, QPalette::WindowText));
|
||||
painter.fillRect(rect, palette.color(QPalette::Normal, QPalette::WindowText));
|
||||
icon.addPixmap(QPixmap::fromImage(img), QIcon::Normal);
|
||||
|
||||
painter.fillRect(0, 0, img.width(), img.height(), palette.color(QPalette::Active, QPalette::ButtonText));
|
||||
painter.fillRect(rect, palette.color(QPalette::Active, QPalette::ButtonText));
|
||||
icon.addPixmap(QPixmap::fromImage(img), QIcon::Active);
|
||||
|
||||
painter.fillRect(
|
||||
0, 0, img.width(), img.height(), palette.color(QPalette::Active, QPalette::HighlightedText));
|
||||
painter.fillRect(rect, palette.color(QPalette::Active, QPalette::HighlightedText));
|
||||
icon.addPixmap(QPixmap::fromImage(img), QIcon::Selected);
|
||||
|
||||
painter.fillRect(0, 0, img.width(), img.height(), palette.color(QPalette::Disabled, QPalette::WindowText));
|
||||
painter.fillRect(rect, palette.color(QPalette::Disabled, QPalette::WindowText));
|
||||
icon.addPixmap(QPixmap::fromImage(img), QIcon::Disabled);
|
||||
} else {
|
||||
painter.fillRect(0, 0, img.width(), img.height(), overrideColor);
|
||||
painter.fillRect(rect, overrideColor);
|
||||
icon.addPixmap(QPixmap::fromImage(img), QIcon::Normal);
|
||||
}
|
||||
|
||||
@ -202,18 +212,16 @@ QIcon Resources::onOffIcon(const QString& name, bool recolor)
|
||||
return icon;
|
||||
}
|
||||
|
||||
const QSize size(48, 48);
|
||||
QIcon on = Resources::icon(name + "-on", recolor);
|
||||
for (const auto& size : on.availableSizes()) {
|
||||
icon.addPixmap(on.pixmap(size, QIcon::Mode::Normal), QIcon::Mode::Normal, QIcon::On);
|
||||
icon.addPixmap(on.pixmap(size, QIcon::Mode::Selected), QIcon::Mode::Selected, QIcon::On);
|
||||
icon.addPixmap(on.pixmap(size, QIcon::Mode::Disabled), QIcon::Mode::Disabled, QIcon::On);
|
||||
}
|
||||
icon.addPixmap(on.pixmap(size, QIcon::Mode::Normal), QIcon::Mode::Normal, QIcon::On);
|
||||
icon.addPixmap(on.pixmap(size, QIcon::Mode::Selected), QIcon::Mode::Selected, QIcon::On);
|
||||
icon.addPixmap(on.pixmap(size, QIcon::Mode::Disabled), QIcon::Mode::Disabled, QIcon::On);
|
||||
|
||||
QIcon off = Resources::icon(name + "-off", recolor);
|
||||
for (const auto& size : off.availableSizes()) {
|
||||
icon.addPixmap(off.pixmap(size, QIcon::Mode::Normal), QIcon::Mode::Normal, QIcon::Off);
|
||||
icon.addPixmap(off.pixmap(size, QIcon::Mode::Selected), QIcon::Mode::Selected, QIcon::Off);
|
||||
icon.addPixmap(off.pixmap(size, QIcon::Mode::Disabled), QIcon::Mode::Disabled, QIcon::Off);
|
||||
}
|
||||
icon.addPixmap(off.pixmap(size, QIcon::Mode::Normal), QIcon::Mode::Normal, QIcon::Off);
|
||||
icon.addPixmap(off.pixmap(size, QIcon::Mode::Selected), QIcon::Mode::Selected, QIcon::Off);
|
||||
icon.addPixmap(off.pixmap(size, QIcon::Mode::Disabled), QIcon::Mode::Disabled, QIcon::Off);
|
||||
|
||||
m_iconCache.insert(cacheName, icon);
|
||||
|
||||
|
@ -51,6 +51,13 @@ ScreenLockListenerDBus::ScreenLockListenerDBus(QWidget* parent)
|
||||
this, // receiver
|
||||
SLOT(gnomeSessionStatusChanged(uint)));
|
||||
|
||||
sessionBus.connect("org.xfce.ScreenSaver", // service
|
||||
"/org/xfce/ScreenSaver", // path
|
||||
"org.xfce.ScreenSaver", // interface
|
||||
"ActiveChanged", // signal name
|
||||
this, // receiver
|
||||
SLOT(freedesktopScreenSaver(bool)));
|
||||
|
||||
systemBus.connect("org.freedesktop.login1", // service
|
||||
"/org/freedesktop/login1", // path
|
||||
"org.freedesktop.login1.Manager", // interface
|
||||
|
@ -331,11 +331,15 @@ namespace Tools
|
||||
|
||||
#if defined(Q_OS_WIN)
|
||||
QRegularExpression varRe("\\%([A-Za-z][A-Za-z0-9_]*)\\%");
|
||||
QString homeEnv = "USERPROFILE";
|
||||
#else
|
||||
QRegularExpression varRe("\\$([A-Za-z][A-Za-z0-9_]*)");
|
||||
subbed.replace("~", environment.value("HOME"));
|
||||
QString homeEnv = "HOME";
|
||||
#endif
|
||||
|
||||
if (subbed.startsWith("~/") || subbed.startsWith("~\\"))
|
||||
subbed.replace(0, 1, environment.value(homeEnv));
|
||||
|
||||
QRegularExpressionMatch match;
|
||||
|
||||
do {
|
||||
|
@ -71,6 +71,8 @@ bool Translator::installTranslator(const QStringList& languages, const QString&
|
||||
QScopedPointer<QTranslator> translator(new QTranslator(qApp));
|
||||
if (translator->load(locale, "keepassx_", "", path)) {
|
||||
return QCoreApplication::installTranslator(translator.take());
|
||||
} else if (translator->load(locale, "keepassx_", "", QLibraryInfo::location(QLibraryInfo::TranslationsPath))) {
|
||||
return QCoreApplication::installTranslator(translator.take());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -144,18 +144,24 @@ Application::~Application()
|
||||
|
||||
void Application::applyTheme()
|
||||
{
|
||||
QString appTheme = config()->get(Config::GUI_ApplicationTheme).toString();
|
||||
auto appTheme = config()->get(Config::GUI_ApplicationTheme).toString();
|
||||
if (appTheme == "auto") {
|
||||
if (osUtils->isDarkMode()) {
|
||||
setStyle(new DarkStyle);
|
||||
m_darkTheme = true;
|
||||
} else {
|
||||
setStyle(new LightStyle);
|
||||
appTheme = osUtils->isDarkMode() ? "dark" : "light";
|
||||
#ifdef Q_OS_WIN
|
||||
if (winUtils()->isHighContrastMode()) {
|
||||
appTheme = "classic";
|
||||
}
|
||||
} else if (appTheme == "light") {
|
||||
#endif
|
||||
}
|
||||
|
||||
if (appTheme == "light") {
|
||||
setStyle(new LightStyle);
|
||||
// Workaround Qt 5.15+ bug
|
||||
setPalette(style()->standardPalette());
|
||||
} else if (appTheme == "dark") {
|
||||
setStyle(new DarkStyle);
|
||||
// Workaround Qt 5.15+ bug
|
||||
setPalette(style()->standardPalette());
|
||||
m_darkTheme = true;
|
||||
} else {
|
||||
// Classic mode, don't check for dark theme on Windows
|
||||
@ -163,9 +169,12 @@ void Application::applyTheme()
|
||||
#ifndef Q_OS_WIN
|
||||
m_darkTheme = osUtils->isDarkMode();
|
||||
#endif
|
||||
QFile stylesheetFile(":/styles/base/classicstyle.qss");
|
||||
if (stylesheetFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||
setStyleSheet(stylesheetFile.readAll());
|
||||
stylesheetFile.close();
|
||||
}
|
||||
}
|
||||
|
||||
setPalette(style()->standardPalette());
|
||||
}
|
||||
|
||||
bool Application::event(QEvent* event)
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include "core/Global.h"
|
||||
#include "core/Resources.h"
|
||||
#include "core/Translator.h"
|
||||
#include "gui/MainWindow.h"
|
||||
#include "gui/osutils/OSUtils.h"
|
||||
|
||||
#include "MessageBox.h"
|
||||
@ -125,6 +126,7 @@ ApplicationSettingsWidget::ApplicationSettingsWidget(QWidget* parent)
|
||||
m_generalUi->faviconTimeoutSpinBox->installEventFilter(mouseWheelFilter);
|
||||
m_generalUi->toolButtonStyleComboBox->installEventFilter(mouseWheelFilter);
|
||||
m_generalUi->languageComboBox->installEventFilter(mouseWheelFilter);
|
||||
m_generalUi->trayIconAppearance->installEventFilter(mouseWheelFilter);
|
||||
|
||||
#ifdef WITH_XC_UPDATECHECK
|
||||
connect(m_generalUi->checkForUpdatesOnStartupCheckBox, SIGNAL(toggled(bool)), SLOT(checkUpdatesToggled(bool)));
|
||||
@ -182,6 +184,7 @@ void ApplicationSettingsWidget::loadSettings()
|
||||
config()->get(Config::OpenPreviousDatabasesOnStartup).toBool());
|
||||
m_generalUi->autoSaveAfterEveryChangeCheckBox->setChecked(config()->get(Config::AutoSaveAfterEveryChange).toBool());
|
||||
m_generalUi->autoSaveOnExitCheckBox->setChecked(config()->get(Config::AutoSaveOnExit).toBool());
|
||||
m_generalUi->autoSaveNonDataChangesCheckBox->setChecked(config()->get(Config::AutoSaveNonDataChanges).toBool());
|
||||
m_generalUi->backupBeforeSaveCheckBox->setChecked(config()->get(Config::BackupBeforeSave).toBool());
|
||||
m_generalUi->useAtomicSavesCheckBox->setChecked(config()->get(Config::UseAtomicSaves).toBool());
|
||||
m_generalUi->autoReloadOnChangeCheckBox->setChecked(config()->get(Config::AutoReloadOnChange).toBool());
|
||||
@ -195,7 +198,6 @@ void ApplicationSettingsWidget::loadSettings()
|
||||
config()->get(Config::UseGroupIconOnEntryCreation).toBool());
|
||||
m_generalUi->autoTypeEntryTitleMatchCheckBox->setChecked(config()->get(Config::AutoTypeEntryTitleMatch).toBool());
|
||||
m_generalUi->autoTypeEntryURLMatchCheckBox->setChecked(config()->get(Config::AutoTypeEntryURLMatch).toBool());
|
||||
m_generalUi->trackNonDataChangesCheckBox->setChecked(config()->get(Config::TrackNonDataChanges).toBool());
|
||||
m_generalUi->faviconTimeoutSpinBox->setValue(config()->get(Config::FaviconDownloadTimeout).toInt());
|
||||
|
||||
m_generalUi->languageComboBox->clear();
|
||||
@ -310,6 +312,7 @@ void ApplicationSettingsWidget::saveSettings()
|
||||
m_generalUi->openPreviousDatabasesOnStartupCheckBox->isChecked());
|
||||
config()->set(Config::AutoSaveAfterEveryChange, m_generalUi->autoSaveAfterEveryChangeCheckBox->isChecked());
|
||||
config()->set(Config::AutoSaveOnExit, m_generalUi->autoSaveOnExitCheckBox->isChecked());
|
||||
config()->set(Config::AutoSaveNonDataChanges, m_generalUi->autoSaveNonDataChangesCheckBox->isChecked());
|
||||
config()->set(Config::BackupBeforeSave, m_generalUi->backupBeforeSaveCheckBox->isChecked());
|
||||
config()->set(Config::UseAtomicSaves, m_generalUi->useAtomicSavesCheckBox->isChecked());
|
||||
config()->set(Config::AutoReloadOnChange, m_generalUi->autoReloadOnChangeCheckBox->isChecked());
|
||||
@ -319,12 +322,19 @@ void ApplicationSettingsWidget::saveSettings()
|
||||
config()->set(Config::MinimizeOnCopy, m_generalUi->minimizeOnCopyRadioButton->isChecked());
|
||||
config()->set(Config::DropToBackgroundOnCopy, m_generalUi->dropToBackgroundOnCopyRadioButton->isChecked());
|
||||
config()->set(Config::UseGroupIconOnEntryCreation, m_generalUi->useGroupIconOnEntryCreationCheckBox->isChecked());
|
||||
config()->set(Config::TrackNonDataChanges, m_generalUi->trackNonDataChangesCheckBox->isChecked());
|
||||
config()->set(Config::AutoTypeEntryTitleMatch, m_generalUi->autoTypeEntryTitleMatchCheckBox->isChecked());
|
||||
config()->set(Config::AutoTypeEntryURLMatch, m_generalUi->autoTypeEntryURLMatchCheckBox->isChecked());
|
||||
config()->set(Config::FaviconDownloadTimeout, m_generalUi->faviconTimeoutSpinBox->value());
|
||||
|
||||
config()->set(Config::GUI_Language, m_generalUi->languageComboBox->currentData().toString());
|
||||
auto language = m_generalUi->languageComboBox->currentData().toString();
|
||||
if (config()->get(Config::GUI_Language) != language) {
|
||||
QTimer::singleShot(200, [] {
|
||||
getMainWindow()->restartApp(
|
||||
tr("You must restart the application to set the new language. Would you like to restart now?"));
|
||||
});
|
||||
}
|
||||
config()->set(Config::GUI_Language, language);
|
||||
|
||||
config()->set(Config::GUI_MovableToolbar, m_generalUi->toolbarMovableCheckBox->isChecked());
|
||||
config()->set(Config::GUI_MonospaceNotes, m_generalUi->monospaceNotesCheckBox->isChecked());
|
||||
|
||||
@ -375,7 +385,6 @@ void ApplicationSettingsWidget::saveSettings()
|
||||
// Security: clear storage if related settings are disabled
|
||||
if (!config()->get(Config::RememberLastDatabases).toBool()) {
|
||||
config()->remove(Config::LastDatabases);
|
||||
config()->remove(Config::OpenPreviousDatabasesOnStartup);
|
||||
config()->remove(Config::LastActiveDatabase);
|
||||
config()->remove(Config::LastAttachmentDir);
|
||||
}
|
||||
@ -415,7 +424,6 @@ void ApplicationSettingsWidget::resetSettings()
|
||||
|
||||
// Clear recently used data
|
||||
config()->remove(Config::LastDatabases);
|
||||
config()->remove(Config::OpenPreviousDatabasesOnStartup);
|
||||
config()->remove(Config::LastActiveDatabase);
|
||||
config()->remove(Config::LastAttachmentDir);
|
||||
config()->remove(Config::LastKeyFiles);
|
||||
@ -443,11 +451,13 @@ void ApplicationSettingsWidget::reject()
|
||||
|
||||
void ApplicationSettingsWidget::autoSaveToggled(bool checked)
|
||||
{
|
||||
// Explicitly enable auto-save on exit if it wasn't already
|
||||
if (checked && !m_generalUi->autoSaveOnExitCheckBox->isChecked()) {
|
||||
// Explicitly enable other auto-save options
|
||||
if (checked) {
|
||||
m_generalUi->autoSaveOnExitCheckBox->setChecked(true);
|
||||
m_generalUi->autoSaveNonDataChangesCheckBox->setChecked(true);
|
||||
}
|
||||
m_generalUi->autoSaveOnExitCheckBox->setEnabled(!checked);
|
||||
m_generalUi->autoSaveNonDataChangesCheckBox->setEnabled(!checked);
|
||||
}
|
||||
|
||||
void ApplicationSettingsWidget::hideWindowOnCopyCheckBoxToggled(bool checked)
|
||||
|
@ -253,14 +253,14 @@
|
||||
<item>
|
||||
<widget class="QCheckBox" name="autoSaveOnExitCheckBox">
|
||||
<property name="text">
|
||||
<string>Automatically save on exit</string>
|
||||
<string>Automatically save when locking database</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="trackNonDataChangesCheckBox">
|
||||
<widget class="QCheckBox" name="autoSaveNonDataChangesCheckBox">
|
||||
<property name="text">
|
||||
<string>Mark database as modified for non-data changes (e.g., expanding groups)</string>
|
||||
<string>Automatically save non-data changes when locking database</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -626,6 +626,12 @@
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::StrongFocus</enum>
|
||||
</property>
|
||||
<property name="accessibleName">
|
||||
<string>Tray icon type</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
@ -1031,7 +1037,7 @@
|
||||
<tabstop>checkForUpdatesIncludeBetasCheckBox</tabstop>
|
||||
<tabstop>autoSaveAfterEveryChangeCheckBox</tabstop>
|
||||
<tabstop>autoSaveOnExitCheckBox</tabstop>
|
||||
<tabstop>trackNonDataChangesCheckBox</tabstop>
|
||||
<tabstop>autoSaveNonDataChangesCheckBox</tabstop>
|
||||
<tabstop>backupBeforeSaveCheckBox</tabstop>
|
||||
<tabstop>autoReloadOnChangeCheckBox</tabstop>
|
||||
<tabstop>useAtomicSavesCheckBox</tabstop>
|
||||
|
@ -221,6 +221,7 @@ void CategoryListWidgetDelegate::paint(QPainter* painter,
|
||||
opt.icon = QIcon();
|
||||
opt.decorationAlignment = Qt::AlignHCenter | Qt::AlignVCenter;
|
||||
opt.decorationPosition = QStyleOptionViewItem::Top;
|
||||
opt.decorationSize = iconSize;
|
||||
|
||||
QScopedPointer<QStyle> style(new IconSelectionCorrectedStyle());
|
||||
style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget);
|
||||
|
@ -67,11 +67,13 @@ void Clipboard::setText(const QString& text, bool clear)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (clear && config()->get(Config::Security_ClearClipboard).toBool()) {
|
||||
int timeout = config()->get(Config::Security_ClearClipboardTimeout).toInt();
|
||||
if (timeout > 0) {
|
||||
m_lastCopied = text;
|
||||
m_timer->start(timeout * 1000);
|
||||
if (clear) {
|
||||
m_lastCopied = text;
|
||||
if (config()->get(Config::Security_ClearClipboard).toBool()) {
|
||||
int timeout = config()->get(Config::Security_ClearClipboardTimeout).toInt();
|
||||
if (timeout > 0) {
|
||||
m_timer->start(timeout * 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -80,8 +82,9 @@ void Clipboard::clearCopiedText()
|
||||
{
|
||||
if (m_timer->isActive()) {
|
||||
m_timer->stop();
|
||||
clearClipboard();
|
||||
}
|
||||
|
||||
clearClipboard();
|
||||
}
|
||||
|
||||
void Clipboard::clearClipboard()
|
||||
|
@ -141,21 +141,15 @@ DatabaseWidget::DatabaseWidget(QSharedPointer<Database> db, QWidget* parent)
|
||||
connect(m_entryView, SIGNAL(customContextMenuRequested(QPoint)), SLOT(emitEntryContextMenuRequested(QPoint)));
|
||||
|
||||
// Add a notification for when we are searching
|
||||
m_searchingLabel->setObjectName("SearchBanner");
|
||||
m_searchingLabel->setText(tr("Searching..."));
|
||||
m_searchingLabel->setAlignment(Qt::AlignCenter);
|
||||
m_searchingLabel->setStyleSheet("color: rgb(0, 0, 0);"
|
||||
"background-color: rgb(255, 253, 160);"
|
||||
"border: 2px solid rgb(190, 190, 190);"
|
||||
"border-radius: 4px;");
|
||||
m_searchingLabel->setVisible(false);
|
||||
|
||||
#ifdef WITH_XC_KEESHARE
|
||||
m_shareLabel->setObjectName("KeeShareBanner");
|
||||
m_shareLabel->setText(tr("Shared group..."));
|
||||
m_shareLabel->setAlignment(Qt::AlignCenter);
|
||||
m_shareLabel->setStyleSheet("color: rgb(0, 0, 0);"
|
||||
"background-color: rgb(255, 253, 160);"
|
||||
"border: 2px solid rgb(190, 190, 190);"
|
||||
"border-radius: 4px;");
|
||||
m_shareLabel->setVisible(false);
|
||||
#endif
|
||||
|
||||
@ -637,17 +631,25 @@ void DatabaseWidget::setFocus(Qt::FocusReason reason)
|
||||
}
|
||||
}
|
||||
|
||||
void DatabaseWidget::focusOnEntries()
|
||||
void DatabaseWidget::focusOnEntries(bool editIfFocused)
|
||||
{
|
||||
if (isEntryViewActive()) {
|
||||
m_entryView->setFocus();
|
||||
if (editIfFocused && m_entryView->hasFocus()) {
|
||||
switchToEntryEdit();
|
||||
} else {
|
||||
m_entryView->setFocus();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DatabaseWidget::focusOnGroups()
|
||||
void DatabaseWidget::focusOnGroups(bool editIfFocused)
|
||||
{
|
||||
if (isEntryViewActive()) {
|
||||
m_groupView->setFocus();
|
||||
if (editIfFocused && m_groupView->hasFocus()) {
|
||||
switchToGroupEdit();
|
||||
} else {
|
||||
m_groupView->setFocus();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -799,6 +801,38 @@ void DatabaseWidget::performAutoType()
|
||||
}
|
||||
}
|
||||
|
||||
void DatabaseWidget::performAutoTypeUsername()
|
||||
{
|
||||
auto currentEntry = currentSelectedEntry();
|
||||
if (currentEntry) {
|
||||
autoType()->performAutoTypeWithSequence(currentEntry, QStringLiteral("{USERNAME}"), window());
|
||||
}
|
||||
}
|
||||
|
||||
void DatabaseWidget::performAutoTypeUsernameEnter()
|
||||
{
|
||||
auto currentEntry = currentSelectedEntry();
|
||||
if (currentEntry) {
|
||||
autoType()->performAutoTypeWithSequence(currentEntry, QStringLiteral("{USERNAME}{ENTER}"), window());
|
||||
}
|
||||
}
|
||||
|
||||
void DatabaseWidget::performAutoTypePassword()
|
||||
{
|
||||
auto currentEntry = currentSelectedEntry();
|
||||
if (currentEntry) {
|
||||
autoType()->performAutoTypeWithSequence(currentEntry, QStringLiteral("{PASSWORD}"), window());
|
||||
}
|
||||
}
|
||||
|
||||
void DatabaseWidget::performAutoTypePasswordEnter()
|
||||
{
|
||||
auto currentEntry = currentSelectedEntry();
|
||||
if (currentEntry) {
|
||||
autoType()->performAutoTypeWithSequence(currentEntry, QStringLiteral("{PASSWORD}{ENTER}"), window());
|
||||
}
|
||||
}
|
||||
|
||||
void DatabaseWidget::openUrl()
|
||||
{
|
||||
auto currentEntry = currentSelectedEntry();
|
||||
@ -1536,7 +1570,7 @@ bool DatabaseWidget::lock()
|
||||
}
|
||||
}
|
||||
|
||||
if (m_db->isModified(true)) {
|
||||
if (m_db->isModified()) {
|
||||
bool saved = false;
|
||||
// Attempt to save on exit, but don't block locking if it fails
|
||||
if (config()->get(Config::AutoSaveOnExit).toBool()
|
||||
@ -1564,6 +1598,10 @@ bool DatabaseWidget::lock()
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else if (m_db->hasNonDataChanges() && config()->get(Config::AutoSaveNonDataChanges).toBool()) {
|
||||
// Silently auto-save non-data changes, ignore errors
|
||||
QString errorMessage;
|
||||
performSave(errorMessage);
|
||||
}
|
||||
|
||||
if (m_groupView->currentGroup()) {
|
||||
@ -1620,7 +1658,7 @@ void DatabaseWidget::reloadDatabaseFile()
|
||||
QString error;
|
||||
auto db = QSharedPointer<Database>::create(m_db->filePath());
|
||||
if (db->open(database()->key(), &error)) {
|
||||
if (m_db->isModified(true)) {
|
||||
if (m_db->isModified() || db->hasNonDataChanges()) {
|
||||
// Ask if we want to merge changes into new database
|
||||
auto result = MessageBox::question(
|
||||
this,
|
||||
@ -1813,33 +1851,14 @@ bool DatabaseWidget::save()
|
||||
m_blockAutoSave = true;
|
||||
++m_saveAttempts;
|
||||
|
||||
auto focusWidget = qApp->focusWidget();
|
||||
|
||||
// TODO: Make this async
|
||||
// Lock out interactions
|
||||
m_entryView->setDisabled(true);
|
||||
m_groupView->setDisabled(true);
|
||||
QApplication::processEvents();
|
||||
|
||||
bool useAtomicSaves = config()->get(Config::UseAtomicSaves).toBool();
|
||||
QString errorMessage;
|
||||
bool ok = m_db->save(&errorMessage, useAtomicSaves, config()->get(Config::BackupBeforeSave).toBool());
|
||||
|
||||
// Return control
|
||||
m_entryView->setDisabled(false);
|
||||
m_groupView->setDisabled(false);
|
||||
|
||||
if (focusWidget) {
|
||||
focusWidget->setFocus();
|
||||
}
|
||||
|
||||
if (ok) {
|
||||
if (performSave(errorMessage)) {
|
||||
m_saveAttempts = 0;
|
||||
m_blockAutoSave = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (m_saveAttempts > 2 && useAtomicSaves) {
|
||||
if (m_saveAttempts > 2 && config()->get(Config::UseAtomicSaves).toBool()) {
|
||||
// Saving failed 3 times, issue a warning and attempt to resolve
|
||||
auto result = MessageBox::question(this,
|
||||
tr("Disable safe saves?"),
|
||||
@ -1887,28 +1906,8 @@ bool DatabaseWidget::saveAs()
|
||||
|
||||
bool ok = false;
|
||||
if (!newFilePath.isEmpty()) {
|
||||
auto focusWidget = qApp->focusWidget();
|
||||
|
||||
// Lock out interactions
|
||||
m_entryView->setDisabled(true);
|
||||
m_groupView->setDisabled(true);
|
||||
QApplication::processEvents();
|
||||
|
||||
QString errorMessage;
|
||||
ok = m_db->saveAs(newFilePath,
|
||||
&errorMessage,
|
||||
config()->get(Config::UseAtomicSaves).toBool(),
|
||||
config()->get(Config::BackupBeforeSave).toBool());
|
||||
|
||||
// Return control
|
||||
m_entryView->setDisabled(false);
|
||||
m_groupView->setDisabled(false);
|
||||
|
||||
if (focusWidget) {
|
||||
focusWidget->setFocus();
|
||||
}
|
||||
|
||||
if (!ok) {
|
||||
if (!performSave(errorMessage, newFilePath)) {
|
||||
showMessage(tr("Writing the database failed: %1").arg(errorMessage),
|
||||
MessageWidget::Error,
|
||||
true,
|
||||
@ -1919,6 +1918,38 @@ bool DatabaseWidget::saveAs()
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool DatabaseWidget::performSave(QString& errorMessage, const QString& fileName)
|
||||
{
|
||||
QPointer<QWidget> focusWidget(qApp->focusWidget());
|
||||
|
||||
// Lock out interactions
|
||||
m_entryView->setDisabled(true);
|
||||
m_groupView->setDisabled(true);
|
||||
QApplication::processEvents();
|
||||
|
||||
bool ok;
|
||||
if (fileName.isEmpty()) {
|
||||
ok = m_db->save(&errorMessage,
|
||||
config()->get(Config::UseAtomicSaves).toBool(),
|
||||
config()->get(Config::BackupBeforeSave).toBool());
|
||||
} else {
|
||||
ok = m_db->saveAs(fileName,
|
||||
&errorMessage,
|
||||
config()->get(Config::UseAtomicSaves).toBool(),
|
||||
config()->get(Config::BackupBeforeSave).toBool());
|
||||
}
|
||||
|
||||
// Return control
|
||||
m_entryView->setDisabled(false);
|
||||
m_groupView->setDisabled(false);
|
||||
|
||||
if (focusWidget) {
|
||||
focusWidget->setFocus();
|
||||
}
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save copy of database under a new user-selected filename.
|
||||
*
|
||||
@ -2028,18 +2059,23 @@ void DatabaseWidget::processAutoOpen()
|
||||
// Support ifDevice advanced entry, a comma separated list of computer names
|
||||
// that control whether to perform AutoOpen on this entry or not. Can be
|
||||
// negated using '!'
|
||||
auto ifDevice = entry->attribute("ifDevice");
|
||||
auto ifDevice = entry->attribute("IfDevice");
|
||||
if (!ifDevice.isEmpty()) {
|
||||
bool loadDb = false;
|
||||
bool loadDb = true;
|
||||
auto hostName = QHostInfo::localHostName();
|
||||
for (auto& dev : ifDevice.split(",")) {
|
||||
dev = dev.trimmed();
|
||||
if (dev.startsWith("!") && dev.mid(1).compare(hostName, Qt::CaseInsensitive) == 0) {
|
||||
// Machine name matched an exclusion, don't load this database
|
||||
loadDb = false;
|
||||
break;
|
||||
} else if (dev.compare(hostName, Qt::CaseInsensitive) == 0) {
|
||||
for (auto& device : ifDevice.split(",")) {
|
||||
device = device.trimmed();
|
||||
if (device.startsWith("!")) {
|
||||
if (device.mid(1).compare(hostName, Qt::CaseInsensitive) == 0) {
|
||||
// Machine name matched an exclusion, don't load this database
|
||||
loadDb = false;
|
||||
break;
|
||||
}
|
||||
} else if (device.compare(hostName, Qt::CaseInsensitive) == 0) {
|
||||
loadDb = true;
|
||||
} else {
|
||||
// Don't load the database if there are devices not starting with '!'
|
||||
loadDb = false;
|
||||
}
|
||||
}
|
||||
if (!loadDb) {
|
||||
|
@ -167,8 +167,8 @@ public slots:
|
||||
void cloneEntry();
|
||||
void deleteSelectedEntries();
|
||||
void deleteEntries(QList<Entry*> entries);
|
||||
void focusOnEntries();
|
||||
void focusOnGroups();
|
||||
void focusOnEntries(bool editIfFocused = false);
|
||||
void focusOnGroups(bool editIfFocused = false);
|
||||
void moveEntryUp();
|
||||
void moveEntryDown();
|
||||
void copyTitle();
|
||||
@ -186,6 +186,10 @@ public slots:
|
||||
void removeFromAgent();
|
||||
#endif
|
||||
void performAutoType();
|
||||
void performAutoTypeUsername();
|
||||
void performAutoTypeUsernameEnter();
|
||||
void performAutoTypePassword();
|
||||
void performAutoTypePasswordEnter();
|
||||
void openUrl();
|
||||
void downloadSelectedFavicons();
|
||||
void downloadAllFavicons();
|
||||
@ -256,6 +260,7 @@ private:
|
||||
void openDatabaseFromEntry(const Entry* entry, bool inBackground = true);
|
||||
bool confirmDeleteEntries(QList<Entry*> entries, bool permanent);
|
||||
void performIconDownloads(const QList<Entry*>& entries, bool force = false);
|
||||
bool performSave(QString& errorMessage, const QString& fileName = {});
|
||||
Entry* currentSelectedEntry();
|
||||
|
||||
QSharedPointer<Database> m_db;
|
||||
|
@ -126,6 +126,7 @@ MainWindow::MainWindow()
|
||||
m_entryContextMenu->addAction(m_ui->menuEntryTotp->menuAction());
|
||||
m_entryContextMenu->addSeparator();
|
||||
m_entryContextMenu->addAction(m_ui->actionEntryAutoType);
|
||||
m_entryContextMenu->addAction(m_ui->menuEntryAutoTypeWithSequence->menuAction());
|
||||
m_entryContextMenu->addSeparator();
|
||||
m_entryContextMenu->addAction(m_ui->actionEntryEdit);
|
||||
m_entryContextMenu->addAction(m_ui->actionEntryClone);
|
||||
@ -220,7 +221,12 @@ MainWindow::MainWindow()
|
||||
m_ui->toolbarSeparator->setVisible(false);
|
||||
m_showToolbarSeparator = config()->get(Config::GUI_ApplicationTheme).toString() != "classic";
|
||||
|
||||
m_ui->actionEntryAutoType->setVisible(autoType()->isAvailable());
|
||||
bool isAutoTypeAvailable = autoType()->isAvailable();
|
||||
m_ui->actionEntryAutoType->setVisible(isAutoTypeAvailable);
|
||||
m_ui->actionEntryAutoTypeUsername->setVisible(isAutoTypeAvailable);
|
||||
m_ui->actionEntryAutoTypeUsernameEnter->setVisible(isAutoTypeAvailable);
|
||||
m_ui->actionEntryAutoTypePassword->setVisible(isAutoTypeAvailable);
|
||||
m_ui->actionEntryAutoTypePasswordEnter->setVisible(isAutoTypeAvailable);
|
||||
|
||||
m_inactivityTimer = new InactivityTimer(this);
|
||||
connect(m_inactivityTimer, SIGNAL(inactivityDetected()), this, SLOT(lockDatabasesAfterInactivity()));
|
||||
@ -319,14 +325,6 @@ MainWindow::MainWindow()
|
||||
shortcut = new QShortcut(dbTabModifier + Qt::Key_9, this);
|
||||
connect(shortcut, &QShortcut::activated, [this]() { selectDatabaseTab(m_ui->tabWidget->count() - 1); });
|
||||
|
||||
// Allow for direct focus of search, group view, and entry view
|
||||
shortcut = new QShortcut(Qt::Key_F1, this);
|
||||
connect(shortcut, SIGNAL(activated()), m_searchWidget, SLOT(searchFocus()));
|
||||
shortcut = new QShortcut(Qt::Key_F2, this);
|
||||
m_actionMultiplexer.connect(shortcut, SIGNAL(activated()), SLOT(focusOnGroups()));
|
||||
shortcut = new QShortcut(Qt::Key_F3, this);
|
||||
m_actionMultiplexer.connect(shortcut, SIGNAL(activated()), SLOT(focusOnEntries()));
|
||||
|
||||
// Toggle password and username visibility in entry view
|
||||
new QShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_C, this, SLOT(togglePasswordsHidden()));
|
||||
new QShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_B, this, SLOT(toggleUsernamesHidden()));
|
||||
@ -352,6 +350,11 @@ MainWindow::MainWindow()
|
||||
m_ui->actionEntryEdit->setIcon(resources()->icon("entry-edit"));
|
||||
m_ui->actionEntryDelete->setIcon(resources()->icon("entry-delete"));
|
||||
m_ui->actionEntryAutoType->setIcon(resources()->icon("auto-type"));
|
||||
m_ui->menuEntryAutoTypeWithSequence->setIcon(resources()->icon("auto-type"));
|
||||
m_ui->actionEntryAutoTypeUsername->setIcon(resources()->icon("auto-type"));
|
||||
m_ui->actionEntryAutoTypeUsernameEnter->setIcon(resources()->icon("auto-type"));
|
||||
m_ui->actionEntryAutoTypePassword->setIcon(resources()->icon("auto-type"));
|
||||
m_ui->actionEntryAutoTypePasswordEnter->setIcon(resources()->icon("auto-type"));
|
||||
m_ui->actionEntryMoveUp->setIcon(resources()->icon("move-up"));
|
||||
m_ui->actionEntryMoveDown->setIcon(resources()->icon("move-down"));
|
||||
m_ui->actionEntryCopyUsername->setIcon(resources()->icon("username-copy"));
|
||||
@ -446,6 +449,14 @@ MainWindow::MainWindow()
|
||||
m_actionMultiplexer.connect(m_ui->actionEntryCopyURL, SIGNAL(triggered()), SLOT(copyURL()));
|
||||
m_actionMultiplexer.connect(m_ui->actionEntryCopyNotes, SIGNAL(triggered()), SLOT(copyNotes()));
|
||||
m_actionMultiplexer.connect(m_ui->actionEntryAutoType, SIGNAL(triggered()), SLOT(performAutoType()));
|
||||
m_actionMultiplexer.connect(
|
||||
m_ui->actionEntryAutoTypeUsername, SIGNAL(triggered()), SLOT(performAutoTypeUsername()));
|
||||
m_actionMultiplexer.connect(
|
||||
m_ui->actionEntryAutoTypeUsernameEnter, SIGNAL(triggered()), SLOT(performAutoTypeUsernameEnter()));
|
||||
m_actionMultiplexer.connect(
|
||||
m_ui->actionEntryAutoTypePassword, SIGNAL(triggered()), SLOT(performAutoTypePassword()));
|
||||
m_actionMultiplexer.connect(
|
||||
m_ui->actionEntryAutoTypePasswordEnter, SIGNAL(triggered()), SLOT(performAutoTypePasswordEnter()));
|
||||
m_actionMultiplexer.connect(m_ui->actionEntryOpenUrl, SIGNAL(triggered()), SLOT(openUrl()));
|
||||
m_actionMultiplexer.connect(m_ui->actionEntryDownloadIcon, SIGNAL(triggered()), SLOT(downloadSelectedFavicons()));
|
||||
#ifdef WITH_XC_SSHAGENT
|
||||
@ -711,6 +722,13 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode)
|
||||
m_ui->menuEntryCopyAttribute->setEnabled(singleEntrySelected);
|
||||
m_ui->menuEntryTotp->setEnabled(singleEntrySelected);
|
||||
m_ui->actionEntryAutoType->setEnabled(singleEntrySelected);
|
||||
m_ui->menuEntryAutoTypeWithSequence->setEnabled(singleEntrySelected);
|
||||
m_ui->actionEntryAutoTypeUsername->setEnabled(singleEntrySelected && dbWidget->currentEntryHasUsername());
|
||||
m_ui->actionEntryAutoTypeUsernameEnter->setEnabled(singleEntrySelected
|
||||
&& dbWidget->currentEntryHasUsername());
|
||||
m_ui->actionEntryAutoTypePassword->setEnabled(singleEntrySelected && dbWidget->currentEntryHasPassword());
|
||||
m_ui->actionEntryAutoTypePasswordEnter->setEnabled(singleEntrySelected
|
||||
&& dbWidget->currentEntryHasPassword());
|
||||
m_ui->actionEntryOpenUrl->setEnabled(singleEntrySelected && dbWidget->currentEntryHasUrl());
|
||||
m_ui->actionEntryTotp->setEnabled(singleEntrySelected && dbWidget->currentEntryHasTotp());
|
||||
m_ui->actionEntryCopyTotp->setEnabled(singleEntrySelected && dbWidget->currentEntryHasTotp());
|
||||
@ -761,6 +779,7 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode)
|
||||
m_ui->actionEntryCopyURL,
|
||||
m_ui->actionEntryOpenUrl,
|
||||
m_ui->actionEntryAutoType,
|
||||
m_ui->menuEntryAutoTypeWithSequence->menuAction(),
|
||||
m_ui->actionEntryDownloadIcon,
|
||||
m_ui->actionEntryCopyNotes,
|
||||
m_ui->actionEntryCopyTitle,
|
||||
@ -1162,6 +1181,28 @@ void MainWindow::changeEvent(QEvent* event)
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::keyPressEvent(QKeyEvent* event)
|
||||
{
|
||||
if (!event->modifiers()) {
|
||||
// Allow for direct focus of search, group view, and entry view
|
||||
auto dbWidget = m_ui->tabWidget->currentDatabaseWidget();
|
||||
if (dbWidget && dbWidget->isEntryViewActive()) {
|
||||
if (event->key() == Qt::Key_F1) {
|
||||
dbWidget->focusOnGroups(true);
|
||||
return;
|
||||
} else if (event->key() == Qt::Key_F2) {
|
||||
dbWidget->focusOnEntries(true);
|
||||
return;
|
||||
} else if (event->key() == Qt::Key_F3) {
|
||||
m_searchWidget->searchFocus();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QWidget::keyPressEvent(event);
|
||||
}
|
||||
|
||||
bool MainWindow::focusNextPrevChild(bool next)
|
||||
{
|
||||
// Only navigate around the main window if the database widget is showing the entry view
|
||||
@ -1679,17 +1720,20 @@ void MainWindow::initViewMenu()
|
||||
}
|
||||
}
|
||||
|
||||
connect(themeActions, &QActionGroup::triggered, this, [this](QAction* action) {
|
||||
if (action->data() != config()->get(Config::GUI_ApplicationTheme)) {
|
||||
config()->set(Config::GUI_ApplicationTheme, action->data());
|
||||
connect(themeActions, &QActionGroup::triggered, this, [this, theme](QAction* action) {
|
||||
config()->set(Config::GUI_ApplicationTheme, action->data());
|
||||
if (action->data() != theme) {
|
||||
restartApp(tr("You must restart the application to apply this setting. Would you like to restart now?"));
|
||||
}
|
||||
});
|
||||
|
||||
m_ui->actionCompactMode->setChecked(config()->get(Config::GUI_CompactMode).toBool());
|
||||
connect(m_ui->actionCompactMode, &QAction::toggled, this, [this](bool checked) {
|
||||
bool compact = config()->get(Config::GUI_CompactMode).toBool();
|
||||
m_ui->actionCompactMode->setChecked(compact);
|
||||
connect(m_ui->actionCompactMode, &QAction::toggled, this, [this, compact](bool checked) {
|
||||
config()->set(Config::GUI_CompactMode, checked);
|
||||
restartApp(tr("You must restart the application to apply this setting. Would you like to restart now?"));
|
||||
if (checked != compact) {
|
||||
restartApp(tr("You must restart the application to apply this setting. Would you like to restart now?"));
|
||||
}
|
||||
});
|
||||
|
||||
m_ui->actionShowToolbar->setChecked(!config()->get(Config::GUI_HideToolbar).toBool());
|
||||
|
@ -86,6 +86,7 @@ public slots:
|
||||
protected:
|
||||
void closeEvent(QCloseEvent* event) override;
|
||||
void changeEvent(QEvent* event) override;
|
||||
void keyPressEvent(QKeyEvent* event) override;
|
||||
bool focusNextPrevChild(bool next) override;
|
||||
|
||||
private slots:
|
||||
|
@ -310,6 +310,18 @@
|
||||
<addaction name="actionEntryTotpQRCode"/>
|
||||
<addaction name="actionEntrySetupTotp"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuEntryAutoTypeWithSequence">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>Perform Auto-Type Sequence</string>
|
||||
</property>
|
||||
<addaction name="actionEntryAutoTypeUsername"/>
|
||||
<addaction name="actionEntryAutoTypeUsernameEnter"/>
|
||||
<addaction name="actionEntryAutoTypePassword"/>
|
||||
<addaction name="actionEntryAutoTypePasswordEnter"/>
|
||||
</widget>
|
||||
<addaction name="actionEntryNew"/>
|
||||
<addaction name="actionEntryEdit"/>
|
||||
<addaction name="actionEntryClone"/>
|
||||
@ -324,6 +336,7 @@
|
||||
<addaction name="menuEntryTotp"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionEntryAutoType"/>
|
||||
<addaction name="menuEntryAutoTypeWithSequence"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionEntryOpenUrl"/>
|
||||
<addaction name="actionEntryDownloadIcon"/>
|
||||
@ -680,6 +693,38 @@
|
||||
<string>Perform &Auto-Type</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionEntryAutoTypeUsername">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>{USERNAME}</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionEntryAutoTypeUsernameEnter">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>{USERNAME}{ENTER}</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionEntryAutoTypePassword">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>{PASSWORD}</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionEntryAutoTypePasswordEnter">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>{PASSWORD}{ENTER}</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionEntryDownloadIcon">
|
||||
<property name="text">
|
||||
<string>Download &Favicon</string>
|
||||
|
@ -103,4 +103,4 @@ void MessageWidget::openHttpUrl(const QString& link)
|
||||
if (link.startsWith("http://") || link.startsWith("https://")) {
|
||||
QDesktopServices::openUrl(QUrl(link));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -52,7 +52,7 @@ public slots:
|
||||
private:
|
||||
QTimer* m_autoHideTimer;
|
||||
int m_autoHideTimeout;
|
||||
bool m_animate;
|
||||
bool m_animate = true;
|
||||
};
|
||||
|
||||
#endif // MESSAGEWIDGET_H
|
||||
|
@ -50,21 +50,28 @@ PasswordEdit::PasswordEdit(QWidget* parent)
|
||||
passwordFont.setLetterSpacing(QFont::PercentageSpacing, 110);
|
||||
setFont(passwordFont);
|
||||
|
||||
// Prevent conflicts with global Mac shortcuts (force Control on all platforms)
|
||||
#ifdef Q_OS_MAC
|
||||
auto modifier = Qt::META;
|
||||
#else
|
||||
auto modifier = Qt::CTRL;
|
||||
#endif
|
||||
|
||||
m_toggleVisibleAction = new QAction(
|
||||
resources()->icon("password-show-off"),
|
||||
tr("Toggle Password (%1)").arg(QKeySequence(Qt::CTRL + Qt::Key_H).toString(QKeySequence::NativeText)),
|
||||
tr("Toggle Password (%1)").arg(QKeySequence(modifier + Qt::Key_H).toString(QKeySequence::NativeText)),
|
||||
nullptr);
|
||||
m_toggleVisibleAction->setCheckable(true);
|
||||
m_toggleVisibleAction->setShortcut(Qt::CTRL + Qt::Key_H);
|
||||
m_toggleVisibleAction->setShortcut(modifier + Qt::Key_H);
|
||||
m_toggleVisibleAction->setShortcutContext(Qt::WidgetShortcut);
|
||||
addAction(m_toggleVisibleAction, QLineEdit::TrailingPosition);
|
||||
connect(m_toggleVisibleAction, &QAction::triggered, this, &PasswordEdit::setShowPassword);
|
||||
|
||||
m_passwordGeneratorAction = new QAction(
|
||||
resources()->icon("password-generator"),
|
||||
tr("Generate Password (%1)").arg(QKeySequence(Qt::CTRL + Qt::Key_G).toString(QKeySequence::NativeText)),
|
||||
tr("Generate Password (%1)").arg(QKeySequence(modifier + Qt::Key_G).toString(QKeySequence::NativeText)),
|
||||
nullptr);
|
||||
m_passwordGeneratorAction->setShortcut(Qt::CTRL + Qt::Key_G);
|
||||
m_passwordGeneratorAction->setShortcut(modifier + Qt::Key_G);
|
||||
m_passwordGeneratorAction->setShortcutContext(Qt::WidgetShortcut);
|
||||
addAction(m_passwordGeneratorAction, QLineEdit::TrailingPosition);
|
||||
m_passwordGeneratorAction->setVisible(false);
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <QDir>
|
||||
#include <QKeyEvent>
|
||||
#include <QLineEdit>
|
||||
#include <QTimer>
|
||||
|
||||
#include "core/Config.h"
|
||||
#include "core/PasswordGenerator.h"
|
||||
@ -134,26 +135,25 @@ void PasswordGeneratorWidget::loadSettings()
|
||||
{
|
||||
// Password config
|
||||
m_ui->checkBoxLower->setChecked(config()->get(Config::PasswordGenerator_LowerCase).toBool());
|
||||
m_ui->checkBoxLowerAdv->setChecked(config()->get(Config::PasswordGenerator_LowerCase).toBool());
|
||||
m_ui->checkBoxUpper->setChecked(config()->get(Config::PasswordGenerator_UpperCase).toBool());
|
||||
m_ui->checkBoxUpperAdv->setChecked(config()->get(Config::PasswordGenerator_UpperCase).toBool());
|
||||
m_ui->checkBoxNumbers->setChecked(config()->get(Config::PasswordGenerator_Numbers).toBool());
|
||||
m_ui->checkBoxSpecialChars->setChecked(config()->get(Config::PasswordGenerator_SpecialChars).toBool());
|
||||
m_ui->checkBoxNumbersAdv->setChecked(config()->get(Config::PasswordGenerator_Numbers).toBool());
|
||||
m_ui->editAdditionalChars->setText(config()->get(Config::PasswordGenerator_AdditionalChars).toString());
|
||||
m_ui->editExcludedChars->setText(config()->get(Config::PasswordGenerator_ExcludedChars).toString());
|
||||
|
||||
m_ui->buttonAdvancedMode->setChecked(config()->get(Config::PasswordGenerator_AdvancedMode).toBool());
|
||||
setAdvancedMode(m_ui->buttonAdvancedMode->isChecked());
|
||||
bool advanced = config()->get(Config::PasswordGenerator_AdvancedMode).toBool();
|
||||
if (advanced) {
|
||||
m_ui->checkBoxSpecialChars->setChecked(config()->get(Config::PasswordGenerator_Logograms).toBool());
|
||||
} else {
|
||||
m_ui->checkBoxSpecialChars->setChecked(config()->get(Config::PasswordGenerator_SpecialChars).toBool());
|
||||
}
|
||||
|
||||
m_ui->checkBoxBraces->setChecked(config()->get(Config::PasswordGenerator_Braces).toBool());
|
||||
m_ui->checkBoxQuotes->setChecked(config()->get(Config::PasswordGenerator_Quotes).toBool());
|
||||
m_ui->checkBoxPunctuation->setChecked(config()->get(Config::PasswordGenerator_Punctuation).toBool());
|
||||
m_ui->checkBoxDashes->setChecked(config()->get(Config::PasswordGenerator_Dashes).toBool());
|
||||
m_ui->checkBoxMath->setChecked(config()->get(Config::PasswordGenerator_Math).toBool());
|
||||
m_ui->checkBoxLogograms->setChecked(config()->get(Config::PasswordGenerator_Logograms).toBool());
|
||||
|
||||
m_ui->checkBoxExtASCII->setChecked(config()->get(Config::PasswordGenerator_EASCII).toBool());
|
||||
m_ui->checkBoxExtASCIIAdv->setChecked(config()->get(Config::PasswordGenerator_EASCII).toBool());
|
||||
m_ui->checkBoxExcludeAlike->setChecked(config()->get(Config::PasswordGenerator_ExcludeAlike).toBool());
|
||||
m_ui->checkBoxEnsureEvery->setChecked(config()->get(Config::PasswordGenerator_EnsureEvery).toBool());
|
||||
m_ui->spinBoxLength->setValue(config()->get(Config::PasswordGenerator_Length).toInt());
|
||||
@ -166,30 +166,32 @@ void PasswordGeneratorWidget::loadSettings()
|
||||
|
||||
// Password or diceware?
|
||||
m_ui->tabWidget->setCurrentIndex(config()->get(Config::PasswordGenerator_Type).toInt());
|
||||
|
||||
// Set advanced mode
|
||||
m_ui->buttonAdvancedMode->setChecked(advanced);
|
||||
setAdvancedMode(advanced);
|
||||
}
|
||||
|
||||
void PasswordGeneratorWidget::saveSettings()
|
||||
{
|
||||
// Password config
|
||||
if (m_ui->simpleBar->isVisible()) {
|
||||
config()->set(Config::PasswordGenerator_LowerCase, m_ui->checkBoxLower->isChecked());
|
||||
config()->set(Config::PasswordGenerator_UpperCase, m_ui->checkBoxUpper->isChecked());
|
||||
config()->set(Config::PasswordGenerator_Numbers, m_ui->checkBoxNumbers->isChecked());
|
||||
config()->set(Config::PasswordGenerator_EASCII, m_ui->checkBoxExtASCII->isChecked());
|
||||
} else {
|
||||
config()->set(Config::PasswordGenerator_LowerCase, m_ui->checkBoxLowerAdv->isChecked());
|
||||
config()->set(Config::PasswordGenerator_UpperCase, m_ui->checkBoxUpperAdv->isChecked());
|
||||
config()->set(Config::PasswordGenerator_Numbers, m_ui->checkBoxNumbersAdv->isChecked());
|
||||
config()->set(Config::PasswordGenerator_EASCII, m_ui->checkBoxExtASCIIAdv->isChecked());
|
||||
}
|
||||
config()->set(Config::PasswordGenerator_LowerCase, m_ui->checkBoxLower->isChecked());
|
||||
config()->set(Config::PasswordGenerator_UpperCase, m_ui->checkBoxUpper->isChecked());
|
||||
config()->set(Config::PasswordGenerator_Numbers, m_ui->checkBoxNumbers->isChecked());
|
||||
config()->set(Config::PasswordGenerator_EASCII, m_ui->checkBoxExtASCII->isChecked());
|
||||
|
||||
config()->set(Config::PasswordGenerator_AdvancedMode, m_ui->buttonAdvancedMode->isChecked());
|
||||
config()->set(Config::PasswordGenerator_SpecialChars, m_ui->checkBoxSpecialChars->isChecked());
|
||||
if (m_ui->buttonAdvancedMode->isChecked()) {
|
||||
config()->set(Config::PasswordGenerator_SpecialChars, m_ui->checkBoxSpecialChars->isChecked());
|
||||
} else {
|
||||
config()->set(Config::PasswordGenerator_Logograms, m_ui->checkBoxSpecialChars->isChecked());
|
||||
}
|
||||
config()->set(Config::PasswordGenerator_Braces, m_ui->checkBoxBraces->isChecked());
|
||||
config()->set(Config::PasswordGenerator_Punctuation, m_ui->checkBoxPunctuation->isChecked());
|
||||
config()->set(Config::PasswordGenerator_Quotes, m_ui->checkBoxQuotes->isChecked());
|
||||
config()->set(Config::PasswordGenerator_Dashes, m_ui->checkBoxDashes->isChecked());
|
||||
config()->set(Config::PasswordGenerator_Math, m_ui->checkBoxMath->isChecked());
|
||||
config()->set(Config::PasswordGenerator_Logograms, m_ui->checkBoxLogograms->isChecked());
|
||||
|
||||
config()->set(Config::PasswordGenerator_AdditionalChars, m_ui->editAdditionalChars->text());
|
||||
config()->set(Config::PasswordGenerator_ExcludedChars, m_ui->editExcludedChars->text());
|
||||
config()->set(Config::PasswordGenerator_ExcludeAlike, m_ui->checkBoxExcludeAlike->isChecked());
|
||||
@ -321,41 +323,48 @@ bool PasswordGeneratorWidget::isPasswordVisible() const
|
||||
return m_ui->editNewPassword->isPasswordVisible();
|
||||
}
|
||||
|
||||
void PasswordGeneratorWidget::setAdvancedMode(bool state)
|
||||
void PasswordGeneratorWidget::setAdvancedMode(bool advanced)
|
||||
{
|
||||
if (state) {
|
||||
m_ui->simpleBar->hide();
|
||||
m_ui->advancedContainer->show();
|
||||
m_ui->checkBoxUpperAdv->setChecked(m_ui->checkBoxUpper->isChecked());
|
||||
m_ui->checkBoxLowerAdv->setChecked(m_ui->checkBoxLower->isChecked());
|
||||
m_ui->checkBoxNumbersAdv->setChecked(m_ui->checkBoxNumbers->isChecked());
|
||||
m_ui->checkBoxBraces->setChecked(m_ui->checkBoxSpecialChars->isChecked());
|
||||
m_ui->checkBoxPunctuation->setChecked(m_ui->checkBoxSpecialChars->isChecked());
|
||||
m_ui->checkBoxQuotes->setChecked(m_ui->checkBoxSpecialChars->isChecked());
|
||||
m_ui->checkBoxMath->setChecked(m_ui->checkBoxSpecialChars->isChecked());
|
||||
m_ui->checkBoxDashes->setChecked(m_ui->checkBoxSpecialChars->isChecked());
|
||||
m_ui->checkBoxLogograms->setChecked(m_ui->checkBoxSpecialChars->isChecked());
|
||||
m_ui->checkBoxExtASCIIAdv->setChecked(m_ui->checkBoxExtASCII->isChecked());
|
||||
saveSettings();
|
||||
|
||||
if (advanced) {
|
||||
m_ui->checkBoxSpecialChars->setText("# $ % && @ ^ ` ~");
|
||||
m_ui->checkBoxSpecialChars->setToolTip(tr("Logograms"));
|
||||
m_ui->checkBoxSpecialChars->setChecked(config()->get(Config::PasswordGenerator_Logograms).toBool());
|
||||
} else {
|
||||
m_ui->simpleBar->show();
|
||||
m_ui->advancedContainer->hide();
|
||||
m_ui->checkBoxUpper->setChecked(m_ui->checkBoxUpperAdv->isChecked());
|
||||
m_ui->checkBoxLower->setChecked(m_ui->checkBoxLowerAdv->isChecked());
|
||||
m_ui->checkBoxNumbers->setChecked(m_ui->checkBoxNumbersAdv->isChecked());
|
||||
m_ui->checkBoxSpecialChars->setChecked(
|
||||
m_ui->checkBoxBraces->isChecked() | m_ui->checkBoxPunctuation->isChecked()
|
||||
| m_ui->checkBoxQuotes->isChecked() | m_ui->checkBoxMath->isChecked() | m_ui->checkBoxDashes->isChecked()
|
||||
| m_ui->checkBoxLogograms->isChecked());
|
||||
m_ui->checkBoxExtASCII->setChecked(m_ui->checkBoxExtASCIIAdv->isChecked());
|
||||
m_ui->checkBoxSpecialChars->setText("/ * + && …");
|
||||
m_ui->checkBoxSpecialChars->setToolTip(tr("Special Characters"));
|
||||
m_ui->checkBoxSpecialChars->setChecked(config()->get(Config::PasswordGenerator_SpecialChars).toBool());
|
||||
}
|
||||
|
||||
QApplication::processEvents();
|
||||
adjustSize();
|
||||
m_ui->advancedContainer->setVisible(advanced);
|
||||
m_ui->checkBoxBraces->setVisible(advanced);
|
||||
m_ui->checkBoxPunctuation->setVisible(advanced);
|
||||
m_ui->checkBoxQuotes->setVisible(advanced);
|
||||
m_ui->checkBoxMath->setVisible(advanced);
|
||||
m_ui->checkBoxDashes->setVisible(advanced);
|
||||
|
||||
if (!m_standalone) {
|
||||
QTimer::singleShot(50, this, [this] { adjustSize(); });
|
||||
}
|
||||
}
|
||||
|
||||
void PasswordGeneratorWidget::excludeHexChars()
|
||||
{
|
||||
m_ui->editExcludedChars->setText("GHIJKLMNOPQRSTUVWXYZghijklmnopqrstuvwxyz");
|
||||
m_ui->checkBoxNumbers->setChecked(true);
|
||||
m_ui->checkBoxUpper->setChecked(true);
|
||||
|
||||
m_ui->checkBoxLower->setChecked(false);
|
||||
m_ui->checkBoxSpecialChars->setChecked(false);
|
||||
m_ui->checkBoxExtASCII->setChecked(false);
|
||||
m_ui->checkBoxPunctuation->setChecked(false);
|
||||
m_ui->checkBoxQuotes->setChecked(false);
|
||||
m_ui->checkBoxDashes->setChecked(false);
|
||||
m_ui->checkBoxMath->setChecked(false);
|
||||
m_ui->checkBoxBraces->setChecked(false);
|
||||
|
||||
updateGenerator();
|
||||
}
|
||||
|
||||
void PasswordGeneratorWidget::colorStrengthIndicator(const PasswordHealth& health)
|
||||
@ -397,39 +406,27 @@ PasswordGenerator::CharClasses PasswordGeneratorWidget::charClasses()
|
||||
{
|
||||
PasswordGenerator::CharClasses classes;
|
||||
|
||||
if (m_ui->simpleBar->isVisible()) {
|
||||
if (m_ui->checkBoxLower->isChecked()) {
|
||||
classes |= PasswordGenerator::LowerLetters;
|
||||
}
|
||||
if (m_ui->checkBoxLower->isChecked()) {
|
||||
classes |= PasswordGenerator::LowerLetters;
|
||||
}
|
||||
|
||||
if (m_ui->checkBoxUpper->isChecked()) {
|
||||
classes |= PasswordGenerator::UpperLetters;
|
||||
}
|
||||
if (m_ui->checkBoxUpper->isChecked()) {
|
||||
classes |= PasswordGenerator::UpperLetters;
|
||||
}
|
||||
|
||||
if (m_ui->checkBoxNumbers->isChecked()) {
|
||||
classes |= PasswordGenerator::Numbers;
|
||||
}
|
||||
if (m_ui->checkBoxNumbers->isChecked()) {
|
||||
classes |= PasswordGenerator::Numbers;
|
||||
}
|
||||
|
||||
if (m_ui->checkBoxExtASCII->isChecked()) {
|
||||
classes |= PasswordGenerator::EASCII;
|
||||
}
|
||||
|
||||
if (!m_ui->buttonAdvancedMode->isChecked()) {
|
||||
if (m_ui->checkBoxSpecialChars->isChecked()) {
|
||||
classes |= PasswordGenerator::SpecialCharacters;
|
||||
}
|
||||
|
||||
if (m_ui->checkBoxExtASCII->isChecked()) {
|
||||
classes |= PasswordGenerator::EASCII;
|
||||
}
|
||||
} else {
|
||||
if (m_ui->checkBoxLowerAdv->isChecked()) {
|
||||
classes |= PasswordGenerator::LowerLetters;
|
||||
}
|
||||
|
||||
if (m_ui->checkBoxUpperAdv->isChecked()) {
|
||||
classes |= PasswordGenerator::UpperLetters;
|
||||
}
|
||||
|
||||
if (m_ui->checkBoxNumbersAdv->isChecked()) {
|
||||
classes |= PasswordGenerator::Numbers;
|
||||
}
|
||||
|
||||
if (m_ui->checkBoxBraces->isChecked()) {
|
||||
classes |= PasswordGenerator::Braces;
|
||||
}
|
||||
@ -450,13 +447,9 @@ PasswordGenerator::CharClasses PasswordGeneratorWidget::charClasses()
|
||||
classes |= PasswordGenerator::Math;
|
||||
}
|
||||
|
||||
if (m_ui->checkBoxLogograms->isChecked()) {
|
||||
if (m_ui->checkBoxSpecialChars->isChecked()) {
|
||||
classes |= PasswordGenerator::Logograms;
|
||||
}
|
||||
|
||||
if (m_ui->checkBoxExtASCIIAdv->isChecked()) {
|
||||
classes |= PasswordGenerator::EASCII;
|
||||
}
|
||||
}
|
||||
|
||||
return classes;
|
||||
|
@ -45,8 +45,10 @@ public:
|
||||
Password = 0,
|
||||
Diceware = 1
|
||||
};
|
||||
|
||||
explicit PasswordGeneratorWidget(QWidget* parent = nullptr);
|
||||
~PasswordGeneratorWidget();
|
||||
|
||||
void loadSettings();
|
||||
void saveSettings();
|
||||
void setPasswordLength(int length);
|
||||
@ -69,7 +71,7 @@ signals:
|
||||
private slots:
|
||||
void updateButtonsEnabled(const QString& password);
|
||||
void updatePasswordStrength(const QString& password);
|
||||
void setAdvancedMode(bool state);
|
||||
void setAdvancedMode(bool advanced);
|
||||
void excludeHexChars();
|
||||
|
||||
void passwordLengthChanged(int length);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -61,13 +61,13 @@ signals:
|
||||
|
||||
public slots:
|
||||
void databaseChanged(DatabaseWidget* dbWidget = nullptr);
|
||||
void searchFocus();
|
||||
|
||||
private slots:
|
||||
void startSearchTimer();
|
||||
void startSearch();
|
||||
void updateCaseSensitive();
|
||||
void updateLimitGroup();
|
||||
void searchFocus();
|
||||
void toggleHelp();
|
||||
void showSearchMenu();
|
||||
void resetSearchClearTimer();
|
||||
|
@ -24,8 +24,7 @@
|
||||
#include "core/Resources.h"
|
||||
#include "core/Tools.h"
|
||||
#include "gui/Font.h"
|
||||
|
||||
const QColor URLEdit::ErrorColor = QColor(255, 125, 125);
|
||||
#include "gui/styles/StateColorPalette.h"
|
||||
|
||||
URLEdit::URLEdit(QWidget* parent)
|
||||
: QLineEdit(parent)
|
||||
@ -50,7 +49,9 @@ void URLEdit::updateStylesheet()
|
||||
const QString stylesheetTemplate("QLineEdit { background: %1; }");
|
||||
|
||||
if (!Tools::checkUrlValid(text())) {
|
||||
setStyleSheet(stylesheetTemplate.arg(ErrorColor.name()));
|
||||
StateColorPalette statePalette;
|
||||
QColor color = statePalette.color(StateColorPalette::ColorRole::Error);
|
||||
setStyleSheet(stylesheetTemplate.arg(color.name()));
|
||||
m_errorAction->setVisible(true);
|
||||
} else {
|
||||
m_errorAction->setVisible(false);
|
||||
|
@ -28,8 +28,6 @@ class URLEdit : public QLineEdit
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
static const QColor ErrorColor;
|
||||
|
||||
explicit URLEdit(QWidget* parent = nullptr);
|
||||
void enableVerifyMode();
|
||||
|
||||
|
@ -220,7 +220,8 @@ void EditEntryWidget::setupIcon()
|
||||
|
||||
void EditEntryWidget::openAutotypeHelp()
|
||||
{
|
||||
QDesktopServices::openUrl(QUrl("https://github.com/keepassxreboot/keepassxc/wiki/Autotype-Custom-Sequence"));
|
||||
QDesktopServices::openUrl(
|
||||
QUrl("https://keepassxc.org/docs/KeePassXC_UserGuide.html#_configure_auto_type_sequences"));
|
||||
}
|
||||
|
||||
void EditEntryWidget::setupAutoType()
|
||||
|
@ -40,9 +40,7 @@ EntryAttachmentsWidget::EntryAttachmentsWidget(QWidget* parent)
|
||||
m_ui->attachmentsView->setSelectionBehavior(QAbstractItemView::SelectRows);
|
||||
m_ui->attachmentsView->setSelectionMode(QAbstractItemView::ExtendedSelection);
|
||||
|
||||
m_ui->actionsWidget->setVisible(m_buttonsVisible);
|
||||
connect(this, SIGNAL(buttonsVisibleChanged(bool)), m_ui->actionsWidget, SLOT(setVisible(bool)));
|
||||
|
||||
connect(this, SIGNAL(buttonsVisibleChanged(bool)), this, SLOT(updateButtonsVisible()));
|
||||
connect(this, SIGNAL(readOnlyChanged(bool)), SLOT(updateButtonsEnabled()));
|
||||
connect(m_attachmentsModel, SIGNAL(modelReset()), SLOT(updateButtonsEnabled()));
|
||||
|
||||
@ -58,6 +56,7 @@ EntryAttachmentsWidget::EntryAttachmentsWidget(QWidget* parent)
|
||||
connect(m_ui->addAttachmentButton, SIGNAL(clicked()), SLOT(insertAttachments()));
|
||||
connect(m_ui->removeAttachmentButton, SIGNAL(clicked()), SLOT(removeSelectedAttachments()));
|
||||
|
||||
updateButtonsVisible();
|
||||
updateButtonsEnabled();
|
||||
}
|
||||
|
||||
@ -295,6 +294,12 @@ void EntryAttachmentsWidget::updateButtonsEnabled()
|
||||
m_ui->openAttachmentButton->setEnabled(hasSelection);
|
||||
}
|
||||
|
||||
void EntryAttachmentsWidget::updateButtonsVisible()
|
||||
{
|
||||
m_ui->addAttachmentButton->setVisible(m_buttonsVisible && !m_readOnly);
|
||||
m_ui->removeAttachmentButton->setVisible(m_buttonsVisible && !m_readOnly);
|
||||
}
|
||||
|
||||
bool EntryAttachmentsWidget::insertAttachments(const QStringList& filenames, QString& errorMessage)
|
||||
{
|
||||
Q_ASSERT(!isReadOnly());
|
||||
|
@ -48,6 +48,7 @@ private slots:
|
||||
void saveSelectedAttachments();
|
||||
void openAttachment(const QModelIndex& index);
|
||||
void openSelectedAttachments();
|
||||
void updateButtonsVisible();
|
||||
void updateButtonsEnabled();
|
||||
|
||||
private:
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "core/Entry.h"
|
||||
#include "core/Resources.h"
|
||||
#include "core/Tools.h"
|
||||
#include "gui/styles/StateColorPalette.h"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
@ -70,7 +71,8 @@ QVariant EntryURLModel::data(const QModelIndex& index, int role) const
|
||||
const auto urlValid = Tools::checkUrlValid(value);
|
||||
|
||||
if (role == Qt::BackgroundRole && !urlValid) {
|
||||
return QColor(255, 125, 125);
|
||||
StateColorPalette statePalette;
|
||||
return statePalette.color(StateColorPalette::ColorRole::Error);
|
||||
} else if (role == Qt::DecorationRole && !urlValid) {
|
||||
return m_errorIcon;
|
||||
} else if (role == Qt::DisplayRole || role == Qt::EditRole) {
|
||||
|
@ -105,3 +105,9 @@ bool WinUtils::isCapslockEnabled()
|
||||
{
|
||||
return GetKeyState(VK_CAPITAL) == 1;
|
||||
}
|
||||
|
||||
bool WinUtils::isHighContrastMode() const
|
||||
{
|
||||
QSettings settings(R"(HKEY_CURRENT_USER\Control Panel\Accessibility\HighContrast)", QSettings::NativeFormat);
|
||||
return (settings.value("Flags").toInt() & 1u) != 0;
|
||||
}
|
||||
|
@ -36,6 +36,7 @@ public:
|
||||
bool isLaunchAtStartupEnabled() const override;
|
||||
void setLaunchAtStartup(bool enable) override;
|
||||
bool isCapslockEnabled() override;
|
||||
bool isHighContrastMode() const;
|
||||
|
||||
protected:
|
||||
explicit WinUtils(QObject* parent = nullptr);
|
||||
|
@ -3,6 +3,16 @@ QPushButton:default {
|
||||
color: palette(highlighted-text);
|
||||
}
|
||||
|
||||
/* Note: default button hover is defined in the respective theme style */
|
||||
QPushButton:!default:hover {
|
||||
background: palette(mid);
|
||||
}
|
||||
|
||||
QPushButton:checked {
|
||||
background: palette(highlight);
|
||||
color: palette(highlighted-text);
|
||||
}
|
||||
|
||||
QSpinBox {
|
||||
min-width: 90px;
|
||||
}
|
||||
@ -46,3 +56,11 @@ QToolTip {
|
||||
border: none;
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
DatabaseWidget #SearchBanner, DatabaseWidget #KeeShareBanner {
|
||||
font-weight: bold;
|
||||
background-color: palette(highlight);
|
||||
color: palette(highlighted-text);
|
||||
border: 1px solid palette(dark);
|
||||
padding: 2px;
|
||||
}
|
||||
|
15
src/gui/styles/base/classicstyle.qss
Normal file
15
src/gui/styles/base/classicstyle.qss
Normal file
@ -0,0 +1,15 @@
|
||||
DatabaseOpenWidget #loginFrame {
|
||||
border: 2px groove palette(mid);
|
||||
background: palette(light);
|
||||
}
|
||||
|
||||
QToolTip {
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
DatabaseWidget #SearchBanner, DatabaseWidget #KeeShareBanner {
|
||||
font-weight: bold;
|
||||
background-color: rgb(94, 161, 14);
|
||||
border: 1px solid rgb(190, 190, 190);
|
||||
padding: 2px;
|
||||
}
|
@ -8,6 +8,16 @@ EntryPreviewWidget QLineEdit:disabled, EntryPreviewWidget QTextEdit:disabled {
|
||||
background-color: #424242;
|
||||
}
|
||||
|
||||
QPushButton:!default:hover {
|
||||
/* Using slightly darker shade from palette(button) */
|
||||
background: #252528;
|
||||
}
|
||||
|
||||
QPushButton:default:hover, QPushButton:checked:hover {
|
||||
/* Using slightly lighter shade from palette(highlight) */
|
||||
background: #2E582E;
|
||||
}
|
||||
|
||||
QToolTip {
|
||||
color: #BFBFBF;
|
||||
background-color: #2D532D;
|
||||
|
@ -8,11 +8,16 @@ EntryPreviewWidget QLineEdit:disabled, EntryPreviewWidget QTextEdit:disabled {
|
||||
background-color: #EDEDED;
|
||||
}
|
||||
|
||||
QGroupBox::title {
|
||||
color: #4B7B19;
|
||||
QPushButton:default:hover, QPushButton:checked:hover {
|
||||
/* Using slightly lighter shade from palette(highlight) */
|
||||
background: #568821;
|
||||
}
|
||||
|
||||
QToolTip {
|
||||
color: #F9F9F9;
|
||||
background-color: #4D7F1A;
|
||||
}
|
||||
|
||||
QGroupBox::title {
|
||||
color: #4B7B19;
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
<!DOCTYPE RCC>
|
||||
<RCC version="1.0">
|
||||
<qresource prefix="/styles">
|
||||
<file>base/classicstyle.qss</file>
|
||||
<file>base/basestyle.qss</file>
|
||||
<file>dark/darkstyle.qss</file>
|
||||
<file>light/lightstyle.qss</file>
|
||||
|
@ -176,7 +176,7 @@ void YubiKey::findValidKeys()
|
||||
bool wouldBlock;
|
||||
QList<QPair<int, QString>> ykSlots;
|
||||
for (int slot = 1; slot <= 2; ++slot) {
|
||||
auto config = (i == 1 ? CONFIG1_VALID : CONFIG2_VALID);
|
||||
auto config = (slot == 1 ? CONFIG1_VALID : CONFIG2_VALID);
|
||||
if (!(ykds_touch_level(st) & config)) {
|
||||
// Slot is not configured
|
||||
continue;
|
||||
|
@ -52,7 +52,7 @@ int main(int argc, char** argv)
|
||||
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||
QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
|
||||
#endif
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) && defined(Q_OS_WIN)
|
||||
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
|
||||
#endif
|
||||
|
||||
|
@ -447,12 +447,8 @@ void SSHAgent::databaseLocked()
|
||||
if (!removeIdentity(key)) {
|
||||
emit error(m_error);
|
||||
}
|
||||
it = m_addedKeys.erase(it);
|
||||
} else {
|
||||
// don't remove it yet
|
||||
m_addedKeys[key].second = false;
|
||||
++it;
|
||||
}
|
||||
it = m_addedKeys.erase(it);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -113,7 +113,7 @@ QSharedPointer<Totp::Settings> Totp::parseSettings(const QString& rawSettings, c
|
||||
}
|
||||
|
||||
// Bound digits and step
|
||||
settings->digits = qMax(1u, settings->digits);
|
||||
settings->digits = qBound(1u, settings->digits, 10u);
|
||||
settings->step = qBound(1u, settings->step, 60u);
|
||||
|
||||
// Detect custom settings, used by setup GUI
|
||||
|
@ -38,6 +38,7 @@ void TestBrowser::initTestCase()
|
||||
{
|
||||
QVERIFY(Crypto::init());
|
||||
m_browserService = browserService();
|
||||
browserSettings()->setBestMatchOnly(false);
|
||||
}
|
||||
|
||||
void TestBrowser::init()
|
||||
@ -130,6 +131,7 @@ void TestBrowser::testSortPriority()
|
||||
QString host = "github.com";
|
||||
QString submitUrl = "https://github.com/session";
|
||||
QString baseSubmitUrl = "https://github.com";
|
||||
QString fullUrl = "https://github.com/login";
|
||||
|
||||
QScopedPointer<Entry> entry1(new Entry());
|
||||
QScopedPointer<Entry> entry2(new Entry());
|
||||
@ -141,6 +143,7 @@ void TestBrowser::testSortPriority()
|
||||
QScopedPointer<Entry> entry8(new Entry());
|
||||
QScopedPointer<Entry> entry9(new Entry());
|
||||
QScopedPointer<Entry> entry10(new Entry());
|
||||
QScopedPointer<Entry> entry11(new Entry());
|
||||
|
||||
entry1->setUrl("https://github.com/login");
|
||||
entry2->setUrl("https://github.com/login");
|
||||
@ -152,18 +155,20 @@ void TestBrowser::testSortPriority()
|
||||
entry8->setUrl("github.com/login");
|
||||
entry9->setUrl("https://github"); // Invalid URL
|
||||
entry10->setUrl("github.com");
|
||||
entry11->setUrl("https://github.com/login"); // Exact match
|
||||
|
||||
// The extension uses the submitUrl as default for comparison
|
||||
auto res1 = m_browserService->sortPriority(entry1.data(), host, "https://github.com/login", baseSubmitUrl);
|
||||
auto res2 = m_browserService->sortPriority(entry2.data(), host, submitUrl, baseSubmitUrl);
|
||||
auto res3 = m_browserService->sortPriority(entry3.data(), host, submitUrl, baseSubmitUrl);
|
||||
auto res4 = m_browserService->sortPriority(entry4.data(), host, submitUrl, baseSubmitUrl);
|
||||
auto res5 = m_browserService->sortPriority(entry5.data(), host, submitUrl, baseSubmitUrl);
|
||||
auto res6 = m_browserService->sortPriority(entry6.data(), host, submitUrl, baseSubmitUrl);
|
||||
auto res7 = m_browserService->sortPriority(entry7.data(), host, submitUrl, baseSubmitUrl);
|
||||
auto res8 = m_browserService->sortPriority(entry8.data(), host, submitUrl, baseSubmitUrl);
|
||||
auto res9 = m_browserService->sortPriority(entry9.data(), host, submitUrl, baseSubmitUrl);
|
||||
auto res10 = m_browserService->sortPriority(entry10.data(), host, submitUrl, baseSubmitUrl);
|
||||
auto res1 = m_browserService->sortPriority(entry1.data(), host, "https://github.com/login", baseSubmitUrl, fullUrl);
|
||||
auto res2 = m_browserService->sortPriority(entry2.data(), host, submitUrl, baseSubmitUrl, baseSubmitUrl);
|
||||
auto res3 = m_browserService->sortPriority(entry3.data(), host, submitUrl, baseSubmitUrl, fullUrl);
|
||||
auto res4 = m_browserService->sortPriority(entry4.data(), host, submitUrl, baseSubmitUrl, fullUrl);
|
||||
auto res5 = m_browserService->sortPriority(entry5.data(), host, submitUrl, baseSubmitUrl, fullUrl);
|
||||
auto res6 = m_browserService->sortPriority(entry6.data(), host, submitUrl, baseSubmitUrl, fullUrl);
|
||||
auto res7 = m_browserService->sortPriority(entry7.data(), host, submitUrl, baseSubmitUrl, fullUrl);
|
||||
auto res8 = m_browserService->sortPriority(entry8.data(), host, submitUrl, baseSubmitUrl, fullUrl);
|
||||
auto res9 = m_browserService->sortPriority(entry9.data(), host, submitUrl, baseSubmitUrl, fullUrl);
|
||||
auto res10 = m_browserService->sortPriority(entry10.data(), host, submitUrl, baseSubmitUrl, fullUrl);
|
||||
auto res11 = m_browserService->sortPriority(entry11.data(), host, submitUrl, baseSubmitUrl, fullUrl);
|
||||
|
||||
QCOMPARE(res1, 100);
|
||||
QCOMPARE(res2, 40);
|
||||
@ -175,6 +180,7 @@ void TestBrowser::testSortPriority()
|
||||
QCOMPARE(res8, 0);
|
||||
QCOMPARE(res9, 0);
|
||||
QCOMPARE(res10, 0);
|
||||
QCOMPARE(res11, 100);
|
||||
}
|
||||
|
||||
void TestBrowser::testSearchEntries()
|
||||
@ -382,8 +388,8 @@ void TestBrowser::testSortEntries()
|
||||
auto entries = createEntries(urls, root);
|
||||
|
||||
browserSettings()->setBestMatchOnly(false);
|
||||
auto result =
|
||||
m_browserService->sortEntries(entries, "github.com", "https://github.com/session"); // entries, host, submitUrl
|
||||
auto result = m_browserService->sortEntries(
|
||||
entries, "github.com", "https://github.com/session", "https://github.com"); // entries, host, submitUrl
|
||||
QCOMPARE(result.size(), 10);
|
||||
QCOMPARE(result[0]->username(), QString("User 2"));
|
||||
QCOMPARE(result[0]->url(), QString("https://github.com/"));
|
||||
@ -393,6 +399,15 @@ void TestBrowser::testSortEntries()
|
||||
QCOMPARE(result[2]->url(), QString("https://github.com/login"));
|
||||
QCOMPARE(result[3]->username(), QString("User 3"));
|
||||
QCOMPARE(result[3]->url(), QString("github.com/login"));
|
||||
|
||||
// Test with a perfect match. That should be first in the list.
|
||||
result = m_browserService->sortEntries(
|
||||
entries, "github.com", "https://github.com/session", "https://github.com/login_page");
|
||||
QCOMPARE(result.size(), 10);
|
||||
QCOMPARE(result[0]->username(), QString("User 0"));
|
||||
QCOMPARE(result[0]->url(), QString("https://github.com/login_page"));
|
||||
QCOMPARE(result[1]->username(), QString("User 2"));
|
||||
QCOMPARE(result[1]->url(), QString("https://github.com/"));
|
||||
}
|
||||
|
||||
QList<Entry*> TestBrowser::createEntries(QStringList& urls, Group* root) const
|
||||
@ -429,3 +444,58 @@ void TestBrowser::testValidURLs()
|
||||
QCOMPARE(Tools::checkUrlValid(i.key()), i.value());
|
||||
}
|
||||
}
|
||||
|
||||
void TestBrowser::testBestMatchingCredentials()
|
||||
{
|
||||
auto db = QSharedPointer<Database>::create();
|
||||
auto* root = db->rootGroup();
|
||||
|
||||
// Test with simple URL entries
|
||||
QStringList urls = {"https://github.com/loginpage", "https://github.com/justsomepage", "https://github.com/"};
|
||||
|
||||
auto entries = createEntries(urls, root);
|
||||
|
||||
browserSettings()->setBestMatchOnly(true);
|
||||
|
||||
auto result = m_browserService->searchEntries(db, "https://github.com/loginpage", "https://github.com/loginpage");
|
||||
QCOMPARE(result.size(), 1);
|
||||
QCOMPARE(result[0]->url(), QString("https://github.com/loginpage"));
|
||||
|
||||
result = m_browserService->searchEntries(db, "https://github.com/justsomepage", "https://github.com/justsomepage");
|
||||
QCOMPARE(result.size(), 1);
|
||||
QCOMPARE(result[0]->url(), QString("https://github.com/justsomepage"));
|
||||
|
||||
result = m_browserService->searchEntries(db, "https://github.com/", "https://github.com/");
|
||||
m_browserService->sortEntries(entries, "github.com", "https://github.com/", "https://github.com/");
|
||||
QCOMPARE(result.size(), 1);
|
||||
QCOMPARE(result[0]->url(), QString("https://github.com/"));
|
||||
|
||||
browserSettings()->setBestMatchOnly(false);
|
||||
result = m_browserService->searchEntries(db, "https://github.com/loginpage", "https://github.com/loginpage");
|
||||
QCOMPARE(result.size(), 3);
|
||||
QCOMPARE(result[0]->url(), QString("https://github.com/loginpage"));
|
||||
|
||||
// Test with subdomains
|
||||
QStringList subdomainsUrls = {"https://sub.github.com/loginpage",
|
||||
"https://sub.github.com/justsomepage",
|
||||
"https://bus.github.com/justsomepage"};
|
||||
|
||||
entries = createEntries(subdomainsUrls, root);
|
||||
|
||||
browserSettings()->setBestMatchOnly(true);
|
||||
|
||||
result = m_browserService->searchEntries(
|
||||
db, "https://sub.github.com/justsomepage", "https://sub.github.com/justsomepage");
|
||||
QCOMPARE(result.size(), 1);
|
||||
QCOMPARE(result[0]->url(), QString("https://sub.github.com/justsomepage"));
|
||||
|
||||
result = m_browserService->searchEntries(db, "https://github.com/justsomepage", "https://github.com/justsomepage");
|
||||
QCOMPARE(result.size(), 1);
|
||||
QCOMPARE(result[0]->url(), QString("https://github.com/justsomepage"));
|
||||
|
||||
result = m_browserService->searchEntries(db,
|
||||
"https://sub.github.com/justsomepage?wehavesomeextra=here",
|
||||
"https://sub.github.com/justsomepage?wehavesomeextra=here");
|
||||
QCOMPARE(result.size(), 1);
|
||||
QCOMPARE(result[0]->url(), QString("https://sub.github.com/justsomepage"));
|
||||
}
|
||||
|
@ -47,6 +47,7 @@ private slots:
|
||||
void testSubdomainsAndPaths();
|
||||
void testSortEntries();
|
||||
void testValidURLs();
|
||||
void testBestMatchingCredentials();
|
||||
|
||||
private:
|
||||
QList<Entry*> createEntries(QStringList& urls, Group* root) const;
|
||||
|
@ -37,7 +37,6 @@ void TestConfig::testUpgrade()
|
||||
Config::createConfigFromFile(tempFile.fileName());
|
||||
|
||||
// value of new setting should be opposite the value of deprecated setting
|
||||
QVERIFY(config()->get(Config::TrackNonDataChanges).toBool());
|
||||
QVERIFY(!config()->get(Config::Security_PasswordsRepeatVisible).toBool());
|
||||
QVERIFY(!config()->get(Config::Security_PasswordsHidden).toBool());
|
||||
QVERIFY(config()->get(Config::Security_PasswordEmptyPlaceholder).toBool());
|
||||
|
@ -72,10 +72,14 @@ void TestTools::testEnvSubstitute()
|
||||
#if defined(Q_OS_WIN)
|
||||
environment.insert("HOMEDRIVE", "C:");
|
||||
environment.insert("HOMEPATH", "\\Users\\User");
|
||||
environment.insert("USERPROFILE", "C:\\Users\\User");
|
||||
|
||||
QCOMPARE(Tools::envSubstitute("%HOMEDRIVE%%HOMEPATH%\\.ssh\\id_rsa", environment),
|
||||
QString("C:\\Users\\User\\.ssh\\id_rsa"));
|
||||
QCOMPARE(Tools::envSubstitute("start%EMPTY%%EMPTY%%%HOMEDRIVE%%end", environment), QString("start%C:%end"));
|
||||
QCOMPARE(Tools::envSubstitute("%USERPROFILE%\\.ssh\\id_rsa", environment),
|
||||
QString("C:\\Users\\User\\.ssh\\id_rsa"));
|
||||
QCOMPARE(Tools::envSubstitute("~\\.ssh\\id_rsa", environment), QString("C:\\Users\\User\\.ssh\\id_rsa"));
|
||||
#else
|
||||
environment.insert("HOME", QString("/home/user"));
|
||||
environment.insert("USER", QString("user"));
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user