mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2025-12-04 15:39:34 +01:00
Compare commits
112 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cf94610f46 | ||
|
|
c7836f1157 | ||
|
|
228843b010 | ||
|
|
8a71c680ac | ||
|
|
0ff75e7a88 | ||
|
|
b20918b60e | ||
|
|
8905fe5a54 | ||
|
|
e17b3d24bf | ||
|
|
7ef61b47e3 | ||
|
|
4e7f2c6a4f | ||
|
|
83fd387f2f | ||
|
|
cd6aac9acf | ||
|
|
05d02b702a | ||
|
|
f6933a8868 | ||
|
|
51b42bc7b8 | ||
|
|
6d46717cfc | ||
|
|
3088371631 | ||
|
|
880a8da68a | ||
|
|
e2c6f50108 | ||
|
|
51ed7a59da | ||
|
|
94ea91ec63 | ||
|
|
76ac8dda54 | ||
|
|
a895729b9e | ||
|
|
aba2acb062 | ||
|
|
a1aad5d165 | ||
|
|
0fe06b3fbb | ||
|
|
86cd2c09a4 | ||
|
|
f1d99dd0ed | ||
|
|
c731f8e5c0 | ||
|
|
24f560aaa2 | ||
|
|
905e104ba2 | ||
|
|
d21ae0f94a | ||
|
|
95b0ad15ef | ||
|
|
19eb6a8a60 | ||
|
|
85f652290b | ||
|
|
feb6baad05 | ||
|
|
37aa4f0257 | ||
|
|
d3208bddb0 | ||
|
|
eb977b8021 | ||
|
|
b30eb59791 | ||
|
|
72a6c34450 | ||
|
|
ec8c99c3b2 | ||
|
|
6d433fecef | ||
|
|
bae9dbc407 | ||
|
|
1cbbcc0d87 | ||
|
|
c0182df05e | ||
|
|
7d6baf53fa | ||
|
|
c6f83b9ca6 | ||
|
|
3bc8a79b9b | ||
|
|
84508e91da | ||
|
|
38cbb42b58 | ||
|
|
2e81751131 | ||
|
|
157f1134bf | ||
|
|
4277364e91 | ||
|
|
4e903e4c50 | ||
|
|
5098866413 | ||
|
|
91d746c5c0 | ||
|
|
e53754d202 | ||
|
|
eb21eeb214 | ||
|
|
2bce9c8add | ||
|
|
c8f5824554 | ||
|
|
7d3c18e1fb | ||
|
|
dce691157e | ||
|
|
611a74d74d | ||
|
|
de5f8082de | ||
|
|
59786d7bd7 | ||
|
|
cb0b948603 | ||
|
|
2e4f1a21b4 | ||
|
|
649a14db84 | ||
|
|
9ebe0b61eb | ||
|
|
4b6dbcaec4 | ||
|
|
8e7fa3d3d6 | ||
|
|
df3051038e | ||
|
|
daef0a358c | ||
|
|
422bc4da30 | ||
|
|
faf36190bd | ||
|
|
d59ca0a9cc | ||
|
|
ea1554915b | ||
|
|
6f9224784e | ||
|
|
34886dc7e0 | ||
|
|
f71d0c0da8 | ||
|
|
c0f668c4bb | ||
|
|
cdad46377b | ||
|
|
8ed8e57012 | ||
|
|
691e60d72b | ||
|
|
a888de19cd | ||
|
|
9ceadac299 | ||
|
|
bb50db40d2 | ||
|
|
35c6df2535 | ||
|
|
98c812a297 | ||
|
|
32100be47a | ||
|
|
4fed655621 | ||
|
|
8a0085f0f8 | ||
|
|
fab9f2a9fb | ||
|
|
e4ae2f9176 | ||
|
|
5e891c2caa | ||
|
|
2d127b8942 | ||
|
|
7ab6af00bc | ||
|
|
e53ac65518 | ||
|
|
1158294323 | ||
|
|
4ecd9e7e23 | ||
|
|
8a7de4408d | ||
|
|
a766052243 | ||
|
|
31ec840a8d | ||
|
|
e555937214 | ||
|
|
3799833cfa | ||
|
|
231f90a8e5 | ||
|
|
45c2a98b5b | ||
|
|
6b9137ac6c | ||
|
|
35e86efbce | ||
|
|
549eaefdb8 | ||
|
|
b553af8fd0 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,5 +1,6 @@
|
||||
CMakeLists.txt.*
|
||||
build*/
|
||||
cmake-build-*/
|
||||
release*/
|
||||
.idea/
|
||||
*.iml
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
language: cpp
|
||||
sudo: required
|
||||
dist: trusty
|
||||
# FIXME : remove when (https://github.com/google/sanitizers/issues/837) is resolved.
|
||||
group: deprecated-2017Q3
|
||||
services: [docker]
|
||||
|
||||
os:
|
||||
@@ -13,8 +15,8 @@ compiler:
|
||||
- gcc
|
||||
|
||||
env:
|
||||
- CONFIG=Release ASAN_OPTIONS=detect_odr_violation=1:leak_check_at_exit=0
|
||||
- CONFIG=Debug ASAN_OPTIONS=detect_odr_violation=1:leak_check_at_exit=0
|
||||
- CONFIG=Release ASAN_OPTIONS=detect_odr_violation=1
|
||||
- CONFIG=Debug ASAN_OPTIONS=detect_odr_violation=1
|
||||
|
||||
git:
|
||||
depth: 3
|
||||
@@ -35,7 +37,7 @@ 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 xvfb-run -a --server-args="-screen 0 800x600x24" make test ARGS+="-R 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
|
||||
|
||||
@@ -34,6 +34,7 @@ fi
|
||||
APP="$1"
|
||||
LOWERAPP="$(echo "$APP" | tr '[:upper:]' '[:lower:]')"
|
||||
VERSION="$2"
|
||||
export ARCH=x86_64
|
||||
|
||||
mkdir -p $APP.AppDir
|
||||
wget -q https://github.com/probonopd/AppImages/raw/master/functions.sh -O ./functions.sh
|
||||
@@ -42,6 +43,8 @@ wget -q https://github.com/probonopd/AppImages/raw/master/functions.sh -O ./func
|
||||
LIB_DIR=./usr/lib
|
||||
if [ -d ./usr/lib/x86_64-linux-gnu ]; then
|
||||
LIB_DIR=./usr/lib/x86_64-linux-gnu
|
||||
elif [ -d ./usr/lib64 ]; then
|
||||
LIB_DIR=./usr/lib64
|
||||
fi
|
||||
|
||||
cd $APP.AppDir
|
||||
@@ -51,7 +54,7 @@ rm -R ./usr/local
|
||||
rmdir ./opt 2> /dev/null
|
||||
|
||||
# bundle Qt platform plugins and themes
|
||||
QXCB_PLUGIN="$(find /usr/lib -name 'libqxcb.so' 2> /dev/null)"
|
||||
QXCB_PLUGIN="$(find /usr/lib* -name 'libqxcb.so' 2> /dev/null)"
|
||||
if [ "$QXCB_PLUGIN" == "" ]; then
|
||||
QXCB_PLUGIN="$(find /opt/qt*/plugins -name 'libqxcb.so' 2> /dev/null)"
|
||||
fi
|
||||
@@ -63,33 +66,34 @@ get_apprun
|
||||
copy_deps
|
||||
delete_blacklisted
|
||||
|
||||
# remove dbus and systemd libs as they are not blacklisted
|
||||
find . -name libdbus-1.so.3 -exec rm {} \;
|
||||
find . -name libsystemd.so.0 -exec rm {} \;
|
||||
|
||||
get_desktop
|
||||
get_icon
|
||||
cat << EOF > ./usr/bin/keepassxc_env
|
||||
#!/usr/bin/env bash
|
||||
#export QT_QPA_PLATFORMTHEME=gtk2
|
||||
export LD_LIBRARY_PATH="../opt/qt58/lib:\${LD_LIBRARY_PATH}"
|
||||
export QT_PLUGIN_PATH="..${QT_PLUGIN_PATH}"
|
||||
export LD_LIBRARY_PATH="..$(dirname ${QT_PLUGIN_PATH})/lib:\${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
|
||||
# see https://github.com/probonopd/AppImageKit/issues/351
|
||||
# see https://github.com/AppImage/AppImageKit/issues/351
|
||||
unset XDG_DATA_DIRS
|
||||
|
||||
exec keepassxc "\$@"
|
||||
if [ "\${1}" == "cli" ]; then
|
||||
shift
|
||||
exec keepassxc-cli "\$@"
|
||||
else
|
||||
exec keepassxc "\$@"
|
||||
fi
|
||||
EOF
|
||||
chmod +x ./usr/bin/keepassxc_env
|
||||
sed -i 's/Exec=keepassxc/Exec=keepassxc_env/' keepassxc.desktop
|
||||
get_desktopintegration $LOWERAPP
|
||||
|
||||
GLIBC_NEEDED=$(glibc_needed)
|
||||
sed -i 's/Exec=keepassxc/Exec=keepassxc_env/' org.${LOWERAPP}.${APP}.desktop
|
||||
get_desktopintegration "org.${LOWERAPP}.${APP}"
|
||||
|
||||
cd ..
|
||||
|
||||
generate_type2_appimage
|
||||
GLIBC_NEEDED=$(glibc_needed)
|
||||
NO_GLIBC_VERSION=true
|
||||
|
||||
mv ../out/*.AppImage ..
|
||||
rmdir ../out > /dev/null 2>&1
|
||||
generate_type2_appimage -u "gh-releases-zsync|keepassxreboot|keepassxc|latest|KeePassXC-*-${ARCH}.AppImage.zsync"
|
||||
|
||||
mv ../out/*.AppImage* ../
|
||||
rm -rf ../out
|
||||
|
||||
41
CHANGELOG
41
CHANGELOG
@@ -1,3 +1,44 @@
|
||||
2.2.3 (2017-12-11)
|
||||
=========================
|
||||
|
||||
- Prevent database corruption when locked [#1219]
|
||||
- Fixes apply button not saving new entries [#1141]
|
||||
- Switch to Consolas font on Windows for password edit [#1229]
|
||||
- Multiple fixes to AppImage deployment [#1115, #1228]
|
||||
- Fixes multiple memory leaks [#1213]
|
||||
- Resize message close to 16x16 pixels [#1253]
|
||||
|
||||
2.2.2 (2017-10-22)
|
||||
=========================
|
||||
|
||||
- Fixed entries with empty URLs being reported to KeePassHTTP clients [#1031]
|
||||
- Fixed YubiKey detection and enabled CLI tool for AppImage binary [#1100]
|
||||
- Added AppStream description [#1082]
|
||||
- Improved TOTP compatibility and added new Base32 implementation [#1069]
|
||||
- Fixed error handling when processing invalid cipher stream [#1099]
|
||||
- Fixed double warning display when opening a database [#1037]
|
||||
- Fixed unlocking databases with --pw-stdin [#1087]
|
||||
- Added ability to override QT_PLUGIN_PATH environment variable for AppImages [#1079]
|
||||
- Fixed transform seed not being regenerated when saving the database [#1068]
|
||||
- Fixed only one YubiKey slot being polled [#1048]
|
||||
- Corrected an issue with entry icons while merging [#1008]
|
||||
- Corrected desktop and tray icons in Snap package [#1030]
|
||||
- Fixed screen lock and Google fallback settings [#1029]
|
||||
|
||||
2.2.1 (2017-10-01)
|
||||
=========================
|
||||
|
||||
- Corrected multiple snap issues [#934, #1011]
|
||||
- Corrected multiple custom icon issues [#708, #719, #994]
|
||||
- Corrected multiple Yubikey issues [#880]
|
||||
- Fixed single instance preventing load on occasion [#997]
|
||||
- Keep entry history when merging databases [#970]
|
||||
- Prevent data loss if passwords were mismatched [#1007]
|
||||
- Fixed crash after merge [#941]
|
||||
- Added configurable auto-type default delay [#703]
|
||||
- Unlock database dialog window comes to front [#663]
|
||||
- Translation and compiling fixes
|
||||
|
||||
2.2.0 (2017-06-23)
|
||||
=========================
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ endif()
|
||||
|
||||
project(KeePassXC)
|
||||
|
||||
cmake_minimum_required(VERSION 2.8.12)
|
||||
cmake_minimum_required(VERSION 3.1.0)
|
||||
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
|
||||
|
||||
@@ -49,9 +49,21 @@ set(CMAKE_AUTOUIC ON)
|
||||
|
||||
set(KEEPASSXC_VERSION_MAJOR "2")
|
||||
set(KEEPASSXC_VERSION_MINOR "2")
|
||||
set(KEEPASSXC_VERSION_PATCH "0")
|
||||
set(KEEPASSXC_VERSION_PATCH "3")
|
||||
set(KEEPASSXC_VERSION "${KEEPASSXC_VERSION_MAJOR}.${KEEPASSXC_VERSION_MINOR}.${KEEPASSXC_VERSION_PATCH}")
|
||||
|
||||
# Distribution info
|
||||
set(KEEPASSXC_DIST True)
|
||||
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)
|
||||
elseif(KEEPASSXC_DIST_TYPE STREQUAL "AppImage")
|
||||
set(KEEPASSXC_DIST_APPIMAGE True)
|
||||
elseif(KEEPASSXC_DIST_TYPE STREQUAL "Other")
|
||||
unset(KEEPASSXC_DIST)
|
||||
endif()
|
||||
|
||||
if("${CMAKE_C_COMPILER}" MATCHES "clang$" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
|
||||
set(CMAKE_COMPILER_IS_CLANG 1)
|
||||
endif()
|
||||
@@ -225,6 +237,8 @@ find_package(Gcrypt 1.6.0 REQUIRED)
|
||||
|
||||
find_package(ZLIB REQUIRED)
|
||||
|
||||
set(CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIR})
|
||||
|
||||
check_cxx_source_compiles("
|
||||
#include <zlib.h>
|
||||
|
||||
|
||||
9
COPYING
9
COPYING
@@ -214,10 +214,6 @@ Files: share/icons/database/C65_W.png
|
||||
Copyright: none
|
||||
License: public-domain
|
||||
|
||||
Files: src/crypto/salsa20/*
|
||||
Copyright: none
|
||||
License: public-domain
|
||||
|
||||
Files: src/streams/qtiocompressor.*
|
||||
src/streams/QtIOCompressor
|
||||
tests/modeltest.*
|
||||
@@ -241,8 +237,3 @@ Files: src/gui/KMessageWidget.h
|
||||
Copyright: 2011 Aurélien Gâteau <agateau@kde.org>
|
||||
2014 Dominik Haumann <dhaumann@kde.org>
|
||||
License: LGPL-2.1
|
||||
|
||||
Files: src/totp/base32.cpp
|
||||
src/totp/base32.h
|
||||
Copyright: 2010 Google Inc.
|
||||
License: Apache 2.0
|
||||
55
Dockerfile
55
Dockerfile
@@ -16,41 +16,48 @@
|
||||
|
||||
FROM ubuntu:14.04
|
||||
|
||||
RUN set -x \
|
||||
&& apt-get update \
|
||||
&& apt-get install --yes software-properties-common
|
||||
ENV QT5_VERSION=59
|
||||
ENV QT5_PPA_VERSION=${QT5_VERSION}2
|
||||
|
||||
RUN set -x \
|
||||
&& add-apt-repository --yes ppa:beineri/opt-qt58-trusty
|
||||
&& apt-get update -y \
|
||||
&& apt-get -y install software-properties-common
|
||||
|
||||
RUN set -x \
|
||||
&& apt-get update \
|
||||
&& apt-get install --yes \
|
||||
&& add-apt-repository ppa:beineri/opt-qt${QT5_PPA_VERSION}-trusty \
|
||||
&& add-apt-repository ppa:phoerious/keepassxc
|
||||
|
||||
RUN set -x \
|
||||
&& apt-get update -y \
|
||||
&& apt-get upgrade -y
|
||||
|
||||
# build and runtime dependencies
|
||||
RUN set -x \
|
||||
&& apt-get install -y \
|
||||
cmake3 \
|
||||
g++ \
|
||||
cmake \
|
||||
libgcrypt20-dev \
|
||||
qt58base \
|
||||
qt58tools \
|
||||
qt58x11extras \
|
||||
qt${QT5_VERSION}base \
|
||||
qt${QT5_VERSION}tools \
|
||||
qt${QT5_VERSION}x11extras \
|
||||
zlib1g-dev \
|
||||
libxi-dev \
|
||||
libxtst-dev \
|
||||
zlib1g-dev \
|
||||
mesa-common-dev \
|
||||
libyubikey-dev \
|
||||
libykpers-1-dev \
|
||||
xvfb \
|
||||
wget \
|
||||
file \
|
||||
fuse \
|
||||
python
|
||||
libykpers-1-dev
|
||||
|
||||
ENV CMAKE_PREFIX_PATH=/opt/qt${QT5_VERSION}/lib/cmake
|
||||
ENV LD_LIBRARY_PATH=/opt/qt${QT5_VERSION}/lib
|
||||
RUN set -x \
|
||||
&& apt-get install --yes mesa-common-dev
|
||||
|
||||
&& echo /opt/qt${QT_VERSION}/lib > /etc/ld.so.conf.d/qt${QT5_VERSION}.conf
|
||||
|
||||
# AppImage dependencies
|
||||
RUN set -x \
|
||||
&& apt-get install -y \
|
||||
libfuse2 \
|
||||
wget
|
||||
|
||||
VOLUME /keepassxc/src
|
||||
VOLUME /keepassxc/out
|
||||
WORKDIR /keepassxc
|
||||
|
||||
ENV CMAKE_PREFIX_PATH=/opt/qt58/lib/cmake
|
||||
ENV LD_LIBRARY_PATH=/opt/qt58/lib
|
||||
RUN set -x \
|
||||
&& echo /opt/qt58/lib > /etc/ld.so.conf.d/qt58.conf
|
||||
|
||||
@@ -14,7 +14,7 @@ KeePass Cross-platform Community Edition
|
||||
- Using website favicons as entry icons
|
||||
- Merging of databases
|
||||
- Automatic reload when the database changed on disk
|
||||
- KeePassHTTP support for use with [PassIFox](https://addons.mozilla.org/en-us/firefox/addon/passifox/) in Mozilla Firefox and [chromeIPass](https://chrome.google.com/webstore/detail/chromeipass/ompiailgknfdndiefoaoiligalphfdae) in Google Chrome or Chromium, and [passafari](https://github.com/mmichaa/passafari.safariextension/) in Safari.
|
||||
- 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.
|
||||
- Many bug fixes
|
||||
|
||||
For a full list of features and changes, read the [CHANGELOG](CHANGELOG) document.
|
||||
|
||||
85
release-tool
85
release-tool
@@ -119,9 +119,11 @@ EOF
|
||||
Sign previously compiled release packages
|
||||
|
||||
Options:
|
||||
-f, --files Files to sign (required)
|
||||
-g, --gpg-key GPG key used to sign the files (default: '${GPG_KEY}')
|
||||
-h, --help Show this help
|
||||
-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
|
||||
fi
|
||||
}
|
||||
@@ -257,19 +259,18 @@ checkChangeLog() {
|
||||
|
||||
grep -qPzo "${RELEASE_NAME} \(\d{4}-\d{2}-\d{2}\)\n=+\n" CHANGELOG
|
||||
if [ $? -ne 0 ]; then
|
||||
exitError "CHANGELOG does not contain any information about the '${RELEASE_NAME}' release!"
|
||||
exitError "'CHANGELOG' has not been updated to the '${RELEASE_NAME}' release!"
|
||||
fi
|
||||
}
|
||||
|
||||
checkTransifexCommandExists() {
|
||||
command -v tx > /dev/null
|
||||
if [ 0 -ne $? ]; then
|
||||
exitError "Transifex tool 'tx' not installed! Please install it using 'pip install transifex-client'"
|
||||
checkAppStreamInfo() {
|
||||
if [ ! -f share/linux/org.keepassxc.appdata.xml ]; then
|
||||
exitError "No AppStream info file found!"
|
||||
fi
|
||||
|
||||
command -v lupdate-qt5 > /dev/null
|
||||
if [ 0 -ne $? ]; then
|
||||
exitError "Qt Linguist tool (lupdate-qt5) is not installed! Please install using 'apt install qttools5-dev-tools'"
|
||||
grep -qPzo "<release version=\"${RELEASE_NAME}\" date=\"\d{4}-\d{2}-\d{2}\">" share/linux/org.keepassxc.appdata.xml
|
||||
if [ $? -ne 0 ]; then
|
||||
exitError "'share/linux/org.keepassxc.appdata.xml' has not been updated to the '${RELEASE_NAME}' release!"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -281,7 +282,24 @@ checkSnapcraft() {
|
||||
|
||||
grep -qPzo "version: ${RELEASE_NAME}" snapcraft.yaml
|
||||
if [ $? -ne 0 ]; then
|
||||
exitError "snapcraft.yaml has not been updated to the '${RELEASE_NAME}' release!"
|
||||
exitError "'snapcraft.yaml' has not been updated to the '${RELEASE_NAME}' release!"
|
||||
fi
|
||||
}
|
||||
|
||||
checkTransifexCommandExists() {
|
||||
command -v tx > /dev/null
|
||||
if [ 0 -ne $? ]; then
|
||||
exitError "Transifex tool 'tx' not installed! Please install it using 'pip install transifex-client'"
|
||||
fi
|
||||
}
|
||||
|
||||
checkQt5LUpdateExists() {
|
||||
command -v lupdate > /dev/null
|
||||
if [ 0 -eq $? ] && ! $(lupdate -version | grep -q "lupdate version 5\."); then
|
||||
command -v lupdate-qt5 > /dev/null
|
||||
if [ 0 -ne $? ]; then
|
||||
exitError "Qt Linguist tool (lupdate-qt5) is not installed! Please install using 'apt install qttools5-dev-tools'"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -296,6 +314,7 @@ performChecks() {
|
||||
logInfo "Validating toolset and repository..."
|
||||
|
||||
checkTransifexCommandExists
|
||||
checkQt5LUpdateExists
|
||||
checkGitRepository
|
||||
checkReleaseDoesNotExist
|
||||
checkWorkingTreeClean
|
||||
@@ -309,6 +328,7 @@ performChecks() {
|
||||
|
||||
checkVersionInCMake
|
||||
checkChangeLog
|
||||
checkAppStreamInfo
|
||||
checkSnapcraft
|
||||
|
||||
logInfo "\e[1m\e[32mAll checks passed!\e[0m"
|
||||
@@ -525,14 +545,13 @@ build() {
|
||||
done
|
||||
|
||||
init
|
||||
|
||||
performChecks
|
||||
checkWorkingTreeClean
|
||||
|
||||
OUTPUT_DIR="$(realpath "$OUTPUT_DIR")"
|
||||
|
||||
|
||||
logInfo "Checking out release tag '${TAG_NAME}'..."
|
||||
git checkout "$TAG_NAME"
|
||||
|
||||
|
||||
logInfo "Creating output directory..."
|
||||
mkdir -p "$OUTPUT_DIR"
|
||||
|
||||
@@ -599,7 +618,8 @@ build() {
|
||||
# Building on Linux without Docker container
|
||||
logInfo "Configuring build..."
|
||||
cmake -DCMAKE_BUILD_TYPE=Release -DWITH_TESTS=Off $CMAKE_OPTIONS \
|
||||
-DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" "$SRC_DIR"
|
||||
-DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \
|
||||
-DKEEPASSXC_DIST_TYPE=AppImage "$SRC_DIR"
|
||||
|
||||
logInfo "Compiling sources..."
|
||||
make $MAKE_OPTIONS
|
||||
@@ -616,7 +636,7 @@ build() {
|
||||
logInfo "Launching Docker container to compile sources..."
|
||||
|
||||
docker run --name "$DOCKER_CONTAINER_NAME" --rm \
|
||||
--cap-add SYS_ADMIN --device /dev/fuse \
|
||||
--cap-add SYS_ADMIN --security-opt apparmor:unconfined --device /dev/fuse \
|
||||
-e "CC=${CC}" -e "CXX=${CXX}" \
|
||||
-v "$(realpath "$SRC_DIR"):/keepassxc/src:ro" \
|
||||
-v "$(realpath "$OUTPUT_DIR"):/keepassxc/out:rw" \
|
||||
@@ -645,6 +665,8 @@ build() {
|
||||
# -----------------------------------------------------------------------
|
||||
sign() {
|
||||
SIGN_FILES=()
|
||||
SIGNTOOL="signtool"
|
||||
SIGNTOOL_KEY=""
|
||||
|
||||
while [ $# -ge 1 ]; do
|
||||
local arg="$1"
|
||||
@@ -658,6 +680,14 @@ sign() {
|
||||
-g|--gpg-key)
|
||||
GPG_KEY="$2"
|
||||
shift ;;
|
||||
|
||||
--signtool)
|
||||
SIGNTOOL="$2"
|
||||
shift ;;
|
||||
|
||||
--signtool-key)
|
||||
SIGNTOOL_KEY="$2"
|
||||
shift ;;
|
||||
|
||||
-h|--help)
|
||||
printUsage "sign"
|
||||
@@ -676,13 +706,30 @@ sign() {
|
||||
printUsage "sign"
|
||||
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
|
||||
if [ ! -f "$f" ]; then
|
||||
exitError "File '${f}' does not exist!"
|
||||
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}'..."
|
||||
logInfo "Signing file '${f}' using release key..."
|
||||
gpg --output "${f}.sig" --armor --local-user "$GPG_KEY" --detach-sig "$f"
|
||||
|
||||
if [ 0 -ne $? ]; then
|
||||
|
||||
@@ -30,7 +30,8 @@ if(UNIX AND NOT APPLE)
|
||||
install(DIRECTORY icons/application/ DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor
|
||||
FILES_MATCHING PATTERN "application-x-keepassxc.png" PATTERN "application-x-keepassxc.svgz"
|
||||
PATTERN "status" EXCLUDE PATTERN "actions" EXCLUDE PATTERN "categories" EXCLUDE)
|
||||
install(FILES linux/keepassxc.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
|
||||
install(FILES linux/org.keepassxc.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
|
||||
install(FILES linux/org.keepassxc.appdata.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo)
|
||||
install(FILES linux/keepassxc.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/mime/packages)
|
||||
endif(UNIX AND NOT APPLE)
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 457 B After Width: | Height: | Size: 360 B |
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
|
||||
<mime-type type="application/x-keepass2">
|
||||
<comment>KeePass 2 database</comment>
|
||||
<comment>KeePass 2 Database</comment>
|
||||
<glob pattern="*.kdbx"/>
|
||||
<icon name="application-x-keepassxc"/>
|
||||
</mime-type>
|
||||
|
||||
231
share/linux/org.keepassxc.appdata.xml
Normal file
231
share/linux/org.keepassxc.appdata.xml
Normal file
@@ -0,0 +1,231 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-<li>Copyright 2017 KeePassXC Team <team@keepassxc.org> -->
|
||||
<component type="desktop-application">
|
||||
<id>org.keepassxc</id>
|
||||
<name>KeePassXC</name>
|
||||
<metadata_license>CC-BY-3.0</metadata_license>
|
||||
<project_license>GPL-3.0+</project_license>
|
||||
<icon type="stock">keepassxc</icon>
|
||||
<url type="homepage">https://keepassxc.org</url>
|
||||
<mimetypes>
|
||||
<mimetype>application/x-keepass2</mimetype>
|
||||
</mimetypes>
|
||||
<summary>Community-driven port of the Windows application “KeePass Password Safe”</summary>
|
||||
<description>
|
||||
<p>
|
||||
KeePassXC is an application for people with extremely high demands on secure
|
||||
personal data management. It has a light interface, is cross-platform and
|
||||
published under the terms of the GNU General Public License.
|
||||
</p>
|
||||
</description>
|
||||
|
||||
<launchable type="desktop-id">org.keepassxc.desktop</launchable>
|
||||
|
||||
<screenshots>
|
||||
<screenshot type="default">
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_001.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_002.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_003.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_004.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_005.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_006.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_007.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_008.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_009.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_010.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_011.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_012.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_013.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://keepassxc.org/images/screenshots/linux/screen_014.png</image>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
|
||||
<releases>
|
||||
<release version="2.2.3" date="2017-12-11">
|
||||
<description>
|
||||
<ul>
|
||||
<li>Prevent database corruption when locked [#1219]</li>
|
||||
<li>Fixes apply button not saving new entries [#1141]</li>
|
||||
<li>Switch to Consolas font on Windows for password edit [#1229]</li>
|
||||
<li>Multiple fixes to AppImage deployment [#1115, #1228]</li>
|
||||
<li>Fixes multiple memory leaks [#1213]</li>
|
||||
<li>Resize message close to 16x16 pixels [#1253]</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="2.2.2" date="2017-10-22">
|
||||
<description>
|
||||
<ul>
|
||||
<li>Fixed entries with empty URLs being reported to KeePassHTTP clients [#1031]</li>
|
||||
<li>Fixed YubiKey detection and enabled CLI tool for AppImage binary [#1100]</li>
|
||||
<li>Added AppStream description [#1082]</li>
|
||||
<li>Improved TOTP compatibility and added new Base32 implementation [#1069]</li>
|
||||
<li>Fixed error handling when processing invalid cipher stream [#1099]</li>
|
||||
<li>Fixed double warning display when opening a database [#1037]</li>
|
||||
<li>Fixed unlocking databases with --pw-stdin [#1087]</li>
|
||||
<li>Added ability to override QT_PLUGIN_PATH environment variable for AppImages [#1079]</li>
|
||||
<li>Fixed transform seed not being regenerated when saving the database [#1068]</li>
|
||||
<li>Fixed only one YubiKey slot being polled [#1048]</li>
|
||||
<li>Corrected an issue with entry icons while merging [#1008]</li>
|
||||
<li>Corrected desktop and tray icons in Snap package [#1030]</li>
|
||||
<li>Fixed screen lock and Google fallback settings [#1029]</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="2.2.1" date="2017-10-01">
|
||||
<description>
|
||||
<ul>
|
||||
<li>Corrected multiple snap issues [#934, #1011]</li>
|
||||
<li>Corrected multiple custom icon issues [#708, #719, #994]</li>
|
||||
<li>Corrected multiple Yubikey issues [#880]</li>
|
||||
<li>Fixed single instance preventing load on occasion [#997]</li>
|
||||
<li>Keep entry history when merging databases [#970]</li>
|
||||
<li>Prevent data loss if passwords were mismatched [#1007]</li>
|
||||
<li>Fixed crash after merge [#941]</li>
|
||||
<li>Added configurable auto-type default delay [#703]</li>
|
||||
<li>Unlock database dialog window comes to front [#663]</li>
|
||||
<li>Translation and compiling fixes</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="2.2.0" date="2017-06-23">
|
||||
<description>
|
||||
<ul>
|
||||
<li>Added YubiKey 2FA integration for unlocking databases [#127]</li>
|
||||
<li>Added TOTP support [#519]</li>
|
||||
<li>Added CSV import tool [#146, #490]</li>
|
||||
<li>Added KeePassXC CLI tool [#254]</li>
|
||||
<li>Added diceware password generator [#373]</li>
|
||||
<li>Added support for entry references [#370, #378]</li>
|
||||
<li>Added support for Twofish encryption [#167]</li>
|
||||
<li>Enabled DEP and ASLR for in-memory protection [#371]</li>
|
||||
<li>Enabled single instance mode [#510]</li>
|
||||
<li>Enabled portable mode [#645]</li>
|
||||
<li>Enabled database lock on screensaver and session lock [#545]</li>
|
||||
<li>Redesigned welcome screen with common features and recent databases [#292]</li>
|
||||
<li>Multiple updates to search behavior [#168, #213, #374, #471, #603, #654]</li>
|
||||
<li>Added auto-type fields {CLEARFIELD}, {SPACE}, {{}, {}} [#267, #427, #480]</li>
|
||||
<li>Fixed auto-type errors on Linux [#550]</li>
|
||||
<li>Prompt user prior to executing a cmd:// URL [#235]</li>
|
||||
<li>Entry attributes can be protected (hidden) [#220]</li>
|
||||
<li>Added extended ascii to password generator [#538]</li>
|
||||
<li>Added new database icon to toolbar [#289]</li>
|
||||
<li>Added context menu entry to empty recycle bin in databases [#520]</li>
|
||||
<li>Added "apply" button to entry and group edit windows [#624]</li>
|
||||
<li>Added macOS tray icon and enabled minimize on close [#583]</li>
|
||||
<li>Fixed issues with unclean shutdowns [#170, #580]</li>
|
||||
<li>Changed keyboard shortcut to create new database to CTRL+SHIFT+N [#515]</li>
|
||||
<li>Compare window title to entry URLs [#556]</li>
|
||||
<li>Implemented inline error messages [#162]</li>
|
||||
<li>Ignore group expansion and other minor changes when making database "dirty" [#464]</li>
|
||||
<li>Updated license and copyright information on souce files [#632]</li>
|
||||
<li>Added contributors list to about dialog [#629]</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="2.1.4" date="2017-04-09">
|
||||
<description>
|
||||
<ul>
|
||||
<li>Bumped KeePassHTTP version to 1.8.4.2</li>
|
||||
<li>KeePassHTTP confirmation window comes to foreground [#466]</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="2.1.3" date="2017-03-03">
|
||||
<description>
|
||||
<ul>
|
||||
<li>Fix possible overflow in zxcvbn library [#363]</li>
|
||||
<li>Revert HiDPI setting to avoid problems on laptop screens [#332]</li>
|
||||
<li>Set file meta properties in Windows executable [#330]</li>
|
||||
<li>Suppress error message when auto-reloading a locked database [#345]</li>
|
||||
<li>Improve usability of question dialog when database is already locked by a different instance [#346]</li>
|
||||
<li>Fix compiler warnings in QHttp library [#351]</li>
|
||||
<li>Use unified toolbar on Mac OS X [#361]</li>
|
||||
<li>Fix an issue on X11 where the main window would be raised instead of closed on Alt+F4 [#362]</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="2.1.2" date="2017-02-17">
|
||||
<description>
|
||||
<ul>
|
||||
<li>Ask for save location when creating a new database [#302]</li>
|
||||
<li>Remove Libmicrohttpd dependency to clean up the code and ensure better OS X compatibility [#317, #265]</li>
|
||||
<li>Prevent Qt from degrading Wifi network performance on certain platforms [#318]</li>
|
||||
<li>Visually refine user interface on OS X and other platforms [#299]</li>
|
||||
<li>Remove unusable tray icon setting on OS X [#293]</li>
|
||||
<li>Fix compositing glitches on Ubuntu and prevent flashing when minimizing to the tray at startup [#307]</li>
|
||||
<li>Fix AppImage tray icon on Ubuntu [#277, #273]</li>
|
||||
<li>Fix global menu disappearing after restoring KeePassXC from the tray on Ubuntu [#276]</li>
|
||||
<li>Fix result order in entry search [#320]</li>
|
||||
<li>Enable HiDPI scaling on supported platforms [#315]</li>
|
||||
<li>Remove empty directories from installation target [#282]</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="2.1.1" date="2017-02-06">
|
||||
<description>
|
||||
<ul>
|
||||
<li>Enabled HTTP plugin build; plugin is disabled by default and limited to localhost [#147]</li>
|
||||
<li>Escape HTML in dialog boxes [#247]</li>
|
||||
<li>Corrected crashes in favicon download and password generator [#233, #226]</li>
|
||||
<li>Increase font size of password meter [#228]</li>
|
||||
<li>Fixed compatibility with Qt 5.8 [#211]</li>
|
||||
<li>Use consistent button heights in password generator [#229]</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="2.1.0" date="2017-01-22">
|
||||
<description>
|
||||
<ul>
|
||||
<li>Show unlock dialog when using autotype on a closed database [#10, #89]</li>
|
||||
<li>Show different tray icon when database is locked [#37, #46]</li>
|
||||
<li>Support autotype on Windows and OS X [#42, #60, #63]</li>
|
||||
<li>Add delay feature to autotype [#76, #77]</li>
|
||||
<li>Add password strength meter [#84, #92]</li>
|
||||
<li>Add option for automatically locking the database when minimizing the window [#57]</li>
|
||||
<li>Add feature to download favicons and use them as entry icons [#30]</li>
|
||||
<li>Automatically reload and merge database when the file changed on disk [#22, #33, #93]</li>
|
||||
<li>Add tool for merging two databases [#22, #47, #143]</li>
|
||||
<li>Add --pw-stdin commandline option to unlock the database by providing a password on STDIN [#54]</li>
|
||||
<li>Add utility script for reading the database password from KWallet [#55]</li>
|
||||
<li>Fix some KeePassHTTP settings not being remembered [#34, #65]</li>
|
||||
<li>Make search box persistent [#15, #67, #157]</li>
|
||||
<li>Enhance search feature by scoping the search to selected group [#16, #118]</li>
|
||||
<li>Improve interaction between search field and entry list [#131, #141]</li>
|
||||
<li>Add stand-alone password-generator [#18, #92]</li>
|
||||
<li>Don't require password repetition when password is visible [#27, #92]</li>
|
||||
<li>Add support for entry attributes in autotype sequences [#107]</li>
|
||||
<li>Always focus password field when opening the database unlock widget [#116, #117]</li>
|
||||
<li>Fix compilation errors on various platforms [#53, #126, #130]</li>
|
||||
<li>Restructure and improve kdbx-extract utility [#160]</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
</releases>
|
||||
</component>
|
||||
@@ -1,13 +1,16 @@
|
||||
[Desktop Entry]
|
||||
Name=KeePassXC
|
||||
GenericName=Community Password Manager
|
||||
GenericName=Password Manager
|
||||
GenericName[de]=Passwortverwaltung
|
||||
GenericName[es]=Gestor de contraseñas
|
||||
GenericName[fr]=Gestionnaire de mot de passe
|
||||
GenericName[ru]=менеджер паролей
|
||||
Comment=Community-driven port of the Windows application “KeePass Password Safe”
|
||||
Exec=keepassxc %f
|
||||
TryExec=keepassxc
|
||||
Icon=keepassxc
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=Qt;Utility;
|
||||
Version=1.0
|
||||
Categories=Utility;Security;Qt;
|
||||
MimeType=application/x-keepass2;
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3,104 +3,72 @@
|
||||
<name>AboutDialog</name>
|
||||
<message>
|
||||
<source>About KeePassXC</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Om KeePassXC</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>About</source>
|
||||
<translation>Om</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues"><span style="text-decoration: underline; color:#0000ff;">https://github.com</span></a></p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head><style>li {font-size: 10pt}</style></head><body><p><span style=" font-size:10pt;">Project Maintainers:</span></p><ul><li>droidmonkey</li><li>phoerious</li><li>TheZ3ro</li><li>louib</li><li>Weslly</li><li>debfx (KeePassX)</li></ul></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Contributors</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><body>
|
||||
<p style="font-size:x-large; font-weight:600;">Code:</p>
|
||||
<ul>
|
||||
<li style="font-size:10pt">debfx (KeePassX)</li>
|
||||
<li style="font-size:10pt">BlueIce (KeePassX)</li>
|
||||
<li style="font-size:10pt">droidmonkey</li>
|
||||
<li style="font-size:10pt">phoerious</li>
|
||||
<li style="font-size:10pt">TheZ3ro</li>
|
||||
<li style="font-size:10pt">louib</li>
|
||||
<li style="font-size:10pt">weslly</li>
|
||||
<li style="font-size:10pt">keithbennett (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">Typz (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">denk-mal (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">kylemanna (YubiKey)</li>
|
||||
<li style="font-size:10pt">seatedscribe (CSV Importer)</li>
|
||||
<li style="font-size:10pt">pgalves (Inline Messages)</li>
|
||||
</ul>
|
||||
<p style="font-size:x-large; font-weight:600;">Translations:</p>
|
||||
<ul>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Chinese:</span> Biggulu, ligyxy, BestSteve</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Czech:</span> pavelb, JosefVitu</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Dutch:</span> Vistaus, KnooL, apie</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Finnish:</span> MawKKe</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">French:</span> Scrat15, frgnca, gilbsgilbs, gtalbot, iannick, kyodev, logut</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">German:</span> Calyrx, DavidHamburg, antsas, codejunky, jensrutschmann, montilo, omnisome4, origin_de, pcrcoding, phoerious, rgloor, vlenzer</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Greek:</span> nplatis</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Italian:</span> TheZ3ro, FranzMari, Mte90, tosky</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Kazakh:</span> sotrud_nik</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Lithuanian:</span> Moo</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Polish:</span> konradmb, mrerexx</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Portuguese: </span>vitor895, weslly, American_Jesus, mihai.ile</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Russian:</span> vsvyatski, KekcuHa, wkill95</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Spanish:</span> EdwardNavarro, antifaz, piegope, pquin, vsvyatski</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Swedish:</span> henziger</li>
|
||||
</ul>
|
||||
</body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p align="center"><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">See Contributions on GitHub</span></a></p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Bidragsydere</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Debug Info</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Include the following information whenever you report a bug:</p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fejlsøgningsinformation</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy to clipboard</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kopier til udklipsholder</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Version %1
|
||||
</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Version %1
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Revision: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Revision: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Libraries:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Biblioteker:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Operating system: %1
|
||||
CPU architecture: %2
|
||||
Kernel: %3 %4</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Operativsystem: %1
|
||||
CPU-arkitektur: %2
|
||||
Kerne: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enabled extensions:</source>
|
||||
<translation>Aktiverede udvidelser:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source>
|
||||
<translation>Rapportér fejl på: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
|
||||
<translation>KeePassXC distribueres under betingelserne i GNU General Public License (GPL) version 2 eller (efter eget valg) version 3.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Project Maintainers:</source>
|
||||
<translation>Projektet vedligeholdes af:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source>
|
||||
<translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Se bidrag på GitHub</a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Include the following information whenever you report a bug:</source>
|
||||
<translation>Inkludér følgende information når du indrapporterer en fejl:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Distribution: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
@@ -108,24 +76,25 @@ Kernel: %3 %4</source>
|
||||
<name>AccessControlDialog</name>
|
||||
<message>
|
||||
<source>Remember this decision</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Husk dette valg</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Allow</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tillad</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Deny</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Afvis</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 has requested access to passwords for the following item(s).
|
||||
Please select whether you want to allow access.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>%1 har forespurgt adgang til kodeord tilhørende disse element(er).
|
||||
Vælg venligst hvorvidt du vil tillade denne adgang.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC HTTP Confirm Access</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>KeePassXC HTTP Bekræft Adgang</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -136,7 +105,7 @@ Please select whether you want to allow access.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-Type - KeePassXC</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Auto-Indsæt - KeePassXC</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -162,7 +131,7 @@ Please select whether you want to allow access.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-Type - KeePassXC</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Auto-Indsæt - KeePassXC</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -231,57 +200,57 @@ Please select whether you want to allow access.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Refresh</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Genopfrisk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Empty password</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tomt kodeord</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changing master key failed: no YubiKey inserted.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kunne ikke skifte hovednøgle: ingen YubiKey indsat.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CloneDialog</name>
|
||||
<message>
|
||||
<source>Clone Options</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Append ' - Copy' to title</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kloningsindstillinger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Replace username and password with references</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Udskift brugernavn og kodeord med referencer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy history</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kopier historik</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Append ' - Clone' to title</source>
|
||||
<translation>Tilføj ' - Clone' til titel</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CsvImportWidget</name>
|
||||
<message>
|
||||
<source>Import CSV fields</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Importér CSV-felter</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>filename</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>filnavn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>size, rows, columns</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>størrelse, rækker, kolonner</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Encoding</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Encoding</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Codec</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Codec</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Text is qualified by</source>
|
||||
@@ -289,11 +258,11 @@ Please select whether you want to allow access.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Fields are separated by</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Felter separeres med</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Comments start with</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kommentarer starter med</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>First record has field names</source>
|
||||
@@ -309,39 +278,39 @@ Please select whether you want to allow access.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Preview</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Forhåndsvisning</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Column layout</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kolonnelayout</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Not present in CSV file</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ikke til stede i CSV-fil</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Empty fieldname </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tomt feltnavn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>column </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>kolonne</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Imported from CSV file</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Importeret fra CSV-fil</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Original data: </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Original data:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error(s) detected in CSV file !</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fejl detekteret i CSV-fil !</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> more messages skipped]</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>flere beskeder blev sprunget over]</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
@@ -357,7 +326,7 @@ Please select whether you want to allow access.</source>
|
||||
<name>CsvImportWizard</name>
|
||||
<message>
|
||||
<source>Import CSV file</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Importér CSV-fil</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
@@ -372,15 +341,15 @@ Please select whether you want to allow access.</source>
|
||||
<name>CsvParserModel</name>
|
||||
<message>
|
||||
<source> byte, </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>byte,</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> rows, </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>rækker,</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> columns</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>kolonner</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -423,7 +392,7 @@ Please select whether you want to allow access.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Refresh</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Genopfrisk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Challenge Response:</source>
|
||||
@@ -503,19 +472,19 @@ Du kan gemme den nu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use recycle bin</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Brug papirkurv</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>AES: 256 Bit (default)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>AES: 256 Bit (standard)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Twofish: 256 Bit</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Twofish: 256 Bit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Algorithm:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Algoritme:</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -630,38 +599,41 @@ Kassér ændringer og luk alligevel?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Merge database</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Flet database</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The database you are trying to save as is locked by another instance of KeePassXC.
|
||||
Do you want to save it anyway?</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Databasen som du prøver at gemme er låst af en anden instans af KeePassXC.
|
||||
Ønsker du alligevel at gemme den?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Passwords</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kodeord</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Database already opened</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Database er allerede åben</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The database you are trying to open is locked by another instance of KeePassXC.
|
||||
|
||||
Do you want to open it anyway?</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Databasen som du prøver at gemme er låst af en anden instans af KeePassXC.
|
||||
|
||||
Ønsker du alligevel at åbne den?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open read-only</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Åbn skrivebeskyttet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File opened in read only mode.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fil åbnet i skrivebeskyttet tilstand</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open CSV file</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Åbn CSV-fil</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -708,7 +680,7 @@ Do you want to open it anyway?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Move entry to recycle bin?</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Flyt post til papirkurven?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Do you really want to move entry "%1" to the recycle bin?</source>
|
||||
@@ -716,7 +688,7 @@ Do you want to open it anyway?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Searching...</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Søger...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No current database.</source>
|
||||
@@ -1091,10 +1063,6 @@ Do you want to open it anyway?</source>
|
||||
<source>Select Image</source>
|
||||
<translation>Vælg Billede</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
<translation>Fejl</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Download favicon</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1123,6 +1091,14 @@ Do you want to open it anyway?</source>
|
||||
<source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Custom icon already exists</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditWidgetProperties</name>
|
||||
@@ -1329,20 +1305,28 @@ Do you want to open it anyway?</source>
|
||||
<source>Unable to calculate master key</source>
|
||||
<translation>Kan ikke beregne hovednøgle</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to issue challenge-response.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>The selected file is an old KeePass 1 database (.kdb).
|
||||
|
||||
You can import it by clicking on Database > 'Import KeePass 1 database'.
|
||||
You can import it by clicking on Database > 'Import KeePass 1 database...'.
|
||||
This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source>
|
||||
<translation>Den valgte fil er en gammel KeePass 1 databasefil (.kdb).
|
||||
|
||||
Du kan importere den ved at klikke på Database > 'Importér KeePass 1 database'.
|
||||
Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den importerede database med den gamle KeePassX 0.4 version.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>KeePass2Writer</name>
|
||||
<message>
|
||||
<source>Unable to issue challenge-response.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to calculate master key</source>
|
||||
<translation>Kan ikke beregne hovednøgle</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Main</name>
|
||||
@@ -1362,6 +1346,10 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo
|
||||
<source>Another instance of KeePassXC is already running.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Existing single-instance lock file is invalid. Launching new instance.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
@@ -1417,10 +1405,6 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo
|
||||
<source>&Recent databases</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>He&lp</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>E&ntries</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1445,10 +1429,6 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo
|
||||
<source>&About</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Open database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Save database</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1489,14 +1469,6 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo
|
||||
<source>&Delete group</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sa&ve database as</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change &master key</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Database settings</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1509,10 +1481,6 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo
|
||||
<source>Timed one-time password</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Setup TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy &TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1561,14 +1529,6 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo
|
||||
<source>&Notes</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Export to CSV file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Re&pair database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password Generator</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1589,14 +1549,6 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo
|
||||
<source>&Tools</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import KeePass 1 database</source>
|
||||
<translation>Importér KeePass 1 database</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import CSV file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Empty recycle bin</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1613,6 +1565,42 @@ Dette er en envejs konvertering. Du vil ikke være i stand til at åbne den impo
|
||||
<source>Please touch the button on your YubiKey!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Help</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Open database...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sa&ve database as...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change &master key...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Export to CSV file...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import KeePass 1 database...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import CSV file...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Re&pair database...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set up TOTP...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OptionDialog</name>
|
||||
@@ -2159,6 +2147,18 @@ give it a unique name to identify and accept it.</source>
|
||||
<source>Always ask before performing Auto-Type</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-Type delay</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source> ms</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Start only a single instance of KeePassXC</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsWidgetSecurity</name>
|
||||
@@ -2198,6 +2198,14 @@ give it a unique name to identify and accept it.</source>
|
||||
<source>Lock databases when session is locked or lid is closed</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Privacy</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use Google as fallback for downloading website icons</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SetupTotpDialog</name>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -11,73 +11,14 @@
|
||||
<source>About</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues"><span style="text-decoration: underline; color:#0000ff;">https://github.com</span></a></p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head><style>li {font-size: 10pt}</style></head><body><p><span style=" font-size:10pt;">Project Maintainers:</span></p><ul><li>droidmonkey</li><li>phoerious</li><li>TheZ3ro</li><li>louib</li><li>Weslly</li><li>debfx (KeePassX)</li></ul></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Contributors</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><body>
|
||||
<p style="font-size:x-large; font-weight:600;">Code:</p>
|
||||
<ul>
|
||||
<li style="font-size:10pt">debfx (KeePassX)</li>
|
||||
<li style="font-size:10pt">BlueIce (KeePassX)</li>
|
||||
<li style="font-size:10pt">droidmonkey</li>
|
||||
<li style="font-size:10pt">phoerious</li>
|
||||
<li style="font-size:10pt">TheZ3ro</li>
|
||||
<li style="font-size:10pt">louib</li>
|
||||
<li style="font-size:10pt">weslly</li>
|
||||
<li style="font-size:10pt">keithbennett (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">Typz (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">denk-mal (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">kylemanna (YubiKey)</li>
|
||||
<li style="font-size:10pt">seatedscribe (CSV Importer)</li>
|
||||
<li style="font-size:10pt">pgalves (Inline Messages)</li>
|
||||
</ul>
|
||||
<p style="font-size:x-large; font-weight:600;">Translations:</p>
|
||||
<ul>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Chinese:</span> Biggulu, ligyxy, BestSteve</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Czech:</span> pavelb, JosefVitu</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Dutch:</span> Vistaus, KnooL, apie</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Finnish:</span> MawKKe</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">French:</span> Scrat15, frgnca, gilbsgilbs, gtalbot, iannick, kyodev, logut</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">German:</span> Calyrx, DavidHamburg, antsas, codejunky, jensrutschmann, montilo, omnisome4, origin_de, pcrcoding, phoerious, rgloor, vlenzer</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Greek:</span> nplatis</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Italian:</span> TheZ3ro, FranzMari, Mte90, tosky</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Kazakh:</span> sotrud_nik</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Lithuanian:</span> Moo</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Polish:</span> konradmb, mrerexx</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Portuguese: </span>vitor895, weslly, American_Jesus, mihai.ile</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Russian:</span> vsvyatski, KekcuHa, wkill95</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Spanish:</span> EdwardNavarro, antifaz, piegope, pquin, vsvyatski</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Swedish:</span> henziger</li>
|
||||
</ul>
|
||||
</body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p align="center"><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">See Contributions on GitHub</span></a></p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Debug Info</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Include the following information whenever you report a bug:</p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy to clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
@@ -105,6 +46,30 @@ Kernel: %3 %4</source>
|
||||
<source>Enabled extensions:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Project Maintainers:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Include the following information whenever you report a bug:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Distribution: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>AccessControlDialog</name>
|
||||
@@ -249,10 +214,6 @@ Please select whether you want to allow access.</source>
|
||||
<source>Clone Options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Append ' - Copy' to title</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Replace username and password with references</source>
|
||||
<translation type="unfinished"></translation>
|
||||
@@ -261,6 +222,10 @@ Please select whether you want to allow access.</source>
|
||||
<source>Copy history</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Append ' - Clone' to title</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CsvImportWidget</name>
|
||||
@@ -1094,10 +1059,6 @@ Do you want to open it anyway?</source>
|
||||
<source>Select Image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Download favicon</source>
|
||||
<translation type="unfinished"></translation>
|
||||
@@ -1126,6 +1087,14 @@ Do you want to open it anyway?</source>
|
||||
<source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Custom icon already exists</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditWidgetProperties</name>
|
||||
@@ -1333,16 +1302,27 @@ Do you want to open it anyway?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The selected file is an old KeePass 1 database (.kdb).
|
||||
|
||||
You can import it by clicking on Database > 'Import KeePass 1 database'.
|
||||
This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source>
|
||||
<source>Unable to issue challenge-response.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The selected file is an old KeePass 1 database (.kdb).
|
||||
|
||||
You can import it by clicking on Database > 'Import KeePass 1 database...'.
|
||||
This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>KeePass2Writer</name>
|
||||
<message>
|
||||
<source>Unable to issue challenge-response.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to calculate master key</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Main</name>
|
||||
@@ -1362,6 +1342,10 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>Another instance of KeePassXC is already running.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Existing single-instance lock file is invalid. Launching new instance.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
@@ -1417,10 +1401,6 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>&Recent databases</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>He&lp</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>E&ntries</source>
|
||||
<translation type="unfinished"></translation>
|
||||
@@ -1445,10 +1425,6 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>&About</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Open database</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Save database</source>
|
||||
<translation type="unfinished"></translation>
|
||||
@@ -1489,14 +1465,6 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>&Delete group</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sa&ve database as</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change &master key</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Database settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
@@ -1509,10 +1477,6 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>Timed one-time password</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Setup TOTP</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy &TOTP</source>
|
||||
<translation type="unfinished"></translation>
|
||||
@@ -1561,14 +1525,6 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>&Notes</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Export to CSV file</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Re&pair database</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password Generator</source>
|
||||
<translation type="unfinished"></translation>
|
||||
@@ -1589,14 +1545,6 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>&Tools</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import KeePass 1 database</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import CSV file</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Empty recycle bin</source>
|
||||
<translation type="unfinished"></translation>
|
||||
@@ -1613,6 +1561,42 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>Please touch the button on your YubiKey!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Help</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Open database...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sa&ve database as...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change &master key...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Export to CSV file...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import KeePass 1 database...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import CSV file...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Re&pair database...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set up TOTP...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OptionDialog</name>
|
||||
@@ -2159,6 +2143,18 @@ give it a unique name to identify and accept it.</source>
|
||||
<source>Always ask before performing Auto-Type</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-Type delay</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> ms</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Start only a single instance of KeePassXC</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsWidgetSecurity</name>
|
||||
@@ -2198,6 +2194,14 @@ give it a unique name to identify and accept it.</source>
|
||||
<source>Lock databases when session is locked or lid is closed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Privacy</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use Google as fallback for downloading website icons</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SetupTotpDialog</name>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
2384
share/translations/keepassx_eu.ts
Normal file
2384
share/translations/keepassx_eu.ts
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
2407
share/translations/keepassx_hu.ts
Normal file
2407
share/translations/keepassx_hu.ts
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -9,73 +9,14 @@
|
||||
<source>About</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues"><span style="text-decoration: underline; color:#0000ff;">https://github.com</span></a></p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head><style>li {font-size: 10pt}</style></head><body><p><span style=" font-size:10pt;">Project Maintainers:</span></p><ul><li>droidmonkey</li><li>phoerious</li><li>TheZ3ro</li><li>louib</li><li>Weslly</li><li>debfx (KeePassX)</li></ul></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Contributors</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><body>
|
||||
<p style="font-size:x-large; font-weight:600;">Code:</p>
|
||||
<ul>
|
||||
<li style="font-size:10pt">debfx (KeePassX)</li>
|
||||
<li style="font-size:10pt">BlueIce (KeePassX)</li>
|
||||
<li style="font-size:10pt">droidmonkey</li>
|
||||
<li style="font-size:10pt">phoerious</li>
|
||||
<li style="font-size:10pt">TheZ3ro</li>
|
||||
<li style="font-size:10pt">louib</li>
|
||||
<li style="font-size:10pt">weslly</li>
|
||||
<li style="font-size:10pt">keithbennett (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">Typz (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">denk-mal (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">kylemanna (YubiKey)</li>
|
||||
<li style="font-size:10pt">seatedscribe (CSV Importer)</li>
|
||||
<li style="font-size:10pt">pgalves (Inline Messages)</li>
|
||||
</ul>
|
||||
<p style="font-size:x-large; font-weight:600;">Translations:</p>
|
||||
<ul>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Chinese:</span> Biggulu, ligyxy, BestSteve</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Czech:</span> pavelb, JosefVitu</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Dutch:</span> Vistaus, KnooL, apie</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Finnish:</span> MawKKe</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">French:</span> Scrat15, frgnca, gilbsgilbs, gtalbot, iannick, kyodev, logut</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">German:</span> Calyrx, DavidHamburg, antsas, codejunky, jensrutschmann, montilo, omnisome4, origin_de, pcrcoding, phoerious, rgloor, vlenzer</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Greek:</span> nplatis</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Italian:</span> TheZ3ro, FranzMari, Mte90, tosky</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Kazakh:</span> sotrud_nik</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Lithuanian:</span> Moo</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Polish:</span> konradmb, mrerexx</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Portuguese: </span>vitor895, weslly, American_Jesus, mihai.ile</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Russian:</span> vsvyatski, KekcuHa, wkill95</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Spanish:</span> EdwardNavarro, antifaz, piegope, pquin, vsvyatski</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Swedish:</span> henziger</li>
|
||||
</ul>
|
||||
</body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p align="center"><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">See Contributions on GitHub</span></a></p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Debug Info</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Include the following information whenever you report a bug:</p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy to clipboard</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -103,6 +44,30 @@ Kernel: %3 %4</source>
|
||||
<source>Enabled extensions:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Project Maintainers:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Include the following information whenever you report a bug:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Distribution: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>AccessControlDialog</name>
|
||||
@@ -248,10 +213,6 @@ Please select whether you want to allow access.</source>
|
||||
<source>Clone Options</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Append ' - Copy' to title</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Replace username and password with references</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -260,6 +221,10 @@ Please select whether you want to allow access.</source>
|
||||
<source>Copy history</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Append ' - Clone' to title</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CsvImportWidget</name>
|
||||
@@ -1092,10 +1057,6 @@ Do you want to open it anyway?</source>
|
||||
<source>Select Image</source>
|
||||
<translation>Суретті таңдау</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
<translation>Қате</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Download favicon</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1124,6 +1085,14 @@ Do you want to open it anyway?</source>
|
||||
<source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Custom icon already exists</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditWidgetProperties</name>
|
||||
@@ -1330,20 +1299,28 @@ Do you want to open it anyway?</source>
|
||||
<source>Unable to calculate master key</source>
|
||||
<translation>Басты парольді есептеу мүмкін емес</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to issue challenge-response.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>The selected file is an old KeePass 1 database (.kdb).
|
||||
|
||||
You can import it by clicking on Database > 'Import KeePass 1 database'.
|
||||
You can import it by clicking on Database > 'Import KeePass 1 database...'.
|
||||
This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source>
|
||||
<translation>Таңдалған файл ескі KeePass 1 дерекқоры (.kdb) болып табылады.
|
||||
|
||||
Оны Дерекқор > 'KeePass 1 дерекқорын импорттау' арқылы импорттай аласыз.
|
||||
Бұл - бір жақты миграция. Одан кейін сіз импортталған дерекқорды ескі KeePassX 0.4 нұсқасымен аша алмайтын боласыз.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>KeePass2Writer</name>
|
||||
<message>
|
||||
<source>Unable to issue challenge-response.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to calculate master key</source>
|
||||
<translation>Басты парольді есептеу мүмкін емес</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Main</name>
|
||||
@@ -1363,6 +1340,10 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>Another instance of KeePassXC is already running.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Existing single-instance lock file is invalid. Launching new instance.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
@@ -1418,10 +1399,6 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>&Recent databases</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>He&lp</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>E&ntries</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1446,10 +1423,6 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>&About</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Open database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Save database</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1490,14 +1463,6 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>&Delete group</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sa&ve database as</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change &master key</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Database settings</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1510,10 +1475,6 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>Timed one-time password</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Setup TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy &TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1562,14 +1523,6 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>&Notes</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Export to CSV file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Re&pair database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password Generator</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1590,14 +1543,6 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>&Tools</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import KeePass 1 database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import CSV file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Empty recycle bin</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1614,6 +1559,42 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>Please touch the button on your YubiKey!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Help</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Open database...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sa&ve database as...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change &master key...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Export to CSV file...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import KeePass 1 database...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import CSV file...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Re&pair database...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set up TOTP...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OptionDialog</name>
|
||||
@@ -2160,6 +2141,18 @@ give it a unique name to identify and accept it.</source>
|
||||
<source>Always ask before performing Auto-Type</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-Type delay</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source> ms</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Start only a single instance of KeePassXC</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsWidgetSecurity</name>
|
||||
@@ -2199,6 +2192,14 @@ give it a unique name to identify and accept it.</source>
|
||||
<source>Lock databases when session is locked or lid is closed</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Privacy</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use Google as fallback for downloading website icons</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SetupTotpDialog</name>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -9,73 +9,14 @@
|
||||
<source>About</source>
|
||||
<translation>Over</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues"><span style="text-decoration: underline; color:#0000ff;">https://github.com</span></a></p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head><style>li {font-size: 10pt}</style></head><body><p><span style=" font-size:10pt;">Project Maintainers:</span></p><ul><li>droidmonkey</li><li>phoerious</li><li>TheZ3ro</li><li>louib</li><li>Weslly</li><li>debfx (KeePassX)</li></ul></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Contributors</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><body>
|
||||
<p style="font-size:x-large; font-weight:600;">Code:</p>
|
||||
<ul>
|
||||
<li style="font-size:10pt">debfx (KeePassX)</li>
|
||||
<li style="font-size:10pt">BlueIce (KeePassX)</li>
|
||||
<li style="font-size:10pt">droidmonkey</li>
|
||||
<li style="font-size:10pt">phoerious</li>
|
||||
<li style="font-size:10pt">TheZ3ro</li>
|
||||
<li style="font-size:10pt">louib</li>
|
||||
<li style="font-size:10pt">weslly</li>
|
||||
<li style="font-size:10pt">keithbennett (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">Typz (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">denk-mal (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">kylemanna (YubiKey)</li>
|
||||
<li style="font-size:10pt">seatedscribe (CSV Importer)</li>
|
||||
<li style="font-size:10pt">pgalves (Inline Messages)</li>
|
||||
</ul>
|
||||
<p style="font-size:x-large; font-weight:600;">Translations:</p>
|
||||
<ul>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Chinese:</span> Biggulu, ligyxy, BestSteve</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Czech:</span> pavelb, JosefVitu</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Dutch:</span> Vistaus, KnooL, apie</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Finnish:</span> MawKKe</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">French:</span> Scrat15, frgnca, gilbsgilbs, gtalbot, iannick, kyodev, logut</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">German:</span> Calyrx, DavidHamburg, antsas, codejunky, jensrutschmann, montilo, omnisome4, origin_de, pcrcoding, phoerious, rgloor, vlenzer</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Greek:</span> nplatis</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Italian:</span> TheZ3ro, FranzMari, Mte90, tosky</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Kazakh:</span> sotrud_nik</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Lithuanian:</span> Moo</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Polish:</span> konradmb, mrerexx</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Portuguese: </span>vitor895, weslly, American_Jesus, mihai.ile</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Russian:</span> vsvyatski, KekcuHa, wkill95</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Spanish:</span> EdwardNavarro, antifaz, piegope, pquin, vsvyatski</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Swedish:</span> henziger</li>
|
||||
</ul>
|
||||
</body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p align="center"><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">See Contributions on GitHub</span></a></p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Debug Info</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Include the following information whenever you report a bug:</p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy to clipboard</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -103,6 +44,30 @@ Kernel: %3 %4</source>
|
||||
<source>Enabled extensions:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
|
||||
<translation>KeePassXC wordt verspreid onder de voorwaarden van de GNU General Public License (GPL) versie 2 of (als u wenst) versie 3.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Project Maintainers:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Include the following information whenever you report a bug:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Distribution: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>AccessControlDialog</name>
|
||||
@@ -249,10 +214,6 @@ Geef aan of u toegang wilt toestaan of niet.</translation>
|
||||
<source>Clone Options</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Append ' - Copy' to title</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Replace username and password with references</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -261,6 +222,10 @@ Geef aan of u toegang wilt toestaan of niet.</translation>
|
||||
<source>Copy history</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Append ' - Clone' to title</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CsvImportWidget</name>
|
||||
@@ -1095,10 +1060,6 @@ Wilt u toch doorgaan met openen?</translation>
|
||||
<source>Select Image</source>
|
||||
<translation>Kies afbeelding</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
<translation>Fout</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Download favicon</source>
|
||||
<translation>Favicon downloaden</translation>
|
||||
@@ -1127,6 +1088,14 @@ Wilt u toch doorgaan met openen?</translation>
|
||||
<source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Custom icon already exists</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditWidgetProperties</name>
|
||||
@@ -1333,20 +1302,28 @@ Wilt u toch doorgaan met openen?</translation>
|
||||
<source>Unable to calculate master key</source>
|
||||
<translation>Niet mogelijk om hoofdsleutel te berekenen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to issue challenge-response.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>The selected file is an old KeePass 1 database (.kdb).
|
||||
|
||||
You can import it by clicking on Database > 'Import KeePass 1 database'.
|
||||
You can import it by clicking on Database > 'Import KeePass 1 database...'.
|
||||
This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source>
|
||||
<translation>Het gekozen bestand is een oude KeePass 1 database (.kdb).
|
||||
|
||||
U kunt het importeren door te klikken op Database > 'KeePass 1 database importeren'.
|
||||
Deze actie is niet omkeerbaar. U kunt de geimporteerde database niet meer openen met KeePassX 0.4.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>KeePass2Writer</name>
|
||||
<message>
|
||||
<source>Unable to issue challenge-response.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to calculate master key</source>
|
||||
<translation>Niet mogelijk om hoofdsleutel te berekenen</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Main</name>
|
||||
@@ -1366,6 +1343,10 @@ Deze actie is niet omkeerbaar. U kunt de geimporteerde database niet meer openen
|
||||
<source>Another instance of KeePassXC is already running.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Existing single-instance lock file is invalid. Launching new instance.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
@@ -1421,10 +1402,6 @@ Deze actie is niet omkeerbaar. U kunt de geimporteerde database niet meer openen
|
||||
<source>&Recent databases</source>
|
||||
<translation>&Recente databases</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>He&lp</source>
|
||||
<translation>He&lp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>E&ntries</source>
|
||||
<translation>Items</translation>
|
||||
@@ -1449,10 +1426,6 @@ Deze actie is niet omkeerbaar. U kunt de geimporteerde database niet meer openen
|
||||
<source>&About</source>
|
||||
<translation>&Over</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Open database</source>
|
||||
<translation>&Open database</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Save database</source>
|
||||
<translation>&Sla database op</translation>
|
||||
@@ -1493,14 +1466,6 @@ Deze actie is niet omkeerbaar. U kunt de geimporteerde database niet meer openen
|
||||
<source>&Delete group</source>
|
||||
<translation>&Verwijder groep</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sa&ve database as</source>
|
||||
<translation>Database opslaan als</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change &master key</source>
|
||||
<translation>Wijzig &hoofdsleutel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Database settings</source>
|
||||
<translation>&Database-instellingen</translation>
|
||||
@@ -1513,10 +1478,6 @@ Deze actie is niet omkeerbaar. U kunt de geimporteerde database niet meer openen
|
||||
<source>Timed one-time password</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Setup TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy &TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1565,14 +1526,6 @@ Deze actie is niet omkeerbaar. U kunt de geimporteerde database niet meer openen
|
||||
<source>&Notes</source>
|
||||
<translation>&Opmerkingen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Export to CSV file</source>
|
||||
<translation>&Naar CSV-bestand exporteren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Re&pair database</source>
|
||||
<translation>Database repareren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password Generator</source>
|
||||
<translation>Wachtwoord generator</translation>
|
||||
@@ -1593,14 +1546,6 @@ Deze actie is niet omkeerbaar. U kunt de geimporteerde database niet meer openen
|
||||
<source>&Tools</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import KeePass 1 database</source>
|
||||
<translation>Importeer Keepass 1-database</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import CSV file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Empty recycle bin</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1617,6 +1562,42 @@ Deze actie is niet omkeerbaar. U kunt de geimporteerde database niet meer openen
|
||||
<source>Please touch the button on your YubiKey!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Help</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Open database...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sa&ve database as...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change &master key...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Export to CSV file...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import KeePass 1 database...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import CSV file...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Re&pair database...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set up TOTP...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OptionDialog</name>
|
||||
@@ -2167,6 +2148,18 @@ Geef het een unieke identificerende naam en accepteer de associate wanneer je de
|
||||
<source>Always ask before performing Auto-Type</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-Type delay</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source> ms</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Start only a single instance of KeePassXC</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsWidgetSecurity</name>
|
||||
@@ -2206,6 +2199,14 @@ Geef het een unieke identificerende naam en accepteer de associate wanneer je de
|
||||
<source>Lock databases when session is locked or lid is closed</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Privacy</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use Google as fallback for downloading website icons</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SetupTotpDialog</name>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -9,98 +9,66 @@
|
||||
<source>About</source>
|
||||
<translation>Sobre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues"><span style="text-decoration: underline; color:#0000ff;">https://github.com</span></a></p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head><style>li {font-size: 10pt}</style></head><body><p><span style=" font-size:10pt;">Project Maintainers:</span></p><ul><li>droidmonkey</li><li>phoerious</li><li>TheZ3ro</li><li>louib</li><li>Weslly</li><li>debfx (KeePassX)</li></ul></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Contributors</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><body>
|
||||
<p style="font-size:x-large; font-weight:600;">Code:</p>
|
||||
<ul>
|
||||
<li style="font-size:10pt">debfx (KeePassX)</li>
|
||||
<li style="font-size:10pt">BlueIce (KeePassX)</li>
|
||||
<li style="font-size:10pt">droidmonkey</li>
|
||||
<li style="font-size:10pt">phoerious</li>
|
||||
<li style="font-size:10pt">TheZ3ro</li>
|
||||
<li style="font-size:10pt">louib</li>
|
||||
<li style="font-size:10pt">weslly</li>
|
||||
<li style="font-size:10pt">keithbennett (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">Typz (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">denk-mal (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">kylemanna (YubiKey)</li>
|
||||
<li style="font-size:10pt">seatedscribe (CSV Importer)</li>
|
||||
<li style="font-size:10pt">pgalves (Inline Messages)</li>
|
||||
</ul>
|
||||
<p style="font-size:x-large; font-weight:600;">Translations:</p>
|
||||
<ul>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Chinese:</span> Biggulu, ligyxy, BestSteve</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Czech:</span> pavelb, JosefVitu</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Dutch:</span> Vistaus, KnooL, apie</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Finnish:</span> MawKKe</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">French:</span> Scrat15, frgnca, gilbsgilbs, gtalbot, iannick, kyodev, logut</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">German:</span> Calyrx, DavidHamburg, antsas, codejunky, jensrutschmann, montilo, omnisome4, origin_de, pcrcoding, phoerious, rgloor, vlenzer</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Greek:</span> nplatis</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Italian:</span> TheZ3ro, FranzMari, Mte90, tosky</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Kazakh:</span> sotrud_nik</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Lithuanian:</span> Moo</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Polish:</span> konradmb, mrerexx</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Portuguese: </span>vitor895, weslly, American_Jesus, mihai.ile</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Russian:</span> vsvyatski, KekcuHa, wkill95</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Spanish:</span> EdwardNavarro, antifaz, piegope, pquin, vsvyatski</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Swedish:</span> henziger</li>
|
||||
</ul>
|
||||
</body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p align="center"><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">See Contributions on GitHub</span></a></p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Colaboradores</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Debug Info</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Include the following information whenever you report a bug:</p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Informações de Depuração</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy to clipboard</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Copiar para a área de transferência</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Version %1
|
||||
</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Versão %1
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Revision: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Revisão: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Libraries:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Bibliotecas:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Operating system: %1
|
||||
CPU architecture: %2
|
||||
Kernel: %3 %4</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Sistema operacional: %1
|
||||
Arquitetura da CPU: %2
|
||||
Kernel: %3 %4</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enabled extensions:</source>
|
||||
<translation>Extensões habilitadas:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source>
|
||||
<translation>Reporte erros em: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
|
||||
<translation>KeePassXC é distribuído nos termos da Licença Pública Geral (GPL), versão 2 ou (à sua escolha) versão 3, do GNU.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Project Maintainers:</source>
|
||||
<translation>Mantedores do Projeto:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source>
|
||||
<translation><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">Ver Colaborações no GitHub</a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Include the following information whenever you report a bug:</source>
|
||||
<translation>Inclua as informações abaixo quando reportar um erro:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Distribution: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
@@ -232,11 +200,11 @@ Selecione se deseja permitir o acesso.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Refresh</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Atualizar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Empty password</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Senha vazia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changing master key failed: no YubiKey inserted.</source>
|
||||
@@ -247,18 +215,18 @@ Selecione se deseja permitir o acesso.</translation>
|
||||
<name>CloneDialog</name>
|
||||
<message>
|
||||
<source>Clone Options</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Append ' - Copy' to title</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Opções de Clonagem</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Replace username and password with references</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Substituir o usuário e senha com referências</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy history</source>
|
||||
<translation>Copiar histórico</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Append ' - Clone' to title</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
@@ -266,23 +234,23 @@ Selecione se deseja permitir o acesso.</translation>
|
||||
<name>CsvImportWidget</name>
|
||||
<message>
|
||||
<source>Import CSV fields</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Importar campos CSV</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>filename</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>nome do arquivo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>size, rows, columns</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>tamanho, linhas, colunas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Encoding</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Codificação</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Codec</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Codec</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Text is qualified by</source>
|
||||
@@ -310,7 +278,7 @@ Selecione se deseja permitir o acesso.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Preview</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Visualização</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Column layout</source>
|
||||
@@ -326,7 +294,7 @@ Selecione se deseja permitir o acesso.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>column </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>coluna</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Imported from CSV file</source>
|
||||
@@ -334,7 +302,7 @@ Selecione se deseja permitir o acesso.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Original data: </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Dados originais:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error(s) detected in CSV file !</source>
|
||||
@@ -358,7 +326,7 @@ Selecione se deseja permitir o acesso.</translation>
|
||||
<name>CsvImportWizard</name>
|
||||
<message>
|
||||
<source>Import CSV file</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Importar arquivo CSV</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
@@ -381,7 +349,7 @@ Selecione se deseja permitir o acesso.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> columns</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>colunas</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -424,7 +392,7 @@ Selecione se deseja permitir o acesso.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Refresh</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Atualizar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Challenge Response:</source>
|
||||
@@ -772,7 +740,7 @@ Mesmo assim deseja salvá-la?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Empty recycle bin?</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Esvaziar lixeira?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Are you sure you want to permanently delete everything from your recycle bin?</source>
|
||||
@@ -904,15 +872,15 @@ Mesmo assim deseja salvá-la?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Edit Name</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Editar Nome</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Protect</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Proteger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reveal</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Revelar</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -951,7 +919,7 @@ Mesmo assim deseja salvá-la?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Window Associations</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Associações de Janela</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1096,10 +1064,6 @@ Mesmo assim deseja salvá-la?</translation>
|
||||
<source>Select Image</source>
|
||||
<translation>Selecionar imagem</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
<translation>Erro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Download favicon</source>
|
||||
<translation>Baixar favicon</translation>
|
||||
@@ -1122,12 +1086,20 @@ Mesmo assim deseja salvá-la?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Confirm Delete</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Confirmar Exclusão</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Custom icon already exists</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditWidgetProperties</name>
|
||||
@@ -1202,7 +1174,7 @@ Mesmo assim deseja salvá-la?</translation>
|
||||
<message>
|
||||
<source>Ref: </source>
|
||||
<comment>Reference abbreviation</comment>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Ref:</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1267,11 +1239,11 @@ Mesmo assim deseja salvá-la?</translation>
|
||||
<name>KMessageWidget</name>
|
||||
<message>
|
||||
<source>&Close</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fe&char</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Close message</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fechar mensagem</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1334,20 +1306,28 @@ Mesmo assim deseja salvá-la?</translation>
|
||||
<source>Unable to calculate master key</source>
|
||||
<translation>Não foi possível calcular a chave mestre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to issue challenge-response.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>The selected file is an old KeePass 1 database (.kdb).
|
||||
|
||||
You can import it by clicking on Database > 'Import KeePass 1 database'.
|
||||
You can import it by clicking on Database > 'Import KeePass 1 database...'.
|
||||
This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source>
|
||||
<translation>O arquivo selecionado é um banco de dados antigo do KeePass 1 (.kdb).
|
||||
|
||||
Você pode importá-lo clicando em Banco de Dados > 'Importar banco de dados KeePass 1'.
|
||||
Esta é uma migração de uma via. Você não poderá abrir o banco de dados importado com a versão antiga do KeePassX 0.4.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>KeePass2Writer</name>
|
||||
<message>
|
||||
<source>Unable to issue challenge-response.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to calculate master key</source>
|
||||
<translation>Não foi possível calcular a chave mestre</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Main</name>
|
||||
@@ -1367,6 +1347,10 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp
|
||||
<source>Another instance of KeePassXC is already running.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Existing single-instance lock file is invalid. Launching new instance.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
@@ -1422,10 +1406,6 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp
|
||||
<source>&Recent databases</source>
|
||||
<translation>&Bancos de dados recentes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>He&lp</source>
|
||||
<translation>&Ajuda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>E&ntries</source>
|
||||
<translation>E&ntradas</translation>
|
||||
@@ -1450,10 +1430,6 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp
|
||||
<source>&About</source>
|
||||
<translation>&Sobre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Open database</source>
|
||||
<translation>&Abrir base de dados</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Save database</source>
|
||||
<translation>&Salvar base de dados</translation>
|
||||
@@ -1494,14 +1470,6 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp
|
||||
<source>&Delete group</source>
|
||||
<translation>&Apagar grupo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sa&ve database as</source>
|
||||
<translation>Sal&var base de dados como</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change &master key</source>
|
||||
<translation>Alterar chave &mestra</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Database settings</source>
|
||||
<translation>&Definições da base de dados</translation>
|
||||
@@ -1512,19 +1480,15 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp
|
||||
</message>
|
||||
<message>
|
||||
<source>Timed one-time password</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Setup TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Senha temporária de uso único</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy &TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Copiar &TOTP</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Mostrar TOTP</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Find</source>
|
||||
@@ -1566,45 +1530,29 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp
|
||||
<source>&Notes</source>
|
||||
<translation>&Notas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Export to CSV file</source>
|
||||
<translation>&Exportar para arquivo CSV</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Re&pair database</source>
|
||||
<translation>Re&parar banco de dados</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password Generator</source>
|
||||
<translation>Gerador de Senha</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear history</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Limpar histórico</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Database</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Banco de &dados</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Importar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Tools</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import KeePass 1 database</source>
|
||||
<translation>Importar banco de dados KeePass1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import CSV file</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>&Ferramentas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Empty recycle bin</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Esvaziar lixeira</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Access error for config file %1</source>
|
||||
@@ -1612,12 +1560,48 @@ Esta é uma migração de uma via. Você não poderá abrir o banco de dados imp
|
||||
</message>
|
||||
<message>
|
||||
<source>Quit KeePassXC</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Fechar KeePassXC</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Please touch the button on your YubiKey!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Help</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Open database...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sa&ve database as...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change &master key...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Export to CSV file...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import KeePass 1 database...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import CSV file...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Re&pair database...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set up TOTP...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OptionDialog</name>
|
||||
@@ -1705,7 +1689,7 @@ Usando porta padrão 19455.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Enable KeePassHTTP server</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Habilitar servidor KeePassHTTP</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Only returns the best matches for a specific URL instead of all entries for the whole domain.</source>
|
||||
@@ -1837,23 +1821,23 @@ Change them only if you know what you are doing.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Passphrase</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Senha</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Wordlist:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Lista de palavras:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Word Count:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Número de Palavras:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Word Separator:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Separador de Palavras:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Copiar</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1909,7 +1893,7 @@ Change them only if you know what you are doing.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browser Integration</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Integração com o Navegador</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>YubiKey[%1] Challenge Response - Slot %2 - %3</source>
|
||||
@@ -1917,11 +1901,11 @@ Change them only if you know what you are doing.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Press</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Aperte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Passive</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Passivo</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1974,11 +1958,11 @@ Change them only if you know what you are doing.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Search...</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Buscar...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Limit search to selected group</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Limitar busca ao grupo selecionado</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2147,7 +2131,7 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Basic Settings</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Configurações Básicas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Remember last key files and security dongles</source>
|
||||
@@ -2169,6 +2153,18 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation>
|
||||
<source>Always ask before performing Auto-Type</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-Type delay</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source> ms</source>
|
||||
<translation>ms</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Start only a single instance of KeePassXC</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsWidgetSecurity</name>
|
||||
@@ -2202,46 +2198,54 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Convenience</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Conveniência</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Lock databases when session is locked or lid is closed</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Privacy</source>
|
||||
<translation>Privacidade</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use Google as fallback for downloading website icons</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SetupTotpDialog</name>
|
||||
<message>
|
||||
<source>Setup TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Configurar TOTP</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Key:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Chave:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use custom settings</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Usar configurações personalizadas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Note: Change these settings only if you know what you are doing.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Nota: Altere estas configurações apenas se souber o que está fazendo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Time step:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Período de tempo:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>8 digits</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>8 dígitos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>6 digits</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>6 dígitos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Code size:</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tamanho do código:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> sec</source>
|
||||
@@ -2252,23 +2256,23 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation>
|
||||
<name>TotpDialog</name>
|
||||
<message>
|
||||
<source>Timed Password</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Senha Temporária</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>000000</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>000000</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Copiar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expires in</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Expira em</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>seconds</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>segundos</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -2282,7 +2286,7 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation>
|
||||
<name>WelcomeWidget</name>
|
||||
<message>
|
||||
<source>Welcome to KeePassXC</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Bem vindo ao KeePassXC</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Start storing your passwords securely in a KeePassXC database</source>
|
||||
@@ -2290,19 +2294,19 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Create new database</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Criar novo banco de dados</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open existing database</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Abrir banco de dados existente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import from KeePass 1</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Importar do KeePass 1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import from CSV</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Importar arquivo CSV</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Recent databases</source>
|
||||
@@ -2337,7 +2341,7 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Path of the database.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Caminho do banco de dados</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use a GUI prompt unlocking the database.</source>
|
||||
@@ -2353,15 +2357,15 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Path of the database to extract.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Caminho do banco de dados para extração.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Name of the command to execute.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Nome do comando para executar.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>List database entries.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Listar entradas do banco de dados.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Path of the group to list. Default is /</source>
|
||||
@@ -2373,7 +2377,7 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Merge two databases.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Juntar dois bancos de dados.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Path of the database to merge into.</source>
|
||||
@@ -2389,11 +2393,11 @@ dar-lhe um nome único para identificá-lo e aceitá-lo.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Show a password.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Mostrar uma senha.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Name of the entry to show.</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Nome da entrada para mostrar.</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -9,73 +9,14 @@
|
||||
<source>About</source>
|
||||
<translation>O programu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues"><span style="text-decoration: underline; color:#0000ff;">https://github.com</span></a></p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head><style>li {font-size: 10pt}</style></head><body><p><span style=" font-size:10pt;">Project Maintainers:</span></p><ul><li>droidmonkey</li><li>phoerious</li><li>TheZ3ro</li><li>louib</li><li>Weslly</li><li>debfx (KeePassX)</li></ul></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Contributors</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><body>
|
||||
<p style="font-size:x-large; font-weight:600;">Code:</p>
|
||||
<ul>
|
||||
<li style="font-size:10pt">debfx (KeePassX)</li>
|
||||
<li style="font-size:10pt">BlueIce (KeePassX)</li>
|
||||
<li style="font-size:10pt">droidmonkey</li>
|
||||
<li style="font-size:10pt">phoerious</li>
|
||||
<li style="font-size:10pt">TheZ3ro</li>
|
||||
<li style="font-size:10pt">louib</li>
|
||||
<li style="font-size:10pt">weslly</li>
|
||||
<li style="font-size:10pt">keithbennett (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">Typz (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">denk-mal (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">kylemanna (YubiKey)</li>
|
||||
<li style="font-size:10pt">seatedscribe (CSV Importer)</li>
|
||||
<li style="font-size:10pt">pgalves (Inline Messages)</li>
|
||||
</ul>
|
||||
<p style="font-size:x-large; font-weight:600;">Translations:</p>
|
||||
<ul>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Chinese:</span> Biggulu, ligyxy, BestSteve</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Czech:</span> pavelb, JosefVitu</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Dutch:</span> Vistaus, KnooL, apie</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Finnish:</span> MawKKe</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">French:</span> Scrat15, frgnca, gilbsgilbs, gtalbot, iannick, kyodev, logut</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">German:</span> Calyrx, DavidHamburg, antsas, codejunky, jensrutschmann, montilo, omnisome4, origin_de, pcrcoding, phoerious, rgloor, vlenzer</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Greek:</span> nplatis</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Italian:</span> TheZ3ro, FranzMari, Mte90, tosky</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Kazakh:</span> sotrud_nik</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Lithuanian:</span> Moo</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Polish:</span> konradmb, mrerexx</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Portuguese: </span>vitor895, weslly, American_Jesus, mihai.ile</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Russian:</span> vsvyatski, KekcuHa, wkill95</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Spanish:</span> EdwardNavarro, antifaz, piegope, pquin, vsvyatski</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Swedish:</span> henziger</li>
|
||||
</ul>
|
||||
</body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p align="center"><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">See Contributions on GitHub</span></a></p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Debug Info</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Include the following information whenever you report a bug:</p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy to clipboard</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -103,6 +44,30 @@ Kernel: %3 %4</source>
|
||||
<source>Enabled extensions:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Project Maintainers:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Include the following information whenever you report a bug:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Distribution: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>AccessControlDialog</name>
|
||||
@@ -248,10 +213,6 @@ Please select whether you want to allow access.</source>
|
||||
<source>Clone Options</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Append ' - Copy' to title</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Replace username and password with references</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -260,6 +221,10 @@ Please select whether you want to allow access.</source>
|
||||
<source>Copy history</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Append ' - Clone' to title</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CsvImportWidget</name>
|
||||
@@ -1090,10 +1055,6 @@ Do you want to open it anyway?</source>
|
||||
<source>Select Image</source>
|
||||
<translation>Izberi sliko</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
<translation>Napaka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Download favicon</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1122,6 +1083,14 @@ Do you want to open it anyway?</source>
|
||||
<source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Custom icon already exists</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditWidgetProperties</name>
|
||||
@@ -1329,16 +1298,27 @@ Do you want to open it anyway?</source>
|
||||
<translation>Izračun glavnega ključa ni uspel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The selected file is an old KeePass 1 database (.kdb).
|
||||
|
||||
You can import it by clicking on Database > 'Import KeePass 1 database'.
|
||||
This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source>
|
||||
<source>Unable to issue challenge-response.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>The selected file is an old KeePass 1 database (.kdb).
|
||||
|
||||
You can import it by clicking on Database > 'Import KeePass 1 database...'.
|
||||
This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>KeePass2Writer</name>
|
||||
<message>
|
||||
<source>Unable to issue challenge-response.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to calculate master key</source>
|
||||
<translation>Izračun glavnega ključa ni uspel</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Main</name>
|
||||
@@ -1358,6 +1338,10 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>Another instance of KeePassXC is already running.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Existing single-instance lock file is invalid. Launching new instance.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
@@ -1413,10 +1397,6 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>&Recent databases</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>He&lp</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>E&ntries</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1441,10 +1421,6 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>&About</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Open database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Save database</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1485,14 +1461,6 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>&Delete group</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sa&ve database as</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change &master key</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Database settings</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1505,10 +1473,6 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>Timed one-time password</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Setup TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy &TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1557,14 +1521,6 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>&Notes</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Export to CSV file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Re&pair database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password Generator</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1585,14 +1541,6 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>&Tools</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import KeePass 1 database</source>
|
||||
<translation>Uvozi KeePass 1 podatkovno bazo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import CSV file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Empty recycle bin</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1609,6 +1557,42 @@ This is a one-way migration. You won't be able to open the imported databas
|
||||
<source>Please touch the button on your YubiKey!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Help</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Open database...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sa&ve database as...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change &master key...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Export to CSV file...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import KeePass 1 database...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import CSV file...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Re&pair database...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set up TOTP...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OptionDialog</name>
|
||||
@@ -2155,6 +2139,18 @@ give it a unique name to identify and accept it.</source>
|
||||
<source>Always ask before performing Auto-Type</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-Type delay</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source> ms</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Start only a single instance of KeePassXC</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsWidgetSecurity</name>
|
||||
@@ -2194,6 +2190,14 @@ give it a unique name to identify and accept it.</source>
|
||||
<source>Lock databases when session is locked or lid is closed</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Privacy</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use Google as fallback for downloading website icons</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SetupTotpDialog</name>
|
||||
|
||||
@@ -9,73 +9,14 @@
|
||||
<source>About</source>
|
||||
<translation>Om</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues"><span style="text-decoration: underline; color:#0000ff;">https://github.com</span></a></p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head><style>li {font-size: 10pt}</style></head><body><p><span style=" font-size:10pt;">Project Maintainers:</span></p><ul><li>droidmonkey</li><li>phoerious</li><li>TheZ3ro</li><li>louib</li><li>Weslly</li><li>debfx (KeePassX)</li></ul></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Contributors</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><body>
|
||||
<p style="font-size:x-large; font-weight:600;">Code:</p>
|
||||
<ul>
|
||||
<li style="font-size:10pt">debfx (KeePassX)</li>
|
||||
<li style="font-size:10pt">BlueIce (KeePassX)</li>
|
||||
<li style="font-size:10pt">droidmonkey</li>
|
||||
<li style="font-size:10pt">phoerious</li>
|
||||
<li style="font-size:10pt">TheZ3ro</li>
|
||||
<li style="font-size:10pt">louib</li>
|
||||
<li style="font-size:10pt">weslly</li>
|
||||
<li style="font-size:10pt">keithbennett (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">Typz (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">denk-mal (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">kylemanna (YubiKey)</li>
|
||||
<li style="font-size:10pt">seatedscribe (CSV Importer)</li>
|
||||
<li style="font-size:10pt">pgalves (Inline Messages)</li>
|
||||
</ul>
|
||||
<p style="font-size:x-large; font-weight:600;">Translations:</p>
|
||||
<ul>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Chinese:</span> Biggulu, ligyxy, BestSteve</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Czech:</span> pavelb, JosefVitu</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Dutch:</span> Vistaus, KnooL, apie</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Finnish:</span> MawKKe</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">French:</span> Scrat15, frgnca, gilbsgilbs, gtalbot, iannick, kyodev, logut</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">German:</span> Calyrx, DavidHamburg, antsas, codejunky, jensrutschmann, montilo, omnisome4, origin_de, pcrcoding, phoerious, rgloor, vlenzer</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Greek:</span> nplatis</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Italian:</span> TheZ3ro, FranzMari, Mte90, tosky</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Kazakh:</span> sotrud_nik</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Lithuanian:</span> Moo</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Polish:</span> konradmb, mrerexx</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Portuguese: </span>vitor895, weslly, American_Jesus, mihai.ile</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Russian:</span> vsvyatski, KekcuHa, wkill95</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Spanish:</span> EdwardNavarro, antifaz, piegope, pquin, vsvyatski</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Swedish:</span> henziger</li>
|
||||
</ul>
|
||||
</body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p align="center"><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">See Contributions on GitHub</span></a></p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Debug Info</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><html><head/><body><p>Include the following information whenever you report a bug:</p></body></html></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy to clipboard</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -83,7 +24,8 @@
|
||||
<message>
|
||||
<source>Version %1
|
||||
</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Version %1
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Revision: %1</source>
|
||||
@@ -103,6 +45,30 @@ Kernel: %3 %4</source>
|
||||
<source>Enabled extensions:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</source>
|
||||
<translation>KeePassXC distribueras enligt villkoren i GNU General Public License (GPL) version 2 eller (om du vill) version 3.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Project Maintainers:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Include the following information whenever you report a bug:</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Distribution: %1</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>AccessControlDialog</name>
|
||||
@@ -112,11 +78,11 @@ Kernel: %3 %4</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Allow</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tillåt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Deny</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Neka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>%1 has requested access to passwords for the following item(s).
|
||||
@@ -231,11 +197,11 @@ Please select whether you want to allow access.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Refresh</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Uppdatera</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Empty password</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tomt lösenord</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Changing master key failed: no YubiKey inserted.</source>
|
||||
@@ -248,10 +214,6 @@ Please select whether you want to allow access.</source>
|
||||
<source>Clone Options</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Append ' - Copy' to title</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Replace username and password with references</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -260,6 +222,10 @@ Please select whether you want to allow access.</source>
|
||||
<source>Copy history</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Append ' - Clone' to title</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CsvImportWidget</name>
|
||||
@@ -269,7 +235,7 @@ Please select whether you want to allow access.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>filename</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>filnamn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>size, rows, columns</source>
|
||||
@@ -293,7 +259,7 @@ Please select whether you want to allow access.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Comments start with</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kommentarer inleds med</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>First record has field names</source>
|
||||
@@ -309,7 +275,7 @@ Please select whether you want to allow access.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Preview</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Förhandsgranska</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Column layout</source>
|
||||
@@ -321,11 +287,11 @@ Please select whether you want to allow access.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Empty fieldname </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Tomt fältnamn </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>column </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>kolumn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Imported from CSV file</source>
|
||||
@@ -376,11 +342,11 @@ Please select whether you want to allow access.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source> rows, </source>
|
||||
<translation type="unfinished"/>
|
||||
<translation> rader, </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> columns</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation> kolumner</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -423,7 +389,7 @@ Please select whether you want to allow access.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Refresh</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Uppdatera</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Challenge Response:</source>
|
||||
@@ -610,7 +576,7 @@ I annat fall försvinner ändringarna.</translation>
|
||||
<source>"%1" is in edit mode.
|
||||
Discard changes and close anyway?</source>
|
||||
<translation>"%1" är i redigeringsläge.
|
||||
Kasta ändringarna och stäng endå?</translation>
|
||||
Kasta ändringarna och stäng ändå?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Export database to CSV file</source>
|
||||
@@ -661,7 +627,7 @@ Do you want to open it anyway?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open CSV file</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Öppna CSV fil</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -716,7 +682,7 @@ Do you want to open it anyway?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Searching...</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Söker...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No current database.</source>
|
||||
@@ -728,11 +694,11 @@ Do you want to open it anyway?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Search Results (%1)</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Sökresultat (%1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No Results</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Inget resultat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Execute command?</source>
|
||||
@@ -857,7 +823,7 @@ Do you want to open it anyway?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Confirm Remove</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Bekräfta borttagning</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Are you sure you want to remove this attribute?</source>
|
||||
@@ -904,7 +870,7 @@ Do you want to open it anyway?</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Protect</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Skydda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Reveal</source>
|
||||
@@ -1092,10 +1058,6 @@ Do you want to open it anyway?</source>
|
||||
<source>Select Image</source>
|
||||
<translation>Välj bild</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Error</source>
|
||||
<translation>Fel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Download favicon</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1124,6 +1086,14 @@ Do you want to open it anyway?</source>
|
||||
<source>This icon is used by %1 entries, and will be replaced by the default icon. Are you sure you want to delete it?</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hint: You can enable Google as a fallback under Tools>Settings>Security</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Custom icon already exists</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>EditWidgetProperties</name>
|
||||
@@ -1330,20 +1300,28 @@ Do you want to open it anyway?</source>
|
||||
<source>Unable to calculate master key</source>
|
||||
<translation>Kunde inte räkna nu master-nyckeln</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to issue challenge-response.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>The selected file is an old KeePass 1 database (.kdb).
|
||||
|
||||
You can import it by clicking on Database > 'Import KeePass 1 database'.
|
||||
You can import it by clicking on Database > 'Import KeePass 1 database...'.
|
||||
This is a one-way migration. You won't be able to open the imported database with the old KeePassX 0.4 version.</source>
|
||||
<translation>Den valda filen är en gammal KeePass 1 databas (.kdb)
|
||||
|
||||
Du kan importera den genom att klicka på Databas > Importera KeePass 1 databas.
|
||||
Detta är en envägsmigration. Du kan inte spara en databas som KeePass1 databas. Det som används i KeePassX 0.4.</translation>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>KeePass2Writer</name>
|
||||
<message>
|
||||
<source>Unable to issue challenge-response.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unable to calculate master key</source>
|
||||
<translation>Kunde inte räkna nu master-nyckeln</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Main</name>
|
||||
@@ -1363,6 +1341,10 @@ Detta är en envägsmigration. Du kan inte spara en databas som KeePass1 databas
|
||||
<source>Another instance of KeePassXC is already running.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Existing single-instance lock file is invalid. Launching new instance.</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
@@ -1418,10 +1400,6 @@ Detta är en envägsmigration. Du kan inte spara en databas som KeePass1 databas
|
||||
<source>&Recent databases</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>He&lp</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>E&ntries</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1446,10 +1424,6 @@ Detta är en envägsmigration. Du kan inte spara en databas som KeePass1 databas
|
||||
<source>&About</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Open database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Save database</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1490,14 +1464,6 @@ Detta är en envägsmigration. Du kan inte spara en databas som KeePass1 databas
|
||||
<source>&Delete group</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sa&ve database as</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change &master key</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Database settings</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1510,10 +1476,6 @@ Detta är en envägsmigration. Du kan inte spara en databas som KeePass1 databas
|
||||
<source>Timed one-time password</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Setup TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy &TOTP</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1562,21 +1524,13 @@ Detta är en envägsmigration. Du kan inte spara en databas som KeePass1 databas
|
||||
<source>&Notes</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Export to CSV file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Re&pair database</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Password Generator</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear history</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Töm historiken</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Database</source>
|
||||
@@ -1584,20 +1538,12 @@ Detta är en envägsmigration. Du kan inte spara en databas som KeePass1 databas
|
||||
</message>
|
||||
<message>
|
||||
<source>Import</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Importera</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Tools</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import KeePass 1 database</source>
|
||||
<translation>Importera KeePass1 databas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import CSV file</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Empty recycle bin</source>
|
||||
<translation type="unfinished"/>
|
||||
@@ -1614,6 +1560,42 @@ Detta är en envägsmigration. Du kan inte spara en databas som KeePass1 databas
|
||||
<source>Please touch the button on your YubiKey!</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Help</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Open database...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sa&ve database as...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Change &master key...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>&Export to CSV file...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import KeePass 1 database...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import CSV file...</source>
|
||||
<translation>Importera CSV fil...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Re&pair database...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Set up TOTP...</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>OptionDialog</name>
|
||||
@@ -1792,7 +1774,7 @@ Change them only if you know what you are doing.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Close</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Stäng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Apply</source>
|
||||
@@ -1848,7 +1830,7 @@ Change them only if you know what you are doing.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kopiera</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1965,7 +1947,7 @@ Change them only if you know what you are doing.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Clear</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Rensa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Search...</source>
|
||||
@@ -2010,7 +1992,7 @@ Please unlock the selected database or choose another one which is unlocked.</so
|
||||
</message>
|
||||
<message>
|
||||
<source>Abort</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Avbryt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Successfully removed permissions from %1 %2.</source>
|
||||
@@ -2160,6 +2142,18 @@ give it a unique name to identify and accept it.</source>
|
||||
<source>Always ask before performing Auto-Type</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Auto-Type delay</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source> ms</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Start only a single instance of KeePassXC</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsWidgetSecurity</name>
|
||||
@@ -2199,6 +2193,14 @@ give it a unique name to identify and accept it.</source>
|
||||
<source>Lock databases when session is locked or lid is closed</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Privacy</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use Google as fallback for downloading website icons</source>
|
||||
<translation type="unfinished"/>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SetupTotpDialog</name>
|
||||
@@ -2251,7 +2253,7 @@ give it a unique name to identify and accept it.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Copy</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Kopiera</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Expires in</source>
|
||||
@@ -2281,11 +2283,11 @@ give it a unique name to identify and accept it.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Create new database</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Skapa ny databas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open existing database</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Öppna befintlig databas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import from KeePass 1</source>
|
||||
@@ -2293,7 +2295,7 @@ give it a unique name to identify and accept it.</source>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import from CSV</source>
|
||||
<translation type="unfinished"/>
|
||||
<translation>Importera från CSV</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Recent databases</source>
|
||||
|
||||
2399
share/translations/keepassx_tr.ts
Normal file
2399
share/translations/keepassx_tr.ts
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,17 +1,64 @@
|
||||
#!/bin/sh
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# 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/>.
|
||||
#
|
||||
|
||||
BASEDIR=$(dirname $0)
|
||||
BASEDIR="$(dirname $0)"
|
||||
|
||||
cd $BASEDIR/../..
|
||||
PUSH=true
|
||||
PULL=true
|
||||
UPDATE=true
|
||||
|
||||
echo Updating source file
|
||||
lupdate-qt5 -no-ui-lines -disable-heuristic similartext -locations none -no-obsolete src -ts share/translations/keepassx_en.ts
|
||||
lupdate-qt5 -no-ui-lines -disable-heuristic similartext -locations none -pluralonly src -ts share/translations/keepassx_en_plurals.ts
|
||||
if [ "$1" == "push" ]; then
|
||||
PULL=false
|
||||
elif [ "$1" == "pull" ]; then
|
||||
PUSH=false
|
||||
UPDATE=false
|
||||
elif [ "$1" == "update" ]; then
|
||||
PUSH=false
|
||||
PULL=false
|
||||
elif [ "$1" != "" ]; then
|
||||
echo "Unknown command '${1}'"
|
||||
echo "Usage: $(basename $0) [update|pull|push]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo
|
||||
echo Pushing English translation file to Transifex
|
||||
tx push -s
|
||||
cd "${BASEDIR}/../.."
|
||||
|
||||
echo
|
||||
echo Pulling translations from Transifex
|
||||
tx pull -af --minimum-perc=40
|
||||
if $UPDATE; then
|
||||
echo "Updating source files..."
|
||||
|
||||
LUPDATE=lupdate-qt5
|
||||
command -v $LUPDATE > /dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
LUPDATE=lupdate
|
||||
fi
|
||||
$LUPDATE -no-ui-lines -disable-heuristic similartext -locations none -no-obsolete src -ts share/translations/keepassx_en.ts
|
||||
$LUPDATE -no-ui-lines -disable-heuristic similartext -locations none -pluralonly src -ts share/translations/keepassx_en_plurals.ts
|
||||
echo
|
||||
fi
|
||||
|
||||
if $PUSH; then
|
||||
echo "Pushing English source files to Transifex..."
|
||||
tx push -s
|
||||
echo
|
||||
fi
|
||||
|
||||
if $PULL; then
|
||||
echo "Pulling translations from Transifex..."
|
||||
tx pull -af --minimum-perc=40
|
||||
echo
|
||||
fi
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Name=KeePassXC
|
||||
GenericName=Community Password Manager
|
||||
GenericName[de]=Passwortverwaltung
|
||||
GenericName[es]=Gestor de contraseñas
|
||||
GenericName[fr]=Gestionnaire de mot de passe
|
||||
GenericName[ru]=менеджер паролей
|
||||
Exec=keepassxc %f
|
||||
Icon=${SNAP}/share/icons/hicolor/256x256/apps/keepassxc.png
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=Qt;Utility;
|
||||
MimeType=application/x-keepass2;
|
||||
@@ -1,17 +1,21 @@
|
||||
name: keepassxc
|
||||
version: 2.2.0
|
||||
version: 2.2.3
|
||||
grade: stable
|
||||
summary: community driven port of the windows application “Keepass Password Safe”
|
||||
summary: Community-driven port of the Windows application “KeePass Password Safe”
|
||||
description: |
|
||||
KeePassXC is an application for people with extremely high demands on secure
|
||||
personal data management. It has a light interface, is cross platform and
|
||||
is published under the terms of the GNU General Public License.
|
||||
personal data management. It has a light interface, is cross-platform and
|
||||
published under the terms of the GNU General Public License.
|
||||
confinement: strict
|
||||
|
||||
apps:
|
||||
keepassxc:
|
||||
command: desktop-launch keepassxc
|
||||
plugs: [unity7, x11, opengl, gsettings, home, network, network-bind, removable-media]
|
||||
plugs: [unity7, x11, opengl, gsettings, home, network, network-bind, removable-media, raw-usb]
|
||||
desktop: usr/share/applications/org.keepassxc.desktop
|
||||
cli:
|
||||
command: keepassxc-cli
|
||||
plugs: [gsettings, home, removable-media, raw-usb]
|
||||
|
||||
parts:
|
||||
keepassxc:
|
||||
@@ -19,6 +23,8 @@ parts:
|
||||
plugin: cmake
|
||||
configflags:
|
||||
- -DCMAKE_BUILD_TYPE=Release
|
||||
- -DCMAKE_INSTALL_PREFIX=/usr
|
||||
- -DKEEPASSXC_DIST_TYPE=Snap
|
||||
- -DWITH_TESTS=OFF
|
||||
- -DWITH_XC_AUTOTYPE=ON
|
||||
- -DWITH_XC_HTTP=ON
|
||||
@@ -35,9 +41,12 @@ parts:
|
||||
- libxtst-dev
|
||||
- libyubikey-dev
|
||||
- libykpers-1-dev
|
||||
install: |
|
||||
sed -i 's|Icon=keepassxc|Icon=${SNAP}/usr/share/icons/hicolor/256x256/apps/keepassxc.png|g' $SNAPCRAFT_PART_INSTALL/usr/share/applications/org.keepassxc.desktop
|
||||
after: [desktop-qt5]
|
||||
|
||||
# Redefine desktop-qt5 stage packages to work with Ubuntu 17.04
|
||||
desktop-qt5:
|
||||
# Redefine stage packages to work with Ubuntu 17.04
|
||||
stage-packages:
|
||||
- libxkbcommon0
|
||||
- ttf-ubuntu-font-family
|
||||
@@ -48,3 +57,14 @@ parts:
|
||||
- libgdk-pixbuf2.0-0
|
||||
- libqt5svg5 # for loading icon themes which are svg
|
||||
- locales-all
|
||||
|
||||
# Overcome limitation in snapd to support URL loading (CTRL+U)
|
||||
# client needs to install "snapd-xdg-open" on their system
|
||||
snapd-xdg-open:
|
||||
source: https://github.com/ubuntu-core/snapd-xdg-open.git
|
||||
source-depth: 1
|
||||
plugin: nil
|
||||
install: |
|
||||
install -D -t $SNAPCRAFT_PART_INSTALL/usr/bin/ data/xdg-open
|
||||
stage-packages:
|
||||
- dbus
|
||||
|
||||
@@ -59,6 +59,8 @@ set(keepassx_SOURCES
|
||||
core/Tools.cpp
|
||||
core/Translator.cpp
|
||||
core/Uuid.cpp
|
||||
core/Base32.h
|
||||
core/Base32.cpp
|
||||
cli/PasswordInput.cpp
|
||||
cli/PasswordInput.h
|
||||
crypto/Crypto.cpp
|
||||
@@ -138,8 +140,6 @@ set(keepassx_SOURCES
|
||||
streams/qtiocompressor.cpp
|
||||
streams/StoreDataStream.cpp
|
||||
streams/SymmetricCipherStream.cpp
|
||||
totp/base32.h
|
||||
totp/base32.cpp
|
||||
totp/totp.h
|
||||
totp/totp.cpp
|
||||
)
|
||||
|
||||
@@ -317,7 +317,7 @@ bool AutoType::parseActions(const QString& sequence, const Entry* entry, QList<A
|
||||
{
|
||||
QString tmpl;
|
||||
bool inTmpl = false;
|
||||
m_autoTypeDelay = 0;
|
||||
m_autoTypeDelay = config()->get("AutoTypeDelay").toInt();
|
||||
|
||||
|
||||
for (const QChar& ch : sequence) {
|
||||
|
||||
@@ -499,14 +499,12 @@ void AutoTypeExecutorMac::execChar(AutoTypeChar* action)
|
||||
{
|
||||
m_platform->sendChar(action->character, true);
|
||||
m_platform->sendChar(action->character, false);
|
||||
usleep(25 * 1000);
|
||||
}
|
||||
|
||||
void AutoTypeExecutorMac::execKey(AutoTypeKey* action)
|
||||
{
|
||||
m_platform->sendKey(action->key, true);
|
||||
m_platform->sendKey(action->key, false);
|
||||
usleep(25 * 1000);
|
||||
}
|
||||
|
||||
void AutoTypeExecutorMac::execClearField(AutoTypeClearField* action = nullptr)
|
||||
|
||||
@@ -522,14 +522,12 @@ void AutoTypeExecutorWin::execChar(AutoTypeChar* action)
|
||||
{
|
||||
m_platform->sendChar(action->character, true);
|
||||
m_platform->sendChar(action->character, false);
|
||||
::Sleep(25);
|
||||
}
|
||||
|
||||
void AutoTypeExecutorWin::execKey(AutoTypeKey* action)
|
||||
{
|
||||
m_platform->sendKey(action->key, true);
|
||||
m_platform->sendKey(action->key, false);
|
||||
::Sleep(25);
|
||||
}
|
||||
|
||||
void AutoTypeExecutorWin::execClearField(AutoTypeClearField* action = nullptr)
|
||||
|
||||
@@ -641,21 +641,13 @@ int AutoTypePlatformX11::AddKeysym(KeySym keysym)
|
||||
* If input focus is specified explicitly, select the window
|
||||
* before send event to the window.
|
||||
*/
|
||||
void AutoTypePlatformX11::SendEvent(XKeyEvent* event, int event_type)
|
||||
void AutoTypePlatformX11::SendKeyEvent(unsigned keycode, bool press)
|
||||
{
|
||||
XSync(event->display, False);
|
||||
XSync(m_dpy, False);
|
||||
int (*oldHandler) (Display*, XErrorEvent*) = XSetErrorHandler(MyErrorHandler);
|
||||
|
||||
event->type = event_type;
|
||||
Bool press;
|
||||
if (event->type == KeyPress) {
|
||||
press = True;
|
||||
}
|
||||
else {
|
||||
press = False;
|
||||
}
|
||||
XTestFakeKeyEvent(event->display, event->keycode, press, 0);
|
||||
XFlush(event->display);
|
||||
XTestFakeKeyEvent(m_dpy, keycode, press, 0);
|
||||
XFlush(m_dpy);
|
||||
|
||||
XSetErrorHandler(oldHandler);
|
||||
}
|
||||
@@ -664,17 +656,12 @@ void AutoTypePlatformX11::SendEvent(XKeyEvent* event, int event_type)
|
||||
* Send a modifier press/release event for all modifiers
|
||||
* which are set in the mask variable.
|
||||
*/
|
||||
void AutoTypePlatformX11::SendModifier(XKeyEvent *event, unsigned int mask, int event_type)
|
||||
void AutoTypePlatformX11::SendModifiers(unsigned int mask, bool press)
|
||||
{
|
||||
int mod_index;
|
||||
for (mod_index = ShiftMapIndex; mod_index <= Mod5MapIndex; mod_index ++) {
|
||||
if (mask & (1 << mod_index)) {
|
||||
event->keycode = m_modifier_keycode[mod_index];
|
||||
SendEvent(event, event_type);
|
||||
if (event_type == KeyPress)
|
||||
event->state |= (1 << mod_index);
|
||||
else
|
||||
event->state &= (1 << mod_index);
|
||||
SendKeyEvent(m_modifier_keycode[mod_index], press);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -729,43 +716,15 @@ bool AutoTypePlatformX11::keysymModifiers(KeySym keysym, int keycode, unsigned i
|
||||
* window to simulate keyboard. If modifiers (shift, control, etc)
|
||||
* are set ON, many events will be sent.
|
||||
*/
|
||||
void AutoTypePlatformX11::SendKeyPressedEvent(KeySym keysym)
|
||||
void AutoTypePlatformX11::SendKey(KeySym keysym, unsigned int modifiers)
|
||||
{
|
||||
SendKey(keysym,true);
|
||||
SendKey(keysym,false);
|
||||
}
|
||||
|
||||
void AutoTypePlatformX11::SendKey(KeySym keysym, bool isKeyDown)
|
||||
{
|
||||
Window cur_focus;
|
||||
int revert_to;
|
||||
XKeyEvent event;
|
||||
int keycode;
|
||||
|
||||
if (keysym == NoSymbol) {
|
||||
qWarning("No such key: keysym=0x%lX", keysym);
|
||||
return;
|
||||
}
|
||||
|
||||
XGetInputFocus(m_dpy, &cur_focus, &revert_to);
|
||||
|
||||
event.display = m_dpy;
|
||||
event.window = cur_focus;
|
||||
event.root = m_rootWindow;
|
||||
event.subwindow = None;
|
||||
event.time = CurrentTime;
|
||||
event.x = 1;
|
||||
event.y = 1;
|
||||
event.x_root = 1;
|
||||
event.y_root = 1;
|
||||
event.same_screen = True;
|
||||
|
||||
Window root, child;
|
||||
int root_x, root_y, x, y;
|
||||
unsigned int wanted_mask = 0;
|
||||
unsigned int original_mask;
|
||||
|
||||
XQueryPointer(m_dpy, event.root, &root, &child, &root_x, &root_y, &x, &y, &original_mask);
|
||||
int keycode;
|
||||
unsigned int wanted_mask;
|
||||
|
||||
/* determine keycode and mask for the given keysym */
|
||||
keycode = GetKeycode(keysym, &wanted_mask);
|
||||
@@ -773,8 +732,14 @@ void AutoTypePlatformX11::SendKey(KeySym keysym, bool isKeyDown)
|
||||
qWarning("Unable to get valid keycode for key: keysym=0x%lX", keysym);
|
||||
return;
|
||||
}
|
||||
wanted_mask |= modifiers;
|
||||
|
||||
event.state = original_mask;
|
||||
Window root, child;
|
||||
int root_x, root_y, x, y;
|
||||
unsigned int original_mask;
|
||||
|
||||
XSync(m_dpy, False);
|
||||
XQueryPointer(m_dpy, m_rootWindow, &root, &child, &root_x, &root_y, &x, &y, &original_mask);
|
||||
|
||||
// modifiers that need to be pressed but aren't
|
||||
unsigned int press_mask = wanted_mask & ~original_mask;
|
||||
@@ -785,47 +750,52 @@ void AutoTypePlatformX11::SendKey(KeySym keysym, bool isKeyDown)
|
||||
// modifiers we need to release before sending the keycode
|
||||
unsigned int release_mask = 0;
|
||||
|
||||
// check every release_check_mask individually if it affects the keysym we would generate
|
||||
// if it doesn't we probably don't need to release it
|
||||
for (int mod_index = ShiftMapIndex; mod_index <= Mod5MapIndex; mod_index ++) {
|
||||
if (release_check_mask & (1 << mod_index)) {
|
||||
unsigned int mods_rtrn;
|
||||
KeySym keysym_rtrn;
|
||||
XkbTranslateKeyCode(m_xkb, keycode, wanted_mask | (1 << mod_index), &mods_rtrn, &keysym_rtrn);
|
||||
if (!modifiers) {
|
||||
// check every release_check_mask individually if it affects the keysym we would generate
|
||||
// if it doesn't we probably don't need to release it
|
||||
for (int mod_index = ShiftMapIndex; mod_index <= Mod5MapIndex; mod_index ++) {
|
||||
if (release_check_mask & (1 << mod_index)) {
|
||||
unsigned int mods_rtrn;
|
||||
KeySym keysym_rtrn;
|
||||
XkbTranslateKeyCode(m_xkb, keycode, wanted_mask | (1 << mod_index), &mods_rtrn, &keysym_rtrn);
|
||||
|
||||
if (keysym_rtrn != keysym) {
|
||||
release_mask |= (1 << mod_index);
|
||||
if (keysym_rtrn != keysym) {
|
||||
release_mask |= (1 << mod_index);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// finally check if the combination of pressed modifiers that we chose to ignore affects the keysym
|
||||
unsigned int mods_rtrn;
|
||||
KeySym keysym_rtrn;
|
||||
XkbTranslateKeyCode(m_xkb, keycode, wanted_mask | (release_check_mask & ~release_mask), &mods_rtrn, &keysym_rtrn);
|
||||
if (keysym_rtrn != keysym) {
|
||||
// oh well, release all the modifiers we don't want
|
||||
// finally check if the combination of pressed modifiers that we chose to ignore affects the keysym
|
||||
unsigned int mods_rtrn;
|
||||
KeySym keysym_rtrn;
|
||||
XkbTranslateKeyCode(m_xkb, keycode, wanted_mask | (release_check_mask & ~release_mask), &mods_rtrn, &keysym_rtrn);
|
||||
if (keysym_rtrn != keysym) {
|
||||
// oh well, release all the modifiers we don't want
|
||||
release_mask = release_check_mask;
|
||||
}
|
||||
} else {
|
||||
release_mask = release_check_mask;
|
||||
}
|
||||
|
||||
/* release all modifiers */
|
||||
SendModifier(&event, release_mask, KeyRelease);
|
||||
|
||||
SendModifier(&event, press_mask, KeyPress);
|
||||
|
||||
/* press and release key */
|
||||
event.keycode = keycode;
|
||||
if (isKeyDown) {
|
||||
SendEvent(&event, KeyPress);
|
||||
} else {
|
||||
SendEvent(&event, KeyRelease);
|
||||
/* set modifiers mask */
|
||||
if ((release_mask | press_mask) & LockMask) {
|
||||
SendModifiers(LockMask, true);
|
||||
SendModifiers(LockMask, false);
|
||||
}
|
||||
SendModifiers(release_mask & ~LockMask, false);
|
||||
SendModifiers(press_mask & ~LockMask, true);
|
||||
|
||||
/* release the modifiers */
|
||||
SendModifier(&event, press_mask, KeyRelease);
|
||||
/* press and release release key */
|
||||
SendKeyEvent(keycode, true);
|
||||
SendKeyEvent(keycode, false);
|
||||
|
||||
/* restore the old keyboard mask */
|
||||
SendModifier(&event, release_mask, KeyPress);
|
||||
/* restore previous modifiers mask */
|
||||
SendModifiers(press_mask & ~LockMask, false);
|
||||
SendModifiers(release_mask & ~LockMask, true);
|
||||
if ((release_mask | press_mask) & LockMask) {
|
||||
SendModifiers(LockMask, true);
|
||||
SendModifiers(LockMask, false);
|
||||
}
|
||||
}
|
||||
|
||||
int AutoTypePlatformX11::MyErrorHandler(Display* my_dpy, XErrorEvent* event)
|
||||
@@ -848,14 +818,12 @@ AutoTypeExecutorX11::AutoTypeExecutorX11(AutoTypePlatformX11* platform)
|
||||
|
||||
void AutoTypeExecutorX11::execChar(AutoTypeChar* action)
|
||||
{
|
||||
m_platform->SendKeyPressedEvent(m_platform->charToKeySym(action->character));
|
||||
Tools::wait(25);
|
||||
m_platform->SendKey(m_platform->charToKeySym(action->character));
|
||||
}
|
||||
|
||||
void AutoTypeExecutorX11::execKey(AutoTypeKey* action)
|
||||
{
|
||||
m_platform->SendKeyPressedEvent(m_platform->keyToKeySym(action->key));
|
||||
Tools::wait(25);
|
||||
m_platform->SendKey(m_platform->keyToKeySym(action->key));
|
||||
}
|
||||
|
||||
void AutoTypeExecutorX11::execClearField(AutoTypeClearField* action = nullptr)
|
||||
@@ -866,19 +834,13 @@ void AutoTypeExecutorX11::execClearField(AutoTypeClearField* action = nullptr)
|
||||
ts.tv_sec = 0;
|
||||
ts.tv_nsec = 25 * 1000 * 1000;
|
||||
|
||||
m_platform->SendKey(m_platform->keyToKeySym(Qt::Key_Control), true);
|
||||
m_platform->SendKeyPressedEvent(m_platform->keyToKeySym(Qt::Key_Home));
|
||||
m_platform->SendKey(m_platform->keyToKeySym(Qt::Key_Control), false);
|
||||
m_platform->SendKey(m_platform->keyToKeySym(Qt::Key_Home), static_cast<unsigned int>(ControlMask));
|
||||
nanosleep(&ts, nullptr);
|
||||
|
||||
m_platform->SendKey(m_platform->keyToKeySym(Qt::Key_Control), true);
|
||||
m_platform->SendKey(m_platform->keyToKeySym(Qt::Key_Shift), true);
|
||||
m_platform->SendKeyPressedEvent(m_platform->keyToKeySym(Qt::Key_End));
|
||||
m_platform->SendKey(m_platform->keyToKeySym(Qt::Key_Shift), false);
|
||||
m_platform->SendKey(m_platform->keyToKeySym(Qt::Key_Control), false);
|
||||
m_platform->SendKey(m_platform->keyToKeySym(Qt::Key_End), static_cast<unsigned int>(ControlMask | ShiftMask));
|
||||
nanosleep(&ts, nullptr);
|
||||
|
||||
m_platform->SendKeyPressedEvent(m_platform->keyToKeySym(Qt::Key_Backspace));
|
||||
m_platform->SendKey(m_platform->keyToKeySym(Qt::Key_Backspace));
|
||||
nanosleep(&ts, nullptr);
|
||||
}
|
||||
|
||||
|
||||
@@ -58,8 +58,7 @@ public:
|
||||
KeySym charToKeySym(const QChar& ch);
|
||||
KeySym keyToKeySym(Qt::Key key);
|
||||
|
||||
void SendKeyPressedEvent(KeySym keysym);
|
||||
void SendKey(KeySym keysym, bool isKeyDown);
|
||||
void SendKey(KeySym keysym, unsigned int modifiers = 0);
|
||||
|
||||
signals:
|
||||
void globalShortcutTriggered();
|
||||
@@ -80,8 +79,8 @@ private:
|
||||
bool isRemapKeycodeValid();
|
||||
int AddKeysym(KeySym keysym);
|
||||
void AddModifier(KeySym keysym);
|
||||
void SendEvent(XKeyEvent* event, int event_type);
|
||||
void SendModifier(XKeyEvent *event, unsigned int mask, int event_type);
|
||||
void SendKeyEvent(unsigned keycode, bool press);
|
||||
void SendModifiers(unsigned int mask, bool press);
|
||||
int GetKeycode(KeySym keysym, unsigned int *mask);
|
||||
bool keysymModifiers(KeySym keysym, int keycode, unsigned int *mask);
|
||||
|
||||
|
||||
@@ -16,6 +16,11 @@
|
||||
#cmakedefine WITH_XC_AUTOTYPE
|
||||
#cmakedefine WITH_XC_YUBIKEY
|
||||
|
||||
#cmakedefine KEEPASSXC_DIST
|
||||
#cmakedefine KEEPASSXC_DIST_TYPE "@KEEPASSXC_DIST_TYPE@"
|
||||
#cmakedefine KEEPASSXC_DIST_SNAP
|
||||
#cmakedefine KEEPASSXC_DIST_APPIMAGE
|
||||
|
||||
#cmakedefine HAVE_PR_SET_DUMPABLE 1
|
||||
#cmakedefine HAVE_RLIMIT_CORE 1
|
||||
#cmakedefine HAVE_PT_DENY_ATTACH 1
|
||||
|
||||
290
src/core/Base32.cpp
Normal file
290
src/core/Base32.cpp
Normal file
@@ -0,0 +1,290 @@
|
||||
/*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
/* Conforms to RFC 4648. For details, see: https://tools.ietf.org/html/rfc4648
|
||||
* Use the functions Base32::addPadding/1, Base32::removePadding/1 or
|
||||
* Base32::sanitizeInput/1 to fix input or output for a particular
|
||||
* applications (e.g. to use with Google Authenticator).
|
||||
*/
|
||||
|
||||
#include "Base32.h"
|
||||
|
||||
constexpr quint64 MASK_40BIT = quint64(0xF8) << 32;
|
||||
constexpr quint64 MASK_35BIT = quint64(0x7C0000000);
|
||||
constexpr quint64 MASK_25BIT = quint64(0x1F00000);
|
||||
constexpr quint64 MASK_20BIT = quint64(0xF8000);
|
||||
constexpr quint64 MASK_10BIT = quint64(0x3E0);
|
||||
|
||||
constexpr char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
|
||||
constexpr quint8 ALPH_POS_2 = 26;
|
||||
|
||||
constexpr quint8 ASCII_2 = static_cast<quint8>('2');
|
||||
constexpr quint8 ASCII_7 = static_cast<quint8>('7');
|
||||
constexpr quint8 ASCII_A = static_cast<quint8>('A');
|
||||
constexpr quint8 ASCII_Z = static_cast<quint8>('Z');
|
||||
constexpr quint8 ASCII_a = static_cast<quint8>('a');
|
||||
constexpr quint8 ASCII_z = static_cast<quint8>('z');
|
||||
constexpr quint8 ASCII_EQ = static_cast<quint8>('=');
|
||||
|
||||
QVariant Base32::decode(const QByteArray& encodedData)
|
||||
{
|
||||
if (encodedData.size() <= 0) {
|
||||
return QVariant::fromValue(QByteArray(""));
|
||||
}
|
||||
|
||||
if (encodedData.size() % 8 != 0) {
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
int nPads = 0;
|
||||
for (int i = -1; i > -7; --i) {
|
||||
if ('=' == encodedData[encodedData.size() + i])
|
||||
++nPads;
|
||||
}
|
||||
|
||||
int specialOffset;
|
||||
int nSpecialBytes;
|
||||
|
||||
switch (nPads) { // in {0, 1, 3, 4, 6}
|
||||
case 1:
|
||||
nSpecialBytes = 4;
|
||||
specialOffset = 3;
|
||||
break;
|
||||
case 3:
|
||||
nSpecialBytes = 3;
|
||||
specialOffset = 1;
|
||||
break;
|
||||
case 4:
|
||||
nSpecialBytes = 2;
|
||||
specialOffset = 4;
|
||||
break;
|
||||
case 6:
|
||||
nSpecialBytes = 1;
|
||||
specialOffset = 2;
|
||||
break;
|
||||
default:
|
||||
nSpecialBytes = 0;
|
||||
specialOffset = 0;
|
||||
}
|
||||
|
||||
Q_ASSERT(encodedData.size() > 0);
|
||||
const int nQuanta = encodedData.size() / 8;
|
||||
const int nBytes = nSpecialBytes > 0 ? (nQuanta - 1) * 5 + nSpecialBytes : nQuanta * 5;
|
||||
|
||||
QByteArray data(nBytes, Qt::Uninitialized);
|
||||
|
||||
int i = 0;
|
||||
int o = 0;
|
||||
|
||||
while (i < encodedData.size()) {
|
||||
quint64 quantum = 0;
|
||||
int nQuantumBytes = 5;
|
||||
|
||||
for (int n = 0; n < 8; ++n) {
|
||||
quint8 ch = static_cast<quint8>(encodedData[i++]);
|
||||
if ((ASCII_A <= ch && ch <= ASCII_Z) || (ASCII_a <= ch && ch <= ASCII_z)) {
|
||||
ch -= ASCII_A;
|
||||
if (ch >= ALPH_POS_2)
|
||||
ch -= ASCII_a - ASCII_A;
|
||||
} else {
|
||||
if (ASCII_2 <= ch && ch <= ASCII_7) {
|
||||
ch -= ASCII_2;
|
||||
ch += ALPH_POS_2;
|
||||
} else {
|
||||
if (ASCII_EQ == ch) {
|
||||
if (i == encodedData.size()) {
|
||||
// finished with special quantum
|
||||
quantum >>= specialOffset;
|
||||
nQuantumBytes = nSpecialBytes;
|
||||
}
|
||||
continue;
|
||||
} else {
|
||||
// illegal character
|
||||
return QVariant();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
quantum <<= 5;
|
||||
quantum |= ch;
|
||||
}
|
||||
|
||||
const int offset = (nQuantumBytes - 1) * 8;
|
||||
quint64 mask = quint64(0xFF) << offset;
|
||||
for (int n = offset; n >= 0 && o < nBytes; n -= 8) {
|
||||
data[o++] = static_cast<char>((quantum & mask) >> n);
|
||||
mask >>= 8;
|
||||
}
|
||||
}
|
||||
|
||||
Q_ASSERT(encodedData.size() == i);
|
||||
Q_ASSERT(nBytes == o);
|
||||
|
||||
return QVariant::fromValue(data);
|
||||
}
|
||||
|
||||
QByteArray Base32::encode(const QByteArray& data)
|
||||
{
|
||||
if (data.size() < 1) {
|
||||
return QByteArray();
|
||||
}
|
||||
|
||||
const int nBits = data.size() * 8;
|
||||
const int rBits = nBits % 40; // in {0, 8, 16, 24, 32}
|
||||
const int nQuanta = nBits / 40 + (rBits > 0 ? 1 : 0);
|
||||
const int nBytes = nQuanta * 8;
|
||||
QByteArray encodedData(nQuanta * 8, Qt::Uninitialized);
|
||||
|
||||
int i = 0;
|
||||
int o = 0;
|
||||
int n;
|
||||
quint64 mask;
|
||||
quint64 quantum;
|
||||
|
||||
// 40-bits of input per input group
|
||||
while (i + 5 <= data.size()) {
|
||||
quantum = 0;
|
||||
for (n = 32; n >= 0; n -= 8) {
|
||||
quantum |= (static_cast<quint64>(data[i++]) << n);
|
||||
}
|
||||
|
||||
mask = MASK_40BIT;
|
||||
int index;
|
||||
for (n = 35; n >= 0; n -= 5) {
|
||||
index = (quantum & mask) >> n;
|
||||
encodedData[o++] = alphabet[index];
|
||||
mask >>= 5;
|
||||
}
|
||||
}
|
||||
|
||||
// < 40-bits of input at final input group
|
||||
if (i < data.size()) {
|
||||
Q_ASSERT(rBits > 0);
|
||||
quantum = 0;
|
||||
for (n = rBits - 8; n >= 0; n -= 8)
|
||||
quantum |= static_cast<quint64>(data[i++]) << n;
|
||||
|
||||
switch (rBits) {
|
||||
case 8: // expand to 10 bits
|
||||
quantum <<= 2;
|
||||
mask = MASK_10BIT;
|
||||
n = 5;
|
||||
break;
|
||||
case 16: // expand to 20 bits
|
||||
quantum <<= 4;
|
||||
mask = MASK_20BIT;
|
||||
n = 15;
|
||||
break;
|
||||
case 24: // expand to 25 bits
|
||||
quantum <<= 1;
|
||||
mask = MASK_25BIT;
|
||||
n = 20;
|
||||
break;
|
||||
default: // expand to 35 bits
|
||||
Q_ASSERT(rBits == 32);
|
||||
quantum <<= 3;
|
||||
mask = MASK_35BIT;
|
||||
n = 30;
|
||||
}
|
||||
|
||||
while (n >= 0) {
|
||||
int index = (quantum & mask) >> n;
|
||||
encodedData[o++] = alphabet[index];
|
||||
mask >>= 5;
|
||||
n -= 5;
|
||||
}
|
||||
|
||||
// add pad characters
|
||||
while (o < encodedData.size()) {
|
||||
encodedData[o++] = '=';
|
||||
}
|
||||
}
|
||||
|
||||
Q_ASSERT(data.size() == i);
|
||||
Q_ASSERT(nBytes == o);
|
||||
return encodedData;
|
||||
}
|
||||
|
||||
QByteArray Base32::addPadding(const QByteArray& encodedData)
|
||||
{
|
||||
if (encodedData.size() <= 0 || encodedData.size() % 8 == 0) {
|
||||
return encodedData;
|
||||
}
|
||||
|
||||
const int rBytes = encodedData.size() % 8;
|
||||
// rBytes must be a member of {2, 4, 5, 7}
|
||||
if (1 == rBytes || 3 == rBytes || 6 == rBytes) {
|
||||
return encodedData;
|
||||
}
|
||||
|
||||
QByteArray newEncodedData(encodedData);
|
||||
for (int nPads = 8 - rBytes; nPads > 0; --nPads) {
|
||||
newEncodedData.append('=');
|
||||
}
|
||||
|
||||
return newEncodedData;
|
||||
}
|
||||
|
||||
QByteArray Base32::removePadding(const QByteArray& encodedData)
|
||||
{
|
||||
if (encodedData.size() <= 0 || encodedData.size() % 8 != 0) {
|
||||
return encodedData; // return same bad input
|
||||
}
|
||||
|
||||
int nPads = 0;
|
||||
for (int i = -1; i > -7; --i) {
|
||||
if ('=' == encodedData[encodedData.size() + i]) {
|
||||
++nPads;
|
||||
}
|
||||
}
|
||||
|
||||
QByteArray newEncodedData(encodedData);
|
||||
newEncodedData.remove(encodedData.size() - nPads, nPads);
|
||||
newEncodedData.resize(encodedData.size() - nPads);
|
||||
|
||||
return newEncodedData;
|
||||
}
|
||||
|
||||
QByteArray Base32::sanitizeInput(const QByteArray& encodedData)
|
||||
{
|
||||
if (encodedData.size() <= 0) {
|
||||
return encodedData;
|
||||
}
|
||||
|
||||
QByteArray newEncodedData(encodedData.size(), Qt::Uninitialized);
|
||||
int i = 0;
|
||||
for (auto ch : encodedData) {
|
||||
switch (ch) {
|
||||
case '0':
|
||||
newEncodedData[i++] = 'O';
|
||||
break;
|
||||
case '1':
|
||||
newEncodedData[i++] = 'L';
|
||||
break;
|
||||
case '8':
|
||||
newEncodedData[i++] = 'B';
|
||||
break;
|
||||
default:
|
||||
if (('A' <= ch && ch <= 'Z') || ('a' <= ch && ch <= 'z') || ('2' <= ch && ch <= '7')) {
|
||||
newEncodedData[i++] = ch;
|
||||
}
|
||||
}
|
||||
}
|
||||
newEncodedData.resize(i);
|
||||
|
||||
return addPadding(newEncodedData);
|
||||
}
|
||||
42
src/core/Base32.h
Normal file
42
src/core/Base32.h
Normal file
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
/* Conforms to RFC 4648. For details, see: https://tools.ietf.org/html/rfc4648
|
||||
* Use the functions Base32::addPadding/1, Base32::removePadding/1 or
|
||||
* Base32::sanitizeInput/1 to fix input or output for a particular
|
||||
* applications (e.g. to use with Google Authenticator).
|
||||
*/
|
||||
|
||||
#ifndef BASE32_H
|
||||
#define BASE32_H
|
||||
|
||||
#include <QByteArray>
|
||||
#include <QVariant>
|
||||
#include <QtCore/qglobal.h>
|
||||
|
||||
class Base32
|
||||
{
|
||||
public:
|
||||
Base32() = default;
|
||||
Q_REQUIRED_RESULT static QVariant decode(const QByteArray&);
|
||||
Q_REQUIRED_RESULT static QByteArray encode(const QByteArray&);
|
||||
Q_REQUIRED_RESULT static QByteArray addPadding(const QByteArray&);
|
||||
Q_REQUIRED_RESULT static QByteArray removePadding(const QByteArray&);
|
||||
Q_REQUIRED_RESULT static QByteArray sanitizeInput(const QByteArray&);
|
||||
};
|
||||
|
||||
#endif // BASE32_H
|
||||
@@ -107,6 +107,7 @@ void Config::init(const QString& fileName)
|
||||
{
|
||||
m_settings.reset(new QSettings(fileName, QSettings::IniFormat));
|
||||
|
||||
m_defaults.insert("SingleInstance", true);
|
||||
m_defaults.insert("RememberLastDatabases", true);
|
||||
m_defaults.insert("RememberLastKeyFiles", true);
|
||||
m_defaults.insert("OpenPreviousDatabasesOnStartup", true);
|
||||
@@ -118,8 +119,9 @@ void Config::init(const QString& fileName)
|
||||
m_defaults.insert("MinimizeOnCopy", false);
|
||||
m_defaults.insert("UseGroupIconOnEntryCreation", false);
|
||||
m_defaults.insert("AutoTypeEntryTitleMatch", true);
|
||||
m_defaults.insert("AutoTypeDelay", 25);
|
||||
m_defaults.insert("UseGroupIconOnEntryCreation", true);
|
||||
m_defaults.insert("IgnoreGroupExpansion", false);
|
||||
m_defaults.insert("IgnoreGroupExpansion", true);
|
||||
m_defaults.insert("security/clearclipboard", true);
|
||||
m_defaults.insert("security/clearclipboardtimeout", 10);
|
||||
m_defaults.insert("security/lockdatabaseidle", false);
|
||||
@@ -129,6 +131,7 @@ void Config::init(const QString& fileName)
|
||||
m_defaults.insert("security/passwordsrepeat", false);
|
||||
m_defaults.insert("security/passwordscleartext", false);
|
||||
m_defaults.insert("security/autotypeask", true);
|
||||
m_defaults.insert("security/IconDownloadFallbackToGoogle", false);
|
||||
m_defaults.insert("GUI/Language", "system");
|
||||
m_defaults.insert("GUI/ShowTrayIcon", false);
|
||||
m_defaults.insert("GUI/MinimizeToTray", false);
|
||||
|
||||
@@ -257,6 +257,25 @@ bool Database::hasKey() const
|
||||
return m_data.hasKey;
|
||||
}
|
||||
|
||||
bool Database::transformKeyWithSeed(const QByteArray& transformSeed)
|
||||
{
|
||||
Q_ASSERT(hasKey());
|
||||
|
||||
bool ok;
|
||||
QString errorString;
|
||||
|
||||
QByteArray transformedMasterKey =
|
||||
m_data.key.transform(transformSeed, transformRounds(), &ok, &errorString);
|
||||
if (!ok) {
|
||||
return false;
|
||||
}
|
||||
|
||||
m_data.transformSeed = transformSeed;
|
||||
m_data.transformedMasterKey = transformedMasterKey;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Database::verifyKey(const CompositeKey& key) const
|
||||
{
|
||||
Q_ASSERT(hasKey());
|
||||
@@ -328,6 +347,15 @@ void Database::emptyRecycleBin()
|
||||
void Database::merge(const Database* other)
|
||||
{
|
||||
m_rootGroup->merge(other->rootGroup());
|
||||
|
||||
for (Uuid customIconId : other->metadata()->customIcons().keys()) {
|
||||
QImage customIcon = other->metadata()->customIcon(customIconId);
|
||||
if (!this->metadata()->containsCustomIcon(customIconId)) {
|
||||
qDebug("Adding custom icon %s to database.", qPrintable(customIconId.toHex()));
|
||||
this->metadata()->addCustomIcon(customIconId, customIcon);
|
||||
}
|
||||
}
|
||||
|
||||
emit modified();
|
||||
}
|
||||
|
||||
|
||||
@@ -106,6 +106,7 @@ public:
|
||||
*/
|
||||
bool setKey(const CompositeKey& key);
|
||||
bool hasKey() const;
|
||||
bool transformKeyWithSeed(const QByteArray& transformSeed);
|
||||
bool verifyKey(const CompositeKey& key) const;
|
||||
void recycleEntry(Entry* entry);
|
||||
void recycleGroup(Group* group);
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
*/
|
||||
#include "Entry.h"
|
||||
|
||||
#include "config-keepassx.h"
|
||||
|
||||
#include "core/Database.h"
|
||||
#include "core/DatabaseIcons.h"
|
||||
#include "core/Group.h"
|
||||
@@ -237,6 +239,11 @@ QString Entry::url() const
|
||||
return m_attributes->value(EntryAttributes::URLKey);
|
||||
}
|
||||
|
||||
QString Entry::webUrl() const
|
||||
{
|
||||
return resolveUrl(m_attributes->value(EntryAttributes::URLKey));
|
||||
}
|
||||
|
||||
QString Entry::username() const
|
||||
{
|
||||
return m_attributes->value(EntryAttributes::UserNameKey);
|
||||
@@ -720,6 +727,13 @@ const Database* Entry::database() const
|
||||
}
|
||||
}
|
||||
|
||||
QString Entry::maskPasswordPlaceholders(const QString &str) const
|
||||
{
|
||||
QString result = str;
|
||||
result.replace(QRegExp("(\\{PASSWORD\\})", Qt::CaseInsensitive, QRegExp::RegExp2), "******");
|
||||
return result;
|
||||
}
|
||||
|
||||
QString Entry::resolveMultiplePlaceholders(const QString& str) const
|
||||
{
|
||||
QString result = str;
|
||||
@@ -784,3 +798,34 @@ QString Entry::resolvePlaceholder(const QString& str) const
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
QString Entry::resolveUrl(const QString& url) const
|
||||
{
|
||||
QString newUrl = url;
|
||||
if (!url.isEmpty() && !url.contains("://")) {
|
||||
// URL doesn't have a protocol, add https by default
|
||||
newUrl.prepend("https://");
|
||||
}
|
||||
|
||||
if (newUrl.startsWith("cmd://")) {
|
||||
QStringList cmdList = newUrl.split(" ");
|
||||
for (int i=1; i < cmdList.size(); ++i) {
|
||||
// Don't pass arguments to the resolveUrl function (they look like URL's)
|
||||
if (!cmdList[i].startsWith("-") && !cmdList[i].startsWith("/")) {
|
||||
return resolveUrl(cmdList[i].remove(QRegExp("'|\"")));
|
||||
}
|
||||
}
|
||||
|
||||
// No URL in this command
|
||||
return QString("");
|
||||
}
|
||||
|
||||
// Validate the URL
|
||||
QUrl tempUrl = QUrl(newUrl);
|
||||
if (tempUrl.isValid() && (tempUrl.scheme() == "http" || tempUrl.scheme() == "https")) {
|
||||
return tempUrl.url();
|
||||
}
|
||||
|
||||
// No valid http URL's found
|
||||
return QString("");
|
||||
}
|
||||
|
||||
@@ -78,6 +78,7 @@ public:
|
||||
const AutoTypeAssociations* autoTypeAssociations() const;
|
||||
QString title() const;
|
||||
QString url() const;
|
||||
QString webUrl() const;
|
||||
QString username() const;
|
||||
QString password() const;
|
||||
QString notes() const;
|
||||
@@ -141,8 +142,10 @@ public:
|
||||
*/
|
||||
Entry* clone(CloneFlags flags) const;
|
||||
void copyDataFrom(const Entry* other);
|
||||
QString maskPasswordPlaceholders(const QString& str) const;
|
||||
QString resolveMultiplePlaceholders(const QString& str) const;
|
||||
QString resolvePlaceholder(const QString& str) const;
|
||||
QString resolveUrl(const QString& url) const;
|
||||
|
||||
/**
|
||||
* Call before and after set*() methods to create a history item
|
||||
|
||||
@@ -91,17 +91,29 @@ QString FilePath::pluginPath(const QString& name)
|
||||
|
||||
QIcon FilePath::applicationIcon()
|
||||
{
|
||||
#ifdef KEEPASSXC_DIST_SNAP
|
||||
return icon("apps", "keepassxc", false);
|
||||
#else
|
||||
return icon("apps", "keepassxc");
|
||||
#endif
|
||||
}
|
||||
|
||||
QIcon FilePath::trayIconLocked()
|
||||
{
|
||||
#ifdef KEEPASSXC_DIST_SNAP
|
||||
return icon("apps", "keepassxc-locked", false);
|
||||
#else
|
||||
return icon("apps", "keepassxc-locked");
|
||||
#endif
|
||||
}
|
||||
|
||||
QIcon FilePath::trayIconUnlocked()
|
||||
{
|
||||
#ifdef KEEPASSXC_DIST_SNAP
|
||||
return icon("apps", "keepassxc-unlocked", false);
|
||||
#else
|
||||
return icon("apps", "keepassxc-unlocked");
|
||||
#endif
|
||||
}
|
||||
|
||||
QIcon FilePath::icon(const QString& category, const QString& name, bool fromTheme)
|
||||
|
||||
@@ -667,7 +667,7 @@ void Group::merge(const Group* other)
|
||||
for (Entry* entry : dbEntries) {
|
||||
// entries are searched by uuid
|
||||
if (!findEntryByUuid(entry->uuid())) {
|
||||
entry->clone(Entry::CloneNoFlags)->setGroup(this);
|
||||
entry->clone(Entry::CloneIncludeHistory)->setGroup(this);
|
||||
} else {
|
||||
resolveConflict(findEntryByUuid(entry->uuid()), entry);
|
||||
}
|
||||
@@ -891,11 +891,11 @@ void Group::resolveConflict(Entry* existingEntry, Entry* otherEntry)
|
||||
case KeepBoth:
|
||||
// if one entry is newer, create a clone and add it to the group
|
||||
if (timeExisting > timeOther) {
|
||||
clonedEntry = otherEntry->clone(Entry::CloneNoFlags);
|
||||
clonedEntry = otherEntry->clone(Entry::CloneIncludeHistory);
|
||||
clonedEntry->setGroup(this);
|
||||
markOlderEntry(clonedEntry);
|
||||
} else if (timeExisting < timeOther) {
|
||||
clonedEntry = otherEntry->clone(Entry::CloneNoFlags);
|
||||
clonedEntry = otherEntry->clone(Entry::CloneIncludeHistory);
|
||||
clonedEntry->setGroup(this);
|
||||
markOlderEntry(existingEntry);
|
||||
}
|
||||
@@ -904,7 +904,8 @@ void Group::resolveConflict(Entry* existingEntry, Entry* otherEntry)
|
||||
if (timeExisting < timeOther) {
|
||||
// only if other entry is newer, replace existing one
|
||||
removeEntry(existingEntry);
|
||||
addEntry(otherEntry->clone(Entry::CloneNoFlags));
|
||||
clonedEntry = otherEntry->clone(Entry::CloneIncludeHistory);
|
||||
clonedEntry->setGroup(this);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <QtCore/QCryptographicHash>
|
||||
#include "Metadata.h"
|
||||
|
||||
#include "core/Entry.h"
|
||||
@@ -390,6 +391,9 @@ void Metadata::addCustomIcon(const Uuid& uuid, const QImage& icon)
|
||||
m_customIconCacheKeys[uuid] = QPixmapCache::Key();
|
||||
m_customIconScaledCacheKeys[uuid] = QPixmapCache::Key();
|
||||
m_customIconsOrder.append(uuid);
|
||||
// Associate image hash to uuid
|
||||
QByteArray hash = hashImage(icon);
|
||||
m_customIconsHashes[hash] = uuid;
|
||||
Q_ASSERT(m_customIcons.count() == m_customIconsOrder.count());
|
||||
emit modified();
|
||||
}
|
||||
@@ -415,6 +419,12 @@ void Metadata::removeCustomIcon(const Uuid& uuid)
|
||||
Q_ASSERT(!uuid.isNull());
|
||||
Q_ASSERT(m_customIcons.contains(uuid));
|
||||
|
||||
// Remove hash record only if this is the same uuid
|
||||
QByteArray hash = hashImage(m_customIcons[uuid]);
|
||||
if (m_customIconsHashes.contains(hash) && m_customIconsHashes[hash] == uuid) {
|
||||
m_customIconsHashes.remove(hash);
|
||||
}
|
||||
|
||||
m_customIcons.remove(uuid);
|
||||
QPixmapCache::remove(m_customIconCacheKeys.value(uuid));
|
||||
m_customIconCacheKeys.remove(uuid);
|
||||
@@ -425,6 +435,12 @@ void Metadata::removeCustomIcon(const Uuid& uuid)
|
||||
emit modified();
|
||||
}
|
||||
|
||||
Uuid Metadata::findCustomIcon(const QImage &candidate)
|
||||
{
|
||||
QByteArray hash = hashImage(candidate);
|
||||
return m_customIconsHashes.value(hash, Uuid());
|
||||
}
|
||||
|
||||
void Metadata::copyCustomIcons(const QSet<Uuid>& iconList, const Metadata* otherMetadata)
|
||||
{
|
||||
for (const Uuid& uuid : iconList) {
|
||||
@@ -436,6 +452,12 @@ void Metadata::copyCustomIcons(const QSet<Uuid>& iconList, const Metadata* other
|
||||
}
|
||||
}
|
||||
|
||||
QByteArray Metadata::hashImage(const QImage& image)
|
||||
{
|
||||
auto data = QByteArray(reinterpret_cast<const char*>(image.bits()), image.byteCount());
|
||||
return QCryptographicHash::hash(data, QCryptographicHash::Md5);
|
||||
}
|
||||
|
||||
void Metadata::setRecycleBinEnabled(bool value)
|
||||
{
|
||||
set(m_data.recycleBinEnabled, value);
|
||||
|
||||
@@ -122,6 +122,7 @@ public:
|
||||
void addCustomIconScaled(const Uuid& uuid, const QImage& icon);
|
||||
void removeCustomIcon(const Uuid& uuid);
|
||||
void copyCustomIcons(const QSet<Uuid>& iconList, const Metadata* otherMetadata);
|
||||
Uuid findCustomIcon(const QImage& candidate);
|
||||
void setRecycleBinEnabled(bool value);
|
||||
void setRecycleBin(Group* group);
|
||||
void setRecycleBinChanged(const QDateTime& value);
|
||||
@@ -154,12 +155,15 @@ private:
|
||||
template <class P, class V> bool set(P& property, const V& value);
|
||||
template <class P, class V> bool set(P& property, const V& value, QDateTime& dateTime);
|
||||
|
||||
QByteArray hashImage(const QImage& image);
|
||||
|
||||
MetadataData m_data;
|
||||
|
||||
QHash<Uuid, QImage> m_customIcons;
|
||||
mutable QHash<Uuid, QPixmapCache::Key> m_customIconCacheKeys;
|
||||
mutable QHash<Uuid, QPixmapCache::Key> m_customIconScaledCacheKeys;
|
||||
QList<Uuid> m_customIconsOrder;
|
||||
QHash<QByteArray, Uuid> m_customIconsHashes;
|
||||
|
||||
QPointer<Group> m_recycleBin;
|
||||
QDateTime m_recycleBinChanged;
|
||||
|
||||
@@ -59,11 +59,11 @@ public:
|
||||
return m_backend->process(data, ok);
|
||||
}
|
||||
|
||||
inline bool processInPlace(QByteArray& data) Q_REQUIRED_RESULT {
|
||||
Q_REQUIRED_RESULT inline bool processInPlace(QByteArray& data) {
|
||||
return m_backend->processInPlace(data);
|
||||
}
|
||||
|
||||
inline bool processInPlace(QByteArray& data, quint64 rounds) Q_REQUIRED_RESULT {
|
||||
Q_REQUIRED_RESULT inline bool processInPlace(QByteArray& data, quint64 rounds) {
|
||||
Q_ASSERT(rounds > 0);
|
||||
return m_backend->processInPlace(data, rounds);
|
||||
}
|
||||
|
||||
@@ -29,8 +29,8 @@ public:
|
||||
virtual bool setIv(const QByteArray& iv) = 0;
|
||||
|
||||
virtual QByteArray process(const QByteArray& data, bool* ok) = 0;
|
||||
virtual bool processInPlace(QByteArray& data) Q_REQUIRED_RESULT = 0;
|
||||
virtual bool processInPlace(QByteArray& data, quint64 rounds) Q_REQUIRED_RESULT = 0;
|
||||
Q_REQUIRED_RESULT virtual bool processInPlace(QByteArray& data) = 0;
|
||||
Q_REQUIRED_RESULT virtual bool processInPlace(QByteArray& data, quint64 rounds) = 0;
|
||||
|
||||
virtual bool reset() = 0;
|
||||
virtual int blockSize() const = 0;
|
||||
|
||||
@@ -86,6 +86,8 @@ bool SymmetricCipherGcrypt::init()
|
||||
|
||||
gcry_error_t error;
|
||||
|
||||
if(m_ctx != nullptr)
|
||||
gcry_cipher_close(m_ctx);
|
||||
error = gcry_cipher_open(&m_ctx, m_algo, m_mode, 0);
|
||||
if (error != 0) {
|
||||
setErrorString(error);
|
||||
@@ -148,9 +150,10 @@ QByteArray SymmetricCipherGcrypt::process(const QByteArray& data, bool* ok)
|
||||
if (error != 0) {
|
||||
setErrorString(error);
|
||||
*ok = false;
|
||||
} else {
|
||||
*ok = true;
|
||||
}
|
||||
|
||||
*ok = true;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -35,8 +35,8 @@ public:
|
||||
bool setIv(const QByteArray& iv);
|
||||
|
||||
QByteArray process(const QByteArray& data, bool* ok);
|
||||
bool processInPlace(QByteArray& data) Q_REQUIRED_RESULT;
|
||||
bool processInPlace(QByteArray& data, quint64 rounds) Q_REQUIRED_RESULT;
|
||||
Q_REQUIRED_RESULT bool processInPlace(QByteArray& data);
|
||||
Q_REQUIRED_RESULT bool processInPlace(QByteArray& data, quint64 rounds);
|
||||
|
||||
bool reset();
|
||||
int blockSize() const;
|
||||
|
||||
@@ -29,7 +29,7 @@ public:
|
||||
bool init(const QByteArray& key);
|
||||
QByteArray randomBytes(int size, bool* ok);
|
||||
QByteArray process(const QByteArray& data, bool* ok);
|
||||
bool processInPlace(QByteArray& data) Q_REQUIRED_RESULT;
|
||||
Q_REQUIRED_RESULT bool processInPlace(QByteArray& data);
|
||||
QString errorString() const;
|
||||
|
||||
private:
|
||||
|
||||
@@ -73,7 +73,7 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke
|
||||
quint32 signature2 = Endian::readUInt32(m_headerStream, KeePass2::BYTEORDER, &ok);
|
||||
if (ok && signature2 == KeePass1::SIGNATURE_2) {
|
||||
raiseError(tr("The selected file is an old KeePass 1 database (.kdb).\n\n"
|
||||
"You can import it by clicking on Database > 'Import KeePass 1 database'.\n"
|
||||
"You can import it by clicking on Database > 'Import KeePass 1 database...'.\n"
|
||||
"This is a one-way migration. You won't be able to open the imported "
|
||||
"database with the old KeePassX 0.4 version."));
|
||||
return nullptr;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Felix Geyer <debfx@fobos.de>
|
||||
* 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
|
||||
@@ -18,36 +19,29 @@
|
||||
#include "KeePass2Repair.h"
|
||||
|
||||
#include <QBuffer>
|
||||
#include <QScopedPointer>
|
||||
#include <QRegExp>
|
||||
|
||||
#include "format/KeePass2RandomStream.h"
|
||||
#include "format/KeePass2Reader.h"
|
||||
#include "format/KeePass2XmlReader.h"
|
||||
|
||||
KeePass2Repair::KeePass2Repair()
|
||||
: m_db(nullptr)
|
||||
KeePass2Repair::RepairOutcome KeePass2Repair::repairDatabase(QIODevice* device, const CompositeKey& key)
|
||||
{
|
||||
}
|
||||
|
||||
KeePass2Repair::RepairResult KeePass2Repair::repairDatabase(QIODevice* device, const CompositeKey& key)
|
||||
{
|
||||
m_db = nullptr;
|
||||
m_errorStr.clear();
|
||||
|
||||
KeePass2Reader reader;
|
||||
reader.setSaveXml(true);
|
||||
|
||||
Database* db = reader.readDatabase(device, key, true);
|
||||
QScopedPointer<Database> db(reader.readDatabase(device, key, true));
|
||||
if (!reader.hasError()) {
|
||||
delete db;
|
||||
return NothingTodo;
|
||||
return qMakePair(NothingTodo, nullptr);
|
||||
}
|
||||
|
||||
QByteArray xmlData = reader.xmlData();
|
||||
if (!db || xmlData.isEmpty()) {
|
||||
delete db;
|
||||
m_errorStr = reader.errorString();
|
||||
return UnableToOpen;
|
||||
return qMakePair(UnableToOpen, nullptr);
|
||||
}
|
||||
|
||||
bool repairAction = false;
|
||||
@@ -59,8 +53,7 @@ KeePass2Repair::RepairResult KeePass2Repair::repairDatabase(QIODevice* device, c
|
||||
&& encodingRegExp.cap(1).compare("utf8", Qt::CaseInsensitive) != 0)
|
||||
{
|
||||
// database is not utf-8 encoded, we don't support repairing that
|
||||
delete db;
|
||||
return RepairFailed;
|
||||
return qMakePair(RepairFailed, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,8 +68,7 @@ KeePass2Repair::RepairResult KeePass2Repair::repairDatabase(QIODevice* device, c
|
||||
|
||||
if (!repairAction) {
|
||||
// we were unable to find the problem
|
||||
delete db;
|
||||
return RepairFailed;
|
||||
return qMakePair(RepairFailed, nullptr);
|
||||
}
|
||||
|
||||
KeePass2RandomStream randomStream;
|
||||
@@ -84,23 +76,16 @@ KeePass2Repair::RepairResult KeePass2Repair::repairDatabase(QIODevice* device, c
|
||||
KeePass2XmlReader xmlReader;
|
||||
QBuffer buffer(&xmlData);
|
||||
buffer.open(QIODevice::ReadOnly);
|
||||
xmlReader.readDatabase(&buffer, db, &randomStream);
|
||||
xmlReader.readDatabase(&buffer, db.data(), &randomStream);
|
||||
|
||||
if (xmlReader.hasError()) {
|
||||
delete db;
|
||||
return RepairFailed;
|
||||
return qMakePair(RepairFailed, nullptr);
|
||||
}
|
||||
else {
|
||||
m_db = db;
|
||||
return RepairSuccess;
|
||||
return qMakePair(RepairSuccess, db.take());
|
||||
}
|
||||
}
|
||||
|
||||
Database* KeePass2Repair::database() const
|
||||
{
|
||||
return m_db;
|
||||
}
|
||||
|
||||
QString KeePass2Repair::errorString() const
|
||||
{
|
||||
return m_errorStr;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Felix Geyer <debfx@fobos.de>
|
||||
* 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
|
||||
@@ -20,6 +21,7 @@
|
||||
|
||||
#include <QCoreApplication>
|
||||
#include <QIODevice>
|
||||
#include <QPair>
|
||||
|
||||
#include "core/Database.h"
|
||||
#include "keys/CompositeKey.h"
|
||||
@@ -36,14 +38,12 @@ public:
|
||||
RepairSuccess,
|
||||
RepairFailed
|
||||
};
|
||||
using RepairOutcome = QPair<RepairResult, Database*>;
|
||||
|
||||
KeePass2Repair();
|
||||
RepairResult repairDatabase(QIODevice* device, const CompositeKey& key);
|
||||
Database* database() const;
|
||||
RepairOutcome repairDatabase(QIODevice* device, const CompositeKey& key);
|
||||
QString errorString() const;
|
||||
|
||||
private:
|
||||
Database* m_db;
|
||||
QString m_errorStr;
|
||||
};
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@ void KeePass2Writer::writeDatabase(QIODevice* device, Database* db)
|
||||
m_error = false;
|
||||
m_errorStr.clear();
|
||||
|
||||
QByteArray transformSeed = randomGen()->randomArray(32);
|
||||
QByteArray masterSeed = randomGen()->randomArray(32);
|
||||
QByteArray encryptionIV = randomGen()->randomArray(16);
|
||||
QByteArray protectedStreamKey = randomGen()->randomArray(32);
|
||||
@@ -52,7 +53,12 @@ void KeePass2Writer::writeDatabase(QIODevice* device, Database* db)
|
||||
QByteArray endOfHeader = "\r\n\r\n";
|
||||
|
||||
if (db->challengeMasterSeed(masterSeed) == false) {
|
||||
raiseError("Unable to issue challenge-response.");
|
||||
raiseError(tr("Unable to issue challenge-response."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!db->transformKeyWithSeed(transformSeed)) {
|
||||
raiseError(tr("Unable to calculate master key"));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
#ifndef KEEPASSX_KEEPASS2WRITER_H
|
||||
#define KEEPASSX_KEEPASS2WRITER_H
|
||||
|
||||
#include <QCoreApplication>
|
||||
|
||||
#include "format/KeePass2.h"
|
||||
#include "keys/CompositeKey.h"
|
||||
|
||||
@@ -26,6 +28,8 @@ class QIODevice;
|
||||
|
||||
class KeePass2Writer
|
||||
{
|
||||
Q_DECLARE_TR_FUNCTIONS(KeePass2Writer)
|
||||
|
||||
public:
|
||||
KeePass2Writer();
|
||||
void writeDatabase(QIODevice* device, Database* db);
|
||||
|
||||
@@ -55,10 +55,14 @@ AboutDialog::AboutDialog(QWidget* parent)
|
||||
QString debugInfo = "KeePassXC - ";
|
||||
debugInfo.append(tr("Version %1\n").arg(KEEPASSX_VERSION));
|
||||
if (!commitHash.isEmpty()) {
|
||||
debugInfo.append(tr("Revision: %1").arg(commitHash).append("\n\n"));
|
||||
debugInfo.append(tr("Revision: %1").arg(commitHash.left(7)).append("\n"));
|
||||
}
|
||||
|
||||
debugInfo.append(QString("%1\n- Qt %2\n- %3\n\n")
|
||||
#ifdef KEEPASSXC_DIST
|
||||
debugInfo.append(tr("Distribution: %1").arg(KEEPASSXC_DIST_TYPE).append("\n"));
|
||||
#endif
|
||||
|
||||
debugInfo.append("\n").append(QString("%1\n- Qt %2\n- %3\n\n")
|
||||
.arg(tr("Libraries:"))
|
||||
.arg(QString::fromLocal8Bit(qVersion()))
|
||||
.arg(Crypto::backendVersion()));
|
||||
|
||||
@@ -2,30 +2,10 @@
|
||||
<ui version="4.0">
|
||||
<class>AboutDialog</class>
|
||||
<widget class="QDialog" name="AboutDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>450</width>
|
||||
<height>450</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>450</width>
|
||||
<height>450</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>About KeePassXC</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="0,1,0">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<property name="topMargin">
|
||||
@@ -71,7 +51,7 @@
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true"><span style="font-size: 24pt"> KeePassXC v${VERSION}</span></string>
|
||||
<string notr="true"><span style="font-size: 20pt"> KeePassXC ${VERSION}</span></string>
|
||||
</property>
|
||||
<property name="margin">
|
||||
<number>0</number>
|
||||
@@ -102,7 +82,7 @@
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true"><html><head/><body><p>Website: <a href="https://keepassxc.org/"><span style="text-decoration: underline; color:#0000ff;">https://keepassxc.org</span></a></p></body></html></string>
|
||||
<string notr="true">Website: <a href="https://keepassxc.org/" style="text-decoration: underline">https://keepassxc.org</a></string>
|
||||
</property>
|
||||
<property name="openExternalLinks">
|
||||
<bool>true</bool>
|
||||
@@ -112,7 +92,7 @@
|
||||
<item>
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string><html><head/><body><p>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues"><span style="text-decoration: underline; color:#0000ff;">https://github.com</span></a></p></body></html></string>
|
||||
<string>Report bugs at: <a href="https://github.com/keepassxreboot/keepassxc/issues" style="text-decoration: underline;">https://github.com</a></string>
|
||||
</property>
|
||||
<property name="openExternalLinks">
|
||||
<bool>true</bool>
|
||||
@@ -138,13 +118,13 @@
|
||||
<item>
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><html><head/><body><p>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</p></body></html></string>
|
||||
<string>KeePassXC is distributed under the terms of the GNU General Public License (GPL) version 2 or (at your option) version 3.</string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
@@ -167,6 +147,13 @@
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
<string>Project Maintainers:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="sizePolicy">
|
||||
@@ -176,7 +163,14 @@
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><html><head><style>li {font-size: 10pt}</style></head><body><p><span style=" font-size:10pt;">Project Maintainers:</span></p><ul><li>droidmonkey</li><li>phoerious</li><li>TheZ3ro</li><li>louib</li><li>Weslly</li><li>debfx (KeePassX)</li></ul></body></html></string>
|
||||
<string notr="true"><ul>
|
||||
<li>droidmonkey</li>
|
||||
<li>phoerious</li>
|
||||
<li>TheZ3ro</li>
|
||||
<li>louib</li>
|
||||
<li>Weslly</li>
|
||||
<li>debfx (KeePassX)</li>
|
||||
</ul></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@@ -201,51 +195,90 @@
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QTextEdit" name="contributors">
|
||||
<property name="html">
|
||||
<string><html><body>
|
||||
<p style="font-size:x-large; font-weight:600;">Code:</p>
|
||||
<ul>
|
||||
<li style="font-size:10pt">debfx (KeePassX)</li>
|
||||
<li style="font-size:10pt">BlueIce (KeePassX)</li>
|
||||
<li style="font-size:10pt">droidmonkey</li>
|
||||
<li style="font-size:10pt">phoerious</li>
|
||||
<li style="font-size:10pt">TheZ3ro</li>
|
||||
<li style="font-size:10pt">louib</li>
|
||||
<li style="font-size:10pt">weslly</li>
|
||||
<li style="font-size:10pt">keithbennett (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">Typz (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">denk-mal (KeePassHTTP)</li>
|
||||
<li style="font-size:10pt">kylemanna (YubiKey)</li>
|
||||
<li style="font-size:10pt">seatedscribe (CSV Importer)</li>
|
||||
<li style="font-size:10pt">pgalves (Inline Messages)</li>
|
||||
</ul>
|
||||
<p style="font-size:x-large; font-weight:600;">Translations:</p>
|
||||
<ul>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Chinese:</span> Biggulu, ligyxy, BestSteve</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Czech:</span> pavelb, JosefVitu</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Dutch:</span> Vistaus, KnooL, apie</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Finnish:</span> MawKKe</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">French:</span> Scrat15, frgnca, gilbsgilbs, gtalbot, iannick, kyodev, logut</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">German:</span> Calyrx, DavidHamburg, antsas, codejunky, jensrutschmann, montilo, omnisome4, origin_de, pcrcoding, phoerious, rgloor, vlenzer</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Greek:</span> nplatis</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Italian:</span> TheZ3ro, FranzMari, Mte90, tosky</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Kazakh:</span> sotrud_nik</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Lithuanian:</span> Moo</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Polish:</span> konradmb, mrerexx</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Portuguese: </span>vitor895, weslly, American_Jesus, mihai.ile</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Russian:</span> vsvyatski, KekcuHa, wkill95</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Spanish:</span> EdwardNavarro, antifaz, piegope, pquin, vsvyatski</li>
|
||||
<li style="font-size:10pt"><span style="font-weight:600;">Swedish:</span> henziger</li>
|
||||
</ul>
|
||||
</body></html></string>
|
||||
<widget class="QScrollArea" name="scrollArea">
|
||||
<property name="widgetResizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<widget class="QWidget" name="scrollAreaWidgetContents">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>591</width>
|
||||
<height>760</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||
<item>
|
||||
<widget class="QLabel" name="contributors">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="cursor">
|
||||
<cursorShape>IBeamCursor</cursorShape>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true"><h2>Code:</h2>
|
||||
<ul>
|
||||
<li>debfx (KeePassX) </li>
|
||||
<li>BlueIce (KeePassX) </li>
|
||||
<li>droidmonkey </li>
|
||||
<li>phoerious </li>
|
||||
<li>TheZ3ro </li>
|
||||
<li>louib </li>
|
||||
<li >weslly </li>
|
||||
<li>keithbennett (KeePassHTTP) </li>
|
||||
<li>Typz (KeePassHTTP) </li>
|
||||
<li>denk-mal (KeePassHTTP) </li>
|
||||
<li>kylemanna (YubiKey) </li>
|
||||
<li>seatedscribe (CSV Importer) </li>
|
||||
<li>pgalves (Inline Messages) </li>
|
||||
</ul>
|
||||
|
||||
<h2>Translations:</h2>
|
||||
<ul>
|
||||
<li><b>Chinese:</b> Biggulu, ligyxy, BestSteve </li>
|
||||
<li><b>Czech:</b> pavelb, JosefVitu </li>
|
||||
<li><b>Dutch:</b> Vistaus, KnooL, apie </li>
|
||||
<li><b>Finnish:</b> MawKKe </li>
|
||||
<li><b>French:</b> Scrat15, frgnca, gilbsgilbs, gtalbot, iannick, kyodev, logut </li>
|
||||
<li><b>German:</b> Calyrx, DavidHamburg, antsas, codejunky, jensrutschmann, montilo, omnisome4, origin_de, pcrcoding, phoerious, rgloor, vlenzer </li>
|
||||
<li><b>Greek:</b> nplatis </li>
|
||||
<li><b>Italian:</b> TheZ3ro, FranzMari, Mte90, tosky </li>
|
||||
<li><b>Kazakh:</b> sotrud_nik </li>
|
||||
<li><b>Lithuanian:</b> Moo </li>
|
||||
<li><b>Polish:</b> konradmb, mrerexx </li>
|
||||
<li><b>Portuguese: </b>vitor895, weslly, American_Jesus, mihai.ile </li>
|
||||
<li><b>Russian:</b> vsvyatski, KekcuHa, wkill95 </li>
|
||||
<li><b>Spanish:</b> EdwardNavarro, antifaz, piegope, pquin, vsvyatski </li>
|
||||
<li><b>Swedish:</b> henziger </li>
|
||||
</ul></string>
|
||||
</property>
|
||||
<property name="textFormat">
|
||||
<enum>Qt::RichText</enum>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::TextBrowserInteraction</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string><html><head/><body><p align="center"><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors"><span style=" font-size:10pt; text-decoration: underline; color:#0000ff;">See Contributions on GitHub</span></a></p></body></html></string>
|
||||
<string><a href="https://github.com/keepassxreboot/keepassxc/graphs/contributors">See Contributions on GitHub</a></string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
<property name="openExternalLinks">
|
||||
<bool>true</bool>
|
||||
@@ -268,21 +301,21 @@
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><html><head/><body><p>Include the following information whenever you report a bug:</p></body></html></string>
|
||||
<string>Include the following information whenever you report a bug:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPlainTextEdit" name="debugInfo">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="plainText">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::TextBrowserInteraction</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
#include "Application.h"
|
||||
#include "MainWindow.h"
|
||||
#include "core/Config.h"
|
||||
|
||||
#include <QAbstractNativeEventFilter>
|
||||
#include <QFileOpenEvent>
|
||||
@@ -80,8 +81,8 @@ Application::Application(int& argc, char** argv)
|
||||
#ifdef Q_OS_UNIX
|
||||
, m_unixSignalNotifier(nullptr)
|
||||
#endif
|
||||
, alreadyRunning(false)
|
||||
, lock(nullptr)
|
||||
, m_alreadyRunning(false)
|
||||
, m_lockFile(nullptr)
|
||||
{
|
||||
#if defined(Q_OS_UNIX) && !defined(Q_OS_OSX)
|
||||
installNativeEventFilter(new XcbEventFilter());
|
||||
@@ -98,50 +99,72 @@ Application::Application(int& argc, char** argv)
|
||||
}
|
||||
QString identifier = "keepassxc";
|
||||
if (!userName.isEmpty()) {
|
||||
identifier.append("-");
|
||||
identifier.append(userName);
|
||||
identifier += "-" + userName;
|
||||
}
|
||||
#ifdef QT_DEBUG
|
||||
// In DEBUG mode don't interfere with Release instances
|
||||
identifier += "-DEBUG";
|
||||
#endif
|
||||
QString socketName = identifier + ".socket";
|
||||
QString lockName = identifier + ".lock";
|
||||
|
||||
// According to documentation we should use RuntimeLocation on *nixes, but even Qt doesn't respect
|
||||
// this and creates sockets in TempLocation, so let's be consistent.
|
||||
lock = new QLockFile(QStandardPaths::writableLocation(QStandardPaths::TempLocation) + "/" + lockName);
|
||||
lock->setStaleLockTime(0);
|
||||
lock->tryLock();
|
||||
switch (lock->error()) {
|
||||
m_lockFile = new QLockFile(QStandardPaths::writableLocation(QStandardPaths::TempLocation) + "/" + lockName);
|
||||
m_lockFile->setStaleLockTime(0);
|
||||
m_lockFile->tryLock();
|
||||
|
||||
switch (m_lockFile->error()) {
|
||||
case QLockFile::NoError:
|
||||
server.setSocketOptions(QLocalServer::UserAccessOption);
|
||||
server.listen(socketName);
|
||||
connect(&server, SIGNAL(newConnection()), this, SIGNAL(anotherInstanceStarted()));
|
||||
// No existing lock was found, start listener
|
||||
m_lockServer.setSocketOptions(QLocalServer::UserAccessOption);
|
||||
m_lockServer.listen(socketName);
|
||||
connect(&m_lockServer, SIGNAL(newConnection()), this, SIGNAL(anotherInstanceStarted()));
|
||||
break;
|
||||
case QLockFile::LockFailedError: {
|
||||
alreadyRunning = true;
|
||||
// notify the other instance
|
||||
// try several times, in case the other instance is still starting up
|
||||
QLocalSocket client;
|
||||
for (int i = 0; i < 3; i++) {
|
||||
client.connectToServer(socketName);
|
||||
if (client.waitForConnected(150)) {
|
||||
client.abort();
|
||||
break;
|
||||
if (config()->get("SingleInstance").toBool()) {
|
||||
// Attempt to connect to the existing instance
|
||||
QLocalSocket client;
|
||||
for (int i = 0; i < 3; i++) {
|
||||
client.connectToServer(socketName);
|
||||
if (client.waitForConnected(150)) {
|
||||
// Connection succeeded, this will raise the existing window if minimized
|
||||
client.abort();
|
||||
m_alreadyRunning = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!m_alreadyRunning) {
|
||||
// If we get here then the original instance is likely dead
|
||||
qWarning() << QCoreApplication::translate("Main",
|
||||
"Existing single-instance lock file is invalid. Launching new instance.")
|
||||
.toUtf8().constData();
|
||||
|
||||
// forceably reset the lock file
|
||||
m_lockFile->removeStaleLockFile();
|
||||
m_lockFile->tryLock();
|
||||
// start the listen server
|
||||
m_lockServer.setSocketOptions(QLocalServer::UserAccessOption);
|
||||
m_lockServer.listen(socketName);
|
||||
connect(&m_lockServer, SIGNAL(newConnection()), this, SIGNAL(anotherInstanceStarted()));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
qWarning() << QCoreApplication::translate("Main",
|
||||
"The lock file could not be created. Single-instance mode disabled.")
|
||||
.toUtf8().constData();
|
||||
"The lock file could not be created. Single-instance mode disabled.")
|
||||
.toUtf8().constData();
|
||||
}
|
||||
}
|
||||
|
||||
Application::~Application()
|
||||
{
|
||||
server.close();
|
||||
if (lock) {
|
||||
lock->unlock();
|
||||
delete lock;
|
||||
m_lockServer.close();
|
||||
if (m_lockFile) {
|
||||
m_lockFile->unlock();
|
||||
delete m_lockFile;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -232,6 +255,10 @@ void Application::quitBySignal()
|
||||
|
||||
bool Application::isAlreadyRunning() const
|
||||
{
|
||||
return alreadyRunning;
|
||||
#ifdef QT_DEBUG
|
||||
// In DEBUG mode we can run unlimited instances
|
||||
return false;
|
||||
#endif
|
||||
return config()->get("SingleInstance").toBool() && m_alreadyRunning;
|
||||
}
|
||||
|
||||
|
||||
@@ -60,9 +60,9 @@ private:
|
||||
static void handleUnixSignal(int sig);
|
||||
static int unixSignalSocket[2];
|
||||
#endif
|
||||
bool alreadyRunning;
|
||||
QLockFile* lock;
|
||||
QLocalServer server;
|
||||
bool m_alreadyRunning;
|
||||
QLockFile* m_lockFile;
|
||||
QLocalServer m_lockServer;
|
||||
};
|
||||
|
||||
#endif // KEEPASSX_APPLICATION_H
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<item>
|
||||
<widget class="QCheckBox" name="titleClone">
|
||||
<property name="text">
|
||||
<string>Append ' - Copy' to title</string>
|
||||
<string>Append ' - Clone' to title</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
|
||||
@@ -70,9 +70,6 @@ DatabaseOpenWidget::DatabaseOpenWidget(QWidget* parent)
|
||||
|
||||
connect(m_ui->buttonRedetectYubikey, SIGNAL(clicked()), SLOT(pollYubikey()));
|
||||
connect(m_ui->comboChallengeResponse, SIGNAL(activated(int)), SLOT(activateChallengeResponse()));
|
||||
|
||||
connect(YubiKey::instance(), SIGNAL(detected(int,bool)), SLOT(yubikeyDetected(int,bool)), Qt::QueuedConnection);
|
||||
connect(YubiKey::instance(), SIGNAL(notFound()), SLOT(noYubikeyFound()), Qt::QueuedConnection);
|
||||
#else
|
||||
m_ui->checkChallengeResponse->setVisible(false);
|
||||
m_ui->buttonRedetectYubikey->setVisible(false);
|
||||
@@ -98,7 +95,27 @@ void DatabaseOpenWidget::showEvent(QShowEvent* event)
|
||||
m_ui->editPassword->setFocus();
|
||||
|
||||
#ifdef WITH_XC_YUBIKEY
|
||||
pollYubikey();
|
||||
// showEvent() may be called twice, so make sure we are only polling once
|
||||
if (!m_yubiKeyBeingPolled) {
|
||||
connect(YubiKey::instance(), SIGNAL(detected(int, bool)), SLOT(yubikeyDetected(int, bool)),
|
||||
Qt::QueuedConnection);
|
||||
connect(YubiKey::instance(), SIGNAL(detectComplete()), SLOT(yubikeyDetectComplete()), Qt::QueuedConnection);
|
||||
connect(YubiKey::instance(), SIGNAL(notFound()), SLOT(noYubikeyFound()), Qt::QueuedConnection);
|
||||
|
||||
pollYubikey();
|
||||
m_yubiKeyBeingPolled = true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void DatabaseOpenWidget::hideEvent(QHideEvent* event)
|
||||
{
|
||||
DialogyWidget::hideEvent(event);
|
||||
|
||||
#ifdef WITH_XC_YUBIKEY
|
||||
// Don't listen to any Yubikey events if we are hidden
|
||||
disconnect(YubiKey::instance(), 0, this, 0);
|
||||
m_yubiKeyBeingPolled = false;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -119,6 +136,18 @@ void DatabaseOpenWidget::load(const QString& filename)
|
||||
m_ui->editPassword->setFocus();
|
||||
}
|
||||
|
||||
void DatabaseOpenWidget::clearForms()
|
||||
{
|
||||
m_ui->editPassword->clear();
|
||||
m_ui->comboKeyFile->clear();
|
||||
m_ui->checkPassword->setChecked(false);
|
||||
m_ui->checkKeyFile->setChecked(false);
|
||||
m_ui->checkChallengeResponse->setChecked(false);
|
||||
m_ui->buttonTogglePassword->setChecked(false);
|
||||
m_db = nullptr;
|
||||
}
|
||||
|
||||
|
||||
Database* DatabaseOpenWidget::database()
|
||||
{
|
||||
return m_db;
|
||||
@@ -139,7 +168,10 @@ void DatabaseOpenWidget::enterKey(const QString& pw, const QString& keyFile)
|
||||
void DatabaseOpenWidget::openDatabase()
|
||||
{
|
||||
KeePass2Reader reader;
|
||||
CompositeKey masterKey = databaseKey();
|
||||
QSharedPointer<CompositeKey> masterKey = databaseKey();
|
||||
if (masterKey.isNull()) {
|
||||
return;
|
||||
}
|
||||
|
||||
QFile file(m_filename);
|
||||
if (!file.open(QIODevice::ReadOnly)) {
|
||||
@@ -151,7 +183,7 @@ void DatabaseOpenWidget::openDatabase()
|
||||
delete m_db;
|
||||
}
|
||||
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
|
||||
m_db = reader.readDatabase(&file, masterKey);
|
||||
m_db = reader.readDatabase(&file, *masterKey);
|
||||
QApplication::restoreOverrideCursor();
|
||||
|
||||
if (m_db) {
|
||||
@@ -159,20 +191,19 @@ void DatabaseOpenWidget::openDatabase()
|
||||
m_ui->messageWidget->animatedHide();
|
||||
}
|
||||
emit editFinished(true);
|
||||
}
|
||||
else {
|
||||
m_ui->messageWidget->showMessage(tr("Unable to open the database.")
|
||||
.append("\n").append(reader.errorString()), MessageWidget::Error);
|
||||
} else {
|
||||
m_ui->messageWidget->showMessage(tr("Unable to open the database.").append("\n").append(reader.errorString()),
|
||||
MessageWidget::Error);
|
||||
m_ui->editPassword->clear();
|
||||
}
|
||||
}
|
||||
|
||||
CompositeKey DatabaseOpenWidget::databaseKey()
|
||||
QSharedPointer<CompositeKey> DatabaseOpenWidget::databaseKey()
|
||||
{
|
||||
CompositeKey masterKey;
|
||||
auto masterKey = QSharedPointer<CompositeKey>::create();
|
||||
|
||||
if (m_ui->checkPassword->isChecked()) {
|
||||
masterKey.addKey(PasswordKey(m_ui->editPassword->text()));
|
||||
masterKey->addKey(PasswordKey(m_ui->editPassword->text()));
|
||||
}
|
||||
|
||||
QHash<QString, QVariant> lastKeyFiles = config()->get("LastKeyFiles").toHash();
|
||||
@@ -183,11 +214,11 @@ CompositeKey DatabaseOpenWidget::databaseKey()
|
||||
QString keyFilename = m_ui->comboKeyFile->currentText();
|
||||
QString errorMsg;
|
||||
if (!key.load(keyFilename, &errorMsg)) {
|
||||
m_ui->messageWidget->showMessage(tr("Can't open key file").append(":\n")
|
||||
.append(errorMsg), MessageWidget::Error);
|
||||
return CompositeKey();
|
||||
m_ui->messageWidget->showMessage(tr("Can't open key file").append(":\n").append(errorMsg),
|
||||
MessageWidget::Error);
|
||||
return QSharedPointer<CompositeKey>();
|
||||
}
|
||||
masterKey.addKey(key);
|
||||
masterKey->addKey(key);
|
||||
lastKeyFiles[m_filename] = keyFilename;
|
||||
} else {
|
||||
lastKeyFiles.remove(m_filename);
|
||||
@@ -214,9 +245,9 @@ CompositeKey DatabaseOpenWidget::databaseKey()
|
||||
|
||||
// read blocking mode from LSB and slot index number from second LSB
|
||||
bool blocking = comboPayload & 1;
|
||||
int slot = comboPayload >> 1;
|
||||
auto key = QSharedPointer<YkChallengeResponseKey>(new YkChallengeResponseKey(slot, blocking));
|
||||
masterKey.addChallengeResponseKey(key);
|
||||
int slot = comboPayload >> 1;
|
||||
auto key = QSharedPointer<YkChallengeResponseKey>(new YkChallengeResponseKey(slot, blocking));
|
||||
masterKey->addChallengeResponseKey(key);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -271,10 +302,6 @@ void DatabaseOpenWidget::yubikeyDetected(int slot, bool blocking)
|
||||
YkChallengeResponseKey yk(slot, blocking);
|
||||
// add detected YubiKey to combo box and encode blocking mode in LSB, slot number in second LSB
|
||||
m_ui->comboChallengeResponse->addItem(yk.getName(), QVariant((slot << 1) | blocking));
|
||||
m_ui->comboChallengeResponse->setEnabled(true);
|
||||
m_ui->checkChallengeResponse->setEnabled(true);
|
||||
m_ui->buttonRedetectYubikey->setEnabled(true);
|
||||
m_ui->yubikeyProgress->setVisible(false);
|
||||
|
||||
if (config()->get("RememberLastKeyFiles").toBool()) {
|
||||
QHash<QString, QVariant> lastChallengeResponse = config()->get("LastChallengeResponse").toHash();
|
||||
@@ -284,8 +311,18 @@ void DatabaseOpenWidget::yubikeyDetected(int slot, bool blocking)
|
||||
}
|
||||
}
|
||||
|
||||
void DatabaseOpenWidget::yubikeyDetectComplete()
|
||||
{
|
||||
m_ui->comboChallengeResponse->setEnabled(true);
|
||||
m_ui->checkChallengeResponse->setEnabled(true);
|
||||
m_ui->buttonRedetectYubikey->setEnabled(true);
|
||||
m_ui->yubikeyProgress->setVisible(false);
|
||||
m_yubiKeyBeingPolled = false;
|
||||
}
|
||||
|
||||
void DatabaseOpenWidget::noYubikeyFound()
|
||||
{
|
||||
m_ui->buttonRedetectYubikey->setEnabled(true);
|
||||
m_ui->yubikeyProgress->setVisible(false);
|
||||
m_yubiKeyBeingPolled = false;
|
||||
}
|
||||
|
||||
@@ -39,6 +39,7 @@ public:
|
||||
explicit DatabaseOpenWidget(QWidget* parent = nullptr);
|
||||
~DatabaseOpenWidget();
|
||||
void load(const QString& filename);
|
||||
void clearForms();
|
||||
void enterKey(const QString& pw, const QString& keyFile);
|
||||
Database* database();
|
||||
|
||||
@@ -50,7 +51,8 @@ signals:
|
||||
|
||||
protected:
|
||||
void showEvent(QShowEvent* event) override;
|
||||
CompositeKey databaseKey();
|
||||
void hideEvent(QHideEvent* event) override;
|
||||
QSharedPointer<CompositeKey> databaseKey();
|
||||
|
||||
protected slots:
|
||||
virtual void openDatabase();
|
||||
@@ -62,6 +64,7 @@ private slots:
|
||||
void activateChallengeResponse();
|
||||
void browseKeyFile();
|
||||
void yubikeyDetected(int slot, bool blocking);
|
||||
void yubikeyDetectComplete();
|
||||
void noYubikeyFound();
|
||||
|
||||
protected:
|
||||
@@ -70,6 +73,7 @@ protected:
|
||||
QString m_filename;
|
||||
|
||||
private:
|
||||
bool m_yubiKeyBeingPolled = false;
|
||||
Q_DISABLE_COPY(DatabaseOpenWidget)
|
||||
};
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Felix Geyer <debfx@fobos.de>
|
||||
* 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
|
||||
@@ -69,7 +70,8 @@ void DatabaseRepairWidget::openDatabase()
|
||||
delete m_db;
|
||||
}
|
||||
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
|
||||
KeePass2Repair::RepairResult repairResult = repair.repairDatabase(&file, masterKey);
|
||||
auto repairOutcome = repair.repairDatabase(&file, masterKey);
|
||||
KeePass2Repair::RepairResult repairResult = repairOutcome.first;
|
||||
QApplication::restoreOverrideCursor();
|
||||
|
||||
switch (repairResult) {
|
||||
@@ -83,7 +85,7 @@ void DatabaseRepairWidget::openDatabase()
|
||||
emit editFinished(false);
|
||||
return;
|
||||
case KeePass2Repair::RepairSuccess:
|
||||
m_db = repair.database();
|
||||
m_db = repairOutcome.second;
|
||||
MessageBox::warning(this, tr("Success"), tr("The database has been successfully repaired\nYou can now save it."));
|
||||
emit editFinished(true);
|
||||
return;
|
||||
|
||||
@@ -129,7 +129,12 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw,
|
||||
while (i.hasNext()) {
|
||||
i.next();
|
||||
if (i.value().canonicalFilePath == canonicalFilePath) {
|
||||
setCurrentIndex(databaseIndex(i.key()));
|
||||
if (!i.value().dbWidget->dbHasKey() && !(pw.isNull() && keyFile.isEmpty())) {
|
||||
// If the database is locked and a pw or keyfile is provided, unlock it
|
||||
i.value().dbWidget->switchToOpenDatabase(i.value().filePath, pw, keyFile);
|
||||
} else {
|
||||
setCurrentIndex(databaseIndex(i.key()));
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -181,6 +186,7 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw,
|
||||
lockFile->tryLock();
|
||||
}
|
||||
} else {
|
||||
delete lockFile;
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -203,7 +209,7 @@ void DatabaseTabWidget::openDatabase(const QString& fileName, const QString& pw,
|
||||
|
||||
updateLastDatabases(dbStruct.filePath);
|
||||
|
||||
if (!pw.isNull() || !keyFile.isEmpty()) {
|
||||
if (!(pw.isNull() && keyFile.isEmpty())) {
|
||||
dbStruct.dbWidget->switchToOpenDatabase(dbStruct.filePath, pw, keyFile);
|
||||
}
|
||||
else {
|
||||
@@ -292,8 +298,7 @@ bool DatabaseTabWidget::closeDatabase(Database* db)
|
||||
if (!saveDatabase(db)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else if (dbStruct.dbWidget->currentMode() != DatabaseWidget::LockedMode) {
|
||||
QMessageBox::StandardButton result =
|
||||
MessageBox::question(
|
||||
this, tr("Save changes?"),
|
||||
@@ -301,10 +306,9 @@ bool DatabaseTabWidget::closeDatabase(Database* db)
|
||||
QMessageBox::Yes | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Yes);
|
||||
if (result == QMessageBox::Yes) {
|
||||
if (!saveDatabase(db)) {
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (result == QMessageBox::Cancel) {
|
||||
} else if (result == QMessageBox::Cancel) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -349,8 +353,13 @@ bool DatabaseTabWidget::saveDatabase(Database* db)
|
||||
{
|
||||
DatabaseManagerStruct& dbStruct = m_dbList[db];
|
||||
|
||||
if (dbStruct.saveToFilename) {
|
||||
if (dbStruct.dbWidget->currentMode() == DatabaseWidget::LockedMode) {
|
||||
// Never allow saving a locked database; it causes corruption
|
||||
// We return true since a save is not required
|
||||
return true;
|
||||
}
|
||||
|
||||
if (dbStruct.saveToFilename) {
|
||||
dbStruct.dbWidget->blockAutoReload(true);
|
||||
QString errorMessage = db->saveToFile(dbStruct.canonicalFilePath);
|
||||
dbStruct.dbWidget->blockAutoReload(false);
|
||||
@@ -363,11 +372,12 @@ bool DatabaseTabWidget::saveDatabase(Database* db)
|
||||
emit messageDismissTab();
|
||||
return true;
|
||||
} else {
|
||||
dbStruct.modified = true;
|
||||
updateTabName(db);
|
||||
emit messageTab(tr("Writing the database failed.").append("\n").append(errorMessage),
|
||||
MessageWidget::Error);
|
||||
return false;
|
||||
}
|
||||
|
||||
} else {
|
||||
return saveDatabaseAs(db);
|
||||
}
|
||||
|
||||
@@ -813,6 +813,7 @@ void DatabaseWidget::mergeDatabase(bool accepted)
|
||||
m_db->merge(srcDb);
|
||||
}
|
||||
|
||||
m_databaseOpenMergeWidget->clearForms();
|
||||
setCurrentWidget(m_mainWidget);
|
||||
emit databaseMerged(m_db);
|
||||
}
|
||||
@@ -918,6 +919,7 @@ void DatabaseWidget::switchToImportCsv(const QString& fileName)
|
||||
|
||||
void DatabaseWidget::switchToOpenMergeDatabase(const QString& fileName)
|
||||
{
|
||||
m_databaseOpenMergeWidget->clearForms();
|
||||
m_databaseOpenMergeWidget->load(fileName);
|
||||
setCurrentWidget(m_databaseOpenMergeWidget);
|
||||
}
|
||||
@@ -1123,7 +1125,7 @@ void DatabaseWidget::onWatchedFileChanged()
|
||||
|
||||
void DatabaseWidget::reloadDatabaseFile()
|
||||
{
|
||||
if (m_db == nullptr)
|
||||
if (m_db == nullptr || currentMode() == DatabaseWidget::LockedMode)
|
||||
return;
|
||||
|
||||
if (! config()->get("AutoReloadOnChange").toBool()) {
|
||||
|
||||
@@ -36,6 +36,7 @@ EditWidget::EditWidget(QWidget* parent)
|
||||
headerLabelFont.setBold(true);
|
||||
headerLabelFont.setPointSize(headerLabelFont.pointSize() + 2);
|
||||
headlineLabel()->setFont(headerLabelFont);
|
||||
headlineLabel()->setTextFormat(Qt::PlainText);
|
||||
|
||||
connect(m_ui->categoryList, SIGNAL(categoryChanged(int)),
|
||||
m_ui->stackedWidget, SLOT(setCurrentIndex(int)));
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <QMessageBox>
|
||||
#include <QFileDialog>
|
||||
|
||||
#include "core/Config.h"
|
||||
#include "core/Group.h"
|
||||
#include "core/Metadata.h"
|
||||
#include "core/Tools.h"
|
||||
@@ -67,7 +68,7 @@ EditWidgetIcons::EditWidgetIcons(QWidget* parent)
|
||||
this, SLOT(updateWidgetsDefaultIcons(bool)));
|
||||
connect(m_ui->customIconsRadio, SIGNAL(toggled(bool)),
|
||||
this, SLOT(updateWidgetsCustomIcons(bool)));
|
||||
connect(m_ui->addButton, SIGNAL(clicked()), SLOT(addCustomIcon()));
|
||||
connect(m_ui->addButton, SIGNAL(clicked()), SLOT(addCustomIconFromFile()));
|
||||
connect(m_ui->deleteButton, SIGNAL(clicked()), SLOT(removeCustomIcon()));
|
||||
connect(m_ui->faviconButton, SIGNAL(clicked()), SLOT(downloadFavicon()));
|
||||
|
||||
@@ -184,15 +185,7 @@ void EditWidgetIcons::fetchFavicon(const QUrl& url)
|
||||
image.loadFromData(response->collectedData());
|
||||
|
||||
if (!image.isNull()) {
|
||||
//Set the image
|
||||
Uuid uuid = Uuid::random();
|
||||
m_database->metadata()->addCustomIcon(uuid, image.scaled(16, 16));
|
||||
m_customIconModel->setIcons(m_database->metadata()->customIconsScaledPixmaps(),
|
||||
m_database->metadata()->customIconsOrder());
|
||||
QModelIndex index = m_customIconModel->indexFromUuid(uuid);
|
||||
m_ui->customIconsView->setCurrentIndex(index);
|
||||
m_ui->customIconsRadio->setChecked(true);
|
||||
|
||||
addCustomIcon(image);
|
||||
resetFaviconDownload();
|
||||
} else {
|
||||
fetchFaviconFromGoogle(url.host());
|
||||
@@ -222,8 +215,18 @@ void EditWidgetIcons::fetchFavicon(const QUrl& url)
|
||||
}
|
||||
|
||||
m_httpClient->setConnectingTimeOut(5000, [this]() {
|
||||
resetFaviconDownload();
|
||||
MessageBox::warning(this, tr("Error"), tr("Unable to fetch favicon."));
|
||||
QUrl tempurl = QUrl(m_url);
|
||||
if (tempurl.scheme() == "http") {
|
||||
resetFaviconDownload();
|
||||
emit messageEditEntry(tr("Unable to fetch favicon.") + "\n" +
|
||||
tr("Hint: You can enable Google as a fallback under Tools>Settings>Security"),
|
||||
MessageWidget::Error);
|
||||
} else {
|
||||
tempurl.setScheme("http");
|
||||
m_url = tempurl.url();
|
||||
tempurl.setPath("/favicon.ico");
|
||||
fetchFavicon(tempurl);
|
||||
}
|
||||
});
|
||||
|
||||
m_ui->faviconButton->setDisabled(true);
|
||||
@@ -231,13 +234,15 @@ void EditWidgetIcons::fetchFavicon(const QUrl& url)
|
||||
|
||||
void EditWidgetIcons::fetchFaviconFromGoogle(const QString& domain)
|
||||
{
|
||||
if (m_fallbackToGoogle) {
|
||||
if (config()->get("security/IconDownloadFallbackToGoogle", false).toBool() && m_fallbackToGoogle) {
|
||||
resetFaviconDownload();
|
||||
m_fallbackToGoogle = false;
|
||||
fetchFavicon(QUrl("http://www.google.com/s2/favicons?domain=" + domain));
|
||||
QUrl faviconUrl = QUrl("https://www.google.com/s2/favicons");
|
||||
faviconUrl.setQuery("domain=" + QUrl::toPercentEncoding(domain));
|
||||
fetchFavicon(faviconUrl);
|
||||
} else {
|
||||
resetFaviconDownload();
|
||||
MessageBox::warning(this, tr("Error"), tr("Unable to fetch favicon."));
|
||||
emit messageEditEntry(tr("Unable to fetch favicon."), MessageWidget::Error);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -258,7 +263,7 @@ void EditWidgetIcons::resetFaviconDownload(bool clearRedirect)
|
||||
}
|
||||
#endif
|
||||
|
||||
void EditWidgetIcons::addCustomIcon()
|
||||
void EditWidgetIcons::addCustomIconFromFile()
|
||||
{
|
||||
if (m_database) {
|
||||
QString filter = QString("%1 (%2);;%3 (*)").arg(tr("Images"),
|
||||
@@ -267,22 +272,42 @@ void EditWidgetIcons::addCustomIcon()
|
||||
QString filename = QFileDialog::getOpenFileName(
|
||||
this, tr("Select Image"), "", filter);
|
||||
if (!filename.isEmpty()) {
|
||||
QImage image(filename);
|
||||
if (!image.isNull()) {
|
||||
Uuid uuid = Uuid::random();
|
||||
m_database->metadata()->addCustomIcon(uuid, image.scaled(16, 16));
|
||||
m_customIconModel->setIcons(m_database->metadata()->customIconsScaledPixmaps(),
|
||||
m_database->metadata()->customIconsOrder());
|
||||
QModelIndex index = m_customIconModel->indexFromUuid(uuid);
|
||||
m_ui->customIconsView->setCurrentIndex(index);
|
||||
}
|
||||
else {
|
||||
auto icon = QImage(filename);
|
||||
if (!icon.isNull()) {
|
||||
addCustomIcon(QImage(filename));
|
||||
} else {
|
||||
emit messageEditEntry(tr("Can't read icon"), MessageWidget::Error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void EditWidgetIcons::addCustomIcon(const QImage &icon)
|
||||
{
|
||||
if (m_database) {
|
||||
Uuid uuid = m_database->metadata()->findCustomIcon(icon);
|
||||
if (uuid.isNull()) {
|
||||
uuid = Uuid::random();
|
||||
// Don't add an icon larger than 128x128, but retain original size if smaller
|
||||
if (icon.width() > 128 || icon.height() > 128) {
|
||||
m_database->metadata()->addCustomIcon(uuid, icon.scaled(128, 128));
|
||||
} else {
|
||||
m_database->metadata()->addCustomIcon(uuid, icon);
|
||||
}
|
||||
|
||||
m_customIconModel->setIcons(m_database->metadata()->customIconsScaledPixmaps(),
|
||||
m_database->metadata()->customIconsOrder());
|
||||
} else {
|
||||
emit messageEditEntry(tr("Custom icon already exists"), MessageWidget::Information);
|
||||
}
|
||||
|
||||
// Select the new or existing icon
|
||||
updateRadioButtonCustomIcons();
|
||||
QModelIndex index = m_customIconModel->indexFromUuid(uuid);
|
||||
m_ui->customIconsView->setCurrentIndex(index);
|
||||
}
|
||||
}
|
||||
|
||||
void EditWidgetIcons::removeCustomIcon()
|
||||
{
|
||||
if (m_database) {
|
||||
|
||||
@@ -78,7 +78,8 @@ private slots:
|
||||
void fetchFaviconFromGoogle(const QString& domain);
|
||||
void resetFaviconDownload(bool clearRedirect = true);
|
||||
#endif
|
||||
void addCustomIcon();
|
||||
void addCustomIconFromFile();
|
||||
void addCustomIcon(const QImage& icon);
|
||||
void removeCustomIcon();
|
||||
void updateWidgetsDefaultIcons(bool checked);
|
||||
void updateWidgetsCustomIcons(bool checked);
|
||||
|
||||
@@ -240,8 +240,10 @@ MainWindow::MainWindow()
|
||||
SLOT(databaseStatusChanged(DatabaseWidget*)));
|
||||
connect(m_ui->stackedWidget, SIGNAL(currentChanged(int)), SLOT(setMenuActionState()));
|
||||
connect(m_ui->stackedWidget, SIGNAL(currentChanged(int)), SLOT(updateWindowTitle()));
|
||||
connect(m_ui->settingsWidget, SIGNAL(editFinished(bool)), SLOT(switchToDatabases()));
|
||||
connect(m_ui->settingsWidget, SIGNAL(accepted()), SLOT(applySettingsChanges()));
|
||||
connect(m_ui->settingsWidget, SIGNAL(apply()), SLOT(applySettingsChanges()));
|
||||
connect(m_ui->settingsWidget, SIGNAL(accepted()), SLOT(switchToDatabases()));
|
||||
connect(m_ui->settingsWidget, SIGNAL(rejected()), SLOT(switchToDatabases()));
|
||||
|
||||
connect(m_ui->actionDatabaseNew, SIGNAL(triggered()), m_ui->tabWidget,
|
||||
SLOT(newDatabase()));
|
||||
@@ -550,8 +552,14 @@ void MainWindow::updateWindowTitle()
|
||||
QString customWindowTitlePart;
|
||||
int stackedWidgetIndex = m_ui->stackedWidget->currentIndex();
|
||||
int tabWidgetIndex = m_ui->tabWidget->currentIndex();
|
||||
bool isModified = m_ui->tabWidget->isModified(tabWidgetIndex);
|
||||
|
||||
if (stackedWidgetIndex == DatabaseTabScreen && tabWidgetIndex != -1) {
|
||||
customWindowTitlePart = m_ui->tabWidget->tabText(tabWidgetIndex);
|
||||
if (isModified) {
|
||||
// remove asterisk '*' from title
|
||||
customWindowTitlePart.remove(customWindowTitlePart.size() - 1, 1);
|
||||
}
|
||||
if (m_ui->tabWidget->readOnly(tabWidgetIndex)) {
|
||||
customWindowTitlePart.append(QString(" [%1]").arg(tr("read-only")));
|
||||
}
|
||||
@@ -563,7 +571,7 @@ void MainWindow::updateWindowTitle()
|
||||
if (customWindowTitlePart.isEmpty()) {
|
||||
windowTitle = BaseWindowTitle;
|
||||
} else {
|
||||
windowTitle = QString("%1 - %2").arg(customWindowTitlePart, BaseWindowTitle);
|
||||
windowTitle = QString("%1[*] - %2").arg(customWindowTitlePart, BaseWindowTitle);
|
||||
}
|
||||
|
||||
if (customWindowTitlePart.isEmpty() || stackedWidgetIndex == 1) {
|
||||
@@ -572,7 +580,7 @@ void MainWindow::updateWindowTitle()
|
||||
setWindowFilePath(m_ui->tabWidget->databasePath(tabWidgetIndex));
|
||||
}
|
||||
|
||||
setWindowModified(m_ui->tabWidget->isModified(tabWidgetIndex));
|
||||
setWindowModified(isModified);
|
||||
|
||||
setWindowTitle(windowTitle);
|
||||
}
|
||||
@@ -873,7 +881,7 @@ void MainWindow::toggleWindow()
|
||||
raise();
|
||||
activateWindow();
|
||||
|
||||
#if defined(Q_OS_LINUX) && ! defined(QT_NO_DBUS)
|
||||
#if defined(Q_OS_LINUX) && ! defined(QT_NO_DBUS) && (QT_VERSION < QT_VERSION_CHECK(5, 9, 0))
|
||||
// re-register global D-Bus menu (needed on Ubuntu with Unity)
|
||||
// see https://github.com/keepassxreboot/keepassxc/issues/271
|
||||
// and https://bugreports.qt.io/browse/QTBUG-58723
|
||||
|
||||
@@ -200,7 +200,7 @@
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuHelp">
|
||||
<property name="title">
|
||||
<string>He&lp</string>
|
||||
<string>&Help</string>
|
||||
</property>
|
||||
<addaction name="actionAbout"/>
|
||||
</widget>
|
||||
@@ -309,7 +309,7 @@
|
||||
</action>
|
||||
<action name="actionDatabaseOpen">
|
||||
<property name="text">
|
||||
<string>&Open database</string>
|
||||
<string>&Open database...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionDatabaseSave">
|
||||
@@ -391,7 +391,7 @@
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Sa&ve database as</string>
|
||||
<string>Sa&ve database as...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionChangeMasterKey">
|
||||
@@ -399,7 +399,7 @@
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Change &master key</string>
|
||||
<string>Change &master key...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionChangeDatabaseSettings">
|
||||
@@ -517,22 +517,22 @@
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Export to CSV file</string>
|
||||
<string>&Export to CSV file...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionImportKeePass1">
|
||||
<property name="text">
|
||||
<string>Import KeePass 1 database</string>
|
||||
<string>Import KeePass 1 database...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionImportCsv">
|
||||
<property name="text">
|
||||
<string>Import CSV file</string>
|
||||
<string>Import CSV file...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionRepairDatabase">
|
||||
<property name="text">
|
||||
<string>Re&pair database</string>
|
||||
<string>Re&pair database...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionEntryTotp">
|
||||
@@ -542,7 +542,7 @@
|
||||
</action>
|
||||
<action name="actionEntrySetupTotp">
|
||||
<property name="text">
|
||||
<string>Setup TOTP</string>
|
||||
<string>Set up TOTP...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionEntryCopyTotp">
|
||||
|
||||
@@ -31,9 +31,18 @@ PasswordEdit::PasswordEdit(QWidget* parent)
|
||||
{
|
||||
setEchoMode(QLineEdit::Password);
|
||||
updateStylesheet();
|
||||
|
||||
// set font to system monospace font and increase letter spacing
|
||||
|
||||
// use a monospace font for the password field
|
||||
QFont passwordFont = QFontDatabase::systemFont(QFontDatabase::FixedFont);
|
||||
#ifdef Q_OS_WIN
|
||||
// try to use Consolas on Windows, because the default Courier New has too many similar characters
|
||||
QFont consolasFont = QFontDatabase().font("Consolas", passwordFont.styleName(), passwordFont.pointSize());
|
||||
const QFont defaultFont;
|
||||
if (passwordFont != defaultFont) {
|
||||
passwordFont = consolasFont;
|
||||
}
|
||||
#endif
|
||||
|
||||
passwordFont.setLetterSpacing(QFont::PercentageSpacing, 110);
|
||||
setFont(passwordFont);
|
||||
}
|
||||
|
||||
@@ -2,32 +2,12 @@
|
||||
<ui version="4.0">
|
||||
<class>PasswordGeneratorWidget</class>
|
||||
<widget class="QWidget" name="PasswordGeneratorWidget">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>575</width>
|
||||
<height>305</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>284</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string/>
|
||||
</property>
|
||||
@@ -188,17 +168,11 @@ QProgressBar::chunk {
|
||||
<item>
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="tabPosition">
|
||||
<enum>QTabWidget::North</enum>
|
||||
</property>
|
||||
@@ -225,12 +199,6 @@ QProgressBar::chunk {
|
||||
<layout class="QHBoxLayout" name="alphabetLayout" stretch="0,0,0,0,1,0">
|
||||
<item>
|
||||
<widget class="QToolButton" name="checkBoxUpper">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="MinimumExpanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
@@ -256,12 +224,6 @@ QProgressBar::chunk {
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="checkBoxLower">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="MinimumExpanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
@@ -287,12 +249,6 @@ QProgressBar::chunk {
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="checkBoxNumbers">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="MinimumExpanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
@@ -318,12 +274,6 @@ QProgressBar::chunk {
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="checkBoxSpecialChars">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="MinimumExpanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
@@ -349,12 +299,6 @@ QProgressBar::chunk {
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="checkBoxExtASCII">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="MinimumExpanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
@@ -578,7 +522,7 @@ QProgressBar::chunk {
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="editWordSeparator">
|
||||
<property name="text">
|
||||
<string> </string>
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include "ui_SettingsWidgetGeneral.h"
|
||||
#include "ui_SettingsWidgetSecurity.h"
|
||||
|
||||
#include "config-keepassx.h"
|
||||
#include "autotype/AutoType.h"
|
||||
#include "core/Config.h"
|
||||
#include "core/Translator.h"
|
||||
@@ -68,6 +69,7 @@ SettingsWidget::SettingsWidget(QWidget* parent)
|
||||
}
|
||||
|
||||
connect(this, SIGNAL(accepted()), SLOT(saveSettings()));
|
||||
connect(this, SIGNAL(apply()), SLOT(saveSettings()));
|
||||
connect(this, SIGNAL(rejected()), SLOT(reject()));
|
||||
|
||||
connect(m_generalUi->autoSaveAfterEveryChangeCheckBox, SIGNAL(toggled(bool)),
|
||||
@@ -79,6 +81,10 @@ SettingsWidget::SettingsWidget(QWidget* parent)
|
||||
m_secUi->clearClipboardSpinBox, SLOT(setEnabled(bool)));
|
||||
connect(m_secUi->lockDatabaseIdleCheckBox, SIGNAL(toggled(bool)),
|
||||
m_secUi->lockDatabaseIdleSpinBox, SLOT(setEnabled(bool)));
|
||||
|
||||
#ifndef WITH_XC_HTTP
|
||||
m_secUi->privacy->setVisible(false);
|
||||
#endif
|
||||
}
|
||||
|
||||
SettingsWidget::~SettingsWidget()
|
||||
@@ -101,6 +107,10 @@ void SettingsWidget::loadSettings()
|
||||
tr("Access error for config file %1").arg(config()->getFileName()), MessageWidget::Error);
|
||||
}
|
||||
|
||||
#ifdef QT_DEBUG
|
||||
m_generalUi->singleInstanceCheckBox->setEnabled(false);
|
||||
#endif
|
||||
m_generalUi->singleInstanceCheckBox->setChecked(config()->get("SingleInstance").toBool());
|
||||
m_generalUi->rememberLastDatabasesCheckBox->setChecked(config()->get("RememberLastDatabases").toBool());
|
||||
m_generalUi->rememberLastKeyFilesCheckBox->setChecked(config()->get("RememberLastKeyFiles").toBool());
|
||||
m_generalUi->openPreviousDatabasesOnStartupCheckBox->setChecked(
|
||||
@@ -135,6 +145,7 @@ void SettingsWidget::loadSettings()
|
||||
if (m_globalAutoTypeKey > 0 && m_globalAutoTypeModifiers > 0) {
|
||||
m_generalUi->autoTypeShortcutWidget->setShortcut(m_globalAutoTypeKey, m_globalAutoTypeModifiers);
|
||||
}
|
||||
m_generalUi->autoTypeDelaySpinBox->setValue(config()->get("AutoTypeDelay").toInt());
|
||||
}
|
||||
|
||||
|
||||
@@ -145,6 +156,7 @@ void SettingsWidget::loadSettings()
|
||||
m_secUi->lockDatabaseIdleSpinBox->setValue(config()->get("security/lockdatabaseidlesec").toInt());
|
||||
m_secUi->lockDatabaseMinimizeCheckBox->setChecked(config()->get("security/lockdatabaseminimize").toBool());
|
||||
m_secUi->lockDatabaseOnScreenLockCheckBox->setChecked(config()->get("security/lockdatabasescreenlock").toBool());
|
||||
m_secUi->fallbackToGoogle->setChecked(config()->get("security/IconDownloadFallbackToGoogle").toBool());
|
||||
|
||||
m_secUi->passwordCleartextCheckBox->setChecked(config()->get("security/passwordscleartext").toBool());
|
||||
m_secUi->passwordRepeatCheckBox->setChecked(config()->get("security/passwordsrepeat").toBool());
|
||||
@@ -168,6 +180,7 @@ void SettingsWidget::saveSettings()
|
||||
return;
|
||||
}
|
||||
|
||||
config()->set("SingleInstance", m_generalUi->singleInstanceCheckBox->isChecked());
|
||||
config()->set("RememberLastDatabases", m_generalUi->rememberLastDatabasesCheckBox->isChecked());
|
||||
config()->set("RememberLastKeyFiles", m_generalUi->rememberLastKeyFilesCheckBox->isChecked());
|
||||
config()->set("OpenPreviousDatabasesOnStartup",
|
||||
@@ -198,6 +211,7 @@ void SettingsWidget::saveSettings()
|
||||
config()->set("GlobalAutoTypeKey", m_generalUi->autoTypeShortcutWidget->key());
|
||||
config()->set("GlobalAutoTypeModifiers",
|
||||
static_cast<int>(m_generalUi->autoTypeShortcutWidget->modifiers()));
|
||||
config()->set("AutoTypeDelay", m_generalUi->autoTypeDelaySpinBox->value());
|
||||
}
|
||||
config()->set("security/clearclipboard", m_secUi->clearClipboardCheckBox->isChecked());
|
||||
config()->set("security/clearclipboardtimeout", m_secUi->clearClipboardSpinBox->value());
|
||||
@@ -206,15 +220,23 @@ void SettingsWidget::saveSettings()
|
||||
config()->set("security/lockdatabaseidlesec", m_secUi->lockDatabaseIdleSpinBox->value());
|
||||
config()->set("security/lockdatabaseminimize", m_secUi->lockDatabaseMinimizeCheckBox->isChecked());
|
||||
config()->set("security/lockdatabasescreenlock", m_secUi->lockDatabaseOnScreenLockCheckBox->isChecked());
|
||||
config()->set("security/IconDownloadFallbackToGoogle", m_secUi->fallbackToGoogle->isChecked());
|
||||
|
||||
config()->set("security/passwordscleartext", m_secUi->passwordCleartextCheckBox->isChecked());
|
||||
config()->set("security/passwordsrepeat", m_secUi->passwordRepeatCheckBox->isChecked());
|
||||
|
||||
// Security: clear storage if related settings are disabled
|
||||
if (!config()->get("RememberLastDatabases").toBool()) {
|
||||
config()->set("LastDatabases", QVariant());
|
||||
}
|
||||
|
||||
if (!config()->get("RememberLastKeyFiles").toBool()) {
|
||||
config()->set("LastKeyFiles", QVariant());
|
||||
}
|
||||
|
||||
for (const ExtraPage& page: asConst(m_extraPages)) {
|
||||
page.saveSettings();
|
||||
}
|
||||
|
||||
emit editFinished(true);
|
||||
}
|
||||
|
||||
void SettingsWidget::reject()
|
||||
@@ -224,7 +246,6 @@ void SettingsWidget::reject()
|
||||
autoType()->registerGlobalShortcut(m_globalAutoTypeKey, m_globalAutoTypeModifiers);
|
||||
}
|
||||
|
||||
emit editFinished(false);
|
||||
}
|
||||
|
||||
void SettingsWidget::enableAutoSaveOnExit(bool checked)
|
||||
|
||||
@@ -46,9 +46,6 @@ public:
|
||||
void addSettingsPage(ISettingsPage * page);
|
||||
void loadSettings();
|
||||
|
||||
signals:
|
||||
void editFinished(bool accepted);
|
||||
|
||||
private slots:
|
||||
void saveSettings();
|
||||
void reject();
|
||||
|
||||
@@ -33,6 +33,16 @@
|
||||
<string>Basic Settings</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="singleInstanceCheckBox">
|
||||
<property name="text">
|
||||
<string>Start only a single instance of KeePassXC</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="rememberLastDatabasesCheckBox">
|
||||
<property name="text">
|
||||
@@ -318,27 +328,18 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<property name="spacing">
|
||||
<number>15</number>
|
||||
<layout class="QFormLayout" name="formLayout_2">
|
||||
<property name="topMargin">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<item alignment="Qt::AlignRight">
|
||||
<widget class="QLabel" name="autoTypeShortcutLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="autoTypeShortcutLabel_2">
|
||||
<property name="text">
|
||||
<string>Global Auto-Type shortcut</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<item row="1" column="1">
|
||||
<widget class="ShortcutWidget" name="autoTypeShortcutWidget">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
@@ -348,6 +349,35 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="autoTypeDelayLabel_2">
|
||||
<property name="text">
|
||||
<string>Auto-Type delay</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QSpinBox" name="autoTypeDelaySpinBox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="suffix">
|
||||
<string> ms</string>
|
||||
</property>
|
||||
<property name="prefix">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>999</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>25</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
|
||||
@@ -139,6 +139,22 @@
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="privacy">
|
||||
<property name="title">
|
||||
<string>Privacy</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="fallbackToGoogle">
|
||||
<property name="text">
|
||||
<string>Use Google as fallback for downloading website icons</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
|
||||
@@ -26,6 +26,7 @@ UnlockDatabaseDialog::UnlockDatabaseDialog(QWidget* parent)
|
||||
: QDialog(parent)
|
||||
, m_view(new UnlockDatabaseWidget(this))
|
||||
{
|
||||
setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
|
||||
connect(m_view, SIGNAL(editFinished(bool)), this, SLOT(complete(bool)));
|
||||
}
|
||||
|
||||
|
||||
@@ -26,14 +26,3 @@ UnlockDatabaseWidget::UnlockDatabaseWidget(QWidget* parent)
|
||||
{
|
||||
m_ui->labelHeadline->setText(tr("Unlock database"));
|
||||
}
|
||||
|
||||
void UnlockDatabaseWidget::clearForms()
|
||||
{
|
||||
m_ui->editPassword->clear();
|
||||
m_ui->comboKeyFile->clear();
|
||||
m_ui->checkPassword->setChecked(false);
|
||||
m_ui->checkKeyFile->setChecked(false);
|
||||
m_ui->checkChallengeResponse->setChecked(false);
|
||||
m_ui->buttonTogglePassword->setChecked(false);
|
||||
m_db = nullptr;
|
||||
}
|
||||
|
||||
@@ -26,7 +26,6 @@ class UnlockDatabaseWidget : public DatabaseOpenWidget
|
||||
|
||||
public:
|
||||
explicit UnlockDatabaseWidget(QWidget* parent = nullptr);
|
||||
void clearForms();
|
||||
};
|
||||
|
||||
#endif // KEEPASSX_UNLOCKDATABASEWIDGET_H
|
||||
|
||||
@@ -278,17 +278,18 @@ void EditEntryWidget::loadEntry(Entry* entry, bool create, bool history, const Q
|
||||
m_database = database;
|
||||
m_create = create;
|
||||
m_history = history;
|
||||
m_saved = false;
|
||||
|
||||
if (history) {
|
||||
setHeadline(QString("%1 > %2").arg(parentName.toHtmlEscaped(), tr("Entry history")));
|
||||
setHeadline(QString("%1 > %2").arg(parentName, tr("Entry history")));
|
||||
}
|
||||
else {
|
||||
if (create) {
|
||||
setHeadline(QString("%1 > %2").arg(parentName.toHtmlEscaped(), tr("Add entry")));
|
||||
setHeadline(QString("%1 > %2").arg(parentName, tr("Add entry")));
|
||||
}
|
||||
else {
|
||||
setHeadline(QString("%1 > %2 > %3").arg(parentName.toHtmlEscaped(),
|
||||
entry->title().toHtmlEscaped(), tr("Edit entry")));
|
||||
setHeadline(QString("%1 > %2 > %3").arg(parentName,
|
||||
entry->title(), tr("Edit entry")));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -363,7 +364,7 @@ void EditEntryWidget::setForms(const Entry* entry, bool restore)
|
||||
IconStruct iconStruct;
|
||||
iconStruct.uuid = entry->iconUuid();
|
||||
iconStruct.number = entry->iconNumber();
|
||||
m_iconsWidget->load(entry->uuid(), m_database, iconStruct, entry->url());
|
||||
m_iconsWidget->load(entry->uuid(), m_database, iconStruct, entry->webUrl());
|
||||
connect(m_mainUi->urlEdit, SIGNAL(textChanged(QString)), m_iconsWidget, SLOT(setUrl(QString)));
|
||||
|
||||
m_autoTypeUi->enableButton->setChecked(entry->autoTypeEnabled());
|
||||
@@ -429,6 +430,7 @@ void EditEntryWidget::saveEntry()
|
||||
// must stand before beginUpdate()
|
||||
// we don't want to create a new history item, if only the history has changed
|
||||
m_entry->removeHistoryItems(m_historyModel->deletedEntries());
|
||||
m_historyModel->clearDeletedEntries();
|
||||
|
||||
m_autoTypeAssoc->removeEmpty();
|
||||
|
||||
@@ -437,6 +439,7 @@ void EditEntryWidget::saveEntry()
|
||||
}
|
||||
|
||||
updateEntryData(m_entry);
|
||||
m_saved = true;
|
||||
|
||||
if (!m_create) {
|
||||
m_entry->endUpdate();
|
||||
@@ -445,6 +448,12 @@ void EditEntryWidget::saveEntry()
|
||||
|
||||
void EditEntryWidget::acceptEntry()
|
||||
{
|
||||
// Check if passwords are mismatched first to prevent saving
|
||||
if (!passwordsEqual()) {
|
||||
showMessage(tr("Different passwords supplied."), MessageWidget::Error);
|
||||
return;
|
||||
}
|
||||
|
||||
saveEntry();
|
||||
clear();
|
||||
emit editFinished(true);
|
||||
@@ -503,7 +512,7 @@ void EditEntryWidget::cancel()
|
||||
|
||||
clear();
|
||||
|
||||
emit editFinished(false);
|
||||
emit editFinished(m_saved);
|
||||
}
|
||||
|
||||
void EditEntryWidget::clear()
|
||||
@@ -912,8 +921,7 @@ void EditEntryWidget::deleteHistoryEntry()
|
||||
m_historyModel->deleteIndex(index);
|
||||
if (m_historyModel->rowCount() > 0) {
|
||||
m_historyUi->deleteAllButton->setEnabled(true);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
m_historyUi->deleteAllButton->setEnabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,6 +121,7 @@ private:
|
||||
|
||||
bool m_create;
|
||||
bool m_history;
|
||||
bool m_saved;
|
||||
const QScopedPointer<Ui::EditEntryWidgetMain> m_mainUi;
|
||||
const QScopedPointer<Ui::EditEntryWidgetAdvanced> m_advancedUi;
|
||||
const QScopedPointer<Ui::EditEntryWidgetAutoType> m_autoTypeUi;
|
||||
|
||||
@@ -2,20 +2,6 @@
|
||||
<ui version="4.0">
|
||||
<class>EditEntryWidgetMain</class>
|
||||
<widget class="QWidget" name="EditEntryWidgetMain">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>692</width>
|
||||
<height>323</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_3">
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
@@ -34,20 +20,7 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="PasswordGeneratorWidget" name="passwordGenerator" native="true">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="PasswordGeneratorWidget" name="passwordGenerator" native="true"/>
|
||||
</item>
|
||||
<item row="2" column="0" alignment="Qt::AlignRight">
|
||||
<widget class="QLabel" name="passwordLabel">
|
||||
|
||||
@@ -115,6 +115,11 @@ void EntryHistoryModel::clear()
|
||||
endResetModel();
|
||||
}
|
||||
|
||||
void EntryHistoryModel::clearDeletedEntries()
|
||||
{
|
||||
m_deletedHistoryEntries.clear();
|
||||
}
|
||||
|
||||
QList<Entry*> EntryHistoryModel::deletedEntries()
|
||||
{
|
||||
return m_deletedHistoryEntries;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user