mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2024-12-28 08:49:42 -05:00
Merge branch 'release/2.6.2' into develop
This commit is contained in:
commit
fb87b1c794
@ -1177,6 +1177,10 @@ bool BrowserService::checkLegacySettings(QSharedPointer<Database> db)
|
|||||||
bool legacySettingsFound = false;
|
bool legacySettingsFound = false;
|
||||||
QList<Entry*> entries = db->rootGroup()->entriesRecursive();
|
QList<Entry*> entries = db->rootGroup()->entriesRecursive();
|
||||||
for (const auto& e : entries) {
|
for (const auto& e : entries) {
|
||||||
|
if (e->isRecycled()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if ((e->attributes()->contains(KEEPASSHTTP_NAME) || e->attributes()->contains(KEEPASSXCBROWSER_NAME))
|
if ((e->attributes()->contains(KEEPASSHTTP_NAME) || e->attributes()->contains(KEEPASSXCBROWSER_NAME))
|
||||||
|| (e->title() == KEEPASSHTTP_NAME || e->title().contains(KEEPASSXCBROWSER_NAME, Qt::CaseInsensitive))) {
|
|| (e->title() == KEEPASSHTTP_NAME || e->title().contains(KEEPASSXCBROWSER_NAME, Qt::CaseInsensitive))) {
|
||||||
legacySettingsFound = true;
|
legacySettingsFound = true;
|
||||||
|
@ -37,7 +37,7 @@ namespace BrowserShared
|
|||||||
: path + serverName;
|
: path + serverName;
|
||||||
#elif defined(Q_OS_WIN)
|
#elif defined(Q_OS_WIN)
|
||||||
// Windows uses named pipes
|
// Windows uses named pipes
|
||||||
return serverName;
|
return serverName + "_" + qgetenv("USERNAME");
|
||||||
#else // Q_OS_MACOS and others
|
#else // Q_OS_MACOS and others
|
||||||
return QStandardPaths::writableLocation(QStandardPaths::TempLocation) + serverName;
|
return QStandardPaths::writableLocation(QStandardPaths::TempLocation) + serverName;
|
||||||
#endif
|
#endif
|
||||||
|
@ -58,6 +58,28 @@ namespace AsyncTask
|
|||||||
return waitForFuture<FunctionObject>(QtConcurrent::run(task));
|
return waitForFuture<FunctionObject>(QtConcurrent::run(task));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a given task then call the defined callback. Prevents event loop blocking and
|
||||||
|
* ensures the validity of the follow-on task through the context. If the context is
|
||||||
|
* deleted, the callback will not be processed preventing use after free errors.
|
||||||
|
*
|
||||||
|
* @param task std::function object to run
|
||||||
|
* @param context QObject responsible for calling this function
|
||||||
|
* @param callback std::function object to run after the task completess
|
||||||
|
*/
|
||||||
|
template <typename FunctionObject, typename FunctionObject2>
|
||||||
|
void runThenCallback(FunctionObject task, QObject* context, FunctionObject2 callback)
|
||||||
|
{
|
||||||
|
typedef QFutureWatcher<typename std::result_of<FunctionObject()>::type> FutureWatcher;
|
||||||
|
auto future = QtConcurrent::run(task);
|
||||||
|
auto watcher = new FutureWatcher(context);
|
||||||
|
QObject::connect(watcher, &QFutureWatcherBase::finished, context, [=]() {
|
||||||
|
watcher->deleteLater();
|
||||||
|
callback(future.result());
|
||||||
|
});
|
||||||
|
watcher->setFuture(future);
|
||||||
|
}
|
||||||
|
|
||||||
}; // namespace AsyncTask
|
}; // namespace AsyncTask
|
||||||
|
|
||||||
#endif // KEEPASSXC_ASYNCTASK_HPP
|
#endif // KEEPASSXC_ASYNCTASK_HPP
|
||||||
|
@ -118,13 +118,16 @@ void FileWatcher::checkFileChanged()
|
|||||||
// Prevent reentrance
|
// Prevent reentrance
|
||||||
m_ignoreFileChange = true;
|
m_ignoreFileChange = true;
|
||||||
|
|
||||||
auto checksum = AsyncTask::runAndWaitForFuture([this]() -> QByteArray { return calculateChecksum(); });
|
AsyncTask::runThenCallback([=] { return calculateChecksum(); },
|
||||||
if (checksum != m_fileChecksum) {
|
this,
|
||||||
m_fileChecksum = checksum;
|
[=](QByteArray checksum) {
|
||||||
m_fileChangeDelayTimer.start(0);
|
if (checksum != m_fileChecksum) {
|
||||||
}
|
m_fileChecksum = checksum;
|
||||||
|
m_fileChangeDelayTimer.start(0);
|
||||||
|
}
|
||||||
|
|
||||||
m_ignoreFileChange = false;
|
m_ignoreFileChange = false;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray FileWatcher::calculateChecksum()
|
QByteArray FileWatcher::calculateChecksum()
|
||||||
|
@ -21,20 +21,6 @@
|
|||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
QString modFilter(const QString& filter)
|
|
||||||
{
|
|
||||||
#ifdef Q_OS_MACOS
|
|
||||||
// Fix macOS bug that causes the file dialog to freeze when a dot is included in the filters
|
|
||||||
// See https://github.com/keepassxreboot/keepassxc/issues/3895#issuecomment-586724167
|
|
||||||
auto mod = filter;
|
|
||||||
return mod.replace("*.", "*");
|
|
||||||
#endif
|
|
||||||
return filter;
|
|
||||||
}
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
FileDialog* FileDialog::m_instance(nullptr);
|
FileDialog* FileDialog::m_instance(nullptr);
|
||||||
|
|
||||||
QString FileDialog::getOpenFileName(QWidget* parent,
|
QString FileDialog::getOpenFileName(QWidget* parent,
|
||||||
@ -51,7 +37,7 @@ QString FileDialog::getOpenFileName(QWidget* parent,
|
|||||||
} else {
|
} else {
|
||||||
const auto& workingDir = dir.isEmpty() ? config()->get(Config::LastDir).toString() : dir;
|
const auto& workingDir = dir.isEmpty() ? config()->get(Config::LastDir).toString() : dir;
|
||||||
const auto result = QDir::toNativeSeparators(
|
const auto result = QDir::toNativeSeparators(
|
||||||
QFileDialog::getOpenFileName(parent, caption, workingDir, modFilter(filter), selectedFilter, options));
|
QFileDialog::getOpenFileName(parent, caption, workingDir, filter, selectedFilter, options));
|
||||||
|
|
||||||
#ifdef Q_OS_MACOS
|
#ifdef Q_OS_MACOS
|
||||||
// on Mac OS X the focus is lost after closing the native dialog
|
// on Mac OS X the focus is lost after closing the native dialog
|
||||||
@ -77,8 +63,7 @@ QStringList FileDialog::getOpenFileNames(QWidget* parent,
|
|||||||
return results;
|
return results;
|
||||||
} else {
|
} else {
|
||||||
const auto& workingDir = dir.isEmpty() ? config()->get(Config::LastDir).toString() : dir;
|
const auto& workingDir = dir.isEmpty() ? config()->get(Config::LastDir).toString() : dir;
|
||||||
auto results =
|
auto results = QFileDialog::getOpenFileNames(parent, caption, workingDir, filter, selectedFilter, options);
|
||||||
QFileDialog::getOpenFileNames(parent, caption, workingDir, modFilter(filter), selectedFilter, options);
|
|
||||||
|
|
||||||
for (auto& path : results) {
|
for (auto& path : results) {
|
||||||
path = QDir::toNativeSeparators(path);
|
path = QDir::toNativeSeparators(path);
|
||||||
@ -111,7 +96,7 @@ QString FileDialog::getSaveFileName(QWidget* parent,
|
|||||||
} else {
|
} else {
|
||||||
const auto& workingDir = dir.isEmpty() ? config()->get(Config::LastDir).toString() : dir;
|
const auto& workingDir = dir.isEmpty() ? config()->get(Config::LastDir).toString() : dir;
|
||||||
const auto result = QDir::toNativeSeparators(
|
const auto result = QDir::toNativeSeparators(
|
||||||
QFileDialog::getSaveFileName(parent, caption, workingDir, modFilter(filter), selectedFilter, options));
|
QFileDialog::getSaveFileName(parent, caption, workingDir, filter, selectedFilter, options));
|
||||||
|
|
||||||
#ifdef Q_OS_MACOS
|
#ifdef Q_OS_MACOS
|
||||||
// on Mac OS X the focus is lost after closing the native dialog
|
// on Mac OS X the focus is lost after closing the native dialog
|
||||||
|
@ -259,8 +259,15 @@ MainWindow::MainWindow()
|
|||||||
m_ui->actionEntryAutoType->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_V);
|
m_ui->actionEntryAutoType->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_V);
|
||||||
m_ui->actionEntryOpenUrl->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_U);
|
m_ui->actionEntryOpenUrl->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_U);
|
||||||
m_ui->actionEntryCopyURL->setShortcut(Qt::CTRL + Qt::Key_U);
|
m_ui->actionEntryCopyURL->setShortcut(Qt::CTRL + Qt::Key_U);
|
||||||
m_ui->actionEntryAddToAgent->setShortcut(Qt::CTRL + Qt::Key_H);
|
|
||||||
m_ui->actionEntryRemoveFromAgent->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_H);
|
// Prevent conflicts with global Mac shortcuts (force Control on all platforms)
|
||||||
|
#ifdef Q_OS_MAC
|
||||||
|
auto modifier = Qt::META;
|
||||||
|
#else
|
||||||
|
auto modifier = Qt::CTRL;
|
||||||
|
#endif
|
||||||
|
m_ui->actionEntryAddToAgent->setShortcut(modifier + Qt::Key_H);
|
||||||
|
m_ui->actionEntryRemoveFromAgent->setShortcut(modifier + Qt::SHIFT + Qt::Key_H);
|
||||||
|
|
||||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
|
||||||
// Qt 5.10 introduced a new "feature" to hide shortcuts in context menus
|
// Qt 5.10 introduced a new "feature" to hide shortcuts in context menus
|
||||||
|
Loading…
Reference in New Issue
Block a user