mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2025-12-04 15:39:34 +01:00
* Hack for #5722 until a refactor of KeeShare, Merger, and EditEntryWidget can be performed. This hack should only ever be triggered on the rare occurrence of two people editing the same entry at the same time. The end result is potential data loss, but the current result is a hard crash. Unfortunately the way everything is interfaced currently doesn't afford any solution without a major refactor. * Additionally add a short delay before actually reloading a share to prevent read/write locks from preventing proper import. This delay also prevents conflicting saves between the main database and the KeeShare database. This should eventually be moved into the FileObserver itself to smooth out all merge operations once the above refactor occurs. Side note: KeeShare operates independently of DatabaseWidget causing unexpected behavior when files are updated/merged/etc. This needs to be corrected in a refactor.
90 lines
2.3 KiB
C++
90 lines
2.3 KiB
C++
/*
|
|
* Copyright (C) 2018 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/>.
|
|
*/
|
|
|
|
#ifndef KEEPASSXC_SHAREOBSERVER_H
|
|
#define KEEPASSXC_SHAREOBSERVER_H
|
|
|
|
#include <QMap>
|
|
#include <QObject>
|
|
#include <QSharedPointer>
|
|
#include <QStringList>
|
|
|
|
#include "gui/MessageWidget.h"
|
|
#include "keeshare/KeeShareSettings.h"
|
|
|
|
class FileWatcher;
|
|
class Group;
|
|
class Database;
|
|
|
|
class ShareObserver : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit ShareObserver(QSharedPointer<Database> db, QObject* parent = nullptr);
|
|
~ShareObserver();
|
|
|
|
QSharedPointer<Database> database();
|
|
|
|
struct Result
|
|
{
|
|
enum Type
|
|
{
|
|
Success,
|
|
Info,
|
|
Warning,
|
|
Error
|
|
};
|
|
|
|
QString path;
|
|
Type type;
|
|
QString message;
|
|
|
|
Result(const QString& path = QString(), Type type = Success, const QString& message = QString());
|
|
|
|
bool isValid() const;
|
|
bool isError() const;
|
|
bool isWarning() const;
|
|
bool isInfo() const;
|
|
};
|
|
|
|
signals:
|
|
void sharingMessage(QString, MessageWidget::MessageType);
|
|
|
|
private slots:
|
|
void handleDatabaseChanged();
|
|
void handleDatabaseSaved();
|
|
void handleFileUpdated(const QString& path);
|
|
|
|
private:
|
|
Result importShare(const QString& path);
|
|
QList<Result> exportShares();
|
|
|
|
void deinitialize();
|
|
void reinitialize();
|
|
void notifyAbout(const QStringList& success, const QStringList& warning, const QStringList& error);
|
|
|
|
private:
|
|
QSharedPointer<Database> m_db;
|
|
QMap<QPointer<Group>, KeeShareSettings::Reference> m_groupToReference;
|
|
QMap<QString, QPointer<Group>> m_shareToGroup;
|
|
QMap<QString, QSharedPointer<FileWatcher>> m_fileWatchers;
|
|
bool m_inFileUpdate = false;
|
|
};
|
|
|
|
#endif // KEEPASSXC_SHAREOBSERVER_H
|