Compare commits
62 Commits
2.7.0-beta
...
2.6.6
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9c108b9510 | ||
|
|
596821ca0d | ||
|
|
faf48d0b02 | ||
|
|
4bdc2539f9 | ||
|
|
6422fe5ca5 | ||
|
|
9e2399adf4 | ||
|
|
c661fa331f | ||
|
|
db9fc57a37 | ||
|
|
2b262c5b24 | ||
|
|
ec33474845 | ||
|
|
e63881ccfb | ||
|
|
ffdc37cd87 | ||
|
|
205ffd30ed | ||
|
|
5cfbde0bb7 | ||
|
|
2a02242d44 | ||
|
|
6ebd341ea4 | ||
|
|
a228219214 | ||
|
|
6248697443 | ||
|
|
def08ac1db | ||
|
|
b2c636d9c7 | ||
|
|
7f2281940d | ||
|
|
aaf8f18852 | ||
|
|
29de94b656 | ||
|
|
438172bef9 | ||
|
|
7941d59f4a | ||
|
|
1fdfc153be | ||
|
|
9ae5b49136 | ||
|
|
f08086529b | ||
|
|
5be06190bb | ||
|
|
b47272a5ce | ||
|
|
ae20ee61be | ||
|
|
7264b7fc26 | ||
|
|
0c57c7a67b | ||
|
|
215ca536d0 | ||
|
|
0ce4e7001c | ||
|
|
8f0e0b6f94 | ||
|
|
bec7dafa91 | ||
|
|
9478ae30a0 | ||
|
|
3626ac1681 | ||
|
|
24977edf58 | ||
|
|
34a78f0ec3 | ||
|
|
3e8a195eda | ||
|
|
50bde82f17 | ||
|
|
bf0fd6f189 | ||
|
|
109671900b | ||
|
|
2889341acd | ||
|
|
874e9e1075 | ||
|
|
48f2efbc92 | ||
|
|
f7d387d233 | ||
|
|
dad4ad68f3 | ||
|
|
63df00a723 | ||
|
|
db18a14cde | ||
|
|
35d215aa70 | ||
|
|
a3b9700f90 | ||
|
|
0d3d5db87c | ||
|
|
fa239865f2 | ||
|
|
4216f1d03e | ||
|
|
7fdc6010c5 | ||
|
|
031f31f83f | ||
|
|
2ddd61cff6 | ||
|
|
61ed2fff44 | ||
|
|
54b382f3fe |
@@ -19,7 +19,7 @@ AlwaysBreakBeforeMultilineStrings: false
|
||||
AlwaysBreakTemplateDeclarations: false
|
||||
BinPackArguments: false
|
||||
BinPackParameters: false
|
||||
BraceWrapping:
|
||||
BraceWrapping:
|
||||
AfterClass: true
|
||||
AfterFunction: true
|
||||
AfterControlStatement: false
|
||||
@@ -44,7 +44,7 @@ DerivePointerAlignment: false
|
||||
DisableFormat: false
|
||||
ExperimentalAutoDetectBinPacking: false
|
||||
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
|
||||
IncludeCategories:
|
||||
IncludeCategories:
|
||||
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
|
||||
Priority: 2
|
||||
- Regex: '^(<|"(gtest|isl|json)/)'
|
||||
@@ -85,3 +85,4 @@ Standard: Cpp11
|
||||
TabWidth: 4
|
||||
UseTab: Never
|
||||
...
|
||||
|
||||
|
||||
3
.gitattributes
vendored
@@ -14,6 +14,3 @@ AppImage-Recipe.sh export-ignore
|
||||
|
||||
# binary files
|
||||
*.ai binary
|
||||
|
||||
# Line endings harmony
|
||||
* text=auto
|
||||
|
||||
2
.github/CONTRIBUTING.md
vendored
@@ -63,7 +63,7 @@ Before submitting a bug report, check if the problem has already been reported.
|
||||
|
||||
### Discuss with the team
|
||||
|
||||
As with feature requests, you can talk to the KeePassXC team about bugs, new features, other issues and pull requests on the dedicated issue tracker, on the [Matrix development channel](https://matrix.to/#/!RhJPJPGwQIFVQeXqZa:matrix.org?via=matrix.org), or in the IRC channel on Libera.Chat (`#keepassxc-dev` on `irc.libera.chat`, or use a [webchat link](https://web.libera.chat/#keepassxc-dev)).
|
||||
As with feature requests, you can talk to the KeePassXC team about bugs, new features, other issues and pull requests on the dedicated issue tracker, or in the IRC channel on Freenode (`#keepassxc-dev` on `irc.freenode.net`, or use a [webchat link](https://webchat.freenode.net/?channels=%23keepassxc-dev)).
|
||||
|
||||
### Your first code contribution
|
||||
|
||||
|
||||
12
.github/pull.yml
vendored
@@ -1,12 +0,0 @@
|
||||
# doc: https://github.com/wei/pull#basic-setup
|
||||
# manual trigger: https://pull.git.ci/process/${fork-user}/keepassxc
|
||||
# pull from: https://github.com/keepassxreboot/keepassxc
|
||||
version: "1"
|
||||
rules:
|
||||
- base: master
|
||||
upstream: keepassxreboot:master
|
||||
mergeMethod: hardreset
|
||||
|
||||
- base: develop
|
||||
upstream: keepassxreboot:develop
|
||||
mergeMethod: rebase
|
||||
5
.gitignore
vendored
@@ -21,8 +21,3 @@ desktop.ini
|
||||
/*.snap
|
||||
/*_source.tar.bz2
|
||||
|
||||
# MSVC Files
|
||||
CMakeSettings.json
|
||||
CMakePresets.json
|
||||
.vs/
|
||||
out/
|
||||
12
.tx/config
@@ -1,14 +1,8 @@
|
||||
[main]
|
||||
host = https://www.transifex.com
|
||||
|
||||
[keepassxc.share-translations-keepassxc-en-ts--develop]
|
||||
source_file = share/translations/keepassxc_en.ts
|
||||
file_filter = share/translations/keepassxc_<lang>.ts
|
||||
source_lang = en
|
||||
type = QT
|
||||
|
||||
[keepassxc.share-translations-keepassxc-en-ts--master]
|
||||
source_file = share/translations/keepassxc_en.ts
|
||||
file_filter = share/translations/keepassxc_<lang>.ts
|
||||
[keepassxc.keepassxc]
|
||||
source_file = share/translations/keepassx_en.ts
|
||||
file_filter = share/translations/keepassx_<lang>.ts
|
||||
source_lang = en
|
||||
type = QT
|
||||
|
||||
100
CHANGELOG.md
@@ -1,96 +1,6 @@
|
||||
# Changelog
|
||||
|
||||
## Release 2.7.0 (2022-02-26)
|
||||
|
||||
### Major Additions
|
||||
- Implement KDBX 4.1 [#7114]
|
||||
- Add direct write save option for cloud storage and GVFS [#6594]
|
||||
- Prevent screen capture on Windows and macOS [#6030]
|
||||
- Support quick unlock using Windows Hello [#7384]
|
||||
- Support quick unlock using Apple Watch [#5526]
|
||||
- Allow specifying database backup paths [#7035]
|
||||
- Add tag functionality [#6487][#7436][#7446]
|
||||
- Add password rating column to entry view [#4797]
|
||||
- Add group clone action [#6124]
|
||||
- Show modifications between entry history items [#6789]
|
||||
- Ability to bulk-delete and purge unused custom icons [#5970]
|
||||
- Support adding custom passphrase wordlists [#6799]
|
||||
- Support passphrase wordlists in numbered and PGP-signed formats [#6791]
|
||||
- Implement support for hardware keys via wireless NFC [#6895]
|
||||
- SSH Agent: Add support for OpenSSH 8.2 FIDO/U2F keys [#6371]
|
||||
- CLI: Implement attachment handling [#5538]
|
||||
- CLI: Add support for okon in offline HIBP checks [#5478]
|
||||
- CLI: Implement `search` command and remove `locate` [#6805]
|
||||
- CLI: Add db statistic output to `db-info` command [#7032]
|
||||
- CLI: Add -i/--include option to `generate` command. [#7112]
|
||||
- CLI: Add a -n (--notes) option to `add` and `edit` commands [#4646]
|
||||
- CLI: Add keyfile option to `import` command [#5402]
|
||||
- CLI: Adding a best option to clip to copy a password of the best match [#4489]
|
||||
- Browser: Add Microsoft Edge support on Linux [#7100]
|
||||
- Browser: Support native password generator from the extension [#6529]
|
||||
- Browser: Add group settings [#4180]
|
||||
- Browser: Add feature to ignore entries for HTTP-Auth Logins [#5394]
|
||||
- Browser: Support triggering Auto-Type from browser extension [#6272]
|
||||
- Browser: Add delete-entry command to API [#6899]
|
||||
- Browser: Add search 'by-path' url to API [#5535]
|
||||
- Browser: search for entries by UUID to API [#4763]
|
||||
- Browser: Support auto-download of favicon on entry addition [#7179]
|
||||
- Auto-Type: Major improvements to Auto-Type [#5864][#7463][#7435][#7391][#7129][#6400][#6364][#6361][#5283]
|
||||
- Auto-Type: Fix typing to virtual machines on Windows [#7366]
|
||||
- Auto-Type: Re-implement X11 keysym emulation [#7098]
|
||||
- Auto-Type: Support multiple Xkb layouts [#6247]
|
||||
- Auto-Type: Abort keystroke if modifiers held on X11 [#6351][#6357]
|
||||
- Auto-Type: Add TOTP option to entry level Auto-Type menu [#6675]
|
||||
- FdoSecrets: Major Refactor and Code Consolidation [#5747][#5660][#7043][#6915]
|
||||
- FdoSecrets: Implement unlock before search [#6943]
|
||||
- Reports: Add browser statistics report [#7197]
|
||||
|
||||
### Major Changes
|
||||
- Port crypto backend to [Botan](https://github.com/randombit/botan) [#6209]
|
||||
- Improve attachment handling and security [#6606][#5034][#7083]
|
||||
- Allow selecting any open database in unlock dialog [#5427]
|
||||
- KeeShare: Remove checking signed container and QuaZip dependency [#7223]
|
||||
- Introduce security option to enable copy on double click (default off) [#6433]
|
||||
- Add 'delete entry without confirm' functionality [#5812]
|
||||
- Improve macOS and Windows platform integration [#5851]
|
||||
- Lock only the current database by default [#6652]
|
||||
- Show expired entries on DB unlock [#7290]
|
||||
|
||||
### Other Changes and Fixes
|
||||
- Add countdown progress bar to TOTP preview [#6930]
|
||||
- Enter favicon url directly on icons page [#6614]
|
||||
- Set C++17 as standard in the build system [#7180]
|
||||
- Internalize ykcore into code base [#6654]
|
||||
- Transition to Visual Studio builds on Windows [#5874]
|
||||
- Ability to delete entries from health check reports [#6537]
|
||||
- Enhance remembering last-used directories [#6711]
|
||||
- Implement org.freedesktop.appearance.color-scheme support on Linux [#7422]
|
||||
- Support sorting HTML export [#7011]
|
||||
- Add display number of characters in passphrases [#5449]
|
||||
- Use Alt+Tab on macOS to switch between databases [#5407]
|
||||
- Add feature to sort groups using shortcut keys [#6999]
|
||||
- Add CTRL+Enter to apply password generator changes [#6414]
|
||||
- Display `Database created` timestamp on statistics report [#6876]
|
||||
- Browser: Improve best matching credentials setting [#6893]
|
||||
- SSH Agent: Use both Pageant and OpenSSH agent simultaneously on Windows [#6288]
|
||||
- SSH Agent: Allow using database path to resolve keys [#6365]
|
||||
- SSH Agent: Show correct error messages in main window [#7166]
|
||||
- Multiple fixes for MSI installer [#6630]
|
||||
- Fix tab order for CSV import dialog to match screen order [#7315]
|
||||
- Don't mark kdbx:// urls as invalid [#7221]
|
||||
- Make selected text copyable instead of copying password [#7209]
|
||||
- Detect timestamp resolution for CSV files [#7196]
|
||||
- Fix crash while downloading favicon [#7104]
|
||||
- Correct naming of newly generated keyx files [#7010]
|
||||
- Place the 'Recycle Bin' at the bottom of the list when groups are sorted [#7004]
|
||||
- Handle tilde with custom browser paths [#6659]
|
||||
- Don't scroll up when deleting an entry [#6833]
|
||||
- Set the MIME-Type to text/plain when using wl-copy on wayland [#6832]
|
||||
- Fix adaptive icon painting [#5989][#6033]
|
||||
- Fix favicon download from URL with non-standard port [#5509]
|
||||
- Ignore recycle bin on KeePassHTTP migration [#5481]
|
||||
|
||||
## 2.6.6 (2021-06-12)
|
||||
## 2.6.6 (2021-06-11)
|
||||
|
||||
### Fixed
|
||||
|
||||
@@ -99,7 +9,7 @@
|
||||
- Fix building on macOS [#6598]
|
||||
- Resolve compiler warnings for unused return values [#6607]
|
||||
|
||||
## 2.6.5 (2021-06-08)
|
||||
## 2.6.5 (2021-06-07)
|
||||
|
||||
### Added
|
||||
|
||||
@@ -353,7 +263,7 @@
|
||||
- Return keyboard focus after saving database edits [#4287]
|
||||
- Windows: Use bare minimum settings in portable version [#4131]
|
||||
- Windows: Use SHA256 code signing [#4129]
|
||||
- macOS: Fix code signing incompatibility in latest macOS release [#4564]
|
||||
- macOS: Fix code signing incompatibility in latest macOS release [#4564]
|
||||
|
||||
## 2.5.3 (2020-01-19)
|
||||
|
||||
@@ -485,8 +395,8 @@
|
||||
- Redesign database unlock dialog [ #3287]
|
||||
- Rework the entry preview panel [ #3306]
|
||||
- Move notes to General tab on Group Preview Panel [#3336]
|
||||
- Enable entry actions when editing an entry and cleanup entry context menu [#3641]
|
||||
- Improve detection of external database changes [#2389]
|
||||
- Enable entry actions when editing an entry and cleanup entry context menu [#3641]
|
||||
- Improve detection of external database changes [#2389]
|
||||
- Warn if user is trying to use a KDBX file as a key file [#3625]
|
||||
- Add option to disable KeePassHTTP settings migrations prompt [#3349, #3344]
|
||||
- Re-enabled Wayland support (no Auto-Type yet) [#3520, #3341]
|
||||
|
||||
216
CMakeLists.txt
@@ -24,9 +24,6 @@ if(NOT CMAKE_BUILD_TYPE)
|
||||
FORCE)
|
||||
endif()
|
||||
string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
|
||||
if(CMAKE_BUILD_TYPE_LOWER STREQUAL "debug" OR CMAKE_BUILD_TYPE_LOWER STREQUAL "relwithdebinfo")
|
||||
set(IS_DEBUG_BUILD TRUE)
|
||||
endif()
|
||||
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
|
||||
|
||||
@@ -53,21 +50,25 @@ option(WITH_XC_NETWORKING "Include networking code (e.g. for downloading website
|
||||
option(WITH_XC_BROWSER "Include browser integration with keepassxc-browser." OFF)
|
||||
option(WITH_XC_YUBIKEY "Include YubiKey support." OFF)
|
||||
option(WITH_XC_SSHAGENT "Include SSH agent support." OFF)
|
||||
option(WITH_XC_KEESHARE "Sharing integration with KeeShare" OFF)
|
||||
option(WITH_XC_KEESHARE "Sharing integration with KeeShare (requires quazip5 for secure containers)" OFF)
|
||||
option(WITH_XC_UPDATECHECK "Include automatic update checks; disable for controlled distributions" ON)
|
||||
if(UNIX AND NOT APPLE)
|
||||
option(WITH_XC_FDOSECRETS "Implement freedesktop.org Secret Storage Spec server side API." OFF)
|
||||
endif()
|
||||
if(APPLE)
|
||||
option(WITH_XC_TOUCHID "Include TouchID support for macOS." OFF)
|
||||
endif()
|
||||
option(WITH_XC_DOCS "Enable building of documentation" ON)
|
||||
|
||||
if(WITH_CCACHE)
|
||||
# Use the Compiler Cache (ccache) program
|
||||
# (install with: sudo apt get ccache)
|
||||
find_program(CCACHE_FOUND ccache)
|
||||
if(NOT CCACHE_FOUND)
|
||||
if(CCACHE_FOUND)
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_FOUND})
|
||||
else()
|
||||
message(FATAL_ERROR "ccache requested but cannot be found.")
|
||||
endif()
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_FOUND})
|
||||
endif()
|
||||
|
||||
if(WITH_XC_ALL)
|
||||
@@ -78,11 +79,20 @@ if(WITH_XC_ALL)
|
||||
set(WITH_XC_YUBIKEY ON)
|
||||
set(WITH_XC_SSHAGENT ON)
|
||||
set(WITH_XC_KEESHARE ON)
|
||||
if(APPLE)
|
||||
set(WITH_XC_TOUCHID ON)
|
||||
endif()
|
||||
if(UNIX AND NOT APPLE)
|
||||
set(WITH_XC_FDOSECRETS ON)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_XC_SSHAGENT OR WITH_XC_KEESHARE)
|
||||
set(WITH_XC_CRYPTO_SSH ON)
|
||||
else()
|
||||
set(WITH_XC_CRYPTO_SSH OFF)
|
||||
endif()
|
||||
|
||||
# Prefer WITH_XC_NETWORKING setting over WITH_XC_UPDATECHECK
|
||||
if(NOT WITH_XC_NETWORKING AND WITH_XC_UPDATECHECK)
|
||||
message(STATUS "Disabling WITH_XC_UPDATECHECK because WITH_XC_NETWORKING is disabled")
|
||||
@@ -90,8 +100,8 @@ if(NOT WITH_XC_NETWORKING AND WITH_XC_UPDATECHECK)
|
||||
endif()
|
||||
|
||||
set(KEEPASSXC_VERSION_MAJOR "2")
|
||||
set(KEEPASSXC_VERSION_MINOR "7")
|
||||
set(KEEPASSXC_VERSION_PATCH "0")
|
||||
set(KEEPASSXC_VERSION_MINOR "6")
|
||||
set(KEEPASSXC_VERSION_PATCH "6")
|
||||
set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION_MAJOR}.${KEEPASSXC_VERSION_MINOR}.${KEEPASSXC_VERSION_PATCH}")
|
||||
set(OVERRIDE_VERSION "" CACHE STRING "Override the KeePassXC Version for Snapshot builds")
|
||||
|
||||
@@ -166,15 +176,6 @@ elseif(KEEPASSXC_DIST_TYPE STREQUAL "Other")
|
||||
unset(KEEPASSXC_DIST)
|
||||
endif()
|
||||
|
||||
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.14.0")
|
||||
cmake_policy(SET CMP0083 NEW)
|
||||
include(CheckPIESupported)
|
||||
check_pie_supported()
|
||||
endif()
|
||||
|
||||
# Create position independent code for shared libraries and executables
|
||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||
|
||||
if("${CMAKE_SIZEOF_VOID_P}" EQUAL "4")
|
||||
set(IS_32BIT TRUE)
|
||||
endif()
|
||||
@@ -250,11 +251,6 @@ if(WITH_APP_BUNDLE)
|
||||
endif()
|
||||
|
||||
add_gcc_compiler_flags("-fno-common")
|
||||
find_package(OpenMP)
|
||||
if(OpenMP_FOUND)
|
||||
add_gcc_compiler_cflags(${OpenMP_C_FLAGS})
|
||||
add_gcc_compiler_cxxflags(${OpenMP_CXX_FLAGS})
|
||||
endif()
|
||||
add_gcc_compiler_flags("-Wall -Wextra -Wundef -Wpointer-arith -Wno-long-long")
|
||||
add_gcc_compiler_flags("-Wformat=2 -Wmissing-format-attribute")
|
||||
add_gcc_compiler_flags("-fvisibility=hidden")
|
||||
@@ -267,13 +263,14 @@ if(CMAKE_BUILD_TYPE_LOWER STREQUAL "debug")
|
||||
endif()
|
||||
|
||||
if (NOT HAIKU)
|
||||
if((CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.8.999) OR CMAKE_COMPILER_IS_CLANGXX)
|
||||
add_gcc_compiler_flags("-fstack-protector-strong")
|
||||
else()
|
||||
add_gcc_compiler_flags("-fstack-protector --param=ssp-buffer-size=4")
|
||||
endif()
|
||||
if((CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.8.999) OR CMAKE_COMPILER_IS_CLANGXX)
|
||||
add_gcc_compiler_flags("-fstack-protector-strong")
|
||||
else()
|
||||
add_gcc_compiler_flags("-fstack-protector --param=ssp-buffer-size=4")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
add_gcc_compiler_cxxflags("-fno-exceptions -fno-rtti")
|
||||
add_gcc_compiler_cxxflags("-Wnon-virtual-dtor -Wold-style-cast -Woverloaded-virtual")
|
||||
add_gcc_compiler_cflags("-Wchar-subscripts -Wwrite-strings")
|
||||
|
||||
@@ -300,86 +297,63 @@ check_add_gcc_compiler_flag("-Werror=format-security")
|
||||
check_add_gcc_compiler_flag("-Werror=implicit-function-declaration" C)
|
||||
check_add_gcc_compiler_flag("-Wcast-align")
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
if(WITH_COVERAGE AND CMAKE_COMPILER_IS_CLANGXX)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-instr-generate -fcoverage-mapping")
|
||||
# then:
|
||||
# $ llvm-profdata merge -sparse default.profraw -o default.profdata
|
||||
# $ llvm-cov show ./tests/${the_test_binary} \
|
||||
# -format=html -instr-profile=default.profdata -output-dir=./coverages \
|
||||
# `find src -iname '*.h' -or -iname '*.cpp'`
|
||||
endif()
|
||||
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
check_add_gcc_compiler_flag("-Qunused-arguments")
|
||||
add_gcc_compiler_flags("-pie -fPIE")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-add-needed -Wl,--as-needed -Wl,--no-undefined")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro,-z,now -pie")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro,-z,now")
|
||||
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--no-add-needed -Wl,--as-needed")
|
||||
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,relro,-z,now")
|
||||
endif()
|
||||
|
||||
set(CMAKE_C_STANDARD 99)
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
add_gcc_compiler_cflags("-std=c99")
|
||||
add_gcc_compiler_cxxflags("-std=c++11")
|
||||
|
||||
check_cxx_compiler_flag("-fsized-deallocation" CXX_HAS_fsized_deallocation)
|
||||
if(CXX_HAS_fsized_deallocation)
|
||||
# Do additional check: the deallocation functions must be there too.
|
||||
set(CMAKE_REQUIRED_FLAGS "-fsized-deallocation")
|
||||
check_cxx_source_compiles("#include <new>
|
||||
int main() { void * ptr = nullptr; std::size_t size = 1; ::operator delete(ptr, size); }"
|
||||
HAVE_DEALLOCATION_FUNCTIONS)
|
||||
if(HAVE_DEALLOCATION_FUNCTIONS)
|
||||
check_add_gcc_compiler_flag("-fsized-deallocation" CXX)
|
||||
endif()
|
||||
unset(CMAKE_REQUIRED_FLAGS)
|
||||
endif()
|
||||
check_add_gcc_compiler_flag("-fsized-deallocation" CXX)
|
||||
|
||||
if(APPLE AND CMAKE_COMPILER_IS_CLANGXX)
|
||||
add_gcc_compiler_cxxflags("-stdlib=libc++")
|
||||
endif()
|
||||
|
||||
if(WITH_DEV_BUILD)
|
||||
add_definitions(-DQT_DEPRECATED_WARNINGS)
|
||||
add_definitions(-DQT_DEPRECATED_WARNINGS -DGCRYPT_NO_DEPRECATED)
|
||||
else()
|
||||
add_definitions(-DQT_NO_DEPRECATED_WARNINGS)
|
||||
add_gcc_compiler_cxxflags("-Wno-deprecated-declarations")
|
||||
endif()
|
||||
|
||||
# MSVC specific options
|
||||
if (MSVC)
|
||||
if(MSVC_TOOLSET_VERSION LESS 141)
|
||||
message(FATAL_ERROR "Only Microsoft Visual Studio 17 and newer are supported!")
|
||||
endif()
|
||||
add_compile_options(/permissive- /utf-8)
|
||||
if(IS_DEBUG_BUILD)
|
||||
add_compile_options(/Zf)
|
||||
if(MSVC_TOOLSET_VERSION GREATER 141)
|
||||
add_compile_definitions(/fsanitize=address)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WIN32)
|
||||
if(MINGW)
|
||||
set(CMAKE_RC_COMPILER_INIT windres)
|
||||
enable_language(RC)
|
||||
if(MINGW)
|
||||
set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <FLAGS> -O coff <DEFINES> -i <SOURCE> -o <OBJECT>")
|
||||
endif()
|
||||
if(NOT IS_DEBUG_BUILD)
|
||||
if(MSVC)
|
||||
# By default MSVC enables NXCOMPAT
|
||||
add_compile_options(/guard:cf)
|
||||
add_link_options(/DYNAMICBASE /HIGHENTROPYVA /GUARD:CF)
|
||||
else(MINGW)
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--nxcompat -Wl,--dynamicbase")
|
||||
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--nxcompat -Wl,--dynamicbase")
|
||||
# Enable high entropy ASLR for 64-bit builds
|
||||
if(NOT IS_32BIT)
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--high-entropy-va")
|
||||
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--high-entropy-va")
|
||||
endif()
|
||||
set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <FLAGS> -O coff <DEFINES> -i <SOURCE> -o <OBJECT>")
|
||||
if(NOT (CMAKE_BUILD_TYPE_LOWER STREQUAL "debug" OR CMAKE_BUILD_TYPE_LOWER STREQUAL "relwithdebinfo"))
|
||||
# Enable DEP and ASLR
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--nxcompat -Wl,--dynamicbase")
|
||||
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--nxcompat -Wl,--dynamicbase")
|
||||
# Enable high entropy ASLR for 64-bit builds
|
||||
if(NOT IS_32BIT)
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--high-entropy-va")
|
||||
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--high-entropy-va")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(APPLE AND WITH_APP_BUNDLE OR WIN32)
|
||||
if(APPLE AND WITH_APP_BUNDLE OR MINGW)
|
||||
set(PROGNAME KeePassXC)
|
||||
else()
|
||||
set(PROGNAME keepassxc)
|
||||
endif()
|
||||
|
||||
if(WIN32)
|
||||
if(MINGW)
|
||||
set(CLI_INSTALL_DIR ".")
|
||||
set(PROXY_INSTALL_DIR ".")
|
||||
set(BIN_INSTALL_DIR ".")
|
||||
@@ -410,47 +384,26 @@ endif(WITH_TESTS)
|
||||
if(WITH_COVERAGE)
|
||||
# Include code coverage, use with -DCMAKE_BUILD_TYPE=Debug
|
||||
include(CodeCoverage)
|
||||
set(COVERAGE_GCOVR_EXCLUDES
|
||||
"\\(.+/\\)?tests/.\\*"
|
||||
".\\*/moc_\\[^/\\]+\\.cpp"
|
||||
".\\*/ui_\\[^/\\]+\\.h"
|
||||
"\\(.+/\\)?zxcvbn/.\\*")
|
||||
append_coverage_compiler_flags()
|
||||
|
||||
set(COVERAGE_EXCLUDES
|
||||
"'^(.+/)?(thirdparty|zxcvbn)/.*'"
|
||||
"'^(.+/)?main\\.cpp$$'"
|
||||
"'^(.+/)?cli/keepassxc-cli\\.cpp$$'"
|
||||
"'^(.+/)?proxy/keepassxc-proxy\\.cpp$$'")
|
||||
if(WITH_COVERAGE AND CMAKE_COMPILER_IS_CLANGXX)
|
||||
set(MAIN_BINARIES
|
||||
"$<TARGET_FILE:${PROGNAME}>"
|
||||
"$<TARGET_FILE:keepassxc-cli>"
|
||||
"$<TARGET_FILE:keepassxc-proxy>")
|
||||
setup_target_for_coverage_llvm(
|
||||
NAME coverage
|
||||
BINARY ${MAIN_BINARIES}
|
||||
SOURCES_ROOT ${CMAKE_SOURCE_DIR}/src
|
||||
)
|
||||
else()
|
||||
setup_target_for_coverage_gcovr(
|
||||
NAME coverage
|
||||
SOURCES_ROOT ${CMAKE_SOURCE_DIR}/src
|
||||
)
|
||||
endif()
|
||||
setup_target_for_coverage_gcovr_html(
|
||||
NAME coverage
|
||||
EXECUTABLE $(MAKE) && $(MAKE) test
|
||||
)
|
||||
endif()
|
||||
|
||||
include(CLangFormat)
|
||||
|
||||
set(QT_COMPONENTS Core Network Concurrent Gui Svg Widgets Test LinguistTools)
|
||||
if(UNIX AND NOT APPLE)
|
||||
find_package(Qt5 COMPONENTS ${QT_COMPONENTS} DBus X11Extras REQUIRED)
|
||||
find_package(Qt5 COMPONENTS ${QT_COMPONENTS} DBus REQUIRED)
|
||||
elseif(APPLE)
|
||||
find_package(Qt5 COMPONENTS ${QT_COMPONENTS} REQUIRED HINTS
|
||||
/usr/local/opt/qt/lib/cmake
|
||||
/usr/local/Cellar/qt/*/lib/cmake
|
||||
/opt/homebrew/opt/qt/lib/cmake
|
||||
ENV PATH)
|
||||
find_package(Qt5 COMPONENTS MacExtras HINTS
|
||||
/usr/local/opt/qt/lib/cmake
|
||||
/usr/local/Cellar/qt/*/lib/cmake
|
||||
/opt/homebrew/opt/qt/lib/cmake
|
||||
ENV PATH)
|
||||
find_package(Qt5 COMPONENTS ${QT_COMPONENTS} REQUIRED HINTS /usr/local/opt/qt/lib/cmake /usr/local/Cellar/qt/*/lib/cmake ENV PATH)
|
||||
find_package(Qt5 COMPONENTS MacExtras HINTS /usr/local/opt/qt/lib/cmake /usr/local/Cellar/qt/*/lib/cmake ENV PATH)
|
||||
else()
|
||||
find_package(Qt5 COMPONENTS ${QT_COMPONENTS} REQUIRED)
|
||||
endif()
|
||||
@@ -470,40 +423,45 @@ set(CMAKE_AUTORCC ON)
|
||||
|
||||
if(APPLE)
|
||||
set(CMAKE_MACOSX_RPATH TRUE)
|
||||
find_program(MACDEPLOYQT_EXE macdeployqt HINTS ${Qt5_PREFIX}/bin ${Qt5_PREFIX}/tools/qt5/bin ENV PATH)
|
||||
find_program(MACDEPLOYQT_EXE macdeployqt HINTS ${Qt5_PREFIX}/bin ENV PATH)
|
||||
if(NOT MACDEPLOYQT_EXE)
|
||||
message(FATAL_ERROR "macdeployqt is required to build on macOS")
|
||||
else()
|
||||
message(STATUS "Using macdeployqt: ${MACDEPLOYQT_EXE}")
|
||||
endif()
|
||||
message(STATUS "Using macdeployqt: ${MACDEPLOYQT_EXE}")
|
||||
elseif(WIN32)
|
||||
find_program(WINDEPLOYQT_EXE windeployqt HINTS ${Qt5_PREFIX}/bin ${Qt5_PREFIX}/tools/qt5/bin ENV PATH)
|
||||
elseif(MINGW)
|
||||
find_program(WINDEPLOYQT_EXE windeployqt HINTS ${Qt5_PREFIX}/bin ENV PATH)
|
||||
if(NOT WINDEPLOYQT_EXE)
|
||||
message(FATAL_ERROR "windeployqt is required to build on Windows")
|
||||
else()
|
||||
message(STATUS "Using windeployqt: ${WINDEPLOYQT_EXE}")
|
||||
endif()
|
||||
message(STATUS "Using windeployqt: ${WINDEPLOYQT_EXE}")
|
||||
endif()
|
||||
|
||||
# Debian sets the build type to None for package builds.
|
||||
# Debian sets the the build type to None for package builds.
|
||||
# Make sure we don't enable asserts there.
|
||||
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS_NONE QT_NO_DEBUG)
|
||||
|
||||
# Find Botan2
|
||||
find_package(Botan2 REQUIRED)
|
||||
if(BOTAN2_VERSION VERSION_LESS "2.11.0")
|
||||
message(FATAL_ERROR "Botan2 2.11.0 or higher is required")
|
||||
endif()
|
||||
include_directories(SYSTEM ${BOTAN2_INCLUDE_DIR})
|
||||
|
||||
# Find zlib
|
||||
find_package(LibGPGError REQUIRED)
|
||||
find_package(Gcrypt 1.7.0 REQUIRED)
|
||||
find_package(Argon2 REQUIRED)
|
||||
find_package(ZLIB REQUIRED)
|
||||
find_package(QREncode REQUIRED)
|
||||
find_package(sodium 1.0.12 REQUIRED)
|
||||
|
||||
set(CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIR})
|
||||
|
||||
if(ZLIB_VERSION_STRING VERSION_LESS "1.2.0")
|
||||
message(FATAL_ERROR "zlib 1.2.0 or higher is required to use the gzip format")
|
||||
endif()
|
||||
include_directories(SYSTEM ${ZLIB_INCLUDE_DIR})
|
||||
|
||||
include_directories(SYSTEM ${ARGON2_INCLUDE_DIR} ${sodium_INCLUDE_DIR})
|
||||
|
||||
# Optional
|
||||
if(WITH_XC_YUBIKEY)
|
||||
find_package(PCSC REQUIRED)
|
||||
include_directories(SYSTEM ${PCSC_INCLUDE_DIRS})
|
||||
find_package(YubiKey REQUIRED)
|
||||
|
||||
include_directories(SYSTEM ${YUBIKEY_INCLUDE_DIRS})
|
||||
endif()
|
||||
|
||||
if(UNIX)
|
||||
@@ -536,7 +494,7 @@ if(UNIX)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
include_directories(SYSTEM ${ZLIB_INCLUDE_DIR})
|
||||
include_directories(SYSTEM ${GCRYPT_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR})
|
||||
|
||||
add_subdirectory(src)
|
||||
add_subdirectory(share)
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
# Contributor Code of Conduct
|
||||
|
||||
KeePassXC is an open project that welcomes everybody no matter their ethnicity, sex,
|
||||
sexual identity or orientation, age, socio-economic status, nationality, or religion.
|
||||
Regardless of what background you come from, feel encouraged to participate in
|
||||
the project and express your views as long you are respectful to others.
|
||||
|
||||
We value all members of our community and so in order to ensure a harassment-free
|
||||
experience for everyone and mutual respect among members of this community, we
|
||||
impose the following simple rules:
|
||||
|
||||
- No bullying, no insults. Any form of harassment will not be tolerated.
|
||||
- No racism, no sexism, no homophobia, no hurtful extremist views of any kind.
|
||||
- Be mindful of what you say, be diligent in how you say it.
|
||||
- Show respect and, as always, be excellent to each other.
|
||||
|
||||
Violations of these rules or any other form of abuse can be reported confidentially
|
||||
to conduct AT keepassxc DOT org. Members who do not adhere to our code of conduct
|
||||
will be banned either permanently or until they change their ways so as to be
|
||||
compatible with a friendly, open, and inclusive community.
|
||||
22
COPYING
@@ -46,10 +46,6 @@ Files: cmake/FindYubiKey.cmake
|
||||
Copyright: 2014 Kyle Manna <kyle@kylemanna.com>
|
||||
License: GPL-2 or GPL-3
|
||||
|
||||
Files: cmake/FindBotan2.cmake
|
||||
Copyright: 2018 Ribose Inc.
|
||||
License: BSD-2-clause
|
||||
|
||||
Files: cmake/GenerateProductVersion.cmake
|
||||
Copyright: 2015 halex2005 <akharlov@gmail.com>
|
||||
License: MIT
|
||||
@@ -141,13 +137,11 @@ Files: share/icons/badges/2_Expired.svg
|
||||
share/icons/database/C46_Help.svg
|
||||
share/icons/database/C53_Apply.svg
|
||||
share/icons/database/C61_Services.svg
|
||||
Copyright: 2022 KeePassXC Team <team@keepassxc.org>
|
||||
Copyright: 2020 KeePassXC Team <team@keepassxc.org>
|
||||
License: MIT
|
||||
|
||||
Files: share/icons/application/scalable/actions/chevron-double-down.svg
|
||||
share/icons/application/scalable/actions/chevron-double-right.svg
|
||||
share/icons/application/scalable/actions/database-lock.svg
|
||||
share/icons/application/scalable/actions/database-lock-all.svg
|
||||
share/icons/application/scalable/actions/document-close.svg
|
||||
share/icons/application/scalable/actions/document-edit.svg
|
||||
share/icons/application/scalable/actions/document-export.svg
|
||||
@@ -166,17 +160,12 @@ Files: share/icons/application/scalable/actions/chevron-double-down.svg
|
||||
share/icons/application/scalable/actions/entry-edit.svg
|
||||
share/icons/application/scalable/actions/entry-new.svg
|
||||
share/icons/application/scalable/actions/favicon-download.svg
|
||||
share/icons/application/scalable/actions/fingerprint.svg
|
||||
share/icons/application/scalable/actions/group-clone.svg
|
||||
share/icons/application/scalable/actions/group-delete.svg
|
||||
share/icons/application/scalable/actions/group-edit.svg
|
||||
share/icons/application/scalable/actions/group-empty-trash.svg
|
||||
share/icons/application/scalable/actions/group-new.svg
|
||||
share/icons/application/scalable/actions/hammer-wrench.svg
|
||||
share/icons/application/scalable/actions/health.svg
|
||||
share/icons/application/scalable/actions/help-about.svg
|
||||
share/icons/application/scalable/actions/key-enter.svg
|
||||
share/icons/application/scalable/actions/lock-question.svg
|
||||
share/icons/application/scalable/actions/message-close.svg
|
||||
share/icons/application/scalable/actions/move-down.svg
|
||||
share/icons/application/scalable/actions/move-up.svg
|
||||
@@ -192,9 +181,6 @@ Files: share/icons/application/scalable/actions/chevron-double-down.svg
|
||||
share/icons/application/scalable/actions/statistics.svg
|
||||
share/icons/application/scalable/actions/system-help.svg
|
||||
share/icons/application/scalable/actions/system-search.svg
|
||||
share/icons/application/scalable/actions/tag.svg
|
||||
share/icons/application/scalable/actions/tag-search.svg
|
||||
share/icons/application/scalable/actions/trash.svg
|
||||
share/icons/application/scalable/actions/url-copy.svg
|
||||
share/icons/application/scalable/actions/username-copy.svg
|
||||
share/icons/application/scalable/actions/view-history.svg
|
||||
@@ -244,9 +230,3 @@ Files: share/icons/application/scalable/actions/hibp.svg
|
||||
share/icons/database/C64_Apple.svg
|
||||
Copyright: GPL-2+
|
||||
Comment: from the Simple Icons repo (https://github.com/simple-icons/simple-icons/)
|
||||
|
||||
Files: src/thirdparty/ykcore/yk*
|
||||
src/thirdparty/ykcore/yubikey.h
|
||||
Copyright: 2006-2015, Yubico AB
|
||||
License: BSD-2-Clause
|
||||
Comment: from the yubikey-personalization repo (https://github.com/Yubico/yubikey-personalization)
|
||||
|
||||
29
INSTALL.md
@@ -12,20 +12,21 @@ Build Dependencies
|
||||
The following tools must exist within your PATH:
|
||||
|
||||
* make
|
||||
* cmake (>= 3.3.0)
|
||||
* g++ (>= 4.7) or clang++ (>= 6.0)
|
||||
* asciidoctor
|
||||
* cmake (>= 2.8.12)
|
||||
* g++ (>= 4.7) or clang++ (>= 3.0)
|
||||
* asciidoctor (on Linux/MacOS)
|
||||
|
||||
The following libraries are required:
|
||||
|
||||
* Qt 5 (>= 5.9.5): qtbase5, qtbase5-private, libqt5svg5, qttools5, qt5-image-formats-plugins
|
||||
* botan (>= 2.12)
|
||||
* Qt 5 (>= 5.2): qtbase and qttools5
|
||||
* libgcrypt (>= 1.6)
|
||||
* zlib
|
||||
* minizip
|
||||
* readline (for completion in cli)
|
||||
* libqt5x11extras5, libxi, and libxtst (for auto-type on X11)
|
||||
* libmicrohttpd
|
||||
* libxi, libxtst, qtx11extras (optional for auto-type on X11)
|
||||
* libsodium (>= 1.0.12)
|
||||
* libargon2
|
||||
* qrencode
|
||||
* libusb-1.0, pcsclite (optional to support YubiKey on Linux)
|
||||
* yubikey ykpers (optional to support YubiKey)
|
||||
|
||||
Prepare the Building Environment
|
||||
================================
|
||||
@@ -39,7 +40,7 @@ Build Steps
|
||||
We recommend using the release tool to perform builds, please read up-to-date instructions [on our wiki](https://github.com/keepassxreboot/keepassxc/wiki/Building-KeePassXC#building-using-the-release-tool).
|
||||
|
||||
To compile from source, open a **Terminal (on Linux/MacOS)** or a **MSYS2-MinGW shell (on Windows)**<br/>
|
||||
**Note:** on Windows you can also use MSVC to build natively, we recommend Visual Studio 2019
|
||||
**Note:** on Windows make sure you are using a **MINGW shell** by checking the label before the current path
|
||||
|
||||
First, download the KeePassXC [source tarball](https://keepassxc.org/download#source)
|
||||
or check out the latest version from our [Git repository](https://github.com/keepassxreboot/keepassxc).
|
||||
@@ -64,8 +65,6 @@ For a stable build, it is recommended to checkout the master branch.
|
||||
git checkout master
|
||||
```
|
||||
|
||||
NOTE: See the [Windows Build Instructions](https://github.com/keepassxreboot/keepassxc/wiki/Building-KeePassXC#windows) for building with MSVC.
|
||||
|
||||
Navigate to the directory where you have downloaded KeePassXC and type these commands:
|
||||
|
||||
```
|
||||
@@ -75,7 +74,7 @@ cmake -DWITH_XC_ALL=ON ..
|
||||
make
|
||||
```
|
||||
|
||||
NOTE: If you are using MSYS2, you may have to add ```-G "MSYS Makefiles"``` to the beginning of the cmake command.
|
||||
If you are on Windows, you may have to add ```-G "MSYS Makefiles"``` to the beginning of the cmake command. See the [Windows Build Instructions](https://github.com/keepassxreboot/keepassxc/wiki/Building-KeePassXC#windows) for more information.
|
||||
|
||||
These steps place the compiled KeePassXC binary inside the `./build/src/` directory.
|
||||
(Note the cmake notes/options below.)
|
||||
@@ -99,10 +98,12 @@ These steps place the compiled KeePassXC binary inside the `./build/src/` direct
|
||||
-DWITH_XC_BROWSER=[ON|OFF] Enable/Disable KeePassXC-Browser extension support (default: OFF)
|
||||
-DWITH_XC_NETWORKING=[ON|OFF] Enable/Disable Networking support (e.g., favicon downloading) (default: OFF)
|
||||
-DWITH_XC_SSHAGENT=[ON|OFF] Enable/Disable SSHAgent support (default: OFF)
|
||||
-DWITH_XC_TOUCHID=[ON|OFF] (macOS Only) Enable/Disable Touch ID unlock (default:OFF)
|
||||
-DWITH_XC_FDOSECRETS=[ON|OFF] (Linux Only) Enable/Disable Freedesktop.org Secrets Service support (default:OFF)
|
||||
-DWITH_XC_KEESHARE=[ON|OFF] Enable/Disable KeeShare group synchronization extension (default: OFF)
|
||||
-DWITH_XC_KEESHARE_SECURE=[ON|OFF] Enable/Disable KeeShare signed containers, requires libquazip5 (default: OFF)
|
||||
-DWITH_XC_ALL=[ON|OFF] Enable/Disable compiling all plugins above (default: OFF)
|
||||
|
||||
|
||||
-DWITH_XC_UPDATECHECK=[ON|OFF] Enable/Disable automatic updating checking (requires WITH_XC_NETWORKING) (default: ON)
|
||||
|
||||
-DWITH_TESTS=[ON|OFF] Enable/Disable building of unit tests (default: ON)
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
@@ -56,7 +56,7 @@ patent must be licensed for everyone's free use or not licensed at all.
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
@@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
@@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
@@ -68,7 +69,7 @@ patents cannot be used to render the program non-free.
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
@@ -76,7 +77,7 @@ modification follow.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
@@ -509,7 +510,7 @@ actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
@@ -618,9 +619,9 @@ an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
@@ -645,7 +646,7 @@ the "copyright" line and a pointer to where the full notice is found.
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
@@ -664,11 +665,12 @@ might be different; for a GUI interface, you would use an "about box".
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
@@ -111,7 +111,7 @@ modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
@@ -158,7 +158,7 @@ Library.
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
@@ -216,7 +216,7 @@ instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
@@ -267,7 +267,7 @@ Library will still fall under Section 6.)
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
@@ -329,7 +329,7 @@ restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
@@ -370,7 +370,7 @@ subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
@@ -422,7 +422,7 @@ conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
@@ -456,7 +456,7 @@ SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
|
||||
11
README.md
@@ -3,10 +3,7 @@
|
||||
[](https://codecov.io/gh/keepassxreboot/keepassxc)
|
||||
[](https://github.com/keepassxreboot/keepassxc/releases/)
|
||||
|
||||
[](https://app.element.io/#/room/#keepassxc:mozilla.org)
|
||||
[](https://app.element.io/#/room/#keepassxc-dev:mozilla.org)
|
||||
|
||||
[KeePassXC](https://keepassxc.org) is a modern, secure, and open-source password manager that stores and manages your most sensitive information. You can run KeePassXC on Windows, macOS, and Linux systems. KeePassXC is for people with extremely high demands of secure personal data management. It saves many different types of information, such as usernames, passwords, URLs, attachments, and notes in an offline, encrypted file that can be stored in any location, including private and public cloud solutions. For easy identification and management, user-defined titles and icons can be specified for entries. In addition, entries are sorted into customizable groups. An integrated search function allows you to use advanced patterns to easily find any entry in your database. A customizable, fast, and easy-to-use password generator utility allows you to create passwords with any combination of characters or easy to remember passphrases.
|
||||
[KeePassXC](https://keepassxc.org) is a modern, secure, and open-source password manager that stores and manages your most sensitive information. You can run KeePassXC on Windows, macOS, and Linux systems. KeePassXC is for people with extremely high demands of secure personal data management. It saves many different types of information, such as usernames, passwords, URLs, attachments, and notes in an offline, encrypted file that can be stored in any location, including private and public cloud solutions. For easy identification and management, user-defined titles and icons can be specified for entries. In addition, entries are sorted in customizable groups. An integrated search function allows you to use advanced patterns to easily find any entry in your database. A customizable, fast, and easy-to-use password generator utility allows you to create passwords with any combination of characters or easy to remember passphrases.
|
||||
|
||||
## Quick Start
|
||||
The [QuickStart Guide](https://keepassxc.org/docs/KeePassXC_GettingStarted.html) gets you started using KeePassXC on your Windows, macOS, or Linux computer using pre-compiled binaries from the [downloads page](https://keepassxc.org/download). Additionally, individual Linux distributions may ship their own versions, so please check your distribution's package list to see if KeePassXC is available. Detailed documentation is available in the [User Guide](https://keepassxc.org/docs/KeePassXC_UserGuide.html).
|
||||
@@ -15,7 +12,7 @@ The [QuickStart Guide](https://keepassxc.org/docs/KeePassXC_GettingStarted.html)
|
||||
KeePassXC has numerous features for novice and power users alike. Our goal is to create an application that can be used by anyone while still offering advanced features to those that need them.
|
||||
|
||||
### Basic
|
||||
* Create, open, and save databases in the KDBX format (KeePass-compatible with KDBX4 and KDBX3)
|
||||
* Create, open, and save databases in the KDBX format (KeePass compatible to KDBX4 and KDBX3)
|
||||
* Store sensitive information in entries that are organized by groups
|
||||
* Search for entries
|
||||
* Password generator
|
||||
@@ -48,12 +45,10 @@ Detailed instructions are available in the [Build and Install](./INSTALL.md) pag
|
||||
|
||||
## Contributing
|
||||
|
||||
We are always looking for suggestions on how to improve KeePassXC. If you find any bugs or have an idea for a new feature, please let us know by opening a report in the [issue tracker](https://github.com/keepassxreboot/keepassxc/issues) on GitHub, or join us on [Matrix community channel](https://matrix.to/#/!zUxwGnFkUyycpxeHeM:matrix.org?via=matrix.org) or [Matrix development channel](https://matrix.to/#/!RhJPJPGwQIFVQeXqZa:matrix.org?via=matrix.org), or on IRC in [Libera.Chat](https://web.libera.chat/) channels #keepassxc and #keepassxc-dev.
|
||||
We are always looking for suggestions on how to improve KeePassXC. If you find any bugs or have an idea for a new feature, please let us know by opening a report in the [issue tracker](https://github.com/keepassxreboot/keepassxc/issues) on GitHub or join us on IRC in [freenode](https://webchat.freenode.net/) channels #keepassxc and #keepassxc-dev.
|
||||
|
||||
You may directly contribute your own code by submitting a pull request. Please read the [CONTRIBUTING](.github/CONTRIBUTING.md) document for further information.
|
||||
|
||||
Contributors are required to adhere to the project's [Code of Conduct](CODE-OF-CONDUCT.md).
|
||||
|
||||
## License
|
||||
|
||||
KeePassXC code is licensed under GPL-2 or GPL-3. Additional licensing for third-party files is detailed in [COPYING](./COPYING).
|
||||
|
||||
@@ -15,46 +15,50 @@
|
||||
|
||||
set(EXCLUDED_DIRS
|
||||
# third-party directories
|
||||
src/thirdparty
|
||||
src/zxcvbn
|
||||
src/zxcvbn/
|
||||
# objective-c directories
|
||||
src/touchid
|
||||
src/autotype/mac
|
||||
src/gui/osutils/macutils)
|
||||
src/touchid/
|
||||
src/autotype/mac/
|
||||
src/gui/osutils/macutils/)
|
||||
|
||||
set(EXCLUDED_FILES
|
||||
# third-party files
|
||||
src/streams/qtiocompressor.\\*
|
||||
src/gui/KMessageWidget.\\*
|
||||
src/gui/MainWindowAdaptor.\\*
|
||||
src/gui/tag/TagsEdit.\\*
|
||||
tests/modeltest.\\*
|
||||
streams/qtiocompressor.cpp
|
||||
streams/qtiocompressor.h
|
||||
gui/KMessageWidget.h
|
||||
gui/KMessageWidget.cpp
|
||||
gui/MainWindowAdaptor.h
|
||||
gui/MainWindowAdaptor.cpp
|
||||
crypto/ssh/bcrypt_pbkdf.cpp
|
||||
crypto/ssh/blf.h
|
||||
crypto/ssh/blowfish.c
|
||||
tests/modeltest.cpp
|
||||
tests/modeltest.h
|
||||
# objective-c files
|
||||
src/core/ScreenLockListenerMac.\\*)
|
||||
core/ScreenLockListenerMac.h
|
||||
core/ScreenLockListenerMac.cpp)
|
||||
|
||||
set(FIND_EXCLUDE_DIR_EXPR "")
|
||||
foreach(EXCLUDE ${EXCLUDED_DIRS})
|
||||
list(APPEND FIND_EXCLUDE_DIR_EXPR -o -path "${EXCLUDE}" -prune)
|
||||
file(GLOB_RECURSE ALL_SOURCE_FILES RELATIVE ${CMAKE_SOURCE_DIR} src/*.cpp src/*.h tests/*.cpp tests/*.h)
|
||||
foreach(SOURCE_FILE ${ALL_SOURCE_FILES})
|
||||
foreach(EXCLUDED_DIR ${EXCLUDED_DIRS})
|
||||
string(FIND ${SOURCE_FILE} ${EXCLUDED_DIR} SOURCE_FILE_EXCLUDED)
|
||||
if(NOT ${SOURCE_FILE_EXCLUDED} EQUAL -1)
|
||||
list(REMOVE_ITEM ALL_SOURCE_FILES ${SOURCE_FILE})
|
||||
endif()
|
||||
endforeach()
|
||||
foreach(EXCLUDED_FILE ${EXCLUDED_FILES})
|
||||
if(${SOURCE_FILE} MATCHES ".*${EXCLUDED_FILE}$")
|
||||
list(REMOVE_ITEM ALL_SOURCE_FILES ${SOURCE_FILE})
|
||||
endif()
|
||||
endforeach()
|
||||
endforeach()
|
||||
|
||||
set(FIND_EXCLUDE_FILE_EXPR "")
|
||||
foreach(EXCLUDE ${EXCLUDED_FILES})
|
||||
if(FIND_EXCLUDE_FILE_EXPR)
|
||||
list(APPEND FIND_EXCLUDE_FILE_EXPR -o)
|
||||
endif()
|
||||
list(APPEND FIND_EXCLUDE_FILE_EXPR -path "${EXCLUDE}")
|
||||
endforeach()
|
||||
if(FIND_EXCLUDE_FILE_EXPR)
|
||||
set(FIND_EXCLUDE_FILE_EXPR -a -not "\\(" ${FIND_EXCLUDE_FILE_EXPR} "\\)")
|
||||
endif()
|
||||
|
||||
add_custom_target(format)
|
||||
|
||||
add_custom_command(
|
||||
TARGET format
|
||||
PRE_BUILD
|
||||
COMMAND find src tests "\\(" -name "\\*.h" -o -name "\\*.cpp" ${FIND_EXCLUDE_DIR_EXPR} "\\)"
|
||||
${FIND_EXCLUDE_FILE_EXPR} -type f -print0 | xargs -0 -P0 -n10 clang-format -style=file -i
|
||||
|
||||
COMMENT "Formatting source files..."
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
||||
foreach(SOURCE_FILE ${ALL_SOURCE_FILES})
|
||||
add_custom_command(
|
||||
TARGET format
|
||||
PRE_BUILD
|
||||
COMMAND echo Formatting ${SOURCE_FILE}
|
||||
COMMAND clang-format -style=file -i \"${SOURCE_FILE}\"
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
||||
endforeach()
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
# Copyright (c) 2012 - 2017, Lars Bilke
|
||||
# Copyright (c) 2021 KeePassXC Team
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without modification,
|
||||
@@ -26,218 +25,279 @@
|
||||
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# CHANGES:
|
||||
#
|
||||
# 2012-01-31, Lars Bilke
|
||||
# - Enable Code Coverage
|
||||
#
|
||||
# 2013-09-17, Joakim Söderberg
|
||||
# - Added support for Clang.
|
||||
# - Some additional usage instructions.
|
||||
#
|
||||
# 2016-02-03, Lars Bilke
|
||||
# - Refactored functions to use named parameters
|
||||
#
|
||||
# 2017-06-02, Lars Bilke
|
||||
# - Merged with modified version from github.com/ufz/ogs
|
||||
#
|
||||
#
|
||||
# USAGE:
|
||||
#
|
||||
# 1. Copy this file into your cmake modules path.
|
||||
#
|
||||
# 2. Add the following line to your CMakeLists.txt:
|
||||
# include(CodeCoverage)
|
||||
#
|
||||
# 3. Append necessary compiler flags:
|
||||
# APPEND_COVERAGE_COMPILER_FLAGS()
|
||||
#
|
||||
# 4. If you need to exclude additional directories from the report, specify them
|
||||
# using the COVERAGE_LCOV_EXCLUDES variable before calling SETUP_TARGET_FOR_COVERAGE_LCOV.
|
||||
# Example:
|
||||
# set(COVERAGE_LCOV_EXCLUDES 'dir1/*' 'dir2/*')
|
||||
#
|
||||
# 5. Use the functions described below to create a custom make target which
|
||||
# runs your test executable and produces a code coverage report.
|
||||
#
|
||||
# 6. Build a Debug build:
|
||||
# cmake -DCMAKE_BUILD_TYPE=Debug ..
|
||||
# make
|
||||
# make my_coverage_target
|
||||
#
|
||||
|
||||
include(CMakeParseArguments)
|
||||
|
||||
# Check prereqs
|
||||
find_program(GCOV_PATH gcov)
|
||||
find_program(LLVM_COV_PATH llvm-cov)
|
||||
find_program(LLVM_PROFDATA_PATH llvm-profdata)
|
||||
find_program(XCRUN_PATH xcrun)
|
||||
find_program(GENHTML_PATH NAMES genhtml genhtml.perl genhtml.bat)
|
||||
find_program(GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/scripts/test)
|
||||
find_program( GCOV_PATH gcov )
|
||||
find_program( LCOV_PATH NAMES lcov lcov.bat lcov.exe lcov.perl)
|
||||
find_program( GENHTML_PATH NAMES genhtml genhtml.perl genhtml.bat )
|
||||
find_program( GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/scripts/test)
|
||||
find_program( SIMPLE_PYTHON_EXECUTABLE python )
|
||||
|
||||
set(COVERAGE_COMPILER_FLAGS "-g -O0" CACHE INTERNAL "")
|
||||
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||
set(COVERAGE_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} --coverage -fprofile-arcs -ftest-coverage")
|
||||
elseif(CMAKE_COMPILER_IS_CLANGXX)
|
||||
set(COVERAGE_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-instr-generate -fcoverage-mapping")
|
||||
if(NOT GCOV_PATH)
|
||||
message(FATAL_ERROR "gcov not found! Aborting...")
|
||||
endif() # NOT GCOV_PATH
|
||||
|
||||
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang")
|
||||
if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 3)
|
||||
message(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...")
|
||||
endif()
|
||||
elseif(NOT CMAKE_COMPILER_IS_GNUCXX)
|
||||
message(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
|
||||
endif()
|
||||
|
||||
set(CMAKE_COVERAGE_FORMAT
|
||||
"html" "xml"
|
||||
CACHE STRING "Coverage report output format.")
|
||||
set_property(CACHE CMAKE_COVERAGE_FORMAT PROPERTY STRINGS "html" "txt")
|
||||
set(COVERAGE_COMPILER_FLAGS "-g -O0 --coverage -fprofile-arcs -ftest-coverage"
|
||||
CACHE INTERNAL "")
|
||||
|
||||
set(CMAKE_CXX_FLAGS_COVERAGE
|
||||
${COVERAGE_COMPILER_FLAGS}
|
||||
CACHE STRING "Flags used by the C++ compiler during coverage builds.")
|
||||
CACHE STRING "Flags used by the C++ compiler during coverage builds."
|
||||
FORCE )
|
||||
set(CMAKE_C_FLAGS_COVERAGE
|
||||
${COVERAGE_COMPILER_FLAGS}
|
||||
CACHE STRING "Flags used by the C compiler during coverage builds.")
|
||||
CACHE STRING "Flags used by the C compiler during coverage builds."
|
||||
FORCE )
|
||||
set(CMAKE_EXE_LINKER_FLAGS_COVERAGE
|
||||
""
|
||||
CACHE STRING "Flags used for linking binaries during coverage builds.")
|
||||
CACHE STRING "Flags used for linking binaries during coverage builds."
|
||||
FORCE )
|
||||
set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
|
||||
""
|
||||
CACHE STRING "Flags used by the shared libraries linker during coverage builds.")
|
||||
CACHE STRING "Flags used by the shared libraries linker during coverage builds."
|
||||
FORCE )
|
||||
mark_as_advanced(
|
||||
CMAKE_COVERAGE_FORMAT
|
||||
CMAKE_CXX_FLAGS_COVERAGE
|
||||
CMAKE_C_FLAGS_COVERAGE
|
||||
CMAKE_EXE_LINKER_FLAGS_COVERAGE
|
||||
CMAKE_SHARED_LINKER_FLAGS_COVERAGE)
|
||||
CMAKE_SHARED_LINKER_FLAGS_COVERAGE )
|
||||
|
||||
if(NOT CMAKE_BUILD_TYPE_LOWER STREQUAL "debug")
|
||||
message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading")
|
||||
endif() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug"
|
||||
|
||||
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||
if(NOT GCOV_PATH)
|
||||
message(FATAL_ERROR "gcov not found! Aborting...")
|
||||
endif() # NOT GCOV_PATH
|
||||
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
||||
link_libraries(gcov)
|
||||
else()
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
|
||||
endif()
|
||||
|
||||
|
||||
# Defines a target for running and collection code coverage information
|
||||
# Builds dependencies, runs the given executable and outputs reports.
|
||||
# NOTE! The executable should always have a ZERO as exit code otherwise
|
||||
# the coverage generation will not complete.
|
||||
#
|
||||
# SETUP_TARGET_FOR_COVERAGE_GCOVR(
|
||||
# SETUP_TARGET_FOR_COVERAGE_LCOV(
|
||||
# NAME testrunner_coverage # New target name
|
||||
# EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
|
||||
# DEPENDENCIES testrunner # Dependencies to build first
|
||||
# )
|
||||
function(SETUP_TARGET_FOR_COVERAGE_LCOV)
|
||||
|
||||
set(options NONE)
|
||||
set(oneValueArgs NAME)
|
||||
set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
|
||||
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
||||
|
||||
if(NOT LCOV_PATH)
|
||||
message(FATAL_ERROR "lcov not found! Aborting...")
|
||||
endif() # NOT LCOV_PATH
|
||||
|
||||
if(NOT GENHTML_PATH)
|
||||
message(FATAL_ERROR "genhtml not found! Aborting...")
|
||||
endif() # NOT GENHTML_PATH
|
||||
|
||||
# Setup target
|
||||
add_custom_target(${Coverage_NAME}
|
||||
|
||||
# Cleanup lcov
|
||||
COMMAND ${LCOV_PATH} --gcov-tool ${GCOV_PATH} -directory . --zerocounters
|
||||
# Create baseline to make sure untouched files show up in the report
|
||||
COMMAND ${LCOV_PATH} --gcov-tool ${GCOV_PATH} -c -i -d . -o ${Coverage_NAME}.base
|
||||
|
||||
# Run tests
|
||||
COMMAND ${Coverage_EXECUTABLE}
|
||||
|
||||
# Capturing lcov counters and generating report
|
||||
COMMAND ${LCOV_PATH} --gcov-tool ${GCOV_PATH} --directory . --capture --output-file ${Coverage_NAME}.info
|
||||
# add baseline counters
|
||||
COMMAND ${LCOV_PATH} --gcov-tool ${GCOV_PATH} -a ${Coverage_NAME}.base -a ${Coverage_NAME}.info --output-file ${Coverage_NAME}.total
|
||||
COMMAND ${LCOV_PATH} --gcov-tool ${GCOV_PATH} --remove ${Coverage_NAME}.total ${COVERAGE_LCOV_EXCLUDES} --output-file ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
|
||||
COMMAND ${GENHTML_PATH} -o ${Coverage_NAME} ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
|
||||
COMMAND ${CMAKE_COMMAND} -E remove ${Coverage_NAME}.base ${Coverage_NAME}.total ${PROJECT_BINARY_DIR}/${Coverage_NAME}.info.cleaned
|
||||
|
||||
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
|
||||
DEPENDS ${Coverage_DEPENDENCIES}
|
||||
COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report."
|
||||
)
|
||||
|
||||
# Show where to find the lcov info report
|
||||
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
|
||||
COMMAND ;
|
||||
COMMENT "Lcov code coverage info report saved in ${Coverage_NAME}.info."
|
||||
)
|
||||
|
||||
# Show info where to find the report
|
||||
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
|
||||
COMMAND ;
|
||||
COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report."
|
||||
)
|
||||
|
||||
endfunction() # SETUP_TARGET_FOR_COVERAGE_LCOV
|
||||
|
||||
# Defines a target for running and collection code coverage information
|
||||
# Builds dependencies, runs the given executable and outputs reports.
|
||||
# NOTE! The executable should always have a ZERO as exit code otherwise
|
||||
# the coverage generation will not complete.
|
||||
#
|
||||
# SETUP_TARGET_FOR_COVERAGE_GCOVR_XML(
|
||||
# NAME ctest_coverage # New target name
|
||||
# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
|
||||
# DEPENDENCIES executable_target # Dependencies to build first
|
||||
# )
|
||||
function(SETUP_TARGET_FOR_COVERAGE_GCOVR)
|
||||
function(SETUP_TARGET_FOR_COVERAGE_GCOVR_XML)
|
||||
|
||||
set(options NONE)
|
||||
set(oneValueArgs NAME SOURCES_ROOT)
|
||||
set(oneValueArgs NAME)
|
||||
set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
|
||||
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
||||
|
||||
if(NOT SIMPLE_PYTHON_EXECUTABLE)
|
||||
message(FATAL_ERROR "python not found! Aborting...")
|
||||
endif() # NOT SIMPLE_PYTHON_EXECUTABLE
|
||||
|
||||
if(NOT GCOVR_PATH)
|
||||
message(FATAL_ERROR "gcovr not found! Aborting...")
|
||||
endif() # NOT GCOVR_PATH
|
||||
|
||||
# Combine excludes to several -e arguments
|
||||
set(GCOVR_EXCLUDES "")
|
||||
foreach(EXCLUDE ${COVERAGE_EXCLUDES})
|
||||
foreach(EXCLUDE ${COVERAGE_GCOVR_EXCLUDES})
|
||||
list(APPEND GCOVR_EXCLUDES "-e")
|
||||
list(APPEND GCOVR_EXCLUDES "${EXCLUDE}")
|
||||
endforeach()
|
||||
|
||||
add_custom_target(${Coverage_NAME}
|
||||
# Run tests
|
||||
COMMAND ctest -C $<CONFIG> $ENV{ARGS} $$ARGS
|
||||
${Coverage_EXECUTABLE}
|
||||
|
||||
# Running gcovr
|
||||
COMMAND ${GCOVR_PATH} --xml
|
||||
-r ${PROJECT_SOURCE_DIR} ${GCOVR_EXCLUDES}
|
||||
--object-directory=${PROJECT_BINARY_DIR}
|
||||
-o ${Coverage_NAME}.xml
|
||||
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
|
||||
DEPENDS ${Coverage_DEPENDENCIES}
|
||||
COMMENT "Running gcovr to produce Cobertura code coverage report."
|
||||
)
|
||||
|
||||
if("html" IN_LIST CMAKE_COVERAGE_FORMAT)
|
||||
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
|
||||
# Create folder
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/${Coverage_NAME}-html
|
||||
# Show info where to find the report
|
||||
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
|
||||
COMMAND ;
|
||||
COMMENT "Cobertura code coverage report saved in ${Coverage_NAME}.xml."
|
||||
)
|
||||
|
||||
# Running gcovr HTML
|
||||
COMMAND ${GCOVR_PATH} --html --html-details
|
||||
-r ${Coverage_SOURCES_ROOT} ${GCOVR_EXCLUDES}
|
||||
--object-directory=${PROJECT_BINARY_DIR}
|
||||
--exclude-unreachable-branches --exclude-throw-branches
|
||||
-o ${Coverage_NAME}-html/index.html
|
||||
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
|
||||
COMMENT "Running gcovr to produce HTML code coverage report ${Coverage_NAME}-html."
|
||||
)
|
||||
endif()
|
||||
|
||||
if("xml" IN_LIST CMAKE_COVERAGE_FORMAT)
|
||||
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
|
||||
# Running gcovr TXT
|
||||
COMMAND ${GCOVR_PATH} --xml
|
||||
-r ${Coverage_SOURCES_ROOT} ${GCOVR_EXCLUDES}
|
||||
--object-directory=${PROJECT_BINARY_DIR}
|
||||
--exclude-unreachable-branches --exclude-throw-branches
|
||||
-o ${Coverage_NAME}.xml
|
||||
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
|
||||
COMMENT "Running gcovr to produce XML code coverage report ${Coverage_NAME}.xml."
|
||||
)
|
||||
endif()
|
||||
|
||||
if("txt" IN_LIST CMAKE_COVERAGE_FORMAT)
|
||||
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
|
||||
# Running gcovr TXT
|
||||
COMMAND ${GCOVR_PATH}
|
||||
-r ${Coverage_SOURCES_ROOT} ${GCOVR_EXCLUDES}
|
||||
--object-directory=${PROJECT_BINARY_DIR}
|
||||
--exclude-unreachable-branches --exclude-throw-branches
|
||||
-o ${Coverage_NAME}.txt
|
||||
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
|
||||
COMMENT "Running gcovr to produce TXT code coverage report ${Coverage_NAME}.txt."
|
||||
)
|
||||
endif()
|
||||
|
||||
endfunction() # SETUP_TARGET_FOR_COVERAGE_GCOVR
|
||||
endfunction() # SETUP_TARGET_FOR_COVERAGE_GCOVR_XML
|
||||
|
||||
# Defines a target for running and collection code coverage information
|
||||
# Builds dependencies, runs the given executable and outputs reports.
|
||||
# NOTE! The executable should always have a ZERO as exit code otherwise
|
||||
# the coverage generation will not complete.
|
||||
#
|
||||
# SETUP_TARGET_FOR_COVERAGE_LLVM(
|
||||
# SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML(
|
||||
# NAME ctest_coverage # New target name
|
||||
# EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR
|
||||
# DEPENDENCIES executable_target # Dependencies to build first
|
||||
# )
|
||||
function(SETUP_TARGET_FOR_COVERAGE_LLVM)
|
||||
function(SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML)
|
||||
|
||||
set(options NONE)
|
||||
set(oneValueArgs NAME SOURCES_ROOT PROF_FILE)
|
||||
set(multiValueArgs EXECUTABLE BINARY EXECUTABLE_ARGS DEPENDENCIES)
|
||||
set(oneValueArgs NAME)
|
||||
set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES)
|
||||
cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
||||
|
||||
if(XCRUN_PATH)
|
||||
set(LLVM_COV_PATH ${XCRUN_PATH} llvm-cov)
|
||||
set(LLVM_PROFDATA_PATH ${XCRUN_PATH} llvm-profdata)
|
||||
else()
|
||||
if(NOT LLVM_COV_PATH)
|
||||
message(FATAL_ERROR "llvm-cov not found! Aborting...")
|
||||
endif() # NOT LLVM_COV_PATH
|
||||
if(NOT LLVM_PROFDATA_PATH)
|
||||
message(FATAL_ERROR "llvm-profdata not found! Aborting...")
|
||||
endif() # NOT LLVM_PROFDATA_PATH
|
||||
endif() # XCRUN_PATH
|
||||
if(NOT SIMPLE_PYTHON_EXECUTABLE)
|
||||
message(FATAL_ERROR "python not found! Aborting...")
|
||||
endif() # NOT SIMPLE_PYTHON_EXECUTABLE
|
||||
|
||||
set(LLVM_PROFILE_DIR ${PROJECT_BINARY_DIR}/llvm_profile)
|
||||
file(REMOVE_RECURSE ${LLVM_PROFILE_DIR})
|
||||
if(NOT GCOVR_PATH)
|
||||
message(FATAL_ERROR "gcovr not found! Aborting...")
|
||||
endif() # NOT GCOVR_PATH
|
||||
|
||||
set(COV_EXCLUDES "")
|
||||
foreach(EXCLUDE ${COVERAGE_EXCLUDES})
|
||||
list(APPEND COV_EXCLUDES "-ignore-filename-regex=${EXCLUDE}")
|
||||
# Combine excludes to several -e arguments
|
||||
set(GCOVR_EXCLUDES "")
|
||||
foreach(EXCLUDE ${COVERAGE_GCOVR_EXCLUDES})
|
||||
list(APPEND GCOVR_EXCLUDES "-e")
|
||||
list(APPEND GCOVR_EXCLUDES "${EXCLUDE}")
|
||||
endforeach()
|
||||
|
||||
list(GET Coverage_BINARY 0 COV_BINARY)
|
||||
if(Coverage_BINARY)
|
||||
list(REMOVE_AT Coverage_BINARY 0)
|
||||
foreach(BIN ${Coverage_BINARY})
|
||||
list(APPEND COV_BINARY -object ${BIN})
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
add_custom_target(${Coverage_NAME}
|
||||
COMMAND ${CMAKE_COMMAND} -E env LLVM_PROFILE_FILE=${LLVM_PROFILE_DIR}/profile-%p.profraw ctest -C $<CONFIG> $$ARGS
|
||||
# Run tests
|
||||
${Coverage_EXECUTABLE}
|
||||
|
||||
COMMAND ${LLVM_PROFDATA_PATH} merge -sparse ${LLVM_PROFILE_DIR}/* -o coverage.profdata
|
||||
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
|
||||
DEPENDS ${Coverage_DEPENDENCIES})
|
||||
# Create folder
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/${Coverage_NAME}
|
||||
|
||||
if("html" IN_LIST CMAKE_COVERAGE_FORMAT)
|
||||
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
|
||||
COMMAND ${LLVM_COV_PATH} show -instr-profile=coverage.profdata ${COV_BINARY}
|
||||
--format=html --output-dir=${Coverage_NAME}-html ${COV_EXCLUDES} ${Coverage_SOURCES_ROOT}
|
||||
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
|
||||
COMMENT "Running llvm-cov to produce HTML code coverage report ${Coverage_NAME}-html")
|
||||
endif()
|
||||
# Running gcovr
|
||||
COMMAND ${GCOVR_PATH} --html --html-details
|
||||
-r ${PROJECT_SOURCE_DIR} ${GCOVR_EXCLUDES}
|
||||
--object-directory=${PROJECT_BINARY_DIR}
|
||||
-o ${Coverage_NAME}/index.html
|
||||
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
|
||||
DEPENDS ${Coverage_DEPENDENCIES}
|
||||
COMMENT "Running gcovr to produce HTML code coverage report."
|
||||
)
|
||||
|
||||
if("xml" IN_LIST CMAKE_COVERAGE_FORMAT)
|
||||
message(WARNING "XML coverage report format not supported for llvm-cov")
|
||||
endif()
|
||||
|
||||
if("txt" IN_LIST CMAKE_COVERAGE_FORMAT)
|
||||
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
|
||||
COMMAND ${LLVM_COV_PATH} show -instr-profile=coverage.profdata ${COV_BINARY}
|
||||
--format=text ${COV_EXCLUDES} ${Coverage_SOURCES_ROOT} > ${Coverage_NAME}.txt
|
||||
|
||||
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
|
||||
COMMENT "Running llvm-cov to produce TXT code coverage report ${Coverage_NAME}.txt.")
|
||||
endif()
|
||||
|
||||
endfunction() # SETUP_TARGET_FOR_COVERAGE_LLVM
|
||||
# Show info where to find the report
|
||||
add_custom_command(TARGET ${Coverage_NAME} POST_BUILD
|
||||
COMMAND ;
|
||||
COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report."
|
||||
)
|
||||
|
||||
endfunction() # SETUP_TARGET_FOR_COVERAGE_GCOVR_HTML
|
||||
|
||||
function(APPEND_COVERAGE_COMPILER_FLAGS)
|
||||
message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
|
||||
endfunction() # APPEND_COVERAGE_COMPILER_FLAGS
|
||||
message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}")
|
||||
endfunction() # APPEND_COVERAGE_COMPILER_FLAGS
|
||||
36
cmake/FindArgon2.cmake
Normal file
@@ -0,0 +1,36 @@
|
||||
# Copyright (C) 2017 KeePassXC Team
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 or (at your option)
|
||||
# version 3 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
find_path(ARGON2_INCLUDE_DIR argon2.h)
|
||||
if(MINGW)
|
||||
# find static library on Windows, and redefine used symbols to
|
||||
# avoid definition name conflicts with libsodium
|
||||
find_library(ARGON2_SYS_LIBRARIES libargon2.a)
|
||||
message(STATUS "Patching libargon2...\n")
|
||||
execute_process(COMMAND objcopy
|
||||
--redefine-sym argon2_hash=libargon2_argon2_hash
|
||||
--redefine-sym _argon2_hash=_libargon2_argon2_hash
|
||||
--redefine-sym argon2_error_message=libargon2_argon2_error_message
|
||||
--redefine-sym _argon2_error_message=_libargon2_argon2_error_message
|
||||
${ARGON2_SYS_LIBRARIES} ${CMAKE_BINARY_DIR}/libargon2_patched.a
|
||||
WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||
find_library(ARGON2_LIBRARIES libargon2_patched.a PATHS ${CMAKE_BINARY_DIR} NO_DEFAULT_PATH)
|
||||
else()
|
||||
find_library(ARGON2_LIBRARIES argon2)
|
||||
endif()
|
||||
mark_as_advanced(ARGON2_LIBRARIES ARGON2_INCLUDE_DIR)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(Argon2 DEFAULT_MSG ARGON2_LIBRARIES ARGON2_INCLUDE_DIR)
|
||||
@@ -1,106 +0,0 @@
|
||||
# Copyright (c) 2018 Ribose Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
|
||||
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#.rst:
|
||||
# FindBotan2
|
||||
# -----------
|
||||
#
|
||||
# Find the botan-2 library.
|
||||
#
|
||||
# IMPORTED Targets
|
||||
# ^^^^^^^^^^^^^^^^
|
||||
#
|
||||
# This module defines :prop_tgt:`IMPORTED` targets:
|
||||
#
|
||||
# ``Botan2::Botan2``
|
||||
# The botan-2 library, if found.
|
||||
#
|
||||
# Result variables
|
||||
# ^^^^^^^^^^^^^^^^
|
||||
#
|
||||
# This module defines the following variables:
|
||||
#
|
||||
# ::
|
||||
#
|
||||
# BOTAN2_FOUND - true if the headers and library were found
|
||||
# BOTAN2_INCLUDE_DIRS - where to find headers
|
||||
# BOTAN2_LIBRARIES - list of libraries to link
|
||||
# BOTAN2_VERSION - library version that was found, if any
|
||||
|
||||
# find the headers
|
||||
find_path(BOTAN2_INCLUDE_DIR
|
||||
NAMES botan/version.h
|
||||
PATH_SUFFIXES botan-2
|
||||
)
|
||||
|
||||
# find the library
|
||||
find_library(BOTAN2_LIBRARY NAMES botan-2 libbotan-2 botan)
|
||||
|
||||
# determine the version
|
||||
if(BOTAN2_INCLUDE_DIR AND EXISTS "${BOTAN2_INCLUDE_DIR}/botan/build.h")
|
||||
file(STRINGS "${BOTAN2_INCLUDE_DIR}/botan/build.h" botan2_version_str
|
||||
REGEX "^#define[\t ]+(BOTAN_VERSION_[A-Z]+)[\t ]+[0-9]+")
|
||||
|
||||
string(REGEX REPLACE ".*#define[\t ]+BOTAN_VERSION_MAJOR[\t ]+([0-9]+).*"
|
||||
"\\1" _botan2_version_major "${botan2_version_str}")
|
||||
string(REGEX REPLACE ".*#define[\t ]+BOTAN_VERSION_MINOR[\t ]+([0-9]+).*"
|
||||
"\\1" _botan2_version_minor "${botan2_version_str}")
|
||||
string(REGEX REPLACE ".*#define[\t ]+BOTAN_VERSION_PATCH[\t ]+([0-9]+).*"
|
||||
"\\1" _botan2_version_patch "${botan2_version_str}")
|
||||
set(BOTAN2_VERSION "${_botan2_version_major}.${_botan2_version_minor}.${_botan2_version_patch}"
|
||||
CACHE INTERNAL "The version of Botan which was detected")
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(Botan2
|
||||
REQUIRED_VARS BOTAN2_LIBRARY BOTAN2_INCLUDE_DIR
|
||||
VERSION_VAR BOTAN2_VERSION
|
||||
)
|
||||
|
||||
if(BOTAN2_FOUND)
|
||||
set(BOTAN2_INCLUDE_DIRS ${BOTAN2_INCLUDE_DIR} ${PC_BOTAN2_INCLUDE_DIRS})
|
||||
set(BOTAN2_LIBRARIES ${BOTAN2_LIBRARY})
|
||||
endif()
|
||||
|
||||
if(BOTAN2_FOUND AND NOT TARGET Botan2::Botan2)
|
||||
# create the new library target
|
||||
add_library(Botan2::Botan2 UNKNOWN IMPORTED)
|
||||
# set the required include dirs for the target
|
||||
if(BOTAN2_INCLUDE_DIRS)
|
||||
set_target_properties(Botan2::Botan2
|
||||
PROPERTIES
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${BOTAN2_INCLUDE_DIRS}"
|
||||
)
|
||||
endif()
|
||||
# set the required libraries for the target
|
||||
if(EXISTS "${BOTAN2_LIBRARY}")
|
||||
set_target_properties(Botan2::Botan2
|
||||
PROPERTIES
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
|
||||
IMPORTED_LOCATION "${BOTAN2_LIBRARY}"
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
mark_as_advanced(BOTAN2_INCLUDE_DIR BOTAN2_LIBRARY)
|
||||
31
cmake/FindGcrypt.cmake
Normal file
@@ -0,0 +1,31 @@
|
||||
# Copyright (C) 2011 Felix Geyer <debfx@fobos.de>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 or (at your option)
|
||||
# version 3 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
find_path(GCRYPT_INCLUDE_DIR gcrypt.h)
|
||||
|
||||
find_library(GCRYPT_LIBRARIES gcrypt)
|
||||
|
||||
mark_as_advanced(GCRYPT_LIBRARIES GCRYPT_INCLUDE_DIR)
|
||||
|
||||
if(GCRYPT_INCLUDE_DIR AND EXISTS "${GCRYPT_INCLUDE_DIR}/gcrypt.h")
|
||||
file(STRINGS "${GCRYPT_INCLUDE_DIR}/gcrypt.h" GCRYPT_H REGEX "^#define GCRYPT_VERSION \"[^\"]*\"$")
|
||||
string(REGEX REPLACE "^.*GCRYPT_VERSION \"([0-9]+).*$" "\\1" GCRYPT_VERSION_MAJOR "${GCRYPT_H}")
|
||||
string(REGEX REPLACE "^.*GCRYPT_VERSION \"[0-9]+\\.([0-9]+).*$" "\\1" GCRYPT_VERSION_MINOR "${GCRYPT_H}")
|
||||
string(REGEX REPLACE "^.*GCRYPT_VERSION \"[0-9]+\\.[0-9]+\\.([0-9]+).*$" "\\1" GCRYPT_VERSION_PATCH "${GCRYPT_H}")
|
||||
set(GCRYPT_VERSION_STRING "${GCRYPT_VERSION_MAJOR}.${GCRYPT_VERSION_MINOR}.${GCRYPT_VERSION_PATCH}")
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(Gcrypt DEFAULT_MSG GCRYPT_LIBRARIES GCRYPT_INCLUDE_DIR)
|
||||
@@ -1,19 +1,23 @@
|
||||
# Copyright (C) 2021 KeePassXC Team <team@keepassxc.org>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 or (at your option)
|
||||
# version 3 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
if(WITH_XC_YUBIKEY)
|
||||
add_subdirectory(ykcore)
|
||||
set(thirdparty_LIBRARIES ${thirdparty_LIBRARIES} ykcore PARENT_SCOPE)
|
||||
endif()
|
||||
# Copyright (C) 2017 KeePassXC Team <team@keepassxc.org>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 or (at your option)
|
||||
# version 3 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
find_path(GPGERROR_INCLUDE_DIR gpg-error.h)
|
||||
find_library(GPGERROR_LIBRARIES gpg-error)
|
||||
|
||||
mark_as_advanced(GPGERROR_LIBRARIES GPGERROR_INCLUDE_DIR)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
include_directories(${GPGERROR_INCLUDE_DIR})
|
||||
find_package_handle_standard_args(LibGPGError DEFAULT_MSG GPGERROR_LIBRARIES GPGERROR_INCLUDE_DIR)
|
||||
@@ -1,9 +0,0 @@
|
||||
# MINIZIP_FOUND - Minizip library was found
|
||||
# MINIZIP_INCLUDE_DIR - Path to Minizip include dir
|
||||
# MINIZIP_LIBRARIES - List of Minizip libraries
|
||||
|
||||
find_library(MINIZIP_LIBRARIES NAMES minizip libminizip)
|
||||
find_path(MINIZIP_INCLUDE_DIR zip.h PATH_SUFFIXES minizip)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(Minizip DEFAULT_MSG MINIZIP_LIBRARIES MINIZIP_INCLUDE_DIR)
|
||||
@@ -1,39 +0,0 @@
|
||||
# Copyright (C) 2021 KeePassXC Team <team@keepassxc.org>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 or (at your option)
|
||||
# version 3 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Use pkgconfig on Linux
|
||||
if(NOT WIN32)
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(PCSC libpcsclite)
|
||||
endif()
|
||||
|
||||
if(NOT PCSC_FOUND)
|
||||
# Search for PC/SC headers on Mac and Windows
|
||||
find_path(PCSC_INCLUDE_DIRS winscard.h
|
||||
HINTS
|
||||
${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}
|
||||
/usr/include/PCSC
|
||||
PATH_SUFFIXES PCSC)
|
||||
|
||||
# MAC library is PCSC, Windows library is WinSCard
|
||||
find_library(PCSC_LIBRARIES NAMES pcsclite libpcsclite WinSCard PCSC
|
||||
HINTS
|
||||
${CMAKE_C_IMPLICIT_LINK_DIRECTORIES})
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(PCSC DEFAULT_MSG PCSC_LIBRARIES PCSC_INCLUDE_DIRS)
|
||||
|
||||
mark_as_advanced(PCSC_LIBRARIES PCSC_INCLUDE_DIRS)
|
||||
@@ -13,15 +13,8 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
find_path(QRENCODE_INCLUDE_DIR NAMES qrencode.h)
|
||||
|
||||
if (VCPKG_INSTALLED_DIR)
|
||||
find_library(QRENCODE_LIBRARY_RELEASE qrencode)
|
||||
find_library(QRENCODE_LIBRARY_DEBUG qrencoded)
|
||||
set(QRENCODE_LIBRARY optimized ${QRENCODE_LIBRARY_RELEASE} debug ${QRENCODE_LIBRARY_DEBUG})
|
||||
else()
|
||||
find_library(QRENCODE_LIBRARY qrencode)
|
||||
endif()
|
||||
find_path(QRENCODE_INCLUDE_DIR qrencode.h)
|
||||
find_library(QRENCODE_LIBRARY qrencode)
|
||||
|
||||
mark_as_advanced(QRENCODE_LIBRARY QRENCODE_INCLUDE_DIR)
|
||||
|
||||
|
||||
33
cmake/FindQuaZip.cmake
Normal file
@@ -0,0 +1,33 @@
|
||||
# QUAZIP_FOUND - QuaZip library was found
|
||||
# QUAZIP_INCLUDE_DIRS - Path to QuaZip include dir
|
||||
# QUAZIP_LIBRARIES - List of QuaZip libraries
|
||||
|
||||
if(MINGW)
|
||||
find_library(QUAZIP_LIBRARIES libquazip5)
|
||||
find_path(QUAZIP_INCLUDE_DIRS quazip.h PATH_SUFFIXES quazip5)
|
||||
elseif(APPLE)
|
||||
find_library(QUAZIP_LIBRARIES quazip1-qt5)
|
||||
find_path(QUAZIP_INCLUDE_DIRS quazip.h PATH_SUFFIXES quazip)
|
||||
else()
|
||||
# Try pkgconfig first
|
||||
find_package(PkgConfig QUIET)
|
||||
if (PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(QUAZIP QUIET quazip1-qt5)
|
||||
endif()
|
||||
if(NOT QUAZIP_FOUND)
|
||||
# Try to find QuaZip version 0.x
|
||||
find_library(QUAZIP_LIBRARIES
|
||||
NAMES quazip5 quazip
|
||||
PATHS /usr/lib /usr/lib64 /usr/local/lib
|
||||
)
|
||||
find_path(QUAZIP_INCLUDE_DIRS quazip.h
|
||||
PATHS /usr/include /usr/local/include
|
||||
PATH_SUFFIXES quazip5 quazip
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
mark_as_advanced(QUAZIP_LIBRARIES QUAZIP_INCLUDE_DIRS)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(QuaZip DEFAULT_MSG QUAZIP_LIBRARIES QUAZIP_INCLUDE_DIRS)
|
||||
@@ -47,3 +47,4 @@ mark_as_advanced(
|
||||
Readline_INCLUDE_DIR
|
||||
Readline_LIBRARY
|
||||
)
|
||||
|
||||
|
||||
27
cmake/FindYubiKey.cmake
Normal file
@@ -0,0 +1,27 @@
|
||||
# Copyright (C) 2014 Kyle Manna <kyle@kylemanna.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 or (at your option)
|
||||
# version 3 of the License.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
find_path(YUBIKEY_CORE_INCLUDE_DIR yubikey.h)
|
||||
find_path(YUBIKEY_PERS_INCLUDE_DIR ykcore.h PATH_SUFFIXES ykpers-1)
|
||||
set(YUBIKEY_INCLUDE_DIRS ${YUBIKEY_CORE_INCLUDE_DIR} ${YUBIKEY_PERS_INCLUDE_DIR})
|
||||
|
||||
find_library(YUBIKEY_CORE_LIBRARY NAMES yubikey.dll libyubikey.so yubikey)
|
||||
find_library(YUBIKEY_PERS_LIBRARY NAMES ykpers-1.dll libykpers-1.so ykpers-1)
|
||||
set(YUBIKEY_LIBRARIES ${YUBIKEY_CORE_LIBRARY} ${YUBIKEY_PERS_LIBRARY})
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(YubiKey DEFAULT_MSG YUBIKEY_LIBRARIES YUBIKEY_INCLUDE_DIRS)
|
||||
|
||||
mark_as_advanced(YUBIKEY_LIBRARIES YUBIKEY_INCLUDE_DIRS)
|
||||
267
cmake/Findsodium.cmake
Normal file
@@ -0,0 +1,267 @@
|
||||
# Written in 2016 by Henrik Steffen Gaßmann <henrik@gassmann.onl>
|
||||
#
|
||||
# To the extent possible under law, the author(s) have dedicated all
|
||||
# copyright and related and neighboring rights to this software to the
|
||||
# public domain worldwide. This software is distributed without any warranty.
|
||||
#
|
||||
# You should have received a copy of the CC0 Public Domain Dedication
|
||||
# along with this software. If not, see
|
||||
#
|
||||
# http://creativecommons.org/publicdomain/zero/1.0/
|
||||
#
|
||||
########################################################################
|
||||
# Tries to find the local libsodium installation.
|
||||
#
|
||||
# On Windows the sodium_DIR environment variable is used as a default
|
||||
# hint which can be overridden by setting the corresponding cmake variable.
|
||||
#
|
||||
# Once done the following variables will be defined:
|
||||
#
|
||||
# sodium_FOUND
|
||||
# sodium_INCLUDE_DIR
|
||||
# sodium_LIBRARY_DEBUG
|
||||
# sodium_LIBRARY_RELEASE
|
||||
#
|
||||
#
|
||||
# Furthermore an imported "sodium" target is created.
|
||||
#
|
||||
|
||||
if (CMAKE_C_COMPILER_ID STREQUAL "GNU"
|
||||
OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
||||
set(_GCC_COMPATIBLE 1)
|
||||
endif()
|
||||
|
||||
# static library option
|
||||
option(sodium_USE_STATIC_LIBS "enable to statically link against sodium")
|
||||
if(NOT (sodium_USE_STATIC_LIBS EQUAL sodium_USE_STATIC_LIBS_LAST))
|
||||
unset(sodium_LIBRARY CACHE)
|
||||
unset(sodium_LIBRARY_DEBUG CACHE)
|
||||
unset(sodium_LIBRARY_RELEASE CACHE)
|
||||
unset(sodium_DLL_DEBUG CACHE)
|
||||
unset(sodium_DLL_RELEASE CACHE)
|
||||
set(sodium_USE_STATIC_LIBS_LAST ${sodium_USE_STATIC_LIBS} CACHE INTERNAL "internal change tracking variable")
|
||||
endif()
|
||||
|
||||
|
||||
########################################################################
|
||||
# UNIX
|
||||
if (UNIX)
|
||||
# import pkg-config
|
||||
find_package(PkgConfig QUIET)
|
||||
if (PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(sodium_PKG QUIET libsodium)
|
||||
endif()
|
||||
|
||||
if(sodium_USE_STATIC_LIBS)
|
||||
set(XPREFIX sodium_PKG_STATIC)
|
||||
else()
|
||||
set(XPREFIX sodium_PKG)
|
||||
endif()
|
||||
|
||||
find_path(sodium_INCLUDE_DIR sodium.h
|
||||
HINTS ${${XPREFIX}_INCLUDE_DIRS}
|
||||
)
|
||||
find_library(sodium_LIBRARY_DEBUG NAMES ${${XPREFIX}_LIBRARIES} sodium
|
||||
HINTS ${${XPREFIX}_LIBRARY_DIRS}
|
||||
)
|
||||
find_library(sodium_LIBRARY_RELEASE NAMES ${${XPREFIX}_LIBRARIES} sodium
|
||||
HINTS ${${XPREFIX}_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
|
||||
########################################################################
|
||||
# Windows
|
||||
elseif (WIN32)
|
||||
set(sodium_DIR "$ENV{sodium_DIR}" CACHE FILEPATH "sodium install directory")
|
||||
mark_as_advanced(sodium_DIR)
|
||||
|
||||
find_path(sodium_INCLUDE_DIR sodium.h
|
||||
HINTS ${sodium_DIR}
|
||||
PATH_SUFFIXES include
|
||||
)
|
||||
|
||||
if (MSVC)
|
||||
# detect target architecture
|
||||
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/arch.c" [=[
|
||||
#if defined _M_IX86
|
||||
#error ARCH_VALUE x86_32
|
||||
#elif defined _M_X64
|
||||
#error ARCH_VALUE x86_64
|
||||
#endif
|
||||
#error ARCH_VALUE unknown
|
||||
]=])
|
||||
try_compile(_UNUSED_VAR "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/arch.c"
|
||||
OUTPUT_VARIABLE _COMPILATION_LOG
|
||||
)
|
||||
string(REGEX REPLACE ".*ARCH_VALUE ([a-zA-Z0-9_]+).*" "\\1" _TARGET_ARCH "${_COMPILATION_LOG}")
|
||||
|
||||
# construct library path
|
||||
if (_TARGET_ARCH STREQUAL "x86_32")
|
||||
string(APPEND _PLATFORM_PATH "Win32")
|
||||
elseif(_TARGET_ARCH STREQUAL "x86_64")
|
||||
string(APPEND _PLATFORM_PATH "x64")
|
||||
else()
|
||||
message(FATAL_ERROR "the ${_TARGET_ARCH} architecture is not supported by Findsodium.cmake.")
|
||||
endif()
|
||||
string(APPEND _PLATFORM_PATH "/$$CONFIG$$")
|
||||
|
||||
if (MSVC_VERSION LESS 1900)
|
||||
math(EXPR _VS_VERSION "${MSVC_VERSION} / 10 - 60")
|
||||
else()
|
||||
math(EXPR _VS_VERSION "${MSVC_VERSION} / 10 - 50")
|
||||
endif()
|
||||
string(APPEND _PLATFORM_PATH "/v${_VS_VERSION}")
|
||||
|
||||
if (sodium_USE_STATIC_LIBS)
|
||||
string(APPEND _PLATFORM_PATH "/static")
|
||||
else()
|
||||
string(APPEND _PLATFORM_PATH "/dynamic")
|
||||
endif()
|
||||
|
||||
string(REPLACE "$$CONFIG$$" "Debug" _DEBUG_PATH_SUFFIX "${_PLATFORM_PATH}")
|
||||
string(REPLACE "$$CONFIG$$" "Release" _RELEASE_PATH_SUFFIX "${_PLATFORM_PATH}")
|
||||
|
||||
find_library(sodium_LIBRARY_DEBUG libsodium.lib
|
||||
HINTS ${sodium_DIR}
|
||||
PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX}
|
||||
)
|
||||
find_library(sodium_LIBRARY_RELEASE libsodium.lib
|
||||
HINTS ${sodium_DIR}
|
||||
PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX}
|
||||
)
|
||||
if (NOT sodium_USE_STATIC_LIBS)
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll")
|
||||
find_library(sodium_DLL_DEBUG libsodium
|
||||
HINTS ${sodium_DIR}
|
||||
PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX}
|
||||
)
|
||||
find_library(sodium_DLL_RELEASE libsodium
|
||||
HINTS ${sodium_DIR}
|
||||
PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX}
|
||||
)
|
||||
endif()
|
||||
|
||||
elseif(_GCC_COMPATIBLE)
|
||||
if (sodium_USE_STATIC_LIBS)
|
||||
find_library(sodium_LIBRARY_DEBUG libsodium.a
|
||||
HINTS ${sodium_DIR}
|
||||
PATH_SUFFIXES lib
|
||||
)
|
||||
find_library(sodium_LIBRARY_RELEASE libsodium.a
|
||||
HINTS ${sodium_DIR}
|
||||
PATH_SUFFIXES lib
|
||||
)
|
||||
else()
|
||||
find_library(sodium_LIBRARY_DEBUG libsodium.dll.a
|
||||
HINTS ${sodium_DIR}
|
||||
PATH_SUFFIXES lib
|
||||
)
|
||||
find_library(sodium_LIBRARY_RELEASE libsodium.dll.a
|
||||
HINTS ${sodium_DIR}
|
||||
PATH_SUFFIXES lib
|
||||
)
|
||||
|
||||
file(GLOB _DLL
|
||||
LIST_DIRECTORIES false
|
||||
RELATIVE "${sodium_DIR}/bin"
|
||||
"${sodium_DIR}/bin/libsodium*.dll"
|
||||
)
|
||||
find_library(sodium_DLL_DEBUG ${_DLL} libsodium
|
||||
HINTS ${sodium_DIR}
|
||||
PATH_SUFFIXES bin
|
||||
)
|
||||
find_library(sodium_DLL_RELEASE ${_DLL} libsodium
|
||||
HINTS ${sodium_DIR}
|
||||
PATH_SUFFIXES bin
|
||||
)
|
||||
endif()
|
||||
else()
|
||||
message(FATAL_ERROR "this platform is not supported by FindSodium.cmake")
|
||||
endif()
|
||||
|
||||
|
||||
########################################################################
|
||||
# unsupported
|
||||
else()
|
||||
message(FATAL_ERROR "this platform is not supported by FindSodium.cmake")
|
||||
endif()
|
||||
|
||||
|
||||
########################################################################
|
||||
# common stuff
|
||||
|
||||
# extract sodium version
|
||||
if (sodium_INCLUDE_DIR)
|
||||
set(_VERSION_HEADER "${_INCLUDE_DIR}/sodium/version.h")
|
||||
if (EXISTS _VERSION_HEADER)
|
||||
file(READ "${_VERSION_HEADER}" _VERSION_HEADER_CONTENT)
|
||||
string(REGEX REPLACE ".*#[ \t]*define[ \t]*SODIUM_VERSION_STRING[ \t]*\"([^\n]*)\".*" "\\1"
|
||||
sodium_VERSION "${_VERSION_HEADER_CONTENT}")
|
||||
set(sodium_VERSION "${sodium_VERSION}" PARENT_SCOPE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# communicate results
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(sodium
|
||||
REQUIRED_VARS
|
||||
sodium_LIBRARY_RELEASE
|
||||
sodium_LIBRARY_DEBUG
|
||||
sodium_INCLUDE_DIR
|
||||
VERSION_VAR
|
||||
sodium_VERSION
|
||||
)
|
||||
|
||||
# mark file paths as advanced
|
||||
mark_as_advanced(sodium_INCLUDE_DIR)
|
||||
mark_as_advanced(sodium_LIBRARY_DEBUG)
|
||||
mark_as_advanced(sodium_LIBRARY_RELEASE)
|
||||
if (WIN32)
|
||||
mark_as_advanced(sodium_DLL_DEBUG)
|
||||
mark_as_advanced(sodium_DLL_RELEASE)
|
||||
endif()
|
||||
|
||||
# create imported target
|
||||
if(sodium_USE_STATIC_LIBS)
|
||||
set(_LIB_TYPE STATIC)
|
||||
else()
|
||||
set(_LIB_TYPE SHARED)
|
||||
endif()
|
||||
add_library(sodium ${_LIB_TYPE} IMPORTED)
|
||||
|
||||
set_target_properties(sodium PROPERTIES
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${sodium_INCLUDE_DIR}"
|
||||
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
|
||||
)
|
||||
|
||||
if (sodium_USE_STATIC_LIBS)
|
||||
set_target_properties(sodium PROPERTIES
|
||||
INTERFACE_COMPILE_DEFINITIONS "SODIUM_STATIC"
|
||||
IMPORTED_LOCATION "${sodium_LIBRARY_RELEASE}"
|
||||
IMPORTED_LOCATION_DEBUG "${sodium_LIBRARY_DEBUG}"
|
||||
)
|
||||
else()
|
||||
if (UNIX)
|
||||
set_target_properties(sodium PROPERTIES
|
||||
IMPORTED_LOCATION "${sodium_LIBRARY_RELEASE}"
|
||||
IMPORTED_LOCATION_DEBUG "${sodium_LIBRARY_DEBUG}"
|
||||
)
|
||||
elseif (WIN32)
|
||||
set_target_properties(sodium PROPERTIES
|
||||
IMPORTED_IMPLIB "${sodium_LIBRARY_RELEASE}"
|
||||
IMPORTED_IMPLIB_DEBUG "${sodium_LIBRARY_DEBUG}"
|
||||
)
|
||||
if (NOT (sodium_DLL_DEBUG MATCHES ".*-NOTFOUND"))
|
||||
set_target_properties(sodium PROPERTIES
|
||||
IMPORTED_LOCATION_DEBUG "${sodium_DLL_DEBUG}"
|
||||
)
|
||||
endif()
|
||||
if (NOT (sodium_DLL_RELEASE MATCHES ".*-NOTFOUND"))
|
||||
set_target_properties(sodium PROPERTIES
|
||||
IMPORTED_LOCATION_RELWITHDEBINFO "${sodium_DLL_RELEASE}"
|
||||
IMPORTED_LOCATION_MINSIZEREL "${sodium_DLL_RELEASE}"
|
||||
IMPORTED_LOCATION_RELEASE "${sodium_DLL_RELEASE}"
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
@@ -1,3 +0,0 @@
|
||||
if (CMAKE_INSTALL_PREFIX MATCHES "/ZIP/")
|
||||
file(TOUCH "${CMAKE_INSTALL_PREFIX}/.portable")
|
||||
endif()
|
||||
@@ -1,8 +0,0 @@
|
||||
coverage:
|
||||
range: 60..80
|
||||
round: nearest
|
||||
precision: 2
|
||||
fixes:
|
||||
- "*/src/::"
|
||||
comment:
|
||||
require_changes: true
|
||||
@@ -16,44 +16,51 @@
|
||||
find_program(ASCIIDOCTOR_EXE asciidoctor)
|
||||
if(NOT ASCIIDOCTOR_EXE)
|
||||
message(FATAL_ERROR "asciidoctor is required to build documentation")
|
||||
else()
|
||||
message(STATUS "Using asciidoctor: ${ASCIIDOCTOR_EXE}")
|
||||
endif()
|
||||
message(STATUS "Using asciidoctor: ${ASCIIDOCTOR_EXE}")
|
||||
|
||||
set(DOC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
set(OUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
|
||||
set(REV -a revnumber=${KEEPASSXC_VERSION})
|
||||
|
||||
# Build html documentation on all platforms
|
||||
# NOTE: Combine into one long command to prevent MSVC from failing to build all docs
|
||||
file(GLOB doc_depends ${DOC_DIR}/*.adoc ${DOC_DIR}/topics/* ${DOC_DIR}/styles/* ${DOC_DIR}/images/*)
|
||||
add_custom_command(
|
||||
OUTPUT KeePassXC_GettingStarted.html KeePassXC_UserGuide.html KeePassXC_KeyboardShortcuts.html
|
||||
COMMAND
|
||||
${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_GettingStarted.html ${REV} ${DOC_DIR}/GettingStarted.adoc &&
|
||||
${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_UserGuide.html ${REV} ${DOC_DIR}/UserGuide.adoc &&
|
||||
${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_KeyboardShortcuts.html ${REV} ${DOC_DIR}/topics/KeyboardShortcuts.adoc
|
||||
DEPENDS ${doc_depends}
|
||||
file(GLOB html_depends ${DOC_DIR}/topics/* ${DOC_DIR}/styles/* ${DOC_DIR}/images/*)
|
||||
add_custom_command(OUTPUT KeePassXC_GettingStarted.html
|
||||
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_GettingStarted.html ${DOC_DIR}/GettingStarted.adoc
|
||||
DEPENDS ${html_depends} ${DOC_DIR}/GettingStarted.adoc
|
||||
VERBATIM)
|
||||
add_custom_command(OUTPUT KeePassXC_UserGuide.html
|
||||
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_UserGuide.html ${DOC_DIR}/UserGuide.adoc
|
||||
DEPENDS ${html_depends} ${DOC_DIR}/UserGuide.adoc
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
VERBATIM)
|
||||
file(GLOB styles_depends ${DOC_DIR}/styles/*)
|
||||
add_custom_command(OUTPUT KeePassXC_KeyboardShortcuts.html
|
||||
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -o KeePassXC_KeyboardShortcuts.html ${DOC_DIR}/topics/KeyboardShortcuts.adoc
|
||||
DEPENDS ${DOC_DIR}/topics/KeyboardShortcuts.adoc ${styles_depends}
|
||||
VERBATIM)
|
||||
|
||||
add_custom_target(docs ALL DEPENDS KeePassXC_GettingStarted.html KeePassXC_UserGuide.html KeePassXC_KeyboardShortcuts.html)
|
||||
|
||||
install(FILES
|
||||
${OUT_DIR}/KeePassXC_GettingStarted.html
|
||||
${OUT_DIR}/KeePassXC_UserGuide.html
|
||||
${OUT_DIR}/KeePassXC_KeyboardShortcuts.html
|
||||
DESTINATION ${DATA_INSTALL_DIR}/docs)
|
||||
${OUT_DIR}/KeePassXC_GettingStarted.html
|
||||
${OUT_DIR}/KeePassXC_UserGuide.html
|
||||
${OUT_DIR}/KeePassXC_KeyboardShortcuts.html
|
||||
DESTINATION ${DATA_INSTALL_DIR}/docs)
|
||||
|
||||
# Build Man Pages on Linux and macOS
|
||||
if(UNIX)
|
||||
add_custom_command(OUTPUT keepassxc.1 keepassxc-cli.1
|
||||
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -b manpage ${REV} ./man/keepassxc.1.adoc
|
||||
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -b manpage ${REV} ./man/keepassxc-cli.1.adoc
|
||||
DEPENDS ${DOC_DIR}/man/keepassxc.1.adoc ${DOC_DIR}/man/keepassxc-cli.1.adoc
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
if(APPLE OR UNIX)
|
||||
add_custom_command(OUTPUT keepassxc.1
|
||||
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -b manpage ${DOC_DIR}/man/keepassxc.1.adoc
|
||||
DEPENDS ${DOC_DIR}/man/keepassxc.1.adoc
|
||||
VERBATIM)
|
||||
add_custom_command(OUTPUT keepassxc-cli.1
|
||||
COMMAND ${ASCIIDOCTOR_EXE} -D ${OUT_DIR} -b manpage ${DOC_DIR}/man/keepassxc-cli.1.adoc
|
||||
DEPENDS ${DOC_DIR}/man/keepassxc-cli.1.adoc
|
||||
VERBATIM)
|
||||
add_custom_target(manpages ALL DEPENDS keepassxc.1 keepassxc-cli.1)
|
||||
|
||||
install(FILES
|
||||
install(FILES
|
||||
${OUT_DIR}/keepassxc.1
|
||||
${OUT_DIR}/keepassxc-cli.1
|
||||
DESTINATION ${CMAKE_INSTALL_MANDIR}/man1/)
|
||||
|
||||
@@ -1,68 +0,0 @@
|
||||
# Fuzz-Testing KeePassXC
|
||||
|
||||
Fuzz-testing = feeding random input into a program until it crashes. Be smart about what's "random" by looking at how the program executes the input.
|
||||
|
||||
We use the "American Fuzzy Lop" (AFL) fuzz tester (https://lcamtuf.coredump.cx/afl/).
|
||||
|
||||
The following assumes that all tools and libraries required to build KeePassXC from source have already been installed.
|
||||
|
||||
## Installing AFL
|
||||
|
||||
$ sudo apt install afl
|
||||
|
||||
Optionally, build AFL from source:
|
||||
|
||||
$ git clone https://github.com/google/AFL
|
||||
$ cd AFL
|
||||
$ make
|
||||
$ make install
|
||||
|
||||
## Building KeePassXC For Fuzzing
|
||||
|
||||
A special "instrumented build" is used that allows the fuzzer to look into the program as it executes. We place it in its own build directory so it doesn't confused with the production build.
|
||||
|
||||
$ cd your_keepassxc_source_directory
|
||||
$ mkdir buildafl
|
||||
$ cd buildafl
|
||||
$ CXX=afl-g++ AFL_HARDEN=1 cmake -DWITH_XC_ALL=ON ..
|
||||
$ make
|
||||
|
||||
In the source code, special behavior for fuzz testing can be implemented with `#ifdef __AFL_COMPILER`. For example, in fuzz builds, the KeePassXC CLI takes the database password from environment variable `KEYPASSXC_AFL_PASSWORD` to allow non-interactive operation.
|
||||
|
||||
## Prepare Fuzzer Input
|
||||
|
||||
To get the fuzzer started, we provide empty password database files (the password is `secret`).
|
||||
|
||||
$ cd buildafl
|
||||
$ mkdir -p findings/testcases
|
||||
$ cp ../share/empty*.kdbx findings/testcases
|
||||
|
||||
The fuzzer works by running KeePassXC with variations of this input, mutated in ways that make the program crash or hang.
|
||||
|
||||
## Run The Fuzzer
|
||||
|
||||
$ cd buildafl
|
||||
$ KEYPASSXC_AFL_PASSWORD=secret afl-fuzz -i findings/testcases -o findings -m 2000 -t 1000 src/cli/keepassxc-cli ls @@
|
||||
|
||||
This fuzz-tests the `ls` command of the KeePassXC CLI, which loads and decrypts a database file and then lists its contents. The parameters mean:
|
||||
|
||||
* `KEYPASSXC_AFL_PASSWORD=secret`: In fuzz test builds, the KeePassXC CLI takes the database password from this environment variable.
|
||||
* `-i findings/testcases`: The directory which contains the initial fuzzer input.
|
||||
* `-o findings`: The directory in which to store fuzzer results.
|
||||
* `-m 2000`: Fuzzer memory (in megabytes). Adjust as required if the fuzzer fails to start up.
|
||||
* `-t 1000`: Timeout until a hang is detected (in milliseconds).
|
||||
* `src/cli/keepassxc-cli`: The instrumented executable.
|
||||
* `ls`: The subcommand we're testing.
|
||||
* `@@`: The fuzzer replaces this by the name of a file with the generated input.
|
||||
|
||||
You may also need `export AFL_SKIP_CPUFREQ=1`.
|
||||
|
||||
If KeePassXC crashes or hangs when processing the input, the fuzzer writes the database file (that was used in place of `@@`) to the `findings/crashes` or `findings/hangs` directory, respectively.
|
||||
|
||||
To continue where the fuzzer left off, use `-i -`. To start over, remove and re-create the `findings` directory.
|
||||
|
||||
## More Information
|
||||
|
||||
AFL documentation: https://afl-1.readthedocs.io/en/latest/
|
||||
|
||||
Read this if you want to get serious about fuzz-testing.
|
||||
@@ -1,5 +1,6 @@
|
||||
= KeePassXC: Getting Started Guide
|
||||
KeePassXC Team <team@keepassxc.org>
|
||||
v2.6.0
|
||||
:data-uri:
|
||||
:linkcss!:
|
||||
:homepage: https://keepassxc.org
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
= KeePassXC: User Guide
|
||||
KeePassXC Team <team@keepassxc.org>
|
||||
v2.6.0
|
||||
:data-uri:
|
||||
:homepage: https://keepassxc.org
|
||||
:icons: font
|
||||
@@ -34,5 +35,3 @@ include::topics/AutoType.adoc[tags=*]
|
||||
include::topics/KeeShare.adoc[tags=*]
|
||||
|
||||
include::topics/SSHAgent.adoc[tags=*]
|
||||
|
||||
include::topics/Reference.adoc[tags=*]
|
||||
|
||||
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 104 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 53 KiB |
@@ -15,9 +15,9 @@
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
= keepassxc-cli(1)
|
||||
KeePassXC Team <team@keepassxc.org>
|
||||
:docdate: 2020-08-31
|
||||
:docdate: 2020-07-10
|
||||
:doctype: manpage
|
||||
:revnumber: 2.6.0
|
||||
:mansource: KeePassXC {revnumber}
|
||||
:manmanual: General Commands Manual
|
||||
|
||||
@@ -38,25 +38,14 @@ It provides the ability to query and modify the entries of a KeePass database, d
|
||||
The same password generation options as documented for the generate command can be used when the *-g* option is set.
|
||||
|
||||
*analyze* [_options_] <__database__>::
|
||||
Analyzes passwords in a database for weaknesses using offline HIBP SHA-1 hash lookup.
|
||||
|
||||
*attachment-export* [_options_] <__database__> <__entry__> <__attachment_name__> <__export_file__>::
|
||||
Exports the content of an attachment to a specified file.
|
||||
Use *--stdout* option to instead output the contents of the attachment to stdout.
|
||||
|
||||
*attachment-import* [_options_] <__database__> <__entry__> <__attachment_name__> <__import_file__>::
|
||||
Imports the attachment into an entry.
|
||||
An existing attachment with the same name may be overwritten if the *-f* option is specified.
|
||||
|
||||
*attachment-rm* <__database__> <__entry__> <__attachment_name__>::
|
||||
Removes the named attachment from an entry.
|
||||
Analyzes passwords in a database for weaknesses.
|
||||
|
||||
*clip* [_options_] <__database__> <__entry__> [_timeout_]::
|
||||
Copies an attribute or the current TOTP (if the *-t* option is specified) of a database entry to the clipboard.
|
||||
If no attribute name is specified using the *-a* option, the password is copied.
|
||||
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.
|
||||
Optionally, a timeout in seconds can be specified to automatically clear the clipboard.
|
||||
|
||||
*close*::
|
||||
In interactive mode, closes the currently opened database (see *open*).
|
||||
@@ -95,11 +84,10 @@ It provides the ability to query and modify the entries of a KeePass database, d
|
||||
Displays a list of available commands, or detailed information about the specified command.
|
||||
|
||||
*import* [_options_] <__xml__> <__database__>::
|
||||
Imports the contents of an XML exported database to a new created database
|
||||
with a password and/or key file.
|
||||
The key file will be created if the file that is referred to does not exist.
|
||||
If both the key file and password are empty, no database will be created.
|
||||
The new database will be in kdbx 4 format.
|
||||
Imports the contents of an XML database to the target database.
|
||||
|
||||
*locate* [_options_] <__database__> <__term__>::
|
||||
Locates all the entries that match a specific search term in a database.
|
||||
|
||||
*ls* [_options_] <__database__> [_group_]::
|
||||
Lists the contents of a group in a database.
|
||||
@@ -134,9 +122,6 @@ It provides the ability to query and modify the entries of a KeePass database, d
|
||||
If the database has a recycle bin, the group will be moved there.
|
||||
If the group is already in the recycle bin, it will be removed permanently.
|
||||
|
||||
*search* [_options_] <__database__> <__term__>::
|
||||
Searches all entries that match a specific search term in a database.
|
||||
|
||||
*show* [_options_] <__database__> <__entry__>::
|
||||
Shows the title, username, password, URL and notes of a database entry.
|
||||
Can also show the current TOTP.
|
||||
@@ -192,9 +177,6 @@ The same password generation options as documented for the generate command can
|
||||
*--url* <__url__>::
|
||||
Specifies the URL of the entry.
|
||||
|
||||
*--notes* <__notes__>::
|
||||
Specifies the notes of the entry.
|
||||
|
||||
*-p*, *--password-prompt*::
|
||||
Uses a password prompt for the entry's password.
|
||||
|
||||
@@ -215,10 +197,6 @@ The same password generation options as documented for the generate command can
|
||||
Such files are available from https://haveibeenpwned.com/Passwords;
|
||||
note that they are large, and so this operation typically takes some time (minutes up to an hour or so).
|
||||
|
||||
*--okon* <__okon-cli path__>::
|
||||
Use the specified okon-cli program to perform offline breach checks. You can obtain okon-cli from https://github.com/stryku/okon.
|
||||
When using this option, *-H, --hibp* must point to a post-processed okon file (e.g. file.okon).
|
||||
|
||||
=== Clip options
|
||||
*-a*, *--attribute*::
|
||||
Copies the specified attribute to the clipboard.
|
||||
@@ -230,12 +208,7 @@ 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.
|
||||
|
||||
*-b*, *--best*::
|
||||
Try to find and copy to clipboard a unique entry matching the input
|
||||
If a unique matching entry is found it will be copied to the clipboard.
|
||||
If multiple entries are found they will be listed to refine the search. (no clip performed)
|
||||
|
||||
=== Create and Import options
|
||||
=== Create options
|
||||
*-k*, *--set-key-file* <__path__>::
|
||||
Set the key file for the database.
|
||||
|
||||
@@ -255,9 +228,6 @@ The same password generation options as documented for the generate command can
|
||||
*-s*, *--show-protected*::
|
||||
Shows the protected attributes in clear text.
|
||||
|
||||
*--show-attachments*::
|
||||
Shows the attachment names along with the size of the attachments.
|
||||
|
||||
*-t*, *--totp*::
|
||||
Also shows the current TOTP, reporting an error if no TOTP is configured for the entry.
|
||||
|
||||
@@ -270,7 +240,6 @@ The same password generation options as documented for the generate command can
|
||||
Sets the Path of the wordlist for the diceware generator.
|
||||
The wordlist must have > 1000 words, otherwise the program will fail.
|
||||
If the wordlist has < 4000 words a warning will be printed to STDERR.
|
||||
Any *diceware*-compatible wordlist can used. Note however that *KeePassXC* will NOT verify the PGP signature of signed wordlists.
|
||||
|
||||
=== Export options
|
||||
*-f*, *--format*::
|
||||
@@ -323,11 +292,11 @@ The same password generation options as documented for the generate command can
|
||||
Include characters from every selected group.
|
||||
[Default: Disabled]
|
||||
|
||||
include::includes/section-notes.adoc[]
|
||||
include::section-notes.adoc[]
|
||||
|
||||
== AUTHOR
|
||||
This manual page was originally written by Manolis Agkopian <m.agkopian@gmail.com>.
|
||||
|
||||
include::includes/section-reporting-bugs.adoc[]
|
||||
include::section-reporting-bugs.adoc[]
|
||||
|
||||
include::includes/section-copyright.adoc[]
|
||||
include::section-copyright.adoc[]
|
||||
|
||||
@@ -15,9 +15,9 @@
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
= keepassxc(1)
|
||||
KeePassXC Team <team@keepassxc.org>
|
||||
:docdate: 2020-08-31
|
||||
:docdate: 2020-07-10
|
||||
:doctype: manpage
|
||||
:revnumber: 2.6.0
|
||||
:mansource: KeePassXC {revnumber}
|
||||
:manmanual: General Commands Manual
|
||||
|
||||
@@ -55,11 +55,11 @@ Your wallet works offline and requires no Internet connection.
|
||||
*--debug-info*::
|
||||
Displays debugging information.
|
||||
|
||||
include::includes/section-notes.adoc[]
|
||||
include::section-notes.adoc[]
|
||||
|
||||
== AUTHOR
|
||||
This manual page was originally written by Janek Bevendorff <janek@jbev.net>.
|
||||
|
||||
include::includes/section-reporting-bugs.adoc[]
|
||||
include::section-reporting-bugs.adoc[]
|
||||
|
||||
include::includes/section-copyright.adoc[]
|
||||
include::section-copyright.adoc[]
|
||||
|
||||
@@ -16,5 +16,4 @@
|
||||
== COPYRIGHT
|
||||
Copyright \(C) 2016-2020 KeePassXC Team <team@keepassxc.org>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License, either version 2 or version 3.
|
||||
There is NO WARRANTY, to the extent permitted by law.
|
||||
*KeePassXC* code is licensed under GPL-2 or GPL-3.
|
||||
@@ -1,4 +1,5 @@
|
||||
KeePassXC Team <team@keepassxc.org>
|
||||
v2.6.0
|
||||
:data-uri:
|
||||
:homepage: https://keepassxc.org
|
||||
:stylesheet: ../styles/dark.css
|
||||
|
||||
@@ -31,9 +31,26 @@ To configure Auto-Type sequences for your entries, perform the following steps:
|
||||
.Auto-Type entry sequences
|
||||
image::autotype_entry_sequences.png[]
|
||||
|
||||
2. _(Optional)_ Define a custom Auto-Type sequence for each window title match by selecting the _Use specific sequence for this association_ checkbox. Sequence action codes and field placeholders are detailed in the following table. Beyond the most important ones detailed below, there are additional action codes and placeholders available: xref:UserGuide.adoc#_auto_type_actions[Auto-Type Actions Reference] and xref:UserGuide.adoc#_entry_placeholders[Entry Placeholders Reference]. Action codes and placeholders are not case sensitive.
|
||||
2. _(Optional)_ Define a custom auto-type sequence for each window title match by selecting the _Use specific sequence for this association_ checkbox. Sequence action codes and field placeholders are detailed in the following table. A complete list of supported actions and placeholders can be found at https://keepass.info/help/base/autotype.html#autoseq[KeePass Auto-Type Action Codes] and https://keepass.info/help/base/placeholders.html[KeePass Placeholders]. Action codes and placeholders are not case sensitive.
|
||||
+
|
||||
[grid=rows, frame=none, width=90%]
|
||||
[grid=rows, frame=none, width=70%]
|
||||
|===
|
||||
|Action Code |Description
|
||||
|
||||
|{TAB}, {ENTER}, {SPACE}, {INSERT}, {DELETE}, {HOME}, {END}, {PGUP}, {PGDN}, {BACKSPACE}, {CAPSLOCK}, {ESC}
|
||||
|Press the corresponding keyboard key
|
||||
|
||||
|{UP}, {DOWN}, {LEFT}, {RIGHT} |Press the corresponding arrow key
|
||||
|{F1}, {F2}, ..., {F16} |Press F1, F2, etc.
|
||||
|{LEFTBRACE}, {RIGHTBRACE} |Press `{` or `}`, respectively
|
||||
|{DELAY=X} |Set key press delay to X milliseconds
|
||||
|{DELAY X} |Delay typing start by X milliseconds
|
||||
|{CLEARFIELD} |Clear the input field before typing
|
||||
|{TOTP} |Insert calculated TOTP value (if configured)
|
||||
|{<ACTION> X} |Repeat <ACTION> X times (e.g., {SPACE 5} inserts five spaces)
|
||||
|===
|
||||
+
|
||||
[grid=rows, frame=none, width=70%]
|
||||
|===
|
||||
|Placeholder |Description
|
||||
|
||||
@@ -43,44 +60,21 @@ image::autotype_entry_sequences.png[]
|
||||
|{URL} |URL
|
||||
|{NOTES} |Notes
|
||||
|{TOTP} |Current TOTP value (if configured)
|
||||
|{DT_SIMPLE} |Current date-time
|
||||
|{DB_DIR} |Absolute directory path for database file
|
||||
|{S:<ATTRIBUTE_NAME>} |Value for the given attribute name
|
||||
|===
|
||||
+
|
||||
[grid=rows, frame=none, width=90%]
|
||||
|===
|
||||
|Action Code |Description
|
||||
|
||||
|{TAB}, {ENTER}, {SPACE}, {INSERT}, {DELETE}, {HOME}, {END}, {PGUP}, {PGDN}, {BACKSPACE}, {CAPSLOCK}, {ESC}
|
||||
|Press the corresponding keyboard key
|
||||
|
||||
|{UP}, {DOWN}, {LEFT}, {RIGHT} |Press the corresponding arrow key
|
||||
|{LEFTBRACE}, {RIGHTBRACE} |Press `{` or `}`, respectively
|
||||
|{<KEY> X} |Repeat <KEY> X times (e.g., {SPACE 5} inserts five spaces)
|
||||
|{DELAY=X} |Set delay between key presses to X milliseconds
|
||||
|{DELAY X} |Pause typing for X milliseconds
|
||||
|{CLEARFIELD} |Clear the input field
|
||||
|{PICKCHARS} |Pick specific password characters from a dialog
|
||||
|{REF:<FIELD>@<SEARCH_IN>:<SEARCH_TEXT>} |Search for a field in another entry using the reference syntax.
|
||||
|===
|
||||
|
||||
=== Performing Global Auto-Type
|
||||
The global Auto-Type keyboard shortcut is used when you have focus on the window you want to type into. To make use of this feature, you must have previously configured an Auto-Type hotkey.
|
||||
|
||||
When you press the global Auto-Type hotkey, KeePassXC searches all unlocked databases for entries that match the focused window title. The Auto-Type selection dialog will appear in the following circumstances: there are no matches found, there are multiple matches found, or the setting "Always ask before performing Auto-Type" is enabled. The selection is remembered for a short while to help retype with the same entry in quick succession.
|
||||
Pressing the global Auto-Type hotkey cause KeePassXC to search the database for entries that match the window title. Multiple matches may be returned and will cause the sequence selection dialog to appear. Click on a sequence line will immediately execute the Auto-Type action. A search box is also available in case numerous matches are returned.
|
||||
|
||||
.Auto-Type sequence selection
|
||||
image::autotype_selection_dialog.png[,70%]
|
||||
|
||||
Perform the selected Auto-Type sequence by double clicking the desired row or pressing _Enter_. Press the up and down arrows to navigate the list. Sequences can be filtered through the text edit field.
|
||||
|
||||
.Auto-Type search database
|
||||
image::autotype_selection_dialog_search.png[,70%]
|
||||
|
||||
Search the unlocked databases by activating Search Database radio button. Use the text edit field to issue search queries using the same syntax as database searching.
|
||||
|
||||
.Additional Auto-Type choices
|
||||
image::autotype_selection_dialog_type_menu.png[,70%]
|
||||
|
||||
The option to type just the username, password, or current TOTP value is available by right clicking the desired row or expanding the Type Sequence button options.
|
||||
TIP: The _Sequence_ column will only appear when there are different sequences defined by one or more entries displayed in the selection dialog.
|
||||
|
||||
=== Performing Entry-Level Auto-Type
|
||||
You can quickly activate the default Auto-Type sequence for a particular entry using Entry-Level Auto-Type. For this operation, the KeePassXC window will be minimized and the Auto-Type sequence occurs in the previously selected window. You can perform Entry-Level Auto-Type from the toolbar icon *(A)*, entry context menu *(B)*, or by pressing `Ctrl+Shift+V`.
|
||||
@@ -89,4 +83,4 @@ WARNING: Be careful when using Entry-Level Auto-Type as you can inadvertently ty
|
||||
|
||||
.Entry-Level Auto-Type
|
||||
image::autotype_entrylevel.png[]
|
||||
// end::content[]
|
||||
// end::content[]
|
||||
@@ -48,7 +48,7 @@ image::browser_settings.png[]
|
||||
.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.
|
||||
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.
|
||||
+
|
||||
@@ -62,7 +62,7 @@ The KeePassXC-Browser extension lets you automatically populate the entries from
|
||||
|
||||
1. Open your KeePassXC desktop application and unlock your database.
|
||||
|
||||
2. Open your web browser. The KeePassXC-Browser extension icon in your browser window will change based on its connection state. The figure below shows the different states.
|
||||
2. Open your web browser. The KeePassXC-Browser extension icon in your browser window will change based on its connection state. The figure below shows the different states.
|
||||
+
|
||||
*(A)* KeePassXC is not running or is disconnected +
|
||||
*(B)* Connected to KeePassXC, but database is locked +
|
||||
@@ -81,7 +81,7 @@ image::browser_extension_reload.png[,80%]
|
||||
.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)*.
|
||||
5. Ensure the credentials you want 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.
|
||||
+
|
||||
|
||||
@@ -120,7 +120,18 @@ image::clone_entry_dialog.png[,70%]
|
||||
.References in a cloned entry
|
||||
image::clone_entry_references.png[]
|
||||
|
||||
4. You can create your own references using the xref:UserGuide.adoc#_entry_cross_reference[Entry Reference Syntax]
|
||||
4. You can create your own references using the following syntax:
|
||||
+
|
||||
`{REF:<ShortCode>@I:<UUID>}`
|
||||
+
|
||||
Where `<UUID>` is the Unique Identifier of the entry to pull data from and `<ShortCode>` is from the following:
|
||||
+
|
||||
* T - Title
|
||||
* U - Username
|
||||
* P - Password
|
||||
* A - URL
|
||||
* N - Notes
|
||||
* I - UUID
|
||||
|
||||
== Searching the Database
|
||||
KeePassXC provides an enhanced and granular search features the enables you to search for specific entries in the databases using the different modifiers, wild card characters, and logical operators.
|
||||
@@ -171,14 +182,11 @@ The following tables lists a few samples search queries for your reference:
|
||||
|
||||
|`+user:johnsmith -url:www.google.com *notes:"secret note \d"`
|
||||
|Search the username field for exactly johnsmith, the URL must not contain www.google.com, and notes contains secret note [digit].
|
||||
|
||||
|`+attr:mystring123`
|
||||
|Searches all Additional Attributes for any name OR value equal to mystring123.
|
||||
|===
|
||||
|
||||
== Advanced Entry Options
|
||||
=== Additional Attributes
|
||||
A lot of applications and web sites now require to provide additional information when you create accounts. The additional information is used to block hackers if any suspicious activity is detected. In addition, the additional information you provide can be used to reset passwords if you forget them. You can also store arbitrary information here that can be copied to the clipboard or Auto-Typed using the `{S:<ATTR_NAME>}` action code.
|
||||
A lot of applications and web sites now require to provide additional information when you create accounts. The additional information is used to block hackers if any suspicious activity is detected. In addition, the additional information you provide can be used to reset passwords if you forget them. You can also store arbitrary information here that can be copied to the clipboard or Auto-Typed using the `{S:<ATTR_NAME}` action code.
|
||||
|
||||
To protect an attribute from being displayed by default, activate the _Protect_ checkbox *(A)*. To show the contents of the attribute while keeping it protected, press the _Reveal_ button *(B)*.
|
||||
|
||||
@@ -231,7 +239,7 @@ NOTE: Restoring an old history item will store the current entry settings as a n
|
||||
== Automatic Database Opening
|
||||
You can setup one or more databases to open automatically when you unlock a single database. This is done by *(1)* defining a special group named `AutoOpen` with *(2)* entries that contain the file path and credentials for each database that should be opened. There is no limit to the number of databases that can be opened.
|
||||
|
||||
TIP: Case matters with auto open, the group name must be exactly `AutoOpen` and it must be a child of the root group.
|
||||
TIP: Case matters with auto open, the group name must be exactly `AutoOpen`.
|
||||
|
||||
.AutoOpen Group and Entries
|
||||
image::autoopen.png[]
|
||||
@@ -279,7 +287,7 @@ image::database_security.png[]
|
||||
+
|
||||
.Database credentials
|
||||
image::database_security_credentials.png[]
|
||||
+
|
||||
|
||||
WARNING: Consider creating a backup of your YubiKey. Please refer to <<Creating a YubiKey backup>>
|
||||
|
||||
5. Encryption settings allows you to change the average time it takes to encrypt and decrypt the database. The longer time that is chosen, the harder it will be to brute force attack your database. *We recommend a setting of one second.*
|
||||
|
||||
@@ -60,5 +60,3 @@ To install the KeePassXC app on macOS, double click on the downloaded DMG file a
|
||||
image::macos_install.png[,80%]
|
||||
|
||||
// end::content[]
|
||||
// tag::advanced[]
|
||||
// end::advanced[]
|
||||
@@ -61,11 +61,4 @@ WARNING: Exporting your database will result in all of your passwords and sensit
|
||||
|
||||
.Database export menu
|
||||
image::export_database.png[,80%]
|
||||
|
||||
The HTML export file is intended to be human-readable (viewed/printed in a web browser) rather than machine-readable (re-imported into another database file). The intention of HTML export is to provide a "paper backup" functionality for those who want to ensure access to their passwords in case of catastrophic failure of IT infrastructure. To create a paper backup, export the database to an HTML file, print the file with your web browser, then delete the file.
|
||||
|
||||
WARNING: Creating a paper backup exposes your passwords to potentially insecure components, like printer drivers on your computer or software inside the printer. Make sure all these components can be trusted.
|
||||
|
||||
For more information, check out the https://keepassxc.org/blog/2020-10-03-paper-backup/[blog article about paper backups].
|
||||
|
||||
// end::content[]
|
||||
|
||||
@@ -22,11 +22,10 @@ image::password_generator.png[]
|
||||
5. Use the regenerate button (Ctrl + R) to make a new password using the chosen options.
|
||||
6. Use the clipboard button (Ctrl + C) to copy the generated password to the clipboard.
|
||||
// tag::advanced[]
|
||||
7. Click the Advanced button to specify additional conditions for your desired password.
|
||||
7. Click the Advanced button to specify additional conditions for your desired password.
|
||||
+
|
||||
.Advanced Password Generator Options
|
||||
image::password_generator_advanced.png[]
|
||||
8. When generating a password for an entry, click the Apply Password button (Ctrl + S or Ctrl + Enter) to close the window and apply your changes.
|
||||
|
||||
=== Generating Passphrases
|
||||
A passphrase is a sequence of words or other text used to control access to your applications and data. A passphrase is similar to a password in usage, but is generally longer for added security. To generate the random passphrase using Password Generator, perform the following steps:
|
||||
@@ -41,6 +40,5 @@ Word Count slider.
|
||||
3. In the Word Separator field, enter a character, word, number, or space that you want to use a separator between the words in your passphrase.
|
||||
4. Click the Regenerate button (Ctrl + R) to generate a new random passphrase.
|
||||
5. Click the Clipboard button (Ctrl + C) to copy the passphrase to the clipboard.
|
||||
6. When generating a password for an entry, click the Apply Password button (Ctrl + S or Ctrl + Enter) to close the window and apply your changes.
|
||||
// end::advanced[]
|
||||
// end::content[]
|
||||
|
||||
@@ -1,94 +0,0 @@
|
||||
= KeePassXC - Reference
|
||||
include::.sharedheader[]
|
||||
:imagesdir: ../images
|
||||
|
||||
// tag::content[]
|
||||
== Reference
|
||||
This section contains full details on advanced features available in KeePassXC.
|
||||
|
||||
=== Entry Placeholders
|
||||
[grid=rows, frame=none, width=90%]
|
||||
|===
|
||||
|Placeholder |Description
|
||||
|
||||
|{TITLE} |Entry Title
|
||||
|{USERNAME} |Username
|
||||
|{PASSWORD} |Password
|
||||
|{URL} |URL
|
||||
|{NOTES} |Notes
|
||||
|{TOTP} |Current TOTP value (if configured)
|
||||
|{S:<ATTRIBUTE_NAME>} |Value for the given attribute (case sensitive)
|
||||
|{URL:RMVSCM} |URL without scheme (e.g., https)
|
||||
|{URL:WITHOUTSCHEME} |URL without scheme
|
||||
|{URL:SCM} |URL Scheme
|
||||
|{URL:SCHEME} |URL Scheme
|
||||
|{URL:HOST} |URL Host (e.g., example.com)
|
||||
|{URL:PORT} |URL Port
|
||||
|{URL:PATH} |URL Path (e.g., /path/to/page.html)
|
||||
|{URL:QUERY} |URL Query String
|
||||
|{URL:FRAGMENT} |URL Fragment
|
||||
|{URL:USERINFO} |URL Username:Password
|
||||
|{URL:USERNAME} |URL Username
|
||||
|{URL:PASSWORD} |URL Password
|
||||
|{DT_SIMPLE} |Current Date-Time (yyyyMMddhhmmss)
|
||||
|{DT_YEAR} |Current Year (yyyy)
|
||||
|{DT_MONTH} |Current Month (MM)
|
||||
|{DT_DAY} |Current Day (dd)
|
||||
|{DT_HOUR} |Current Hour (hh)
|
||||
|{DT_MINUTE} |Current Minutes (mm)
|
||||
|{DT_SECOND} |Current Seconds (ss)
|
||||
|{DT_UTC_SIMPLE} |Current UTC Date-Time (yyyyMMddhhmmss)
|
||||
|{DT_UTC_YEAR} |Current UTC Year (yyyy)
|
||||
|{DT_UTC_MONTH} |Current UTC Month (MM)
|
||||
|{DT_UTC_DAY} |Current UTC Day (dd)
|
||||
|{DT_UTC_HOUR} |Current UTC Hour (hh)
|
||||
|{DT_UTC_MINUTE} |Current UTC Minutes (mm)
|
||||
|{DT_UTC_SECOND} |Current UTC Seconds (ss)
|
||||
|{DB_DIR} |Absolute directory path of database file
|
||||
|===
|
||||
|
||||
=== Entry Cross-Reference
|
||||
A reference to another entry's field is possible using the short-hand syntax:
|
||||
`{REF:<FIELD>@<SEARCH_IN>:<SEARCH_TEXT>}`
|
||||
|
||||
`<FIELD>` and `<SEARCH_IN>` can be one of following:
|
||||
|
||||
* T - Title
|
||||
* U - Username
|
||||
* P - Password
|
||||
* A - URL
|
||||
* N - Notes
|
||||
* I - UUID (found on entry properties page)
|
||||
* O - Custom Attribute _(SEARCH_IN only)_
|
||||
|
||||
Examples: +
|
||||
`{REF:U@I:033054D445C648C59092CC1D661B1B71}` +
|
||||
`{REF:P@T:Other Entry}` +
|
||||
`{REF:A@O:Attribute 1}`
|
||||
|
||||
=== Auto-Type Actions
|
||||
[grid=rows, frame=none, width=90%]
|
||||
|===
|
||||
|Action Code |Description
|
||||
|
||||
|{TAB}, {ENTER}, {SPACE}, {INSERT}, {DELETE}, {HOME}, {END}, {PGUP}, {PGDN}, {BACKSPACE}, {CAPSLOCK}, {ESC}
|
||||
|Press the corresponding keyboard key
|
||||
|
||||
|{UP}, {DOWN}, {LEFT}, {RIGHT} |Press the corresponding arrow key
|
||||
|{F1}, {F2}, ..., {F16} |Press F1, F2, etc.
|
||||
|{LEFTBRACE}, {RIGHTBRACE} |Press `{` or `}`, respectively
|
||||
|{<KEY> X} |Repeat <KEY> X times (e.g., {SPACE 5} inserts five spaces)
|
||||
|{DELAY=X} |Set delay between key presses to X milliseconds
|
||||
|{DELAY X} |Pause typing for X milliseconds
|
||||
|{CLEARFIELD} |Clear the input field
|
||||
|{PICKCHARS} |Pick specific password characters from a dialog
|
||||
|===
|
||||
|
||||
*Text Conversions:*
|
||||
|
||||
*{T-CONV:/<PLACEHOLDER>/<METHOD>/}* +
|
||||
Convert resolved placeholder (e.g., {USERNAME}, {PASSWORD}, etc.) using the following methods: UPPER, LOWER, BASE64, HEX, URI, URI-DEC.
|
||||
|
||||
*{T-REPLACE-RX:/<PLACEHOLDER>/<SEARCH>/<REPLACE>/}* +
|
||||
Use regular expressions to find and replace data from a resolved placeholder. Refer to match groups using $1, $2, etc.
|
||||
// end::content[]
|
||||
@@ -4,7 +4,7 @@ include::.sharedheader[]
|
||||
|
||||
// tag::content[]
|
||||
== SSH Agent
|
||||
SSH (Secure Shell) is a widely used remote secure shell protocol and is considered an industry standard for secure remote access to UNIX-like systems including Linux, BSDs, macOS and more recently even Windows received native support. SSH supports multiple types of authentication and the most widely used ones are either interactive keyboard input with a password or a public-key cryptography pair of keys.
|
||||
SSH (Secure Shell) is a widely used remote secure shell protocol and is considered an industry standard for secure remote access to UNIX-like systems including Linux, BSDs, MacOS and more recently even Windows received native support. SSH supports multiple types of authentication and the most widely used ones are either interactive keyboard input with a password or a public-key cryptography pair of keys.
|
||||
|
||||
KeePassXC SSH Agent integration is built to manage SSH keys in a secure manner by either storing them completely within your KeePassXC database or by having only the decryption key of a key file that is stored elsewhere. SSH Agent integration _does not_ provide an agent itself but works as a client for any agent implementation that is OpenSSH compatible.
|
||||
|
||||
@@ -32,35 +32,18 @@ WARNING: _GNOME Keyring_ prior to release 3.27.92 had its own custom implementat
|
||||
It does not support any constraints you may want to configure for an added key.
|
||||
If you are running a modern distribution the custom agent has been removed and replaced with the stock OpenSSH agent which is feature complete.
|
||||
|
||||
=== OpenSSH agent on macOS
|
||||
Apple has made OpenSSH an integrated part of macOS with automatic agent startup when it is first used. No further configuration is needed.
|
||||
=== OpenSSH agent on MacOS
|
||||
Apple has made OpenSSH an integrated part of MacOS with automatic agent startup when it is first used. No further configuration is needed.
|
||||
|
||||
=== OpenSSH agent and Pageant on Windows
|
||||
=== Pageant agent on Windows
|
||||
The SSH Agent integration on Windows supports both _PuTTY Pageant_ and _OpenSSH for Windows 10_.
|
||||
Since Pageant is currently still the most widely used implementation and is easily installable on any version of Windows, it is the default on KeePassXC.
|
||||
However, Microsoft includes a native OpenSSH client implementation with Windows 10 since autumn 2018 that can be used instead. If you would like to self-manage your OpenSSH version you can use the builds offered via their official https://github.com/powershell/Win32-OpenSSH[GitHub repository].
|
||||
Since Pageant is currently still the most widely used implementation and is easily installable on any version of Windows we focus on that.
|
||||
It is also the default on KeePassXC.
|
||||
|
||||
==== Pageant
|
||||
Download Pageant from the official PuTTY home page at https://www.chiark.greenend.org.uk/~sgtatham/putty/
|
||||
|
||||
To use Pageant with KeePassXC, simply start it and it will minimize into the system tray and is ready to use. PuTTY and compatible tools will use Pageant automatically.
|
||||
|
||||
==== OpenSSH
|
||||
Make sure your Windows version has at least update 1809 installed. For more details consult the https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_overview[official documentation].
|
||||
|
||||
To use Windows OpenSSH the _OpenSSH Authentication Agent_ service has to be enabled first:
|
||||
|
||||
1. Open the Services application via the _Start Menu_, it is located in the _Windows Administrative Tools_ section
|
||||
2. Select the _OpenSSH Authentication Agent_ and open its _Properties_
|
||||
3. Set the _Startup type_ to _Automatic_ and start the service
|
||||
|
||||
Alternatively, you can use a _Windows PowerShell_ running as _Administrator_ to enable and start the service:
|
||||
|
||||
PS C:\Users\user> Get-Service ssh-agent | Set-Service -StartupType Automatic
|
||||
PS C:\Users\user> Start-Service ssh-agent
|
||||
|
||||
KeePassXC and other compatible tools can now use the Windows OpenSSH agent. To use it with KeePassXC, update the settings explained in <<Setting up SSH Agent integration>>.
|
||||
|
||||
=== Setting up SSH Agent integration
|
||||
By default the SSH Agent integration plugin is disabled.
|
||||
To enable integration, follow the steps below to access the settings:
|
||||
@@ -81,13 +64,14 @@ If the value of _SSH_AUTH_SOCK_ is empty it means the agent is not properly conf
|
||||
=== Generating a key to use with KeePassXC
|
||||
KeePassXC only supports keys in the _OpenSSH_ format. On Windows, _PuTTYgen_ saves keys in its own format by default and you will need to convert them to OpenSSH format before being used. In this guide we are going to generate a standard RSA key in the default size.
|
||||
|
||||
==== Generating a key on Linux or macOS with _ssh-keygen_
|
||||
==== Generating a key on Linux or MacOS with _ssh-keygen_
|
||||
|
||||
Open a terminal window and type the following command to generate a key:
|
||||
|
||||
$ ssh-keygen -o -f keepassxc -C johndoe@example
|
||||
Generating public/private rsa key pair.
|
||||
Enter passphrase (empty for no passphrase):
|
||||
Enter same passphrase again:
|
||||
Enter passphrase (empty for no passphrase):
|
||||
Enter same passphrase again:
|
||||
Your identification has been saved in keepassxc
|
||||
Your public key has been saved in keepassxc.pub
|
||||
The key fingerprint is:
|
||||
@@ -105,6 +89,7 @@ Open a terminal window and type the following command to generate a key:
|
||||
|. ..++ooo |
|
||||
+----[SHA256]-----+
|
||||
|
||||
|
||||
Now we can see two files were generated:
|
||||
|
||||
$ ls -l keepassxc*
|
||||
@@ -113,59 +98,19 @@ Now we can see two files were generated:
|
||||
|
||||
With KeePassXC you only need the first file listed.
|
||||
|
||||
==== Generating a key on Windows
|
||||
On Windows you can generate key pairs with _PuTTYgen_ and with _ssh-keygen_, depending on whether you installed PuTTY and your Windows version.
|
||||
==== Generating a key on Windows with PuTTYgen
|
||||
Please read the manual on how to use PuTTYgen for details on generate a key: https://the.earth.li/~sgtatham/putty/0.74/htmldoc/Chapter8.html#pubkey-puttygen. Once generated, you must save the key in the new OpenSSH format, see image below.
|
||||
|
||||
===== Using _PuTTYgen_
|
||||
Please read the manual on how to use _PuTTYgen_ for details on generate a key: https://the.earth.li/~sgtatham/putty/0.74/htmldoc/Chapter8.html#pubkey-puttygen. Once generated, you must save the key in the new OpenSSH format, see image below.
|
||||
|
||||
.Generating a key with _PuTTYgen_
|
||||
.Generating a key with PuTTYgen
|
||||
image::sshagent_puttygen.png[,70%]
|
||||
|
||||
===== Using _ssh-keygen_
|
||||
Open _Command Prompt_ or _Windows PowerShell_ and type the following command to generate a key:
|
||||
|
||||
PS C:\Users\user> ssh-keygen.exe -o -f keepassxc -C johndoe@example
|
||||
Generating public/private rsa key pair.
|
||||
Enter passphrase (empty for no passphrase):
|
||||
Enter same passphrase again:
|
||||
Your identification has been saved in keepassxc
|
||||
Your public key has been saved in keepassxc.pub
|
||||
The key fingerprint is:
|
||||
SHA256:pN+o5AqUmijYBDUrFV/caMus9oIR61+MiWLa8fcsVYI johndoe@example
|
||||
The key's randomart image is:
|
||||
+---[RSA 3072]----+
|
||||
| =. ..o |
|
||||
| o + .+ . |
|
||||
|o . .+ o. |
|
||||
| o.. Eo. . |
|
||||
| +o .. So |
|
||||
|o*o.o+ ..o |
|
||||
|Bo=+o.+.o . |
|
||||
|+oo+.++o |
|
||||
|. ..++ooo |
|
||||
+----[SHA256]-----+
|
||||
|
||||
Now we can see two files were generated:
|
||||
|
||||
PS C:\Users\user> dir keepassxc*
|
||||
|
||||
Directory C:\Users\user
|
||||
|
||||
Mode LastWriteTime Length Name
|
||||
---- ------------- ------ ----
|
||||
-a---- 9/19/2021 12:08 PM 2655 keepassxc
|
||||
-a---- 9/19/2021 12:08 PM 570 keepassxc.pub
|
||||
|
||||
With KeePassXC you only need the first file listed.
|
||||
|
||||
=== Configuring an entry to use SSH Agent
|
||||
The last step is to setup an entry to contain the SSH Agent settings and key file you generated.
|
||||
|
||||
1. Create a new entry, or open an existing entry in edit mode.
|
||||
2. Set the password you used for the key file in the password field.
|
||||
3. Go to the advanced category and attach the key file you generated previously.
|
||||
4. Go to the SSH Agent category *(1)* and select the attachment from the list *(2)*.
|
||||
4. Go to the SSH Agent category *(1)* and select the attachment from the list *(2)*.
|
||||
5. Alternatively, you can load an external file dynamically using the file selection.
|
||||
6. Choose the options for this key.
|
||||
7. Press *OK* to accept the entry. Depending on the options you chose, KeePassXC will load the key and present it for use.
|
||||
|
||||
@@ -10,7 +10,7 @@ The KeePassXC interface is designed for simplicity and easy access to your infor
|
||||
.Main database interface
|
||||
image::main_interface.png[]
|
||||
|
||||
*(A) Groups* - Organize your entries into discrete groups to bring order to all of your sensitive information. Groups can be nested under each other to create a hierarchy. Settings from parent groups get applied to their children. You can hide this panel on the View menu.
|
||||
*(A) Groups* - Organize your entries into discrete groups to bring order to all of your sensitive information. Groups can be nested under each other to create a hierarchy. Settings from parent groups get applied to their children.
|
||||
|
||||
*(B) Entries* - Entries contain all the information for each website or application you are storing in KeePassXC. This view shows all the entries in the selected group. Each column can be resized, reordered, and shown or hidden based on your preference. Right click the header row to see all available options.
|
||||
|
||||
@@ -46,14 +46,6 @@ For users with smaller screens or those who desire seeing more entries at once,
|
||||
.Compact mode comparison
|
||||
image::compact_mode_comparison.png[]
|
||||
|
||||
==== Copy entry Columns on Double Click
|
||||
KeePassXC offers the possibility of copying certain entry columns, such as username and password, into your clipboard on double click, for a limited period of time.
|
||||
|
||||
This feature can be enabled by checking the box "Enable double click to copy some entry columns" in the security settings:
|
||||
|
||||
.Enable copying on double click
|
||||
image::enable_copy_dc.png[]
|
||||
|
||||
=== Keyboard Shortcuts
|
||||
include::KeyboardShortcuts.adoc[tag=content, leveloffset=+1]
|
||||
|
||||
|
||||
@@ -44,5 +44,3 @@ KeePassXC has numerous features for novice and power users alike. This guide wil
|
||||
** FreeDesktop.org Secret Service (replace Gnome keyring, etc.)
|
||||
** Additional encryption choices: Twofish and ChaCha20
|
||||
// end::content[]
|
||||
// tag::advanced[]
|
||||
// end::advanced[]
|
||||
525
release-tool
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# KeePassXC Release Preparation Helper
|
||||
# Copyright (C) 2021 KeePassXC team <https://keepassxc.org/>
|
||||
# Copyright (C) 2017 KeePassXC team <https://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
|
||||
@@ -17,9 +17,8 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
printf "\e[1m\e[32mKeePassXC\e[0m Release Preparation Helper\n"
|
||||
printf "Copyright (C) 2021 KeePassXC Team <https://keepassxc.org/>\n\n"
|
||||
printf "Copyright (C) 2017 KeePassXC Team <https://keepassxc.org/>\n\n"
|
||||
|
||||
set -eE -o pipefail
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
# global default values
|
||||
@@ -35,16 +34,15 @@ TARGET_BRANCH="master"
|
||||
TAG_NAME=""
|
||||
DOCKER_IMAGE=""
|
||||
DOCKER_CONTAINER_NAME="keepassxc-build-container"
|
||||
CMAKE_GENERATOR="Ninja"
|
||||
CMAKE_OPTIONS=""
|
||||
CPACK_GENERATORS="WIX;ZIP"
|
||||
COMPILER="g++"
|
||||
MAKE_OPTIONS="-j$(getconf _NPROCESSORS_ONLN)"
|
||||
MAKE_OPTIONS="-j8"
|
||||
BUILD_PLUGINS="all"
|
||||
INSTALL_PREFIX="/usr/local"
|
||||
ORIG_BRANCH=""
|
||||
ORIG_CWD="$(pwd)"
|
||||
MACOSX_DEPLOYMENT_TARGET=10.13
|
||||
MACOSX_DEPLOYMENT_TARGET=10.12
|
||||
GREP="grep"
|
||||
TIMESTAMP_SERVER="http://timestamp.sectigo.com"
|
||||
|
||||
@@ -53,17 +51,17 @@ TIMESTAMP_SERVER="http://timestamp.sectigo.com"
|
||||
# -----------------------------------------------------------------------
|
||||
printUsage() {
|
||||
local cmd
|
||||
if [ -z "$1" ] || [ "help" == "$1" ]; then
|
||||
if [ "" == "$1" ] || [ "help" == "$1" ]; then
|
||||
cmd="COMMAND"
|
||||
elif [ "check" == "$1" ] || [ "merge" == "$1" ] || [ "build" == "$1" ] || [ "gpgsign" == "$1" ] || \
|
||||
[ "appsign" == "$1" ] || [ "notarize" == "$1" ] || [ "appimage" == "$1" ] || [ "i18n" == "$1" ]; then
|
||||
elif [ "check" == "$1" ] || [ "merge" == "$1" ] || [ "build" == "$1" ] \
|
||||
|| [ "gpgsign" == "$1" ] || [ "appsign" == "$1" ] || [ "appimage" == "$1" ]; then
|
||||
cmd="$1"
|
||||
else
|
||||
logError "Unknown command: '$1'\n"
|
||||
cmd="COMMAND"
|
||||
fi
|
||||
|
||||
printf "\e[1mUsage:\e[0m $(basename "$0") $cmd [OPTIONS, ...]\n"
|
||||
printf "\e[1mUsage:\e[0m $(basename $0) $cmd [options]\n"
|
||||
|
||||
if [ "COMMAND" == "$cmd" ]; then
|
||||
cat << EOF
|
||||
@@ -74,9 +72,7 @@ Commands:
|
||||
build Build and package binary release from sources
|
||||
gpgsign Sign previously compiled release packages with GPG
|
||||
appsign Sign binaries with code signing certificates on Windows and macOS
|
||||
notarize Submit macOS application DMG for notarization
|
||||
help Show help for the given command
|
||||
i18n Update translation files and pull from or push to Transifex
|
||||
EOF
|
||||
elif [ "merge" == "$cmd" ]; then
|
||||
cat << EOF
|
||||
@@ -119,9 +115,7 @@ Options:
|
||||
If this option is set, --install-prefix has no effect
|
||||
--appsign Perform platform specific App Signing before packaging
|
||||
--timestamp Explicitly set the timestamp server to use for appsign (default: '${TIMESTAMP_SERVER}')
|
||||
--vcpkg Specify VCPKG toolchain file (example: ~/vcpkg/scripts/buildsystems/vcpkg.cmake)
|
||||
-k, --key Specify the App Signing Key/Identity
|
||||
--cmake-generator Override the default CMake generator (Default: Ninja)
|
||||
-c, --cmake-options Additional CMake options for compiling the sources
|
||||
--compiler Compiler to use (default: '${COMPILER}')
|
||||
-m, --make-options Make options for compiling sources (default: '${MAKE_OPTIONS}')
|
||||
@@ -154,16 +148,6 @@ Options:
|
||||
Signing Key or Apple Developer ID (required)
|
||||
--timestamp Explicitly set the timestamp server to use for appsign (default: '${TIMESTAMP_SERVER}')
|
||||
-u, --username Apple username for notarization (required on macOS)
|
||||
-h, --help Show this help
|
||||
EOF
|
||||
elif [ "notarize" == "$cmd" ]; then
|
||||
cat << EOF
|
||||
|
||||
Submit macOS application DMG for notarization
|
||||
|
||||
Options:
|
||||
-f, --files Files to notarize (required)
|
||||
-u, --username Apple username for notarization (required)
|
||||
-c, --keychain Apple keychain entry name storing the notarization
|
||||
app password (default: 'AC_PASSWORD')
|
||||
-h, --help Show this help
|
||||
@@ -186,16 +170,6 @@ Options:
|
||||
-k, --key The PGP Signing Key
|
||||
--verbosity linuxdeploy verbosity (default: 3)
|
||||
-h, --help Show this help
|
||||
EOF
|
||||
elif [ "i18n" == "$cmd" ]; then
|
||||
cat << EOF
|
||||
|
||||
Update translation files and pull from or push to Transifex
|
||||
|
||||
Subcommands:
|
||||
tx-push Push source translation file to Transifex
|
||||
tx-pull Pull updated translations from Transifex
|
||||
lupdate Update source translation file from C++ sources
|
||||
EOF
|
||||
fi
|
||||
}
|
||||
@@ -213,17 +187,17 @@ logError() {
|
||||
}
|
||||
|
||||
init() {
|
||||
if [ -z "$RELEASE_NAME" ]; then
|
||||
if [ "" == "$RELEASE_NAME" ]; then
|
||||
logError "Missing arguments, --version is required!\n"
|
||||
printUsage "check"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$TAG_NAME" ]; then
|
||||
if [ "" == "$TAG_NAME" ]; then
|
||||
TAG_NAME="$RELEASE_NAME"
|
||||
fi
|
||||
|
||||
if [ -z "$SOURCE_BRANCH" ]; then
|
||||
if [ "" == "$SOURCE_BRANCH" ]; then
|
||||
SOURCE_BRANCH="release/${RELEASE_NAME}"
|
||||
fi
|
||||
|
||||
@@ -286,25 +260,29 @@ checkGitRepository() {
|
||||
}
|
||||
|
||||
checkReleaseDoesNotExist() {
|
||||
if ! git tag | $GREP -q "^$TAG_NAME$"; then
|
||||
git tag | $GREP -q "^$TAG_NAME$"
|
||||
if [ $? -eq 0 ]; then
|
||||
exitError "Release '$RELEASE_NAME' (tag: '$TAG_NAME') already exists!"
|
||||
fi
|
||||
}
|
||||
|
||||
checkWorkingTreeClean() {
|
||||
if ! git diff-index --quiet HEAD --; then
|
||||
git diff-index --quiet HEAD --
|
||||
if [ $? -ne 0 ]; then
|
||||
exitError "Current working tree is not clean! Please commit or unstage any changes."
|
||||
fi
|
||||
}
|
||||
|
||||
checkSourceBranchExists() {
|
||||
if ! git rev-parse "$SOURCE_BRANCH" > /dev/null 2>&1; then
|
||||
git rev-parse "$SOURCE_BRANCH" > /dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
exitError "Source branch '$SOURCE_BRANCH' does not exist!"
|
||||
fi
|
||||
}
|
||||
|
||||
checkTargetBranchExists() {
|
||||
if ! git rev-parse "$TARGET_BRANCH" > /dev/null 2>&1; then
|
||||
git rev-parse "$TARGET_BRANCH" > /dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
exitError "Target branch '$TARGET_BRANCH' does not exist!"
|
||||
fi
|
||||
}
|
||||
@@ -315,15 +293,18 @@ checkVersionInCMake() {
|
||||
local minor_num="$(echo ${RELEASE_NAME} | cut -f2 -d.)"
|
||||
local patch_num="$(echo ${RELEASE_NAME} | cut -f3 -d. | cut -f1 -d-)"
|
||||
|
||||
if ! $GREP -q "${app_name_upper}_VERSION_MAJOR \"${major_num}\"" CMakeLists.txt; then
|
||||
$GREP -q "${app_name_upper}_VERSION_MAJOR \"${major_num}\"" CMakeLists.txt
|
||||
if [ $? -ne 0 ]; then
|
||||
exitError "${app_name_upper}_VERSION_MAJOR not updated to '${major_num}' in CMakeLists.txt!"
|
||||
fi
|
||||
|
||||
if ! $GREP -q "${app_name_upper}_VERSION_MINOR \"${minor_num}\"" CMakeLists.txt; then
|
||||
$GREP -q "${app_name_upper}_VERSION_MINOR \"${minor_num}\"" CMakeLists.txt
|
||||
if [ $? -ne 0 ]; then
|
||||
exitError "${app_name_upper}_VERSION_MINOR not updated to '${minor_num}' in CMakeLists.txt!"
|
||||
fi
|
||||
|
||||
if ! $GREP -q "${app_name_upper}_VERSION_PATCH \"${patch_num}\"" CMakeLists.txt; then
|
||||
$GREP -q "${app_name_upper}_VERSION_PATCH \"${patch_num}\"" CMakeLists.txt
|
||||
if [ $? -ne 0 ]; then
|
||||
exitError "${app_name_upper}_VERSION_PATCH not updated to '${patch_num}' in CMakeLists.txt!"
|
||||
fi
|
||||
}
|
||||
@@ -333,7 +314,8 @@ checkChangeLog() {
|
||||
exitError "No CHANGELOG file found!"
|
||||
fi
|
||||
|
||||
if ! $GREP -qPzo "## ${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n" CHANGELOG.md; then
|
||||
$GREP -qPzo "## ${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n" CHANGELOG.md
|
||||
if [ $? -ne 0 ]; then
|
||||
exitError "'CHANGELOG.md' has not been updated to the '${RELEASE_NAME}' release!"
|
||||
fi
|
||||
}
|
||||
@@ -343,7 +325,8 @@ checkAppStreamInfo() {
|
||||
exitError "No AppStream info file found!"
|
||||
fi
|
||||
|
||||
if ! $GREP -qPzo "<release version=\"${RELEASE_NAME}\" date=\"\d{4}-\d{2}-\d{2}\">" share/linux/org.keepassxc.KeePassXC.appdata.xml; then
|
||||
$GREP -qPzo "<release version=\"${RELEASE_NAME}\" date=\"\d{4}-\d{2}-\d{2}\">" share/linux/org.keepassxc.KeePassXC.appdata.xml
|
||||
if [ $? -ne 0 ]; then
|
||||
exitError "'share/linux/org.keepassxc.KeePassXC.appdata.xml' has not been updated to the '${RELEASE_NAME}' release!"
|
||||
fi
|
||||
}
|
||||
@@ -354,7 +337,13 @@ checkSnapcraft() {
|
||||
return
|
||||
fi
|
||||
|
||||
if ! $GREP -qPzo "KEEPASSXC_BUILD_TYPE=Release" snap/snapcraft.yaml; then
|
||||
$GREP -qPzo "version: ${RELEASE_NAME}" snap/snapcraft.yaml
|
||||
if [ $? -ne 0 ]; then
|
||||
exitError "'snapcraft.yaml' has not been updated to the '${RELEASE_NAME}' release!"
|
||||
fi
|
||||
|
||||
$GREP -qPzo "KEEPASSXC_BUILD_TYPE=Release" snap/snapcraft.yaml
|
||||
if [ $? -ne 0 ]; then
|
||||
exitError "'snapcraft.yaml' is not set for a release build!"
|
||||
fi
|
||||
}
|
||||
@@ -415,7 +404,7 @@ performChecks() {
|
||||
checkTargetBranchExists
|
||||
|
||||
logInfo "Checking out '${SOURCE_BRANCH}'..."
|
||||
git checkout "$SOURCE_BRANCH" > /dev/null 2>&1
|
||||
git checkout "$SOURCE_BRANCH"
|
||||
|
||||
logInfo "Attempting to find '${RELEASE_NAME}' in various files..."
|
||||
|
||||
@@ -450,7 +439,7 @@ if ! cmdExists realpath; then
|
||||
fi
|
||||
|
||||
|
||||
trap exitTrap SIGINT SIGTERM ERR
|
||||
trap exitTrap SIGINT SIGTERM
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
# check command
|
||||
@@ -530,17 +519,17 @@ merge() {
|
||||
|
||||
performChecks
|
||||
|
||||
# Update translations
|
||||
i18n lupdate
|
||||
i18n tx-pull
|
||||
|
||||
logInfo "Updating language files..."
|
||||
./share/translations/update.sh update
|
||||
./share/translations/update.sh pull
|
||||
if [ 0 -ne $? ]; then
|
||||
exitError "Updating translations failed!"
|
||||
fi
|
||||
if ! git diff-index --quiet HEAD --; then
|
||||
git diff-index --quiet HEAD --
|
||||
if [ $? -ne 0 ]; then
|
||||
git add -A ./share/translations/
|
||||
logInfo "Committing changes..."
|
||||
if [ -z "$GPG_GIT_KEY" ]; then
|
||||
if [ "" == "$GPG_GIT_KEY" ]; then
|
||||
git commit -m "Update translations"
|
||||
else
|
||||
git commit -m "Update translations" -S"$GPG_GIT_KEY"
|
||||
@@ -552,14 +541,14 @@ merge() {
|
||||
COMMIT_MSG="Release ${RELEASE_NAME}"
|
||||
|
||||
logInfo "Checking out target branch '${TARGET_BRANCH}'..."
|
||||
git checkout "$TARGET_BRANCH" > /dev/null 2>&1
|
||||
git checkout "$TARGET_BRANCH"
|
||||
|
||||
logInfo "Merging '${SOURCE_BRANCH}' into '${TARGET_BRANCH}'..."
|
||||
|
||||
git merge "$SOURCE_BRANCH" --no-ff -m "$COMMIT_MSG" -m "${CHANGELOG}" "$SOURCE_BRANCH" -S"$GPG_GIT_KEY"
|
||||
|
||||
logInfo "Creating tag '${TAG_NAME}'..."
|
||||
if [ -z "$GPG_GIT_KEY" ]; then
|
||||
if [ "" == "$GPG_GIT_KEY" ]; then
|
||||
git tag -a "$TAG_NAME" -m "$COMMIT_MSG" -m "${CHANGELOG}" -s
|
||||
else
|
||||
git tag -a "$TAG_NAME" -m "$COMMIT_MSG" -m "${CHANGELOG}" -s -u "$GPG_GIT_KEY"
|
||||
@@ -642,7 +631,7 @@ appimage() {
|
||||
appdir="$(realpath "$appdir")"
|
||||
|
||||
local out="${OUTPUT_DIR}"
|
||||
if [ -z "$out" ]; then
|
||||
if [ "" == "$out" ]; then
|
||||
out="."
|
||||
fi
|
||||
mkdir -p "$out"
|
||||
@@ -659,12 +648,12 @@ appimage() {
|
||||
logInfo "Testing for AppImage tools..."
|
||||
local docker_test_cmd
|
||||
if [ "" != "$DOCKER_IMAGE" ]; then
|
||||
docker_test_cmd="docker run -it --user $(id -u):$(id -g) --rm ${DOCKER_IMAGE}"
|
||||
docker_test_cmd="docker run --rm ${DOCKER_IMAGE}"
|
||||
fi
|
||||
|
||||
# Test if linuxdeploy and linuxdeploy-plugin-qt are installed
|
||||
# on the system or inside the Docker container
|
||||
if ! ${docker_test_cmd} which ${linuxdeploy} > /dev/null; then
|
||||
if ! ${docker_test_cmd} which ${linuxdeploy} &> /dev/null; then
|
||||
logInfo "Downloading linuxdeploy..."
|
||||
linuxdeploy="./linuxdeploy"
|
||||
linuxdeploy_cleanup="rm -f ${linuxdeploy}"
|
||||
@@ -673,7 +662,7 @@ appimage() {
|
||||
fi
|
||||
chmod +x "$linuxdeploy"
|
||||
fi
|
||||
if ! ${docker_test_cmd} which ${linuxdeploy_plugin_qt} > /dev/null; then
|
||||
if ! ${docker_test_cmd} which ${linuxdeploy_plugin_qt} &> /dev/null; then
|
||||
logInfo "Downloading linuxdeploy-plugin-qt..."
|
||||
linuxdeploy_plugin_qt="./linuxdeploy-plugin-qt"
|
||||
linuxdeploy_plugin_qt_cleanup="rm -f ${linuxdeploy_plugin_qt}"
|
||||
@@ -695,46 +684,49 @@ appimage() {
|
||||
fi
|
||||
|
||||
# Create custom AppRun wrapper
|
||||
cat << 'EOF' > "${out_real}/KeePassXC-AppRun"
|
||||
cat << EOF > "${out_real}/KeePassXC-AppRun"
|
||||
#!/usr/bin/env bash
|
||||
|
||||
export PATH="$(dirname $0)/usr/bin:${PATH}"
|
||||
export LD_LIBRARY_PATH="$(dirname $0)/usr/lib:${LD_LIBRARY_PATH}"
|
||||
export PATH="\$(dirname \$0)/usr/bin:\${PATH}"
|
||||
export LD_LIBRARY_PATH="\$(dirname \$0)/usr/lib:\${LD_LIBRARY_PATH}"
|
||||
|
||||
if [ "$1" == "cli" ]; then
|
||||
if [ "\${1}" == "cli" ]; then
|
||||
shift
|
||||
exec keepassxc-cli "$@"
|
||||
elif [ "$1" == "proxy" ]; then
|
||||
exec keepassxc-cli "\$@"
|
||||
elif [ "\${1}" == "proxy" ]; then
|
||||
shift
|
||||
exec keepassxc-proxy "$@"
|
||||
exec keepassxc-proxy "\$@"
|
||||
elif [ -v CHROME_WRAPPER ] || [ -v MOZ_LAUNCHED_CHILD ]; then
|
||||
exec keepassxc-proxy "$@"
|
||||
exec keepassxc-proxy "\$@"
|
||||
else
|
||||
exec keepassxc "$@"
|
||||
exec keepassxc "\$@"
|
||||
fi
|
||||
EOF
|
||||
chmod +x "${out_real}/KeePassXC-AppRun"
|
||||
|
||||
# Find .desktop files, icons, and binaries to deploy
|
||||
local desktop_file="$(find "$appdir" -name "org.keepassxc.KeePassXC.desktop" | head -n1)"
|
||||
local icon="$(find "$appdir" -path '*/application/256x256/apps/keepassxc.png' | head -n1)"
|
||||
local executables="$(find "$appdir" -type f -executable -path '*/bin/keepassxc*' -print0 | xargs -0 -i printf " --executable={}")"
|
||||
local icon="$(find "$appdir" -name 'keepassxc.png' | $GREP -P 'application/256x256/apps/keepassxc.png$' | head -n1)"
|
||||
local executables="$(IFS=$'\n' find "$appdir" | $GREP -P '/usr/bin/keepassxc[^/]*$' | xargs -i printf " --executable={}")"
|
||||
|
||||
logInfo "Collecting libs and patching binaries..."
|
||||
if [ -z "$DOCKER_IMAGE" ]; then
|
||||
if [ "" == "$DOCKER_IMAGE" ]; then
|
||||
"$linuxdeploy" --verbosity=${verbosity} --plugin=qt --appdir="$appdir" --desktop-file="$desktop_file" \
|
||||
--custom-apprun="${out_real}/KeePassXC-AppRun" --icon-file="$icon" ${executables}
|
||||
--custom-apprun="${out_real}/KeePassXC-AppRun" --icon-file="$icon" ${executables} \
|
||||
--library=$(ldconfig -p | $GREP x86-64 | $GREP -oP '/[^\s]+/libgpg-error\.so\.\d+$' | head -n1)
|
||||
else
|
||||
desktop_file="${desktop_file//${appdir}/\/keepassxc\/AppDir}"
|
||||
icon="${icon//${appdir}/\/keepassxc\/AppDir}"
|
||||
executables="${executables//${appdir}/\/keepassxc\/AppDir}"
|
||||
|
||||
docker run --name "$DOCKER_CONTAINER_NAME" --rm \
|
||||
--cap-add SYS_ADMIN --security-opt apparmor:unconfined --device /dev/fuse -it \
|
||||
-v "${out_real}:${out_real}:rw" \
|
||||
-v "${appdir}:${appdir}:rw" \
|
||||
-w "$out_real" \
|
||||
--user $(id -u):$(id -g) \
|
||||
--cap-add SYS_ADMIN --security-opt apparmor:unconfined --device /dev/fuse \
|
||||
-v "${appdir}:/keepassxc/AppDir:rw" \
|
||||
-v "${out_real}:/keepassxc/out:rw" \
|
||||
"$DOCKER_IMAGE" \
|
||||
bash -c "${linuxdeploy} --verbosity=${verbosity} --plugin=qt \
|
||||
--appdir='${appdir}' --custom-apprun='${out_real}/KeePassXC-AppRun' \
|
||||
--desktop-file='${desktop_file}' --icon-file='${icon}' ${executables}"
|
||||
bash -c "cd /keepassxc/out && ${linuxdeploy} --verbosity=${verbosity} --plugin=qt --appdir=/keepassxc/AppDir \
|
||||
--custom-apprun="/keepassxc/out/KeePassXC-AppRun" --desktop-file=${desktop_file} --icon-file=${icon} ${executables} \
|
||||
--library=\$(ldconfig -p | grep x86-64 | grep -oP '/[^\s]+/libgpg-error\.so\.\d+$' | head -n1)"
|
||||
fi
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
@@ -780,7 +772,6 @@ build() {
|
||||
local build_generators=""
|
||||
local build_appsign=false
|
||||
local build_key=""
|
||||
local build_vcpkg=""
|
||||
|
||||
while [ $# -ge 1 ]; do
|
||||
local arg="$1"
|
||||
@@ -830,10 +821,6 @@ build() {
|
||||
--appimage)
|
||||
build_appimage=true ;;
|
||||
|
||||
--cmake-generator)
|
||||
CMAKE_GENERATOR="$2"
|
||||
shift ;;
|
||||
|
||||
-c|--cmake-options)
|
||||
CMAKE_OPTIONS="$2"
|
||||
shift ;;
|
||||
@@ -842,10 +829,6 @@ build() {
|
||||
COMPILER="$2"
|
||||
shift ;;
|
||||
|
||||
--vcpkg)
|
||||
build_vcpkg="$2"
|
||||
shift ;;
|
||||
|
||||
-m|--make-options)
|
||||
MAKE_OPTIONS="$2"
|
||||
shift ;;
|
||||
@@ -882,15 +865,12 @@ build() {
|
||||
|
||||
init
|
||||
|
||||
OUTPUT_DIR="$(realpath "$OUTPUT_DIR")"
|
||||
# Resolve appsign key to absolute path if under Windows
|
||||
if [[ "${build_key}" && "$(uname -o)" == "Msys" ]]; then
|
||||
build_key="$(realpath "${build_key}")"
|
||||
fi
|
||||
|
||||
if [[ -f ${build_vcpkg} ]]; then
|
||||
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DCMAKE_TOOLCHAIN_FILE=${build_vcpkg} -DX_VCPKG_APPLOCAL_DEPS_INSTALL=ON"
|
||||
fi
|
||||
|
||||
if ${build_snapshot}; then
|
||||
TAG_NAME="HEAD"
|
||||
local branch=`git rev-parse --abbrev-ref HEAD`
|
||||
@@ -908,16 +888,13 @@ build() {
|
||||
CMAKE_OPTIONS="${CMAKE_OPTIONS} -DKEEPASSXC_BUILD_TYPE=Release"
|
||||
logInfo "Checking out release tag '${TAG_NAME}'..."
|
||||
fi
|
||||
git checkout "$TAG_NAME" > /dev/null 2>&1
|
||||
fi
|
||||
|
||||
OUTPUT_DIR="$(realpath "$OUTPUT_DIR")"
|
||||
if ! ${build_snapshot} && [ -d "$OUTPUT_DIR" ]; then
|
||||
exitError "Output dir '${OUTPUT_DIR}' already exists."
|
||||
git checkout "$TAG_NAME"
|
||||
fi
|
||||
|
||||
logInfo "Creating output directory..."
|
||||
if ! mkdir -p "$OUTPUT_DIR"; then
|
||||
mkdir -p "$OUTPUT_DIR"
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
exitError "Failed to create output directory!"
|
||||
fi
|
||||
|
||||
@@ -945,6 +922,14 @@ build() {
|
||||
$xz -6 "${OUTPUT_DIR}/${tarball_name}"
|
||||
fi
|
||||
|
||||
if ! ${build_snapshot} && [ -e "${OUTPUT_DIR}/build-release" ]; then
|
||||
logInfo "Cleaning existing build directory..."
|
||||
rm -rf "${OUTPUT_DIR}/build-release" 2> /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
exitError "Failed to clean existing build directory, please do it manually."
|
||||
fi
|
||||
fi
|
||||
|
||||
logInfo "Creating build directory..."
|
||||
mkdir -p "${OUTPUT_DIR}/build-release"
|
||||
cd "${OUTPUT_DIR}/build-release"
|
||||
@@ -965,23 +950,22 @@ build() {
|
||||
export CC=gcc
|
||||
elif [ "$COMPILER" == "clang++" ]; then
|
||||
export CC=clang
|
||||
else
|
||||
export CC="$COMPILER"
|
||||
fi
|
||||
export CXX="$COMPILER"
|
||||
|
||||
if [ -z "$DOCKER_IMAGE" ]; then
|
||||
if [ "" == "$DOCKER_IMAGE" ]; then
|
||||
if [ "$(uname -s)" == "Darwin" ]; then
|
||||
# Building on macOS
|
||||
export MACOSX_DEPLOYMENT_TARGET
|
||||
|
||||
logInfo "Configuring build..."
|
||||
cmake -G "${CMAKE_GENERATOR}" -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES="$(uname -m)" \
|
||||
-DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" ${CMAKE_OPTIONS} "$SRC_DIR"
|
||||
cmake -DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \
|
||||
-DCMAKE_PREFIX_PATH="/usr/local/opt/qt/lib/cmake" \
|
||||
${CMAKE_OPTIONS} "$SRC_DIR"
|
||||
|
||||
logInfo "Compiling and packaging sources..."
|
||||
cmake --build . -- ${MAKE_OPTIONS}
|
||||
cpack -G "DragNDrop"
|
||||
make ${MAKE_OPTIONS} package
|
||||
|
||||
# Appsign the executables if desired
|
||||
if ${build_appsign}; then
|
||||
@@ -989,20 +973,20 @@ build() {
|
||||
appsign "-f" "./${APP_NAME}-${RELEASE_NAME}.dmg" "-k" "${build_key}"
|
||||
fi
|
||||
|
||||
mv "./${APP_NAME}-${RELEASE_NAME}.dmg" "../${APP_NAME}-${RELEASE_NAME}-$(uname -m).dmg"
|
||||
mv "./${APP_NAME}-${RELEASE_NAME}.dmg" ../
|
||||
elif [ "$(uname -o)" == "Msys" ]; then
|
||||
# Building on Windows with Msys2
|
||||
logInfo "Configuring build..."
|
||||
cmake -DCMAKE_BUILD_TYPE=Release -G "${CMAKE_GENERATOR}" -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \
|
||||
${CMAKE_OPTIONS} "$SRC_DIR"
|
||||
cmake -DCMAKE_BUILD_TYPE=Release -G"MSYS Makefiles" \
|
||||
-DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" ${CMAKE_OPTIONS} "$SRC_DIR"
|
||||
|
||||
logInfo "Compiling and packaging sources..."
|
||||
cmake --build . --config "Release" -- ${MAKE_OPTIONS}
|
||||
mingw32-make ${MAKE_OPTIONS} preinstall
|
||||
|
||||
# Appsign the executables if desired
|
||||
if ${build_appsign} && [ -f "${build_key}" ]; then
|
||||
logInfo "Signing executable files"
|
||||
appsign "-f" $(find src | $GREP -Pi 'keepassxc.*(.exe$|.dll$)') "-k" "${build_key}"
|
||||
appsign "-f" $(find src | $GREP -P '\.exe$|\.dll$') "-k" "${build_key}"
|
||||
fi
|
||||
|
||||
# Call cpack directly instead of calling make package.
|
||||
@@ -1010,6 +994,17 @@ build() {
|
||||
# release.
|
||||
cpack -G "${CPACK_GENERATORS};${build_generators}"
|
||||
|
||||
# Inject the portable config into the zip build and rename
|
||||
touch .portable
|
||||
for filename in ${APP_NAME}-*.zip; do
|
||||
logInfo "Creating portable zip file"
|
||||
local folder=$(echo ${filename} | sed -r 's/(.*)\.zip/\1/')
|
||||
python -c 'import zipfile,sys ; zipfile.ZipFile(sys.argv[1],"a").write(sys.argv[2],sys.argv[3])' \
|
||||
${filename} .portable ${folder}/.portable
|
||||
mv ${filename} ${folder}-portable.zip
|
||||
done
|
||||
rm .portable
|
||||
|
||||
mv "${APP_NAME}-"*.* ../
|
||||
else
|
||||
mkdir -p "${OUTPUT_DIR}/KeePassXC.AppDir"
|
||||
@@ -1033,7 +1028,7 @@ build() {
|
||||
|
||||
logInfo "Launching Docker contain to compile snapcraft..."
|
||||
|
||||
sudo docker run --name "$DOCKER_CONTAINER_NAME" --rm -it --user $(id -u):$(id -g) \
|
||||
sudo docker run --name "$DOCKER_CONTAINER_NAME" --rm \
|
||||
-v "$(realpath "$SRC_DIR"):/keepassxc" -w "/keepassxc" \
|
||||
"$DOCKER_IMAGE" snapcraft
|
||||
else
|
||||
@@ -1043,8 +1038,7 @@ build() {
|
||||
|
||||
docker run --name "$DOCKER_CONTAINER_NAME" --rm \
|
||||
--cap-add SYS_ADMIN --security-opt apparmor:unconfined --device /dev/fuse \
|
||||
--user $(id -u):$(id -g) \
|
||||
-e "CC=${CC}" -e "CXX=${CXX}" -it \
|
||||
-e "CC=${CC}" -e "CXX=${CXX}" \
|
||||
-v "$(realpath "$SRC_DIR"):/keepassxc/src:ro" \
|
||||
-v "$(realpath "$OUTPUT_DIR"):/keepassxc/out:rw" \
|
||||
"$DOCKER_IMAGE" \
|
||||
@@ -1074,7 +1068,7 @@ build() {
|
||||
docker_image_flag="-d ${DOCKER_IMAGE}"
|
||||
docker_container_name_flag="--container-name ${DOCKER_CONTAINER_NAME}"
|
||||
fi
|
||||
appimage -a "${OUTPUT_DIR}/KeePassXC.AppDir" -o "${OUTPUT_DIR}" \
|
||||
appimage "-a" "${OUTPUT_DIR}/KeePassXC.AppDir" "-o" "${OUTPUT_DIR}" \
|
||||
${appsign_flag} ${appsign_key_flag} ${docker_image_flag} ${docker_container_name_flag}
|
||||
fi
|
||||
|
||||
@@ -1147,6 +1141,8 @@ gpgsign() {
|
||||
appsign() {
|
||||
local sign_files=()
|
||||
local key
|
||||
local ac_username
|
||||
local ac_keychain="AC_PASSWORD"
|
||||
|
||||
while [ $# -ge 1 ]; do
|
||||
local arg="$1"
|
||||
@@ -1161,6 +1157,14 @@ appsign() {
|
||||
key="$2"
|
||||
shift ;;
|
||||
|
||||
-u|--username)
|
||||
ac_username="$2"
|
||||
shift ;;
|
||||
|
||||
-c|--keychain)
|
||||
ac_keychain="$2"
|
||||
shift ;;
|
||||
|
||||
-h|--help)
|
||||
printUsage "appsign"
|
||||
exit ;;
|
||||
@@ -1186,12 +1190,16 @@ appsign() {
|
||||
fi
|
||||
|
||||
for f in "${sign_files[@]}"; do
|
||||
if [ ! -e "${f}" ]; then
|
||||
exitError "File '${f}' does not exist!"
|
||||
if [ ! -f "${f}" ]; then
|
||||
exitError "File '${f}' does not exist or is not a file!"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$(uname -s)" == "Darwin" ]; then
|
||||
if [ "$ac_username" == "" ]; then
|
||||
exitError "Missing arguments, --username is required!"
|
||||
fi
|
||||
|
||||
checkXcodeSetup
|
||||
checkGrepCompat
|
||||
|
||||
@@ -1202,45 +1210,30 @@ appsign() {
|
||||
logInfo "Unpacking disk image '${f}'..."
|
||||
local tmp_dir="/tmp/KeePassXC_${RANDOM}"
|
||||
mkdir -p ${tmp_dir}/mnt
|
||||
if ! hdiutil attach -quiet -noautoopen -mountpoint ${tmp_dir}/mnt "${f}"; then
|
||||
exitError "DMG mount failed!"
|
||||
fi
|
||||
hdiutil attach -quiet -noautoopen -mountpoint ${tmp_dir}/mnt "${f}"
|
||||
cd ${tmp_dir}
|
||||
cp -a ./mnt ./app
|
||||
hdiutil detach -quiet ${tmp_dir}/mnt
|
||||
local app_dir_tmp="./app/KeePassXC.app"
|
||||
|
||||
if [ ! -d "$app_dir_tmp" ]; then
|
||||
if [ ! -d ./app/KeePassXC.app ]; then
|
||||
cd "${orig_dir}"
|
||||
exitError "Unpacking failed!"
|
||||
fi
|
||||
elif [[ ${f: -4} == '.app' ]]; then
|
||||
local app_dir_tmp="$f"
|
||||
else
|
||||
logWarn "Skipping non-app file '${f}'..."
|
||||
continue
|
||||
fi
|
||||
|
||||
logInfo "Signing libraries and frameworks..."
|
||||
if ! find "$app_dir_tmp" \( -name '*.dylib' -o -name '*.so' -o -name '*.framework' \) -print0 | xargs -0 \
|
||||
xcrun codesign --sign "${key}" --verbose --force --options runtime; then
|
||||
cd "${orig_dir}"
|
||||
exitError "Signing failed!"
|
||||
fi
|
||||
logInfo "Signing executables..."
|
||||
if ! find "${app_dir_tmp}/Contents/MacOS" \( -type f -not -name KeePassXC \) -print0 | xargs -0 \
|
||||
xcrun codesign --sign "${key}" --verbose --force --options runtime; then
|
||||
cd "${orig_dir}"
|
||||
exitError "Signing failed!"
|
||||
fi
|
||||
# Sign main executable with additional entitlements
|
||||
if ! xcrun codesign --sign "${key}" --verbose --force --options runtime --entitlements \
|
||||
"${real_src_dir}/share/macosx/keepassxc.entitlements" "${app_dir_tmp}/Contents/MacOS/KeePassXC"; then
|
||||
cd "${orig_dir}"
|
||||
exitError "Signing failed!"
|
||||
fi
|
||||
logInfo "Signing app bundle..."
|
||||
xcrun codesign --sign "${key}" --verbose --deep --options runtime ./app/KeePassXC.app
|
||||
|
||||
# Sign main binary and libraries independently so we can keep using the convenient --deep
|
||||
# option while avoiding adding entitlements recursively
|
||||
logInfo "Signing main binary..."
|
||||
xcrun codesign --sign "${key}" --verbose --force --options runtime --entitlements \
|
||||
"${real_src_dir}/share/macosx/keepassxc.entitlements" ./app/KeePassXC.app/Contents/MacOS/KeePassXC
|
||||
|
||||
if [ 0 -ne $? ]; then
|
||||
cd "${orig_dir}"
|
||||
exitError "Signing failed!"
|
||||
fi
|
||||
|
||||
if [[ ${f: -4} == '.dmg' ]]; then
|
||||
logInfo "Repacking disk image..."
|
||||
hdiutil create \
|
||||
-volname "KeePassXC" \
|
||||
@@ -1254,9 +1247,52 @@ appsign() {
|
||||
cd "${orig_dir}"
|
||||
cp -f "${tmp_dir}/$(basename "${f}")" "${f}"
|
||||
rm -Rf ${tmp_dir}
|
||||
fi
|
||||
|
||||
logInfo "File '${f}' successfully signed."
|
||||
logInfo "Submitting disk image for notarization..."
|
||||
local status="$(xcrun altool --notarize-app \
|
||||
--primary-bundle-id "org.keepassxc.keepassxc" \
|
||||
--username "${ac_username}" \
|
||||
--password "@keychain:${ac_keychain}" \
|
||||
--file "${f}")"
|
||||
|
||||
if [ 0 -ne $? ]; then
|
||||
logError "Submission failed!"
|
||||
exitError "Error message:\n${status}"
|
||||
fi
|
||||
|
||||
local ticket="$(echo "${status}" | $GREP -oP "[a-f0-9-]+$")"
|
||||
logInfo "Submission successful. Ticket ID: ${ticket}."
|
||||
|
||||
logInfo "Waiting for notarization to finish (this may take a while)..."
|
||||
while true; do
|
||||
echo -n "."
|
||||
|
||||
status="$(xcrun altool --notarization-info "${ticket}" \
|
||||
--username "${ac_username}" \
|
||||
--password "@keychain:${ac_keychain}")"
|
||||
|
||||
if echo "$status" | $GREP -q "Status Code: 0"; then
|
||||
logInfo "\nNotarization successful."
|
||||
break
|
||||
elif echo "$status" | $GREP -q "Status Code"; then
|
||||
logError "\nNotarization failed!"
|
||||
exitError "Error message:\n${status}"
|
||||
fi
|
||||
|
||||
sleep 5
|
||||
done
|
||||
|
||||
logInfo "Stapling ticket to disk image..."
|
||||
xcrun stapler staple "${f}"
|
||||
|
||||
if [ 0 -ne $? ]; then
|
||||
exitError "Stapling failed!"
|
||||
fi
|
||||
|
||||
logInfo "Disk image successfully signed and notarized."
|
||||
else
|
||||
logWarn "Skipping non-DMG file '${f}'..."
|
||||
fi
|
||||
done
|
||||
|
||||
elif [ "$(uname -o)" == "Msys" ]; then
|
||||
@@ -1294,190 +1330,12 @@ appsign() {
|
||||
logInfo "All done!"
|
||||
}
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
# notarize command
|
||||
# -----------------------------------------------------------------------
|
||||
notarize() {
|
||||
local notarize_files=()
|
||||
local ac_username
|
||||
local ac_keychain="AC_PASSWORD"
|
||||
|
||||
while [ $# -ge 1 ]; do
|
||||
local arg="$1"
|
||||
case "$arg" in
|
||||
-f|--files)
|
||||
while [ "${2:0:1}" != "-" ] && [ $# -ge 2 ]; do
|
||||
notarize_files+=("$2")
|
||||
shift
|
||||
done ;;
|
||||
|
||||
-u|--username)
|
||||
ac_username="$2"
|
||||
shift ;;
|
||||
|
||||
-c|--keychain)
|
||||
ac_keychain="$2"
|
||||
shift ;;
|
||||
|
||||
-h|--help)
|
||||
printUsage "notarize"
|
||||
exit ;;
|
||||
|
||||
*)
|
||||
logError "Unknown option '$arg'\n"
|
||||
printUsage "notarize"
|
||||
exit 1 ;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if [ "$(uname -s)" != "Darwin" ]; then
|
||||
exitError "Notarization is only supported on macOS!"
|
||||
fi
|
||||
|
||||
if [ -z "${notarize_files}" ]; then
|
||||
logError "Missing arguments, --files is required!\n"
|
||||
printUsage "notarize"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$ac_username" ]; then
|
||||
logError "Missing arguments, --username is required!"
|
||||
printUsage "notarize"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for f in "${notarize_files[@]}"; do
|
||||
if [[ ${f: -4} != '.dmg' ]]; then
|
||||
logWarn "Skipping non-DMG file '${f}'..."
|
||||
continue
|
||||
fi
|
||||
|
||||
logInfo "Submitting disk image '${f}' for notarization..."
|
||||
local status
|
||||
status="$(xcrun altool --notarize-app \
|
||||
--primary-bundle-id "org.keepassxc.keepassxc" \
|
||||
--username "${ac_username}" \
|
||||
--password "@keychain:${ac_keychain}" \
|
||||
--file "${f}" 2> /dev/null)"
|
||||
|
||||
if [ 0 -ne $? ]; then
|
||||
logError "Submission failed!"
|
||||
exitError "Error message:\n${status}"
|
||||
fi
|
||||
|
||||
local ticket="$(echo "${status}" | $GREP -oP "[a-f0-9-]+$")"
|
||||
logInfo "Submission successful. Ticket ID: ${ticket}."
|
||||
|
||||
logInfo "Waiting for notarization to finish (this may take a while)..."
|
||||
while true; do
|
||||
echo -n "."
|
||||
|
||||
status="$(xcrun altool --notarization-info "${ticket}" \
|
||||
--username "${ac_username}" \
|
||||
--password "@keychain:${ac_keychain}" 2> /dev/null)"
|
||||
|
||||
if echo "$status" | $GREP -q "Status Code: 0"; then
|
||||
logInfo "\nNotarization successful."
|
||||
break
|
||||
elif echo "$status" | $GREP -q "Status Code"; then
|
||||
logError "\nNotarization failed!"
|
||||
exitError "Error message:\n${status}"
|
||||
fi
|
||||
|
||||
sleep 5
|
||||
done
|
||||
|
||||
logInfo "Stapling ticket to disk image..."
|
||||
xcrun stapler staple "${f}"
|
||||
|
||||
if [ 0 -ne $? ]; then
|
||||
exitError "Stapling failed!"
|
||||
fi
|
||||
|
||||
logInfo "Disk image successfully notarized."
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
# i18n command
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
i18n() {
|
||||
local cmd="$1"
|
||||
if [ -z "$cmd" ]; then
|
||||
logError "No subcommand specified.\n"
|
||||
printUsage i18n
|
||||
exit 1
|
||||
elif [ "$cmd" != "tx-push" ] && [ "$cmd" != "tx-pull" ] && [ "$cmd" != "lupdate" ]; then
|
||||
logError "Unknown subcommand: '${cmd}'\n"
|
||||
printUsage i18n
|
||||
exit 1
|
||||
fi
|
||||
shift
|
||||
|
||||
checkGitRepository
|
||||
|
||||
if [ "$cmd" == "lupdate" ]; then
|
||||
if [ ! -d share/translations ]; then
|
||||
logError "Command must be called from repository root directory."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
checkQt5LUpdateExists
|
||||
|
||||
logInfo "Updating source translation file..."
|
||||
LUPDATE=lupdate-qt5
|
||||
if ! command -v $LUPDATE > /dev/null; then
|
||||
LUPDATE=lupdate
|
||||
fi
|
||||
$LUPDATE -no-ui-lines -disable-heuristic similartext -locations none -no-obsolete src \
|
||||
-ts share/translations/keepassxc_en.ts $@
|
||||
|
||||
return 0
|
||||
fi
|
||||
|
||||
checkTransifexCommandExists
|
||||
|
||||
local branch="$(git branch --show-current 2>&1)"
|
||||
local real_branch="$branch"
|
||||
if [[ "$branch" =~ ^release/ ]]; then
|
||||
logInfo "Release branch, setting language resource to master branch."
|
||||
branch="master"
|
||||
elif [ "$branch" != "develop" ] && [ "$branch" != "master" ]; then
|
||||
logError "Must be on master or develop branch!"
|
||||
exit 1
|
||||
fi
|
||||
local resource="keepassxc.share-translations-keepassxc-en-ts--${branch}"
|
||||
|
||||
if [ "$cmd" == "tx-push" ]; then
|
||||
echo -e "This will push the \e[1m'en'\e[0m source file from the current branch to Transifex:\n" >&2
|
||||
echo -e " \e[1m${real_branch}\e[0m -> \e[1m${resource}\e[0m\n" >&2
|
||||
echo -n "Continue? [y/N] " >&2
|
||||
read -r yesno
|
||||
if [ "$yesno" != "y" ] && [ "$yesno" != "Y" ]; then
|
||||
logError "Push aborted."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
logInfo "Pushing source translation file to Transifex..."
|
||||
tx push -s --use-git-timestamps -r "$resource" $@
|
||||
|
||||
elif [ "$cmd" == "tx-pull" ]; then
|
||||
logInfo "Pulling updated translations from Transifex..."
|
||||
tx pull -af --minimum-perc=60 --parallel -r "$resource" $@
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
# parse global command line
|
||||
# -----------------------------------------------------------------------
|
||||
MODE="$1"
|
||||
shift || true
|
||||
if [ -z "$MODE" ]; then
|
||||
shift
|
||||
if [ "" == "$MODE" ]; then
|
||||
logError "Missing arguments!\n"
|
||||
printUsage
|
||||
exit 1
|
||||
@@ -1485,8 +1343,7 @@ elif [ "help" == "$MODE" ]; then
|
||||
printUsage "$1"
|
||||
exit
|
||||
elif [ "check" == "$MODE" ] || [ "merge" == "$MODE" ] || [ "build" == "$MODE" ] \
|
||||
|| [ "gpgsign" == "$MODE" ] || [ "appsign" == "$MODE" ]|| [ "notarize" == "$MODE" ] \
|
||||
|| [ "appimage" == "$MODE" ]|| [ "i18n" == "$MODE" ]; then
|
||||
|| [ "gpgsign" == "$MODE" ] || [ "appsign" == "$MODE" ] || [ "appimage" == "$MODE" ]; then
|
||||
${MODE} "$@"
|
||||
else
|
||||
printUsage "$MODE"
|
||||
|
||||
538
release-tool.ps1
@@ -1,538 +0,0 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
KeePassXC Release Tool
|
||||
|
||||
.DESCRIPTION
|
||||
Commands:
|
||||
merge Merge release branch into main branch and create release tags
|
||||
build Build and package binary release from sources
|
||||
sign Sign previously compiled release packages
|
||||
|
||||
.NOTES
|
||||
The following are descriptions of certain parameters:
|
||||
-Vcpkg Specify VCPKG toolchain file (example: C:\vcpkg\scripts\buildsystems\vcpkg.cmake)
|
||||
-Tag Release tag to check out (defaults to version number)
|
||||
-Snapshot Build current HEAD without checkout out Tag
|
||||
-CMakeGenerator Override the default CMake generator
|
||||
-CMakeOptions Additional CMake options for compiling the sources
|
||||
-CPackGenerators Set CPack generators (default: WIX;ZIP)
|
||||
-Compiler Compiler to use (example: g++, clang, msbuild)
|
||||
-MakeOptions Options to pass to the make program
|
||||
-SignBuild Perform platform specific App Signing before packaging
|
||||
-SignKey Specify the App Signing Key/Identity
|
||||
-TimeStamp Explicitly set the timestamp server to use for appsign
|
||||
-SourceBranch Source branch to merge from (default: 'release/$Version')
|
||||
-TargetBranch Target branch to merge to (default: master)
|
||||
-VSToolChain Specify Visual Studio Toolchain by name if more than one is available
|
||||
#>
|
||||
|
||||
param(
|
||||
[Parameter(ParameterSetName = "merge", Mandatory, Position = 0)]
|
||||
[switch] $Merge,
|
||||
[Parameter(ParameterSetName = "build", Mandatory, Position = 0)]
|
||||
[switch] $Build,
|
||||
[Parameter(ParameterSetName = "sign", Mandatory, Position = 0)]
|
||||
[switch] $Sign,
|
||||
|
||||
[Parameter(ParameterSetName = "merge", Mandatory, Position = 1)]
|
||||
[Parameter(ParameterSetName = "build", Mandatory, Position = 1)]
|
||||
[Parameter(ParameterSetName = "sign", Mandatory, Position = 1)]
|
||||
[ValidatePattern("^[0-9]\.[0-9]\.[0-9]$")]
|
||||
[string] $Version,
|
||||
|
||||
[Parameter(ParameterSetName = "build", Mandatory)]
|
||||
[string] $Vcpkg,
|
||||
|
||||
[Parameter(ParameterSetName = "sign", Mandatory)]
|
||||
[SupportsWildcards()]
|
||||
[string[]] $SignFiles,
|
||||
|
||||
# [Parameter(ParameterSetName = "build")]
|
||||
# [switch] $DryRun,
|
||||
[Parameter(ParameterSetName = "build")]
|
||||
[switch] $Snapshot,
|
||||
[Parameter(ParameterSetName = "build")]
|
||||
[switch] $SignBuild,
|
||||
|
||||
[Parameter(ParameterSetName = "build")]
|
||||
[string] $CMakeGenerator = "Ninja",
|
||||
[Parameter(ParameterSetName = "build")]
|
||||
[string] $CMakeOptions,
|
||||
[Parameter(ParameterSetName = "build")]
|
||||
[string] $CPackGenerators = "WIX;ZIP",
|
||||
[Parameter(ParameterSetName = "build")]
|
||||
[string] $Compiler,
|
||||
[Parameter(ParameterSetName = "build")]
|
||||
[string] $MakeOptions,
|
||||
[Parameter(ParameterSetName = "build")]
|
||||
[Parameter(ParameterSetName = "sign")]
|
||||
[string] $SignKey,
|
||||
[Parameter(ParameterSetName = "build")]
|
||||
[Parameter(ParameterSetName = "sign")]
|
||||
[string] $Timestamp = "http://timestamp.sectigo.com",
|
||||
[Parameter(ParameterSetName = "merge")]
|
||||
[Parameter(ParameterSetName = "build")]
|
||||
[Parameter(ParameterSetName = "sign")]
|
||||
[string] $GpgKey = "CFB4C2166397D0D2",
|
||||
[Parameter(ParameterSetName = "merge")]
|
||||
[Parameter(ParameterSetName = "build")]
|
||||
[string] $SourceDir = ".",
|
||||
[Parameter(ParameterSetName = "build")]
|
||||
[string] $OutDir = ".\release",
|
||||
[Parameter(ParameterSetName = "merge")]
|
||||
[Parameter(ParameterSetName = "build")]
|
||||
[string] $Tag,
|
||||
[Parameter(ParameterSetName = "merge")]
|
||||
[string] $SourceBranch,
|
||||
[Parameter(ParameterSetName = "merge")]
|
||||
[string] $TargetBranch = "master",
|
||||
[Parameter(ParameterSetName = "build")]
|
||||
[string] $VSToolChain,
|
||||
[Parameter(ParameterSetName = "merge")]
|
||||
[Parameter(ParameterSetName = "build")]
|
||||
[Parameter(ParameterSetName = "sign")]
|
||||
[string] $ExtraPath
|
||||
)
|
||||
|
||||
# Helper function definitions
|
||||
function Test-RequiredPrograms {
|
||||
# If any of these fail they will throw an exception terminating the script
|
||||
if ($Build) {
|
||||
Get-Command git | Out-Null
|
||||
Get-Command cmake | Out-Null
|
||||
}
|
||||
if ($Merge) {
|
||||
Get-Command git | Out-Null
|
||||
Get-Command tx | Out-Null
|
||||
Get-Command lupdate | Out-Null
|
||||
}
|
||||
if ($Sign -or $SignBuild) {
|
||||
if ($SignKey.Length) {
|
||||
Get-Command signtool | Out-Null
|
||||
}
|
||||
Get-Command gpg | Out-Null
|
||||
}
|
||||
}
|
||||
|
||||
function Test-VersionInFiles {
|
||||
# Check CMakeLists.txt
|
||||
$Major, $Minor, $Patch = $Version.split(".", 3)
|
||||
if (!(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_MAJOR `"$Major`"" -Quiet) `
|
||||
-or !(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_MINOR `"$Minor`"" -Quiet) `
|
||||
-or !(Select-String "$SourceDir\CMakeLists.txt" -pattern "KEEPASSXC_VERSION_PATCH `"$Patch`"" -Quiet)) {
|
||||
throw "CMakeLists.txt has not been updated to $Version."
|
||||
}
|
||||
|
||||
# Check Changelog
|
||||
if (!(Select-String "$SourceDir\CHANGELOG.md" -pattern "^## $Version \(\d{4}-\d{2}-\d{2}\)$" -Quiet)) {
|
||||
throw "CHANGELOG.md does not contain a section for $Version."
|
||||
}
|
||||
|
||||
# Check AppStreamInfo
|
||||
if (!(Select-String "$SourceDir\share\linux\org.keepassxc.KeePassXC.appdata.xml" `
|
||||
-pattern "<release version=`"$Version`" date=`"\d{4}-\d{2}-\d{2}`">" -Quiet)) {
|
||||
throw "share/linux/org.keepassxc.KeePassXC.appdata.xml does not contain a section for $Version."
|
||||
}
|
||||
}
|
||||
|
||||
function Test-WorkingTreeClean {
|
||||
& git diff-index --quiet HEAD --
|
||||
if ($LASTEXITCODE) {
|
||||
throw "Current working tree is not clean! Please commit or unstage any changes."
|
||||
}
|
||||
}
|
||||
|
||||
function Invoke-VSToolchain([String] $Toolchain, [String] $Path, [String] $Arch) {
|
||||
# Find Visual Studio installations
|
||||
$vs = Get-CimInstance MSFT_VSInstance
|
||||
if ($vs.count -eq 0) {
|
||||
$err = "No Visual Studio installations found, download one from https://visualstudio.com/downloads."
|
||||
$err = "$err`nIf Visual Studio is installed, you may need to repair the install then restart."
|
||||
throw $err
|
||||
}
|
||||
|
||||
$VSBaseDir = $vs[0].InstallLocation
|
||||
if ($Toolchain) {
|
||||
# Try to find the specified toolchain by name
|
||||
foreach ($_ in $vs) {
|
||||
if ($_.Name -eq $Toolchain) {
|
||||
$VSBaseDir = $_.InstallLocation
|
||||
break
|
||||
}
|
||||
}
|
||||
} elseif ($vs.count -gt 1) {
|
||||
# Ask the user which install to use
|
||||
$i = 0
|
||||
foreach ($_ in $vs) {
|
||||
$i = $i + 1
|
||||
$i.ToString() + ") " + $_.Name | Write-Host
|
||||
}
|
||||
$i = Read-Host -Prompt "Which Visual Studio installation do you want to use?"
|
||||
$i = [Convert]::ToInt32($i, 10) - 1
|
||||
if ($i -lt 0 -or $i -ge $vs.count) {
|
||||
throw "Invalid selection made"
|
||||
}
|
||||
$VSBaseDir = $vs[$i].InstallLocation
|
||||
}
|
||||
|
||||
# Bootstrap the specified VS Toolchain
|
||||
Import-Module "$VSBaseDir\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
|
||||
Enter-VsDevShell -VsInstallPath $VSBaseDir -Arch $Arch -StartInPath $Path | Write-Host
|
||||
Write-Host # Newline after command output
|
||||
}
|
||||
|
||||
function Invoke-Cmd([string] $command, [string[]] $options = @(), [switch] $maskargs, [switch] $quiet) {
|
||||
$call = ('{0} {1}' -f $command, ($options -Join ' '))
|
||||
if ($maskargs) {
|
||||
Write-Host "$command <masked>" -ForegroundColor DarkGray
|
||||
}
|
||||
else {
|
||||
Write-Host $call -ForegroundColor DarkGray
|
||||
}
|
||||
if ($quiet) {
|
||||
Invoke-Expression $call > $null
|
||||
} else {
|
||||
Invoke-Expression $call
|
||||
}
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "Failed to run command: {0}" -f $command
|
||||
}
|
||||
Write-Host #insert newline after command output
|
||||
}
|
||||
|
||||
function Invoke-SignFiles([string[]] $files, [string] $key, [string] $time) {
|
||||
if (!(Test-Path -Path "$key" -PathType leaf)) {
|
||||
throw "Appsign key file was not found! ($key)"
|
||||
}
|
||||
if ($files.Length -eq 0) {
|
||||
return
|
||||
}
|
||||
|
||||
Write-Host "Signing files using $key" -ForegroundColor Cyan
|
||||
$KeyPassword = Read-Host "Key password: " -MaskInput
|
||||
|
||||
foreach ($_ in $files) {
|
||||
Write-Host "Signing file '$_' using Microsoft signtool..."
|
||||
Invoke-Cmd "signtool" "sign -f `"$key`" -p `"$KeyPassword`" -d `"KeePassXC`" -td sha256 -fd sha256 -tr `"$time`" `"$_`"" -maskargs
|
||||
}
|
||||
}
|
||||
|
||||
function Invoke-GpgSignFiles([string[]] $files, [string] $key) {
|
||||
if ($files.Length -eq 0) {
|
||||
return
|
||||
}
|
||||
|
||||
Write-Host "Signing files using GPG key $key" -ForegroundColor Cyan
|
||||
|
||||
foreach ($_ in $files) {
|
||||
Write-Host "Signing file '$_' and creating DIGEST..."
|
||||
if (Test-Path "$_.sig") {
|
||||
Remove-Item "$_.sig"
|
||||
}
|
||||
Invoke-Cmd "gpg" "--output `"$_.sig`" --armor --local-user `"$key`" --detach-sig `"$_`""
|
||||
$FileName = (Get-Item $_).Name
|
||||
(Get-FileHash "$_" SHA256).Hash + " *$FileName" | Out-File "$_.DIGEST" -NoNewline
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Handle errors and restore state
|
||||
$OrigDir = (Get-Location).Path
|
||||
$OrigBranch = & git rev-parse --abbrev-ref HEAD
|
||||
$ErrorActionPreference = 'Stop'
|
||||
trap {
|
||||
Write-Host "Restoring state..." -ForegroundColor Yellow
|
||||
& git checkout $OrigBranch
|
||||
Set-Location "$OrigDir"
|
||||
}
|
||||
|
||||
Write-Host "KeePassXC Release Preparation Helper" -ForegroundColor Green
|
||||
Write-Host "Copyright (C) 2022 KeePassXC Team <https://keepassxc.org/>`n" -ForegroundColor Green
|
||||
|
||||
# Prepend extra PATH locations as specified
|
||||
if ($ExtraPath) {
|
||||
$env:Path = "$ExtraPath;$env:Path"
|
||||
}
|
||||
|
||||
# Resolve absolute directory for paths
|
||||
$SourceDir = (Resolve-Path $SourceDir).Path
|
||||
|
||||
# Check format of -Version
|
||||
if ($Version -notmatch "^\d+\.\d+\.\d+$") {
|
||||
throw "Invalid format for -Version input"
|
||||
}
|
||||
|
||||
# Check platform
|
||||
if (!$IsWindows) {
|
||||
throw "The PowerShell release tool is not available for Linux or macOS at this time."
|
||||
}
|
||||
|
||||
if ($Merge) {
|
||||
Test-RequiredPrograms
|
||||
|
||||
# Change to SourceDir
|
||||
Set-Location "$SourceDir"
|
||||
|
||||
Test-VersionInFiles
|
||||
Test-WorkingTreeClean
|
||||
|
||||
if (!$SourceBranch.Length) {
|
||||
$SourceBranch = & git branch --show-current
|
||||
}
|
||||
|
||||
if ($SourceBranch -notmatch "^release/.*|develop$") {
|
||||
throw "Must be on develop or a release/* branch to continue merging."
|
||||
}
|
||||
|
||||
# Update translation files
|
||||
Write-Host "Updating source translation file..."
|
||||
Invoke-Cmd "lupdate" "-no-ui-lines -disable-heuristic similartext -locations none", `
|
||||
"-no-obsolete ./src -ts share/translations/keepassxc_en.ts"
|
||||
|
||||
Write-Host "Pulling updated translations from Transifex..."
|
||||
Invoke-Cmd "tx" "pull -af --minimum-perc=60 --parallel -r keepassxc.share-translations-keepassxc-en-ts--develop"
|
||||
|
||||
# Only commit if there are changes
|
||||
& git diff-index --quiet HEAD --
|
||||
if ($LASTEXITCODE) {
|
||||
Write-Host "Committing translation updates..."
|
||||
Invoke-Cmd "git" "add -A ./share/translations/" -quiet
|
||||
Invoke-Cmd "git" "commit -m `"Update translations`"" -quiet
|
||||
}
|
||||
|
||||
# Read the version release notes from CHANGELOG
|
||||
$Changelog = ""
|
||||
$ReadLine = $false
|
||||
Get-Content "CHANGELOG.md" | ForEach-Object {
|
||||
if ($ReadLine) {
|
||||
if ($_ -match "^## ") {
|
||||
$ReadLine = $false
|
||||
} else {
|
||||
$Changelog += $_ + "`n"
|
||||
}
|
||||
} elseif ($_ -match "$Version \(\d{4}-\d{2}-\d{2}\)") {
|
||||
$ReadLine = $true
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host "Checking out target branch '$TargetBranch'..."
|
||||
Invoke-Cmd "git" "checkout `"$TargetBranch`"" -quiet
|
||||
|
||||
Write-Host "Merging '$SourceBranch' into '$TargetBranch'..."
|
||||
Invoke-Cmd "git" "merge `"$SourceBranch`" --no-ff -m `"Release $Version`" -m `"$Changelog`" `"$SourceBranch`" -S" -quiet
|
||||
|
||||
Write-Host "Creating tag for '$Version'..."
|
||||
Invoke-Cmd "git" "tag -a `"$Version`" -m `"Release $Version`" -m `"$Changelog`" -s" -quiet
|
||||
|
||||
Write-Host "All done!"
|
||||
Write-Host "Please merge the release branch back into the develop branch now and then push your changes."
|
||||
Write-Host "Don't forget to also push the tags using 'git push --tags'."
|
||||
} elseif ($Build) {
|
||||
$Vcpkg = (Resolve-Path $Vcpkg).Path
|
||||
|
||||
# Find Visual Studio and establish build environment
|
||||
Invoke-VSToolchain $VSToolChain $SourceDir -Arch "amd64"
|
||||
|
||||
Test-RequiredPrograms
|
||||
|
||||
if ($Snapshot) {
|
||||
$Tag = "HEAD"
|
||||
$SourceBranch = & git rev-parse --abbrev-ref HEAD
|
||||
$ReleaseName = "$Version-snapshot"
|
||||
$CMakeOptions = "$CMakeOptions -DKEEPASSXC_BUILD_TYPE=Snapshot -DOVERRIDE_VERSION=`"$ReleaseName`""
|
||||
Write-Host "Using current branch '$SourceBranch' to build." -ForegroundColor Cyan
|
||||
} else {
|
||||
Test-WorkingTreeClean
|
||||
|
||||
# Clear output directory
|
||||
if (Test-Path $OutDir) {
|
||||
Remove-Item $OutDir -Recurse
|
||||
}
|
||||
|
||||
if ($Version -match "-beta\\d+$") {
|
||||
$CMakeOptions = "$CMakeOptions -DKEEPASSXC_BUILD_TYPE=PreRelease"
|
||||
} else {
|
||||
$CMakeOptions = "$CMakeOptions -DKEEPASSXC_BUILD_TYPE=Release"
|
||||
}
|
||||
|
||||
# Setup Tag if not defined then checkout tag
|
||||
if ($Tag -eq "" -or $Tag -eq $null) {
|
||||
$Tag = $Version
|
||||
}
|
||||
Write-Host "Checking out tag 'tags/$Tag' to build." -ForegroundColor Cyan
|
||||
Invoke-Cmd "git" "checkout `"tags/$Tag`""
|
||||
}
|
||||
|
||||
# Create directories
|
||||
New-Item "$OutDir" -ItemType Directory -Force | Out-Null
|
||||
$OutDir = (Resolve-Path $OutDir).Path
|
||||
|
||||
$BuildDir = "$OutDir\build-release"
|
||||
New-Item "$BuildDir" -ItemType Directory -Force | Out-Null
|
||||
|
||||
# Enter build directory
|
||||
Set-Location "$BuildDir"
|
||||
|
||||
# Setup CMake options
|
||||
$CMakeOptions = "$CMakeOptions -DWITH_XC_ALL=ON -DWITH_TESTS=OFF -DCMAKE_BUILD_TYPE=Release"
|
||||
$CMakeOptions = "$CMakeOptions -DCMAKE_TOOLCHAIN_FILE:FILEPATH=`"$Vcpkg`" -DX_VCPKG_APPLOCAL_DEPS_INSTALL=ON"
|
||||
|
||||
Write-Host "Configuring build..." -ForegroundColor Cyan
|
||||
Invoke-Cmd "cmake" "$CMakeOptions -G `"$CMakeGenerator`" `"$SourceDir`""
|
||||
|
||||
Write-Host "Compiling sources..." -ForegroundColor Cyan
|
||||
Invoke-Cmd "cmake" "--build . --config Release -- $MakeOptions"
|
||||
|
||||
if ($SignBuild) {
|
||||
$files = Get-ChildItem "$BuildDir\src" -Include "*keepassxc*.exe", "*keepassxc*.dll" -Recurse -File | ForEach-Object { $_.FullName }
|
||||
Invoke-SignFiles $files $SignKey $Timestamp
|
||||
}
|
||||
|
||||
Write-Host "Create deployment packages..." -ForegroundColor Cyan
|
||||
Invoke-Cmd "cpack" "-G `"$CPackGenerators`""
|
||||
Move-Item "$BuildDir\keepassxc-*" -Destination "$OutDir" -Force
|
||||
|
||||
if ($SignBuild) {
|
||||
# Enter output directory
|
||||
Set-Location -Path "$OutDir"
|
||||
|
||||
# Sign MSI files using AppSign key
|
||||
$files = Get-ChildItem $OutDir -Include "*.msi" -Name
|
||||
Invoke-SignFiles $files $SignKey $Timestamp
|
||||
|
||||
# Sign all output files using the GPG key then hash them
|
||||
$files = Get-ChildItem $OutDir -Include "*.msi", "*.zip" -Name
|
||||
Invoke-GpgSignFiles $files $GpgKey
|
||||
}
|
||||
|
||||
# Restore state
|
||||
Invoke-Command {git checkout $OrigBranch}
|
||||
Set-Location "$OrigDir"
|
||||
} elseif ($Sign) {
|
||||
if (Test-Path $SignKey) {
|
||||
# Need to include path to signtool program
|
||||
Invoke-VSToolchain $VSToolChain $SourceDir -Arch "amd64"
|
||||
}
|
||||
|
||||
Test-RequiredPrograms
|
||||
|
||||
# Resolve wildcard paths
|
||||
$ResolvedFiles = @()
|
||||
foreach ($_ in $SignFiles) {
|
||||
$ResolvedFiles += (Get-ChildItem $_ -File | ForEach-Object { $_.FullName })
|
||||
}
|
||||
|
||||
$AppSignFiles = $ResolvedFiles.Where({ $_ -match "\.(msi|exe|dll)$" })
|
||||
Invoke-SignFiles $AppSignFiles $SignKey $Timestamp
|
||||
|
||||
$GpgSignFiles = $ResolvedFiles.Where({ $_ -match "\.(msi|zip|gz|xz|dmg|appimage)$" })
|
||||
Invoke-GpgSignFiles $GpgSignFiles $GpgKey
|
||||
}
|
||||
|
||||
# SIG # Begin signature block
|
||||
# MIIThAYJKoZIhvcNAQcCoIITdTCCE3ECAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
|
||||
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
|
||||
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUyaXWK5K1LP2TD/IgGb5Tfs8v
|
||||
# C2GgghC8MIIFOjCCBCKgAwIBAgIQWKLXLYzA/YnM/yHg1O3HSjANBgkqhkiG9w0B
|
||||
# AQsFADB8MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVy
|
||||
# MRAwDgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxJDAi
|
||||
# BgNVBAMTG1NlY3RpZ28gUlNBIENvZGUgU2lnbmluZyBDQTAeFw0yMTAzMTUwMDAw
|
||||
# MDBaFw0yNDAzMTQyMzU5NTlaMIGhMQswCQYDVQQGEwJVUzEOMAwGA1UEEQwFMjIz
|
||||
# MTUxETAPBgNVBAgMCFZpcmdpbmlhMRIwEAYDVQQHDAlGcmFuY29uaWExGzAZBgNV
|
||||
# BAkMEjY2NTMgQXVkcmV5IEtheSBDdDEeMBwGA1UECgwVRHJvaWRNb25rZXkgQXBw
|
||||
# cywgTExDMR4wHAYDVQQDDBVEcm9pZE1vbmtleSBBcHBzLCBMTEMwggEiMA0GCSqG
|
||||
# SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCwB9L/+1zlcXOQLoYvdrYAWS9B5ui+7E9c
|
||||
# XCn6wcB4NdmaRbNM3kdWc8nbjOOHeOct2jVzVu/pJR1SagI+V1R1BfzgfzuW55Yy
|
||||
# iHrqXQGfL9xhqJAWSvdQRinvlkZ+WY3QxnOhzcQk+BTLYdUwq04O3jMv7vnH6fuL
|
||||
# q/HXEsgDObZC7EyKEtVbWVo4nqY0tUTviJXvRI/sFDN8DvULefwZWIvF7G11NFeK
|
||||
# It24+hDCzvVBKtEn7DNmFGO1CJAB7Sz4jFewV4MP1gviMAfGbSBqavyRDBOG7eda
|
||||
# SVb1Zq482yoHNAs+mpIQK2SGvUKKAJK2wCDbzgpvu5sfzwStpc0hAgMBAAGjggGQ
|
||||
# MIIBjDAfBgNVHSMEGDAWgBQO4TqoUzox1Yq+wbutZxoDha00DjAdBgNVHQ4EFgQU
|
||||
# 7u2WZ7fqJiaM3u9SlzAwGBhoWH0wDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQC
|
||||
# MAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYJYIZIAYb4QgEBBAQDAgQQMEoGA1Ud
|
||||
# IARDMEEwNQYMKwYBBAGyMQECAQMCMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8vc2Vj
|
||||
# dGlnby5jb20vQ1BTMAgGBmeBDAEEATBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8v
|
||||
# Y3JsLnNlY3RpZ28uY29tL1NlY3RpZ29SU0FDb2RlU2lnbmluZ0NBLmNybDBzBggr
|
||||
# BgEFBQcBAQRnMGUwPgYIKwYBBQUHMAKGMmh0dHA6Ly9jcnQuc2VjdGlnby5jb20v
|
||||
# U2VjdGlnb1JTQUNvZGVTaWduaW5nQ0EuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8v
|
||||
# b2NzcC5zZWN0aWdvLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAD2w/Tt5KyPbX2M+h
|
||||
# WVwgqpKm42nk6aN2HvSp+KWlrB2t+ziL+1IRXwq7S0V7p2e1ZK8uXLzBjUDVGjBc
|
||||
# ugh5hGG95MGVltxCJrr/bk1He62L7MwVxfH5b5MrE/vC/cHcSxEB1AZwZxYKjDPf
|
||||
# R81biDVch++XeKmvUxfT4XGo7McJqT4K/TcLwijSb/AWsXR+r2BXEAqgsoG37kk/
|
||||
# fbPKimpJ07hxd/RNYVpE33E93zCQ1Tjc1tP3DaLq8cpS6jGUY5NNOzRgp2mGcGHy
|
||||
# lv6Q/xf45qNvHiqFVctdvY9of0QFjg5eYDr4rLDa+mks9f1Jd8aDWKcsfCBnlohT
|
||||
# KIffbTCCBYEwggRpoAMCAQICEDlyRDr5IrdR19NsEN0xNZUwDQYJKoZIhvcNAQEM
|
||||
# BQAwezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ
|
||||
# MA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAf
|
||||
# BgNVBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0xOTAzMTIwMDAwMDBa
|
||||
# Fw0yODEyMzEyMzU5NTlaMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEpl
|
||||
# cnNleTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJV
|
||||
# U1QgTmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9u
|
||||
# IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIASZRc2
|
||||
# DsPbCLPQrFcNdu3NJ9NMrVCDYeKqIE0JLWQJ3M6Jn8w9qez2z8Hc8dOx1ns3KBEr
|
||||
# R9o5xrw6GbRfpr19naNjQrZ28qk7K5H44m/Q7BYgkAk+4uh0yRi0kdRiZNt/owbx
|
||||
# iBhqkCI8vP4T8IcUe/bkH47U5FHGEWdGCFHLhhRUP7wz/n5snP8WnRi9UY41pqdm
|
||||
# yHJn2yFmsdSbeAPAUDrozPDcvJ5M/q8FljUfV1q3/875PbcstvZU3cjnEjpNrkyK
|
||||
# t1yatLcgPcp/IjSufjtoZgFE5wFORlObM2D3lL5TN5BzQ/Myw1Pv26r+dE5px2uM
|
||||
# YJPexMcM3+EyrsyTO1F4lWeL7j1W/gzQaQ8bD/MlJmszbfduR/pzQ+V+DqVmsSl8
|
||||
# MoRjVYnEDcGTVDAZE6zTfTen6106bDVc20HXEtqpSQvf2ICKCZNijrVmzyWIzYS4
|
||||
# sT+kOQ/ZAp7rEkyVfPNrBaleFoPMuGfi6BOdzFuC00yz7Vv/3uVzrCM7LQC/NVV0
|
||||
# CUnYSVgaf5I25lGSDvMmfRxNF7zJ7EMm0L9BX0CpRET0medXh55QH1dUqD79dGMv
|
||||
# sVBlCeZYQi5DGky08CVHWfoEHpPUJkZKUIGy3r54t/xnFeHJV4QeD2PW6WK61l9V
|
||||
# LupcxigIBCU5uA4rqfJMlxwHPw1S9e3vL4IPAgMBAAGjgfIwge8wHwYDVR0jBBgw
|
||||
# FoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYEFFN5v1qqK0rPVIDh2JvA
|
||||
# nfKyA2bLMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MBEGA1UdIAQK
|
||||
# MAgwBgYEVR0gADBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsLmNvbW9kb2Nh
|
||||
# LmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDA0BggrBgEFBQcBAQQoMCYw
|
||||
# JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG9w0B
|
||||
# AQwFAAOCAQEAGIdR3HQhPZyK4Ce3M9AuzOzw5steEd4ib5t1jp5y/uTW/qofnJYt
|
||||
# 7wNKfq70jW9yPEM7wD/ruN9cqqnGrvL82O6je0P2hjZ8FODN9Pc//t64tIrwkZb+
|
||||
# /UNkfv3M0gGhfX34GRnJQisTv1iLuqSiZgR2iJFODIkUzqJNyTKzuugUGrxx8Vvw
|
||||
# QQuYAAoiAxDlDLH5zZI3Ge078eQ6tvlFEyZ1r7uq7z97dzvSxAKRPRkA0xdcOds/
|
||||
# exgNRc2ThZYvXd9ZFk8/Ub3VRRg/7UqO6AZhdCMWtQ1QcydER38QXYkqa4UxFMTo
|
||||
# qWpMgLxqeM+4f452cpkMnf7XkQgWoaNflTCCBfUwggPdoAMCAQICEB2iSDBvmyYY
|
||||
# 0ILgln0z02owDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQI
|
||||
# EwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhl
|
||||
# IFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRp
|
||||
# ZmljYXRpb24gQXV0aG9yaXR5MB4XDTE4MTEwMjAwMDAwMFoXDTMwMTIzMTIzNTk1
|
||||
# OVowfDELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ
|
||||
# MA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSQwIgYD
|
||||
# VQQDExtTZWN0aWdvIFJTQSBDb2RlIFNpZ25pbmcgQ0EwggEiMA0GCSqGSIb3DQEB
|
||||
# AQUAA4IBDwAwggEKAoIBAQCGIo0yhXoYn0nwli9jCB4t3HyfFM/jJrYlZilAhlRG
|
||||
# dDFixRDtsocnppnLlTDAVvWkdcapDlBipVGREGrgS2Ku/fD4GKyn/+4uMyD6DBmJ
|
||||
# qGx7rQDDYaHcaWVtH24nlteXUYam9CflfGqLlR5bYNV+1xaSnAAvaPeX7Wpyvjg7
|
||||
# Y96Pv25MQV0SIAhZ6DnNj9LWzwa0VwW2TqE+V2sfmLzEYtYbC43HZhtKn52BxHJA
|
||||
# teJf7wtF/6POF6YtVbC3sLxUap28jVZTxvC6eVBJLPcDuf4vZTXyIuosB69G2flG
|
||||
# HNyMfHEo8/6nxhTdVZFuihEN3wYklX0Pp6F8OtqGNWHTAgMBAAGjggFkMIIBYDAf
|
||||
# BgNVHSMEGDAWgBRTeb9aqitKz1SA4dibwJ3ysgNmyzAdBgNVHQ4EFgQUDuE6qFM6
|
||||
# MdWKvsG7rWcaA4WtNA4wDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8C
|
||||
# AQAwHQYDVR0lBBYwFAYIKwYBBQUHAwMGCCsGAQUFBwMIMBEGA1UdIAQKMAgwBgYE
|
||||
# VR0gADBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20v
|
||||
# VVNFUlRydXN0UlNBQ2VydGlmaWNhdGlvbkF1dGhvcml0eS5jcmwwdgYIKwYBBQUH
|
||||
# AQEEajBoMD8GCCsGAQUFBzAChjNodHRwOi8vY3J0LnVzZXJ0cnVzdC5jb20vVVNF
|
||||
# UlRydXN0UlNBQWRkVHJ1c3RDQS5jcnQwJQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3Nw
|
||||
# LnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggIBAE1jUO1HNEphpNveaiqM
|
||||
# m/EAAB4dYns61zLC9rPgY7P7YQCImhttEAcET7646ol4IusPRuzzRl5ARokS9At3
|
||||
# WpwqQTr81vTr5/cVlTPDoYMot94v5JT3hTODLUpASL+awk9KsY8k9LOBN9O3ZLCm
|
||||
# I2pZaFJCX/8E6+F0ZXkI9amT3mtxQJmWunjxucjiwwgWsatjWsgVgG10Xkp1fqW4
|
||||
# w2y1z99KeYdcx0BNYzX2MNPPtQoOCwR/oEuuu6Ol0IQAkz5TXTSlADVpbL6fICUQ
|
||||
# DRn7UJBhvjmPeo5N9p8OHv4HURJmgyYZSJXOSsnBf/M6BZv5b9+If8AjntIeQ3pF
|
||||
# McGcTanwWbJZGehqjSkEAnd8S0vNcL46slVaeD68u28DECV3FTSK+TbMQ5Lkuk/x
|
||||
# YpMoJVcp+1EZx6ElQGqEV8aynbG8HArafGd+fS7pKEwYfsR7MUFxmksp7As9V1DS
|
||||
# yt39ngVR5UR43QHesXWYDVQk/fBO4+L4g71yuss9Ou7wXheSaG3IYfmm8SoKC6W5
|
||||
# 9J7umDIFhZ7r+YMp08Ysfb06dy6LN0KgaoLtO0qqlBCk4Q34F8W2WnkzGJLjtXX4
|
||||
# oemOCiUe5B7xn1qHI/+fpFGe+zmAEc3btcSnqIBv5VPU4OOiwtJbGvoyJi1qV3Ac
|
||||
# PKRYLqPzW0sH3DJZ84enGm1YMYICMjCCAi4CAQEwgZAwfDELMAkGA1UEBhMCR0Ix
|
||||
# GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEY
|
||||
# MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSQwIgYDVQQDExtTZWN0aWdvIFJTQSBD
|
||||
# b2RlIFNpZ25pbmcgQ0ECEFii1y2MwP2JzP8h4NTtx0owCQYFKw4DAhoFAKB4MBgG
|
||||
# CisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcC
|
||||
# AQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYE
|
||||
# FPvoURlVLtMyc41aoH1W7jNXhNkUMA0GCSqGSIb3DQEBAQUABIIBACa4ISoVYuy4
|
||||
# LQD5f2XzRDboWCOwR2ClFczB/vOn7uX+RKpbW+vZwllcL0wk0kA4Iotk12yKLAni
|
||||
# K0DkhX8P/Gt5B4hMFaWYKkwTZljITgCEHoAy8vQzpfDUdfJF40R7IIEQLzr2/n5q
|
||||
# Iztv/ApXsPX8SkgEGdikFbBA0i/xtzI8+3sI1QINiRig8xEH/1eOZlR54YHwClvS
|
||||
# 8QhXueb9NbqNN9oKBwx5gRWcOE4I2E5mYAppDDQyhqitbeeY2Pw4Eo5koLM3zTDy
|
||||
# 4/zc+A9lNkAa5eDTavxMHQVqKgO5KomzIYHAdIFnKs85SdntIOr5nSAHnAl6svTh
|
||||
# iJXqSEggdX8=
|
||||
# SIG # End signature block
|
||||
BIN
share/demo.kdbx
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path style="stroke-width:.65502" d="M7.275.645a2.949 2.949 0 0 0-1.404.298c-1.34.571-2.058 2.064-1.918 3.475-.085.269.215.925-.248.816-.77-.119-1.655.327-1.71 1.176-.016 2.092-.004 4.183-.009 6.276-.119.769.329 1.654 1.176 1.712 1.855.012 3.711.006 5.567.004v-1.308H3.297v-6.55h7.861v4.106h1.301c0-1.252.002-2.504.008-3.755.137-.804-.444-1.689-1.309-1.66h-.656c-.021-.693.062-1.395-.09-2.077C10.112 1.7 8.71.688 7.275.645zm-.048 1.314c.465-.001.929.17 1.28.475.869.681.665 1.836.686 2.8H5.32c-.139-.22-.017-.701-.058-1.02-.153-1.14.789-2.292 1.965-2.255zm.097 6.559c-.37-.04-.752.069-1.025.373-.834.75-.195 2.3.928 2.238.736.016 1.37-.659 1.308-1.393-.008-.676-.594-1.153-1.21-1.218z" transform="translate(-.218 .136) scale(1.04251)"/><path style="fill:#000;fill-opacity:1;fill-rule:evenodd;stroke-width:.857645" d="M11.773 18.34c-1.322.064-2.213-1.618-1.424-2.677.676-1.116 2.527-.937 2.994.27.513 1.094-.357 2.434-1.57 2.406zm5.146 2.572v-8.576H6.627v8.576h10.292zm0-10.292c1.038-.032 1.855.99 1.715 1.993-.01 2.84.019 5.68-.014 8.519-.096.979-1.095 1.626-2.034 1.495-3.378-.006-6.757.012-10.135-.009-1.032-.072-1.677-1.125-1.54-2.094.007-2.788-.01-5.577.01-8.365.068-1.003 1.084-1.67 2.038-1.539.432.09.635-.048.526-.498-.025-1.262-.04-2.616.77-3.67 1.263-1.913 4.126-2.424 5.971-1.064 1.326.884 1.959 2.516 1.835 4.071v1.161h.858zm-5.146-4.288c-1.49-.044-2.739 1.385-2.573 2.85v1.438h5.146c-.053-1.126.231-2.4-.575-3.336a2.578 2.578 0 0 0-1.998-.952z" transform="matrix(.99434 0 0 .99434 3.623 .679)"/></svg>
|
||||
|
Before Width: | Height: | Size: 1.5 KiB |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="M12 17a2 2 0 0 1-2-2c0-1.11.89-2 2-2a2 2 0 0 1 2 2 2 2 0 0 1-2 2m6 3V10H6v10h12m0-12a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V10c0-1.11.89-2 2-2h1V6a5 5 0 0 1 5-5 5 5 0 0 1 5 5v2h1m-6-5a3 3 0 0 0-3 3v2h6V6a3 3 0 0 0-3-3z"/></svg>
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="mdi-lock-outline" width="24" height="24" viewBox="0 0 24 24"><path d="M12,17C10.89,17 10,16.1 10,15C10,13.89 10.89,13 12,13A2,2 0 0,1 14,15A2,2 0 0,1 12,17M18,20V10H6V20H18M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6C4.89,22 4,21.1 4,20V10C4,8.89 4.89,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z" /></svg>
|
||||
|
Before Width: | Height: | Size: 307 B After Width: | Height: | Size: 583 B |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M12,3A9,9 0 0,0 3,12H0L4,16L8,12H5A7,7 0 0,1 12,5A7,7 0 0,1 19,12A7,7 0 0,1 12,19C10.5,19 9.09,18.5 7.94,17.7L6.5,19.14C8.04,20.3 9.94,21 12,21A9,9 0 0,0 21,12A9,9 0 0,0 12,3M14,12A2,2 0 0,0 12,10A2,2 0 0,0 10,12A2,2 0 0,0 12,14A2,2 0 0,0 14,12Z" /></svg>
|
||||
|
Before Width: | Height: | Size: 540 B |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M17.81,4.47C17.73,4.47 17.65,4.45 17.58,4.41C15.66,3.42 14,3 12,3C10.03,3 8.15,3.47 6.44,4.41C6.2,4.54 5.9,4.45 5.76,4.21C5.63,3.97 5.72,3.66 5.96,3.53C7.82,2.5 9.86,2 12,2C14.14,2 16,2.47 18.04,3.5C18.29,3.65 18.38,3.95 18.25,4.19C18.16,4.37 18,4.47 17.81,4.47M3.5,9.72C3.4,9.72 3.3,9.69 3.21,9.63C3,9.47 2.93,9.16 3.09,8.93C4.08,7.53 5.34,6.43 6.84,5.66C10,4.04 14,4.03 17.15,5.65C18.65,6.42 19.91,7.5 20.9,8.9C21.06,9.12 21,9.44 20.78,9.6C20.55,9.76 20.24,9.71 20.08,9.5C19.18,8.22 18.04,7.23 16.69,6.54C13.82,5.07 10.15,5.07 7.29,6.55C5.93,7.25 4.79,8.25 3.89,9.5C3.81,9.65 3.66,9.72 3.5,9.72M9.75,21.79C9.62,21.79 9.5,21.74 9.4,21.64C8.53,20.77 8.06,20.21 7.39,19C6.7,17.77 6.34,16.27 6.34,14.66C6.34,11.69 8.88,9.27 12,9.27C15.12,9.27 17.66,11.69 17.66,14.66A0.5,0.5 0 0,1 17.16,15.16A0.5,0.5 0 0,1 16.66,14.66C16.66,12.24 14.57,10.27 12,10.27C9.43,10.27 7.34,12.24 7.34,14.66C7.34,16.1 7.66,17.43 8.27,18.5C8.91,19.66 9.35,20.15 10.12,20.93C10.31,21.13 10.31,21.44 10.12,21.64C10,21.74 9.88,21.79 9.75,21.79M16.92,19.94C15.73,19.94 14.68,19.64 13.82,19.05C12.33,18.04 11.44,16.4 11.44,14.66A0.5,0.5 0 0,1 11.94,14.16A0.5,0.5 0 0,1 12.44,14.66C12.44,16.07 13.16,17.4 14.38,18.22C15.09,18.7 15.92,18.93 16.92,18.93C17.16,18.93 17.56,18.9 17.96,18.83C18.23,18.78 18.5,18.96 18.54,19.24C18.59,19.5 18.41,19.77 18.13,19.82C17.56,19.93 17.06,19.94 16.92,19.94M14.91,22C14.87,22 14.82,22 14.78,22C13.19,21.54 12.15,20.95 11.06,19.88C9.66,18.5 8.89,16.64 8.89,14.66C8.89,13.04 10.27,11.72 11.97,11.72C13.67,11.72 15.05,13.04 15.05,14.66C15.05,15.73 16,16.6 17.13,16.6C18.28,16.6 19.21,15.73 19.21,14.66C19.21,10.89 15.96,7.83 11.96,7.83C9.12,7.83 6.5,9.41 5.35,11.86C4.96,12.67 4.76,13.62 4.76,14.66C4.76,15.44 4.83,16.67 5.43,18.27C5.53,18.53 5.4,18.82 5.14,18.91C4.88,19 4.59,18.87 4.5,18.62C4,17.31 3.77,16 3.77,14.66C3.77,13.46 4,12.37 4.45,11.42C5.78,8.63 8.73,6.82 11.96,6.82C16.5,6.82 20.21,10.33 20.21,14.65C20.21,16.27 18.83,17.59 17.13,17.59C15.43,17.59 14.05,16.27 14.05,14.65C14.05,13.58 13.12,12.71 11.97,12.71C10.82,12.71 9.89,13.58 9.89,14.65C9.89,16.36 10.55,17.96 11.76,19.16C12.71,20.1 13.62,20.62 15.03,21C15.3,21.08 15.45,21.36 15.38,21.62C15.33,21.85 15.12,22 14.91,22Z" /></svg>
|
||||
|
Before Width: | Height: | Size: 2.4 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="M6 2.58c-1.11 0-2 .89-2 2v1.572l-1.951-.007a1.99 1.99 0 0 0-2 2v12c0 1.11.89 2 2 2h16a1.99 1.99 0 0 0 2-2l-.01-1.565H22c1.11 0 2-.89 2-2v-10c0-1.11-.89-2-2-2h-8l-2-2H6zm0 4h16v10H6v-10zm10 2v2h-2v2h2v2h2v-2h2v-2h-2v-2h-2zM2.049 10.145 4 10.158v6.422c0 1.11.89 2 2 2h12.053l-.004 1.565h-16v-10z"/></svg>
|
||||
|
Before Width: | Height: | Size: 374 B |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M13.78 15.3L19.78 21.3L21.89 19.14L15.89 13.14L13.78 15.3M17.5 10.1C17.11 10.1 16.69 10.05 16.36 9.91L4.97 21.25L2.86 19.14L10.27 11.74L8.5 9.96L7.78 10.66L6.33 9.25V12.11L5.63 12.81L2.11 9.25L2.81 8.55H5.62L4.22 7.14L7.78 3.58C8.95 2.41 10.83 2.41 12 3.58L9.89 5.74L11.3 7.14L10.59 7.85L12.38 9.63L14.2 7.75C14.06 7.42 14 7 14 6.63C14 4.66 15.56 3.11 17.5 3.11C18.09 3.11 18.61 3.25 19.08 3.53L16.41 6.2L17.91 7.7L20.58 5.03C20.86 5.5 21 6 21 6.63C21 8.55 19.45 10.1 17.5 10.1Z" /></svg>
|
||||
|
Before Width: | Height: | Size: 773 B |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M12,1A5,5 0 0,0 7,6V8H6A2,2 0 0,0 4,10V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V10A2,2 0 0,0 18,8H17V6A5,5 0 0,0 12,1M12,2.9C13.71,2.9 15.1,4.29 15.1,6V8H8.9V6C8.9,4.29 10.29,2.9 12,2.9M12.19,10.5C13.13,10.5 13.88,10.71 14.42,11.12C14.96,11.54 15.23,12.1 15.23,12.8C15.23,13.24 15.08,13.63 14.79,14C14.5,14.36 14.12,14.64 13.66,14.85C13.4,15 13.23,15.15 13.14,15.32C13.05,15.5 13,15.72 13,16H11C11,15.5 11.1,15.16 11.29,14.92C11.5,14.68 11.84,14.4 12.36,14.08C12.62,13.94 12.83,13.76 13,13.54C13.14,13.33 13.22,13.08 13.22,12.8C13.22,12.5 13.13,12.28 12.95,12.11C12.77,11.93 12.5,11.85 12.19,11.85C11.92,11.85 11.7,11.92 11.5,12.06C11.34,12.2 11.24,12.41 11.24,12.69H9.27C9.22,12 9.5,11.4 10.05,11.04C10.59,10.68 11.3,10.5 12.19,10.5M11,17H13V19H11V17Z" /></svg>
|
||||
|
Before Width: | Height: | Size: 1.0 KiB |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M22 13C22 13.53 21.79 14.04 21.41 14.41L21 14.83C20.91 11.97 18.84 9.62 16.11 9.11L11 4H4V11L9.11 16.11C9.62 18.84 11.97 20.91 14.83 21L14.41 21.41C14.04 21.79 13.53 22 13 22C12.47 22 11.97 21.79 11.59 21.42L2.59 12.42C2.21 12.04 2 11.53 2 11V4C2 2.9 2.9 2 4 2H11C11.53 2 12.04 2.21 12.41 2.58L21.41 11.58C21.79 11.96 22 12.47 22 13M5 6.5C5 7.33 5.67 8 6.5 8S8 7.33 8 6.5 7.33 5 6.5 5 5 5.67 5 6.5M15.11 10.61C12.61 10.61 10.61 12.61 10.61 15.11S12.61 19.61 15.11 19.61C16 19.61 16.8 19.36 17.5 18.93L20.61 22L22 20.61L18.92 17.5C19.36 16.82 19.61 16 19.61 15.11C19.61 12.61 17.61 10.61 15.11 10.61M15.11 12.61C16.5 12.61 17.61 13.73 17.61 15.11S16.5 17.61 15.11 17.61 12.61 16.5 12.61 15.11 13.73 12.61 15.11 12.61" /></svg>
|
||||
|
Before Width: | Height: | Size: 1010 B |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M21.41 11.58L12.41 2.58A2 2 0 0 0 11 2H4A2 2 0 0 0 2 4V11A2 2 0 0 0 2.59 12.42L11.59 21.42A2 2 0 0 0 13 22A2 2 0 0 0 14.41 21.41L21.41 14.41A2 2 0 0 0 22 13A2 2 0 0 0 21.41 11.58M13 20L4 11V4H11L20 13M6.5 5A1.5 1.5 0 1 1 5 6.5A1.5 1.5 0 0 1 6.5 5Z" /></svg>
|
||||
|
Before Width: | Height: | Size: 542 B |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M6,19A2,2 0 0,0 8,21H16A2,2 0 0,0 18,19V7H6V19M8,9H16V19H8V9M15.5,4L14.5,3H9.5L8.5,4H5V6H19V4H15.5Z" /></svg>
|
||||
|
Before Width: | Height: | Size: 394 B |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M17.63,5.84C17.27,5.33 16.67,5 16,5H5A2,2 0 0,0 3,7V17A2,2 0 0,0 5,19H16C16.67,19 17.27,18.66 17.63,18.15L22,12L17.63,5.84Z" /></svg>
|
||||
|
Before Width: | Height: | Size: 418 B |
@@ -1 +1 @@
|
||||
<svg viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M41 6H7c-.6 0-1 .4-1 1v35h36V7c0-.6-.4-1-1-1z" style="fill:#cfd8dc;fill-rule:nonzero"/><path style="fill:#263238" d="M8 13h32v27H8z"/><path d="M.046-.081v-.138l.343-.135-.343-.133v-.138l.492.213v.117l-.492.214z" style="fill:#76ff03;fill-rule:nonzero" transform="translate(12.703 31.235) scale(22.14058)"/><path style="fill:#76ff03;fill-rule:nonzero" d="M-.009.109h.57v.089h-.57z" transform="translate(25.632 31.235) scale(22.14058)"/><circle cx="13.5" cy="9.5" r="1.5" style="fill:#90a4ae"/><circle cx="9.5" cy="9.5" r="1.5" style="fill:#90a4ae"/><g><path d="m22 45-4-4V21h12v8l-2 2 2 2v2l-2 2 2 2v2l-4 4h-4z" style="fill:#ffa000;fill-rule:nonzero" transform="matrix(.43899 0 0 .59862 -2.036 19.721)"/><path d="M38 7.8c-.5-1.8-2-3.1-3.7-3.6C31.9 3.7 28.2 3 24 3c-4.2 0-7.9.7-10.3 1.2C12 4.7 10.5 6 10 7.8c-.5 1.7-1 4.1-1 6.7 0 2.6.5 5 1 6.7.5 1.8 1.9 3.1 3.7 3.5 2.4.6 6.1 1.3 10.3 1.3 4.2 0 7.9-.7 10.3-1.2 1.8-.4 3.2-1.8 3.7-3.5s1-4.1 1-6.7c0-2.7-.5-5.1-1-6.8zM29 13H19c-1.1 0-2-.9-2-2V9c0-.6 3.1-1 7-1s7 .4 7 1v2c0 1.1-.9 2-2 2z" style="fill:#ffa000;fill-rule:nonzero" transform="matrix(.43899 0 0 .59862 -2.036 19.721)"/><path style="fill:#d68600" d="M23.559 26h2v19h-2z" transform="translate(-6.481 19.721) scale(.59862)"/></g></svg>
|
||||
<svg viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><g><path d="M41 6H7c-.6.0-1 .4-1 1V42H42V7C42 6.4 41.6 6 41 6z" style="fill:#cfd8dc;fill-rule:nonzero"/></g><rect x="8" y="13" width="32" height="27" style="fill:#263238"/><g transform="matrix(1.00639,0,0,1.00639,12.7027,31.2351)"><g><text x="0" y="0" style="font-family:roboto-bold,roboto;font-weight:700;font-size:22px;fill:#76ff03">>_</text></g></g><g><circle cx="13.5" cy="9.5" r="1.5" style="fill:#90a4ae"/><circle cx="9.5" cy="9.5" r="1.5" style="fill:#90a4ae"/></g><g transform="matrix(1,0,0,1,1.02128,-0.291791)"><g id="polygon2" transform="matrix(0.438989,0,0,0.598621,-3.05709,20.013)"><path d="M22 45l-4-4V21H30v8l-2 2 2 2v2l-2 2 2 2v2l-4 4H22z" style="fill:#ffa000;fill-rule:nonzero"/></g><g id="path4" transform="matrix(0.438989,0,0,0.598621,-3.05709,20.013)"><path d="M38 7.8c-.5-1.8-2-3.1-3.7-3.6C31.9 3.7 28.2 3 24 3s-7.9.7-10.3 1.2C12 4.7 10.5 6 10 7.8c-.5 1.7-1 4.1-1 6.7s.5 5 1 6.7c.5 1.8 1.9 3.1 3.7 3.5C16.1 25.3 19.8 26 24 26S31.9 25.3 34.3 24.8C36.1 24.4 37.5 23 38 21.3s1-4.1 1-6.7c0-2.7-.5-5.1-1-6.8zM29 13H19c-1.1.0-2-.9-2-2V9c0-.6 3.1-1 7-1s7 .4 7 1v2C31 12.1 30.1 13 29 13z" style="fill:#ffa000;fill-rule:nonzero"/></g><g id="rect8" transform="matrix(0.598621,0,0,0.598621,-7.50244,20.013)"><rect x="23.559" y="26" width="2" height="19" style="fill:#d68600"/></g></g></svg>
|
||||
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.5 KiB |
@@ -1 +1 @@
|
||||
<svg viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><path d="M41 6H7c-.6 0-1 .4-1 1v35h36V7c0-.6-.4-1-1-1z" style="fill:#cfd8dc;fill-rule:nonzero"/><path style="fill:#263238" d="M8 13h32v27H8z"/><path d="M.046-.081v-.138l.343-.135-.343-.133v-.138l.492.213v.117l-.492.214z" style="fill:#76ff03;fill-rule:nonzero" transform="translate(12.703 31.235) scale(22.14058)"/><path style="fill:#76ff03;fill-rule:nonzero" d="M-.009.109h.57v.089h-.57z" transform="translate(25.632 31.235) scale(22.14058)"/><g><circle cx="13.5" cy="9.5" r="1.5" style="fill:#90a4ae"/><circle cx="9.5" cy="9.5" r="1.5" style="fill:#90a4ae"/></g></svg>
|
||||
<svg viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"><g><path d="M41 6H7c-.6.0-1 .4-1 1V42H42V7C42 6.4 41.6 6 41 6z" style="fill:#cfd8dc;fill-rule:nonzero"/></g><rect x="8" y="13" width="32" height="27" style="fill:#263238"/><g transform="matrix(1.00639,0,0,1.00639,12.7027,31.2351)"><g><text x="0" y="0" style="font-family:roboto-bold,roboto;font-weight:700;font-size:22px;fill:#76ff03">>_</text></g></g><g><circle cx="13.5" cy="9.5" r="1.5" style="fill:#90a4ae"/><circle cx="9.5" cy="9.5" r="1.5" style="fill:#90a4ae"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 715 B After Width: | Height: | Size: 703 B |
@@ -15,7 +15,6 @@
|
||||
<file>application/scalable/actions/configure.svg</file>
|
||||
<file>application/scalable/actions/database-change-key.svg</file>
|
||||
<file>application/scalable/actions/database-lock.svg</file>
|
||||
<file>application/scalable/actions/database-lock-all.svg</file>
|
||||
<file>application/scalable/actions/database-merge.svg</file>
|
||||
<file>application/scalable/actions/dialog-close.svg</file>
|
||||
<file>application/scalable/actions/dialog-ok.svg</file>
|
||||
@@ -35,23 +34,18 @@
|
||||
<file>application/scalable/actions/edit-clear-locationbar-rtl.svg</file>
|
||||
<file>application/scalable/actions/entry-clone.svg</file>
|
||||
<file>application/scalable/actions/entry-delete.svg</file>
|
||||
<file>application/scalable/actions/entry-restore.svg</file>
|
||||
<file>application/scalable/actions/entry-edit.svg</file>
|
||||
<file>application/scalable/actions/entry-new.svg</file>
|
||||
<file>application/scalable/actions/favicon-download.svg</file>
|
||||
<file>application/scalable/actions/fingerprint.svg</file>
|
||||
<file>application/scalable/actions/getting-started.svg</file>
|
||||
<file>application/scalable/actions/group-delete.svg</file>
|
||||
<file>application/scalable/actions/group-edit.svg</file>
|
||||
<file>application/scalable/actions/group-clone.svg</file>
|
||||
<file>application/scalable/actions/group-empty-trash.svg</file>
|
||||
<file>application/scalable/actions/group-new.svg</file>
|
||||
<file>application/scalable/actions/hammer-wrench.svg</file>
|
||||
<file>application/scalable/actions/health.svg</file>
|
||||
<file>application/scalable/actions/help-about.svg</file>
|
||||
<file>application/scalable/actions/hibp.svg</file>
|
||||
<file>application/scalable/actions/key-enter.svg</file>
|
||||
<file>application/scalable/actions/lock-question.svg</file>
|
||||
<file>application/scalable/actions/keyboard-shortcuts.svg</file>
|
||||
<file>application/scalable/actions/message-close.svg</file>
|
||||
<file>application/scalable/actions/move-down.svg</file>
|
||||
@@ -64,7 +58,7 @@
|
||||
<file>application/scalable/actions/password-generator.svg</file>
|
||||
<file>application/scalable/actions/password-show-off.svg</file>
|
||||
<file>application/scalable/actions/password-show-on.svg</file>
|
||||
<file>application/scalable/actions/refresh.svg</file>
|
||||
<file>application/scalable/actions/refresh.svg</file>
|
||||
<file>application/scalable/actions/reports.svg</file>
|
||||
<file>application/scalable/actions/reports-exclude.svg</file>
|
||||
<file>application/scalable/actions/sort-alphabetical-ascending.svg</file>
|
||||
@@ -73,14 +67,12 @@
|
||||
<file>application/scalable/actions/system-help.svg</file>
|
||||
<file>application/scalable/actions/system-search.svg</file>
|
||||
<file>application/scalable/actions/system-software-update.svg</file>
|
||||
<file>application/scalable/actions/tag.svg</file>
|
||||
<file>application/scalable/actions/tag-search.svg</file>
|
||||
<file>application/scalable/actions/trash.svg</file>
|
||||
<file>application/scalable/actions/url-copy.svg</file>
|
||||
<file>application/scalable/actions/user-guide.svg</file>
|
||||
<file>application/scalable/actions/username-copy.svg</file>
|
||||
<file>application/scalable/actions/view-history.svg</file>
|
||||
<file>application/scalable/actions/web.svg</file>
|
||||
|
||||
<file>application/scalable/apps/freedesktop.svg</file>
|
||||
<file>application/scalable/apps/internet-web-browser.svg</file>
|
||||
<file>application/scalable/apps/keepassxc.svg</file>
|
||||
|
||||
@@ -18,4 +18,4 @@ minify -o icons/database --match=.svg icons/database
|
||||
|
||||
# Crush PNG's
|
||||
echo "Crushing PNG's..."
|
||||
find . -iname '*.png' -exec pngcrush -ow -brute {} \;
|
||||
find "." -iname '*png' -exec pngcrush -ow -brute {} \;
|
||||
|
||||
@@ -23,7 +23,7 @@ GenericName[pl]=Menedżer haseł
|
||||
GenericName[pt_BR]=Gerenciador de Senhas
|
||||
GenericName[pt]=Gestor de palavras-passe
|
||||
GenericName[ro]=Manager de parole
|
||||
GenericName[ru]=Менеджер паролей
|
||||
GenericName[ru]=менеджер паролей
|
||||
GenericName[sk]=Správca hesiel
|
||||
GenericName[sv]=Lösenordshanterare
|
||||
GenericName[th]=แอพจัดการรหัสผ่าน
|
||||
@@ -34,7 +34,6 @@ GenericName[zh_TW]=密碼管理員
|
||||
Comment=Community-driven port of the Windows application “KeePass Password Safe”
|
||||
Comment[da]=Fællesskabsdrevet port af Windows-programmet “KeePass Password Safe”
|
||||
Comment[et]=Kogukonna arendatav port Windowsi programmist KeePass Password Safe
|
||||
Comment[ru]=Разработанный сообществом порт Windows-приложения KeePass Password Safe
|
||||
Exec=keepassxc %f
|
||||
TryExec=keepassxc
|
||||
Icon=keepassxc
|
||||
|
||||
@@ -15,14 +15,14 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
file(GLOB TRANSLATION_FILES *.ts)
|
||||
get_filename_component(TRANSLATION_EN_ABS keepassxc_en.ts ABSOLUTE)
|
||||
list(REMOVE_ITEM TRANSLATION_FILES keepassxc_en.ts)
|
||||
get_filename_component(TRANSLATION_EN_ABS keepassx_en.ts ABSOLUTE)
|
||||
list(REMOVE_ITEM TRANSLATION_FILES keepassx_en.ts)
|
||||
list(REMOVE_ITEM TRANSLATION_FILES ${TRANSLATION_EN_ABS})
|
||||
message(STATUS "Including translations...\n")
|
||||
|
||||
qt5_add_translation(QM_FILES ${TRANSLATION_FILES})
|
||||
|
||||
if(WIN32)
|
||||
if(MINGW)
|
||||
file(GLOB QTBASE_TRANSLATIONS ${Qt5_PREFIX}/share/qt5/translations/qtbase_*.qm)
|
||||
elseif(APPLE OR KEEPASSXC_DIST_APPIMAGE)
|
||||
file(GLOB QTBASE_TRANSLATIONS
|
||||
@@ -35,7 +35,7 @@ set(QM_FILES ${QM_FILES} ${QTBASE_TRANSLATIONS})
|
||||
install(FILES ${QM_FILES} DESTINATION ${DATA_INSTALL_DIR}/translations)
|
||||
|
||||
# Add keepassx_en.qm as a fallback for uncommon english locales
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/keepassxc_en_US.qm DESTINATION ${DATA_INSTALL_DIR}/translations RENAME keepassxc_en.qm)
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/keepassx_en_US.qm DESTINATION ${DATA_INSTALL_DIR}/translations RENAME keepassx_en.qm)
|
||||
|
||||
add_custom_target(translations DEPENDS ${QM_FILES})
|
||||
add_dependencies(${PROGNAME} translations)
|
||||
|
||||
@@ -137,7 +137,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>You must restart the application to set the new language. Would you like to restart now?</source>
|
||||
<translation>يجب إعادة تشغيل التطبيق لتعيين اللغة الجديدة. هل تريد إعادة التشغيل الآن ؟</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Monochrome</source>
|
||||
@@ -233,7 +233,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Remember database key files and security dongles</source>
|
||||
<translation>تذكر ملفات مفاتيح قاعدة البيانات وأجهزة الوصول الآمن</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Check for updates at application startup once per week</source>
|
||||
@@ -241,7 +241,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Include beta releases when checking for updates</source>
|
||||
<translation>ضمّن النسخ التجريبية عند البحث عن التحديثات</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Language:</source>
|
||||
@@ -307,19 +307,19 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Automatically launch KeePassXC at system startup</source>
|
||||
<translation>قم بتشغيل KeePassXC تلقائيًا عند بدء تشغيل النظام</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Safely save database files (disable if experiencing problems with Dropbox, etc.)</source>
|
||||
<translation>احفظ ملفات قاعدة البيانات بأمان (قم بتعطيلها إذا كنت تواجه مشكلات مع Dropbox ، وما إلى ذلك)</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>User Interface</source>
|
||||
<translation>واجهة المستخدم</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toolbar button style:</source>
|
||||
<translation>نمط أزرار شريط الأدوات</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use monospaced font for notes</source>
|
||||
@@ -444,11 +444,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Require password repeat when it is visible</source>
|
||||
<translation>يلزم تكرار كلمة المرور عندما تكون مرئية</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide passwords when editing them</source>
|
||||
<translation>إخفاء كلمات المرور عند تعديلها</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use placeholder for empty password fields</source>
|
||||
@@ -590,11 +590,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Allow Selected</source>
|
||||
<translation>السماح بالمُحدد</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Deny All</source>
|
||||
<translation>منع الكل</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Disable for this site</source>
|
||||
@@ -1793,7 +1793,7 @@ If you keep this number, your database may be too easy to crack!</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete Recycle Bin</source>
|
||||
<translation>حذف سلة المحذوفات</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do you want to delete the current recycle bin and all its contents?
|
||||
@@ -1833,7 +1833,7 @@ This action is not reversible.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Certificates</source>
|
||||
<translation>الشهادات</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source> > </source>
|
||||
@@ -1189,11 +1189,11 @@ Còpia de seguretat de la base de dades situada a %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database save is already in progress.</source>
|
||||
<translation>El desat de la base de dades està en curs.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not save, database has not been initialized!</source>
|
||||
<translation>No s'ha pogut desar, la base de dades no ha estat inicialitzada!</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1715,7 +1715,7 @@ If you keep this number, your database may be too easy to crack!</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Don't expose this database</source>
|
||||
<translation>No exposis aquesta base de dades</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expose entries under this group:</source>
|
||||
@@ -1786,11 +1786,11 @@ If you keep this number, your database may be too easy to crack!</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Maximum size of history per entry</source>
|
||||
<translation>Maximitzar el tamany de l'històric per entrada</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete Recycle Bin</source>
|
||||
<translation>Netejar paperera</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do you want to delete the current recycle bin and all its contents?
|
||||
@@ -2134,7 +2134,7 @@ Voleu deshabilitar el desat segur i provar-ho un altre cop?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This database is opened in read-only mode. Autosave is disabled.</source>
|
||||
<translation>Aquesta base de dades s'ha obert en mode de només lectura. El desat automàtic està deshabilitat.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save database backup</source>
|
||||
@@ -3648,7 +3648,7 @@ If this reoccurs, then your database file may be corrupt.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to calculate database key</source>
|
||||
<translation>Impossible calcular la clau de base dades</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to issue challenge-response: %1</source>
|
||||
@@ -3663,7 +3663,7 @@ If this reoccurs, then your database file may be corrupt.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to calculate database key</source>
|
||||
<translation>Impossible calcular la clau de base dades</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -4194,7 +4194,7 @@ If this reoccurs, then your database file may be corrupt.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to calculate database key</source>
|
||||
<translation>Impossible calcular la clau de base dades</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -4623,7 +4623,7 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
|
||||
</message>
|
||||
<message>
|
||||
<source>&Merge From Database…</source>
|
||||
<translation>Fusiona des d'una base de dades…</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&New Entry…</source>
|
||||
@@ -4803,7 +4803,7 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
|
||||
</message>
|
||||
<message>
|
||||
<source>Don't show again for this version</source>
|
||||
<translation>No mostrar un altre cop per a aquesta versió</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Restart Application?</source>
|
||||
@@ -4815,7 +4815,7 @@ Podeu esperar alguns errors i incidències menors. Aquesta versió no està pens
|
||||
</message>
|
||||
<message>
|
||||
<source>Perform Auto-Type Sequence</source>
|
||||
<translation>Fes un seqüència d'autocompleció</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>{USERNAME}</source>
|
||||
@@ -6060,11 +6060,11 @@ Available commands:
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to save database to file : %1</source>
|
||||
<translation>No s'ha pogut desar la base de dades al fitxer: %1</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to save database to file: %1</source>
|
||||
<translation>No s'ha pogut desar la base de dades al fitxer: %1</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Successfully recycled entry %1.</source>
|
||||
@@ -6138,7 +6138,7 @@ Available commands:
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to save the database: %1.</source>
|
||||
<translation>No s'ha pogut desar la base de dades: %1</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Successfully created new database.</source>
|
||||
@@ -430,7 +430,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Database lock timeout seconds</source>
|
||||
<translation>Timeout for databaselåsning sekunder</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source> min</source>
|
||||
@@ -800,11 +800,11 @@ chrome-laptop.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Returns expired credentials. String [expired] is added to the title.</source>
|
||||
<translation>Returnerer udløbne legitimationsoplysninger. Strengen [expired] tilføjes til titlen.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Allow returning expired credentials</source>
|
||||
<translation>Tillad returnering af udløbne legitimationsoplysninger</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>All databases connected to the extension will return matching credentials.</source>
|
||||
@@ -1176,11 +1176,11 @@ Backup database located at %2</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not save, database does not point to a valid file.</source>
|
||||
<translation>Kunne ikke gemme, database peger ikke på en gyldig fil.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not save, database file is read-only.</source>
|
||||
<translation>Kunne ikke gemme, databasefilen er skrivebeskyttet.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database file has unmerged changes.</source>
|
||||
@@ -1197,11 +1197,11 @@ Backup database located at %2</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database save is already in progress.</source>
|
||||
<translation>Database er allerede ved at blive gemt.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not save, database has not been initialized!</source>
|
||||
<translation>Kunne ikke gemme, databasen er ikke blevet initialiseret!</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1239,11 +1239,11 @@ Backup database located at %2</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to open key file: %1</source>
|
||||
<translation>Kunne ikke åbne nøglefil: %1</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unlock KeePassXC Database</source>
|
||||
<translation>Lås op for KeePassXC Database</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter Password:</source>
|
||||
@@ -1279,21 +1279,18 @@ Backup database located at %2</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>TouchID for Quick Unlock</source>
|
||||
<translation>TouchID til Hurtigoplåsning</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unlock failed and no password given</source>
|
||||
<translation>Oplåsning mislykkedes, og der er ikke angivet nogen adgangskode</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unlocking the database failed and you did not enter a password.
|
||||
Do you want to retry with an "empty" password instead?
|
||||
|
||||
To prevent this error from appearing, you must go to "Database Settings / Security" and reset your password.</source>
|
||||
<translation>Oplåsningen af databasen mislykkedes, og du indtastede ikke en adgangskode.
|
||||
Vil du prøve igen med en "tom" adgangskode i stedet?
|
||||
|
||||
For at forhindre, at denne fejl vises, skal du gå til "Databaseindstillinger / Sikkerhed" og nulstille din adgangskode.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Retry with empty password</source>
|
||||
@@ -1698,7 +1695,7 @@ Hvis du beholder dette antal, så kan din database være nem af knække!</transl
|
||||
</message>
|
||||
<message>
|
||||
<source>Database format</source>
|
||||
<translation>Databaseformat</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Encryption algorithm</source>
|
||||
@@ -1972,7 +1969,7 @@ Det er helt sikkert en fejl. Rapportér det venligst til udviklerne.</translatio
|
||||
</message>
|
||||
<message>
|
||||
<source>You are about to export your database to an unencrypted file. This will leave your passwords and sensitive information vulnerable! Are you sure you want to continue?</source>
|
||||
<translation>Du er ved at eksportere din database til en ukrypteret fil. Dette vil gøre dine adgangskoder og følsomme oplysninger sårbare! Er du sikker på, at du vil fortsætte?</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open OPVault</source>
|
||||
@@ -2157,15 +2154,15 @@ Så sikre gem fra og prøv igen?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This database is opened in read-only mode. Autosave is disabled.</source>
|
||||
<translation>Denne database åbnes i skrivebeskyttet tilstand. Automatisk lagring er deaktiveret.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save database backup</source>
|
||||
<translation>Gem sikkerhedskopi af database</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not find database file: %1</source>
|
||||
<translation>Kunne ikke finde databasefil: %1</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2280,11 +2277,11 @@ Så sikre gem fra og prøv igen?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unsaved Changes</source>
|
||||
<translation>Ikke-gemte ændringer</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Would you like to save changes to this entry?</source>
|
||||
<translation>Ønsker du at gemme ændringer til denne post?</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>[PROTECTED] Press Reveal to view or edit</source>
|
||||
@@ -2720,7 +2717,7 @@ Unfortunately, any changes made have been lost.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Select attachment file</source>
|
||||
<translation>Vælg vedhæftningsfil</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -3344,7 +3341,7 @@ Are you sure to add this file?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Attached files</source>
|
||||
<translation>Vedhæftede filer</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Entry size</source>
|
||||
@@ -3352,7 +3349,7 @@ Are you sure to add this file?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Has attachments</source>
|
||||
<translation>Har vedhæftninger</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Has TOTP one-time password</source>
|
||||
@@ -3483,7 +3480,7 @@ Are you sure to add this file?</source>
|
||||
<message>
|
||||
<source>Has attachments</source>
|
||||
<comment>Entry attachment icon toggle</comment>
|
||||
<translation>Har vedhæftninger</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Has TOTP</source>
|
||||
@@ -3526,7 +3523,7 @@ Are you sure to add this file?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unlock to show</source>
|
||||
<translation>Lås op for at vise</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>None</source>
|
||||
@@ -3582,7 +3579,7 @@ Are you sure to add this file?</source>
|
||||
<name>HibpDownloader</name>
|
||||
<message>
|
||||
<source>Online password validation failed</source>
|
||||
<translation>Online validering af adgangskode mislykkedes</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -3634,7 +3631,7 @@ You can enable the DuckDuckGo website icon service in the security section of th
|
||||
</message>
|
||||
<message>
|
||||
<source>Downloading favicons (%1/%2)...</source>
|
||||
<translation>Downloader favicons (%1/%2)...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -4397,7 +4394,7 @@ Are you sure you want to continue with this file?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Note: Do NOT use a file that may change as that will prevent you from unlocking your database.</source>
|
||||
<translation>Bemærk: Brug IKKE en fil, der kan ændre sig, da det vil forhindre dig i at låse din database op.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse…</source>
|
||||
@@ -4612,7 +4609,7 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
</message>
|
||||
<message>
|
||||
<source>&Recent Databases</source>
|
||||
<translation>&Seneste databaser</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Entries</source>
|
||||
@@ -4636,11 +4633,11 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
</message>
|
||||
<message>
|
||||
<source>&Check for Updates</source>
|
||||
<translation>&Kontroller for opdateringer</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Open Database…</source>
|
||||
<translation>&Åbn database...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Save Database</source>
|
||||
@@ -4652,11 +4649,11 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
</message>
|
||||
<message>
|
||||
<source>&New Database…</source>
|
||||
<translation>&Ny database...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Merge From Database…</source>
|
||||
<translation>&Flet fra database...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&New Entry…</source>
|
||||
@@ -4672,19 +4669,19 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
</message>
|
||||
<message>
|
||||
<source>&New Group…</source>
|
||||
<translation>&Ny gruppe...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Edit Group…</source>
|
||||
<translation>&Rediger gruppe...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Delete Group…</source>
|
||||
<translation>&Slet gruppe...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Download All &Favicons…</source>
|
||||
<translation>Download alle &Favicons...</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sa&ve Database As…</source>
|
||||
@@ -4692,7 +4689,7 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
</message>
|
||||
<message>
|
||||
<source>Database &Security…</source>
|
||||
<translation>Database&sikkerhed…</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database &Reports...</source>
|
||||
@@ -4704,7 +4701,7 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
</message>
|
||||
<message>
|
||||
<source>&Database Settings…</source>
|
||||
<translation>&Databaseindstillinger…</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Clone Entry…</source>
|
||||
@@ -4740,7 +4737,7 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
</message>
|
||||
<message>
|
||||
<source>&Lock Databases</source>
|
||||
<translation>&Lås databaser</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&CSV File…</source>
|
||||
@@ -4768,7 +4765,7 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
</message>
|
||||
<message>
|
||||
<source>Show QR Code</source>
|
||||
<translation>Vis QR-kode</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set up TOTP…</source>
|
||||
@@ -4776,7 +4773,7 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
</message>
|
||||
<message>
|
||||
<source>Report a &Bug</source>
|
||||
<translation>Rapportér en &fejl</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Getting Started Guide</source>
|
||||
@@ -4784,7 +4781,7 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
</message>
|
||||
<message>
|
||||
<source>&Online Help</source>
|
||||
<translation>Online hjælp</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to online documentation</source>
|
||||
@@ -4808,35 +4805,35 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
</message>
|
||||
<message>
|
||||
<source>Compact Mode</source>
|
||||
<translation>Kompakt tilstand</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Automatic</source>
|
||||
<translation>Automatisk</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Light</source>
|
||||
<translation>Lyst</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Dark</source>
|
||||
<translation>Mørkt</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Classic (Platform-native)</source>
|
||||
<translation>Klassisk</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show Toolbar</source>
|
||||
<translation>Vis værktøjsbjælke</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show Preview Panel</source>
|
||||
<translation>Vis forhåndsvisningspanel</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Don't show again for this version</source>
|
||||
<translation>Vis ikke igen for denne version</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Restart Application?</source>
|
||||
@@ -4868,7 +4865,7 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
</message>
|
||||
<message>
|
||||
<source>Always on Top</source>
|
||||
<translation>Altid øverst</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide Usernames</source>
|
||||
@@ -4887,7 +4884,7 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
</message>
|
||||
<message>
|
||||
<source>Edit database settings</source>
|
||||
<translation>Rediger databaseindstillinger</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unlock database</source>
|
||||
@@ -4895,7 +4892,7 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
</message>
|
||||
<message>
|
||||
<source>Unlock database to show more information</source>
|
||||
<translation>Lås database op for at vise mere information</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Lock database</source>
|
||||
@@ -5052,7 +5049,7 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
<name>NixUtils</name>
|
||||
<message>
|
||||
<source>Password Manager</source>
|
||||
<translation>Adgangskodeadministrator</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -5224,11 +5221,11 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
<name>PasswordEdit</name>
|
||||
<message>
|
||||
<source>Passwords do not match</source>
|
||||
<translation>Adgangskoder matcher ikke</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Passwords match so far</source>
|
||||
<translation>Adgangskoderne matcher indtil videre</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toggle Password (%1)</source>
|
||||
@@ -5240,7 +5237,7 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
</message>
|
||||
<message>
|
||||
<source>Warning: Caps Lock enabled!</source>
|
||||
<translation>Advarsel: Caps Lock aktiveret!</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -5271,7 +5268,7 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
</message>
|
||||
<message>
|
||||
<source>Repeat password field</source>
|
||||
<translation>Gentag feltet for adgangskode</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -5403,7 +5400,7 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
</message>
|
||||
<message>
|
||||
<source>Generated password</source>
|
||||
<translation>Genereret adgangskode</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Upper-case letters</source>
|
||||
@@ -5431,11 +5428,11 @@ Forvent nogle fejl og mindre problemer. Denne version er ikke beregnet til produ
|
||||
</message>
|
||||
<message>
|
||||
<source>Hex Passwords</source>
|
||||
<translation>Hex-adgangskoder</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password length</source>
|
||||
<translation>Længde af adgangskode</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Word Case:</source>
|
||||
@@ -6326,7 +6323,7 @@ Kerne: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Adds a new group to a database.</source>
|
||||
<translation>Tilføj en ny gruppe til en database</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Path of the group to add.</source>
|
||||
@@ -6366,7 +6363,7 @@ Kerne: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Close the currently opened database.</source>
|
||||
<translation>Luk den aktuelt åbne database.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Display this help.</source>
|
||||
@@ -6482,7 +6479,7 @@ Kerne: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open a database.</source>
|
||||
<translation>Åbn en database.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Path of the group to remove.</source>
|
||||
@@ -6498,19 +6495,19 @@ Kerne: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Successfully deleted group %1.</source>
|
||||
<translation>Slettede gruppe %1.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to open database file %1: not found</source>
|
||||
<translation>Det lykkedes ikke at åbne databasefil %1: ikke fundet</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to open database file %1: not a plain file</source>
|
||||
<translation>Det lykkedes ikke at åbne databasefil %1: ikke en almindelig fil</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to open database file %1: not readable</source>
|
||||
<translation>Det lykkedes ikke at åbne databasefil %1: ulæselig</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter password to unlock %1: </source>
|
||||
@@ -6566,7 +6563,7 @@ Kerne: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy an entry's attribute to the clipboard.</source>
|
||||
<translation>Kopierer en posts parameter til udklipsholderen.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>ERROR: Please specify one of --attribute or --totp, not both.</source>
|
||||
@@ -6780,15 +6777,15 @@ Please consider generating a new key file.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>lock all open databases</source>
|
||||
<translation>lås alle åbne databaser</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Locked databases.</source>
|
||||
<translation>Låste databaser.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database failed to lock.</source>
|
||||
<translation>Låsning af database mislykkedes.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -7034,7 +7031,7 @@ Please consider generating a new key file.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>The database was modified, but the changes have not yet been saved to disk.</source>
|
||||
<translation>Databasen er blevet ændret, men ændringerne er endnu ikke blevet gemt på disken.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Number of groups</source>
|
||||
@@ -7805,7 +7802,7 @@ Example: JBSWY3DPEHPK3PXP</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open a recent database</source>
|
||||
<translation>Åbn en af de seneste databaser</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -54,7 +54,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable SSH Agent integration</source>
|
||||
<translation>Habilitar integración del agente SSH</translation>
|
||||
<translation>Habilitar la integración del agente SSH</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SSH_AUTH_SOCK value</source>
|
||||
@@ -70,7 +70,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>No SSH Agent socket available. Either make sure SSH_AUTH_SOCK environment variable exists or set an override.</source>
|
||||
<translation>No hay ningún socket de agente SSH disponible. Asegúrese que exista la variable de entorno SSH_AUTH_SOCK o fije una sustitución.</translation>
|
||||
<translation>No hay ningún socket de agente SSH disponible. Asegúrese de que existe SSH_AUTH_SOCK variable de entorno o establezca una invalidación.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>SSH Agent connection is working!</source>
|
||||
@@ -81,7 +81,7 @@
|
||||
<name>ApplicationSettingsWidget</name>
|
||||
<message>
|
||||
<source>Application Settings</source>
|
||||
<translation>Parámetros de la aplicación</translation>
|
||||
<translation>Configuración de la aplicación</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>General</source>
|
||||
@@ -117,11 +117,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Reset Settings?</source>
|
||||
<translation>¿Restablecer parámetros?</translation>
|
||||
<translation>¿Reiniciar configuración?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Are you sure you want to reset all general and security settings to default?</source>
|
||||
<translation>¿Desea restablecer los parámetros generales y seguridad a sus valores por defecto?</translation>
|
||||
<translation>¿Desea reiniciar la configuración general y de seguridad a sus valores por defecto?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Monochrome (light)</source>
|
||||
@@ -148,7 +148,7 @@
|
||||
<name>ApplicationSettingsWidgetGeneral</name>
|
||||
<message>
|
||||
<source>Basic Settings</source>
|
||||
<translation>Parámetros básicos</translation>
|
||||
<translation>Configuraciones básicas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Startup</source>
|
||||
@@ -164,7 +164,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>File Management</source>
|
||||
<translation>Gestión de ficheros</translation>
|
||||
<translation>Administración de archivos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Backup database file before saving</source>
|
||||
@@ -302,15 +302,15 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-type start delay milliseconds</source>
|
||||
<translation>Retardo de inicio del autotecleo en milisegundos</translation>
|
||||
<translation>Retardo de inicio de autoescritura en milisegundos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Automatically launch KeePassXC at system startup</source>
|
||||
<translation>Inicie automáticamente KeePassXC al arrancar el sistema</translation>
|
||||
<translation>Inicie automáticamente KeePassXC al inicio del sistema</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Safely save database files (disable if experiencing problems with Dropbox, etc.)</source>
|
||||
<translation>Guardar los ficheros de base de datos con seguridad (puede ser incompatible con Dropbox, etcétera)</translation>
|
||||
<translation>Guardar los archivos de base de datos con seguridad (puede ser incompatible con Dropbox, etcétera)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>User Interface</source>
|
||||
@@ -326,23 +326,23 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Tray icon type:</source>
|
||||
<translation>Estilo de icono de la bandeja:</translation>
|
||||
<translation>Estilo de icono de en la barra de tareas:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reset settings to default…</source>
|
||||
<translation>Restaurar parámetros por defecto…</translation>
|
||||
<translation>Restaurar configuración por defecto...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-Type typing delay:</source>
|
||||
<translation>Retardo de tecleo del autotecleo:</translation>
|
||||
<translation>Retardo de escritura de la autoescritura:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Global Auto-Type shortcut:</source>
|
||||
<translation>Atajo global de autotecleo:</translation>
|
||||
<translation>Atajo global de autoescritura:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-Type start delay:</source>
|
||||
<translation>Retardo del inicio del autotecleo:</translation>
|
||||
<translation>Retardo de inicio de autoescritura:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Automatically save when locking database</source>
|
||||
@@ -350,7 +350,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Automatically save non-data changes when locking database</source>
|
||||
<translation>Auto-guardado de modificaciones distintas a los datos al bloquear la base de datos</translation>
|
||||
<translation>Guardar automáticamente cambios sin datos al bloquear la base de datos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Tray icon type</source>
|
||||
@@ -365,12 +365,12 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear clipboard after</source>
|
||||
<translation>Purga del portapapeles tras</translation>
|
||||
<translation>Vaciar el portapapeles tras</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> sec</source>
|
||||
<comment>Seconds</comment>
|
||||
<translation> seg</translation>
|
||||
<translation> segundos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Lock databases after inactivity of</source>
|
||||
@@ -390,11 +390,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Lock databases when session is locked or lid is closed</source>
|
||||
<translation>Bloquear bases de datos cuando la sesión esté bloqueada o la pantalla cerrada</translation>
|
||||
<translation>Bloquear bases de datos cuando la sesión está bloqueada o la pantalla esté cerrada</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Forget TouchID when session is locked or lid is closed</source>
|
||||
<translation>Olvidar TouchID cuando la sesión esté bloqueada o la tapa esté cerrada</translation>
|
||||
<translation>Olvidar TouchID cuando la sesión está bloqueada o la tapa esté cerrada</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Lock databases after minimizing the window</source>
|
||||
@@ -402,7 +402,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Re-lock previously locked database after performing Auto-Type</source>
|
||||
<translation>Volver a bloquear la base de datos tras realizar una auto-tecleo</translation>
|
||||
<translation>Volver a bloquear la base de datos tras realizar una autoescritura</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide passwords in the entry preview panel</source>
|
||||
@@ -422,11 +422,11 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Clipboard clear seconds</source>
|
||||
<translation>Segundos para purga del portapapeles</translation>
|
||||
<translation>Vaciar portapapeles en segundos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Touch ID inactivity reset</source>
|
||||
<translation>Restablecer inactividad de Touch ID</translation>
|
||||
<translation>Reinicio de inactividad de Touch ID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database lock timeout seconds</source>
|
||||
@@ -439,54 +439,54 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear search query after</source>
|
||||
<translation>Purgar consulta de búsqueda tras</translation>
|
||||
<translation>Vaciar consulta de búsqueda tras</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Require password repeat when it is visible</source>
|
||||
<translation>Solicitar repetición de la contraseña cuando esté visible</translation>
|
||||
<translation>Pedir repetición de la contraseña cuando está visible</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide passwords when editing them</source>
|
||||
<translation>Ocultar las contraseñas cuando las edite</translation>
|
||||
<translation>Ocultar las contraseñas durante la edición de ellas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use placeholder for empty password fields</source>
|
||||
<translation>Emplear contenedor para los campos de contraseña vacíos</translation>
|
||||
<translation>Usar marcador de posición para los campos de contraseña vacíos</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>AutoType</name>
|
||||
<message>
|
||||
<source>Couldn't find an entry that matches the window title:</source>
|
||||
<translation>No pudo encontrar un apunte que corresponda al título de la ventana:</translation>
|
||||
<translation>No se puede encontrar un apunte que corresponda al título de la ventana:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-Type - KeePassXC</source>
|
||||
<translation>Auto-tecelo - KeePassXC</translation>
|
||||
<translation>Autoescritura - KeePassXC</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-Type</source>
|
||||
<translation>Auto-tecleo</translation>
|
||||
<translation>Autoescritura</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The Syntax of your Auto-Type statement is incorrect!</source>
|
||||
<translation>¡La sintaxis de la sentencia de su auto-tecleo es incorrecta!</translation>
|
||||
<translation>¡La sintaxis de la sentencia de su autoescritura es incorrecta!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This Auto-Type command contains a very long delay. Do you really want to proceed?</source>
|
||||
<translation>Esta instrucción del auto-tecleo contiene un retraso muy largo. ¿Realmente desea continuar?</translation>
|
||||
<translation>Este comando de autoescritura contiene un retraso muy largo. ¿Desea continuar?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This Auto-Type command contains very slow key presses. Do you really want to proceed?</source>
|
||||
<translation>Esta instrucción de auto-tecleo contiene pulsaciones de teclas muy lentas. ¿Desea continuar?</translation>
|
||||
<translation>Este comando de autoescritura contiene pulsaciones de teclas muy lentas. ¿Desea continuar?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This Auto-Type command contains arguments which are repeated very often. Do you really want to proceed?</source>
|
||||
<translation>Esta instrucción de auto-tecleo contiene argumentos que se repiten muy a menudo. ¿Realmente desea continuar?</translation>
|
||||
<translation>Este comando de autoescritura contiene argumentos que se repiten muy a menudo. ¿Desea continuar?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Permission Required</source>
|
||||
<translation>Permiso Requerido</translation>
|
||||
<translation>Permiso requerido</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC requires the Accessibility permission in order to perform entry level Auto-Type. If you already granted permission, you may have to restart KeePassXC.</source>
|
||||
@@ -553,7 +553,7 @@
|
||||
<name>AutoTypeSelectDialog</name>
|
||||
<message>
|
||||
<source>Auto-Type - KeePassXC</source>
|
||||
<translation>Auto-teclear - KeePassXC</translation>
|
||||
<translation>Autoescritura - KeePassXC</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Select entry to Auto-Type:</source>
|
||||
@@ -617,14 +617,14 @@
|
||||
<source>You have multiple databases open.
|
||||
Please select the correct database for saving credentials.</source>
|
||||
<translation>Tiene múltiples bases de datos abiertas.
|
||||
Seleccione la base de datos correcta para guardar las credenciales.</translation>
|
||||
Por favor, seleccione la base de datos correcta para guardar las credenciales.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>BrowserService</name>
|
||||
<message>
|
||||
<source>KeePassXC: New key association request</source>
|
||||
<translation>KeePassXC: solicitud de asociación de clave nueva</translation>
|
||||
<translation>KeePassXC: solicitud de asociación de nueva clave</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Save and allow access</source>
|
||||
@@ -637,7 +637,7 @@ Seleccione la base de datos correcta para guardar las credenciales.</translation
|
||||
<message>
|
||||
<source>A shared encryption key with the name "%1" already exists.
|
||||
Do you want to overwrite it?</source>
|
||||
<translation>Ya existe una clave compartida con el nombre «%1».
|
||||
<translation>Existe una clave con el nombre «%1».
|
||||
¿Desea sobrescribirlo?</translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -654,7 +654,7 @@ Do you want to overwrite it?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Converting attributes to custom data…</source>
|
||||
<translation>Convirtiendo atributos a datos personalizados…</translation>
|
||||
<translation>Convirtiendo atributos a datos personalizados...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC: Converted KeePassHTTP attributes</source>
|
||||
@@ -668,7 +668,7 @@ Movidas %2 claves a datos personalizados.</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Successfully moved %n keys to custom data.</source>
|
||||
<translation><numerusform>%n claves(s) movida(s) a datos propios correctamente.</numerusform><numerusform>%n clave(s) movida(s) a datos propios correctamente.</numerusform></translation>
|
||||
<translation><numerusform>%n claves(s) movida(s) a datos propios correctamente.</numerusform><numerusform>%n claves(s) movida(s) a datos propios correctamente.</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC: No entry with KeePassHTTP attributes found!</source>
|
||||
@@ -680,11 +680,11 @@ Movidas %2 claves a datos personalizados.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC: Legacy browser integration settings detected</source>
|
||||
<translation>KeePassXC: parámetros heredados de integración detectados con el navegador</translation>
|
||||
<translation>KeePassXC: detectada configuración de integración con navegador heredada</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC: Create a new group</source>
|
||||
<translation>KeePassXC: crear un grupo nuevo</translation>
|
||||
<translation>KeePassXC: crear un nuevo grupo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>A request for creating a new group "%1" has been received.
|
||||
@@ -698,9 +698,9 @@ Do you want to create this group?
|
||||
<source>Your KeePassXC-Browser settings need to be moved into the database settings.
|
||||
This is necessary to maintain your current browser connections.
|
||||
Would you like to migrate your existing settings now?</source>
|
||||
<translation>Sus configuraciones de KeePassXC-Browser necesitan moverse a los parámetros de la base de datos.
|
||||
Esto es necesario para conservar sus conexiones presentes del navegador.
|
||||
¿Desea migrar sus parámetros existentes ahora?</translation>
|
||||
<translation>Sus configuraciones de KeePassXC-Browser necesitan moverse a las configuraciones de base de datos.
|
||||
Es necesario para mantener sus conexiones presentes del navegador.
|
||||
¿Desea migrar sus configuraciones existentes ahora?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Don't show this warning again</source>
|
||||
@@ -715,7 +715,7 @@ chrome-laptop.</source>
|
||||
<translation>Ha recibido una solicitud de asociación para la siguiente base de datos:
|
||||
%1
|
||||
|
||||
Asigne a la conexión un nombre único o identificador, por ejemplo:
|
||||
Asigne a la conexión un nombre único o identificativo, por ejemplo:
|
||||
portatil-chrome.</translation>
|
||||
</message>
|
||||
</context>
|
||||
@@ -727,7 +727,7 @@ portatil-chrome.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This is required for accessing your databases with KeePassXC-Browser</source>
|
||||
<translation>Esto es requerido para acceder a sus bases de datos con KeePassXC-Browser</translation>
|
||||
<translation>Esto es necesario para acceder a las bases de datos con KeePassXC-Browser</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable browser integration</source>
|
||||
@@ -739,11 +739,11 @@ portatil-chrome.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browsers installed as snaps are currently not supported.</source>
|
||||
<translation>Los navegadores instalados como snaps no son admitidos.</translation>
|
||||
<translation>Los navegadores instalados como snaps no están soportados.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable integration for these browsers:</source>
|
||||
<translation>Habilitar integración a estos navegadores:</translation>
|
||||
<translation>Permitir la integración con estos navegadores:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Vivaldi</source>
|
||||
@@ -776,7 +776,7 @@ portatil-chrome.</translation>
|
||||
<message>
|
||||
<source>Show a notification when credentials are requested</source>
|
||||
<extracomment>Credentials mean login data requested via browser extension</extracomment>
|
||||
<translation>Mostrar una notificación cuando se requieran las credenciales</translation>
|
||||
<translation>Mostrar una notificación cuando las credenciales son requeridas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Request to unlock the database if it is locked</source>
|
||||
@@ -788,11 +788,11 @@ portatil-chrome.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Match URL scheme (e.g., https://...)</source>
|
||||
<translation>El formato del URL coincide (p.e., https://…)</translation>
|
||||
<translation>Iguala el formato de URL (e.g., https://...)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source>
|
||||
<translation>Devolver únicamente los resultados similares para una URL específica en lugar de todos los apuntes para todo el dominio.</translation>
|
||||
<translation>Sólo devolver los resultados similares para una URL específica en vez de todas los apuntes para todo el dominio.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Return only best-matching credentials</source>
|
||||
@@ -800,7 +800,7 @@ portatil-chrome.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Returns expired credentials. String [expired] is added to the title.</source>
|
||||
<translation>Devuelve las credenciales caducadas. La cadena [caducada] es agregada al título.</translation>
|
||||
<translation>Devuelve las credenciales expiradas. La cadena [expirada] es añadida al título.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Allow returning expired credentials</source>
|
||||
@@ -813,7 +813,7 @@ portatil-chrome.</translation>
|
||||
<message>
|
||||
<source>Search in all opened databases for matching credentials</source>
|
||||
<extracomment>Credentials mean login data requested via browser extension</extracomment>
|
||||
<translation>Buscar las credenciales por todas las bases de datos abiertas correspondientes</translation>
|
||||
<translation>Buscar en todas las bases de datos abiertas las credenciales correspondientes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sort matching credentials by title</source>
|
||||
@@ -842,7 +842,7 @@ portatil-chrome.</translation>
|
||||
<message>
|
||||
<source>Do not ask permission for HTTP Basic Auth</source>
|
||||
<extracomment>An extra HTTP Basic Auth setting</extracomment>
|
||||
<translation>No solicitar permiso para Autenticación Básica HTTP</translation>
|
||||
<translation>No solicitar permiso para autenticación básica HTTP</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Automatically creating or updating string fields is not supported.</source>
|
||||
@@ -850,40 +850,40 @@ portatil-chrome.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Return advanced string fields which start with "KPH: "</source>
|
||||
<translation>Devuelve campos de texto avanzados que comienzan por "KPH: "</translation>
|
||||
<translation>Devuelve campos de texto avanzados que comienzan por "KPH:"</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Don't display the popup suggesting migration of legacy KeePassHTTP settings.</source>
|
||||
<translation>No desplegar la ventana emergente sugiriendo migración de parámetros de KeePassHTTP heredados.</translation>
|
||||
<translation>No permitir ventana emergente sugiriendo migración de configuración antigua de KeePassHTTP.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do not prompt for KeePassHTTP settings migration.</source>
|
||||
<translation>No solicitar parámetros de migración de KeePassHTTP.</translation>
|
||||
<translation>No preguntar por migración de configuración de KeePassHTTP.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Updates KeePassXC or keepassxc-proxy binary path automatically to native messaging scripts on startup.</source>
|
||||
<translation>Actualizaciones KeePassXC o keepassxc-proxy binario automáticamente para guiones de mensajes nativos en el arranque.</translation>
|
||||
<translation>Actualizaciones KeePassXC o keepassxc-proxy binario automáticamente para obtener los mensajes nativos en el arranque.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Update native messaging manifest files at startup</source>
|
||||
<translation>Actualizar ficheros de manifiesto de mensajería nativa al arrancar</translation>
|
||||
<translation>Actualizar archivo manifiesto de mensajería nativa al iniciar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use a custom proxy location if you installed a proxy manually.</source>
|
||||
<translation>Utiliza una ubicación proxy personalizado si ha instalado manualmante un proxy.</translation>
|
||||
<translation>Utilizar un proxy instalado manualmente.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use a custom proxy location:</source>
|
||||
<comment>Meant is the proxy for KeePassXC-Browser</comment>
|
||||
<translation>Utiliza una ubicación de proxy personalizada:</translation>
|
||||
<translation>Usar una ubicación de proxy personalizada:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Custom proxy location field</source>
|
||||
<translation>Campo personalizado de ubicación del proxy</translation>
|
||||
<translation>Ubicación de campo personalizado proxy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browser for custom proxy file</source>
|
||||
<translation>Explorador para fichero del proxy personalizado</translation>
|
||||
<translation>Explorar para archivo personalizado proxy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse...</source>
|
||||
@@ -892,7 +892,7 @@ portatil-chrome.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use a custom browser configuration location:</source>
|
||||
<translation>Emplear una ubicación de la configuración del explorador proxy personalizado:</translation>
|
||||
<translation>Usar una ubicación de proxy personalizada:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browser type:</source>
|
||||
@@ -900,11 +900,11 @@ portatil-chrome.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Toolbar button style</source>
|
||||
<translation>Estilo del botón para la barra de herramientas</translation>
|
||||
<translation>Estilo de botón de barra de herramientas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Config Location:</source>
|
||||
<translation>Ubicación de configuración:</translation>
|
||||
<translation>Localización de la configuración:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Custom browser location field</source>
|
||||
@@ -916,7 +916,7 @@ portatil-chrome.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse for custom browser path</source>
|
||||
<translation>Examinar ruta personalizada del navegador</translation>
|
||||
<translation>Buscar ruta del navegador personalizada</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Custom extension ID:</source>
|
||||
@@ -928,7 +928,7 @@ portatil-chrome.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Due to Snap sandboxing, you must run a script to enable browser integration.<br />You can obtain this script from %1</source>
|
||||
<translation>Debido al modo aislado de Snap, debe ejecutar un guion para habilitar la integración con el navegador. Puede obtener este guion desde %1</translation>
|
||||
<translation>Debido al modo aislado de Snap, debe ejecutar un código para permitir la integración con el navegador.<br/>Puede obtener este código de %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC-Browser is needed for the browser integration to work. <br />Download it for %1 and %2 and %3. %4</source>
|
||||
@@ -948,19 +948,19 @@ portatil-chrome.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Executable Files</source>
|
||||
<translation>Ficheros ejecutables</translation>
|
||||
<translation>Archivos ejecutables</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>All Files</source>
|
||||
<translation>Todos los ficheros</translation>
|
||||
<translation>Todos los archivos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Select custom proxy location</source>
|
||||
<translation>Seleccione una ubicación de proxy personalizada</translation>
|
||||
<translation>Elegir una ubicación de proxy personalizada</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Select native messaging host folder location</source>
|
||||
<translation>Seleccione la ubicación de la carpeta de hospedaje de mensajería nativa</translation>
|
||||
<translation>Seleccionar la ubicación de la carpeta del host de mensajería nativa</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -971,7 +971,7 @@ portatil-chrome.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Append ' - Clone' to title</source>
|
||||
<translation>Agregar «- Clon» al título</translation>
|
||||
<translation>Añadir «- Clon» al título</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Replace username and password with references</source>
|
||||
@@ -990,7 +990,7 @@ portatil-chrome.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>filename</source>
|
||||
<translation>nombre del fichero</translation>
|
||||
<translation>nombre del archivo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>size, rows, columns</source>
|
||||
@@ -1006,7 +1006,7 @@ portatil-chrome.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Text is qualified by</source>
|
||||
<translation>El texto está rodeado por</translation>
|
||||
<translation>Los textos están rodeados por</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Fields are separated by</source>
|
||||
@@ -1030,7 +1030,7 @@ portatil-chrome.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Original data: </source>
|
||||
<translation>Datos originales:</translation>
|
||||
<translation>Dato original:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
@@ -1084,7 +1084,7 @@ portatil-chrome.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Notes</source>
|
||||
<translation>Anotaciones</translation>
|
||||
<translation>Notas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Title</source>
|
||||
@@ -1104,7 +1104,7 @@ portatil-chrome.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Header lines skipped</source>
|
||||
<translation>Líneas de cabecera descartadas</translation>
|
||||
<translation>Líneas de cabecera ignoradas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>First line has field names</source>
|
||||
@@ -1151,11 +1151,11 @@ portatil-chrome.</translation>
|
||||
<name>Database</name>
|
||||
<message>
|
||||
<source>File %1 does not exist.</source>
|
||||
<translation>El fichero %1 no existe.</translation>
|
||||
<translation>El archivo %1 no existe.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to open file %1.</source>
|
||||
<translation>Incapaz de abrir el fichero %1.</translation>
|
||||
<translation>Incapaz de abrir el archivo %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error while reading the database: %1</source>
|
||||
@@ -1163,33 +1163,33 @@ portatil-chrome.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File cannot be written as it is opened in read-only mode.</source>
|
||||
<translation>El fichero no puede ser escrito, ya que está abierto en modo de solo lectura.</translation>
|
||||
<translation>El archivo no se puede escribir, ya que se ha abierto en modo de solo lectura.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key not transformed. This is a bug, please report it to the developers!</source>
|
||||
<translation>La clave no está transformada. Esto es un defecto, por favor, ¡comuníquelo a los desarrolladores!</translation>
|
||||
<translation>La clave no está transformada. Esto es un defecto, por favor, ¡comuniquelo a los desarrolladores!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1
|
||||
Backup database located at %2</source>
|
||||
<translation>%1
|
||||
Respaldo de base de datos ubicado en %2</translation>
|
||||
Copia de seguridad de base de datos ubicada en %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not save, database does not point to a valid file.</source>
|
||||
<translation>No se ha podido guardar, la base de datos no apunta a un fichero válido.</translation>
|
||||
<translation>No se puede guardar, la base de datos no apunta a un archivo válido.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not save, database file is read-only.</source>
|
||||
<translation>No se ha podido guardar, el fichero de la base de datos es de solo lectura.</translation>
|
||||
<translation>No se puede guardar, el archivo de base de datos es de solo lectura.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database file has unmerged changes.</source>
|
||||
<translation>El fichero de base de datos tiene modificaciones no combinadas.</translation>
|
||||
<translation>El archivo de base de datos tiene cambios no combinados.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Recycle Bin</source>
|
||||
<translation>Papelera</translation>
|
||||
<translation>Papelera de reciclaje</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Passwords</source>
|
||||
@@ -1202,7 +1202,7 @@ Respaldo de base de datos ubicado en %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not save, database has not been initialized!</source>
|
||||
<translation>No se ha podido guardar, la base de datos no a sido inicializada.</translation>
|
||||
<translation>No se puede guardar, la base de datos no a sido inicializada.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1216,11 +1216,11 @@ Respaldo de base de datos ubicado en %2</translation>
|
||||
<name>DatabaseOpenWidget</name>
|
||||
<message>
|
||||
<source>Key File:</source>
|
||||
<translation>Cerrojo:</translation>
|
||||
<translation>Fichero clave:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Refresh</source>
|
||||
<translation>Recargar</translation>
|
||||
<translation>Actualizar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Don't show this warning again</source>
|
||||
@@ -1228,19 +1228,19 @@ Respaldo de base de datos ubicado en %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>All files</source>
|
||||
<translation>Todos los ficheros</translation>
|
||||
<translation>Todos los archivos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key files</source>
|
||||
<translation>Cerrojos</translation>
|
||||
<translation>Ficheros clave</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Select key file</source>
|
||||
<translation>Seleccionar cerrojo</translation>
|
||||
<translation>Seleccionar fichero clave</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to open key file: %1</source>
|
||||
<translation>Apertura del cerrojo errónea: %1</translation>
|
||||
<translation>Fallo al abrir fichero clave: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unlock KeePassXC Database</source>
|
||||
@@ -1260,15 +1260,15 @@ Respaldo de base de datos ubicado en %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse for key file</source>
|
||||
<translation>Solicitar cerrojo</translation>
|
||||
<translation>Explorar para un fichero clave</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse...</source>
|
||||
<translation>Examinar…</translation>
|
||||
<translation>Explorar…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Refresh hardware tokens</source>
|
||||
<translation>Recargar billetes por hardware</translation>
|
||||
<translation>Actualizar «tokens» hardware</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hardware Key:</source>
|
||||
@@ -1280,21 +1280,21 @@ Respaldo de base de datos ubicado en %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>TouchID for Quick Unlock</source>
|
||||
<translation>TouchID para Desbloqueo Rápido</translation>
|
||||
<translation>TouchID para desbloqueo rápido</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unlock failed and no password given</source>
|
||||
<translation>Desbloqueo erróneo y contraseña no proporcionada</translation>
|
||||
<translation>Desbloqueo fallido y sin contraseña proporcionada</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unlocking the database failed and you did not enter a password.
|
||||
Do you want to retry with an "empty" password instead?
|
||||
|
||||
To prevent this error from appearing, you must go to "Database Settings / Security" and reset your password.</source>
|
||||
<translation>Desbloqueo de base de datos erróneo y no se introdujo una contraseña.
|
||||
<translation>Desbloquear la base de datos ha fallado y no introdujo una contraseña.
|
||||
¿Desea reintentar con una contraseña vacía?
|
||||
|
||||
Para prevenir que aparezca este error, debe ir a «Parámetros de base de datos / Seguridad» y restablezca su contraseña.</translation>
|
||||
Para prevenir que aparezca este error, debe ir a «Configuración de base de datos / Seguridad» y reiniciar su contraseña.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Retry with empty password</source>
|
||||
@@ -1312,7 +1312,7 @@ Para prevenir que aparezca este error, debe ir a «Parámetros de base de datos
|
||||
</message>
|
||||
<message>
|
||||
<source>Key file help</source>
|
||||
<translation>Ayuda del cerrojo</translation>
|
||||
<translation>Ayuda de fichero clave</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>?</source>
|
||||
@@ -1320,38 +1320,37 @@ Para prevenir que aparezca este error, debe ir a «Parámetros de base de datos
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot use database file as key file</source>
|
||||
<translation>No se puede usar una base de datos como cerrojo</translation>
|
||||
<translation>No se puede usar una base de datos como fichero clave</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>You cannot use your database file as a key file.
|
||||
If you do not have a key file, please leave the field empty.</source>
|
||||
<translation>No puede usar una base de datos como cerrojo.
|
||||
Si no tiene un cerrojo, deje el campo vacío.</translation>
|
||||
<translation>No puede usar una base de datos como fichero clave.
|
||||
Si no tiene un fichero clave, deje el campo vacío.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>In addition to a password, you can use a secret file to enhance the security of your database. This file can be generated in your database's security settings.</p><p>This is <strong>not</strong> your *.kdbx database file!<br>If you do not have a key file, leave this field empty.</p><p>Click for more information...</p></source>
|
||||
<translation><p>Adicionalmente a la contraseña, puede usar un cerrojo para mejorar la seguridad de su base de datos. Este cerrojo puede ser generado en sus parámetros de la base de datos.</p><p>Esto <strong>no</strong> es su fichero *.kdbx. <br>Si no tiene un cerrojo, deje este campo vacío.
|
||||
<p>Pulse para más información...</p></translation>
|
||||
<translation><p>Adicionalmente a la contraseña, puede usar un fichero clave para mejorar la seguridad de su base de datos. Este archivo puede ser generado en su configuración de base de datos.</p><p>Esto <strong>no</strong> es su archivo *.kdbx. <br>Si no tiene un fichero clave, deje este campo vacío.</p><p>Clic para más información...</p></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key file to unlock the database</source>
|
||||
<translation>Cerrojo para desbloquear la base de datos</translation>
|
||||
<translation>Fichero clave para desbloquear la base de datos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please touch the button on your YubiKey!</source>
|
||||
<translation>¡Apriete el botón en su YubiKey!</translation>
|
||||
<translation>¡Por favor presione el botón en su YubiKey!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Detecting hardware keys…</source>
|
||||
<translation>Detectando llaves por hardware…</translation>
|
||||
<translation>Detectando llaves por hardware...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No hardware keys detected</source>
|
||||
<translation>Ninguna llave por hardware detectada</translation>
|
||||
<translation>No se detectaron llaves por hardware</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Select hardware key…</source>
|
||||
<translation>Seleccione llave por hardware…</translation>
|
||||
<translation>Seleccionar llave por hardware...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Old key file format</source>
|
||||
@@ -1359,8 +1358,8 @@ Si no tiene un cerrojo, deje el campo vacío.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>You are using an old key file format which KeePassXC may<br>stop supporting in the future.<br><br>Please consider generating a new key file by going to:<br><strong>Database / Database Security / Change Key File.</strong><br></source>
|
||||
<translation>Está usando un formato anterior del cerrojo que KeePassXC puede<br> dejar
|
||||
de admitirlo en el futuro.<br><br>Considere generar un nuevo cerrojo yendo a <br><strong>Base de datos / Seguridad de base de datos / Cambiar cerrojo.</translation>
|
||||
<translation>Está usando un fichero clave con un formato antiguo que KeePassXC puede<br> dejar
|
||||
de soportar en el futuro.<br><br>Considere generar un nuevo fichero clave yendo a <br><strong>Base de datos / Seguridad de base de datos / Cambiar fichero clave.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1374,7 +1373,7 @@ de admitirlo en el futuro.<br><br>Considere generar un nuevo cerrojo
|
||||
<name>DatabaseSettingsDialog</name>
|
||||
<message>
|
||||
<source>Advanced Settings</source>
|
||||
<translation>Parámetros avanzados</translation>
|
||||
<translation>Configuraciones avanzadas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>General</source>
|
||||
@@ -1413,12 +1412,12 @@ de admitirlo en el futuro.<br><br>Considere generar un nuevo cerrojo
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete the selected key?</source>
|
||||
<translation>¿Borro la clave seleccionada?</translation>
|
||||
<translation>¿Eliminar clave seleccionada?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do you really want to delete the selected key?
|
||||
This may prevent connection to the browser plugin.</source>
|
||||
<translation>¿Desea borrar la clave seleccionada?
|
||||
<translation>¿Desea eliminar la clave seleccionada?
|
||||
Esto puede impedir la conexión con el complemento del navegador.</translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -1431,7 +1430,7 @@ Esto puede impedir la conexión con el complemento del navegador.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Browser Integration to access these settings.</source>
|
||||
<translation>Habilitar la integración del navegador para acceder a estos parámetros.</translation>
|
||||
<translation>Habilitar la integración del navegador para acceder a esta configuración.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Disconnect all browsers</source>
|
||||
@@ -1457,7 +1456,7 @@ Esto puede impedir la conexión con el complemento de navegador.</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Successfully removed %n encryption key(s) from KeePassXC settings.</source>
|
||||
<translation><numerusform>Correctamente borrada %n clave de cifrado de la configuración KeePassXC.</numerusform><numerusform>Correctamente borrada %n claves de cifrado de los parámetros de KeePassXC.</numerusform></translation>
|
||||
<translation><numerusform>Correctamente borrada %n clave de cifrado de la configuración KeePassXC.</numerusform><numerusform>Correctamente borrada %n claves de cifrado de la configuración KeePassXC.</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Forget all site-specific settings on entries</source>
|
||||
@@ -1517,7 +1516,7 @@ Esto es necesario para mantener la compatibilidad con el complemento del navegad
|
||||
</message>
|
||||
<message>
|
||||
<source>Refresh database root group ID</source>
|
||||
<translation>Recargar la ID del grupo raíz de la base de datos</translation>
|
||||
<translation>Actualizar la ID del grupo raíz de la base de datos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Created</source>
|
||||
@@ -1531,24 +1530,24 @@ Esto es necesario para mantener la compatibilidad con el complemento del navegad
|
||||
<source>Do you really want refresh the database ID?
|
||||
This is only necessary if your database is a copy of another and the browser extension cannot connect.</source>
|
||||
<translation>¿Desea actualizar el ID de la base de datos?
|
||||
Esto solo es necesario si su base de datos es una copia de otra y la extensión del navegador se no puede conectar.</translation>
|
||||
Esto solo es necesario si su base de datos es copiada a otra y la extensión del navegador cono se puede conectar.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DatabaseSettingsWidgetDatabaseKey</name>
|
||||
<message>
|
||||
<source>Add additional protection...</source>
|
||||
<translation>Agregar protección adicional…</translation>
|
||||
<translation>Añadir protección adicional…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No password set</source>
|
||||
<translation>Ninguna contraseña fijada</translation>
|
||||
<translation>Contraseña no establecida</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>WARNING! You have not set a password. Using a database without a password is strongly discouraged!
|
||||
|
||||
Are you sure you want to continue without a password?</source>
|
||||
<translation>¡ADVERTENCIA! No ha fijado una contraseña. Se desaconseja encarecidamente el uso de una base de datos sin contraseña.
|
||||
<translation>¡ADVERTENCIA! No ha establecido una contraseña. Se desaconseja el uso de una base de datos sin contraseña.
|
||||
|
||||
¿Desea continuar sin contraseña?</translation>
|
||||
</message>
|
||||
@@ -1558,11 +1557,11 @@ Are you sure you want to continue without a password?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>No encryption key added</source>
|
||||
<translation>Ninguna clave de cifrado agregada</translation>
|
||||
<translation>No se agregó clave de cifrado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>You must add at least one encryption key to secure your database!</source>
|
||||
<translation>¡Debe agregar al menos una clave de cifrado para proteger su base de datos!</translation>
|
||||
<translation>¡Debe añadir al menos una clave de cifrado para proteger su base de datos!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown error</source>
|
||||
@@ -1570,7 +1569,7 @@ Are you sure you want to continue without a password?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to change database credentials</source>
|
||||
<translation>Cambio de credenciales de base de datos errónea</translation>
|
||||
<translation>Fallo al cambiar las credenciales de la base de datos</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1589,7 +1588,7 @@ Are you sure you want to continue without a password?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key Derivation Function:</source>
|
||||
<translation>Función de derivación de clave:</translation>
|
||||
<translation>Función de derivación de la clave:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Transform rounds:</source>
|
||||
@@ -1613,7 +1612,7 @@ Are you sure you want to continue without a password?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change</source>
|
||||
<translation>Modificar</translation>
|
||||
<translation>Cambiar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Higher values offer more protection, but opening the database will take longer.</source>
|
||||
@@ -1670,8 +1669,9 @@ Si conserva este número, ¡su base de datos puede tardar horas o días (o inclu
|
||||
<source>You are using a very low number of key transform rounds with AES-KDF.
|
||||
|
||||
If you keep this number, your database may be too easy to crack!</source>
|
||||
<translation>Está utilizando un número de rondas de transformación de clave con AES-KDF muy bajo.
|
||||
Si mantiene este número, su base de datos puede ser muy fácil de descifrar.</translation>
|
||||
<translation>Está utilizando un número muy bajo de rondas de transformación de clave con AES-KDF.
|
||||
|
||||
Si conserva este número, ¡su base de datos puede ser muy fácil de descifrar!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KDF unchanged</source>
|
||||
@@ -1689,11 +1689,11 @@ Si mantiene este número, su base de datos puede ser muy fácil de descifrar.</t
|
||||
<message numerus="yes">
|
||||
<source> thread(s)</source>
|
||||
<comment>Threads for parallel execution (KDF settings)</comment>
|
||||
<translation><numerusform>hilo</numerusform><numerusform>hilo(s)</numerusform></translation>
|
||||
<translation><numerusform>hilo</numerusform><numerusform>hilos</numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change existing decryption time</source>
|
||||
<translation>Modificar el tiempo de descifrado</translation>
|
||||
<translation>Cambiar el tiempo de descifrado</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Decryption time in seconds</source>
|
||||
@@ -1748,7 +1748,7 @@ Si mantiene este número, su base de datos puede ser muy fácil de descifrar.</t
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable Secret Service to access these settings.</source>
|
||||
<translation>Habilite el Servicio Secreto para acceder a estos parámetros.</translation>
|
||||
<translation>Habilite el servicio secreto para acceder a esta configuración.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1771,7 +1771,7 @@ Si mantiene este número, su base de datos puede ser muy fácil de descifrar.</t
|
||||
</message>
|
||||
<message>
|
||||
<source>History Settings</source>
|
||||
<translation>Parámetros del historial</translation>
|
||||
<translation>Configuración del historial</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Max. history items:</source>
|
||||
@@ -1787,11 +1787,11 @@ Si mantiene este número, su base de datos puede ser muy fácil de descifrar.</t
|
||||
</message>
|
||||
<message>
|
||||
<source>Use recycle bin</source>
|
||||
<translation>Usar papelera</translation>
|
||||
<translation>Usar papelera de reciclaje</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Additional Database Settings</source>
|
||||
<translation>Parámetros adicionales de la base de datos</translation>
|
||||
<translation>Configuraciones adicionales de la base de datos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database name field</source>
|
||||
@@ -1815,17 +1815,17 @@ Si mantiene este número, su base de datos puede ser muy fácil de descifrar.</t
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete Recycle Bin</source>
|
||||
<translation>Vaciar papelera de reciclaje</translation>
|
||||
<translation>Eliminar papelera de reciclaje</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do you want to delete the current recycle bin and all its contents?
|
||||
This action is not reversible.</source>
|
||||
<translation>¿Desea vaciar el contenido actual de la papelera?
|
||||
<translation>¿Desea eliminar los contenidos actuales de la papelera de reciclaje?
|
||||
Esta acción no es reversible.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> (old)</source>
|
||||
<translation>(anterior)</translation>
|
||||
<translation>(viejo)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable compression (recommended)</source>
|
||||
@@ -1840,7 +1840,7 @@ Esta acción no es reversible.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Breadcrumb</source>
|
||||
<translation>Migaja</translation>
|
||||
<translation>Pista</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type</source>
|
||||
@@ -1899,7 +1899,7 @@ Esta acción no es reversible.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>CSV file</source>
|
||||
<translation>Fichero CSV</translation>
|
||||
<translation>Archivo CSV</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Merge database</source>
|
||||
@@ -1915,34 +1915,34 @@ Esta acción no es reversible.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Export database to CSV file</source>
|
||||
<translation>Exportar base de datos a un fichero CSV</translation>
|
||||
<translation>Exportar base de datos a un archivo CSV</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Writing the CSV file failed.</source>
|
||||
<translation>Escritura del fichero CSV errónea.</translation>
|
||||
<translation>Ha fallado la escritura del fichero CSV.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database creation error</source>
|
||||
<translation>Creación de la base de datos errónea</translation>
|
||||
<translation>Error de creación de la base de datos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The created database has no key or KDF, refusing to save it.
|
||||
This is definitely a bug, please report it to the developers.</source>
|
||||
<translation>La base de datos creada no tiene clave o KDF, negándose a guardarla.
|
||||
Esto es definitivamente un error, por favor infórmeselo a los desarrolladores.</translation>
|
||||
Esto es definitivamente un error, por favor repórtelo a los desarrolladores.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Select CSV file</source>
|
||||
<translation>Seleccionar fichero CSV</translation>
|
||||
<translation>Seleccionar archivo CSV</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>New Database</source>
|
||||
<translation>Crear base de datos</translation>
|
||||
<translation>Nueva base de datos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 [New Database]</source>
|
||||
<comment>Database tab name modifier</comment>
|
||||
<translation>%1 [Crear base de datos]</translation>
|
||||
<translation>%1 [Nueva base de datos]</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 [Locked]</source>
|
||||
@@ -1956,19 +1956,19 @@ Esto es definitivamente un error, por favor infórmeselo a los desarrolladores.<
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to open %1. It either does not exist or is not accessible.</source>
|
||||
<translation>Error abriendo %1. No existe o no es accesible.</translation>
|
||||
<translation>Fallo al abrir %1. No existe o no es accesible.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Export database to HTML file</source>
|
||||
<translation>Exportar base de datos al fichero HTML</translation>
|
||||
<translation>Exportar base de datos a archivo HTML</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>HTML file</source>
|
||||
<translation>Fichero HTML</translation>
|
||||
<translation>Archivo HTML</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Writing the HTML file failed.</source>
|
||||
<translation>Escritura al fichero HTML errónea.</translation>
|
||||
<translation>Fallo escribiendo a archivo HTML.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Export Confirmation</source>
|
||||
@@ -1353,11 +1353,11 @@ Kui andmebaasi avamiseks pole võtmefaili vaja, jäta see väli tühjaks.</trans
|
||||
</message>
|
||||
<message>
|
||||
<source>Old key file format</source>
|
||||
<translation>Vanas vormingus võtmefail</translation>
|
||||
<translation>Võtmefaili vana vorming</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>You are using an old key file format which KeePassXC may<br>stop supporting in the future.<br><br>Please consider generating a new key file by going to:<br><strong>Database / Database Security / Change Key File.</strong><br></source>
|
||||
<translation>Kasutad vana võtmefailivormingut, mille tugi võidakse<br>KeePassXC-st tulevikus eemaldada.<br><br>Palun genereeri uus võtmefail – selleks vali menüüst:<br><strong>Andmebaas – Andmebaasi turvalisus – Muuda võtmefaili.</strong><br></translation>
|
||||
<translation>Sa kasutad vana võtmefaili vormingut ning KeePassXC võib<br>selle kasutamisest tulevikus loobuda.<br><br>Palun kaalu uue võtmefaili genereerimist. Seda saad teha:<br><strong>Andmebaas / Andmebaasi turvalisus / Muuda võtmefaili vaates.</strong><br></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1410,7 +1410,7 @@ Kui andmebaasi avamiseks pole võtmefaili vaja, jäta see väli tühjaks.</trans
|
||||
</message>
|
||||
<message>
|
||||
<source>Delete the selected key?</source>
|
||||
<translation>Valitud võtme kustutamise kinnitus</translation>
|
||||
<translation>Kas kustutame valitud võtme?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do you really want to delete the selected key?
|
||||
@@ -2063,7 +2063,7 @@ Kas tahad oma muudatused mestida?</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Delete entry(s)?</source>
|
||||
<translation><numerusform>Kirje kustutamise kinnitus</numerusform><numerusform>Kirjete kustutamise kinnitus</numerusform></translation>
|
||||
<translation><numerusform>Kas kustutame kirje?</numerusform><numerusform>Kas kustutame kirjed?</numerusform></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Move entry(s) to recycle bin?</source>
|
||||
@@ -2299,8 +2299,7 @@ Kas keelata turvaline salvestamine ja proovida seejärel uuesti?</translation>
|
||||
<message>
|
||||
<source>An external merge operation has invalidated this entry.
|
||||
Unfortunately, any changes made have been lost.</source>
|
||||
<translation>Väljastpoolt algatatud mestimine on selle kirje kehtetuks muutnud.
|
||||
Kõik tehtud muudatused läksid kahjuks kaotsi.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2501,11 +2500,11 @@ Kõik tehtud muudatused läksid kahjuks kaotsi.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do not send this setting to the browser for HTTP Auth dialogs. If enabled, HTTP Auth dialogs will not show this entry for selection.</source>
|
||||
<translation>Märkimisel seda kirjet HTTP autentimisdialoogide puhul brauserile ei saadeta ning HTTP autentimisdialoogides seda kirjet valida ei saa.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do not use this entry with HTTP Basic Auth</source>
|
||||
<translation>Seda kirjet HTTP lihtautentimisel ei kasutata</translation>
|
||||
<translation>Ära kasuta seda kirjet HTTP lihtautentimisel</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2835,7 +2834,7 @@ Toetatud faililaiendid: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 is being imported and exported by different groups in this database.</source>
|
||||
<translation>Selle andmebaasi eri grupid kasutavad asukohta „%1” nii importimiseks kui ka eksportimiseks.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeeShare is currently disabled. You can enable import/export in the application settings.</source>
|
||||
@@ -3463,7 +3462,7 @@ Kas oled kindel, et tahad selle faili lisada?</translation>
|
||||
<message>
|
||||
<source><tr><td><b>%1</b>:</td><td>%2</td></tr></source>
|
||||
<comment>attributes line</comment>
|
||||
<translation><tr><td><b>%1</b>:</td><td>%2</td></tr></translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -3885,11 +3884,11 @@ Kui probleem püsib, võib andmebaasifail olla rikutud.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid random stream id size</source>
|
||||
<translation>sobimatu juhuvoo ID suurus</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid inner random stream cipher</source>
|
||||
<translation>sobimatu sisemine juhuvoo šiffer</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Not a KeePass database.</source>
|
||||
@@ -3942,11 +3941,11 @@ Teisendus on ühesuunaline, seega imporditud andmebaasi ei saa vana KeePassX 0.4
|
||||
</message>
|
||||
<message>
|
||||
<source>Multiple group elements</source>
|
||||
<translation>mitu grupielementi</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Null group uuid</source>
|
||||
<translation>nullväärtusega grupi-UUID</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid group icon number</source>
|
||||
@@ -3966,15 +3965,15 @@ Teisendus on ühesuunaline, seega imporditud andmebaasi ei saa vana KeePassX 0.4
|
||||
</message>
|
||||
<message>
|
||||
<source>Null DeleteObject uuid</source>
|
||||
<translation>nullväärtusega DeleteObject’i-UUID</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Missing DeletedObject uuid or time</source>
|
||||
<translation>DeletedObject’i UUID või ajaväärtus on puudu</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Null entry uuid</source>
|
||||
<translation>nullväärtusega kirje-UUID</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid entry icon number</source>
|
||||
@@ -4054,7 +4053,7 @@ Rida %2, veerg %3</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Private key is an attachment but no attachments provided.</source>
|
||||
<translation>Privaatvõti olevat kaasatud fail, aga kaasatud faile pole.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Private key is empty</source>
|
||||
@@ -4246,7 +4245,7 @@ Kui probleem püsib, võib andmebaasifail olla rikutud.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Inactive share %1</source>
|
||||
<translation>Mitteaktiivne jagatud ressurss %1</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Imported from %1</source>
|
||||
@@ -4270,7 +4269,7 @@ Kui probleem püsib, võib andmebaasifail olla rikutud.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Inactive share</source>
|
||||
<translation>Mitteaktiivne jagatud ressurss</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Imported from</source>
|
||||
@@ -4396,23 +4395,23 @@ Kas oled kindel, et soovid selle failiga jätkata?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Old key file format</source>
|
||||
<translation>Vanas vormingus võtmefail</translation>
|
||||
<translation>Võtmefaili vana vorming</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>You selected a key file in an old format which KeePassXC<br>may stop supporting in the future.<br><br>Please consider generating a new key file instead.</source>
|
||||
<translation>Valisid võtmefaili, mis on vanas vormingus, mille tugi võidakse<br>KeePassXC-st tulevikus eemaldada.<br><br>Palun genereeri selle asemele uus võtmefail.</translation>
|
||||
<translation>Sa kasutad vana võtmefaili vormingut ning KeePassXC<br> võib selle kasutamisest tulevikus loobuda.<br><br>Selle asemel palun kaalu uue võtmefaili genereerimist. </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate a new key file or choose an existing one to protect your database.</source>
|
||||
<translation>Andmebaasi kaitsmiseks saab genereerida uue võtmefaili või valida mõne olemasoleva.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Note: Do NOT use a file that may change as that will prevent you from unlocking your database.</source>
|
||||
<translation>NB: ära kasuta faili, mis võib muutuda, kuna sel juhul pole enam võimalik andmebaasi lukku avada!</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse…</source>
|
||||
<translation>Sirvi…</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -4883,11 +4882,11 @@ Eeldatavasti leidub selles programmivigu ja muid väiksemaid hädasid – see ve
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide Usernames</source>
|
||||
<translation>Kasutajanimede varjamine</translation>
|
||||
<translation>Peida kasutajanimed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide Passwords</source>
|
||||
<translation>Paroolide varjamine</translation>
|
||||
<translation>Peida paroolid</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -4928,19 +4927,19 @@ Eeldatavasti leidub selles programmivigu ja muid väiksemaid hädasid – see ve
|
||||
<name>Merger</name>
|
||||
<message>
|
||||
<source>Creating missing %1 [%2]</source>
|
||||
<translation>Puuduva kirje „%1” [%2] loomine</translation>
|
||||
<translation>Loon puuduva %1 [%2]</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Relocating %1 [%2]</source>
|
||||
<translation>Kirje „%1” [%2] teisaldamine</translation>
|
||||
<translation>Tuvastan %1 [%2] asukoha</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Overwriting %1 [%2]</source>
|
||||
<translation>Kirje „%1” [%2] ülekirjutamine</translation>
|
||||
<translation>Asendan %1 [%2]</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>older entry merged from database "%1"</source>
|
||||
<translation>andmebaasist „%1” mestitud vanem kirje</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Adding backup for older target %1 [%2]</source>
|
||||
@@ -4952,11 +4951,11 @@ Eeldatavasti leidub selles programmivigu ja muid väiksemaid hädasid – see ve
|
||||
</message>
|
||||
<message>
|
||||
<source>Reapplying older target entry on top of newer source %1 [%2]</source>
|
||||
<translation>Uuema lähtekirje „%1” [%2] peale vanema sihtkirje taasrakendamine</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reapplying older source entry on top of newer target %1 [%2]</source>
|
||||
<translation>Uuema sihtkirje „%1” [%2] peale vanema lähtekirje taasrakendamine</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Synchronizing from newer source %1 [%2]</source>
|
||||
@@ -4968,11 +4967,11 @@ Eeldatavasti leidub selles programmivigu ja muid väiksemaid hädasid – see ve
|
||||
</message>
|
||||
<message>
|
||||
<source>Deleting child %1 [%2]</source>
|
||||
<translation>Alamobjekti „%1” [%2] kustutamine</translation>
|
||||
<translation>Kustutan %1 alamgruppi [%2]</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Deleting orphan %1 [%2]</source>
|
||||
<translation>Orvuks jäänud objekti „%1” [%2] kustutamine</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changed deleted objects</source>
|
||||
@@ -5515,7 +5514,7 @@ Eeldatavasti leidub selles programmivigu ja muid väiksemaid hädasid – see ve
|
||||
</message>
|
||||
<message>
|
||||
<source>Excluded characters: "0", "O", "1", "l", "I", "|", "G", "6", "B", "8", "﹒"</source>
|
||||
<translation>Välistatud märgid: "0", "O", "1", "l", "I", "|", "G", "6", "B", "8", "﹒"</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -5656,7 +5655,7 @@ Eeldatavasti leidub selles programmivigu ja muid väiksemaid hädasid – see ve
|
||||
</message>
|
||||
<message>
|
||||
<source>Empty message received</source>
|
||||
<translation>Saadi tühi sõnum</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>No URL provided</source>
|
||||
@@ -5664,7 +5663,7 @@ Eeldatavasti leidub selles programmivigu ja muid väiksemaid hädasid – see ve
|
||||
</message>
|
||||
<message>
|
||||
<source>No logins found</source>
|
||||
<translation>Sisselogimisandmeid ei leitud</translation>
|
||||
<translation>Sisselogimiskontosid ei leidu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown error</source>
|
||||
@@ -5753,7 +5752,7 @@ Eeldatavasti leidub selles programmivigu ja muid väiksemaid hädasid – see ve
|
||||
</message>
|
||||
<message>
|
||||
<source>Perform advanced analysis on the password.</source>
|
||||
<translation>Parooli põhjalikum analüüsimine.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>
|
||||
@@ -5938,7 +5937,7 @@ Võimalikud käsud:
|
||||
</message>
|
||||
<message>
|
||||
<source>Not changing any field for entry %1.</source>
|
||||
<translation>Kirje "%1" ühtki välja ei muudeta.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter new password for entry: </source>
|
||||
@@ -5966,83 +5965,83 @@ Võimalikud käsud:
|
||||
</message>
|
||||
<message>
|
||||
<source>Multi-word extra bits %1</source>
|
||||
<translation>Mitmiksõna lisabitid %1</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: Bruteforce</source>
|
||||
<translation>Tüüp: jõhkra jõuga</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: Dictionary</source>
|
||||
<translation>Tüüp: sõnastik</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: Dict+Leet</source>
|
||||
<translation>Tüüp: sõnastik+1337</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: User Words</source>
|
||||
<translation>Tüüp: kasutaja sõnad</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: User+Leet</source>
|
||||
<translation>Tüüp: kasutaja+1337</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: Repeated</source>
|
||||
<translation>Tüüp: kordus</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: Sequence</source>
|
||||
<translation>Tüüp: jada</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: Spatial</source>
|
||||
<translation>Tüüp: ruumiline</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: Date</source>
|
||||
<translation>Tüüp: kuupäev</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: Bruteforce(Rep)</source>
|
||||
<translation>Tüüp: jõhkra jõuga (korduv)</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: Dictionary(Rep)</source>
|
||||
<translation>Tüüp: sõnastik (korduv)</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: Dict+Leet(Rep)</source>
|
||||
<translation>Tüüp: sõnastik+1337 (korduv)</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: User Words(Rep)</source>
|
||||
<translation>Tüüp: kasutaja sõnad (korduv)</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: User+Leet(Rep)</source>
|
||||
<translation>Tüüp: kasutaja+1337 (korduv)</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: Repeated(Rep)</source>
|
||||
<translation>Tüüp: kordus (korduv)</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: Sequence(Rep)</source>
|
||||
<translation>Tüüp: jada (korduv)</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: Spatial(Rep)</source>
|
||||
<translation>Tüüp: ruumiline (korduv)</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: Date(Rep)</source>
|
||||
<translation>Tüüp: kuupäev (korduv)</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Type: Unknown%1</source>
|
||||
<translation>Tüüp: teadmata %1</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Entropy %1 (%2)</source>
|
||||
@@ -6120,7 +6119,7 @@ Võimalikud käsud:
|
||||
</message>
|
||||
<message>
|
||||
<source>Successfully deleted entry %1.</source>
|
||||
<translation>Kirje "%1" edukalt kustutatud.</translation>
|
||||
<translation>Kirje „%1“ edukalt kustutatud.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show the entry's current TOTP.</source>
|
||||
@@ -6454,7 +6453,7 @@ Kernel: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Only print the changes detected by the merge operation.</source>
|
||||
<translation>Näitab, mida mestimise käigus tehtaks, tegelikult midagi muutmata.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Yubikey slot for the second database.</source>
|
||||
@@ -6510,7 +6509,7 @@ Kernel: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Successfully deleted group %1.</source>
|
||||
<translation>Grupp "%1" edukalt kustutatud.</translation>
|
||||
<translation>Grupp „%1“ edukalt kustutatud.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to open database file %1: not found</source>
|
||||
@@ -6554,7 +6553,7 @@ Kernel: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid password generator after applying all options</source>
|
||||
<translation>Kõigi valikute rakendamise järel saadi sobimatu parooligeneraator.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show the protected attributes in clear text.</source>
|
||||
@@ -6562,11 +6561,11 @@ Kernel: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browser Plugin Failure</source>
|
||||
<translation>Brauseriplugina tõrge</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not save the native messaging script file for %1.</source>
|
||||
<translation>Programmiomase teatevahetuse skripti salvestamine brauseri %1 jaoks ebaõnnestus.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy the given attribute to the clipboard. Defaults to "password" if not specified.</source>
|
||||
@@ -6586,7 +6585,7 @@ Kernel: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>ERROR: attribute %1 is ambiguous, it matches %2.</source>
|
||||
<translation>VIGA: atribuut %1 on mitmeti tõlgendatav, palun täpsusta: %2</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Attribute "%1" not found.</source>
|
||||
@@ -6752,14 +6751,13 @@ Kernel: %3 %4</translation>
|
||||
stop supporting in the future.
|
||||
|
||||
Please consider generating a new key file.</source>
|
||||
<translation>HOIATUS: kasutad võtmefaili, mis on vanas vormingus, mille tugi võidakse
|
||||
KeePassXC-st tulevikus eemaldada.
|
||||
<translation>HOIATUS: Sa kasutad võtmefaili vana formaati, mida KeePassXC võib tulevikus mitte toetada.
|
||||
|
||||
Palun genereeri selle asemele uus võtmefail.</translation>
|
||||
Kaalu uue võtmefaili genereerimist.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Argon2%1 (%2 rounds, %3 KB)</source>
|
||||
<translation>Argon2%1 (%2 raundi, %3 KB)</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Argon2d (KDBX 4 – recommended)</source>
|
||||
@@ -6783,27 +6781,27 @@ Palun genereeri selle asemele uus võtmefail.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Checksum mismatch! Key file may be corrupt.</source>
|
||||
<translation>Kontrollsumma ei klapi. Võtmefail võib olla rikutud.</translation>
|
||||
<translation>Kontrollsumma ei klapi! Võtmefail võib olla vigane.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unexpected key file data! Key file may be corrupt.</source>
|
||||
<translation>Ootamatud andmed võtmefailis. Võtmefail võib olla rikutud.</translation>
|
||||
<translation>Võtmefailis leidub imelikke andmeid! Võtmefail võib olla vigane.</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Clearing the clipboard in %1 second(s)…</source>
|
||||
<translation><numerusform>Lõikepuhver puhastatakse %1 sekundi pärast…</numerusform><numerusform>Lõikepuhver puhastatakse %1 sekundi pärast…</numerusform></translation>
|
||||
<translation type="unfinished"><numerusform></numerusform><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>lock all open databases</source>
|
||||
<translation>Kõigi avatud andmebaaside lukustamine.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Locked databases.</source>
|
||||
<translation>Andmebaasid lukustatud.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database failed to lock.</source>
|
||||
<translation>Andmebaasi lukustamine ebaõnnestus.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -6814,15 +6812,15 @@ Palun genereeri selle asemele uus võtmefail.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error writing to underlying device: </source>
|
||||
<translation>Viga alusseadmesse kirjutamisel: </translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error opening underlying device: </source>
|
||||
<translation>Viga alusseadme avamisel: </translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error reading data from underlying device: </source>
|
||||
<translation>Viga alusseadmest andmete lugemisel: </translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Internal zlib error when decompressing: </source>
|
||||
@@ -7136,15 +7134,15 @@ Palun genereeri selle asemele uus võtmefail.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No agent running, cannot add identity.</source>
|
||||
<translation>Ükski agent ei tööta, identiteeti pole võimalik lisada.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>No agent running, cannot remove identity.</source>
|
||||
<translation>Ükski agent ei tööta, identiteeti pole võimalik eemaldada.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Agent refused this identity. Possible reasons include:</source>
|
||||
<translation>Agent lükkas selle identiteedi tagasi. Võimalikud põhjused:</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>The key has already been added.</source>
|
||||
@@ -7152,19 +7150,19 @@ Palun genereeri selle asemele uus võtmefail.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Restricted lifetime is not supported by the agent (check options).</source>
|
||||
<translation>Agent ei toeta piiratud kehtivusaega (kontrolli seadeid).</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>A confirmation request is not supported by the agent (check options).</source>
|
||||
<translation>Agent ei toeta kinnitustaotlusi (kontrolli seadeid).</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key identity ownership conflict. Refusing to add.</source>
|
||||
<translation>Võtme identiteedi omanduse konflikt. Lisamisest keelduti.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>No agent running, cannot list identities.</source>
|
||||
<translation>Ükski agent ei tööta, identiteete pole võimalik loetleda.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -7414,7 +7412,7 @@ Palun genereeri selle asemele uus võtmefail.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The exported certificate is not the same as the one in use. Do you want to export the current certificate?</source>
|
||||
<translation>Eksporditav sertifikaat pole sama, mis kasutusel on. Kas tahad ikkagi praeguse sertifikaadi eksportida?</translation>
|
||||
<translation>Eksporditud sertifikaat pole sama, mis on praegu kasutusel. Kas soovid eksportida praeguse sertifikaadi?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Signer:</source>
|
||||
@@ -7454,7 +7452,7 @@ Palun genereeri selle asemele uus võtmefail.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Known shares</source>
|
||||
<translation>Teadaolevad jagatud ressursid</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Trust selected certificate</source>
|
||||
@@ -7462,11 +7460,11 @@ Palun genereeri selle asemele uus võtmefail.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Ask whether to trust the selected certificate every time</source>
|
||||
<translation>Küsi iga kord, kas usaldada valitud sertifikaati</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Untrust selected certificate</source>
|
||||
<translation>Märgi valitud sertifikaat ebausaldusväärseks</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remove selected certificate</source>
|
||||
@@ -7477,7 +7475,7 @@ Palun genereeri selle asemele uus võtmefail.</translation>
|
||||
<name>ShareExport</name>
|
||||
<message>
|
||||
<source>Overwriting signed share container is not supported - export prevented</source>
|
||||
<translation>Allkirjastatud jagamisümbriku ülekirjutamist ei toetata – midagi ei eksporditud</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not write export container (%1)</source>
|
||||
@@ -7485,23 +7483,23 @@ Palun genereeri selle asemele uus võtmefail.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not embed signature: Could not open file to write (%1)</source>
|
||||
<translation>Allkirja põimimine polnud võimalik: faili ei õnnestunud kirjutamiseks avada (%1)</translation>
|
||||
<translation>Allkirja lõimimine ei õnnestunud: faili ei õnnestunud salvestamiseks avada (%1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not embed signature: Could not write file (%1)</source>
|
||||
<translation>Allkirja põimimine polnud võimalik: faili ei õnnestunud kirjutada (%1)</translation>
|
||||
<translation>Allkirja lõimimine ei õnnestunud: faili ei õnnestunud salvestada (%1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not embed database: Could not open file to write (%1)</source>
|
||||
<translation>Andmebaasi põimimine polnud võimalik: faili ei õnnestunud kirjutamiseks avada (%1)</translation>
|
||||
<translation>Andmebaasi lõimimine ei õnnestunud: faili ei õnnestunud salvestamiseks avada (%1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not embed database: Could not write file (%1)</source>
|
||||
<translation>Andmebaasi põimimine polnud võimalik: faili ei õnnestunud kirjutada (%1)</translation>
|
||||
<translation>Andmebaasi lõimimine ei õnnestunud: faili ei õnnestunud salvestada (%1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Overwriting unsigned share container is not supported - export prevented</source>
|
||||
<translation>Allkirjastamata jagamisümbriku ülekirjutamist ei toetata – midagi ei eksporditud</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not write export container</source>
|
||||
@@ -7516,15 +7514,15 @@ Palun genereeri selle asemele uus võtmefail.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?</source>
|
||||
<translation>Selle jagatud ümbriku allikat pole võimalik verifitseerida, kuna see on allkirjastamata. Kas soovid siiski asukohast „%1” importida?</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import from container with certificate</source>
|
||||
<translation>Sertifikaadiga ümbrikust importimine</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do you want to trust %1 with the fingerprint of %2 from %3?</source>
|
||||
<translation>Kas %1 on usaldusväärne allkirjastaja? Sertifikaadi sõrmejälg on %2 ja asukoht „%3”. {1 ?} {2 ?}</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Not this time</source>
|
||||
@@ -7544,7 +7542,7 @@ Palun genereeri selle asemele uus võtmefail.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Signed share container are not supported - import prevented</source>
|
||||
<translation>Allkirjastatud jagamisümbrikke ei toetata – midagi ei imporditud</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>File is not readable</source>
|
||||
@@ -7552,11 +7550,11 @@ Palun genereeri selle asemele uus võtmefail.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid sharing container</source>
|
||||
<translation>Sobimatu jagamisümbrik</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Untrusted import prevented</source>
|
||||
<translation>Ebausaldusväärsest allikast importimisest hoiduti</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Successful signed import</source>
|
||||
@@ -7564,7 +7562,7 @@ Palun genereeri selle asemele uus võtmefail.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unsigned share container are not supported - import prevented</source>
|
||||
<translation>Allkirjastamata jagamisümbrikke ei toetata – midagi ei imporditud</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Successful unsigned import</source>
|
||||
@@ -7844,7 +7842,7 @@ Näide: JBSWY3DPEHPK3PXP</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 Invalid slot specified - %2</source>
|
||||
<translation>%1: määrati sobimatu pesa – %2</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>The YubiKey interface has not been initialized.</source>
|
||||
@@ -7883,7 +7881,7 @@ Näide: JBSWY3DPEHPK3PXP</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><p>If you own a <a href="https://www.yubico.com/">YubiKey</a>, you can use it for additional security.</p><p>The YubiKey requires one of its slots to be programmed as <a href="https://www.yubico.com/products/services-software/personalization-tools/challenge-response/">HMAC-SHA1 Challenge-Response</a>.</p></source>
|
||||
<translation><p>Kui sul on <a href="https://www.yubico.com/">YubiKey</a> turvavõti, võid lisaturvalisuse nimel seda kasutada.</p><p>YubiKey ühe pesa peab programmeerima <a href="https://www.yubico.com/products/services-software/personalization-tools/challenge-response/">HMAC-SHA1 pretensiooni ja vastusena</a>.</p></translation>
|
||||
<translation><p>Kui sul on <a href="https://www.yubico.com/">YubiKey</a>, võid lisaturvalisuse nimel seda kasutada.</p><p>Ühe YubiKey pesa pead programmeerima <a href="https://www.yubico.com/products/services-software/personalization-tools/challenge-response/">HMAC-SHA1 pretensiooni ja vastusena</a>.</p></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Refresh hardware tokens</source>
|
||||
@@ -141,7 +141,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Monochrome</source>
|
||||
<translation>Monokrom</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -430,7 +430,7 @@
|
||||
</message>
|
||||
<message>
|
||||
<source>Database lock timeout seconds</source>
|
||||
<translation>Lama waktu habis penguncian basisdata</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source> min</source>
|
||||
@@ -603,7 +603,7 @@
|
||||
<name>BrowserEntrySaveDialog</name>
|
||||
<message>
|
||||
<source>KeePassXC-Browser Save Entry</source>
|
||||
<translation>Entri Penyimpanan KeePassXC-Browser</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Ok</source>
|
||||
@@ -1108,11 +1108,11 @@ chrome-laptop.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>First line has field names</source>
|
||||
<translation>Baris pertama memiliki nama ruas</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Not Present</source>
|
||||
<translation>Tidak Tersedia</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Column %1</source>
|
||||
@@ -2504,7 +2504,7 @@ Unfortunately, any changes made have been lost.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do not use this entry with HTTP Basic Auth</source>
|
||||
<translation>Jangan gunakan entri ini dengan Otentikasi Dasar HTTP</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -3005,15 +3005,15 @@ Ekstensi yang didukung adalah: %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Also apply to child groups</source>
|
||||
<translation>Juga terapkan ke grup di dalamnya</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Also apply to child entries</source>
|
||||
<translation>Juga terapkan ke entri di dalamnya</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Also apply to all children</source>
|
||||
<translation>Juga terapkan ke semua grup dan entri</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Existing icon selected.</source>
|
||||
@@ -4411,7 +4411,7 @@ Apakah Anda yakin ingin melanjutkan dengan berkas ini?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse…</source>
|
||||
<translation>Telusuri…</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -4859,7 +4859,7 @@ Jangan kaget jika ada masalah dan bug, versi ini tidak ditujukan untuk penggunaa
|
||||
</message>
|
||||
<message>
|
||||
<source>Perform Auto-Type Sequence</source>
|
||||
<translation>Jalankan Sekuens Ketik-Otomatis</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>{USERNAME}</source>
|
||||
@@ -5109,19 +5109,19 @@ Jangan kaget jika ada masalah dan bug, versi ini tidak ditujukan untuk penggunaa
|
||||
<name>OpVaultReader</name>
|
||||
<message>
|
||||
<source>Directory .opvault must exist</source>
|
||||
<translation>Direktori .opvault harus ada</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Directory .opvault must be readable</source>
|
||||
<translation>Direktori .opvault harus bisa dibaca</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Directory .opvault/default must exist</source>
|
||||
<translation>Direktori .opvault/default harus ada</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Directory .opvault/default must be readable</source>
|
||||
<translation>Direktori .opvault/default harus bisa dibaca</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to decode masterKey: %1</source>
|
||||
@@ -5450,7 +5450,7 @@ Jangan kaget jika ada masalah dan bug, versi ini tidak ditujukan untuk penggunaa
|
||||
</message>
|
||||
<message>
|
||||
<source>Word Case:</source>
|
||||
<translation>Besar Kecil Kata:</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Regenerate password</source>
|
||||
@@ -5470,7 +5470,7 @@ Jangan kaget jika ada masalah dan bug, versi ini tidak ditujukan untuk penggunaa
|
||||
</message>
|
||||
<message>
|
||||
<source>Title Case</source>
|
||||
<translation>Besar Kecil Judul</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate Password</source>
|
||||
@@ -5514,7 +5514,7 @@ Jangan kaget jika ada masalah dan bug, versi ini tidak ditujukan untuk penggunaa
|
||||
</message>
|
||||
<message>
|
||||
<source>Excluded characters: "0", "O", "1", "l", "I", "|", "G", "6", "B", "8", "﹒"</source>
|
||||
<translation>Pengecualian karakter: "0", "O", "1", "l", "I", "|", "G", "6", "B", "8", "﹒"</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -5904,7 +5904,7 @@ Perintah yang tersedia:
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid timeout value %1.</source>
|
||||
<translation>Nilai waktu habis tidak valid %1.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Entry %1 not found.</source>
|
||||
@@ -5912,7 +5912,7 @@ Perintah yang tersedia:
|
||||
</message>
|
||||
<message>
|
||||
<source>Entry with path %1 has no TOTP set up.</source>
|
||||
<translation>Entri dengan jalur %1 belum memiliki TOTP.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Clearing the clipboard in %1 second(s)...</source>
|
||||
@@ -5924,7 +5924,7 @@ Perintah yang tersedia:
|
||||
</message>
|
||||
<message>
|
||||
<source>Silence password prompt and other secondary outputs.</source>
|
||||
<translation>Jangan tampilkan pengingat sandi dan kaluaran sekunder lainnya.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>count</source>
|
||||
@@ -6115,7 +6115,7 @@ Perintah yang tersedia:
|
||||
</message>
|
||||
<message>
|
||||
<source>Successfully recycled entry %1.</source>
|
||||
<translation>Berhasil mendaur ulang entri: %1.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Successfully deleted entry %1.</source>
|
||||
@@ -6193,11 +6193,11 @@ Perintah yang tersedia:
|
||||
</message>
|
||||
<message>
|
||||
<source>Creating KeyFile %1 failed: %2</source>
|
||||
<translation>Membuat BerkasKunci %1 gagal: %2</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Loading KeyFile %1 failed: %2</source>
|
||||
<translation>Memuat BerkasKunci %1 gagal: %2</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Path of the entry to remove.</source>
|
||||
@@ -6329,11 +6329,11 @@ Kernel: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cryptographic libraries:</source>
|
||||
<translation>Pustaka kriptografi:</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cannot generate a password and prompt at the same time!</source>
|
||||
<translation>Tidak bisa membuat sandi dan pengingat secara bersamaan!</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Adds a new group to a database.</source>
|
||||
@@ -6389,7 +6389,7 @@ Kernel: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid word count %1</source>
|
||||
<translation>Jumlah kata tidak valid %1</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>The word list is too small (< 1000 items)</source>
|
||||
@@ -6433,7 +6433,7 @@ Kernel: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Path of the XML database export.</source>
|
||||
<translation>Jalur ke berkas XML hasil ekspor basisdata.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Path of the new database.</source>
|
||||
@@ -6517,7 +6517,7 @@ Kernel: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to open database file %1: not a plain file</source>
|
||||
<translation>Gagal membuka berkas basisdata %1: bukan berkas biasa</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to open database file %1: not readable</source>
|
||||
@@ -6529,7 +6529,7 @@ Kernel: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Invalid YubiKey slot %1</source>
|
||||
<translation>Slot YubiKey tidak valid %1</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enter password to encrypt database (optional): </source>
|
||||
@@ -6537,7 +6537,7 @@ Kernel: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>HIBP file, line %1: parse error</source>
|
||||
<translation>Berkas HIBP, baris %1: galat urai</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Secret Service Integration</source>
|
||||
@@ -6561,7 +6561,7 @@ Kernel: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browser Plugin Failure</source>
|
||||
<translation>Kegagalan Pengaya Peramban</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not save the native messaging script file for %1.</source>
|
||||
@@ -6577,7 +6577,7 @@ Kernel: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy an entry's attribute to the clipboard.</source>
|
||||
<translation>Salin atribut entri ke papan klip.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>ERROR: Please specify one of --attribute or --totp, not both.</source>
|
||||
@@ -6791,15 +6791,15 @@ Please consider generating a new key file.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>lock all open databases</source>
|
||||
<translation>kunci semua basisdata yang terbuka</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Locked databases.</source>
|
||||
<translation>Basisdata terkunci.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database failed to lock.</source>
|
||||
<translation>Basisdata gagal dikunci.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -6922,7 +6922,7 @@ Please consider generating a new key file.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Perform Online Analysis</source>
|
||||
<translation>Jalankan Analisis Daring</translation>
|
||||
<translation>Lakukan Analisis Online</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Also show entries that have been excluded from reports</source>
|
||||
@@ -4404,15 +4404,15 @@ Are you sure you want to continue with this file?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Generate a new key file or choose an existing one to protect your database.</source>
|
||||
<translation>データベースを保護するための新しいキーファイルを生成するか、既存のキーファイルを選択してください。</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Note: Do NOT use a file that may change as that will prevent you from unlocking your database.</source>
|
||||
<translation>備考: 内容が変更される可能性があるファイルを使用すると、データベースのロックを解除できなくなる恐れがあります。</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse…</source>
|
||||
<translation>参照…</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -5515,7 +5515,7 @@ Expect some bugs and minor issues, this version is not meant for production use.
|
||||
</message>
|
||||
<message>
|
||||
<source>Excluded characters: "0", "O", "1", "l", "I", "|", "G", "6", "B", "8", "﹒"</source>
|
||||
<translation>除外される文字: "0", "O", "1", "l", "I", "|", "G", "6", "B", "8", "﹒"</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -6792,19 +6792,19 @@ Please consider generating a new key file.</source>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>Clearing the clipboard in %1 second(s)…</source>
|
||||
<translation><numerusform>%1 秒後にクリップボードを消去します…</numerusform></translation>
|
||||
<translation type="unfinished"><numerusform></numerusform></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>lock all open databases</source>
|
||||
<translation>開いている全データベースをロックする</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Locked databases.</source>
|
||||
<translation>データベースをロックしました。</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database failed to lock.</source>
|
||||
<translation>データベースのロックに失敗しました。</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||