diff --git a/.clang-format b/.clang-format index 5dc8fc3b0..3838b6b1f 100644 --- a/.clang-format +++ b/.clang-format @@ -23,11 +23,10 @@ BraceWrapping: AfterClass: true AfterFunction: true AfterControlStatement: false - AfterEnum: false - AfterNamespace: false - AfterObjCDeclaration: false - AfterStruct: false - AfterUnion: false + AfterEnum: true + AfterNamespace: true + AfterStruct: true + AfterUnion: true BeforeCatch: false BeforeElse: false IndentBraces: false diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 67b0e1746..4f937513c 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -53,7 +53,7 @@ If we reject your contribution, it means only that we do not consider it suitabl ## How can I contribute? ### Feature requests -We're always looking for suggestions to improve our application. If you have a suggestion to improve an existing feature, or would like to suggest a completely new feature for KeePassXC, please use the [issue tracker on GitHub][issues-section]. For more general discussion, try using our [Google Groups][google-groups] forum. +We're always looking for suggestions to improve our application. If you have a suggestion to improve an existing feature, or would like to suggest a completely new feature for KeePassXC, please use the [issue tracker on GitHub][issues-section]. ### Bug reports @@ -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, using the [Google Groups][google-groups] forum, or in the IRC channel on Freenode (`#keepassxc-dev` on `irc.freenode.net`, or use a [webchat link](https://webchat.freenode.net/?channels=%23keepassxc-dev)). +As with feature requests, you can talk to the KeePassXC team about bugs, new features, other issues and pull requests on the dedicated issue tracker, 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 @@ -103,18 +103,8 @@ The Branch Strategy is based on [git-flow-lite](http://nvie.com/posts/a-successf * Use the imperative mood ("Move cursor to…" not "Moves cursor to…") * Limit the first line to 72 characters or less * Reference issues and pull requests liberally +* If your pull request fixes an existing issue, add "…, resolves #ISSUENUMBER" to your main commit * When only changing documentation, include `[ci skip]` in the commit description -* Consider starting the commit message with an applicable emoji: - * :memo: `:memo:` when writing docs - * :penguin: `:penguin:` when fixing something on Linux - * :apple: `:apple:` when fixing something on macOS - * :checkered_flag: `:checkered_flag:` when fixing something on Windows - * :bug: `:bug:` when fixing a bug - * :fire: `:fire:` when removing code or files - * :green_heart: `:green_heart:` when fixing the CI build - * :white_check_mark: `:white_check_mark:` when adding tests - * :lock: `:lock:` when dealing with security - ### Coding styleguide @@ -177,4 +167,3 @@ Example: `` [beginner]:https://github.com/keepassxreboot/keepassx/issues?q=is%3Aopen+is%3Aissue+label%3Abeginner+label%3A%22help+wanted%22+sort%3Acomments-desc [help-wanted]:https://github.com/keepassxreboot/keepassx/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+sort%3Acomments-desc [issues-section]:https://github.com/keepassxreboot/keepassxc/issues -[google-groups]:https://groups.google.com/forum/#!forum/keepassx-reboot diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 1a3f1a064..cf8b88f10 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -24,9 +24,17 @@ -## Your Environment - -* KeePassXC version/commit used: (can be found under Help -> About) -* Qt version (e.g. Qt 5.3): -* Compiler (e.g. Clang++3.6.0): -* Operating System and version: +## Debug Info + +KeePassXC - VERSION +Revision: REVISION + +Libraries: +- LIBS + +Operating system: OS +CPU architecture: ARCH +Kernel: KERNEL + +Enabled extensions: +- EXTENSIONS diff --git a/.gitignore b/.gitignore index 479c589ea..c96688e9f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,7 @@ release*/ *.kdev4 \.vscode/ +*.swp + +.DS_Store +.version \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 942bb426d..000000000 --- a/.travis.yml +++ /dev/null @@ -1,47 +0,0 @@ -language: cpp -sudo: required -dist: trusty -# FIXME : remove when (https://github.com/google/sanitizers/issues/837) is resolved. -group: deprecated-2017Q3 -services: [docker] - -os: - - linux -# - osx - -# Define clang compiler without any frills -compiler: - - clang - - gcc - -env: - - CONFIG=Release ASAN_OPTIONS=detect_odr_violation=1 - - CONFIG=Debug ASAN_OPTIONS=detect_odr_violation=1 - -git: - depth: 3 - -before_install: - - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq update; fi - - if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get -qq install cmake libclang-common-3.5-dev libxi-dev qtbase5-dev libqt5x11extras5-dev qttools5-dev qttools5-dev-tools libgcrypt20-dev zlib1g-dev libxtst-dev xvfb libyubikey-dev libykpers-1-dev; fi - - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew update; fi - - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq cmake || brew install cmake; fi - - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq qt5 || brew install qt5; fi - - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew ls | grep -wq libgcrypt || brew install libgcrypt; fi - -before_script: - - if [ "$TRAVIS_OS_NAME" = "osx" ]; then CMAKE_ARGS="-DCMAKE_PREFIX_PATH=/usr/local/opt/qt5"; fi - - mkdir build && pushd build - -script: - - cmake -DCMAKE_BUILD_TYPE=${CONFIG} -DWITH_GUI_TESTS=ON -DWITH_ASAN=ON -DWITH_XC_HTTP=ON -DWITH_XC_AUTOTYPE=ON -DWITH_XC_YUBIKEY=ON $CMAKE_ARGS .. - - make -j2 - - if [ "$TRAVIS_OS_NAME" = "linux" ]; then make test ARGS+="-E testgui --output-on-failure"; fi - - if [ "$TRAVIS_OS_NAME" = "linux" ]; then ASAN_OPTIONS=${ASAN_OPTIONS}:leak_check_at_exit=0 xvfb-run -a --server-args="-screen 0 800x600x24" make test ARGS+="-R testgui --output-on-failure"; fi - - if [ "$TRAVIS_OS_NAME" = "osx" ]; then make test ARGS+="--output-on-failure"; fi - -# Generate snapcraft build when merging into master/develop branches -#after_success: -# - popd -# - "[[ $DEPLOY = 1 ]] && [[ $CONFIG = Release ]] && [[ $TRAVIS_BRANCH =~ (master|develop) ]] && [[ $TRAVIS_PULL_REQUEST = false ]] \ -# && docker run -v $(pwd):/cwd snapcore/snapcraft sh -c 'cd /cwd && apt update && snapcraft'" diff --git a/AppImage-Recipe.sh b/AppImage-Recipe.sh index a5124a74b..9975f4939 100755 --- a/AppImage-Recipe.sh +++ b/AppImage-Recipe.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # # KeePassXC AppImage Recipe -# Copyright (C) 2017 KeePassXC team +# Copyright (C) 2017-2018 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 @@ -37,12 +37,14 @@ VERSION="$2" export ARCH=x86_64 mkdir -p $APP.AppDir -wget -q https://github.com/probonopd/AppImages/raw/master/functions.sh -O ./functions.sh +wget -q https://github.com/AppImage/AppImages/raw/master/functions.sh -O ./functions.sh . ./functions.sh LIB_DIR=./usr/lib if [ -d ./usr/lib/x86_64-linux-gnu ]; then LIB_DIR=./usr/lib/x86_64-linux-gnu +elif [ -d ./usr/lib/i386-linux-gnu ]; then + LIB_DIR=./usr/lib/i386-linux-gnu elif [ -d ./usr/lib64 ]; then LIB_DIR=./usr/lib64 fi @@ -60,17 +62,25 @@ if [ "$QXCB_PLUGIN" == "" ]; then fi QT_PLUGIN_PATH="$(dirname $(dirname $QXCB_PLUGIN))" mkdir -p ".${QT_PLUGIN_PATH}/platforms" -cp "$QXCB_PLUGIN" ".${QT_PLUGIN_PATH}/platforms/" +cp -a "$QXCB_PLUGIN" ".${QT_PLUGIN_PATH}/platforms/" +cp -a "${QT_PLUGIN_PATH}/platforminputcontexts/" ".${QT_PLUGIN_PATH}/platforminputcontexts/" +cp -a "${QT_PLUGIN_PATH}/imageformats/" ".${QT_PLUGIN_PATH}/imageformats/" get_apprun copy_deps + +# protect our libgpg-error from being deleted +mv ./opt/keepassxc-libs/lib/x86_64-linux-gnu/libgpg-error.so.0 ./protected.so delete_blacklisted +mv ./protected.so ./opt/keepassxc-libs/lib/x86_64-linux-gnu/libgpg-error.so.0 get_desktop get_icon cat << EOF > ./usr/bin/keepassxc_env #!/usr/bin/env bash export LD_LIBRARY_PATH="..$(dirname ${QT_PLUGIN_PATH})/lib:\${LD_LIBRARY_PATH}" +export LD_LIBRARY_PATH="../opt/keepassxc-libs/lib/x86_64-linux-gnu:\${LD_LIBRARY_PATH}" + export QT_PLUGIN_PATH="..${QT_PLUGIN_PATH}:\${KPXC_QT_PLUGIN_PATH}" # unset XDG_DATA_DIRS to make tray icon work in Ubuntu Unity @@ -80,6 +90,11 @@ unset XDG_DATA_DIRS if [ "\${1}" == "cli" ]; then shift exec keepassxc-cli "\$@" +elif [ "\${1}" == "proxy" ]; then + shift + exec keepassxc-proxy "\$@" +elif [ -v CHROME_WRAPPER ] || [ -v MOZ_LAUNCHED_CHILD ]; then + exec keepassxc-proxy "\$@" else exec keepassxc "\$@" fi diff --git a/CHANGELOG b/CHANGELOG index 24e935548..038943890 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,55 @@ +2.3.0 (2018-02-27) +========================= + +- Add support for KDBX 4.0, Argon2 and ChaCha20 [#148, #1179, #1230, #1494] +- Add SSH Agent feature [#1098, #1450, #1463] +- Add preview panel with details of the selected entry [#879, #1338] +- Add more and configurable columns to entry table and allow copying of values by double click [#1305] +- Add KeePassXC-Browser API as a replacement for KeePassHTTP [#608] +- Deprecate KeePassHTTP [#1392] +- Add support for Steam one-time passwords [#1206] +- Add support for multiple Auto-Type sequences for a single entry [#1390] +- Adjust YubiKey HMAC-SHA1 challenge-response key generation for KDBX 4.0 [#1060] +- Replace qHttp with cURL for website icon downloads [#1460] +- Remove lock file [#1231] +- Add option to create backup file before saving [#1385] +- Ask to save a generated password before closing the entry password generator [#1499] +- Resolve placeholders recursively [#1078] +- Add Auto-Type button to the toolbar [#1056] +- Improve window focus handling for Auto-Type dialogs [#1204, #1490] +- Auto-Type dialog and password generator can now be exited with ESC [#1252, #1412] +- Add optional dark tray icon [#1154] +- Add new "Unsafe saving" option to work around saving problems with file sync services [#1385] +- Add IBus support to AppImage and additional image formats to Windows builds [#1534, #1537] +- Add diceware password generator to CLI [#1406] +- Add --key-file option to CLI [#816, #824] +- Add DBus interface for opening and closing KeePassXC databases [#283] +- Add KDBX compression options to database settings [#1419] +- Discourage use of old fixed-length key files in favor of arbitrary files [#1326, #1327] +- Correct reference resolution in entry fields [#1486] +- Fix window state and recent databases not being remembered on exit [#1453] +- Correct history item generation when configuring TOTP for an entry [#1446] +- Correct multiple TOTP bugs [#1414] +- Automatic saving after every change is now a default [#279] +- Allow creation of new entries during search [#1398] +- Correct menu issues on macOS [#1335] +- Allow compilation on OpenBSD [#1328] +- Improve entry attachments view [#1139, #1298] +- Fix auto lock for Gnome and Xfce [#910, #1249] +- Don't remember key files in file dialogs when the setting is disabled [#1188] +- Improve database merging and conflict resolution [#807, #1165] +- Fix macOS pasteboard issues [#1202] +- Improve startup times on some platforms [#1205] +- Hide the notes field by default [#1124] +- Toggle main window by clicking tray icon with the middle mouse button [#992] +- Fix custom icons not copied over when databases are merged [#1008] +- Allow use of DEL key to delete entries [#914] +- Correct intermittent crash due to stale history items [#1527] +- Sanitize newline characters in title, username and URL fields [#1502] +- Reopen previously opened databases in correct order [#774] +- Use system's zxcvbn library if available [#701] +- Implement various i18n improvements [#690, #875, #1436] + 2.2.4 (2017-12-13) ========================= diff --git a/CMakeLists.txt b/CMakeLists.txt index 479ea86f5..7410b4e04 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ -# Copyright (C) 2010 Felix Geyer # Copyright (C) 2017 KeePassXC Team +# Copyright (C) 2010 Felix Geyer # # 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 @@ -14,16 +14,16 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . +cmake_minimum_required(VERSION 3.1.0) + +project(KeePassXC) + if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo Debug DebugFull Profile MinSizeRel." FORCE) endif() -project(KeePassXC) - -cmake_minimum_required(VERSION 3.1.0) - set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) # Support Visual Studio Code @@ -36,30 +36,89 @@ include(CheckCXXSourceCompiles) option(WITH_TESTS "Enable building of unit tests" ON) option(WITH_GUI_TESTS "Enable building of GUI tests" OFF) option(WITH_DEV_BUILD "Use only for development. Disables/warns about deprecated methods." OFF) -option(WITH_ASAN "Enable address sanitizer checks (Linux only)" OFF) +option(WITH_ASAN "Enable address sanitizer checks (Linux / macOS only)" OFF) option(WITH_COVERAGE "Use to build with coverage tests (GCC only)." OFF) -option(WITH_APP_BUNDLE "Enable Application Bundle for OS X" ON) +option(WITH_APP_BUNDLE "Enable Application Bundle for macOS" ON) + +set(WITH_XC_ALL OFF CACHE BOOLEAN "Build in all available plugins") option(WITH_XC_AUTOTYPE "Include Auto-Type." ON) -option(WITH_XC_HTTP "Include KeePassHTTP and Custom Icon Downloads." OFF) +option(WITH_XC_NETWORKING "Include networking code (e.g. for downlading website icons)." OFF) +option(WITH_XC_BROWSER "Include browser integration with keepassxc-browser." OFF) +option(WITH_XC_HTTP "Include KeePassHTTP-compatible browser integration (deprecated, implies WITH_NETWORKING)." OFF) option(WITH_XC_YUBIKEY "Include YubiKey support." OFF) +option(WITH_XC_SSHAGENT "Include SSH agent support." OFF) + +if(WITH_XC_HTTP) + message(WARNING "KeePassHTTP support has been deprecated and will be removed in a future version. Please use WITH_XC_BROWSER instead!\n" + "For enabling / disabling network access code, WITH_XC_HTTP has been replaced by WITH_XC_NETWORKING.") + set(WITH_XC_NETWORKING ON CACHE BOOL "Include networking code (e.g. for downlading website icons)." FORCE) +endif() + +if(WITH_XC_ALL) + # Enable all options + set(WITH_XC_AUTOTYPE ON) + set(WITH_XC_NETWORKING ON) + set(WITH_XC_BROWSER ON) + set(WITH_XC_HTTP ON) # Deprecated + set(WITH_XC_YUBIKEY ON) + set(WITH_XC_SSHAGENT ON) +endif() # Process ui files automatically from source files set(CMAKE_AUTOUIC ON) set(KEEPASSXC_VERSION_MAJOR "2") -set(KEEPASSXC_VERSION_MINOR "2") -set(KEEPASSXC_VERSION_PATCH "4") +set(KEEPASSXC_VERSION_MINOR "3") +set(KEEPASSXC_VERSION_PATCH "0") set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION_MAJOR}.${KEEPASSXC_VERSION_MINOR}.${KEEPASSXC_VERSION_PATCH}") +set(KEEPASSXC_BUILD_TYPE "Snapshot" CACHE STRING "Set KeePassXC build type to distinguish between stable releases and snapshots") +set_property(CACHE KEEPASSXC_BUILD_TYPE PROPERTY STRINGS Snapshot Release PreRelease) + +# Check if on a tag, if so build as a release +execute_process(COMMAND git tag --points-at HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_TAG) +if(NOT GIT_TAG AND EXISTS ${CMAKE_SOURCE_DIR}/.version) + file(READ ${CMAKE_SOURCE_DIR}/.version OVERRIDE_VERSION) +endif() + +string(REGEX REPLACE "(\r?\n)+" "" OVERRIDE_VERSION "${OVERRIDE_VERSION}") +if(OVERRIDE_VERSION) + if(OVERRIDE_VERSION MATCHES "^[\\.0-9]+-(alpha|beta)[0-9]+$") + set(KEEPASSXC_BUILD_TYPE PreRelease) + set(KEEPASSXC_VERSION ${OVERRIDE_VERSION}) + elseif(OVERRIDE_VERSION MATCHES "^[\\.0-9]+$") + set(KEEPASSXC_BUILD_TYPE Release) + set(KEEPASSXC_VERSION ${OVERRIDE_VERSION}) + endif() +endif() + +if(KEEPASSXC_BUILD_TYPE STREQUAL "PreRelease" AND NOT OVERRIDE_VERSION) + set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION}-preview") +elseif(KEEPASSXC_BUILD_TYPE STREQUAL "Snapshot") + set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION}-snapshot") +endif() + +if(KEEPASSXC_BUILD_TYPE STREQUAL "Release") + set(KEEPASSXC_BUILD_TYPE_RELEASE ON) +elseif(KEEPASSXC_BUILD_TYPE STREQUAL "PreRelease") + set(KEEPASSXC_BUILD_TYPE_PRE_RELEASE ON) +else() + set(KEEPASSXC_BUILD_TYPE_SNAPSHOT ON) +endif() + +message(STATUS "Setting up build for KeePassXC v${KEEPASSXC_VERSION}\n") + # Distribution info -set(KEEPASSXC_DIST True) -set(KEEPASSXC_DIST_TYPE "Other" CACHE STRING "KeePassXC Distribution type") +set(KEEPASSXC_DIST ON) +set(KEEPASSXC_DIST_TYPE "Other" CACHE STRING "KeePassXC Distribution Type") set_property(CACHE KEEPASSXC_DIST_TYPE PROPERTY STRINGS Snap AppImage Other) if(KEEPASSXC_DIST_TYPE STREQUAL "Snap") - set(KEEPASSXC_DIST_SNAP True) + set(KEEPASSXC_DIST_SNAP ON) elseif(KEEPASSXC_DIST_TYPE STREQUAL "AppImage") - set(KEEPASSXC_DIST_APPIMAGE True) + set(KEEPASSXC_DIST_APPIMAGE ON) elseif(KEEPASSXC_DIST_TYPE STREQUAL "Other") unset(KEEPASSXC_DIST) endif() @@ -96,7 +155,7 @@ if(WITH_APP_BUNDLE) endif() add_gcc_compiler_flags("-fno-common") -add_gcc_compiler_flags("-Wall -Wextra -Wundef -Wpointer-arith -Wno-long-long") +add_gcc_compiler_flags("-Wall -Werror -Wextra -Wundef -Wpointer-arith -Wno-long-long") add_gcc_compiler_flags("-Wformat=2 -Wmissing-format-attribute") add_gcc_compiler_flags("-fvisibility=hidden") add_gcc_compiler_cxxflags("-fvisibility-inlines-hidden") @@ -110,21 +169,25 @@ 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") + if(WITH_ASAN) - if(NOT CMAKE_SYSTEM_NAME STREQUAL "Linux") - message(FATAL_ERROR "WITH_ASAN is only supported on Linux at the moment.") + if(NOT (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR APPLE)) + message(FATAL_ERROR "WITH_ASAN is only supported on Linux / macOS at the moment.") endif() add_gcc_compiler_flags("-fsanitize=address -DWITH_ASAN") - if(NOT (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)) - add_gcc_compiler_flags("-fsanitize=leak -DWITH_LSAN") + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + if(NOT (CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)) + add_gcc_compiler_flags("-fsanitize=leak -DWITH_LSAN") + endif() endif() + endif() string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER) if (CMAKE_BUILD_TYPE_LOWER MATCHES "(release|relwithdebinfo|minsizerel)") - add_gcc_compiler_flags("-D_FORTIFY_SOURCE=2") + add_gcc_compiler_flags("-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2") endif() check_c_compiler_flag("-Werror=format-security -Werror=implicit-function-declaration" WERROR_C_AVAILABLE) @@ -159,14 +222,13 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,relro,-z,now") endif() +add_gcc_compiler_cflags("-std=c99") add_gcc_compiler_cxxflags("-std=c++11") if(APPLE) add_gcc_compiler_cxxflags("-stdlib=libc++") endif() -add_gcc_compiler_cflags("-ansi") - if(WITH_DEV_BUILD) add_definitions(-DQT_DEPRECATED_WARNINGS -DGCRYPT_NO_DEPRECATED) endif() @@ -190,15 +252,18 @@ endif() if(APPLE AND WITH_APP_BUNDLE AND "${CMAKE_INSTALL_PREFIX}" STREQUAL "/usr/local") set(CMAKE_INSTALL_PREFIX "/Applications") + set(CMAKE_INSTALL_MANDIR "/usr/local/share/man") endif() if(MINGW) set(CLI_INSTALL_DIR ".") + set(PROXY_INSTALL_DIR ".") set(BIN_INSTALL_DIR ".") set(PLUGIN_INSTALL_DIR ".") set(DATA_INSTALL_DIR "share") elseif(APPLE AND WITH_APP_BUNDLE) set(CLI_INSTALL_DIR "/usr/local/bin") + set(PROXY_INSTALL_DIR "/usr/local/bin") set(BIN_INSTALL_DIR ".") set(PLUGIN_INSTALL_DIR "${PROGNAME}.app/Contents/PlugIns") set(DATA_INSTALL_DIR "${PROGNAME}.app/Contents/Resources") @@ -206,6 +271,7 @@ else() include(GNUInstallDirs) set(CLI_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}") + set(PROXY_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}") set(BIN_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}") set(PLUGIN_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/keepassxc") set(DATA_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/keepassxc") @@ -215,41 +281,53 @@ if(WITH_TESTS) enable_testing() endif(WITH_TESTS) -find_package(Qt5Core 5.2 REQUIRED) -find_package(Qt5Network 5.2 REQUIRED) -find_package(Qt5Concurrent 5.2 REQUIRED) -find_package(Qt5Widgets 5.2 REQUIRED) -find_package(Qt5Test 5.2 REQUIRED) -find_package(Qt5LinguistTools 5.2 REQUIRED) -find_package(Qt5Network 5.2 REQUIRED) -if (UNIX AND NOT APPLE) - find_package(Qt5DBus 5.2 REQUIRED) +if(UNIX AND NOT APPLE) + find_package(Qt5 COMPONENTS Core Network Concurrent Widgets Test LinguistTools DBus REQUIRED) +elseif(APPLE) + find_package(Qt5 COMPONENTS Core Network Concurrent Widgets Test LinguistTools REQUIRED + HINTS /usr/local/Cellar/qt/*/lib/cmake ENV PATH + ) + find_package(Qt5 COMPONENTS MacExtras + HINTS /usr/local/Cellar/qt/*/lib/cmake ENV PATH + ) +else() + find_package(Qt5 COMPONENTS Core Network Concurrent Widgets Test LinguistTools REQUIRED) endif() + +if(Qt5Core_VERSION VERSION_LESS "5.2.0") + message(FATAL_ERROR "Qt version 5.2.0 or higher is required") +endif() + +get_filename_component(Qt5_PREFIX ${Qt5_DIR}/../../.. REALPATH) + set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +if(APPLE) + set(CMAKE_MACOSX_RPATH TRUE) + find_program(MACDEPLOYQT_EXE macdeployqt HINTS ${Qt5_PREFIX}/bin ENV PATH) + if(NOT MACDEPLOYQT_EXE) + message(FATAL_ERROR "macdeployqt is required to build in macOS") + else() + message(STATUS "Using macdeployqt: ${MACDEPLOYQT_EXE}") + endif() +endif() # 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_package(LibGPGError REQUIRED) - -find_package(Gcrypt 1.6.0 REQUIRED) +find_package(Gcrypt 1.7.0 REQUIRED) +find_package(Argon2 REQUIRED) find_package(ZLIB REQUIRED) set(CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIR}) -check_cxx_source_compiles(" - #include - - #if !defined(ZLIB_VERNUM) || (ZLIB_VERNUM < 0x1200) - #error zlib 1.2.x or higher is required to use the gzip format - #endif - - int main() { return 0; }" ZLIB_SUPPORTS_GZIP) - -if(NOT ZLIB_SUPPORTS_GZIP) - message(FATAL_ERROR "zlib 1.2.x or higher is required to use the gzip format") +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() # Optional diff --git a/COPYING b/COPYING index 403e4564b..195650551 100644 --- a/COPYING +++ b/COPYING @@ -27,7 +27,7 @@ Copyright: 2010-2012, Felix Geyer 2000-2008, Tom Sato 2013, Laszlo Papp 2013, David Faure - 2016-2017, KeePassXC Team + 2016-2018, KeePassXC Team License: GPL-2 or GPL-3 Comment: The "KeePassXC Team" in every copyright notice is formed by the following people: @@ -55,10 +55,6 @@ Files: cmake/GenerateProductVersion.cmake Copyright: 2015 halex2005 License: MIT -Files: cmake/CodeCoverage.cmake -Copyright: 2012 - 2015, Lars Bilke -License: BSD-3-clause - Files: share/icons/application/*/apps/keepassxc.png share/icons/application/scalable/apps/keepassxc.svgz share/icons/application/*/apps/keepassxc-dark.png @@ -156,6 +152,7 @@ License: LGPL-2.1 Comment: based on Nuvola icon theme Files: share/icons/application/*/actions/application-exit.png + share/icons/application/*/actions/chronometer.png share/icons/application/*/actions/configure.png share/icons/application/*/actions/dialog-close.png share/icons/application/*/actions/dialog-ok.png @@ -178,6 +175,7 @@ Files: share/icons/application/*/actions/application-exit.png share/icons/application/*/actions/view-history.png share/icons/application/*/apps/internet-web-browser.png share/icons/application/*/apps/preferences-desktop-icons.png + share/icons/application/*/apps/utilities-terminal.png share/icons/application/*/categories/preferences-other.png share/icons/application/*/status/dialog-error.png share/icons/application/*/status/dialog-information.png @@ -225,8 +223,8 @@ Copyright: 2009-2010, Iowa State University License: Boost-1.0 Files: src/zxcvbn/zxcvbn.* -Copyright: 2015, Tony Evans -License: BSD 3-clause +Copyright: 2015-2017, Tony Evans +License: MIT Files: src/http/qhttp/* Copyright: 2014, Amir Zamani @@ -237,3 +235,7 @@ Files: src/gui/KMessageWidget.h Copyright: 2011 Aurélien Gâteau 2014 Dominik Haumann License: LGPL-2.1 + +Files: share/macosx/dmg-background.tiff +Copyright: 2008-2014, Andrey Tarantsov +License: MIT diff --git a/Dockerfile b/Dockerfile index a5966be39..cee347e69 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # KeePassXC Linux Release Build Dockerfile -# Copyright (C) 2017 KeePassXC team +# Copyright (C) 2017-2018 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 @@ -16,8 +16,10 @@ FROM ubuntu:14.04 +ENV REBUILD_COUNTER=8 + ENV QT5_VERSION=59 -ENV QT5_PPA_VERSION=${QT5_VERSION}2 +ENV QT5_PPA_VERSION=${QT5_VERSION}4 RUN set -x \ && apt-get update -y \ @@ -36,10 +38,16 @@ RUN set -x \ && apt-get install -y \ cmake3 \ g++ \ - libgcrypt20-dev \ + git \ + libgcrypt20-18-dev \ + libargon2-0-dev \ + libsodium-dev \ + libcurl-no-gcrypt-dev \ qt${QT5_VERSION}base \ qt${QT5_VERSION}tools \ qt${QT5_VERSION}x11extras \ + qt${QT5_VERSION}translations \ + qt${QT5_VERSION}imageformats \ zlib1g-dev \ libxi-dev \ libxtst-dev \ @@ -47,10 +55,15 @@ RUN set -x \ libyubikey-dev \ libykpers-1-dev -ENV CMAKE_PREFIX_PATH=/opt/qt${QT5_VERSION}/lib/cmake -ENV LD_LIBRARY_PATH=/opt/qt${QT5_VERSION}/lib +ENV CMAKE_PREFIX_PATH="/opt/qt${QT5_VERSION}/lib/cmake" +ENV CMAKE_INCLUDE_PATH="/opt/keepassxc-libs/include" +ENV CMAKE_LIBRARY_PATH="/opt/keepassxc-libs/lib/x86_64-linux-gnu" +ENV CPATH="${CMAKE_INCLUDE_PATH}" +ENV LD_LIBRARY_PATH="${CMAKE_LIBRARY_PATH}:/opt/qt${QT5_VERSION}/lib" + RUN set -x \ - && echo /opt/qt${QT_VERSION}/lib > /etc/ld.so.conf.d/qt${QT5_VERSION}.conf + && echo "/opt/qt${QT5_VERSION}/lib" > /etc/ld.so.conf.d/qt${QT5_VERSION}.conf \ + && echo "/opt/keepassxc-libs/lib/x86_64-linux-gnu" > /etc/ld.so.conf.d/keepassxc.conf # AppImage dependencies RUN set -x \ @@ -58,6 +71,10 @@ RUN set -x \ libfuse2 \ wget +RUN set -x \ + && apt-get autoremove --purge \ + && rm -rf /var/lib/apt/lists/* + VOLUME /keepassxc/src VOLUME /keepassxc/out WORKDIR /keepassxc diff --git a/INSTALL.md b/INSTALL.md index deed3e5c6..86048b501 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,11 +1,13 @@ -Install KeePassXC +Build and Install KeePassXC ================= -This document will guide you across the steps to install KeePassXC. -You can visit the online version of this document a the following link +This document will guide you through the steps to build and install KeePassXC from source. +You can visit the online version of this document at the following link: https://github.com/keepassxreboot/keepassx/wiki/Install-Instruction-from-Source +The [KeePassXC QuickStart](./docs/QUICKSTART.md) gets you started using KeePassXC on your +Windows, Mac, or Linux computer using the pre-built binaries. Build Dependencies ================== @@ -23,15 +25,16 @@ The following libraries are required: * zlib * libmicrohttpd * libxi, libxtst, qtx11extras (optional for auto-type on X11) +* libsodium (>= 1.0.12, optional for KeePassXC-Browser support) +* libargon2 Prepare the Building Environment ================================ -Building Environment on Linux ==> https://github.com/keepassxreboot/keepassx/wiki/Building-Environment-on-Linux -Building Environment on Windows ==> https://github.com/keepassxreboot/keepassx/wiki/Building-Environment-on-Windows -Building Environment on MacOS ==> https://github.com/keepassxreboot/keepassx/wiki/Building-Environment-on-MacOS - +* [Building Environment on Linux](https://github.com/keepassxreboot/keepassxc/wiki/Set-up-Build-Environment-on-Linux) +* [Building Environment on Windows](https://github.com/keepassxreboot/keepassxc/wiki/Set-up-Build-Environment-on-Windows) +* [Building Environment on MacOS](https://github.com/keepassxreboot/keepassxc/wiki/Set-up-Build-Environment-on-OS-X) Build Steps =========== @@ -39,32 +42,69 @@ Build Steps To compile from source, open a **Terminal (on Linux/MacOS)** or a **MSYS2-MinGW shell (on Windows)**
**Note:** on Windows make sure you are using a **MINGW shell** by checking the label before the current path -Navigate to the path you have downloaded KeePassXC and type these commands: +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). + +To clone the project from Git, `cd` to a suitable location and run + +```bash +git clone https://github.com/keepassxreboot/keepassxc.git +``` + +This will clone the entire contents of the repository and check out the current `develop` branch. + +To update the project from within the project's folder, you can run the following command: + +```bash +git pull +``` + +Navigate to the directory where you have downloaded KeePassXC and type these commands: ``` +cd directory-where-sources-live mkdir build cd build -cmake -DWITH_TESTS=OFF +cmake -DWITH_TESTS=OFF ...and other options - see below... make ``` +These steps place the compiled KeePassXC binary inside the `./build/src/` directory. +(Note the cmake notes/options below.) -**Note:** If you are on MacOS you must add this parameter to **Cmake**, with the Qt version you have installed
`-DCMAKE_PREFIX_PATH=/usr/local/Cellar/qt5/5.6.2/lib/cmake/` +**Cmake Notes:** -You will have the compiled KeePassXC binary inside the `./build/src/` directory. +* Common cmake parameters -Common cmake parameters -``` --DCMAKE_INSTALL_PREFIX=/usr/local --DCMAKE_VERBOSE_MAKEFILE=ON --DCMAKE_BUILD_TYPE= --DWITH_GUI_TESTS=ON -``` + ``` + -DCMAKE_INSTALL_PREFIX=/usr/local + -DCMAKE_VERBOSE_MAKEFILE=ON + -DCMAKE_BUILD_TYPE= + -DWITH_GUI_TESTS=ON + ``` +* cmake accepts the following options: + + ``` + -DWITH_XC_AUTOTYPE=[ON|OFF] Enable/Disable Auto-Type (default: ON) + -DWITH_XC_HTTP=[ON|OFF] Enable/Disable KeePassHTTP and custom icon downloads (default: OFF) + -DWITH_XC_YUBIKEY=[ON|OFF] Enable/Disable YubiKey HMAC-SHA1 authentication support (default: OFF) + -DWITH_XC_BROWSER=[ON|OFF] Enable/Disable KeePassXC-Browser extension support (default: OFF) + + -DWITH_TESTS=[ON|OFF] Enable/Disable building of unit tests (default: ON) + -DWITH_GUI_TESTS=[ON|OFF] Enable/Disable building of GUI tests (default: OFF) + -DWITH_DEV_BUILD=[ON|OFF] Enable/Disable deprecated method warnings (default: OFF) + -DWITH_ASAN=[ON|OFF] Enable/Disable address sanitizer checks (Linux / macOS only) (default: OFF) + -DWITH_COVERAGE=[ON|OFF] Enable/Disable coverage tests (GCC only) (default: OFF) + ``` + +* If you are on MacOS you must add this parameter to **Cmake**, with the Qt version you have installed
`-DCMAKE_PREFIX_PATH=/usr/local/Cellar/qt5/5.6.2/lib/cmake/` + +:exclamation: When building with ASan support on macOS, you need to use `export ASAN_OPTIONS=detect_leaks=0` before running the tests (no LSan support in macOS). Installation ============ -To install this binary execute the following: +After you have successfully built KeePassXC, install the binary by executing the following: ```bash sudo make install diff --git a/LICENSE.MIT b/LICENSE.MIT new file mode 100644 index 000000000..d13cc4b26 --- /dev/null +++ b/LICENSE.MIT @@ -0,0 +1,19 @@ +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 5588e3222..9f81795c5 100644 --- a/README.md +++ b/README.md @@ -1,78 +1,68 @@ -# KeePassXC [![Travis Build Status](https://travis-ci.org/keepassxreboot/keepassxc.svg?branch=develop)](https://travis-ci.org/keepassxreboot/keepassxc) [![Coverage Status](https://coveralls.io/repos/github/keepassxreboot/keepassxc/badge.svg)](https://coveralls.io/github/keepassxreboot/keepassxc) +# KeePassXC +[![TeamCity Build Status](https://ci.keepassxc.org/app/rest/builds/buildType:\(id:KeepassXC_TeamCityCi\)/statusIcon?guest=1)](https://ci.keepassxc.org/viewType.html?buildTypeId=KeepassXC_TeamCityCi&guest=1) [![Coverage Status](https://coveralls.io/repos/github/keepassxreboot/keepassxc/badge.svg)](https://coveralls.io/github/keepassxreboot/keepassxc) -KeePass Cross-platform Community Edition +## About KeePassXC +[KeePassXC](https://keepassxc.org) is a cross-platform community fork of +[KeePassX](https://www.keepassx.org/). +Our goal is to extend and improve it with new features and bugfixes +to provide a feature-rich, fully cross-platform and modern +open-source password manager. -## About -[KeePassXC](https://keepassxc.org) is a community fork of [KeePassX](https://www.keepassx.org/) with the goal to extend and improve it with new features and bugfixes to provide a feature-rich, fully cross-platform and modern open-source password manager. +## Installation +The [KeePassXC QuickStart](./docs/QUICKSTART.md) gets you started using +KeePassXC on your Windows, Mac, 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 out your distribution's package list to see if KeePassXC is available. ## Additional features compared to KeePassX -- Auto-Type on all three major platforms (Linux, Windows, OS X) -- Stand-alone password generator +- Auto-Type on all three major platforms (Linux, Windows, macOS) +- Twofish encryption +- YubiKey challenge-response support +- TOTP generation +- CSV import +- Command line interface +- DEP and ASLR hardening +- Stand-alone password and passphrase generator - Password strength meter -- YubiKey HMAC-SHA1 authentication for unlocking databases - Using website favicons as entry icons - Merging of databases - Automatic reload when the database changed on disk -- KeePassHTTP support for use with KeePassHTTP-Connector for [Mozilla Firefox](https://addons.mozilla.org/en-US/firefox/addon/keepasshttp-connector/) and [Google Chrome or Chromium](https://chrome.google.com/webstore/detail/keepasshttp-connector/dafgdjggglmmknipkhngniifhplpcldb), and [passafari](https://github.com/mmichaa/passafari.safariextension/) in Safari. +- Browser integration with KeePassHTTP-Connector for +[Mozilla Firefox](https://addons.mozilla.org/en-US/firefox/addon/keepasshttp-connector/) and +[Google Chrome or Chromium](https://chrome.google.com/webstore/detail/keepasshttp-connector/dafgdjggglmmknipkhngniifhplpcldb), and +[passafari](https://github.com/mmichaa/passafari.safariextension/) in Safari. [[See note about KeePassHTTP]](#Note_about_KeePassHTTP) +- Browser integration with KeePassXC-Browser using [native messaging](https://developer.chrome.com/extensions/nativeMessaging) for [Mozilla Firefox](https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser/) and [Google Chrome or Chromium](https://chrome.google.com/webstore/detail/keepassxc-browser/iopaggbpplllidnfmcghoonnokmjoicf) - Many bug fixes For a full list of features and changes, read the [CHANGELOG](CHANGELOG) document. -### Note about KeePassHTTP -KeePassHTTP is not a highly secure protocol and has certain flaw which allow an attacker to decrypt your passwords when they manage to intercept communication between a KeePassHTTP server and PassIFox/chromeIPass over a network connection (see [here](https://github.com/pfn/keepasshttp/issues/258) and [here](https://github.com/keepassxreboot/keepassxc/issues/147)). KeePassXC therefore strictly limits communication between itself and the browser plugin to your local computer. As long as your computer is not compromised, your passwords are fairly safe that way, but use it at your own risk! +## Building KeePassXC -### Installation -Pre-compiled binaries can be found on the [downloads page](https://keepassxc.org/download). Additionally, individual Linux distributions may ship their own versions, so please check out your distribution's package list to see if KeePassXC is available. +Detailed instructions are available in the [Build and Install](./INSTALL.md) +page or on the [Wiki page](https://github.com/keepassxreboot/keepassxc/wiki/Building-KeePassXC). -### Building KeePassXC +## Contributing -*More detailed instructions are available in the INSTALL file or on the [Wiki page](https://github.com/keepassxreboot/keepassxc/wiki/Building-KeePassXC).* - -First, you must 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). - -To clone the project from Git, `cd` to a suitable location and run - -```bash -git clone https://github.com/keepassxreboot/keepassxc.git -``` - -This will clone the entire contents of the repository and check out the current `develop` branch. - -To update the project from within the project's folder, you can run the following command: - -```bash -git pull -``` - -Once you have downloaded the source code, you can `cd` into the source code directory, build and install KeePassXC: - -```bash -mkdir build -cd build -cmake -DWITH_TESTS=OFF .. -make -j8 -sudo make install -``` - -cmake accepts the following options: - -``` - -DWITH_XC_AUTOTYPE=[ON|OFF] Enable/Disable Auto-Type (default: ON) - -DWITH_XC_HTTP=[ON|OFF] Enable/Disable KeePassHTTP and custom icon downloads (default: OFF) - -DWITH_XC_YUBIKEY=[ON|OFF] Enable/Disable YubiKey HMAC-SHA1 authentication support (default: OFF) - - -DWITH_TESTS=[ON|OFF] Enable/Disable building of unit tests (default: ON) - -DWITH_GUI_TESTS=[ON|OFF] Enable/Disable building of GUI tests (default: OFF) - -DWITH_DEV_BUILD=[ON|OFF] Enable/Disable deprecated method warnings (default: OFF) - -DWITH_ASAN=[ON|OFF] Enable/Disable address sanitizer checks (Linux only) (default: OFF) - -DWITH_COVERAGE=[ON|OFF] Enable/Disable coverage tests (GCC only) (default: OFF) -``` - -### Contributing - -We are always looking for suggestions how to improve our application. If you find any bugs or have an idea for a new feature, please let us know by opening a report in our [issue tracker](https://github.com/keepassxreboot/keepassxc/issues) on GitHub or join us on IRC on freenode channels #keepassxc or #keepassxc-dev. +We are always looking for suggestions how to improve our application. +If you find any bugs or have an idea for a new feature, please let us know by +opening a report in our [issue tracker](https://github.com/keepassxreboot/keepassxc/issues) +on GitHub or join us on IRC on freenode channels #keepassxc or #keepassxc-dev. You can of course also directly contribute your own code. We are happy to accept your pull requests. Please read the [CONTRIBUTING document](.github/CONTRIBUTING.md) for further information. + +### Note about KeePassHTTP +The KeePassHTTP protocol is not a highly secure protocol. +It has a certain flaw which could allow an attacker to decrypt your passwords +should they manage to impersonate the web browser extension from a remote address. + +(See [here](https://github.com/pfn/keepasshttp/issues/258) and [here](https://github.com/keepassxreboot/keepassxc/issues/147)). + +To minimize the risk, KeePassXC strictly limits communication between itself +and the browser plugin to your local computer (localhost). +This makes your passwords quite safe, +but as with all open source software, use it at your own risk! diff --git a/ci/trusty/Dockerfile b/ci/trusty/Dockerfile new file mode 100644 index 000000000..d10c609a0 --- /dev/null +++ b/ci/trusty/Dockerfile @@ -0,0 +1,73 @@ +# KeePassXC Linux Release Build Dockerfile +# 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 . + +# TIP: check this Dockerfile using this online tool: https://www.fromlatest.io + +FROM ubuntu:14.04 + +ENV REBUILD_COUNTER=4 + +ENV QT5_VERSION=53 +ENV QT5_PPA_VERSION=${QT5_VERSION}2 + +RUN set -x \ + && apt-get update -y \ + && apt-get -y install software-properties-common + +RUN set -x \ + && add-apt-repository ppa:beineri/opt-qt${QT5_PPA_VERSION}-trusty \ + && add-apt-repository ppa:phoerious/keepassxc + +RUN set -x \ + && apt-get -y update \ + && apt-get -y --no-install-recommends install \ + build-essential \ + clang-3.6 \ + libclang-common-3.6-dev \ + clang-format-3.6 \ + cmake3 \ + make \ + libgcrypt20-18-dev \ + libargon2-0-dev \ + libsodium-dev \ + libcurl-no-gcrypt-dev \ + qt${QT5_VERSION}base \ + qt${QT5_VERSION}tools \ + qt${QT5_VERSION}x11extras \ + qt${QT5_VERSION}translations \ + zlib1g-dev \ + libyubikey-dev \ + libykpers-1-dev \ + libxi-dev \ + libxtst-dev \ + xvfb + +ENV CMAKE_PREFIX_PATH="/opt/qt${QT5_VERSION}/lib/cmake" +ENV CMAKE_INCLUDE_PATH="/opt/keepassxc-libs/include" +ENV CMAKE_LIBRARY_PATH="/opt/keepassxc-libs/lib/x86_64-linux-gnu" +ENV CPATH="${CMAKE_INCLUDE_PATH}" +ENV LD_LIBRARY_PATH="${CMAKE_LIBRARY_PATH}:/opt/qt${QT5_VERSION}/lib" + +RUN set -x \ + && echo "/opt/qt${QT5_VERSION}/lib" > /etc/ld.so.conf.d/qt${QT5_VERSION}.conf \ + && echo "/opt/keepassxc-libs/lib/x86_64-linux-gnu" > /etc/ld.so.conf.d/keepassxc.conf + +RUN set -x \ + && apt-get autoremove --purge \ + && rm -rf /var/lib/apt/lists/* + +VOLUME ["/keepassxc"] +WORKDIR /keepassxc diff --git a/cmake/FindArgon2.cmake b/cmake/FindArgon2.cmake new file mode 100644 index 000000000..c0fb53b41 --- /dev/null +++ b/cmake/FindArgon2.cmake @@ -0,0 +1,34 @@ +# 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 . + +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_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) diff --git a/cmake/FindLibGPGError.cmake b/cmake/FindLibGPGError.cmake index c1e1b8686..9a18371ba 100644 --- a/cmake/FindLibGPGError.cmake +++ b/cmake/FindLibGPGError.cmake @@ -14,10 +14,10 @@ # along with this program. If not, see . 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) diff --git a/cmake/FindYubiKey.cmake b/cmake/FindYubiKey.cmake index e5e0bb681..d2266b407 100644 --- a/cmake/FindYubiKey.cmake +++ b/cmake/FindYubiKey.cmake @@ -17,8 +17,8 @@ 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 yubikey) -find_library(YUBIKEY_PERS_LIBRARY ykpers-1) +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) diff --git a/cmake/Findsodium.cmake b/cmake/Findsodium.cmake new file mode 100644 index 000000000..ad7031e5a --- /dev/null +++ b/cmake/Findsodium.cmake @@ -0,0 +1,267 @@ +# Written in 2016 by Henrik Steffen Gaßmann +# +# 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() diff --git a/docs/KeePassXC-Accept-Button.png b/docs/KeePassXC-Accept-Button.png new file mode 100644 index 000000000..de4b39261 Binary files /dev/null and b/docs/KeePassXC-Accept-Button.png differ diff --git a/docs/KeePassXC-Confirm.png b/docs/KeePassXC-Confirm.png new file mode 100644 index 000000000..989294a4e Binary files /dev/null and b/docs/KeePassXC-Confirm.png differ diff --git a/docs/KeePassXC-Connect.png b/docs/KeePassXC-Connect.png new file mode 100644 index 000000000..55b0f3d49 Binary files /dev/null and b/docs/KeePassXC-Connect.png differ diff --git a/docs/QUICKSTART.md b/docs/QUICKSTART.md new file mode 100644 index 000000000..b4b2d38ca --- /dev/null +++ b/docs/QUICKSTART.md @@ -0,0 +1,47 @@ +# Quick Start for KeePassXC + +This procedure gets KeePassXC running on your computer with browser integration, +using the pre-built binaries available for [download](https://keepassxc.org/download) +from [KeePassXC site](https://keepassxc.org). + +**TL;DR** KeePassXC saves your passwords securely. +When you double-click a URL in KeePassXC, it launches your default browser to that URL. +With browser integration configured, KeePassXC automatically enters +username/password credentials into web page fields. + +## Installing and Starting KeePassXC + +* [Download the native installer](https://keepassxc.org/download) and install +KeePassXC for your Windows, macOS, or Linux computer in the usual way for your platform. +* Open the KeePassXC application. +* Create a new database and give it a master key that's used to unlock the database file. +This database holds entries (usernames, passwords, account numbers, notes) +for all your websites, programs, etc. +* Create a few entries - enter the username, password, URL, and optionally notes about the entry. +* KeePassXC securely stores those entries in the database. + + +## Setting up Browser Integration with KeePassXC + +* *Within KeePassXC*, go to **Tools->Settings** (on macOS, go to **KeePassXC->Preferences**.) +* In **Browser Integration**, check **Enable KeePassHTTP server** +Leave the other options at their defaults. +* *In your default web browser,* install the KeePassHTTP-Connector extension/add-on. Instructions for [Firefox](https://addons.mozilla.org/en-US/firefox/addon/keepasshttp-connector/?src=api) or [Chrome](https://chrome.google.com/webstore/detail/keepasshttp-connector/dafgdjggglmmknipkhngniifhplpcldb?utm_source=chrome-app-launcher-info-dialog) +* Click the KeePassXC icon in the upper-right corner. You'll see the dialog below. +* Click the blue Connect button to make the browser extension connect to the KeePassXC application. +KeePassXC Connect dialog + +* *Switch back to KeePassXC.* You'll see a dialog (below) indicating that a request to connect has arrived. +* Give the connection a name (perhaps *Keepass-Browsername*, any unique name will suffice) and click OK to accept it. +* This one-time operation connects KeePassXC and your browser. +KeePassXC accept connection dialog + +## Using Browser Integration + +* *Within KeePassXC,* double-click the URL of an entry, +or select it and type Ctrl+U (Cmd+U on macOS). +* Your browser opens to that URL. +* If there are username/password fields on that page, you will see the dialog below. +Click *Allow* to confirm that KeePassXC may access the credentials to auto-fill the fields. +* Check *Remember this decision* to allow this each time you visit the page. +KeePassCX Confirm Access dialog diff --git a/release-tool b/release-tool index 42cd3a1d6..74f205900 100755 --- a/release-tool +++ b/release-tool @@ -37,9 +37,10 @@ DOCKER_CONTAINER_NAME="keepassxc-build-container" CMAKE_OPTIONS="" COMPILER="g++" MAKE_OPTIONS="-j8" -BUILD_PLUGINS="autotype http yubikey" +BUILD_PLUGINS="all" INSTALL_PREFIX="/usr/local" BUILD_SOURCE_TARBALL=true +BUILD_SNAPSHOT=false ORIG_BRANCH="" ORIG_CWD="$(pwd)" @@ -50,14 +51,14 @@ printUsage() { local cmd if [ "" == "$1" ] || [ "help" == "$1" ]; then cmd="COMMAND" - elif [ "check" == "$1" ] || [ "merge" == "$1" ] || [ "build" == "$1" ] || [ "sign" == "$1" ]; then + elif [ "check" == "$1" ] || [ "merge" == "$1" ] || [ "build" == "$1" ] || [ "gpgsign" == "$1" ] || [ "appsign" == "$1" ]; then cmd="$1" else logError "Unknown command: '$1'\n" cmd="COMMAND" fi - - printf "\e[1mUsage:\e[0m $(basename $0) $cmd [--version x.y.z] [options]\n" + + printf "\e[1mUsage:\e[0m $(basename $0) $cmd [options]\n" if [ "COMMAND" == "$cmd" ]; then cat << EOF @@ -66,7 +67,8 @@ Commands: check Perform a dry-run check, nothing is changed 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 + gpgsign Sign previously compiled release packages with GPG + appsign Sign binaries with code signing certificates on Windows and macOS help Show help for the given command EOF elif [ "merge" == "$cmd" ]; then @@ -110,19 +112,29 @@ Options: -i, --install-prefix Install prefix (default: '${INSTALL_PREFIX}') -p, --plugins Space-separated list of plugins to build (default: ${BUILD_PLUGINS}) + --snapshot Don't checkout the release tag -n, --no-source-tarball Don't build source tarball -h, --help Show this help EOF - elif [ "sign" == "$cmd" ]; then + elif [ "gpgsign" == "$cmd" ]; then cat << EOF -Sign previously compiled release packages +Sign previously compiled release packages with GPG Options: -f, --files Files to sign (required) -g, --gpg-key GPG key used to sign the files (default: '${GPG_KEY}') - --signtool Specify the signtool executable (default: 'signtool') - --signtool-key Provide a key to be used with signtool (for Windows EXE) + -h, --help Show this help +EOF + elif [ "appsign" == "$cmd" ]; then + cat << EOF + +Sign binaries with code signing certificates on Windows and macOS + +Options: + -f, --files Files to sign (required) + -k, --signtool-key Key to be used with signtool (required for Windows EXE) + -i, --identity Apple Developer ID to be used with codesign (required for macOS APP and DMG) -h, --help Show this help EOF fi @@ -234,7 +246,7 @@ checkVersionInCMake() { local app_name_upper="$(echo "$APP_NAME" | tr '[:lower:]' '[:upper:]')" local major_num="$(echo ${RELEASE_NAME} | cut -f1 -d.)" local minor_num="$(echo ${RELEASE_NAME} | cut -f2 -d.)" - local patch_num="$(echo ${RELEASE_NAME} | cut -f3 -d.)" + local patch_num="$(echo ${RELEASE_NAME} | cut -f3 -d. | cut -f1 -d-)" grep -q "${app_name_upper}_VERSION_MAJOR \"${major_num}\"" CMakeLists.txt if [ $? -ne 0 ]; then @@ -289,7 +301,28 @@ checkSnapcraft() { checkTransifexCommandExists() { command -v tx > /dev/null if [ 0 -ne $? ]; then - exitError "Transifex tool 'tx' not installed! Please install it using 'pip install transifex-client'" + exitError "Transifex tool 'tx' not installed! Please install it using 'pip install transifex-client'." + fi +} + +checkOsslsigncodeCommandExists() { + command -v osslsigncode > /dev/null + if [ 0 -ne $? ]; then + exitError "osslsigncode command not found on the PATH! Please install it using 'pacman -S mingw-w64-osslsigncode'." + fi +} + +checkSigntoolCommandExists() { + command -v signtool > /dev/null + if [ 0 -ne $? ]; then + exitError "signtool command not found on the PATH! Add the Windows SDK binary folder to your PATH." + fi +} + +checkCodesignCommandExists() { + command -v codesign > /dev/null + if [ 0 -ne $? ]; then + exitError "codesign command not found on the PATH! Please check that you have correctly installed Xcode." fi } @@ -434,7 +467,8 @@ merge() { performChecks logInfo "Updating language files..." - ./share/translations/update.sh + ./share/translations/update.sh update + ./share/translations/update.sh pull if [ 0 -ne $? ]; then exitError "Updating translations failed!" fi @@ -531,6 +565,9 @@ build() { -n|--no-source-tarball) BUILD_SOURCE_TARBALL=false ;; + + --snapshot) + BUILD_SNAPSHOT=true ;; -h|--help) printUsage "build" @@ -545,12 +582,27 @@ build() { done init - checkWorkingTreeClean OUTPUT_DIR="$(realpath "$OUTPUT_DIR")" - logInfo "Checking out release tag '${TAG_NAME}'..." - git checkout "$TAG_NAME" + if ${BUILD_SNAPSHOT}; then + TAG_NAME="HEAD" + local branch=`git rev-parse --abbrev-ref HEAD` + logInfo "Using current branch ${branch} to build..." + RELEASE_NAME="${RELEASE_NAME}-snapshot" + CMAKE_OPTIONS="${CMAKE_OPTIONS} -DKEEPASSXC_BUILD_TYPE=Snapshot" + else + checkWorkingTreeClean + + if $(echo "$TAG_NAME" | grep -qP "\-(alpha|beta)\\d+\$"); then + CMAKE_OPTIONS="${CMAKE_OPTIONS} -DKEEPASSXC_BUILD_TYPE=PreRelease" + logInfo "Checking out pre-release tag '${TAG_NAME}'..." + else + CMAKE_OPTIONS="${CMAKE_OPTIONS} -DKEEPASSXC_BUILD_TYPE=Release" + logInfo "Checking out release tag '${TAG_NAME}'..." + fi + git checkout "$TAG_NAME" + fi logInfo "Creating output directory..." mkdir -p "$OUTPUT_DIR" @@ -559,20 +611,40 @@ build() { exitError "Failed to create output directory!" fi - if $BUILD_SOURCE_TARBALL; then + if ${BUILD_SOURCE_TARBALL}; then logInfo "Creating source tarball..." local app_name_lower="$(echo "$APP_NAME" | tr '[:upper:]' '[:lower:]')" - TARBALL_NAME="${app_name_lower}-${RELEASE_NAME}-src.tar.xz" - git archive --format=tar "$TAG_NAME" --prefix="${app_name_lower}-${RELEASE_NAME}/" \ - | xz -6 > "${OUTPUT_DIR}/${TARBALL_NAME}" + local prefix="${app_name_lower}-${RELEASE_NAME}" + local tarball_name="${prefix}-src.tar" + + git archive --format=tar "$TAG_NAME" --prefix="${prefix}/" --output="${OUTPUT_DIR}/${tarball_name}" + + if ! ${BUILD_SNAPSHOT}; then + # add .version file to tar + mkdir "${prefix}" + echo -n ${RELEASE_NAME} > "${prefix}/.version" + tar --append --file="${OUTPUT_DIR}/${tarball_name}" "${prefix}/.version" + rm "${prefix}/.version" + rmdir "${prefix}" 2> /dev/null + fi + + xz -6 "${OUTPUT_DIR}/${tarball_name}" fi - + + if ! ${BUILD_SNAPSHOT} && [ -e "${OUTPUT_DIR}/build-release" ]; then + logInfo "Cleaning existing build directory..." + rm -r "${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" logInfo "Configuring sources..." - for p in $BUILD_PLUGINS; do + for p in ${BUILD_PLUGINS}; do CMAKE_OPTIONS="${CMAKE_OPTIONS} -DWITH_XC_$(echo $p | tr '[:lower:]' '[:upper:]')=On" done @@ -585,33 +657,33 @@ build() { if [ "" == "$DOCKER_IMAGE" ]; then if [ "$(uname -s)" == "Darwin" ]; then - # Building on OS X - local qt_vers="$(ls /usr/local/Cellar/qt5 2> /dev/null | sort -r | head -n1)" - if [ "" == "$qt_vers" ]; then - exitError "Couldn't find Qt5! Please make sure it is available in '/usr/local/Cellar/qt5'." - fi - export MACOSX_DEPLOYMENT_TARGET=10.7 - + # Building on macOS + export MACOSX_DEPLOYMENT_TARGET=10.10 + logInfo "Configuring build..." - cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ - -DCMAKE_OSX_ARCHITECTURES=x86_64 -DWITH_CXX11=OFF \ - -DCMAKE_PREFIX_PATH="/usr/local/Cellar/qt5/${qt_vers}/lib/cmake" \ - -DQT_BINARY_DIR="/usr/local/Cellar/qt5/${qt_vers}/bin" $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..." - make $MAKE_OPTIONS package + make ${MAKE_OPTIONS} package mv "./${APP_NAME}-${RELEASE_NAME}.dmg" ../ elif [ "$(uname -o)" == "Msys" ]; then - # Building on Windows with Msys + # Building on Windows with Msys2 logInfo "Configuring build..." cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off -G"MSYS Makefiles" \ -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" $CMAKE_OPTIONS "$SRC_DIR" logInfo "Compiling and packaging sources..." - make $MAKE_OPTIONS package + mingw32-make ${MAKE_OPTIONS} preinstall + # Call cpack directly instead of calling make package. + # This is important because we want to build the MSI when making a + # release. + cpack -G "NSIS;ZIP;${CPACK_GENERATORS}" - mv "./${APP_NAME}-${RELEASE_NAME}-"*.{exe,zip} ../ + mv "./${APP_NAME}-"*.* ../ else mkdir -p "${OUTPUT_DIR}/bin-release" @@ -643,7 +715,8 @@ build() { "$DOCKER_IMAGE" \ bash -c "cd /keepassxc/out/build-release && \ cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off $CMAKE_OPTIONS \ - -DCMAKE_INSTALL_PREFIX=\"${INSTALL_PREFIX}\" /keepassxc/src && \ + -DCMAKE_INSTALL_PREFIX=\"${INSTALL_PREFIX}\" \ + -DKEEPASSXC_DIST_TYPE=AppImage /keepassxc/src && \ make $MAKE_OPTIONS && make DESTDIR=/keepassxc/out/bin-release install/strip && \ /keepassxc/src/AppImage-Recipe.sh "$APP_NAME" "$RELEASE_NAME"" @@ -661,81 +734,54 @@ build() { # ----------------------------------------------------------------------- -# sign command +# gpgsign command # ----------------------------------------------------------------------- -sign() { - SIGN_FILES=() - SIGNTOOL="signtool" - SIGNTOOL_KEY="" - +gpgsign() { + local sign_files=() + while [ $# -ge 1 ]; do local arg="$1" case "$arg" in -f|--files) while [ "${2:0:1}" != "-" ] && [ $# -ge 2 ]; do - SIGN_FILES+=("$2") + sign_files+=("$2") shift done ;; - + -g|--gpg-key) GPG_KEY="$2" shift ;; - --signtool) - SIGNTOOL="$2" - shift ;; - - --signtool-key) - SIGNTOOL_KEY="$2" - shift ;; - -h|--help) - printUsage "sign" + printUsage "gpgsign" exit ;; - + *) logError "Unknown option '$arg'\n" - printUsage "sign" + printUsage "gpgsign" exit 1 ;; esac shift done - if [ -z "$SIGN_FILES" ]; then + if [ -z "${sign_files}" ]; then logError "Missing arguments, --files is required!\n" - printUsage "sign" + printUsage "gpgsign" exit 1 fi - if [[ -n "$SIGNTOOL_KEY" && ! -f "$SIGNTOOL_KEY" ]]; then - exitError "Signtool Key was not found!" - elif [[ -f "$SIGNTOOL_KEY" && ! -x $(command -v "${SIGNTOOL}") ]]; then - exitError "signtool program not found on PATH!" - fi - - for f in "${SIGN_FILES[@]}"; do + for f in "${sign_files[@]}"; do if [ ! -f "$f" ]; then - exitError "File '${f}' does not exist!" + exitError "File '${f}' does not exist or is not a file!" fi - if [[ -n "$SIGNTOOL_KEY" && ${f: -4} == '.exe' ]]; then - logInfo "Signing file '${f}' using signtool...\n" - read -s -p "Signtool Key Password: " password - echo - "${SIGNTOOL}" sign -f "${SIGNTOOL_KEY}" -p ${password} -v -t http://timestamp.comodoca.com/authenticode ${f} - - if [ 0 -ne $? ]; then - exitError "Signing failed!" - fi - fi - logInfo "Signing file '${f}' using release key..." gpg --output "${f}.sig" --armor --local-user "$GPG_KEY" --detach-sig "$f" if [ 0 -ne $? ]; then exitError "Signing failed!" fi - + logInfo "Creating digest for file '${f}'..." local rp="$(realpath "$f")" local bname="$(basename "$f")" @@ -746,6 +792,161 @@ sign() { } + +# ----------------------------------------------------------------------- +# appsign command +# ----------------------------------------------------------------------- +appsign() { + local sign_files=() + local signtool_key + local codesign_identity + + while [ $# -ge 1 ]; do + local arg="$1" + case "$arg" in + -f|--files) + while [ "${2:0:1}" != "-" ] && [ $# -ge 2 ]; do + sign_files+=("$2") + shift + done ;; + + -k|--signtool-key) + signtool_key="$2" + shift ;; + + -i|--identity) + codesign_identity="$2" + shift ;; + + -h|--help) + printUsage "appsign" + exit ;; + + *) + logError "Unknown option '$arg'\n" + printUsage "appsign" + exit 1 ;; + esac + shift + done + + if [ -z "${sign_files}" ]; then + logError "Missing arguments, --files is required!\n" + printUsage "appsign" + exit 1 + fi + + for f in "${sign_files[@]}"; do + if [ ! -f "${f}" ]; then + exitError "File '${f}' does not exist or is not a file!" + fi + done + + if [ "$(uname -s)" == "Darwin" ]; then + if [ -z "${codesign_identity}" ]; then + logError "Missing arguments, --identity is required on macOS!\n" + printUsage "appsign" + exit 1 + fi + + checkCodesignCommandExists + + local orig_dir="$(pwd)" + for f in "${sign_files[@]}"; do + if [[ ${f: -4} == '.dmg' ]]; then + logInfo "Unpacking disk image '${f}'..." + local tmp_dir="/tmp/KeePassXC_${RANDOM}" + mkdir -p ${tmp_dir}/mnt + hdiutil attach -quiet -noautoopen -mountpoint ${tmp_dir}/mnt "${f}" + cd ${tmp_dir} + cp -a ./mnt ./app + hdiutil detach -quiet ${tmp_dir}/mnt + + if [ ! -d ./app/KeePassXC.app ]; then + cd "${orig_dir}" + exitError "Unpacking failed!" + fi + + logInfo "Signing app using codesign..." + codesign --sign "${codesign_identity}" --verbose --deep ./app/KeePassXC.app + + if [ 0 -ne $? ]; then + cd "${orig_dir}" + exitError "Signing failed!" + fi + + logInfo "Repacking disk image..." + hdiutil create \ + -volname "KeePassXC" \ + -size $((1000 * ($(du -sk ./app | cut -f1) + 5000))) \ + -srcfolder ./app \ + -fs HFS+ \ + -fsargs "-c c=64,a=16,e=16" \ + -format UDBZ \ + "${tmp_dir}/$(basename "${f}")" + cd "${orig_dir}" + cp -f "${tmp_dir}/$(basename "${f}")" "${f}" + rm -Rf ${tmp_dir} + else + logInfo "Skipping non-DMG file '${f}'..." + fi + done + + elif [ "$(uname -o)" == "Msys" ]; then + if [ -z "${signtool_key}" ]; then + logError "Missing arguments, --signtool-key is required on Windows!\n" + printUsage "appsign" + exit 1 + fi + + checkOsslsigncodeCommandExists + + if [[ ! -f "${signtool_key}" ]]; then + exitError "Key file was not found!" + fi + + read -s -p "Key password: " password + echo + + for f in "${sign_files[@]}"; do + if [[ ${f: -4} == ".exe" ]]; then + logInfo "Signing file '${f}' using osslsigncode..." + # output a signed exe; we have to use a different name due to osslsigntool limitations + osslsigncode sign -pkcs12 "${signtool_key}" -pass "${password}" -n "KeePassXC" \ + -t "http://timestamp.comodoca.com/authenticode" -in "${f}" -out "${f}.signed" + + if [ 0 -ne $? ]; then + rm -f "${f}.signed" + exitError "Signing failed!" + fi + + # overwrite the original exe with the signed exe + mv -f "${f}.signed" "${f}" + elif [[ ${f: -4} == ".msi" ]]; then + # Make sure we can find the signtool + checkSigntoolCommandExists + + # osslsigncode does not succeed at signing MSI files at this time... + logInfo "Signing file '${f}' using Microsoft signtool..." + signtool sign -f "${signtool_key}" -p "${password}" -d "KeePassXC" \ + -t "http://timestamp.comodoca.com/authenticode" "${f}" + + if [ 0 -ne $? ]; then + exitError "Signing failed!" + fi + else + logInfo "Skipping non-executable file '${f}'..." + fi + done + + else + exitError "Unsupported platform for code signing!\n" + fi + + logInfo "All done!" +} + + # ----------------------------------------------------------------------- # parse global command line # ----------------------------------------------------------------------- @@ -758,8 +959,8 @@ if [ "" == "$MODE" ]; then elif [ "help" == "$MODE" ]; then printUsage "$1" exit -elif [ "check" == "$MODE" ] || [ "merge" == "$MODE" ] || [ "build" == "$MODE" ] || [ "sign" == "$MODE" ]; then - $MODE "$@" +elif [ "check" == "$MODE" ] || [ "merge" == "$MODE" ] || [ "build" == "$MODE" ] || [ "gpgsign" == "$MODE" ] || [ "appsign" == "$MODE" ]; then + ${MODE} "$@" else printUsage "$MODE" fi diff --git a/share/icons/application/16x16/actions/paperclip.png b/share/icons/application/16x16/actions/paperclip.png new file mode 100644 index 000000000..cd61805ef Binary files /dev/null and b/share/icons/application/16x16/actions/paperclip.png differ diff --git a/share/icons/application/16x16/actions/url-copy.png b/share/icons/application/16x16/actions/url-copy.png new file mode 100644 index 000000000..154d2439e Binary files /dev/null and b/share/icons/application/16x16/actions/url-copy.png differ diff --git a/share/icons/application/22x22/actions/chronometer.png b/share/icons/application/22x22/actions/chronometer.png new file mode 100644 index 000000000..71d6eabe5 Binary files /dev/null and b/share/icons/application/22x22/actions/chronometer.png differ diff --git a/share/icons/application/22x22/actions/paperclip.png b/share/icons/application/22x22/actions/paperclip.png new file mode 100644 index 000000000..99d0eb821 Binary files /dev/null and b/share/icons/application/22x22/actions/paperclip.png differ diff --git a/share/icons/application/22x22/actions/url-copy.png b/share/icons/application/22x22/actions/url-copy.png new file mode 100644 index 000000000..84eae639f Binary files /dev/null and b/share/icons/application/22x22/actions/url-copy.png differ diff --git a/share/icons/application/32x32/actions/document-encrypt.png b/share/icons/application/32x32/actions/document-encrypt.png new file mode 100644 index 000000000..353a22ca2 Binary files /dev/null and b/share/icons/application/32x32/actions/document-encrypt.png differ diff --git a/share/icons/application/32x32/actions/paperclip.png b/share/icons/application/32x32/actions/paperclip.png new file mode 100644 index 000000000..cb57d1378 Binary files /dev/null and b/share/icons/application/32x32/actions/paperclip.png differ diff --git a/share/icons/application/32x32/apps/utilities-terminal.png b/share/icons/application/32x32/apps/utilities-terminal.png new file mode 100644 index 000000000..3e4d324c0 Binary files /dev/null and b/share/icons/application/32x32/apps/utilities-terminal.png differ diff --git a/share/icons/svg/paperclip.svgz b/share/icons/svg/paperclip.svgz new file mode 100644 index 000000000..f82480bca Binary files /dev/null and b/share/icons/svg/paperclip.svgz differ diff --git a/share/icons/svg/utilities-terminal.svgz b/share/icons/svg/utilities-terminal.svgz new file mode 100644 index 000000000..e913402f5 Binary files /dev/null and b/share/icons/svg/utilities-terminal.svgz differ diff --git a/share/keepassxc.ini b/share/keepassxc.ini index f7ff52cbc..54920224a 100644 --- a/share/keepassxc.ini +++ b/share/keepassxc.ini @@ -1,5 +1,4 @@ [General] -ShowToolbar=true RememberLastDatabases=true RememberLastKeyFiles=true OpenPreviousDatabasesOnStartup=true @@ -17,6 +16,7 @@ LastOpenedDatabases=@Invalid() [GUI] Language=system ShowTrayIcon=false +DarkTrayIcon=false MinimizeToTray=false MinimizeOnClose=false MinimizeOnStartup=false diff --git a/share/linux/org.keepassxc.KeePassXC.appdata.xml b/share/linux/org.keepassxc.KeePassXC.appdata.xml index bde79416e..39dfa7d3a 100644 --- a/share/linux/org.keepassxc.KeePassXC.appdata.xml +++ b/share/linux/org.keepassxc.KeePassXC.appdata.xml @@ -1,16 +1,15 @@ - org.keepassxc + org.keepassxc.KeePassXC.desktop KeePassXC CC-BY-3.0 GPL-3.0+ - keepassxc - https://keepassxc.org application/x-keepass2 Community-driven port of the Windows application “KeePass Password Safe” + KeePassXC Team

