Compare commits

..

439 Commits

Author SHA1 Message Date
Jonathan White
b342be4571 Update translations 2025-03-02 17:31:21 -05:00
Jonathan White
8aec6fb9ad Version bump and Changelog 2025-03-02 10:13:21 -05:00
Jonathan White
55d75fbd53 Add ability to parse tags from CSV files
* Closes #7956
2025-03-01 17:14:51 -05:00
Jonathan White
4f552ba3ed Fix various quirks with CSV import widget and parser
* Fixes #11502 - correct improper handling of text qualifiers

* Improve layout of csv import widget
* Hide error messages when trying to import again
2025-03-01 17:14:44 -05:00
w15dev
9b1ee4b476 Enhance image attachment handling by caching loaded images and improving scaling logic 2025-02-23 17:20:54 -05:00
An-anonymous-coder
c3e32a9502 Removed newline and words with hyphen (#11409)
The newline at the end of the file was removed, as well as 4 words that contain a hyphen:
drop-in
felt-tip
t-shirt
yo-yo
2025-02-23 16:19:21 -05:00
Adrian Martin
ea2f17b9a9 Feature: HTML export from CLI tool (#11590)
This commit introduces support for exporting a KeePassXC database in
HTML format via the CLI tool. The key changes include:
- Refactoring HtmlExporter:
  - Moved HtmlExporter to the format directory and made its API
    compatible with CsvExporter.
  - Since the original HtmlExporter had a direct dependency on the
    gui/Icons functions and indirect dependencies on the
    gui/DatabaseIcons class, only the non-GUI parts were moved to
    format/HtmlExporter.
  - All icon-related functionality was encapsulated in a new child
    class, gui/HtmlGuiExporter.
    - The gui/HtmlGuiExporter retains the original functionality of the
      HtmlExporter class.
    - The format/HtmlExporter now generates HTML export without icons.
      Adding icon support to format/HtmlExporter would require moving
      icon management logic to the core, which could have broader
      implications.
- CLI integration:
  - Updated cli/Export to use format/HtmlExporter.
- GUI Integration:
  - Updated gui/export/ExportDialog to use gui/HtmlGuiExporter.
- Build System Updates:
  - Updated CMakeLists.txt to build HtmlExporter as part of core_SOURCES
    and HtmlGuiExporter as part of gui_SOURCES.
- Testing:
  - Updated TestCli to automatically verify the output of the HTML
    export.

Signed-off-by: AdriandMartin <adriandmartin@protonmail.com>
2025-02-23 16:19:13 -05:00
xboxones1
3d8dac0c53 Dynamically change the status bar color depending on the current screen (#11672)
* Revert (https://github.com/keepassxreboot/keepassxc/pull/11455)
* Do not use styles for QStatusBar
* Dynamically change the status bar color depending on the current screen
2025-02-23 16:19:07 -05:00
Jonathan White
beb314d7c7 Support tearing off tags menu (#11652)
* Support tearing off tags menu
* Closes #11649 - tags menu can be torn off to set and unset tags without having to dive into the context menu every time.
* Tags menu will hide when database is locked or view is switched away from the main database view (eg, settings)
2025-02-22 20:45:24 -05:00
Jonathan White
903b8f189e Improve browser notice about snap/flatpak support 2025-02-22 20:45:19 -05:00
Jonathan White
941c1f5d7f Major enhancements to documentation
* Closes #11467 - Describe default search fields
* Closes #11468 - Fix lock database shortcut
* Closes #8259 - Add a note about 1Password OPVault specifics
* Closes #9794 - Add section anchors for easy linking
* Closes #10316 - Show how to setup managed Edge on macOS
* Closes #7805 - Document entry url handling
* Closes #9143 - Document database merge behavior
* Closes #10876 - Correct wording in browser and passkey sections

Update outdated images of the user interface. Improve wording and flow of entire documentation. Fill in missing pieces based on user feedback.

Add mention about URL wildcards
2025-02-22 20:45:08 -05:00
Jonathan White
f0c5c2ad3f Update fuzz testing instructions
* Also fix env var name
2025-02-22 19:38:32 -05:00
Jonathan White
43205995c6 Remove remote database code
This should not have been backported to 2.7.x branch
2025-02-22 12:56:00 -05:00
Jonathan White
bb4c957144 Always reset Auto-Type state on finished signal
There were a couple code paths that did not reset the state appropriately and could cause undefined behavior in the auto-type processing.
2025-02-22 08:23:31 -05:00
Jonathan White
4034c68e67 Show Auto-Type select dialog even if window title is empty
* Fixes #11597

Add Tools::asSet
2025-02-22 08:23:31 -05:00
Jonathan White
089d0ca2b7 Prevent AltGr showing the menubar on Windows
* Fixes #11549
2025-02-22 07:41:49 -05:00
varjolintu
6197893e01 Prevent using URL wildcards in TLD 2025-02-22 07:41:34 -05:00
Jonathan White
8d1898bd0b Fix build on macOS 2025-02-10 19:39:28 -05:00
Jonathan White
3af68b1d3f Add support for URL wildcards and exact URL (#9835)
* Add support for URL wildcards with Additional URL feature

* Only check TLD if wildcard is used

* Avoid using network function in no-feature build

---------

Co-authored-by: varjolintu <sami.vanttinen@ahmala.org>
Co-authored-by: Jonathan White <support@dmapps.us>
2025-02-10 19:32:27 -05:00
Jonathan White
3b2f54daff Show database public icon on tab when visible (#11725)
* Show database public icon on tab when visible

* Remove unnecessary assert
2025-02-10 19:18:11 -05:00
outfoxxed
3083626bda Add --minimized CLI option 2025-02-10 19:17:54 -05:00
Jonathan White
5ad6562578 Refactor Database Settings (#9485)
Includes following changes:

* Encryption Settings now has a similar key with the new database wizard for switching between Advanced and Simple Settings
* The extra UI layer DatabaseSettingsDialog.ui has been removed. DatabaseSettingsDialog class now inherits EditWidget instead of DialogyWidget (just like Application Settings).
* Extra classes for separate page settings (DatabaseSettingsPageFdoSecrets, DatabaseSettingsPageKeeShare) have been removed. Instead the widgets are used directly in DatabaseSettingsDialog. Same could be done later to Application

---------

Co-authored-by: Jonathan White <support@dmapps.us>
2025-02-10 19:16:31 -05:00
Jonathan White
14ee702b09 Backport code to read database public headers
This is required to show the public icon, color, and name of a locked database
2025-02-02 10:14:52 -05:00
Jonathan White
f48dcb3dba Implement function to clear all ssh-agent identities (#10649)
Fixes #8346

---------

Co-authored-by: Jonathan White <support@dmapps.us>
2025-02-02 09:47:00 -05:00
Marco Langer
1a11a55a42 Fix sorting of advanced attribute list (#10091)
Sort advanced attribute list using locale aware sort.

Fixes #6175
2025-02-02 09:43:09 -05:00
Jonathan White
57235219f2 Fix issues with reloading and handling of externally modified db file (#10612)
Fixes #5290
Fixes #9062
Fixes #8545

* Fix data loss on failed reload

- External modifications to the db file can no longer be missed.
- Fixed dialogFinished signal of DatabaseOpenDialog was not emitted when dialog was closed via the 'X' (close) button
- For reloading with a modified db, an additional choice has been added to allow the user to ignore the changes in the file on disk.
- User is now presented with an unlock database dialog if reload fails to open the db automatically. For example when the user removed the YubiKey, failed to touch the YubiKey within the timeout period, or db pw has been changed.
- Mark db as modified when db file is gone or invalid.
- Prevent saving when db is being reloaded
- If merge is triggered by a save action, continue on with the save action after the user makes their choice

---------

Co-authored-by: vuurvlieg <vuurvli3g@protonmail.com>
Co-authored-by: Jonathan White <support@dmapps.us>
2025-02-02 09:43:02 -05:00
w15dev
0b32cf348d Refactor YubiKey key to avoid deadlock
- Add mutex to get m_connectedKeys
- Fix deadlock when the app uses Quick Unlock and the YubiKey is unplugged
2025-02-02 09:33:24 -05:00
Kuznetsov Oleg
c3214f6776 Improve attachment handling when changes are discarded
This change avoids a situation where the open file has changed or an entry in the application has changed (possibly to be implemented in the future) and when you open that entry the editor shows you outdated data.

* Fixes bug from previous attachments preview commit
* Fix logic error when creating new attachment
2025-02-02 09:31:25 -05:00
Jonathan White
4e40a7fd79 Allow adjusting application font size
* Closes #6822
* Fix fixed font not following default font's point size
2025-02-02 09:27:11 -05:00
Jonathan White
d655d18a79 Trim file path settings fields prior to save
* Fixes #11630
2025-02-02 09:15:29 -05:00
Felix Nüsse
2c76a370c2 make tag-suggestions case insensitive 2025-02-02 09:15:22 -05:00
xavives
6cc6e42542 Add Group Path column choice in entry view
* Closes #9574
2025-01-19 09:35:04 -05:00
Felix Nüsse
e82e9dad3b Show Row-Backgroundcolor in a column
Fixes #6553

Allow users to choose to show the entry background color as a column instead of changing the background of the entire row.
2025-01-19 09:32:12 -05:00
Martin van Zijl
4df16fa501 Remember sort order in Autotype popup dialog
Fixes #1684.
2025-01-19 09:30:10 -05:00
sewe2000
048f4c45b3 Fix displaying html characters in message boxes 2025-01-19 09:30:06 -05:00
Blessio
0cb89a03ec Add alternative path finding for PCSC headers/libraries
* When running the build outside of a visual studio environment, PCSC libraries may not be discoverable. This change explicitly adds Windows SDK's to the search path.
2025-01-19 09:30:01 -05:00
Jonathan White
fbad1b51f0 Add ability to expire entries from context menus (#8731)
Closes #1972

Add ability to immediately expire an entry from the context menu

---------
Co-authored-by: Jonathan White <support@dmapps.us>
2025-01-19 09:29:47 -05:00
varjolintu
abf5a2ef8b Fix setting window title as modified 2025-01-19 09:28:42 -05:00
Kuznetsov Oleg
99c8936568 Add New/Preview Entry Attachments dialog and functionality (#11637)
Closes #11506
Closes #3383

* This change adds a new opportunity to add attachments that don’t require a real file in the file system.
* Add a new dialog window to add and preview attachments and integrate it into the EntryAttachmentsWidget.
* Attachment preview support for images and plain text files.

Additional enhancements:
* Fix sizing of attachment columns
* Add padding to attachment table items
* Fix targeting of preview widget styling to not impact unintended children
2025-01-19 09:28:36 -05:00
Jonathan White
ef2b5e7c26 Fix crash when pressing home key on empty tags field
* Fixes #11344
2025-01-19 09:28:30 -05:00
Jonathan White
09e47d3731 Fix rendering &amp; and &quot; in preview panel
* Set plain text mode on elements that should never have styling
* Revert html escaping as a prior fix
2025-01-19 09:28:23 -05:00
Jonathan White
f14c256b44 Implement Secure Input Field mode on macOS
* Fixes #4738
* Also fixes flaky handling of caps lock detection events
2025-01-19 09:25:56 -05:00
Jonathan White
080e315a09 Add Proton Pass importer
* Closes #10465
2025-01-03 18:30:24 -05:00
Kuznetsov Oleg
8a3de7334b Show a clear error if no slots on hardware key(s) are configured (#11609)
Fixes #11543

Also fix delayed polling on window activation

---------

Co-authored-by: w15dev <w15developer@proton.me>
Co-authored-by: Jonathan White <support@dmapps.us>
2025-01-03 18:20:11 -05:00
xboxones1
8b24e48fde Minor style fixes (#11445)
* Clean up removed elements in qt stylesheets
* Disable main window when saving
* Fixed triangle size in group view

---------

Co-authored-by: Jonathan White <support@dmapps.us>
2025-01-03 18:20:00 -05:00
Jonathan White
bb6950433d Fix passphrase word lists not rendering with UTF-8
* Fixes #11599
2025-01-03 18:19:54 -05:00
Stephan Heffner
12b2360855 Passphrase "MIXED case" Type (#11255)
* An additional approach to create passphrases with one random word being in UPPERCASE.
* Also remove duplicate character count from passphrase generator

---------

Co-authored-by: Stephan Heffner <stephan@heffner.it>
Co-authored-by: Jonathan White <support@dmapps.us>
2025-01-03 18:19:48 -05:00
Jonathan White
2364e4cd4a Fix renaming extension key name in Database Settings 2025-01-03 18:17:07 -05:00
Jonathan White
84b064b743 Add copy shortcuts to Auto-Type select dialog
* Fixes #10213
* Sets copy password/username/totp to Ctrl+Shift+1/2/3 respectively
2025-01-03 18:02:20 -05:00
Jonathan White
c5e1fbfafc Additional exclusion fields for Windows Clipboard
* Fixes #7127
2025-01-03 18:00:07 -05:00
Jonathan White
998569234d Fix entry preview rendering HTML
* Fixes #11538 - prevent rendering HTML in Title, Password, and URL fields in the entry preview pane.
2025-01-03 17:59:57 -05:00
xboxones1
98e671fdc6 DarkTheme: Fix color for handles 2024-12-21 23:43:30 -05:00
Jonathan White
ecf2e2da5a CLI: Restore the original codepage on windows
* Fixes #11465
2024-12-21 23:43:14 -05:00
Jonathan White
ca68031795 Fix crash on Linux when database is closed without hardware key present
* Fixes #11450
2024-12-21 23:43:07 -05:00
Jonathan White
789f91ba39 Fix crash when multiple dbus unlock calls are issued
* Fixes #11512
2024-12-21 23:42:55 -05:00
xboxones1
b85675f4a7 DarkTheme: Fix separator color for TagView (#11511) 2024-12-21 23:42:45 -05:00
Jonathan White
e210faa097 Detect outdated VC Redist with MSI Installer
* Fixes #10974
2024-12-21 23:42:27 -05:00
Jonathan White
be862b7a07 Use better xref syntax for documentation 2024-12-21 23:42:19 -05:00
Jonathan White
241155e64d Implement T-CONV and T-REPLACE-RX entry placeholders
* Closes #7293
* Move existing T-CONV and T-REPLACE-RX code from AutoType to Entry. Replumb AutoType to use the entry functions.
* Improve placeholder code in various place
2024-12-21 23:41:46 -05:00
xboxones1
18cdbb3f5a Hide status bar on WelcomeScreen 2024-12-21 23:40:06 -05:00
Sami Vänttinen
da606923e9 Browser: Fix cancel with database unlock dialog (#11435) 2024-12-21 23:39:58 -05:00
Jonathan White
9348ecdc27 Replace legacy code on macOS builds (#11428)
* Fix macOS build error due to CGDisplayStreamCreate being deprecated.

---------

Co-authored-by: FischLu <randomDe@proton.me>
2024-12-21 23:29:00 -05:00
Jonathan White
1e6486ae17 Add timeout to SSH Agent streams
* Fixes #11128
2024-12-21 23:27:55 -05:00
xboxones1
bd4bdc6a3f Fixed background color when window is out of focus 2024-12-21 23:27:34 -05:00
Jonathan White
2836364e1a Fix assert hit when viewing entry history
* Fixes #11371
* Adds test for showing entry history
* Improved page switching capabilities for entry edit widget
2024-12-21 23:27:18 -05:00
Jonathan White
c6800bf705 Hide the menubar when menus lose focus (if toggled off)
* Fixes #10768
* Also fix menubar toggling not working if Qt version is less than 5.15
2024-12-21 23:26:49 -05:00
Jonathan White
1df561ee07 Fix resolving advanced values in entry preview
* Fixes #10961
* Fixes #7410 - show content of references when previewing notes
2024-12-21 23:25:58 -05:00
Jonathan White
c12b0c5568 Improve related splitter UX
* Prevent group pane from being hidden just by dragging. Introduce new View menu setting to hide the group pane.
* Replace the preview panel "close" icon with a "collapse down" icon making the intention clearer.
* Better organize the view menu
2024-12-21 23:25:45 -05:00
Jonathan White
6f42041837 Reset splitter sizes on database unlock
* Attempt to avoid issue with splitters not being appropriately calculated because the main window isn't sized yet. This can happen if the main window is hidden when the database is loaded and the splitter sizes are not recorded in the config file.
2024-12-21 23:25:29 -05:00
Sami Vänttinen
383c6d05d1 Support passkeys with Bitwarden import (#11401) 2024-12-21 23:25:15 -05:00
vallode
b68775e9d8 Fix MacOS login items showing ambigious name (#11373) 2024-12-21 23:24:50 -05:00
Jonathan White
7de453b838 Avoid hitting assert on XML export
* Fixes #11365
2024-12-21 23:24:41 -05:00
Jonathan White
ae28ff6833 Fix entry notes reveal button requiring two clicks sometimes 2024-12-21 23:24:18 -05:00
xboxones1
70c024f7f5 Dark theme fix colors for qmenu 2024-10-12 07:45:46 -04:00
Jonathan White
06699c6692 Add option to disable opening a browser window when double-clicking the "URL" column (#11332) 2024-10-12 07:45:39 -04:00
Jonathan White
0731a64957 Add database name, color, and icon options for unlock view (#10819)
Closes #10783

Adds three database configuration options (stored as public custom data) that allow a database to have a public name/summary, color, and/or icon to be displayed on the unlock screen. This information is configured in the Database Settings and stored in the database public custom data (ie, unencrypted).

The name/summary is stored in KPXC_PUBLIC_NAME, the color is stored in KPXC_PUBLIC_COLOR, and the icon is stored in KPXC_PUBLIC_ICON.

---------

Co-authored-by: Jonathan White <support@dmapps.us>
2024-10-07 23:47:40 -04:00
Jonathan White
36ec1aa35b Prevent multiple lock requests on Linux
* Fixes #11000

When the screen locks on e.g. gnome we receive multiple independent signals of that, namely the Gnome session manager and the gnome / freedesktop screensaver.

When this happens, this causes multiple "lock database" requests to be issued. The first one correctly shows the question to discard/cancel, but the second one while the first is still asking goes and dismisses the question and then goes to ask it again. The result is it acts like you didn't answer correctly (ie, to cancel) and the database is locked.
2024-10-07 18:07:28 -04:00
Jonathan White
53bbc4717e Fix horizontal scrollbar not showing in group view
* Fixes #11300
2024-10-07 18:07:22 -04:00
Jonathan White
3c26709da9 Overhaul action states and add icons to toolbar
* Fixes #10981
2024-10-07 18:07:15 -04:00
Jonathan White
413eec9b8c Add Import/Export to application settings
* Closes #9452 - add import/export buttons to application settings

* Fixes #11120 - duplicate both menubar and toolbar visibility settings into the application settings

* Fixes #8561 - improve placement of various settings between General and Security pages

* Improve tool tip for backup database setting
* Improve wording of various settings
2024-10-07 17:49:58 -04:00
Jonathan White
94eb3ffa7a Minor UI fixes
* Fixes #11044 - password generator excluded characters tooltip was incorrect

* Fixes #11084 - allow more than 30 days for showing expiring passwords. Also fix the ability to properly translate this control.

* Fixes #11212 - don't show password on creating new database

* Fixes #10726 - improve indication of hardware key polling. Also improve layout spacing of unlock dialog.

* Fixes #11142 - provide better link for challenge-response information
2024-10-07 17:48:53 -04:00
Jonathan White
673bdbcf3c Fix detection regex for yubikey on Windows
Something changed in the behavior of regex in Qt that prevents matches using a begin line caret without a complementary end line.
2024-10-07 17:48:19 -04:00
Jonathan White
b671070c0d Handle alternative 1Pux password entry
* Fixes #11298
2024-10-07 17:48:07 -04:00
Jonathan White
aeee40048c Add support for group selection when creating a passkey 2024-10-07 17:45:34 -04:00
Jonathan White
518947e3aa Fix typo in powershell release tool 2024-09-13 23:22:30 -04:00
Jonathan White
defb5f027d Support KeePass2 TOTP settings
* Fixes #7263
* Also improves handling of custom TOTP settings
2024-09-13 22:48:57 -04:00
varjolintu
292046ff7f Allow deleting extension plugin data from Browser Statistics 2024-09-13 22:48:51 -04:00
Sami Vänttinen
5a3bde7676 Document Custom Browser option (#11220) 2024-09-13 22:48:45 -04:00
Jonathan White
05167e7b21 Fix signal/slot disconnect when opening import wizard
* Fixes #11037
2024-09-13 22:48:31 -04:00
Jonathan White
ad9ef88e15 Prevent duplicate entries in passphrase wordlists
Replace a QVector for the wordlist with a QSet. This removes all duplicate entries in a given wordlist.
Thus, it hinders a malicious wordlist that has the proper length (>4000 entries) but with repetitions (effectively << 4000 entries) to be used and potentially create weaker passphrases than estimated.

Example:
List with 4000 items but only 64 unique words would lead to only 48 bit of Entropy instead of ~95 bit!
2024-09-13 22:48:16 -04:00
AMurkin
0ae88131f6 Fix unexpected additional resolved urls in testIconDownloader 2024-09-13 22:47:18 -04:00
Jonathan White
0e59f2745e CLI: Add -d dry-run shortcut to merge command
* Fixes #11191
2024-09-13 22:46:25 -04:00
Jonathan White
78cff4b6d9 Fix copy-to-clipboard shortcut on macOS
It turns out that the previous implementation, based on installing an event filter in every QAction instance, does not work on macOS, likely due to a Qt bug.

Attempt to work around this by using a different implementation of the same idea, by reacting to ShortcutOverride events in the MainWindow object.

Fixes #10929.
2024-08-13 22:49:16 -04:00
Felix Nüsse
8bdbccf13f Use Icons for password strength (#9844)
---------

Co-authored-by: Jonathan White <support@dmapps.us>
2024-08-13 22:48:59 -04:00
Jonathan White
4317e9d829 Prevent long-running threads from deadlocking the program with only 1 CPU
* Fixes #10391
2024-08-13 22:48:59 -04:00
Sami Vänttinen
e565f89d47 Add option to disable database lock when switching user on macOS (#9707) 2024-08-13 22:37:30 -04:00
varjolintu
41de1dff2d Browser: Resolve references in Access Confirm dialog 2024-08-13 22:35:34 -04:00
Jonathan White
3d66618818 Refactor browser Access Control Dialog (#9607) 2024-08-13 22:35:16 -04:00
Christoph Honal
12cd224f42 Hardware keys: Fix PCSC daemon recovery on Linux 2024-08-13 22:31:41 -04:00
Andreas Deininger
2b5ab7db82 Bump GitHub workflow actions 2024-08-13 21:39:13 -04:00
Jonathan White
3e90f1b4d8 Fix code formatting with new clang-format version 2024-08-13 21:38:37 -04:00
StoyanDimitrov
8599f0903c Fix typos in tooltips from EditEntryWidgetBrowser.ui 2024-07-02 06:53:13 -04:00
Carlo Teubner
182bcd4ef7 Database key settings: fix UI bug
Fix a bug in the database key settings dialog, where it was previously
always incorrectly applying an empty password if the password was not
changed but some other change was made (e.g. adding or removing a key
file).
2024-06-30 22:24:10 -04:00
Varij Kapil
8dd2377765 Docs: explain how to generate passwords with the browser extension (#9242)
---------

Co-authored-by: Jonathan White <support@dmapps.us>
2024-06-30 22:24:04 -04:00
Peter Mescalchin
bfa64aa8f0 Update URLs to Chrome Web Store page for KeePassXC-Browser extension 2024-06-30 22:23:56 -04:00
Sami Vänttinen
d883ca26a9 Update browser extension icon states in documentation (#10875) 2024-06-30 22:23:50 -04:00
xboxones1
249e71fe88 Fix сentering icon and text on buttons 2024-06-30 22:23:43 -04:00
Carlo Teubner
ed31da0021 Fix backup file path substitution
Previously, in a pattern like "{TIME:yy} {TIME}",
substituteBackupFilePath() would greedily use the entire string
"yy} {TIME" as the format specifier for the first TIME template, instead
of just "yy". Fix this, by adjusting the regular expression.

This ends up changing the behaviour of a weird corner case that is
covered in the tests, so change the test. I don't think anyone cares
about that case, and I think the current behaviour is better there.

Fixes #10505 (proved by adding a test case very similar to what was
reported there).
2024-06-30 22:23:33 -04:00
Rafael Sadowski
59bd71ddca Verify USB listener callback handle
Do not use `handle` if `libusb_hotplug_register_callback` fails
2024-06-30 22:23:27 -04:00
Carlo Teubner
29feb5da79 Passkey importer: fix file picker parent
When selecting "Database → Import Passkey", we show a file picker.
Previously, we did not specify a parent widget for it. This could have
undesirable effects on its presentation. (For example, with the Sway
tiling Wayland compositor, it would show the file picker as a tiled
window rather than a floating one.)

Fix the issue by passing in the parent widget. This is also in line with
all other usages of FileDialog::getOpenFileName() in this project.
2024-06-30 22:23:18 -04:00
Jonathan White
ff89a05743 Show character count in password generator dialog (#10940)
Displays the number of characters in the password field in the password generator dialog. This fixes #10858.
2024-06-30 22:22:59 -04:00
varjolintu
fe7f1e0a51 Passkeys: Fix showing correct username in the reports 2024-06-30 22:10:07 -04:00
Michal Suchanek
a0b8abecb8 Increase the time interval for window show workaround
When the keepassxc window is shown something generetes a hide event, and it is hidden again immediately.

The 50ms interval for avoiding hiding the window when shown is not enough, even on modern systems.

Make the interval longer.
2024-06-30 22:09:21 -04:00
James Carroll
1de0da3d44 Snap: Remove $HOME access from keepassxc-proxy 2024-06-30 22:09:15 -04:00
Jonathan White
8f6dd13b0a Update translations 2024-06-19 17:32:55 -04:00
Jonathan White
809fb0d457 Version Bump to 2.7.9 2024-06-19 17:26:36 -04:00
Guido Falsi
3ab7166e63 Correct libusb usage on FreeBSD (#10736)
Change type of Handle on FreeBSD. On FreeBSD the libusb_hotplug_register_callback() function uses a pointer to a struct as a handle.

---------

Co-authored-by: Janek Bevendorff <janek@keepassxc.org>
2024-06-19 17:12:40 -04:00
James Carroll
ee08ef421d Snap: Improve Web-browser Native Messaging host functionality (#10906)
* Snap: Improve Web-browser Native Messaging host functionality

This commit allows for the snap distribution of KeepassXC to self-manage native messaging manifests
This is done by making the binary aware of the snapd environment changes that currently prevent this.
Furthermore, the snap sandbox is expanded to the bare minimum needed to access these privileged files.

Please note if running a self-compiled / untrusted KeepassXC snap build (I.E, installed with --dangerous)
that you must manually run `sudo snap connect keepassxc:browser-native-messaging` to grant permissions.

This will work on all distributions that expose `/snap/bin/` - such as Ubuntu, Debian, etc.
For systems which don't provide `/snap/`, such as Fedora, follow instructions for enabling "Classic" snaps.
e.g., `sudo ln -s /var/lib/snapd/snap /snap`

---------

Co-authored-by: Jonathan White <support@dmapps.us>
2024-06-19 15:50:52 -04:00
Jonathan White
48bf993ac5 Fix Copy Password button when text is selected
When the user chooses to copy the password for an entry to the clipboard, previously there was logic to check if text was selected, and if so, that text was instead copied to the clipboard. That made sense if
(a) the user invoked the Copy Password action via its keyboard shortcut, and (b) that keyboard shortcut was configured (as per default) to be Ctrl-C, i.e. the same as the system action for copy-to-clipboard.

However, it made no sense if the user invoked that action in some other way, for example by clicking the corresponding toolbar button.

It also made no sense in the case that the Copy Password action had some other keyboard shortcut assigned. Also, if some other action had Ctrl-C assigned, the logic would not kick in then.

Fix all of the above by modifying the keyboard shortcut logic to intervene precisely in the case where a shortcut is pressed that matches the system copy-to-clipboard shortcut; only in that case do we now check if text is selected and if so copy that to the clipboard instead of the action we would otherwise take.

Fixes #10734.
2024-06-19 15:50:52 -04:00
Carlo Teubner
b7e6679a58 Search entry: respect shortcut config on Copy key
If the system Copy key sequence (i.e. Ctrl+C or Cmd+C) is pressed while
inside the search entry without any text being selected, previously we
would copy the currently selected entry's password. This made sense when
keyboard shortcuts were fixed. Now that they are configurable, change it
to re-route the event to the main window, which can then take the
appropriate action (i.e. Ctrl+C might be bound to some other action).
2024-06-16 17:39:09 -04:00
Carlo Teubner
071145dd19 App settings: fix widget tab order
Fixes #9765.
2024-06-16 17:20:27 -04:00
Carlo Teubner
22811471ac Improve Entry placeholder resolution (#10846)
* Entry placeholder resolution: don't overdo it

After resolving placeholders, previously the code would do it all over again if anything had changed, multiple times up to the recursion limit. This would have the effect of applying a much greater recursion limit, which is confusing and unnecessary, and probably undesired.

* Entry tweaks and minor refactoring

- Entry::size(): when computing tag size, use same delimiter set as in other places in the code
- Factor tag delimiter set regex out into global constant
- Placeholder resolution: remove unnecessary special casing for self-referential placeholders (these are taken care of by existing recursion depth limit)
- Placeholder resolution: less wasteful string building loop
- Move some constants from being public static data members of Entry to being local to Entry.cpp (in anonymous namespace)
- Migrate some QRegEx instances to QRegularExpression, the modern alternative
- Miscellanous minor code cleanups

* Entry: fix hitting recursion limit with {braces}

When encountering a {brace-enclosed} substring, the placeholder resolution logic would previously keep recursing until it hit the recursion depth limit (currently 10). This would lead to "Maximum depth of replacement has been reached" messages, and was also wasting CPU cycles.

Fixes #1741

---------

Co-authored-by: Jonathan White <support@dmapps.us>
2024-06-16 17:20:16 -04:00
Jonathan White
ed3f7f5a16 Improve overall database settings behavior
* Fixes #10723 - only display password strength warning when actively editing the password
* Also improve behavior of minimum quality warning
* Improve behavior and handling of password changes with the database settings dialog
* Prevents loss of newly entered password when toggling between elements in the settings page
* On error, switch to tab that prevents saving database settings for easier correction
2024-06-16 17:19:57 -04:00
Jonathan White
f83cd81ad7 Fix encryption settings behavior
* Fixes #10558
2024-06-16 17:13:11 -04:00
Jonathan White
c3259b2610 Improve CSV import when title field isn't specified
* Fixes #10433
2024-06-16 17:11:33 -04:00
Jonathan White
54afbe6a2f Improve handling of clipboard actions
* Fix #10804
2024-06-16 17:11:21 -04:00
Jonathan White
0aba77ee55 Improve handling of encrypted Bitwarden json
* Fixes #10785
2024-06-16 17:11:13 -04:00
Jonathan White
cf023253a0 Fix password clear timer inconsistency
* Fixes #10695
2024-06-16 17:11:01 -04:00
Jonathan White
c464f2bfe9 Prevent checking file hash with an empty path
A warning is issued from Qt when the path is empty. This happens most often during test runs, but can also occur when closing a database before everything gets cleaned up.
2024-06-16 17:10:53 -04:00
Carlo Teubner
f19d254a0c TestGui: testTotp: use QTRY_COMPARE
That test failed, presumably because of inherent raciness: https://ci.keepassxc.org/buildConfiguration/KeePassXC_MacOS/248424?expandBuildDeploymentsSection=false&hideTestsFromDependencies=false&hideProblemsFromDependencies=false&expandBuildChangesSection=true&expandBuildProblemsSection=true&showLog=248423_1081_942&logFilter=debug&logView=flowAware

Paper over the raciness by using QTRY_COMPARE instead of QCOMPARE.
2024-06-16 17:10:32 -04:00
varjolintu
e7f9d58541 Passkeys: Fix incorrect username fill 2024-06-16 17:10:17 -04:00
Kevin J
8cbbe7cdfc Fix sidebar resize behaviour (#10641)
* Fix database view splitters resize behaviour
* Set default ratio sizes for first-run based on the size of the database widget itself
* Fix setting splitter sizes before database widget has had a chance to render for the first time
* Disallow collapsing the entry view (source of several bug reports)

Fixes: #10613

---------

Co-authored-by: Jonathan White <support@dmapps.us>
2024-06-16 17:10:06 -04:00
varjolintu
8bdc7c4702 Passkeys: Return authenticatorData and publicKeyAlgorithm to extension 2024-06-16 17:10:00 -04:00
Carlo Teubner
018686afeb Cleanup compiler warnings on all platforms (#10847)
Fixes #10730.

Co-authored-by: Christoph Reiter <reiter.christoph@gmail.com>
2024-06-16 17:09:48 -04:00
Carlo Teubner
abcff25e57 Fix passphrase generator test (#10890)
* Fix passphrase generator test

Previously, the test case was assuming the wrong regex. In particular, the default word list (eff_large.wordlist) contains several words that contain dashes. Adjust the regex used in the test to reflect this. This should fix rare test failures
2024-06-16 17:09:34 -04:00
Alexander Wilms
64eb3d0c82 Add keywords to .desktop file
Taken from Github topics
2024-06-16 17:09:16 -04:00
Carlo Teubner
e26dbc5608 Botan: don't call deprecated functions (#10826)
* Botan: use raw_private_key_bits() if available

Botan 3.x introduces raw_private_key_bits() as an alias for
get_private_key(), and deprecates the latter.

* Botan: use Cipher_Dir::Encryption

Botan 3.x introduces Cipher_Dir::Encryption as an alias for
Cipher_Dir::ENCRYPTION, and deprecates the latter. Likewise for
Decryption/DECRYPTION.
2024-06-02 07:38:50 -04:00
Steve Mokris
42a2443d62 Restore macOS monospace font size prior to #10282 2024-06-02 07:38:10 -04:00
Jonathan White
6fbab25478 Add action item for removing a passkey from entry (#10777) 2024-06-02 07:38:03 -04:00
Jonathan White
2f43ca42be Fix broken build when using system zxcvbn (#10717)
* Fix broken build when using system zxcvbn

Fixup of zxcvbn include statement added in 5513ff5. A zxcvbn/ directory
prefix breaks building with system zxcvbn. Remove this prefix to align
this include statement with ones present in other files. Add zxcvbn
libraries as dependency to CliTest.

* Move src/zxcvbn/ to src/thirdparty/zxcvbn
2024-06-02 07:37:34 -04:00
Frans-Willem Post
95b91a0890 Prevent HTML overflow, fix issue #10647 2024-06-02 07:35:56 -04:00
Jonathan White
6f77d98642 Fix Flatpak config issues
Remove #ifdef guards from Config.h/cpp (no harm to non-Flatpak distros)

Cleanup #ifdef usage in NixUtils.cpp
2024-06-02 07:35:39 -04:00
Jonathan White
1b3abf8ab0 Fix SSH Agent broken decrypt button (#10638)
* SSH Agent: Fix broken decrypt button (Fixes #10637)

---------

Co-authored-by: Jonathan White <support@dmapps.us>
2024-06-02 07:35:25 -04:00
Jonathan White
1bdf1bbbed Fix portable mode detection for native messaging files
* Fixes #10755
2024-06-02 07:34:29 -04:00
Jonathan White
1125a02d1e Fix Alt modifier on Windows Auto-Type
* Fixes #10791
2024-06-02 07:33:24 -04:00
Mounir IDRASSI
6e362ee637 Fix wrong DACL memory size on Windows (createWindowsDACL) (#10712)
Each AddAccessAllowedAce invocation should be matched with a corresponding sizeof(ACCESS_ALLOWED_ACE) and the respective GetLengthSid of the SID being used. This ensures that there is enough space in the ACL for each entry.

The issue manifest itself only when WITH_XC_SSHAGENT is defined.
2024-06-02 07:33:18 -04:00
Stefan Forstenlechner
388b4a736a Improve build time with MSVC
`/MP` = Build with multiple processes

see https://learn.microsoft.com/en-us/cpp/build/reference/mp-build-with-multiple-processes?view=msvc-170
2024-06-02 07:33:06 -04:00
Jonathan White
87bf232e97 Update README 2024-05-06 20:55:27 -04:00
Jonathan White
f6757d35ad Update translations 2024-05-05 16:40:29 -04:00
Jonathan White
235015cb56 Bump version to 2.7.8 2024-05-05 16:33:56 -04:00
Jonathan White
75de62327d Fix issues with Hardware Key auto detection
* Fix #10656 - Add a small delay when before auto-polling hardware keys to all them to settle immediately after plugging in. This resolves an issue where the key's serial number could not be resolved due to hardware timeout.
* Also fix use of uninitialized variable if polling serial number fails for whatever reason.

* Fix typo in macOS key registration code

* Prevent registering duplicate listeners on window focus. These were not de-registered because we didn't trigger on unfocus. Show/Hide are sufficient triggers to add and remove listeners.
2024-05-05 16:33:23 -04:00
Jonathan White
8f98d390e3 Keep key file text when provided on command line
* Fixes #10552
2024-05-05 16:26:54 -04:00
Jonathan White
c9d71e7781 Passkeys: Register to an existing entry 2024-05-05 16:07:00 -04:00
Jonathan White
505f338d28 Fix issues with locking database
* Fix #6593 - force close any modal dialogs associated with a database widget that is being locked.

* Partial fix for #721 but doesn't address the problem of needing to save a modified entry or database while locking.

* Also improves import dialog behavior if databases(s) lock while it is visible.
2024-05-05 16:04:14 -04:00
Jonathan White
ffc72c896c Fix issues with Entry Editing
* Fix #10653 - prevent category switching if no category was actually hidden/visible. Also properly select a new category when a change is made instead of just changing the widget page.

* Fix apply button still being enabled after it is pressed and successfully committed
2024-05-05 16:04:08 -04:00
egglessness
8c91836038 Add configurable password strength check on database password (#9782)
* Set default value of DatabasePasswordMinimumQuality to 3 (do not accept a master password that is less than Good)

* Add custom message box button "Continue with weak password"
2024-04-29 17:26:06 -04:00
Jonathan White
d14821fb16 Bitwarden and 1PUX importer improvements
* Fixes #10400
  - Support TOTP entries with bare secrets instead of otpauth urls for Bitwarden. Vice-versa for 1PUX.
  - Support Bitwarden Argon2id encryption scheme

* Fixes #10380 - Support Bitwarden organization collections
2024-04-29 09:53:31 -04:00
Jonathan White
2dfc0e540c Preserve Secret Service exposed group setting on merge
* Fixes #9371 - adds secret service custom data key to the list of protected custom data (will not be overwritten on merge)
2024-04-29 09:53:25 -04:00
Jonathan White
30d4e36a8b Prevent KeeShare from merging database custom data
This issue previously caused parent databases to be marked as modified on unlock. This was because of the new protections against byte-by-byte side channel attacks adds a randomized string to the database custom data. We should never be merging database custom data with keeshare or imports since we are merging groups only.

Also prevent overwrite of auto-generated custom data fields, Last Modified and Random Slug.
2024-04-29 09:53:20 -04:00
Jonathan White
43ca4e7dfe Open links and urls in AppImage
* Fixes #8721
2024-04-29 09:53:16 -04:00
Jonathan White
49fd85c975 Force clear clipboard on Wayland
* Fixes #4498
2024-04-29 09:53:11 -04:00
Jonathan White
94df540ffe Further prevent ability to access memory on Windows
* Restrict access to changing DACL's after the process is started. This prevents the creator of the keepassxc.exe process from simply adding the permission to read memory back to the DACL list.
* Verified using System Informer.
2024-04-29 09:53:02 -04:00
Jonathan White
96fcc2ce89 Reduce complexity of {CLEARFIELD} on Linux
Instead of `CTRL + HOME, CTRL + SHIFT + END, BACKSPACE` use `HOME, SHIFT + END, BACKSPACE`

Fixes #10006
2024-04-29 09:52:51 -04:00
Jonathan White
c4e27d431a Fix TOTP being visible on unlock when disabled in settings
* Fixes #9996
2024-04-29 09:52:46 -04:00
Jonathan White
3e9fba7283 Don't remember key file folder if disabled
* Fixes #10557
2024-04-29 09:52:04 -04:00
Jonathan White
d7c054e9b2 Correct minor issues in translations 2024-04-29 09:51:52 -04:00
Jonathan White
485c446013 Fix password generator close button for good
* Avoids using QDialog which breaks the standalone password generator

Revert "Fix password dialog close button"

This reverts commit 5b47190fcc.
2024-04-29 07:37:35 -04:00
Jonathan White
9dd90c95a7 Improve signing files with release tool 2024-04-28 23:41:45 -04:00
Jonathan White
a8b60b7b02 Fix crash on screen lock or computer sleep
* Fixes #10455
* Fixes #10432
* Fixes #10415

Prevent setting critical key components to nullptr when database data is cleared. This can result in a crash due to race condition between threads.

Added a bunch of asserts to detect this problem and if guards to prevent actual crashes.
2024-04-28 23:41:45 -04:00
Jonathan White
3b8dc028c1 Improve database encryption settings UX
Fixes #6190

Remove the advanced settings checkbox and replace with a dedicated tab widget interface to toggle between basic and advanced encryption settings.
2024-04-28 23:41:45 -04:00
Jonathan White
bab48b42f7 Add auto-save delay per database (#9100)
Add a new propery autosaveDelay in Metadata of the db.
The property is saved in customData to not affect database structure as this setting is unique to keepasxc.
The propery sets delay to wait since last modification before saving.

Co-authored-by: jNullj <jNullj@users.noreply.github.com>
2024-04-28 23:41:45 -04:00
Jonathan White
775efc65ed QMenubar option to show/hide itself (#10341)
--------

Co-authored-by: Mikko Saarinki <mikko.saarinki@michaelkingston.fi>
Co-authored-by: Jonathan White <support@dmapps.us>
2024-04-28 23:41:44 -04:00
Kevin J
d8006e0b76 Add hotkey for group switching (#10625)
* Add hotkey for group switching

Ctrl + Shift + Key_PageUp for previous group
Ctrl + Shift + Key_PageDown for next group
Fixes #4394
2024-04-28 23:41:44 -04:00
Jonathan White
651bcfc904 Remove password repeat application setting
* This removes the application setting to require typing the password in again even though it is visible.
* Removed automatic password repeat when the password is made visible on changing.
2024-04-28 23:41:44 -04:00
Jonathan White
029ccefe22 Only perform group sort when GroupView is focused
* Fixes #10195
2024-04-28 23:41:44 -04:00
Kevin Jerebica
9d714d5b4d Add hotkey for search-help
Add a new hotkey (CTRL+J) for toggling on/off
the search-help when you are in the search field
Fixes: #4100
2024-04-28 23:41:44 -04:00
Mathieu Oriol
b5827aa25f Use XDG Desktop Portal to autostart the flatpak 2024-04-28 23:41:18 -04:00
Sami Vänttinen
8f03f2f59e Passkeys: Pass extension JSON data to browser (#10615) 2024-04-27 23:35:07 -04:00
meigelb
417bc29bc8 Fix display of bytes without decimals (#10595)
*Fixes #10594
2024-04-27 23:35:07 -04:00
Jonathan White
381eb76f7b Fix focus loss when using Auto-Type from locked database
* Fixes #10439
2024-04-27 23:35:07 -04:00
varjolintu
dbc7f020fd Passkeys: Position the confirm dialog with the parent window 2024-04-27 23:35:07 -04:00
varjolintu
50eec240b4 Passkeys: Fix duplicate database selection 2024-04-27 23:35:07 -04:00
Jonathan White
d87f0030a3 Prevent SSH Agent from using entries in the recycle bin
* Fixes #10516
* Also cleanup Group::isRecycled() code a little
2024-04-27 23:35:07 -04:00
Jonathan White
8723b7f6a4 Fix crash when deleting history items
* Fixes #10386
2024-04-27 23:35:07 -04:00
Jonathan White
4b87a3e58e Fix CSV import skipping over single-name groups
* Fixes #10574
2024-04-27 23:21:02 -04:00
varjolintu
bd5984ca82 Passkeys: Fix RP ID validation 2024-04-27 23:20:43 -04:00
varjolintu
969d3f9b23 Passkeys: Do not ask update with a new user handle 2024-04-27 23:20:38 -04:00
varjolintu
f61f55fff7 Passkeys: Enable Import Passkey entry menu item only if a single entry is selected 2024-04-27 23:20:33 -04:00
Sami Vänttinen
305fd24a8e Passkeys: Fix compatibility with StrongBox (#10420) 2024-04-27 23:20:28 -04:00
Sami Vänttinen
a5c3bf6d9d Passkeys: Add warning on export (#10411) 2024-04-27 23:20:23 -04:00
varjolintu
97cf35c993 Passkeys: Allow nfc and usb transports 2024-04-27 23:20:18 -04:00
Joachim Breuer
eeea299187 Do not override fixed font size
This allows properly configuring a readable/desired fixed font in system settings, keepassxcrc etc.
2024-04-27 23:20:06 -04:00
Drwsburah
6875851892 Implemented database file hidden attribute preservation on Windows (#10343)
* Implemented database file hidden attribute preservation on Windows

Implemented database file hidden attribute preservation on Windows by modifying the save function to check the hidden attribute of the original database before saving and then reapply it post-saving if running on Windows so that users can easily store their database in a hidden file without having to re-hide it every time it's modified.

Updated the TestDatabase::testSaveAs() unit test to first verify after the initial save that the database file is not hidden before hiding it then saving again and verifying that it is now hidden.

Signed-off-by: Drwsburah <Drwsburah@yahoo.com>
Co-authored-by: Jonathan White <support@dmapps.us>
2024-04-27 23:20:00 -04:00
Jonathan White
ff6c3d7d9a Fix Message Box button size on macOS and Linux
* Fixes #10381
2024-04-27 23:19:45 -04:00
Jonathan White
deb0926497 Fix focusing search after database unlock
* Fixes #10405
2024-04-27 23:19:40 -04:00
Chris
0b71cb1dad Fix Indonesian language descriptor
Bahasa is simply means language in Indonesian.
Therefore, referring Indonesian language as "bahasa" is incorrect.
2024-04-27 23:19:32 -04:00
Jonathan White
caece405fb Fix TestCli and TestGui entropy tests across platforms
* zxcvbn wordlists can vary between platforms depending on packager adjustments (ie, zxcvbn-c vs Ubuntu Focal)
2024-04-27 23:18:31 -04:00
Jonathan White
3a86381df8 Correct date in appdata.xml 2024-03-12 00:28:40 -04:00
Jonathan White
68e2dd8d22 Update translations 2024-03-09 18:13:37 -05:00
Jonathan White
bbd1604894 Update release-tool.ps1 for manifest builds 2024-03-09 16:22:36 -05:00
varjolintu
976c6914a6 Add basic documentation for Passkeys 2024-03-09 15:21:46 -05:00
Jonathan White
cde88546f3 Update Changelog 2024-03-09 15:21:46 -05:00
Jonathan White
fff1b49f73 Prevent byte-by-byte and attachment inference side channel attacks
Attack - KeeShare attachments can be inferred because of attachment de-duplication.

Solution - Prevent de-duplication of normal database entry attachments with those entry attachments synchronized/associated with a KeeShare database. This is done using the KeeShare database UUID injected into the hash calculation of the attachment prior to de-dupe. The attachments themselves are not modified in any way.

--------

Attack - Side channel byte-by-byte inference due to compression de-duplication of data between a KeeShare database and it's parent.

Solution - Generate a random array between 64 and 512 bytes, convert to hex, and store in the database custom data.

--------

Attack vector assumptions:
1. Compression is enabled
2. The attacker has access to a KeeShare database actively syncing with the victim's database
3. The victim's database is unlocked and syncing
4. The attacker can see the exact size of the victim's database after saving, and syncing, the KeeShare database

Thank you to Andrés Fábrega from Cornell University for theorizing and informing us of this attack vector.
2024-03-09 15:21:46 -05:00
Jonathan White
18cfbf729c Add 1Password 1PUX and Bitwarden JSON Importers
* Closes #7545 - Support 1Password 1PUX import format based on https://support.1password.com/1pux-format/

* Closes #8367 - Support Bitwarden JSON import format (both unencrypted and encrypted) based on https://bitwarden.com/help/encrypted-export/

* Fixes #9577 - OPVault import when fields have the same name or type

* Introduce the import wizard to handle all import tasks (CSV, KDBX1, OPVault, 1PUX, JSON)

* Clean up CSV parser code to make it much more efficient and easier to read

* Combine all importer tests (except CSV) into one test file
2024-03-09 15:21:46 -05:00
Jonathan White
6f112b11e4 Minor changes to Group API to make it more explicit
* Include check for group as recycle bin directly into the Group::isRecycled() function

* Return the original root group from Database::setRootGroup(...) to force memory management transfer
2024-03-09 15:21:46 -05:00
Jonathan White
ee1268c518 Fix spacing of QGroupBox's
* Previously our base style sheet added roughly 20px of margin to the top and bottom of all QGroupBox. This caused visual errors where that margin was not needed/desired. 
* Transferred padding to the specific layouts instead where it belongs.
2024-03-09 15:21:46 -05:00
Sami Vänttinen
d78a6b6095 Skip a few Passkeys tests with Botan <= 2.14 (#10360)
Botan version less than 2.14.0 miscalculates ECDSA signatures. 

---------

Co-authored-by: Jonathan White <support@dmapps.us>
2024-03-09 15:21:46 -05:00
Janek Bevendorff
63b18084ac Set test locale to C 2024-03-09 15:21:46 -05:00
Jonathan White
7d0dc67180 Fix TouchID not being shown after lid close
Fixes #8945
Fixes #10315
2024-03-09 15:21:46 -05:00
Jonathan White
f20b531430 Automatically detect USB device changes 2024-03-09 15:21:46 -05:00
Jonathan White
28d096a89a Add vcpkg manifest with build dependencies
Also bump minimum CMake release
2024-03-09 15:21:46 -05:00
varjolintu
350931b707 Fix macOS crash on Accent Color change 2024-03-09 15:21:46 -05:00
Jonathan White
b7a1c620e4 Passkeys improvements (#10318)
Refactors the Passkey implementation to include more checks and a structure that is more aligned with the official specification.
Notable changes:
- _BrowserService_ no longer does the checks by itself. A new class _BrowserPasskeysClient_ constructs the relevant objects, acting as a client. _BrowserService_ only acts as a bridge between the client and _BrowserPasskeys_ (authenticator) and calls the relevant popups for user interaction.
- A new helper class _PasskeyUtils_ includes the actual checks and parses the objects.
- _BrowserPasskeys_ is pretty much intact, but some functions have been moved to PasskeyUtils.
- Fixes Ed25519 encoding in _BrowserCBOR_.
- Adds new error messages.
- User confirmation for Passkey retrieval is also asked even if `discouraged` is used. This goes against the specification, but currently there's no other way to verify the user.
- `cross-platform` is also accepted for compatibility. This could be removed if there's a potential issue with it.
- Extension data is now handled correctly during Authentication.
- Allowed and excluded credentials are now handled correctly.
- `KPEX_PASSKEY_GENERATED_USER_ID` is renamed to `KPEX_PASSKEY_CREDENTIAL_ID`
- Adds a new option "Allow localhost with Passkeys" to Browser Integration -> Advanced tab. By default it's not allowed to access HTTP sites, but `http://localhost` can be allowed for debugging and testing purposes for local servers.
- Add tag `Passkey` to a Passkey entry, or an entry with an imported Passkey.

Fixes #10287.
2024-03-09 15:21:46 -05:00
qycyfjy
067deb9bd7 Fix removing entry from history and improve logic of history tab showing 2024-02-04 11:50:52 -05:00
BGM99
99e42b1fce Fix focus loss on save when the widget is not visible anymore 2024-02-04 11:50:52 -05:00
f4lkensmaz3
53d06f127d Prevent duplicate characters in "Also choose from" field of password generator (#9803)
* Fixes #9797
2024-02-04 11:50:52 -05:00
wise0n
3094302bcc Fix menu location in alert 2024-02-04 11:50:52 -05:00
Jonathan White
b504c72563 Fix database merge crash when fdosecrets is enabled (#10136)
* Entry: re-parent before adding to new group

Adding the Entry to the Group will emit signals about the action.
Present the object with the correct parent already.

* fdosecrets: Item::Create() can fail

If an entry cannot be registered on DBus, Item::Create() will return a
nullptr. Basically, this can only happen if there is already an item
with the same UUID in the collection. The only viable option here is to
ignore the new entry.

* Merger: prevent duplicate entry when merging histories

If the source entry is newer, a copy of the entry is made. But before
moving the merged entry to the target group, it must be removed.
Otherwise there will be briefly two entries with the same UUID
in the same group/database.

Even though this is only the case during the transaction, it can still
be observed because the operations emit signals. A notable problem is
the fdosecrets feature that relies on the uniqueness of the UUID or will
otherwise run into problems because the UUID is used as part of the DBus
path.
2024-02-04 11:50:52 -05:00
Jonathan White
b1168d0233 Fix multiple TOTP issues
* Fix #9847 - don't provide TOTP values if settings are blank or completely wrong
* Fix #6838 - don't reset the ui when creating a new entry and applying TOTP to it
* Move totp source into the core folder
2024-02-04 11:50:52 -05:00
Barnabás Pőcze
3ca757883f Do not hard-code colors in classic stylesheet for SearchBanner/KeeShareBanner
Having the green-ish hard-coded color makes the banner stand out
too much when the platform native theming is used.
2024-02-04 11:50:52 -05:00
Remigiusz Żętkowski
c76d9e45e7 Fix docs link anchors 2024-02-04 11:50:52 -05:00
Martin Buchholz
a23b4f4dc0 Fix typo: SSH_AUTH_SOCKET 2024-02-04 11:50:52 -05:00
Sami Vänttinen
e6d2e5fe6e Fix terminating KeePassXC processes with MSI installer (#9822) 2024-02-04 11:50:52 -05:00
Jonathan White
c9b0cbaa4e Prevent scrollbars on entry drag/drop
* Fixes #9746
2024-02-04 11:50:52 -05:00
Colfenor
762fd9462f Fix first entry is not selected when a search is performed (#9868) 2024-02-04 11:50:52 -05:00
Jonathan White
394c0375b7 Update share/linux/org.keepassxc.KeePassXC.appdata.xml
Co-authored-by: Brian J. Murrell <brian@interlinx.bc.ca>
2024-01-30 18:26:45 -05:00
Jonathan White
4cf5e83c38 Bump version to 2.7.7 2024-01-30 18:26:45 -05:00
varjolintu
cb5d3ed21d Fix raising Update Entry messagebox 2024-01-30 18:26:45 -05:00
Jonathan White
4bd9fdd7a4 Passkeys: UI adjustments 2024-01-30 18:26:45 -05:00
varjolintu
fe739578ab Passkeys: Create AAGUID for KeePassXC 2024-01-30 18:26:45 -05:00
varjolintu
3f77678b5c Passkeys: Fix default timeout on authentication 2024-01-30 18:26:45 -05:00
Jonathan White
c477f43c40 Passkeys: Add support for importing Passkey to entry (#9987)
---------
Co-authored-by: Jonathan White <support@dmapps.us>
2024-01-30 18:26:45 -05:00
varjolintu
7371589955 Rename userId to credentialId 2024-01-30 18:26:45 -05:00
Jonathan White
1cbbcff259 Create new UrlTools class
Includes "Fix ifdefs with UrlTools"
2024-01-30 18:26:45 -05:00
Jonathan White
416581b179 Add basic support for WebAuthn (Passkeys) (#8825)
---------

Co-authored-by: varjolintu <sami.vanttinen@protonmail.com>
Co-authored-by: droidmonkey <support@dmapps.us>
2024-01-30 18:26:45 -05:00
Jonathan White
82c1bf4ddb Fix support for referenced URL fields 2024-01-30 18:26:45 -05:00
Sami Vänttinen
7f33868d14 Fix crash on database open from browser (#9939) 2024-01-30 18:26:45 -05:00
Jonathan White
c5312d63f2 Fix various bugs when returning credentials (#9136)
Co-authored-by: Sami Vänttinen <sami.vanttinen@protonmail.com>
2024-01-30 18:26:45 -05:00
Jonathan White
e401e8f4bc Browser Integration code cleanup (#8489)
Co-authored-by: varjolintu <sami.vanttinen@protonmail.com>
2024-01-30 18:26:45 -05:00
Dmytro
159c7cf153 Fix dangling reference (#10135) 2024-01-27 12:09:38 -05:00
lapse
5686776e53 Update CMakeLists.txt (#10098)
Added set(CPACK_COMPONENTS_ALL "") to prevent cmake from causing an XML fragments issue later on in CPack.
2024-01-27 12:04:50 -05:00
Dan Church
05ab5b1700 Fix Botan 2/3 include
Botan::secure_scrub_memory -> defined in mem_ops.h
Botan::secure_vector -> defined in secmem.h

The reason only including secmem.h worked in previous (<3.0) versions of
Botan was because secmem.h included mem_ops.h. This is no longer the
case since commit
randombit/botan@49dbbcb2bf (2023-10-11;
"Split out allocator helpers to allocator.h")

Fixes #10038
2024-01-27 08:52:52 -05:00
Lapse
be873c83d6 Update FindBotan.cmake
The recent debug library is called botan-3.lib, which is unable to be found by this since BOTAN_NAMES_DEBUG does not contain the keyword "botan-3". This commit adds that keyword.
2024-01-27 08:52:44 -05:00
Jonathan White
87c24222b8 Fix Visual Studio install detection in release-tool.ps1 (#10101)
* Update release-tool.ps1

`Get-CimInstance MSFT_VSInstance` does not always work as it uses the default namespace root/cimv2. Specifying `Get-CimInstance MSFT_VSInstance -Namespace root/cimv2/vs` allows it to work.

Co-authored-by: Jonathan White <support@dmapps.us>
2024-01-27 08:50:31 -05:00
Janek Bevendorff
dd21defcf3 Update translations 2023-08-16 00:40:34 +02:00
Janek Bevendorff
25d46fbc03 Update changelog 2023-08-16 00:27:16 +02:00
Jonathan White
742a4f8980 Exclude Flatpak and Snap from proxy detection warning 2023-08-15 07:28:11 -04:00
varjolintu
e84d6c0b06 Revert "Fix password dialog close button"
This reverts commit 5b47190fcc.
2023-08-14 23:23:49 -04:00
Jonathan White
636d013557 Bump to version 2.7.6
* Remove obsolete command line flag on transifex tool
2023-08-14 23:07:28 -04:00
Jonathan White
3e6b118267 Improve colorful lock icon for system tray (#9632)
* Fix #9432
* Simplify tray icon selection code
* Update all icons with latest export
* Fix MIME type icon appearance on KDE
---------
Co-authored-by: Janek Bevendorff <janek@keepassxc.org>
2023-08-14 21:40:13 -04:00
Sami Vänttinen
eee4ca9a26 Improve duplicate URL warning (#9635)
Co-authored-by: varjolintu <sami.vanttinen@protonmail.com>
2023-08-14 07:04:48 -04:00
Jonathan White
aecd154399 Fix several issues with Quick Unlock (#9697)
* Fix #7892 - Pressing escape when the quick unlock prompt is shown will now go back to the main unlock dialog view.
* Fix #9030 - Quick unlock will be automatically invoked in the unlock dialog upon being shown.
* Fix #9554 - Quick unlock application setting will be updated every time the settings widget is shown instead of just on first launch.

* Show warning that quick unlock is not enabled if user cancels Windows Hello prompt. This should limit people thinking there is a security issue. Also improve documentation describing this behavior.

* Disable quick unlock in gui tests
2023-08-14 07:04:42 -04:00
Jonathan White
f293aad74f Enable save button when not auto-saving non-data changes (#9634)
* Fix #9501
* Also fix bug where context menu did not update when entry moved to very top or bottom of list
2023-08-14 07:04:33 -04:00
Jonathan White
5804e63559 Move toolbar back to top of main window when unmovable
* Fix #9384
2023-08-06 15:49:24 -04:00
Jonathan White
fb2664b54a Prevent KeeShare banner from squashing group panel
* Fixes #9569
2023-08-06 15:49:19 -04:00
Jonathan White
10f4704724 Increase fixed font point size on Windows
* Consolas runs smaller then the default system font. Increasing by 1 point size makes them look equal.
2023-08-06 15:49:16 -04:00
Jonathan White
ea77ee686d Copy TOTP on preview panel on double click
* Closes #9545
2023-08-06 15:49:12 -04:00
Jonathan White
09bda6a882 Prevent password preview from being cut off
* Fixes #9190
2023-08-06 15:49:09 -04:00
Jonathan White
6fb498648d Significantly improve visual when dragging entries to copy/move
* Fixes #6079
2023-08-06 15:49:04 -04:00
varjolintu
5b47190fcc Fix password dialog close button 2023-08-06 15:49:00 -04:00
Jonathan White
663d4d99ae Improve error message when browser proxy cannot be found (#9385)
Co-authored-by: Blessio <blessio.blog@blessio.com>
Co-authored-by: Jonathan White <support@dmapps.us>
2023-08-05 21:20:45 -04:00
Oleg Muraviov
4ea0a1058c Fixes #9255 Access Confirmation dialog should not be shown with option ConfirmAccessItem=true 2023-08-05 07:31:14 -04:00
Jonathan White
55ca5ca34c Pass parent to browser popups 2023-08-05 07:31:05 -04:00
varjolintu
cdf6cd7cd2 Disable entry level Auto-Type 2023-08-05 07:29:14 -04:00
Jonathan White
4c1105f968 Linux: Fix warning message about --allow-screencapture (#9638)
* Fixes #9420
2023-08-05 07:28:54 -04:00
Jonathan White
a81771207f Windows: Prevent white flicker when showing main window (#9637)
* Fixes #9603
2023-08-05 07:28:50 -04:00
Jonathan White
2fe647fd7a Fix potential crash in search if an entry doesn't have a group (#9633) 2023-08-05 07:28:42 -04:00
Jonathan White
33b740ddd0 Add challenge-response support for Nitrokey 3 (#9631)
Co-authored-by: Szczepan Zalega <szczepan@nitrokey.com>
2023-08-05 07:28:36 -04:00
Sami Vänttinen
f30604c6f6 Add warning for duplicate URLs with Additional URLs list (#9588) 2023-07-15 15:33:20 -04:00
varjolintu
e9ea5b43ec Enable Update native messaging manifest files checkbox with Flatpak 2023-07-15 15:30:48 -04:00
Jonathan White
76a7dc79f4 Fix contact portion of documentation 2023-07-15 15:28:46 -04:00
Jonathan White
1594e5f4e3 MacOS: Fix crash on exit
* Fixes #9423
2023-07-15 15:28:39 -04:00
aceArt-GmbH
13a71ff1c8 Add uuid search (#9571)
Co-authored-by: lukas <lukas.walter@aceart.de>
2023-07-15 15:28:16 -04:00
varjolintu
fa73f100f7 Handle expired credentials normally 2023-07-15 15:28:07 -04:00
Anthony Ryan
b8da5e0577 Losslessly optimize PNG images
Using Efficient-Compression-Tool we are able to save 586.53KB out of 4.33MB (13.2390%)
with no change in visual appearance.
2023-07-15 15:27:36 -04:00
Nils Büchner
6165975bdc fix snap build. add libfreetype-dev and libfreetype6 as required packages. 2023-05-29 10:14:11 -04:00
Jonathan White
10891a403d Fix issues with appdata.xml
* Fix #9435
2023-05-19 13:50:40 -04:00
Jonathan White
37dabd2561 Fix finding libssl and libcrypto on MSYS builds 2023-05-14 15:52:11 -04:00
Jonathan White
9d0537bdab Update translations 2023-05-14 14:03:31 -04:00
Jonathan White
063bf4a58d Update Transifex configuration file 2023-05-14 14:03:05 -04:00
tenzap
d5d9a4c08c use setWindowFlags() instead of setWindowFlag on Qt<5.9
Fixes:
src/gui/CloneDialog.cpp:32:5: error: use of undeclared identifier 'setWindowFlag'
    setWindowFlag(Qt::WindowContextHelpButtonHint, false);
    ^

void QWidget::setWindowFlag(Qt::WindowType flag, bool on = true)
--> This function was introduced in Qt 5.9.
2023-05-14 13:24:27 -04:00
Carlo Teubner
eddd97fbab Fix Botan deprecation warning
Use the non-deprecated PK_Signer constructor overload, by explicitly
passing in our random-number generator.
2023-05-14 12:10:53 -04:00
Jonathan White
53f88b93fb Add 2.7.5 CHANGELOG
* Sign  PowerShell Release Tool
2023-05-14 11:41:57 -04:00
Jonathan White
59042563b3 Revert "Support {MODE=VIRTUAL} on macOS"
This reverts commit 25fc69dcd4.
2023-05-13 15:48:06 -04:00
tenzap
74d96fc06f Fix build failure with Qt5.6 (#9382) 2023-05-07 23:23:17 -04:00
Jonathan White
9c1a01ffe8 Update snap to Core22
* Fixes #9268 - update to Core22 to pull in the latest KDE Framework
* Fixes #9185 - add interface plug for fdosecrets
* Fixes #7005 - add autostart setting
2023-05-07 23:19:48 -04:00
Jonathan White
4b92838b4f Remove registry detection of desktop shortcut setting (#9380)
* Fixes #8711
2023-05-07 23:19:48 -04:00
Jonathan White
b225b85644 Greatly improve performance when rendering entry view (#9398)
* Fixes #9390
* Create one QCollator per entry view instead of creating one on every sort request. This greatly improves the speed of sorting and displaying entries.
* Rewrite recursive multiple placeholder replacement to use QRegularExpression
2023-05-07 23:19:48 -04:00
Jonathan White
ebc0b3ff5f Add support for Botan3 (#8994)
Fix Botan 3 build (#9388)

* SymmetricCipher: Fix Botan 3 build

Botan commit 819cf8fe6278a19b8266f449228f02fc28a4f784 changed Botan::Cipher_Dir to be a scoped enumeration, so the users must be adapted.

This change causes no issues with Botan 2 because normal enumeration values can also be referred to the same way scoped enumeration values are accessed.

* Auto detect Botan3

* AsyncTask: Do not use `std::result_of`

`std::result_of` was deprecated in C++17 and then it was subsequently removed in C++20. One could use `std::invoke_result_t`, but let Qt figure out the return type instead.

* Collapse Botan2 and Botan3 find package into one

* Update COPYING
2023-05-07 23:19:18 -04:00
ShellCode33
64281b508b Allow specifying initial directory via the KPXC_INITIAL_DIR environment variable 2023-05-01 07:22:44 -04:00
Jonathan White
6c9078c870 Fix crash when search clears while creating new entry
* Fixes #7660
* Also fix code error in Icons::imageFormatsFilter. An inner loop looks for invalid characters in the code point, but erroneously calls `continue` within the inner loop when the intention was to continue in the outer loop. Fixed with a boolean test instead.
2023-05-01 07:22:39 -04:00
Janek Bevendorff
6b51c66c68 Update KeePassXC logo and icons 2023-05-01 07:22:34 -04:00
Jonathan White
d04a6c4eb7 Fix GUI tests on macOS 2023-05-01 07:22:30 -04:00
Jonathan White
28e2806e07 Make open folder icon exempt from "Apply group icon to entry"
* Fix #9201
2023-04-16 07:16:25 -04:00
Jonathan White
6182b605c0 Fix various accessibility issues (#9138)
Enable buddy fields in group and entry edit pages
* Fixes #9060, you can now press Alt + [letter] to skip between fields on the group and entry edit pages.
* Move the expire checkbox to the right hand column and use the standard eye icon button for notes reveal. Only show notes reveal button if the hide notes setting is enabled.

Fix overflow of text in default auto-type sequence preview
* Fixes #9083

Add copy title shortcut (Ctrl + I)
* Closes #9109

Fix issues with menu actions being enabled incorrectly

Add accessibility description to password widget to explain how to hide/show passwords and open the generator
* Closes #9059

Add F6 shortcut to focus search
* Closes #9163
2023-04-16 07:16:19 -04:00
Jonathan White
8077cd028d Fix branding images for Windows installer 2023-04-11 23:25:48 -04:00
Janek Bevendorff
761e1aed58 Update KeePassXC logo and icons 2023-04-03 23:22:00 -04:00
Jonathan White
ee44a7fd70 Increase max TOTP step to 24 hours
* Fixes #7095
2023-04-03 23:21:55 -04:00
Jonathan White
058e6d15c1 Hide group column header choice when not in search
* Fixes #9157
2023-04-03 23:21:51 -04:00
Jonathan White
83720e6960 Use QClipboard::clear() instead of setting blank text
* Fixes #9121 and #4498 and #4105
2023-04-03 23:21:46 -04:00
Jonathan White
86550f2253 Fix bugs with preview widget
* Add configuration to hide TOTP in preview widget (shown by default).

* Retain the visibility of TOTP and other fields when the same entry remains selected in the preview panel.

* Fix disconnecting signals when switch entries / groups. This likely is going to fix crashes because we were compounding signals when focusing in on the main window.
2023-04-03 23:21:24 -04:00
Jonathan White
881e6b5a8b Fix temporary screencapture showing phantom windows
* Fix #9200
2023-04-03 23:21:14 -04:00
Hugo Osvaldo Barrera
102ce04b2d Turn search reset off by default
This is more user friendly, especially to newcomers.

Fixes: https://github.com/keepassxreboot/keepassxc/issues/9145
2023-02-25 14:21:01 -05:00
Jonathan White
90bbb66409 Add menu option to allow screenshots
* Fix #7580
* Also refactor the code to move everything into MainWindow
2023-02-25 14:20:48 -05:00
Jonathan White
df40742223 Fix status bar update when switching to other DB (#9073)
* Gui tests: add validation of StatusBarLabel in some tests
2023-02-19 08:28:59 -08:00
Jonathan White
f7920c12d5 Translate Cipher and KDF strings
* Fix #8952 - move translations for Cipher and KDF strings into evaluated code instead of globally defined code. The strings were being baked prior to the language being set resulting in only english being displayed.
2023-02-19 08:28:59 -08:00
Bernhard Kirchen
51a08fc85e revise strings labeling history limit settings 2023-02-19 08:28:59 -08:00
Charlie Wang
655202a35a Properly handle Windows Hello errors
The KeyCredentialManager::RequestCreateAsync call can fail because we can end up in a situation where Windows Hello is initially available but then becomes unavailable, such as during a remote desktop session. This commit prevents a crash by moving the call into the try-catch.

Fixes #7890

Also resets quick unlock if there is an unrecoverable error. This will not occur if the user merely canceled the Windows Hello dialog.
2023-02-19 08:28:59 -08:00
Akinori MUSHA
cbbabf477a Select new entry after cloning
Also fixes re-selecting entries during a search refresh
2023-02-19 08:28:59 -08:00
Dmytro Maslenko
0167ce60bd Fix arrows size when expand/collapse a group
Change ratio from 0.7 to 0.9 to give a more coherent look and feel to the tree.
2023-02-19 08:28:59 -08:00
jNullj
d362b51450 Fix/database settings spin box bug (#9101)
Co-authored-by: jNullj <jNullj@users.noreply.github.com>
2023-02-19 08:28:59 -08:00
Dmytro Maslenko
95aaa96fb8 Fix text selection for clear_field step on Mac 2023-02-18 14:16:23 -08:00
Dmytro Maslenko
fa53c79ecf Scale and center QR code on window resizing
* Also add GUI test for QR code resizing
2023-02-18 14:15:49 -08:00
Dmytro Maslenko
27668b81a5 Set shortcuts for settings and database settings
* Open app settings with Ctrl+,
* Open database settings with Ctrl+Shift+,
* Open database reports with Ctrl+Shift+R
2023-02-18 14:13:53 -08:00
Lars Fröder
f1a5e1c899 Don't rely on AppleInterfaceStyle for theme switching (#8615)
* Fix #7615 - Don't rely on AppleInterfaceStyle preference key for dark mode detection, as it's not always correct
2023-02-18 14:13:25 -08:00
olivier
ae55d88544 Properly enable auto-type ui elements on entry edit page (#8752)
Fixes #8743
2023-02-18 14:13:12 -08:00
Jonathan White
25fc69dcd4 Support {MODE=VIRTUAL} on macOS
* Fix #8433
2023-02-18 14:12:52 -08:00
Dmytro Maslenko
1bb215156e Improve exported html layout
[What]
  1) The title was moved from dedicated column to a table caption.
  2) The font size for notes was changed from medium to small.
  3) The notes order was moved to the end.
  4) The table margin and width were adjusted to fit into screen and
     print pages.

[Why]
  To have more readable output and utilize more page space.
2023-02-18 14:12:42 -08:00
Jonathan White
758d6f0c8d Minor fixes to documentation
* Convert hyphens to em-dash
* Fix various typos
2023-02-18 14:05:32 -08:00
Dmytro Maslenko
798fee338b Improve exported html layout
[What]
  1) The title was moved from dedicated column to a table caption.
  2) The font size for notes was changed from medium to small.
  3) The notes order was moved to the end.
  4) The table margin and width were adjusted to fit into screen and
     print pages.

[Why]
  To have more readable output and utilize more page space.
2023-02-18 14:05:14 -08:00
Dmytro Maslenko
9253a59f05 Move 'Copy URL' into main entry context menu 2023-02-18 14:05:07 -08:00
tenzap
18857cb60b Fix build failure with Qt5.6 (#8829)
With Qt 5.6, build fails with error below.

This is because in Qt 5.6, the 3rd argument is not optional. Starting from Qt
5.7 the default value for the 3rd argument is nullptr, so setting it to
nullptr.

https://doc.qt.io/archives/qt-5.6/qaction.html#QAction-2
https://doc.qt.io/archives/qt-5.7/qaction.html#QAction-2

Error:
src/gui/tag/TagView.cpp:79:38: error: no matching constructor for initialization of 'QAction'
        auto action = menu.exec({new QAction(icons()->icon("trash"), tr("Remove Search"))}, mapToGlobal(pos));
                                     ^       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2023-02-18 14:04:59 -08:00
Pat Long
7bdcf05fc3 Fix support for AES-256/GCM openssh keys (#8968)
* Fix detecting AES-256/GCM cipher, fixes #8964 

When you generate a ssh key using the aes-256/gcm cipher, the cipher name in the keyfile includes an @openssh.com at the end.

* Use separate iv length for getting iv data, the assumption that the block size and iv size are equal does not hold for every cipher mode (e.g., GCM)

* Disable AES-256/GCM for now in ssh keys 

Currently, the granularity for the botan gcm implementation is too large. To fix a problem with another algorithm in the library, they are multiplying
the blocksize, so by default the granularity is 64. This causes issues since the encrypted data in the key is only guaranteed to have a length that is a multiple of the block size (16).
2023-02-18 14:04:47 -08:00
chandi Langecker
32d115d22e Fix unexpected behavior of --lock when keepassxc is not running (#8889)
currently, when keepassxc is not running, the command `keepassxc --lock` opens a new keepass window and blocks until the window is closed.

Especially in locking scripts this is rather unexpected and  Ican't think of a case where someone explicitly starts keepass with --lock and wants this behaviour.

Rather --lock should always ensure, that there are no unlocked instances and exiting afterwards
2023-02-18 14:04:28 -08:00
Luca Weiss
2e0d66039d Set SingleMainWindow in .desktop file (#7430) 2023-02-18 14:04:18 -08:00
Jonathan White
acb37db6f1 Fix canceling quick unlock when it is unavailable (#9034) 2023-02-18 14:03:56 -08:00
chris
0e1b32adcd Add .mm files to translation update (#8843) 2023-02-18 14:03:37 -08:00
Dmytro
c20104e67c Fix db history when adding new db (#9022)
Fixes https://github.com/keepassxreboot/keepassxc/issues/8375
2023-02-18 14:02:47 -08:00
Klemens Nanni
32f2710430 Set password hint on BSD, fill selection on macOS again (#8949) 2023-02-18 14:02:39 -08:00
Jonathan White
605f13ed4a Hide rename button from attachments preview panel (#8842) 2023-02-18 14:01:53 -08:00
Daniel Ziegenberg
a6a4ed6ed4 Fix Ctrl+Tab shortcut to cycle databases in unlock dialog (#8839) 2023-02-18 14:00:02 -08:00
Sami Vänttinen
c3bd31c51b Fix Native Messaging script path with BSDs (#8835)
Fixes https://github.com/keepassxreboot/keepassxc/issues/8830
2023-02-18 13:59:55 -08:00
Sami Vänttinen
90c63483c1 Fix crash in Group Edit after enabling Browser Integration (#8778)
Fixes https://github.com/keepassxreboot/keepassxc/issues/8775
2023-02-18 13:59:48 -08:00
Olivier Tilloy
3383882b95 Do not ask whether firefox is installed as a snap. (#8756) 2023-02-18 13:59:39 -08:00
jNullj
d5adf7592c Add Unicode support for database filenames on Windows (#8782)
Fixes #8751
2023-02-18 13:58:47 -08:00
Janek Bevendorff
9ba88e2f13 Set password input field font correctly. (#8732)
Also update member variable names to describe their contents better.

Fixes #8709
2022-11-02 19:16:04 +01:00
Jonathan White
772964886e Fix appdata.xml formatting 2022-10-29 22:11:12 -04:00
Jonathan White
70b73524c6 Fix SSH Agent Build on MSYS Windows (#8708) 2022-10-29 22:10:50 -04:00
Janek Bevendorff
a459344078 Fix realpath error on macOS 13 (#8707) 2022-10-29 22:10:43 -04:00
Jonathan White
63b2394ed0 Update translations 2022-10-29 15:07:50 -04:00
Jonathan White
cdb10dce0c Fix typo in release-tool.ps1 2022-10-29 15:07:28 -04:00
Jonathan White
9b5b1d6dce Browser: second fix for linked socket path
* Fix #8702
2022-10-29 14:12:16 -04:00
Jonathan White
c231abe13d Version bump to 2.7.4 2022-10-29 12:45:17 -04:00
Jonathan White
d81f6ea1c0 Fix powershell merge with no changes to translations 2022-10-29 12:45:17 -04:00
Jonathan White
1012d715b2 Fix launching proxy service with Flatpak
* Fixes #8655
2022-10-29 12:45:17 -04:00
Jonathan White
a1a5e21834 Prevent expired entries search if no results returned
* Fixes #8626
* Also remove old feature to set the title of a new entry to the current search text. This only made sense before advanced searching was made available.
2022-10-29 12:45:17 -04:00
Maurizio Pasquinelli
bc147070b6 Point INSTALL.md checkout reference to latest tag (#8470) 2022-10-29 12:45:17 -04:00
Matthew Donoughe
9176ddc3e1 CLI: Add Unicode support on Windows (#8618) 2022-10-29 12:45:17 -04:00
Sami Vänttinen
4f07a6592c Revert async Access Confirm Dialog 2022-10-29 12:45:17 -04:00
varjolintu
3ad205f733 Fix deleting existing socket file before making a new symbolic link 2022-10-29 12:45:17 -04:00
YAMASAKI Masahide
f01608f2bb SSH Agent: Fix CreateFileMappingA Parameter (#8619)
The last argument of CreateFileMappingA is of type string.
2022-10-29 12:45:17 -04:00
Hoai-Thu Vuong
fa4837c67b Add entry 2 months to preset menu (#8687) 2022-10-29 12:45:17 -04:00
Jonathan White
af466b120e Fix clicking links in entry preview panel
* Fixes #8636
2022-10-29 12:45:17 -04:00
Jonathan White
ce790dcd3a Fix crash on macOS when unlocking database
* Fix #8639
2022-10-29 12:45:17 -04:00
Jonathan White
e1d9a4fb53 Fix display of passwords in preview panel
* Fix #8627 - don't HTML escape plain text...
* Fix #8624 - ensure use of monospace font when displaying passwords in preview panel
2022-10-29 12:45:17 -04:00
Janek Bevendorff
d8483d3350 Update translations 2022-10-23 17:56:57 +02:00
Jonathan White
2d13588c95 Fix creating tag with powershell release tool
* The original method dumped the changelog lines into the command which overflowed the command line length. This method uses a temporary file for the tag message.
2022-10-23 14:48:40 +02:00
Janek Bevendorff
acf1d6b1ac Update minimum macOS deployment target to 10.15
Fixes compilation warnings about some macOS APIs not being available in 10.13.
2022-10-23 14:48:27 +02:00
Janek Bevendorff
2ac1e0ed49 Fix macOS window activation issues
Reverts part of 34b7d08a5, which introduced a regression.
2022-10-23 14:48:04 +02:00
Janek Bevendorff
0a0389ad56 Bump version number 2022-10-23 14:45:32 +02:00
Jonathan White
9d2f3d53d6 Update translations 2022-10-22 17:37:47 -04:00
Jonathan White
9bd4c785e6 Bump version to 2.7.2 2022-10-22 17:19:01 -04:00
tocic
c203ee7f09 Fix typos in docs (#8612) 2022-10-22 17:18:49 -04:00
Patrick Klein
047251a07f Add a URL that preserves the URL path when trying to resolve favicons. (#8565) 2022-10-19 20:51:54 -04:00
Jonathan White
a6db8ba2db Fix potential deadlock in UI when saving
This was noted as a problem in several issues and it finally occurred to me and I traced it to the fact that a timing issue sometimes allowed the file watcher to trigger a "file changed" alert right when saving starts. I fixed this by moving where the mutex lock is made for saving and preventing database reload during a save operation.
2022-10-19 10:16:17 -04:00
Jonathan White
71b1df39eb Hide usernames in preview panel when hidden in entry view
* Fix #6306
2022-10-19 10:16:08 -04:00
Jonathan White
82f056e5d0 Allow picking tags from completion menu with keyboard
* Also fixes the hiding and display of the completion menu to be more natural and less annoying.
* Fixes #7939
2022-10-19 07:01:03 -04:00
Janek Bevendorff
edae652d6f Add CFBundleVersion, fixes #8454 (#8602) 2022-10-18 13:37:53 +02:00
Janek Bevendorff
b1f868cd6c Update macOS provisioning profile (#8600) 2022-10-18 00:56:56 +02:00
Jonathan White
08f7c6f863 Fix use of WITH_XC_X11 build flag 2022-10-17 22:55:11 +02:00
Vijay Aravamudhan
7fa3e6ef90 Allow for homebrew prefix location to handle both x64 and arm macs (#8593)
Allow for Homebrew prefix location to handle both x64 and arm macs
2022-10-17 22:53:22 +02:00
Jonathan White
035c99896b Enable dark title bar on windows when accent color is not used
* Fix #6775
2022-10-16 19:17:02 -04:00
Jonathan White
b56cc62942 Improve PowerShell Release Tool
* -Vcpkg variable now points to the base directory for VCPKG and not the vcpkg.cmake file (which is always in the same subfolder)
* Place custom CMakeOptions at the end of the options list so they can override default options.
2022-10-16 19:17:02 -04:00
Jonathan White
3e3990934a Fix focus traps
* Fix focus issues with new PasswordWidget
* Fix focus wrapping when DatabaseTabWidget is not showing the tab bar
* Fix focus wrapping in EditWidget views to move between category list and contents. This is not a perfect fix, but Qt has a mind of its own with these complex widgets. This will be fixed in future Ui improvements that move away from the category widget.
2022-10-16 19:17:02 -04:00
Jonathan White
faa4c07095 Fix crash when application is unfocused during saves
* Fix #8504
2022-10-16 19:17:02 -04:00
Owen Wang
245dccf91c Fix newlines when copying from DatabaseWidget 2022-10-16 19:17:02 -04:00
louib
c6d4fd6d31 [CLI] Add a db-edit command (#8400) 2022-10-16 19:17:02 -04:00
Wolfram Rösler
14d0732e1d Add option to display passwords in color in preview panel
Closes #4099

* Fixed bug in Application that did not set the dark theme flag when the theme was changed from dark to light.
2022-10-16 19:17:02 -04:00
Patrick Klein
dc07f01418 Add XML Export option to GUI. (#8524)
* Add XML Export option to GUI.

* Update database export screenshot.
2022-10-16 19:17:02 -04:00
Patrick Sean Klein
3fa513a78d Increase entropy required for a "good" rating to 75. 2022-10-16 19:17:02 -04:00
JakobDev
0480c45d5c Add German translation to Appdata 2022-10-16 19:17:02 -04:00
Alex Xu (Hello71)
44fa40ca72 Remove --no-add-needed
--no-add-needed is the default behavior since binutils 2.22, released in
2011. This option also breaks lld compatibility.
2022-10-16 19:17:02 -04:00
felipdsa21
285f8981f8 Fix dark mode detection on Linux
Fixes #7817
2022-10-16 19:17:02 -04:00
Arnavion
00c019c8c2 Remove old --pw / --parent-window option from man page
This was removed from the code in 9886b1075f
2022-10-16 19:17:02 -04:00
Jonathan White
3746452b88 Fix crash when deleting items in recycle bin while searching (#8117)
* Fix #8099
* Clean up code that connects groups to the entry view. Instead of connecting ALL groups from ALL databases, we only need to connect the groups that entries actually belong to. This solves the bug and also reduces overhead.
2022-09-23 07:50:06 -04:00
Nikolas Grottendieck
643ab4e95d Set new default location hints for Qt on macOS
QT5 as offered by Homebrew is versioned since March 2021 and the default
path points to QT6 (if installed). New installations of qt5 have a
suffixed path (qt@5) that should be used instead.
2022-09-22 06:49:07 -04:00
Jim Heden
4978184480 Add shortcut to copy password with TOTP appended 2022-09-22 06:49:07 -04:00
Damian Rhodes
d80be4c459 Point INSTALL.md checkout reference to latest tag (#8225) 2022-09-22 06:49:07 -04:00
mckeema
31924fcd89 Set correct case for database file path on Windows
* Fix #7139 - when opening database files from the command line, ensure the correct case is fed to the program to prevent case changes during saves.
* Cleanup old code (checking for .json extension) from when KeePassXC app could act as a proxy.
2022-09-22 06:49:07 -04:00
varjolintu
87cd9c6fb9 Browser: Asynchronous Access Confirm dialog 2022-09-22 06:49:07 -04:00
andreas-ementio
8654b25e80 Fix CLI output when using clip with the -t flag
if you use the CLI with -t/--totp flag, the program prints out: "Entry's "password" attribute copied to the clipboard!"
expected output is "Entry's "totp" attribute copied to the clipboard!" the same when you run with -a totp
2022-09-22 06:49:07 -04:00
varjolintu
f95019964e Do not allow expired credentials automatically 2022-09-22 06:49:07 -04:00
Jonathan White
59d20cb7ae Support numeric aware sorting on Windows and macOS
* Fix #8356 - Qt does not enable numeric aware sorting when using locale sort. Extracted both Windows and macOS locale aware sorting code and added the appropriate numeric aware flag.

Note: There is no std library way to do this so Linux is out of luck for now.
2022-09-22 06:49:07 -04:00
Jonathan White
e83c9734e0 Improve various application icons 2022-09-22 06:49:07 -04:00
Jonathan White
f4510c64ec Show entry count in status bar
Closes #3963
2022-09-22 06:49:07 -04:00
Jonathan White
64dda09565 Fix tabbing around database widget
Fixes #8352
2022-09-22 06:49:07 -04:00
Jonathan White
de168959a5 Use search for showing expired entries on unlock
* Fix #8036 - use search interface to display expiring entries on first unlock.
2022-09-22 06:49:07 -04:00
Jonathan White
ee55143c4a Enhance Tags / Saved Searches
* Rename "Database Tags" to "Searches and Tags"
* Separate searching for all entries and resetting the search
* Support selecting multiple tags to search against
* Fix using escaped quotes in search terms
* Make tag searching more precise
* Support `is:expired-#` to search for entries expiring within # days. Exclude recycled entries from expired search.
* Don't list tags from entries that are recycled
* Force hide tag auto-completion menu when tag editing widget is hidden. On rare occasions the focus out signal is not called when the tag view is hidden (entry edit is closed), this resolves that problem.
* Remove spaces from before and after tags to prevent seemingly duplicate tags from being created.
* Also fix some awkward signal/slot dances that were setup over time with the entry view and preview widget.

Allow changing tags for multiple entries through context menu

* Closes #8277 - show context menu with currently available tags in database and checks those that are set on one or more selected entries. When a tag is selected it is either set or unset on all entries depending on its checked state.

* Add ability to save searches and recall them from the "Searches and Tags" view
* Add ability to remove a tag from all entries from the "Searches and Tags" view
* Cleanup tag handling and widgets
2022-09-22 06:49:07 -04:00
Jonathan White
5b923aee1a Check for write permission before entering portable mode
* Fix #7585
2022-09-22 06:49:07 -04:00
Jonathan White
f3d448485a Fix OPVault import when there are multiple OTP fields
* Fix #8371 - store multiple OTP fields as `otp_#` instead of silently discarding them.
2022-09-22 06:49:07 -04:00
Yaroslav Isakov
28328a7080 Allow KeePassXC to be built without X11 2022-09-22 06:49:07 -04:00
Jonathan White
fab76c04cc Fix Windows Hello bugs
* Fix #7977 - wrap key signing request in try/catch block to prevent crashes on some machines.
* Fix #8120 - try 3 times to bring Windows Hello prompt to front. This may be necessary on older machines that are slow to bring up the prompt window.

Also remove defunct code on macOS to prevent window focus issues.
2022-09-22 06:49:07 -04:00
Klemens Nanni
74e1e7c9d1 autostart: Linux: Exec= filename not absolute path
Systems like NixOS install software under unique paths, so persisting
the absolute file path in the generated .desktop file when enabling
autostart will eventually point at an outdated or nonexistent program.

Another possible issue with using Qt's `applicationFilePath()` is that
the final program's basename (`argv[0]`) might not be the same as what
the user initially executed to start KeePassXC.

Use the file name and thus rely on `PATH` lookup just like the static
.desktop file does to lift those issues and defer execution logic
(`PATH` lookup, wrapper scripts, etc.) to the operating system.
2022-09-22 06:49:07 -04:00
Christoph Honal
7de9ab25ab Hardware keys: Add VivoKey and DT token ATRs
This adds the ATRs of the VivoKey Apex and the
Dangerous Things FlexSecure tokens, in order to
display a human-readable name instead of "Unknown Key".
2022-09-22 06:49:07 -04:00
Dennis
233be1fc10 TouchID support refactoring (#8311)
Fixes #7695 - Properly set compile flags based on availability of watch unlock in the API.
2022-09-22 06:49:07 -04:00
louib
bad015115d [CLI] Add Option to show all attributes (Show command) (#8256)
* Adding --all option to Show
2022-09-22 06:49:07 -04:00
louib
e7e75c1277 Adding top-level fields to CLI commands
The top-level fields are currently not accessible from the CLI, which
makes it impossible to select entries or groups based on the UUID.
There are other top-level fields I believe, like the expiry date,
but I only added the two most critical fields for the moment.
2022-09-22 06:49:07 -04:00
Jonathan White
e245701533 Better handling of "Lock on Minimize" setting
* Fix #1090 - delay locking databases after minimize to allow for clipboard use, Auto-Type use, and browser integration use.

* Fix #6757 - prevent setting both minimize on unlock and lock on minimize settings at the same time.
2022-09-22 06:49:07 -04:00
Jonathan White
0cbfbc08f3 Add setting for number of recent files
* Expose setting to limit the number of recent files. Default is still 5, can be set from 1 to 25.
* Also fix tab order on settings page
2022-09-22 06:49:07 -04:00
Daniel Ziegenberg
731c89cc1c Add Ctrl+Tab shortcut to cycle databases in unlock dialog
The main window has both `Ctrl+PageUp` / `Ctrl+PageDown` and
`Ctrl+Tab / Ctrl+Shift+Tab` shortcuts to cycle the database tabs. When
in PR #5427 the abbility to select any open database in the unlock
dialog was introduced, only the `Ctrl+PageUp` / `Ctrl+PageDown`
shortcuts were added. This commit adds the `Ctrl+Tab / Ctrl+Shift+Tab`
shortcuts to the unlock diaglog to fix this inconsistent UI behaviour.

Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2022-09-22 06:49:07 -04:00
Nicolas Roeser
b75abaad08 Align generator logic and UI for math symbols
In the password generator widget, the checkable push button for the math
symbols is missing the GREATER-THAN SIGN (U+003E), even though it is
among the possible characters during password generation when the button
is checked. Add the missing character to the text displayed to users.

While at it, also fix a wrong comment containing the possible
characters.
2022-09-22 06:49:07 -04:00
Hugo
40316ac7b9 Move socket into separate directory (#8030)
This is mostly to ease setup and configuration with sandboxed browsers.

The socket currently existing in `$XDG_RUNTIME_DIR`. When sandboxing a browser, it would be unsafe to mount this directory inside the sandbox.
Mounting the socket into the sandbox's filesystem is also not possible in cases where KeePassXC is [re]started after the browser has started.

This commit moves the socket into its own isolated subdirectory, which can be safely mounted into sandboxes. Sandbox engines can create the directory themselves (in case the browser starts before KeePassXC). Both Flatpak and Firejail support this configuration.

A symlink is also created, linking the previous location to the new location. This is meant for backwards compatibility and should eventually be dropped.

The directory can't be named `org.keepassxc.KeePassXC.BrowserServer`,
since that would collide with the symlink. Instead, the directory has been created to match the format used for Flatpak builds, which make it a bit less of a snowflake build, while following accepted conventions.

Given that the preferred path now matches what Flatpak uses, the block handling Flatpak and non-Flatpak is now the same.

If `$XDG_RUNTIME_DIR` is undefined, the temporary directory is used, though reading the socket from this location is discouraged.

Closes: https://github.com/keepassxreboot/keepassxc/issues/8018
References: https://github.com/keepassxreboot/keepassxc/discussions/6741
2022-09-22 06:49:07 -04:00
Jonathan White
c4f625a3d1 cmake: emit warning if X11_Xi or X11_XTest not found
at least on Debian, a bullseye installation, the X11 development files
may be installed without the libxi-dev or the libxtest-dev packages.
this leads to the autotype shared library libkeepassxc-autotype-xcb.so
not being built without any complaint from cmake.

this commit makes cmake emit warning messages that shall hint anyone
building themselves that autotype will not work without these libs.

cmake: make libxi and libxtst a requirement with autotype enabled
2022-09-22 06:49:07 -04:00
Jonathan White
d954519e10 Fix crash when trying to close database during unlock
* Fix #7239 - prevent closing the database widget if the open dialog is still unlocking the database. This problem became slightly worse with quick unlock.

With this fix, if the user tries to close the database during unlock we will just ignore that request.
2022-09-22 06:49:07 -04:00
varjolintu
f0a7c636a4 Browser: Add a new group setting for omitting WWW subdomain when matching URLs 2022-09-22 06:49:07 -04:00
JakobDev
bfeb75c900 Add vcs-browser and contribute URLs to Appdata 2022-09-22 06:49:07 -04:00
varjolintu
19bd6069d7 Emit database changed event on single db lock 2022-09-22 06:49:07 -04:00
J J Chiarella
60d4e06531 Update eff_large.wordlist
1. Replaces words removed by pull 6914 <23b9e35de9> for possible offense. This restores the total word count.

Add replacement: grope -> . . . -> grouch

Change: hardcopy -> hardcopy -> hardback

Replace: hardcore -> . . . -> hardball

(I couldn't see "hardcopy" as a single word in American dictionaries from the turn of the century. It's too much of a neologism [and if we can't have "hardcore," then there's nothing else I can fit in that gap]. I had to remove another word to allow the addition of two new words here to preserve ordering. It's also an improvement because "hardcopy" is not a single word in dictionaries older than a decade or so.)

Add replacement: swinger -> . . . -> swindle

2. Yo-yo and yoyo are two spelling of the same exact word, and the latter spelling is "non-standard."

Keeping: yo-yo (t-shirt is the one other hyphenated word and I can't find a suitable candidate for either without creating several conflicts on the long wordlist)

Change: yoyo -> young

3.  Word repetition: two spellings of same word hankie.

Keeping: hankie (as the "correct" spelling because "hanky" is more common in "hanky-panky").

Change: hanky -> hanoi

(The other option was to insert "hansom" between "hanky" and "haphazard," but "handsome" is a homophone because the "d" became silent many years ago.)

4. Changed proper nouns and brand names to regular nouns:

dropbox -> dropforge

ebay -> eaves

google -> goosey as in "loosey-goosey" (the real word is "googol," anyhow)

This necessitated changing goon -> gooseneck

ipad -> iota

iphone -> ire

ipod -> iridium

This necessitated irate -> iris

kleenex -> knack (the word "tissue" exists)

lego -> legitimate

xbox -> xenon (which sounds like x box or x-box, too)

Keeping: xerox (now genericized like aspirin)

5. Replaced non-standard words around "drop" and the brand name in there

drop-down -> drop-in

ebook -> (genericized like "email")

ecard -> echelon

This necessitated eccentric -> echidna

harddisk -> hardedge (Hardedge is an art style. Hard disk is always two words or else is abbreviated as HDD for hard disk drive)

6. Replaced flirtatious activity

footsie -> footstool

Which necessitated making footsore -> footway

7. Potentially sensitive anatomy

gonad -> golly

siamese -> sial (Siamese = Thai, but "twins" is also on the list and "Siamese" could precede "twins," which is slur for conjoined twins.)

8. Politically sensitive

islamist -> island (An Islamist is someone who wants to enforce political Islam on all with a literal and conservative interpretation of the Qu'ran. It does not mean Muslim.)

marxism ->  marzipan (I'm a big old lefty, myself, but I need to be consistent)

********

These necessitated a couple changes to nearby words where a drop-in replacement word did not exist, which required shifting neighboring words slightly.

Alphabetical order preserved and total word count should match EFF's modified and the original Diceware list. No breaking changes.
2022-09-22 06:49:07 -04:00
Felix Stupp
9150febd02 Add methods isHardwareKeySupported and refreshHardwareKeys to DBus 2022-09-22 06:49:07 -04:00
Jonathan White
d8d5ddcab6 Auto-Type: PICKCHARS can specify attribute and ignore BEEP
* Fix #7726 - Ignore BEEP Auto-Type token when it includes spaces and numbers as well
* Close #8103 - Allow specifying specific attribute to use with PICKCHARS. If none specified, it defaults to Password.
2022-09-22 06:49:07 -04:00
Jonathan White
8190b20efe Improve entry preview panel
* Fix #7811 - Notes height no longer truncated
* Fix #7949 - Improve copying attribute value to clipboard in entry preview
* Fix #7898 - Prevent copying url when copy password selected after clicking url in preview pane
* Fix #7982 - Double clicking hidden attributes in preview pane copies the value instead of ●●●●●●
2022-09-22 06:49:07 -04:00
Michael Ziminsky (Z)
989348bbfb Fix autotype menu entries on Windows 2022-09-22 06:49:07 -04:00
Patrick Sean Klein
679b93b601 Correct regex escape logic
* Fixes #7776

Implement QRegularExpression::escape within Tools::convertToRegex to allow usage on older Qt versions.

Also wrap EXACT_MODIFIER patterns in a non-capture group to prevent misinterpreted regex.
2022-09-22 06:49:07 -04:00
varjolintu
d1d191e2b0 Pass database locked/unlocked status even with Search All Databases option enabled 2022-09-22 06:49:07 -04:00
Jonathan White
6f619271c4 Fix Auto-Type gui guard for tests
Prevent showing gui error dialogs when no gui is present. This can occur during auto-type tests.
2022-09-22 06:49:07 -04:00
Jonathan White
3163547096 Fix use of modifiers under macOS
* Fix #6463
2022-09-22 06:49:07 -04:00
Jonathan White
6da7188ecf Fix file dialog not appearing on snap build
Fix #7607 - Don't disable core dumps when building for snap distribution. Doing so will not allow the xdg-desktop-portal from opening the file dialog. This is because the portal attempts to call entries from /proc/[pid]/xxxx which are restricted to root when core dumps are disabled.
2022-09-22 06:49:07 -04:00
Toni Spets
35285d72bb docs: Explicitly talk about SSH Agent integration
There's possible confusion that KeePassXC provides its own agent
the way it's worded. Always explicitly talk about integration to
make it more clear.
2022-09-22 06:49:07 -04:00
Aetf
07755c324a FdoSecrets: add smarter handling of database unlock requests
This commit implements the following logic:
* If there're already unlocked collections, just use those,
* otherwise, show the unlock dialog until there's an unlocked and exposed collection.

* Fixes #7574
2022-09-22 06:49:07 -04:00
Aetf
8711d31f24 FdoSecrets: ask to unlock the database when creating items
Also only emit databaseUnlockFinished after the database is unlocked

Fix #7989
2022-09-22 06:49:07 -04:00
Patrick Sean Klein
a3c24b4bbc Add database backup path documentation. 2022-09-22 06:49:07 -04:00
SnipFoo
4d20cb1654 Add config variable for specifying a default file name for the database 2022-09-22 06:49:07 -04:00
J.M. Dana
7e8a672de4 Add password strength indicator to PasswordEditWidget
Fixes #7437 (entry edit view only)
Fixes #5220
2022-09-22 06:49:07 -04:00
Aetf
107dcae26c FdoSecrets: skip entries in recycle bin when searching (fix #7933) 2022-09-22 06:49:07 -04:00
Jonathan White
121d54c96a Fix transient errors in GUI tests
* Fix saving file errors due to atomic saves on Windows
* Fix tests that rely on clicking a list index that is out of view
2022-09-22 06:49:07 -04:00
Patrick Sean Klein
6f28b5e2ba Limit zxcvbn entropy estimation length
Limit the use of zxcvbn based password entropy estimation to 256 bytes. After this threshold, the average per-byte entropy from the zxcvbn calculation is added for each additional byte. In practice, this produces a slightly higher entropy calculation for purely randomized passwords than zxcvbn would normally calculate. However, the time to calculate is capped leading to a much better user experience and removing unnecessary calculations.

Fixes #7712
2022-09-22 06:49:07 -04:00
Jérôme Augé
dca70f809d Fix capture of whiptail's exit status
The exit status of `whiptail` was masked by the subsequent call to
`clear`.

This correct the capture of whiptail's exit status so that pressing the
`[Cancel]` button can be correctly detected by the script.

Fixes #7830
2022-09-22 06:49:07 -04:00
Piraty
750a3383ca Link ykcore against pthread (#7807) 2022-09-22 06:49:07 -04:00
hka
dda70e1453 Normalize path (slashes to be precise) when opening a database or saving the last used database paths (#7864)
Fixes #7821
2022-09-22 06:49:07 -04:00
407 changed files with 4947 additions and 8398 deletions

View File

@@ -81,7 +81,7 @@ SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: c++17
Standard: Cpp11
TabWidth: 4
UseTab: Never
...

View File

@@ -38,7 +38,7 @@ We will accept contributions of good code that we can use from anyone.
- “contributions”: This means just about anything you wish to contribute to the project, as long as it is good code we can use. The easier you make it for us to accept your contribution, the happier we are, but if its good enough, we will do a reasonable amount of work to use it.
- “of good code”: This means that we will accept contributions that work well and efficiently, that fit in with the goals of the project, that match the projects coding style, and that do not impose an undue maintenance workload on us going forward. This does not mean just program code, either, but documentation and artistic works as appropriate to the project.
- “that we can use”: This means that your contribution must be given freely and irrevocably, that you must have the right to contribute it for our unrestricted use, and that your contribution is made under a license that is compatible with the license the project has chosen and that permits us to include, distribute, and modify your work without restriction.
- “from anyone”: This means exactly that. We dont care about anything but your code. We dont care about your race, religion, national origin, biological gender, perceived gender, sexual orientation, lifestyle, political viewpoint, or anything extraneous like that. We will neither reject your contribution nor grant it preferential treatment on any basis except the code itself. We do, however, reserve the right to limit your access to our community if you violate our [Code of Conduct](../CODE-OF-CONDUCT.md).
- “from anyone”: This means exactly that. We dont care about anything but your code. We dont care about your race, religion, national origin, biological gender, perceived gender, sexual orientation, lifestyle, political viewpoint, or anything extraneous like that. We will neither reject your contribution nor grant it preferential treatment on any basis except the code itself. We do, however, reserve the right to tell you to go away if you behave too obnoxiously toward us.
#### If Your Contribution Is Rejected

39
.github/ISSUE_TEMPLATE/bug-report.md vendored Normal file
View File

@@ -0,0 +1,39 @@
---
name: Bug Report
about: provide information about a problem
title:
labels: bug
assignees: ''
---
## Overview
[TIP]: # ( DO NOT include screenshots of your actual database! )
[NOTE]: # ( Give a BRIEF summary about your problem )
## Steps to Reproduce
[NOTE]: # ( Provide a simple set of steps to reproduce this bug. )
1.
2.
3.
## Expected Behavior
[NOTE]: # ( Tell us what you expected to happen )
## Actual Behavior
[NOTE]: # ( Tell us what actually happens )
## Context
[NOTE]: # ( Give us any additional information you may have. )
[NOTE]: # ( Paste debug info from Help → About here )
KeePassXC - VERSION
Revision: REVISION
[NOTE]: # ( Pick choices based on your environment )
Operating System: Windows/Linux/macOS
Desktop Env: Gnome/KDE/XFCE/Mate/Cinnamon
Windowing System: X11/Wayland

View File

@@ -1,83 +0,0 @@
name: Bug Report
description: Provide information about a problem you are experiencing.
type: Bug
body:
- type: checkboxes
attributes:
label: Have you searched for an existing issue?
description: |
Use the issue search box to see if one already exists for the bug you encountered.
Also take a moment to review our pinned issues.
options:
- label: Yes, I tried searching and reviewed the pinned issues
required: true
- type: textarea
id: summary
attributes:
label: Brief Summary
description: |
Provide an overview of the problem, include any information that may help us triage this issue.
Provide screenshots if possible, but do NOT show sensitive data (use View -> Allow Screen Capture).
validations:
required: true
- type: textarea
id: steps
attributes:
label: Steps to Reproduce
description: Provide a simple set of steps to reproduce this bug.
placeholder: |
1.
2.
3.
validations:
required: true
- type: textarea
id: expected_vs_actual
attributes:
label: Expected Versus Actual Behavior
description: Tell us what you expected to happen and what actually happened.
- type: textarea
id: debug_info
attributes:
label: KeePassXC Debug Information
placeholder: "Paste the output of: Help -> About -> Debug Info"
render: Text
- type: dropdown
id: os
attributes:
label: Operating System
description: Select your operating system.
options:
- Windows
- Linux
- macOS
- Other (BSD, Haiku, etc)
- type: dropdown
id: desktop_env
attributes:
label: Linux Desktop Environment
description: If on Linux, please select your desktop environment.
options:
- Gnome
- KDE
- XFCE
- Mate / Cinnamon
- Sway
- i3
- Other
- type: dropdown
id: window_system
attributes:
label: Linux Windowing System
description: If on Linux, please select your windowing system.
options:
- X11
- Wayland

View File

@@ -0,0 +1,19 @@
---
name: Feature Request
about: tell us about a new feature you want
title:
labels: new feature
assignees: ''
---
## Summary
[TIP]: # ( DO NOT include screenshots of your actual database! )
[NOTE]: # ( Provide a brief overview of what the new feature is all about )
## Examples
[NOTE]: # ( Show us a picture or mock-up of your proposal )
## Context
[NOTE]: # ( Why does this feature matter to you? What unique circumstances do you have? )

View File

@@ -1,34 +0,0 @@
name: Feature Request
description: Tell us about a new feature you want.
type: Feature
body:
- type: checkboxes
attributes:
label: Have you searched for an existing feature request?
description: Use the issue search box to see if one already exists for the feature you want.
options:
- label: Yes, I tried searching
required: true
- type: textarea
id: summary
attributes:
label: Brief Summary
description: |
Provide an overview of the feature you are interested in adding.
Provide screenshots if possible, but do NOT show sensitive data (use View -> Allow Screen Capture).
validations:
required: true
- type: textarea
id: example
attributes:
label: Example
description: Provide an example of how this feature would be used.
- type: textarea
id: context
attributes:
label: Context
description: Why does this feature matter to you? What unique circumstances do you have?

View File

@@ -1,85 +0,0 @@
name: Pre-Release Bug Report
description: Report an issue with pre-release code (e.g. snapshot builds).
type: Bug
labels: PRE-RELEASE BUG
assignees: droidmonkey
body:
- type: checkboxes
attributes:
label: Have you searched for an existing issue?
description: |
Use the issue search box to see if one already exists for the bug you encountered.
Also take a moment to review our pinned issues.
options:
- label: Yes, I tried searching and reviewed the pinned issues
required: true
- type: textarea
id: summary
attributes:
label: Brief Summary
description: |
Provide an overview of the problem, include any information that may help us triage this issue.
Provide screenshots if possible, but do NOT show sensitive data (use View -> Allow Screen Capture).
validations:
required: true
- type: textarea
id: steps
attributes:
label: Steps to Reproduce
description: Provide a simple set of steps to reproduce this bug.
placeholder: |
1.
2.
3.
validations:
required: true
- type: textarea
id: expected_vs_actual
attributes:
label: Expected Versus Actual Behavior
description: Tell us what you expected to happen and what actually happened.
- type: textarea
id: debug_info
attributes:
label: KeePassXC Debug Information
placeholder: "Paste the output of: Help -> About -> Debug Info"
render: Text
- type: dropdown
id: os
attributes:
label: Operating System
description: Select your operating system.
options:
- Windows
- Linux
- macOS
- Other (BSD, Haiku, etc)
- type: dropdown
id: desktop_env
attributes:
label: Linux Desktop Environment
description: If on Linux, please select your desktop environment.
options:
- Gnome
- KDE
- XFCE
- Mate / Cinnamon
- Sway
- i3
- Other
- type: dropdown
id: window_system
attributes:
label: Linux Windowing System
description: If on Linux, please select your windowing system.
options:
- X11
- Wayland

View File

@@ -0,0 +1,39 @@
---
name: Release Preview Bug report
about: report a bug with a release preview (e.g., 2.6.0-beta1)
title:
labels: PRE-RELEASE BUG
assignees: droidmonkey
---
## Overview
[TIP]: # ( DO NOT include screenshots of your actual database! )
[NOTE]: # ( Give a BRIEF summary about your problem )
## Steps to Reproduce
[NOTE]: # ( Provide a simple set of steps to reproduce this bug. )
1.
2.
3.
## Expected Behavior
[NOTE]: # ( Tell us what you expected to happen )
## Actual Behavior
[NOTE]: # ( Tell us what actually happens )
## Context
[NOTE]: # ( Give us any additional information you may have. )
[NOTE]: # ( Paste debug info from Help → About here )
KeePassXC - VERSION
Revision: REVISION
[NOTE]: # ( Pick choices based on your environment )
Operating System: Windows/Linux/macOS
Desktop Env: Gnome/KDE/XFCE/Mate/Cinnamon
Windowing System: X11/Wayland

View File

@@ -1,15 +1,15 @@
[NOTE]: # ( Describe your changes in detail, why is this change required? )
[NOTE]: # ( Explain large or complex code modifications. )
[NOTE]: # ( If it fixes an open issue, please add "Fixes #XXX". )
[NOTE]: # ( If it fixes an open issue, please add "Fixes #XXX" )
## Screenshots
[NOTE]: # ( Do not include screenshots of your actual database! )
[TIP]: # ( Use View -> Allow Screen Capture )
[TIP]: # ( Do not include screenshots of your actual database! )
## Testing strategy
[NOTE]: # ( Please describe in detail how you tested your changes. )
[TIP]: # ( We expect new code to be covered by unit tests and include helpful comments. )
[TIP]: # ( We expect new code to be covered by unit tests and documented with doc blocks! )
## Type of change

1
.gitignore vendored
View File

@@ -24,7 +24,6 @@ desktop.ini
# MSVC Files
CMakeSettings.json
CMakePresets.json
CMakeUserPresets.json
.vs/
out/

View File

@@ -1,19 +1,17 @@
[main]
host = https://www.transifex.com
host = https://app.transifex.com
[o:keepassxc:p:keepassxc:r:share-translations-keepassxc-en-ts--develop]
file_filter = share/translations/keepassxc_<lang>.ts
source_file = share/translations/keepassxc_en.ts
source_lang = en
type = QT
replace_edited_strings = false
keep_translations = false
file_filter = share/translations/keepassxc_<lang>.ts
source_file = share/translations/keepassxc_en.ts
type = QT
minimum_perc = 0
resource_name = keepassxc_en.ts (develop)
[o:keepassxc:p:keepassxc:r:share-translations-keepassxc-en-ts--master]
file_filter = share/translations/keepassxc_<lang>.ts
source_file = share/translations/keepassxc_en.ts
source_lang = en
type = QT
replace_edited_strings = false
keep_translations = false
file_filter = share/translations/keepassxc_<lang>.ts
source_file = share/translations/keepassxc_en.ts
type = QT
minimum_perc = 0
resource_name = keepassxc_en.ts (2.7.x stable)

View File

@@ -1,8 +1,5 @@
# Changelog
## 2.8.0 (Pending)
* Placeholder for future release notes
## 2.7.10 (2025-03-02)
### Changes

View File

@@ -120,8 +120,8 @@ if(UNIX AND NOT APPLE AND NOT WITH_XC_X11)
endif()
set(KEEPASSXC_VERSION_MAJOR "2")
set(KEEPASSXC_VERSION_MINOR "8")
set(KEEPASSXC_VERSION_PATCH "0")
set(KEEPASSXC_VERSION_MINOR "7")
set(KEEPASSXC_VERSION_PATCH "10")
set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION_MAJOR}.${KEEPASSXC_VERSION_MINOR}.${KEEPASSXC_VERSION_PATCH}")
set(OVERRIDE_VERSION "" CACHE STRING "Override the KeePassXC Version for Snapshot builds")
@@ -310,7 +310,7 @@ if(CMAKE_BUILD_TYPE_LOWER STREQUAL "debug")
check_add_gcc_compiler_flag("-Wshadow-compatible-local")
check_add_gcc_compiler_flag("-Wshadow-local")
add_gcc_compiler_flags("-Werror")
# This is needed since compiling against Botan3 requires compiling against C++20
# This is needed since compiling aginst Botan3 requires compiling against C++20
if(WITH_XC_BOTAN3)
add_gcc_compiler_cxxflags("-Wno-error=deprecated-enum-enum-conversion -Wno-error=deprecated")
endif()
@@ -512,8 +512,14 @@ else()
find_package(Qt5 COMPONENTS ${QT_COMPONENTS} REQUIRED)
endif()
if(Qt5Core_VERSION VERSION_LESS "5.2.0")
message(FATAL_ERROR "Qt version 5.2.0 or higher is required")
endif()
# CBOR for Passkeys requires Qt 5.12
if(Qt5Core_VERSION VERSION_LESS "5.12.0")
message(FATAL_ERROR "Qt version 5.12.0 or higher is required")
message(STATUS "Qt version 5.12.0 or higher is required for Passkeys support")
set(WITH_XC_BROWSER_PASSKEYS OFF)
endif()
get_filename_component(Qt5_PREFIX ${Qt5_DIR}/../../.. REALPATH)

View File

@@ -207,7 +207,6 @@ Files: share/icons/application/scalable/actions/application-exit.svg
share/icons/application/scalable/actions/password-show-on.svg
share/icons/application/scalable/actions/qrcode.svg
share/icons/application/scalable/actions/refresh.svg
share/icons/application/scalable/actions/remote-sync.svg
share/icons/application/scalable/actions/reports.svg
share/icons/application/scalable/actions/reports-exclude.svg
share/icons/application/scalable/actions/sort-alphabetical-ascending.svg

View File

@@ -67,9 +67,9 @@ Note: These steps place the compiled KeePassXC binary inside the `./build/src/`
## MacOS Build Notes
If you installed Qt@5 via Homebrew and CMake fails to find your Qt installation, you can specify it manually by adding the following parameter:
If you installed Qt5 via Homebrew and CMake fails to find your Qt installation, you can specify it manually by adding the following parameter:
`-DCMAKE_PREFIX_PATH=$(brew --prefix qt@5)/lib/cmake`
`-DCMAKE_PREFIX_PATH=$(brew --prefix qt5)/lib/cmake`
When building with ASAN support on macOS, you need to use `export ASAN_OPTIONS=detect_leaks=0` before running the tests (LSAN is no supported on macOS).

View File

@@ -1,46 +0,0 @@
### Reporting Security Issues
The KeePassXC team takes security vulnerabilities very seriously and appreciates your responsible disclosure efforts. We will make every effort to acknowledge your contributions and handle them promptly.
To report a security issue, please use one of the following methods:
- **GitHub Security Advisory:** Use the ["Report a Vulnerability"](https://github.com/keepassxreboot/keepassxc/security/advisories/new) tab on our GitHub repository.
- **Private Matrix Message:** Contact any of the following KeePassXC team members privately (also encrypted):
- [@droidmonkey_kpxc](https://matrix.to/#/@droidmonkey_kpxc:matrix.org)
- [@varjolintu](https://matrix.to/#/@varjolintu:matrix.org)
- [@phoerious](https://matrix.to/#/@phoerious:matrix.org)
- **Send an Email:** Send your report to team@keepassxc.org. We recommend encrypting the email if possible.
Please **DO NOT** use public channels (e.g., GitHub issues, Matrix chat channels) for initial reporting of bona fide security vulnerabilities.
Once you report a security issue, our team will respond with the next steps. After our initial reply, we will keep you informed of the progress towards a fix and full announcement. We may ask for additional information or guidance during this process. If we disagree that your report constitutes a genuine security vulnerability, we will inform you and close the report. Your report may be turned into an issue for further tracking.
If you discover vulnerabilities in third-party modules used by KeePassXC, please report them to the maintainers of the respective modules. If the vulnerability impacts KeePassXC directly, we encourage you to notify us using the above methods. We will validate if the vulnerability is exploitable from KeePassXC code; please note that not all vulnerabilities are actually exploitable and do not constitute an immediate concern for the KeePassXC application.
### Example Security Vulnerabilities
When reporting, please ensure the issue falls under what can be considered a genuine security vulnerability for KeePassXC. Some examples include:
- Unauthorized access to sensitive user data (e.g., passwords).
- Remote code execution or escalation of privileges.
- Bypassing authentication or encryption mechanisms.
- Broken or improperly implemented encryption methods.
### Counter Examples
The following issues are **not** considered security vulnerabilities:
- Bugs caused by locally modifying the application (e.g., injecting DLLs, altering code).
- Crashes or misbehavior resulting from normal use (report this as a normal issue).
- Vulnerabilities found in third-party modules (should be reported to the modules maintainers).
### CVE Reporting Policy
Please **DO NOT** submit a report to a Common Vulnerabilities and Exposures (CVE) Numbering Authority (CNA) before confirming the security vulnerability with the KeePassXC team. If we do not respond to your report within 30 days, this restriction no longer applies.
### Other Communication
For other inquiries (e.g., developer questions, user questions), please use the public channels on Matrix:
- **User's Channel:** [#keepassxc:mozilla.org](https://matrix.to/#/#keepassxc:mozilla.org)
- **Developer's Channel:** [#keepassxc-dev:mozilla.org](https://matrix.to/#/#keepassxc-dev:mozilla.org)

View File

@@ -17,7 +17,7 @@ set(EXCLUDED_DIRS
# third-party directories
src/thirdparty
# objective-c directories
src/quickunlock/touchid
src/touchid
src/autotype/mac
src/gui/osutils/macutils)

View File

@@ -1,5 +1,5 @@
# Running macdeployqt on a POST_BUILD copied binaries is pointless when using CPack because
# the copied binaries will be overridden by the corresponding install(TARGETS) commands.
# the copied binaries will be overriden by the corresponding install(TARGETS) commands.
# That's why we run macdeployqt using install(CODE) on the already installed binaries.
# The precondition is that all install(TARGETS) calls have to be called before this function is
# called.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

View File

@@ -52,12 +52,11 @@ It provides the ability to query and modify the entries of a KeePass database, d
Removes the named attachment from an entry.
*clip* [_options_] <__database__> <__entry__> [_timeout_]::
Copies an attribute, current TOTP value, UUID, or tags list 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 multiple entries with the same name exist in different groups, only the attribute for the first one is copied.
For copying the attribute of an entry in a specific group, the group path to the entry should be specified as well, instead of just the name.
Optionally, a timeout in seconds can be specified to automatically clear the clipboard, the default timeout is 10 seconds, set to 0 to disable.
Note: an error will be thrown if you specify multiple options at once (eg, *--uuid* and *-a*).
*close*::
In interactive mode, closes the currently opened database (see *open*).
@@ -144,8 +143,8 @@ It provides the ability to query and modify the entries of a KeePass database, d
Searches all entries that match a specific search term in a database.
*show* [_options_] <__database__> <__entry__>::
Shows the title, username, password, URL and notes of a database entry by default.
Can also show the current TOTP, entry UUID, and tags list.
Shows the title, username, password, URL and notes of a database entry.
Can also show the current TOTP.
Regarding the occurrence of multiple entries with the same name in different groups, everything stated in the *clip* command section also applies here.
== OPTIONS
@@ -236,12 +235,6 @@ The same password generation options as documented for the generate command can
Copies the current TOTP instead of the specified attribute to the clipboard.
Will report an error if no TOTP is configured for the entry.
*--uuid*::
Copies the UUID of the entry to the clipboard.
*--tags*::
Copies the tags of the entry to the clipboard.
*-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.
@@ -269,6 +262,7 @@ The same password generation options as documented for the generate command can
*-a*, *--attributes* <__attribute__>...::
Shows the named attributes.
This option can be specified more than once, with each attribute shown one-per-line in the given order.
If no attributes are specified and *-t* is not specified, a summary of the default attributes is given.
Protected attributes will be displayed in clear text if specified explicitly by this option.
*--all*::
@@ -281,13 +275,7 @@ The same password generation options as documented for the generate command can
Shows the attachment names along with the size of the attachments.
*-t*, *--totp*::
Shows the current TOTP and then exits. An error is thrown if no TOTP is configured for the entry.
*--uuid*::
Shows the UUID of the entry.
*--tags*::
Shows the tag list of the entry.
Also shows the current TOTP, reporting an error if no TOTP is configured for the entry.
=== Diceware options
*-W*, *--words* <__count__>::

View File

@@ -28,35 +28,26 @@ keepassxc - a modern open-source password manager
*keepassxc* [_options_] [_filename(s)_]
== DESCRIPTION
*KeePassXC* is a free/open-source password manager or safe which helps you to manage your passwords securely.
The complete database is always encrypted with the industry-standard AES (also known as Rijndael) encryption algorithm using a 256-bit key.
*KeePassXC* is a free/open-source password manager or safe which helps you to manage your passwords in a secure way.
The complete database is always encrypted with the industry-standard AES (alias Rijndael) encryption algorithm using a 256 bit key.
KeePassXC uses a database format that is compatible with KeePass Password Safe.
Your database works offline and requires no internet connection.
Your wallet works offline and requires no Internet connection.
== OPTIONS
*-h*, *--help*::
Displays this help.
*--help-all*::
Displays help including Qt specific options.
*-v*, *--version*::
Displays version information.
*--config* <__config__>::
Path to a custom config file.
*--localconfig* <__localconfig__>::
Path to a custom local config file.
*--lock*::
Locks all open databases.
*--keyfile* <__keyfile__>::
Key file of the database.
*--pw-stdin*::
Reads password of the database from stdin.
Read password of the database from stdin.
*--minimized*::
Starts KeePassXC minimized to the system tray.

View File

@@ -1,201 +1,201 @@
= KeePassXC Browser Plugin
include::.sharedheader[]
:imagesdir: ../images
// tag::content[]
== Browser Integration
The KeePassXC-Browser extension is installed within your web browser so that you can automatically pull usernames and passwords from KeePassXC and populate them directly into website fields. It is a very useful and secure extension that enhances your productivity while using KeePassXC. With this extension, you do not need to manually copy the data from your KeePassXC database and paste it into the website fields.
The KeePassXC-Browser extension is available on the following web browsers:
* Google Chrome, Vivaldi, and Brave
* Mozilla Firefox and Tor-Browser
* Microsoft Edge
* Chromium
NOTE: On Linux, Flatpak and Snap based browsers are generally not supported. Ubuntu's Firefox Snap is currently the only known exception.
=== Install the Browser Extension
You can download the KeePassXC-Browser extension from your web browser. To download the KeePassXC-Browser extension, perform the following steps:
1. Click the link corresponding to your browser:
* https://chromewebstore.google.com/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk[Chrome, Chromium, Vivaldi, and Brave]
* https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser[Mozilla Firefox and Tor-Browser]
* https://microsoftedge.microsoft.com/addons/detail/keepassxcbrowser/pdffhmdngciaglkoonimfcmckehcpafo[Microsoft Edge]
2. Click the button to install/add the extension to the browser. Accept any confirmation dialogs.
TIP: For the most up-to-date troubleshooting advice on all platforms, please read our https://github.com/keepassxreboot/keepassxc-browser/wiki/Troubleshooting-guide[Troubleshooting Guide].
// 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
To start using KeePassXC-Browser, you must configure it so that it can communicate with the KeePassXC application on your desktop.
To configure KeePassXC-Browser, perform the following steps:
1. Open the KeePassXC application on your desktop and navigate to Tools > Settings.
2. Click the Browser Integration option on the left-hand side *(1)*. The following screen appears:
+
.Browser Settings
image::browser_settings.png[]
3. Click the _Enable browser integration_ checkbox *(2)*. Then select the browsers for which you have downloaded the KeePassXC-Browser extension *(3)* and click *OK*.
4. Ensure your database is unlocked, then open (or restart) your browser.
5. Click the KeePassXC-Browser extension icon *(A)* in your browser (see figure below). A pop-up window appears.
+
.Connect Extension to KeePassXC
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.
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.
+
.Extension Association Dialog
image::browser_extension_association.png[,80%]
WARNING: If you reuse a connection name in a database, the previous browser connection will be overwritten and prevent access.
=== Using the Browser Extension
The KeePassXC-Browser extension lets you automatically populate the entries from your KeePassXC database into the fields on websites you visit. To do so, perform the following steps:
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.
+
*(A)* KeePassXC is not running or is disconnected. +
*(B)* KeePassXC is running, but KeePassXC Browser Extension is not connected to the current database. +
*\(C)* Connected to KeePassXC, but database is locked. +
*(D)* Connected to KeePassXC and ready to use. If the icon is shown with a number, it indicates the number of credentials found for the current site.
+
.Extension Icon States
image::browser_extension_icons.png[,70%]
3. If the KeePassXC desktop application is not connected with the KeePassXC-Browser extension, click the extension icon in your web browser and click _Reload_ from the pop-up window as shown in the following screen.
+
.Reload Extension Connection
image::browser_extension_reload.png[,80%]
4. Open the URL for which you want to use with your database. If you have previously created an entry in your database then the KeePassXC-Browser Confirm Access dialog may appear:
+
.Confirm Access Dialog
image::browser_confirm_access_dialog.png[,80%]
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.
+
.Fill Credentials
image::browser_fill_credentials.png[,80%]
=== Generate Passwords
The KeePassXC-Browser Extension also lets you generate passwords directly in your browser.
This feature can be used for websites with existing credentials as well as for new websites.
You can then choose to update/add the credentials to your KeePassXC database directly from the Browser.
1. Ensure your database is unlocked and configured to use the Browser extension as shown above.
2. Right click on a password field and from the KeePassXC sub-menu choose _Show Password Generator_. The standard KeePassXC password generator will appear.
3. Configure the password generation options and click _Apply Password_ when done. The generated password will be filled into the previously selected field.
4. When you have successfully submitted the password on the website, a popup will appear asking you to either update an existing entry or add a new one.
// tag::advanced[]
=== Browser statistics
You can see a cross-section of all browser-related settings applied to entries within a database through the Browser Statistics report. To access these, use the _Database_ -> _Database reports..._ menu option then click on _Browser Statistics_ on the left-hand menu. From here you can see all entries with URLs applied to them, explicitly allowed and denied URLs, and any entries with custom browser settings.
.Browser statistics
image::browser_statistics.png[]
=== Advanced Usage
You can configure unique browser integration behavior for each entry. This allows you to add multiple URLs to an entry, hide an entry from the browser integration, and more. To access these settings, open an entry for editing then click on _Browser Integration_ option in the left-hand menu *(1)*.
After opening the settings you can add any number of additional URLs by clicking the _Add_ button *(2)* and typing the URL in the list to the left *(3)*.
Additional URLs also supports wildcards (with KeePassXC 2.7.10 and later). You can use URLs like:
----
https://*.example.com
https://example.com/*/path
https://sub.*.example.com/path/*
----
.Entry browser settings
image::browser_entry_settings.png[]
To set options for all entries within a group, edit the group and go to the browser integration section *(1)*. Here you can explicitly disable access to all entries under a group hierarchy to the browser extension. You can set other useful options for groups of entries as well.
.Group browser settings
image::browser_group_settings.png[]
Database-wide operations are available in the database settings. To access these use the _Database_ -> _Database settings..._ menu option. Click on _Browser Integration_ on the left-hand menu. From here you can disconnect all browsers, convert legacy KeePass-HTTP settings, reset all entry-level settings, and refresh the database root group ID (useful when making copies of your database file).
.Database browser settings
image::browser_database_settings.png[]
Finally, advanced application-wide settings are available in the Browser Integration tab of the application settings.
WARNING: We do not recommend changing any of these settings as they may break the browser integration plugin.
.Advanced browser settings
image::browser_advanced_settings.png[]
=== Advanced Setup
==== Custom Browser option
It is possible to enable support for a custom browser (e.g. LibreWolf, WaterFox, Arc, beta and nightly browsers, etc.) using this feature.
This feature is only available for Linux and macOS.
.Custom browser configuration
image::browser_custom_browser_configuration.png[]
The native messaging script file needed for the custom browser depends on the browser type. For Firefox based browsers like Librefox the _Browser type_ must be _Firefox_. For Arc, Opera, etc. the type must be set to _Chromium_.
_Config location_ must have the exact path for the browser's _native-messaging-hosts_ folder. If you are unsure, refer to our https://github.com/keepassxreboot/keepassxc-browser/wiki/Troubleshooting-guide#1-after-enabling-browser-integration-and-support-for-your-browser[Troubleshooting Guide] for listing of the most common paths, and a few ways for finding a path when it's not known.
When a Custom Browser has been successfully set, KeePassXC will automatically write the needed native messaging script file to the folder.
If you wish to support multiple custom browsers, you can copy the native messaging script files manually to the _native-messaging-hosts_ folder from other browsers.
==== 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 (see https://learn.microsoft.com/en-us/deployedge/microsoft-edge-policies#native-messaging[Microsoft Edge Native Messaging Policies] for more information.):
+
----
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"
----
==== Managed Microsoft Edge on macOS
1. Deploy *org.keepassxc.keepassxc_browser_edge.json* to `/Library/Microsoft/Edge/NativeMessagingHosts`.
2. You may need to configure Edge to allowlist the extension and native messaging host. See https://learn.microsoft.com/en-us/deployedge/microsoft-edge-policies#native-messaging[Microsoft Edge Native Messaging Policies] for more information.
// end::advanced[]
// end::content[]
= KeePassXC Browser Plugin
include::.sharedheader[]
:imagesdir: ../images
// tag::content[]
== Browser Integration
The KeePassXC-Browser extension is installed within your web browser so that you can automatically pull usernames and passwords from KeePassXC and populate them directly into website fields. It is a very useful and secure extension that enhances your productivity while using KeePassXC. With this extension, you do not need to manually copy the data from your KeePassXC database and paste it into the website fields.
The KeePassXC-Browser extension is available on the following web browsers:
* Google Chrome, Vivaldi, and Brave
* Mozilla Firefox and Tor-Browser
* Microsoft Edge
* Chromium
NOTE: On Linux, Flatpak and Snap based browsers are generally not supported. Ubuntu's Firefox Snap is currently the only known exception.
=== Install the Browser Extension
You can download the KeePassXC-Browser extension from your web browser. To download the KeePassXC-Browser extension, perform the following steps:
1. Click the link corresponding to your browser:
* https://chromewebstore.google.com/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk[Chrome, Chromium, Vivaldi, and Brave]
* https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser[Mozilla Firefox and Tor-Browser]
* https://microsoftedge.microsoft.com/addons/detail/keepassxcbrowser/pdffhmdngciaglkoonimfcmckehcpafo[Microsoft Edge]
2. Click the button to install/add the extension to the browser. Accept any confirmation dialogs.
TIP: For the most up-to-date troubleshooting advice on all platforms, please read our https://github.com/keepassxreboot/keepassxc-browser/wiki/Troubleshooting-guide[Troubleshooting Guide].
// 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
To start using KeePassXC-Browser, you must configure it so that it can communicate with the KeePassXC application on your desktop.
To configure KeePassXC-Browser, perform the following steps:
1. Open the KeePassXC application on your desktop and navigate to Tools > Settings.
2. Click the Browser Integration option on the left-hand side *(1)*. The following screen appears:
+
.Browser Settings
image::browser_settings.png[]
3. Click the _Enable browser integration_ checkbox *(2)*. Then select the browsers for which you have downloaded the KeePassXC-Browser extension *(3)* and click *OK*.
4. Ensure your database is unlocked, then open (or restart) your browser.
5. Click the KeePassXC-Browser extension icon *(A)* in your browser (see figure below). A pop-up window appears.
+
.Connect Extension to KeePassXC
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.
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.
+
.Extension Association Dialog
image::browser_extension_association.png[,80%]
WARNING: If you reuse a connection name in a database, the previous browser connection will be overwritten and prevent access.
=== Using the Browser Extension
The KeePassXC-Browser extension lets you automatically populate the entries from your KeePassXC database into the fields on websites you visit. To do so, perform the following steps:
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.
+
*(A)* KeePassXC is not running or is disconnected. +
*(B)* KeePassXC is running, but KeePassXC Browser Extension is not connected to the current database. +
*\(C)* Connected to KeePassXC, but database is locked. +
*(D)* Connected to KeePassXC and ready to use. If the icon is shown with a number, it indicates the number of credentials found for the current site.
+
.Extension Icon States
image::browser_extension_icons.png[,70%]
3. If the KeePassXC desktop application is not connected with the KeePassXC-Browser extension, click the extension icon in your web browser and click _Reload_ from the pop-up window as shown in the following screen.
+
.Reload Extension Connection
image::browser_extension_reload.png[,80%]
4. Open the URL for which you want to use with your database. If you have previously created an entry in your database then the KeePassXC-Browser Confirm Access dialog may appear:
+
.Confirm Access Dialog
image::browser_confirm_access_dialog.png[,80%]
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.
+
.Fill Credentials
image::browser_fill_credentials.png[,80%]
=== Generate Passwords
The KeePassXC-Browser Extension also lets you generate passwords directly in your browser.
This feature can be used for websites with existing credentials as well as for new websites.
You can then choose to update/add the credentials to your KeePassXC database directly from the Browser.
1. Ensure your database is unlocked and configured to use the Browser extension as shown above.
2. Right click on a password field and from the KeePassXC sub-menu choose _Show Password Generater_. The standard KeePassXC password generator will appear.
3. Configure the password generation options and click _Apply Password_ when done. The generated password will be filled into the previously selected field.
4. When you have succussfully submitted the password on the website, a popup will appear asking you to either udpate an existing entry or add a new one.
// tag::advanced[]
=== Browser statistics
You can see a cross-section of all browser-related settings applied to entries within a database through the Browser Statistics report. To access these, use the _Database_ -> _Database reports..._ menu option then click on _Browser Statistics_ on the left-hand menu. From here you can see all entries with URLs applied to them, explicitly allowed and denied URLs, and any entries with custom browser settings.
.Browser statistics
image::browser_statistics.png[]
=== Advanced Usage
You can configure unique browser integration behavior for each entry. This allows you to add multiple URLs to an entry, hide an entry from the browser integration, and more. To access these settings, open an entry for editing then click on _Browser Integration_ option in the left-hand menu *(1)*.
After opening the settings you can add any number of additional URLs by clicking the _Add_ button *(2)* and typing the URL in the list to the left *(3)*.
Additional URLs also supports wildcards (with KeePassXC 2.7.10 and later). You can use URLs like:
----
https://*.example.com
https://example.com/*/path
https://sub.*.example.com/path/*
----
.Entry browser settings
image::browser_entry_settings.png[]
To set options for all entries within a group, edit the group and go to the browser integration section *(1)*. Here you can explicitly disable access to all entries under a group hierarchy to the browser extension. You can set other useful options for groups of entries as well.
.Group browser settings
image::browser_group_settings.png[]
Database-wide operations are available in the database settings. To access these use the _Database_ -> _Database settings..._ menu option. Click on _Browser Integration_ on the left-hand menu. From here you can disconnect all browsers, convert legacy KeePass-HTTP settings, reset all entry-level settings, and refresh the database root group ID (useful when making copies of your database file).
.Database browser settings
image::browser_database_settings.png[]
Finally, advanced application-wide settings are available in the Browser Integration tab of the application settings.
WARNING: We do not recommend changing any of these settings as they may break the browser integration plugin.
.Advanced browser settings
image::browser_advanced_settings.png[]
=== Advanced Setup
==== Custom Browser option
It is possible to enable support for a custom browser (e.g. LibreWolf, WaterFox, Arc, beta and nightly browsers, etc.) using this feature.
This feature is only available for Linux and macOS.
.Custom browser configuration
image::browser_custom_browser_configuration.png[]
The native messaging script file needed for the custom browser depends on the browser type. For Firefox based browsers like Librefox the _Browser type_ must be _Firefox_. For Arc, Opera, etc. the type must be set to _Chromium_.
_Config location_ must have the exact path for the browser's _native-messaging-hosts_ folder. If you are unsure, refer to our https://github.com/keepassxreboot/keepassxc-browser/wiki/Troubleshooting-guide#1-after-enabling-browser-integration-and-support-for-your-browser[Troubleshooting Guide] for listing of the most common paths, and a few ways for finding a path when it's not known.
When a Custom Browser has been successfully set, KeePassXC will automatically write the needed native messaging script file to the folder.
If you wish to support multiple custom browsers, you can copy the native messaging script files manually to the _native-messaging-hosts_ folder from other browsers.
==== 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 (see https://learn.microsoft.com/en-us/deployedge/microsoft-edge-policies#native-messaging[Microsoft Edge Native Messaging Policies] for more information.):
+
----
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"
----
==== Managed Microsoft Edge on macOS
1. Deploy *org.keepassxc.keepassxc_browser_edge.json* to `/Library/Microsoft/Edge/NativeMessagingHosts`.
2. You may need to configure Edge to allowlist the extension and native messaging host. See https://learn.microsoft.com/en-us/deployedge/microsoft-edge-policies#native-messaging[Microsoft Edge Native Messaging Policies] for more information.
// end::advanced[]
// end::content[]

View File

@@ -416,23 +416,5 @@ The following key derivation functions are supported:
KeePassXC offers some maintenance features that can be applied to clean up your database. Navigate to _Database_ -> _Database settings_ then click on _Maintenance_ on the left hand panel. The following screen appears. On this screen you can delete multiple icons at once and purge any unused icons in your database.
image::database_maintenance.png[]
== Remote database support
KeePassXC provides support for syncing database files that reside in a remote location. If you can download/upload the database file via a commandline tool (e.g. rsync, ssh, scp etc.) KeePassXC offers easy to use functionality to sync the remote database.
=== Sync with remote database
Open the remote sync settings via _Database > Database Settings… > Remote_ to create commands to sync a local database or a temporary local copy of a remote database.
Define a name for your sync command and specify a download *(A)* as well as an upload command *(B)*. The command and/or input need a `{TEMP_DATABASE}` placeholder specified where the remote database is temporarily stored. Do not forget to save the command settings with the save button *\(C)*. Remote settings are added as menu entries below the _Remote Sync…_ menu for quick access.
WARNING: If your download or upload command require a password prompt, the command will most likely not succeed. In case of an SSH connection (e.g. sftp), it is recommended to use <<KeePassXC SSH Agent integration,SSH agent>> so that no password prompt is needed.
.Remote sync settings
image::sync_remote_settings.png[]
Select the remote sync command from the _Database > Remote Sync…_ menu to start the syncing process and a progress bar will show up in the lower right corner.
WARNING: In case the remote database is changed by another user/process after the downloading command finishes and before uploading again, those changes will be overwritten. Syncing is not an atomic operation.
// end::advanced[]
// end::content[]

View File

@@ -38,7 +38,7 @@ To install KeePassXC on Microsoft Windows, perform the following steps:
.Install wizard
image::install_wizard_1.png[,80%]
2. Click Next and follow the simple instructions on the KeePassXC Setup Wizard to complete the installation. You will have the option to choose your install location, add a desktop shortcut, and launch on startup.
2. Click Next and follow the simple instructions on the KeepPassXC Setup Wizard to complete the installation. You will have the option to choose your install location, add a desktop shortcut, and launch on startup.
+
.Install wizard (cont)
image::install_wizard_2.png[,80%]
@@ -59,7 +59,7 @@ image::linux_store.png[]
The Snap and Flatpak options are sandboxed applications (more secure). The Native option is installed with the operating system files. Read more about the limitations of these options here: https://keepassxc.org/docs/#faq-appsnap-yubikey[KeePassXC Snap FAQ]
NOTE: KeePassXC stores a configuration file in `~/.local/state` to remember window position, recent files, and other local settings. If you mount this folder to a tmpdisk you will lose settings after reboot.
NOTE: KeePassXC stores a configuration file in `~/.cache` to remember window position, recent files, and other local settings. If you mount this folder to a tmpdisk you will lose settings after reboot.
=== macOS
To install the KeePassXC app on macOS, double click on the downloaded DMG file and use the click and drag option as shown:

View File

@@ -12,7 +12,6 @@ KeePassXC allows you to import external databases from the following options:
* Bitwarden (.json)
* Proton Pass (.json)
* KeePass 1 Database (.kdb)
* Remote database (.kdbx)
To import any of these files, start KeePassXC and either click the `Import File` button on the welcome screen or use the menu Database > Import... to launch the Import Wizard.
@@ -79,21 +78,6 @@ To import a KeePass 1 database file in KeePassXC, perform the following steps:
3. Click `Continue` to unlock and preview the import. Click `Done` to complete the import.
=== Importing Remote Database
Database files that are stored in a remote location can be imported or opened with KeePassXC if you provide a command to download the file from the remote location.
To import (or temporarily open) a remote database file in KeePassXC, perform the following steps:
1. Open the Import Wizard as shown above. Select the Remote Database option.
2. Enter a command to download the remote database. If necessary, enter input that needs to be passed to the command. The command and/or input need a `{TEMP_DATABASE}` placeholder specified where the remote database is temporarily stored.
3. Enter the password for your database and optionally provide a key file.
4. Click `Continue` to unlock and preview the import. Click `Done` to complete the import.
Opening without importing a remote database is possible by selecting Temporary Database in the Import Into section of the wizard.
== Exporting Databases
KeePassXC supports multiple ways to export your database for transfer to another program or to print out and archive.

View File

@@ -23,7 +23,7 @@ NOTE: On macOS please substitute `Ctrl` with `Cmd` (aka `⌘`).
|New Entry | Ctrl + N
|Edit Entry | Enter ; Ctrl + E
|Delete Entry | Delete
|Clone Entry | Ctrl + D
|Clone Entry | Ctrl + K
|Copy Username | Ctrl + B
|Copy Password | Ctrl + C
|Copy URL | Ctrl + U

View File

@@ -58,12 +58,7 @@ if(UNIX AND NOT APPLE AND NOT HAIKU)
EXCLUDE PATTERN "actions" EXCLUDE PATTERN "categories" EXCLUDE)
endif(KEEPASSXC_DIST_FLATPAK)
configure_file(linux/${APP_ID}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/linux/${APP_ID}.desktop @ONLY)
configure_file(linux/${APP_ID}.policy.in ${CMAKE_CURRENT_BINARY_DIR}/linux/${APP_ID}.policy @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/linux/${APP_ID}.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
if("${CMAKE_SYSTEM}" MATCHES "Linux")
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/linux/${APP_ID}.policy DESTINATION ${CMAKE_INSTALL_DATADIR}/polkit-1/actions)
endif()
install(FILES linux/${APP_ID}.appdata.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo)
endif(UNIX AND NOT APPLE AND NOT HAIKU)

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13.03 18C13.08 18.7 13.24 19.38 13.5 20H6.5C5 20 3.69 19.5 2.61 18.43C1.54 17.38 1 16.09 1 14.58C1 13.28 1.39 12.12 2.17 11.1S4 9.43 5.25 9.15C5.67 7.62 6.5 6.38 7.75 5.43S10.42 4 12 4C13.95 4 15.6 4.68 16.96 6.04C18.32 7.4 19 9.05 19 11C19.04 11 19.07 11 19.1 11C18.36 11.07 17.65 11.23 17 11.5V11C17 9.62 16.5 8.44 15.54 7.46C14.56 6.5 13.38 6 12 6S9.44 6.5 8.46 7.46C7.5 8.44 7 9.62 7 11H6.5C5.53 11 4.71 11.34 4.03 12.03C3.34 12.71 3 13.53 3 14.5S3.34 16.29 4.03 17C4.71 17.66 5.53 18 6.5 18H13.03M19 13.5V12L16.75 14.25L19 16.5V15C20.38 15 21.5 16.12 21.5 17.5C21.5 17.9 21.41 18.28 21.24 18.62L22.33 19.71C22.75 19.08 23 18.32 23 17.5C23 15.29 21.21 13.5 19 13.5M19 20C17.62 20 16.5 18.88 16.5 17.5C16.5 17.1 16.59 16.72 16.76 16.38L15.67 15.29C15.25 15.92 15 16.68 15 17.5C15 19.71 16.79 21.5 19 21.5V23L21.25 20.75L19 18.5V20Z" /></svg>

Before

Width:  |  Height:  |  Size: 914 B

View File

@@ -76,7 +76,6 @@
<file>application/scalable/actions/proton.svg</file>
<file>application/scalable/actions/qrcode.svg</file>
<file>application/scalable/actions/refresh.svg</file>
<file>application/scalable/actions/remote-sync.svg</file>
<file>application/scalable/actions/reports.svg</file>
<file>application/scalable/actions/reports-exclude.svg</file>
<file>application/scalable/actions/sort-alphabetical-ascending.svg</file>

View File

@@ -52,13 +52,6 @@
</screenshots>
<releases>
<release version="2.8.0" date="2025-01-01">
<description>
<ul>
<li>Placeholder for future release notes</li>
</ul>
</description>
</release>
<release version="2.7.10" date="2025-03-02">
<description>
<ul>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE policyconfig PUBLIC
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
"http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
<policyconfig>
<vendor>KeePassXC Developers</vendor>
<vendor_url></vendor_url>
<icon_name>@APP_ICON_NAME@</icon_name>
<action id="org.keepassxc.KeePassXC.unlockDatabase">
<description>Quick Unlock for a KeePassXC Database</description>
<message>Authentication is required to unlock a KeePassXC Database</message>
<defaults>
<allow_inactive>no</allow_inactive>
<allow_active>auth_self</allow_active>
</defaults>
</action>
</policyconfig>

0
share/macosx/keepassxc.iconset/icon_128x128.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

0
share/macosx/keepassxc.iconset/icon_128x128@2x.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

0
share/macosx/keepassxc.iconset/icon_16x16.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 708 B

After

Width:  |  Height:  |  Size: 708 B

0
share/macosx/keepassxc.iconset/icon_16x16@2x.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

0
share/macosx/keepassxc.iconset/icon_256x256.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

0
share/macosx/keepassxc.iconset/icon_256x256@2x.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

0
share/macosx/keepassxc.iconset/icon_32x32.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

0
share/macosx/keepassxc.iconset/icon_32x32@2x.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

0
share/macosx/keepassxc.iconset/icon_512x512.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

0
share/macosx/keepassxc.iconset/icon_512x512@2x.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 98 KiB

View File

@@ -11,7 +11,7 @@
</message>
<message>
<source>Report bugs at: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</source>
<translation>Reporteu errors a: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</translation>
<translation>Informeu d&apos;errors a: &lt;a href=&quot;https://github.com/keepassxreboot/keepassxc/issues&quot; style=&quot;text-decoration: underline;&quot;&gt;https://github.com&lt;/a&gt;</translation>
</message>
<message>
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
@@ -50,7 +50,7 @@
<name>AccessControlDialog</name>
<message>
<source>KeePassXC - Access Request</source>
<translation type="unfinished"/>
<translation>KeePassXC - Sol·licitud d&apos;accés</translation>
</message>
<message>
<source>Non-existing/inaccessible executable path. Please double-check the client is legit.</source>
@@ -78,7 +78,7 @@
</message>
<message>
<source>Details</source>
<translation type="unfinished"/>
<translation>Detalls</translation>
</message>
<message>
<source>Remember</source>
@@ -94,18 +94,18 @@
</message>
<message>
<source>Deny All &amp;&amp; Future</source>
<translation type="unfinished"/>
<translation>Denegar-ho tot &amp; Futur</translation>
</message>
<message>
<source>Allow All &amp;&amp; &amp;Future</source>
<translation type="unfinished"/>
<translation>Permet-ho tot &amp; Futur</translation>
</message>
</context>
<context>
<name>AccessControlDialog::DenyButton</name>
<message>
<source>Deny for this program</source>
<translation type="unfinished"/>
<translation>Denega per a aquest programa</translation>
</message>
</context>
<context>
@@ -116,7 +116,7 @@
</message>
<message>
<source>Use Pageant</source>
<translation type="unfinished"/>
<translation>Usa Pageant</translation>
</message>
<message>
<source>Use OpenSSH</source>
@@ -124,7 +124,7 @@
</message>
<message>
<source>SSH_AUTH_SOCK override</source>
<translation type="unfinished"/>
<translation>SSH_AUTH_SOCK override</translation>
</message>
<message>
<source>SSH_AUTH_SOCK value</source>
@@ -140,7 +140,7 @@
</message>
<message>
<source>SSH_SK_PROVIDER override</source>
<translation type="unfinished"/>
<translation>SSH_SK_PROVIDER override</translation>
</message>
<message>
<source>No SSH Agent socket available. Either make sure SSH_AUTH_SOCK environment variable exists or set an override.</source>
@@ -150,12 +150,16 @@
<source>SSH Agent connection is working!</source>
<translation type="unfinished"/>
</message>
<message>
<source>Use both agents</source>
<translation>Usa ambdós agents</translation>
</message>
</context>
<context>
<name>ApplicationSettingsWidget</name>
<message>
<source>Application Settings</source>
<translation>Configuració de l&apos;aplicació</translation>
<translation>Paràmetres de l&apos;aplicació</translation>
</message>
<message>
<source>General</source>
@@ -221,6 +225,10 @@
<source>Select backup storage directory</source>
<translation type="unfinished"/>
</message>
<message>
<source>This setting cannot be enabled when minimize on unlock is enabled.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -270,12 +278,12 @@
</message>
<message>
<source>On database unlock, show entries that </source>
<translation type="unfinished"/>
<translation>Al desbloquejar la base de dades, mostra les entrades que </translation>
</message>
<message>
<source>have expired</source>
<comment>On database unlock, show entries that...</comment>
<translation type="unfinished"/>
<translation>ha caducat</translation>
</message>
<message>
<source> days</source>
@@ -406,7 +414,7 @@
</message>
<message>
<source>Use monospaced font for notes</source>
<translation>Usa lletra monoespaiada per a les notes</translation>
<translation>Fer servir fonts monoespaiada per les notes</translation>
</message>
<message>
<source>Minimize instead of app exit</source>
@@ -489,6 +497,14 @@
<source>Remember last typed entry for:</source>
<translation type="unfinished"/>
</message>
<message>
<source> recent files</source>
<translation> fitxers recents</translation>
</message>
<message>
<source>Show passwords in color</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>ApplicationSettingsWidgetSecurity</name>
@@ -587,7 +603,7 @@
</message>
<message>
<source>Auto-Type Error</source>
<translation type="unfinished"/>
<translation>Error de tecleig automàtic</translation>
</message>
<message>
<source>Permission Required</source>
@@ -603,7 +619,7 @@
</message>
<message>
<source>Invalid entry provided</source>
<translation type="unfinished"/>
<translation>Entrada proporcionada no vàlida</translation>
</message>
<message>
<source>Bracket imbalance detected, found extra { or }</source>
@@ -638,6 +654,10 @@
<source>Invalid placeholder: %1</source>
<translation type="unfinished"/>
</message>
<message>
<source>Entry does not have attribute for PICKCHARS: %1</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>AutoTypeAssociationsModel</name>
@@ -685,7 +705,7 @@
</message>
<message>
<source>Sequence aborted: Caps Lock is on</source>
<translation type="unfinished"/>
<translation>Seqüència avortada: el bloqueig de majúscules està activat</translation>
</message>
<message>
<source>Sequence aborted: Modifier keys held by user</source>
@@ -717,11 +737,11 @@ Ctrl+4 - Use Virtual Keyboard (Windows Only)&lt;/p&gt;</source>
</message>
<message>
<source>Search all open databases</source>
<translation type="unfinished"/>
<translation>Cerca totes les bases de dades obertes</translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished"/>
<translation>Cerca...</translation>
</message>
<message>
<source>Type Sequence</source>
@@ -745,19 +765,19 @@ Ctrl+4 - Use Virtual Keyboard (Windows Only)&lt;/p&gt;</source>
</message>
<message>
<source>Copy Username</source>
<translation type="unfinished"/>
<translation>Copia el nom d&apos;usuari</translation>
</message>
<message>
<source>Copy Password</source>
<translation type="unfinished"/>
<translation>Copia la contrasenya</translation>
</message>
<message>
<source>Copy TOTP</source>
<translation type="unfinished"/>
<translation>Copia TOTP</translation>
</message>
<message>
<source>Use Virtual Keyboard</source>
<translation type="unfinished"/>
<translation>Utilitza el teclat virtual</translation>
</message>
</context>
<context>
@@ -784,11 +804,11 @@ Ctrl+4 - Use Virtual Keyboard (Windows Only)&lt;/p&gt;</source>
</message>
<message>
<source>Allow Selected</source>
<translation>Permet els seleccionats</translation>
<translation>Permet la selecció</translation>
</message>
<message>
<source>Deny All</source>
<translation>Denega-ho tot</translation>
<translation>Denegar tot</translation>
</message>
<message>
<source>Disable for this site</source>
@@ -1075,7 +1095,7 @@ Would you like to migrate your existing settings now?</source>
<message>
<source>Browse</source>
<extracomment>Button for opening file dialog</extracomment>
<translation type="unfinished"/>
<translation>Explora...</translation>
</message>
<message>
<source>Use a custom browser configuration location:</source>
@@ -1409,10 +1429,6 @@ Còpia de seguretat de la base de dades situada a %2</translation>
<source>Key File:</source>
<translation>Fitxer clau:</translation>
</message>
<message>
<source>&lt;p&gt;In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database&apos;s security settings.&lt;/p&gt;&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; your *.kdbx database file!&lt;br&gt;If you do not have a key file, leave this field empty.&lt;/p&gt;&lt;p&gt;Click for more information&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
<source>Key file help</source>
<translation type="unfinished"/>
@@ -1425,18 +1441,13 @@ Còpia de seguretat de la base de dades situada a %2</translation>
<source>Hardware Key:</source>
<translation>Motxilla:</translation>
</message>
<message>
<source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
&lt;p&gt;Click for more information&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
<source>Hardware key help</source>
<translation>Ajuda de la motxilla</translation>
</message>
<message>
<source>Key file to unlock the database</source>
<translation type="unfinished"/>
<translation>Fitxer clau per desbloquejar la base de dades</translation>
</message>
<message>
<source>Browse for key file</source>
@@ -1444,7 +1455,7 @@ Còpia de seguretat de la base de dades situada a %2</translation>
</message>
<message>
<source>Browse</source>
<translation type="unfinished"/>
<translation>Explora...</translation>
</message>
<message>
<source>Refresh hardware tokens</source>
@@ -1456,7 +1467,7 @@ Còpia de seguretat de la base de dades situada a %2</translation>
</message>
<message>
<source>Unlock Database</source>
<translation type="unfinished"/>
<translation>Desbloqueja la base de dades</translation>
</message>
<message>
<source>Cancel</source>
@@ -1464,7 +1475,7 @@ Còpia de seguretat de la base de dades situada a %2</translation>
</message>
<message>
<source>Unlock</source>
<translation type="unfinished"/>
<translation>Desbloqueja</translation>
</message>
<message>
<source>Please present or touch your YubiKey to continue</source>
@@ -1490,7 +1501,7 @@ We recommend you update your KeePassXC installation.</source>
</message>
<message>
<source>Database unlock canceled.</source>
<translation type="unfinished"/>
<translation>Desbloqueig de la base de dades cancel·lat.</translation>
</message>
<message>
<source>Unlock failed and no password given</source>
@@ -1564,6 +1575,15 @@ If you do not have a key file, please leave the field empty.</source>
<source>Select hardware key</source>
<translation type="unfinished"/>
</message>
<message>
<source>&lt;p&gt;In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database&apos;s security settings.&lt;/p&gt;&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; your *.kdbx database file!&lt;br&gt;If you do not have a key file, leave this field empty.&lt;/p&gt;&lt;p&gt;Click for more information&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
<source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
&lt;p&gt;Click for more information&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseSettingWidgetMetaData</name>
@@ -1588,7 +1608,7 @@ If you do not have a key file, please leave the field empty.</source>
</message>
<message>
<source>Database Credentials</source>
<translation type="unfinished"/>
<translation>Credencials de la base de dades</translation>
</message>
<message>
<source>Encryption Settings</source>
@@ -1643,7 +1663,7 @@ If you do not have a key file, please leave the field empty.</source>
</message>
<message>
<source>Remove</source>
<translation>Suprimeix</translation>
<translation>Suprimiu</translation>
</message>
<message>
<source>Delete the selected key?</source>
@@ -2203,13 +2223,21 @@ This is definitely a bug, please report it to the developers.</source>
<comment>Database tab name modifier</comment>
<translation>%1 [bloquejat]</translation>
</message>
<message>
<source>Export database to XML file</source>
<translation type="unfinished"/>
</message>
<message>
<source>XML file</source>
<translation type="unfinished"/>
</message>
<message>
<source>Writing the XML file failed</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseWidget</name>
<message>
<source>Database Tags</source>
<translation type="unfinished"/>
</message>
<message>
<source>Searching</source>
<translation type="unfinished"/>
@@ -2256,7 +2284,7 @@ This is definitely a bug, please report it to the developers.</source>
</message>
<message>
<source>Expired entries</source>
<translation type="unfinished"/>
<translation>Entrades caducades</translation>
</message>
<message>
<source>No current database.</source>
@@ -2376,6 +2404,22 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
<source>Entries expiring within %1 day(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Searches and Tags</source>
<translation type="unfinished"/>
</message>
<message>
<source>Enter a unique name or overwrite an existing search from the list:</source>
<translation type="unfinished"/>
</message>
<message>
<source>Save</source>
<translation>Desa</translation>
</message>
<message>
<source>Save Search</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -2512,10 +2556,6 @@ Would you like to correct it?</source>
<source>Hide</source>
<translation>Oculta</translation>
</message>
<message>
<source>Tomorrow</source>
<translation>Demà</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation><numerusform>% n setmana/es</numerusform><numerusform>%n setmana/es</numerusform></translation>
@@ -2528,6 +2568,10 @@ Would you like to correct it?</source>
<source>%n year(s)</source>
<translation><numerusform>% n any/s</numerusform><numerusform>%n any/s</numerusform></translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -2915,7 +2959,7 @@ Would you like to correct it?</source>
<message>
<source>Browse</source>
<extracomment>Button for opening file dialog</extracomment>
<translation type="unfinished"/>
<translation>Explora...</translation>
</message>
<message>
<source>Attachment</source>
@@ -3043,6 +3087,14 @@ Would you like to correct it?</source>
<source>Do not use HTTP Auth toggle for this and sub groups</source>
<translation type="unfinished"/>
</message>
<message>
<source>Omit WWW subdomain from matching:</source>
<translation type="unfinished"/>
</message>
<message>
<source>Omit WWW subdomain from matching toggle for this and sub groups</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -3076,7 +3128,7 @@ Would you like to correct it?</source>
</message>
<message>
<source>Browse</source>
<translation type="unfinished"/>
<translation>Explora...</translation>
</message>
<message>
<source>Clear fields</source>
@@ -3624,6 +3676,10 @@ Error: %1</source>
<source>Auto-Type</source>
<translation>Compleció automàtica</translation>
</message>
<message>
<source>Tags</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EntryModel</name>
@@ -3730,14 +3786,14 @@ Error: %1</source>
</message>
<message>
<source>Has TOTP</source>
<translation type="unfinished"/>
<translation>Disposa de TOTP</translation>
</message>
</context>
<context>
<name>EntryPreviewWidget</name>
<message>
<source>Display current TOTP value</source>
<translation type="unfinished"/>
<translation>Mostra el valor actual de TOTP</translation>
</message>
<message>
<source>Close</source>
@@ -3831,6 +3887,10 @@ Error: %1</source>
<source>Disabled</source>
<translation>Inhabilitat</translation>
</message>
<message>
<source>Double click to copy value</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EntryURLModel</name>
@@ -4748,7 +4808,7 @@ If this reoccurs, then your database file may be corrupt.</source>
</message>
<message>
<source>Note: Do NOT use a file that may change as that will prevent you from unlocking your database.</source>
<translation type="unfinished"/>
<translation>Nota: NO utilitzeu un fitxer que pugui canviar, ja que us impedirà desbloquejar la base de dades.</translation>
</message>
<message>
<source>Browse for key file</source>
@@ -4756,7 +4816,7 @@ If this reoccurs, then your database file may be corrupt.</source>
</message>
<message>
<source>Browse</source>
<translation type="unfinished"/>
<translation>Explora...</translation>
</message>
<message>
<source>Old key file format</source>
@@ -5000,7 +5060,7 @@ Are you sure you want to continue with this file?</source>
</message>
<message>
<source>Database &amp;Reports</source>
<translation type="unfinished"/>
<translation>Informes de la base de dades</translation>
</message>
<message>
<source>Statistics, health check, etc.</source>
@@ -5072,11 +5132,11 @@ Are you sure you want to continue with this file?</source>
</message>
<message>
<source>&amp;Lock Database</source>
<translation type="unfinished"/>
<translation>B&amp;loqueja la base de dades</translation>
</message>
<message>
<source>Lock &amp;All Databases</source>
<translation type="unfinished"/>
<translation>Bloqueja totes les bases de dades</translation>
</message>
<message>
<source>&amp;Title</source>
@@ -5140,11 +5200,11 @@ Are you sure you want to continue with this file?</source>
</message>
<message>
<source>Show QR Code</source>
<translation type="unfinished"/>
<translation>Mostra el codi QR</translation>
</message>
<message>
<source>Set up TOTP</source>
<translation type="unfinished"/>
<translation>Configura el TOTP...</translation>
</message>
<message>
<source>Copy &amp;TOTP</source>
@@ -5192,7 +5252,7 @@ Are you sure you want to continue with this file?</source>
</message>
<message>
<source>Save Database Backup</source>
<translation type="unfinished"/>
<translation>Desa una còpia de seguretat...</translation>
</message>
<message>
<source>Add key to SSH Agent</source>
@@ -5216,11 +5276,11 @@ Are you sure you want to continue with this file?</source>
</message>
<message>
<source>Dark</source>
<translation type="unfinished"/>
<translation>Fosc</translation>
</message>
<message>
<source>Classic (Platform-native)</source>
<translation type="unfinished"/>
<translation>Clàssic (natiu de la plataforma)</translation>
</message>
<message>
<source>Show Toolbar</source>
@@ -5314,6 +5374,30 @@ We recommend you use the AppImage available on our downloads page.</source>
<source>You must restart the application to apply this setting. Would you like to restart now?</source>
<translation type="unfinished"/>
</message>
<message>
<source>Tags</source>
<translation type="unfinished"/>
</message>
<message>
<source>No Tags</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
<source>%1 Entry(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Copy Password and TOTP</source>
<translation>Copia la contrasenya i el TOTP</translation>
</message>
<message>
<source>&amp;XML File</source>
<translation type="unfinished"/>
</message>
<message>
<source>XML File</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>ManageDatabase</name>
@@ -5463,7 +5547,7 @@ We recommend you use the AppImage available on our downloads page.</source>
<name>NewDatabaseWizardPageDatabaseKey</name>
<message>
<source>Database Credentials</source>
<translation type="unfinished"/>
<translation>Credencials de la base de dades</translation>
</message>
<message>
<source>A set of credentials known only to you that protects your database.</source>
@@ -5684,29 +5768,6 @@ We recommend you use the AppImage available on our downloads page.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>PasswordEdit</name>
<message>
<source>Passwords do not match</source>
<translation type="unfinished"/>
</message>
<message>
<source>Passwords match so far</source>
<translation type="unfinished"/>
</message>
<message>
<source>Toggle Password (%1)</source>
<translation type="unfinished"/>
</message>
<message>
<source>Generate Password (%1)</source>
<translation type="unfinished"/>
</message>
<message>
<source>Warning: Caps Lock enabled!</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>PasswordEditWidget</name>
<message>
@@ -5885,10 +5946,6 @@ We recommend you use the AppImage available on our downloads page.</source>
<source>Also choose from:</source>
<translation type="unfinished"/>
</message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</source>
<translation type="unfinished"/>
</message>
<message>
<source>Exclude look-alike characters</source>
<translation>Excloure caràcters d&apos;aspecte semblant</translation>
@@ -6038,6 +6095,57 @@ Do you want to overwrite it?</source>
<comment>Password quality</comment>
<translation>Excel·lent</translation>
</message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>PasswordWidget</name>
<message>
<source>Passwords do not match</source>
<translation type="unfinished"/>
</message>
<message>
<source>Passwords match so far</source>
<translation type="unfinished"/>
</message>
<message>
<source>Toggle Password (%1)</source>
<translation type="unfinished"/>
</message>
<message>
<source>Generate Password (%1)</source>
<translation type="unfinished"/>
</message>
<message>
<source>Warning: Caps Lock enabled!</source>
<translation type="unfinished"/>
</message>
<message>
<source>Quality: %1</source>
<translation type="unfinished"/>
</message>
<message>
<source>Poor</source>
<comment>Password quality</comment>
<translation>Pobre</translation>
</message>
<message>
<source>Weak</source>
<comment>Password quality</comment>
<translation>Feble</translation>
</message>
<message>
<source>Good</source>
<comment>Password quality</comment>
<translation>Bona</translation>
</message>
<message>
<source>Excellent</source>
<comment>Password quality</comment>
<translation>Excel·lent</translation>
</message>
</context>
<context>
<name>PickcharsDialog</name>
@@ -6382,7 +6490,7 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>Copy the current TOTP to the clipboard (equivalent to &quot;-a totp&quot;).</source>
<translation type="unfinished"/>
<translation>Copia el TOTP actual al porta-retalls (equivalent a &quot;-a totp&quot;).</translation>
</message>
<message>
<source>Must match only one entry, otherwise a list of possible matches is shown.</source>
@@ -6419,11 +6527,11 @@ Do you want to overwrite it?</source>
</message>
<message>
<source>ERROR: Please specify one of --attribute or --totp, not both.</source>
<translation type="unfinished"/>
<translation>ERROR: Especifiqueu un, --atribut o --totp, no tots dos.</translation>
</message>
<message>
<source>Entry with path %1 has no TOTP set up.</source>
<translation type="unfinished"/>
<translation>L&apos;entrada amb la ruta %1 no té configurat TOTP.</translation>
</message>
<message>
<source>ERROR: attribute %1 is ambiguous, it matches %2.</source>
@@ -7095,7 +7203,7 @@ Available commands:
</message>
<message>
<source>Show the entry&apos;s current TOTP.</source>
<translation type="unfinished"/>
<translation>Mostra el TOTP actual de l&apos;entrada.</translation>
</message>
<message>
<source>Show the protected attributes in clear text.</source>
@@ -7168,10 +7276,6 @@ Please consider generating a new key file.</source>
<source>Invalid YubiKey serial %1</source>
<translation type="unfinished"/>
</message>
<message>
<source>Please present or touch your YubiKey to continue…</source>
<translation type="unfinished"/>
</message>
<message>
<source>Enter password to encrypt database (optional): </source>
<translation type="unfinished"/>
@@ -7319,7 +7423,7 @@ Nucli: %3 %4</translation>
</message>
<message>
<source>Quick Unlock</source>
<translation type="unfinished"/>
<translation>Desbloqueig ràpid</translation>
</message>
<message>
<source>Secret Service Integration</source>
@@ -7545,11 +7649,11 @@ Nucli: %3 %4</translation>
</message>
<message>
<source>Browser Statistics</source>
<translation type="unfinished"/>
<translation>Estadístiques del navegador</translation>
</message>
<message>
<source>Health Check</source>
<translation type="unfinished"/>
<translation>Informe de salut</translation>
</message>
<message>
<source>HIBP</source>
@@ -7557,7 +7661,7 @@ Nucli: %3 %4</translation>
</message>
<message>
<source>Statistics</source>
<translation type="unfinished"/>
<translation>Estadístiques</translation>
</message>
<message>
<source>Unsupported key file version: %1</source>
@@ -7589,7 +7693,7 @@ Nucli: %3 %4</translation>
</message>
<message>
<source>lock all open databases</source>
<translation type="unfinished"/>
<translation>bloqueja totes les bases de dades obertes</translation>
</message>
<message>
<source>key file of the database</source>
@@ -7605,11 +7709,11 @@ Nucli: %3 %4</translation>
</message>
<message>
<source>Locked databases.</source>
<translation type="unfinished"/>
<translation>Bases de dades bloquejades.</translation>
</message>
<message>
<source>Database failed to lock.</source>
<translation type="unfinished"/>
<translation>La base de dades no s&apos;ha pogut bloquejar.</translation>
</message>
<message>
<source>Another instance of KeePassXC is already running.</source>
@@ -7649,6 +7753,67 @@ Nucli: %3 %4</translation>
<source>Failed to sign challenge using Windows Hello.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Please present or touch your YubiKey to continue.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Show all the attributes of the entry.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Edit a database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Could not change the database key.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Database was not modified.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Successfully edited the database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Loading the new key file failed: %1</source>
<translation type="unfinished"/>
</message>
<message>
<source>Unset the password for the database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Unset the key file for the database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Cannot use %1 and %2 at the same time.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Cannot remove all the keys from a database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Cannot remove password: The database does not have a password.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Cannot remove file key: The database does not have a file key.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Found unexpected Key type %1</source>
<translation type="unfinished"/>
</message>
<message>
<source>Set the key file for the database.
This options is deprecated, use --set-key-file instead.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -8196,6 +8361,10 @@ Nucli: %3 %4</translation>
<source>Limit search to selected group</source>
<translation>Limitar la cerca al grup seleccionat</translation>
</message>
<message>
<source>Save Search</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>SettingsClientModel</name>
@@ -8408,16 +8577,39 @@ Nucli: %3 %4</translation>
</context>
<context>
<name>TagModel</name>
<message>
<source>All</source>
<translation type="unfinished"/>
</message>
<message>
<source>Expired</source>
<translation type="unfinished"/>
<translation>Caducades</translation>
</message>
<message>
<source>Weak Passwords</source>
<translation>Contrasenyes febles</translation>
</message>
<message>
<source>All Entries</source>
<translation type="unfinished"/>
</message>
<message>
<source>Clear Search</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>TagView</name>
<message>
<source>Remove Search</source>
<translation type="unfinished"/>
</message>
<message>
<source>Remove Tag</source>
<translation type="unfinished"/>
</message>
<message>
<source>Confirm Remove Tag</source>
<translation type="unfinished"/>
</message>
<message>
<source>Remove tag &quot;%1&quot; from all entries in this database?</source>
<translation type="unfinished"/>
</message>
</context>
@@ -8449,7 +8641,7 @@ Nucli: %3 %4</translation>
</message>
<message>
<source>There was an error creating the QR code.</source>
<translation type="unfinished"/>
<translation>Hi hagut un error creant el codi QR</translation>
</message>
<message>
<source>Closing in %1 seconds.</source>
@@ -8517,7 +8709,7 @@ Nucli: %3 %4</translation>
</message>
<message>
<source>Invalid TOTP Secret</source>
<translation type="unfinished"/>
<translation>Secret de TOTP no vàlid</translation>
</message>
<message>
<source>You have entered an invalid secret key. The key must be in Base32 format.
@@ -8526,7 +8718,7 @@ Example: JBSWY3DPEHPK3PXP</source>
</message>
<message>
<source>Confirm Remove TOTP Settings</source>
<translation type="unfinished"/>
<translation>Confirma l&apos;eliminació de la configuració de TOTP</translation>
</message>
<message>
<source>Are you sure you want to delete TOTP settings for this entry?</source>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -150,6 +150,10 @@
<source>SSH Agent connection is working!</source>
<translation>SSH Agent veza radi!</translation>
</message>
<message>
<source>Use both agents</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>ApplicationSettingsWidget</name>
@@ -221,6 +225,10 @@
<source>Select backup storage directory</source>
<translation type="unfinished"/>
</message>
<message>
<source>This setting cannot be enabled when minimize on unlock is enabled.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -489,6 +497,14 @@
<source>Remember last typed entry for:</source>
<translation type="unfinished"/>
</message>
<message>
<source> recent files</source>
<translation type="unfinished"/>
</message>
<message>
<source>Show passwords in color</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>ApplicationSettingsWidgetSecurity</name>
@@ -638,6 +654,10 @@
<source>Invalid placeholder: %1</source>
<translation type="unfinished"/>
</message>
<message>
<source>Entry does not have attribute for PICKCHARS: %1</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>AutoTypeAssociationsModel</name>
@@ -1417,10 +1437,6 @@ Sigurnosna kopija baza podataka nalazi se na %2</translation>
<source>Key File:</source>
<translation>Datoteka ključa:</translation>
</message>
<message>
<source>&lt;p&gt;In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database&apos;s security settings.&lt;/p&gt;&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; your *.kdbx database file!&lt;br&gt;If you do not have a key file, leave this field empty.&lt;/p&gt;&lt;p&gt;Click for more information&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
<source>Key file help</source>
<translation>Datoteka ključa pomoć</translation>
@@ -1433,11 +1449,6 @@ Sigurnosna kopija baza podataka nalazi se na %2</translation>
<source>Hardware Key:</source>
<translation>Hardverski ključ:</translation>
</message>
<message>
<source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
&lt;p&gt;Click for more information&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
<source>Hardware key help</source>
<translation>Hardverski ključ pomoć</translation>
@@ -1573,6 +1584,15 @@ Ako nemate datoteku ključa, ostavite polje prazno.</translation>
<source>Select hardware key</source>
<translation>Odaberite hardverski ključ...</translation>
</message>
<message>
<source>&lt;p&gt;In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database&apos;s security settings.&lt;/p&gt;&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; your *.kdbx database file!&lt;br&gt;If you do not have a key file, leave this field empty.&lt;/p&gt;&lt;p&gt;Click for more information&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
<source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
&lt;p&gt;Click for more information&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseSettingWidgetMetaData</name>
@@ -2219,13 +2239,21 @@ Ovo je definitivno pogreška, molimo prijavite to programerima.</translation>
<comment>Database tab name modifier</comment>
<translation>%1 [Zaključano]</translation>
</message>
<message>
<source>Export database to XML file</source>
<translation type="unfinished"/>
</message>
<message>
<source>XML file</source>
<translation type="unfinished"/>
</message>
<message>
<source>Writing the XML file failed</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseWidget</name>
<message>
<source>Database Tags</source>
<translation type="unfinished"/>
</message>
<message>
<source>Searching</source>
<translation type="unfinished"/>
@@ -2390,6 +2418,22 @@ Disable safe saves and try again?</source>
<source>Entries expiring within %1 day(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Searches and Tags</source>
<translation type="unfinished"/>
</message>
<message>
<source>Enter a unique name or overwrite an existing search from the list:</source>
<translation type="unfinished"/>
</message>
<message>
<source>Save</source>
<translation>Spremi</translation>
</message>
<message>
<source>Save Search</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -2526,10 +2570,6 @@ Would you like to correct it?</source>
<source>Hide</source>
<translation>Sakrij</translation>
</message>
<message>
<source>Tomorrow</source>
<translation>Sutra</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation><numerusform>%n tjedan</numerusform><numerusform>%n tjedana</numerusform><numerusform>%n tjedana</numerusform></translation>
@@ -2542,6 +2582,10 @@ Would you like to correct it?</source>
<source>%n year(s)</source>
<translation><numerusform>%n godina</numerusform><numerusform>%n godine</numerusform><numerusform>%n godina</numerusform></translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -3057,6 +3101,14 @@ Would you like to correct it?</source>
<source>Do not use HTTP Auth toggle for this and sub groups</source>
<translation type="unfinished"/>
</message>
<message>
<source>Omit WWW subdomain from matching:</source>
<translation type="unfinished"/>
</message>
<message>
<source>Omit WWW subdomain from matching toggle for this and sub groups</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -3638,6 +3690,10 @@ Error: %1</source>
<source>Auto-Type</source>
<translation>Auto-tipkanje</translation>
</message>
<message>
<source>Tags</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EntryModel</name>
@@ -3845,6 +3901,10 @@ Error: %1</source>
<source>Disabled</source>
<translation>Onemogući</translation>
</message>
<message>
<source>Double click to copy value</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EntryURLModel</name>
@@ -5329,6 +5389,30 @@ We recommend you use the AppImage available on our downloads page.</source>
<source>You must restart the application to apply this setting. Would you like to restart now?</source>
<translation>Morate ponovno pokrenuti aplikaciju da biste primijenili tu postavku. Želite li ju ponovno pokrenuti sada?</translation>
</message>
<message>
<source>Tags</source>
<translation type="unfinished"/>
</message>
<message>
<source>No Tags</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
<source>%1 Entry(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Copy Password and TOTP</source>
<translation type="unfinished"/>
</message>
<message>
<source>&amp;XML File</source>
<translation type="unfinished"/>
</message>
<message>
<source>XML File</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>ManageDatabase</name>
@@ -5699,29 +5783,6 @@ We recommend you use the AppImage available on our downloads page.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>PasswordEdit</name>
<message>
<source>Passwords do not match</source>
<translation>Lozinke se ne podudaraju</translation>
</message>
<message>
<source>Passwords match so far</source>
<translation>Lozinke se zasad podudaraju</translation>
</message>
<message>
<source>Toggle Password (%1)</source>
<translation type="unfinished"/>
</message>
<message>
<source>Generate Password (%1)</source>
<translation>Proizvedi Lozinku (%1)</translation>
</message>
<message>
<source>Warning: Caps Lock enabled!</source>
<translation>Upozorenje: Caps Lock uključen!</translation>
</message>
</context>
<context>
<name>PasswordEditWidget</name>
<message>
@@ -5900,10 +5961,6 @@ We recommend you use the AppImage available on our downloads page.</source>
<source>Also choose from:</source>
<translation type="unfinished"/>
</message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</source>
<translation>Izostavi znakove: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;.</translation>
</message>
<message>
<source>Exclude look-alike characters</source>
<translation>Izostavi slične znakove</translation>
@@ -6053,6 +6110,57 @@ Do you want to overwrite it?</source>
<comment>Password quality</comment>
<translation>Izvrsna</translation>
</message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</source>
<translation>Izostavi znakove: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;.</translation>
</message>
</context>
<context>
<name>PasswordWidget</name>
<message>
<source>Passwords do not match</source>
<translation>Lozinke se ne podudaraju</translation>
</message>
<message>
<source>Passwords match so far</source>
<translation>Lozinke se zasad podudaraju</translation>
</message>
<message>
<source>Toggle Password (%1)</source>
<translation type="unfinished"/>
</message>
<message>
<source>Generate Password (%1)</source>
<translation>Proizvedi Lozinku (%1)</translation>
</message>
<message>
<source>Warning: Caps Lock enabled!</source>
<translation>Upozorenje: Caps Lock uključen!</translation>
</message>
<message>
<source>Quality: %1</source>
<translation type="unfinished"/>
</message>
<message>
<source>Poor</source>
<comment>Password quality</comment>
<translation>bijedna</translation>
</message>
<message>
<source>Weak</source>
<comment>Password quality</comment>
<translation>Slaba</translation>
</message>
<message>
<source>Good</source>
<comment>Password quality</comment>
<translation>Dobra</translation>
</message>
<message>
<source>Excellent</source>
<comment>Password quality</comment>
<translation>Izvrsna</translation>
</message>
</context>
<context>
<name>PickcharsDialog</name>
@@ -7185,10 +7293,6 @@ Please consider generating a new key file.</source>
<source>Invalid YubiKey serial %1</source>
<translation type="unfinished"/>
</message>
<message>
<source>Please present or touch your YubiKey to continue…</source>
<translation type="unfinished"/>
</message>
<message>
<source>Enter password to encrypt database (optional): </source>
<translation type="unfinished"/>
@@ -7664,6 +7768,67 @@ Kernel: %3 %4</source>
<source>Failed to sign challenge using Windows Hello.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Please present or touch your YubiKey to continue.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Show all the attributes of the entry.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Edit a database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Could not change the database key.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Database was not modified.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Successfully edited the database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Loading the new key file failed: %1</source>
<translation type="unfinished"/>
</message>
<message>
<source>Unset the password for the database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Unset the key file for the database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Cannot use %1 and %2 at the same time.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Cannot remove all the keys from a database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Cannot remove password: The database does not have a password.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Cannot remove file key: The database does not have a file key.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Found unexpected Key type %1</source>
<translation type="unfinished"/>
</message>
<message>
<source>Set the key file for the database.
This options is deprecated, use --set-key-file instead.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -8211,6 +8376,10 @@ Kernel: %3 %4</source>
<source>Limit search to selected group</source>
<translation type="unfinished"/>
</message>
<message>
<source>Save Search</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>SettingsClientModel</name>
@@ -8423,10 +8592,6 @@ Kernel: %3 %4</source>
</context>
<context>
<name>TagModel</name>
<message>
<source>All</source>
<translation type="unfinished"/>
</message>
<message>
<source>Expired</source>
<translation type="unfinished"/>
@@ -8435,6 +8600,33 @@ Kernel: %3 %4</source>
<source>Weak Passwords</source>
<translation type="unfinished"/>
</message>
<message>
<source>All Entries</source>
<translation type="unfinished"/>
</message>
<message>
<source>Clear Search</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>TagView</name>
<message>
<source>Remove Search</source>
<translation type="unfinished"/>
</message>
<message>
<source>Remove Tag</source>
<translation type="unfinished"/>
</message>
<message>
<source>Confirm Remove Tag</source>
<translation type="unfinished"/>
</message>
<message>
<source>Remove tag &quot;%1&quot; from all entries in this database?</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>TotpDialog</name>

View File

@@ -1297,7 +1297,7 @@ Vuoi sovrascrivere la passkey in %1 - %2?</translation>
</message>
<message>
<source>Browsers installed using Snap or Flatpak are not supported with exception to Firefox installed using Snap.</source>
<translation>I browser installati tramite Snap o Flatpak non sono supportati, ad eccezione di Firefox installato tramite Snap.</translation>
<translation type="unfinished"/>
</message>
</context>
<context>
@@ -1520,11 +1520,11 @@ Database di backup che si trova in %2</translation>
</message>
<message>
<source>Database file read error.</source>
<translation>Errore di lettura del file del database.</translation>
<translation type="unfinished"/>
</message>
<message>
<source>No file path was provided.</source>
<translation>Non è stato fornito alcun percorso del file.</translation>
<translation type="unfinished"/>
</message>
</context>
<context>
@@ -2492,13 +2492,7 @@ exit
{TEMP_DATABASE} is used as placeholder to store the database in a temporary location
The command has to exit. In case of `sftp` as last command `exit` has to be sent
</source>
<translation>ad es.:
get DatabaseOnRemote.kdbx {TEMP_DATABASE}
exit
---
{TEMP_DATABASE} è utilizzato come segnaposto per memorizzare il database in una posizione temporanea
Il comando deve uscire. In caso di `sftp` come ultimo comando `exit` deve essere inviato
</translation>
<translation type="unfinished"/>
</message>
<message>
<source>e.g.:
@@ -2508,13 +2502,7 @@ exit
{TEMP_DATABASE} is used as placeholder to store the database in a temporary location
The command has to exit. In case of `sftp` as last command `exit` has to be sent
</source>
<translation>ad es.:
put {TEMP_DATABASE} DatabaseOnRemote.kdbx
exit
---
{TEMP_DATABASE} è utilizzato come segnaposto per memorizzare il database in una posizione temporanea
Il comando deve uscire. In caso di `sftp` come ultimo comando `exit` deve essere inviato
</translation>
<translation type="unfinished"/>
</message>
<message>
<source>Timeout:</source>
@@ -2815,47 +2803,47 @@ Vuoi disabilitare i salvataggi sicuri e riprovare?</translation>
</message>
<message>
<source>The database file &quot;%1&quot; was modified externally</source>
<translation>Il file di database &quot;%1&quot; è stato modificato esternamente</translation>
<translation type="unfinished"/>
</message>
<message>
<source>Do you want to load the changes?</source>
<translation>Vuoi caricare le modifiche?</translation>
<translation type="unfinished"/>
</message>
<message>
<source>Reload database</source>
<translation>Ricarica il database</translation>
<translation type="unfinished"/>
</message>
<message>
<source>Reloading database</source>
<translation>Ricaricamento del database</translation>
<translation type="unfinished"/>
</message>
<message>
<source>Reload canceled</source>
<translation>Ricaricamento annullato</translation>
<translation type="unfinished"/>
</message>
<message>
<source>Reload successful</source>
<translation>Ricaricamento completato correttamente</translation>
<translation type="unfinished"/>
</message>
<message>
<source>Reload pending user action</source>
<translation>Ricaricamento in attesa di azione dell&apos;utente...</translation>
<translation type="unfinished"/>
</message>
<message>
<source>The database file &quot;%1&quot; was modified externally.&lt;br&gt;How would you like to proceed?&lt;br&gt;&lt;br&gt;Merge all changes&lt;br&gt;Ignore the changes on disk until save&lt;br&gt;Discard unsaved changes</source>
<translation>Il file di database &quot;%1&quot; è stato modificato esternamente.&lt;br&gt; Come desideri procedere?&lt;br&gt;&lt;br&gt;Unisci tutte le modifiche&lt;br&gt;Ignora le modifiche sul disco fino al salvataggio&lt;br&gt;Ignora le modifiche non salvate</translation>
<translation type="unfinished"/>
</message>
<message>
<source>The database file &quot;%1&quot; was modified externally.&lt;br&gt;How would you like to proceed?&lt;br&gt;&lt;br&gt;Merge all changes then save&lt;br&gt;Overwrite the changes on disk&lt;br&gt;Discard unsaved changes</source>
<translation>Il file di database &quot;%1&quot; è stato modificato esternamente.&lt;br&gt;Come desideri procedere?&lt;br&gt;&lt;br&gt;Unisci tutte le modifiche, quindi salva&lt;br&gt;Sovrascrivi le modifiche sul disco&lt;br&gt;Ignora le modifiche non salvate</translation>
<translation type="unfinished"/>
</message>
<message>
<source>Database file overwritten.</source>
<translation>File di database sovrascritto.</translation>
<translation type="unfinished"/>
</message>
<message>
<source>Database file on disk cannot be unlocked with current credentials.&lt;br&gt;Enter new credentials and/or present hardware key to continue.</source>
<translation>Il file del database sul disco non può essere sbloccato con le credenziali attuali.&lt;br&gt; Digita le nuove credenziali e/o presenta la chiave hardware per continuare.</translation>
<translation type="unfinished"/>
</message>
</context>
<context>
@@ -3445,7 +3433,7 @@ Vuoi correggerla?</translation>
</message>
<message>
<source>Clear agent</source>
<translation>Cancella agent</translation>
<translation type="unfinished"/>
</message>
</context>
<context>
@@ -4835,13 +4823,7 @@ exit
{TEMP_DATABASE} is used as placeholder to store the database in a temporary location
The command has to exit. In case of `sftp` as last commend `exit` has to be sent
</source>
<translation>ad es.:
get DatabaseOnRemote.kdbx {TEMP_DATABASE}
exit
---
{TEMP_DATABASE} è utilizzato come segnaposto per memorizzare il database in una posizione temporanea
Il comando deve uscire. In caso di `sftp` come ultimo comando `exit` deve essere inviato
</translation>
<translation type="unfinished"/>
</message>
<message>
<source>Remote Database (.kdbx)</source>
@@ -6338,11 +6320,11 @@ Aspettatevi alcuni bug e problemi minori, questa versione è pensata per scopi d
</message>
<message>
<source>Clear SSH Agent</source>
<translation>Cancella SSH Agent</translation>
<translation type="unfinished"/>
</message>
<message>
<source>Clear all identities in ssh-agent</source>
<translation>Cancella tutte le identità in ssh-agent</translation>
<translation type="unfinished"/>
</message>
</context>
<context>
@@ -9214,23 +9196,23 @@ Questa opzione è deprecata, utilizza invece --set-key-file.</translation>
</message>
<message>
<source>Format to use when exporting. Available choices are &apos;xml&apos;, &apos;csv&apos; or &apos;html&apos;. Defaults to &apos;xml&apos;.</source>
<translation>Formato da utilizzare per l&apos;esportazione. Scelte disponibili sono &apos;xml&apos;, &apos;csv&apos; o &apos;html&apos;. Predefinito è &apos;xml&apos;.</translation>
<translation type="unfinished"/>
</message>
<message>
<source>start minimized to the system tray</source>
<translation>avvia minimizzato nell&apos;area di notifica di sistema</translation>
<translation type="unfinished"/>
</message>
<message>
<source>malformed string, possible unescaped delimiter</source>
<translation>stringa non valida, possibile delimitatore senza escape</translation>
<translation type="unfinished"/>
</message>
<message>
<source>missing closing delimiter</source>
<translation>delimitatore di chiusura mancante</translation>
<translation type="unfinished"/>
</message>
<message>
<source>%1, row: %2, column: %3</source>
<translation>%1, riga: %2, colonna: %3</translation>
<translation type="unfinished"/>
</message>
<message>
<source>Tags</source>
@@ -9814,11 +9796,11 @@ La funzionalità di rete è richiesta per verificare la password con i database
</message>
<message>
<source>Failed to remove all SSH identities from agent.</source>
<translation>Rimozione delle identità SSH dall&apos;agent non riuscite.</translation>
<translation type="unfinished"/>
</message>
<message>
<source>All SSH identities removed from agent.</source>
<translation>Tutte le identità SSH rimosse dall&apos;agent.</translation>
<translation type="unfinished"/>
</message>
</context>
<context>

View File

@@ -150,6 +150,10 @@
<source>SSH Agent connection is working!</source>
<translation>Povezava s SSH agentom deluje!</translation>
</message>
<message>
<source>Use both agents</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>ApplicationSettingsWidget</name>
@@ -221,6 +225,10 @@
<source>Select backup storage directory</source>
<translation type="unfinished"/>
</message>
<message>
<source>This setting cannot be enabled when minimize on unlock is enabled.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>ApplicationSettingsWidgetGeneral</name>
@@ -489,6 +497,14 @@
<source>Remember last typed entry for:</source>
<translation type="unfinished"/>
</message>
<message>
<source> recent files</source>
<translation type="unfinished"/>
</message>
<message>
<source>Show passwords in color</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>ApplicationSettingsWidgetSecurity</name>
@@ -638,6 +654,10 @@
<source>Invalid placeholder: %1</source>
<translation type="unfinished"/>
</message>
<message>
<source>Entry does not have attribute for PICKCHARS: %1</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>AutoTypeAssociationsModel</name>
@@ -1407,10 +1427,6 @@ Varnostna kopija baze se nahaja na %2</translation>
<source>Key File:</source>
<translation>Datoteka s ključi:</translation>
</message>
<message>
<source>&lt;p&gt;In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database&apos;s security settings.&lt;/p&gt;&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; your *.kdbx database file!&lt;br&gt;If you do not have a key file, leave this field empty.&lt;/p&gt;&lt;p&gt;Click for more information&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
<source>Key file help</source>
<translation type="unfinished"/>
@@ -1423,11 +1439,6 @@ Varnostna kopija baze se nahaja na %2</translation>
<source>Hardware Key:</source>
<translation type="unfinished"/>
</message>
<message>
<source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
&lt;p&gt;Click for more information&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
<source>Hardware key help</source>
<translation type="unfinished"/>
@@ -1562,6 +1573,15 @@ If you do not have a key file, please leave the field empty.</source>
<source>Select hardware key</source>
<translation type="unfinished"/>
</message>
<message>
<source>&lt;p&gt;In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database&apos;s security settings.&lt;/p&gt;&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; your *.kdbx database file!&lt;br&gt;If you do not have a key file, leave this field empty.&lt;/p&gt;&lt;p&gt;Click for more information&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
<message>
<source>&lt;p&gt;You can use a hardware security key such as a &lt;strong&gt;YubiKey&lt;/strong&gt; or &lt;strong&gt;OnlyKey&lt;/strong&gt; with slots configured for HMAC-SHA1.&lt;/p&gt;
&lt;p&gt;Click for more information&lt;/p&gt;</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseSettingWidgetMetaData</name>
@@ -2202,13 +2222,21 @@ This is definitely a bug, please report it to the developers.</source>
<comment>Database tab name modifier</comment>
<translation>%1 [Zaklenjeno]</translation>
</message>
<message>
<source>Export database to XML file</source>
<translation type="unfinished"/>
</message>
<message>
<source>XML file</source>
<translation type="unfinished"/>
</message>
<message>
<source>Writing the XML file failed</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>DatabaseWidget</name>
<message>
<source>Database Tags</source>
<translation type="unfinished"/>
</message>
<message>
<source>Searching</source>
<translation type="unfinished"/>
@@ -2373,6 +2401,22 @@ Disable safe saves and try again?</source>
<source>Entries expiring within %1 day(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Searches and Tags</source>
<translation type="unfinished"/>
</message>
<message>
<source>Enter a unique name or overwrite an existing search from the list:</source>
<translation type="unfinished"/>
</message>
<message>
<source>Save</source>
<translation>Shrani</translation>
</message>
<message>
<source>Save Search</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditEntryWidget</name>
@@ -2510,10 +2554,6 @@ Would you like to correct it?</source>
<source>Hide</source>
<translation>Skrij</translation>
</message>
<message>
<source>Tomorrow</source>
<translation>Jutri</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation><numerusform>%n ted(ov)</numerusform><numerusform>%n ted(ov)</numerusform><numerusform>%n ted(ov)</numerusform><numerusform>%n teden(ov)</numerusform></translation>
@@ -2526,6 +2566,10 @@ Would you like to correct it?</source>
<source>%n year(s)</source>
<translation><numerusform>%n let</numerusform><numerusform>%n let</numerusform><numerusform>%n let</numerusform><numerusform>%n let</numerusform></translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
</context>
<context>
<name>EditEntryWidgetAdvanced</name>
@@ -3041,6 +3085,14 @@ Would you like to correct it?</source>
<source>Do not use HTTP Auth toggle for this and sub groups</source>
<translation type="unfinished"/>
</message>
<message>
<source>Omit WWW subdomain from matching:</source>
<translation type="unfinished"/>
</message>
<message>
<source>Omit WWW subdomain from matching toggle for this and sub groups</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EditGroupWidgetKeeShare</name>
@@ -3623,6 +3675,10 @@ Error: %1</source>
<source>Auto-Type</source>
<translation>Samodejno tipkanje</translation>
</message>
<message>
<source>Tags</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EntryModel</name>
@@ -3830,6 +3886,10 @@ Error: %1</source>
<source>Disabled</source>
<translation>Onemogočen</translation>
</message>
<message>
<source>Double click to copy value</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>EntryURLModel</name>
@@ -5319,6 +5379,30 @@ We recommend you use the AppImage available on our downloads page.</source>
<source>You must restart the application to apply this setting. Would you like to restart now?</source>
<translation>Če želite uporabiti to nastavitev, morate znova zagnati aplikacijo. Ali želite znova zagnati zdaj?</translation>
</message>
<message>
<source>Tags</source>
<translation type="unfinished"/>
</message>
<message>
<source>No Tags</source>
<translation type="unfinished"/>
</message>
<message numerus="yes">
<source>%1 Entry(s)</source>
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform><numerusform></numerusform></translation>
</message>
<message>
<source>Copy Password and TOTP</source>
<translation type="unfinished"/>
</message>
<message>
<source>&amp;XML File</source>
<translation type="unfinished"/>
</message>
<message>
<source>XML File</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>ManageDatabase</name>
@@ -5689,29 +5773,6 @@ We recommend you use the AppImage available on our downloads page.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>PasswordEdit</name>
<message>
<source>Passwords do not match</source>
<translation type="unfinished"/>
</message>
<message>
<source>Passwords match so far</source>
<translation type="unfinished"/>
</message>
<message>
<source>Toggle Password (%1)</source>
<translation type="unfinished"/>
</message>
<message>
<source>Generate Password (%1)</source>
<translation type="unfinished"/>
</message>
<message>
<source>Warning: Caps Lock enabled!</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>PasswordEditWidget</name>
<message>
@@ -5890,10 +5951,6 @@ We recommend you use the AppImage available on our downloads page.</source>
<source>Also choose from:</source>
<translation>Izberi tudi med:</translation>
</message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</source>
<translation type="unfinished"/>
</message>
<message>
<source>Exclude look-alike characters</source>
<translation>Izključi podobne znake</translation>
@@ -6043,6 +6100,57 @@ Do you want to overwrite it?</source>
<comment>Password quality</comment>
<translation>Odlična</translation>
</message>
<message>
<source>Excluded characters: &quot;0&quot;, &quot;1&quot;, &quot;l&quot;, &quot;I&quot;, &quot;O&quot;, &quot;|&quot;, &quot;&quot;</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>PasswordWidget</name>
<message>
<source>Passwords do not match</source>
<translation type="unfinished"/>
</message>
<message>
<source>Passwords match so far</source>
<translation type="unfinished"/>
</message>
<message>
<source>Toggle Password (%1)</source>
<translation type="unfinished"/>
</message>
<message>
<source>Generate Password (%1)</source>
<translation type="unfinished"/>
</message>
<message>
<source>Warning: Caps Lock enabled!</source>
<translation type="unfinished"/>
</message>
<message>
<source>Quality: %1</source>
<translation type="unfinished"/>
</message>
<message>
<source>Poor</source>
<comment>Password quality</comment>
<translation>Slabo</translation>
</message>
<message>
<source>Weak</source>
<comment>Password quality</comment>
<translation>Šibko</translation>
</message>
<message>
<source>Good</source>
<comment>Password quality</comment>
<translation>Dobra</translation>
</message>
<message>
<source>Excellent</source>
<comment>Password quality</comment>
<translation>Odlična</translation>
</message>
</context>
<context>
<name>PickcharsDialog</name>
@@ -7171,10 +7279,6 @@ Please consider generating a new key file.</source>
<source>Invalid YubiKey serial %1</source>
<translation type="unfinished"/>
</message>
<message>
<source>Please present or touch your YubiKey to continue…</source>
<translation type="unfinished"/>
</message>
<message>
<source>Enter password to encrypt database (optional): </source>
<translation>Vnesite geslo za šifriranje baze (neobvezno): </translation>
@@ -7652,6 +7756,67 @@ Jedro: %3 %4</translation>
<source>Failed to sign challenge using Windows Hello.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Please present or touch your YubiKey to continue.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Show all the attributes of the entry.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Edit a database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Could not change the database key.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Database was not modified.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Successfully edited the database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Loading the new key file failed: %1</source>
<translation type="unfinished"/>
</message>
<message>
<source>Unset the password for the database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Unset the key file for the database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Cannot use %1 and %2 at the same time.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Cannot remove all the keys from a database.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Cannot remove password: The database does not have a password.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Cannot remove file key: The database does not have a file key.</source>
<translation type="unfinished"/>
</message>
<message>
<source>Found unexpected Key type %1</source>
<translation type="unfinished"/>
</message>
<message>
<source>Set the key file for the database.
This options is deprecated, use --set-key-file instead.</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>QtIOCompressor</name>
@@ -8199,6 +8364,10 @@ Jedro: %3 %4</translation>
<source>Limit search to selected group</source>
<translation type="unfinished"/>
</message>
<message>
<source>Save Search</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>SettingsClientModel</name>
@@ -8411,10 +8580,6 @@ Jedro: %3 %4</translation>
</context>
<context>
<name>TagModel</name>
<message>
<source>All</source>
<translation type="unfinished"/>
</message>
<message>
<source>Expired</source>
<translation type="unfinished"/>
@@ -8423,6 +8588,33 @@ Jedro: %3 %4</translation>
<source>Weak Passwords</source>
<translation type="unfinished"/>
</message>
<message>
<source>All Entries</source>
<translation type="unfinished"/>
</message>
<message>
<source>Clear Search</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>TagView</name>
<message>
<source>Remove Search</source>
<translation type="unfinished"/>
</message>
<message>
<source>Remove Tag</source>
<translation type="unfinished"/>
</message>
<message>
<source>Confirm Remove Tag</source>
<translation type="unfinished"/>
</message>
<message>
<source>Remove tag &quot;%1&quot; from all entries in this database?</source>
<translation type="unfinished"/>
</message>
</context>
<context>
<name>TotpDialog</name>

View File

@@ -9224,15 +9224,15 @@ Bu seçenekler kullanımdan kaldırıldı. yerine --set-key-file kullanın.</tra
</message>
<message>
<source>malformed string, possible unescaped delimiter</source>
<translation>dizge bozuk, büyük olasılıkla kaçış karakteri olmayan tırnak var</translation>
<translation type="unfinished"/>
</message>
<message>
<source>missing closing delimiter</source>
<translation>kapanış tırnağı eksik</translation>
<translation type="unfinished"/>
</message>
<message>
<source>%1, row: %2, column: %3</source>
<translation>%1, %2. satır, %3. sütun</translation>
<translation type="unfinished"/>
</message>
<message>
<source>Tags</source>

View File

@@ -115,6 +115,14 @@
<ComponentRef Id="DesktopShortcut" />
</FeatureRef>
<!-- Detect VCRedist Version -->
<Property Id="VCREDISTINSTALLED">
<RegistrySearch Id="SearchVCRedist" Root="HKLM" Key="SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64" Name="Version" Type="raw" Win64="yes"/>
</Property>
<Condition Message="The installed version of Visual Studio Redistributable is too old. Please install the latest version from: https://aka.ms/vs/17/release/vc_redist.x64.exe">
<![CDATA[VCREDISTINSTALLED AND VCREDISTINSTALLED > "14.32.31332.0"]]>
</Condition>
<!-- Action to launch application after installer exits -->
<Property Id="WixShellExecTarget" Value="[#CM_FP_KeePassXC.exe]" />
<CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />

View File

@@ -65,7 +65,6 @@ parts:
- libxtst-dev
- asciidoctor
- libfreetype-dev
- libkeyutils-dev
stage-packages:
- dbus
- libbotan-2-19
@@ -77,7 +76,6 @@ parts:
- libxtst6
- libfreetype6
- xclip
- libkeyutils1
lint:
ignore:
- library:

View File

@@ -16,19 +16,7 @@
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
add_feature_info(Auto-Type WITH_XC_AUTOTYPE "Automatic password typing")
add_feature_info(Networking WITH_XC_NETWORKING "Compile KeePassXC with network access code (e.g. for downloading website icons)")
add_feature_info(KeePassXC-Browser WITH_XC_BROWSER "Browser integration with KeePassXC-Browser")
add_feature_info(Passkeys WITH_XC_BROWSER_PASSKEYS "Passkeys support for browser integration")
add_feature_info(SSHAgent WITH_XC_SSHAGENT "SSH agent integration compatible with KeeAgent")
add_feature_info(KeeShare WITH_XC_KEESHARE "Sharing integration with KeeShare")
add_feature_info(YubiKey WITH_XC_YUBIKEY "YubiKey HMAC-SHA1 challenge-response")
add_feature_info(UpdateCheck WITH_XC_UPDATECHECK "Automatic update checking")
if(UNIX AND NOT APPLE)
add_feature_info(FdoSecrets WITH_XC_FDOSECRETS "Implement freedesktop.org Secret Storage Spec server side API.")
endif()
set(core_SOURCES
set(keepassx_SOURCES
core/Alloc.cpp
core/AutoTypeAssociations.cpp
core/Base32.cpp
@@ -59,6 +47,7 @@ set(core_SOURCES
core/Tools.cpp
core/Totp.cpp
core/Translator.cpp
core/UrlTools.cpp
cli/Utils.cpp
cli/TextStream.cpp
crypto/Crypto.cpp
@@ -92,19 +81,6 @@ set(core_SOURCES
format/OpVaultReaderBandEntry.cpp
format/OpVaultReaderSections.cpp
format/ProtonPassReader.cpp
keys/CompositeKey.cpp
keys/FileKey.cpp
keys/PasswordKey.cpp
keys/ChallengeResponseKey.cpp
streams/HashedBlockStream.cpp
streams/HashingStream.cpp
streams/HmacBlockStream.cpp
streams/LayeredStream.cpp
streams/qtiocompressor.cpp
streams/StoreDataStream.cpp
streams/SymmetricCipherStream.cpp)
set(gui_SOURCES
gui/styles/styles.qrc
gui/styles/StateColorPalette.cpp
gui/styles/base/phantomcolor.cpp
@@ -112,7 +88,6 @@ set(gui_SOURCES
gui/styles/dark/DarkStyle.cpp
gui/styles/light/LightStyle.cpp
gui/AboutDialog.cpp
gui/ActionCollection.cpp
gui/Application.cpp
gui/CategoryListWidget.cpp
gui/Clipboard.cpp
@@ -144,13 +119,11 @@ set(gui_SOURCES
gui/SettingsWidget.cpp
gui/SortFilterHideProxyModel.cpp
gui/SquareSvgWidget.cpp
gui/ShortcutSettingsPage.cpp
gui/TotpSetupDialog.cpp
gui/TotpDialog.cpp
gui/TotpExportSettingsDialog.cpp
gui/DatabaseOpenDialog.cpp
gui/URLEdit.cpp
gui/UrlTools.cpp
gui/WelcomeWidget.cpp
gui/csvImport/CsvImportWidget.cpp
gui/csvImport/CsvParserModel.cpp
@@ -182,10 +155,6 @@ set(gui_SOURCES
gui/dbsettings/DatabaseSettingsWidgetMetaDataSimple.cpp
gui/dbsettings/DatabaseSettingsWidgetEncryption.cpp
gui/dbsettings/DatabaseSettingsWidgetDatabaseKey.cpp
gui/remote/DatabaseSettingsWidgetRemote.cpp
gui/remote/RemoteHandler.cpp
gui/remote/RemoteProcess.cpp
gui/remote/RemoteSettings.cpp
gui/reports/ReportsWidget.cpp
gui/reports/ReportsDialog.cpp
gui/reports/ReportsWidgetHealthcheck.cpp
@@ -200,7 +169,6 @@ set(gui_SOURCES
gui/widgets/ElidedLabel.cpp
gui/widgets/KPToolBar.cpp
gui/widgets/PopupHelpWidget.cpp
gui/widgets/ShortcutWidget.cpp
gui/wizard/ImportWizard.cpp
gui/wizard/ImportWizardPageReview.cpp
gui/wizard/ImportWizardPageSelect.cpp
@@ -209,82 +177,84 @@ set(gui_SOURCES
gui/wizard/NewDatabaseWizardPageMetaData.cpp
gui/wizard/NewDatabaseWizardPageEncryption.cpp
gui/wizard/NewDatabaseWizardPageDatabaseKey.cpp
quickunlock/QuickUnlockInterface.cpp
../share/icons/icons.qrc
../share/wizard/wizard.qrc)
keys/CompositeKey.cpp
keys/FileKey.cpp
keys/PasswordKey.cpp
keys/ChallengeResponseKey.cpp
streams/HashedBlockStream.cpp
streams/HashingStream.cpp
streams/HmacBlockStream.cpp
streams/LayeredStream.cpp
streams/qtiocompressor.cpp
streams/StoreDataStream.cpp
streams/SymmetricCipherStream.cpp)
if(APPLE)
list(APPEND gui_SOURCES
gui/osutils/macutils/MacPasteboard.cpp
set(keepassx_SOURCES
${keepassx_SOURCES}
core/MacPasteboard.cpp
gui/osutils/macutils/MacUtils.cpp
gui/osutils/macutils/ScreenLockListenerMac.cpp
gui/osutils/macutils/AppKitImpl.mm
gui/osutils/macutils/AppKit.h
quickunlock/TouchID.mm)
# TODO: Remove -Wno-error once deprecation warnings have been resolved.
set_source_files_properties(quickunlock/TouchID.mm PROPERTY COMPILE_FLAGS "-Wno-old-style-cast")
gui/osutils/macutils/AppKit.h)
endif()
if(UNIX AND NOT APPLE)
list(APPEND gui_SOURCES
set(keepassx_SOURCES
${keepassx_SOURCES}
gui/osutils/nixutils/ScreenLockListenerDBus.cpp
gui/osutils/nixutils/NixUtils.cpp)
if("${CMAKE_SYSTEM}" MATCHES "Linux")
list(APPEND core_SOURCES
quickunlock/Polkit.cpp
quickunlock/PolkitDbusTypes.cpp)
endif()
if(WITH_XC_X11)
list(APPEND gui_SOURCES
list(APPEND keepassx_SOURCES
gui/osutils/nixutils/X11Funcs.cpp)
endif()
qt5_add_dbus_adaptor(gui_SOURCES
qt5_add_dbus_adaptor(keepassx_SOURCES
gui/org.keepassxc.KeePassXC.MainWindow.xml
gui/MainWindow.h
MainWindow)
set_source_files_properties(
quickunlock/dbus/org.freedesktop.PolicyKit1.Authority.xml
PROPERTIES
INCLUDE "quickunlock/PolkitDbusTypes.h"
)
qt5_add_dbus_interface(core_SOURCES
quickunlock/dbus/org.freedesktop.PolicyKit1.Authority.xml
polkit_dbus
)
find_library(KEYUTILS_LIBRARIES NAMES keyutils)
if(NOT KEYUTILS_LIBRARIES)
message(FATAL_ERROR "Could not find libkeyutils")
endif()
endif()
if(WIN32)
list(APPEND gui_SOURCES
set(keepassx_SOURCES
${keepassx_SOURCES}
gui/osutils/winutils/ScreenLockListenerWin.cpp
gui/osutils/winutils/WinUtils.cpp)
if (MSVC)
list(APPEND gui_SOURCES quickunlock/WindowsHello.cpp)
list(APPEND keepassx_SOURCES winhello/WindowsHello.cpp)
endif()
endif()
if(WITH_XC_YUBIKEY)
list(APPEND gui_SOURCES gui/osutils/DeviceListener.cpp)
set(keepassx_SOURCES ${keepassx_SOURCES} gui/osutils/DeviceListener.cpp)
if(APPLE)
list(APPEND gui_SOURCES gui/osutils/macutils/DeviceListenerMac.cpp)
set(keepassx_SOURCES ${keepassx_SOURCES} gui/osutils/macutils/DeviceListenerMac.cpp)
elseif(UNIX)
list(APPEND gui_SOURCES gui/osutils/nixutils/DeviceListenerLibUsb.cpp)
set(keepassx_SOURCES ${keepassx_SOURCES} gui/osutils/nixutils/DeviceListenerLibUsb.cpp)
elseif(WIN32)
list(APPEND gui_SOURCES gui/osutils/winutils/DeviceListenerWin.cpp)
set(keepassx_SOURCES ${keepassx_SOURCES} gui/osutils/winutils/DeviceListenerWin.cpp)
endif()
endif()
set(keepassx_SOURCES ${keepassx_SOURCES}
../share/icons/icons.qrc
../share/wizard/wizard.qrc)
set(keepassx_SOURCES_MAINEXE main.cpp)
add_feature_info(Auto-Type WITH_XC_AUTOTYPE "Automatic password typing")
add_feature_info(Networking WITH_XC_NETWORKING "Compile KeePassXC with network access code (e.g. for downloading website icons)")
add_feature_info(KeePassXC-Browser WITH_XC_BROWSER "Browser integration with KeePassXC-Browser")
add_feature_info(Passkeys WITH_XC_BROWSER_PASSKEYS "Passkeys support for browser integration")
add_feature_info(SSHAgent WITH_XC_SSHAGENT "SSH agent integration compatible with KeeAgent")
add_feature_info(KeeShare WITH_XC_KEESHARE "Sharing integration with KeeShare")
add_feature_info(YubiKey WITH_XC_YUBIKEY "YubiKey HMAC-SHA1 challenge-response")
add_feature_info(UpdateCheck WITH_XC_UPDATECHECK "Automatic update checking")
if(UNIX AND NOT APPLE)
add_feature_info(FdoSecrets WITH_XC_FDOSECRETS "Implement freedesktop.org Secret Storage Spec server side API.")
endif()
add_subdirectory(browser)
add_subdirectory(proxy)
if(WITH_XC_BROWSER)
set(browser_LIB browser)
list(APPEND gui_SOURCES
set(keepassxcbrowser_LIB keepassxcbrowser)
set(keepassx_SOURCES ${keepassx_SOURCES}
gui/dbsettings/DatabaseSettingsWidgetBrowser.cpp
gui/entry/EntryURLModel.cpp
gui/reports/ReportsWidgetBrowserStatistics.cpp
@@ -292,7 +262,7 @@ if(WITH_XC_BROWSER)
endif()
if(WITH_XC_BROWSER_PASSKEYS)
list(APPEND gui_SOURCES
set(keepassx_SOURCES ${keepassx_SOURCES}
gui/reports/ReportsWidgetPasskeys.cpp
gui/reports/ReportsPagePasskeys.cpp
gui/passkeys/PasskeyExporter.cpp
@@ -324,114 +294,123 @@ endif()
add_subdirectory(thirdparty)
set(autotype_SOURCES
core/Tools.cpp
autotype/AutoType.cpp
autotype/AutoTypeAction.cpp
autotype/AutoTypeMatchModel.cpp
autotype/AutoTypeMatchView.cpp
autotype/AutoTypeSelectDialog.cpp
autotype/PickcharsDialog.cpp
autotype/ShortcutWidget.cpp
autotype/WindowSelectComboBox.cpp)
add_library(autotype STATIC ${autotype_SOURCES})
target_link_libraries(autotype Qt5::Core Qt5::Widgets)
if(WIN32)
set(keepassx_SOURCES_MAINEXE ${keepassx_SOURCES_MAINEXE} ${CMAKE_SOURCE_DIR}/share/windows/icon.rc)
endif()
if(WITH_XC_YUBIKEY)
list(APPEND core_SOURCES
list(APPEND keepassx_SOURCES
keys/drivers/YubiKey.h
keys/drivers/YubiKey.cpp
keys/drivers/YubiKeyInterface.cpp
keys/drivers/YubiKeyInterfaceUSB.cpp
keys/drivers/YubiKeyInterfacePCSC.cpp)
else()
list(APPEND core_SOURCES
list(APPEND keepassx_SOURCES
keys/drivers/YubiKey.h
keys/drivers/YubiKeyStub.cpp)
endif()
if(WITH_XC_NETWORKING)
list(APPEND gui_SOURCES
networking/HibpDownloader.cpp
networking/NetworkManager.cpp
networking/UpdateChecker.cpp
list(APPEND keepassx_SOURCES
core/HibpDownloader.cpp
core/NetworkManager.cpp
gui/UpdateCheckDialog.cpp
gui/IconDownloader.cpp
gui/IconDownloaderDialog.cpp)
gui/IconDownloaderDialog.cpp
updatecheck/UpdateChecker.cpp)
endif()
if(APPLE)
list(APPEND keepassx_SOURCES touchid/TouchID.mm)
# TODO: Remove -Wno-error once deprecation warnings have been resolved.
set_source_files_properties(touchid/TouchID.mm PROPERTY COMPILE_FLAGS "-Wno-old-style-cast")
endif()
configure_file(config-keepassx.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-keepassx.h)
configure_file(git-info.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/git-info.h)
# Core Library Definition
add_library(keepassxc_core STATIC ${core_SOURCES})
set_target_properties(keepassxc_core PROPERTIES COMPILE_DEFINITIONS KEEPASSX_BUILDING_CORE)
target_link_libraries(keepassxc_core
add_library(autotype STATIC ${autotype_SOURCES})
target_link_libraries(autotype Qt5::Core Qt5::Widgets)
add_library(keepassx_core STATIC ${keepassx_SOURCES})
set_target_properties(keepassx_core PROPERTIES COMPILE_DEFINITIONS KEEPASSX_BUILDING_CORE)
target_link_libraries(keepassx_core
autotype
${keepassxcbrowser_LIB}
${qrcode_LIB}
${fdosecrets_LIB}
Qt5::Core
Qt5::Concurrent
Qt5::Network
Qt5::Widgets
${BOTAN_LIBRARIES}
${PCSC_LIBRARIES}
${ZXCVBN_LIBRARIES}
${ZLIB_LIBRARIES}
${MINIZIP_LIBRARIES}
${ARGON2_LIBRARIES}
${KEYUTILS_LIBRARIES}
${thirdparty_LIBRARIES})
${thirdparty_LIBRARIES}
)
# GUI Library Definition
add_library(keepassxc_gui STATIC ${gui_SOURCES})
set_target_properties(keepassxc_gui PROPERTIES COMPILE_DEFINITIONS KEEPASSX_BUILDING_CORE)
target_link_libraries(keepassxc_gui
keepassxc_core
Qt5::Network
Qt5::Widgets
autotype
${browser_LIB}
${fdosecrets_LIB}
${keeshare_LIB}
${sshagent_LIB})
if(WITH_XC_SSHAGENT)
target_link_libraries(keepassx_core sshagent)
endif()
if(WITH_XC_KEESHARE)
target_link_libraries(keepassx_core keeshare)
endif()
if(APPLE)
target_link_libraries(keepassxc_gui "-framework Foundation -framework AppKit -framework Carbon -framework Security -framework LocalAuthentication -framework ScreenCaptureKit")
target_link_libraries(keepassx_core "-framework Foundation -framework AppKit -framework Carbon -framework Security -framework LocalAuthentication -framework ScreenCaptureKit")
if(Qt5MacExtras_FOUND)
target_link_libraries(keepassxc_gui Qt5::MacExtras)
target_link_libraries(keepassx_core Qt5::MacExtras)
endif()
endif()
if(HAIKU)
target_link_libraries(keepassxc_gui network)
target_link_libraries(keepassx_core network)
endif()
if(UNIX AND NOT APPLE)
target_link_libraries(keepassxc_core Qt5::DBus ${LIBUSB_LIBRARIES})
target_link_libraries(keepassx_core Qt5::DBus ${LIBUSB_LIBRARIES})
if(WITH_XC_X11)
target_link_libraries(keepassxc_gui Qt5::X11Extras X11)
target_link_libraries(keepassx_core Qt5::X11Extras X11)
endif()
include_directories(${Qt5Gui_PRIVATE_INCLUDE_DIRS})
endif()
if(WIN32)
target_link_libraries(keepassxc_gui Wtsapi32.lib Ws2_32.lib)
target_link_libraries(keepassx_core Wtsapi32.lib Ws2_32.lib)
if (MSVC)
target_link_libraries(keepassxc_gui WindowsApp.lib)
target_link_libraries(keepassx_core WindowsApp.lib)
endif()
endif()
# Main Executable Definition
if(WIN32)
include(GenerateProductVersion)
generate_product_version(
WIN32_ResourceFiles
WIN32_ProductVersionFiles
NAME "KeePassXC"
COMPANY_NAME "KeePassXC Team"
VERSION_MAJOR ${KEEPASSXC_VERSION_MAJOR}
VERSION_MINOR ${KEEPASSXC_VERSION_MINOR}
VERSION_PATCH ${KEEPASSXC_VERSION_PATCH}
)
list(APPEND WIN32_ResourceFiles "${CMAKE_SOURCE_DIR}/share/windows/icon.rc")
endif()
add_executable(${PROGNAME} WIN32 main.cpp ${WIN32_ResourceFiles})
target_link_libraries(${PROGNAME} keepassxc_gui)
add_executable(${PROGNAME} WIN32 ${keepassx_SOURCES_MAINEXE} ${WIN32_ProductVersionFiles})
target_link_libraries(${PROGNAME} keepassx_core)
set_target_properties(${PROGNAME} PROPERTIES ENABLE_EXPORTS ON)
# macOS App Bundle
if(APPLE AND WITH_APP_BUNDLE)
install(FILES ${CMAKE_SOURCE_DIR}/share/macosx/embedded.provisionprofile DESTINATION ${BUNDLE_INSTALL_DIR})
configure_file(${CMAKE_SOURCE_DIR}/share/macosx/Info.plist.cmake ${CMAKE_CURRENT_BINARY_DIR}/Info.plist)
@@ -460,7 +439,6 @@ install(TARGETS ${PROGNAME}
BUNDLE DESTINATION . COMPONENT Runtime
RUNTIME DESTINATION ${BIN_INSTALL_DIR} COMPONENT Runtime)
# Windows Installer Definition
if(WIN32)
if(${CMAKE_SIZEOF_VOID_P} EQUAL "8")
set(OUTPUT_FILE_POSTFIX "Win64")
@@ -572,5 +550,5 @@ if(WIN32)
endif()
# The install commands in this subdirectory will be executed after all the install commands in the
# current scope are ran. It is required for correct functioning of macdeployqt.
# current scope are ran. It is required for correct functtioning of macdeployqt.
add_subdirectory(post_install)

View File

@@ -29,7 +29,6 @@
#include "autotype/AutoTypePlatformPlugin.h"
#include "autotype/AutoTypeSelectDialog.h"
#include "autotype/PickcharsDialog.h"
#include "core/Global.h"
#include "core/Resources.h"
#include "core/Tools.h"
#include "gui/MainWindow.h"
@@ -228,7 +227,7 @@ void AutoType::createTestInstance()
QStringList AutoType::windowTitles()
{
if (!m_plugin) {
return {};
return QStringList();
}
return m_plugin->windowTitles();
@@ -360,7 +359,7 @@ void AutoType::executeAutoTypeActions(const Entry* entry,
/**
* Single Autotype entry-point function
* Look up the Auto-Type sequence for the given entry then perform Auto-Type in the active window
* Look up the Auto-Type sequence for the given entry then perfom Auto-Type in the active window
*/
void AutoType::performAutoType(const Entry* entry)
{
@@ -376,7 +375,7 @@ void AutoType::performAutoType(const Entry* entry)
/**
* Extra Autotype entry-point function
* Perform Auto-Type of the directly specified sequence in the active window
* Perfom Auto-Type of the directly specified sequence in the active window
*/
void AutoType::performAutoTypeWithSequence(const Entry* entry, const QString& sequence)
{

View File

@@ -38,17 +38,17 @@ public:
static Result Ok()
{
return {true, false, QString()};
return Result(true, false, QString());
}
static Result Retry(const QString& error)
{
return {false, true, error};
return Result(false, true, error);
}
static Result Failed(const QString& error)
{
return {false, false, error};
return Result(false, false, error);
}
bool isOk() const

View File

@@ -25,7 +25,9 @@
class AutoTypePlatformInterface
{
public:
virtual ~AutoTypePlatformInterface() = default;
virtual ~AutoTypePlatformInterface()
{
}
virtual bool isAvailable() = 0;
virtual QStringList windowTitles() = 0;
virtual WId activeWindow() = 0;

View File

@@ -21,8 +21,12 @@
#include <QCloseEvent>
#include <QMenu>
#include <QScreen>
#include <QShortcut>
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
#include <QScreen>
#else
#include <QDesktopWidget>
#endif
#include "core/Config.h"
#include "core/Database.h"
@@ -92,7 +96,9 @@ AutoTypeSelectDialog::AutoTypeSelectDialog(QWidget* parent)
}
// Required for QScopedPointer
AutoTypeSelectDialog::~AutoTypeSelectDialog() = default;
AutoTypeSelectDialog::~AutoTypeSelectDialog()
{
}
void AutoTypeSelectDialog::setMatches(const QList<AutoTypeMatch>& matches,
const QList<QSharedPointer<Database>>& dbs,
@@ -324,7 +330,7 @@ void AutoTypeSelectDialog::buildActionMenu()
submitAutoTypeMatch(match);
});
#if defined(Q_OS_WIN) || defined(Q_OS_MAC)
#ifdef Q_OS_WIN
auto typeVirtualAction = new QAction(icons()->icon("auto-type"), tr("Use Virtual Keyboard"), nullptr);
m_actionMenu->insertAction(copyUsernameAction, typeVirtualAction);
typeVirtualAction->setShortcut(Qt::CTRL + Qt::Key_4);
@@ -364,29 +370,35 @@ void AutoTypeSelectDialog::buildActionMenu()
}
});
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
// Qt 5.10 introduced a new "feature" to hide shortcuts in context menus
// Unfortunately, Qt::AA_DontShowShortcutsInContextMenus is broken, have to manually enable them
typeUsernameAction->setShortcutVisibleInContextMenu(true);
typePasswordAction->setShortcutVisibleInContextMenu(true);
typeTotpAction->setShortcutVisibleInContextMenu(true);
#if defined(Q_OS_WIN) || defined(Q_OS_MAC)
#if defined(Q_OS_WIN)
typeVirtualAction->setShortcutVisibleInContextMenu(true);
#endif
copyUsernameAction->setShortcutVisibleInContextMenu(true);
copyPasswordAction->setShortcutVisibleInContextMenu(true);
copyTotpAction->setShortcutVisibleInContextMenu(true);
#endif
}
void AutoTypeSelectDialog::showEvent(QShowEvent* event)
{
QDialog::showEvent(event);
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
auto screen = QApplication::screenAt(QCursor::pos());
if (!screen) {
// screenAt can return a nullptr, default to the primary screen
screen = QApplication::primaryScreen();
}
QRect screenGeometry = screen->availableGeometry();
#else
QRect screenGeometry = QApplication::desktop()->availableGeometry(QCursor::pos());
#endif
// Resize to last used size
QSize size = config()->get(Config::GUI_AutoTypeSelectDialogSize).toSize();

View File

@@ -21,8 +21,12 @@
#include "gui/Icons.h"
#include <QPushButton>
#include <QScreen>
#include <QShortcut>
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
#include <QScreen>
#else
#include <QDesktopWidget>
#endif
PickcharsDialog::PickcharsDialog(const QString& string, QWidget* parent)
: QDialog(parent)
@@ -153,11 +157,15 @@ void PickcharsDialog::showEvent(QShowEvent* event)
QDialog::showEvent(event);
// Center on active screen
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
auto screen = QApplication::screenAt(QCursor::pos());
if (!screen) {
// screenAt can return a nullptr, default to the primary screen
screen = QApplication::primaryScreen();
}
QRect screenGeometry = screen->availableGeometry();
#else
QRect screenGeometry = QApplication::desktop()->availableGeometry(QCursor::pos());
#endif
move(screenGeometry.center().x() - (size().width() / 2), screenGeometry.center().y() - (size().height() / 2));
}

View File

@@ -20,8 +20,13 @@
#include <QKeyEvent>
#include <QToolTip>
#include "autotype/AutoType.h"
ShortcutWidget::ShortcutWidget(QWidget* parent)
: QLineEdit(parent)
, m_key(static_cast<Qt::Key>(0))
, m_modifiers(nullptr)
, m_locked(false)
{
setReadOnly(true);
}
@@ -36,11 +41,6 @@ Qt::KeyboardModifiers ShortcutWidget::modifiers() const
return m_modifiers;
}
QKeySequence ShortcutWidget::sequence() const
{
return (m_key == Qt::Key_unknown) ? QKeySequence() : QKeySequence(m_key | m_modifiers);
}
void ShortcutWidget::setShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers)
{
m_key = key;
@@ -48,15 +48,22 @@ void ShortcutWidget::setShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers)
m_locked = true;
displayShortcut(m_key, m_modifiers);
emit shortcutChanged(m_key, m_modifiers);
QString error;
if (autoType()->registerGlobalShortcut(m_key, m_modifiers, &error)) {
setStyleSheet("");
} else {
QToolTip::showText(mapToGlobal(rect().bottomLeft()), error);
setStyleSheet("background-color: #FF9696;");
}
}
void ShortcutWidget::resetShortcut()
{
m_key = Qt::Key_unknown;
m_modifiers = Qt::NoModifier;
m_key = static_cast<Qt::Key>(0);
m_modifiers = nullptr;
m_locked = false;
emit shortcutReset();
autoType()->unregisterGlobalShortcut();
}
void ShortcutWidget::keyPressEvent(QKeyEvent* event)
@@ -83,7 +90,7 @@ void ShortcutWidget::keyEvent(QKeyEvent* event)
return;
}
auto key = static_cast<Qt::Key>(event->key());
Qt::Key key = static_cast<Qt::Key>(event->key());
if (key <= 0 || key == Qt::Key_unknown) {
return;
@@ -109,11 +116,13 @@ void ShortcutWidget::keyEvent(QKeyEvent* event)
setShortcut(key, modifiers);
} else {
resetShortcut();
setStyleSheet("");
displayShortcut(key, modifiers);
}
} else {
if (m_locked) {
resetShortcut();
setStyleSheet("");
}
displayShortcut(static_cast<Qt::Key>(0), modifiers);

View File

@@ -18,7 +18,6 @@
#ifndef KEEPASSX_SHORTCUTWIDGET_H
#define KEEPASSX_SHORTCUTWIDGET_H
#include <QKeySequence>
#include <QLineEdit>
class ShortcutWidget : public QLineEdit
@@ -27,17 +26,10 @@ class ShortcutWidget : public QLineEdit
public:
explicit ShortcutWidget(QWidget* parent = nullptr);
Qt::Key key() const;
Qt::KeyboardModifiers modifiers() const;
QKeySequence sequence() const;
void setShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers);
signals:
void shortcutChanged(Qt::Key key, Qt::KeyboardModifiers modifiers);
void shortcutReset();
protected:
void keyPressEvent(QKeyEvent* event) override;
void keyReleaseEvent(QKeyEvent* event) override;
@@ -47,9 +39,9 @@ private:
void displayShortcut(Qt::Key key, Qt::KeyboardModifiers modifiers);
void resetShortcut();
Qt::Key m_key = Qt::Key_unknown;
Qt::KeyboardModifiers m_modifiers = Qt::NoModifier;
bool m_locked = false;
Qt::Key m_key;
Qt::KeyboardModifiers m_modifiers;
bool m_locked;
};
#endif // KEEPASSX_SHORTCUTWIDGET_H

View File

@@ -250,10 +250,6 @@ AutoTypeAction::Result AutoTypeExecutorMac::execType(const AutoTypeKey* action)
int ch = action->character.toUpper().toLatin1();
m_platform->sendKey(static_cast<Qt::Key>(ch), true, action->modifiers);
m_platform->sendKey(static_cast<Qt::Key>(ch), false, action->modifiers);
} else if (mode == Mode::VIRTUAL) {
int ch = action->character.toLatin1();
m_platform->sendKey(static_cast<Qt::Key>(ch), true, action->modifiers);
m_platform->sendKey(static_cast<Qt::Key>(ch), false, action->modifiers);
} else {
m_platform->sendChar(action->character, true);
m_platform->sendChar(action->character, false);

View File

@@ -29,7 +29,7 @@ QString AutoTypePlatformTest::keyToString(Qt::Key key)
QStringList AutoTypePlatformTest::windowTitles()
{
return {};
return QStringList();
}
WId AutoTypePlatformTest::activeWindow()

View File

@@ -23,7 +23,9 @@
class AutoTypeTestInterface
{
public:
virtual ~AutoTypeTestInterface() = default;
virtual ~AutoTypeTestInterface()
{
}
virtual void setActiveWindowTitle(const QString& title) = 0;
virtual QString actionChars() = 0;

View File

@@ -1,4 +1,4 @@
set(autotype_test_SOURCES AutoTypeTest.cpp)
add_library(keepassxc-autotype-test MODULE ${autotype_test_SOURCES})
target_link_libraries(keepassxc-autotype-test keepassxc_gui ${autotype_LIB} Qt5::Core Qt5::Widgets)
target_link_libraries(keepassxc-autotype-test keepassx_core ${autotype_LIB} Qt5::Core Qt5::Widgets)

View File

@@ -1,7 +1,7 @@
set(autotype_win_SOURCES AutoTypeWindows.cpp)
add_library(keepassxc-autotype-windows MODULE ${autotype_win_SOURCES})
target_link_libraries(keepassxc-autotype-windows keepassxc_gui ${autotype_LIB} Qt5::Core Qt5::Widgets)
target_link_libraries(keepassxc-autotype-windows keepassx_core ${autotype_LIB} Qt5::Core Qt5::Widgets)
install(TARGETS keepassxc-autotype-windows
BUNDLE DESTINATION . COMPONENT Runtime
LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR} COMPONENT Runtime)

View File

@@ -181,17 +181,17 @@ QString AutoTypePlatformX11::windowTitle(Window window, bool useBlacklist)
if (useBlacklist && !title.isEmpty()) {
if (window == m_rootWindow) {
return {};
return QString();
}
QString className = windowClassName(window);
if (m_classBlacklist.contains(className)) {
return {};
return QString();
}
QList<Window> keepassxWindows = widgetsToX11Windows(QApplication::topLevelWidgets());
if (keepassxWindows.contains(window)) {
return {};
return QString();
}
}

View File

@@ -3,7 +3,7 @@ include_directories(SYSTEM ${X11_X11_INCLUDE_PATH})
set(autotype_XCB_SOURCES AutoTypeXCB.cpp)
add_library(keepassxc-autotype-xcb MODULE ${autotype_XCB_SOURCES})
target_link_libraries(keepassxc-autotype-xcb keepassxc_gui Qt5::Core Qt5::Widgets Qt5::X11Extras ${X11_X11_LIB} ${X11_Xi_LIB} ${X11_XTest_LIB})
target_link_libraries(keepassxc-autotype-xcb keepassx_core Qt5::Core Qt5::Widgets Qt5::X11Extras ${X11_X11_LIB} ${X11_Xi_LIB} ${X11_XTest_LIB})
install(TARGETS keepassxc-autotype-xcb
BUNDLE DESTINATION . COMPONENT Runtime
LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR} COMPONENT Runtime)

0
src/browser/BrowserAccessControlDialog.ui Normal file → Executable file
View File

View File

@@ -108,8 +108,6 @@ QJsonObject BrowserAction::handleAction(QLocalSocket* socket, const QJsonObject&
return handleDeleteEntry(json, action);
} else if (action.compare(BROWSER_REQUEST_REQUEST_AUTOTYPE) == 0) {
return handleGlobalAutoType(json, action);
} else if (action.compare("get-database-entries", Qt::CaseSensitive) == 0) {
return handleGetDatabaseEntries(json, action);
#ifdef WITH_XC_BROWSER_PASSKEYS
} else if (action.compare(BROWSER_REQUEST_PASSKEYS_GET) == 0) {
return handlePasskeysGet(json, action);
@@ -389,36 +387,6 @@ QJsonObject BrowserAction::handleGetDatabaseGroups(const QJsonObject& json, cons
return buildResponse(action, browserRequest.incrementedNonce, params);
}
QJsonObject BrowserAction::handleGetDatabaseEntries(const QJsonObject& json, const QString& action)
{
if (!m_associated) {
return getErrorReply(action, ERROR_KEEPASS_ASSOCIATION_FAILED);
}
const auto browserRequest = decodeRequest(json);
if (browserRequest.isEmpty()) {
return getErrorReply(action, ERROR_KEEPASS_CANNOT_DECRYPT_MESSAGE);
}
const auto command = browserRequest.getString("action");
if (command.isEmpty() || command.compare("get-database-entries") != 0) {
return getErrorReply(action, ERROR_KEEPASS_INCORRECT_ACTION);
}
if (!browserSettings()->allowGetDatabaseEntriesRequest()) {
return getErrorReply(action, ERROR_KEEPASS_ACCESS_TO_ALL_ENTRIES_DENIED);
}
const QJsonArray entries = browserService()->getDatabaseEntries();
if (entries.isEmpty()) {
return getErrorReply(action, ERROR_KEEPASS_NO_GROUPS_FOUND);
}
const Parameters params{{"entries", entries}};
return buildResponse(action, browserRequest.incrementedNonce, params);
}
QJsonObject BrowserAction::handleCreateNewGroup(const QJsonObject& json, const QString& action)
{
if (!m_associated) {

View File

@@ -79,7 +79,6 @@ private:
QJsonObject handleSetLogin(const QJsonObject& json, const QString& action);
QJsonObject handleLockDatabase(const QJsonObject& json, const QString& action);
QJsonObject handleGetDatabaseGroups(const QJsonObject& json, const QString& action);
QJsonObject handleGetDatabaseEntries(const QJsonObject& json, const QString& action);
QJsonObject handleCreateNewGroup(const QJsonObject& json, const QString& action);
QJsonObject handleGetTotp(const QJsonObject& json, const QString& action);
QJsonObject handleDeleteEntry(const QJsonObject& json, const QString& action);

View File

@@ -19,7 +19,6 @@
#include "BrowserEntryConfig.h"
#include "core/Entry.h"
#include "core/Global.h"
#include "core/Tools.h"
#include <QJsonDocument>
@@ -35,22 +34,22 @@ BrowserEntryConfig::BrowserEntryConfig(QObject* parent)
QStringList BrowserEntryConfig::allowedHosts() const
{
return m_allowedHosts.values();
return m_allowedHosts.toList();
}
void BrowserEntryConfig::setAllowedHosts(const QStringList& allowedHosts)
{
m_allowedHosts = Tools::asSet(allowedHosts);
m_allowedHosts = allowedHosts.toSet();
}
QStringList BrowserEntryConfig::deniedHosts() const
{
return m_deniedHosts.values();
return m_deniedHosts.toList();
}
void BrowserEntryConfig::setDeniedHosts(const QStringList& deniedHosts)
{
m_deniedHosts = Tools::asSet(deniedHosts);
m_deniedHosts = deniedHosts.toSet();
}
bool BrowserEntryConfig::isAllowed(const QString& host) const

0
src/browser/BrowserEntrySaveDialog.ui Normal file → Executable file
View File

0
src/browser/BrowserPasskeysConfirmationDialog.ui Normal file → Executable file
View File

View File

@@ -26,9 +26,9 @@
#include "BrowserSettings.h"
#include "core/EntryAttributes.h"
#include "core/Tools.h"
#include "core/UrlTools.h"
#include "gui/MainWindow.h"
#include "gui/MessageBox.h"
#include "gui/UrlTools.h"
#include "gui/osutils/OSUtils.h"
#ifdef WITH_XC_BROWSER_PASSKEYS
#include "BrowserPasskeys.h"
@@ -49,7 +49,6 @@
#include <QJsonObject>
#include <QListWidget>
#include <QLocalSocket>
#include <QLocale>
#include <QProgressDialog>
#include <QStringView>
#include <QUrl>
@@ -71,7 +70,6 @@ const QString BrowserService::OPTION_HIDE_ENTRY = QStringLiteral("BrowserHideEnt
const QString BrowserService::OPTION_ONLY_HTTP_AUTH = QStringLiteral("BrowserOnlyHttpAuth");
const QString BrowserService::OPTION_NOT_HTTP_AUTH = QStringLiteral("BrowserNotHttpAuth");
const QString BrowserService::OPTION_OMIT_WWW = QStringLiteral("BrowserOmitWww");
const QString BrowserService::OPTION_RESTRICT_KEY = QStringLiteral("BrowserRestrictKey");
Q_GLOBAL_STATIC(BrowserService, s_browserService);
@@ -603,8 +601,7 @@ QString BrowserService::storeKey(const QString& key)
return {};
}
contains =
db->metadata()->customData()->contains(CustomData::getKeyWithPrefix(CustomData::BrowserKeyPrefix, id));
contains = db->metadata()->customData()->contains(CustomData::BrowserKeyPrefix + id);
if (contains) {
dialogResult = MessageBox::warning(m_currentDatabaseWidget,
tr("KeePassXC - Overwrite existing key?"),
@@ -617,8 +614,8 @@ QString BrowserService::storeKey(const QString& key)
} while (contains && dialogResult == MessageBox::Cancel);
hideWindow();
db->metadata()->customData()->set(CustomData::getKeyWithPrefix(CustomData::BrowserKeyPrefix, id), key);
db->metadata()->customData()->set(CustomData::getKeyWithPrefix(CustomData::Created, id),
db->metadata()->customData()->set(CustomData::BrowserKeyPrefix + id, key);
db->metadata()->customData()->set(QString("%1%2").arg(CustomData::Created, id),
QLocale::system().toString(Clock::currentDateTime(), QLocale::ShortFormat));
return id;
}
@@ -630,7 +627,7 @@ QString BrowserService::getKey(const QString& id)
return {};
}
return db->metadata()->customData()->value(CustomData::getKeyWithPrefix(CustomData::BrowserKeyPrefix, id));
return db->metadata()->customData()->value(CustomData::BrowserKeyPrefix + id);
}
#ifdef WITH_XC_BROWSER_PASSKEYS
@@ -1012,7 +1009,6 @@ void BrowserService::removePluginData(Entry* entry) const
QList<Entry*> BrowserService::searchEntries(const QSharedPointer<Database>& db,
const QString& siteUrl,
const QString& formUrl,
const QStringList& keys,
bool passkey)
{
QList<Entry*> entries;
@@ -1027,12 +1023,6 @@ QList<Entry*> BrowserService::searchEntries(const QSharedPointer<Database>& db,
continue;
}
// If a key restriction is specified and not contained in the keys list then skip this group.
auto restrictKey = group->resolveCustomDataString(BrowserService::OPTION_RESTRICT_KEY);
if (!restrictKey.isEmpty() && !keys.contains(restrictKey)) {
continue;
}
const auto omitWwwSubdomain =
group->resolveCustomDataTriState(BrowserService::OPTION_OMIT_WWW) == Group::Enable;
@@ -1069,36 +1059,30 @@ QList<Entry*> BrowserService::searchEntries(const QString& siteUrl,
const StringPairList& keyList,
bool passkey)
{
// Check if database is connected with KeePassXC-Browser. If so, return browser key (otherwise empty)
// Check if database is connected with KeePassXC-Browser
auto databaseConnected = [&](const QSharedPointer<Database>& db) {
for (const StringPair& keyPair : keyList) {
const auto key = db->metadata()->customData()->value(
CustomData::getKeyWithPrefix(CustomData::BrowserKeyPrefix, keyPair.first));
QString key = db->metadata()->customData()->value(CustomData::BrowserKeyPrefix + keyPair.first);
if (!key.isEmpty() && keyPair.second == key) {
return keyPair.first;
return true;
}
}
return QString();
return false;
};
// Get the list of databases to search
QList<QSharedPointer<Database>> databases;
QStringList keys;
if (browserSettings()->searchInAllDatabases()) {
for (auto dbWidget : getMainWindow()->getOpenDatabases()) {
auto db = dbWidget->database();
auto key = databaseConnected(dbWidget->database());
if (db && !key.isEmpty()) {
if (db && databaseConnected(dbWidget->database())) {
databases << db;
keys << key;
}
}
} else {
const auto& db = getDatabase();
auto key = databaseConnected(db);
if (!key.isEmpty()) {
if (databaseConnected(db)) {
databases << db;
keys << key;
}
}
@@ -1107,16 +1091,84 @@ QList<Entry*> BrowserService::searchEntries(const QString& siteUrl,
QList<Entry*> entries;
do {
for (const auto& db : databases) {
entries << searchEntries(db, siteUrl, formUrl, keys, passkey);
entries << searchEntries(db, siteUrl, formUrl, passkey);
}
} while (entries.isEmpty() && removeFirstDomain(hostname));
return entries;
}
QString BrowserService::decodeCustomDataRestrictKey(const QString& key)
void BrowserService::convertAttributesToCustomData(QSharedPointer<Database> db)
{
return key.isEmpty() ? tr("Disable") : key;
if (!db) {
return;
}
QList<Entry*> entries = db->rootGroup()->entriesRecursive();
QProgressDialog progress(tr("Converting attributes to custom data…"), tr("Abort"), 0, entries.count());
progress.setWindowModality(Qt::WindowModal);
int counter = 0;
int keyCounter = 0;
for (auto* entry : entries) {
if (progress.wasCanceled()) {
return;
}
if (moveSettingsToCustomData(entry, KEEPASSHTTP_NAME)) {
++counter;
}
if (moveSettingsToCustomData(entry, KEEPASSXCBROWSER_OLD_NAME)) {
++counter;
}
if (moveSettingsToCustomData(entry, KEEPASSXCBROWSER_NAME)) {
++counter;
}
if (entry->title() == KEEPASSHTTP_NAME || entry->title().contains(KEEPASSXCBROWSER_NAME, Qt::CaseInsensitive)) {
keyCounter += moveKeysToCustomData(entry, db);
db->recycleEntry(entry);
}
progress.setValue(progress.value() + 1);
}
progress.reset();
if (counter > 0) {
MessageBox::information(nullptr,
tr("KeePassXC: Converted KeePassHTTP attributes"),
tr("Successfully converted attributes from %1 entry(s).\n"
"Moved %2 keys to custom data.",
"")
.arg(counter)
.arg(keyCounter),
MessageBox::Ok);
} else if (counter == 0 && keyCounter > 0) {
MessageBox::information(nullptr,
tr("KeePassXC: Converted KeePassHTTP attributes"),
tr("Successfully moved %n keys to custom data.", "", keyCounter),
MessageBox::Ok);
} else {
MessageBox::information(nullptr,
tr("KeePassXC: No entry with KeePassHTTP attributes found!"),
tr("The active database does not contain an entry with KeePassHTTP attributes."),
MessageBox::Ok);
}
// Rename password groupName
Group* rootGroup = db->rootGroup();
if (!rootGroup) {
return;
}
for (auto* g : rootGroup->groupsRecursive(true)) {
if (g->name() == KEEPASSHTTP_GROUP_NAME) {
g->setName(KEEPASSXCBROWSER_GROUP_NAME);
break;
}
}
}
void BrowserService::requestGlobalAutoType(const QString& search)
@@ -1655,6 +1707,84 @@ QSharedPointer<Database> BrowserService::selectedDatabase()
return getDatabase();
}
bool BrowserService::moveSettingsToCustomData(Entry* entry, const QString& name)
{
if (entry->attributes()->contains(name)) {
QString attr = entry->attributes()->value(name);
entry->beginUpdate();
if (!attr.isEmpty()) {
entry->customData()->set(KEEPASSXCBROWSER_NAME, attr);
}
entry->attributes()->remove(name);
entry->endUpdate();
return true;
}
return false;
}
int BrowserService::moveKeysToCustomData(Entry* entry, QSharedPointer<Database> db)
{
int keyCounter = 0;
for (const auto& key : entry->attributes()->keys()) {
if (key.contains(CustomData::BrowserLegacyKeyPrefix)) {
QString publicKey = key;
publicKey.remove(CustomData::BrowserLegacyKeyPrefix);
// Add key to database custom data
if (db && !db->metadata()->customData()->contains(CustomData::BrowserKeyPrefix + publicKey)) {
db->metadata()->customData()->set(CustomData::BrowserKeyPrefix + publicKey,
entry->attributes()->value(key));
++keyCounter;
}
}
}
return keyCounter;
}
bool BrowserService::checkLegacySettings(QSharedPointer<Database> db)
{
if (!db || !browserSettings()->isEnabled() || browserSettings()->noMigrationPrompt()) {
return false;
}
bool legacySettingsFound = false;
QList<Entry*> entries = db->rootGroup()->entriesRecursive();
for (const auto& e : entries) {
if (e->isRecycled()) {
continue;
}
if ((e->attributes()->contains(KEEPASSHTTP_NAME) || e->attributes()->contains(KEEPASSXCBROWSER_NAME))
|| (e->title() == KEEPASSHTTP_NAME || e->title().contains(KEEPASSXCBROWSER_NAME, Qt::CaseInsensitive))) {
legacySettingsFound = true;
break;
}
}
if (!legacySettingsFound) {
return false;
}
auto* checkbox = new QCheckBox(tr("Don't show this warning again"));
QObject::connect(checkbox, &QCheckBox::stateChanged, [&](int state) {
browserSettings()->setNoMigrationPrompt(static_cast<Qt::CheckState>(state) == Qt::CheckState::Checked);
});
auto dialogResult =
MessageBox::warning(nullptr,
tr("KeePassXC: Legacy browser integration settings detected"),
tr("Your KeePassXC-Browser settings need to be moved into the database settings.\n"
"This is necessary to maintain your current browser connections.\n"
"Would you like to migrate your existing settings now?"),
MessageBox::Yes | MessageBox::No,
MessageBox::NoButton,
MessageBox::Raise,
checkbox);
return dialogResult == MessageBox::Yes;
}
void BrowserService::hideWindow() const
{
if (m_prevWindowState == WindowState::Minimized) {
@@ -1738,6 +1868,11 @@ void BrowserService::databaseUnlocked(DatabaseWidget* dbWidget)
QJsonObject msg;
msg["action"] = QString("database-unlocked");
m_browserHost->broadcastClientMessage(msg);
auto db = dbWidget->database();
if (checkLegacySettings(db)) {
convertAttributesToCustomData(db);
}
}
}

View File

@@ -122,8 +122,7 @@ public:
void removePluginData(Entry* entry) const;
QJsonArray findEntries(const EntryParameters& entryParameters, const StringPairList& keyList, bool* entriesFound);
void requestGlobalAutoType(const QString& search);
static QString decodeCustomDataRestrictKey(const QString& key);
static void convertAttributesToCustomData(QSharedPointer<Database> db);
static const QString KEEPASSXCBROWSER_NAME;
static const QString KEEPASSXCBROWSER_OLD_NAME;
@@ -132,8 +131,6 @@ public:
static const QString OPTION_ONLY_HTTP_AUTH;
static const QString OPTION_NOT_HTTP_AUTH;
static const QString OPTION_OMIT_WWW;
static const QString ADDITIONAL_URL;
static const QString OPTION_RESTRICT_KEY;
signals:
void requestUnlock();
@@ -166,7 +163,6 @@ private:
QList<Entry*> searchEntries(const QSharedPointer<Database>& db,
const QString& siteUrl,
const QString& formUrl,
const QStringList& keys = {},
bool passkey = false);
QList<Entry*>
searchEntries(const QString& siteUrl, const QString& formUrl, const StringPairList& keyList, bool passkey = false);
@@ -205,10 +201,15 @@ private:
bool handleURLWithWildcards(const QUrl& entryQUrl, const QString& siteUrl);
QString getDatabaseRootUuid();
QString getDatabaseRecycleBinUuid();
bool checkLegacySettings(QSharedPointer<Database> db);
void hideWindow() const;
void raiseWindow(const bool force = false);
void updateWindowState();
static bool moveSettingsToCustomData(Entry* entry, const QString& name);
static int moveKeysToCustomData(Entry* entry, QSharedPointer<Database> db);
QPointer<BrowserHost> m_browserHost;
QHash<QString, QSharedPointer<BrowserAction>> m_browserClients;

View File

@@ -237,16 +237,6 @@ void BrowserSettings::setUpdateBinaryPath(bool enabled)
config()->set(Config::Browser_UpdateBinaryPath, enabled);
}
bool BrowserSettings::allowGetDatabaseEntriesRequest()
{
return config()->get(Config::Browser_AllowGetDatabaseEntriesRequest).toBool();
}
void BrowserSettings::setAllowGetDatabaseEntriesRequest(bool enabled)
{
config()->set(Config::Browser_AllowGetDatabaseEntriesRequest, enabled);
}
bool BrowserSettings::allowExpiredCredentials()
{
return config()->get(Config::Browser_AllowExpiredCredentials).toBool();

View File

@@ -66,8 +66,6 @@ public:
#endif
bool updateBinaryPath();
void setUpdateBinaryPath(bool enabled);
bool allowGetDatabaseEntriesRequest();
void setAllowGetDatabaseEntriesRequest(bool enabled);
bool allowExpiredCredentials();
void setAllowExpiredCredentials(bool enabled);

View File

@@ -118,7 +118,6 @@ void BrowserSettingsWidget::loadSettings()
m_ui->useCustomProxy->setChecked(settings->useCustomProxy());
m_ui->customProxyLocation->setText(settings->replaceHomePath(settings->customProxyLocation()));
m_ui->updateBinaryPath->setChecked(settings->updateBinaryPath());
m_ui->allowGetDatabaseEntriesRequest->setChecked(settings->allowGetDatabaseEntriesRequest());
m_ui->allowExpiredCredentials->setChecked(settings->allowExpiredCredentials());
m_ui->chromeSupport->setChecked(settings->browserSupport(BrowserShared::CHROME));
m_ui->chromiumSupport->setChecked(settings->browserSupport(BrowserShared::CHROMIUM));
@@ -232,7 +231,6 @@ void BrowserSettingsWidget::saveSettings()
settings->setCustomProxyLocation(resolveCustomProxyLocation());
settings->setUpdateBinaryPath(m_ui->updateBinaryPath->isChecked());
settings->setAllowGetDatabaseEntriesRequest(m_ui->allowGetDatabaseEntriesRequest->isChecked());
settings->setAllowExpiredCredentials(m_ui->allowExpiredCredentials->isChecked());
settings->setAlwaysAllowAccess(m_ui->alwaysAllowAccess->isChecked());
settings->setAlwaysAllowUpdate(m_ui->alwaysAllowUpdate->isChecked());

View File

@@ -340,16 +340,6 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="allowGetDatabaseEntriesRequest">
<property name="toolTip">
<string>Allow keepassxc-proxy to list all entries with their title, URL and UUID in connected databases.</string>
</property>
<property name="text">
<string>Allow limited access to all entries in connected databases (ignores site access restrictions)</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="useCustomProxy">
<property name="toolTip">

11
src/browser/CMakeLists.txt Normal file → Executable file
View File

@@ -16,7 +16,7 @@
if(WITH_XC_BROWSER)
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
set(browser_SOURCES
set(keepassxcbrowser_SOURCES
BrowserAccessControlDialog.cpp
BrowserAction.cpp
BrowserEntryConfig.cpp
@@ -29,10 +29,11 @@ if(WITH_XC_BROWSER)
BrowserSettings.cpp
BrowserShared.cpp
CustomTableWidget.cpp
NativeMessageInstaller.cpp)
NativeMessageInstaller.cpp
)
if(WITH_XC_BROWSER_PASSKEYS)
list(APPEND browser_SOURCES
list(APPEND keepassxcbrowser_SOURCES
BrowserCbor.cpp
BrowserPasskeys.cpp
BrowserPasskeysClient.cpp
@@ -40,6 +41,6 @@ if(WITH_XC_BROWSER)
PasskeyUtils.cpp)
endif()
add_library(browser STATIC ${browser_SOURCES})
target_link_libraries(browser Qt5::Core Qt5::Concurrent Qt5::Widgets Qt5::Network ${BOTAN_LIBRARIES})
add_library(keepassxcbrowser STATIC ${keepassxcbrowser_SOURCES})
target_link_libraries(keepassxcbrowser Qt5::Core Qt5::Concurrent Qt5::Widgets Qt5::Network ${BOTAN_LIBRARIES})
endif()

View File

@@ -1,5 +1,6 @@
/*
* Copyright (C) 2025 KeePassXC Team <team@keepassxc.org>
* Copyright (C) 2017 Sami Vänttinen <sami.vanttinen@protonmail.com>
* 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
@@ -69,7 +70,7 @@ namespace
const QString TARGET_DIR_FIREFOX = QStringLiteral("/.mozilla/native-messaging-hosts");
const QString TARGET_DIR_VIVALDI = QStringLiteral("/vivaldi/NativeMessagingHosts");
const QString TARGET_DIR_TOR_BROWSER = QStringLiteral(
"/torbrowser/tbb/x86_64/tor-browser/Browser/TorBrowser/Data/Browser/.mozilla/native-messaging-hosts");
"/torbrowser/tbb/x86_64/tor-browser_en-US/Browser/TorBrowser/Data/Browser/.mozilla/native-messaging-hosts");
const QString TARGET_DIR_BRAVE = QStringLiteral("/BraveSoftware/Brave-Browser/NativeMessagingHosts");
const QString TARGET_DIR_EDGE = QStringLiteral("/microsoft-edge/NativeMessagingHosts");
#endif

View File

@@ -20,7 +20,7 @@
#include "BrowserPasskeys.h"
#include "core/EntryAttributes.h"
#include "core/Tools.h"
#include "gui/UrlTools.h"
#include "core/UrlTools.h"
#include <QList>
#include <QUrl>

View File

@@ -19,7 +19,6 @@
#include "Generate.h"
#include "Utils.h"
#include "core/Global.h"
#include "core/Group.h"
#include "core/PasswordGenerator.h"
@@ -75,7 +74,7 @@ int Add::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<Q
// Cannot use those 2 options at the same time!
if (parser->isSet(Add::GenerateOption) && parser->isSet(Add::PasswordPromptOption)) {
err << QObject::tr("Cannot generate a password and prompt at the same time.") << Qt::endl;
err << QObject::tr("Cannot generate a password and prompt at the same time.") << endl;
return EXIT_FAILURE;
}
@@ -91,7 +90,7 @@ int Add::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<Q
Entry* entry = database->rootGroup()->addEntryWithPath(entryPath);
if (!entry) {
err << QObject::tr("Could not create entry with path %1.").arg(entryPath) << Qt::endl;
err << QObject::tr("Could not create entry with path %1.").arg(entryPath) << endl;
return EXIT_FAILURE;
}
@@ -109,7 +108,7 @@ int Add::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<Q
if (parser->isSet(Add::PasswordPromptOption)) {
if (!parser->isSet(Command::QuietOption)) {
out << QObject::tr("Enter password for new entry: ") << Qt::flush;
out << QObject::tr("Enter password for new entry: ") << flush;
}
QString password = Utils::getPassword(parser->isSet(Command::QuietOption));
entry->setPassword(password);
@@ -120,12 +119,12 @@ int Add::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<Q
QString errorMessage;
if (!database->save(Database::Atomic, {}, &errorMessage)) {
err << QObject::tr("Writing the database failed %1.").arg(errorMessage) << Qt::endl;
err << QObject::tr("Writing the database failed %1.").arg(errorMessage) << endl;
return EXIT_FAILURE;
}
if (!parser->isSet(Command::QuietOption)) {
out << QObject::tr("Successfully added entry %1.").arg(entry->title()) << Qt::endl;
out << QObject::tr("Successfully added entry %1.").arg(entry->title()) << endl;
}
return EXIT_SUCCESS;
}

View File

@@ -18,7 +18,6 @@
#include "AddGroup.h"
#include "Utils.h"
#include "core/Global.h"
#include "core/Group.h"
#include <QCommandLineParser>
@@ -30,7 +29,9 @@ AddGroup::AddGroup()
positionalArguments.append({QString("group"), QObject::tr("Path of the group to add."), QString("")});
}
AddGroup::~AddGroup() = default;
AddGroup::~AddGroup()
{
}
int AddGroup::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<QCommandLineParser> parser)
{
@@ -46,29 +47,29 @@ int AddGroup::executeWithDatabase(QSharedPointer<Database> database, QSharedPoin
Group* group = database->rootGroup()->findGroupByPath(groupPath);
if (group) {
err << QObject::tr("Group %1 already exists!").arg(groupPath) << Qt::endl;
err << QObject::tr("Group %1 already exists!").arg(groupPath) << endl;
return EXIT_FAILURE;
}
Group* parentGroup = database->rootGroup()->findGroupByPath(parentGroupPath);
if (!parentGroup) {
err << QObject::tr("Group %1 not found.").arg(parentGroupPath) << Qt::endl;
err << QObject::tr("Group %1 not found.").arg(parentGroupPath) << endl;
return EXIT_FAILURE;
}
auto newGroup = new Group();
Group* newGroup = new Group();
newGroup->setUuid(QUuid::createUuid());
newGroup->setName(groupName);
newGroup->setParent(parentGroup);
QString errorMessage;
if (!database->save(Database::Atomic, {}, &errorMessage)) {
err << QObject::tr("Writing the database failed %1.").arg(errorMessage) << Qt::endl;
err << QObject::tr("Writing the database failed %1.").arg(errorMessage) << endl;
return EXIT_FAILURE;
}
if (!parser->isSet(Command::QuietOption)) {
out << QObject::tr("Successfully added group %1.").arg(groupName) << Qt::endl;
out << QObject::tr("Successfully added group %1.").arg(groupName) << endl;
}
return EXIT_SUCCESS;
}

View File

@@ -24,9 +24,9 @@ class AddGroup : public DatabaseCommand
{
public:
AddGroup();
~AddGroup() override;
~AddGroup();
int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser) override;
int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser);
};
#endif // KEEPASSXC_ADDGROUP_H

View File

@@ -18,7 +18,6 @@
#include "Analyze.h"
#include "Utils.h"
#include "core/Global.h"
#include "core/Group.h"
#include "core/HibpOffline.h"
@@ -61,24 +60,23 @@ int Analyze::executeWithDatabase(QSharedPointer<Database> database, QSharedPoint
auto okon = parser->value(Analyze::OkonOption);
if (!okon.isEmpty()) {
out << QObject::tr("Evaluating database entries using okon…") << Qt::endl;
out << QObject::tr("Evaluating database entries using okon…") << endl;
if (!HibpOffline::okonReport(database, okon, hibpDatabase, findings, &error)) {
err << error << Qt::endl;
err << error << endl;
return EXIT_FAILURE;
}
} else {
QFile hibpFile(hibpDatabase);
if (!hibpFile.open(QFile::ReadOnly)) {
err << QObject::tr("Failed to open HIBP file %1: %2").arg(hibpDatabase).arg(hibpFile.errorString())
<< Qt::endl;
err << QObject::tr("Failed to open HIBP file %1: %2").arg(hibpDatabase).arg(hibpFile.errorString()) << endl;
return EXIT_FAILURE;
}
out << QObject::tr("Evaluating database entries against HIBP file, this will take a while…") << Qt::endl;
out << QObject::tr("Evaluating database entries against HIBP file, this will take a while…") << endl;
if (!HibpOffline::report(database, hibpFile, findings, &error)) {
err << error << Qt::endl;
err << error << endl;
return EXIT_FAILURE;
}
}
@@ -93,10 +91,9 @@ int Analyze::executeWithDatabase(QSharedPointer<Database> database, QSharedPoint
}
if (count > 0) {
out << QObject::tr("Password for '%1' has been leaked %2 time(s)!", "", count).arg(path).arg(count)
<< Qt::endl;
out << QObject::tr("Password for '%1' has been leaked %2 time(s)!", "", count).arg(path).arg(count) << endl;
} else {
out << QObject::tr("Password for '%1' has been leaked!").arg(path) << Qt::endl;
out << QObject::tr("Password for '%1' has been leaked!").arg(path) << endl;
}
}

View File

@@ -18,7 +18,6 @@
#include "AttachmentExport.h"
#include "Utils.h"
#include "core/Global.h"
#include "core/Group.h"
#include <QCommandLineParser>
@@ -50,7 +49,7 @@ int AttachmentExport::executeWithDatabase(QSharedPointer<Database> database, QSh
auto entry = database->rootGroup()->findEntryByPath(entryPath);
if (!entry) {
err << QObject::tr("Could not find entry with path %1.").arg(entryPath) << Qt::endl;
err << QObject::tr("Could not find entry with path %1.").arg(entryPath) << endl;
return EXIT_FAILURE;
}
@@ -58,32 +57,32 @@ int AttachmentExport::executeWithDatabase(QSharedPointer<Database> database, QSh
auto attachments = entry->attachments();
if (!attachments->hasKey(attachmentName)) {
err << QObject::tr("Could not find attachment with name %1.").arg(attachmentName) << Qt::endl;
err << QObject::tr("Could not find attachment with name %1.").arg(attachmentName) << endl;
return EXIT_FAILURE;
}
if (parser->isSet(AttachmentExport::StdoutOption)) {
// Output to STDOUT even in quiet mode
Utils::STDOUT << attachments->value(attachmentName) << Qt::flush;
Utils::STDOUT << attachments->value(attachmentName) << flush;
return EXIT_SUCCESS;
}
if (args.size() < 4) {
err << QObject::tr("No export target given. Please use '--stdout' or specify an 'export-file'.") << Qt::endl;
err << QObject::tr("No export target given. Please use '--stdout' or specify an 'export-file'.") << endl;
return EXIT_FAILURE;
}
auto exportFileName = args.at(3);
QFile exportFile(exportFileName);
if (!exportFile.open(QIODevice::WriteOnly)) {
err << QObject::tr("Could not open output file %1.").arg(exportFileName) << Qt::endl;
err << QObject::tr("Could not open output file %1.").arg(exportFileName) << endl;
return EXIT_FAILURE;
}
exportFile.write(attachments->value(attachmentName));
out << QObject::tr("Successfully exported attachment %1 of entry %2 to %3.")
.arg(attachmentName, entryPath, exportFileName)
<< Qt::endl;
<< endl;
return EXIT_SUCCESS;
}

View File

@@ -18,7 +18,6 @@
#include "AttachmentImport.h"
#include "Utils.h"
#include "core/Global.h"
#include "core/Group.h"
#include <QCommandLineParser>
@@ -49,7 +48,7 @@ int AttachmentImport::executeWithDatabase(QSharedPointer<Database> database, QSh
auto entry = database->rootGroup()->findEntryByPath(entryPath);
if (!entry) {
err << QObject::tr("Could not find entry with path %1.").arg(entryPath) << Qt::endl;
err << QObject::tr("Could not find entry with path %1.").arg(entryPath) << endl;
return EXIT_FAILURE;
}
@@ -57,7 +56,7 @@ int AttachmentImport::executeWithDatabase(QSharedPointer<Database> database, QSh
auto attachments = entry->attachments();
if (attachments->hasKey(attachmentName) && !parser->isSet(AttachmentImport::ForceOption)) {
err << QObject::tr("Attachment %1 already exists for entry %2.").arg(attachmentName, entryPath) << Qt::endl;
err << QObject::tr("Attachment %1 already exists for entry %2.").arg(attachmentName, entryPath) << endl;
return EXIT_FAILURE;
}
@@ -65,7 +64,7 @@ int AttachmentImport::executeWithDatabase(QSharedPointer<Database> database, QSh
QFile importFile(importFileName);
if (!importFile.open(QIODevice::ReadOnly)) {
err << QObject::tr("Could not open attachment file %1.").arg(importFileName) << Qt::endl;
err << QObject::tr("Could not open attachment file %1.").arg(importFileName) << endl;
return EXIT_FAILURE;
}
@@ -75,12 +74,12 @@ int AttachmentImport::executeWithDatabase(QSharedPointer<Database> database, QSh
QString errorMessage;
if (!database->save(Database::Atomic, {}, &errorMessage)) {
err << QObject::tr("Writing the database failed %1.").arg(errorMessage) << Qt::endl;
err << QObject::tr("Writing the database failed %1.").arg(errorMessage) << endl;
return EXIT_FAILURE;
}
out << QObject::tr("Successfully imported attachment %1 as %2 to entry %3.")
.arg(importFileName, attachmentName, entryPath)
<< Qt::endl;
<< endl;
return EXIT_SUCCESS;
}

View File

@@ -18,7 +18,6 @@
#include "AttachmentRemove.h"
#include "Utils.h"
#include "core/Global.h"
#include "core/Group.h"
#include <QCommandLineParser>
@@ -42,7 +41,7 @@ int AttachmentRemove::executeWithDatabase(QSharedPointer<Database> database, QSh
auto entry = database->rootGroup()->findEntryByPath(entryPath);
if (!entry) {
err << QObject::tr("Could not find entry with path %1.").arg(entryPath) << Qt::endl;
err << QObject::tr("Could not find entry with path %1.").arg(entryPath) << endl;
return EXIT_FAILURE;
}
@@ -50,7 +49,7 @@ int AttachmentRemove::executeWithDatabase(QSharedPointer<Database> database, QSh
auto attachments = entry->attachments();
if (!attachments->hasKey(attachmentName)) {
err << QObject::tr("Could not find attachment with name %1.").arg(attachmentName) << Qt::endl;
err << QObject::tr("Could not find attachment with name %1.").arg(attachmentName) << endl;
return EXIT_FAILURE;
}
@@ -60,10 +59,10 @@ int AttachmentRemove::executeWithDatabase(QSharedPointer<Database> database, QSh
QString errorMessage;
if (!database->save(Database::Atomic, {}, &errorMessage)) {
err << QObject::tr("Writing the database failed %1.").arg(errorMessage) << Qt::endl;
err << QObject::tr("Writing the database failed %1.").arg(errorMessage) << endl;
return EXIT_FAILURE;
}
out << QObject::tr("Successfully removed attachment %1 from entry %2.").arg(attachmentName, entryPath) << Qt::endl;
out << QObject::tr("Successfully removed attachment %1 from entry %2.").arg(attachmentName, entryPath) << endl;
return EXIT_SUCCESS;
}

View File

@@ -58,7 +58,7 @@ add_executable(keepassxc-cli keepassxc-cli.cpp)
target_link_libraries(keepassxc-cli
${GPGERROR_LIBRARIES}
cli
keepassxc_core)
keepassx_core)
install(TARGETS keepassxc-cli
BUNDLE DESTINATION . COMPONENT Runtime

View File

@@ -37,12 +37,6 @@ const QCommandLineOption Clip::TotpOption =
QCommandLineOption(QStringList() << "t" << "totp",
QObject::tr("Copy the current TOTP to the clipboard (equivalent to \"-a totp\")."));
const QCommandLineOption Clip::UuidOption =
QCommandLineOption(QStringList() << "uuid", QObject::tr("Copy the entry's UUID to the clipboard."));
const QCommandLineOption Clip::TagsOption =
QCommandLineOption(QStringList() << "tags", QObject::tr("Copy the entry's tag list to the clipboard."));
const QCommandLineOption Clip::BestMatchOption =
QCommandLineOption(QStringList() << "b" << "best-match",
QObject::tr("Must match only one entry, otherwise a list of possible matches is shown."));
@@ -53,8 +47,6 @@ Clip::Clip()
description = QObject::tr("Copy an entry's attribute to the clipboard.");
options.append(Clip::AttributeOption);
options.append(Clip::TotpOption);
options.append(Clip::UuidOption);
options.append(Clip::TagsOption);
options.append(Clip::BestMatchOption);
positionalArguments.append(
{QString("entry"), QObject::tr("Path of the entry to clip.", "clip = copy to clipboard"), QString("")});
@@ -77,7 +69,7 @@ int Clip::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
bool ok;
timeout = args.at(2).toInt(&ok);
if (!ok) {
err << QObject::tr("Invalid timeout value %1.").arg(args.at(2)) << Qt::endl;
err << QObject::tr("Invalid timeout value %1.").arg(args.at(2)) << endl;
return EXIT_FAILURE;
}
}
@@ -88,14 +80,14 @@ int Clip::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
const auto& searchTerm = args.at(1);
const auto results = searcher.search(QString("title:%1").arg(searchTerm), database->rootGroup(), true);
if (results.count() > 1) {
err << QObject::tr("Multiple entries matching:") << Qt::endl;
err << QObject::tr("Multiple entries matching:") << endl;
for (const Entry* result : results) {
err << result->path().prepend('/') << Qt::endl;
err << result->path().prepend('/') << endl;
}
return EXIT_FAILURE;
} else {
entryPath = (results.isEmpty()) ? searchTerm : results[0]->path().prepend('/');
out << QObject::tr("Using matching entry: %1").arg(entryPath) << Qt::endl;
out << QObject::tr("Using matching entry: %1").arg(entryPath) << endl;
}
} else {
entryPath = args.at(1);
@@ -103,17 +95,12 @@ int Clip::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
auto* entry = database->rootGroup()->findEntryByPath(entryPath);
if (!entry) {
err << QObject::tr("Entry %1 not found.").arg(entryPath) << Qt::endl;
err << QObject::tr("Entry %1 not found.").arg(entryPath) << endl;
return EXIT_FAILURE;
}
auto optionCount = parser->isSet(AttributeOption) ? 1 : 0;
optionCount += parser->isSet(TotpOption) ? 1 : 0;
optionCount += parser->isSet(UuidOption) ? 1 : 0;
optionCount += parser->isSet(TagsOption) ? 1 : 0;
if (optionCount > 1) {
err << QObject::tr("ERROR: Cannot specify multiple options at once (--attribute, --totp, --uuid, --tags).")
<< Qt::endl;
if (parser->isSet(AttributeOption) && parser->isSet(TotpOption)) {
err << QObject::tr("ERROR: Please specify one of --attribute or --totp, not both.") << endl;
return EXIT_FAILURE;
}
@@ -122,27 +109,22 @@ int Clip::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
bool found = false;
if (parser->isSet(TotpOption) || selectedAttribute == "totp") {
if (!entry->hasTotp()) {
err << QObject::tr("Entry with path %1 has no TOTP set up.").arg(entryPath) << Qt::endl;
err << QObject::tr("Entry with path %1 has no TOTP set up.").arg(entryPath) << endl;
return EXIT_FAILURE;
}
selectedAttribute = "totp";
found = true;
value = entry->totp();
selectedAttribute = "TOTP";
found = true;
} else if (parser->isSet(UuidOption)) {
value = entry->uuid().toString();
selectedAttribute = "UUID";
found = true;
} else if (parser->isSet(TagsOption)) {
value = entry->tags();
selectedAttribute = "Tags";
} else if (Utils::EntryFieldNames.contains(selectedAttribute)) {
value = Utils::getTopLevelField(entry, selectedAttribute);
found = true;
} else {
QStringList attrs = Utils::findAttributes(*entry->attributes(), selectedAttribute);
if (attrs.size() > 1) {
err << QObject::tr("ERROR: attribute %1 is ambiguous, it matches %2.")
.arg(selectedAttribute, QLocale().createSeparatedList(attrs))
<< Qt::endl;
<< endl;
return EXIT_FAILURE;
} else if (attrs.size() == 1) {
found = true;
@@ -152,7 +134,7 @@ int Clip::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
}
if (!found) {
out << QObject::tr("Attribute \"%1\" not found.").arg(selectedAttribute) << Qt::endl;
out << QObject::tr("Attribute \"%1\" not found.").arg(selectedAttribute) << endl;
return EXIT_FAILURE;
}
@@ -161,7 +143,7 @@ int Clip::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
return exitCode;
}
out << QObject::tr("Entry's \"%1\" attribute copied to the clipboard!").arg(selectedAttribute) << Qt::endl;
out << QObject::tr("Entry's \"%1\" attribute copied to the clipboard!").arg(selectedAttribute) << endl;
if (timeout <= 0) {
return exitCode;
@@ -171,13 +153,13 @@ int Clip::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
while (timeout > 0) {
out << '\r' << QString(lastLine.size(), ' ') << '\r';
lastLine = QObject::tr("Clearing the clipboard in %1 second(s)...", "", timeout).arg(timeout);
out << lastLine << Qt::flush;
out << lastLine << flush;
Tools::sleep(1000);
--timeout;
}
Utils::clipText("");
out << '\r' << QString(lastLine.size(), ' ') << '\r';
out << QObject::tr("Clipboard cleared!") << Qt::endl;
out << QObject::tr("Clipboard cleared!") << endl;
return EXIT_SUCCESS;
}

View File

@@ -29,8 +29,6 @@ public:
static const QCommandLineOption AttributeOption;
static const QCommandLineOption TotpOption;
static const QCommandLineOption UuidOption;
static const QCommandLineOption TagsOption;
static const QCommandLineOption BestMatchOption;
};

View File

@@ -100,7 +100,9 @@ Command::Command()
options.append(Command::QuietOption);
}
Command::~Command() = default;
Command::~Command()
{
}
QString Command::getDescriptionLine()
{

View File

@@ -18,7 +18,6 @@
#include "DatabaseCreate.h"
#include "Utils.h"
#include "core/Global.h"
#include "keys/FileKey.h"
#include <QCommandLineParser>
@@ -68,13 +67,13 @@ QSharedPointer<Database> DatabaseCreate::initializeDatabaseFromOptions(const QSh
if (decryptionTimeValue.length() != 0) {
decryptionTime = decryptionTimeValue.toInt();
if (decryptionTime <= 0) {
err << QObject::tr("Invalid decryption time %1.").arg(decryptionTimeValue) << Qt::endl;
err << QObject::tr("Invalid decryption time %1.").arg(decryptionTimeValue) << endl;
return {};
}
if (decryptionTime < Kdf::MIN_ENCRYPTION_TIME || decryptionTime > Kdf::MAX_ENCRYPTION_TIME) {
err << QObject::tr("Target decryption time must be between %1 and %2.")
.arg(QString::number(Kdf::MIN_ENCRYPTION_TIME), QString::number(Kdf::MAX_ENCRYPTION_TIME))
<< Qt::endl;
<< endl;
return {};
}
}
@@ -84,7 +83,7 @@ QSharedPointer<Database> DatabaseCreate::initializeDatabaseFromOptions(const QSh
if (parser->isSet(DatabaseCreate::SetPasswordOption)) {
auto passwordKey = Utils::getConfirmedPassword();
if (passwordKey.isNull()) {
err << QObject::tr("Failed to set database password.") << Qt::endl;
err << QObject::tr("Failed to set database password.") << endl;
return {};
}
key->addKey(passwordKey);
@@ -102,7 +101,7 @@ QSharedPointer<Database> DatabaseCreate::initializeDatabaseFromOptions(const QSh
}
if (!Utils::loadFileKey(keyFilePath, fileKey)) {
err << QObject::tr("Loading the key file failed") << Qt::endl;
err << QObject::tr("Loading the key file failed") << endl;
return {};
}
@@ -112,7 +111,7 @@ QSharedPointer<Database> DatabaseCreate::initializeDatabaseFromOptions(const QSh
}
if (key->isEmpty()) {
err << QObject::tr("No key is set. Aborting database creation.") << Qt::endl;
err << QObject::tr("No key is set. Aborting database creation.") << endl;
return {};
}
@@ -123,15 +122,15 @@ QSharedPointer<Database> DatabaseCreate::initializeDatabaseFromOptions(const QSh
auto kdf = db->kdf();
Q_ASSERT(kdf);
out << QObject::tr("Benchmarking key derivation function for %1ms delay.").arg(decryptionTimeValue) << Qt::endl;
out << QObject::tr("Benchmarking key derivation function for %1ms delay.").arg(decryptionTimeValue) << endl;
int rounds = kdf->benchmark(decryptionTime);
out << QObject::tr("Setting %1 rounds for key derivation function.").arg(QString::number(rounds)) << Qt::endl;
out << QObject::tr("Setting %1 rounds for key derivation function.").arg(QString::number(rounds)) << endl;
kdf->setRounds(rounds);
bool ok = db->changeKdf(kdf);
if (!ok) {
err << QObject::tr("error while setting database key derivation settings.") << Qt::endl;
err << QObject::tr("error while setting database key derivation settings.") << endl;
return {};
}
}
@@ -147,7 +146,7 @@ QSharedPointer<Database> DatabaseCreate::initializeDatabaseFromOptions(const QSh
* If a key file is specified but it can't be loaded, the function will
* fail.
*
* If the database is being saved in a non existent directory, the
* If the database is being saved in a non existant directory, the
* function will fail.
*
* @return EXIT_SUCCESS on success, or EXIT_FAILURE on failure
@@ -166,7 +165,7 @@ int DatabaseCreate::execute(const QStringList& arguments)
const QString& databaseFilename = args.at(0);
if (QFileInfo::exists(databaseFilename)) {
err << QObject::tr("File %1 already exists.").arg(databaseFilename) << Qt::endl;
err << QObject::tr("File %1 already exists.").arg(databaseFilename) << endl;
return EXIT_FAILURE;
}
@@ -177,10 +176,10 @@ int DatabaseCreate::execute(const QStringList& arguments)
QString errorMessage;
if (!db->saveAs(databaseFilename, Database::Atomic, {}, &errorMessage)) {
err << QObject::tr("Failed to save the database: %1.").arg(errorMessage) << Qt::endl;
err << QObject::tr("Failed to save the database: %1.").arg(errorMessage) << endl;
return EXIT_FAILURE;
}
out << QObject::tr("Successfully created new database.") << Qt::endl;
out << QObject::tr("Successfully created new database.") << endl;
return EXIT_SUCCESS;
}

View File

@@ -19,7 +19,6 @@
#include "Utils.h"
#include "cli/DatabaseCreate.h"
#include "core/Global.h"
#include "keys/ChallengeResponseKey.h"
#include "keys/FileKey.h"
#include "keys/PasswordKey.h"
@@ -54,7 +53,7 @@ int DatabaseEdit::executeWithDatabase(QSharedPointer<Database> database, QShared
err << QObject::tr("Cannot use %1 and %2 at the same time.")
.arg(DatabaseCreate::SetPasswordOption.names().at(0))
.arg(DatabaseEdit::UnsetPasswordOption.names().at(0))
<< Qt::endl;
<< endl;
return EXIT_FAILURE;
}
@@ -62,7 +61,7 @@ int DatabaseEdit::executeWithDatabase(QSharedPointer<Database> database, QShared
err << QObject::tr("Cannot use %1 and %2 at the same time.")
.arg(DatabaseCreate::SetKeyFileOption.names().at(0))
.arg(DatabaseEdit::UnsetKeyFileOption.names().at(0))
<< Qt::endl;
<< endl;
return EXIT_FAILURE;
}
@@ -77,7 +76,7 @@ int DatabaseEdit::executeWithDatabase(QSharedPointer<Database> database, QShared
parser->value(DatabaseCreate::SetKeyFileOption),
parser->isSet(DatabaseEdit::UnsetKeyFileOption));
if (newDatabaseKey.isNull()) {
err << QObject::tr("Could not change the database key.") << Qt::endl;
err << QObject::tr("Could not change the database key.") << endl;
return EXIT_FAILURE;
}
database->setKey(newDatabaseKey);
@@ -85,17 +84,17 @@ int DatabaseEdit::executeWithDatabase(QSharedPointer<Database> database, QShared
}
if (!databaseWasChanged) {
out << QObject::tr("Database was not modified.") << Qt::endl;
out << QObject::tr("Database was not modified.") << endl;
return EXIT_SUCCESS;
}
QString errorMessage;
if (!database->save(Database::Atomic, {}, &errorMessage)) {
err << QObject::tr("Writing the database failed: %1").arg(errorMessage) << Qt::endl;
err << QObject::tr("Writing the database failed: %1").arg(errorMessage) << endl;
return EXIT_FAILURE;
}
out << QObject::tr("Successfully edited the database.") << Qt::endl;
out << QObject::tr("Successfully edited the database.") << endl;
return EXIT_SUCCESS;
}
@@ -114,19 +113,19 @@ QSharedPointer<CompositeKey> DatabaseEdit::getNewDatabaseKey(QSharedPointer<Data
auto currentChallengeResponseKey = database->key()->getChallengeResponseKey(ChallengeResponseKey::UUID);
if (removePassword && currentPasswordKey.isNull()) {
err << QObject::tr("Cannot remove password: The database does not have a password.") << Qt::endl;
err << QObject::tr("Cannot remove password: The database does not have a password.") << endl;
return {};
}
if (removeKeyFile && currentFileKey.isNull()) {
err << QObject::tr("Cannot remove file key: The database does not have a file key.") << Qt::endl;
err << QObject::tr("Cannot remove file key: The database does not have a file key.") << endl;
return {};
}
if (updatePassword) {
QSharedPointer<PasswordKey> newPasswordKey = Utils::getConfirmedPassword();
if (newPasswordKey.isNull()) {
err << QObject::tr("Failed to set database password.") << Qt::endl;
err << QObject::tr("Failed to set database password.") << endl;
return {};
}
newDatabaseKey->addKey(newPasswordKey);
@@ -138,7 +137,7 @@ QSharedPointer<CompositeKey> DatabaseEdit::getNewDatabaseKey(QSharedPointer<Data
QSharedPointer<FileKey> newFileKey = QSharedPointer<FileKey>::create();
QString errorMessage;
if (!Utils::loadFileKey(newFileKeyPath, newFileKey)) {
err << QObject::tr("Loading the new key file failed: %1").arg(errorMessage) << Qt::endl;
err << QObject::tr("Loading the new key file failed: %1").arg(errorMessage) << endl;
return {};
}
newDatabaseKey->addKey(newFileKey);
@@ -151,13 +150,13 @@ QSharedPointer<CompositeKey> DatabaseEdit::getNewDatabaseKey(QSharedPointer<Data
// silently removed from the database.
for (const QSharedPointer<Key>& key : database->key()->keys()) {
if (key->uuid() != PasswordKey::UUID && key->uuid() != FileKey::UUID) {
err << QObject::tr("Found unexpected Key type %1").arg(key->uuid().toString()) << Qt::endl;
err << QObject::tr("Found unexpected Key type %1").arg(key->uuid().toString()) << endl;
return {};
}
}
for (const QSharedPointer<ChallengeResponseKey>& key : database->key()->challengeResponseKeys()) {
if (key->uuid() != ChallengeResponseKey::UUID) {
err << QObject::tr("Found unexpected Key type %1").arg(key->uuid().toString()) << Qt::endl;
err << QObject::tr("Found unexpected Key type %1").arg(key->uuid().toString()) << endl;
return {};
}
}
@@ -167,7 +166,7 @@ QSharedPointer<CompositeKey> DatabaseEdit::getNewDatabaseKey(QSharedPointer<Data
}
if (newDatabaseKey->keys().isEmpty() && newDatabaseKey->challengeResponseKeys().isEmpty()) {
err << QObject::tr("Cannot remove all the keys from a database.") << Qt::endl;
err << QObject::tr("Cannot remove all the keys from a database.") << endl;
return {};
}

View File

@@ -18,7 +18,6 @@
#include "DatabaseInfo.h"
#include "Utils.h"
#include "core/Clock.h"
#include "core/DatabaseStats.h"
#include "core/Global.h"
#include "core/Group.h"
@@ -36,39 +35,39 @@ int DatabaseInfo::executeWithDatabase(QSharedPointer<Database> database, QShared
{
auto& out = Utils::STDOUT;
out << QObject::tr("UUID: ") << database->uuid().toString() << Qt::endl;
out << QObject::tr("Name: ") << database->metadata()->name() << Qt::endl;
out << QObject::tr("Description: ") << database->metadata()->description() << Qt::endl;
out << QObject::tr("UUID: ") << database->uuid().toString() << endl;
out << QObject::tr("Name: ") << database->metadata()->name() << endl;
out << QObject::tr("Description: ") << database->metadata()->description() << endl;
for (auto& cipher : asConst(KeePass2::CIPHERS)) {
if (cipher == database->cipher()) {
out << QObject::tr("Cipher: ") << KeePass2::cipherToString(cipher) << Qt::endl;
out << QObject::tr("Cipher: ") << KeePass2::cipherToString(cipher) << endl;
}
}
out << QObject::tr("KDF: ") << database->kdf()->toString() << Qt::endl;
out << QObject::tr("KDF: ") << database->kdf()->toString() << endl;
if (database->metadata()->recycleBinEnabled()) {
out << QObject::tr("Recycle bin is enabled.") << Qt::endl;
out << QObject::tr("Recycle bin is enabled.") << endl;
} else {
out << QObject::tr("Recycle bin is not enabled.") << Qt::endl;
out << QObject::tr("Recycle bin is not enabled.") << endl;
}
DatabaseStats stats(database);
out << QObject::tr("Location") << ": " << database->filePath() << Qt::endl;
out << QObject::tr("Database created") << ": " << Clock::toString(database->rootGroup()->timeInfo().creationTime())
<< Qt::endl;
out << QObject::tr("Last saved") << ": " << Clock::toString(stats.modified) << Qt::endl;
out << QObject::tr("Location") << ": " << database->filePath() << endl;
out << QObject::tr("Database created") << ": "
<< database->rootGroup()->timeInfo().creationTime().toString(Qt::DefaultLocaleShortDate) << endl;
out << QObject::tr("Last saved") << ": " << stats.modified.toString(Qt::DefaultLocaleShortDate) << endl;
out << QObject::tr("Unsaved changes") << ": " << (database->isModified() ? QObject::tr("yes") : QObject::tr("no"))
<< Qt::endl;
out << QObject::tr("Number of groups") << ": " << QString::number(stats.groupCount) << Qt::endl;
out << QObject::tr("Number of entries") << ": " << QString::number(stats.entryCount) << Qt::endl;
out << QObject::tr("Number of expired entries") << ": " << QString::number(stats.expiredEntries) << Qt::endl;
out << QObject::tr("Unique passwords") << ": " << QString::number(stats.uniquePasswords) << Qt::endl;
out << QObject::tr("Non-unique passwords") << ": " << QString::number(stats.reusedPasswords) << Qt::endl;
out << QObject::tr("Maximum password reuse") << ": " << QString::number(stats.maxPwdReuse()) << Qt::endl;
out << QObject::tr("Number of short passwords") << ": " << QString::number(stats.shortPasswords) << Qt::endl;
out << QObject::tr("Number of weak passwords") << ": " << QString::number(stats.weakPasswords) << Qt::endl;
out << QObject::tr("Entries excluded from reports") << ": " << QString::number(stats.excludedEntries) << Qt::endl;
<< endl;
out << QObject::tr("Number of groups") << ": " << QString::number(stats.groupCount) << endl;
out << QObject::tr("Number of entries") << ": " << QString::number(stats.entryCount) << endl;
out << QObject::tr("Number of expired entries") << ": " << QString::number(stats.expiredEntries) << endl;
out << QObject::tr("Unique passwords") << ": " << QString::number(stats.uniquePasswords) << endl;
out << QObject::tr("Non-unique passwords") << ": " << QString::number(stats.reusedPasswords) << endl;
out << QObject::tr("Maximum password reuse") << ": " << QString::number(stats.maxPwdReuse()) << endl;
out << QObject::tr("Number of short passwords") << ": " << QString::number(stats.shortPasswords) << endl;
out << QObject::tr("Number of weak passwords") << ": " << QString::number(stats.weakPasswords) << endl;
out << QObject::tr("Entries excluded from reports") << ": " << QString::number(stats.excludedEntries) << endl;
out << QObject::tr("Average password length") << ": " << QObject::tr("%1 characters").arg(stats.averagePwdLength())
<< Qt::endl;
<< endl;
return EXIT_SUCCESS;
}

View File

@@ -25,7 +25,7 @@ class DatabaseInfo : public DatabaseCommand
public:
DatabaseInfo();
int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser) override;
int executeWithDatabase(QSharedPointer<Database> db, QSharedPointer<QCommandLineParser> parser);
};
#endif // KEEPASSXC_DATABASEINFO_H

View File

@@ -18,7 +18,6 @@
#include "Diceware.h"
#include "Utils.h"
#include "core/Global.h"
#include "core/PassphraseGenerator.h"
#include <QCommandLineParser>
@@ -57,7 +56,7 @@ int Diceware::execute(const QStringList& arguments)
if (wordCount.isEmpty()) {
dicewareGenerator.setWordCount(PassphraseGenerator::DefaultWordCount);
} else if (wordCount.toInt() <= 0) {
err << QObject::tr("Invalid word count %1").arg(wordCount) << Qt::endl;
err << QObject::tr("Invalid word count %1").arg(wordCount) << endl;
return EXIT_FAILURE;
} else {
dicewareGenerator.setWordCount(wordCount.toInt());
@@ -71,12 +70,12 @@ int Diceware::execute(const QStringList& arguments)
if (!dicewareGenerator.isValid()) {
// We already validated the word count input so if the generator is invalid, it
// must be because the word list is too small.
err << QObject::tr("Cannot generate valid passphrases because the wordlist is too short") << Qt::endl;
err << QObject::tr("Cannot generate valid passphrases because the wordlist is too short") << endl;
return EXIT_FAILURE;
}
QString password = dicewareGenerator.generatePassphrase();
out << password << Qt::endl;
out << password << endl;
return EXIT_SUCCESS;
}

View File

@@ -20,7 +20,6 @@
#include "Add.h"
#include "Generate.h"
#include "Utils.h"
#include "core/Global.h"
#include "core/Group.h"
#include "core/PasswordGenerator.h"
@@ -65,7 +64,7 @@ int Edit::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
// Cannot use those 2 options at the same time!
if (parser->isSet(Add::GenerateOption) && parser->isSet(Add::PasswordPromptOption)) {
err << QObject::tr("Cannot generate a password and prompt at the same time.") << Qt::endl;
err << QObject::tr("Cannot generate a password and prompt at the same time.") << endl;
return EXIT_FAILURE;
}
@@ -82,7 +81,7 @@ int Edit::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
Entry* entry = database->rootGroup()->findEntryByPath(entryPath);
if (!entry) {
err << QObject::tr("Could not find entry with path %1.").arg(entryPath) << Qt::endl;
err << QObject::tr("Could not find entry with path %1.").arg(entryPath) << endl;
return EXIT_FAILURE;
}
@@ -92,7 +91,7 @@ int Edit::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
QString title = parser->value(Edit::TitleOption);
bool prompt = parser->isSet(Add::PasswordPromptOption);
if (username.isEmpty() && url.isEmpty() && notes.isEmpty() && title.isEmpty() && !prompt && !generate) {
err << QObject::tr("Not changing any field for entry %1.").arg(entryPath) << Qt::endl;
err << QObject::tr("Not changing any field for entry %1.").arg(entryPath) << endl;
return EXIT_FAILURE;
}
@@ -115,7 +114,7 @@ int Edit::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
}
if (prompt) {
out << QObject::tr("Enter new password for entry: ") << Qt::flush;
out << QObject::tr("Enter new password for entry: ") << flush;
QString password = Utils::getPassword(parser->isSet(Command::QuietOption));
entry->setPassword(password);
} else if (generate) {
@@ -127,10 +126,10 @@ int Edit::executeWithDatabase(QSharedPointer<Database> database, QSharedPointer<
QString errorMessage;
if (!database->save(Database::Atomic, {}, &errorMessage)) {
err << QObject::tr("Writing the database failed: %1").arg(errorMessage) << Qt::endl;
err << QObject::tr("Writing the database failed: %1").arg(errorMessage) << endl;
return EXIT_FAILURE;
}
out << QObject::tr("Successfully edited entry %1.").arg(entry->title()) << Qt::endl;
out << QObject::tr("Successfully edited entry %1.").arg(entry->title()) << endl;
return EXIT_SUCCESS;
}

View File

@@ -18,7 +18,6 @@
#include "Estimate.h"
#include "Utils.h"
#include "core/Global.h"
#include "core/PasswordHealth.h"
#include <QCommandLineParser>
@@ -40,13 +39,13 @@ static void estimate(const char* pwd, bool advanced)
{
auto& out = Utils::STDOUT;
auto len = static_cast<int>(strlen(pwd));
int len = static_cast<int>(strlen(pwd));
if (!advanced) {
const auto e = PasswordHealth(pwd).entropy();
// clang-format off
out << QObject::tr("Length %1").arg(len, 0) << '\t'
<< QObject::tr("Entropy %1").arg(e, 0, 'f', 3) << '\t'
<< QObject::tr("Log10 %1").arg(e * 0.301029996, 0, 'f', 3) << Qt::endl;
<< QObject::tr("Log10 %1").arg(e * 0.301029996, 0, 'f', 3) << endl;
// clang-format on
} else {
int pwdLen = 0;
@@ -61,7 +60,7 @@ static void estimate(const char* pwd, bool advanced)
out << QObject::tr("Length %1").arg(len) << '\t'
<< QObject::tr("Entropy %1").arg(e, 0, 'f', 3) << '\t'
<< QObject::tr("Log10 %1").arg(e * 0.301029996, 0, 'f', 3) << "\n "
<< QObject::tr("Multi-word extra bits %1").arg(m, 0, 'f', 1) << Qt::endl;
<< QObject::tr("Multi-word extra bits %1").arg(m, 0, 'f', 1) << endl;
// clang-format on
p = info;
pwdLen = 0;
@@ -134,13 +133,13 @@ static void estimate(const char* pwd, bool advanced)
for (n = 0; n < p->Length; ++n, ++pwd) {
out << *pwd;
}
out << Qt::endl;
out << endl;
p = p->Next;
}
ZxcvbnFreeInfo(info);
if (pwdLen != len) {
out << QObject::tr("*** Password length (%1) != sum of length of parts (%2) ***").arg(len).arg(pwdLen)
<< Qt::endl;
<< endl;
}
}
}

View File

@@ -19,7 +19,6 @@
#include "TextStream.h"
#include "Utils.h"
#include "core/Global.h"
#include "format/CsvExporter.h"
#include "format/HtmlExporter.h"
@@ -47,7 +46,7 @@ int Export::executeWithDatabase(QSharedPointer<Database> database, QSharedPointe
QByteArray xmlData;
QString errorMessage;
if (!database->extract(xmlData, &errorMessage)) {
err << QObject::tr("Unable to export database to XML: %1").arg(errorMessage) << Qt::endl;
err << QObject::tr("Unable to export database to XML: %1").arg(errorMessage) << endl;
return EXIT_FAILURE;
}
out.write(xmlData.constData());
@@ -58,7 +57,7 @@ int Export::executeWithDatabase(QSharedPointer<Database> database, QSharedPointe
HtmlExporter htmlExporter;
out << htmlExporter.exportDatabase(database);
} else {
err << QObject::tr("Unsupported format %1").arg(format) << Qt::endl;
err << QObject::tr("Unsupported format %1").arg(format) << endl;
return EXIT_FAILURE;
}

View File

@@ -18,7 +18,6 @@
#include "Generate.h"
#include "Utils.h"
#include "core/Global.h"
#include "core/PasswordGenerator.h"
#include <QCommandLineParser>
@@ -82,13 +81,13 @@ QSharedPointer<PasswordGenerator> Generate::createGenerator(QSharedPointer<QComm
if (passwordLength.isEmpty()) {
passwordGenerator->setLength(PasswordGenerator::DefaultLength);
} else if (passwordLength.toInt() <= 0) {
err << QObject::tr("Invalid password length %1").arg(passwordLength) << Qt::endl;
return {};
err << QObject::tr("Invalid password length %1").arg(passwordLength) << endl;
return QSharedPointer<PasswordGenerator>(nullptr);
} else {
passwordGenerator->setLength(passwordLength.toInt());
}
PasswordGenerator::CharClasses classes;
PasswordGenerator::CharClasses classes = 0x0;
if (parser->isSet(Generate::LowerCaseOption)) {
classes |= PasswordGenerator::LowerLetters;
@@ -106,7 +105,7 @@ QSharedPointer<PasswordGenerator> Generate::createGenerator(QSharedPointer<QComm
classes |= PasswordGenerator::EASCII;
}
PasswordGenerator::GeneratorFlags flags;
PasswordGenerator::GeneratorFlags flags = 0x0;
if (parser->isSet(Generate::ExcludeSimilarCharsOption)) {
flags |= PasswordGenerator::ExcludeLookAlike;
@@ -128,8 +127,8 @@ QSharedPointer<PasswordGenerator> Generate::createGenerator(QSharedPointer<QComm
passwordGenerator->setExcludedCharacterSet(parser->value(Generate::ExcludeCharsOption));
if (!passwordGenerator->isValid()) {
err << QObject::tr("Invalid password generator after applying all options") << Qt::endl;
return {};
err << QObject::tr("Invalid password generator after applying all options") << endl;
return QSharedPointer<PasswordGenerator>(nullptr);
}
return passwordGenerator;
@@ -149,7 +148,7 @@ int Generate::execute(const QStringList& arguments)
auto& out = Utils::STDOUT;
QString password = passwordGenerator->generatePassword();
out << password << Qt::endl;
out << password << endl;
return EXIT_SUCCESS;
}

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