Compare commits

...

360 Commits

Author SHA1 Message Date
Janek Bevendorff
046e50882b Update translations 2022-02-27 23:12:43 +01:00
Jonathan White
ab007c4815 Update snapcraft file to latest API 2022-02-27 16:53:52 -05:00
Jonathan White
18704f5a19 2.7.0 Changelog and minor release-tool fix
* Fix creating output directory on power shell release tool
2022-02-27 16:53:52 -05:00
Jonathan White
e85425050b Properly press AltGr key in Windows Auto-Type
* Fix #7456
2022-02-25 06:05:21 -05:00
Jonathan White
f3b0fe46b4 Fix excluding characters in password generator
* Fixes #7451
2022-02-23 17:57:52 -05:00
Sami Vänttinen
7284a8062a Fix password generator responses (#7404)
* Respond directly to the current client instead of broadcasting

* Append requestID to generate-password response
2022-02-23 17:48:50 -05:00
Sami Vänttinen
6791024995 Fix new password generator closed reply with Browser Integration (#7359) 2022-02-23 17:48:50 -05:00
Jonathan White
4f0710350f Add support for Windows Hello
* Special thanks to @HexF and @smlu for their contributions towards this feature.

* Add MVP support for Windows Hello as a Quick Unlock solution using the WinRT API. This works by signing a random challenge vector with the Windows Hello protected key store (typically from TPM). The signed challenge is hashed using SHA-256 and then used as the encryption key to encrypt the database credentials. Credentials are encrypted using AES-256/GCM. This ensures the database password can only be decrypted following a successful authentication with Windows Hello in the future.

* Unify Touch ID and Windows Hello behavior under the Quick Unlock branding. Remove all timeout features of Touch ID as they are unnecessary and complicate the feature for no security gain.

* Quick Unlock is automatically reset only when the database key is changed vice whenever database settings are modified.

* Don't set database unlock dialog as always on top. This allows Touch ID and Windows Hello prompts to appear above the dialog properly.

* Prevent quick unlock when using AutoOpen or opening from the command line.
2022-02-22 17:53:50 -05:00
Jonathan White
a76daeb4c5 Add key serialization to support Quick Unlock 2022-02-22 17:53:50 -05:00
Bernhard Kirchen
acce1bc5ce entry preview: blend background of tags when inactive 2022-02-21 11:53:37 -05:00
Toni Spets
bfbc0e5ec6 Auto-Type: Allow retyping with automatic relock
If relock after performing Auto-Type is enabled it will wait until
specified timeout before doing so.

Retype time is now configurable and is decreased from the old
hardcoded 30 seconds down to 15 seconds to keep the default a bit
more secure while still allowing the user to set it higher for
their liking.

To restore old behavior the user can set retype time to 0 which
will make the database relock instantly.

Auto-Type relock setting relocated to Auto-Type tab to group it
better with the other Auto-Type settings.
2022-02-20 16:12:16 -05:00
Jonathan White
0701d1d6cd Fix styling of database tag view in main window
* Also allow collapsing the entire left splitter instead of a dedicated option to hide the group view.
2022-02-20 15:37:22 -05:00
Magnus Groß
d10c5a4e2a Detect system dark mode preference changes without restart on Linux
The new org.freedesktop.appearance.color-scheme key allows us to do this
in a reliable way.

Recently freedesktop standardized the system dark mode preference in a
desktop environment independent way in the xdg-desktop-portal
specification.

The specification can be seen here: d7a304a006/data/org.freedesktop.impl.portal.Settings.xml (L33-L45)

KDE supports this since KDE Plasma 5.24 and Gnome supports this since
Gnome 42.

Relevant blog post: https://blogs.gnome.org/alexm/2021/10/04/dark-style-preference/

Fixes #7146
2022-02-17 20:17:45 -05:00
Jonathan White
58615d78bd Fix using modifier keys
* Fix error in regex that prevented use of modifier keys in general.
* Added '#' modifier to press the "Meta" button. This correlates to the Windows key on Windows and Command key on macOS.
* Fix #6695 - send proper modifier keys based on documentation
2022-02-08 19:07:43 -05:00
Jonathan White
1150b69836 Fix Windows Auto-Type sending characters to virtualized guests
* Fix #1833
2022-02-08 19:07:43 -05:00
Toni Spets
5927821896 Auto-Type: Only match non-empty associations
Previously empty associations matched any window but since you can
use a wildcard (*) if you specifically want that this change makes
it possible to define multiple sequences for the global search
if you need to.

Additionally show empty associations in the list as "(empty)" to
better differentiate between rows if no title is set.
2022-02-08 19:07:00 -05:00
Jonathan White
86ba58da06 Fix missing path test in powershell release tool 2022-02-06 09:33:11 -05:00
tx3eh8IUD1
bc55974ff3 Update BrowserPlugin.adoc
fixed grammar mistake (added word 'to')
2022-02-01 07:02:25 -05:00
tenzap
84f245badb Enable "-fsized-deallocation" iif deallocation functions are present
On some systems, although "-fsized-deallocation" compiler flag is there,
compilation will fail because some deallocation functions are missing.
Typically 'operator delete ( void* ptr, std::size_t sz )' is missing on some
macOS systems.

This will check their presence.

On macOS we can have this case when using a compiler that supports the flag,
while the OS doesn't have all the deallocation functions. Typically,
::operator delete(ptr, size) appeared in macOS 10.12

Reported error was:
error: call to unavailable function 'operator delete': introduced in macOS 10.12
2022-02-01 07:02:07 -05:00
transifex-integration[bot]
07564d533a Apply translations in tr (#7363)
review completed for the source file '/share/translations/keepassxc_en.ts'
on the 'tr' language.

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2022-02-01 09:23:18 +01:00
Balazs Gyurak
6897787d8f Show expired entries on DB unlock
* Show banner message about expired entries
* Add config option and expiration offset
* Only show expiry warning on first DB unlock
* Default to on with 3-day offset from expiration
2022-01-31 07:19:45 -05:00
Jonathan White
3c824cb500 Add powershell version of release-tool 2022-01-31 07:00:08 -05:00
transifex-integration[bot]
064d621846 Translate '/share/translations/keepassxc_en.ts' in 'tr' (#7356)
* Apply translations in tr

review completed for the source file '/share/translations/keepassxc_en.ts'
on the 'tr' language.

* Apply translations in tr

review completed for the source file '/share/translations/keepassxc_en.ts'
on the 'tr' language.

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2022-01-30 21:41:09 +01:00
Jonathan White
9b7e54947b Fix security settings on MSVC build
* Properly set DEP, ASLR, and Control Flow Guards when building with MSVC
* Improve PDB file (/Zf) creation speed
* Add address sanitization checks in debug builds by default (/fsanitize=address) with MSVC 2019+
2022-01-28 21:29:10 -05:00
Matt Miller
b29e8fb0b5 Update tab order for CSV import dialog to match screen order (order top-bottom first then left-right) 2022-01-28 21:28:54 -05:00
Jonathan White
6a12f450e6 Fix access denied errors when using KeeShare export/sync (#7322) 2022-01-28 21:28:01 -05:00
Patrick Klein
bce8c84c26 Remove obsolete read only state from database. (#7324) 2022-01-28 21:26:53 -05:00
oysteins-a
c914c116e4 Fixed typo occurences 2022-01-28 21:25:31 -05:00
OlesyaGerasimenko
98beb0e5a1 Add Russian translation
Russian translation for "Comment" and "GenericName"
2022-01-28 21:25:09 -05:00
Jonathan White
7f92504a2d Fix wildcard window title matching in Auto-Type
* Fixes #6413
2022-01-28 19:38:30 -05:00
Xavier Valls
4a21cee98c Add tags feature
* show the tags in the entry preview
* allow searching by tag
* add a sidebar listing the tags in the database
* filter entries by tag on click
* Introduce a new TagsEdit widget that provides pill aesthetics, fast removal functionality and autocompletion
* add tests for the tags feature
* introduce the "is" tag for searching. Support for weak passwords and expired added.
2022-01-28 16:13:49 -05:00
Michal Lukaszek
56a1b465a1 Add support for Microsoft Edge 2022-01-08 17:17:50 -05:00
varjolintu
7efaca6fbe Accept kdbx:// urls in Edit Entry view 2021-12-30 08:14:30 -05:00
Sami Vänttinen
cd642e7fee Add support for Browser statistics (#7197)
Co-authored-by: Jonathan White <support@dmapps.us>
2021-12-30 07:31:06 -05:00
osx user
15d1b2f0ab Show what changed between entry history items
* Also show what is changed on the current state
* Closes #2621
2021-12-22 05:52:54 -05:00
Jonathan White
12990e59ad KeeShare: Remove checking signed container
* Remove QuaZip dependency in favor of minizip
* Remove signature checks, but maintain signatures for backwards compatibility
* Remove UI components related to certificates except for personal certificate for backwards compatibility
* Default to unsigned containers (*.kdbx)
2021-12-14 23:23:23 -05:00
Lorenzo Tucci
c88d8c870f Add lock selected database action on toolbar
Closes #6445

Switch tab when locking a database and move Lock Database actions to the Database section of the toolbar.
2021-12-12 23:40:59 -05:00
Daniel Peshev
456726556d Add url field to download favicon 2021-12-12 12:32:11 -05:00
varjolintu
12d16f67ae Download favicon in the background after credential add 2021-12-12 08:14:14 -05:00
Geert Ijewski
d16fc2d62a Add db statistic output to CLI db-info command.
Closes #6920
2021-12-08 23:41:05 -05:00
mckeema
6c4a82bd51 Make selected text copyable instead of copying password
* Fixes 7209
2021-12-08 19:39:51 -05:00
Patrick Klein
a0a063b57f Add -i/--include option to "generate" CLI command. (#7112) 2021-12-07 23:40:09 -05:00
evgfilim1
b3896f2600 Add simple detection of timestamp resolution
Set access time equal to modification time
2021-12-03 12:07:18 -05:00
Xavier Valls
d8c62f8eba bump to the C++17 standard in the build system (#7180) 2021-11-29 10:57:59 +01:00
Toni Spets
606096278b Auto-Type: Remember previous selected global match
This makes using multi-stage login forms slightly easier as you
can avoid typing the search terms multiple times.
2021-11-26 10:31:20 -05:00
Jonathan White
d3d7bd7b81 Fix transient save errors in TestGui 2021-11-25 14:29:13 -05:00
Toni Spets
2fb1c076d4 SSH Agent: Show correct error messages in main window
Fixes #7152
2021-11-24 22:37:28 -05:00
tenzap
dc7ad6c1b7 Fix syntax issue & add a missing header (#7160)
* Fix syntax to prevent compilation issue

Fix build failure with AppleClang 7 & 8.

Error was:
src/core/CustomData.cpp:30:41: error: default initialization of an object of const type 'const CustomData::CustomDataItem' without a user-provided default constructor
static const CustomData::CustomDataItem NULL_ITEM;
                                        ^
                                                 {}
src/core/Metadata.cpp:32:39: error: default initialization of an object of const type 'const Metadata::CustomIconData' without a user-provided default constructor
static const Metadata::CustomIconData NULL_ICON;
                                      ^

src/core/Metadata.cpp:32:48: note: add an explicit initializer to initialize 'NULL_ICON'
static const Metadata::CustomIconData NULL_ICON;
                                               ^
                                               {}

* Add missing QUuid header

Fixes this compilation issue with LLVM clang 9, possibly also due to an old QT5

tests/TestTools.cpp:96:39: error: incomplete type 'QUuid' named in nested name specifier
    auto validUuid = Tools::uuidToHex(QUuid::createUuid());
                                      ^~~~~~~
/opt/local/libexec/qt5/lib/QtCore.framework/Headers/qmetatype.h:1887:1: note: forward declaration of 'QUuid'
QT_FOR_EACH_STATIC_CORE_CLASS(QT_FORWARD_DECLARE_STATIC_TYPES_ITER)
^
/opt/local/libexec/qt5/lib/QtCore.framework/Headers/qmetatype.h:108:18: note: expanded from macro 'QT_FOR_EACH_STATIC_CORE_CLASS'
    F(QUuid, 30, QUuid) \
                 ^
tests/TestTools.cpp:101:40: error: incomplete type 'QUuid' named in nested name specifier
    auto nonHexUuid = Tools::uuidToHex(QUuid::createUuid()).replace(0, 1, 'p');
                                       ^~~~~~~
/opt/local/libexec/qt5/lib/QtCore.framework/Headers/qmetatype.h:1887:1: note: forward declaration of 'QUuid'
QT_FOR_EACH_STATIC_CORE_CLASS(QT_FORWARD_DECLARE_STATIC_TYPES_ITER)
^
/opt/local/libexec/qt5/lib/QtCore.framework/Headers/qmetatype.h:108:18: note: expanded from macro 'QT_FOR_EACH_STATIC_CORE_CLASS'
    F(QUuid, 30, QUuid) \
                 ^
2021-11-24 22:36:31 -05:00
tenzap
61e378077e Fix compilation on macOS when clang < 9 or Qt < 5.12 (#7117)
* fix compilation on Qt not having QOperatingSystemVersion::MacOSBigSur

The code uses 'QOperatingSystemVersion::MacOSBigSur' which doesn't exist
in all Qt versions (it has been backported to Qt 5.12.10+ & 5.15.1+ only).
On older macos systems like El Capitan the last supported
version of Qt is 5.11

This will fix compilation issue on such older systems and on systems
running with Qt not supporting QOperatingSystemVersion::MacOSBigSur

Compilation error was:
error: no member named 'MacOSBigSur' in 'QOperatingSystemVersion'

* Fix compilation when osx <= 10.9

* AppKitImpl.mm: button property is new in 10.10. It is used for a feature of
  KeePassXC that is only available from 10.17 onwards. So we don't need it when
  compiling on <= 10.9
error: property 'button' not found on object of type 'NSStatusItem *'
        NSString* appearance = [dummy.button.effectiveAppearance.name lowercaseString];
                                      ^

* The code uses @available syntax which is supported by
  AppleClang >= 9 or LLVM >= 5.
  We check __clang_major__ to allow compilation on older versions
  of macOS that don't have a recent clang. For example on El Capitan.

* Fix compilation when osx <= 10.8

* AppKitImpl.mm: AXIsProcessTrustedWithOptions exists from 10.9 onwards
error: use of undeclared identifier 'kAXTrustedCheckOptionPrompt'
error: use of undeclared identifier 'AXIsProcessTrustedWithOptions'

* Fix compilation when osx <= 10.7

* MacUtils.cpp: CoreGraphics exists from 10.8 onwards only, capslock detection
  feature would have to be implemented on OSX <= 10.7

* AppKitImpl.mm: CGDisplayStreamRef exists from 10.8 onwards only. It is used for a
  feature of KeePassXC that is only available from 10.15 onwards. So we don't need it
  when compiling on <= 10.7
error: unknown type name 'CGDisplayStreamRef'

* AppKitImpl.mm: Syntax is not understood by 10.7, update it to be understandable
  by <= 10.7
error: expected method to read dictionary element not found on object of type 'NSDictionary *'
    NSRunningApplication* app = userInfo[NSWorkspaceApplicationKey];
                                ^

* The code uses @available syntax which is supported by
  AppleClang >= 9 or LLVM >= 5.
  We check __clang_major__ to allow compilation on older versions
  of macOS that don't have a recent clang.

* Fix compilation error on OS X 10.11

src/core/Alloc.cpp:44:10: error: no type named 'free' in namespace 'std'
    std::free(ptr);
    ~~~~~^

This is a regression, since it was fixed in [1]

Per [2], std::free() needs #include <cstdlib>. That file is included
indirectly on newer systems.

[1] 7c6c027d33
[2] https://en.cppreference.com/w/cpp/memory/c/free

* fix compilation when macos SDK <= 10.14

These methods are only available from macOS 10.15
  - kSecAccessControlWatch
  - LAPolicy.deviceOwnerAuthenticationWithBiometricsOrWatch

The code uses @available syntax which is supported by
AppleClang >= 9 or LLVM >= 5.
We check __clang_major__ to allow compilation on older versions
of macOS that don't have a recent clang.
2021-11-24 22:35:38 -05:00
Patrick Sean Klein
296cbf0df7 Add sorting of HTML export
- Closes #6164
- Implement sorting support in HtmlExporter
- Add ExportDialog class and UI, which allows to configure export options.
2021-11-24 00:12:13 -05:00
tenzap
d3b28f8651 use cmake's FindOpenMP (#7156)
check_add_gcc_compiler_flag("-fopenmp")
is not robust enough. On some systems and with some compilers
(eg. AppleClang 7) it may say the compiler flag is valid, but later build
fails with:

ld: library not found for -lgomp

Actually, AppleClang doesn't support OpenMP

Replace this check with cmake's FindOpenMP [1] which gives better results.

Output example in case of not found
-- Could NOT find OpenMP_C (missing: OpenMP_C_FLAGS OpenMP_C_LIB_NAMES)
-- Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES)
-- Could NOT find OpenMP (missing: OpenMP_C_FOUND OpenMP_CXX_FOUND)

Output example in case of found
-- Found OpenMP_C: -fopenmp=libomp (found version "3.1")
-- Found OpenMP_CXX: -fopenmp=libomp (found version "3.1")
-- Found OpenMP: TRUE (found version "3.1")

[1] https://cmake.org/cmake/help/v3.3/module/FindOpenMP.html?highlight=openmp#variables
2021-11-23 13:34:35 +01:00
Janek Bevendorff
a3dc977e58 Correctly set KDBX envelope version
Shows a warning when trying to open with a newer minor version than what is currently supported.

We always try to save with the lowest KDBX version possible for maximum compatibility.
2021-11-22 12:58:04 +01:00
Janek Bevendorff
67603ab42e Retain number of rounds when auto-upgrading KDBX version 2021-11-22 12:58:04 +01:00
Janek Bevendorff
c94efe6b5c Avoid redundant KDBX4 test runs 2021-11-22 12:58:04 +01:00
Janek Bevendorff
c872e406ed Upgrade to KDBX 4 if new 4.1 features are used 2021-11-22 12:58:04 +01:00
Janek Bevendorff
835e31ac3c Implement KDBX 4.1 CustomData modification date
We keep the old merging behaviour for now, since deleting a
CustomData entry does not create DeletedObject.
2021-11-22 12:58:04 +01:00
Janek Bevendorff
390e14b2c6 Implement KDBX 4.1 extended custom icons 2021-11-22 12:58:04 +01:00
Janek Bevendorff
70e62d90db Add "Restore Entries" feature 2021-11-22 12:58:04 +01:00
Janek Bevendorff
e5822974ac Implement KDBX 4.1 group tags 2021-11-22 12:58:04 +01:00
Janek Bevendorff
cd9ef58e98 Implement KDBX 4.1 PreviousParentGroup flag 2021-11-22 12:58:04 +01:00
Janek Bevendorff
ffaeac130f Implement KDBX 4.1 PasswordQuality flag 2021-11-22 12:58:04 +01:00
Jonathan White
035757e228 Improve Visual Studio and vcpkg support 2021-11-16 07:01:48 -05:00
ADD-SP
e5065a01c8 Fix crash while downloading favicons 2021-11-13 23:18:47 -05:00
Jonathan White
c37e2d3d69 Fix entry preview resetting when focusing out of entry view
* Fixes #7061
* This bug impacts linux only when clicking in the preview panel.
2021-11-13 23:17:30 -05:00
louib
004f2b6801 Removing QWidget dependency from src/core. 2021-11-12 07:41:30 -05:00
Jonathan White
6f5bbf7ad1 Fix database save calls in CLI due to backup path 2021-11-07 17:52:23 -05:00
Patrick Klein
84ff6a13f9 Allow specifing database backup paths. (#7035)
- Default backupFilePath is '{DB_FILENAME}.old.kdbx' to conform to existing standards
- Implement backupPathPattern tests.
- Show tooltip on how to format database backup location text field.
2021-11-07 17:41:17 -05:00
Jonathan White
8d7e491810 CLI: Fixed typo in tests 2021-11-07 17:27:16 -05:00
Andre Blanke
7d37f65ad0 CLI: Add commands to handle attachments
* Add commands to manipulate entry attachments from the CLI
* Closes #4462

* Add the following commands:
  attachment-export: Exports the content of an attachment to a specified file.

  attachment-import: Imports the attachment into an entry. An existing attachment with the same name may be overwritten if the -f option is specified.

  attachment-rm: Removes the named attachment from an entry.

* Add --show-attachments  to the show command
2021-11-07 17:27:16 -05:00
snipfoo
7811f10dba Support for wordlists in user configuration directory (#6799)
This commit allows users to put alternative wordlists in a `wordlists` subdirectory below their KeePassXC directory (e.g., under Linux, `~/.config/keepassxc/wordlists`). These wordlists will then appear in the dropdown menu in the *Password Generator* widget.

In order to differentiate between lists shipped with KeePassXC and user-provided lists, the former appears with a (SYSTEM) prefix.
2021-11-04 23:02:33 -04:00
Sami Vänttinen
bb88ad6e8c Add Microsoft Edge support for Linux (#7100) 2021-11-04 23:02:02 -04:00
Toni Spets
3b1acd0831 Auto-Type: Reimplement X11 keysym emulation (#7098)
* Fix Regression since 4d07507

* Auto-Type: Workaround X server default keymap bug

If there's a system wide configuration through xorg.conf for a default keyboard layout and it's not updated by the WM/DE at startup the Xkb extension seems to be somewhat confused with XTEST and the layout somehow defaults to US ANSI.

Reading the keyboard description and writing it back without changes works around this.
2021-11-04 23:01:47 -04:00
Patrick Sean Klein
20db504c3a Implement "Overwrite attachment" confirmation dialog. 2021-10-24 23:41:57 -04:00
Sami Vänttinen
55f2bd41aa Modify the KeePassHTTP attribute conversion button text (#7073) 2021-10-24 22:34:30 -04:00
varjolintu
dd41f093e6 Launch KeePassXC password generator popup from the extension
* Closes #6473
2021-10-24 10:24:17 -04:00
Aetf
2a9d92faeb FdoSecrets: reject setting refs via the API (#7043)
* FdoSecrets: add TOTP as a readonly attribute

* FdoSecrets: reject setting fields containing refs, fixes #6802

It is still possible to set refs using KPXC UI.
2021-10-24 10:22:50 -04:00
Patrick Sean Klein
c8f135aaed Resolve references of entry attributes when exporting to HTML. 2021-10-24 10:21:35 -04:00
Andreas Schneider
9fc30265c8 cmake: Check for PIE support 2021-10-24 10:20:59 -04:00
Jonathan White
9aa30c4e72 Fix building on macOS due to PCSC
* Fixes #7072
2021-10-23 17:07:29 -04:00
Andreas Schneider
3ecc0c70e2 cmake: Fix position independent code with LTO
Fixes #7044
2021-10-16 22:52:10 -04:00
Aetf
8b6d0e4b12 Fix EntryView and PreviewView to automatically update when the model changes 2021-10-16 22:51:37 -04:00
Aetf
a31c5ba006 FdoSecrets: Implement unlock before search
Fixes #6942 and fixes #4443

- Return number of deleted entries
- Fix minor memory leak
- FdoSecrets: make all prompt truly async per spec and update tests
    * the waited signal may already be emitted before calling spy.wait(),
      causing the test to fail. This commit checks the count before waiting.
    * check unlock result after waiting for signal
- FdoSecrets: implement unlockBeforeSearch option
- FdoSecrets: make search always work regardless of entry group searching settings, fixes #6942
- FdoSecrets: cleanup gracefully even if some test failed
- FdoSecrets: make it safe to call prompts concurrently
- FdoSecrets: make sure in unit test we click on the correct dialog

Note on the unit tests: objects are not deleted (due to deleteLater event not handled).
So there may be multiple AccessControlDialog. But only one of
it is visible and is the correctly one to click on.

Before this change, a random one may be clicked on, causing the
completed signal never be sent.
2021-10-16 22:50:04 -04:00
varjolintu
b6716bdfe5 Add Browser Integration to Group Edit page
Closes #1789 and closes #3998
2021-10-11 00:19:06 -04:00
varjolintu
c7cdce6e33 Support for triggering Global Auto-Type from browser extension 2021-10-10 23:41:58 -04:00
mhmdanas
be6835e42f Cleanup PCSC interface code
Fixes #7025
2021-10-09 14:41:26 -04:00
Chih-Hsuan Yen
3b3bc42e10 Fix broken browser integration since #6899 (#7030) 2021-10-09 11:22:44 -04:00
Jonathan White
f2aa32c7b0 Add direct write save option
* Closes #6335
* Modify application settings presentation to  allow for alternative saving strategies
* Transition Database::save calls to using flags to control saving behavior. Reduces boolean flags on function call.
* Made direct write save option a local setting to prevent unintentional carry over between platforms.
2021-10-09 11:12:25 -04:00
Jonathan White
484bc5dd01 Fix infinite save bug when saving fails
* Introduced in #6438, modified signal is not blocked at the Database level when emitting is blocked. This causes infinite saving to occur when Always Save After Every Change is enabled.
2021-10-09 11:12:25 -04:00
sgmoore
bd744d1e32 Update README.md - grammar fixes (#7024) 2021-10-06 18:26:35 +02:00
Jonathan White
d82abf0be5 Correct naming of newly generated keyx files
Fixes #6040
2021-10-03 07:32:03 -04:00
Gaurav Pruthi
6c18b10979 Place the 'Recycle Bin' at the bottom of the list when groups are sorted. (#7004)
Co-authored-by: Gaurav Pruthi <gaurav.pruthi@oracle.com>
2021-10-02 02:55:42 -04:00
osx user
2514c1d5c5 feature/AutoTypeTOTP 2021-10-02 00:04:03 -04:00
snipfoo
e660802fac Add support for Diceware wordlists in numbered and/or PGP-signed formats (#6791)
This allows one to directly use Diceware-compatible wordlists without having to convert the file to the plain wordlist format.

The accepted formats are described in the Diceware documentation:
https://diceware.readthedocs.io/en/stable/wordlists.html
2021-10-02 00:01:04 -04:00
Nikolas Grottendieck
5ec2686024 Doc: Update SSH Agent section
* Update naming of `macOS` to use the official case instead of `MacOS`
* Add an in depth explanation for using Windows OpenSSH (see https://github.com/keepassxreboot/keepassxreboot.github.io/pull/96 for details)
* Remove some trailing whitespace
2021-10-01 23:53:41 -04:00
Aetf
60cfba8e46 FdoSecrets: Improve client executable path handling (#6915)
* Fixes #6459 

Improves the overall handling of FdoSecrets showing client executable paths to the user. It does the following:

* Check executable file existence as described in [RFC] fdosecrets: add optional confirmation to secret access (#4733)
* Show application PID and dbus address in the client list
* When the executable file is inaccessible, depending on where the client name is shown:
    * when shown inline, e.g. in notification text, where space is limited, clearly say that the path is invalid
    * when shown in auth dialog, show warning and print detailed info about the client
    * when shown in the client list, draw a warning icon

Co-authored-by: Jonathan White <support@dmapps.us>
2021-10-01 18:22:15 -04:00
Toni Spets
860fcfd78d SSH Agent: Add support for OpenSSH 8.2 FIDO/U2F keys
Closes #4334
2021-10-01 16:25:14 -04:00
Toni Spets
c07a57d141 SSH Agent: Template reading key parts
This is a prerequisite for security key backed keys.
2021-10-01 16:25:14 -04:00
Toni Spets
6ded326de7 SSH Agent: Store raw key data as complete blobs
This is a prerequisite for security key backed keys.
2021-10-01 16:25:14 -04:00
Toni Spets
17d51b558e SSH Agent: Add missing ECDSA tests for OpenSSHKey 2021-10-01 16:25:14 -04:00
Jonathan White
1dbec40be9 Add countdown progress bar to TOTP preview
* Close #6556
2021-10-01 15:35:42 -04:00
Gaurav Pruthi
405d3ee1ca Add feature to sort groups using shortcut keys (#6999)
* Register Ctrl + Down to sort A->Z and Ctrl + Up to sort Z->A
2021-10-01 10:54:15 -04:00
Christoph Honal
6d1fc31e96 Implement support for Yubikeys and potential other tokens via wireless NFC using smartcard readers (Rebase) (#6895)
* Support NFC readers for hardware tokens using PC/SC

This requires a new library dependency: PCSC.
The PCSC library provides methods to access smartcards. On Linux, the third-party pcsc-lite package is used. On Windows, the native Windows API (Winscard.dll) is used. On Mac OSX, the native OSX API (framework-PCSC) is used.

* Split hardware key access into multiple classes to handle different methods of communicating with the keys.

* Since the Yubikey can now be a wireless token as well, the verb "plug in" was replaced with a more
generic "interface with". This shall indicate that the user has to present their token to the reader, or plug it in via USB.

* Add PC/SC interface for YubiKey challenge-response

This new interface uses the PC/SC protocol and API
instead of the USB protocol via ykpers. Many YubiKeys expose their functionality as a CCID device, which can be interfaced with using PC/SC. This is especially useful for NFC-only or NFC-capable Yubikeys, when they are used together with a PC/SC compliant NFC reader device.

Although many (not all) Yubikeys expose their CCID functionality over their own USB connection as well, the HMAC-SHA1 functionality is often locked in this mode, as it requires eg. a touch on the gold button. When accessing the CCID functionality wirelessly via NFC (like this code can do using a reader), then the user interaction is to present the key to the reader.

This implementation has been tested on Linux using pcsc-lite, Windows using the native Winscard.dll library, and Mac OSX using the native PCSC-framework library.

* Remove PC/SC ATR whitelist, instead scan for AIDs

Before, a whitelist of ATR codes (answer to reset, hardware-specific)
was used to scan for compatible (Yubi)Keys.
Now, every connected smartcard is scanned for AIDs (applet identifier),
which are known to implement the HMAC-SHA1 protocol.

This enables the support of currently unknown or unreleased hardware.

Co-authored-by: Jonathan White <support@dmapps.us>
2021-10-01 10:39:07 -04:00
Janek Bevendorff
cc39f9ec23 Update and improve release-tool
- Exit and clean up on intermittent errors
- Show colour output when building in Docker containers
- Run builds in containers as current user
- Remove obsolete libgpg-error workarounds
- General cleanup
2021-09-30 09:00:12 +02:00
transifex-integration[bot]
c90ab2b9cb Apply translations in zh_CN
translation completed for the source file '/share/translations/keepassxc_en.ts'
on the 'zh_CN' language.
2021-09-29 08:52:41 +02:00
transifex-integration[bot]
e8a32cc6a8 Apply translations in es
translation completed for the source file '/share/translations/keepassxc_en.ts'
on the 'es' language.
2021-09-29 02:15:37 +02:00
transifex-integration[bot]
9c2ae81f19 Apply translations in pt_PT
translation completed for the source file '/share/translations/keepassxc_en.ts'
on the 'pt_PT' language.
2021-09-28 23:35:02 +02:00
transifex-integration[bot]
10b4854915 Apply translations in de
translation completed for the source file '/share/translations/keepassxc_en.ts'
on the 'de' language.
2021-09-28 21:42:46 +02:00
transifex-integration[bot]
626a4910ca Apply translations in it
translation completed for the source file '/share/translations/keepassxc_en.ts'
on the 'it' language.
2021-09-28 19:19:36 +02:00
transifex-integration[bot]
8cbc327f90 Apply translations in pt_BR
translation completed for the source file '/share/translations/keepassxc_en.ts'
on the 'pt_BR' language.
2021-09-28 19:16:01 +02:00
transifex-integration[bot]
fd2992913e Apply translations in pl
translation completed for the source file '/share/translations/keepassxc_en.ts'
on the 'pl' language.
2021-09-28 19:07:12 +02:00
transifex-integration[bot]
1c529cbd20 Apply translations in el
translation completed for the source file '/share/translations/keepassxc_en.ts'
on the 'el' language.
2021-09-28 17:27:35 +02:00
transifex-integration[bot]
c766f9c77d Apply translations in hu
translation completed for the source file '/share/translations/keepassxc_en.ts'
on the 'hu' language.
2021-09-28 16:46:01 +02:00
Janek Bevendorff
62ec2e8331 Update translations 2021-09-28 15:50:27 +02:00
Janek Bevendorff
9735e43ecb Update source language file 2021-09-28 15:50:27 +02:00
Janek Bevendorff
3a0ec33c56 Update TX config and merge update.sh into release-tool 2021-09-28 15:50:27 +02:00
Janek Bevendorff
d375ad14d7 Rename translation files 2021-09-28 15:50:27 +02:00
Janek Bevendorff
c198541b6f Improve clang-format performance 2021-09-28 14:15:37 +02:00
Janek Bevendorff
7ff8720a39 Clean up code coverage reporting.
CTest is now run directly and `make coverage` (like `make test`) now
expects you to run `make` beforehand, which is more flexible for the
user. This patch also reduces clutter by properly excluding unwanted
files and reduces the number of explicit exlusion regexes that are
required.

Gcov reports are still confusing and report very low branch coverage
(which is picked up by Codecov, unfortunately), but the llvm-cov reports
are nice and clean now.
2021-09-28 14:15:37 +02:00
Joan Bruguera
e6bf8463d9 Fix unlocking multiple databases with pw-stdin when input is a pipe
This works:

```
$ keepassxc test1.kdbx test2.kdbx --pw-stdin
Database password: <manual input 1234>
Database password: <manual input 4321>
```

But this doesn't (only `test1.kdbx` is unlocked):

```
$ printf '%s\n' 1234 4321 | keepassxc test1.kdbx test2.kdbx --pw-stdin
Database password:
Database password:
```

The problem is that `Utils::setDefaultTextStreams()` is called multiple times
when unlocking multiple databases with `--pw-stdin`, which appears to break the
pipe. Simply call it once to avoid the problem.

Fixes: #5012 (as far as I can tell by simulating the script in Linux)
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
2021-09-28 07:05:50 -04:00
osx user
486779cce7 updateViewStateSync 2021-09-28 06:40:33 -04:00
transifex-integration[bot]
973557a9f9 Translate /share/translations/keepassx_en.ts in uk (#6984)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'uk' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:05:40 +02:00
transifex-integration[bot]
3cb4ac37ba Translate /share/translations/keepassx_en.ts in tr (#6983)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'tr' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:05:29 +02:00
transifex-integration[bot]
6d79d2ffc4 Translate /share/translations/keepassx_en.ts in th (#6982)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'th' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:05:07 +02:00
transifex-integration[bot]
2ed2b7118f Translate /share/translations/keepassx_en.ts in sv (#6981)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'sv' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:05:00 +02:00
transifex-integration[bot]
59ebb360e2 Translate /share/translations/keepassx_en.ts in es (#6980)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'es' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:04:53 +02:00
transifex-integration[bot]
18183ebac0 Translate /share/translations/keepassx_en.ts in sk (#6979)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'sk' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:04:46 +02:00
transifex-integration[bot]
fac4d4c85c Translate /share/translations/keepassx_en.ts in sr (#6978)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'sr' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:04:40 +02:00
transifex-integration[bot]
b0821c0435 Translate /share/translations/keepassx_en.ts in ru (#6977)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'ru' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:04:33 +02:00
transifex-integration[bot]
2776758f14 Translate /share/translations/keepassx_en.ts in ro (#6976)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'ro' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:04:26 +02:00
transifex-integration[bot]
163fffe8f4 Apply translations in pt_PT (#6975)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'pt_PT' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:04:19 +02:00
transifex-integration[bot]
8bf0c8f800 Apply translations in pt_BR (#6974)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'pt_BR' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:04:13 +02:00
transifex-integration[bot]
3fe4ff93e1 Translate /share/translations/keepassx_en.ts in pl (#6973)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'pl' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:04:06 +02:00
transifex-integration[bot]
16bf725dc4 Translate /share/translations/keepassx_en.ts in ko (#6972)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'ko' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:03:57 +02:00
transifex-integration[bot]
afa58b79a9 Translate /share/translations/keepassx_en.ts in ja (#6971)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'ja' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:03:50 +02:00
transifex-integration[bot]
5ba0639f47 Translate /share/translations/keepassx_en.ts in it (#6970)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'it' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:03:44 +02:00
transifex-integration[bot]
a8b65741ea Translate /share/translations/keepassx_en.ts in id (#6969)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'id' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:03:36 +02:00
transifex-integration[bot]
7c9109d973 Translate /share/translations/keepassx_en.ts in hu (#6968)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'hu' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:03:29 +02:00
transifex-integration[bot]
064893830d Translate /share/translations/keepassx_en.ts in he (#6967)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'he' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:03:21 +02:00
transifex-integration[bot]
6760a7f5ca Translate /share/translations/keepassx_en.ts in el (#6966)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'el' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:03:14 +02:00
transifex-integration[bot]
da2d86789e Translate /share/translations/keepassx_en.ts in de (#6965)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'de' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:03:05 +02:00
transifex-integration[bot]
e2b4900541 Apply translations in fr_CA (#6964)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'fr_CA' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:02:57 +02:00
transifex-integration[bot]
8bc75c1840 Translate /share/translations/keepassx_en.ts in fr (#6963)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'fr' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:02:51 +02:00
transifex-integration[bot]
2c63f2f8c5 Translate /share/translations/keepassx_en.ts in fi (#6962)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'fi' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:02:43 +02:00
transifex-integration[bot]
9a669cc17f Translate /share/translations/keepassx_en.ts in et (#6961)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'et' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:02:36 +02:00
transifex-integration[bot]
2d64592d85 Apply translations in en_US (#6960)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'en_US' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:02:28 +02:00
transifex-integration[bot]
a03fa1c9bc Apply translations in nl_NL (#6959)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'nl_NL' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:02:21 +02:00
transifex-integration[bot]
a59fd43cc0 Translate /share/translations/keepassx_en.ts in cs (#6958)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'cs' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:02:14 +02:00
transifex-integration[bot]
635abaee51 Apply translations in zh_TW (#6957)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'zh_TW' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:02:04 +02:00
transifex-integration[bot]
c331cbc8ab Apply translations in zh_CN (#6956)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'zh_CN' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:01:57 +02:00
transifex-integration[bot]
85f70c29bd Translate /share/translations/keepassx_en.ts in bg (#6955)
at least 80% translated for the source file '/share/translations/keepassx_en.ts'
on the 'bg' language.

 Manual sync of partially translated files: untranslated content is included with an empty translation or source language content depending on file format

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2021-09-28 10:01:42 +02:00
Janek Bevendorff
a8da1587b6 Update README.md
Update chat badges
2021-09-27 01:01:03 +02:00
louib
2b0a1fc63f Remove WITH_GUI_TESTS exclusion for CLI tests (#6946)
Apparently this exclusion was only relevant for Linux
systems not running X, which was already handled dynamically
in the testClip function. The CLI tests will now run by default
will all the other core tests.
2021-09-26 12:36:54 +02:00
Janek Bevendorff
a46231a39a Fix tests on macOS and update coverage config (#6945)
Simplifies coverage generation and uses llvm-cov instead of gcov if
compiler is clang.
2021-09-26 12:35:42 +02:00
jus78help
eeba485f95 Removed unnecessary characters from HEX excluded chars
The HEX button automatically unselects `selectBoxLower` therefore there is no need to also add `ghijklmnopqrstuvwxyz` in the excluded characters text field.
2021-09-21 19:05:47 -04:00
varjolintu
4c10e516c3 Add delete-entry command to Browser Integration API 2021-09-21 04:17:14 -04:00
a1346054
e3c7b570ae Minor documentation and script cleanups (#6868)
* Remove mention of no longer used IRC network

Channels exist on matrix, and on libera.chat now.

* Correctly match only files with .png extension

The current search would match files such as 'createpng'.

* Fix comparison in script

The result was always false, due to comparing a literal string instead of a variable.

* Use correct license files from upstream

Correct license files obtained from:
https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
https://www.gnu.org/licenses/gpl-3.0.txt
https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt
https://www.gnu.org/licenses/lgpl-3.0.txt

* Refresh several shell scripts

This fixes several shellcheck warnings, as well as makes the code more
robust and have consistent codestyle between all the files.

* Trim excess whitespace
2021-09-21 00:17:46 -04:00
m5w6
9aec84dee7 Add "parent directory match" priority between exact and host match 2021-09-20 23:53:31 -04:00
Benjamin K
34ed63f495 Add Apple Watch support to quick unlock
* Allow using a paired Apple Watch to authenticate to the secrets store in addition to TouchID.
* Closes #5337
2021-09-20 22:59:17 -04:00
smlu
0c6587b5b7 Add support for Microsoft Visual Studio buildchain
* Use C++17 when using MSVC compiler
* Remove unneeded header files and macros
* Removed unnecessary Yubikey cmake file
* Enhance release tool
* Updated INSTALL.md
2021-09-19 17:16:45 -04:00
elitejake
24a23ce66e Remove offensive words (#6914) 2021-09-15 08:51:52 +02:00
Jonathan White
e6798112be Fix shadowed variables in zxcvbn 2021-09-06 22:44:55 -04:00
Jonathan White
470129091a Fix error in X11Funcs code 2021-09-06 22:36:56 -04:00
Jonathan White
b37dbe7dd5 Improve Yubikey USB API
* Allow for multiple vendor ID's to be checked at once. This allows for the use of one tracking index, streamlining KPXC code.
* Remove support for libusb 0.x on Linux
* Better handling of USB errors during initial key query. Output warnings to console.
2021-09-05 09:11:04 -04:00
Jonathan White
6e27dd8db5 Initial ykcore import into code base 2021-09-05 09:11:04 -04:00
Jonathan White
0450bf3487 Fix hiding main window after browser unlock request
* The main window doesn't hide properly during unlock sequence if it is in the background (ie, not minimized and not hidden to tray). This change makes sure the window hides after interaction on all platforms.
2021-08-29 16:02:40 -04:00
Allen Wild
53dcafaa58 Allow selecting any open database in unlock dialog
* Closes #2322

* Show locked databases in tabbed interface in unlock dialog for browser and auto-type workflows.

* Make the DatabaseOpenDialog window Application-Modal so that it blocks input to the main UI when the dialog is open. This reduces corner cases by avoiding the possibility of databases getting closed or unlocked
behind the open dialog.
2021-08-29 16:02:40 -04:00
Paul Colby
37d29b5e8c Display Database created timestamp in database reports (#6876)
* Fixes #6356
2021-08-29 15:34:16 -04:00
Robin Ebert
e8f2c9d126 CLI: Replace locate command with search
* Introduce search CLI command to replace locate command. Search can provide the same functionality but in a more fine-grained fashion

* Replace use of Group::locate in code: Use EntrySearcher in clip cli command best-match option. This removes the matching against group hierarchy of an entry which is kind of nonsense as clip expects exactly one match. Matching against groups can be done using search command.

* Remove obsolete Group::locate method
2021-08-22 19:23:16 -04:00
louib
ec81d2bc3f Moving CsvParser to format/ 2021-08-22 18:30:43 -04:00
Hongmou Zhang
d2c74340a3 Add option to use both Pageant and OpenSSH agent on Windows 2021-08-22 18:30:32 -04:00
varjolintu
250cd1933c Handle tilde with custom paths 2021-08-22 18:30:18 -04:00
Jonathan White
986fa42ca8 Fix unreadable buttons in attachments widget
* Fix #6648
2021-08-22 17:09:21 -04:00
Janek Bevendorff
3a1560d2f6 Enable more convenient attachment renaming by clicking selection
Fixes #1695
2021-08-22 17:09:21 -04:00
Janek Bevendorff
93f0fef1e1 Improve and secure attachment handling (fixes #2400).
Externally opened attachments are now lifecycle-managed properly.

The temporary files are created with stricter permissions and entirely
random names (except for the file extension) to prevent meta data leakage.

When the database is closed, the files are overwritten with random
data and are also more reliably deleted than before.

Changes to the temporary files are monitored and the user is asked
if they want to save the changes back to the database (fixes #3130).

KeePassXC does not keep a lock on any of the temporary files, resolving
long-standing issues with applications such as Adobe Acrobat on Windows
(fixes #5950, fixes #5839).

Internally, attachments are copied less. The EntryAttachmentsWidget
now only references EntryAttachments instead of owning a separate copy
(which used to not be cleared properly under certain circumstances).
2021-08-22 17:09:21 -04:00
hollow-owl
af9eb6d6b1 Select entry above deleted entry
* Fix #6304 - Don't cause the list view to scroll to the top when deleting any entry in the list.
2021-08-22 17:08:29 -04:00
osx user
746276edea Enhance last used directory settings
* Use hash based storage for last used directories instead of a key/value for each type
* Explicitly declare certain operations as sensitive and follow the "Remember Last Database" setting for those.
* Introduce database backup directory location (close #6619)
2021-08-22 16:47:42 -04:00
louib
5e68cd2fa2 Abort CLI open on error 2021-08-16 01:13:51 -04:00
grgbnc
0413662136 Add missing right angle bracket
Fix the syntax of the `ATTR_NAME` action code placeholder
2021-08-15 22:52:26 -04:00
Julius Zint
38a60df40b Set the MIME-Type to text/plain when using wl-copy on wayland. If
unset, wl-copy will try to guess the MIME-Type based on the data.
For some reason this did not work on my machine and i was unable
to paste passwords in Firefox.
2021-08-15 22:51:17 -04:00
Stuzer05
304cb44d0d Add group clone action
Close #3796
2021-08-08 16:54:10 -04:00
Chih-Hsuan Yen
bc5d0df19e Fix removing encrypted ASN.1 keys from ssh-agent (#6804)
Contents of id_rsa-encrypted-asn1 are from
TestOpenSSHKey::testDecryptRSAAES128CBC().

Closes #6788
2021-08-08 09:36:06 -04:00
osx user
0921bf2d61 Remove explicit fonts from SVG's
* Fix #6758 - prevent slow load times when font is not available
2021-08-01 18:37:46 -04:00
xaver
4af0c18f33 Add information to Autoopen (#6724)
* Add Information to Autoopen

* better wording

Co-authored-by: Jonathan White <support@dmapps.us>
2021-08-01 10:00:31 -04:00
Carlo Teubner
8753347f69 CHANGELOG.md: backfill recent releases (#6733)
Co-authored-by: Carlo Teubner <carlo@cteubner.net>
2021-07-31 06:14:19 -04:00
shemeshg
089c8df01d Add missing QFileInfo include 2021-07-16 16:19:33 +02:00
Jonathan White
9b2b861a2a Removed / Consolidated unnecessary header files 2021-07-13 22:08:33 -04:00
peter
6b14b5dc27 Optimize includes across code base 2021-07-13 22:08:33 -04:00
Jonathan White
f770edb6d3 Add gitignore for MSVC files 2021-07-08 15:54:41 -04:00
Jonathan White
724f691e15 Multiple fixes for MSI installer
* Fix #6242 - pinned taskbar shortcuts are not removed on upgrade or uninstall. Icons will be preserved between upgrades.

* Fix #6627 - properly set checkboxes for desktop shortcut and autostart of login based on current settings during install

* Add documentation shortcuts to the start menu
* Auto-accept license if upgrading application
2021-06-14 17:41:59 -04:00
Jonathan White
7cb2991a13 Trim TOTP key input of whitespace prior to processing
* Fixes #6599
2021-06-11 22:49:45 -04:00
Jonathan White
6a8b070b0a Resolve compiler warnings for unused return values
* Fixes #1932 - See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425#c29

Adding a negation before the function call allows the (void) syntax to work properly.
2021-06-11 22:49:39 -04:00
Jonathan White
a0912b057e Improve testdatabase performance 2021-06-11 08:27:20 -04:00
Janek Bevendorff
25a34a66e1 Fix compilation on macOS 2021-06-08 18:56:22 -04:00
Jonathan White
11afd73117 Correct macOS window activation from hidden state (#6575)
* Fix #6234 - properly set NSApplication activation policies when the window is hidden and shown
2021-06-01 06:19:47 -04:00
Jonathan White
33bf6eb892 Retain file creation time when saving database (#6576)
* Fix #6028
2021-05-31 22:22:50 -04:00
Xavier Valls
6acd0b25ae Add a context menu entry to delete entries from health check reports (#6537)
* Closes #4986 - Allow deleting entries from the reports view
* Closes #4533 - Exclude & delete multiple entries in a report
* Also allow deleting selected entries using the delete key
* Introduce GuiTools namespace to collect shared GUI prompts and actions
* Add functionality to HIBP report to mirror health check report

Co-authored-by: Jonathan White <support@dmapps.us>
2021-05-31 10:40:20 -04:00
Jonathan White
1f50ac6045 Update SSH Agent PuTTYGen instructions
* Fix #6378
2021-05-30 13:41:17 -04:00
Jonathan White
44954fc0ac Make "Always on top" a local setting 2021-05-29 12:49:23 -04:00
Jonathan White
3d9877a7c7 Fix read usage in release-tool
* Fixes #6562
2021-05-29 12:49:15 -04:00
Xavier Valls
64cb1553d0 Add a button to reveal protected attributes in entry preview
Closes #1930
2021-05-29 12:22:50 -04:00
Aetf
81a66c439c Properly block modified signal during Database destruction (#6438)
fixes #6393
2021-05-27 21:50:15 -04:00
Xavier Valls
66c3026cf5 Add a checkbox to health report allowing to exclude expired entries (#6534)
* Fixes #5032
2021-05-22 13:16:47 -04:00
Jonathan White
fd0bdaae80 Fix challenge-response key data after Botan
* Fix #6420
* Refactor Challenge-Response key files to be more streamlined. Added a test to confirm raw key data is accurate.
2021-05-19 22:36:30 -04:00
wundrweapon
60adcacaaa Add command line option to lock open databases (#6511)
Closes #6126
2021-05-15 09:48:59 -04:00
Lukas Rytz
cc6f5c3226 MinimizeAfterUnlock also when unlocking through browser
The MinimizeAfterUnlock setting added in #3439 closes the main window
after unlock. However, when the unlock is triggered through
KeePassXC-Browser, a password dialog is shown on top of the main window
and the main window remains open after the unlock. This is fixed
in this commit.
2021-05-15 09:45:26 -04:00
Jonathan White
8c61a73bb0 Show search bar when toolbar is hidden or overflow
* Fix #505 - always show the search bar when the search keyboard shortcut is pressed. If the toolbar is in overflow, the toolbar will be expanded automatically and search focused. If the toolbar is hidden it will be shown and expanded if necessary. When searching is canceled or the down arrow is pressed (to select the first entry) the toolbar will be set back to it's previous configuration.
2021-05-15 09:11:38 -04:00
Xavier Valls
e1c8304c4b Fix unreachable setting of file permissions (#6514)
Fixes #6080
2021-05-15 09:11:19 -04:00
Stefan Sundin
ee92b980bb Set permissions of saved attachments to be private to the current user (#6363) 2021-05-12 23:20:41 -04:00
Jonathan White
17326dc3ec Auto-Type: Resolve username/password when copying to clipboard
* Fix #3882
* Add nullptr checks as well
2021-05-12 23:15:49 -04:00
Jonathan White
3c2abaaa82 Remove obsolete cmake helper files
* Fixes #6490
2021-05-11 06:21:24 -04:00
Xavier Valls
64279bb881 Fix showing preview notes in an entry without notes
Fixes #6461
2021-05-08 17:35:37 -04:00
Jonathan White
8a7be101e4 CLI Improvements
* Fix #6001 - only use `--notes` in Add/Edit commands to prevent clash with password generator option `-n`.

* Fix #6119 - Send Unicode to clip command; Windows only understands UTF-16 encoding.

* Fix #6128 - `clip` command will default to clearing the clipboard after 10 seconds. To disable clearing set timeout to 0.
2021-04-25 07:38:21 -04:00
Jonathan White
be3e77d721 Cleanup CLI includes across all components
* Remove unused include files
* Move includes out of widely shared headers (reduced rebuild time)
* Consolidate code for Analyze command
2021-04-25 07:38:21 -04:00
Martin Mokrejs
dc496fd1d9 Better description text for Key File change dialog 2021-04-24 13:47:28 -04:00
Xavier Valls
01d86760e0 Allow resizing of reports table columns (#6435)
* Fix #5678

Co-authored-by: Jonathan White <support@dmapps.us>
2021-04-24 11:36:15 -04:00
Xavier Valls
7b7f52c8af Introduce security option to enable copy on doubleclick (#6433)
* Fix #1575 - option is disabled by default
2021-04-24 11:35:01 -04:00
Jonathan White
5c709f0da3 Auto-Type: Increase max inter-type delay to 500 ms 2021-04-24 09:31:46 -04:00
Jay Gates
9fee79ea96 Docs: example for how to search using attributes (#6410) 2021-04-24 09:30:59 -04:00
attero
91e74944f3 added pull.yml to automatically update forks 2021-04-19 08:07:25 -04:00
Xavier Valls
c0ae130656 Add CTRL+Enter to apply password generator changes (#6414)
* Fixes #6111
2021-04-18 22:37:12 -04:00
Xavier Valls
7fe0e2629c Allow the Group column to be toggled for entry view
This allows to show/hide the group column both in normal and search
mode, finding a compromise for issue #6163
2021-04-18 22:32:24 -04:00
Toni Spets
805574cac1 Update YubiKey stub implementation for Botan (#6370)
Co-authored-by: Jonathan White <support@dmapps.us>
2021-04-09 07:56:57 -04:00
Toni Spets
31aa5e12e5 Auto-Type: PageUp/PageDown scrolling for entries
Fixes #4530
2021-04-08 20:00:40 -04:00
Toni Spets
9b8feed3ed SSH Agent: Use database location to resolve relative key file path
Closes #5225
2021-04-06 23:39:02 -04:00
Jonathan White
ed0ece304d Reorder startup sequence to display debug information early 2021-04-05 22:56:03 -04:00
Jonathan White
80809ace67 Replace all crypto libraries with Botan
Selected the [Botan crypto library](https://github.com/randombit/botan) due to its feature list, maintainer support, availability across all deployment platforms, and ease of use. Also evaluated Crypto++ as a viable candidate, but the additional features of Botan (PKCS#11, TPM, etc) won out.

The random number generator received a backend upgrade. Botan prefers hardware-based RNG's and will provide one if available. This is transparent to KeePassXC and a significant improvement over gcrypt.

Replaced Argon2 library with built-in Botan implementation that supports i, d, and id. This requires Botan 2.11.0 or higher. Also simplified the parameter test across KDF's.

Aligned SymmetricCipher parameters with available modes. All encrypt and decrypt operations are done in-place instead of returning new objects. This allows use of secure vectors in the future with no additional overhead.

Took this opportunity to decouple KeeShare from SSH Agent. Removed leftover code from OpenSSHKey and consolidated the SSH Agent code into the same directory. Removed bcrypt and blowfish inserts since they are provided by Botan.

Additionally simplified KeeShare settings interface by removing raw certificate byte data from the user interface. KeeShare will be further refactored in a future PR.

NOTE: This PR breaks backwards compatibility with KeeShare certificates due to different RSA key storage with Botan. As a result, new "own" certificates will need to be generated and trust re-established.

Removed YKChallengeResponseKeyCLI in favor of just using the original implementation with signal/slots.

Removed TestRandom stub since it was just faking random numbers and not actually using the backend. TestRandomGenerator now uses the actual RNG.

Greatly simplified Secret Service plugin's use of crypto functions with Botan.
2021-04-05 22:56:03 -04:00
Jonathan White
86ddd702fb Use application font size when setting default or monospace fonts
* Fix #6286
2021-04-03 11:29:54 -04:00
Jonathan White
871c4fffdd OPVault: Use Text instead of Name for attribute and section names
* Fix #6303 - the text attribute in 1Password contains the actual text seen in 1Password whereas the name attribute may contain a ref pointer and not a name.
2021-04-01 22:59:44 -04:00
Toni Spets
ca8abecc4b Auto-Type: Abort keystroke if modifiers held on X11
Releasing lock modifiers during Auto Type does not work reliably
on X11 and can cause some modifiers to get stuck and more precisely
layout switching can get stuck.

Instead of trying to find out what modifiers to release we can just
abort when the user is holding modifiers that may affect the typing
sequence.

Fixes #6350
2021-04-01 22:58:33 -04:00
Toni Spets
371bd2e51b Auto-Type: Shortcuts for selection dialog (#6361)
* Shortcut to toggle search all entries
* Select first match only when we have a window match

When we default to full database search it's possible the user would select the first match without by accident.

In this case when our query is empty we don't select anything and you need to either type something or press down to select the first item.

* Added username, password, and TOTP keyboard shortcuts and a help tip

* Closes #6176

Co-authored-by: Jonathan White <support@dmapps.us>
2021-03-31 23:27:56 -04:00
Sami Vänttinen
c19efb5b19 Remove credential sorting from Browser Integration (#6353) 2021-03-31 23:14:29 -04:00
ByteHamster
439c155552 Show countdown for clipboard clearing (#6333)
* Closes #1843

Co-authored-by: Jonathan White <support@dmapps.us>
2021-03-31 23:12:59 -04:00
Toni Spets
8c9530e3ec Auto-Type: Allow actions to fail and be retried
AutoTypeActions are required to return a result object with
information if they can be retried or not. An error string is
also provided to show a user friendly message why said action did
not succeed if even after retries it keeps failing.

This is a prerequisite for waiting for modifier keys to be released
on X11.
2021-03-31 21:20:51 -04:00
Toni Spets
4d07507739 Auto-Type: Support multiple Xkb layouts
Completely rewritten XCB Auto-Type keymap system.

 - supports multiple simultaneous layouts
 - prefers current layout if it has all keysyms available
 - removed hardcoded KeySymMap
 - removed clunky custom KeySym emulation

Biggest breaking change is removing KeySym emulation for keys that
do not exist in any of the layouts currently in use. It would be
possible to make it work but if you are trying to type syms that
are not available in any of your layouts you are abusing it. It
also adds unnecessary complexity and opens up timing issues when
the keymap is modified on-the-fly. Now we are just reading it.

This also workarounds a Qt related issue where QX11Info::display()
returns a connection to X server that fails to receive updated
keymap data when client settings change. We use our own connection
now to get it working.
2021-03-26 06:16:37 -04:00
louib
2423bede60 Add matrix channel badges (#6294) 2021-03-16 22:11:45 -04:00
Guillaume Turchini
8b8fb9562f Allow CSV import of bare TOTP secrets
Fixes #6167
2021-03-08 21:53:51 -05:00
Chih-Hsuan Yen
e29cf8bfef Make KeePassXC start after the system tray is available on LXQt 2021-03-08 21:51:58 -05:00
mantlabs
d6b69204a6 Persist Always on Top setting 2021-03-07 11:27:28 -05:00
Jonathan White
bc08913c61 Auto-Type: Allow selection of modal dialogs on X11
* Fix #5958 - Modal dialogs do not have WM_STATE set even though they are a valid top-level window with a valid name. In this case, we need to poll for WM_TRANSIENT_FOR which returns the top level window the dialog is a child of.
2021-03-05 18:06:30 -05:00
Patrick Klein
57af7c131d Fix favicon download from URL with non-standard port.
Fixes #5001.

The favicon download URL was constructed from scheme and host only. This is fixed by simply replacing the path of the original URL with "/favicon.ico", thus keeping scheme, host, auth and port intact.

Further modification: URL's with a non-http schema are now rejected.
2021-03-01 21:42:19 -05:00
Jonathan White
6c7b04fee8 Revert zxcvbn changes from f3d88f 2021-03-01 20:57:08 -05:00
Bernhard Kirchen
4e8b00da34 Add custom icon purging and bulk deletion
This change adds a new database settings widget 
named "maintenance", using a wrench icon. This widget is designated to be the home for database related maintenance tasks. 

Initially, managing custom icons is now possible from that new tab. The feature includes bulk removing of
any number of selected custom icons and automatic purging of unused custom icons by the click of a button.

Fixes #2110
2021-02-27 08:13:05 -05:00
Jonathan White
b9ea6fd2e7 Show sort indicators on fixed width columns 2021-02-26 22:10:04 -05:00
Ojas Anand
022154462e Add entry view column for password strength
* Closes #4216

Reduced to three-tiered rating system and fixed column implementation. Hide password strength indicator in entry view if excluded from reports.

Introduce password health caching to prevent unnecessary calculations.
2021-02-26 22:10:04 -05:00
Bernhard
c9c19d043f KeeShare: Default to unsigned container unless specifically chosen
*Fix #6081 - Prevent assert and crash due to user entered data
2021-02-26 14:24:22 -05:00
Brandon Atkinson
c5a2aa0a2a Exclude additional lookalike characters (6G8B)
* Fix #6075
2021-02-25 21:36:30 -05:00
Jesse Ruth
2d66786656 Update MainWindow minimum size to enable smaller verticle space (#6149) 2021-02-24 23:11:33 -05:00
Jonathan White
3ccd4f9b14 Allow setting MSI properties in unattended install 2021-02-24 23:10:33 -05:00
Toni Spets
46f5596e59 Initialize Application before parser arguments (#6177)
Co-authored-by: Jonathan White <support@dmapps.us>
2021-02-24 23:10:13 -05:00
Jonathan White
c0d673b46f Merge pull request #5864 from keepassxreboot/feature/autotype-upgrade-part2 2021-02-22 19:05:07 -05:00
Jonathan White
8d058cbd04 Additional Auto-Type improvements based on PR feedback
* Improve documentation and remove external links to keepass.info documentation
2021-02-22 07:41:23 -05:00
Jonathan White
02446af743 Auto-Type support for T-CONV, T-REPLACE-RX, and Comments
* Close #1825 - Add full support for T-CONV and T-REPLACE-RX placeholders. Exception is support for the "raw" type in T-CONV.

* Close #5333 - Allow comment syntax to be present in the Auto-Type sequence
2021-02-22 07:41:23 -05:00
Jonathan White
813ab47e29 Implement Auto-Type {PICKCHARS}
* Closes #725

Support Auto-Type {PICKCHARS} placeholder. Open a dialog that lets you pick characters of an entry's password by their position. Supports typing {TAB} in between characters to move between fields (if necessary). Also supports using arrow keys to quickly navigate around the choice grid.
2021-02-22 07:41:23 -05:00
Jonathan White
027ff9f2bf Overhaul Auto-Type Action Handling
* Close #2603 - Add support for modifier syntax (+, ^, and %)
* Fix #2633 - Allow reference syntax {REF:...} in Auto-Type sequences
* Close #5334  - Tell the user which part of the Auto-Type sequence is invalid for easy correction
* Fix #2401 - Select the right window on macOS prior to starting Auto-Type

* Allow for nested placeholders
2021-02-21 16:33:54 -05:00
Jonathan White
d9ae449f04 Improve Auto-Type Select Dialog
Significant improvements to the Auto-Type select dialog. Reduce stale and unnecessary code paths.

* Close select dialog when databases are locked.
* Close open modal dialogs prior to showing the Auto-Type select dialog to prevent interference.
* Never perform Auto-Type on the KeePassXC window.
* Only filter match list based on Group, Title, and Username column data (ie, ignore sequence column)
* Always show the sequence column (revert feature)
* Show selection dialog if there are no matches to allow for a database search

* Close #3630 - Allow typing {USERNAME} and {PASSWORD} from selection dialog (right-click menu).
* Close #429 - Ability to search open databases for an entry from the Auto-Type selection dialog.
* Fix #5361 - Default size of selection dialog doesn't cut off matches
2021-02-21 16:33:54 -05:00
Jonathan White
7ce35f81de Cleanup entry level Auto-Type menu
* Show the sequence that will be typed when performing the default action
* Combine default sequence action with Username / Password options
* Fix #4939 - confirm prior to performing entry level auto-type if "Always Ask Before Auto-Type" is enabled
2021-02-21 16:33:54 -05:00
Jonathan White
f3d88fbd36 Address translation feedback from Transifex 2021-02-19 18:37:33 -05:00
Jonathan White
4f7460afbd Refactor Key Component Widgets for translations
* Ensure full labels are applied to buttons instead of splitting the Add/Change/Remove from the component name.
2021-02-19 18:37:33 -05:00
farnbacher
75e4329c80 use save method if new (and existing) created entry has unsaved
changes
2021-02-12 21:32:50 -05:00
Janek Bevendorff
af55d1b1b3 Use macdeployqt for all executables
Since Homebrew moved all its stuff to /opt/homebrew, our hard-coded
install_name_tool patch magic stopped working. This patch uses
macdeployqt for all executables to prevent this kind of behaviour.

Fixes #6042
2021-02-05 15:12:12 -05:00
smlu
a5094dd3ea Prevent screen capture on Windows and macOS
* Closes #5859
2021-02-05 15:10:54 -05:00
Aetf
9a8a5a0006 FdoSecrets: Major Refactor and Code Consolidation (#5747)
* Fixes #3837

* Change objects to use DBusMgr rather than separate adaptors
  - Update all DBus invokable methods to new parameter order
  - Change all usage of DBusReturn to simpler DBusResult
  - Use DBusMgr to handle path and service registration
  - Remove adaptor/*
  - Set path in DBusObject
  - Unregister service when service is destroyed
  - Restore handling of invalid QVariant in prompt complete signal
  - Clean up meta type registration
  - Move dbus related file together
  - Convert to QSharedPointer as much as possible
  - Fix mapping of the Delete method
  - Handle dbus property get all

* Add per-client states
  - Move cipher negotiation to DBusClient
  - Show list of clients instead of sessions in the settings page
  - Add settings for confirmation of accessing items
  - Fix infinite recursion when client disconnected
  - Use optional explicit DBusClient parameter instead. This makes accessing 
    the client info in an async context explicit, and thus prevent accidental 
    assertions in prompts.

* Improve User Interface
  - Add per-item access confirmation (if enabled)
  - Remove the "disable for site" button for the access control dialog
  - Improve the text on the settings page to be more consistent
  - Fix disconnect buttons in settings page not working
  - Make the unlock prompt method nonblocking

* Fix and cleanup unit tests
  - Use QTRY_COMPARE when checking signal spies, as dbus signals are threaded
  - Fixes in meta type registration and type conversion
  - Remove QStringLiteral in COMPARE macros, making diff output readable
  - Add testing for remembering auth decision
2021-02-05 15:07:59 -05:00
Janek Bevendorff
33e6da33ca Update deployment target to 10.13 2021-02-01 01:56:55 +01:00
Janek Bevendorff
1385929089 Fix *.so files not being signed resulting in notarization errors 2021-02-01 01:56:55 +01:00
Jonathan White
61b85183f9 Merge branch 'master' into develop 2021-01-31 17:04:38 -05:00
Janek Bevendorff
4e90cb5818 Fix on/off icons not being redrawn on theme change 2021-01-31 20:30:58 +01:00
Janek Bevendorff
b55f419386 Fix icon alpha blending in QTableView
Some widgets such as QTableView do not call QIconEngine::pixmap(), but do
the drawing immediately through QIconEngine::paint(). This breaks alpha
blending for recolouring, since the underlying image canvas is not
necessarily transparent and also not anchored at (0, 0). This results in
a black box of the size of the icon bounding box.

Icon recolouring is now always done on a temporary QImage with
transparent background and only the finished end result is composed onto
the original canvas.

Fixes #6006
2021-01-31 20:30:58 +01:00
smlu
c7323accf2 Fix adaptive icon painting 2021-01-31 12:50:32 +01:00
Janek Bevendorff
2e6c22d44d Prepare release-tool for Apple Silicon builds
Changes:

- Set correct target architecture when building on ARM64.
- Split signing and notarization into separate commands. This eases the
  workflow when notarization fails because changes to Apple's ToS have
  not yet been accepted on iTunes Connect.
- Sign all binaries and frameworks individually instead of using --deep.
  This is the correct way of signing apps and it avoids weird problems
  during signature verification.
- Fix signing of AppDirs, which was supposed to work, but never did.
2021-01-30 14:28:48 -05:00
Janek Bevendorff
3b30855855 Fix code formatting 2021-01-12 18:27:00 -05:00
Patrick Lenk
fff15d2d4d Set proper year for 2.6.3 in changelog 2021-01-12 18:27:00 -05:00
Janek Bevendorff
86278311d2 Merge branch 'master' into develop 2021-01-12 18:24:59 +01:00
Janek Bevendorff
beae1869a3 Release 2.6.3
Added

- Support Argon2id KDF [#5778]
- Support XMLv2 key files [#5798]

Changed

- Improve CSV Import/Export, include time fields and TOTP [#5346]
- Support empty area dragging of the application window [#5860]
- Display default Auto-Type sequence in preview pane [#5654]
- Remove strict length limit on generated passwords [#5748]
- Hide key file path by default when unlocking database [#5779]
- Document browser extension use with Edge in managed mode [#5692]
- Windows: Prevent clipboard history and cloud sync [#5853]
- macOS: Update the application icon to Big Sur styling [#5851]

Fixed

- Re-select previously selected entry on database unlock [#5559]
- Properly save special character choice in password generator [#5610]
- Fix crash in browser integration with multiple similar entries [#5653]
- Remove offset on username field in classic theme [#5788]
- Ensure entry history is copied when drag/dropping entries and groups [#5817]
- Close modal dialogs when database is locked [#5820]
- Prevent crash when KeeShare modifies an entry that is currently being edited [#5827]
- Improve preview of entry attributes [#5834]
- Always activate/focus database open dialog preventing mistype [#5878]
- Reports: fix calculation of average password length [#5862]
- Linux: Delay startup on login to correct tray icon issues [#5724]
2021-01-12 17:49:19 +01:00
Janek Bevendorff
835d51c59f Update translations 2021-01-12 17:49:13 +01:00
Jonathan White
38bf2ceb78 Version bump to 2.6.3 2021-01-12 17:47:01 +01:00
varjolintu
bbc71b3144 Show browser integration tab dynamically 2021-01-12 07:33:05 -05:00
Chih-Hsuan Yen
7078086b50 Fix autostart .desktop file
It had "Version=1.0true", which seems wrong
2021-01-11 11:26:54 -05:00
Janek Bevendorff
618c1166ce Backport macOS Big Sur icon 2021-01-07 22:02:43 -05:00
Janek Bevendorff
0a0b3a6b4f Implement empty-area drag.
Uses Qt 5.15's new QWindow::startSystemMove() to implement empty-area
drag, which allows the user to click and drag any empty area on the
menubar, toolbar, or tabbar to move the window around.
2021-01-07 22:02:43 -05:00
Janek Bevendorff
23ca46c918 Add support for version 2 XML key files.
As discussed in #4317, the next KeePass2 release will ship with
support for a new generation of XML key files which enable
hash integrity checks.

This patch adds support for reading and generating this new format.
By default, KeePass2 now uses the .keyx extension for generated
key files, which was added to KeePassXC's key generation file chooser
filter. We continue to generate hashed binary key files by default,
but the user can explicitly save the file with the new .keyx
extension to generate an XML v2 key file (currently undocumented).

When opening a database, the key file type is still determined
by content negotation, so the file extension has no impact here.

As an additional change, the legacy key file warnings have been
improved slightly to be less confusing and more helpful.
2021-01-07 22:02:43 -05:00
Janek Bevendorff
9a7b20cbfd Add dynamic theme switching on Windows 10 2021-01-07 15:22:48 +01:00
Janek Bevendorff
80c1b9be6a Improve macOS platform integration.
- Allow switching between themes without restart (except classic)
- Rework icon loading and recolouring logic to react to theme changes
- Automatically react to light/dark theme change
- Remove explicit selection of monochrome tray icon variant (selected
  automatically now)
- Update theme background colours for Big Sur
- Update application icon to match Big Sur HIG

The tray icon doesn't respond perfectly to theme changes yet on Big Sur,
since we need different icons for dark and light theme and cannot simply
let the OS recolour the icon for us (we do that, too, but only as an
additional fallback). At the moment, there is no signal to listen to
that would allow this.

This patch adds a few generic methods to OSUtils for detecting and
communicating theme changes, which are only stubs for Windows and Linux at
the moment and need to be implemented in future commits.

Fixes #4933
Fixes #5349
2021-01-07 15:22:48 +01:00
Janek Bevendorff
49d2b87889 Always activate DatabaseOpenDialog on Windows
Fixes #5390
2020-12-30 16:02:29 +01:00
Wolfram Rösler
66f5a8736a Statistics: Fix average password length
The average password length shown in the Statistics report
is now computed based on the total number of passwords.
Previously, it was erroneously computed based on the
number of unique passwords.

Fixes #5134.
2020-12-25 15:32:50 -05:00
Janek Bevendorff
37dab85df7 Implement empty-area drag.
Uses Qt 5.15's new QWindow::startSystemMove() to implement empty-area
drag, which allows the user to click and drag any empty area on the
menubar, toolbar, or tabbar to move the window around.
2020-12-25 13:42:12 -05:00
Jonathan White
14b01784ec Patron Names and Debug Info
* Fix patron name and add new VIP
* Add dash in front of libgcrypt in debug info
2020-12-21 09:38:58 -05:00
Jonathan White
a74e2391e8 Copy history when drag/drop entries and groups
* Fix #5809
2020-12-20 22:57:42 -05:00
Jonathan White
4b5248ee98 Prevent clipboard history and cloud sync on Windows
* Fix #2358
2020-12-20 21:59:32 -05:00
Jonathan White
60c2d89cb0 Prevent crash when KeeShare merges an entry that is in edit mode
* Hack for #5722 until a refactor of KeeShare, Merger, and EditEntryWidget can be performed. This hack should only ever be triggered on the rare occurrence of two people editing the same entry at the same time.  The end result is potential data loss, but the current result is a hard crash. Unfortunately the way everything is interfaced currently doesn't afford any solution without a major refactor.

* Additionally add a short delay before actually reloading a share to prevent read/write locks from preventing proper import. This delay also prevents conflicting saves between the main database and the KeeShare database. This should eventually be moved into the FileObserver itself to smooth out all merge operations once the above refactor occurs.

Side note: KeeShare operates independently of DatabaseWidget causing unexpected behavior when files are updated/merged/etc. This needs to be corrected in a refactor.
2020-12-20 13:05:08 -05:00
Jonathan White
f9b2cf8484 Remove offset on username field in classic theme
* Fix #5601

Fix padding offset in editable QComboBox

Accepted
2020-12-20 13:03:19 -05:00
Bernhard
260c84ccf0 Fix reSelect entry & group on loadDb 2020-12-20 09:12:59 -05:00
Michel D'HOOGE
e8dfa9cfa1 Fix display issues of entry attributes in preview pane
* Fix #5755 - HTML escape attributes prior to preview
* Place attribute preview into a table and convert line breaks
2020-12-19 13:00:43 -05:00
Janek Bevendorff
cd0084f21c Add support for version 2 XML key files.
As discussed in #4317, the next KeePass2 release will ship with
support for a new generation of XML key files which enable
hash integrity checks.

This patch adds support for reading and generating this new format.
By default, KeePass2 now uses the .keyx extension for generated
key files, which was added to KeePassXC's key generation file chooser
filter. We continue to generate hashed binary key files by default,
but the user can explicitly save the file with the new .keyx
extension to generate an XML v2 key file (currently undocumented).

When opening a database, the key file type is still determined
by content negotation, so the file extension has no impact here.

As an additional change, the legacy key file warnings have been
improved slightly to be less confusing and more helpful.
2020-12-19 09:42:21 -05:00
Jonathan White
404fd941e8 Move global shortcut handling into OSUtils (#5566)
Move global shortcut handling into OSUtils
2020-12-13 23:23:25 -05:00
krsnik93
2ee4168956 Display default autotype sequence on entry preview pane
* Fix #5450
2020-12-13 11:33:03 -05:00
Jonathan White
f0204dbb10 Fix closing modal dialogs on database lock
* Fixes #5719, Fixes #5744
2020-12-12 12:31:43 -05:00
Bernhard Berg
a6f01349e8 Redo 'delete entries no confirm' functionality & unit-tests (#5812)
* Fixes #5232
2020-12-12 12:14:18 -05:00
Janek Bevendorff
c9d1512748 Revert "Add "move to recycle bin without confirmation" setting"
This reverts commit de44764efa.
2020-12-11 13:11:42 +01:00
Bernhard Berg
de44764efa Add "move to recycle bin without confirmation" setting 2020-12-11 00:15:24 -05:00
Bernhard
c9e7ffadad Fix reSelect entry & group on loadDb 2020-12-11 00:11:18 -05:00
Carlo Teubner
5ea46d4c12 CODE-OF-CONDUCT.md: fix typo 2020-12-10 12:47:41 +01:00
Jonathan White
3b29f20d60 Hide actions when features are disabled
* Fix #5794 - Don't show "Download All Favicons" in group menu
* Don't show offline documentation links if built documentation is disabled
2020-12-10 00:02:09 -05:00
tWido
59bd238ae1 Hide keyfile path by default
Fixes #5576
2020-12-09 18:28:01 -05:00
Jonathan White
a273deae12 Add delay to login startup on Linux
* Fix #5691 - add a 2 second delay to startup on Gnome to allow for tray initialization and Auto-Type shortcut registration. On KDE, start after the panel is started.
2020-12-07 22:23:43 -05:00
Jonathan White
2fe9ea3f41 Document support for managed Microsoft Edge
Add documentation for system administrators to setup support for KeePassXC extension in a managed Microsoft Edge.
2020-12-06 11:16:49 -05:00
Jonathan White
30989e35bf Use strict check for std::sort to prevent recursion
* Fixes #5596
2020-12-06 11:16:49 -05:00
Jonathan White
7ac651763c Improve CSV export and import capability
* Fixes #3541
* CSV export now includes TOTP settings, Entry Icon (database icon number only), Modified Time, and Created Time.
* CSV import properly understands time in ISO 8601 format and Unix Timestamp.
* CSV import will set the TOTP settings and entry icon based on the chosen column.
2020-12-06 11:16:49 -05:00
Janek Bevendorff
748a6b5ce1 Add code of conduct 2020-12-06 14:01:08 +01:00
Janek Bevendorff
3f7e79cdf3 Add Argon2id KDF (backport of #5726) 2020-12-04 15:11:28 +01:00
Aetf
30c2e39e70 Fix QTimer cannot be stopped from another thread warning 2020-12-03 22:20:25 -05:00
Jonathan White
9cb36abe91 Properly save Password Generator settings
* Fix #5605
2020-12-03 20:04:28 -05:00
Bodo Graumann
1dd99559bb Remove length limit on password
Software should make the user free, not restrict him.
2020-12-03 19:58:06 -05:00
Janek Bevendorff
9a96124040 Add Argon2id KDF 2020-12-03 20:06:58 +01:00
Janek Bevendorff
c6bd22aa12 Attach console in debug mode on Windows 2020-11-21 09:41:55 +01:00
Aetf
3d10f31211 Merge pull request #5660 from Aetf/fix/fdosecrets-5279
Secret Service: cleanup and fix crash
2020-11-15 22:34:14 -05:00
Aetf
9f4118974d FdoSecrets: fix signal connections 2020-11-13 17:20:45 -05:00
Aetf
7f85eb77aa FdoSecrets: code formatting 2020-11-13 17:16:22 -05:00
Aetf
a651d7049d FdoSecrets: handle corner cases in collection dbus names, fix #5279
- Use completeBaseName rather than baseName to ensure nonempty name
- Handle two databases have the same name
- Cleanup Service::onDatabaseTabOpened logic
2020-11-13 17:16:22 -05:00
Aetf
804a3b6706 FdoSecrets: simplify collection internal states
This gets rid of the m_registered state, so whenever there is a valid m_backend, it is guaranteed to be registered already.

While at it, this commit also improves DBusObject::registerWithPath a little bit by allowing properly registering multiple paths using the same adaptor, mostly for supporting Collection aliases.

Now when DBus registration fails, the code does not go into an inconsistent state or crash.
2020-11-13 17:16:22 -05:00
Aetf
f5caf3968f FdoSecrets: fix typos 2020-11-13 17:16:22 -05:00
Aetf
000e1823ac FdoSecrets: refactor DBus registration error handling 2020-11-13 17:16:22 -05:00
Jonathan White
f8f2271f33 Document support for managed Microsoft Edge
Add documentation for system administrators to setup support for KeePassXC extension in a managed Microsoft Edge.
2020-11-12 06:23:36 -05:00
Jonathan White
15dc6f062e Ignore format changes for new clang-format version 2020-11-11 17:58:40 -05:00
Jonathan White
91dea9cbc4 Use strict check for std::sort to prevent recursion
* Fixes #5596
2020-11-01 13:28:59 -05:00
Jonathan White
fb8423fdca Bump version to 2.7.0 2020-10-25 09:44:28 -04:00
Janek Bevendorff
cd519e1bf3 Merge branch 'master' into develop 2020-10-21 22:49:02 +02:00
Jonathan White
eb6f0eb346 Add search 'by-path' url for browser 2020-10-17 18:22:47 -04:00
Jonathan White
0c5dd1556a Merge branch 'release/2.6.2' into develop 2020-10-15 00:13:14 -04:00
Bernhard Berg
fd3cc7e8c3 Add keyfile option to keepassxc cli import cmd (#5402)
Fixes #5311

Added the keyFile logic from the create command to the import command and moved the loadFileKey() function
to the Utils class since it is now used in both create & import classes.
2020-10-09 20:31:29 -04:00
Christof Klaus
bf2cad28af Add feature to ignore entries for HTTP-Auth Logins 2020-10-08 22:53:04 -04:00
Carlos E. Salazar
fa546c440e Feature/toggle groups panel option (#5247)
* Closes #5243
2020-10-08 22:52:30 -04:00
Wolfram Rösler
34b44e7496 Add fuzz test support
Describe how to invoke the AFL fuzz tester on the KeePassXC
CLI tool. As suggested in #2729.

Fuzz test build of keepassxc-cli takes database password from
environment variable instead of requiring it to be empty.
Provide two empty kdbx files as initial fuzzer input, one
kdbx 3 and one kdbx 4, both with minimal number of decryption
rounds to speed up the test.
2020-10-08 22:49:34 -04:00
louib
48d9fb3e79 Remove GUI bootstraping from core/ (#5513) 2020-10-08 22:48:45 -04:00
Jonathan White
fb87b1c794 Merge branch 'release/2.6.2' into develop 2020-10-07 11:27:14 -04:00
louib
af4ecb4aa1 Move icon handling from Resources to gui/Icons (#5506) 2020-10-05 20:41:00 -04:00
louib
ba8611cf4c Moving IconDownloader to gui/ 2020-10-04 23:45:25 -04:00
louib
9bffe05020 Moving all OS utils to gui/osutils
The classes used for screen lock detection use QWidget and are only ever used by the GUI,
so moving them there so we can eventually build core/ without Qt5::Widgets.
2020-10-04 23:44:45 -04:00
Shun Sakai
8f84675874 Improve CMakeLists.txt and docs/CMakeLists.txt 2020-10-04 09:10:18 -04:00
Wolfram Rösler
2e7a44de61 Describe HTML export/paper backups in the user manual (#5276) 2020-10-03 16:35:40 -04:00
Jonathan White
7426693f1d CLI: Add support for okon in offline HIBP checks
* Closes #5447
* Add option `--okon <okon-cli path>` to trigger the use of the okon cli tool to process a database's entries. When using this option the `-H, --hibp` option must point to a post-processed okon file instead of the standard HIBP text file.
* Updated documentation
2020-09-27 15:23:03 -04:00
Jonathan White
e1c2537084 Merge branch 'release/2.6.2' into develop 2020-09-27 12:11:02 -04:00
Bernhard Berg
ac5c1af829 Add display number of characters in passphrases (#5449)
Co-authored-by: Jonathan White <support@dmapps.us>
2020-09-21 21:32:49 -04:00
Jonathan White
d3747f40e2 Fix code format 2020-09-21 21:32:02 -04:00
david
55eb855267 Add a -n (--notes) option to keepassxc-cli add and edit commands 2020-09-21 16:04:32 -04:00
Stefan Sundin
8a4a804c8c Use Alt+Tab on macOS to switch between databases (#5407) 2020-09-15 09:43:35 -04:00
piegames
6a35bbea2f Add browser service search for entries via UUID 2020-09-02 23:19:43 -04:00
Jonathan White
f947c96462 Improve CSV export and import capability
* Fixes #3541
* CSV export now includes TOTP settings, Entry Icon (database icon number only), Modified Time, and Created Time.
* CSV import properly understands time in ISO 8601 format and Unix Timestamp.
* CSV import will set the TOTP settings and entry icon based on the chosen column.
2020-09-01 07:57:31 -04:00
Laurent Erignoux
f49f62d3be Add a best option to CLI command clip (#4489)
The best option copy the password from the best match if only one matching entry exists.

Adding clip best option documentation

Adding unit tests on the new clip --best option
2020-08-31 23:06:27 -04:00
fpohtmeh
bbdfbe64da Add ability to rename attachments
* Closes #4758
2020-08-31 23:06:10 -04:00
Shun Sakai
e53850627f Various minor improvements for man page (#5360) 2020-08-31 20:18:53 -04:00
Wolfram Rösler
6b96806914 HTML Export: Don't waste horizontal space
The previous version left a lot of white space to the
right of the table, meaning that more pages needed to
be printed for a paper backup. The table has been
reorganized. HTML Backup for the demo.kdbx database
is now down from 6 to 3 pages.
2020-08-31 20:17:30 -04:00
clonejo
656e6d289a Don't ask when removing an empty URL
There is no harm to deleting an empty URL from the browser integration
URL list when the user never set a value. It's a bit annoying, actually.
2020-08-31 20:16:33 -04:00
Bernhard
745f1befe9 Allow hiding expired entries from Auto-Type
* Add setting to hide expired entries from Auto-Type
* Expired entries will not be shown in selection dialogs or be auto-picked for use
* Fixes #1855
2020-08-30 08:06:22 -04:00
Janek Bevendorff
5c2a1a4284 Merge branch 'master' into develop 2020-08-19 23:59:26 +02:00
Jonathan White
71b05dbcf4 Merge branch 'release/2.6.1' into develop 2020-07-22 12:10:05 -04:00
alcroito
ff9dd43262 Skip referenced passwords in Health check report
Fixes #5036
2020-07-18 09:16:43 -04:00
Jonathan White
88a0a8d35a Merge branch 'release/2.6.1' into develop 2020-07-12 20:51:37 -04:00
Janek Bevendorff
b6787d91a3 Update changelog 2020-07-07 20:18:50 +02:00
Jonathan White
c03a734ebb Merge branch 'master' into develop 2020-07-06 21:32:20 -04:00
Jonathan White
6e99bb178d Merge branch 'release/2.6.0' into develop 2020-07-06 18:48:14 -04:00
874 changed files with 240683 additions and 29618 deletions

View File

@@ -19,7 +19,7 @@ AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: false AlwaysBreakTemplateDeclarations: false
BinPackArguments: false BinPackArguments: false
BinPackParameters: false BinPackParameters: false
BraceWrapping: BraceWrapping:
AfterClass: true AfterClass: true
AfterFunction: true AfterFunction: true
AfterControlStatement: false AfterControlStatement: false
@@ -44,7 +44,7 @@ DerivePointerAlignment: false
DisableFormat: false DisableFormat: false
ExperimentalAutoDetectBinPacking: false ExperimentalAutoDetectBinPacking: false
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
IncludeCategories: IncludeCategories:
- Regex: '^"(llvm|llvm-c|clang|clang-c)/' - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
Priority: 2 Priority: 2
- Regex: '^(<|"(gtest|isl|json)/)' - Regex: '^(<|"(gtest|isl|json)/)'
@@ -85,4 +85,3 @@ Standard: Cpp11
TabWidth: 4 TabWidth: 4
UseTab: Never UseTab: Never
... ...

6
.gitattributes vendored
View File

@@ -11,3 +11,9 @@ AppImage-Recipe.sh export-ignore
# github-linguist language hints # github-linguist language hints
*.h linguist-language=C++ *.h linguist-language=C++
*.cpp linguist-language=C++ *.cpp linguist-language=C++
# binary files
*.ai binary
# Line endings harmony
* text=auto

View File

@@ -63,7 +63,7 @@ Before submitting a bug report, check if the problem has already been reported.
### Discuss with the team ### Discuss with the team
As with feature requests, you can talk to the KeePassXC team about bugs, new features, other issues and pull requests on the dedicated issue tracker, or in the IRC channel on Freenode (`#keepassxc-dev` on `irc.freenode.net`, or use a [webchat link](https://webchat.freenode.net/?channels=%23keepassxc-dev)). As with feature requests, you can talk to the KeePassXC team about bugs, new features, other issues and pull requests on the dedicated issue tracker, on the [Matrix development channel](https://matrix.to/#/!RhJPJPGwQIFVQeXqZa:matrix.org?via=matrix.org), or in the IRC channel on Libera.Chat (`#keepassxc-dev` on `irc.libera.chat`, or use a [webchat link](https://web.libera.chat/#keepassxc-dev)).
### Your first code contribution ### Your first code contribution

12
.github/pull.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
# doc: https://github.com/wei/pull#basic-setup
# manual trigger: https://pull.git.ci/process/${fork-user}/keepassxc
# pull from: https://github.com/keepassxreboot/keepassxc
version: "1"
rules:
- base: master
upstream: keepassxreboot:master
mergeMethod: hardreset
- base: develop
upstream: keepassxreboot:develop
mergeMethod: rebase

5
.gitignore vendored
View File

@@ -21,3 +21,8 @@ desktop.ini
/*.snap /*.snap
/*_source.tar.bz2 /*_source.tar.bz2
# MSVC Files
CMakeSettings.json
CMakePresets.json
.vs/
out/

View File

@@ -1,8 +1,14 @@
[main] [main]
host = https://www.transifex.com host = https://www.transifex.com
[keepassxc.keepassxc] [keepassxc.share-translations-keepassxc-en-ts--develop]
source_file = share/translations/keepassx_en.ts source_file = share/translations/keepassxc_en.ts
file_filter = share/translations/keepassx_<lang>.ts file_filter = share/translations/keepassxc_<lang>.ts
source_lang = en
type = QT
[keepassxc.share-translations-keepassxc-en-ts--master]
source_file = share/translations/keepassxc_en.ts
file_filter = share/translations/keepassxc_<lang>.ts
source_lang = en source_lang = en
type = QT type = QT

View File

@@ -1,5 +1,189 @@
# Changelog # Changelog
## Release 2.7.0 (2022-02-26)
### Major Additions
- Implement KDBX 4.1 [#7114]
- Add direct write save option for cloud storage and GVFS [#6594]
- Prevent screen capture on Windows and macOS [#6030]
- Support quick unlock using Windows Hello [#7384]
- Support quick unlock using Apple Watch [#5526]
- Allow specifying database backup paths [#7035]
- Add tag functionality [#6487][#7436][#7446]
- Add password rating column to entry view [#4797]
- Add group clone action [#6124]
- Show modifications between entry history items [#6789]
- Ability to bulk-delete and purge unused custom icons [#5970]
- Support adding custom passphrase wordlists [#6799]
- Support passphrase wordlists in numbered and PGP-signed formats [#6791]
- Implement support for hardware keys via wireless NFC [#6895]
- SSH Agent: Add support for OpenSSH 8.2 FIDO/U2F keys [#6371]
- CLI: Implement attachment handling [#5538]
- CLI: Add support for okon in offline HIBP checks [#5478]
- CLI: Implement `search` command and remove `locate` [#6805]
- CLI: Add db statistic output to `db-info` command [#7032]
- CLI: Add -i/--include option to `generate` command. [#7112]
- CLI: Add a -n (--notes) option to `add` and `edit` commands [#4646]
- CLI: Add keyfile option to `import` command [#5402]
- CLI: Adding a best option to clip to copy a password of the best match [#4489]
- Browser: Add Microsoft Edge support on Linux [#7100]
- Browser: Support native password generator from the extension [#6529]
- Browser: Add group settings [#4180]
- Browser: Add feature to ignore entries for HTTP-Auth Logins [#5394]
- Browser: Support triggering Auto-Type from browser extension [#6272]
- Browser: Add delete-entry command to API [#6899]
- Browser: Add search 'by-path' url to API [#5535]
- Browser: search for entries by UUID to API [#4763]
- Browser: Support auto-download of favicon on entry addition [#7179]
- Auto-Type: Major improvements to Auto-Type [#5864][#7463][#7435][#7391][#7129][#6400][#6364][#6361][#5283]
- Auto-Type: Fix typing to virtual machines on Windows [#7366]
- Auto-Type: Re-implement X11 keysym emulation [#7098]
- Auto-Type: Support multiple Xkb layouts [#6247]
- Auto-Type: Abort keystroke if modifiers held on X11 [#6351][#6357]
- Auto-Type: Add TOTP option to entry level Auto-Type menu [#6675]
- FdoSecrets: Major Refactor and Code Consolidation [#5747][#5660][#7043][#6915]
- FdoSecrets: Implement unlock before search [#6943]
- Reports: Add browser statistics report [#7197]
### Major Changes
- Port crypto backend to [Botan](https://github.com/randombit/botan) [#6209]
- Improve attachment handling and security [#6606][#5034][#7083]
- Allow selecting any open database in unlock dialog [#5427]
- KeeShare: Remove checking signed container and QuaZip dependency [#7223]
- Introduce security option to enable copy on double click (default off) [#6433]
- Add 'delete entry without confirm' functionality [#5812]
- Improve macOS and Windows platform integration [#5851]
- Lock only the current database by default [#6652]
- Show expired entries on DB unlock [#7290]
### Other Changes and Fixes
- Add countdown progress bar to TOTP preview [#6930]
- Enter favicon url directly on icons page [#6614]
- Set C++17 as standard in the build system [#7180]
- Internalize ykcore into code base [#6654]
- Transition to Visual Studio builds on Windows [#5874]
- Ability to delete entries from health check reports [#6537]
- Enhance remembering last-used directories [#6711]
- Implement org.freedesktop.appearance.color-scheme support on Linux [#7422]
- Support sorting HTML export [#7011]
- Add display number of characters in passphrases [#5449]
- Use Alt+Tab on macOS to switch between databases [#5407]
- Add feature to sort groups using shortcut keys [#6999]
- Add CTRL+Enter to apply password generator changes [#6414]
- Display `Database created` timestamp on statistics report [#6876]
- Browser: Improve best matching credentials setting [#6893]
- SSH Agent: Use both Pageant and OpenSSH agent simultaneously on Windows [#6288]
- SSH Agent: Allow using database path to resolve keys [#6365]
- SSH Agent: Show correct error messages in main window [#7166]
- Multiple fixes for MSI installer [#6630]
- Fix tab order for CSV import dialog to match screen order [#7315]
- Don't mark kdbx:// urls as invalid [#7221]
- Make selected text copyable instead of copying password [#7209]
- Detect timestamp resolution for CSV files [#7196]
- Fix crash while downloading favicon [#7104]
- Correct naming of newly generated keyx files [#7010]
- Place the 'Recycle Bin' at the bottom of the list when groups are sorted [#7004]
- Handle tilde with custom browser paths [#6659]
- Don't scroll up when deleting an entry [#6833]
- Set the MIME-Type to text/plain when using wl-copy on wayland [#6832]
- Fix adaptive icon painting [#5989][#6033]
- Fix favicon download from URL with non-standard port [#5509]
- Ignore recycle bin on KeePassHTTP migration [#5481]
## 2.6.6 (2021-06-12)
### Fixed
- Fix focusing search when pressing hotkey [#6603]
- Trim whitespace from TOTP key input prior to processing [#6604]
- Fix building on macOS [#6598]
- Resolve compiler warnings for unused return values [#6607]
## 2.6.5 (2021-06-08)
### Added
- Show search bar when toolbar is hidden or in overflow [#6279]
- Show countdown for clipboard clearing in status bar [#6333]
- Command line option to lock all open databases [#6511]
- Allow CSV import of bare TOTP secrets [#6211]
- Retain file creation time when saving database [#6576]
- Set permissions of saved attachments to be private to the current user [#6363]
- OPVault: Use Text instead of Name for attribute names [#6334]
### Changed
- Reports: Allow resizing of reports columns [#6435]
- Reports: Toggle showing expired entries [#6534]
- Save Always on Top setting [#6236]
- Password generator can exclude additional lookalike characters (6/G, 8/B) [#6196]
### Fixed
- Allow setting MSI properties in unattended install [#6196]
- Update MainWindow minimum size to enable smaller verticle space [#6196]
- Use application font size when setting default or monospace fonts [#6332]
- Fix notes not clearing in entry preview panel in some cases [#6481]
- macOS: Correct window activation when restoring from tray [#6575]
- macOS: Better handling of minimize after unlock when using browser integration [#6338]
- Linux: Start after the system tray is available on LXQt [#6216]
- Linux: Allow selection of modal dialogs on X11 in Auto-Type [#6204]
- KeeShare: prevent crash when file extension is missing [#6174]
## 2.6.4 (2021-01-31)
### Added
- Automatically adapt to light/dark system theme changes (Windows/macOS only) [#6034]
### Changed
- Show window title as tooltip on system tray [#5948]
- Compress Snap release as LZO for faster initial startup [#5877]
- Password generator: Set maximum selectable password length to 999 [#5937]
### Fixed
- Fix crash on app close when using SSH agent [#5935]
- Fix KDF selection showing wrong item when using Argon2id [#5923]
- Automatically close About dialog on database lock if it is still open [#5947]
- Linux: Fix automatic launch at system startup with AppImages [#5901]
- Linux: Fix click-to-move on empty area activating when using menus [#5971]
- Linux: Try multiple times to show tray icon if tray is not ready yet [#5948]
- macOS: Fix KeePassXC blocking clean shutdown [#6002]
## 2.6.3 (2021-01-12)
### Added
- Support Argon2id KDF [#5778]
- Support XMLv2 key files [#5798]
### Changed
- Improve CSV Import/Export, include time fields and TOTP [#5346]
- Support empty area dragging of the application window [#5860]
- Display default Auto-Type sequence in preview pane [#5654]
- Remove strict length limit on generated passwords [#5748]
- Hide key file path by default when unlocking database [#5779]
- Document browser extension use with Edge in managed mode [#5692]
- Windows: Prevent clipboard history and cloud sync [#5853]
- macOS: Update the application icon to Big Sur styling [#5851]
### Fixed
- Re-select previously selected entry on database unlock [#5559]
- Properly save special character choice in password generator [#5610]
- Fix crash in browser integration with multiple similar entries [#5653]
- Remove offset on username field in classic theme [#5788]
- Ensure entry history is copied when drag/dropping entries and groups [#5817]
- Close modal dialogs when database is locked [#5820]
- Prevent crash when KeeShare modifies an entry that is currently being edited [#5827]
- Improve preview of entry attributes [#5834]
- Always activate/focus database open dialog preventing mistype [#5878]
- Reports: fix calculation of average password length [#5862]
- Linux: Delay startup on login to correct tray icon issues [#5724]
## 2.6.2 (2020-10-21) ## 2.6.2 (2020-10-21)
### Added ### Added
@@ -169,7 +353,7 @@
- Return keyboard focus after saving database edits [#4287] - Return keyboard focus after saving database edits [#4287]
- Windows: Use bare minimum settings in portable version [#4131] - Windows: Use bare minimum settings in portable version [#4131]
- Windows: Use SHA256 code signing [#4129] - Windows: Use SHA256 code signing [#4129]
- macOS: Fix code signing incompatibility in latest macOS release [#4564] - macOS: Fix code signing incompatibility in latest macOS release [#4564]
## 2.5.3 (2020-01-19) ## 2.5.3 (2020-01-19)
@@ -301,8 +485,8 @@
- Redesign database unlock dialog [ #3287] - Redesign database unlock dialog [ #3287]
- Rework the entry preview panel [ #3306] - Rework the entry preview panel [ #3306]
- Move notes to General tab on Group Preview Panel [#3336] - Move notes to General tab on Group Preview Panel [#3336]
- Enable entry actions when editing an entry and cleanup entry context menu [#3641] - Enable entry actions when editing an entry and cleanup entry context menu [#3641]
- Improve detection of external database changes [#2389] - Improve detection of external database changes [#2389]
- Warn if user is trying to use a KDBX file as a key file [#3625] - Warn if user is trying to use a KDBX file as a key file [#3625]
- Add option to disable KeePassHTTP settings migrations prompt [#3349, #3344] - Add option to disable KeePassHTTP settings migrations prompt [#3349, #3344]
- Re-enabled Wayland support (no Auto-Type yet) [#3520, #3341] - Re-enabled Wayland support (no Auto-Type yet) [#3520, #3341]

View File

@@ -24,6 +24,9 @@ if(NOT CMAKE_BUILD_TYPE)
FORCE) FORCE)
endif() endif()
string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER) string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
if(CMAKE_BUILD_TYPE_LOWER STREQUAL "debug" OR CMAKE_BUILD_TYPE_LOWER STREQUAL "relwithdebinfo")
set(IS_DEBUG_BUILD TRUE)
endif()
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
@@ -50,25 +53,21 @@ option(WITH_XC_NETWORKING "Include networking code (e.g. for downloading website
option(WITH_XC_BROWSER "Include browser integration with keepassxc-browser." OFF) option(WITH_XC_BROWSER "Include browser integration with keepassxc-browser." OFF)
option(WITH_XC_YUBIKEY "Include YubiKey support." OFF) option(WITH_XC_YUBIKEY "Include YubiKey support." OFF)
option(WITH_XC_SSHAGENT "Include SSH agent support." OFF) option(WITH_XC_SSHAGENT "Include SSH agent support." OFF)
option(WITH_XC_KEESHARE "Sharing integration with KeeShare (requires quazip5 for secure containers)" OFF) option(WITH_XC_KEESHARE "Sharing integration with KeeShare" OFF)
option(WITH_XC_UPDATECHECK "Include automatic update checks; disable for controlled distributions" ON) option(WITH_XC_UPDATECHECK "Include automatic update checks; disable for controlled distributions" ON)
if(UNIX AND NOT APPLE) if(UNIX AND NOT APPLE)
option(WITH_XC_FDOSECRETS "Implement freedesktop.org Secret Storage Spec server side API." OFF) option(WITH_XC_FDOSECRETS "Implement freedesktop.org Secret Storage Spec server side API." OFF)
endif() endif()
if(APPLE)
option(WITH_XC_TOUCHID "Include TouchID support for macOS." OFF)
endif()
option(WITH_XC_DOCS "Enable building of documentation" ON) option(WITH_XC_DOCS "Enable building of documentation" ON)
if(WITH_CCACHE) if(WITH_CCACHE)
# Use the Compiler Cache (ccache) program # Use the Compiler Cache (ccache) program
# (install with: sudo apt get ccache) # (install with: sudo apt get ccache)
find_program(CCACHE_FOUND ccache) find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND) if(NOT CCACHE_FOUND)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_FOUND})
else()
message(FATAL_ERROR "ccache requested but cannot be found.") message(FATAL_ERROR "ccache requested but cannot be found.")
endif() endif()
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_FOUND})
endif() endif()
if(WITH_XC_ALL) if(WITH_XC_ALL)
@@ -79,20 +78,11 @@ if(WITH_XC_ALL)
set(WITH_XC_YUBIKEY ON) set(WITH_XC_YUBIKEY ON)
set(WITH_XC_SSHAGENT ON) set(WITH_XC_SSHAGENT ON)
set(WITH_XC_KEESHARE ON) set(WITH_XC_KEESHARE ON)
if(APPLE)
set(WITH_XC_TOUCHID ON)
endif()
if(UNIX AND NOT APPLE) if(UNIX AND NOT APPLE)
set(WITH_XC_FDOSECRETS ON) set(WITH_XC_FDOSECRETS ON)
endif() endif()
endif() endif()
if(WITH_XC_SSHAGENT OR WITH_XC_KEESHARE)
set(WITH_XC_CRYPTO_SSH ON)
else()
set(WITH_XC_CRYPTO_SSH OFF)
endif()
# Prefer WITH_XC_NETWORKING setting over WITH_XC_UPDATECHECK # Prefer WITH_XC_NETWORKING setting over WITH_XC_UPDATECHECK
if(NOT WITH_XC_NETWORKING AND WITH_XC_UPDATECHECK) if(NOT WITH_XC_NETWORKING AND WITH_XC_UPDATECHECK)
message(STATUS "Disabling WITH_XC_UPDATECHECK because WITH_XC_NETWORKING is disabled") message(STATUS "Disabling WITH_XC_UPDATECHECK because WITH_XC_NETWORKING is disabled")
@@ -100,8 +90,8 @@ if(NOT WITH_XC_NETWORKING AND WITH_XC_UPDATECHECK)
endif() endif()
set(KEEPASSXC_VERSION_MAJOR "2") set(KEEPASSXC_VERSION_MAJOR "2")
set(KEEPASSXC_VERSION_MINOR "6") set(KEEPASSXC_VERSION_MINOR "7")
set(KEEPASSXC_VERSION_PATCH "2") set(KEEPASSXC_VERSION_PATCH "0")
set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION_MAJOR}.${KEEPASSXC_VERSION_MINOR}.${KEEPASSXC_VERSION_PATCH}") set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION_MAJOR}.${KEEPASSXC_VERSION_MINOR}.${KEEPASSXC_VERSION_PATCH}")
set(OVERRIDE_VERSION "" CACHE STRING "Override the KeePassXC Version for Snapshot builds") set(OVERRIDE_VERSION "" CACHE STRING "Override the KeePassXC Version for Snapshot builds")
@@ -176,6 +166,15 @@ elseif(KEEPASSXC_DIST_TYPE STREQUAL "Other")
unset(KEEPASSXC_DIST) unset(KEEPASSXC_DIST)
endif() endif()
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.14.0")
cmake_policy(SET CMP0083 NEW)
include(CheckPIESupported)
check_pie_supported()
endif()
# Create position independent code for shared libraries and executables
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
if("${CMAKE_SIZEOF_VOID_P}" EQUAL "4") if("${CMAKE_SIZEOF_VOID_P}" EQUAL "4")
set(IS_32BIT TRUE) set(IS_32BIT TRUE)
endif() endif()
@@ -251,6 +250,11 @@ if(WITH_APP_BUNDLE)
endif() endif()
add_gcc_compiler_flags("-fno-common") add_gcc_compiler_flags("-fno-common")
find_package(OpenMP)
if(OpenMP_FOUND)
add_gcc_compiler_cflags(${OpenMP_C_FLAGS})
add_gcc_compiler_cxxflags(${OpenMP_CXX_FLAGS})
endif()
add_gcc_compiler_flags("-Wall -Wextra -Wundef -Wpointer-arith -Wno-long-long") add_gcc_compiler_flags("-Wall -Wextra -Wundef -Wpointer-arith -Wno-long-long")
add_gcc_compiler_flags("-Wformat=2 -Wmissing-format-attribute") add_gcc_compiler_flags("-Wformat=2 -Wmissing-format-attribute")
add_gcc_compiler_flags("-fvisibility=hidden") add_gcc_compiler_flags("-fvisibility=hidden")
@@ -263,14 +267,13 @@ if(CMAKE_BUILD_TYPE_LOWER STREQUAL "debug")
endif() endif()
if (NOT HAIKU) if (NOT HAIKU)
if((CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.8.999) OR CMAKE_COMPILER_IS_CLANGXX) if((CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.8.999) OR CMAKE_COMPILER_IS_CLANGXX)
add_gcc_compiler_flags("-fstack-protector-strong") add_gcc_compiler_flags("-fstack-protector-strong")
else() else()
add_gcc_compiler_flags("-fstack-protector --param=ssp-buffer-size=4") add_gcc_compiler_flags("-fstack-protector --param=ssp-buffer-size=4")
endif() endif()
endif() endif()
add_gcc_compiler_cxxflags("-fno-exceptions -fno-rtti")
add_gcc_compiler_cxxflags("-Wnon-virtual-dtor -Wold-style-cast -Woverloaded-virtual") add_gcc_compiler_cxxflags("-Wnon-virtual-dtor -Wold-style-cast -Woverloaded-virtual")
add_gcc_compiler_cflags("-Wchar-subscripts -Wwrite-strings") add_gcc_compiler_cflags("-Wchar-subscripts -Wwrite-strings")
@@ -297,63 +300,86 @@ check_add_gcc_compiler_flag("-Werror=format-security")
check_add_gcc_compiler_flag("-Werror=implicit-function-declaration" C) check_add_gcc_compiler_flag("-Werror=implicit-function-declaration" C)
check_add_gcc_compiler_flag("-Wcast-align") check_add_gcc_compiler_flag("-Wcast-align")
if(WITH_COVERAGE AND CMAKE_COMPILER_IS_CLANGXX) if(UNIX AND NOT APPLE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-instr-generate -fcoverage-mapping")
# then:
# $ llvm-profdata merge -sparse default.profraw -o default.profdata
# $ llvm-cov show ./tests/${the_test_binary} \
# -format=html -instr-profile=default.profdata -output-dir=./coverages \
# `find src -iname '*.h' -or -iname '*.cpp'`
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
check_add_gcc_compiler_flag("-Qunused-arguments") check_add_gcc_compiler_flag("-Qunused-arguments")
add_gcc_compiler_flags("-pie -fPIE")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-add-needed -Wl,--as-needed -Wl,--no-undefined") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-add-needed -Wl,--as-needed -Wl,--no-undefined")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro,-z,now") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro,-z,now -pie")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--no-add-needed -Wl,--as-needed") set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--no-add-needed -Wl,--as-needed")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,relro,-z,now") set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,relro,-z,now")
endif() endif()
add_gcc_compiler_cflags("-std=c99") set(CMAKE_C_STANDARD 99)
add_gcc_compiler_cxxflags("-std=c++11") set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
check_add_gcc_compiler_flag("-fsized-deallocation" CXX) check_cxx_compiler_flag("-fsized-deallocation" CXX_HAS_fsized_deallocation)
if(CXX_HAS_fsized_deallocation)
# Do additional check: the deallocation functions must be there too.
set(CMAKE_REQUIRED_FLAGS "-fsized-deallocation")
check_cxx_source_compiles("#include <new>
int main() { void * ptr = nullptr; std::size_t size = 1; ::operator delete(ptr, size); }"
HAVE_DEALLOCATION_FUNCTIONS)
if(HAVE_DEALLOCATION_FUNCTIONS)
check_add_gcc_compiler_flag("-fsized-deallocation" CXX)
endif()
unset(CMAKE_REQUIRED_FLAGS)
endif()
if(APPLE AND CMAKE_COMPILER_IS_CLANGXX) if(APPLE AND CMAKE_COMPILER_IS_CLANGXX)
add_gcc_compiler_cxxflags("-stdlib=libc++") add_gcc_compiler_cxxflags("-stdlib=libc++")
endif() endif()
if(WITH_DEV_BUILD) if(WITH_DEV_BUILD)
add_definitions(-DQT_DEPRECATED_WARNINGS -DGCRYPT_NO_DEPRECATED) add_definitions(-DQT_DEPRECATED_WARNINGS)
else() else()
add_definitions(-DQT_NO_DEPRECATED_WARNINGS) add_definitions(-DQT_NO_DEPRECATED_WARNINGS)
add_gcc_compiler_cxxflags("-Wno-deprecated-declarations") add_gcc_compiler_cxxflags("-Wno-deprecated-declarations")
endif() endif()
if(MINGW) # MSVC specific options
set(CMAKE_RC_COMPILER_INIT windres) if (MSVC)
enable_language(RC) if(MSVC_TOOLSET_VERSION LESS 141)
set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <FLAGS> -O coff <DEFINES> -i <SOURCE> -o <OBJECT>") message(FATAL_ERROR "Only Microsoft Visual Studio 17 and newer are supported!")
if(NOT (CMAKE_BUILD_TYPE_LOWER STREQUAL "debug" OR CMAKE_BUILD_TYPE_LOWER STREQUAL "relwithdebinfo")) endif()
# Enable DEP and ASLR add_compile_options(/permissive- /utf-8)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--nxcompat -Wl,--dynamicbase") if(IS_DEBUG_BUILD)
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--nxcompat -Wl,--dynamicbase") add_compile_options(/Zf)
# Enable high entropy ASLR for 64-bit builds if(MSVC_TOOLSET_VERSION GREATER 141)
if(NOT IS_32BIT) add_compile_definitions(/fsanitize=address)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--high-entropy-va")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--high-entropy-va")
endif() endif()
endif() endif()
endif() endif()
if(APPLE AND WITH_APP_BUNDLE OR MINGW) if(WIN32)
set(CMAKE_RC_COMPILER_INIT windres)
enable_language(RC)
if(MINGW)
set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <FLAGS> -O coff <DEFINES> -i <SOURCE> -o <OBJECT>")
endif()
if(NOT IS_DEBUG_BUILD)
if(MSVC)
# By default MSVC enables NXCOMPAT
add_compile_options(/guard:cf)
add_link_options(/DYNAMICBASE /HIGHENTROPYVA /GUARD:CF)
else(MINGW)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--nxcompat -Wl,--dynamicbase")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--nxcompat -Wl,--dynamicbase")
# Enable high entropy ASLR for 64-bit builds
if(NOT IS_32BIT)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--high-entropy-va")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--high-entropy-va")
endif()
endif()
endif()
endif()
if(APPLE AND WITH_APP_BUNDLE OR WIN32)
set(PROGNAME KeePassXC) set(PROGNAME KeePassXC)
else() else()
set(PROGNAME keepassxc) set(PROGNAME keepassxc)
endif() endif()
if(MINGW) if(WIN32)
set(CLI_INSTALL_DIR ".") set(CLI_INSTALL_DIR ".")
set(PROXY_INSTALL_DIR ".") set(PROXY_INSTALL_DIR ".")
set(BIN_INSTALL_DIR ".") set(BIN_INSTALL_DIR ".")
@@ -384,26 +410,47 @@ endif(WITH_TESTS)
if(WITH_COVERAGE) if(WITH_COVERAGE)
# Include code coverage, use with -DCMAKE_BUILD_TYPE=Debug # Include code coverage, use with -DCMAKE_BUILD_TYPE=Debug
include(CodeCoverage) include(CodeCoverage)
set(COVERAGE_GCOVR_EXCLUDES
"\\(.+/\\)?tests/.\\*"
".\\*/moc_\\[^/\\]+\\.cpp"
".\\*/ui_\\[^/\\]+\\.h"
"\\(.+/\\)?zxcvbn/.\\*")
append_coverage_compiler_flags() append_coverage_compiler_flags()
setup_target_for_coverage_gcovr_html(
NAME coverage set(COVERAGE_EXCLUDES
EXECUTABLE $(MAKE) && $(MAKE) test "'^(.+/)?(thirdparty|zxcvbn)/.*'"
) "'^(.+/)?main\\.cpp$$'"
"'^(.+/)?cli/keepassxc-cli\\.cpp$$'"
"'^(.+/)?proxy/keepassxc-proxy\\.cpp$$'")
if(WITH_COVERAGE AND CMAKE_COMPILER_IS_CLANGXX)
set(MAIN_BINARIES
"$<TARGET_FILE:${PROGNAME}>"
"$<TARGET_FILE:keepassxc-cli>"
"$<TARGET_FILE:keepassxc-proxy>")
setup_target_for_coverage_llvm(
NAME coverage
BINARY ${MAIN_BINARIES}
SOURCES_ROOT ${CMAKE_SOURCE_DIR}/src
)
else()
setup_target_for_coverage_gcovr(
NAME coverage
SOURCES_ROOT ${CMAKE_SOURCE_DIR}/src
)
endif()
endif() endif()
include(CLangFormat) include(CLangFormat)
set(QT_COMPONENTS Core Network Concurrent Gui Svg Widgets Test LinguistTools) set(QT_COMPONENTS Core Network Concurrent Gui Svg Widgets Test LinguistTools)
if(UNIX AND NOT APPLE) if(UNIX AND NOT APPLE)
find_package(Qt5 COMPONENTS ${QT_COMPONENTS} DBus REQUIRED) find_package(Qt5 COMPONENTS ${QT_COMPONENTS} DBus X11Extras REQUIRED)
elseif(APPLE) elseif(APPLE)
find_package(Qt5 COMPONENTS ${QT_COMPONENTS} REQUIRED HINTS /usr/local/opt/qt/lib/cmake /usr/local/Cellar/qt/*/lib/cmake ENV PATH) find_package(Qt5 COMPONENTS ${QT_COMPONENTS} REQUIRED HINTS
find_package(Qt5 COMPONENTS MacExtras HINTS /usr/local/opt/qt/lib/cmake /usr/local/Cellar/qt/*/lib/cmake ENV PATH) /usr/local/opt/qt/lib/cmake
/usr/local/Cellar/qt/*/lib/cmake
/opt/homebrew/opt/qt/lib/cmake
ENV PATH)
find_package(Qt5 COMPONENTS MacExtras HINTS
/usr/local/opt/qt/lib/cmake
/usr/local/Cellar/qt/*/lib/cmake
/opt/homebrew/opt/qt/lib/cmake
ENV PATH)
else() else()
find_package(Qt5 COMPONENTS ${QT_COMPONENTS} REQUIRED) find_package(Qt5 COMPONENTS ${QT_COMPONENTS} REQUIRED)
endif() endif()
@@ -423,45 +470,40 @@ set(CMAKE_AUTORCC ON)
if(APPLE) if(APPLE)
set(CMAKE_MACOSX_RPATH TRUE) set(CMAKE_MACOSX_RPATH TRUE)
find_program(MACDEPLOYQT_EXE macdeployqt HINTS ${Qt5_PREFIX}/bin ENV PATH) find_program(MACDEPLOYQT_EXE macdeployqt HINTS ${Qt5_PREFIX}/bin ${Qt5_PREFIX}/tools/qt5/bin ENV PATH)
if(NOT MACDEPLOYQT_EXE) if(NOT MACDEPLOYQT_EXE)
message(FATAL_ERROR "macdeployqt is required to build on macOS") message(FATAL_ERROR "macdeployqt is required to build on macOS")
else()
message(STATUS "Using macdeployqt: ${MACDEPLOYQT_EXE}")
endif() endif()
elseif(MINGW) message(STATUS "Using macdeployqt: ${MACDEPLOYQT_EXE}")
find_program(WINDEPLOYQT_EXE windeployqt HINTS ${Qt5_PREFIX}/bin ENV PATH) elseif(WIN32)
find_program(WINDEPLOYQT_EXE windeployqt HINTS ${Qt5_PREFIX}/bin ${Qt5_PREFIX}/tools/qt5/bin ENV PATH)
if(NOT WINDEPLOYQT_EXE) if(NOT WINDEPLOYQT_EXE)
message(FATAL_ERROR "windeployqt is required to build on Windows") message(FATAL_ERROR "windeployqt is required to build on Windows")
else()
message(STATUS "Using windeployqt: ${WINDEPLOYQT_EXE}")
endif() endif()
message(STATUS "Using windeployqt: ${WINDEPLOYQT_EXE}")
endif() endif()
# Debian sets the the build type to None for package builds. # Debian sets the build type to None for package builds.
# Make sure we don't enable asserts there. # Make sure we don't enable asserts there.
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_NONE QT_NO_DEBUG) set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_NONE QT_NO_DEBUG)
find_package(LibGPGError REQUIRED) # Find Botan2
find_package(Gcrypt 1.7.0 REQUIRED) find_package(Botan2 REQUIRED)
find_package(Argon2 REQUIRED) if(BOTAN2_VERSION VERSION_LESS "2.11.0")
message(FATAL_ERROR "Botan2 2.11.0 or higher is required")
endif()
include_directories(SYSTEM ${BOTAN2_INCLUDE_DIR})
# Find zlib
find_package(ZLIB REQUIRED) find_package(ZLIB REQUIRED)
find_package(QREncode REQUIRED)
find_package(sodium 1.0.12 REQUIRED)
set(CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIR})
if(ZLIB_VERSION_STRING VERSION_LESS "1.2.0") if(ZLIB_VERSION_STRING VERSION_LESS "1.2.0")
message(FATAL_ERROR "zlib 1.2.0 or higher is required to use the gzip format") message(FATAL_ERROR "zlib 1.2.0 or higher is required to use the gzip format")
endif() endif()
include_directories(SYSTEM ${ZLIB_INCLUDE_DIR})
include_directories(SYSTEM ${ARGON2_INCLUDE_DIR} ${sodium_INCLUDE_DIR})
# Optional
if(WITH_XC_YUBIKEY) if(WITH_XC_YUBIKEY)
find_package(YubiKey REQUIRED) find_package(PCSC REQUIRED)
include_directories(SYSTEM ${PCSC_INCLUDE_DIRS})
include_directories(SYSTEM ${YUBIKEY_INCLUDE_DIRS})
endif() endif()
if(UNIX) if(UNIX)
@@ -494,7 +536,7 @@ if(UNIX)
endif() endif()
endif() endif()
include_directories(SYSTEM ${GCRYPT_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR}) include_directories(SYSTEM ${ZLIB_INCLUDE_DIR})
add_subdirectory(src) add_subdirectory(src)
add_subdirectory(share) add_subdirectory(share)

20
CODE-OF-CONDUCT.md Normal file
View File

@@ -0,0 +1,20 @@
# Contributor Code of Conduct
KeePassXC is an open project that welcomes everybody no matter their ethnicity, sex,
sexual identity or orientation, age, socio-economic status, nationality, or religion.
Regardless of what background you come from, feel encouraged to participate in
the project and express your views as long you are respectful to others.
We value all members of our community and so in order to ensure a harassment-free
experience for everyone and mutual respect among members of this community, we
impose the following simple rules:
- No bullying, no insults. Any form of harassment will not be tolerated.
- No racism, no sexism, no homophobia, no hurtful extremist views of any kind.
- Be mindful of what you say, be diligent in how you say it.
- Show respect and, as always, be excellent to each other.
Violations of these rules or any other form of abuse can be reported confidentially
to conduct AT keepassxc DOT org. Members who do not adhere to our code of conduct
will be banned either permanently or until they change their ways so as to be
compatible with a friendly, open, and inclusive community.

22
COPYING
View File

@@ -46,6 +46,10 @@ Files: cmake/FindYubiKey.cmake
Copyright: 2014 Kyle Manna <kyle@kylemanna.com> Copyright: 2014 Kyle Manna <kyle@kylemanna.com>
License: GPL-2 or GPL-3 License: GPL-2 or GPL-3
Files: cmake/FindBotan2.cmake
Copyright: 2018 Ribose Inc.
License: BSD-2-clause
Files: cmake/GenerateProductVersion.cmake Files: cmake/GenerateProductVersion.cmake
Copyright: 2015 halex2005 <akharlov@gmail.com> Copyright: 2015 halex2005 <akharlov@gmail.com>
License: MIT License: MIT
@@ -137,11 +141,13 @@ Files: share/icons/badges/2_Expired.svg
share/icons/database/C46_Help.svg share/icons/database/C46_Help.svg
share/icons/database/C53_Apply.svg share/icons/database/C53_Apply.svg
share/icons/database/C61_Services.svg share/icons/database/C61_Services.svg
Copyright: 2020 KeePassXC Team <team@keepassxc.org> Copyright: 2022 KeePassXC Team <team@keepassxc.org>
License: MIT License: MIT
Files: share/icons/application/scalable/actions/chevron-double-down.svg Files: share/icons/application/scalable/actions/chevron-double-down.svg
share/icons/application/scalable/actions/chevron-double-right.svg share/icons/application/scalable/actions/chevron-double-right.svg
share/icons/application/scalable/actions/database-lock.svg
share/icons/application/scalable/actions/database-lock-all.svg
share/icons/application/scalable/actions/document-close.svg share/icons/application/scalable/actions/document-close.svg
share/icons/application/scalable/actions/document-edit.svg share/icons/application/scalable/actions/document-edit.svg
share/icons/application/scalable/actions/document-export.svg share/icons/application/scalable/actions/document-export.svg
@@ -160,12 +166,17 @@ Files: share/icons/application/scalable/actions/chevron-double-down.svg
share/icons/application/scalable/actions/entry-edit.svg share/icons/application/scalable/actions/entry-edit.svg
share/icons/application/scalable/actions/entry-new.svg share/icons/application/scalable/actions/entry-new.svg
share/icons/application/scalable/actions/favicon-download.svg share/icons/application/scalable/actions/favicon-download.svg
share/icons/application/scalable/actions/fingerprint.svg
share/icons/application/scalable/actions/group-clone.svg
share/icons/application/scalable/actions/group-delete.svg share/icons/application/scalable/actions/group-delete.svg
share/icons/application/scalable/actions/group-edit.svg share/icons/application/scalable/actions/group-edit.svg
share/icons/application/scalable/actions/group-empty-trash.svg share/icons/application/scalable/actions/group-empty-trash.svg
share/icons/application/scalable/actions/group-new.svg share/icons/application/scalable/actions/group-new.svg
share/icons/application/scalable/actions/hammer-wrench.svg
share/icons/application/scalable/actions/health.svg
share/icons/application/scalable/actions/help-about.svg share/icons/application/scalable/actions/help-about.svg
share/icons/application/scalable/actions/key-enter.svg share/icons/application/scalable/actions/key-enter.svg
share/icons/application/scalable/actions/lock-question.svg
share/icons/application/scalable/actions/message-close.svg share/icons/application/scalable/actions/message-close.svg
share/icons/application/scalable/actions/move-down.svg share/icons/application/scalable/actions/move-down.svg
share/icons/application/scalable/actions/move-up.svg share/icons/application/scalable/actions/move-up.svg
@@ -181,6 +192,9 @@ Files: share/icons/application/scalable/actions/chevron-double-down.svg
share/icons/application/scalable/actions/statistics.svg share/icons/application/scalable/actions/statistics.svg
share/icons/application/scalable/actions/system-help.svg share/icons/application/scalable/actions/system-help.svg
share/icons/application/scalable/actions/system-search.svg share/icons/application/scalable/actions/system-search.svg
share/icons/application/scalable/actions/tag.svg
share/icons/application/scalable/actions/tag-search.svg
share/icons/application/scalable/actions/trash.svg
share/icons/application/scalable/actions/url-copy.svg share/icons/application/scalable/actions/url-copy.svg
share/icons/application/scalable/actions/username-copy.svg share/icons/application/scalable/actions/username-copy.svg
share/icons/application/scalable/actions/view-history.svg share/icons/application/scalable/actions/view-history.svg
@@ -230,3 +244,9 @@ Files: share/icons/application/scalable/actions/hibp.svg
share/icons/database/C64_Apple.svg share/icons/database/C64_Apple.svg
Copyright: GPL-2+ Copyright: GPL-2+
Comment: from the Simple Icons repo (https://github.com/simple-icons/simple-icons/) Comment: from the Simple Icons repo (https://github.com/simple-icons/simple-icons/)
Files: src/thirdparty/ykcore/yk*
src/thirdparty/ykcore/yubikey.h
Copyright: 2006-2015, Yubico AB
License: BSD-2-Clause
Comment: from the yubikey-personalization repo (https://github.com/Yubico/yubikey-personalization)

View File

@@ -12,21 +12,20 @@ Build Dependencies
The following tools must exist within your PATH: The following tools must exist within your PATH:
* make * make
* cmake (>= 2.8.12) * cmake (>= 3.3.0)
* g++ (>= 4.7) or clang++ (>= 3.0) * g++ (>= 4.7) or clang++ (>= 6.0)
* asciidoctor (on Linux/MacOS) * asciidoctor
The following libraries are required: The following libraries are required:
* Qt 5 (>= 5.2): qtbase and qttools5 * Qt 5 (>= 5.9.5): qtbase5, qtbase5-private, libqt5svg5, qttools5, qt5-image-formats-plugins
* libgcrypt (>= 1.6) * botan (>= 2.12)
* zlib * zlib
* libmicrohttpd * minizip
* libxi, libxtst, qtx11extras (optional for auto-type on X11) * readline (for completion in cli)
* libsodium (>= 1.0.12) * libqt5x11extras5, libxi, and libxtst (for auto-type on X11)
* libargon2
* qrencode * qrencode
* yubikey ykpers (optional to support YubiKey) * libusb-1.0, pcsclite (optional to support YubiKey on Linux)
Prepare the Building Environment Prepare the Building Environment
================================ ================================
@@ -40,7 +39,7 @@ Build Steps
We recommend using the release tool to perform builds, please read up-to-date instructions [on our wiki](https://github.com/keepassxreboot/keepassxc/wiki/Building-KeePassXC#building-using-the-release-tool). We recommend using the release tool to perform builds, please read up-to-date instructions [on our wiki](https://github.com/keepassxreboot/keepassxc/wiki/Building-KeePassXC#building-using-the-release-tool).
To compile from source, open a **Terminal (on Linux/MacOS)** or a **MSYS2-MinGW shell (on Windows)**<br/> To compile from source, open a **Terminal (on Linux/MacOS)** or a **MSYS2-MinGW shell (on Windows)**<br/>
**Note:** on Windows make sure you are using a **MINGW shell** by checking the label before the current path **Note:** on Windows you can also use MSVC to build natively, we recommend Visual Studio 2019
First, download the KeePassXC [source tarball](https://keepassxc.org/download#source) First, download the KeePassXC [source tarball](https://keepassxc.org/download#source)
or check out the latest version from our [Git repository](https://github.com/keepassxreboot/keepassxc). or check out the latest version from our [Git repository](https://github.com/keepassxreboot/keepassxc).
@@ -65,6 +64,8 @@ For a stable build, it is recommended to checkout the master branch.
git checkout master git checkout master
``` ```
NOTE: See the [Windows Build Instructions](https://github.com/keepassxreboot/keepassxc/wiki/Building-KeePassXC#windows) for building with MSVC.
Navigate to the directory where you have downloaded KeePassXC and type these commands: Navigate to the directory where you have downloaded KeePassXC and type these commands:
``` ```
@@ -74,7 +75,7 @@ cmake -DWITH_XC_ALL=ON ..
make make
``` ```
If you are on Windows, you may have to add ```-G "MSYS Makefiles"``` to the beginning of the cmake command. See the [Windows Build Instructions](https://github.com/keepassxreboot/keepassxc/wiki/Building-KeePassXC#windows) for more information. NOTE: If you are using MSYS2, you may have to add ```-G "MSYS Makefiles"``` to the beginning of the cmake command.
These steps place the compiled KeePassXC binary inside the `./build/src/` directory. These steps place the compiled KeePassXC binary inside the `./build/src/` directory.
(Note the cmake notes/options below.) (Note the cmake notes/options below.)
@@ -98,12 +99,10 @@ These steps place the compiled KeePassXC binary inside the `./build/src/` direct
-DWITH_XC_BROWSER=[ON|OFF] Enable/Disable KeePassXC-Browser extension support (default: OFF) -DWITH_XC_BROWSER=[ON|OFF] Enable/Disable KeePassXC-Browser extension support (default: OFF)
-DWITH_XC_NETWORKING=[ON|OFF] Enable/Disable Networking support (e.g., favicon downloading) (default: OFF) -DWITH_XC_NETWORKING=[ON|OFF] Enable/Disable Networking support (e.g., favicon downloading) (default: OFF)
-DWITH_XC_SSHAGENT=[ON|OFF] Enable/Disable SSHAgent support (default: OFF) -DWITH_XC_SSHAGENT=[ON|OFF] Enable/Disable SSHAgent support (default: OFF)
-DWITH_XC_TOUCHID=[ON|OFF] (macOS Only) Enable/Disable Touch ID unlock (default:OFF)
-DWITH_XC_FDOSECRETS=[ON|OFF] (Linux Only) Enable/Disable Freedesktop.org Secrets Service support (default:OFF) -DWITH_XC_FDOSECRETS=[ON|OFF] (Linux Only) Enable/Disable Freedesktop.org Secrets Service support (default:OFF)
-DWITH_XC_KEESHARE=[ON|OFF] Enable/Disable KeeShare group synchronization extension (default: OFF) -DWITH_XC_KEESHARE=[ON|OFF] Enable/Disable KeeShare group synchronization extension (default: OFF)
-DWITH_XC_KEESHARE_SECURE=[ON|OFF] Enable/Disable KeeShare signed containers, requires libquazip5 (default: OFF)
-DWITH_XC_ALL=[ON|OFF] Enable/Disable compiling all plugins above (default: OFF) -DWITH_XC_ALL=[ON|OFF] Enable/Disable compiling all plugins above (default: OFF)
-DWITH_XC_UPDATECHECK=[ON|OFF] Enable/Disable automatic updating checking (requires WITH_XC_NETWORKING) (default: ON) -DWITH_XC_UPDATECHECK=[ON|OFF] Enable/Disable automatic updating checking (requires WITH_XC_NETWORKING) (default: ON)
-DWITH_TESTS=[ON|OFF] Enable/Disable building of unit tests (default: ON) -DWITH_TESTS=[ON|OFF] Enable/Disable building of unit tests (default: ON)

View File

@@ -1,12 +1,12 @@
GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE
Version 2, June 1991 Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc., Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.
Preamble Preamble
The licenses for most software are designed to take away your The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public freedom to share and change it. By contrast, the GNU General Public
@@ -56,7 +56,7 @@ patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and The precise terms and conditions for copying, distribution and
modification follow. modification follow.
GNU GENERAL PUBLIC LICENSE GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains 0. This License applies to any program or other work which contains
@@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally. of promoting the sharing and reuse of software generally.
NO WARRANTY NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
@@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES. POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it possible use to the public, the best way to achieve this is to make it

View File

@@ -1,12 +1,11 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
GNU GENERAL PUBLIC LICENSE Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.
Preamble Preamble
The GNU General Public License is a free, copyleft license for The GNU General Public License is a free, copyleft license for
software and other kinds of works. software and other kinds of works.
@@ -69,7 +68,7 @@ patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and The precise terms and conditions for copying, distribution and
modification follow. modification follow.
TERMS AND CONDITIONS TERMS AND CONDITIONS
0. Definitions. 0. Definitions.
@@ -77,7 +76,7 @@ modification follow.
"Copyright" also means copyright-like laws that apply to other kinds of "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks. works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this "The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations. "recipients" may be individuals or organizations.
@@ -510,7 +509,7 @@ actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid. country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties covered work, and grant a patent license to some of the parties
@@ -619,9 +618,9 @@ an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee. copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it possible use to the public, the best way to achieve this is to make it
@@ -646,7 +645,7 @@ the "copyright" line and a pointer to where the full notice is found.
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail. Also add information on how to contact you by electronic and paper mail.
@@ -665,12 +664,11 @@ might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school, You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary. if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>. <https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>. <https://www.gnu.org/licenses/why-not-lgpl.html>.

View File

@@ -55,7 +55,7 @@ modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be author's reputation will not be affected by problems that might be
introduced by others. introduced by others.
Finally, software patents pose a constant threat to the existence of Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a effectively restrict the users of a free program by obtaining a
@@ -111,7 +111,7 @@ modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The "work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must former contains code derived from the library, whereas the latter must
be combined with the library in order to run. be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@@ -158,7 +158,7 @@ Library.
You may charge a fee for the physical act of transferring a copy, You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a and you may at your option offer warranty protection in exchange for a
fee. fee.
2. You may modify your copy or copies of the Library or any portion 2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1 distribute such modifications or work under the terms of Section 1
@@ -216,7 +216,7 @@ instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in that version instead if you wish.) Do not make any other change in
these notices. these notices.
Once this change is made in a given copy, it is irreversible for Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy. subsequent copies and derivative works made from that copy.
@@ -267,7 +267,7 @@ Library will still fall under Section 6.)
distribute the object code for the work under the terms of Section 6. distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6, Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself. whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or 6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work work containing portions of the Library, and distribute that work
@@ -329,7 +329,7 @@ restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you use both them and the Library together in an executable that you
distribute. distribute.
7. You may place library facilities that are a work based on the 7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined facilities not covered by this License, and distribute such a combined
@@ -370,7 +370,7 @@ subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein. restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with You are not responsible for enforcing compliance by third parties with
this License. this License.
11. If, as a consequence of a court judgment or allegation of patent 11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues), infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or conditions are imposed on you (whether by court order, agreement or
@@ -422,7 +422,7 @@ conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by license version number, you may choose any version ever published by
the Free Software Foundation. the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free 14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these, programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is write to the author to ask for permission. For software which is
@@ -456,7 +456,7 @@ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES. DAMAGES.
END OF TERMS AND CONDITIONS END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest If you develop a new library, and you want it to be of the greatest

View File

@@ -1,7 +1,7 @@
GNU LESSER GENERAL PUBLIC LICENSE GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007 Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.

View File

@@ -3,7 +3,10 @@
[![codecov](https://codecov.io/gh/keepassxreboot/keepassxc/branch/develop/graph/badge.svg)](https://codecov.io/gh/keepassxreboot/keepassxc) [![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/) [![GitHub release](https://img.shields.io/github/release/keepassxreboot/keepassxc)](https://github.com/keepassxreboot/keepassxc/releases/)
[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. [![Matrix community channel](https://img.shields.io/matrix/keepassxc:matrix.org?label=Community%20channel)](https://app.element.io/#/room/#keepassxc:mozilla.org)
[![Matrix development channel](https://img.shields.io/matrix/keepassxc-dev:matrix.org?label=Development%20channel)](https://app.element.io/#/room/#keepassxc-dev:mozilla.org)
[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 into 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 ## 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). 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).
@@ -12,7 +15,7 @@ The [QuickStart Guide](https://keepassxc.org/docs/KeePassXC_GettingStarted.html)
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. 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 ### Basic
* Create, open, and save databases in the KDBX format (KeePass compatible to KDBX4 and KDBX3) * Create, open, and save databases in the KDBX format (KeePass-compatible with KDBX4 and KDBX3)
* Store sensitive information in entries that are organized by groups * Store sensitive information in entries that are organized by groups
* Search for entries * Search for entries
* Password generator * Password generator
@@ -45,10 +48,12 @@ Detailed instructions are available in the [Build and Install](./INSTALL.md) pag
## Contributing ## Contributing
We are always looking for suggestions on how to improve KeePassXC. If you find any bugs or have an idea for a new feature, please let us know by opening a report in the [issue tracker](https://github.com/keepassxreboot/keepassxc/issues) on GitHub or join us on IRC in [freenode](https://webchat.freenode.net/) channels #keepassxc and #keepassxc-dev. We are always looking for suggestions on how to improve KeePassXC. If you find any bugs or have an idea for a new feature, please let us know by opening a report in the [issue tracker](https://github.com/keepassxreboot/keepassxc/issues) on GitHub, or join us on [Matrix community channel](https://matrix.to/#/!zUxwGnFkUyycpxeHeM:matrix.org?via=matrix.org) or [Matrix development channel](https://matrix.to/#/!RhJPJPGwQIFVQeXqZa:matrix.org?via=matrix.org), or on IRC in [Libera.Chat](https://web.libera.chat/) channels #keepassxc and #keepassxc-dev.
You may directly contribute your own code by submitting a pull request. Please read the [CONTRIBUTING](.github/CONTRIBUTING.md) document for further information. You may directly contribute your own code by submitting a pull request. Please read the [CONTRIBUTING](.github/CONTRIBUTING.md) document for further information.
Contributors are required to adhere to the project's [Code of Conduct](CODE-OF-CONDUCT.md).
## License ## License
KeePassXC code is licensed under GPL-2 or GPL-3. Additional licensing for third-party files is detailed in [COPYING](./COPYING). KeePassXC code is licensed under GPL-2 or GPL-3. Additional licensing for third-party files is detailed in [COPYING](./COPYING).

View File

@@ -15,50 +15,46 @@
set(EXCLUDED_DIRS set(EXCLUDED_DIRS
# third-party directories # third-party directories
src/zxcvbn/ src/thirdparty
src/zxcvbn
# objective-c directories # objective-c directories
src/touchid/ src/touchid
src/autotype/mac/ src/autotype/mac
src/gui/osutils/macutils/) src/gui/osutils/macutils)
set(EXCLUDED_FILES set(EXCLUDED_FILES
# third-party files # third-party files
streams/qtiocompressor.cpp src/streams/qtiocompressor.\\*
streams/qtiocompressor.h src/gui/KMessageWidget.\\*
gui/KMessageWidget.h src/gui/MainWindowAdaptor.\\*
gui/KMessageWidget.cpp src/gui/tag/TagsEdit.\\*
gui/MainWindowAdaptor.h tests/modeltest.\\*
gui/MainWindowAdaptor.cpp
crypto/ssh/bcrypt_pbkdf.cpp
crypto/ssh/blf.h
crypto/ssh/blowfish.c
tests/modeltest.cpp
tests/modeltest.h
# objective-c files # objective-c files
core/ScreenLockListenerMac.h src/core/ScreenLockListenerMac.\\*)
core/ScreenLockListenerMac.cpp)
file(GLOB_RECURSE ALL_SOURCE_FILES RELATIVE ${CMAKE_SOURCE_DIR} src/*.cpp src/*.h tests/*.cpp tests/*.h) set(FIND_EXCLUDE_DIR_EXPR "")
foreach(SOURCE_FILE ${ALL_SOURCE_FILES}) foreach(EXCLUDE ${EXCLUDED_DIRS})
foreach(EXCLUDED_DIR ${EXCLUDED_DIRS}) list(APPEND FIND_EXCLUDE_DIR_EXPR -o -path "${EXCLUDE}" -prune)
string(FIND ${SOURCE_FILE} ${EXCLUDED_DIR} SOURCE_FILE_EXCLUDED)
if(NOT ${SOURCE_FILE_EXCLUDED} EQUAL -1)
list(REMOVE_ITEM ALL_SOURCE_FILES ${SOURCE_FILE})
endif()
endforeach()
foreach(EXCLUDED_FILE ${EXCLUDED_FILES})
if(${SOURCE_FILE} MATCHES ".*${EXCLUDED_FILE}$")
list(REMOVE_ITEM ALL_SOURCE_FILES ${SOURCE_FILE})
endif()
endforeach()
endforeach() endforeach()
set(FIND_EXCLUDE_FILE_EXPR "")
foreach(EXCLUDE ${EXCLUDED_FILES})
if(FIND_EXCLUDE_FILE_EXPR)
list(APPEND FIND_EXCLUDE_FILE_EXPR -o)
endif()
list(APPEND FIND_EXCLUDE_FILE_EXPR -path "${EXCLUDE}")
endforeach()
if(FIND_EXCLUDE_FILE_EXPR)
set(FIND_EXCLUDE_FILE_EXPR -a -not "\\(" ${FIND_EXCLUDE_FILE_EXPR} "\\)")
endif()
add_custom_target(format) add_custom_target(format)
foreach(SOURCE_FILE ${ALL_SOURCE_FILES})
add_custom_command( add_custom_command(
TARGET format TARGET format
PRE_BUILD PRE_BUILD
COMMAND echo Formatting ${SOURCE_FILE} COMMAND find src tests "\\(" -name "\\*.h" -o -name "\\*.cpp" ${FIND_EXCLUDE_DIR_EXPR} "\\)"
COMMAND clang-format -style=file -i \"${SOURCE_FILE}\" ${FIND_EXCLUDE_FILE_EXPR} -type f -print0 | xargs -0 -P0 -n10 clang-format -style=file -i
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
endforeach() COMMENT "Formatting source files..."
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})

View File

@@ -1,4 +1,5 @@
# Copyright (c) 2012 - 2017, Lars Bilke # Copyright (c) 2012 - 2017, Lars Bilke
# Copyright (c) 2021 KeePassXC Team
# All rights reserved. # All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without modification, # Redistribution and use in source and binary forms, with or without modification,
@@ -25,279 +26,218 @@
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# CHANGES:
#
# 2012-01-31, Lars Bilke
# - Enable Code Coverage
#
# 2013-09-17, Joakim Söderberg
# - Added support for Clang.
# - Some additional usage instructions.
#
# 2016-02-03, Lars Bilke
# - Refactored functions to use named parameters
#
# 2017-06-02, Lars Bilke
# - Merged with modified version from github.com/ufz/ogs
#
#
# USAGE:
#
# 1. Copy this file into your cmake modules path.
#
# 2. Add the following line to your CMakeLists.txt:
# include(CodeCoverage)
#
# 3. Append necessary compiler flags:
# APPEND_COVERAGE_COMPILER_FLAGS()
#
# 4. If you need to exclude additional directories from the report, specify them
# using the COVERAGE_LCOV_EXCLUDES variable before calling SETUP_TARGET_FOR_COVERAGE_LCOV.
# Example:
# set(COVERAGE_LCOV_EXCLUDES 'dir1/*' 'dir2/*')
#
# 5. Use the functions described below to create a custom make target which
# runs your test executable and produces a code coverage report.
#
# 6. Build a Debug build:
# cmake -DCMAKE_BUILD_TYPE=Debug ..
# make
# make my_coverage_target
#
include(CMakeParseArguments) include(CMakeParseArguments)
# Check prereqs # Check prereqs
find_program( GCOV_PATH gcov ) find_program(GCOV_PATH gcov)
find_program( LCOV_PATH NAMES lcov lcov.bat lcov.exe lcov.perl) find_program(LLVM_COV_PATH llvm-cov)
find_program( GENHTML_PATH NAMES genhtml genhtml.perl genhtml.bat ) find_program(LLVM_PROFDATA_PATH llvm-profdata)
find_program( GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/scripts/test) find_program(XCRUN_PATH xcrun)
find_program( SIMPLE_PYTHON_EXECUTABLE python ) find_program(GENHTML_PATH NAMES genhtml genhtml.perl genhtml.bat)
find_program(GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/scripts/test)
if(NOT GCOV_PATH) set(COVERAGE_COMPILER_FLAGS "-g -O0" CACHE INTERNAL "")
message(FATAL_ERROR "gcov not found! Aborting...") if(CMAKE_COMPILER_IS_GNUCXX)
endif() # NOT GCOV_PATH set(COVERAGE_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} --coverage -fprofile-arcs -ftest-coverage")
elseif(CMAKE_COMPILER_IS_CLANGXX)
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang") set(COVERAGE_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-instr-generate -fcoverage-mapping")
if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 3)
message(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...")
endif()
elseif(NOT CMAKE_COMPILER_IS_GNUCXX)
message(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
endif() endif()
set(COVERAGE_COMPILER_FLAGS "-g -O0 --coverage -fprofile-arcs -ftest-coverage" set(CMAKE_COVERAGE_FORMAT
CACHE INTERNAL "") "html" "xml"
CACHE STRING "Coverage report output format.")
set_property(CACHE CMAKE_COVERAGE_FORMAT PROPERTY STRINGS "html" "txt")
set(CMAKE_CXX_FLAGS_COVERAGE set(CMAKE_CXX_FLAGS_COVERAGE
${COVERAGE_COMPILER_FLAGS} ${COVERAGE_COMPILER_FLAGS}
CACHE STRING "Flags used by the C++ compiler during coverage builds." CACHE STRING "Flags used by the C++ compiler during coverage builds.")
FORCE )
set(CMAKE_C_FLAGS_COVERAGE set(CMAKE_C_FLAGS_COVERAGE
${COVERAGE_COMPILER_FLAGS} ${COVERAGE_COMPILER_FLAGS}
CACHE STRING "Flags used by the C compiler during coverage builds." CACHE STRING "Flags used by the C compiler during coverage builds.")
FORCE )
set(CMAKE_EXE_LINKER_FLAGS_COVERAGE set(CMAKE_EXE_LINKER_FLAGS_COVERAGE
"" ""
CACHE STRING "Flags used for linking binaries during coverage builds." CACHE STRING "Flags used for linking binaries during coverage builds.")
FORCE )
set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
"" ""
CACHE STRING "Flags used by the shared libraries linker during coverage builds." CACHE STRING "Flags used by the shared libraries linker during coverage builds.")
FORCE )
mark_as_advanced( mark_as_advanced(
CMAKE_COVERAGE_FORMAT
CMAKE_CXX_FLAGS_COVERAGE CMAKE_CXX_FLAGS_COVERAGE
CMAKE_C_FLAGS_COVERAGE CMAKE_C_FLAGS_COVERAGE
CMAKE_EXE_LINKER_FLAGS_COVERAGE CMAKE_EXE_LINKER_FLAGS_COVERAGE
CMAKE_SHARED_LINKER_FLAGS_COVERAGE ) CMAKE_SHARED_LINKER_FLAGS_COVERAGE)
if(NOT CMAKE_BUILD_TYPE_LOWER STREQUAL "debug") if(NOT CMAKE_BUILD_TYPE_LOWER STREQUAL "debug")
message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading") message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading")
endif() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug" endif() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug"
if(CMAKE_C_COMPILER_ID STREQUAL "GNU") if(CMAKE_COMPILER_IS_GNUCXX)
if(NOT GCOV_PATH)
message(FATAL_ERROR "gcov not found! Aborting...")
endif() # NOT GCOV_PATH
link_libraries(gcov) link_libraries(gcov)
else()
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
endif() endif()
# Defines a target for running and collection code coverage information
# Builds dependencies, runs the given executable and outputs reports.
# NOTE! The executable should always have a ZERO as exit code otherwise
# the coverage generation will not complete.
#
# SETUP_TARGET_FOR_COVERAGE_LCOV(
# NAME testrunner_coverage # New target name
# EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
# DEPENDENCIES testrunner # Dependencies to build first
# )
function(SETUP_TARGET_FOR_COVERAGE_LCOV)
set(options NONE)
set(oneValueArgs NAME)
set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT LCOV_PATH)
message(FATAL_ERROR "lcov not found! Aborting...")
endif() # NOT LCOV_PATH
if(NOT GENHTML_PATH)
message(FATAL_ERROR "genhtml not found! Aborting...")
endif() # NOT GENHTML_PATH
# Setup target
add_custom_target(${Coverage_NAME}
# Cleanup lcov
COMMAND ${LCOV_PATH} --gcov-tool ${GCOV_PATH} -directory . --zerocounters
# Create baseline to make sure untouched files show up in the report
COMMAND ${LCOV_PATH} --gcov-tool ${GCOV_PATH} -c -i -d . -o ${Coverage_NAME}.base
# Run tests
COMMAND ${Coverage_EXECUTABLE}
# Capturing lcov counters and generating report
COMMAND ${LCOV_PATH} --gcov-tool ${GCOV_PATH} --directory . --capture --output-file ${Coverage_NAME}.info
# add baseline counters
COMMAND ${LCOV_PATH} --gcov-tool ${GCOV_PATH} -a ${Coverage_NAME}.base -a ${Coverage_NAME}.info --output-file ${Coverage_NAME}.total
COMMAND ${LCOV_PATH} --gcov-tool ${GCOV_PATH} --remove ${Coverage_NAME}.total ${COVERAGE_LCOV_EXCLUDES} --output-file ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
COMMAND ${GENHTML_PATH} -o ${Coverage_NAME} ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
COMMAND ${CMAKE_COMMAND} -E remove ${Coverage_NAME}.base ${Coverage_NAME}.total ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
DEPENDS ${Coverage_DEPENDENCIES}
COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report."
)
# Show where to find the lcov info report
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
COMMAND ;
COMMENT "Lcov code coverage info report saved in ${Coverage_NAME}.info."
)
# Show info where to find the report
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
COMMAND ;
COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report."
)
endfunction() # SETUP_TARGET_FOR_COVERAGE_LCOV
# Defines a target for running and collection code coverage information # Defines a target for running and collection code coverage information
# Builds dependencies, runs the given executable and outputs reports. # Builds dependencies, runs the given executable and outputs reports.
# NOTE! The executable should always have a ZERO as exit code otherwise # NOTE! The executable should always have a ZERO as exit code otherwise
# the coverage generation will not complete. # the coverage generation will not complete.
# #
# SETUP_TARGET_FOR_COVERAGE_GCOVR_XML( # SETUP_TARGET_FOR_COVERAGE_GCOVR(
# NAME ctest_coverage # New target name # NAME ctest_coverage # New target name
# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR # EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
# DEPENDENCIES executable_target # Dependencies to build first # DEPENDENCIES executable_target # Dependencies to build first
# ) # )
function(SETUP_TARGET_FOR_COVERAGE_GCOVR_XML) function(SETUP_TARGET_FOR_COVERAGE_GCOVR)
set(options NONE) set(options NONE)
set(oneValueArgs NAME) set(oneValueArgs NAME SOURCES_ROOT)
set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES) set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT SIMPLE_PYTHON_EXECUTABLE)
message(FATAL_ERROR "python not found! Aborting...")
endif() # NOT SIMPLE_PYTHON_EXECUTABLE
if(NOT GCOVR_PATH) if(NOT GCOVR_PATH)
message(FATAL_ERROR "gcovr not found! Aborting...") message(FATAL_ERROR "gcovr not found! Aborting...")
endif() # NOT GCOVR_PATH endif() # NOT GCOVR_PATH
# Combine excludes to several -e arguments # Combine excludes to several -e arguments
set(GCOVR_EXCLUDES "") set(GCOVR_EXCLUDES "")
foreach(EXCLUDE ${COVERAGE_GCOVR_EXCLUDES}) foreach(EXCLUDE ${COVERAGE_EXCLUDES})
list(APPEND GCOVR_EXCLUDES "-e") list(APPEND GCOVR_EXCLUDES "-e")
list(APPEND GCOVR_EXCLUDES "${EXCLUDE}") list(APPEND GCOVR_EXCLUDES "${EXCLUDE}")
endforeach() endforeach()
add_custom_target(${Coverage_NAME} add_custom_target(${Coverage_NAME}
# Run tests # Run tests
${Coverage_EXECUTABLE} COMMAND ctest -C $<CONFIG> $ENV{ARGS} $$ARGS
# Running gcovr
COMMAND ${GCOVR_PATH} --xml
-r ${PROJECT_SOURCE_DIR} ${GCOVR_EXCLUDES}
--object-directory=${PROJECT_BINARY_DIR}
-o ${Coverage_NAME}.xml
WORKING_DIRECTORY ${PROJECT_BINARY_DIR} WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
DEPENDS ${Coverage_DEPENDENCIES} DEPENDS ${Coverage_DEPENDENCIES}
COMMENT "Running gcovr to produce Cobertura code coverage report."
) )
# Show info where to find the report if("html" IN_LIST CMAKE_COVERAGE_FORMAT)
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
COMMAND ; # Create folder
COMMENT "Cobertura code coverage report saved in ${Coverage_NAME}.xml." COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/${Coverage_NAME}-html
)
endfunction() # SETUP_TARGET_FOR_COVERAGE_GCOVR_XML # Running gcovr HTML
COMMAND ${GCOVR_PATH} --html --html-details
-r ${Coverage_SOURCES_ROOT} ${GCOVR_EXCLUDES}
--object-directory=${PROJECT_BINARY_DIR}
--exclude-unreachable-branches --exclude-throw-branches
-o ${Coverage_NAME}-html/index.html
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
COMMENT "Running gcovr to produce HTML code coverage report ${Coverage_NAME}-html."
)
endif()
if("xml" IN_LIST CMAKE_COVERAGE_FORMAT)
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
# Running gcovr TXT
COMMAND ${GCOVR_PATH} --xml
-r ${Coverage_SOURCES_ROOT} ${GCOVR_EXCLUDES}
--object-directory=${PROJECT_BINARY_DIR}
--exclude-unreachable-branches --exclude-throw-branches
-o ${Coverage_NAME}.xml
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
COMMENT "Running gcovr to produce XML code coverage report ${Coverage_NAME}.xml."
)
endif()
if("txt" IN_LIST CMAKE_COVERAGE_FORMAT)
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
# Running gcovr TXT
COMMAND ${GCOVR_PATH}
-r ${Coverage_SOURCES_ROOT} ${GCOVR_EXCLUDES}
--object-directory=${PROJECT_BINARY_DIR}
--exclude-unreachable-branches --exclude-throw-branches
-o ${Coverage_NAME}.txt
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
COMMENT "Running gcovr to produce TXT code coverage report ${Coverage_NAME}.txt."
)
endif()
endfunction() # SETUP_TARGET_FOR_COVERAGE_GCOVR
# Defines a target for running and collection code coverage information # Defines a target for running and collection code coverage information
# Builds dependencies, runs the given executable and outputs reports. # Builds dependencies, runs the given executable and outputs reports.
# NOTE! The executable should always have a ZERO as exit code otherwise # NOTE! The executable should always have a ZERO as exit code otherwise
# the coverage generation will not complete. # the coverage generation will not complete.
# #
# SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML( # SETUP_TARGET_FOR_COVERAGE_LLVM(
# NAME ctest_coverage # New target name # NAME ctest_coverage # New target name
# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR # EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
# DEPENDENCIES executable_target # Dependencies to build first # DEPENDENCIES executable_target # Dependencies to build first
# ) # )
function(SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML) function(SETUP_TARGET_FOR_COVERAGE_LLVM)
set(options NONE) set(options NONE)
set(oneValueArgs NAME) set(oneValueArgs NAME SOURCES_ROOT PROF_FILE)
set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES) set(multiValueArgs EXECUTABLE BINARY EXECUTABLE_ARGS DEPENDENCIES)
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT SIMPLE_PYTHON_EXECUTABLE) if(XCRUN_PATH)
message(FATAL_ERROR "python not found! Aborting...") set(LLVM_COV_PATH ${XCRUN_PATH} llvm-cov)
endif() # NOT SIMPLE_PYTHON_EXECUTABLE set(LLVM_PROFDATA_PATH ${XCRUN_PATH} llvm-profdata)
else()
if(NOT LLVM_COV_PATH)
message(FATAL_ERROR "llvm-cov not found! Aborting...")
endif() # NOT LLVM_COV_PATH
if(NOT LLVM_PROFDATA_PATH)
message(FATAL_ERROR "llvm-profdata not found! Aborting...")
endif() # NOT LLVM_PROFDATA_PATH
endif() # XCRUN_PATH
if(NOT GCOVR_PATH) set(LLVM_PROFILE_DIR ${PROJECT_BINARY_DIR}/llvm_profile)
message(FATAL_ERROR "gcovr not found! Aborting...") file(REMOVE_RECURSE ${LLVM_PROFILE_DIR})
endif() # NOT GCOVR_PATH
# Combine excludes to several -e arguments set(COV_EXCLUDES "")
set(GCOVR_EXCLUDES "") foreach(EXCLUDE ${COVERAGE_EXCLUDES})
foreach(EXCLUDE ${COVERAGE_GCOVR_EXCLUDES}) list(APPEND COV_EXCLUDES "-ignore-filename-regex=${EXCLUDE}")
list(APPEND GCOVR_EXCLUDES "-e")
list(APPEND GCOVR_EXCLUDES "${EXCLUDE}")
endforeach() endforeach()
list(GET Coverage_BINARY 0 COV_BINARY)
if(Coverage_BINARY)
list(REMOVE_AT Coverage_BINARY 0)
foreach(BIN ${Coverage_BINARY})
list(APPEND COV_BINARY -object ${BIN})
endforeach()
endif()
add_custom_target(${Coverage_NAME} add_custom_target(${Coverage_NAME}
# Run tests COMMAND ${CMAKE_COMMAND} -E env LLVM_PROFILE_FILE=${LLVM_PROFILE_DIR}/profile-%p.profraw ctest -C $<CONFIG> $$ARGS
${Coverage_EXECUTABLE}
# Create folder COMMAND ${LLVM_PROFDATA_PATH} merge -sparse ${LLVM_PROFILE_DIR}/* -o coverage.profdata
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/${Coverage_NAME} WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
DEPENDS ${Coverage_DEPENDENCIES})
# Running gcovr if("html" IN_LIST CMAKE_COVERAGE_FORMAT)
COMMAND ${GCOVR_PATH} --html --html-details add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
-r ${PROJECT_SOURCE_DIR} ${GCOVR_EXCLUDES} COMMAND ${LLVM_COV_PATH} show -instr-profile=coverage.profdata ${COV_BINARY}
--object-directory=${PROJECT_BINARY_DIR} --format=html --output-dir=${Coverage_NAME}-html ${COV_EXCLUDES} ${Coverage_SOURCES_ROOT}
-o ${Coverage_NAME}/index.html WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
WORKING_DIRECTORY ${PROJECT_BINARY_DIR} COMMENT "Running llvm-cov to produce HTML code coverage report ${Coverage_NAME}-html")
DEPENDS ${Coverage_DEPENDENCIES} endif()
COMMENT "Running gcovr to produce HTML code coverage report."
)
# Show info where to find the report if("xml" IN_LIST CMAKE_COVERAGE_FORMAT)
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD message(WARNING "XML coverage report format not supported for llvm-cov")
COMMAND ; endif()
COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report."
) if("txt" IN_LIST CMAKE_COVERAGE_FORMAT)
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
COMMAND ${LLVM_COV_PATH} show -instr-profile=coverage.profdata ${COV_BINARY}
--format=text ${COV_EXCLUDES} ${Coverage_SOURCES_ROOT} > ${Coverage_NAME}.txt
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
COMMENT "Running llvm-cov to produce TXT code coverage report ${Coverage_NAME}.txt.")
endif()
endfunction() # SETUP_TARGET_FOR_COVERAGE_LLVM
endfunction() # SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML
function(APPEND_COVERAGE_COMPILER_FLAGS) function(APPEND_COVERAGE_COMPILER_FLAGS)
message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}") endfunction() # APPEND_COVERAGE_COMPILER_FLAGS
endfunction() # APPEND_COVERAGE_COMPILER_FLAGS

View File

@@ -1,36 +0,0 @@
# Copyright (C) 2017 KeePassXC Team
#
# 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/>.
find_path(ARGON2_INCLUDE_DIR argon2.h)
if(MINGW)
# find static library on Windows, and redefine used symbols to
# avoid definition name conflicts with libsodium
find_library(ARGON2_SYS_LIBRARIES libargon2.a)
message(STATUS "Patching libargon2...\n")
execute_process(COMMAND objcopy
--redefine-sym argon2_hash=libargon2_argon2_hash
--redefine-sym _argon2_hash=_libargon2_argon2_hash
--redefine-sym argon2_error_message=libargon2_argon2_error_message
--redefine-sym _argon2_error_message=_libargon2_argon2_error_message
${ARGON2_SYS_LIBRARIES} ${CMAKE_BINARY_DIR}/libargon2_patched.a
WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
find_library(ARGON2_LIBRARIES libargon2_patched.a PATHS ${CMAKE_BINARY_DIR} NO_DEFAULT_PATH)
else()
find_library(ARGON2_LIBRARIES argon2)
endif()
mark_as_advanced(ARGON2_LIBRARIES ARGON2_INCLUDE_DIR)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Argon2 DEFAULT_MSG ARGON2_LIBRARIES ARGON2_INCLUDE_DIR)

106
cmake/FindBotan2.cmake Normal file
View File

@@ -0,0 +1,106 @@
# Copyright (c) 2018 Ribose Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#.rst:
# FindBotan2
# -----------
#
# Find the botan-2 library.
#
# IMPORTED Targets
# ^^^^^^^^^^^^^^^^
#
# This module defines :prop_tgt:`IMPORTED` targets:
#
# ``Botan2::Botan2``
# The botan-2 library, if found.
#
# Result variables
# ^^^^^^^^^^^^^^^^
#
# This module defines the following variables:
#
# ::
#
# BOTAN2_FOUND - true if the headers and library were found
# BOTAN2_INCLUDE_DIRS - where to find headers
# BOTAN2_LIBRARIES - list of libraries to link
# BOTAN2_VERSION - library version that was found, if any
# find the headers
find_path(BOTAN2_INCLUDE_DIR
NAMES botan/version.h
PATH_SUFFIXES botan-2
)
# find the library
find_library(BOTAN2_LIBRARY NAMES botan-2 libbotan-2 botan)
# determine the version
if(BOTAN2_INCLUDE_DIR AND EXISTS "${BOTAN2_INCLUDE_DIR}/botan/build.h")
file(STRINGS "${BOTAN2_INCLUDE_DIR}/botan/build.h" botan2_version_str
REGEX "^#define[\t ]+(BOTAN_VERSION_[A-Z]+)[\t ]+[0-9]+")
string(REGEX REPLACE ".*#define[\t ]+BOTAN_VERSION_MAJOR[\t ]+([0-9]+).*"
"\\1" _botan2_version_major "${botan2_version_str}")
string(REGEX REPLACE ".*#define[\t ]+BOTAN_VERSION_MINOR[\t ]+([0-9]+).*"
"\\1" _botan2_version_minor "${botan2_version_str}")
string(REGEX REPLACE ".*#define[\t ]+BOTAN_VERSION_PATCH[\t ]+([0-9]+).*"
"\\1" _botan2_version_patch "${botan2_version_str}")
set(BOTAN2_VERSION "${_botan2_version_major}.${_botan2_version_minor}.${_botan2_version_patch}"
CACHE INTERNAL "The version of Botan which was detected")
endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Botan2
REQUIRED_VARS BOTAN2_LIBRARY BOTAN2_INCLUDE_DIR
VERSION_VAR BOTAN2_VERSION
)
if(BOTAN2_FOUND)
set(BOTAN2_INCLUDE_DIRS ${BOTAN2_INCLUDE_DIR} ${PC_BOTAN2_INCLUDE_DIRS})
set(BOTAN2_LIBRARIES ${BOTAN2_LIBRARY})
endif()
if(BOTAN2_FOUND AND NOT TARGET Botan2::Botan2)
# create the new library target
add_library(Botan2::Botan2 UNKNOWN IMPORTED)
# set the required include dirs for the target
if(BOTAN2_INCLUDE_DIRS)
set_target_properties(Botan2::Botan2
PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${BOTAN2_INCLUDE_DIRS}"
)
endif()
# set the required libraries for the target
if(EXISTS "${BOTAN2_LIBRARY}")
set_target_properties(Botan2::Botan2
PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
IMPORTED_LOCATION "${BOTAN2_LIBRARY}"
)
endif()
endif()
mark_as_advanced(BOTAN2_INCLUDE_DIR BOTAN2_LIBRARY)

View File

@@ -1,31 +0,0 @@
# Copyright (C) 2011 Felix Geyer <debfx@fobos.de>
#
# 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/>.
find_path(GCRYPT_INCLUDE_DIR gcrypt.h)
find_library(GCRYPT_LIBRARIES gcrypt)
mark_as_advanced(GCRYPT_LIBRARIES GCRYPT_INCLUDE_DIR)
if(GCRYPT_INCLUDE_DIR AND EXISTS "${GCRYPT_INCLUDE_DIR}/gcrypt.h")
file(STRINGS "${GCRYPT_INCLUDE_DIR}/gcrypt.h" GCRYPT_H REGEX "^#define GCRYPT_VERSION \"[^\"]*\"$")
string(REGEX REPLACE "^.*GCRYPT_VERSION \"([0-9]+).*$" "\\1" GCRYPT_VERSION_MAJOR "${GCRYPT_H}")
string(REGEX REPLACE "^.*GCRYPT_VERSION \"[0-9]+\\.([0-9]+).*$" "\\1" GCRYPT_VERSION_MINOR "${GCRYPT_H}")
string(REGEX REPLACE "^.*GCRYPT_VERSION \"[0-9]+\\.[0-9]+\\.([0-9]+).*$" "\\1" GCRYPT_VERSION_PATCH "${GCRYPT_H}")
set(GCRYPT_VERSION_STRING "${GCRYPT_VERSION_MAJOR}.${GCRYPT_VERSION_MINOR}.${GCRYPT_VERSION_PATCH}")
endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Gcrypt DEFAULT_MSG GCRYPT_LIBRARIES GCRYPT_INCLUDE_DIR)

9
cmake/FindMinizip.cmake Normal file
View File

@@ -0,0 +1,9 @@
# MINIZIP_FOUND - Minizip library was found
# MINIZIP_INCLUDE_DIR - Path to Minizip include dir
# MINIZIP_LIBRARIES - List of Minizip libraries
find_library(MINIZIP_LIBRARIES NAMES minizip libminizip)
find_path(MINIZIP_INCLUDE_DIR zip.h PATH_SUFFIXES minizip)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Minizip DEFAULT_MSG MINIZIP_LIBRARIES MINIZIP_INCLUDE_DIR)

39
cmake/FindPCSC.cmake Normal file
View File

@@ -0,0 +1,39 @@
# Copyright (C) 2021 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/>.
# Use pkgconfig on Linux
if(NOT WIN32)
find_package(PkgConfig QUIET)
pkg_check_modules(PCSC libpcsclite)
endif()
if(NOT PCSC_FOUND)
# Search for PC/SC headers on Mac and Windows
find_path(PCSC_INCLUDE_DIRS winscard.h
HINTS
${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}
/usr/include/PCSC
PATH_SUFFIXES PCSC)
# MAC library is PCSC, Windows library is WinSCard
find_library(PCSC_LIBRARIES NAMES pcsclite libpcsclite WinSCard PCSC
HINTS
${CMAKE_C_IMPLICIT_LINK_DIRECTORIES})
endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(PCSC DEFAULT_MSG PCSC_LIBRARIES PCSC_INCLUDE_DIRS)
mark_as_advanced(PCSC_LIBRARIES PCSC_INCLUDE_DIRS)

View File

@@ -13,8 +13,15 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
find_path(QRENCODE_INCLUDE_DIR qrencode.h) find_path(QRENCODE_INCLUDE_DIR NAMES qrencode.h)
find_library(QRENCODE_LIBRARY qrencode)
if (VCPKG_INSTALLED_DIR)
find_library(QRENCODE_LIBRARY_RELEASE qrencode)
find_library(QRENCODE_LIBRARY_DEBUG qrencoded)
set(QRENCODE_LIBRARY optimized ${QRENCODE_LIBRARY_RELEASE} debug ${QRENCODE_LIBRARY_DEBUG})
else()
find_library(QRENCODE_LIBRARY qrencode)
endif()
mark_as_advanced(QRENCODE_LIBRARY QRENCODE_INCLUDE_DIR) mark_as_advanced(QRENCODE_LIBRARY QRENCODE_INCLUDE_DIR)

View File

@@ -1,24 +0,0 @@
# QUAZIP_FOUND - QuaZip library was found
# QUAZIP_INCLUDE_DIR - Path to QuaZip include dir
# QUAZIP_INCLUDE_DIRS - Path to QuaZip and zlib include dir (combined from QUAZIP_INCLUDE_DIR + ZLIB_INCLUDE_DIR)
# QUAZIP_LIBRARIES - List of QuaZip libraries
# QUAZIP_ZLIB_INCLUDE_DIR - The include dir of zlib headers
if(MINGW)
find_library(QUAZIP_LIBRARIES libquazip5)
find_path(QUAZIP_INCLUDE_DIR quazip.h PATH_SUFFIXES quazip5)
find_path(QUAZIP_ZLIB_INCLUDE_DIR zlib.h)
else()
find_library(QUAZIP_LIBRARIES
NAMES quazip5 quazip
PATHS /usr/lib /usr/lib64 /usr/local/lib
)
find_path(QUAZIP_INCLUDE_DIR quazip.h
PATHS /usr/include /usr/local/include
PATH_SUFFIXES quazip5 quazip
)
find_path(QUAZIP_ZLIB_INCLUDE_DIR zlib.h PATHS /usr/include /usr/local/include)
endif()
include(FindPackageHandleStandardArgs)
set(QUAZIP_INCLUDE_DIRS ${QUAZIP_INCLUDE_DIR} ${QUAZIP_ZLIB_INCLUDE_DIR})
find_package_handle_standard_args(QUAZIP DEFAULT_MSG QUAZIP_LIBRARIES QUAZIP_INCLUDE_DIR QUAZIP_ZLIB_INCLUDE_DIR QUAZIP_INCLUDE_DIRS)

View File

@@ -47,4 +47,3 @@ mark_as_advanced(
Readline_INCLUDE_DIR Readline_INCLUDE_DIR
Readline_LIBRARY Readline_LIBRARY
) )

View File

@@ -1,27 +0,0 @@
# Copyright (C) 2014 Kyle Manna <kyle@kylemanna.com>
#
# 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/>.
find_path(YUBIKEY_CORE_INCLUDE_DIR yubikey.h)
find_path(YUBIKEY_PERS_INCLUDE_DIR ykcore.h PATH_SUFFIXES ykpers-1)
set(YUBIKEY_INCLUDE_DIRS ${YUBIKEY_CORE_INCLUDE_DIR} ${YUBIKEY_PERS_INCLUDE_DIR})
find_library(YUBIKEY_CORE_LIBRARY NAMES yubikey.dll libyubikey.so yubikey)
find_library(YUBIKEY_PERS_LIBRARY NAMES ykpers-1.dll libykpers-1.so ykpers-1)
set(YUBIKEY_LIBRARIES ${YUBIKEY_CORE_LIBRARY} ${YUBIKEY_PERS_LIBRARY})
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(YubiKey DEFAULT_MSG YUBIKEY_LIBRARIES YUBIKEY_INCLUDE_DIRS)
mark_as_advanced(YUBIKEY_LIBRARIES YUBIKEY_INCLUDE_DIRS)

View File

@@ -1,267 +0,0 @@
# Written in 2016 by Henrik Steffen Gaßmann <henrik@gassmann.onl>
#
# To the extent possible under law, the author(s) have dedicated all
# copyright and related and neighboring rights to this software to the
# public domain worldwide. This software is distributed without any warranty.
#
# You should have received a copy of the CC0 Public Domain Dedication
# along with this software. If not, see
#
# http://creativecommons.org/publicdomain/zero/1.0/
#
########################################################################
# Tries to find the local libsodium installation.
#
# On Windows the sodium_DIR environment variable is used as a default
# hint which can be overridden by setting the corresponding cmake variable.
#
# Once done the following variables will be defined:
#
# sodium_FOUND
# sodium_INCLUDE_DIR
# sodium_LIBRARY_DEBUG
# sodium_LIBRARY_RELEASE
#
#
# Furthermore an imported "sodium" target is created.
#
if (CMAKE_C_COMPILER_ID STREQUAL "GNU"
OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
set(_GCC_COMPATIBLE 1)
endif()
# static library option
option(sodium_USE_STATIC_LIBS "enable to statically link against sodium")
if(NOT (sodium_USE_STATIC_LIBS EQUAL sodium_USE_STATIC_LIBS_LAST))
unset(sodium_LIBRARY CACHE)
unset(sodium_LIBRARY_DEBUG CACHE)
unset(sodium_LIBRARY_RELEASE CACHE)
unset(sodium_DLL_DEBUG CACHE)
unset(sodium_DLL_RELEASE CACHE)
set(sodium_USE_STATIC_LIBS_LAST ${sodium_USE_STATIC_LIBS} CACHE INTERNAL "internal change tracking variable")
endif()
########################################################################
# UNIX
if (UNIX)
# import pkg-config
find_package(PkgConfig QUIET)
if (PKG_CONFIG_FOUND)
pkg_check_modules(sodium_PKG QUIET libsodium)
endif()
if(sodium_USE_STATIC_LIBS)
set(XPREFIX sodium_PKG_STATIC)
else()
set(XPREFIX sodium_PKG)
endif()
find_path(sodium_INCLUDE_DIR sodium.h
HINTS ${${XPREFIX}_INCLUDE_DIRS}
)
find_library(sodium_LIBRARY_DEBUG NAMES ${${XPREFIX}_LIBRARIES} sodium
HINTS ${${XPREFIX}_LIBRARY_DIRS}
)
find_library(sodium_LIBRARY_RELEASE NAMES ${${XPREFIX}_LIBRARIES} sodium
HINTS ${${XPREFIX}_LIBRARY_DIRS}
)
########################################################################
# Windows
elseif (WIN32)
set(sodium_DIR "$ENV{sodium_DIR}" CACHE FILEPATH "sodium install directory")
mark_as_advanced(sodium_DIR)
find_path(sodium_INCLUDE_DIR sodium.h
HINTS ${sodium_DIR}
PATH_SUFFIXES include
)
if (MSVC)
# detect target architecture
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/arch.c" [=[
#if defined _M_IX86
#error ARCH_VALUE x86_32
#elif defined _M_X64
#error ARCH_VALUE x86_64
#endif
#error ARCH_VALUE unknown
]=])
try_compile(_UNUSED_VAR "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/arch.c"
OUTPUT_VARIABLE _COMPILATION_LOG
)
string(REGEX REPLACE ".*ARCH_VALUE ([a-zA-Z0-9_]+).*" "\\1" _TARGET_ARCH "${_COMPILATION_LOG}")
# construct library path
if (_TARGET_ARCH STREQUAL "x86_32")
string(APPEND _PLATFORM_PATH "Win32")
elseif(_TARGET_ARCH STREQUAL "x86_64")
string(APPEND _PLATFORM_PATH "x64")
else()
message(FATAL_ERROR "the ${_TARGET_ARCH} architecture is not supported by Findsodium.cmake.")
endif()
string(APPEND _PLATFORM_PATH "/$$CONFIG$$")
if (MSVC_VERSION LESS 1900)
math(EXPR _VS_VERSION "${MSVC_VERSION} / 10 - 60")
else()
math(EXPR _VS_VERSION "${MSVC_VERSION} / 10 - 50")
endif()
string(APPEND _PLATFORM_PATH "/v${_VS_VERSION}")
if (sodium_USE_STATIC_LIBS)
string(APPEND _PLATFORM_PATH "/static")
else()
string(APPEND _PLATFORM_PATH "/dynamic")
endif()
string(REPLACE "$$CONFIG$$" "Debug" _DEBUG_PATH_SUFFIX "${_PLATFORM_PATH}")
string(REPLACE "$$CONFIG$$" "Release" _RELEASE_PATH_SUFFIX "${_PLATFORM_PATH}")
find_library(sodium_LIBRARY_DEBUG libsodium.lib
HINTS ${sodium_DIR}
PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX}
)
find_library(sodium_LIBRARY_RELEASE libsodium.lib
HINTS ${sodium_DIR}
PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX}
)
if (NOT sodium_USE_STATIC_LIBS)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll")
find_library(sodium_DLL_DEBUG libsodium
HINTS ${sodium_DIR}
PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX}
)
find_library(sodium_DLL_RELEASE libsodium
HINTS ${sodium_DIR}
PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX}
)
endif()
elseif(_GCC_COMPATIBLE)
if (sodium_USE_STATIC_LIBS)
find_library(sodium_LIBRARY_DEBUG libsodium.a
HINTS ${sodium_DIR}
PATH_SUFFIXES lib
)
find_library(sodium_LIBRARY_RELEASE libsodium.a
HINTS ${sodium_DIR}
PATH_SUFFIXES lib
)
else()
find_library(sodium_LIBRARY_DEBUG libsodium.dll.a
HINTS ${sodium_DIR}
PATH_SUFFIXES lib
)
find_library(sodium_LIBRARY_RELEASE libsodium.dll.a
HINTS ${sodium_DIR}
PATH_SUFFIXES lib
)
file(GLOB _DLL
LIST_DIRECTORIES false
RELATIVE "${sodium_DIR}/bin"
"${sodium_DIR}/bin/libsodium*.dll"
)
find_library(sodium_DLL_DEBUG ${_DLL} libsodium
HINTS ${sodium_DIR}
PATH_SUFFIXES bin
)
find_library(sodium_DLL_RELEASE ${_DLL} libsodium
HINTS ${sodium_DIR}
PATH_SUFFIXES bin
)
endif()
else()
message(FATAL_ERROR "this platform is not supported by FindSodium.cmake")
endif()
########################################################################
# unsupported
else()
message(FATAL_ERROR "this platform is not supported by FindSodium.cmake")
endif()
########################################################################
# common stuff
# extract sodium version
if (sodium_INCLUDE_DIR)
set(_VERSION_HEADER "${_INCLUDE_DIR}/sodium/version.h")
if (EXISTS _VERSION_HEADER)
file(READ "${_VERSION_HEADER}" _VERSION_HEADER_CONTENT)
string(REGEX REPLACE ".*#[ \t]*define[ \t]*SODIUM_VERSION_STRING[ \t]*\"([^\n]*)\".*" "\\1"
sodium_VERSION "${_VERSION_HEADER_CONTENT}")
set(sodium_VERSION "${sodium_VERSION}" PARENT_SCOPE)
endif()
endif()
# communicate results
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(sodium
REQUIRED_VARS
sodium_LIBRARY_RELEASE
sodium_LIBRARY_DEBUG
sodium_INCLUDE_DIR
VERSION_VAR
sodium_VERSION
)
# mark file paths as advanced
mark_as_advanced(sodium_INCLUDE_DIR)
mark_as_advanced(sodium_LIBRARY_DEBUG)
mark_as_advanced(sodium_LIBRARY_RELEASE)
if (WIN32)
mark_as_advanced(sodium_DLL_DEBUG)
mark_as_advanced(sodium_DLL_RELEASE)
endif()
# create imported target
if(sodium_USE_STATIC_LIBS)
set(_LIB_TYPE STATIC)
else()
set(_LIB_TYPE SHARED)
endif()
add_library(sodium ${_LIB_TYPE} IMPORTED)
set_target_properties(sodium PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${sodium_INCLUDE_DIR}"
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
)
if (sodium_USE_STATIC_LIBS)
set_target_properties(sodium PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "SODIUM_STATIC"
IMPORTED_LOCATION "${sodium_LIBRARY_RELEASE}"
IMPORTED_LOCATION_DEBUG "${sodium_LIBRARY_DEBUG}"
)
else()
if (UNIX)
set_target_properties(sodium PROPERTIES
IMPORTED_LOCATION "${sodium_LIBRARY_RELEASE}"
IMPORTED_LOCATION_DEBUG "${sodium_LIBRARY_DEBUG}"
)
elseif (WIN32)
set_target_properties(sodium PROPERTIES
IMPORTED_IMPLIB "${sodium_LIBRARY_RELEASE}"
IMPORTED_IMPLIB_DEBUG "${sodium_LIBRARY_DEBUG}"
)
if (NOT (sodium_DLL_DEBUG MATCHES ".*-NOTFOUND"))
set_target_properties(sodium PROPERTIES
IMPORTED_LOCATION_DEBUG "${sodium_DLL_DEBUG}"
)
endif()
if (NOT (sodium_DLL_RELEASE MATCHES ".*-NOTFOUND"))
set_target_properties(sodium PROPERTIES
IMPORTED_LOCATION_RELWITHDEBINFO "${sodium_DLL_RELEASE}"
IMPORTED_LOCATION_MINSIZEREL "${sodium_DLL_RELEASE}"
IMPORTED_LOCATION_RELEASE "${sodium_DLL_RELEASE}"
)
endif()
endif()
endif()

View File

@@ -0,0 +1,3 @@
if (CMAKE_INSTALL_PREFIX MATCHES "/ZIP/")
file(TOUCH "${CMAKE_INSTALL_PREFIX}/.portable")
endif()

8
codecov.yaml Normal file
View File

@@ -0,0 +1,8 @@
coverage:
range: 60..80
round: nearest
precision: 2
fixes:
- "*/src/::"
comment:
require_changes: true

View File

@@ -16,51 +16,44 @@
find_program(ASCIIDOCTOR_EXE asciidoctor) find_program(ASCIIDOCTOR_EXE asciidoctor)
if(NOT ASCIIDOCTOR_EXE) if(NOT ASCIIDOCTOR_EXE)
message(FATAL_ERROR "asciidoctor is required to build documentation") message(FATAL_ERROR "asciidoctor is required to build documentation")
else()
message(STATUS "Using asciidoctor: ${ASCIIDOCTOR_EXE}")
endif() endif()
message(STATUS "Using asciidoctor: ${ASCIIDOCTOR_EXE}")
set(DOC_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(DOC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) set(OUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
set(REV -a revnumber=${KEEPASSXC_VERSION})
# Build html documentation on all platforms # Build html documentation on all platforms
file(GLOB html_depends ${DOC_DIR}/topics/* ${DOC_DIR}/styles/* ${DOC_DIR}/images/*) # NOTE: Combine into one long command to prevent MSVC from failing to build all docs
add_custom_command(OUTPUT KeePassXC_GettingStarted.html file(GLOB doc_depends ${DOC_DIR}/*.adoc ${DOC_DIR}/topics/* ${DOC_DIR}/styles/* ${DOC_DIR}/images/*)
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_GettingStarted.html ${DOC_DIR}/GettingStarted.adoc add_custom_command(
DEPENDS ${html_depends} ${DOC_DIR}/GettingStarted.adoc OUTPUT KeePassXC_GettingStarted.html KeePassXC_UserGuide.html KeePassXC_KeyboardShortcuts.html
VERBATIM) COMMAND
add_custom_command(OUTPUT KeePassXC_UserGuide.html ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_GettingStarted.html ${REV} ${DOC_DIR}/GettingStarted.adoc &&
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_UserGuide.html ${DOC_DIR}/UserGuide.adoc ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_UserGuide.html ${REV} ${DOC_DIR}/UserGuide.adoc &&
DEPENDS ${html_depends} ${DOC_DIR}/UserGuide.adoc ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_KeyboardShortcuts.html ${REV} ${DOC_DIR}/topics/KeyboardShortcuts.adoc
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${doc_depends}
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 ${styles_depends}
VERBATIM) VERBATIM)
add_custom_target(docs ALL DEPENDS KeePassXC_GettingStarted.html KeePassXC_UserGuide.html KeePassXC_KeyboardShortcuts.html) add_custom_target(docs ALL DEPENDS KeePassXC_GettingStarted.html KeePassXC_UserGuide.html KeePassXC_KeyboardShortcuts.html)
install(FILES install(FILES
${OUT_DIR}/KeePassXC_GettingStarted.html ${OUT_DIR}/KeePassXC_GettingStarted.html
${OUT_DIR}/KeePassXC_UserGuide.html ${OUT_DIR}/KeePassXC_UserGuide.html
${OUT_DIR}/KeePassXC_KeyboardShortcuts.html ${OUT_DIR}/KeePassXC_KeyboardShortcuts.html
DESTINATION ${DATA_INSTALL_DIR}/docs) DESTINATION ${DATA_INSTALL_DIR}/docs)
# Build Man Pages on Linux and macOS # Build Man Pages on Linux and macOS
if(APPLE OR UNIX) if(UNIX)
add_custom_command(OUTPUT keepassxc.1 add_custom_command(OUTPUT keepassxc.1 keepassxc-cli.1
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -b manpage ${DOC_DIR}/man/keepassxc.1.adoc COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -b manpage ${REV} ./man/keepassxc.1.adoc
DEPENDS ${DOC_DIR}/man/keepassxc.1.adoc COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -b manpage ${REV} ./man/keepassxc-cli.1.adoc
VERBATIM) DEPENDS ${DOC_DIR}/man/keepassxc.1.adoc ${DOC_DIR}/man/keepassxc-cli.1.adoc
add_custom_command(OUTPUT keepassxc-cli.1 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -b manpage ${DOC_DIR}/man/keepassxc-cli.1.adoc
DEPENDS ${DOC_DIR}/man/keepassxc-cli.1.adoc
VERBATIM) VERBATIM)
add_custom_target(manpages ALL DEPENDS keepassxc.1 keepassxc-cli.1) add_custom_target(manpages ALL DEPENDS keepassxc.1 keepassxc-cli.1)
install(FILES install(FILES
${OUT_DIR}/keepassxc.1 ${OUT_DIR}/keepassxc.1
${OUT_DIR}/keepassxc-cli.1 ${OUT_DIR}/keepassxc-cli.1
DESTINATION ${CMAKE_INSTALL_MANDIR}/man1/) DESTINATION ${CMAKE_INSTALL_MANDIR}/man1/)

68
docs/FuzzTest.md Normal file
View File

@@ -0,0 +1,68 @@
# Fuzz-Testing KeePassXC
Fuzz-testing = feeding random input into a program until it crashes. Be smart about what's "random" by looking at how the program executes the input.
We use the "American Fuzzy Lop" (AFL) fuzz tester (https://lcamtuf.coredump.cx/afl/).
The following assumes that all tools and libraries required to build KeePassXC from source have already been installed.
## Installing AFL
$ sudo apt install afl
Optionally, build AFL from source:
$ git clone https://github.com/google/AFL
$ cd AFL
$ make
$ make install
## Building KeePassXC For Fuzzing
A special "instrumented build" is used that allows the fuzzer to look into the program as it executes. We place it in its own build directory so it doesn't confused with the production build.
$ cd your_keepassxc_source_directory
$ mkdir buildafl
$ cd buildafl
$ CXX=afl-g++ AFL_HARDEN=1 cmake -DWITH_XC_ALL=ON ..
$ make
In the source code, special behavior for fuzz testing can be implemented with `#ifdef __AFL_COMPILER`. For example, in fuzz builds, the KeePassXC CLI takes the database password from environment variable `KEYPASSXC_AFL_PASSWORD` to allow non-interactive operation.
## Prepare Fuzzer Input
To get the fuzzer started, we provide empty password database files (the password is `secret`).
$ cd buildafl
$ mkdir -p findings/testcases
$ cp ../share/empty*.kdbx findings/testcases
The fuzzer works by running KeePassXC with variations of this input, mutated in ways that make the program crash or hang.
## Run The Fuzzer
$ cd buildafl
$ KEYPASSXC_AFL_PASSWORD=secret afl-fuzz -i findings/testcases -o findings -m 2000 -t 1000 src/cli/keepassxc-cli ls @@
This fuzz-tests the `ls` command of the KeePassXC CLI, which loads and decrypts a database file and then lists its contents. The parameters mean:
* `KEYPASSXC_AFL_PASSWORD=secret`: In fuzz test builds, the KeePassXC CLI takes the database password from this environment variable.
* `-i findings/testcases`: The directory which contains the initial fuzzer input.
* `-o findings`: The directory in which to store fuzzer results.
* `-m 2000`: Fuzzer memory (in megabytes). Adjust as required if the fuzzer fails to start up.
* `-t 1000`: Timeout until a hang is detected (in milliseconds).
* `src/cli/keepassxc-cli`: The instrumented executable.
* `ls`: The subcommand we're testing.
* `@@`: The fuzzer replaces this by the name of a file with the generated input.
You may also need `export AFL_SKIP_CPUFREQ=1`.
If KeePassXC crashes or hangs when processing the input, the fuzzer writes the database file (that was used in place of `@@`) to the `findings/crashes` or `findings/hangs` directory, respectively.
To continue where the fuzzer left off, use `-i -`. To start over, remove and re-create the `findings` directory.
## More Information
AFL documentation: https://afl-1.readthedocs.io/en/latest/
Read this if you want to get serious about fuzz-testing.

View File

@@ -1,6 +1,5 @@
= KeePassXC: Getting Started Guide = KeePassXC: Getting Started Guide
KeePassXC Team <team@keepassxc.org> KeePassXC Team <team@keepassxc.org>
v2.6.0
:data-uri: :data-uri:
:linkcss!: :linkcss!:
:homepage: https://keepassxc.org :homepage: https://keepassxc.org

View File

@@ -1,6 +1,5 @@
= KeePassXC: User Guide = KeePassXC: User Guide
KeePassXC Team <team@keepassxc.org> KeePassXC Team <team@keepassxc.org>
v2.6.0
:data-uri: :data-uri:
:homepage: https://keepassxc.org :homepage: https://keepassxc.org
:icons: font :icons: font
@@ -35,3 +34,5 @@ include::topics/AutoType.adoc[tags=*]
include::topics/KeeShare.adoc[tags=*] include::topics/KeeShare.adoc[tags=*]
include::topics/SSHAgent.adoc[tags=*] include::topics/SSHAgent.adoc[tags=*]
include::topics/Reference.adoc[tags=*]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -16,4 +16,5 @@
== COPYRIGHT == COPYRIGHT
Copyright \(C) 2016-2020 KeePassXC Team <team@keepassxc.org> Copyright \(C) 2016-2020 KeePassXC Team <team@keepassxc.org>
*KeePassXC* code is licensed under GPL-2 or GPL-3. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License, either version 2 or version 3.
There is NO WARRANTY, to the extent permitted by law.

View File

@@ -15,9 +15,9 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
= keepassxc-cli(1) = keepassxc-cli(1)
:docdate: 2020-07-10 KeePassXC Team <team@keepassxc.org>
:docdate: 2020-08-31
:doctype: manpage :doctype: manpage
:revnumber: 2.6.0
:mansource: KeePassXC {revnumber} :mansource: KeePassXC {revnumber}
:manmanual: General Commands Manual :manmanual: General Commands Manual
@@ -38,14 +38,25 @@ It provides the ability to query and modify the entries of a KeePass database, d
The same password generation options as documented for the generate command can be used when the *-g* option is set. The same password generation options as documented for the generate command can be used when the *-g* option is set.
*analyze* [_options_] <__database__>:: *analyze* [_options_] <__database__>::
Analyzes passwords in a database for weaknesses. Analyzes passwords in a database for weaknesses using offline HIBP SHA-1 hash lookup.
*attachment-export* [_options_] <__database__> <__entry__> <__attachment_name__> <__export_file__>::
Exports the content of an attachment to a specified file.
Use *--stdout* option to instead output the contents of the attachment to stdout.
*attachment-import* [_options_] <__database__> <__entry__> <__attachment_name__> <__import_file__>::
Imports the attachment into an entry.
An existing attachment with the same name may be overwritten if the *-f* option is specified.
*attachment-rm* <__database__> <__entry__> <__attachment_name__>::
Removes the named attachment from an entry.
*clip* [_options_] <__database__> <__entry__> [_timeout_]:: *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. 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 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. 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. 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. Optionally, a timeout in seconds can be specified to automatically clear the clipboard, the default timeout is 10 seconds, set to 0 to disable.
*close*:: *close*::
In interactive mode, closes the currently opened database (see *open*). In interactive mode, closes the currently opened database (see *open*).
@@ -84,10 +95,11 @@ It provides the ability to query and modify the entries of a KeePass database, d
Displays a list of available commands, or detailed information about the specified command. Displays a list of available commands, or detailed information about the specified command.
*import* [_options_] <__xml__> <__database__>:: *import* [_options_] <__xml__> <__database__>::
Imports the contents of an XML database to the target database. Imports the contents of an XML exported database to a new created database
with a password and/or key file.
*locate* [_options_] <__database__> <__term__>:: The key file will be created if the file that is referred to does not exist.
Locates all the entries that match a specific search term in a database. If both the key file and password are empty, no database will be created.
The new database will be in kdbx 4 format.
*ls* [_options_] <__database__> [_group_]:: *ls* [_options_] <__database__> [_group_]::
Lists the contents of a group in a database. Lists the contents of a group in a database.
@@ -122,6 +134,9 @@ It provides the ability to query and modify the entries of a KeePass database, d
If the database has a recycle bin, the group will be moved there. If the database has a recycle bin, the group will be moved there.
If the group is already in the recycle bin, it will be removed permanently. If the group is already in the recycle bin, it will be removed permanently.
*search* [_options_] <__database__> <__term__>::
Searches all entries that match a specific search term in a database.
*show* [_options_] <__database__> <__entry__>:: *show* [_options_] <__database__> <__entry__>::
Shows the title, username, password, URL and notes of a database entry. Shows the title, username, password, URL and notes of a database entry.
Can also show the current TOTP. Can also show the current TOTP.
@@ -177,6 +192,9 @@ The same password generation options as documented for the generate command can
*--url* <__url__>:: *--url* <__url__>::
Specifies the URL of the entry. Specifies the URL of the entry.
*--notes* <__notes__>::
Specifies the notes of the entry.
*-p*, *--password-prompt*:: *-p*, *--password-prompt*::
Uses a password prompt for the entry's password. Uses a password prompt for the entry's password.
@@ -197,6 +215,10 @@ The same password generation options as documented for the generate command can
Such files are available from https://haveibeenpwned.com/Passwords; Such files are available from https://haveibeenpwned.com/Passwords;
note that they are large, and so this operation typically takes some time (minutes up to an hour or so). note that they are large, and so this operation typically takes some time (minutes up to an hour or so).
*--okon* <__okon-cli path__>::
Use the specified okon-cli program to perform offline breach checks. You can obtain okon-cli from https://github.com/stryku/okon.
When using this option, *-H, --hibp* must point to a post-processed okon file (e.g. file.okon).
=== Clip options === Clip options
*-a*, *--attribute*:: *-a*, *--attribute*::
Copies the specified attribute to the clipboard. Copies the specified attribute to the clipboard.
@@ -208,7 +230,12 @@ The same password generation options as documented for the generate command can
Copies the current TOTP instead of the specified attribute to the clipboard. Copies the current TOTP instead of the specified attribute to the clipboard.
Will report an error if no TOTP is configured for the entry. Will report an error if no TOTP is configured for the entry.
=== Create options *-b*, *--best*::
Try to find and copy to clipboard a unique entry matching the input
If a unique matching entry is found it will be copied to the clipboard.
If multiple entries are found they will be listed to refine the search. (no clip performed)
=== Create and Import options
*-k*, *--set-key-file* <__path__>:: *-k*, *--set-key-file* <__path__>::
Set the key file for the database. Set the key file for the database.
@@ -228,6 +255,9 @@ The same password generation options as documented for the generate command can
*-s*, *--show-protected*:: *-s*, *--show-protected*::
Shows the protected attributes in clear text. Shows the protected attributes in clear text.
*--show-attachments*::
Shows the attachment names along with the size of the attachments.
*-t*, *--totp*:: *-t*, *--totp*::
Also shows the current TOTP, reporting an error if no TOTP is configured for the entry. Also shows the current TOTP, reporting an error if no TOTP is configured for the entry.
@@ -240,6 +270,7 @@ The same password generation options as documented for the generate command can
Sets the Path of the wordlist for the diceware generator. Sets the Path of the wordlist for the diceware generator.
The wordlist must have > 1000 words, otherwise the program will fail. The wordlist must have > 1000 words, otherwise the program will fail.
If the wordlist has < 4000 words a warning will be printed to STDERR. If the wordlist has < 4000 words a warning will be printed to STDERR.
Any *diceware*-compatible wordlist can used. Note however that *KeePassXC* will NOT verify the PGP signature of signed wordlists.
=== Export options === Export options
*-f*, *--format*:: *-f*, *--format*::
@@ -292,11 +323,11 @@ The same password generation options as documented for the generate command can
Include characters from every selected group. Include characters from every selected group.
[Default: Disabled] [Default: Disabled]
include::section-notes.adoc[] include::includes/section-notes.adoc[]
== AUTHOR == AUTHOR
This manual page was originally written by Manolis Agkopian <m.agkopian@gmail.com>. This manual page was originally written by Manolis Agkopian <m.agkopian@gmail.com>.
include::section-reporting-bugs.adoc[] include::includes/section-reporting-bugs.adoc[]
include::section-copyright.adoc[] include::includes/section-copyright.adoc[]

View File

@@ -15,9 +15,9 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
= keepassxc(1) = keepassxc(1)
:docdate: 2020-07-10 KeePassXC Team <team@keepassxc.org>
:docdate: 2020-08-31
:doctype: manpage :doctype: manpage
:revnumber: 2.6.0
:mansource: KeePassXC {revnumber} :mansource: KeePassXC {revnumber}
:manmanual: General Commands Manual :manmanual: General Commands Manual
@@ -55,11 +55,11 @@ Your wallet works offline and requires no Internet connection.
*--debug-info*:: *--debug-info*::
Displays debugging information. Displays debugging information.
include::section-notes.adoc[] include::includes/section-notes.adoc[]
== AUTHOR == AUTHOR
This manual page was originally written by Janek Bevendorff <janek@jbev.net>. This manual page was originally written by Janek Bevendorff <janek@jbev.net>.
include::section-reporting-bugs.adoc[] include::includes/section-reporting-bugs.adoc[]
include::section-copyright.adoc[] include::includes/section-copyright.adoc[]

View File

@@ -1,5 +1,4 @@
KeePassXC Team <team@keepassxc.org> KeePassXC Team <team@keepassxc.org>
v2.6.0
:data-uri: :data-uri:
:homepage: https://keepassxc.org :homepage: https://keepassxc.org
:stylesheet: ../styles/dark.css :stylesheet: ../styles/dark.css

View File

@@ -31,26 +31,9 @@ To configure Auto-Type sequences for your entries, perform the following steps:
.Auto-Type entry sequences .Auto-Type entry sequences
image::autotype_entry_sequences.png[] image::autotype_entry_sequences.png[]
2. _(Optional)_ Define a custom auto-type sequence for each window title match by selecting the _Use specific sequence for this association_ checkbox. Sequence action codes and field placeholders are detailed in the following table. A complete list of supported actions and placeholders can be found at https://keepass.info/help/base/autotype.html#autoseq[KeePass Auto-Type Action Codes] and https://keepass.info/help/base/placeholders.html[KeePass Placeholders]. Action codes and placeholders are not case sensitive. 2. _(Optional)_ Define a custom Auto-Type sequence for each window title match by selecting the _Use specific sequence for this association_ checkbox. Sequence action codes and field placeholders are detailed in the following table. Beyond the most important ones detailed below, there are additional action codes and placeholders available: xref:UserGuide.adoc#_auto_type_actions[Auto-Type Actions Reference] and xref:UserGuide.adoc#_entry_placeholders[Entry Placeholders Reference]. Action codes and placeholders are not case sensitive.
+ +
[grid=rows, frame=none, width=70%] [grid=rows, frame=none, width=90%]
|===
|Action Code |Description
|{TAB}, {ENTER}, {SPACE}, {INSERT}, {DELETE}, {HOME}, {END}, {PGUP}, {PGDN}, {BACKSPACE}, {CAPSLOCK}, {ESC}
|Press the corresponding keyboard key
|{UP}, {DOWN}, {LEFT}, {RIGHT} |Press the corresponding arrow key
|{F1}, {F2}, ..., {F16} |Press F1, F2, etc.
|{LEFTBRACE}, {RIGHTBRACE} |Press `{` or `}`, respectively
|{DELAY=X} |Set key press delay to X milliseconds
|{DELAY X} |Delay typing start by X milliseconds
|{CLEARFIELD} |Clear the input field before typing
|{TOTP} |Insert calculated TOTP value (if configured)
|{<ACTION> X} |Repeat <ACTION> X times (e.g., {SPACE 5} inserts five spaces)
|===
+
[grid=rows, frame=none, width=70%]
|=== |===
|Placeholder |Description |Placeholder |Description
@@ -60,21 +43,44 @@ image::autotype_entry_sequences.png[]
|{URL} |URL |{URL} |URL
|{NOTES} |Notes |{NOTES} |Notes
|{TOTP} |Current TOTP value (if configured) |{TOTP} |Current TOTP value (if configured)
|{DT_SIMPLE} |Current date-time
|{DB_DIR} |Absolute directory path for database file
|{S:<ATTRIBUTE_NAME>} |Value for the given attribute name |{S:<ATTRIBUTE_NAME>} |Value for the given attribute name
|{REF:<FIELD>@<SEARCH_IN>:<SEARCH_TEXT>} |Search for a field in another entry using the reference syntax. |===
+
[grid=rows, frame=none, width=90%]
|===
|Action Code |Description
|{TAB}, {ENTER}, {SPACE}, {INSERT}, {DELETE}, {HOME}, {END}, {PGUP}, {PGDN}, {BACKSPACE}, {CAPSLOCK}, {ESC}
|Press the corresponding keyboard key
|{UP}, {DOWN}, {LEFT}, {RIGHT} |Press the corresponding arrow key
|{LEFTBRACE}, {RIGHTBRACE} |Press `{` or `}`, respectively
|{<KEY> X} |Repeat <KEY> X times (e.g., {SPACE 5} inserts five spaces)
|{DELAY=X} |Set delay between key presses to X milliseconds
|{DELAY X} |Pause typing for X milliseconds
|{CLEARFIELD} |Clear the input field
|{PICKCHARS} |Pick specific password characters from a dialog
|=== |===
=== Performing Global Auto-Type === Performing Global Auto-Type
The global Auto-Type keyboard shortcut is used when you have focus on the window you want to type into. To make use of this feature, you must have previously configured an Auto-Type hotkey. The global Auto-Type keyboard shortcut is used when you have focus on the window you want to type into. To make use of this feature, you must have previously configured an Auto-Type hotkey.
Pressing the global Auto-Type hotkey cause KeePassXC to search the database for entries that match the window title. Multiple matches may be returned and will cause the sequence selection dialog to appear. Click on a sequence line will immediately execute the Auto-Type action. A search box is also available in case numerous matches are returned. When you press the global Auto-Type hotkey, KeePassXC searches all unlocked databases for entries that match the focused window title. The Auto-Type selection dialog will appear in the following circumstances: there are no matches found, there are multiple matches found, or the setting "Always ask before performing Auto-Type" is enabled. The selection is remembered for a short while to help retype with the same entry in quick succession.
.Auto-Type sequence selection .Auto-Type sequence selection
image::autotype_selection_dialog.png[,70%] image::autotype_selection_dialog.png[,70%]
TIP: The _Sequence_ column will only appear when there are different sequences defined by one or more entries displayed in the selection dialog. Perform the selected Auto-Type sequence by double clicking the desired row or pressing _Enter_. Press the up and down arrows to navigate the list. Sequences can be filtered through the text edit field.
.Auto-Type search database
image::autotype_selection_dialog_search.png[,70%]
Search the unlocked databases by activating Search Database radio button. Use the text edit field to issue search queries using the same syntax as database searching.
.Additional Auto-Type choices
image::autotype_selection_dialog_type_menu.png[,70%]
The option to type just the username, password, or current TOTP value is available by right clicking the desired row or expanding the Type Sequence button options.
=== Performing Entry-Level Auto-Type === Performing Entry-Level Auto-Type
You can quickly activate the default Auto-Type sequence for a particular entry using Entry-Level Auto-Type. For this operation, the KeePassXC window will be minimized and the Auto-Type sequence occurs in the previously selected window. You can perform Entry-Level Auto-Type from the toolbar icon *(A)*, entry context menu *(B)*, or by pressing `Ctrl+Shift+V`. You can quickly activate the default Auto-Type sequence for a particular entry using Entry-Level Auto-Type. For this operation, the KeePassXC window will be minimized and the Auto-Type sequence occurs in the previously selected window. You can perform Entry-Level Auto-Type from the toolbar icon *(A)*, entry context menu *(B)*, or by pressing `Ctrl+Shift+V`.
@@ -83,4 +89,4 @@ WARNING: Be careful when using Entry-Level Auto-Type as you can inadvertently ty
.Entry-Level Auto-Type .Entry-Level Auto-Type
image::autotype_entrylevel.png[] image::autotype_entrylevel.png[]
// end::content[] // end::content[]

View File

@@ -23,6 +23,10 @@ You can download the KeePassXC-Browser extension from your web browser. To downl
2. Click the button to install/add the extension to the browser. Accept any confirmation dialogs. 2. Click the button to install/add the extension to the browser. Accept any confirmation dialogs.
// tag::advanced[]
NOTE: When Microsoft Edge is installed as a managed application, system administrators are required to deploy a custom native messaging configuration. Instructions for this are found in the advanced section below.
// end::advanced[]
=== Configure KeePassXC-Browser === Configure KeePassXC-Browser
To start using KeePassXC-Browser, you must configure it so that it can communicate with the KeePassXC application on your desktop. To start using KeePassXC-Browser, you must configure it so that it can communicate with the KeePassXC application on your desktop.
@@ -44,7 +48,7 @@ image::browser_settings.png[]
.Connect Extension to KeePassXC .Connect Extension to KeePassXC
image::browser_extension_connect.png[,80%] image::browser_extension_connect.png[,80%]
6. Click the _Connect_ button *(B)* in the pop-up window to complete integrating the KeePassXC-Browser extension with your KeePassXC desktop application. 6. Click the _Connect_ button *(B)* in the pop-up window to complete integrating the KeePassXC-Browser extension with your KeePassXC desktop application.
7. You are now prompted to enter a unique name to identify the connection between this browser and your database. Enter a unique name in the field (e.g., firefox-laptop) and click the _Save and allow access_ button. 7. You are now prompted to enter a unique name to identify the connection between this browser and your database. Enter a unique name in the field (e.g., firefox-laptop) and click the _Save and allow access_ button.
+ +
@@ -58,7 +62,7 @@ The KeePassXC-Browser extension lets you automatically populate the entries from
1. Open your KeePassXC desktop application and unlock your database. 1. Open your KeePassXC desktop application and unlock your database.
2. Open your web browser. The KeePassXC-Browser extension icon in your browser window will change based on its connection state. The figure below shows the different states. 2. Open your web browser. The KeePassXC-Browser extension icon in your browser window will change based on its connection state. The figure below shows the different states.
+ +
*(A)* KeePassXC is not running or is disconnected + *(A)* KeePassXC is not running or is disconnected +
*(B)* Connected to KeePassXC, but database is locked + *(B)* Connected to KeePassXC, but database is locked +
@@ -77,7 +81,7 @@ image::browser_extension_reload.png[,80%]
.Confirm Access Dialog .Confirm Access Dialog
image::browser_confirm_access_dialog.png[,80%] image::browser_confirm_access_dialog.png[,80%]
5. Ensure the credentials you want use are checked, then click *(A)* Remember _(optional)_, then click _Allow Selected_ *(B)*. 5. Ensure the credentials you want to use are checked, then click *(A)* Remember _(optional)_, then click _Allow Selected_ *(B)*.
6. In your website, the KeePassXC icon will appear in the username field of the login form *(A)*. Click the icon to populate the field with your stored credentials. If you have more than one credential for this website, a dropdown will appear to choose the one to use. 6. In your website, the KeePassXC icon will appear in the username field of the login form *(A)*. Click the icon to populate the field with your stored credentials. If you have more than one credential for this website, a dropdown will appear to choose the one to use.
+ +
@@ -104,5 +108,38 @@ WARNING: We do not recommend changing any of these settings as they may break th
.Advanced browser settings .Advanced browser settings
image::browser_advanced_settings.png[] image::browser_advanced_settings.png[]
=== Advanced Setup
==== Managed Microsoft Edge on Windows
1. Deploy *org.keepassxc.keepassxc_browser_edge.json* to, for example, `C:\ProgramData\KeepassXC` on all managed platforms.
+
----
{
"allowed_origins": [
"chrome-extension://pdffhmdngciaglkoonimfcmckehcpafo/"
],
"description": "KeePassXC integration with native messaging support",
"name": "org.keepassxc.keepassxc_browser",
"path": "C:\\Program Files\\KeePassXC\\keepassxc-proxy.exe",
"type": "stdio"
}
----
2. Configure GPO options (registry result):
+
----
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Edge\NativeMessagingHosts\org.keepassxc.keepassxc_browser]
@="C:\ProgramData\KeepassXC\org.keepassxc.keepassxc_browser_edge.json"
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge]
"NativeMessagingUserLevelHosts"=dword:00000000
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge\ExtensionInstallAllowlist]
"1"="pdffhmdngciaglkoonimfcmckehcpafo"
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge\NativeMessagingAllowlist]
"1"="org.keepassxc.keepassxc_browser"
----
// end::advanced[] // end::advanced[]
// end::content[] // end::content[]

View File

@@ -101,7 +101,7 @@ NOTE: You can disable the recycle bin within the Database Settings. If the recyc
Creating a clone of an entry provides you a ready-to-use template for creating new entries with similar details of a master entry. Creating a clone of an entry provides you a ready-to-use template for creating new entries with similar details of a master entry.
To create a clone of an existing entry, perform the following steps: To create a clone of an existing entry, perform the following steps:
1. Right-click on the entry for which you want to create a clone and select _Clone Entry_. Alternatively, select the desired entry and press `Ctrl+K`. 1. Right-click on the entry for which you want to create a clone and select _Clone Entry_. Alternatively, select the desired entry and press `Ctrl+K`.
+ +
.Clone entry from context menu .Clone entry from context menu
@@ -120,18 +120,7 @@ image::clone_entry_dialog.png[,70%]
.References in a cloned entry .References in a cloned entry
image::clone_entry_references.png[] image::clone_entry_references.png[]
4. You can create your own references using the following syntax: 4. You can create your own references using the xref:UserGuide.adoc#_entry_cross_reference[Entry Reference Syntax]
+
`{REF:<ShortCode>@I:<UUID>}`
+
Where `<UUID>` is the Unique Identifier of the entry to pull data from and `<ShortCode>` is from the following:
+
* T - Title
* U - Username
* P - Password
* A - URL
* N - Notes
* I - UUID
== Searching the Database == Searching the Database
KeePassXC provides an enhanced and granular search features the enables you to search for specific entries in the databases using the different modifiers, wild card characters, and logical operators. KeePassXC provides an enhanced and granular search features the enables you to search for specific entries in the databases using the different modifiers, wild card characters, and logical operators.
@@ -182,11 +171,14 @@ The following tables lists a few samples search queries for your reference:
|`+user:johnsmith -url:www.google.com *notes:"secret note \d"` |`+user:johnsmith -url:www.google.com *notes:"secret note \d"`
|Search the username field for exactly johnsmith, the URL must not contain www.google.com, and notes contains secret note [digit]. |Search the username field for exactly johnsmith, the URL must not contain www.google.com, and notes contains secret note [digit].
|`+attr:mystring123`
|Searches all Additional Attributes for any name OR value equal to mystring123.
|=== |===
== Advanced Entry Options == Advanced Entry Options
=== Additional Attributes === Additional Attributes
A lot of applications and web sites now require to provide additional information when you create accounts. The additional information is used to block hackers if any suspicious activity is detected. In addition, the additional information you provide can be used to reset passwords if you forget them. You can also store arbitrary information here that can be copied to the clipboard or Auto-Typed using the `{S:<ATTR_NAME}` action code. A lot of applications and web sites now require to provide additional information when you create accounts. The additional information is used to block hackers if any suspicious activity is detected. In addition, the additional information you provide can be used to reset passwords if you forget them. You can also store arbitrary information here that can be copied to the clipboard or Auto-Typed using the `{S:<ATTR_NAME>}` action code.
To protect an attribute from being displayed by default, activate the _Protect_ checkbox *(A)*. To show the contents of the attribute while keeping it protected, press the _Reveal_ button *(B)*. To protect an attribute from being displayed by default, activate the _Protect_ checkbox *(A)*. To show the contents of the attribute while keeping it protected, press the _Reveal_ button *(B)*.
@@ -239,7 +231,7 @@ NOTE: Restoring an old history item will store the current entry settings as a n
== Automatic Database Opening == 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. 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`. TIP: Case matters with auto open, the group name must be exactly `AutoOpen` and it must be a child of the root group.
.AutoOpen Group and Entries .AutoOpen Group and Entries
image::autoopen.png[] image::autoopen.png[]
@@ -287,6 +279,8 @@ image::database_security.png[]
+ +
.Database credentials .Database credentials
image::database_security_credentials.png[] image::database_security_credentials.png[]
+
WARNING: Consider creating a backup of your YubiKey. Please refer to <<Creating a YubiKey backup>>
5. Encryption settings allows you to change the average time it takes to encrypt and decrypt the database. The longer time that is chosen, the harder it will be to brute force attack your database. *We recommend a setting of one second.* 5. Encryption settings allows you to change the average time it takes to encrypt and decrypt the database. The longer time that is chosen, the harder it will be to brute force attack your database. *We recommend a setting of one second.*
+ +
@@ -305,6 +299,23 @@ The following key derivation functions are supported:
* AES-KDF (KDBX 4 and KDBX 3.1): This key derivation function is based on iterating AES. Users can change the number of iterations. The more iterations, the harder are dictionary and guessing attacks, but also database loading/saving takes more time (linearly). KDBX 3.1 only supports AES-KDF; any other key derivation function, like for instance Argon2, requires KDBX 4. * AES-KDF (KDBX 4 and KDBX 3.1): This key derivation function is based on iterating AES. Users can change the number of iterations. The more iterations, the harder are dictionary and guessing attacks, but also database loading/saving takes more time (linearly). KDBX 3.1 only supports AES-KDF; any other key derivation function, like for instance Argon2, requires KDBX 4.
* Argon2 (KDBX 4 - recommended): KDBX 4, the Argon2 key derivation function can be used for transforming the composite master key (as protection against dictionary attacks). The main advantage of Argon2 over AES-KDF is that it provides a better resistance against GPU/ASIC attacks (due to being a memory-hard function). The number of iterations scales linearly with the required time. By increasing the memory parameter, GPU/ASIC attacks become harder (and the required time increases). The parallelism parameter can be used to specify how many threads should be used. * Argon2 (KDBX 4 - recommended): KDBX 4, the Argon2 key derivation function can be used for transforming the composite master key (as protection against dictionary attacks). The main advantage of Argon2 over AES-KDF is that it provides a better resistance against GPU/ASIC attacks (due to being a memory-hard function). The number of iterations scales linearly with the required time. By increasing the memory parameter, GPU/ASIC attacks become harder (and the required time increases). The parallelism parameter can be used to specify how many threads should be used.
=== Creating a YubiKey backup
It is advisable to have a backup replica YubiKey In case your main YubiKey gets damaged, lost, or stolen. The same HMAC key will need to be written to both keys. To do this you can either use the YubiKey Personalization Tool GUI or the ykpersonalize CLI tool. The steps for the CLI tool are shown:
1. Create a 20 byte HMAC key:
+
```
dd status=none if=/dev/random bs=20 count=1 | xxd -p -c 40
```
2. Write the HMAC key to slot 2 _(Set through the first switch. Out of the box the YubiKey OTP resides in slot 1)_:
+
```
ykpersonalize -2 -a -ochal-resp -ochal-hmac -ohmac-lt64 -oserial-api-visible -oallow-update
```
You will be asked to enter the HMAC key you created earlier, copy/paste they key output in the first step. Repeat both steps for your second YubiKey. We recommend storing your HMAC key in a safe place (e.g., printed on paper) in case you need to recreate another key.
// end::advanced[] // end::advanced[]
== Storing a Database File == Storing a Database File

View File

@@ -60,3 +60,5 @@ To install the KeePassXC app on macOS, double click on the downloaded DMG file a
image::macos_install.png[,80%] image::macos_install.png[,80%]
// end::content[] // end::content[]
// tag::advanced[]
// end::advanced[]

View File

@@ -61,4 +61,11 @@ WARNING: Exporting your database will result in all of your passwords and sensit
.Database export menu .Database export menu
image::export_database.png[,80%] image::export_database.png[,80%]
The HTML export file is intended to be human-readable (viewed/printed in a web browser) rather than machine-readable (re-imported into another database file). The intention of HTML export is to provide a "paper backup" functionality for those who want to ensure access to their passwords in case of catastrophic failure of IT infrastructure. To create a paper backup, export the database to an HTML file, print the file with your web browser, then delete the file.
WARNING: Creating a paper backup exposes your passwords to potentially insecure components, like printer drivers on your computer or software inside the printer. Make sure all these components can be trusted.
For more information, check out the https://keepassxc.org/blog/2020-10-03-paper-backup/[blog article about paper backups].
// end::content[] // end::content[]

View File

@@ -22,10 +22,11 @@ image::password_generator.png[]
5. Use the regenerate button (Ctrl + R) to make a new password using the chosen options. 5. Use the regenerate button (Ctrl + R) to make a new password using the chosen options.
6. Use the clipboard button (Ctrl + C) to copy the generated password to the clipboard. 6. Use the clipboard button (Ctrl + C) to copy the generated password to the clipboard.
// tag::advanced[] // tag::advanced[]
7. Click the Advanced button to specify additional conditions for your desired password. 7. Click the Advanced button to specify additional conditions for your desired password.
+ +
.Advanced Password Generator Options .Advanced Password Generator Options
image::password_generator_advanced.png[] image::password_generator_advanced.png[]
8. When generating a password for an entry, click the Apply Password button (Ctrl + S or Ctrl + Enter) to close the window and apply your changes.
=== Generating Passphrases === Generating Passphrases
A passphrase is a sequence of words or other text used to control access to your applications and data. A passphrase is similar to a password in usage, but is generally longer for added security. To generate the random passphrase using Password Generator, perform the following steps: A passphrase is a sequence of words or other text used to control access to your applications and data. A passphrase is similar to a password in usage, but is generally longer for added security. To generate the random passphrase using Password Generator, perform the following steps:
@@ -40,5 +41,6 @@ Word Count slider.
3. In the Word Separator field, enter a character, word, number, or space that you want to use a separator between the words in your passphrase. 3. In the Word Separator field, enter a character, word, number, or space that you want to use a separator between the words in your passphrase.
4. Click the Regenerate button (Ctrl + R) to generate a new random passphrase. 4. Click the Regenerate button (Ctrl + R) to generate a new random passphrase.
5. Click the Clipboard button (Ctrl + C) to copy the passphrase to the clipboard. 5. Click the Clipboard button (Ctrl + C) to copy the passphrase to the clipboard.
6. When generating a password for an entry, click the Apply Password button (Ctrl + S or Ctrl + Enter) to close the window and apply your changes.
// end::advanced[] // end::advanced[]
// end::content[] // end::content[]

View File

@@ -0,0 +1,94 @@
= KeePassXC - Reference
include::.sharedheader[]
:imagesdir: ../images
// tag::content[]
== Reference
This section contains full details on advanced features available in KeePassXC.
=== Entry Placeholders
[grid=rows, frame=none, width=90%]
|===
|Placeholder |Description
|{TITLE} |Entry Title
|{USERNAME} |Username
|{PASSWORD} |Password
|{URL} |URL
|{NOTES} |Notes
|{TOTP} |Current TOTP value (if configured)
|{S:<ATTRIBUTE_NAME>} |Value for the given attribute (case sensitive)
|{URL:RMVSCM} |URL without scheme (e.g., https)
|{URL:WITHOUTSCHEME} |URL without scheme
|{URL:SCM} |URL Scheme
|{URL:SCHEME} |URL Scheme
|{URL:HOST} |URL Host (e.g., example.com)
|{URL:PORT} |URL Port
|{URL:PATH} |URL Path (e.g., /path/to/page.html)
|{URL:QUERY} |URL Query String
|{URL:FRAGMENT} |URL Fragment
|{URL:USERINFO} |URL Username:Password
|{URL:USERNAME} |URL Username
|{URL:PASSWORD} |URL Password
|{DT_SIMPLE} |Current Date-Time (yyyyMMddhhmmss)
|{DT_YEAR} |Current Year (yyyy)
|{DT_MONTH} |Current Month (MM)
|{DT_DAY} |Current Day (dd)
|{DT_HOUR} |Current Hour (hh)
|{DT_MINUTE} |Current Minutes (mm)
|{DT_SECOND} |Current Seconds (ss)
|{DT_UTC_SIMPLE} |Current UTC Date-Time (yyyyMMddhhmmss)
|{DT_UTC_YEAR} |Current UTC Year (yyyy)
|{DT_UTC_MONTH} |Current UTC Month (MM)
|{DT_UTC_DAY} |Current UTC Day (dd)
|{DT_UTC_HOUR} |Current UTC Hour (hh)
|{DT_UTC_MINUTE} |Current UTC Minutes (mm)
|{DT_UTC_SECOND} |Current UTC Seconds (ss)
|{DB_DIR} |Absolute directory path of database file
|===
=== Entry Cross-Reference
A reference to another entry's field is possible using the short-hand syntax:
`{REF:<FIELD>@<SEARCH_IN>:<SEARCH_TEXT>}`
`<FIELD>` and `<SEARCH_IN>` can be one of following:
* T - Title
* U - Username
* P - Password
* A - URL
* N - Notes
* I - UUID (found on entry properties page)
* O - Custom Attribute _(SEARCH_IN only)_
Examples: +
`{REF:U@I:033054D445C648C59092CC1D661B1B71}` +
`{REF:P@T:Other Entry}` +
`{REF:A@O:Attribute 1}`
=== Auto-Type Actions
[grid=rows, frame=none, width=90%]
|===
|Action Code |Description
|{TAB}, {ENTER}, {SPACE}, {INSERT}, {DELETE}, {HOME}, {END}, {PGUP}, {PGDN}, {BACKSPACE}, {CAPSLOCK}, {ESC}
|Press the corresponding keyboard key
|{UP}, {DOWN}, {LEFT}, {RIGHT} |Press the corresponding arrow key
|{F1}, {F2}, ..., {F16} |Press F1, F2, etc.
|{LEFTBRACE}, {RIGHTBRACE} |Press `{` or `}`, respectively
|{<KEY> X} |Repeat <KEY> X times (e.g., {SPACE 5} inserts five spaces)
|{DELAY=X} |Set delay between key presses to X milliseconds
|{DELAY X} |Pause typing for X milliseconds
|{CLEARFIELD} |Clear the input field
|{PICKCHARS} |Pick specific password characters from a dialog
|===
*Text Conversions:*
*{T-CONV:/<PLACEHOLDER>/<METHOD>/}* +
Convert resolved placeholder (e.g., {USERNAME}, {PASSWORD}, etc.) using the following methods: UPPER, LOWER, BASE64, HEX, URI, URI-DEC.
*{T-REPLACE-RX:/<PLACEHOLDER>/<SEARCH>/<REPLACE>/}* +
Use regular expressions to find and replace data from a resolved placeholder. Refer to match groups using $1, $2, etc.
// end::content[]

View File

@@ -4,7 +4,7 @@ include::.sharedheader[]
// tag::content[] // tag::content[]
== SSH Agent == SSH Agent
SSH (Secure Shell) is a widely used remote secure shell protocol and is considered an industry standard for secure remote access to UNIX-like systems including Linux, BSDs, MacOS and more recently even Windows received native support. SSH supports multiple types of authentication and the most widely used ones are either interactive keyboard input with a password or a public-key cryptography pair of keys. SSH (Secure Shell) is a widely used remote secure shell protocol and is considered an industry standard for secure remote access to UNIX-like systems including Linux, BSDs, macOS and more recently even Windows received native support. SSH supports multiple types of authentication and the most widely used ones are either interactive keyboard input with a password or a public-key cryptography pair of keys.
KeePassXC SSH Agent integration is built to manage SSH keys in a secure manner by either storing them completely within your KeePassXC database or by having only the decryption key of a key file that is stored elsewhere. SSH Agent integration _does not_ provide an agent itself but works as a client for any agent implementation that is OpenSSH compatible. KeePassXC SSH Agent integration is built to manage SSH keys in a secure manner by either storing them completely within your KeePassXC database or by having only the decryption key of a key file that is stored elsewhere. SSH Agent integration _does not_ provide an agent itself but works as a client for any agent implementation that is OpenSSH compatible.
@@ -32,18 +32,35 @@ WARNING: _GNOME Keyring_ prior to release 3.27.92 had its own custom implementat
It does not support any constraints you may want to configure for an added key. It does not support any constraints you may want to configure for an added key.
If you are running a modern distribution the custom agent has been removed and replaced with the stock OpenSSH agent which is feature complete. If you are running a modern distribution the custom agent has been removed and replaced with the stock OpenSSH agent which is feature complete.
=== OpenSSH agent on MacOS === OpenSSH agent on macOS
Apple has made OpenSSH an integrated part of MacOS with automatic agent startup when it is first used. No further configuration is needed. Apple has made OpenSSH an integrated part of macOS with automatic agent startup when it is first used. No further configuration is needed.
=== Pageant agent on Windows === OpenSSH agent and Pageant on Windows
The SSH Agent integration on Windows supports both _PuTTY Pageant_ and _OpenSSH for Windows 10_. The SSH Agent integration on Windows supports both _PuTTY Pageant_ and _OpenSSH for Windows 10_.
Since Pageant is currently still the most widely used implementation and is easily installable on any version of Windows we focus on that. Since Pageant is currently still the most widely used implementation and is easily installable on any version of Windows, it is the default on KeePassXC.
It is also the default on KeePassXC. However, Microsoft includes a native OpenSSH client implementation with Windows 10 since autumn 2018 that can be used instead. If you would like to self-manage your OpenSSH version you can use the builds offered via their official https://github.com/powershell/Win32-OpenSSH[GitHub repository].
==== Pageant
Download Pageant from the official PuTTY home page at https://www.chiark.greenend.org.uk/~sgtatham/putty/ Download Pageant from the official PuTTY home page at https://www.chiark.greenend.org.uk/~sgtatham/putty/
To use Pageant with KeePassXC, simply start it and it will minimize into the system tray and is ready to use. PuTTY and compatible tools will use Pageant automatically. To use Pageant with KeePassXC, simply start it and it will minimize into the system tray and is ready to use. PuTTY and compatible tools will use Pageant automatically.
==== OpenSSH
Make sure your Windows version has at least update 1809 installed. For more details consult the https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_overview[official documentation].
To use Windows OpenSSH the _OpenSSH Authentication Agent_ service has to be enabled first:
1. Open the Services application via the _Start Menu_, it is located in the _Windows Administrative Tools_ section
2. Select the _OpenSSH Authentication Agent_ and open its _Properties_
3. Set the _Startup type_ to _Automatic_ and start the service
Alternatively, you can use a _Windows PowerShell_ running as _Administrator_ to enable and start the service:
PS C:\Users\user> Get-Service ssh-agent | Set-Service -StartupType Automatic
PS C:\Users\user> Start-Service ssh-agent
KeePassXC and other compatible tools can now use the Windows OpenSSH agent. To use it with KeePassXC, update the settings explained in <<Setting up SSH Agent integration>>.
=== Setting up SSH Agent integration === Setting up SSH Agent integration
By default the SSH Agent integration plugin is disabled. By default the SSH Agent integration plugin is disabled.
To enable integration, follow the steps below to access the settings: To enable integration, follow the steps below to access the settings:
@@ -64,14 +81,13 @@ If the value of _SSH_AUTH_SOCK_ is empty it means the agent is not properly conf
=== Generating a key to use with KeePassXC === Generating a key to use with KeePassXC
KeePassXC only supports keys in the _OpenSSH_ format. On Windows, _PuTTYgen_ saves keys in its own format by default and you will need to convert them to OpenSSH format before being used. In this guide we are going to generate a standard RSA key in the default size. KeePassXC only supports keys in the _OpenSSH_ format. On Windows, _PuTTYgen_ saves keys in its own format by default and you will need to convert them to OpenSSH format before being used. In this guide we are going to generate a standard RSA key in the default size.
==== Generating a key on Linux or MacOS with _ssh-keygen_ ==== Generating a key on Linux or macOS with _ssh-keygen_
Open a terminal window and type the following command to generate a key: Open a terminal window and type the following command to generate a key:
$ ssh-keygen -o -f keepassxc -C johndoe@example $ ssh-keygen -o -f keepassxc -C johndoe@example
Generating public/private rsa key pair. Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): Enter passphrase (empty for no passphrase):
Enter same passphrase again: Enter same passphrase again:
Your identification has been saved in keepassxc Your identification has been saved in keepassxc
Your public key has been saved in keepassxc.pub Your public key has been saved in keepassxc.pub
The key fingerprint is: The key fingerprint is:
@@ -89,7 +105,6 @@ Open a terminal window and type the following command to generate a key:
|. ..++ooo | |. ..++ooo |
+----[SHA256]-----+ +----[SHA256]-----+
Now we can see two files were generated: Now we can see two files were generated:
$ ls -l keepassxc* $ ls -l keepassxc*
@@ -98,19 +113,59 @@ Now we can see two files were generated:
With KeePassXC you only need the first file listed. With KeePassXC you only need the first file listed.
==== Generating a key on Windows with PuTTYgen ==== Generating a key on Windows
Please read the manual on how to use PuTTYgen for details on generate a key: https://the.earth.li/~sgtatham/putty/0.74/htmldoc/Chapter8.html#pubkey-puttygen. Once generated, you must save the key in OpenSSH format, follow the image below. On Windows you can generate key pairs with _PuTTYgen_ and with _ssh-keygen_, depending on whether you installed PuTTY and your Windows version.
.Generating a key with PuTTYgen ===== Using _PuTTYgen_
Please read the manual on how to use _PuTTYgen_ for details on generate a key: https://the.earth.li/~sgtatham/putty/0.74/htmldoc/Chapter8.html#pubkey-puttygen. Once generated, you must save the key in the new OpenSSH format, see image below.
.Generating a key with _PuTTYgen_
image::sshagent_puttygen.png[,70%] image::sshagent_puttygen.png[,70%]
===== Using _ssh-keygen_
Open _Command Prompt_ or _Windows PowerShell_ and type the following command to generate a key:
PS C:\Users\user> ssh-keygen.exe -o -f keepassxc -C johndoe@example
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in keepassxc
Your public key has been saved in keepassxc.pub
The key fingerprint is:
SHA256:pN+o5AqUmijYBDUrFV/caMus9oIR61+MiWLa8fcsVYI johndoe@example
The key's randomart image is:
+---[RSA 3072]----+
| =. ..o |
| o + .+ . |
|o . .+ o. |
| o.. Eo. . |
| +o .. So |
|o*o.o+ ..o |
|Bo=+o.+.o . |
|+oo+.++o |
|. ..++ooo |
+----[SHA256]-----+
Now we can see two files were generated:
PS C:\Users\user> dir keepassxc*
Directory C:\Users\user
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 9/19/2021 12:08 PM 2655 keepassxc
-a---- 9/19/2021 12:08 PM 570 keepassxc.pub
With KeePassXC you only need the first file listed.
=== Configuring an entry to use SSH Agent === Configuring an entry to use SSH Agent
The last step is to setup an entry to contain the SSH Agent settings and key file you generated. The last step is to setup an entry to contain the SSH Agent settings and key file you generated.
1. Create a new entry, or open an existing entry in edit mode. 1. Create a new entry, or open an existing entry in edit mode.
2. Set the password you used for the key file in the password field. 2. Set the password you used for the key file in the password field.
3. Go to the advanced category and attach the key file you generated previously. 3. Go to the advanced category and attach the key file you generated previously.
4. Go to the SSH Agent category *(1)* and select the attachment from the list *(2)*. 4. Go to the SSH Agent category *(1)* and select the attachment from the list *(2)*.
5. Alternatively, you can load an external file dynamically using the file selection. 5. Alternatively, you can load an external file dynamically using the file selection.
6. Choose the options for this key. 6. Choose the options for this key.
7. Press *OK* to accept the entry. Depending on the options you chose, KeePassXC will load the key and present it for use. 7. Press *OK* to accept the entry. Depending on the options you chose, KeePassXC will load the key and present it for use.

View File

@@ -10,7 +10,7 @@ The KeePassXC interface is designed for simplicity and easy access to your infor
.Main database interface .Main database interface
image::main_interface.png[] image::main_interface.png[]
*(A) Groups* - Organize your entries into discrete groups to bring order to all of your sensitive information. Groups can be nested under each other to create a hierarchy. Settings from parent groups get applied to their children. *(A) Groups* - Organize your entries into discrete groups to bring order to all of your sensitive information. Groups can be nested under each other to create a hierarchy. Settings from parent groups get applied to their children. You can hide this panel on the View menu.
*(B) Entries* - Entries contain all the information for each website or application you are storing in KeePassXC. This view shows all the entries in the selected group. Each column can be resized, reordered, and shown or hidden based on your preference. Right click the header row to see all available options. *(B) Entries* - Entries contain all the information for each website or application you are storing in KeePassXC. This view shows all the entries in the selected group. Each column can be resized, reordered, and shown or hidden based on your preference. Right click the header row to see all available options.
@@ -46,6 +46,14 @@ For users with smaller screens or those who desire seeing more entries at once,
.Compact mode comparison .Compact mode comparison
image::compact_mode_comparison.png[] image::compact_mode_comparison.png[]
==== Copy entry Columns on Double Click
KeePassXC offers the possibility of copying certain entry columns, such as username and password, into your clipboard on double click, for a limited period of time.
This feature can be enabled by checking the box "Enable double click to copy some entry columns" in the security settings:
.Enable copying on double click
image::enable_copy_dc.png[]
=== Keyboard Shortcuts === Keyboard Shortcuts
include::KeyboardShortcuts.adoc[tag=content, leveloffset=+1] include::KeyboardShortcuts.adoc[tag=content, leveloffset=+1]

View File

@@ -44,3 +44,5 @@ KeePassXC has numerous features for novice and power users alike. This guide wil
** FreeDesktop.org Secret Service (replace Gnome keyring, etc.) ** FreeDesktop.org Secret Service (replace Gnome keyring, etc.)
** Additional encryption choices: Twofish and ChaCha20 ** Additional encryption choices: Twofish and ChaCha20
// end::content[] // end::content[]
// tag::advanced[]
// end::advanced[]

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# #
# KeePassXC Release Preparation Helper # KeePassXC Release Preparation Helper
# Copyright (C) 2017 KeePassXC team <https://keepassxc.org/> # Copyright (C) 2021 KeePassXC team <https://keepassxc.org/>
# #
# This program is free software: you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@@ -17,8 +17,9 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
printf "\e[1m\e[32mKeePassXC\e[0m Release Preparation Helper\n" printf "\e[1m\e[32mKeePassXC\e[0m Release Preparation Helper\n"
printf "Copyright (C) 2017 KeePassXC Team <https://keepassxc.org/>\n\n" printf "Copyright (C) 2021 KeePassXC Team <https://keepassxc.org/>\n\n"
set -eE -o pipefail
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
# global default values # global default values
@@ -34,33 +35,35 @@ TARGET_BRANCH="master"
TAG_NAME="" TAG_NAME=""
DOCKER_IMAGE="" DOCKER_IMAGE=""
DOCKER_CONTAINER_NAME="keepassxc-build-container" DOCKER_CONTAINER_NAME="keepassxc-build-container"
CMAKE_GENERATOR="Ninja"
CMAKE_OPTIONS="" CMAKE_OPTIONS=""
CPACK_GENERATORS="WIX;ZIP" CPACK_GENERATORS="WIX;ZIP"
COMPILER="g++" COMPILER="g++"
MAKE_OPTIONS="-j8" MAKE_OPTIONS="-j$(getconf _NPROCESSORS_ONLN)"
BUILD_PLUGINS="all" BUILD_PLUGINS="all"
INSTALL_PREFIX="/usr/local" INSTALL_PREFIX="/usr/local"
ORIG_BRANCH="" ORIG_BRANCH=""
ORIG_CWD="$(pwd)" ORIG_CWD="$(pwd)"
MACOSX_DEPLOYMENT_TARGET=10.12 MACOSX_DEPLOYMENT_TARGET=10.13
GREP="grep" GREP="grep"
TIMESTAMP_SERVER="http://timestamp.sectigo.com"
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
# helper functions # helper functions
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
printUsage() { printUsage() {
local cmd local cmd
if [ "" == "$1" ] || [ "help" == "$1" ]; then if [ -z "$1" ] || [ "help" == "$1" ]; then
cmd="COMMAND" cmd="COMMAND"
elif [ "check" == "$1" ] || [ "merge" == "$1" ] || [ "build" == "$1" ] \ elif [ "check" == "$1" ] || [ "merge" == "$1" ] || [ "build" == "$1" ] || [ "gpgsign" == "$1" ] || \
|| [ "gpgsign" == "$1" ] || [ "appsign" == "$1" ] || [ "appimage" == "$1" ]; then [ "appsign" == "$1" ] || [ "notarize" == "$1" ] || [ "appimage" == "$1" ] || [ "i18n" == "$1" ]; then
cmd="$1" cmd="$1"
else else
logError "Unknown command: '$1'\n" logError "Unknown command: '$1'\n"
cmd="COMMAND" cmd="COMMAND"
fi fi
printf "\e[1mUsage:\e[0m $(basename $0) $cmd [options]\n" printf "\e[1mUsage:\e[0m $(basename "$0") $cmd [OPTIONS, ...]\n"
if [ "COMMAND" == "$cmd" ]; then if [ "COMMAND" == "$cmd" ]; then
cat << EOF cat << EOF
@@ -71,7 +74,9 @@ Commands:
build Build and package binary release from sources build Build and package binary release from sources
gpgsign Sign previously compiled release packages with GPG gpgsign Sign previously compiled release packages with GPG
appsign Sign binaries with code signing certificates on Windows and macOS appsign Sign binaries with code signing certificates on Windows and macOS
notarize Submit macOS application DMG for notarization
help Show help for the given command help Show help for the given command
i18n Update translation files and pull from or push to Transifex
EOF EOF
elif [ "merge" == "$cmd" ]; then elif [ "merge" == "$cmd" ]; then
cat << EOF cat << EOF
@@ -113,7 +118,10 @@ Options:
--appimage Build a Linux AppImage after compilation. --appimage Build a Linux AppImage after compilation.
If this option is set, --install-prefix has no effect If this option is set, --install-prefix has no effect
--appsign Perform platform specific App Signing before packaging --appsign Perform platform specific App Signing before packaging
--timestamp Explicitly set the timestamp server to use for appsign (default: '${TIMESTAMP_SERVER}')
--vcpkg Specify VCPKG toolchain file (example: ~/vcpkg/scripts/buildsystems/vcpkg.cmake)
-k, --key Specify the App Signing Key/Identity -k, --key Specify the App Signing Key/Identity
--cmake-generator Override the default CMake generator (Default: Ninja)
-c, --cmake-options Additional CMake options for compiling the sources -c, --cmake-options Additional CMake options for compiling the sources
--compiler Compiler to use (default: '${COMPILER}') --compiler Compiler to use (default: '${COMPILER}')
-m, --make-options Make options for compiling sources (default: '${MAKE_OPTIONS}') -m, --make-options Make options for compiling sources (default: '${MAKE_OPTIONS}')
@@ -144,7 +152,18 @@ Options:
-f, --files Files to sign (required) -f, --files Files to sign (required)
-k, --key, -i, --identity -k, --key, -i, --identity
Signing Key or Apple Developer ID (required) Signing Key or Apple Developer ID (required)
--timestamp Explicitly set the timestamp server to use for appsign (default: '${TIMESTAMP_SERVER}')
-u, --username Apple username for notarization (required on macOS) -u, --username Apple username for notarization (required on macOS)
-h, --help Show this help
EOF
elif [ "notarize" == "$cmd" ]; then
cat << EOF
Submit macOS application DMG for notarization
Options:
-f, --files Files to notarize (required)
-u, --username Apple username for notarization (required)
-c, --keychain Apple keychain entry name storing the notarization -c, --keychain Apple keychain entry name storing the notarization
app password (default: 'AC_PASSWORD') app password (default: 'AC_PASSWORD')
-h, --help Show this help -h, --help Show this help
@@ -167,6 +186,16 @@ Options:
-k, --key The PGP Signing Key -k, --key The PGP Signing Key
--verbosity linuxdeploy verbosity (default: 3) --verbosity linuxdeploy verbosity (default: 3)
-h, --help Show this help -h, --help Show this help
EOF
elif [ "i18n" == "$cmd" ]; then
cat << EOF
Update translation files and pull from or push to Transifex
Subcommands:
tx-push Push source translation file to Transifex
tx-pull Pull updated translations from Transifex
lupdate Update source translation file from C++ sources
EOF EOF
fi fi
} }
@@ -184,17 +213,17 @@ logError() {
} }
init() { init() {
if [ "" == "$RELEASE_NAME" ]; then if [ -z "$RELEASE_NAME" ]; then
logError "Missing arguments, --version is required!\n" logError "Missing arguments, --version is required!\n"
printUsage "check" printUsage "check"
exit 1 exit 1
fi fi
if [ "" == "$TAG_NAME" ]; then if [ -z "$TAG_NAME" ]; then
TAG_NAME="$RELEASE_NAME" TAG_NAME="$RELEASE_NAME"
fi fi
if [ "" == "$SOURCE_BRANCH" ]; then if [ -z "$SOURCE_BRANCH" ]; then
SOURCE_BRANCH="release/${RELEASE_NAME}" SOURCE_BRANCH="release/${RELEASE_NAME}"
fi fi
@@ -257,29 +286,25 @@ checkGitRepository() {
} }
checkReleaseDoesNotExist() { checkReleaseDoesNotExist() {
git tag | $GREP -q "^$TAG_NAME$" if ! git tag | $GREP -q "^$TAG_NAME$"; then
if [ $? -eq 0 ]; then
exitError "Release '$RELEASE_NAME' (tag: '$TAG_NAME') already exists!" exitError "Release '$RELEASE_NAME' (tag: '$TAG_NAME') already exists!"
fi fi
} }
checkWorkingTreeClean() { checkWorkingTreeClean() {
git diff-index --quiet HEAD -- if ! git diff-index --quiet HEAD --; then
if [ $? -ne 0 ]; then
exitError "Current working tree is not clean! Please commit or unstage any changes." exitError "Current working tree is not clean! Please commit or unstage any changes."
fi fi
} }
checkSourceBranchExists() { checkSourceBranchExists() {
git rev-parse "$SOURCE_BRANCH" > /dev/null 2>&1 if ! git rev-parse "$SOURCE_BRANCH" > /dev/null 2>&1; then
if [ $? -ne 0 ]; then
exitError "Source branch '$SOURCE_BRANCH' does not exist!" exitError "Source branch '$SOURCE_BRANCH' does not exist!"
fi fi
} }
checkTargetBranchExists() { checkTargetBranchExists() {
git rev-parse "$TARGET_BRANCH" > /dev/null 2>&1 if ! git rev-parse "$TARGET_BRANCH" > /dev/null 2>&1; then
if [ $? -ne 0 ]; then
exitError "Target branch '$TARGET_BRANCH' does not exist!" exitError "Target branch '$TARGET_BRANCH' does not exist!"
fi fi
} }
@@ -290,18 +315,15 @@ checkVersionInCMake() {
local minor_num="$(echo ${RELEASE_NAME} | cut -f2 -d.)" local minor_num="$(echo ${RELEASE_NAME} | cut -f2 -d.)"
local patch_num="$(echo ${RELEASE_NAME} | cut -f3 -d. | cut -f1 -d-)" local patch_num="$(echo ${RELEASE_NAME} | cut -f3 -d. | cut -f1 -d-)"
$GREP -q "${app_name_upper}_VERSION_MAJOR \"${major_num}\"" CMakeLists.txt if ! $GREP -q "${app_name_upper}_VERSION_MAJOR \"${major_num}\"" CMakeLists.txt; then
if [ $? -ne 0 ]; then
exitError "${app_name_upper}_VERSION_MAJOR not updated to '${major_num}' in CMakeLists.txt!" exitError "${app_name_upper}_VERSION_MAJOR not updated to '${major_num}' in CMakeLists.txt!"
fi fi
$GREP -q "${app_name_upper}_VERSION_MINOR \"${minor_num}\"" CMakeLists.txt if ! $GREP -q "${app_name_upper}_VERSION_MINOR \"${minor_num}\"" CMakeLists.txt; then
if [ $? -ne 0 ]; then
exitError "${app_name_upper}_VERSION_MINOR not updated to '${minor_num}' in CMakeLists.txt!" exitError "${app_name_upper}_VERSION_MINOR not updated to '${minor_num}' in CMakeLists.txt!"
fi fi
$GREP -q "${app_name_upper}_VERSION_PATCH \"${patch_num}\"" CMakeLists.txt if ! $GREP -q "${app_name_upper}_VERSION_PATCH \"${patch_num}\"" CMakeLists.txt; then
if [ $? -ne 0 ]; then
exitError "${app_name_upper}_VERSION_PATCH not updated to '${patch_num}' in CMakeLists.txt!" exitError "${app_name_upper}_VERSION_PATCH not updated to '${patch_num}' in CMakeLists.txt!"
fi fi
} }
@@ -311,8 +333,7 @@ checkChangeLog() {
exitError "No CHANGELOG file found!" exitError "No CHANGELOG file found!"
fi fi
$GREP -qPzo "## ${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n" CHANGELOG.md if ! $GREP -qPzo "## ${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n" CHANGELOG.md; then
if [ $? -ne 0 ]; then
exitError "'CHANGELOG.md' has not been updated to the '${RELEASE_NAME}' release!" exitError "'CHANGELOG.md' has not been updated to the '${RELEASE_NAME}' release!"
fi fi
} }
@@ -322,8 +343,7 @@ checkAppStreamInfo() {
exitError "No AppStream info file found!" exitError "No AppStream info file found!"
fi fi
$GREP -qPzo "<release version=\"${RELEASE_NAME}\" date=\"\d{4}-\d{2}-\d{2}\">" share/linux/org.keepassxc.KeePassXC.appdata.xml if ! $GREP -qPzo "<release version=\"${RELEASE_NAME}\" date=\"\d{4}-\d{2}-\d{2}\">" share/linux/org.keepassxc.KeePassXC.appdata.xml; then
if [ $? -ne 0 ]; then
exitError "'share/linux/org.keepassxc.KeePassXC.appdata.xml' has not been updated to the '${RELEASE_NAME}' release!" exitError "'share/linux/org.keepassxc.KeePassXC.appdata.xml' has not been updated to the '${RELEASE_NAME}' release!"
fi fi
} }
@@ -334,13 +354,7 @@ checkSnapcraft() {
return return
fi fi
$GREP -qPzo "version: ${RELEASE_NAME}" snap/snapcraft.yaml if ! $GREP -qPzo "KEEPASSXC_BUILD_TYPE=Release" snap/snapcraft.yaml; then
if [ $? -ne 0 ]; then
exitError "'snapcraft.yaml' has not been updated to the '${RELEASE_NAME}' release!"
fi
$GREP -qPzo "KEEPASSXC_BUILD_TYPE=Release" snap/snapcraft.yaml
if [ $? -ne 0 ]; then
exitError "'snapcraft.yaml' is not set for a release build!" exitError "'snapcraft.yaml' is not set for a release build!"
fi fi
} }
@@ -401,7 +415,7 @@ performChecks() {
checkTargetBranchExists checkTargetBranchExists
logInfo "Checking out '${SOURCE_BRANCH}'..." logInfo "Checking out '${SOURCE_BRANCH}'..."
git checkout "$SOURCE_BRANCH" git checkout "$SOURCE_BRANCH" > /dev/null 2>&1
logInfo "Attempting to find '${RELEASE_NAME}' in various files..." logInfo "Attempting to find '${RELEASE_NAME}' in various files..."
@@ -436,7 +450,7 @@ if ! cmdExists realpath; then
fi fi
trap exitTrap SIGINT SIGTERM trap exitTrap SIGINT SIGTERM ERR
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
# check command # check command
@@ -484,6 +498,10 @@ merge() {
GPG_GIT_KEY="$2" GPG_GIT_KEY="$2"
shift ;; shift ;;
--timestamp)
TIMESTAMP_SERVER="$2"
shift ;;
-r|--release-branch) -r|--release-branch)
SOURCE_BRANCH="$2" SOURCE_BRANCH="$2"
shift ;; shift ;;
@@ -512,17 +530,17 @@ merge() {
performChecks performChecks
logInfo "Updating language files..." # Update translations
./share/translations/update.sh update i18n lupdate
./share/translations/update.sh pull i18n tx-pull
if [ 0 -ne $? ]; then if [ 0 -ne $? ]; then
exitError "Updating translations failed!" exitError "Updating translations failed!"
fi fi
git diff-index --quiet HEAD -- if ! git diff-index --quiet HEAD --; then
if [ $? -ne 0 ]; then
git add -A ./share/translations/ git add -A ./share/translations/
logInfo "Committing changes..." logInfo "Committing changes..."
if [ "" == "$GPG_GIT_KEY" ]; then if [ -z "$GPG_GIT_KEY" ]; then
git commit -m "Update translations" git commit -m "Update translations"
else else
git commit -m "Update translations" -S"$GPG_GIT_KEY" git commit -m "Update translations" -S"$GPG_GIT_KEY"
@@ -534,14 +552,14 @@ merge() {
COMMIT_MSG="Release ${RELEASE_NAME}" COMMIT_MSG="Release ${RELEASE_NAME}"
logInfo "Checking out target branch '${TARGET_BRANCH}'..." logInfo "Checking out target branch '${TARGET_BRANCH}'..."
git checkout "$TARGET_BRANCH" git checkout "$TARGET_BRANCH" > /dev/null 2>&1
logInfo "Merging '${SOURCE_BRANCH}' into '${TARGET_BRANCH}'..." logInfo "Merging '${SOURCE_BRANCH}' into '${TARGET_BRANCH}'..."
git merge "$SOURCE_BRANCH" --no-ff -m "$COMMIT_MSG" -m "${CHANGELOG}" "$SOURCE_BRANCH" -S"$GPG_GIT_KEY" git merge "$SOURCE_BRANCH" --no-ff -m "$COMMIT_MSG" -m "${CHANGELOG}" "$SOURCE_BRANCH" -S"$GPG_GIT_KEY"
logInfo "Creating tag '${TAG_NAME}'..." logInfo "Creating tag '${TAG_NAME}'..."
if [ "" == "$GPG_GIT_KEY" ]; then if [ -z "$GPG_GIT_KEY" ]; then
git tag -a "$TAG_NAME" -m "$COMMIT_MSG" -m "${CHANGELOG}" -s git tag -a "$TAG_NAME" -m "$COMMIT_MSG" -m "${CHANGELOG}" -s
else else
git tag -a "$TAG_NAME" -m "$COMMIT_MSG" -m "${CHANGELOG}" -s -u "$GPG_GIT_KEY" git tag -a "$TAG_NAME" -m "$COMMIT_MSG" -m "${CHANGELOG}" -s -u "$GPG_GIT_KEY"
@@ -624,7 +642,7 @@ appimage() {
appdir="$(realpath "$appdir")" appdir="$(realpath "$appdir")"
local out="${OUTPUT_DIR}" local out="${OUTPUT_DIR}"
if [ "" == "$out" ]; then if [ -z "$out" ]; then
out="." out="."
fi fi
mkdir -p "$out" mkdir -p "$out"
@@ -641,12 +659,12 @@ appimage() {
logInfo "Testing for AppImage tools..." logInfo "Testing for AppImage tools..."
local docker_test_cmd local docker_test_cmd
if [ "" != "$DOCKER_IMAGE" ]; then if [ "" != "$DOCKER_IMAGE" ]; then
docker_test_cmd="docker run --rm ${DOCKER_IMAGE}" docker_test_cmd="docker run -it --user $(id -u):$(id -g) --rm ${DOCKER_IMAGE}"
fi fi
# Test if linuxdeploy and linuxdeploy-plugin-qt are installed # Test if linuxdeploy and linuxdeploy-plugin-qt are installed
# on the system or inside the Docker container # on the system or inside the Docker container
if ! ${docker_test_cmd} which ${linuxdeploy} &> /dev/null; then if ! ${docker_test_cmd} which ${linuxdeploy} > /dev/null; then
logInfo "Downloading linuxdeploy..." logInfo "Downloading linuxdeploy..."
linuxdeploy="./linuxdeploy" linuxdeploy="./linuxdeploy"
linuxdeploy_cleanup="rm -f ${linuxdeploy}" linuxdeploy_cleanup="rm -f ${linuxdeploy}"
@@ -655,7 +673,7 @@ appimage() {
fi fi
chmod +x "$linuxdeploy" chmod +x "$linuxdeploy"
fi fi
if ! ${docker_test_cmd} which ${linuxdeploy_plugin_qt} &> /dev/null; then if ! ${docker_test_cmd} which ${linuxdeploy_plugin_qt} > /dev/null; then
logInfo "Downloading linuxdeploy-plugin-qt..." logInfo "Downloading linuxdeploy-plugin-qt..."
linuxdeploy_plugin_qt="./linuxdeploy-plugin-qt" linuxdeploy_plugin_qt="./linuxdeploy-plugin-qt"
linuxdeploy_plugin_qt_cleanup="rm -f ${linuxdeploy_plugin_qt}" linuxdeploy_plugin_qt_cleanup="rm -f ${linuxdeploy_plugin_qt}"
@@ -677,49 +695,46 @@ appimage() {
fi fi
# Create custom AppRun wrapper # Create custom AppRun wrapper
cat << EOF > "${out_real}/KeePassXC-AppRun" cat << 'EOF' > "${out_real}/KeePassXC-AppRun"
#!/usr/bin/env bash #!/usr/bin/env bash
export PATH="\$(dirname \$0)/usr/bin:\${PATH}" export PATH="$(dirname $0)/usr/bin:${PATH}"
export LD_LIBRARY_PATH="\$(dirname \$0)/usr/lib:\${LD_LIBRARY_PATH}" export LD_LIBRARY_PATH="$(dirname $0)/usr/lib:${LD_LIBRARY_PATH}"
if [ "\${1}" == "cli" ]; then if [ "$1" == "cli" ]; then
shift shift
exec keepassxc-cli "\$@" exec keepassxc-cli "$@"
elif [ "\${1}" == "proxy" ]; then elif [ "$1" == "proxy" ]; then
shift shift
exec keepassxc-proxy "\$@" exec keepassxc-proxy "$@"
elif [ -v CHROME_WRAPPER ] || [ -v MOZ_LAUNCHED_CHILD ]; then elif [ -v CHROME_WRAPPER ] || [ -v MOZ_LAUNCHED_CHILD ]; then
exec keepassxc-proxy "\$@" exec keepassxc-proxy "$@"
else else
exec keepassxc "\$@" exec keepassxc "$@"
fi fi
EOF EOF
chmod +x "${out_real}/KeePassXC-AppRun" chmod +x "${out_real}/KeePassXC-AppRun"
# Find .desktop files, icons, and binaries to deploy # Find .desktop files, icons, and binaries to deploy
local desktop_file="$(find "$appdir" -name "org.keepassxc.KeePassXC.desktop" | head -n1)" local desktop_file="$(find "$appdir" -name "org.keepassxc.KeePassXC.desktop" | head -n1)"
local icon="$(find "$appdir" -name 'keepassxc.png' | $GREP -P 'application/256x256/apps/keepassxc.png$' | head -n1)" local icon="$(find "$appdir" -path '*/application/256x256/apps/keepassxc.png' | head -n1)"
local executables="$(IFS=$'\n' find "$appdir" | $GREP -P '/usr/bin/keepassxc[^/]*$' | xargs -i printf " --executable={}")" local executables="$(find "$appdir" -type f -executable -path '*/bin/keepassxc*' -print0 | xargs -0 -i printf " --executable={}")"
logInfo "Collecting libs and patching binaries..." logInfo "Collecting libs and patching binaries..."
if [ "" == "$DOCKER_IMAGE" ]; then if [ -z "$DOCKER_IMAGE" ]; then
"$linuxdeploy" --verbosity=${verbosity} --plugin=qt --appdir="$appdir" --desktop-file="$desktop_file" \ "$linuxdeploy" --verbosity=${verbosity} --plugin=qt --appdir="$appdir" --desktop-file="$desktop_file" \
--custom-apprun="${out_real}/KeePassXC-AppRun" --icon-file="$icon" ${executables} \ --custom-apprun="${out_real}/KeePassXC-AppRun" --icon-file="$icon" ${executables}
--library=$(ldconfig -p | $GREP x86-64 | $GREP -oP '/[^\s]+/libgpg-error\.so\.\d+$' | head -n1)
else else
desktop_file="${desktop_file//${appdir}/\/keepassxc\/AppDir}"
icon="${icon//${appdir}/\/keepassxc\/AppDir}"
executables="${executables//${appdir}/\/keepassxc\/AppDir}"
docker run --name "$DOCKER_CONTAINER_NAME" --rm \ docker run --name "$DOCKER_CONTAINER_NAME" --rm \
--cap-add SYS_ADMIN --security-opt apparmor:unconfined --device /dev/fuse \ --cap-add SYS_ADMIN --security-opt apparmor:unconfined --device /dev/fuse -it \
-v "${appdir}:/keepassxc/AppDir:rw" \ -v "${out_real}:${out_real}:rw" \
-v "${out_real}:/keepassxc/out:rw" \ -v "${appdir}:${appdir}:rw" \
-w "$out_real" \
--user $(id -u):$(id -g) \
"$DOCKER_IMAGE" \ "$DOCKER_IMAGE" \
bash -c "cd /keepassxc/out && ${linuxdeploy} --verbosity=${verbosity} --plugin=qt --appdir=/keepassxc/AppDir \ bash -c "${linuxdeploy} --verbosity=${verbosity} --plugin=qt \
--custom-apprun="/keepassxc/out/KeePassXC-AppRun" --desktop-file=${desktop_file} --icon-file=${icon} ${executables} \ --appdir='${appdir}' --custom-apprun='${out_real}/KeePassXC-AppRun' \
--library=\$(ldconfig -p | grep x86-64 | grep -oP '/[^\s]+/libgpg-error\.so\.\d+$' | head -n1)" --desktop-file='${desktop_file}' --icon-file='${icon}' ${executables}"
fi fi
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
@@ -765,6 +780,7 @@ build() {
local build_generators="" local build_generators=""
local build_appsign=false local build_appsign=false
local build_key="" local build_key=""
local build_vcpkg=""
while [ $# -ge 1 ]; do while [ $# -ge 1 ]; do
local arg="$1" local arg="$1"
@@ -800,6 +816,10 @@ build() {
--appsign) --appsign)
build_appsign=true ;; build_appsign=true ;;
--timestamp)
TIMESTAMP_SERVER="$2"
shift ;;
-k|--key) -k|--key)
build_key="$2" build_key="$2"
shift ;; shift ;;
@@ -810,6 +830,10 @@ build() {
--appimage) --appimage)
build_appimage=true ;; build_appimage=true ;;
--cmake-generator)
CMAKE_GENERATOR="$2"
shift ;;
-c|--cmake-options) -c|--cmake-options)
CMAKE_OPTIONS="$2" CMAKE_OPTIONS="$2"
shift ;; shift ;;
@@ -818,6 +842,10 @@ build() {
COMPILER="$2" COMPILER="$2"
shift ;; shift ;;
--vcpkg)
build_vcpkg="$2"
shift ;;
-m|--make-options) -m|--make-options)
MAKE_OPTIONS="$2" MAKE_OPTIONS="$2"
shift ;; shift ;;
@@ -854,12 +882,15 @@ build() {
init init
OUTPUT_DIR="$(realpath "$OUTPUT_DIR")"
# Resolve appsign key to absolute path if under Windows # Resolve appsign key to absolute path if under Windows
if [[ "${build_key}" && "$(uname -o)" == "Msys" ]]; then if [[ "${build_key}" && "$(uname -o)" == "Msys" ]]; then
build_key="$(realpath "${build_key}")" build_key="$(realpath "${build_key}")"
fi fi
if [[ -f ${build_vcpkg} ]]; then
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DCMAKE_TOOLCHAIN_FILE=${build_vcpkg} -DX_VCPKG_APPLOCAL_DEPS_INSTALL=ON"
fi
if ${build_snapshot}; then if ${build_snapshot}; then
TAG_NAME="HEAD" TAG_NAME="HEAD"
local branch=`git rev-parse --abbrev-ref HEAD` local branch=`git rev-parse --abbrev-ref HEAD`
@@ -877,13 +908,16 @@ build() {
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DKEEPASSXC_BUILD_TYPE=Release" CMAKE_OPTIONS="${CMAKE_OPTIONS} -DKEEPASSXC_BUILD_TYPE=Release"
logInfo "Checking out release tag '${TAG_NAME}'..." logInfo "Checking out release tag '${TAG_NAME}'..."
fi fi
git checkout "$TAG_NAME" git checkout "$TAG_NAME" > /dev/null 2>&1
fi
OUTPUT_DIR="$(realpath "$OUTPUT_DIR")"
if ! ${build_snapshot} && [ -d "$OUTPUT_DIR" ]; then
exitError "Output dir '${OUTPUT_DIR}' already exists."
fi fi
logInfo "Creating output directory..." logInfo "Creating output directory..."
mkdir -p "$OUTPUT_DIR" if ! mkdir -p "$OUTPUT_DIR"; then
if [ $? -ne 0 ]; then
exitError "Failed to create output directory!" exitError "Failed to create output directory!"
fi fi
@@ -911,14 +945,6 @@ build() {
$xz -6 "${OUTPUT_DIR}/${tarball_name}" $xz -6 "${OUTPUT_DIR}/${tarball_name}"
fi fi
if ! ${build_snapshot} && [ -e "${OUTPUT_DIR}/build-release" ]; then
logInfo "Cleaning existing build directory..."
rm -rf "${OUTPUT_DIR}/build-release" 2> /dev/null
if [ $? -ne 0 ]; then
exitError "Failed to clean existing build directory, please do it manually."
fi
fi
logInfo "Creating build directory..." logInfo "Creating build directory..."
mkdir -p "${OUTPUT_DIR}/build-release" mkdir -p "${OUTPUT_DIR}/build-release"
cd "${OUTPUT_DIR}/build-release" cd "${OUTPUT_DIR}/build-release"
@@ -939,22 +965,23 @@ build() {
export CC=gcc export CC=gcc
elif [ "$COMPILER" == "clang++" ]; then elif [ "$COMPILER" == "clang++" ]; then
export CC=clang export CC=clang
else
export CC="$COMPILER"
fi fi
export CXX="$COMPILER" export CXX="$COMPILER"
if [ "" == "$DOCKER_IMAGE" ]; then if [ -z "$DOCKER_IMAGE" ]; then
if [ "$(uname -s)" == "Darwin" ]; then if [ "$(uname -s)" == "Darwin" ]; then
# Building on macOS # Building on macOS
export MACOSX_DEPLOYMENT_TARGET export MACOSX_DEPLOYMENT_TARGET
logInfo "Configuring build..." logInfo "Configuring build..."
cmake -DCMAKE_BUILD_TYPE=Release \ cmake -G "${CMAKE_GENERATOR}" -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES="$(uname -m)" \
-DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" ${CMAKE_OPTIONS} "$SRC_DIR"
-DCMAKE_PREFIX_PATH="/usr/local/opt/qt/lib/cmake" \
${CMAKE_OPTIONS} "$SRC_DIR"
logInfo "Compiling and packaging sources..." logInfo "Compiling and packaging sources..."
make ${MAKE_OPTIONS} package cmake --build . -- ${MAKE_OPTIONS}
cpack -G "DragNDrop"
# Appsign the executables if desired # Appsign the executables if desired
if ${build_appsign}; then if ${build_appsign}; then
@@ -962,20 +989,20 @@ build() {
appsign "-f" "./${APP_NAME}-${RELEASE_NAME}.dmg" "-k" "${build_key}" appsign "-f" "./${APP_NAME}-${RELEASE_NAME}.dmg" "-k" "${build_key}"
fi fi
mv "./${APP_NAME}-${RELEASE_NAME}.dmg" ../ mv "./${APP_NAME}-${RELEASE_NAME}.dmg" "../${APP_NAME}-${RELEASE_NAME}-$(uname -m).dmg"
elif [ "$(uname -o)" == "Msys" ]; then elif [ "$(uname -o)" == "Msys" ]; then
# Building on Windows with Msys2 # Building on Windows with Msys2
logInfo "Configuring build..." logInfo "Configuring build..."
cmake -DCMAKE_BUILD_TYPE=Release -G"MSYS Makefiles" \ cmake -DCMAKE_BUILD_TYPE=Release -G "${CMAKE_GENERATOR}" -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \
-DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" ${CMAKE_OPTIONS} "$SRC_DIR" ${CMAKE_OPTIONS} "$SRC_DIR"
logInfo "Compiling and packaging sources..." logInfo "Compiling and packaging sources..."
mingw32-make ${MAKE_OPTIONS} preinstall cmake --build . --config "Release" -- ${MAKE_OPTIONS}
# Appsign the executables if desired # Appsign the executables if desired
if ${build_appsign} && [ -f "${build_key}" ]; then if ${build_appsign} && [ -f "${build_key}" ]; then
logInfo "Signing executable files" logInfo "Signing executable files"
appsign "-f" $(find src | $GREP -P '\.exe$|\.dll$') "-k" "${build_key}" appsign "-f" $(find src | $GREP -Pi 'keepassxc.*(.exe$|.dll$)') "-k" "${build_key}"
fi fi
# Call cpack directly instead of calling make package. # Call cpack directly instead of calling make package.
@@ -983,17 +1010,6 @@ build() {
# release. # release.
cpack -G "${CPACK_GENERATORS};${build_generators}" cpack -G "${CPACK_GENERATORS};${build_generators}"
# Inject the portable config into the zip build and rename
touch .portable
for filename in ${APP_NAME}-*.zip; do
logInfo "Creating portable zip file"
local folder=$(echo ${filename} | sed -r 's/(.*)\.zip/\1/')
python -c 'import zipfile,sys ; zipfile.ZipFile(sys.argv[1],"a").write(sys.argv[2],sys.argv[3])' \
${filename} .portable ${folder}/.portable
mv ${filename} ${folder}-portable.zip
done
rm .portable
mv "${APP_NAME}-"*.* ../ mv "${APP_NAME}-"*.* ../
else else
mkdir -p "${OUTPUT_DIR}/KeePassXC.AppDir" mkdir -p "${OUTPUT_DIR}/KeePassXC.AppDir"
@@ -1017,7 +1033,7 @@ build() {
logInfo "Launching Docker contain to compile snapcraft..." logInfo "Launching Docker contain to compile snapcraft..."
sudo docker run --name "$DOCKER_CONTAINER_NAME" --rm \ sudo docker run --name "$DOCKER_CONTAINER_NAME" --rm -it --user $(id -u):$(id -g) \
-v "$(realpath "$SRC_DIR"):/keepassxc" -w "/keepassxc" \ -v "$(realpath "$SRC_DIR"):/keepassxc" -w "/keepassxc" \
"$DOCKER_IMAGE" snapcraft "$DOCKER_IMAGE" snapcraft
else else
@@ -1027,7 +1043,8 @@ build() {
docker run --name "$DOCKER_CONTAINER_NAME" --rm \ docker run --name "$DOCKER_CONTAINER_NAME" --rm \
--cap-add SYS_ADMIN --security-opt apparmor:unconfined --device /dev/fuse \ --cap-add SYS_ADMIN --security-opt apparmor:unconfined --device /dev/fuse \
-e "CC=${CC}" -e "CXX=${CXX}" \ --user $(id -u):$(id -g) \
-e "CC=${CC}" -e "CXX=${CXX}" -it \
-v "$(realpath "$SRC_DIR"):/keepassxc/src:ro" \ -v "$(realpath "$SRC_DIR"):/keepassxc/src:ro" \
-v "$(realpath "$OUTPUT_DIR"):/keepassxc/out:rw" \ -v "$(realpath "$OUTPUT_DIR"):/keepassxc/out:rw" \
"$DOCKER_IMAGE" \ "$DOCKER_IMAGE" \
@@ -1057,7 +1074,7 @@ build() {
docker_image_flag="-d ${DOCKER_IMAGE}" docker_image_flag="-d ${DOCKER_IMAGE}"
docker_container_name_flag="--container-name ${DOCKER_CONTAINER_NAME}" docker_container_name_flag="--container-name ${DOCKER_CONTAINER_NAME}"
fi fi
appimage "-a" "${OUTPUT_DIR}/KeePassXC.AppDir" "-o" "${OUTPUT_DIR}" \ appimage -a "${OUTPUT_DIR}/KeePassXC.AppDir" -o "${OUTPUT_DIR}" \
${appsign_flag} ${appsign_key_flag} ${docker_image_flag} ${docker_container_name_flag} ${appsign_flag} ${appsign_key_flag} ${docker_image_flag} ${docker_container_name_flag}
fi fi
@@ -1130,8 +1147,6 @@ gpgsign() {
appsign() { appsign() {
local sign_files=() local sign_files=()
local key local key
local ac_username
local ac_keychain="AC_PASSWORD"
while [ $# -ge 1 ]; do while [ $# -ge 1 ]; do
local arg="$1" local arg="$1"
@@ -1146,14 +1161,6 @@ appsign() {
key="$2" key="$2"
shift ;; shift ;;
-u|--username)
ac_username="$2"
shift ;;
-c|--keychain)
ac_keychain="$2"
shift ;;
-h|--help) -h|--help)
printUsage "appsign" printUsage "appsign"
exit ;; exit ;;
@@ -1179,16 +1186,12 @@ appsign() {
fi fi
for f in "${sign_files[@]}"; do for f in "${sign_files[@]}"; do
if [ ! -f "${f}" ]; then if [ ! -e "${f}" ]; then
exitError "File '${f}' does not exist or is not a file!" exitError "File '${f}' does not exist!"
fi fi
done done
if [ "$(uname -s)" == "Darwin" ]; then if [ "$(uname -s)" == "Darwin" ]; then
if [ "$ac_username" == "" ]; then
exitError "Missing arguments, --username is required!"
fi
checkXcodeSetup checkXcodeSetup
checkGrepCompat checkGrepCompat
@@ -1199,30 +1202,45 @@ appsign() {
logInfo "Unpacking disk image '${f}'..." logInfo "Unpacking disk image '${f}'..."
local tmp_dir="/tmp/KeePassXC_${RANDOM}" local tmp_dir="/tmp/KeePassXC_${RANDOM}"
mkdir -p ${tmp_dir}/mnt mkdir -p ${tmp_dir}/mnt
hdiutil attach -quiet -noautoopen -mountpoint ${tmp_dir}/mnt "${f}" if ! hdiutil attach -quiet -noautoopen -mountpoint ${tmp_dir}/mnt "${f}"; then
exitError "DMG mount failed!"
fi
cd ${tmp_dir} cd ${tmp_dir}
cp -a ./mnt ./app cp -a ./mnt ./app
hdiutil detach -quiet ${tmp_dir}/mnt hdiutil detach -quiet ${tmp_dir}/mnt
local app_dir_tmp="./app/KeePassXC.app"
if [ ! -d ./app/KeePassXC.app ]; then if [ ! -d "$app_dir_tmp" ]; then
cd "${orig_dir}" cd "${orig_dir}"
exitError "Unpacking failed!" exitError "Unpacking failed!"
fi fi
elif [[ ${f: -4} == '.app' ]]; then
local app_dir_tmp="$f"
else
logWarn "Skipping non-app file '${f}'..."
continue
fi
logInfo "Signing app bundle..." logInfo "Signing libraries and frameworks..."
xcrun codesign --sign "${key}" --verbose --deep --options runtime ./app/KeePassXC.app if ! find "$app_dir_tmp" \( -name '*.dylib' -o -name '*.so' -o -name '*.framework' \) -print0 | xargs -0 \
xcrun codesign --sign "${key}" --verbose --force --options runtime; then
# Sign main binary and libraries independently so we can keep using the convenient --deep cd "${orig_dir}"
# option while avoiding adding entitlements recursively exitError "Signing failed!"
logInfo "Signing main binary..." fi
xcrun codesign --sign "${key}" --verbose --force --options runtime --entitlements \ logInfo "Signing executables..."
"${real_src_dir}/share/macosx/keepassxc.entitlements" ./app/KeePassXC.app/Contents/MacOS/KeePassXC if ! find "${app_dir_tmp}/Contents/MacOS" \( -type f -not -name KeePassXC \) -print0 | xargs -0 \
xcrun codesign --sign "${key}" --verbose --force --options runtime; then
if [ 0 -ne $? ]; then cd "${orig_dir}"
cd "${orig_dir}" exitError "Signing failed!"
exitError "Signing failed!" fi
fi # Sign main executable with additional entitlements
if ! xcrun codesign --sign "${key}" --verbose --force --options runtime --entitlements \
"${real_src_dir}/share/macosx/keepassxc.entitlements" "${app_dir_tmp}/Contents/MacOS/KeePassXC"; then
cd "${orig_dir}"
exitError "Signing failed!"
fi
if [[ ${f: -4} == '.dmg' ]]; then
logInfo "Repacking disk image..." logInfo "Repacking disk image..."
hdiutil create \ hdiutil create \
-volname "KeePassXC" \ -volname "KeePassXC" \
@@ -1236,60 +1254,18 @@ appsign() {
cd "${orig_dir}" cd "${orig_dir}"
cp -f "${tmp_dir}/$(basename "${f}")" "${f}" cp -f "${tmp_dir}/$(basename "${f}")" "${f}"
rm -Rf ${tmp_dir} rm -Rf ${tmp_dir}
logInfo "Submitting disk image for notarization..."
local status="$(xcrun altool --notarize-app \
--primary-bundle-id "org.keepassxc.keepassxc" \
--username "${ac_username}" \
--password "@keychain:${ac_keychain}" \
--file "${f}")"
if [ 0 -ne $? ]; then
logError "Submission failed!"
exitError "Error message:\n${status}"
fi
local ticket="$(echo "${status}" | $GREP -oP "[a-f0-9-]+$")"
logInfo "Submission successful. Ticket ID: ${ticket}."
logInfo "Waiting for notarization to finish (this may take a while)..."
while true; do
echo -n "."
status="$(xcrun altool --notarization-info "${ticket}" \
--username "${ac_username}" \
--password "@keychain:${ac_keychain}")"
if echo "$status" | $GREP -q "Status Code: 0"; then
logInfo "\nNotarization successful."
break
elif echo "$status" | $GREP -q "Status Code"; then
logError "\nNotarization failed!"
exitError "Error message:\n${status}"
fi
sleep 5
done
logInfo "Stapling ticket to disk image..."
xcrun stapler staple "${f}"
if [ 0 -ne $? ]; then
exitError "Stapling failed!"
fi
logInfo "Disk image successfully signed and notarized."
else
logWarn "Skipping non-DMG file '${f}'..."
fi fi
logInfo "File '${f}' successfully signed."
done done
elif [ "$(uname -o)" == "Msys" ]; then elif [ "$(uname -o)" == "Msys" ]; then
if [[ ! -f "${key}" ]]; then if [[ ! -f "${key}" ]]; then
exitError "Key file was not found!" exitError "Appsign key file was not found! (${key})"
fi fi
read -s -p "Key password: " password logInfo "Using appsign key ${key}."
IFS=$'\n' read -s -r -p "Key password: " password
echo echo
for f in "${sign_files[@]}"; do for f in "${sign_files[@]}"; do
@@ -1301,7 +1277,7 @@ appsign() {
# osslsigncode does not succeed at signing MSI files at this time... # osslsigncode does not succeed at signing MSI files at this time...
logInfo "Signing file '${f}' using Microsoft signtool..." logInfo "Signing file '${f}' using Microsoft signtool..."
signtool sign -f "${key}" -p "${password}" -d "KeePassXC" -td sha256 \ signtool sign -f "${key}" -p "${password}" -d "KeePassXC" -td sha256 \
-fd sha256 -tr "http://timestamp.comodoca.com/authenticode" "${f}" -fd sha256 -tr "${TIMESTAMP_SERVER}" "${f}"
if [ 0 -ne $? ]; then if [ 0 -ne $? ]; then
exitError "Signing failed!" exitError "Signing failed!"
@@ -1318,12 +1294,190 @@ appsign() {
logInfo "All done!" logInfo "All done!"
} }
# -----------------------------------------------------------------------
# notarize command
# -----------------------------------------------------------------------
notarize() {
local notarize_files=()
local ac_username
local ac_keychain="AC_PASSWORD"
while [ $# -ge 1 ]; do
local arg="$1"
case "$arg" in
-f|--files)
while [ "${2:0:1}" != "-" ] && [ $# -ge 2 ]; do
notarize_files+=("$2")
shift
done ;;
-u|--username)
ac_username="$2"
shift ;;
-c|--keychain)
ac_keychain="$2"
shift ;;
-h|--help)
printUsage "notarize"
exit ;;
*)
logError "Unknown option '$arg'\n"
printUsage "notarize"
exit 1 ;;
esac
shift
done
if [ "$(uname -s)" != "Darwin" ]; then
exitError "Notarization is only supported on macOS!"
fi
if [ -z "${notarize_files}" ]; then
logError "Missing arguments, --files is required!\n"
printUsage "notarize"
exit 1
fi
if [ -z "$ac_username" ]; then
logError "Missing arguments, --username is required!"
printUsage "notarize"
exit 1
fi
for f in "${notarize_files[@]}"; do
if [[ ${f: -4} != '.dmg' ]]; then
logWarn "Skipping non-DMG file '${f}'..."
continue
fi
logInfo "Submitting disk image '${f}' for notarization..."
local status
status="$(xcrun altool --notarize-app \
--primary-bundle-id "org.keepassxc.keepassxc" \
--username "${ac_username}" \
--password "@keychain:${ac_keychain}" \
--file "${f}" 2> /dev/null)"
if [ 0 -ne $? ]; then
logError "Submission failed!"
exitError "Error message:\n${status}"
fi
local ticket="$(echo "${status}" | $GREP -oP "[a-f0-9-]+$")"
logInfo "Submission successful. Ticket ID: ${ticket}."
logInfo "Waiting for notarization to finish (this may take a while)..."
while true; do
echo -n "."
status="$(xcrun altool --notarization-info "${ticket}" \
--username "${ac_username}" \
--password "@keychain:${ac_keychain}" 2> /dev/null)"
if echo "$status" | $GREP -q "Status Code: 0"; then
logInfo "\nNotarization successful."
break
elif echo "$status" | $GREP -q "Status Code"; then
logError "\nNotarization failed!"
exitError "Error message:\n${status}"
fi
sleep 5
done
logInfo "Stapling ticket to disk image..."
xcrun stapler staple "${f}"
if [ 0 -ne $? ]; then
exitError "Stapling failed!"
fi
logInfo "Disk image successfully notarized."
done
}
# -----------------------------------------------------------------------
# i18n command
# -----------------------------------------------------------------------
i18n() {
local cmd="$1"
if [ -z "$cmd" ]; then
logError "No subcommand specified.\n"
printUsage i18n
exit 1
elif [ "$cmd" != "tx-push" ] && [ "$cmd" != "tx-pull" ] && [ "$cmd" != "lupdate" ]; then
logError "Unknown subcommand: '${cmd}'\n"
printUsage i18n
exit 1
fi
shift
checkGitRepository
if [ "$cmd" == "lupdate" ]; then
if [ ! -d share/translations ]; then
logError "Command must be called from repository root directory."
exit 1
fi
checkQt5LUpdateExists
logInfo "Updating source translation file..."
LUPDATE=lupdate-qt5
if ! command -v $LUPDATE > /dev/null; then
LUPDATE=lupdate
fi
$LUPDATE -no-ui-lines -disable-heuristic similartext -locations none -no-obsolete src \
-ts share/translations/keepassxc_en.ts $@
return 0
fi
checkTransifexCommandExists
local branch="$(git branch --show-current 2>&1)"
local real_branch="$branch"
if [[ "$branch" =~ ^release/ ]]; then
logInfo "Release branch, setting language resource to master branch."
branch="master"
elif [ "$branch" != "develop" ] && [ "$branch" != "master" ]; then
logError "Must be on master or develop branch!"
exit 1
fi
local resource="keepassxc.share-translations-keepassxc-en-ts--${branch}"
if [ "$cmd" == "tx-push" ]; then
echo -e "This will push the \e[1m'en'\e[0m source file from the current branch to Transifex:\n" >&2
echo -e " \e[1m${real_branch}\e[0m -> \e[1m${resource}\e[0m\n" >&2
echo -n "Continue? [y/N] " >&2
read -r yesno
if [ "$yesno" != "y" ] && [ "$yesno" != "Y" ]; then
logError "Push aborted."
exit 1
fi
logInfo "Pushing source translation file to Transifex..."
tx push -s --use-git-timestamps -r "$resource" $@
elif [ "$cmd" == "tx-pull" ]; then
logInfo "Pulling updated translations from Transifex..."
tx pull -af --minimum-perc=60 --parallel -r "$resource" $@
fi
}
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
# parse global command line # parse global command line
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
MODE="$1" MODE="$1"
shift shift || true
if [ "" == "$MODE" ]; then if [ -z "$MODE" ]; then
logError "Missing arguments!\n" logError "Missing arguments!\n"
printUsage printUsage
exit 1 exit 1
@@ -1331,7 +1485,8 @@ elif [ "help" == "$MODE" ]; then
printUsage "$1" printUsage "$1"
exit exit
elif [ "check" == "$MODE" ] || [ "merge" == "$MODE" ] || [ "build" == "$MODE" ] \ elif [ "check" == "$MODE" ] || [ "merge" == "$MODE" ] || [ "build" == "$MODE" ] \
|| [ "gpgsign" == "$MODE" ] || [ "appsign" == "$MODE" ] || [ "appimage" == "$MODE" ]; then || [ "gpgsign" == "$MODE" ] || [ "appsign" == "$MODE" ]|| [ "notarize" == "$MODE" ] \
|| [ "appimage" == "$MODE" ]|| [ "i18n" == "$MODE" ]; then
${MODE} "$@" ${MODE} "$@"
else else
printUsage "$MODE" printUsage "$MODE"

538
release-tool.ps1 Normal file
View File

@@ -0,0 +1,538 @@
<#
.SYNOPSIS
KeePassXC Release Tool
.DESCRIPTION
Commands:
merge Merge release branch into main branch and create release tags
build Build and package binary release from sources
sign Sign previously compiled release packages
.NOTES
The following are descriptions of certain parameters:
-Vcpkg Specify VCPKG toolchain file (example: C:\vcpkg\scripts\buildsystems\vcpkg.cmake)
-Tag Release tag to check out (defaults to version number)
-Snapshot Build current HEAD without checkout out Tag
-CMakeGenerator Override the default CMake generator
-CMakeOptions Additional CMake options for compiling the sources
-CPackGenerators Set CPack generators (default: WIX;ZIP)
-Compiler Compiler to use (example: g++, clang, msbuild)
-MakeOptions Options to pass to the make program
-SignBuild Perform platform specific App Signing before packaging
-SignKey Specify the App Signing Key/Identity
-TimeStamp Explicitly set the timestamp server to use for appsign
-SourceBranch Source branch to merge from (default: 'release/$Version')
-TargetBranch Target branch to merge to (default: master)
-VSToolChain Specify Visual Studio Toolchain by name if more than one is available
#>
param(
[Parameter(ParameterSetName = "merge", Mandatory, Position = 0)]
[switch] $Merge,
[Parameter(ParameterSetName = "build", Mandatory, Position = 0)]
[switch] $Build,
[Parameter(ParameterSetName = "sign", Mandatory, Position = 0)]
[switch] $Sign,
[Parameter(ParameterSetName = "merge", Mandatory, Position = 1)]
[Parameter(ParameterSetName = "build", Mandatory, Position = 1)]
[Parameter(ParameterSetName = "sign", Mandatory, Position = 1)]
[ValidatePattern("^[0-9]\.[0-9]\.[0-9]$")]
[string] $Version,
[Parameter(ParameterSetName = "build", Mandatory)]
[string] $Vcpkg,
[Parameter(ParameterSetName = "sign", Mandatory)]
[SupportsWildcards()]
[string[]] $SignFiles,
# [Parameter(ParameterSetName = "build")]
# [switch] $DryRun,
[Parameter(ParameterSetName = "build")]
[switch] $Snapshot,
[Parameter(ParameterSetName = "build")]
[switch] $SignBuild,
[Parameter(ParameterSetName = "build")]
[string] $CMakeGenerator = "Ninja",
[Parameter(ParameterSetName = "build")]
[string] $CMakeOptions,
[Parameter(ParameterSetName = "build")]
[string] $CPackGenerators = "WIX;ZIP",
[Parameter(ParameterSetName = "build")]
[string] $Compiler,
[Parameter(ParameterSetName = "build")]
[string] $MakeOptions,
[Parameter(ParameterSetName = "build")]
[Parameter(ParameterSetName = "sign")]
[string] $SignKey,
[Parameter(ParameterSetName = "build")]
[Parameter(ParameterSetName = "sign")]
[string] $Timestamp = "http://timestamp.sectigo.com",
[Parameter(ParameterSetName = "merge")]
[Parameter(ParameterSetName = "build")]
[Parameter(ParameterSetName = "sign")]
[string] $GpgKey = "CFB4C2166397D0D2",
[Parameter(ParameterSetName = "merge")]
[Parameter(ParameterSetName = "build")]
[string] $SourceDir = ".",
[Parameter(ParameterSetName = "build")]
[string] $OutDir = ".\release",
[Parameter(ParameterSetName = "merge")]
[Parameter(ParameterSetName = "build")]
[string] $Tag,
[Parameter(ParameterSetName = "merge")]
[string] $SourceBranch,
[Parameter(ParameterSetName = "merge")]
[string] $TargetBranch = "master",
[Parameter(ParameterSetName = "build")]
[string] $VSToolChain,
[Parameter(ParameterSetName = "merge")]
[Parameter(ParameterSetName = "build")]
[Parameter(ParameterSetName = "sign")]
[string] $ExtraPath
)
# Helper function definitions
function Test-RequiredPrograms {
# If any of these fail they will throw an exception terminating the script
if ($Build) {
Get-Command git | Out-Null
Get-Command cmake | Out-Null
}
if ($Merge) {
Get-Command git | Out-Null
Get-Command tx | Out-Null
Get-Command lupdate | Out-Null
}
if ($Sign -or $SignBuild) {
if ($SignKey.Length) {
Get-Command signtool | Out-Null
}
Get-Command gpg | Out-Null
}
}
function Test-VersionInFiles {
# Check CMakeLists.txt
$Major, $Minor, $Patch = $Version.split(".", 3)
if (!(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_MAJOR `"$Major`"" -Quiet) `
-or !(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_MINOR `"$Minor`"" -Quiet) `
-or !(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_PATCH `"$Patch`"" -Quiet)) {
throw "CMakeLists.txt has not been updated to $Version."
}
# Check Changelog
if (!(Select-String "$SourceDir\CHANGELOG.md" -pattern "^## $Version \(\d{4}-\d{2}-\d{2}\)$" -Quiet)) {
throw "CHANGELOG.md does not contain a section for $Version."
}
# Check AppStreamInfo
if (!(Select-String "$SourceDir\share\linux\org.keepassxc.KeePassXC.appdata.xml" `
-pattern "<release version=`"$Version`" date=`"\d{4}-\d{2}-\d{2}`">" -Quiet)) {
throw "share/linux/org.keepassxc.KeePassXC.appdata.xml does not contain a section for $Version."
}
}
function Test-WorkingTreeClean {
& git diff-index --quiet HEAD --
if ($LASTEXITCODE) {
throw "Current working tree is not clean! Please commit or unstage any changes."
}
}
function Invoke-VSToolchain([String] $Toolchain, [String] $Path, [String] $Arch) {
# Find Visual Studio installations
$vs = Get-CimInstance MSFT_VSInstance
if ($vs.count -eq 0) {
$err = "No Visual Studio installations found, download one from https://visualstudio.com/downloads."
$err = "$err`nIf Visual Studio is installed, you may need to repair the install then restart."
throw $err
}
$VSBaseDir = $vs[0].InstallLocation
if ($Toolchain) {
# Try to find the specified toolchain by name
foreach ($_ in $vs) {
if ($_.Name -eq $Toolchain) {
$VSBaseDir = $_.InstallLocation
break
}
}
} elseif ($vs.count -gt 1) {
# Ask the user which install to use
$i = 0
foreach ($_ in $vs) {
$i = $i + 1
$i.ToString() + ") " + $_.Name | Write-Host
}
$i = Read-Host -Prompt "Which Visual Studio installation do you want to use?"
$i = [Convert]::ToInt32($i, 10) - 1
if ($i -lt 0 -or $i -ge $vs.count) {
throw "Invalid selection made"
}
$VSBaseDir = $vs[$i].InstallLocation
}
# Bootstrap the specified VS Toolchain
Import-Module "$VSBaseDir\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
Enter-VsDevShell -VsInstallPath $VSBaseDir -Arch $Arch -StartInPath $Path | Write-Host
Write-Host # Newline after command output
}
function Invoke-Cmd([string] $command, [string[]] $options = @(), [switch] $maskargs, [switch] $quiet) {
$call = ('{0} {1}' -f $command, ($options -Join ' '))
if ($maskargs) {
Write-Host "$command <masked>" -ForegroundColor DarkGray
}
else {
Write-Host $call -ForegroundColor DarkGray
}
if ($quiet) {
Invoke-Expression $call > $null
} else {
Invoke-Expression $call
}
if ($LASTEXITCODE -ne 0) {
throw "Failed to run command: {0}" -f $command
}
Write-Host #insert newline after command output
}
function Invoke-SignFiles([string[]] $files, [string] $key, [string] $time) {
if (!(Test-Path -Path "$key" -PathType leaf)) {
throw "Appsign key file was not found! ($key)"
}
if ($files.Length -eq 0) {
return
}
Write-Host "Signing files using $key" -ForegroundColor Cyan
$KeyPassword = Read-Host "Key password: " -MaskInput
foreach ($_ in $files) {
Write-Host "Signing file '$_' using Microsoft signtool..."
Invoke-Cmd "signtool" "sign -f `"$key`" -p `"$KeyPassword`" -d `"KeePassXC`" -td sha256 -fd sha256 -tr `"$time`" `"$_`"" -maskargs
}
}
function Invoke-GpgSignFiles([string[]] $files, [string] $key) {
if ($files.Length -eq 0) {
return
}
Write-Host "Signing files using GPG key $key" -ForegroundColor Cyan
foreach ($_ in $files) {
Write-Host "Signing file '$_' and creating DIGEST..."
if (Test-Path "$_.sig") {
Remove-Item "$_.sig"
}
Invoke-Cmd "gpg" "--output `"$_.sig`" --armor --local-user `"$key`" --detach-sig `"$_`""
$FileName = (Get-Item $_).Name
(Get-FileHash "$_" SHA256).Hash + " *$FileName" | Out-File "$_.DIGEST" -NoNewline
}
}
# Handle errors and restore state
$OrigDir = (Get-Location).Path
$OrigBranch = & git rev-parse --abbrev-ref HEAD
$ErrorActionPreference = 'Stop'
trap {
Write-Host "Restoring state..." -ForegroundColor Yellow
& git checkout $OrigBranch
Set-Location "$OrigDir"
}
Write-Host "KeePassXC Release Preparation Helper" -ForegroundColor Green
Write-Host "Copyright (C) 2022 KeePassXC Team <https://keepassxc.org/>`n" -ForegroundColor Green
# Prepend extra PATH locations as specified
if ($ExtraPath) {
$env:Path = "$ExtraPath;$env:Path"
}
# Resolve absolute directory for paths
$SourceDir = (Resolve-Path $SourceDir).Path
# Check format of -Version
if ($Version -notmatch "^\d+\.\d+\.\d+$") {
throw "Invalid format for -Version input"
}
# Check platform
if (!$IsWindows) {
throw "The PowerShell release tool is not available for Linux or macOS at this time."
}
if ($Merge) {
Test-RequiredPrograms
# Change to SourceDir
Set-Location "$SourceDir"
Test-VersionInFiles
Test-WorkingTreeClean
if (!$SourceBranch.Length) {
$SourceBranch = & git branch --show-current
}
if ($SourceBranch -notmatch "^release/.*|develop$") {
throw "Must be on develop or a release/* branch to continue merging."
}
# Update translation files
Write-Host "Updating source translation file..."
Invoke-Cmd "lupdate" "-no-ui-lines -disable-heuristic similartext -locations none", `
"-no-obsolete ./src -ts share/translations/keepassxc_en.ts"
Write-Host "Pulling updated translations from Transifex..."
Invoke-Cmd "tx" "pull -af --minimum-perc=60 --parallel -r keepassxc.share-translations-keepassxc-en-ts--develop"
# Only commit if there are changes
& git diff-index --quiet HEAD --
if ($LASTEXITCODE) {
Write-Host "Committing translation updates..."
Invoke-Cmd "git" "add -A ./share/translations/" -quiet
Invoke-Cmd "git" "commit -m `"Update translations`"" -quiet
}
# Read the version release notes from CHANGELOG
$Changelog = ""
$ReadLine = $false
Get-Content "CHANGELOG.md" | ForEach-Object {
if ($ReadLine) {
if ($_ -match "^## ") {
$ReadLine = $false
} else {
$Changelog += $_ + "`n"
}
} elseif ($_ -match "$Version \(\d{4}-\d{2}-\d{2}\)") {
$ReadLine = $true
}
}
Write-Host "Checking out target branch '$TargetBranch'..."
Invoke-Cmd "git" "checkout `"$TargetBranch`"" -quiet
Write-Host "Merging '$SourceBranch' into '$TargetBranch'..."
Invoke-Cmd "git" "merge `"$SourceBranch`" --no-ff -m `"Release $Version`" -m `"$Changelog`" `"$SourceBranch`" -S" -quiet
Write-Host "Creating tag for '$Version'..."
Invoke-Cmd "git" "tag -a `"$Version`" -m `"Release $Version`" -m `"$Changelog`" -s" -quiet
Write-Host "All done!"
Write-Host "Please merge the release branch back into the develop branch now and then push your changes."
Write-Host "Don't forget to also push the tags using 'git push --tags'."
} elseif ($Build) {
$Vcpkg = (Resolve-Path $Vcpkg).Path
# Find Visual Studio and establish build environment
Invoke-VSToolchain $VSToolChain $SourceDir -Arch "amd64"
Test-RequiredPrograms
if ($Snapshot) {
$Tag = "HEAD"
$SourceBranch = & git rev-parse --abbrev-ref HEAD
$ReleaseName = "$Version-snapshot"
$CMakeOptions = "$CMakeOptions -DKEEPASSXC_BUILD_TYPE=Snapshot -DOVERRIDE_VERSION=`"$ReleaseName`""
Write-Host "Using current branch '$SourceBranch' to build." -ForegroundColor Cyan
} else {
Test-WorkingTreeClean
# Clear output directory
if (Test-Path $OutDir) {
Remove-Item $OutDir -Recurse
}
if ($Version -match "-beta\\d+$") {
$CMakeOptions = "$CMakeOptions -DKEEPASSXC_BUILD_TYPE=PreRelease"
} else {
$CMakeOptions = "$CMakeOptions -DKEEPASSXC_BUILD_TYPE=Release"
}
# Setup Tag if not defined then checkout tag
if ($Tag -eq "" -or $Tag -eq $null) {
$Tag = $Version
}
Write-Host "Checking out tag 'tags/$Tag' to build." -ForegroundColor Cyan
Invoke-Cmd "git" "checkout `"tags/$Tag`""
}
# Create directories
New-Item "$OutDir" -ItemType Directory -Force | Out-Null
$OutDir = (Resolve-Path $OutDir).Path
$BuildDir = "$OutDir\build-release"
New-Item "$BuildDir" -ItemType Directory -Force | Out-Null
# Enter build directory
Set-Location "$BuildDir"
# Setup CMake options
$CMakeOptions = "$CMakeOptions -DWITH_XC_ALL=ON -DWITH_TESTS=OFF -DCMAKE_BUILD_TYPE=Release"
$CMakeOptions = "$CMakeOptions -DCMAKE_TOOLCHAIN_FILE:FILEPATH=`"$Vcpkg`" -DX_VCPKG_APPLOCAL_DEPS_INSTALL=ON"
Write-Host "Configuring build..." -ForegroundColor Cyan
Invoke-Cmd "cmake" "$CMakeOptions -G `"$CMakeGenerator`" `"$SourceDir`""
Write-Host "Compiling sources..." -ForegroundColor Cyan
Invoke-Cmd "cmake" "--build . --config Release -- $MakeOptions"
if ($SignBuild) {
$files = Get-ChildItem "$BuildDir\src" -Include "*keepassxc*.exe", "*keepassxc*.dll" -Recurse -File | ForEach-Object { $_.FullName }
Invoke-SignFiles $files $SignKey $Timestamp
}
Write-Host "Create deployment packages..." -ForegroundColor Cyan
Invoke-Cmd "cpack" "-G `"$CPackGenerators`""
Move-Item "$BuildDir\keepassxc-*" -Destination "$OutDir" -Force
if ($SignBuild) {
# Enter output directory
Set-Location -Path "$OutDir"
# Sign MSI files using AppSign key
$files = Get-ChildItem $OutDir -Include "*.msi" -Name
Invoke-SignFiles $files $SignKey $Timestamp
# Sign all output files using the GPG key then hash them
$files = Get-ChildItem $OutDir -Include "*.msi", "*.zip" -Name
Invoke-GpgSignFiles $files $GpgKey
}
# Restore state
Invoke-Command {git checkout $OrigBranch}
Set-Location "$OrigDir"
} elseif ($Sign) {
if (Test-Path $SignKey) {
# Need to include path to signtool program
Invoke-VSToolchain $VSToolChain $SourceDir -Arch "amd64"
}
Test-RequiredPrograms
# Resolve wildcard paths
$ResolvedFiles = @()
foreach ($_ in $SignFiles) {
$ResolvedFiles += (Get-ChildItem $_ -File | ForEach-Object { $_.FullName })
}
$AppSignFiles = $ResolvedFiles.Where({ $_ -match "\.(msi|exe|dll)$" })
Invoke-SignFiles $AppSignFiles $SignKey $Timestamp
$GpgSignFiles = $ResolvedFiles.Where({ $_ -match "\.(msi|zip|gz|xz|dmg|appimage)$" })
Invoke-GpgSignFiles $GpgSignFiles $GpgKey
}
# SIG # Begin signature block
# MIIThAYJKoZIhvcNAQcCoIITdTCCE3ECAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUyaXWK5K1LP2TD/IgGb5Tfs8v
# C2GgghC8MIIFOjCCBCKgAwIBAgIQWKLXLYzA/YnM/yHg1O3HSjANBgkqhkiG9w0B
# AQsFADB8MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVy
# MRAwDgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxJDAi
# BgNVBAMTG1NlY3RpZ28gUlNBIENvZGUgU2lnbmluZyBDQTAeFw0yMTAzMTUwMDAw
# MDBaFw0yNDAzMTQyMzU5NTlaMIGhMQswCQYDVQQGEwJVUzEOMAwGA1UEEQwFMjIz
# MTUxETAPBgNVBAgMCFZpcmdpbmlhMRIwEAYDVQQHDAlGcmFuY29uaWExGzAZBgNV
# BAkMEjY2NTMgQXVkcmV5IEtheSBDdDEeMBwGA1UECgwVRHJvaWRNb25rZXkgQXBw
# cywgTExDMR4wHAYDVQQDDBVEcm9pZE1vbmtleSBBcHBzLCBMTEMwggEiMA0GCSqG
# SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCwB9L/+1zlcXOQLoYvdrYAWS9B5ui+7E9c
# XCn6wcB4NdmaRbNM3kdWc8nbjOOHeOct2jVzVu/pJR1SagI+V1R1BfzgfzuW55Yy
# iHrqXQGfL9xhqJAWSvdQRinvlkZ+WY3QxnOhzcQk+BTLYdUwq04O3jMv7vnH6fuL
# q/HXEsgDObZC7EyKEtVbWVo4nqY0tUTviJXvRI/sFDN8DvULefwZWIvF7G11NFeK
# It24+hDCzvVBKtEn7DNmFGO1CJAB7Sz4jFewV4MP1gviMAfGbSBqavyRDBOG7eda
# SVb1Zq482yoHNAs+mpIQK2SGvUKKAJK2wCDbzgpvu5sfzwStpc0hAgMBAAGjggGQ
# MIIBjDAfBgNVHSMEGDAWgBQO4TqoUzox1Yq+wbutZxoDha00DjAdBgNVHQ4EFgQU
# 7u2WZ7fqJiaM3u9SlzAwGBhoWH0wDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQC
# MAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYJYIZIAYb4QgEBBAQDAgQQMEoGA1Ud
# IARDMEEwNQYMKwYBBAGyMQECAQMCMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8vc2Vj
# dGlnby5jb20vQ1BTMAgGBmeBDAEEATBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8v
# Y3JsLnNlY3RpZ28uY29tL1NlY3RpZ29SU0FDb2RlU2lnbmluZ0NBLmNybDBzBggr
# BgEFBQcBAQRnMGUwPgYIKwYBBQUHMAKGMmh0dHA6Ly9jcnQuc2VjdGlnby5jb20v
# U2VjdGlnb1JTQUNvZGVTaWduaW5nQ0EuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8v
# b2NzcC5zZWN0aWdvLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAD2w/Tt5KyPbX2M+h
# WVwgqpKm42nk6aN2HvSp+KWlrB2t+ziL+1IRXwq7S0V7p2e1ZK8uXLzBjUDVGjBc
# ugh5hGG95MGVltxCJrr/bk1He62L7MwVxfH5b5MrE/vC/cHcSxEB1AZwZxYKjDPf
# R81biDVch++XeKmvUxfT4XGo7McJqT4K/TcLwijSb/AWsXR+r2BXEAqgsoG37kk/
# fbPKimpJ07hxd/RNYVpE33E93zCQ1Tjc1tP3DaLq8cpS6jGUY5NNOzRgp2mGcGHy
# lv6Q/xf45qNvHiqFVctdvY9of0QFjg5eYDr4rLDa+mks9f1Jd8aDWKcsfCBnlohT
# KIffbTCCBYEwggRpoAMCAQICEDlyRDr5IrdR19NsEN0xNZUwDQYJKoZIhvcNAQEM
# BQAwezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ
# MA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAf
# BgNVBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0xOTAzMTIwMDAwMDBa
# Fw0yODEyMzEyMzU5NTlaMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEpl
# cnNleTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJV
# U1QgTmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9u
# IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIASZRc2
# DsPbCLPQrFcNdu3NJ9NMrVCDYeKqIE0JLWQJ3M6Jn8w9qez2z8Hc8dOx1ns3KBEr
# R9o5xrw6GbRfpr19naNjQrZ28qk7K5H44m/Q7BYgkAk+4uh0yRi0kdRiZNt/owbx
# iBhqkCI8vP4T8IcUe/bkH47U5FHGEWdGCFHLhhRUP7wz/n5snP8WnRi9UY41pqdm
# yHJn2yFmsdSbeAPAUDrozPDcvJ5M/q8FljUfV1q3/875PbcstvZU3cjnEjpNrkyK
# t1yatLcgPcp/IjSufjtoZgFE5wFORlObM2D3lL5TN5BzQ/Myw1Pv26r+dE5px2uM
# YJPexMcM3+EyrsyTO1F4lWeL7j1W/gzQaQ8bD/MlJmszbfduR/pzQ+V+DqVmsSl8
# MoRjVYnEDcGTVDAZE6zTfTen6106bDVc20HXEtqpSQvf2ICKCZNijrVmzyWIzYS4
# sT+kOQ/ZAp7rEkyVfPNrBaleFoPMuGfi6BOdzFuC00yz7Vv/3uVzrCM7LQC/NVV0
# CUnYSVgaf5I25lGSDvMmfRxNF7zJ7EMm0L9BX0CpRET0medXh55QH1dUqD79dGMv
# sVBlCeZYQi5DGky08CVHWfoEHpPUJkZKUIGy3r54t/xnFeHJV4QeD2PW6WK61l9V
# LupcxigIBCU5uA4rqfJMlxwHPw1S9e3vL4IPAgMBAAGjgfIwge8wHwYDVR0jBBgw
# FoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYEFFN5v1qqK0rPVIDh2JvA
# nfKyA2bLMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MBEGA1UdIAQK
# MAgwBgYEVR0gADBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsLmNvbW9kb2Nh
# LmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDA0BggrBgEFBQcBAQQoMCYw
# JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG9w0B
# AQwFAAOCAQEAGIdR3HQhPZyK4Ce3M9AuzOzw5steEd4ib5t1jp5y/uTW/qofnJYt
# 7wNKfq70jW9yPEM7wD/ruN9cqqnGrvL82O6je0P2hjZ8FODN9Pc//t64tIrwkZb+
# /UNkfv3M0gGhfX34GRnJQisTv1iLuqSiZgR2iJFODIkUzqJNyTKzuugUGrxx8Vvw
# QQuYAAoiAxDlDLH5zZI3Ge078eQ6tvlFEyZ1r7uq7z97dzvSxAKRPRkA0xdcOds/
# exgNRc2ThZYvXd9ZFk8/Ub3VRRg/7UqO6AZhdCMWtQ1QcydER38QXYkqa4UxFMTo
# qWpMgLxqeM+4f452cpkMnf7XkQgWoaNflTCCBfUwggPdoAMCAQICEB2iSDBvmyYY
# 0ILgln0z02owDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQI
# EwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhl
# IFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRp
# ZmljYXRpb24gQXV0aG9yaXR5MB4XDTE4MTEwMjAwMDAwMFoXDTMwMTIzMTIzNTk1
# OVowfDELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ
# MA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSQwIgYD
# VQQDExtTZWN0aWdvIFJTQSBDb2RlIFNpZ25pbmcgQ0EwggEiMA0GCSqGSIb3DQEB
# AQUAA4IBDwAwggEKAoIBAQCGIo0yhXoYn0nwli9jCB4t3HyfFM/jJrYlZilAhlRG
# dDFixRDtsocnppnLlTDAVvWkdcapDlBipVGREGrgS2Ku/fD4GKyn/+4uMyD6DBmJ
# qGx7rQDDYaHcaWVtH24nlteXUYam9CflfGqLlR5bYNV+1xaSnAAvaPeX7Wpyvjg7
# Y96Pv25MQV0SIAhZ6DnNj9LWzwa0VwW2TqE+V2sfmLzEYtYbC43HZhtKn52BxHJA
# teJf7wtF/6POF6YtVbC3sLxUap28jVZTxvC6eVBJLPcDuf4vZTXyIuosB69G2flG
# HNyMfHEo8/6nxhTdVZFuihEN3wYklX0Pp6F8OtqGNWHTAgMBAAGjggFkMIIBYDAf
# BgNVHSMEGDAWgBRTeb9aqitKz1SA4dibwJ3ysgNmyzAdBgNVHQ4EFgQUDuE6qFM6
# MdWKvsG7rWcaA4WtNA4wDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8C
# AQAwHQYDVR0lBBYwFAYIKwYBBQUHAwMGCCsGAQUFBwMIMBEGA1UdIAQKMAgwBgYE
# VR0gADBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20v
# VVNFUlRydXN0UlNBQ2VydGlmaWNhdGlvbkF1dGhvcml0eS5jcmwwdgYIKwYBBQUH
# AQEEajBoMD8GCCsGAQUFBzAChjNodHRwOi8vY3J0LnVzZXJ0cnVzdC5jb20vVVNF
# UlRydXN0UlNBQWRkVHJ1c3RDQS5jcnQwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3Nw
# LnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggIBAE1jUO1HNEphpNveaiqM
# m/EAAB4dYns61zLC9rPgY7P7YQCImhttEAcET7646ol4IusPRuzzRl5ARokS9At3
# WpwqQTr81vTr5/cVlTPDoYMot94v5JT3hTODLUpASL+awk9KsY8k9LOBN9O3ZLCm
# I2pZaFJCX/8E6+F0ZXkI9amT3mtxQJmWunjxucjiwwgWsatjWsgVgG10Xkp1fqW4
# w2y1z99KeYdcx0BNYzX2MNPPtQoOCwR/oEuuu6Ol0IQAkz5TXTSlADVpbL6fICUQ
# DRn7UJBhvjmPeo5N9p8OHv4HURJmgyYZSJXOSsnBf/M6BZv5b9+If8AjntIeQ3pF
# McGcTanwWbJZGehqjSkEAnd8S0vNcL46slVaeD68u28DECV3FTSK+TbMQ5Lkuk/x
# YpMoJVcp+1EZx6ElQGqEV8aynbG8HArafGd+fS7pKEwYfsR7MUFxmksp7As9V1DS
# yt39ngVR5UR43QHesXWYDVQk/fBO4+L4g71yuss9Ou7wXheSaG3IYfmm8SoKC6W5
# 9J7umDIFhZ7r+YMp08Ysfb06dy6LN0KgaoLtO0qqlBCk4Q34F8W2WnkzGJLjtXX4
# oemOCiUe5B7xn1qHI/+fpFGe+zmAEc3btcSnqIBv5VPU4OOiwtJbGvoyJi1qV3Ac
# PKRYLqPzW0sH3DJZ84enGm1YMYICMjCCAi4CAQEwgZAwfDELMAkGA1UEBhMCR0Ix
# GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEY
# MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSQwIgYDVQQDExtTZWN0aWdvIFJTQSBD
# b2RlIFNpZ25pbmcgQ0ECEFii1y2MwP2JzP8h4NTtx0owCQYFKw4DAhoFAKB4MBgG
# CisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcC
# AQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYE
# FPvoURlVLtMyc41aoH1W7jNXhNkUMA0GCSqGSIb3DQEBAQUABIIBACa4ISoVYuy4
# LQD5f2XzRDboWCOwR2ClFczB/vOn7uX+RKpbW+vZwllcL0wk0kA4Iotk12yKLAni
# K0DkhX8P/Gt5B4hMFaWYKkwTZljITgCEHoAy8vQzpfDUdfJF40R7IIEQLzr2/n5q
# Iztv/ApXsPX8SkgEGdikFbBA0i/xtzI8+3sI1QINiRig8xEH/1eOZlR54YHwClvS
# 8QhXueb9NbqNN9oKBwx5gRWcOE4I2E5mYAppDDQyhqitbeeY2Pw4Eo5koLM3zTDy
# 4/zc+A9lNkAa5eDTavxMHQVqKgO5KomzIYHAdIFnKs85SdntIOr5nSAHnAl6svTh
# iJXqSEggdX8=
# SIG # End signature block

Binary file not shown.

BIN
share/empty3.kdbx Normal file

Binary file not shown.

BIN
share/empty4.kdbx Normal file

Binary file not shown.

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path style="stroke-width:.65502" d="M7.275.645a2.949 2.949 0 0 0-1.404.298c-1.34.571-2.058 2.064-1.918 3.475-.085.269.215.925-.248.816-.77-.119-1.655.327-1.71 1.176-.016 2.092-.004 4.183-.009 6.276-.119.769.329 1.654 1.176 1.712 1.855.012 3.711.006 5.567.004v-1.308H3.297v-6.55h7.861v4.106h1.301c0-1.252.002-2.504.008-3.755.137-.804-.444-1.689-1.309-1.66h-.656c-.021-.693.062-1.395-.09-2.077C10.112 1.7 8.71.688 7.275.645zm-.048 1.314c.465-.001.929.17 1.28.475.869.681.665 1.836.686 2.8H5.32c-.139-.22-.017-.701-.058-1.02-.153-1.14.789-2.292 1.965-2.255zm.097 6.559c-.37-.04-.752.069-1.025.373-.834.75-.195 2.3.928 2.238.736.016 1.37-.659 1.308-1.393-.008-.676-.594-1.153-1.21-1.218z" transform="translate(-.218 .136) scale(1.04251)"/><path style="fill:#000;fill-opacity:1;fill-rule:evenodd;stroke-width:.857645" d="M11.773 18.34c-1.322.064-2.213-1.618-1.424-2.677.676-1.116 2.527-.937 2.994.27.513 1.094-.357 2.434-1.57 2.406zm5.146 2.572v-8.576H6.627v8.576h10.292zm0-10.292c1.038-.032 1.855.99 1.715 1.993-.01 2.84.019 5.68-.014 8.519-.096.979-1.095 1.626-2.034 1.495-3.378-.006-6.757.012-10.135-.009-1.032-.072-1.677-1.125-1.54-2.094.007-2.788-.01-5.577.01-8.365.068-1.003 1.084-1.67 2.038-1.539.432.09.635-.048.526-.498-.025-1.262-.04-2.616.77-3.67 1.263-1.913 4.126-2.424 5.971-1.064 1.326.884 1.959 2.516 1.835 4.071v1.161h.858zm-5.146-4.288c-1.49-.044-2.739 1.385-2.573 2.85v1.438h5.146c-.053-1.126.231-2.4-.575-3.336a2.578 2.578 0 0 0-1.998-.952z" transform="matrix(.99434 0 0 .99434 3.623 .679)"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="mdi-lock-outline" width="24" height="24" viewBox="0 0 24 24"><path d="M12,17C10.89,17 10,16.1 10,15C10,13.89 10.89,13 12,13A2,2 0 0,1 14,15A2,2 0 0,1 12,17M18,20V10H6V20H18M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6C4.89,22 4,21.1 4,20V10C4,8.89 4.89,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z" /></svg> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="M12 17a2 2 0 0 1-2-2c0-1.11.89-2 2-2a2 2 0 0 1 2 2 2 2 0 0 1-2 2m6 3V10H6v10h12m0-12a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V10c0-1.11.89-2 2-2h1V6a5 5 0 0 1 5-5 5 5 0 0 1 5 5v2h1m-6-5a3 3 0 0 0-3 3v2h6V6a3 3 0 0 0-3-3z"/></svg>

Before

Width:  |  Height:  |  Size: 583 B

After

Width:  |  Height:  |  Size: 307 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M12,3A9,9 0 0,0 3,12H0L4,16L8,12H5A7,7 0 0,1 12,5A7,7 0 0,1 19,12A7,7 0 0,1 12,19C10.5,19 9.09,18.5 7.94,17.7L6.5,19.14C8.04,20.3 9.94,21 12,21A9,9 0 0,0 21,12A9,9 0 0,0 12,3M14,12A2,2 0 0,0 12,10A2,2 0 0,0 10,12A2,2 0 0,0 12,14A2,2 0 0,0 14,12Z" /></svg>

After

Width:  |  Height:  |  Size: 540 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M17.81,4.47C17.73,4.47 17.65,4.45 17.58,4.41C15.66,3.42 14,3 12,3C10.03,3 8.15,3.47 6.44,4.41C6.2,4.54 5.9,4.45 5.76,4.21C5.63,3.97 5.72,3.66 5.96,3.53C7.82,2.5 9.86,2 12,2C14.14,2 16,2.47 18.04,3.5C18.29,3.65 18.38,3.95 18.25,4.19C18.16,4.37 18,4.47 17.81,4.47M3.5,9.72C3.4,9.72 3.3,9.69 3.21,9.63C3,9.47 2.93,9.16 3.09,8.93C4.08,7.53 5.34,6.43 6.84,5.66C10,4.04 14,4.03 17.15,5.65C18.65,6.42 19.91,7.5 20.9,8.9C21.06,9.12 21,9.44 20.78,9.6C20.55,9.76 20.24,9.71 20.08,9.5C19.18,8.22 18.04,7.23 16.69,6.54C13.82,5.07 10.15,5.07 7.29,6.55C5.93,7.25 4.79,8.25 3.89,9.5C3.81,9.65 3.66,9.72 3.5,9.72M9.75,21.79C9.62,21.79 9.5,21.74 9.4,21.64C8.53,20.77 8.06,20.21 7.39,19C6.7,17.77 6.34,16.27 6.34,14.66C6.34,11.69 8.88,9.27 12,9.27C15.12,9.27 17.66,11.69 17.66,14.66A0.5,0.5 0 0,1 17.16,15.16A0.5,0.5 0 0,1 16.66,14.66C16.66,12.24 14.57,10.27 12,10.27C9.43,10.27 7.34,12.24 7.34,14.66C7.34,16.1 7.66,17.43 8.27,18.5C8.91,19.66 9.35,20.15 10.12,20.93C10.31,21.13 10.31,21.44 10.12,21.64C10,21.74 9.88,21.79 9.75,21.79M16.92,19.94C15.73,19.94 14.68,19.64 13.82,19.05C12.33,18.04 11.44,16.4 11.44,14.66A0.5,0.5 0 0,1 11.94,14.16A0.5,0.5 0 0,1 12.44,14.66C12.44,16.07 13.16,17.4 14.38,18.22C15.09,18.7 15.92,18.93 16.92,18.93C17.16,18.93 17.56,18.9 17.96,18.83C18.23,18.78 18.5,18.96 18.54,19.24C18.59,19.5 18.41,19.77 18.13,19.82C17.56,19.93 17.06,19.94 16.92,19.94M14.91,22C14.87,22 14.82,22 14.78,22C13.19,21.54 12.15,20.95 11.06,19.88C9.66,18.5 8.89,16.64 8.89,14.66C8.89,13.04 10.27,11.72 11.97,11.72C13.67,11.72 15.05,13.04 15.05,14.66C15.05,15.73 16,16.6 17.13,16.6C18.28,16.6 19.21,15.73 19.21,14.66C19.21,10.89 15.96,7.83 11.96,7.83C9.12,7.83 6.5,9.41 5.35,11.86C4.96,12.67 4.76,13.62 4.76,14.66C4.76,15.44 4.83,16.67 5.43,18.27C5.53,18.53 5.4,18.82 5.14,18.91C4.88,19 4.59,18.87 4.5,18.62C4,17.31 3.77,16 3.77,14.66C3.77,13.46 4,12.37 4.45,11.42C5.78,8.63 8.73,6.82 11.96,6.82C16.5,6.82 20.21,10.33 20.21,14.65C20.21,16.27 18.83,17.59 17.13,17.59C15.43,17.59 14.05,16.27 14.05,14.65C14.05,13.58 13.12,12.71 11.97,12.71C10.82,12.71 9.89,13.58 9.89,14.65C9.89,16.36 10.55,17.96 11.76,19.16C12.71,20.1 13.62,20.62 15.03,21C15.3,21.08 15.45,21.36 15.38,21.62C15.33,21.85 15.12,22 14.91,22Z" /></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="M6 2.58c-1.11 0-2 .89-2 2v1.572l-1.951-.007a1.99 1.99 0 0 0-2 2v12c0 1.11.89 2 2 2h16a1.99 1.99 0 0 0 2-2l-.01-1.565H22c1.11 0 2-.89 2-2v-10c0-1.11-.89-2-2-2h-8l-2-2H6zm0 4h16v10H6v-10zm10 2v2h-2v2h2v2h2v-2h2v-2h-2v-2h-2zM2.049 10.145 4 10.158v6.422c0 1.11.89 2 2 2h12.053l-.004 1.565h-16v-10z"/></svg>

After

Width:  |  Height:  |  Size: 374 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M13.78 15.3L19.78 21.3L21.89 19.14L15.89 13.14L13.78 15.3M17.5 10.1C17.11 10.1 16.69 10.05 16.36 9.91L4.97 21.25L2.86 19.14L10.27 11.74L8.5 9.96L7.78 10.66L6.33 9.25V12.11L5.63 12.81L2.11 9.25L2.81 8.55H5.62L4.22 7.14L7.78 3.58C8.95 2.41 10.83 2.41 12 3.58L9.89 5.74L11.3 7.14L10.59 7.85L12.38 9.63L14.2 7.75C14.06 7.42 14 7 14 6.63C14 4.66 15.56 3.11 17.5 3.11C18.09 3.11 18.61 3.25 19.08 3.53L16.41 6.2L17.91 7.7L20.58 5.03C20.86 5.5 21 6 21 6.63C21 8.55 19.45 10.1 17.5 10.1Z" /></svg>

After

Width:  |  Height:  |  Size: 773 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M12,1A5,5 0 0,0 7,6V8H6A2,2 0 0,0 4,10V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V10A2,2 0 0,0 18,8H17V6A5,5 0 0,0 12,1M12,2.9C13.71,2.9 15.1,4.29 15.1,6V8H8.9V6C8.9,4.29 10.29,2.9 12,2.9M12.19,10.5C13.13,10.5 13.88,10.71 14.42,11.12C14.96,11.54 15.23,12.1 15.23,12.8C15.23,13.24 15.08,13.63 14.79,14C14.5,14.36 14.12,14.64 13.66,14.85C13.4,15 13.23,15.15 13.14,15.32C13.05,15.5 13,15.72 13,16H11C11,15.5 11.1,15.16 11.29,14.92C11.5,14.68 11.84,14.4 12.36,14.08C12.62,13.94 12.83,13.76 13,13.54C13.14,13.33 13.22,13.08 13.22,12.8C13.22,12.5 13.13,12.28 12.95,12.11C12.77,11.93 12.5,11.85 12.19,11.85C11.92,11.85 11.7,11.92 11.5,12.06C11.34,12.2 11.24,12.41 11.24,12.69H9.27C9.22,12 9.5,11.4 10.05,11.04C10.59,10.68 11.3,10.5 12.19,10.5M11,17H13V19H11V17Z" /></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M22 13C22 13.53 21.79 14.04 21.41 14.41L21 14.83C20.91 11.97 18.84 9.62 16.11 9.11L11 4H4V11L9.11 16.11C9.62 18.84 11.97 20.91 14.83 21L14.41 21.41C14.04 21.79 13.53 22 13 22C12.47 22 11.97 21.79 11.59 21.42L2.59 12.42C2.21 12.04 2 11.53 2 11V4C2 2.9 2.9 2 4 2H11C11.53 2 12.04 2.21 12.41 2.58L21.41 11.58C21.79 11.96 22 12.47 22 13M5 6.5C5 7.33 5.67 8 6.5 8S8 7.33 8 6.5 7.33 5 6.5 5 5 5.67 5 6.5M15.11 10.61C12.61 10.61 10.61 12.61 10.61 15.11S12.61 19.61 15.11 19.61C16 19.61 16.8 19.36 17.5 18.93L20.61 22L22 20.61L18.92 17.5C19.36 16.82 19.61 16 19.61 15.11C19.61 12.61 17.61 10.61 15.11 10.61M15.11 12.61C16.5 12.61 17.61 13.73 17.61 15.11S16.5 17.61 15.11 17.61 12.61 16.5 12.61 15.11 13.73 12.61 15.11 12.61" /></svg>

After

Width:  |  Height:  |  Size: 1010 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M21.41 11.58L12.41 2.58A2 2 0 0 0 11 2H4A2 2 0 0 0 2 4V11A2 2 0 0 0 2.59 12.42L11.59 21.42A2 2 0 0 0 13 22A2 2 0 0 0 14.41 21.41L21.41 14.41A2 2 0 0 0 22 13A2 2 0 0 0 21.41 11.58M13 20L4 11V4H11L20 13M6.5 5A1.5 1.5 0 1 1 5 6.5A1.5 1.5 0 0 1 6.5 5Z" /></svg>

After

Width:  |  Height:  |  Size: 542 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M6,19A2,2 0 0,0 8,21H16A2,2 0 0,0 18,19V7H6V19M8,9H16V19H8V9M15.5,4L14.5,3H9.5L8.5,4H5V6H19V4H15.5Z" /></svg>

After

Width:  |  Height:  |  Size: 394 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M17.63,5.84C17.27,5.33 16.67,5 16,5H5A2,2 0 0,0 3,7V17A2,2 0 0,0 5,19H16C16.67,19 17.27,18.66 17.63,18.15L22,12L17.63,5.84Z" /></svg>

After

Width:  |  Height:  |  Size: 418 B

View File

@@ -1 +1 @@
<svg viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><g><path d="M41 6H7c-.6.0-1 .4-1 1V42H42V7C42 6.4 41.6 6 41 6z" style="fill:#cfd8dc;fill-rule:nonzero"/></g><rect x="8" y="13" width="32" height="27" style="fill:#263238"/><g transform="matrix(1.00639,0,0,1.00639,12.7027,31.2351)"><g><text x="0" y="0" style="font-family:roboto-bold,roboto;font-weight:700;font-size:22px;fill:#76ff03">>_</text></g></g><g><circle cx="13.5" cy="9.5" r="1.5" style="fill:#90a4ae"/><circle cx="9.5" cy="9.5" r="1.5" style="fill:#90a4ae"/></g><g transform="matrix(1,0,0,1,1.02128,-0.291791)"><g id="polygon2" transform="matrix(0.438989,0,0,0.598621,-3.05709,20.013)"><path d="M22 45l-4-4V21H30v8l-2 2 2 2v2l-2 2 2 2v2l-4 4H22z" style="fill:#ffa000;fill-rule:nonzero"/></g><g id="path4" transform="matrix(0.438989,0,0,0.598621,-3.05709,20.013)"><path d="M38 7.8c-.5-1.8-2-3.1-3.7-3.6C31.9 3.7 28.2 3 24 3s-7.9.7-10.3 1.2C12 4.7 10.5 6 10 7.8c-.5 1.7-1 4.1-1 6.7s.5 5 1 6.7c.5 1.8 1.9 3.1 3.7 3.5C16.1 25.3 19.8 26 24 26S31.9 25.3 34.3 24.8C36.1 24.4 37.5 23 38 21.3s1-4.1 1-6.7c0-2.7-.5-5.1-1-6.8zM29 13H19c-1.1.0-2-.9-2-2V9c0-.6 3.1-1 7-1s7 .4 7 1v2C31 12.1 30.1 13 29 13z" style="fill:#ffa000;fill-rule:nonzero"/></g><g id="rect8" transform="matrix(0.598621,0,0,0.598621,-7.50244,20.013)"><rect x="23.559" y="26" width="2" height="19" style="fill:#d68600"/></g></g></svg> <svg viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M41 6H7c-.6 0-1 .4-1 1v35h36V7c0-.6-.4-1-1-1z" style="fill:#cfd8dc;fill-rule:nonzero"/><path style="fill:#263238" d="M8 13h32v27H8z"/><path d="M.046-.081v-.138l.343-.135-.343-.133v-.138l.492.213v.117l-.492.214z" style="fill:#76ff03;fill-rule:nonzero" transform="translate(12.703 31.235) scale(22.14058)"/><path style="fill:#76ff03;fill-rule:nonzero" d="M-.009.109h.57v.089h-.57z" transform="translate(25.632 31.235) scale(22.14058)"/><circle cx="13.5" cy="9.5" r="1.5" style="fill:#90a4ae"/><circle cx="9.5" cy="9.5" r="1.5" style="fill:#90a4ae"/><g><path d="m22 45-4-4V21h12v8l-2 2 2 2v2l-2 2 2 2v2l-4 4h-4z" style="fill:#ffa000;fill-rule:nonzero" transform="matrix(.43899 0 0 .59862 -2.036 19.721)"/><path d="M38 7.8c-.5-1.8-2-3.1-3.7-3.6C31.9 3.7 28.2 3 24 3c-4.2 0-7.9.7-10.3 1.2C12 4.7 10.5 6 10 7.8c-.5 1.7-1 4.1-1 6.7 0 2.6.5 5 1 6.7.5 1.8 1.9 3.1 3.7 3.5 2.4.6 6.1 1.3 10.3 1.3 4.2 0 7.9-.7 10.3-1.2 1.8-.4 3.2-1.8 3.7-3.5s1-4.1 1-6.7c0-2.7-.5-5.1-1-6.8zM29 13H19c-1.1 0-2-.9-2-2V9c0-.6 3.1-1 7-1s7 .4 7 1v2c0 1.1-.9 2-2 2z" style="fill:#ffa000;fill-rule:nonzero" transform="matrix(.43899 0 0 .59862 -2.036 19.721)"/><path style="fill:#d68600" d="M23.559 26h2v19h-2z" transform="translate(-6.481 19.721) scale(.59862)"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1 +1 @@
<svg viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><g><path d="M41 6H7c-.6.0-1 .4-1 1V42H42V7C42 6.4 41.6 6 41 6z" style="fill:#cfd8dc;fill-rule:nonzero"/></g><rect x="8" y="13" width="32" height="27" style="fill:#263238"/><g transform="matrix(1.00639,0,0,1.00639,12.7027,31.2351)"><g><text x="0" y="0" style="font-family:roboto-bold,roboto;font-weight:700;font-size:22px;fill:#76ff03">>_</text></g></g><g><circle cx="13.5" cy="9.5" r="1.5" style="fill:#90a4ae"/><circle cx="9.5" cy="9.5" r="1.5" style="fill:#90a4ae"/></g></svg> <svg viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M41 6H7c-.6 0-1 .4-1 1v35h36V7c0-.6-.4-1-1-1z" style="fill:#cfd8dc;fill-rule:nonzero"/><path style="fill:#263238" d="M8 13h32v27H8z"/><path d="M.046-.081v-.138l.343-.135-.343-.133v-.138l.492.213v.117l-.492.214z" style="fill:#76ff03;fill-rule:nonzero" transform="translate(12.703 31.235) scale(22.14058)"/><path style="fill:#76ff03;fill-rule:nonzero" d="M-.009.109h.57v.089h-.57z" transform="translate(25.632 31.235) scale(22.14058)"/><g><circle cx="13.5" cy="9.5" r="1.5" style="fill:#90a4ae"/><circle cx="9.5" cy="9.5" r="1.5" style="fill:#90a4ae"/></g></svg>

Before

Width:  |  Height:  |  Size: 703 B

After

Width:  |  Height:  |  Size: 715 B

View File

@@ -15,6 +15,7 @@
<file>application/scalable/actions/configure.svg</file> <file>application/scalable/actions/configure.svg</file>
<file>application/scalable/actions/database-change-key.svg</file> <file>application/scalable/actions/database-change-key.svg</file>
<file>application/scalable/actions/database-lock.svg</file> <file>application/scalable/actions/database-lock.svg</file>
<file>application/scalable/actions/database-lock-all.svg</file>
<file>application/scalable/actions/database-merge.svg</file> <file>application/scalable/actions/database-merge.svg</file>
<file>application/scalable/actions/dialog-close.svg</file> <file>application/scalable/actions/dialog-close.svg</file>
<file>application/scalable/actions/dialog-ok.svg</file> <file>application/scalable/actions/dialog-ok.svg</file>
@@ -34,18 +35,23 @@
<file>application/scalable/actions/edit-clear-locationbar-rtl.svg</file> <file>application/scalable/actions/edit-clear-locationbar-rtl.svg</file>
<file>application/scalable/actions/entry-clone.svg</file> <file>application/scalable/actions/entry-clone.svg</file>
<file>application/scalable/actions/entry-delete.svg</file> <file>application/scalable/actions/entry-delete.svg</file>
<file>application/scalable/actions/entry-restore.svg</file>
<file>application/scalable/actions/entry-edit.svg</file> <file>application/scalable/actions/entry-edit.svg</file>
<file>application/scalable/actions/entry-new.svg</file> <file>application/scalable/actions/entry-new.svg</file>
<file>application/scalable/actions/favicon-download.svg</file> <file>application/scalable/actions/favicon-download.svg</file>
<file>application/scalable/actions/fingerprint.svg</file>
<file>application/scalable/actions/getting-started.svg</file> <file>application/scalable/actions/getting-started.svg</file>
<file>application/scalable/actions/group-delete.svg</file> <file>application/scalable/actions/group-delete.svg</file>
<file>application/scalable/actions/group-edit.svg</file> <file>application/scalable/actions/group-edit.svg</file>
<file>application/scalable/actions/group-clone.svg</file>
<file>application/scalable/actions/group-empty-trash.svg</file> <file>application/scalable/actions/group-empty-trash.svg</file>
<file>application/scalable/actions/group-new.svg</file> <file>application/scalable/actions/group-new.svg</file>
<file>application/scalable/actions/hammer-wrench.svg</file>
<file>application/scalable/actions/health.svg</file> <file>application/scalable/actions/health.svg</file>
<file>application/scalable/actions/help-about.svg</file> <file>application/scalable/actions/help-about.svg</file>
<file>application/scalable/actions/hibp.svg</file> <file>application/scalable/actions/hibp.svg</file>
<file>application/scalable/actions/key-enter.svg</file> <file>application/scalable/actions/key-enter.svg</file>
<file>application/scalable/actions/lock-question.svg</file>
<file>application/scalable/actions/keyboard-shortcuts.svg</file> <file>application/scalable/actions/keyboard-shortcuts.svg</file>
<file>application/scalable/actions/message-close.svg</file> <file>application/scalable/actions/message-close.svg</file>
<file>application/scalable/actions/move-down.svg</file> <file>application/scalable/actions/move-down.svg</file>
@@ -58,7 +64,7 @@
<file>application/scalable/actions/password-generator.svg</file> <file>application/scalable/actions/password-generator.svg</file>
<file>application/scalable/actions/password-show-off.svg</file> <file>application/scalable/actions/password-show-off.svg</file>
<file>application/scalable/actions/password-show-on.svg</file> <file>application/scalable/actions/password-show-on.svg</file>
<file>application/scalable/actions/refresh.svg</file> <file>application/scalable/actions/refresh.svg</file>
<file>application/scalable/actions/reports.svg</file> <file>application/scalable/actions/reports.svg</file>
<file>application/scalable/actions/reports-exclude.svg</file> <file>application/scalable/actions/reports-exclude.svg</file>
<file>application/scalable/actions/sort-alphabetical-ascending.svg</file> <file>application/scalable/actions/sort-alphabetical-ascending.svg</file>
@@ -67,12 +73,14 @@
<file>application/scalable/actions/system-help.svg</file> <file>application/scalable/actions/system-help.svg</file>
<file>application/scalable/actions/system-search.svg</file> <file>application/scalable/actions/system-search.svg</file>
<file>application/scalable/actions/system-software-update.svg</file> <file>application/scalable/actions/system-software-update.svg</file>
<file>application/scalable/actions/tag.svg</file>
<file>application/scalable/actions/tag-search.svg</file>
<file>application/scalable/actions/trash.svg</file>
<file>application/scalable/actions/url-copy.svg</file> <file>application/scalable/actions/url-copy.svg</file>
<file>application/scalable/actions/user-guide.svg</file> <file>application/scalable/actions/user-guide.svg</file>
<file>application/scalable/actions/username-copy.svg</file> <file>application/scalable/actions/username-copy.svg</file>
<file>application/scalable/actions/view-history.svg</file> <file>application/scalable/actions/view-history.svg</file>
<file>application/scalable/actions/web.svg</file> <file>application/scalable/actions/web.svg</file>
<file>application/scalable/apps/freedesktop.svg</file> <file>application/scalable/apps/freedesktop.svg</file>
<file>application/scalable/apps/internet-web-browser.svg</file> <file>application/scalable/apps/internet-web-browser.svg</file>
<file>application/scalable/apps/keepassxc.svg</file> <file>application/scalable/apps/keepassxc.svg</file>

View File

@@ -18,4 +18,4 @@ minify -o icons/database --match=.svg icons/database
# Crush PNG's # Crush PNG's
echo "Crushing PNG's..." echo "Crushing PNG's..."
find "." -iname '*png' -exec pngcrush -ow -brute {} \; find . -iname '*.png' -exec pngcrush -ow -brute {} \;

View File

@@ -50,6 +50,86 @@
</screenshots> </screenshots>
<releases> <releases>
<release version="2.6.6" date="2021-06-11">
<description>
<ul>
<li>Fix focusing search when pressing hotkey [#6603]</li>
<li>Trim whitespace from TOTP key input prior to processing [#6604]</li>
<li>Fix building on macOS [#6598]</li>
<li>Resolve compiler warnings for unused return values [#6607]</li>
</ul>
</description>
</release>
<release version="2.6.5" date="2021-06-07">
<description>
<ul>
<li>Show search bar when toolbar is hidden or in overflow [#6279]</li>
<li>Show countdown for clipboard clearing in status bar [#6333]</li>
<li>Command line option to lock all open databases [#6511]</li>
<li>Allow CSV import of bare TOTP secrets [#6211]</li>
<li>Retain file creation time when saving database [#6576]</li>
<li>Set permissions of saved attachments to be private to the current user [#6363]</li>
<li>OPVault: Use Text instead of Name for attribute names [#6334]</li>
<li>Reports: Allow resizing of reports columns [#6435]</li>
<li>Reports: Toggle showing expired entries [#6534]</li>
<li>Save Always on Top setting [#6236]</li>
<li>Password generator can exclude additional lookalike characters (6/G, 8/B) [#6196]</li>
<li>Allow setting MSI properties in unattended install [#6196]</li>
<li>Update MainWindow minimum size to enable smaller verticle space [#6196]</li>
<li>Use application font size when setting default or monospace fonts [#6332]</li>
<li>Fix notes not clearing in entry preview panel in some cases [#6481]</li>
<li>macOS: Correct window activation when restoring from tray [#6575]</li>
<li>macOS: Better handling of minimize after unlock when using browser integration [#6338]</li>
<li>Linux: Start after the system tray is available on LXQt [#6216]</li>
<li>Linux: Allow selection of modal dialogs on X11 in Auto-Type [#6204]</li>
<li>KeeShare: prevent crash when file extension is missing [#6174]</li>
</ul>
</description>
</release>
<release version="2.6.4" date="2021-01-31">
<description>
<ul>
<li>Automatically adapt to light/dark system theme changes (Windows/macOS only) [#6034]</li>
<li>Show window title as tooltip on system tray [#5948]</li>
<li>Compress Snap release as LZO for faster initial startup [#5877]</li>
<li>Password generator: Set maximum selectable password length to 999 [#5937]</li>
<li>Fix crash on app close when using SSH agent [#5935]</li>
<li>Fix KDF selection showing wrong item when using Argon2id [#5923]</li>
<li>Automatically close About dialog on database lock if it is still open [#5947]</li>
<li>Linux: Fix automatic launch at system startup with AppImages [#5901]</li>
<li>Linux: Fix click-to-move on empty area activating when using menus [#5971]</li>
<li>Linux: Try multiple times to show tray icon if tray is not ready yet [#5948]</li>
<li>macOS: Fix KeePassXC blocking clean shutdown [#6002]</li>
</ul>
</description>
</release>
<release version="2.6.3" date="2021-01-12">
<description>
<ul>
<li>Support Argon2id KDF [#5778]</li>
<li>Support XMLv2 key files [#5798]</li>
<li>Improve CSV Import/Export, include time fields and TOTP [#5346]</li>
<li>Support empty area dragging of the application window [#5860]</li>
<li>Display default Auto-Type sequence in preview pane [#5654]</li>
<li>Remove strict length limit on generated passwords [#5748]</li>
<li>Hide key file path by default when unlocking database [#5779]</li>
<li>Document browser extension use with Edge in managed mode [#5692]</li>
<li>Windows: Prevent clipboard history and cloud sync [#5853]</li>
<li>macOS: Update the application icon to Big Sur styling [#5851]</li>
<li>Re-select previously selected entry on database unlock [#5559]</li>
<li>Properly save special character choice in password generator [#5610]</li>
<li>Fix crash in browser integration with multiple similar entries [#5653]</li>
<li>Remove offset on username field in classic theme [#5788]</li>
<li>Ensure entry history is copied when drag/dropping entries and groups [#5817]</li>
<li>Close modal dialogs when database is locked [#5820]</li>
<li>Prevent crash when KeeShare modifies an entry that is currently being edited [#5827]</li>
<li>Improve preview of entry attributes [#5834]</li>
<li>Always activate/focus database open dialog preventing mistype [#5878]</li>
<li>Reports: fix calculation of average password length [#5862]</li>
<li>Linux: Delay startup on login to correct tray icon issues [#5724]</li>
</ul>
</description>
</release>
<release version="2.6.2" date="2020-10-21"> <release version="2.6.2" date="2020-10-21">
<description> <description>
<ul> <ul>

View File

@@ -23,7 +23,7 @@ GenericName[pl]=Menedżer haseł
GenericName[pt_BR]=Gerenciador de Senhas GenericName[pt_BR]=Gerenciador de Senhas
GenericName[pt]=Gestor de palavras-passe GenericName[pt]=Gestor de palavras-passe
GenericName[ro]=Manager de parole GenericName[ro]=Manager de parole
GenericName[ru]=менеджер паролей GenericName[ru]=Менеджер паролей
GenericName[sk]=Správca hesiel GenericName[sk]=Správca hesiel
GenericName[sv]=Lösenordshanterare GenericName[sv]=Lösenordshanterare
GenericName[th]=แอพจัดการรหัสผ่าน GenericName[th]=แอพจัดการรหัสผ่าน
@@ -34,6 +34,7 @@ GenericName[zh_TW]=密碼管理員
Comment=Community-driven port of the Windows application “KeePass Password Safe” Comment=Community-driven port of the Windows application “KeePass Password Safe”
Comment[da]=Fællesskabsdrevet port af Windows-programmet “KeePass Password Safe” Comment[da]=Fællesskabsdrevet port af Windows-programmet “KeePass Password Safe”
Comment[et]=Kogukonna arendatav port Windowsi programmist KeePass Password Safe Comment[et]=Kogukonna arendatav port Windowsi programmist KeePass Password Safe
Comment[ru]=Разработанный сообществом порт Windows-приложения KeePass Password Safe
Exec=keepassxc %f Exec=keepassxc %f
TryExec=keepassxc TryExec=keepassxc
Icon=keepassxc Icon=keepassxc

7697
share/macosx/keepassxc.ai Executable file

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 783 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

View File

@@ -15,14 +15,14 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
file(GLOB TRANSLATION_FILES *.ts) file(GLOB TRANSLATION_FILES *.ts)
get_filename_component(TRANSLATION_EN_ABS keepassx_en.ts ABSOLUTE) get_filename_component(TRANSLATION_EN_ABS keepassxc_en.ts ABSOLUTE)
list(REMOVE_ITEM TRANSLATION_FILES keepassx_en.ts) list(REMOVE_ITEM TRANSLATION_FILES keepassxc_en.ts)
list(REMOVE_ITEM TRANSLATION_FILES ${TRANSLATION_EN_ABS}) list(REMOVE_ITEM TRANSLATION_FILES ${TRANSLATION_EN_ABS})
message(STATUS "Including translations...\n") message(STATUS "Including translations...\n")
qt5_add_translation(QM_FILES ${TRANSLATION_FILES}) qt5_add_translation(QM_FILES ${TRANSLATION_FILES})
if(MINGW) if(WIN32)
file(GLOB QTBASE_TRANSLATIONS ${Qt5_PREFIX}/share/qt5/translations/qtbase_*.qm) file(GLOB QTBASE_TRANSLATIONS ${Qt5_PREFIX}/share/qt5/translations/qtbase_*.qm)
elseif(APPLE OR KEEPASSXC_DIST_APPIMAGE) elseif(APPLE OR KEEPASSXC_DIST_APPIMAGE)
file(GLOB QTBASE_TRANSLATIONS file(GLOB QTBASE_TRANSLATIONS
@@ -35,7 +35,7 @@ set(QM_FILES ${QM_FILES} ${QTBASE_TRANSLATIONS})
install(FILES ${QM_FILES} DESTINATION ${DATA_INSTALL_DIR}/translations) install(FILES ${QM_FILES} DESTINATION ${DATA_INSTALL_DIR}/translations)
# Add keepassx_en.qm as a fallback for uncommon english locales # Add keepassx_en.qm as a fallback for uncommon english locales
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/keepassx_en_US.qm DESTINATION ${DATA_INSTALL_DIR}/translations RENAME keepassx_en.qm) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/keepassxc_en_US.qm DESTINATION ${DATA_INSTALL_DIR}/translations RENAME keepassxc_en.qm)
add_custom_target(translations DEPENDS ${QM_FILES}) add_custom_target(translations DEPENDS ${QM_FILES})
add_dependencies(${PROGNAME} translations) add_dependencies(${PROGNAME} translations)

View File

@@ -3,78 +3,78 @@
<name>AboutDialog</name> <name>AboutDialog</name>
<message> <message>
<source>About KeePassXC</source> <source>About KeePassXC</source>
<translation>حول KeePassXC</translation> <translation>حَول KeePassXC</translation>
</message> </message>
<message> <message>
<source>About</source> <source>About</source>
<translation>حول</translation> <translation>حَول</translation>
</message> </message>
<message> <message>
<source>Report bugs at: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</source> <source>Report bugs at: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</source>
<translation>للإبلاغ عن العلل: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</translation> <translation>للإبلاغ عن الأخطاء: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</translation>
</message> </message>
<message> <message>
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source> <source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
<translation>KeePassXC موزع وفقًا لشروط رخصة غنو العمومية (GPL) إصدار 2 أو (حسب خيارك) إصدار 3.</translation> <translation>يتم توزيع KeePassXC بمُوجة شُروط رخصة GNU العمومية (GPL) الإصار الثاني (حسب اختيارك) الإصدار الثالث.</translation>
</message> </message>
<message> <message>
<source>Contributors</source> <source>Contributors</source>
<translation>المساهمون</translation> <translation>المُساهِمون</translation>
</message> </message>
<message> <message>
<source>&lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/graphs/contributors&quot;&gt;See Contributions on GitHub&lt;/a&gt;</source> <source>&lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/graphs/contributors&quot;&gt;See Contributions on GitHub&lt;/a&gt;</source>
<translation>&lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/graphs/contributors&quot;&gt;إستكشاف المساهمين عبر GitHub&lt;/a&gt;</translation> <translation>&lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/graphs/contributors&quot;&gt;ألقِ نظرة على المُساهِمون في GitHub&lt;/a&gt;</translation>
</message> </message>
<message> <message>
<source>Debug Info</source> <source>Debug Info</source>
<translation>معلومات تتبع الأخطاء</translation> <translation>معلومات التصحيح</translation>
</message> </message>
<message> <message>
<source>Include the following information whenever you report a bug:</source> <source>Include the following information whenever you report a bug:</source>
<translation>قم بتضمين المعلومات التالية عند الإبلاغ عن علة:</translation> <translation>ََضَمِّن المعلومات التالية عند الإبلاغ عن الأخطاء:</translation>
</message> </message>
<message> <message>
<source>Copy to clipboard</source> <source>Copy to clipboard</source>
<translation>نسخ إلى الحافظة</translation> <translation>النسخ إلى الحافظة</translation>
</message> </message>
<message> <message>
<source>Project Maintainers:</source> <source>Project Maintainers:</source>
<translation>مشرفي المشروع:</translation> <translation>مُشرِّفو المَشروع:</translation>
</message> </message>
<message> <message>
<source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source> <source>Special thanks from the KeePassXC team go to debfx for creating the original KeePassX.</source>
<translation>شكر خاص من فريق KeePassXC يذهب إلى debfx لإنشاء KeePassX الأصلي.</translation> <translation>فريق KeePassXC يُوجه شكر خاص إلى debfx لإنشاء KeePassX الأصلي.</translation>
</message> </message>
</context> </context>
<context> <context>
<name>AgentSettingsWidget</name> <name>AgentSettingsWidget</name>
<message> <message>
<source>Use OpenSSH for Windows instead of Pageant</source> <source>Use OpenSSH for Windows instead of Pageant</source>
<translation type="unfinished"/> <translation>استخدام OpenSSH لنظام تشغيل Windows بدلاً من Pageant</translation>
</message> </message>
<message> <message>
<source>Enable SSH Agent integration</source> <source>Enable SSH Agent integration</source>
<translation type="unfinished"/> <translation>تفعِّيل تكامُل SSH Agent</translation>
</message> </message>
<message> <message>
<source>SSH_AUTH_SOCK value</source> <source>SSH_AUTH_SOCK value</source>
<translation type="unfinished"/> <translation>خانة SSH_AUTH_SOCK</translation>
</message> </message>
<message> <message>
<source>SSH_AUTH_SOCK override</source> <source>SSH_AUTH_SOCK override</source>
<translation type="unfinished"/> <translation>تجاوز SSH_AUTH_SOCK</translation>
</message> </message>
<message> <message>
<source>(empty)</source> <source>(empty)</source>
<translation type="unfinished"/> <translation>(فارِغ)</translation>
</message> </message>
<message> <message>
<source>No SSH Agent socket available. Either make sure SSH_AUTH_SOCK environment variable exists or set an override.</source> <source>No SSH Agent socket available. Either make sure SSH_AUTH_SOCK environment variable exists or set an override.</source>
<translation type="unfinished"/> <translation>لا يُوجد مِقبَس SSH Agent مُتاح. تأكد مِن وجود مُتغير SSH_AUTH_SOCK في البيئة أو عيّن تجاوز له.</translation>
</message> </message>
<message> <message>
<source>SSH Agent connection is working!</source> <source>SSH Agent connection is working!</source>
<translation type="unfinished"/> <translation>اتِّصال SSH Agent يعمل!</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -85,7 +85,7 @@
</message> </message>
<message> <message>
<source>General</source> <source>General</source>
<translation>العام</translation> <translation>عام</translation>
</message> </message>
<message> <message>
<source>Security</source> <source>Security</source>
@@ -93,7 +93,7 @@
</message> </message>
<message> <message>
<source>Access error for config file %1</source> <source>Access error for config file %1</source>
<translation>خطأ في الوصول لملف التكوين %1</translation> <translation>خطأ في الوصول إلى ملف الإعداد %1</translation>
</message> </message>
<message> <message>
<source>Icon only</source> <source>Icon only</source>
@@ -101,15 +101,15 @@
</message> </message>
<message> <message>
<source>Text only</source> <source>Text only</source>
<translation>الوصف بالكلمات فقط </translation> <translation>النص فقط</translation>
</message> </message>
<message> <message>
<source>Text beside icon</source> <source>Text beside icon</source>
<translation>وصف حرفي بجانب الأيقونة</translation> <translation>نص بجانب الأيقونة</translation>
</message> </message>
<message> <message>
<source>Text under icon</source> <source>Text under icon</source>
<translation>الوصف أسفل الأيقونة</translation> <translation>النص أسفل الأيقونة</translation>
</message> </message>
<message> <message>
<source>Follow style</source> <source>Follow style</source>
@@ -117,26 +117,30 @@
</message> </message>
<message> <message>
<source>Reset Settings?</source> <source>Reset Settings?</source>
<translation type="unfinished"/> <translation>إعادة تعيّين الإعدادات؟</translation>
</message> </message>
<message> <message>
<source>Are you sure you want to reset all general and security settings to default?</source> <source>Are you sure you want to reset all general and security settings to default?</source>
<translation>هل أنت متأكد من رغبتك في إعادة جميع الإعدادات العامة وإعدادات الأمن الى وضعها النمطي الأولي ؟</translation> <translation>هل أنت متأكد من رغبتك في إعادة تعيّين كافة الإعدادات العامة وإعدادات الأمن إلى وضعها الافتراضي؟</translation>
</message> </message>
<message> <message>
<source>Monochrome (light)</source> <source>Monochrome (light)</source>
<translation type="unfinished"/> <translation>أُحادي اللون (فاتح)</translation>
</message> </message>
<message> <message>
<source>Monochrome (dark)</source> <source>Monochrome (dark)</source>
<translation type="unfinished"/> <translation>أُُحادي اللون (داكِن)</translation>
</message> </message>
<message> <message>
<source>Colorful</source> <source>Colorful</source>
<translation type="unfinished"/> <translation>مُلون</translation>
</message> </message>
<message> <message>
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation>يجب إعادة تشغيل التطبيق لتعيين اللغة الجديدة. هل تريد إعادة التشغيل الآن ؟</translation>
</message>
<message>
<source>Monochrome</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
</context> </context>
@@ -229,7 +233,7 @@
</message> </message>
<message> <message>
<source>Remember database key files and security dongles</source> <source>Remember database key files and security dongles</source>
<translation type="unfinished"/> <translation>تذكر ملفات مفاتيح قاعدة البيانات وأجهزة الوصول الآمن</translation>
</message> </message>
<message> <message>
<source>Check for updates at application startup once per week</source> <source>Check for updates at application startup once per week</source>
@@ -237,7 +241,7 @@
</message> </message>
<message> <message>
<source>Include beta releases when checking for updates</source> <source>Include beta releases when checking for updates</source>
<translation type="unfinished"/> <translation>ضمّن النسخ التجريبية عند البحث عن التحديثات</translation>
</message> </message>
<message> <message>
<source>Language:</source> <source>Language:</source>
@@ -303,19 +307,19 @@
</message> </message>
<message> <message>
<source>Automatically launch KeePassXC at system startup</source> <source>Automatically launch KeePassXC at system startup</source>
<translation type="unfinished"/> <translation>قم بتشغيل KeePassXC تلقائيًا عند بدء تشغيل النظام</translation>
</message> </message>
<message> <message>
<source>Safely save database files (disable if experiencing problems with Dropbox, etc.)</source> <source>Safely save database files (disable if experiencing problems with Dropbox, etc.)</source>
<translation type="unfinished"/> <translation>احفظ ملفات قاعدة البيانات بأمان (قم بتعطيلها إذا كنت تواجه مشكلات مع Dropbox ، وما إلى ذلك)</translation>
</message> </message>
<message> <message>
<source>User Interface</source> <source>User Interface</source>
<translation type="unfinished"/> <translation>واجهة المستخدم</translation>
</message> </message>
<message> <message>
<source>Toolbar button style:</source> <source>Toolbar button style:</source>
<translation type="unfinished"/> <translation>نمط أزرار شريط الأدوات</translation>
</message> </message>
<message> <message>
<source>Use monospaced font for notes</source> <source>Use monospaced font for notes</source>
@@ -440,11 +444,11 @@
</message> </message>
<message> <message>
<source>Require password repeat when it is visible</source> <source>Require password repeat when it is visible</source>
<translation type="unfinished"/> <translation>يلزم تكرار كلمة المرور عندما تكون مرئية</translation>
</message> </message>
<message> <message>
<source>Hide passwords when editing them</source> <source>Hide passwords when editing them</source>
<translation type="unfinished"/> <translation>إخفاء كلمات المرور عند تعديلها</translation>
</message> </message>
<message> <message>
<source>Use placeholder for empty password fields</source> <source>Use placeholder for empty password fields</source>
@@ -578,7 +582,7 @@
</message> </message>
<message> <message>
<source>Remember</source> <source>Remember</source>
<translation type="unfinished"/> <translation>تذكر</translation>
</message> </message>
<message> <message>
<source>Allow access to entries</source> <source>Allow access to entries</source>
@@ -586,11 +590,11 @@
</message> </message>
<message> <message>
<source>Allow Selected</source> <source>Allow Selected</source>
<translation type="unfinished"/> <translation>السماح بالمُحدد</translation>
</message> </message>
<message> <message>
<source>Deny All</source> <source>Deny All</source>
<translation type="unfinished"/> <translation>منع الكل</translation>
</message> </message>
<message> <message>
<source>Disable for this site</source> <source>Disable for this site</source>
@@ -885,7 +889,7 @@ chrome-laptop.</source>
</message> </message>
<message> <message>
<source>Browser type:</source> <source>Browser type:</source>
<translation type="unfinished"/> <translation>نوع المتصفح:</translation>
</message> </message>
<message> <message>
<source>Toolbar button style</source> <source>Toolbar button style</source>
@@ -1106,6 +1110,14 @@ chrome-laptop.</source>
<source>Column %1</source> <source>Column %1</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>TOTP</source>
<translation type="unfinished"/>
</message>
<message>
<source>Icon</source>
<translation>أيقونة</translation>
</message>
</context> </context>
<context> <context>
<name>CsvParserModel</name> <name>CsvParserModel</name>
@@ -1201,20 +1213,6 @@ Backup database located at %2</source>
<source>Refresh</source> <source>Refresh</source>
<translation>تحديث</translation> <translation>تحديث</translation>
</message> </message>
<message>
<source>Legacy key file format</source>
<translation>تنسيق ملف المفتاح القديم</translation>
</message>
<message>
<source>You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
<translation>أنت تستخدم تنسيق ملف مفتاح قديم قد يصبح
غير مُعتمد في المستقبل.
يرجى النظر في إنشاء ملف مفتاح جديد.</translation>
</message>
<message> <message>
<source>Don&apos;t show this warning again</source> <source>Don&apos;t show this warning again</source>
<translation>لا تُظهر هذا التحذير مرة أخرى</translation> <translation>لا تُظهر هذا التحذير مرة أخرى</translation>
@@ -1241,7 +1239,7 @@ Please consider generating a new key file.</source>
</message> </message>
<message> <message>
<source>Enter Password:</source> <source>Enter Password:</source>
<translation type="unfinished"/> <translation>أدخل كلمة المرور:</translation>
</message> </message>
<message> <message>
<source>Password field</source> <source>Password field</source>
@@ -1275,14 +1273,6 @@ Please consider generating a new key file.</source>
<source>TouchID for Quick Unlock</source> <source>TouchID for Quick Unlock</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Clear</source>
<translation>مسح</translation>
</message>
<message>
<source>Clear Key File</source>
<translation type="unfinished"/>
</message>
<message> <message>
<source>Unlock failed and no password given</source> <source>Unlock failed and no password given</source>
<translation type="unfinished"/> <translation type="unfinished"/>
@@ -1313,7 +1303,7 @@ To prevent this error from appearing, you must go to &quot;Database Settings / S
</message> </message>
<message> <message>
<source>?</source> <source>?</source>
<translation type="unfinished"/> <translation>؟</translation>
</message> </message>
<message> <message>
<source>Cannot use database file as key file</source> <source>Cannot use database file as key file</source>
@@ -1348,6 +1338,14 @@ If you do not have a key file, please leave the field empty.</source>
<source>Select hardware key</source> <source>Select hardware key</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Old key file format</source>
<translation type="unfinished"/>
</message>
<message>
<source>You are using an old key file format which KeePassXC may&lt;br&gt;stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file by going to:&lt;br&gt;&lt;strong&gt;Database / Database Security / Change Key File.&lt;/strong&gt;&lt;br&gt;</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>DatabaseSettingWidgetMetaData</name> <name>DatabaseSettingWidgetMetaData</name>
@@ -1795,7 +1793,7 @@ If you keep this number, your database may be too easy to crack!</source>
</message> </message>
<message> <message>
<source>Delete Recycle Bin</source> <source>Delete Recycle Bin</source>
<translation type="unfinished"/> <translation>حذف سلة المحذوفات</translation>
</message> </message>
<message> <message>
<source>Do you want to delete the current recycle bin and all its contents? <source>Do you want to delete the current recycle bin and all its contents?
@@ -1835,7 +1833,7 @@ This action is not reversible.</source>
</message> </message>
<message> <message>
<source>Certificates</source> <source>Certificates</source>
<translation type="unfinished"/> <translation>الشهادات</translation>
</message> </message>
<message> <message>
<source> &gt; </source> <source> &gt; </source>
@@ -2270,6 +2268,15 @@ Disable safe saves and try again?</source>
<source>[PROTECTED] Press Reveal to view or edit</source> <source>[PROTECTED] Press Reveal to view or edit</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Invalid Entry</source>
<translation type="unfinished"/>
</message>
<message>
<source>An external merge operation has invalidated this entry.
Unfortunately, any changes made have been lost.</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetAdvanced</name> <name>EditEntryWidgetAdvanced</name>
@@ -2467,6 +2474,14 @@ Disable safe saves and try again?</source>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -2589,6 +2604,10 @@ Disable safe saves and try again?</source>
<source>Expires:</source> <source>Expires:</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Edit Entry</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetSSHAgent</name> <name>EditEntryWidgetSSHAgent</name>
@@ -2725,7 +2744,7 @@ Disable safe saves and try again?</source>
<name>EditGroupWidgetKeeShare</name> <name>EditGroupWidgetKeeShare</name>
<message> <message>
<source>Type:</source> <source>Type:</source>
<translation type="unfinished"/> <translation>النوع:</translation>
</message> </message>
<message> <message>
<source>Path:</source> <source>Path:</source>
@@ -2737,7 +2756,7 @@ Disable safe saves and try again?</source>
</message> </message>
<message> <message>
<source>Inactive</source> <source>Inactive</source>
<translation type="unfinished"/> <translation>غير فعال</translation>
</message> </message>
<message> <message>
<source>KeeShare unsigned container</source> <source>KeeShare unsigned container</source>
@@ -2888,6 +2907,10 @@ Supported extensions are: %1.</source>
<source>Set default Auto-Type sequence</source> <source>Set default Auto-Type sequence</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Edit Group</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>EditWidgetIcons</name> <name>EditWidgetIcons</name>
@@ -3382,11 +3405,6 @@ Are you sure to add this file?</source>
<source>[PROTECTED]</source> <source>[PROTECTED]</source>
<translation>[محمي]</translation> <translation>[محمي]</translation>
</message> </message>
<message>
<source>&lt;b&gt;%1&lt;/b&gt;: %2</source>
<comment>attributes line</comment>
<translation type="unfinished"/>
</message>
<message> <message>
<source>Enabled</source> <source>Enabled</source>
<translation>مُفعل</translation> <translation>مُفعل</translation>
@@ -3407,6 +3425,15 @@ Are you sure to add this file?</source>
<source>Advanced</source> <source>Advanced</source>
<translation>متقدم</translation> <translation>متقدم</translation>
</message> </message>
<message>
<source>Default Sequence</source>
<translation type="unfinished"/>
</message>
<message>
<source>&lt;tr&gt;&lt;td&gt;&lt;b&gt;%1&lt;/b&gt;:&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;</source>
<comment>attributes line</comment>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>EntryURLModel</name> <name>EntryURLModel</name>
@@ -3417,18 +3444,6 @@ Are you sure to add this file?</source>
</context> </context>
<context> <context>
<name>EntryView</name> <name>EntryView</name>
<message>
<source>Customize View</source>
<translation>تخصيص العرض</translation>
</message>
<message>
<source>Hide Usernames</source>
<translation>اخفي أسماء المستخدمين</translation>
</message>
<message>
<source>Hide Passwords</source>
<translation>اخفي كلمات السر</translation>
</message>
<message> <message>
<source>Fit to window</source> <source>Fit to window</source>
<translation>ئم النافذة</translation> <translation>ئم النافذة</translation>
@@ -3461,15 +3476,15 @@ Are you sure to add this file?</source>
</context> </context>
<context> <context>
<name>FdoSecrets::Service</name> <name>FdoSecrets::Service</name>
<message>
<source>Failed to register DBus service at %1.&lt;br/&gt;</source>
<translation type="unfinished"/>
</message>
<message numerus="yes"> <message numerus="yes">
<source>%n Entry(s) was used by %1</source> <source>%n Entry(s) was used by %1</source>
<comment>%1 is the name of an application</comment> <comment>%1 is the name of an application</comment>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message> </message>
<message>
<source>Failed to register DBus service at %1.&lt;br/&gt;</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>FdoSecrets::SettingsDatabaseModel</name> <name>FdoSecrets::SettingsDatabaseModel</name>
@@ -4287,10 +4302,6 @@ If this reoccurs, then your database file may be corrupt.</source>
<source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source> <source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Legacy key file format</source>
<translation>تنسيق ملف المفتاح القديم</translation>
</message>
<message> <message>
<source>Error loading the key file '%1' <source>Error loading the key file '%1'
Message: %2</source> Message: %2</source>
@@ -4320,26 +4331,14 @@ Message: %2</source>
<source>Select a key file</source> <source>Select a key file</source>
<translation>حدد ملف المفتاح</translation> <translation>حدد ملف المفتاح</translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation type="unfinished"/>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Browse...</source>
<translation>إستعراض...</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
<translation type="unfinished"/>
</message>
<message> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation type="unfinished"/> <translation type="unfinished"/>
@@ -4358,10 +4357,23 @@ Are you sure you want to continue with this file?</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>You are using a legacy key file format which may become <source>Old key file format</source>
unsupported in the future. <translation type="unfinished"/>
</message>
Generate a new key file in the database security settings.</source> <message>
<source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Note: Do NOT use a file that may change as that will prevent you from unlocking your database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Browse</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
</context> </context>
@@ -4825,6 +4837,18 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>{PASSWORD}{ENTER}</source> <source>{PASSWORD}{ENTER}</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Always on Top</source>
<translation type="unfinished"/>
</message>
<message>
<source>Hide Usernames</source>
<translation>اخفي أسماء المستخدمين</translation>
</message>
<message>
<source>Hide Passwords</source>
<translation>اخفي كلمات السر</translation>
</message>
</context> </context>
<context> <context>
<name>ManageDatabase</name> <name>ManageDatabase</name>
@@ -5310,7 +5334,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message> </message>
<message> <message>
<source>Switch to advanced mode</source> <source>Switch to advanced mode</source>
<translation type="unfinished"/> <translation>انتقل الى النمط المتقدم</translation>
</message> </message>
<message> <message>
<source>Advanced</source> <source>Advanced</source>
@@ -5348,10 +5372,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Hex</source> <source>Hex</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</source>
<translation type="unfinished"/>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation type="unfinished"/> <translation type="unfinished"/>
@@ -5398,7 +5418,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message> </message>
<message> <message>
<source>Copy password</source> <source>Copy password</source>
<translation type="unfinished"/> <translation>انسخ كلمة المرور</translation>
</message> </message>
<message> <message>
<source>lower case</source> <source>lower case</source>
@@ -5444,10 +5464,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Ctrl+S</source> <source>Ctrl+S</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Clear</source>
<translation>مسح</translation>
</message>
<message> <message>
<source>Regenerate password (%1)</source> <source>Regenerate password (%1)</source>
<translation type="unfinished"/> <translation type="unfinished"/>
@@ -5456,6 +5472,10 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Special Characters</source> <source>Special Characters</source>
<translation>محارف خاصة</translation> <translation>محارف خاصة</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -5694,16 +5714,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Perform advanced analysis on the password.</source> <source>Perform advanced analysis on the password.</source>
<translation>إجراء تحليل متقدم على كلمة المرور.</translation> <translation>إجراء تحليل متقدم على كلمة المرور.</translation>
</message> </message>
<message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
<translation>تحذير: أنت تستخدم تنسيق ملف مفتاح قديم قد يصبح
غير مُعتمد في المستقبل.
يرجى النظر في إنشاء ملف مفتاح جديد.</translation>
</message>
<message> <message>
<source> <source>
@@ -6084,16 +6094,12 @@ Available commands:
</message> </message>
<message> <message>
<source>file empty</source> <source>file empty</source>
<translation type="unfinished"/> <translation>ملف فارغ</translation>
</message> </message>
<message> <message>
<source>%1: (row, col) %2,%3</source> <source>%1: (row, col) %2,%3</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Argon2 (KDBX 4 recommended)</source>
<translation>Argon2 (KDBX 4 مستحسن)</translation>
</message>
<message> <message>
<source>AES-KDF (KDBX 4)</source> <source>AES-KDF (KDBX 4)</source>
<translation>AES-KDF (KDBX 4)</translation> <translation>AES-KDF (KDBX 4)</translation>
@@ -6110,7 +6116,7 @@ Available commands:
<message> <message>
<source>Invalid Key</source> <source>Invalid Key</source>
<comment>TOTP</comment> <comment>TOTP</comment>
<translation type="unfinished"/> <translation>المفتاح غير صالح</translation>
</message> </message>
<message> <message>
<source>Message encryption failed.</source> <source>Message encryption failed.</source>
@@ -6184,10 +6190,6 @@ Available commands:
<source>read password of the database from stdin</source> <source>read password of the database from stdin</source>
<translation>قراءة كلمة سر قاعدة البيانات من الدخل القياسي &quot;stdin&quot;</translation> <translation>قراءة كلمة سر قاعدة البيانات من الدخل القياسي &quot;stdin&quot;</translation>
</message> </message>
<message>
<source>Parent window handle</source>
<translation>زر النافذة الأم</translation>
</message>
<message> <message>
<source>Another instance of KeePassXC is already running.</source> <source>Another instance of KeePassXC is already running.</source>
<translation>نسخة أخرى من KeePassXC قيد التشغيل.</translation> <translation>نسخة أخرى من KeePassXC قيد التشغيل.</translation>
@@ -6618,11 +6620,11 @@ Kernel: %3 %4</source>
</message> </message>
<message> <message>
<source>Name: </source> <source>Name: </source>
<translation type="unfinished"/> <translation>الاسم:</translation>
</message> </message>
<message> <message>
<source>Description: </source> <source>Description: </source>
<translation type="unfinished"/> <translation>الوصف:</translation>
</message> </message>
<message> <message>
<source>Cipher: </source> <source>Cipher: </source>
@@ -6673,10 +6675,6 @@ Kernel: %3 %4</source>
<source>AES (%1 rounds)</source> <source>AES (%1 rounds)</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Argon2 (%1 rounds, %2 KB)</source>
<translation type="unfinished"/>
</message>
<message> <message>
<source>AES 256-bit</source> <source>AES 256-bit</source>
<translation type="unfinished"/> <translation type="unfinished"/>
@@ -6703,6 +6701,65 @@ Kernel: %3 %4</source>
<comment>seconds</comment> <comment>seconds</comment>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation> <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message> </message>
<message>
<source>path to a custom local config file</source>
<translation type="unfinished"/>
</message>
<message>
<source>WARNING: You are using an old key file format which KeePassXC may
stop supporting in the future.
Please consider generating a new key file.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Argon2%1 (%2 rounds, %3 KB)</source>
<translation type="unfinished"/>
</message>
<message>
<source>Argon2d (KDBX 4 recommended)</source>
<translation type="unfinished"/>
</message>
<message>
<source>Argon2id (KDBX 4)</source>
<translation type="unfinished"/>
</message>
<message>
<source>TOTP</source>
<translation type="unfinished"/>
</message>
<message>
<source>Icon</source>
<translation>أيقونة</translation>
</message>
<message>
<source>Unsupported key file version: %1</source>
<translation type="unfinished"/>
</message>
<message>
<source>Checksum mismatch! Key file may be corrupt.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Unexpected key file data! Key file may be corrupt.</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation type="unfinished"/>
</message>
<message>
<source>Locked databases.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Database failed to lock.</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QtIOCompressor</name> <name>QtIOCompressor</name>
@@ -6751,7 +6808,7 @@ Kernel: %3 %4</source>
<message> <message>
<source>Bad</source> <source>Bad</source>
<comment>Password quality</comment> <comment>Password quality</comment>
<translation type="unfinished"/> <translation>سيئ</translation>
</message> </message>
<message> <message>
<source>Bad password must be changed</source> <source>Bad password must be changed</source>
@@ -6773,7 +6830,7 @@ Kernel: %3 %4</source>
</message> </message>
<message> <message>
<source>Weak consider changing the password</source> <source>Weak consider changing the password</source>
<translation type="unfinished"/> <translation>ضعيف فكر بتغير كلمة المرور</translation>
</message> </message>
<message> <message>
<source> (Excluded)</source> <source> (Excluded)</source>
@@ -6801,11 +6858,11 @@ Kernel: %3 %4</source>
</message> </message>
<message> <message>
<source>Score</source> <source>Score</source>
<translation type="unfinished"/> <translation>النتيجة</translation>
</message> </message>
<message> <message>
<source>Reason</source> <source>Reason</source>
<translation type="unfinished"/> <translation>السبب</translation>
</message> </message>
<message> <message>
<source>Edit Entry...</source> <source>Edit Entry...</source>
@@ -7126,10 +7183,6 @@ Kernel: %3 %4</source>
<source>Search</source> <source>Search</source>
<translation>بحث</translation> <translation>بحث</translation>
</message> </message>
<message>
<source>Clear</source>
<translation>مسح</translation>
</message>
<message> <message>
<source>Limit search to selected group</source> <source>Limit search to selected group</source>
<translation>حدد البحث في المجموعة المحددة</translation> <translation>حدد البحث في المجموعة المحددة</translation>
@@ -7409,10 +7462,6 @@ Kernel: %3 %4</source>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7480,10 +7529,6 @@ Kernel: %3 %4</source>
<source>File does not exist</source> <source>File does not exist</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>

View File

@@ -137,7 +137,11 @@
</message> </message>
<message> <message>
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation type="unfinished"/> <translation>Трябва да рестартирате приложението, за да настроите нов език. Желаете ли да рестартирате сега?</translation>
</message>
<message>
<source>Monochrome</source>
<translation>Едноцветен</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -342,15 +346,15 @@
</message> </message>
<message> <message>
<source>Automatically save when locking database</source> <source>Automatically save when locking database</source>
<translation type="unfinished"/> <translation>Запази автоматично при заключване на базата данни</translation>
</message> </message>
<message> <message>
<source>Automatically save non-data changes when locking database</source> <source>Automatically save non-data changes when locking database</source>
<translation type="unfinished"/> <translation>При заключване на базата данни, запази автоматично промените, които не засягат данните.</translation>
</message> </message>
<message> <message>
<source>Tray icon type</source> <source>Tray icon type</source>
<translation type="unfinished"/> <translation>Тип иконата в системната лента</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -1114,6 +1118,14 @@ chrome-laptop.</translation>
<source>Column %1</source> <source>Column %1</source>
<translation>Колона %1</translation> <translation>Колона %1</translation>
</message> </message>
<message>
<source>TOTP</source>
<translation>TOTP</translation>
</message>
<message>
<source>Icon</source>
<translation>Икона</translation>
</message>
</context> </context>
<context> <context>
<name>CsvParserModel</name> <name>CsvParserModel</name>
@@ -1210,20 +1222,6 @@ Backup database located at %2</source>
<source>Refresh</source> <source>Refresh</source>
<translation>Обновяване</translation> <translation>Обновяване</translation>
</message> </message>
<message>
<source>Legacy key file format</source>
<translation>Остарял файлов формат на ключа</translation>
</message>
<message>
<source>You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
<translation>Използвате остарял файлов формат на ключа, който може да стане
неподдържан в бъдеще.
Помислете за генериране на нов файл с ключове.</translation>
</message>
<message> <message>
<source>Don&apos;t show this warning again</source> <source>Don&apos;t show this warning again</source>
<translation>Не показвай това предупреждение отново</translation> <translation>Не показвай това предупреждение отново</translation>
@@ -1284,14 +1282,6 @@ Please consider generating a new key file.</source>
<source>TouchID for Quick Unlock</source> <source>TouchID for Quick Unlock</source>
<translation>TouchID за бързо отключване</translation> <translation>TouchID за бързо отключване</translation>
</message> </message>
<message>
<source>Clear</source>
<translation>Почисти</translation>
</message>
<message>
<source>Clear Key File</source>
<translation>Изчистване на файл-ключ</translation>
</message>
<message> <message>
<source>Unlock failed and no password given</source> <source>Unlock failed and no password given</source>
<translation>Грешка при отключване и не е върната парола</translation> <translation>Грешка при отключване и не е върната парола</translation>
@@ -1362,6 +1352,14 @@ If you do not have a key file, please leave the field empty.</source>
<source>Select hardware key</source> <source>Select hardware key</source>
<translation>Избор на хардуерен ключ...</translation> <translation>Избор на хардуерен ключ...</translation>
</message> </message>
<message>
<source>Old key file format</source>
<translation>Стар файлов формат на ключа</translation>
</message>
<message>
<source>You are using an old key file format which KeePassXC may&lt;br&gt;stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file by going to:&lt;br&gt;&lt;strong&gt;Database / Database Security / Change Key File.&lt;/strong&gt;&lt;br&gt;</source>
<translation>Използвате стар ключ файлов формат, който KeePassXC може &lt;br&gt;да спре да поддържва в бъдеще.&lt;br&gt;&lt;br&gt;Моля, създайте нов ключ, като:&lt;br&gt;&lt;strong&gt;База данни / Защита на базата данни / Промяна на ключ.&lt;/strong&gt;&lt;br&gt;</translation>
</message>
</context> </context>
<context> <context>
<name>DatabaseSettingWidgetMetaData</name> <name>DatabaseSettingWidgetMetaData</name>
@@ -1517,7 +1515,7 @@ This is necessary to maintain compatibility with the browser plugin.</source>
</message> </message>
<message> <message>
<source>Refresh database root group ID</source> <source>Refresh database root group ID</source>
<translation type="unfinished"/> <translation>Обновяване на IDна главната група на базата данни</translation>
</message> </message>
<message> <message>
<source>Created</source> <source>Created</source>
@@ -1589,7 +1587,7 @@ Are you sure you want to continue without a password?</source>
</message> </message>
<message> <message>
<source>Key Derivation Function:</source> <source>Key Derivation Function:</source>
<translation type="unfinished"/> <translation>Функция за формиране на ключа</translation>
</message> </message>
<message> <message>
<source>Transform rounds:</source> <source>Transform rounds:</source>
@@ -2294,6 +2292,16 @@ Disable safe saves and try again?</source>
<source>[PROTECTED] Press Reveal to view or edit</source> <source>[PROTECTED] Press Reveal to view or edit</source>
<translation>[ЗАЩИТЕНО] Натиснете &quot;Показане&quot;, за да видите или редактирате</translation> <translation>[ЗАЩИТЕНО] Натиснете &quot;Показане&quot;, за да видите или редактирате</translation>
</message> </message>
<message>
<source>Invalid Entry</source>
<translation>Невалиден запис</translation>
</message>
<message>
<source>An external merge operation has invalidated this entry.
Unfortunately, any changes made have been lost.</source>
<translation>Външна операция за обединяване е анулирала този запис.
За съжаление, всички направени промени са загубени.</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetAdvanced</name> <name>EditEntryWidgetAdvanced</name>
@@ -2491,6 +2499,14 @@ Disable safe saves and try again?</source>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation>Използвай този запис само с HTTP Basic Auth</translation> <translation>Използвай този запис само с HTTP Basic Auth</translation>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation>Не изпращай тази настройка към браузъра за HTTP Auth прозорци. При активиране, HTTP Auth прозорците няма да покажат този запис за избор.</translation>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation>Не използвай този запис с HTTP Basic Auth</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -2613,6 +2629,10 @@ Disable safe saves and try again?</source>
<source>Expires:</source> <source>Expires:</source>
<translation>Изтича:</translation> <translation>Изтича:</translation>
</message> </message>
<message>
<source>Edit Entry</source>
<translation>Редактиране на запис</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetSSHAgent</name> <name>EditEntryWidgetSSHAgent</name>
@@ -2880,7 +2900,7 @@ Supported extensions are: %1.</source>
</message> </message>
<message> <message>
<source>Search toggle for this and sub groups</source> <source>Search toggle for this and sub groups</source>
<translation type="unfinished"/> <translation>Превключване на търсенето за тази група и подгрупите ѝ</translation>
</message> </message>
<message> <message>
<source>Default auto-type sequence field</source> <source>Default auto-type sequence field</source>
@@ -2914,6 +2934,10 @@ Supported extensions are: %1.</source>
<source>Set default Auto-Type sequence</source> <source>Set default Auto-Type sequence</source>
<translation>Задаване на Auto-Type последователност по подразбиране</translation> <translation>Задаване на Auto-Type последователност по подразбиране</translation>
</message> </message>
<message>
<source>Edit Group</source>
<translation>Редактиране на група</translation>
</message>
</context> </context>
<context> <context>
<name>EditWidgetIcons</name> <name>EditWidgetIcons</name>
@@ -2983,7 +3007,7 @@ Supported extensions are: %1.</source>
</message> </message>
<message> <message>
<source>Also apply to child groups</source> <source>Also apply to child groups</source>
<translation type="unfinished"/> <translation>Прилага се и за подгрупи</translation>
</message> </message>
<message> <message>
<source>Also apply to child entries</source> <source>Also apply to child entries</source>
@@ -3413,11 +3437,6 @@ Are you sure to add this file?</source>
<source>[PROTECTED]</source> <source>[PROTECTED]</source>
<translation>[ЗАЩИТЕНО]</translation> <translation>[ЗАЩИТЕНО]</translation>
</message> </message>
<message>
<source>&lt;b&gt;%1&lt;/b&gt;: %2</source>
<comment>attributes line</comment>
<translation>&lt;b&gt;%1&lt;/b&gt;: %2</translation>
</message>
<message> <message>
<source>Enabled</source> <source>Enabled</source>
<translation>Включено</translation> <translation>Включено</translation>
@@ -3438,6 +3457,15 @@ Are you sure to add this file?</source>
<source>Advanced</source> <source>Advanced</source>
<translation>Допълнителни</translation> <translation>Допълнителни</translation>
</message> </message>
<message>
<source>Default Sequence</source>
<translation>Последователност по подразбиране</translation>
</message>
<message>
<source>&lt;tr&gt;&lt;td&gt;&lt;b&gt;%1&lt;/b&gt;:&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;</source>
<comment>attributes line</comment>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>EntryURLModel</name> <name>EntryURLModel</name>
@@ -3448,18 +3476,6 @@ Are you sure to add this file?</source>
</context> </context>
<context> <context>
<name>EntryView</name> <name>EntryView</name>
<message>
<source>Customize View</source>
<translation>Персонализиране на изгледа</translation>
</message>
<message>
<source>Hide Usernames</source>
<translation>Скриване на потребителските имена</translation>
</message>
<message>
<source>Hide Passwords</source>
<translation>Скриване на паролите</translation>
</message>
<message> <message>
<source>Fit to window</source> <source>Fit to window</source>
<translation>Побиране в прозореца</translation> <translation>Побиране в прозореца</translation>
@@ -3492,15 +3508,15 @@ Are you sure to add this file?</source>
</context> </context>
<context> <context>
<name>FdoSecrets::Service</name> <name>FdoSecrets::Service</name>
<message>
<source>Failed to register DBus service at %1.&lt;br/&gt;</source>
<translation>Неуспешно регистриране на услугата DBus на % 1.&lt;br/&gt;</translation>
</message>
<message numerus="yes"> <message numerus="yes">
<source>%n Entry(s) was used by %1</source> <source>%n Entry(s) was used by %1</source>
<comment>%1 is the name of an application</comment> <comment>%1 is the name of an application</comment>
<translation><numerusform>%n Запис(и) е(са) използван(и) от %1</numerusform><numerusform>%n Запис(а) е(са) използван(и) от %1</numerusform></translation> <translation><numerusform>%n Запис(и) е(са) използван(и) от %1</numerusform><numerusform>%n Запис(а) е(са) използван(и) от %1</numerusform></translation>
</message> </message>
<message>
<source>Failed to register DBus service at %1.&lt;br/&gt;</source>
<translation>Неуспешно регистриране на услугата DBus на % 1.&lt;br/&gt;</translation>
</message>
</context> </context>
<context> <context>
<name>FdoSecrets::SettingsDatabaseModel</name> <name>FdoSecrets::SettingsDatabaseModel</name>
@@ -3725,7 +3741,7 @@ If this reoccurs, then your database file may be corrupt.</source>
</message> </message>
<message> <message>
<source>Unsupported key derivation function (KDF) or invalid parameters</source> <source>Unsupported key derivation function (KDF) or invalid parameters</source>
<translation type="unfinished"/> <translation>Неподдържана функция за извличане на ключове (KDF) или невалидни параметри</translation>
</message> </message>
<message> <message>
<source>Legacy header fields found in KDBX4 file.</source> <source>Legacy header fields found in KDBX4 file.</source>
@@ -4151,11 +4167,11 @@ Line %2, column %3</source>
</message> </message>
<message> <message>
<source>Incorrect group expiry time field size</source> <source>Incorrect group expiry time field size</source>
<translation type="unfinished"/> <translation>Неправилен размер на полето за изтичане на времето на група</translation>
</message> </message>
<message> <message>
<source>Incorrect group icon field size</source> <source>Incorrect group icon field size</source>
<translation type="unfinished"/> <translation>Неправилен размер на поле за икона на група</translation>
</message> </message>
<message> <message>
<source>Incorrect group level field size</source> <source>Incorrect group level field size</source>
@@ -4175,7 +4191,7 @@ Line %2, column %3</source>
</message> </message>
<message> <message>
<source>Invalid entry field size</source> <source>Invalid entry field size</source>
<translation type="unfinished"/> <translation>Невалиден размер на поле за въвеждане</translation>
</message> </message>
<message> <message>
<source>Read entry field data doesn&apos;t match size</source> <source>Read entry field data doesn&apos;t match size</source>
@@ -4324,10 +4340,6 @@ If this reoccurs, then your database file may be corrupt.</source>
<source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source> <source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source>
<translation>&lt;p&gt;Можете да добавите ключ-файл, съдържащ случайни байтове за допълнителна сигурност.&lt;/p&gt;&lt;p&gt;Трябва да го пазите в тайна и никога да не го губите или ще бъдете заключени!&lt;/p&gt;</translation> <translation>&lt;p&gt;Можете да добавите ключ-файл, съдържащ случайни байтове за допълнителна сигурност.&lt;/p&gt;&lt;p&gt;Трябва да го пазите в тайна и никога да не го губите или ще бъдете заключени!&lt;/p&gt;</translation>
</message> </message>
<message>
<source>Legacy key file format</source>
<translation>Остарял формат на файл-ключа</translation>
</message>
<message> <message>
<source>Error loading the key file '%1' <source>Error loading the key file '%1'
Message: %2</source> Message: %2</source>
@@ -4358,26 +4370,14 @@ Message: %2</source>
<source>Select a key file</source> <source>Select a key file</source>
<translation>Избор на файл-ключ</translation> <translation>Избор на файл-ключ</translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation>Избор на файл-ключ</translation>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation>Избор на файл-ключ</translation> <translation>Избор на файл-ключ</translation>
</message> </message>
<message>
<source>Browse...</source>
<translation>Преглед...</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation>Генериране на нов файл-ключ</translation> <translation>Генериране на нов файл-ключ</translation>
</message> </message>
<message>
<source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
<translation>Забележка: Не използвайте файл, който може да се промени, понеже това ще Ви попречи да отключите вашата база данни!</translation>
</message>
<message> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation>Невалиден файл-ключ</translation> <translation>Невалиден файл-ключ</translation>
@@ -4397,14 +4397,26 @@ Are you sure you want to continue with this file?</source>
Наистина ли искате да продължите с този файл?</translation> Наистина ли искате да продължите с този файл?</translation>
</message> </message>
<message> <message>
<source>You are using a legacy key file format which may become <source>Old key file format</source>
unsupported in the future. <translation>Стар файлов формат на ключа</translation>
</message>
<message>
<source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation>Използвате остарял файлов формат на ключа, който KeePass XC може да спре да поддържа в бъдеще.
Generate a new key file in the database security settings.</source> Помислете за генериране на нов ключ файл.</translation>
<translation>Използвате остарял файлов формат на ключа, който може да стане </message>
неподдържан в бъдеще. <message>
<source>Generate a new key file or choose an existing one to protect your database.</source>
Генериране на нов ключ файл в настройките за сигурност на базата данни.</translation> <translation type="unfinished"/>
</message>
<message>
<source>Note: Do NOT use a file that may change as that will prevent you from unlocking your database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Browse</source>
<translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -4851,7 +4863,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
</message> </message>
<message> <message>
<source>Perform Auto-Type Sequence</source> <source>Perform Auto-Type Sequence</source>
<translation type="unfinished"/> <translation>Изпълнение на Auto-Type</translation>
</message> </message>
<message> <message>
<source>{USERNAME}</source> <source>{USERNAME}</source>
@@ -4869,6 +4881,18 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>{PASSWORD}{ENTER}</source> <source>{PASSWORD}{ENTER}</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Always on Top</source>
<translation>Винаги отгоре</translation>
</message>
<message>
<source>Hide Usernames</source>
<translation>Скриване на потребителските имена</translation>
</message>
<message>
<source>Hide Passwords</source>
<translation>Скриване на паролите</translation>
</message>
</context> </context>
<context> <context>
<name>ManageDatabase</name> <name>ManageDatabase</name>
@@ -5393,10 +5417,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Hex</source> <source>Hex</source>
<translation>Шестнадесетичен</translation> <translation>Шестнадесетичен</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</source>
<translation>Изключени знаци: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</translation>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation>Генерирана парола</translation> <translation>Генерирана парола</translation>
@@ -5489,16 +5509,16 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Ctrl+S</source> <source>Ctrl+S</source>
<translation>Ctrl+S</translation> <translation>Ctrl+S</translation>
</message> </message>
<message>
<source>Clear</source>
<translation>Почисти</translation>
</message>
<message> <message>
<source>Regenerate password (%1)</source> <source>Regenerate password (%1)</source>
<translation>Регенериране на паролата (%1)</translation> <translation>Регенериране на паролата (%1)</translation>
</message> </message>
<message> <message>
<source>Special Characters</source> <source>Special Characters</source>
<translation>Специални знаци</translation>
</message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
</context> </context>
@@ -5739,16 +5759,6 @@ Expect some bugs and minor issues, this version is not meant for production use.
<source>Perform advanced analysis on the password.</source> <source>Perform advanced analysis on the password.</source>
<translation>Извършване на разширен анализ на паролата.</translation> <translation>Извършване на разширен анализ на паролата.</translation>
</message> </message>
<message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
<translation>ВНИМАНИЕ: Използвате остарял файлов формат на ключа, който може да стане
неподдържан в бъдеще.
Помислете за генериране на нов файл с ключове.</translation>
</message>
<message> <message>
<source> <source>
@@ -6106,7 +6116,7 @@ Available commands:
</message> </message>
<message> <message>
<source>Successfully recycled entry %1.</source> <source>Successfully recycled entry %1.</source>
<translation type="unfinished"/> <translation>Успешно изтриване на запис%1.</translation>
</message> </message>
<message> <message>
<source>Successfully deleted entry %1.</source> <source>Successfully deleted entry %1.</source>
@@ -6132,10 +6142,6 @@ Available commands:
<source>%1: (row, col) %2,%3</source> <source>%1: (row, col) %2,%3</source>
<translation>%1: (ред, колона) %2,%3</translation> <translation>%1: (ред, колона) %2,%3</translation>
</message> </message>
<message>
<source>Argon2 (KDBX 4 recommended)</source>
<translation>Argon2 (KDBX 4 препоръчително)</translation>
</message>
<message> <message>
<source>AES-KDF (KDBX 4)</source> <source>AES-KDF (KDBX 4)</source>
<translation>AES-KDF (KDBX 4)</translation> <translation>AES-KDF (KDBX 4)</translation>
@@ -6226,10 +6232,6 @@ Available commands:
<source>read password of the database from stdin</source> <source>read password of the database from stdin</source>
<translation>прочетете паролата на базата данни от stdin</translation> <translation>прочетете паролата на базата данни от stdin</translation>
</message> </message>
<message>
<source>Parent window handle</source>
<translation type="unfinished"/>
</message>
<message> <message>
<source>Another instance of KeePassXC is already running.</source> <source>Another instance of KeePassXC is already running.</source>
<translation>Друга инстанция на KeePassXC вече работи.</translation> <translation>Друга инстанция на KeePassXC вече работи.</translation>
@@ -6252,7 +6254,7 @@ Available commands:
</message> </message>
<message> <message>
<source>Deactivate password key for the database.</source> <source>Deactivate password key for the database.</source>
<translation type="unfinished"/> <translation>Деактивиране на парола за базата данни.</translation>
</message> </message>
<message> <message>
<source>Displays debugging information.</source> <source>Displays debugging information.</source>
@@ -6504,7 +6506,7 @@ Kernel: %3 %4</source>
</message> </message>
<message> <message>
<source>Successfully recycled group %1.</source> <source>Successfully recycled group %1.</source>
<translation type="unfinished"/> <translation>Успешно изтрита група% 1.</translation>
</message> </message>
<message> <message>
<source>Successfully deleted group %1.</source> <source>Successfully deleted group %1.</source>
@@ -6608,7 +6610,7 @@ Kernel: %3 %4</source>
</message> </message>
<message> <message>
<source>time</source> <source>time</source>
<translation type="unfinished"/> <translation>Време</translation>
</message> </message>
<message> <message>
<source>Set the key file for the database.</source> <source>Set the key file for the database.</source>
@@ -6715,10 +6717,6 @@ Kernel: %3 %4</source>
<source>AES (%1 rounds)</source> <source>AES (%1 rounds)</source>
<translation>AES (% 1 рунда)</translation> <translation>AES (% 1 рунда)</translation>
</message> </message>
<message>
<source>Argon2 (%1 rounds, %2 KB)</source>
<translation>Аргон 2 (%1 рунда, %2 KB)</translation>
</message>
<message> <message>
<source>AES 256-bit</source> <source>AES 256-bit</source>
<translation>AES 256-битов</translation> <translation>AES 256-битов</translation>
@@ -6745,6 +6743,67 @@ Kernel: %3 %4</source>
<comment>seconds</comment> <comment>seconds</comment>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message> </message>
<message>
<source>path to a custom local config file</source>
<translation type="unfinished"/>
</message>
<message>
<source>WARNING: You are using an old key file format which KeePassXC may
stop supporting in the future.
Please consider generating a new key file.</source>
<translation>Използвате остарял файлов формат на ключа, който KeePass XC може да спре да поддържа в бъдеще.
Помислете за генериране на нов ключ файл.</translation>
</message>
<message>
<source>Argon2%1 (%2 rounds, %3 KB)</source>
<translation type="unfinished"/>
</message>
<message>
<source>Argon2d (KDBX 4 recommended)</source>
<translation type="unfinished"/>
</message>
<message>
<source>Argon2id (KDBX 4)</source>
<translation type="unfinished"/>
</message>
<message>
<source>TOTP</source>
<translation>TOTP</translation>
</message>
<message>
<source>Icon</source>
<translation>Икона</translation>
</message>
<message>
<source>Unsupported key file version: %1</source>
<translation>Неподдържан тип ключ: %1</translation>
</message>
<message>
<source>Checksum mismatch! Key file may be corrupt.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Unexpected key file data! Key file may be corrupt.</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation type="unfinished"/>
</message>
<message>
<source>Locked databases.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Database failed to lock.</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QtIOCompressor</name> <name>QtIOCompressor</name>
@@ -7168,10 +7227,6 @@ Kernel: %3 %4</source>
<source>Search</source> <source>Search</source>
<translation>Търсене</translation> <translation>Търсене</translation>
</message> </message>
<message>
<source>Clear</source>
<translation>Почисти</translation>
</message>
<message> <message>
<source>Limit search to selected group</source> <source>Limit search to selected group</source>
<translation>Ограничаване на търсенето до избрана група</translation> <translation>Ограничаване на търсенето до избрана група</translation>
@@ -7451,10 +7506,6 @@ Kernel: %3 %4</source>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation>Възникна неочаквана грешка при експортиране</translation>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7522,10 +7573,6 @@ Kernel: %3 %4</source>
<source>File does not exist</source> <source>File does not exist</source>
<translation>Файлът не съществува</translation> <translation>Файлът не съществува</translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -139,6 +139,10 @@
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Monochrome</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ApplicationSettingsWidgetGeneral</name> <name>ApplicationSettingsWidgetGeneral</name>
@@ -318,7 +322,7 @@
</message> </message>
<message> <message>
<source>Use monospaced font for notes</source> <source>Use monospaced font for notes</source>
<translation type="unfinished"/> <translation>Usa lletra monoespaiada per a les notes</translation>
</message> </message>
<message> <message>
<source>Tray icon type:</source> <source>Tray icon type:</source>
@@ -330,27 +334,27 @@
</message> </message>
<message> <message>
<source>Auto-Type typing delay:</source> <source>Auto-Type typing delay:</source>
<translation type="unfinished"/> <translation>Retard d&apos;escriptura de la compleció automàtica:</translation>
</message> </message>
<message> <message>
<source>Global Auto-Type shortcut:</source> <source>Global Auto-Type shortcut:</source>
<translation type="unfinished"/> <translation>Drecera global de compleció automàtica:</translation>
</message> </message>
<message> <message>
<source>Auto-Type start delay:</source> <source>Auto-Type start delay:</source>
<translation type="unfinished"/> <translation>Retard d&apos;inici de la compleció automàtica:</translation>
</message> </message>
<message> <message>
<source>Automatically save when locking database</source> <source>Automatically save when locking database</source>
<translation type="unfinished"/> <translation>Desa automàticament en bloquejar la base de dades</translation>
</message> </message>
<message> <message>
<source>Automatically save non-data changes when locking database</source> <source>Automatically save non-data changes when locking database</source>
<translation type="unfinished"/> <translation>Desa automàticament els canvis que no són de dades en bloquejar la base de dades</translation>
</message> </message>
<message> <message>
<source>Tray icon type</source> <source>Tray icon type</source>
<translation type="unfinished"/> <translation>Tipus d&apos;icona de la safata</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -439,15 +443,15 @@
</message> </message>
<message> <message>
<source>Require password repeat when it is visible</source> <source>Require password repeat when it is visible</source>
<translation type="unfinished"/> <translation>Demana altre cop la contrasenya quan és visible</translation>
</message> </message>
<message> <message>
<source>Hide passwords when editing them</source> <source>Hide passwords when editing them</source>
<translation type="unfinished"/> <translation>Oculta les contrasenyes a l&apos;editar-les</translation>
</message> </message>
<message> <message>
<source>Use placeholder for empty password fields</source> <source>Use placeholder for empty password fields</source>
<translation type="unfinished"/> <translation>Usa un marcador per als camps de contrasenya buits</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -584,15 +588,15 @@
</message> </message>
<message> <message>
<source>Allow Selected</source> <source>Allow Selected</source>
<translation type="unfinished"/> <translation>Permet els seleccionats</translation>
</message> </message>
<message> <message>
<source>Deny All</source> <source>Deny All</source>
<translation type="unfinished"/> <translation>Denega-ho tot</translation>
</message> </message>
<message> <message>
<source>Disable for this site</source> <source>Disable for this site</source>
<translation type="unfinished"/> <translation>Deshabilita per aquest lloc</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -663,7 +667,7 @@ Moved %2 keys to custom data.</source>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<source>Successfully moved %n keys to custom data.</source> <source>Successfully moved %n keys to custom data.</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> <translation><numerusform>Les claus %n s&apos;han desplaçat correctament a dades personalitzades.</numerusform><numerusform>S&apos;han mogut correctament %n claus a dades personalitzades.</numerusform></translation>
</message> </message>
<message> <message>
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source> <source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
@@ -763,11 +767,11 @@ chrome-laptop.</source>
<message> <message>
<source>Show a notification when credentials are requested</source> <source>Show a notification when credentials are requested</source>
<extracomment>Credentials mean login data requested via browser extension</extracomment> <extracomment>Credentials mean login data requested via browser extension</extracomment>
<translation type="unfinished"/> <translation>Mostra una notificació quan es sol·licitin les credencials</translation>
</message> </message>
<message> <message>
<source>Request to unlock the database if it is locked</source> <source>Request to unlock the database if it is locked</source>
<translation type="unfinished"/> <translation>Sol·licita desbloquejar la base de dades si està bloquejada</translation>
</message> </message>
<message> <message>
<source>Only entries with the same scheme (http://, https://, ...) are returned.</source> <source>Only entries with the same scheme (http://, https://, ...) are returned.</source>
@@ -1105,6 +1109,14 @@ chrome-laptop.</source>
<source>Column %1</source> <source>Column %1</source>
<translation>Columna %1</translation> <translation>Columna %1</translation>
</message> </message>
<message>
<source>TOTP</source>
<translation>TOTP</translation>
</message>
<message>
<source>Icon</source>
<translation>Icona</translation>
</message>
</context> </context>
<context> <context>
<name>CsvParserModel</name> <name>CsvParserModel</name>
@@ -1177,11 +1189,11 @@ Còpia de seguretat de la base de dades situada a %2</translation>
</message> </message>
<message> <message>
<source>Database save is already in progress.</source> <source>Database save is already in progress.</source>
<translation type="unfinished"/> <translation>El desat de la base de dades està en curs.</translation>
</message> </message>
<message> <message>
<source>Could not save, database has not been initialized!</source> <source>Could not save, database has not been initialized!</source>
<translation type="unfinished"/> <translation>No s&apos;ha pogut desar, la base de dades no ha estat inicialitzada!</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -1201,17 +1213,6 @@ Còpia de seguretat de la base de dades situada a %2</translation>
<source>Refresh</source> <source>Refresh</source>
<translation>Actualitza</translation> <translation>Actualitza</translation>
</message> </message>
<message>
<source>Legacy key file format</source>
<translation>Format de fitxer clau antic</translation>
</message>
<message>
<source>You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
<translation type="unfinished"/>
</message>
<message> <message>
<source>Don&apos;t show this warning again</source> <source>Don&apos;t show this warning again</source>
<translation>No tornis a mostrar aquest avís</translation> <translation>No tornis a mostrar aquest avís</translation>
@@ -1272,14 +1273,6 @@ Please consider generating a new key file.</source>
<source>TouchID for Quick Unlock</source> <source>TouchID for Quick Unlock</source>
<translation>Usa el TouchID per desbloquejar ràpidament</translation> <translation>Usa el TouchID per desbloquejar ràpidament</translation>
</message> </message>
<message>
<source>Clear</source>
<translation>Neteja</translation>
</message>
<message>
<source>Clear Key File</source>
<translation type="unfinished"/>
</message>
<message> <message>
<source>Unlock failed and no password given</source> <source>Unlock failed and no password given</source>
<translation>El desbloqueig ha fallat i no s&apos;ha donat cap contrasenya</translation> <translation>El desbloqueig ha fallat i no s&apos;ha donat cap contrasenya</translation>
@@ -1345,6 +1338,14 @@ If you do not have a key file, please leave the field empty.</source>
<source>Select hardware key</source> <source>Select hardware key</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Old key file format</source>
<translation type="unfinished"/>
</message>
<message>
<source>You are using an old key file format which KeePassXC may&lt;br&gt;stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file by going to:&lt;br&gt;&lt;strong&gt;Database / Database Security / Change Key File.&lt;/strong&gt;&lt;br&gt;</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>DatabaseSettingWidgetMetaData</name> <name>DatabaseSettingWidgetMetaData</name>
@@ -1392,7 +1393,7 @@ If you do not have a key file, please leave the field empty.</source>
</message> </message>
<message> <message>
<source>Remove</source> <source>Remove</source>
<translation>Suprimiu</translation> <translation>Suprimeix</translation>
</message> </message>
<message> <message>
<source>Delete the selected key?</source> <source>Delete the selected key?</source>
@@ -1714,7 +1715,7 @@ If you keep this number, your database may be too easy to crack!</source>
</message> </message>
<message> <message>
<source>Don&apos;t expose this database</source> <source>Don&apos;t expose this database</source>
<translation type="unfinished"/> <translation>No exposis aquesta base de dades</translation>
</message> </message>
<message> <message>
<source>Expose entries under this group:</source> <source>Expose entries under this group:</source>
@@ -1785,11 +1786,11 @@ If you keep this number, your database may be too easy to crack!</source>
</message> </message>
<message> <message>
<source>Maximum size of history per entry</source> <source>Maximum size of history per entry</source>
<translation type="unfinished"/> <translation>Maximitzar el tamany de l&apos;històric per entrada</translation>
</message> </message>
<message> <message>
<source>Delete Recycle Bin</source> <source>Delete Recycle Bin</source>
<translation type="unfinished"/> <translation>Netejar paperera</translation>
</message> </message>
<message> <message>
<source>Do you want to delete the current recycle bin and all its contents? <source>Do you want to delete the current recycle bin and all its contents?
@@ -2113,7 +2114,7 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
</message> </message>
<message> <message>
<source>Do you really want to move the group &quot;%1&quot; to the recycle bin?</source> <source>Do you really want to move the group &quot;%1&quot; to the recycle bin?</source>
<translation type="unfinished"/> <translation>Esteu segur que voleu moure el grup &quot;%1&quot; a la paperera de reciclatge?</translation>
</message> </message>
<message> <message>
<source>Successfully merged the database files.</source> <source>Successfully merged the database files.</source>
@@ -2133,7 +2134,7 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
</message> </message>
<message> <message>
<source>This database is opened in read-only mode. Autosave is disabled.</source> <source>This database is opened in read-only mode. Autosave is disabled.</source>
<translation type="unfinished"/> <translation>Aquesta base de dades s&apos;ha obert en mode de només lectura. El desat automàtic està deshabilitat.</translation>
</message> </message>
<message> <message>
<source>Save database backup</source> <source>Save database backup</source>
@@ -2244,7 +2245,7 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
</message> </message>
<message> <message>
<source>Are you sure you want to remove this URL?</source> <source>Are you sure you want to remove this URL?</source>
<translation type="unfinished"/> <translation>Esteu segur que voleu suprimir aquesta URL?</translation>
</message> </message>
<message> <message>
<source>Reveal</source> <source>Reveal</source>
@@ -2252,7 +2253,7 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
</message> </message>
<message> <message>
<source>Hide</source> <source>Hide</source>
<translation type="unfinished"/> <translation>Oculta</translation>
</message> </message>
<message> <message>
<source>Unsaved Changes</source> <source>Unsaved Changes</source>
@@ -2266,6 +2267,15 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
<source>[PROTECTED] Press Reveal to view or edit</source> <source>[PROTECTED] Press Reveal to view or edit</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Invalid Entry</source>
<translation type="unfinished"/>
</message>
<message>
<source>An external merge operation has invalidated this entry.
Unfortunately, any changes made have been lost.</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetAdvanced</name> <name>EditEntryWidgetAdvanced</name>
@@ -2319,7 +2329,7 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
</message> </message>
<message> <message>
<source>Remove selected attribute</source> <source>Remove selected attribute</source>
<translation type="unfinished"/> <translation>Suprimeix l&apos;atribut seleccionat</translation>
</message> </message>
<message> <message>
<source>Edit attribute name</source> <source>Edit attribute name</source>
@@ -2347,7 +2357,7 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
</message> </message>
<message> <message>
<source>Exclude from database reports</source> <source>Exclude from database reports</source>
<translation type="unfinished"/> <translation>Exclou dels informes de la base de dades</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -2394,7 +2404,7 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
</message> </message>
<message> <message>
<source>Remove selected window association</source> <source>Remove selected window association</source>
<translation type="unfinished"/> <translation>Suprimeix l&apos;associació de finestres seleccionada</translation>
</message> </message>
<message> <message>
<source>You can use an asterisk (*) to match everything</source> <source>You can use an asterisk (*) to match everything</source>
@@ -2414,11 +2424,11 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
</message> </message>
<message> <message>
<source>Inherit default Auto-Type sequence from the group</source> <source>Inherit default Auto-Type sequence from the group</source>
<translation type="unfinished"/> <translation>Hereda la seqüència de compleció automàtica del grup</translation>
</message> </message>
<message> <message>
<source>Use custom Auto-Type sequence:</source> <source>Use custom Auto-Type sequence:</source>
<translation type="unfinished"/> <translation>Usa una seqüència de compleció automàtica personalitzada:</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -2463,6 +2473,14 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -2583,6 +2601,10 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
</message> </message>
<message> <message>
<source>Expires:</source> <source>Expires:</source>
<translation>Caduca:</translation>
</message>
<message>
<source>Edit Entry</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
</context> </context>
@@ -2594,7 +2616,7 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
</message> </message>
<message> <message>
<source>Remove key from agent after</source> <source>Remove key from agent after</source>
<translation type="unfinished"/> <translation>Suprimeix la clau de l&apos;agent després</translation>
</message> </message>
<message> <message>
<source> seconds</source> <source> seconds</source>
@@ -2663,7 +2685,7 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
</message> </message>
<message> <message>
<source>Remove key from agent after specified seconds</source> <source>Remove key from agent after specified seconds</source>
<translation type="unfinished"/> <translation>Suprimeix la clau de l&apos;agent després dels segons especificats</translation>
</message> </message>
<message> <message>
<source>Browser for key file</source> <source>Browser for key file</source>
@@ -2858,7 +2880,7 @@ Supported extensions are: %1.</source>
</message> </message>
<message> <message>
<source>Expires:</source> <source>Expires:</source>
<translation type="unfinished"/> <translation>Caduca:</translation>
</message> </message>
<message> <message>
<source>Use default Auto-Type sequence of parent group</source> <source>Use default Auto-Type sequence of parent group</source>
@@ -2884,6 +2906,10 @@ Supported extensions are: %1.</source>
<source>Set default Auto-Type sequence</source> <source>Set default Auto-Type sequence</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Edit Group</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>EditWidgetIcons</name> <name>EditWidgetIcons</name>
@@ -2969,11 +2995,11 @@ Supported extensions are: %1.</source>
</message> </message>
<message> <message>
<source>Use default icon</source> <source>Use default icon</source>
<translation type="unfinished"/> <translation>Usa la icona per defecte</translation>
</message> </message>
<message> <message>
<source>Use custom icon</source> <source>Use custom icon</source>
<translation type="unfinished"/> <translation>Usa una icona personalitzada</translation>
</message> </message>
<message> <message>
<source>Apply icon to...</source> <source>Apply icon to...</source>
@@ -3049,7 +3075,7 @@ This may cause the affected plugins to malfunction.</source>
</message> </message>
<message> <message>
<source>Remove selected plugin data</source> <source>Remove selected plugin data</source>
<translation type="unfinished"/> <translation>Suprimeix les dades del connector seleccionat</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -3098,7 +3124,7 @@ This may cause the affected plugins to malfunction.</source>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<source>Are you sure you want to remove %n attachment(s)?</source> <source>Are you sure you want to remove %n attachment(s)?</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> <translation><numerusform>Esteu segur que voleu eliminar %n fitxer(s) adjunt(s)?</numerusform><numerusform>Esteu segur que voleu suprimir %n adjunt(s)?</numerusform></translation>
</message> </message>
<message> <message>
<source>Save attachments</source> <source>Save attachments</source>
@@ -3152,7 +3178,7 @@ This may cause the affected plugins to malfunction.</source>
</message> </message>
<message> <message>
<source>Remove selected attachment</source> <source>Remove selected attachment</source>
<translation type="unfinished"/> <translation>Suprimeix el fitxer adjunt seleccionat</translation>
</message> </message>
<message> <message>
<source>Open selected attachment</source> <source>Open selected attachment</source>
@@ -3374,11 +3400,6 @@ Are you sure to add this file?</source>
<source>[PROTECTED]</source> <source>[PROTECTED]</source>
<translation>[PROTEGIT]</translation> <translation>[PROTEGIT]</translation>
</message> </message>
<message>
<source>&lt;b&gt;%1&lt;/b&gt;: %2</source>
<comment>attributes line</comment>
<translation>&lt;b&gt;%1&lt;/b&gt;: %2</translation>
</message>
<message> <message>
<source>Enabled</source> <source>Enabled</source>
<translation>Habilitat</translation> <translation>Habilitat</translation>
@@ -3399,6 +3420,15 @@ Are you sure to add this file?</source>
<source>Advanced</source> <source>Advanced</source>
<translation>Avançat</translation> <translation>Avançat</translation>
</message> </message>
<message>
<source>Default Sequence</source>
<translation type="unfinished"/>
</message>
<message>
<source>&lt;tr&gt;&lt;td&gt;&lt;b&gt;%1&lt;/b&gt;:&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;</source>
<comment>attributes line</comment>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>EntryURLModel</name> <name>EntryURLModel</name>
@@ -3409,18 +3439,6 @@ Are you sure to add this file?</source>
</context> </context>
<context> <context>
<name>EntryView</name> <name>EntryView</name>
<message>
<source>Customize View</source>
<translation>Personalitza la visualització</translation>
</message>
<message>
<source>Hide Usernames</source>
<translation>Oculta els noms d&apos;usuari</translation>
</message>
<message>
<source>Hide Passwords</source>
<translation>Oculta les contrasenyes</translation>
</message>
<message> <message>
<source>Fit to window</source> <source>Fit to window</source>
<translation>Ajusta a la finestra</translation> <translation>Ajusta a la finestra</translation>
@@ -3453,15 +3471,15 @@ Are you sure to add this file?</source>
</context> </context>
<context> <context>
<name>FdoSecrets::Service</name> <name>FdoSecrets::Service</name>
<message>
<source>Failed to register DBus service at %1.&lt;br/&gt;</source>
<translation type="unfinished"/>
</message>
<message numerus="yes"> <message numerus="yes">
<source>%n Entry(s) was used by %1</source> <source>%n Entry(s) was used by %1</source>
<comment>%1 is the name of an application</comment> <comment>%1 is the name of an application</comment>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message> </message>
<message>
<source>Failed to register DBus service at %1.&lt;br/&gt;</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>FdoSecrets::SettingsDatabaseModel</name> <name>FdoSecrets::SettingsDatabaseModel</name>
@@ -3630,7 +3648,7 @@ If this reoccurs, then your database file may be corrupt.</source>
</message> </message>
<message> <message>
<source>Unable to calculate database key</source> <source>Unable to calculate database key</source>
<translation type="unfinished"/> <translation>Impossible calcular la clau de base dades</translation>
</message> </message>
<message> <message>
<source>Unable to issue challenge-response: %1</source> <source>Unable to issue challenge-response: %1</source>
@@ -3645,7 +3663,7 @@ If this reoccurs, then your database file may be corrupt.</source>
</message> </message>
<message> <message>
<source>Unable to calculate database key</source> <source>Unable to calculate database key</source>
<translation type="unfinished"/> <translation>Impossible calcular la clau de base dades</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -4176,7 +4194,7 @@ If this reoccurs, then your database file may be corrupt.</source>
</message> </message>
<message> <message>
<source>Unable to calculate database key</source> <source>Unable to calculate database key</source>
<translation type="unfinished"/> <translation>Impossible calcular la clau de base dades</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -4257,7 +4275,7 @@ If this reoccurs, then your database file may be corrupt.</source>
<message> <message>
<source>Remove %1</source> <source>Remove %1</source>
<comment>Remove a key component</comment> <comment>Remove a key component</comment>
<translation type="unfinished"/> <translation>Suprimeix %1</translation>
</message> </message>
<message> <message>
<source>%1 set, click to change or remove</source> <source>%1 set, click to change or remove</source>
@@ -4279,10 +4297,6 @@ If this reoccurs, then your database file may be corrupt.</source>
<source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source> <source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source>
<translation>&lt;p&gt;Podeu afegir un fitxer clau que contingui bytes aleatoris per afegir seguretat.&lt;/p&gt;&lt;p&gt;L&apos;heu de mantenir secret i no perdre&apos;l, sinó us quedareu tancats a fora!&lt;/p&gt;</translation> <translation>&lt;p&gt;Podeu afegir un fitxer clau que contingui bytes aleatoris per afegir seguretat.&lt;/p&gt;&lt;p&gt;L&apos;heu de mantenir secret i no perdre&apos;l, sinó us quedareu tancats a fora!&lt;/p&gt;</translation>
</message> </message>
<message>
<source>Legacy key file format</source>
<translation>Format de fitxer clau antic</translation>
</message>
<message> <message>
<source>Error loading the key file '%1' <source>Error loading the key file '%1'
Message: %2</source> Message: %2</source>
@@ -4312,26 +4326,14 @@ Message: %2</source>
<source>Select a key file</source> <source>Select a key file</source>
<translation>Seleccioneu un fitxer clau</translation> <translation>Seleccioneu un fitxer clau</translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation>Selecciona el fitxer clau...</translation>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Browse...</source>
<translation>Navega...</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation>Genera un fitxer clau nou</translation> <translation>Genera un fitxer clau nou</translation>
</message> </message>
<message>
<source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
<translation>Nota: no utilitzeu un fitxer que pugui canviar perquè faria que no poguéssiu desbloquejar la base de dades!</translation>
</message>
<message> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation type="unfinished"/> <translation type="unfinished"/>
@@ -4350,10 +4352,23 @@ Are you sure you want to continue with this file?</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message> <message>
<source>You are using a legacy key file format which may become <source>Old key file format</source>
unsupported in the future. <translation type="unfinished"/>
</message>
Generate a new key file in the database security settings.</source> <message>
<source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Note: Do NOT use a file that may change as that will prevent you from unlocking your database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Browse</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
</context> </context>
@@ -4588,7 +4603,7 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
</message> </message>
<message> <message>
<source>&amp;Check for Updates</source> <source>&amp;Check for Updates</source>
<translation type="unfinished"/> <translation>&amp;Comprova si hi ha actualitzacions</translation>
</message> </message>
<message> <message>
<source>&amp;Open Database</source> <source>&amp;Open Database</source>
@@ -4596,7 +4611,7 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
</message> </message>
<message> <message>
<source>&amp;Save Database</source> <source>&amp;Save Database</source>
<translation type="unfinished"/> <translation>De&amp;sa la base de dades</translation>
</message> </message>
<message> <message>
<source>&amp;Close Database</source> <source>&amp;Close Database</source>
@@ -4608,7 +4623,7 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
</message> </message>
<message> <message>
<source>&amp;Merge From Database</source> <source>&amp;Merge From Database</source>
<translation type="unfinished"/> <translation>Fusiona des d&apos;una base de dades</translation>
</message> </message>
<message> <message>
<source>&amp;New Entry</source> <source>&amp;New Entry</source>
@@ -4648,11 +4663,11 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
</message> </message>
<message> <message>
<source>Database &amp;Reports...</source> <source>Database &amp;Reports...</source>
<translation type="unfinished"/> <translation>Informes de la base de dades...</translation>
</message> </message>
<message> <message>
<source>Statistics, health check, etc.</source> <source>Statistics, health check, etc.</source>
<translation type="unfinished"/> <translation>Estadístiques, comprovació de salut, etc.</translation>
</message> </message>
<message> <message>
<source>&amp;Database Settings</source> <source>&amp;Database Settings</source>
@@ -4664,19 +4679,19 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
</message> </message>
<message> <message>
<source>Move u&amp;p</source> <source>Move u&amp;p</source>
<translation type="unfinished"/> <translation>Mou am&amp;unt</translation>
</message> </message>
<message> <message>
<source>Move entry one step up</source> <source>Move entry one step up</source>
<translation type="unfinished"/> <translation>Mou l&apos;entrada un graó cap amunt</translation>
</message> </message>
<message> <message>
<source>Move do&amp;wn</source> <source>Move do&amp;wn</source>
<translation type="unfinished"/> <translation>Mou avall</translation>
</message> </message>
<message> <message>
<source>Move entry one step down</source> <source>Move entry one step down</source>
<translation type="unfinished"/> <translation>Baixa l&apos;entrada una posició</translation>
</message> </message>
<message> <message>
<source>Copy &amp;Username</source> <source>Copy &amp;Username</source>
@@ -4756,7 +4771,7 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
</message> </message>
<message> <message>
<source>Remove key from SSH Agent</source> <source>Remove key from SSH Agent</source>
<translation type="unfinished"/> <translation>Suprimeix la clau de l&apos;agent SSH</translation>
</message> </message>
<message> <message>
<source>Compact Mode</source> <source>Compact Mode</source>
@@ -4780,15 +4795,15 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
</message> </message>
<message> <message>
<source>Show Toolbar</source> <source>Show Toolbar</source>
<translation type="unfinished"/> <translation>Mostra la barra d&apos;eines</translation>
</message> </message>
<message> <message>
<source>Show Preview Panel</source> <source>Show Preview Panel</source>
<translation type="unfinished"/> <translation>Mostra el plafó de vista prèvia</translation>
</message> </message>
<message> <message>
<source>Don&apos;t show again for this version</source> <source>Don&apos;t show again for this version</source>
<translation type="unfinished"/> <translation>No mostrar un altre cop per a aquesta versió</translation>
</message> </message>
<message> <message>
<source>Restart Application?</source> <source>Restart Application?</source>
@@ -4800,7 +4815,7 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
</message> </message>
<message> <message>
<source>Perform Auto-Type Sequence</source> <source>Perform Auto-Type Sequence</source>
<translation type="unfinished"/> <translation>Fes un seqüència d&apos;autocompleció</translation>
</message> </message>
<message> <message>
<source>{USERNAME}</source> <source>{USERNAME}</source>
@@ -4818,6 +4833,18 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
<source>{PASSWORD}{ENTER}</source> <source>{PASSWORD}{ENTER}</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Always on Top</source>
<translation>Sempre a la part superior</translation>
</message>
<message>
<source>Hide Usernames</source>
<translation>Oculta els noms d&apos;usuari</translation>
</message>
<message>
<source>Hide Passwords</source>
<translation>Oculta les contrasenyes</translation>
</message>
</context> </context>
<context> <context>
<name>ManageDatabase</name> <name>ManageDatabase</name>
@@ -4913,7 +4940,7 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
</message> </message>
<message> <message>
<source>Removed custom data %1 [%2]</source> <source>Removed custom data %1 [%2]</source>
<translation type="unfinished"/> <translation>S&apos; han suprimit les dades personalitzades %1 [%2]</translation>
</message> </message>
<message> <message>
<source>Adding custom data %1 [%2]</source> <source>Adding custom data %1 [%2]</source>
@@ -5341,10 +5368,6 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
<source>Hex</source> <source>Hex</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</source>
<translation type="unfinished"/>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation type="unfinished"/> <translation type="unfinished"/>
@@ -5437,10 +5460,6 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
<source>Ctrl+S</source> <source>Ctrl+S</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Clear</source>
<translation>Neteja</translation>
</message>
<message> <message>
<source>Regenerate password (%1)</source> <source>Regenerate password (%1)</source>
<translation type="unfinished"/> <translation type="unfinished"/>
@@ -5449,6 +5468,10 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
<source>Special Characters</source> <source>Special Characters</source>
<translation>Caràcters especials</translation> <translation>Caràcters especials</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -5506,7 +5529,7 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
</message> </message>
<message> <message>
<source>Health Check</source> <source>Health Check</source>
<translation type="unfinished"/> <translation>Comprovació de salut</translation>
</message> </message>
<message> <message>
<source>HIBP</source> <source>HIBP</source>
@@ -5525,7 +5548,7 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
</message> </message>
<message> <message>
<source>Move</source> <source>Move</source>
<translation type="unfinished"/> <translation>Mou</translation>
</message> </message>
<message> <message>
<source>Empty</source> <source>Empty</source>
@@ -5687,13 +5710,6 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
<source>Perform advanced analysis on the password.</source> <source>Perform advanced analysis on the password.</source>
<translation>Fes una anàlisi avançada de la contrasenya.</translation> <translation>Fes una anàlisi avançada de la contrasenya.</translation>
</message> </message>
<message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
<translation type="unfinished"/>
</message>
<message> <message>
<source> <source>
@@ -6044,11 +6060,11 @@ Available commands:
</message> </message>
<message> <message>
<source>Unable to save database to file : %1</source> <source>Unable to save database to file : %1</source>
<translation type="unfinished"/> <translation>No s&apos;ha pogut desar la base de dades al fitxer: %1</translation>
</message> </message>
<message> <message>
<source>Unable to save database to file: %1</source> <source>Unable to save database to file: %1</source>
<translation type="unfinished"/> <translation>No s&apos;ha pogut desar la base de dades al fitxer: %1</translation>
</message> </message>
<message> <message>
<source>Successfully recycled entry %1.</source> <source>Successfully recycled entry %1.</source>
@@ -6078,10 +6094,6 @@ Available commands:
<source>%1: (row, col) %2,%3</source> <source>%1: (row, col) %2,%3</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Argon2 (KDBX 4 recommended)</source>
<translation>Argon2 (KDBX 4 - recomanat)</translation>
</message>
<message> <message>
<source>AES-KDF (KDBX 4)</source> <source>AES-KDF (KDBX 4)</source>
<translation>AES-KDF (KDBX 4)</translation> <translation>AES-KDF (KDBX 4)</translation>
@@ -6126,7 +6138,7 @@ Available commands:
</message> </message>
<message> <message>
<source>Failed to save the database: %1.</source> <source>Failed to save the database: %1.</source>
<translation type="unfinished"/> <translation>No s&apos;ha pogut desar la base de dades: %1</translation>
</message> </message>
<message> <message>
<source>Successfully created new database.</source> <source>Successfully created new database.</source>
@@ -6172,10 +6184,6 @@ Available commands:
<source>read password of the database from stdin</source> <source>read password of the database from stdin</source>
<translation>llegiu la contrasenya de la base de dades des de l&apos;entrada estàndard (stdin)</translation> <translation>llegiu la contrasenya de la base de dades des de l&apos;entrada estàndard (stdin)</translation>
</message> </message>
<message>
<source>Parent window handle</source>
<translation type="unfinished"/>
</message>
<message> <message>
<source>Another instance of KeePassXC is already running.</source> <source>Another instance of KeePassXC is already running.</source>
<translation>Ja s&apos;està executant una altra instància de KeePassXC.</translation> <translation>Ja s&apos;està executant una altra instància de KeePassXC.</translation>
@@ -6418,7 +6426,7 @@ Nucli: %3 %4</translation>
</message> </message>
<message> <message>
<source>Path of the entry to move.</source> <source>Path of the entry to move.</source>
<translation type="unfinished"/> <translation>Ruta de l&apos;entrada a moure.</translation>
</message> </message>
<message> <message>
<source>Path of the destination group.</source> <source>Path of the destination group.</source>
@@ -6434,7 +6442,7 @@ Nucli: %3 %4</translation>
</message> </message>
<message> <message>
<source>Successfully moved entry %1 to group %2.</source> <source>Successfully moved entry %1 to group %2.</source>
<translation type="unfinished"/> <translation>S&apos;ha mogut correctament l&apos;entrada %1 al grup %2</translation>
</message> </message>
<message> <message>
<source>Open a database.</source> <source>Open a database.</source>
@@ -6442,7 +6450,7 @@ Nucli: %3 %4</translation>
</message> </message>
<message> <message>
<source>Path of the group to remove.</source> <source>Path of the group to remove.</source>
<translation type="unfinished"/> <translation>Ruta del grup a suprimir.</translation>
</message> </message>
<message> <message>
<source>Cannot remove root group from database.</source> <source>Cannot remove root group from database.</source>
@@ -6661,10 +6669,6 @@ Nucli: %3 %4</translation>
<source>AES (%1 rounds)</source> <source>AES (%1 rounds)</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Argon2 (%1 rounds, %2 KB)</source>
<translation type="unfinished"/>
</message>
<message> <message>
<source>AES 256-bit</source> <source>AES 256-bit</source>
<translation type="unfinished"/> <translation type="unfinished"/>
@@ -6691,6 +6695,65 @@ Nucli: %3 %4</translation>
<comment>seconds</comment> <comment>seconds</comment>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation> <translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message> </message>
<message>
<source>path to a custom local config file</source>
<translation type="unfinished"/>
</message>
<message>
<source>WARNING: You are using an old key file format which KeePassXC may
stop supporting in the future.
Please consider generating a new key file.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Argon2%1 (%2 rounds, %3 KB)</source>
<translation type="unfinished"/>
</message>
<message>
<source>Argon2d (KDBX 4 recommended)</source>
<translation type="unfinished"/>
</message>
<message>
<source>Argon2id (KDBX 4)</source>
<translation type="unfinished"/>
</message>
<message>
<source>TOTP</source>
<translation>TOTP</translation>
</message>
<message>
<source>Icon</source>
<translation>Icona</translation>
</message>
<message>
<source>Unsupported key file version: %1</source>
<translation type="unfinished"/>
</message>
<message>
<source>Checksum mismatch! Key file may be corrupt.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Unexpected key file data! Key file may be corrupt.</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation type="unfinished"/>
</message>
<message>
<source>Locked databases.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Database failed to lock.</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QtIOCompressor</name> <name>QtIOCompressor</name>
@@ -6734,7 +6797,7 @@ Nucli: %3 %4</translation>
</message> </message>
<message> <message>
<source>Hover over reason to show additional details. Double-click entries to edit.</source> <source>Hover over reason to show additional details. Double-click entries to edit.</source>
<translation type="unfinished"/> <translation>Poseu-vos damunt del motiu per veure més detalls. Feu doble clic per editar l&apos;entrada.</translation>
</message> </message>
<message> <message>
<source>Bad</source> <source>Bad</source>
@@ -6789,11 +6852,11 @@ Nucli: %3 %4</translation>
</message> </message>
<message> <message>
<source>Score</source> <source>Score</source>
<translation type="unfinished"/> <translation>Puntuació</translation>
</message> </message>
<message> <message>
<source>Reason</source> <source>Reason</source>
<translation type="unfinished"/> <translation>Motiu</translation>
</message> </message>
<message> <message>
<source>Edit Entry...</source> <source>Edit Entry...</source>
@@ -7026,7 +7089,7 @@ Nucli: %3 %4</translation>
</message> </message>
<message> <message>
<source>No agent running, cannot remove identity.</source> <source>No agent running, cannot remove identity.</source>
<translation type="unfinished"/> <translation>No hi ha cap agent en execució, no es pot suprimir la identitat.</translation>
</message> </message>
<message> <message>
<source>Agent refused this identity. Possible reasons include:</source> <source>Agent refused this identity. Possible reasons include:</source>
@@ -7114,10 +7177,6 @@ Nucli: %3 %4</translation>
<source>Search</source> <source>Search</source>
<translation>Cerca</translation> <translation>Cerca</translation>
</message> </message>
<message>
<source>Clear</source>
<translation>Neteja</translation>
</message>
<message> <message>
<source>Limit search to selected group</source> <source>Limit search to selected group</source>
<translation>Limitar la cerca al grup seleccionat</translation> <translation>Limitar la cerca al grup seleccionat</translation>
@@ -7360,7 +7419,7 @@ Nucli: %3 %4</translation>
</message> </message>
<message> <message>
<source>Remove selected certificate</source> <source>Remove selected certificate</source>
<translation type="unfinished"/> <translation>Suprimeix el certificat seleccionat</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -7397,10 +7456,6 @@ Nucli: %3 %4</translation>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation type="unfinished"/> <translation type="unfinished"/>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7468,10 +7523,6 @@ Nucli: %3 %4</translation>
<source>File does not exist</source> <source>File does not exist</source>
<translation>El fitxer no existeix</translation> <translation>El fitxer no existeix</translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>

View File

@@ -139,6 +139,10 @@
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation>Aby se změna jazyka projevila, je třeba aplikaci restartovat. Chcete to provést nyní?</translation> <translation>Aby se změna jazyka projevila, je třeba aplikaci restartovat. Chcete to provést nyní?</translation>
</message> </message>
<message>
<source>Monochrome</source>
<translation>Černobílá</translation>
</message>
</context> </context>
<context> <context>
<name>ApplicationSettingsWidgetGeneral</name> <name>ApplicationSettingsWidgetGeneral</name>
@@ -1114,6 +1118,14 @@ chrome-laptop.</translation>
<source>Column %1</source> <source>Column %1</source>
<translation>Sloupec %1</translation> <translation>Sloupec %1</translation>
</message> </message>
<message>
<source>TOTP</source>
<translation>TOTP</translation>
</message>
<message>
<source>Icon</source>
<translation>Ikona</translation>
</message>
</context> </context>
<context> <context>
<name>CsvParserModel</name> <name>CsvParserModel</name>
@@ -1210,19 +1222,6 @@ Záložní databáze se nachází v %2</translation>
<source>Refresh</source> <source>Refresh</source>
<translation>Načíst znovu</translation> <translation>Načíst znovu</translation>
</message> </message>
<message>
<source>Legacy key file format</source>
<translation>Starý formát souboru s klíčem</translation>
</message>
<message>
<source>You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
<translation>Používáte starý formát souboru s klíčem, který v budoucnu nemusí být podporován.
Zvažte vytvoření nového souboru s klíčem.</translation>
</message>
<message> <message>
<source>Don&apos;t show this warning again</source> <source>Don&apos;t show this warning again</source>
<translation>Toto varování znovu nezobrazovat</translation> <translation>Toto varování znovu nezobrazovat</translation>
@@ -1283,14 +1282,6 @@ Zvažte vytvoření nového souboru s klíčem.</translation>
<source>TouchID for Quick Unlock</source> <source>TouchID for Quick Unlock</source>
<translation>TouchID pro rychlé odemknutí</translation> <translation>TouchID pro rychlé odemknutí</translation>
</message> </message>
<message>
<source>Clear</source>
<translation>Vyčistit</translation>
</message>
<message>
<source>Clear Key File</source>
<translation>Vyčistit soubor s klíčem</translation>
</message>
<message> <message>
<source>Unlock failed and no password given</source> <source>Unlock failed and no password given</source>
<translation>Odemknutí se nezdařilo a nebylo zadáno žádné heslo</translation> <translation>Odemknutí se nezdařilo a nebylo zadáno žádné heslo</translation>
@@ -1361,6 +1352,14 @@ Pokud nemáte žádný soubor, který by se zaručeně neměnil (a byl tedy vhod
<source>Select hardware key</source> <source>Select hardware key</source>
<translation>Vyberte hardwarový klíč</translation> <translation>Vyberte hardwarový klíč</translation>
</message> </message>
<message>
<source>Old key file format</source>
<translation>Starý formát souboru s klíčem</translation>
</message>
<message>
<source>You are using an old key file format which KeePassXC may&lt;br&gt;stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file by going to:&lt;br&gt;&lt;strong&gt;Database / Database Security / Change Key File.&lt;/strong&gt;&lt;br&gt;</source>
<translation>Používáte starý formát souboru s klíčem, který může KeePassXC &lt;br&gt;přestat v budoucnu podporovat.&lt;br&gt;&lt;br&gt;Zvažte prosím vytvoření nového souboru s klíčem v nabídce &lt;br&gt;&lt;strong&gt;Databáze / Zabezpečení databáze / Změnit soubor s klíčem.&lt;/strong&gt;&lt;br&gt;</translation>
</message>
</context> </context>
<context> <context>
<name>DatabaseSettingWidgetMetaData</name> <name>DatabaseSettingWidgetMetaData</name>
@@ -2294,6 +2293,16 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
<source>[PROTECTED] Press Reveal to view or edit</source> <source>[PROTECTED] Press Reveal to view or edit</source>
<translation>[CHRÁNĚNO] Pro zobrazení nebo úpravu klikněte na odhalit</translation> <translation>[CHRÁNĚNO] Pro zobrazení nebo úpravu klikněte na odhalit</translation>
</message> </message>
<message>
<source>Invalid Entry</source>
<translation>Neplatný údaj</translation>
</message>
<message>
<source>An external merge operation has invalidated this entry.
Unfortunately, any changes made have been lost.</source>
<translation>Externí operace sloučení tuto položku zneplatnila.
Všechny provedené změny byly bohužel ztraceny.</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetAdvanced</name> <name>EditEntryWidgetAdvanced</name>
@@ -2491,6 +2500,14 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation>Tuto položku použít pouze ve spojení se základním HTTP ověřováním se</translation> <translation>Tuto položku použít pouze ve spojení se základním HTTP ověřováním se</translation>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation>Tuto položku nepoužívat ve spojení se základním HTTP ověřováním se</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -2613,6 +2630,10 @@ Vypnout bezpečné ukládání a zkusit to znovu?</translation>
<source>Expires:</source> <source>Expires:</source>
<translation>Platnost skončí:</translation> <translation>Platnost skončí:</translation>
</message> </message>
<message>
<source>Edit Entry</source>
<translation>Upravit záznam</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetSSHAgent</name> <name>EditEntryWidgetSSHAgent</name>
@@ -2913,6 +2934,10 @@ Podporovaná rozšíření jsou: %1.</translation>
<source>Set default Auto-Type sequence</source> <source>Set default Auto-Type sequence</source>
<translation>Nastavit výchozí pořadí automatického vyplňování</translation> <translation>Nastavit výchozí pořadí automatického vyplňování</translation>
</message> </message>
<message>
<source>Edit Group</source>
<translation>Upravit skupinu</translation>
</message>
</context> </context>
<context> <context>
<name>EditWidgetIcons</name> <name>EditWidgetIcons</name>
@@ -3414,11 +3439,6 @@ Opravdu chcete tento soubor přidat?</translation>
<source>[PROTECTED]</source> <source>[PROTECTED]</source>
<translation>[CHRÁNĚNO]</translation> <translation>[CHRÁNĚNO]</translation>
</message> </message>
<message>
<source>&lt;b&gt;%1&lt;/b&gt;: %2</source>
<comment>attributes line</comment>
<translation>&lt;b&gt;%1&lt;/b&gt;: %2</translation>
</message>
<message> <message>
<source>Enabled</source> <source>Enabled</source>
<translation>Zapnuto</translation> <translation>Zapnuto</translation>
@@ -3439,6 +3459,15 @@ Opravdu chcete tento soubor přidat?</translation>
<source>Advanced</source> <source>Advanced</source>
<translation>Pokročilé</translation> <translation>Pokročilé</translation>
</message> </message>
<message>
<source>Default Sequence</source>
<translation>Výchozí pořadí</translation>
</message>
<message>
<source>&lt;tr&gt;&lt;td&gt;&lt;b&gt;%1&lt;/b&gt;:&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;</source>
<comment>attributes line</comment>
<translation>&lt;tr&gt;&lt;td&gt;&lt;b&gt;%1&lt;/b&gt;:&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;</translation>
</message>
</context> </context>
<context> <context>
<name>EntryURLModel</name> <name>EntryURLModel</name>
@@ -3449,18 +3478,6 @@ Opravdu chcete tento soubor přidat?</translation>
</context> </context>
<context> <context>
<name>EntryView</name> <name>EntryView</name>
<message>
<source>Customize View</source>
<translation>Přizpůsobit pohled</translation>
</message>
<message>
<source>Hide Usernames</source>
<translation>Skrýt uživatelská jména</translation>
</message>
<message>
<source>Hide Passwords</source>
<translation>Skrýt hesla</translation>
</message>
<message> <message>
<source>Fit to window</source> <source>Fit to window</source>
<translation>Přizpůsobit oknu</translation> <translation>Přizpůsobit oknu</translation>
@@ -3493,15 +3510,15 @@ Opravdu chcete tento soubor přidat?</translation>
</context> </context>
<context> <context>
<name>FdoSecrets::Service</name> <name>FdoSecrets::Service</name>
<message>
<source>Failed to register DBus service at %1.&lt;br/&gt;</source>
<translation>Nepodařilo se zaregistrovat službu DBus na %1.&lt;br/&gt;</translation>
</message>
<message numerus="yes"> <message numerus="yes">
<source>%n Entry(s) was used by %1</source> <source>%n Entry(s) was used by %1</source>
<comment>%1 is the name of an application</comment> <comment>%1 is the name of an application</comment>
<translation><numerusform>%n záznam byl použit %1</numerusform><numerusform>%n záznamy byly použity %1</numerusform><numerusform>%n záznamů bylo použito %1</numerusform><numerusform>%n záznamy byly použity %1</numerusform></translation> <translation><numerusform>%n záznam byl použit %1</numerusform><numerusform>%n záznamy byly použity %1</numerusform><numerusform>%n záznamů bylo použito %1</numerusform><numerusform>%n záznamy byly použity %1</numerusform></translation>
</message> </message>
<message>
<source>Failed to register DBus service at %1.&lt;br/&gt;</source>
<translation>Nepodařilo se zaregistrovat službu DBus na %1.&lt;br/&gt;</translation>
</message>
</context> </context>
<context> <context>
<name>FdoSecrets::SettingsDatabaseModel</name> <name>FdoSecrets::SettingsDatabaseModel</name>
@@ -4325,10 +4342,6 @@ Pokud se toto opakuje, pak je možné, že je váš soubor s databází poškoze
<source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source> <source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source>
<translation>&lt;p&gt;Jako další úroveň zabezpečení je možné přidat soubor s klíčem obsahujícím náhodné bajty.&lt;/p&gt;&lt;p&gt;Je třeba ho uchovávat v bezpečí a nikdy ho neztratit, jinak budete uzamčeni!&lt;/p&gt;</translation> <translation>&lt;p&gt;Jako další úroveň zabezpečení je možné přidat soubor s klíčem obsahujícím náhodné bajty.&lt;/p&gt;&lt;p&gt;Je třeba ho uchovávat v bezpečí a nikdy ho neztratit, jinak budete uzamčeni!&lt;/p&gt;</translation>
</message> </message>
<message>
<source>Legacy key file format</source>
<translation>Starý formát souboru s klíčem</translation>
</message>
<message> <message>
<source>Error loading the key file '%1' <source>Error loading the key file '%1'
Message: %2</source> Message: %2</source>
@@ -4359,26 +4372,14 @@ Zpráva: %2</translation>
<source>Select a key file</source> <source>Select a key file</source>
<translation>Vyberte soubor s klíčem</translation> <translation>Vyberte soubor s klíčem</translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation>Výběr souboru s klíčem</translation>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation>Nalistovat soubor s klíčem</translation> <translation>Nalistovat soubor s klíčem</translation>
</message> </message>
<message>
<source>Browse...</source>
<translation>Procházet</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation>Vytvořit nový soubor s klíčem</translation> <translation>Vytvořit nový soubor s klíčem</translation>
</message> </message>
<message>
<source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
<translation>Pozn.: Nepoužívejte soubor, který se může změnit, protože by to znemožnilo odemčení databáze!</translation>
</message>
<message> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation>Neplatný soubor s klíčem</translation> <translation>Neplatný soubor s klíčem</translation>
@@ -4398,13 +4399,24 @@ Are you sure you want to continue with this file?</source>
Opravdu chcete tento soubor použít?</translation> Opravdu chcete tento soubor použít?</translation>
</message> </message>
<message> <message>
<source>You are using a legacy key file format which may become <source>Old key file format</source>
unsupported in the future. <translation>Starý formát souboru s klíčem</translation>
</message>
Generate a new key file in the database security settings.</source> <message>
<translation>Používáte starý formát souboru s klíčem, který v budoucnu nemusí být podporován. <source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
<translation>Vybrali jste soubor s klíčem ve starém formátu, který KeePassXC&lt;br&gt;může přestat v budoucnu podporovat.&lt;br&gt;&lt;br&gt;Zvažte prosím místo něj vytvoření nového souboru s klíčem.</translation>
V nastavení zabezpečení databáze vytvořte nový klíč.</translation> </message>
<message>
<source>Generate a new key file or choose an existing one to protect your database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Note: Do NOT use a file that may change as that will prevent you from unlocking your database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Browse</source>
<translation type="unfinished"/>
</message> </message>
</context> </context>
<context> <context>
@@ -4869,6 +4881,18 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
<source>{PASSWORD}{ENTER}</source> <source>{PASSWORD}{ENTER}</source>
<translation>{HESLO}{ENTER}</translation> <translation>{HESLO}{ENTER}</translation>
</message> </message>
<message>
<source>Always on Top</source>
<translation>Vždy nahoře</translation>
</message>
<message>
<source>Hide Usernames</source>
<translation>Skrýt uživatelská jména</translation>
</message>
<message>
<source>Hide Passwords</source>
<translation>Skrýt hesla</translation>
</message>
</context> </context>
<context> <context>
<name>ManageDatabase</name> <name>ManageDatabase</name>
@@ -5393,10 +5417,6 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
<source>Hex</source> <source>Hex</source>
<translation>Hex</translation> <translation>Hex</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</source>
<translation>Vynechané znaky: 0, 1, l, I, O, |, . </translation>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation>Vytvořené heslo</translation> <translation>Vytvořené heslo</translation>
@@ -5489,10 +5509,6 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
<source>Ctrl+S</source> <source>Ctrl+S</source>
<translation>Ctrl+S</translation> <translation>Ctrl+S</translation>
</message> </message>
<message>
<source>Clear</source>
<translation>Vyčistit</translation>
</message>
<message> <message>
<source>Regenerate password (%1)</source> <source>Regenerate password (%1)</source>
<translation>Znovu vytvořit heslo (%1)</translation> <translation>Znovu vytvořit heslo (%1)</translation>
@@ -5501,6 +5517,10 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
<source>Special Characters</source> <source>Special Characters</source>
<translation>Zvláštní znaky</translation> <translation>Zvláštní znaky</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -5739,15 +5759,6 @@ Očekávejte chyby a drobné problémy, tato verze není určena pro produkční
<source>Perform advanced analysis on the password.</source> <source>Perform advanced analysis on the password.</source>
<translation>Provést pokročilou analýzu hesla.</translation> <translation>Provést pokročilou analýzu hesla.</translation>
</message> </message>
<message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
<translation>VAROVÁNÍ: Používáte starší formát souboru s klíčem, který v budoucnu nemusí být podporován.
Zvažte vytvoření nového souboru s klíčem.</translation>
</message>
<message> <message>
<source> <source>
@@ -6135,10 +6146,6 @@ Příkazy k dispozici:
<source>%1: (row, col) %2,%3</source> <source>%1: (row, col) %2,%3</source>
<translation>%1: (řádek, sloupec) %2,%3</translation> <translation>%1: (řádek, sloupec) %2,%3</translation>
</message> </message>
<message>
<source>Argon2 (KDBX 4 recommended)</source>
<translation>Argon2 (KDBX 4 doporučeno)</translation>
</message>
<message> <message>
<source>AES-KDF (KDBX 4)</source> <source>AES-KDF (KDBX 4)</source>
<translation>AES-KDF (KDBX 4)</translation> <translation>AES-KDF (KDBX 4)</translation>
@@ -6229,10 +6236,6 @@ Příkazy k dispozici:
<source>read password of the database from stdin</source> <source>read password of the database from stdin</source>
<translation>načíst heslo k databázi ze standardního vstupu</translation> <translation>načíst heslo k databázi ze standardního vstupu</translation>
</message> </message>
<message>
<source>Parent window handle</source>
<translation>Obecný identifikátor (handle) nadřazeného okna</translation>
</message>
<message> <message>
<source>Another instance of KeePassXC is already running.</source> <source>Another instance of KeePassXC is already running.</source>
<translation>Již je spuštěná jiná instance KeePassXC.</translation> <translation>Již je spuštěná jiná instance KeePassXC.</translation>
@@ -6720,10 +6723,6 @@ Jádro systému: %3 %4</translation>
<source>AES (%1 rounds)</source> <source>AES (%1 rounds)</source>
<translation>AES (%1 průchodů)</translation> <translation>AES (%1 průchodů)</translation>
</message> </message>
<message>
<source>Argon2 (%1 rounds, %2 KB)</source>
<translation>Argon2 (%1 průchody, %2 KB)</translation>
</message>
<message> <message>
<source>AES 256-bit</source> <source>AES 256-bit</source>
<translation>AES 256-bit</translation> <translation>AES 256-bit</translation>
@@ -6750,6 +6749,68 @@ Jádro systému: %3 %4</translation>
<comment>seconds</comment> <comment>seconds</comment>
<translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation> <translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
</message> </message>
<message>
<source>path to a custom local config file</source>
<translation>umístění vlastního lokálního souboru s nastaveními</translation>
</message>
<message>
<source>WARNING: You are using an old key file format which KeePassXC may
stop supporting in the future.
Please consider generating a new key file.</source>
<translation>VAROVÁNÍ: Používáte starý formát souboru s klíčem, který může KeePassXC
přestat v budoucnu podporovat.
Zvažte prosím vytvoření nového souboru s klíčem.</translation>
</message>
<message>
<source>Argon2%1 (%2 rounds, %3 KB)</source>
<translation>Argon2%1 (%2 průchody, %3 KB)</translation>
</message>
<message>
<source>Argon2d (KDBX 4 recommended)</source>
<translation>Argon2d (KDBX 4 doporučeno)</translation>
</message>
<message>
<source>Argon2id (KDBX 4)</source>
<translation>Argon2id (KDBX 4)</translation>
</message>
<message>
<source>TOTP</source>
<translation>TOTP</translation>
</message>
<message>
<source>Icon</source>
<translation>Ikona</translation>
</message>
<message>
<source>Unsupported key file version: %1</source>
<translation>Nepodporovaná verze souboru s klíčem: %1</translation>
</message>
<message>
<source>Checksum mismatch! Key file may be corrupt.</source>
<translation>Kontrolní součet se neshoduje! Soubor s klíčem může být poškozený.</translation>
</message>
<message>
<source>Unexpected key file data! Key file may be corrupt.</source>
<translation>Neočekávaná data v souboru s klíčem! Soubor s klíčem může být poškozený.</translation>
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation type="unfinished"/>
</message>
<message>
<source>Locked databases.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Database failed to lock.</source>
<translation type="unfinished"/>
</message>
</context> </context>
<context> <context>
<name>QtIOCompressor</name> <name>QtIOCompressor</name>
@@ -7173,10 +7234,6 @@ Jádro systému: %3 %4</translation>
<source>Search</source> <source>Search</source>
<translation>Hledat</translation> <translation>Hledat</translation>
</message> </message>
<message>
<source>Clear</source>
<translation>Vyčistit</translation>
</message>
<message> <message>
<source>Limit search to selected group</source> <source>Limit search to selected group</source>
<translation>Omezit hledání na označenou skupinu</translation> <translation>Omezit hledání na označenou skupinu</translation>
@@ -7456,10 +7513,6 @@ Jádro systému: %3 %4</translation>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation>Nedaří se zapsat do exportního kontejneru</translation> <translation>Nedaří se zapsat do exportního kontejneru</translation>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation>Došlo k neočekávané chybě exportu</translation>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7527,10 +7580,6 @@ Jádro systému: %3 %4</translation>
<source>File does not exist</source> <source>File does not exist</source>
<translation>Soubor neexistuje</translation> <translation>Soubor neexistuje</translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation>Neznámý typ kontejneru pro sdílení</translation>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>

View File

@@ -139,6 +139,10 @@
<source>You must restart the application to set the new language. Would you like to restart now?</source> <source>You must restart the application to set the new language. Would you like to restart now?</source>
<translation>Zum Ändern der Sprache müssen Sie die Anwendung neu starten. Möchten Sie jetzt neu starten?</translation> <translation>Zum Ändern der Sprache müssen Sie die Anwendung neu starten. Möchten Sie jetzt neu starten?</translation>
</message> </message>
<message>
<source>Monochrome</source>
<translation>Monochrom</translation>
</message>
</context> </context>
<context> <context>
<name>ApplicationSettingsWidgetGeneral</name> <name>ApplicationSettingsWidgetGeneral</name>
@@ -233,7 +237,7 @@
</message> </message>
<message> <message>
<source>Check for updates at application startup once per week</source> <source>Check for updates at application startup once per week</source>
<translation>Bei Programmstartstart wöchentlich auf Updates prüfen</translation> <translation>Bei Programmstart wöchentlich auf Updates prüfen</translation>
</message> </message>
<message> <message>
<source>Include beta releases when checking for updates</source> <source>Include beta releases when checking for updates</source>
@@ -1112,6 +1116,14 @@ Geben Sie der Verbindung einen eindeutigen Namen, z. B. &quot;chrome-laptop&quot
<source>Column %1</source> <source>Column %1</source>
<translation>Spalte %1</translation> <translation>Spalte %1</translation>
</message> </message>
<message>
<source>TOTP</source>
<translation>TOTP</translation>
</message>
<message>
<source>Icon</source>
<translation>Symbol</translation>
</message>
</context> </context>
<context> <context>
<name>CsvParserModel</name> <name>CsvParserModel</name>
@@ -1208,19 +1220,6 @@ Sicherungskopie der Datenbank ist in %2</translation>
<source>Refresh</source> <source>Refresh</source>
<translation>Neu laden</translation> <translation>Neu laden</translation>
</message> </message>
<message>
<source>Legacy key file format</source>
<translation>Veraltetes Schlüsseldatei-Format</translation>
</message>
<message>
<source>You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
<translation>Sie verwenden ein veraltetes Schlüsseldatei-Format, welches in Zukunft möglicherweise nicht mehr unterstützt wird.
Bitte denken Sie darüber nach, eine neue Schlüsseldatei zu erzeugen.</translation>
</message>
<message> <message>
<source>Don&apos;t show this warning again</source> <source>Don&apos;t show this warning again</source>
<translation>Diese Warnung nicht wieder anzeigen</translation> <translation>Diese Warnung nicht wieder anzeigen</translation>
@@ -1281,14 +1280,6 @@ Bitte denken Sie darüber nach, eine neue Schlüsseldatei zu erzeugen.</translat
<source>TouchID for Quick Unlock</source> <source>TouchID for Quick Unlock</source>
<translation>TouchID für Quick Unlock</translation> <translation>TouchID für Quick Unlock</translation>
</message> </message>
<message>
<source>Clear</source>
<translation>Löschen</translation>
</message>
<message>
<source>Clear Key File</source>
<translation>Schlüsseldatei löschen</translation>
</message>
<message> <message>
<source>Unlock failed and no password given</source> <source>Unlock failed and no password given</source>
<translation>Entsperren fehlgeschlagen und kein Passwort angegeben</translation> <translation>Entsperren fehlgeschlagen und kein Passwort angegeben</translation>
@@ -1359,6 +1350,14 @@ Wenn Sie keine Schlüsseldatei haben, lassen Sie das Feld bitte leer.</translati
<source>Select hardware key</source> <source>Select hardware key</source>
<translation>Hardwareschlüssel auswählen</translation> <translation>Hardwareschlüssel auswählen</translation>
</message> </message>
<message>
<source>Old key file format</source>
<translation>Altes Schlüsseldateiformat</translation>
</message>
<message>
<source>You are using an old key file format which KeePassXC may&lt;br&gt;stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file by going to:&lt;br&gt;&lt;strong&gt;Database / Database Security / Change Key File.&lt;/strong&gt;&lt;br&gt;</source>
<translation>Sie verwenden ein altes Schlüsseldateiformat, das KeePassXC möglicherweise&lt;br&gt;in Zukunft nicht mehr unterstützen wird.&lt;br&gt;&lt;br&gt;Bitte erwägen Sie, eine neue Schlüsseldatei zu erzeugen, indem Sie zu:&lt;br&gt;&lt;strong&gt;Datenbank / Datenbank-Sicherheit / Schlüsseldatei ändern gehen.&lt;/strong&gt;&lt;br&gt;</translation>
</message>
</context> </context>
<context> <context>
<name>DatabaseSettingWidgetMetaData</name> <name>DatabaseSettingWidgetMetaData</name>
@@ -1997,7 +1996,7 @@ Das ist definitiv ein Programmfehler, bitte benachrichtigen Sie die Entwickler.<
</message> </message>
<message numerus="yes"> <message numerus="yes">
<source>Do you really want to move %n entry(s) to the recycle bin?</source> <source>Do you really want to move %n entry(s) to the recycle bin?</source>
<translation><numerusform>Möchten Sie wirklich %n Eintrag aus dem Papierkorb löschen?</numerusform><numerusform>Möchten Sie wirklich %n Einträge aus dem Papierkorb löschen?</numerusform></translation> <translation><numerusform>Möchten Sie wirklich %n Eintrag in den Papierkorb verschieben?</numerusform><numerusform>Möchten Sie wirklich %n Einträge in den Papierkorb verschieben?</numerusform></translation>
</message> </message>
<message> <message>
<source>Execute command?</source> <source>Execute command?</source>
@@ -2293,6 +2292,16 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
<source>[PROTECTED] Press Reveal to view or edit</source> <source>[PROTECTED] Press Reveal to view or edit</source>
<translation>[GESCHÜTZT] Zeigen anklicken zum Anzeigen oder Bearbeiten</translation> <translation>[GESCHÜTZT] Zeigen anklicken zum Anzeigen oder Bearbeiten</translation>
</message> </message>
<message>
<source>Invalid Entry</source>
<translation>Ungültiger Eintrag</translation>
</message>
<message>
<source>An external merge operation has invalidated this entry.
Unfortunately, any changes made have been lost.</source>
<translation>Ein externer Zusammenführungsvorgang hat diesen Eintrag ungültig gemacht.
Leider sind alle vorgenommenen Änderungen verloren gegangen.</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetAdvanced</name> <name>EditEntryWidgetAdvanced</name>
@@ -2490,6 +2499,14 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
<source>Use this entry only with HTTP Basic Auth</source> <source>Use this entry only with HTTP Basic Auth</source>
<translation>Diesen Eintrag nur mit &quot;HTTP Basic Auth&quot; verwenden</translation> <translation>Diesen Eintrag nur mit &quot;HTTP Basic Auth&quot; verwenden</translation>
</message> </message>
<message>
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
<translation>Diese Einstellung nicht an den Browser für HTTP-Auth-Dialoge senden. Wenn aktiviert, wird dieser Eintrag in HTTP-Auth-Dialogen nicht zur Auswahl angezeigt.</translation>
</message>
<message>
<source>Do not use this entry with HTTP Basic Auth</source>
<translation>Diesen Eintrag nicht mit HTTP-Basic-Auth verwenden</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetHistory</name> <name>EditEntryWidgetHistory</name>
@@ -2612,6 +2629,10 @@ Sicheres Speichern deaktivieren und erneut versuchen?</translation>
<source>Expires:</source> <source>Expires:</source>
<translation>Läuft ab:</translation> <translation>Läuft ab:</translation>
</message> </message>
<message>
<source>Edit Entry</source>
<translation>Eintrag bearbeiten</translation>
</message>
</context> </context>
<context> <context>
<name>EditEntryWidgetSSHAgent</name> <name>EditEntryWidgetSSHAgent</name>
@@ -2912,6 +2933,10 @@ Unterstützte Erweiterungen sind: %1.</translation>
<source>Set default Auto-Type sequence</source> <source>Set default Auto-Type sequence</source>
<translation>Standard-Auto-Type-Sequenz festlegen</translation> <translation>Standard-Auto-Type-Sequenz festlegen</translation>
</message> </message>
<message>
<source>Edit Group</source>
<translation>Gruppe bearbeiten</translation>
</message>
</context> </context>
<context> <context>
<name>EditWidgetIcons</name> <name>EditWidgetIcons</name>
@@ -3411,11 +3436,6 @@ Wollen Sie diese Datei wirklich hinzufügen?</translation>
<source>[PROTECTED]</source> <source>[PROTECTED]</source>
<translation>[GESCHÜTZT]</translation> <translation>[GESCHÜTZT]</translation>
</message> </message>
<message>
<source>&lt;b&gt;%1&lt;/b&gt;: %2</source>
<comment>attributes line</comment>
<translation>&lt;b&gt;%1&lt;/b&gt;: %2</translation>
</message>
<message> <message>
<source>Enabled</source> <source>Enabled</source>
<translation>Aktiviert</translation> <translation>Aktiviert</translation>
@@ -3436,6 +3456,15 @@ Wollen Sie diese Datei wirklich hinzufügen?</translation>
<source>Advanced</source> <source>Advanced</source>
<translation>Fortgeschritten</translation> <translation>Fortgeschritten</translation>
</message> </message>
<message>
<source>Default Sequence</source>
<translation>Standard-Sequenz</translation>
</message>
<message>
<source>&lt;tr&gt;&lt;td&gt;&lt;b&gt;%1&lt;/b&gt;:&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;</source>
<comment>attributes line</comment>
<translation>&lt;tr&gt;&lt;td&gt;&lt;b&gt;%1&lt;/b&gt;:&lt;/td&gt;&lt;td&gt;%2&lt;/td&gt;&lt;/tr&gt;</translation>
</message>
</context> </context>
<context> <context>
<name>EntryURLModel</name> <name>EntryURLModel</name>
@@ -3446,18 +3475,6 @@ Wollen Sie diese Datei wirklich hinzufügen?</translation>
</context> </context>
<context> <context>
<name>EntryView</name> <name>EntryView</name>
<message>
<source>Customize View</source>
<translation>Ansicht anpassen</translation>
</message>
<message>
<source>Hide Usernames</source>
<translation>Benutzernamen ausblenden</translation>
</message>
<message>
<source>Hide Passwords</source>
<translation>Passwörter ausblenden</translation>
</message>
<message> <message>
<source>Fit to window</source> <source>Fit to window</source>
<translation>An Fenster anpassen</translation> <translation>An Fenster anpassen</translation>
@@ -3490,15 +3507,15 @@ Wollen Sie diese Datei wirklich hinzufügen?</translation>
</context> </context>
<context> <context>
<name>FdoSecrets::Service</name> <name>FdoSecrets::Service</name>
<message>
<source>Failed to register DBus service at %1.&lt;br/&gt;</source>
<translation>Registrierung des DBus-Service auf %1 fehlgeschlagen.&lt;br/&gt;</translation>
</message>
<message numerus="yes"> <message numerus="yes">
<source>%n Entry(s) was used by %1</source> <source>%n Entry(s) was used by %1</source>
<comment>%1 is the name of an application</comment> <comment>%1 is the name of an application</comment>
<translation><numerusform>%n Eintrag wurde von %1 verwendet</numerusform><numerusform>%n Einträge wurden von %1 verwendet</numerusform></translation> <translation><numerusform>%n Eintrag wurde von %1 verwendet</numerusform><numerusform>%n Einträge wurden von %1 verwendet</numerusform></translation>
</message> </message>
<message>
<source>Failed to register DBus service at %1.&lt;br/&gt;</source>
<translation>Registrierung des DBus-Service auf %1 fehlgeschlagen.&lt;br/&gt;</translation>
</message>
</context> </context>
<context> <context>
<name>FdoSecrets::SettingsDatabaseModel</name> <name>FdoSecrets::SettingsDatabaseModel</name>
@@ -4322,10 +4339,6 @@ Falls dies wiederholt passiert, dann könnte Ihre Datenbank beschädigt sein.</t
<source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source> <source>&lt;p&gt;You can add a key file containing random bytes for additional security.&lt;/p&gt;&lt;p&gt;You must keep it secret and never lose it or you will be locked out!&lt;/p&gt;</source>
<translation>&lt;p&gt;Um die Sicherheit zu erhöhen, können Sie eine Schlüsseldatei mit zufälligem Inhalt erzeugen.&lt;/p&gt;&lt;p&gt;Diese Datei muss geheim gehalten werden und darf niemals verloren gehen, ansonsten ist kein Zugriff auf die Datenbank mehr möglich!&lt;/p&gt;</translation> <translation>&lt;p&gt;Um die Sicherheit zu erhöhen, können Sie eine Schlüsseldatei mit zufälligem Inhalt erzeugen.&lt;/p&gt;&lt;p&gt;Diese Datei muss geheim gehalten werden und darf niemals verloren gehen, ansonsten ist kein Zugriff auf die Datenbank mehr möglich!&lt;/p&gt;</translation>
</message> </message>
<message>
<source>Legacy key file format</source>
<translation>Veraltetes Schlüsseldatei-Format</translation>
</message>
<message> <message>
<source>Error loading the key file '%1' <source>Error loading the key file '%1'
Message: %2</source> Message: %2</source>
@@ -4356,26 +4369,14 @@ Message: %2</source>
<source>Select a key file</source> <source>Select a key file</source>
<translation>Schlüsseldatei auswählen</translation> <translation>Schlüsseldatei auswählen</translation>
</message> </message>
<message>
<source>Key file selection</source>
<translation>Auswahl der Schlüsseldatei</translation>
</message>
<message> <message>
<source>Browse for key file</source> <source>Browse for key file</source>
<translation>Schlüsseldatei auswählen</translation> <translation>Schlüsseldatei auswählen</translation>
</message> </message>
<message>
<source>Browse...</source>
<translation>Durchsuchen ...</translation>
</message>
<message> <message>
<source>Generate a new key file</source> <source>Generate a new key file</source>
<translation>Neue Schlüsseldatei erzeugen</translation> <translation>Neue Schlüsseldatei erzeugen</translation>
</message> </message>
<message>
<source>Note: Do not use a file that may change as that will prevent you from unlocking your database!</source>
<translation>Hinweis: Benutzen Sie keine Datei, die sich ändern kann, sonst können Sie die Datenbank nicht mehr entsperren!</translation>
</message>
<message> <message>
<source>Invalid Key File</source> <source>Invalid Key File</source>
<translation>Ungültige Schlüsseldatei</translation> <translation>Ungültige Schlüsseldatei</translation>
@@ -4395,14 +4396,24 @@ Are you sure you want to continue with this file?</source>
Wollen Sie wirklich mit dieser Datei fortfahren?</translation> Wollen Sie wirklich mit dieser Datei fortfahren?</translation>
</message> </message>
<message> <message>
<source>You are using a legacy key file format which may become <source>Old key file format</source>
unsupported in the future. <translation>Altes Schlüsseldateiformat</translation>
</message>
Generate a new key file in the database security settings.</source> <message>
<translation>Sie verwenden ein veraltetes Schlüsseldatei-Format, <source>You selected a key file in an old format which KeePassXC&lt;br&gt;may stop supporting in the future.&lt;br&gt;&lt;br&gt;Please consider generating a new key file instead.</source>
welches in Zukunft nicht mehr unterstützt werden könnte. <translation>Sie verwenden ein altes Schlüsseldateiformat, das KeePassXC möglicherweise&lt;br&gt;in Zukunft nicht mehr unterstützen wird.&lt;br&gt;&lt;br&gt;Bitte erwägen Sie, eine neue Schlüsseldatei zu erzeugen.</translation>
</message>
Erzeugen Sie eine neue Schlüsseldatei in den Datenbank-Sicherheits-Einstellungen.</translation> <message>
<source>Generate a new key file or choose an existing one to protect your database.</source>
<translation>Erzeugen Sie eine neue Schlüsseldatei oder wählen Sie eine vorhandene aus, um Ihre Datenbank zu schützen.</translation>
</message>
<message>
<source>Note: Do NOT use a file that may change as that will prevent you from unlocking your database.</source>
<translation>Hinweis: Verwenden Sie NICHT eine Datei, die sich ändern kann, da Sie dann Ihre Datenbank nicht mehr freischalten können.</translation>
</message>
<message>
<source>Browse</source>
<translation>Durchsuchen...</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -4867,6 +4878,18 @@ Rechnen Sie mit Fehlern. Diese Version ist nicht für den Produktiveinsatz gedac
<source>{PASSWORD}{ENTER}</source> <source>{PASSWORD}{ENTER}</source>
<translation>{PASSWORT}{ENTER}</translation> <translation>{PASSWORT}{ENTER}</translation>
</message> </message>
<message>
<source>Always on Top</source>
<translation>Immer oben</translation>
</message>
<message>
<source>Hide Usernames</source>
<translation>Benutzernamen ausblenden</translation>
</message>
<message>
<source>Hide Passwords</source>
<translation>Passwörter ausblenden</translation>
</message>
</context> </context>
<context> <context>
<name>ManageDatabase</name> <name>ManageDatabase</name>
@@ -5391,10 +5414,6 @@ Rechnen Sie mit Fehlern. Diese Version ist nicht für den Produktiveinsatz gedac
<source>Hex</source> <source>Hex</source>
<translation>Hex</translation> <translation>Hex</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</source>
<translation>Ausgeschlossene Zeichen: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</translation>
</message>
<message> <message>
<source>Generated password</source> <source>Generated password</source>
<translation>Erzeugtes Passwort</translation> <translation>Erzeugtes Passwort</translation>
@@ -5487,10 +5506,6 @@ Rechnen Sie mit Fehlern. Diese Version ist nicht für den Produktiveinsatz gedac
<source>Ctrl+S</source> <source>Ctrl+S</source>
<translation>Strg+S</translation> <translation>Strg+S</translation>
</message> </message>
<message>
<source>Clear</source>
<translation>Löschen</translation>
</message>
<message> <message>
<source>Regenerate password (%1)</source> <source>Regenerate password (%1)</source>
<translation>Passwort neu erzeugen (%1)</translation> <translation>Passwort neu erzeugen (%1)</translation>
@@ -5499,6 +5514,10 @@ Rechnen Sie mit Fehlern. Diese Version ist nicht für den Produktiveinsatz gedac
<source>Special Characters</source> <source>Special Characters</source>
<translation>Sonderzeichen</translation> <translation>Sonderzeichen</translation>
</message> </message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</source>
<translation>Ausgeschlossene Zeichen: &quot;0&quot;, &quot;O&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;|&quot;, &quot;G&quot;, &quot;6&quot;, &quot;B&quot;, &quot;8&quot;, &quot;&quot;</translation>
</message>
</context> </context>
<context> <context>
<name>QApplication</name> <name>QApplication</name>
@@ -5737,15 +5756,6 @@ Rechnen Sie mit Fehlern. Diese Version ist nicht für den Produktiveinsatz gedac
<source>Perform advanced analysis on the password.</source> <source>Perform advanced analysis on the password.</source>
<translation>Fortgeschrittene Analyse des Passworts ausführen.</translation> <translation>Fortgeschrittene Analyse des Passworts ausführen.</translation>
</message> </message>
<message>
<source>WARNING: You are using a legacy key file format which may become
unsupported in the future.
Please consider generating a new key file.</source>
<translation>WARNUNG: Sie verwenden ein veraltetes Schlüsseldatei-Format, welches in Zukunft möglicherweise nicht mehr unterstützt wird.
Bitte denken Sie darüber nach, eine neue Schlüsseldatei zu erzeugen.</translation>
</message>
<message> <message>
<source> <source>
@@ -6133,10 +6143,6 @@ Verfügbare Kommandos:
<source>%1: (row, col) %2,%3</source> <source>%1: (row, col) %2,%3</source>
<translation>%1: (Zeile, Spalte) %2,%3</translation> <translation>%1: (Zeile, Spalte) %2,%3</translation>
</message> </message>
<message>
<source>Argon2 (KDBX 4 recommended)</source>
<translation>Argon2 (KDBX 4 empfohlen)</translation>
</message>
<message> <message>
<source>AES-KDF (KDBX 4)</source> <source>AES-KDF (KDBX 4)</source>
<translation>AES-KDF (KDBX 4)</translation> <translation>AES-KDF (KDBX 4)</translation>
@@ -6227,10 +6233,6 @@ Verfügbare Kommandos:
<source>read password of the database from stdin</source> <source>read password of the database from stdin</source>
<translation>Passwort der Datenbank von stdin lesen</translation> <translation>Passwort der Datenbank von stdin lesen</translation>
</message> </message>
<message>
<source>Parent window handle</source>
<translation>Eltern-Fenster-Handle</translation>
</message>
<message> <message>
<source>Another instance of KeePassXC is already running.</source> <source>Another instance of KeePassXC is already running.</source>
<translation>Eine andere KeePassXC-Instanz läuft bereits.</translation> <translation>Eine andere KeePassXC-Instanz läuft bereits.</translation>
@@ -6717,10 +6719,6 @@ Kernel: %3 %4</translation>
<source>AES (%1 rounds)</source> <source>AES (%1 rounds)</source>
<translation>AES (%1 Runden)</translation> <translation>AES (%1 Runden)</translation>
</message> </message>
<message>
<source>Argon2 (%1 rounds, %2 KB)</source>
<translation>Argon2 (%1 Runden, %2 KB)</translation>
</message>
<message> <message>
<source>AES 256-bit</source> <source>AES 256-bit</source>
<translation>AES 256-bit</translation> <translation>AES 256-bit</translation>
@@ -6747,6 +6745,68 @@ Kernel: %3 %4</translation>
<comment>seconds</comment> <comment>seconds</comment>
<translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation> <translation><numerusform>%1 s</numerusform><numerusform>%1 s</numerusform></translation>
</message> </message>
<message>
<source>path to a custom local config file</source>
<translation>Pfad zu einer benutzerdefinierten lokalen Konfigurationsdatei</translation>
</message>
<message>
<source>WARNING: You are using an old key file format which KeePassXC may
stop supporting in the future.
Please consider generating a new key file.</source>
<translation>WARNUNG: Sie verwenden ein altes Schlüsseldateiformat, das KeePassXC möglicherweise
in Zukunft nicht mehr unterstützen wird.
Bitte erwägen Sie, eine neue Schlüsseldatei zu erzeugen.</translation>
</message>
<message>
<source>Argon2%1 (%2 rounds, %3 KB)</source>
<translation>Argon2%1 (%2 Runden, %3 KB)</translation>
</message>
<message>
<source>Argon2d (KDBX 4 recommended)</source>
<translation>Argon2d (KDBX 4 empfohlen)</translation>
</message>
<message>
<source>Argon2id (KDBX 4)</source>
<translation>Argon2id (KDBX 4)</translation>
</message>
<message>
<source>TOTP</source>
<translation>TOTP</translation>
</message>
<message>
<source>Icon</source>
<translation>Symbol</translation>
</message>
<message>
<source>Unsupported key file version: %1</source>
<translation>Nicht unterstützte Schlüsseldateiversion: %1</translation>
</message>
<message>
<source>Checksum mismatch! Key file may be corrupt.</source>
<translation>Prüfsumme stimmt nicht überein! Die Schlüsseldatei ist möglicherweise beschädigt.</translation>
</message>
<message>
<source>Unexpected key file data! Key file may be corrupt.</source>
<translation>Unerwartete Schlüsseldateidaten! Die Schlüsseldatei ist möglicherweise beschädigt.</translation>
</message>
<message numerus="yes">
<source>Clearing the clipboard in %1 second(s)</source>
<translation><numerusform>Zwischenablage wird in %1 Sekunde(n) gelöscht...</numerusform><numerusform>Zwischenablage wird in %1 Sekunde(n) gelöscht ...</numerusform></translation>
</message>
<message>
<source>lock all open databases</source>
<translation>alle offenen Datenbanken sperren</translation>
</message>
<message>
<source>Locked databases.</source>
<translation>Gesperrte Datenbanken.</translation>
</message>
<message>
<source>Database failed to lock.</source>
<translation>Datenbank kann nicht gesperrt werden.</translation>
</message>
</context> </context>
<context> <context>
<name>QtIOCompressor</name> <name>QtIOCompressor</name>
@@ -7170,10 +7230,6 @@ Kernel: %3 %4</translation>
<source>Search</source> <source>Search</source>
<translation>Suche</translation> <translation>Suche</translation>
</message> </message>
<message>
<source>Clear</source>
<translation>Löschen</translation>
</message>
<message> <message>
<source>Limit search to selected group</source> <source>Limit search to selected group</source>
<translation>Suche auf ausgewählte Gruppe beschränken</translation> <translation>Suche auf ausgewählte Gruppe beschränken</translation>
@@ -7453,10 +7509,6 @@ Kernel: %3 %4</translation>
<source>Could not write export container</source> <source>Could not write export container</source>
<translation>Export-Container kann nicht gespeichert werden</translation> <translation>Export-Container kann nicht gespeichert werden</translation>
</message> </message>
<message>
<source>Unexpected export error occurred</source>
<translation>Unerwarteter Fehler beim Export</translation>
</message>
</context> </context>
<context> <context>
<name>ShareImport</name> <name>ShareImport</name>
@@ -7524,10 +7576,6 @@ Kernel: %3 %4</translation>
<source>File does not exist</source> <source>File does not exist</source>
<translation>Datei existiert nicht</translation> <translation>Datei existiert nicht</translation>
</message> </message>
<message>
<source>Unknown share container type</source>
<translation>Unbekannter geteilter Containertyp</translation>
</message>
</context> </context>
<context> <context>
<name>ShareObserver</name> <name>ShareObserver</name>

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More