KeePassXC is an application for people with extremely high demands on secure @@ -19,54 +18,92 @@

- org.keepassxc.desktop + org.keepassxc.KeePassXC.desktop + + https://keepassxc.org + https://github.com/keepassxreboot/keepassxc/issues + https://keepassxc.org/docs#faq + https://keepassxc.org/docs + https://www.transifex.com/keepassxc/keepassxc https://keepassxc.org/images/screenshots/linux/screen_001.png + Create, Import or Open Databases https://keepassxc.org/images/screenshots/linux/screen_002.png + Organize with Groups and Entries https://keepassxc.org/images/screenshots/linux/screen_003.png + Database Entry https://keepassxc.org/images/screenshots/linux/screen_004.png - - - https://keepassxc.org/images/screenshots/linux/screen_005.png + Icon Selection for Entry https://keepassxc.org/images/screenshots/linux/screen_006.png - - - https://keepassxc.org/images/screenshots/linux/screen_007.png - - - https://keepassxc.org/images/screenshots/linux/screen_008.png - - - https://keepassxc.org/images/screenshots/linux/screen_009.png - - - https://keepassxc.org/images/screenshots/linux/screen_010.png - - - https://keepassxc.org/images/screenshots/linux/screen_011.png - - - https://keepassxc.org/images/screenshots/linux/screen_012.png - - - https://keepassxc.org/images/screenshots/linux/screen_013.png - - - https://keepassxc.org/images/screenshots/linux/screen_014.png + Password Generator + + +
    +
  • Add support for KDBX 4.0, Argon2 and ChaCha20 [#148, #1179, #1230, #1494]
  • +
  • Add SSH Agent feature [#1098, #1450, #1463]
  • +
  • Add preview panel with details of the selected entry [#879, #1338]
  • +
  • Add more and configurable columns to entry table and allow copying of values by double click [#1305]
  • +
  • Add KeePassXC-Browser API as a replacement for KeePassHTTP [#608]
  • +
  • Deprecate KeePassHTTP [#1392]
  • +
  • Add support for Steam one-time passwords [#1206]
  • +
  • Add support for multiple Auto-Type sequences for a single entry [#1390]
  • +
  • Adjust YubiKey HMAC-SHA1 challenge-response key generation for KDBX 4.0 [#1060]
  • +
  • Replace qHttp with cURL for website icon downloads [#1460]
  • +
  • Remove lock file [#1231]
  • +
  • Add option to create backup file before saving [#1385]
  • +
  • Ask to save a generated password before closing the entry password generator [#1499]
  • +
  • Resolve placeholders recursively [#1078]
  • +
  • Add Auto-Type button to the toolbar [#1056]
  • +
  • Improve window focus handling for Auto-Type dialogs [#1204, #1490]
  • +
  • Auto-Type dialog and password generator can now be exited with ESC [#1252, #1412]
  • +
  • Add optional dark tray icon [#1154]
  • +
  • Add new "Unsafe saving" option to work around saving problems with file sync services [#1385]
  • +
  • Add IBus support to AppImage and additional image formats to Windows builds [#1534, #1537]
  • +
  • Add diceware password generator to CLI [#1406]
  • +
  • Add --key-file option to CLI [#816, #824]
  • +
  • Add DBus interface for opening and closing KeePassXC databases [#283]
  • +
  • Add KDBX compression options to database settings [#1419]
  • +
  • Discourage use of old fixed-length key files in favor of arbitrary files [#1326, #1327]
  • +
  • Correct reference resolution in entry fields [#1486]
  • +
  • Fix window state and recent databases not being remembered on exit [#1453]
  • +
  • Correct history item generation when configuring TOTP for an entry [#1446]
  • +
  • Correct multiple TOTP bugs [#1414]
  • +
  • Automatic saving after every change is now a default [#279]
  • +
  • Allow creation of new entries during search [#1398]
  • +
  • Correct menu issues on macOS [#1335]
  • +
  • Allow compilation on OpenBSD [#1328]
  • +
  • Improve entry attachments view [#1139, #1298]
  • +
  • Fix auto lock for Gnome and Xfce [#910, #1249]
  • +
  • Don't remember key files in file dialogs when the setting is disabled [#1188]
  • +
  • Improve database merging and conflict resolution [#807, #1165]
  • +
  • Fix macOS pasteboard issues [#1202]
  • +
  • Improve startup times on some platforms [#1205]
  • +
  • Hide the notes field by default [#1124]
  • +
  • Toggle main window by clicking tray icon with the middle mouse button [#992]
  • +
  • Fix custom icons not copied over when databases are merged [#1008]
  • +
  • Allow use of DEL key to delete entries [#914]
  • +
  • Correct intermittent crash due to stale history items [#1527]
  • +
  • Sanitize newline characters in title, username and URL fields [#1502]
  • +
  • Reopen previously opened databases in correct order [#774]
  • +
  • Use system's zxcvbn library if available [#701]
  • +
  • Implement various i18n improvements [#690, #875, #1436]
  • +
+
+