From 8c5da624e511ad01bcbbd5b10678ea66bfe1cab4 Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Fri, 18 Jan 2019 21:53:02 -0500 Subject: [PATCH] KeeShare code formatting and spelling correction --- src/CMakeLists.txt | 2 +- .../DatabaseSettingsWidgetKeeShare.cpp | 4 +- src/keeshare/KeeShare.cpp | 22 +- src/keeshare/KeeShare.h | 4 +- src/keeshare/KeeShareSettings.cpp | 18 +- src/keeshare/KeeShareSettings.h | 15 +- src/keeshare/SettingsWidgetKeeShare.cpp | 274 +++++++------ src/keeshare/ShareObserver.cpp | 295 +++++++------- src/keeshare/ShareObserver.h | 7 +- .../group/EditGroupWidgetKeeShare.cpp | 384 +++++++++--------- 10 files changed, 538 insertions(+), 487 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 355748a94..854ce877f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -202,7 +202,7 @@ add_feature_info(Auto-Type WITH_XC_AUTOTYPE "Automatic password typing") add_feature_info(Networking WITH_XC_NETWORKING "Compile KeePassXC with network access code (e.g. for downloading website icons)") add_feature_info(KeePassXC-Browser WITH_XC_BROWSER "Browser integration with KeePassXC-Browser") add_feature_info(SSHAgent WITH_XC_SSHAGENT "SSH agent integration compatible with KeeAgent") -add_feature_info(KeeSharee WITH_XC_KEESHARE "Sharing integration with KeeShare") +add_feature_info(KeeShare WITH_XC_KEESHARE "Sharing integration with KeeShare") add_feature_info(KeeShare-Secure WITH_XC_KEESHARE_SECURE "Sharing integration with KeeShare with secure sources") add_feature_info(YubiKey WITH_XC_YUBIKEY "YubiKey HMAC-SHA1 challenge-response") if(APPLE) diff --git a/src/keeshare/DatabaseSettingsWidgetKeeShare.cpp b/src/keeshare/DatabaseSettingsWidgetKeeShare.cpp index 6180c184e..85315c332 100644 --- a/src/keeshare/DatabaseSettingsWidgetKeeShare.cpp +++ b/src/keeshare/DatabaseSettingsWidgetKeeShare.cpp @@ -45,8 +45,8 @@ void DatabaseSettingsWidgetKeeShare::loadSettings(QSharedPointer db) m_referencesModel.reset(new QStandardItemModel()); - m_referencesModel->setHorizontalHeaderLabels( - QStringList() << tr("Breadcrumb") << tr("Type") << tr("Path") << tr("Last Signer") << tr("Certificates")); + m_referencesModel->setHorizontalHeaderLabels(QStringList() << tr("Breadcrumb") << tr("Type") << tr("Path") + << tr("Last Signer") << tr("Certificates")); const QList groups = db->rootGroup()->groupsRecursive(true); for (const Group* group : groups) { if (!KeeShare::isShared(group)) { diff --git a/src/keeshare/KeeShare.cpp b/src/keeshare/KeeShare.cpp index ba188a974..751429558 100644 --- a/src/keeshare/KeeShare.cpp +++ b/src/keeshare/KeeShare.cpp @@ -32,11 +32,11 @@ namespace { -static const QString KeeShare_Reference("KeeShare/Reference"); -static const QString KeeShare_Own("KeeShare/Settings.own"); -static const QString KeeShare_Foreign("KeeShare/Settings.foreign"); -static const QString KeeShare_Active("KeeShare/Settings.active"); -} + static const QString KeeShare_Reference("KeeShare/Reference"); + static const QString KeeShare_Own("KeeShare/Settings.own"); + static const QString KeeShare_Foreign("KeeShare/Settings.foreign"); + static const QString KeeShare_Active("KeeShare/Settings.active"); +} // namespace KeeShare* KeeShare::m_instance = nullptr; @@ -129,13 +129,13 @@ bool KeeShare::isEnabled(const Group* group) { const auto reference = KeeShare::referenceOf(group); #if !defined(WITH_XC_KEESHARE_SECURE) - if (reference.path.endsWith(signedContainerFileType(), Qt::CaseInsensitive)){ - return false; + if (reference.path.endsWith(signedContainerFileType(), Qt::CaseInsensitive)) { + return false; } #endif #if !defined(WITH_XC_KEESHARE_INSECURE) - if (reference.path.endsWith(unsignedContainerFileType(), Qt::CaseInsensitive)){ - return false; + if (reference.path.endsWith(unsignedContainerFileType(), Qt::CaseInsensitive)) { + return false; } #endif const auto active = KeeShare::active(); @@ -198,13 +198,13 @@ void KeeShare::connectDatabase(QSharedPointer newDb, QSharedPointer SettingsWidgetKeeShare::SettingsWidgetKeeShare(QWidget* parent) - : QWidget(parent) - , m_ui(new Ui::SettingsWidgetKeeShare()) + : QWidget(parent) + , m_ui(new Ui::SettingsWidgetKeeShare()) { - m_ui->setupUi(this); + m_ui->setupUi(this); #if !defined(WITH_XC_KEESHARE_SECURE) - // Setting does not help the user of Version without signed export - m_ui->ownCertificateGroupBox->setVisible(false); + // Setting does not help the user of Version without signed export + m_ui->ownCertificateGroupBox->setVisible(false); #endif - connect(m_ui->ownCertificateSignerEdit, SIGNAL(textChanged(QString)), SLOT(setVerificationExporter(QString))); + connect(m_ui->ownCertificateSignerEdit, SIGNAL(textChanged(QString)), SLOT(setVerificationExporter(QString))); - connect(m_ui->generateOwnCerticateButton, SIGNAL(clicked(bool)), SLOT(generateCertificate())); - connect(m_ui->importOwnCertificateButton, SIGNAL(clicked(bool)), SLOT(importCertificate())); - connect(m_ui->exportOwnCertificateButton, SIGNAL(clicked(bool)), SLOT(exportCertificate())); + connect(m_ui->generateOwnCerticateButton, SIGNAL(clicked(bool)), SLOT(generateCertificate())); + connect(m_ui->importOwnCertificateButton, SIGNAL(clicked(bool)), SLOT(importCertificate())); + connect(m_ui->exportOwnCertificateButton, SIGNAL(clicked(bool)), SLOT(exportCertificate())); - connect(m_ui->trustImportedCertificateButton, SIGNAL(clicked(bool)), SLOT(trustSelectedCertificates())); - connect(m_ui->askImportedCertificateButton, SIGNAL(clicked(bool)), SLOT(askSelectedCertificates())); - connect(m_ui->untrustImportedCertificateButton, SIGNAL(clicked(bool)), SLOT(untrustSelectedCertificates())); - connect(m_ui->removeImportedCertificateButton, SIGNAL(clicked(bool)), SLOT(removeSelectedCertificates())); + connect(m_ui->trustImportedCertificateButton, SIGNAL(clicked(bool)), SLOT(trustSelectedCertificates())); + connect(m_ui->askImportedCertificateButton, SIGNAL(clicked(bool)), SLOT(askSelectedCertificates())); + connect(m_ui->untrustImportedCertificateButton, SIGNAL(clicked(bool)), SLOT(untrustSelectedCertificates())); + connect(m_ui->removeImportedCertificateButton, SIGNAL(clicked(bool)), SLOT(removeSelectedCertificates())); } SettingsWidgetKeeShare::~SettingsWidgetKeeShare() @@ -57,181 +57,189 @@ SettingsWidgetKeeShare::~SettingsWidgetKeeShare() void SettingsWidgetKeeShare::loadSettings() { - const auto active = KeeShare::active(); - m_ui->enableExportCheckBox->setChecked(active.out); - m_ui->enableImportCheckBox->setChecked(active.in); + const auto active = KeeShare::active(); + m_ui->enableExportCheckBox->setChecked(active.out); + m_ui->enableImportCheckBox->setChecked(active.in); - m_own = KeeShare::own(); - updateOwnCertificate(); + m_own = KeeShare::own(); + updateOwnCertificate(); - m_foreign = KeeShare::foreign(); - updateForeignCertificates(); + m_foreign = KeeShare::foreign(); + updateForeignCertificates(); } void SettingsWidgetKeeShare::updateForeignCertificates() { - m_importedCertificateModel.reset(new QStandardItemModel()); - m_importedCertificateModel->setHorizontalHeaderLabels(QStringList() << tr("Path") << tr("Status") + auto headers = QStringList() << tr("Path") << tr("Status"); #if defined(WITH_XC_KEESHARE_SECURE) - << tr("Signer") << tr("Fingerprint") << tr("Certificate") + headers << tr("Signer") << tr("Fingerprint") << tr("Certificate"); #endif - ); - for (const auto& scopedCertificate : m_foreign.certificates) { - const auto items = QList() - << new QStandardItem(scopedCertificate.path) - << new QStandardItem(scopedCertificate.trust == KeeShareSettings::Trust::Ask ? tr("Ask") - : (scopedCertificate.trust == KeeShareSettings::Trust::Trusted ? tr("Trusted") - : tr("Untrusted"))) + m_importedCertificateModel.reset(new QStandardItemModel()); + m_importedCertificateModel->setHorizontalHeaderLabels(headers); + + for (const auto& scopedCertificate : m_foreign.certificates) { + const auto items = QList() + << new QStandardItem(scopedCertificate.path) + << new QStandardItem(scopedCertificate.trust == KeeShareSettings::Trust::Ask + ? tr("Ask") + : (scopedCertificate.trust == KeeShareSettings::Trust::Trusted + ? tr("Trusted") + : tr("Untrusted"))) #if defined(WITH_XC_KEESHARE_SECURE) - << new QStandardItem(scopedCertificate.isKnown() ? scopedCertificate.certificate.signer : tr("Unknown")) - << new QStandardItem(scopedCertificate.certificate.fingerprint()) - << new QStandardItem(scopedCertificate.certificate.publicKey()) + << new QStandardItem(scopedCertificate.isKnown() ? scopedCertificate.certificate.signer + : tr("Unknown")) + << new QStandardItem(scopedCertificate.certificate.fingerprint()) + << new QStandardItem(scopedCertificate.certificate.publicKey()) #endif - ; - m_importedCertificateModel->appendRow(items); - } + ; + m_importedCertificateModel->appendRow(items); + } - m_ui->importedCertificateTableView->setModel(m_importedCertificateModel.data()); + m_ui->importedCertificateTableView->setModel(m_importedCertificateModel.data()); + m_ui->importedCertificateTableView->resizeColumnsToContents(); } void SettingsWidgetKeeShare::updateOwnCertificate() { - m_ui->ownCertificateSignerEdit->setText(m_own.certificate.signer); - m_ui->ownCertificatePublicKeyEdit->setText(m_own.certificate.publicKey()); - m_ui->ownCertificatePrivateKeyEdit->setText(m_own.key.privateKey()); - m_ui->ownCertificateFingerprintEdit->setText(m_own.certificate.fingerprint()); + m_ui->ownCertificateSignerEdit->setText(m_own.certificate.signer); + m_ui->ownCertificatePublicKeyEdit->setText(m_own.certificate.publicKey()); + m_ui->ownCertificatePrivateKeyEdit->setText(m_own.key.privateKey()); + m_ui->ownCertificateFingerprintEdit->setText(m_own.certificate.fingerprint()); } void SettingsWidgetKeeShare::saveSettings() { - KeeShareSettings::Active active; - active.out = m_ui->enableExportCheckBox->isChecked(); - active.in = m_ui->enableImportCheckBox->isChecked(); - // TODO HNH: This depends on the order of saving new data - a better model would be to - // store changes to the settings in a temporary object and check on the final values - // of this object (similar scheme to Entry) - this way we could validate the settings before save - KeeShare::setOwn(m_own); - KeeShare::setForeign(m_foreign); - KeeShare::setActive(active); + KeeShareSettings::Active active; + active.out = m_ui->enableExportCheckBox->isChecked(); + active.in = m_ui->enableImportCheckBox->isChecked(); + // TODO HNH: This depends on the order of saving new data - a better model would be to + // store changes to the settings in a temporary object and check on the final values + // of this object (similar scheme to Entry) - this way we could validate the settings before save + KeeShare::setOwn(m_own); + KeeShare::setForeign(m_foreign); + KeeShare::setActive(active); } void SettingsWidgetKeeShare::setVerificationExporter(const QString& signer) { - m_own.certificate.signer = signer; - m_ui->ownCertificateSignerEdit->setText(m_own.certificate.signer); + m_own.certificate.signer = signer; + m_ui->ownCertificateSignerEdit->setText(m_own.certificate.signer); } void SettingsWidgetKeeShare::generateCertificate() { - m_own = KeeShareSettings::Own::generate(); - m_ui->ownCertificateSignerEdit->setText(m_own.certificate.signer); - m_ui->ownCertificatePublicKeyEdit->setText(m_own.certificate.publicKey()); - m_ui->ownCertificatePrivateKeyEdit->setText(m_own.key.privateKey()); - m_ui->ownCertificateFingerprintEdit->setText(m_own.certificate.fingerprint()); + m_own = KeeShareSettings::Own::generate(); + m_ui->ownCertificateSignerEdit->setText(m_own.certificate.signer); + m_ui->ownCertificatePublicKeyEdit->setText(m_own.certificate.publicKey()); + m_ui->ownCertificatePrivateKeyEdit->setText(m_own.key.privateKey()); + m_ui->ownCertificateFingerprintEdit->setText(m_own.certificate.fingerprint()); } void SettingsWidgetKeeShare::importCertificate() { - QString defaultDirPath = config()->get("KeeShare/LastKeyDir").toString(); - const bool dirExists = !defaultDirPath.isEmpty() && QDir(defaultDirPath).exists(); - if (!dirExists) { - defaultDirPath = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation).first(); - } - const auto filetype = tr("key.share", "Filetype for KeeShare key"); - const auto filters = QString("%1 (*." + filetype + ");;%2 (*)").arg(tr("KeeShare key file"), tr("All files")); - QString filename = fileDialog()->getOpenFileName(this, tr("Select path"), defaultDirPath, filters, nullptr, QFileDialog::Options(0)); - if (filename.isEmpty()) { - return; - } - QFile file(filename); - file.open(QIODevice::ReadOnly); - QTextStream stream(&file); - m_own = KeeShareSettings::Own::deserialize(stream.readAll()); - file.close(); - config()->set("KeeShare/LastKeyDir", QFileInfo(filename).absolutePath()); + QString defaultDirPath = config()->get("KeeShare/LastKeyDir").toString(); + const bool dirExists = !defaultDirPath.isEmpty() && QDir(defaultDirPath).exists(); + if (!dirExists) { + defaultDirPath = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation).first(); + } + const auto filetype = tr("key.share", "Filetype for KeeShare key"); + const auto filters = QString("%1 (*." + filetype + ");;%2 (*)").arg(tr("KeeShare key file"), tr("All files")); + QString filename = fileDialog()->getOpenFileName( + this, tr("Select path"), defaultDirPath, filters, nullptr, QFileDialog::Options(0)); + if (filename.isEmpty()) { + return; + } + QFile file(filename); + file.open(QIODevice::ReadOnly); + QTextStream stream(&file); + m_own = KeeShareSettings::Own::deserialize(stream.readAll()); + file.close(); + config()->set("KeeShare/LastKeyDir", QFileInfo(filename).absolutePath()); - updateOwnCertificate(); + updateOwnCertificate(); } void SettingsWidgetKeeShare::exportCertificate() { - if (KeeShare::own() != m_own) { - QMessageBox warning; - warning.setIcon(QMessageBox::Warning); - warning.setWindowTitle(tr("Exporting changed certificate")); - warning.setText(tr("The exported certificate is not the same as the one in use. Do you want to export the current certificate?")); - auto yes = warning.addButton(QMessageBox::StandardButton::Yes); - auto no = warning.addButton(QMessageBox::StandardButton::No); - warning.setDefaultButton(no); - warning.exec(); - if (warning.clickedButton() != yes) { - return; - } - } - QString defaultDirPath = config()->get("KeeShare/LastKeyDir").toString(); - const bool dirExists = !defaultDirPath.isEmpty() && QDir(defaultDirPath).exists(); - if (!dirExists) { - defaultDirPath = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation).first(); - } - const auto filetype = tr("key.share", "Filetype for KeeShare key"); - const auto filters = QString("%1 (*." + filetype + ");;%2 (*)").arg(tr("KeeShare key file"), tr("All files")); - QString filename = tr("%1.%2", "Template for KeeShare key file").arg(m_own.certificate.signer).arg(filetype); - filename = fileDialog()->getSaveFileName(this, tr("Select path"), defaultDirPath, filters, nullptr, QFileDialog::Options(0), filetype, filename); - if (filename.isEmpty()) { - return; - } - QFile file(filename); - file.open(QIODevice::Truncate | QIODevice::WriteOnly); - QTextStream stream(&file); - stream << KeeShareSettings::Own::serialize(m_own); - stream.flush(); - file.close(); - config()->set("KeeShare/LastKeyDir", QFileInfo(filename).absolutePath()); + if (KeeShare::own() != m_own) { + QMessageBox warning; + warning.setIcon(QMessageBox::Warning); + warning.setWindowTitle(tr("Exporting changed certificate")); + warning.setText(tr("The exported certificate is not the same as the one in use. Do you want to export the " + "current certificate?")); + auto yes = warning.addButton(QMessageBox::StandardButton::Yes); + auto no = warning.addButton(QMessageBox::StandardButton::No); + warning.setDefaultButton(no); + warning.exec(); + if (warning.clickedButton() != yes) { + return; + } + } + QString defaultDirPath = config()->get("KeeShare/LastKeyDir").toString(); + const bool dirExists = !defaultDirPath.isEmpty() && QDir(defaultDirPath).exists(); + if (!dirExists) { + defaultDirPath = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation).first(); + } + const auto filetype = tr("key.share", "Filetype for KeeShare key"); + const auto filters = QString("%1 (*." + filetype + ");;%2 (*)").arg(tr("KeeShare key file"), tr("All files")); + QString filename = tr("%1.%2", "Template for KeeShare key file").arg(m_own.certificate.signer).arg(filetype); + filename = fileDialog()->getSaveFileName( + this, tr("Select path"), defaultDirPath, filters, nullptr, QFileDialog::Options(0), filetype, filename); + if (filename.isEmpty()) { + return; + } + QFile file(filename); + file.open(QIODevice::Truncate | QIODevice::WriteOnly); + QTextStream stream(&file); + stream << KeeShareSettings::Own::serialize(m_own); + stream.flush(); + file.close(); + config()->set("KeeShare/LastKeyDir", QFileInfo(filename).absolutePath()); } void SettingsWidgetKeeShare::trustSelectedCertificates() { - const auto* selectionModel = m_ui->importedCertificateTableView->selectionModel(); - Q_ASSERT(selectionModel); - for (const auto& index : selectionModel->selectedRows()) { - m_foreign.certificates[index.row()].trust = KeeShareSettings::Trust::Trusted; - } + const auto* selectionModel = m_ui->importedCertificateTableView->selectionModel(); + Q_ASSERT(selectionModel); + for (const auto& index : selectionModel->selectedRows()) { + m_foreign.certificates[index.row()].trust = KeeShareSettings::Trust::Trusted; + } - updateForeignCertificates(); + updateForeignCertificates(); } void SettingsWidgetKeeShare::askSelectedCertificates() { - const auto* selectionModel = m_ui->importedCertificateTableView->selectionModel(); - Q_ASSERT(selectionModel); - for (const auto& index : selectionModel->selectedRows()) { - m_foreign.certificates[index.row()].trust = KeeShareSettings::Trust::Ask; - } + const auto* selectionModel = m_ui->importedCertificateTableView->selectionModel(); + Q_ASSERT(selectionModel); + for (const auto& index : selectionModel->selectedRows()) { + m_foreign.certificates[index.row()].trust = KeeShareSettings::Trust::Ask; + } - updateForeignCertificates(); + updateForeignCertificates(); } void SettingsWidgetKeeShare::untrustSelectedCertificates() { - const auto* selectionModel = m_ui->importedCertificateTableView->selectionModel(); - Q_ASSERT(selectionModel); - for (const auto& index : selectionModel->selectedRows()) { - m_foreign.certificates[index.row()].trust = KeeShareSettings::Trust::Untrusted; - } + const auto* selectionModel = m_ui->importedCertificateTableView->selectionModel(); + Q_ASSERT(selectionModel); + for (const auto& index : selectionModel->selectedRows()) { + m_foreign.certificates[index.row()].trust = KeeShareSettings::Trust::Untrusted; + } - updateForeignCertificates(); + updateForeignCertificates(); } void SettingsWidgetKeeShare::removeSelectedCertificates() { - auto certificates = m_foreign.certificates; - const auto* selectionModel = m_ui->importedCertificateTableView->selectionModel(); - Q_ASSERT(selectionModel); - for (const auto& index : selectionModel->selectedRows()) { - certificates.removeOne(m_foreign.certificates[index.row()]); - } - m_foreign.certificates = certificates; + auto certificates = m_foreign.certificates; + const auto* selectionModel = m_ui->importedCertificateTableView->selectionModel(); + Q_ASSERT(selectionModel); + for (const auto& index : selectionModel->selectedRows()) { + certificates.removeOne(m_foreign.certificates[index.row()]); + } + m_foreign.certificates = certificates; - updateForeignCertificates(); + updateForeignCertificates(); } diff --git a/src/keeshare/ShareObserver.cpp b/src/keeshare/ShareObserver.cpp index 036413e6b..fdd5ccf39 100644 --- a/src/keeshare/ShareObserver.cpp +++ b/src/keeshare/ShareObserver.cpp @@ -51,105 +51,111 @@ namespace { -static const QString KeeShare_Signature("container.share.signature"); -static const QString KeeShare_Container("container.share.kdbx"); + static const QString KeeShare_Signature("container.share.signature"); + static const QString KeeShare_Container("container.share.kdbx"); -enum Trust -{ - Invalid, - Own, - UntrustedForever, - UntrustedOnce, - TrustedOnce, - TrustedForever, -}; + enum Trust + { + Invalid, + Own, + UntrustedForever, + UntrustedOnce, + TrustedOnce, + TrustedForever, + }; -bool isOfExportType(const QFileInfo &fileInfo, const QString type) -{ - return fileInfo.fileName().endsWith(type, Qt::CaseInsensitive); -} + bool isOfExportType(const QFileInfo& fileInfo, const QString type) + { + return fileInfo.fileName().endsWith(type, Qt::CaseInsensitive); + } -QPair check(QByteArray& data, - const KeeShareSettings::Reference& reference, - const KeeShareSettings::Certificate& ownCertificate, - const QList& knownCertificates, - const KeeShareSettings::Sign& sign) -{ - KeeShareSettings::Certificate certificate; - if (!sign.signature.isEmpty()) { - certificate = sign.certificate; - auto key = sign.certificate.sshKey(); - key.openKey(QString()); - const auto signer = Signature(); - if (!signer.verify(data, sign.signature, key)) { + QPair + check(QByteArray& data, + const KeeShareSettings::Reference& reference, + const KeeShareSettings::Certificate& ownCertificate, + const QList& knownCertificates, + const KeeShareSettings::Sign& sign) + { + KeeShareSettings::Certificate certificate; + if (!sign.signature.isEmpty()) { + certificate = sign.certificate; + auto key = sign.certificate.sshKey(); + key.openKey(QString()); + const auto signer = Signature(); + if (!signer.verify(data, sign.signature, key)) { qCritical("Invalid signature for sharing container %s.", qPrintable(reference.path)); return {Invalid, KeeShareSettings::Certificate()}; - } + } - if (ownCertificate.key == sign.certificate.key) { - return {Own, ownCertificate }; - } - } - enum Scope { Invalid, Global, Local }; - Scope scope = Invalid; - KeeShareSettings::Trust trusted = KeeShareSettings::Trust::Ask; - for (const auto& scopedCertificate : knownCertificates) { - if (scopedCertificate.certificate.key == certificate.key && scopedCertificate.path == reference.path) { + if (ownCertificate.key == sign.certificate.key) { + return {Own, ownCertificate}; + } + } + enum Scope + { + Invalid, + Global, + Local + }; + Scope scope = Invalid; + KeeShareSettings::Trust trusted = KeeShareSettings::Trust::Ask; + for (const auto& scopedCertificate : knownCertificates) { + if (scopedCertificate.certificate.key == certificate.key && scopedCertificate.path == reference.path) { // Global scope is overwritten by local scope scope = Global; trusted = scopedCertificate.trust; - } - if (scopedCertificate.certificate.key == certificate.key && scopedCertificate.path == reference.path) { + } + if (scopedCertificate.certificate.key == certificate.key && scopedCertificate.path == reference.path) { scope = Local; trusted = scopedCertificate.trust; break; - } - } - if (scope != Invalid && trusted != KeeShareSettings::Trust::Ask){ - // we introduce now scopes if there is a global - return {trusted == KeeShareSettings::Trust::Trusted ? TrustedForever : UntrustedForever, certificate}; - } + } + } + if (scope != Invalid && trusted != KeeShareSettings::Trust::Ask) { + // we introduce now scopes if there is a global + return {trusted == KeeShareSettings::Trust::Trusted ? TrustedForever : UntrustedForever, certificate}; + } - QMessageBox warning; - if (sign.signature.isEmpty()){ - warning.setIcon(QMessageBox::Warning); - warning.setWindowTitle(ShareObserver::tr("Import from container without signature")); - warning.setText(ShareObserver::tr("We cannot verify the source of the shared container because it is not signed. Do you really want to import from %1?") + QMessageBox warning; + if (sign.signature.isEmpty()) { + warning.setIcon(QMessageBox::Warning); + warning.setWindowTitle(ShareObserver::tr("Import from container without signature")); + warning.setText(ShareObserver::tr("We cannot verify the source of the shared container because it is not " + "signed. Do you really want to import from %1?") .arg(reference.path)); - } - else { - warning.setIcon(QMessageBox::Question); - warning.setWindowTitle(ShareObserver::tr("Import from container with certificate")); - warning.setText(ShareObserver::tr("Do you want to trust %1 with the fingerprint of %2 from %3") + } else { + warning.setIcon(QMessageBox::Question); + warning.setWindowTitle(ShareObserver::tr("Import from container with certificate")); + warning.setText(ShareObserver::tr("Do you want to trust %1 with the fingerprint of %2 from %3") .arg(certificate.signer, certificate.fingerprint(), reference.path)); - } - auto untrustedOnce = warning.addButton(ShareObserver::tr("Not this time"), QMessageBox::ButtonRole::NoRole); - auto untrustedForever = warning.addButton(ShareObserver::tr("Never"), QMessageBox::ButtonRole::NoRole); - auto trustedForever = warning.addButton(ShareObserver::tr("Always"), QMessageBox::ButtonRole::YesRole); - auto trustedOnce = warning.addButton(ShareObserver::tr("Just this time"), QMessageBox::ButtonRole::YesRole); - warning.setDefaultButton(untrustedOnce); - warning.exec(); - if (warning.clickedButton() == trustedForever){ - return {TrustedForever, certificate }; - } - if (warning.clickedButton() == trustedOnce){ - return {TrustedOnce, certificate}; - } - if (warning.clickedButton() == untrustedOnce){ - return {UntrustedOnce, certificate }; - } - if (warning.clickedButton() == untrustedForever){ - return {UntrustedForever, certificate }; - } - return {UntrustedOnce, certificate }; -} + } + auto untrustedOnce = warning.addButton(ShareObserver::tr("Not this time"), QMessageBox::ButtonRole::NoRole); + auto untrustedForever = warning.addButton(ShareObserver::tr("Never"), QMessageBox::ButtonRole::NoRole); + auto trustedForever = warning.addButton(ShareObserver::tr("Always"), QMessageBox::ButtonRole::YesRole); + auto trustedOnce = warning.addButton(ShareObserver::tr("Just this time"), QMessageBox::ButtonRole::YesRole); + warning.setDefaultButton(untrustedOnce); + warning.exec(); + if (warning.clickedButton() == trustedForever) { + return {TrustedForever, certificate}; + } + if (warning.clickedButton() == trustedOnce) { + return {TrustedOnce, certificate}; + } + if (warning.clickedButton() == untrustedOnce) { + return {UntrustedOnce, certificate}; + } + if (warning.clickedButton() == untrustedForever) { + return {UntrustedForever, certificate}; + } + return {UntrustedOnce, certificate}; + } } // End Namespace ShareObserver::ShareObserver(QSharedPointer db, QObject* parent) - : QObject(parent) - , m_db(std::move(db)) - , m_fileWatcher(new BulkFileWatcher(this)) + : QObject(parent) + , m_db(std::move(db)) + , m_fileWatcher(new BulkFileWatcher(this)) { connect(KeeShare::instance(), SIGNAL(activeChanged()), SLOT(handleDatabaseChanged())); @@ -195,8 +201,9 @@ void ShareObserver::reinitialize() m_groupToReference.remove(couple.group); m_referenceToGroup.remove(couple.oldReference); m_shareToGroup.remove(couple.oldReference.path); - if (couple.newReference.isValid() && ((active.in && couple.newReference.isImporting()) - || (active.out && couple.newReference.isExporting()))) { + if (couple.newReference.isValid() + && ((active.in && couple.newReference.isImporting()) + || (active.out && couple.newReference.isExporting()))) { m_groupToReference[couple.group] = couple.newReference; m_referenceToGroup[couple.newReference] = couple.group; m_shareToGroup[couple.newReference.path] = couple.group; @@ -213,27 +220,27 @@ void ShareObserver::reinitialize() } if (!update.newReference.path.isEmpty() && update.newReference.type != KeeShareSettings::Inactive) { - m_fileWatcher->addPath(update.newReference.path); + m_fileWatcher->addPath(update.newReference.path); } if (update.newReference.isImporting()) { - const auto result = this->importFromReferenceContainer(update.newReference.path); + const auto result = this->importFromReferenceContainer(update.newReference.path); if (!result.isValid()) { - // tolerable result - blocked import or missing source - continue; - } + // tolerable result - blocked import or missing source + continue; + } - if (result.isError()) { - error << tr("Import from %1 failed (%2)").arg(result.path).arg(result.message); - } else if (result.isWarning()) { - warning << tr("Import from %1 failed (%2)").arg(result.path).arg(result.message); - } else if (result.isInfo()) { - success << tr("Import from %1 successful (%2)").arg(result.path).arg(result.message); - } else { - success << tr("Imported from %1").arg(result.path); - } - } - } + if (result.isError()) { + error << tr("Import from %1 failed (%2)").arg(result.path).arg(result.message); + } else if (result.isWarning()) { + warning << tr("Import from %1 failed (%2)").arg(result.path).arg(result.message); + } else if (result.isInfo()) { + success << tr("Import from %1 successful (%2)").arg(result.path).arg(result.message); + } else { + success << tr("Imported from %1").arg(result.path); + } + } + } notifyAbout(success, warning, error); } @@ -301,11 +308,12 @@ void ShareObserver::handleFileUpdated(const QString& path) notifyAbout(success, warning, error); } -ShareObserver::Result ShareObserver::importSingedContainerInto(const KeeShareSettings::Reference& reference, Group* targetGroup) +ShareObserver::Result ShareObserver::importSingedContainerInto(const KeeShareSettings::Reference& reference, + Group* targetGroup) { #if !defined(WITH_XC_KEESHARE_SECURE) Q_UNUSED(targetGroup); - return { reference.path, Result::Warning, tr("Signed share container are not supported - import prevented") }; + return {reference.path, Result::Warning, tr("Signed share container are not supported - import prevented")}; #else QuaZip zip(reference.path); if (!zip.open(QuaZip::mdUnzip)) { @@ -359,25 +367,26 @@ ShareObserver::Result ShareObserver::importSingedContainerInto(const KeeShareSet case UntrustedForever: case TrustedForever: { bool found = false; - const auto trusted = trust.first == TrustedForever ? KeeShareSettings::Trust::Trusted : KeeShareSettings::Trust::Untrusted; + const auto trusted = + trust.first == TrustedForever ? KeeShareSettings::Trust::Trusted : KeeShareSettings::Trust::Untrusted; for (KeeShareSettings::ScopedCertificate& scopedCertificate : foreign.certificates) { if (scopedCertificate.certificate.key == trust.second.key && scopedCertificate.path == reference.path) { - scopedCertificate.certificate.signer = trust.second.signer; - scopedCertificate.path = reference.path; - scopedCertificate.trust = trusted; - found = true; + scopedCertificate.certificate.signer = trust.second.signer; + scopedCertificate.path = reference.path; + scopedCertificate.trust = trusted; + found = true; } } if (!found) { - foreign.certificates << KeeShareSettings::ScopedCertificate{ reference.path, trust.second, trusted}; + foreign.certificates << KeeShareSettings::ScopedCertificate{reference.path, trust.second, trusted}; // we need to update with the new signer KeeShare::setForeign(foreign); } if (trust.first == TrustedForever) { qDebug("Synchronize %s %s with %s", - qPrintable(reference.path), - qPrintable(targetGroup->name()), - qPrintable(sourceDb->rootGroup()->name())); + qPrintable(reference.path), + qPrintable(targetGroup->name()), + qPrintable(sourceDb->rootGroup()->name())); Merger merger(sourceDb->rootGroup(), targetGroup); merger.setForcedMergeMode(Group::Synchronize); const bool changed = merger.merge(); @@ -391,16 +400,16 @@ ShareObserver::Result ShareObserver::importSingedContainerInto(const KeeShareSet case TrustedOnce: case Own: { qDebug("Synchronize %s %s with %s", - qPrintable(reference.path), - qPrintable(targetGroup->name()), - qPrintable(sourceDb->rootGroup()->name())); - Merger merger(sourceDb->rootGroup(), targetGroup); - merger.setForcedMergeMode(Group::Synchronize); - const bool changed = merger.merge(); - if (changed) { - return {reference.path, Result::Success, tr("Successful signed import")}; - } - return {}; + qPrintable(reference.path), + qPrintable(targetGroup->name()), + qPrintable(sourceDb->rootGroup()->name())); + Merger merger(sourceDb->rootGroup(), targetGroup); + merger.setForcedMergeMode(Group::Synchronize); + const bool changed = merger.merge(); + if (changed) { + return {reference.path, Result::Success, tr("Successful signed import")}; + } + return {}; } default: Q_ASSERT(false); @@ -409,14 +418,15 @@ ShareObserver::Result ShareObserver::importSingedContainerInto(const KeeShareSet #endif } -ShareObserver::Result ShareObserver::importUnsignedContainerInto(const KeeShareSettings::Reference& reference, Group* targetGroup) +ShareObserver::Result ShareObserver::importUnsignedContainerInto(const KeeShareSettings::Reference& reference, + Group* targetGroup) { #if !defined(WITH_XC_KEESHARE_INSECURE) Q_UNUSED(targetGroup); return {reference.path, Result::Warning, tr("Unsigned share container are not supported - import prevented")}; #else QFile file(reference.path); - if (!file.open(QIODevice::ReadOnly)){ + if (!file.open(QIODevice::ReadOnly)) { qCritical("Unable to open file %s.", qPrintable(reference.path)); return {reference.path, Result::Error, tr("File is not readable")}; } @@ -438,34 +448,35 @@ ShareObserver::Result ShareObserver::importUnsignedContainerInto(const KeeShareS const auto own = KeeShare::own(); const auto sign = KeeShareSettings::Sign(); // invalid sign auto trust = check(payload, reference, own.certificate, foreign.certificates, sign); - switch(trust.first) { + switch (trust.first) { case UntrustedForever: case TrustedForever: { bool found = false; - const auto trusted = trust.first == TrustedForever ? KeeShareSettings::Trust::Trusted : KeeShareSettings::Trust::Untrusted; + const auto trusted = + trust.first == TrustedForever ? KeeShareSettings::Trust::Trusted : KeeShareSettings::Trust::Untrusted; for (KeeShareSettings::ScopedCertificate& scopedCertificate : foreign.certificates) { if (scopedCertificate.certificate.key == trust.second.key && scopedCertificate.path == reference.path) { - scopedCertificate.certificate.signer = trust.second.signer; - scopedCertificate.path = reference.path; - scopedCertificate.trust = trusted; - found = true; + scopedCertificate.certificate.signer = trust.second.signer; + scopedCertificate.path = reference.path; + scopedCertificate.trust = trusted; + found = true; } } if (!found) { - foreign.certificates << KeeShareSettings::ScopedCertificate{ reference.path, trust.second, trusted}; + foreign.certificates << KeeShareSettings::ScopedCertificate{reference.path, trust.second, trusted}; // we need to update with the new signer KeeShare::setForeign(foreign); } if (trust.first == TrustedForever) { qDebug("Synchronize %s %s with %s", - qPrintable(reference.path), - qPrintable(targetGroup->name()), - qPrintable(sourceDb->rootGroup()->name())); + qPrintable(reference.path), + qPrintable(targetGroup->name()), + qPrintable(sourceDb->rootGroup()->name())); Merger merger(sourceDb->rootGroup(), targetGroup); merger.setForcedMergeMode(Group::Synchronize); const bool changed = merger.merge(); if (changed) { - return {reference.path, Result::Success, tr("Successful signed import")}; + return {reference.path, Result::Success, tr("Successful signed import")}; } } return {}; @@ -491,7 +502,8 @@ ShareObserver::Result ShareObserver::importUnsignedContainerInto(const KeeShareS #endif } -ShareObserver::Result ShareObserver::importContainerInto(const KeeShareSettings::Reference& reference, Group* targetGroup) +ShareObserver::Result ShareObserver::importContainerInto(const KeeShareSettings::Reference& reference, + Group* targetGroup) { const QFileInfo info(reference.path); if (!info.exists()) { @@ -601,7 +613,7 @@ Database* ShareObserver::exportIntoContainer(const KeeShareSettings::Reference& } for (auto* targetEntry : targetRoot->entriesRecursive(false)) { if (targetEntry->hasReferences()) { - resolveReferenceAttributes(targetEntry, sourceDb); + resolveReferenceAttributes(targetEntry, sourceDb); } } return targetDb; @@ -612,11 +624,13 @@ QSharedPointer ShareObserver::database() return m_db; } -ShareObserver::Result ShareObserver::exportIntoReferenceSignedContainer(const KeeShareSettings::Reference &reference, Database *targetDb) +ShareObserver::Result ShareObserver::exportIntoReferenceSignedContainer(const KeeShareSettings::Reference& reference, + Database* targetDb) { #if !defined(WITH_XC_KEESHARE_SECURE) Q_UNUSED(targetDb); - return {reference.path, Result::Warning, tr("Overwriting signed share container is not supported - export prevented")}; + return { + reference.path, Result::Warning, tr("Overwriting signed share container is not supported - export prevented")}; #else QByteArray bytes; { @@ -657,7 +671,7 @@ ShareObserver::Result ShareObserver::exportIntoReferenceSignedContainer(const Ke ::qWarning("Embedding signature failed: %d", zip.getZipError()); return {reference.path, Result::Error, tr("Could not embed signature (%1)").arg(file.getZipError())}; } - file.close(); + file.close(); } { QuaZipFile file(&zip); @@ -678,11 +692,14 @@ ShareObserver::Result ShareObserver::exportIntoReferenceSignedContainer(const Ke #endif } -ShareObserver::Result ShareObserver::exportIntoReferenceUnsignedContainer(const KeeShareSettings::Reference &reference, Database *targetDb) +ShareObserver::Result ShareObserver::exportIntoReferenceUnsignedContainer(const KeeShareSettings::Reference& reference, + Database* targetDb) { #if !defined(WITH_XC_KEESHARE_INSECURE) Q_UNUSED(targetDb); - return {reference.path, Result::Warning, tr("Overwriting unsigned share container is not supported - export prevented")}; + return {reference.path, + Result::Warning, + tr("Overwriting unsigned share container is not supported - export prevented")}; #else QFile file(reference.path); const bool fileOpened = file.open(QIODevice::WriteOnly); diff --git a/src/keeshare/ShareObserver.h b/src/keeshare/ShareObserver.h index d67a1f7ef..95c088006 100644 --- a/src/keeshare/ShareObserver.h +++ b/src/keeshare/ShareObserver.h @@ -35,7 +35,7 @@ class Database; class ShareObserver : public QObject { -Q_OBJECT + Q_OBJECT public: explicit ShareObserver(QSharedPointer db, QObject* parent = nullptr); @@ -79,8 +79,9 @@ private: static void resolveReferenceAttributes(Entry* targetEntry, const Database* sourceDb); static Database* exportIntoContainer(const KeeShareSettings::Reference& reference, const Group* sourceRoot); - static Result exportIntoReferenceUnsignedContainer(const KeeShareSettings::Reference &reference, Database *targetDb); - static Result exportIntoReferenceSignedContainer(const KeeShareSettings::Reference &reference, Database *targetDb); + static Result exportIntoReferenceUnsignedContainer(const KeeShareSettings::Reference& reference, + Database* targetDb); + static Result exportIntoReferenceSignedContainer(const KeeShareSettings::Reference& reference, Database* targetDb); static Result importSingedContainerInto(const KeeShareSettings::Reference& reference, Group* targetGroup); static Result importUnsignedContainerInto(const KeeShareSettings::Reference& reference, Group* targetGroup); static Result importContainerInto(const KeeShareSettings::Reference& reference, Group* targetGroup); diff --git a/src/keeshare/group/EditGroupWidgetKeeShare.cpp b/src/keeshare/group/EditGroupWidgetKeeShare.cpp index eecdaee21..bb2cc19ae 100644 --- a/src/keeshare/group/EditGroupWidgetKeeShare.cpp +++ b/src/keeshare/group/EditGroupWidgetKeeShare.cpp @@ -31,54 +31,53 @@ #include EditGroupWidgetKeeShare::EditGroupWidgetKeeShare(QWidget* parent) - : QWidget(parent) - , m_ui(new Ui::EditGroupWidgetKeeShare()) + : QWidget(parent) + , m_ui(new Ui::EditGroupWidgetKeeShare()) { - m_ui->setupUi(this); + m_ui->setupUi(this); - m_ui->togglePasswordButton->setIcon(filePath()->onOffIcon("actions", "password-show")); - m_ui->togglePasswordGeneratorButton->setIcon(filePath()->icon("actions", "password-generator", false)); + m_ui->togglePasswordButton->setIcon(filePath()->onOffIcon("actions", "password-show")); + m_ui->togglePasswordGeneratorButton->setIcon(filePath()->icon("actions", "password-generator", false)); - m_ui->passwordGenerator->layout()->setContentsMargins(0, 0, 0, 0); - m_ui->passwordGenerator->hide(); - m_ui->passwordGenerator->reset(); + m_ui->passwordGenerator->layout()->setContentsMargins(0, 0, 0, 0); + m_ui->passwordGenerator->hide(); + m_ui->passwordGenerator->reset(); - m_ui->messageWidget->hide(); - m_ui->messageWidget->setCloseButtonVisible(false); - m_ui->messageWidget->setAutoHideTimeout(-1); + m_ui->messageWidget->hide(); + m_ui->messageWidget->setCloseButtonVisible(false); + m_ui->messageWidget->setAutoHideTimeout(-1); - connect(m_ui->togglePasswordButton, SIGNAL(toggled(bool)), m_ui->passwordEdit, SLOT(setShowPassword(bool))); - connect(m_ui->togglePasswordGeneratorButton, SIGNAL(toggled(bool)), SLOT(togglePasswordGeneratorButton(bool))); - connect(m_ui->passwordEdit, SIGNAL(textChanged(QString)), SLOT(selectPassword())); - connect(m_ui->passwordGenerator, SIGNAL(appliedPassword(QString)), SLOT(setGeneratedPassword(QString))); - connect(m_ui->pathEdit, SIGNAL(editingFinished()), SLOT(selectPath())); - connect(m_ui->pathSelectionButton, SIGNAL(pressed()), SLOT(launchPathSelectionDialog())); - connect(m_ui->typeComboBox, SIGNAL(currentIndexChanged(int)), SLOT(selectType())); + connect(m_ui->togglePasswordButton, SIGNAL(toggled(bool)), m_ui->passwordEdit, SLOT(setShowPassword(bool))); + connect(m_ui->togglePasswordGeneratorButton, SIGNAL(toggled(bool)), SLOT(togglePasswordGeneratorButton(bool))); + connect(m_ui->passwordEdit, SIGNAL(textChanged(QString)), SLOT(selectPassword())); + connect(m_ui->passwordGenerator, SIGNAL(appliedPassword(QString)), SLOT(setGeneratedPassword(QString))); + connect(m_ui->pathEdit, SIGNAL(editingFinished()), SLOT(selectPath())); + connect(m_ui->pathSelectionButton, SIGNAL(pressed()), SLOT(launchPathSelectionDialog())); + connect(m_ui->typeComboBox, SIGNAL(currentIndexChanged(int)), SLOT(selectType())); - connect(KeeShare::instance(), SIGNAL(activeChanged()), SLOT(showSharingState())); + connect(KeeShare::instance(), SIGNAL(activeChanged()), SLOT(showSharingState())); - const auto types = QList() << KeeShareSettings::Inactive - << KeeShareSettings::ImportFrom - << KeeShareSettings::ExportTo - << KeeShareSettings::SynchronizeWith; - for (const auto& type : types) { - QString name; - switch (type) { - case KeeShareSettings::Inactive: - name = tr("Inactive"); - break; - case KeeShareSettings::ImportFrom: - name = tr("Import from path"); - break; - case KeeShareSettings::ExportTo: - name = tr("Export to path"); - break; - case KeeShareSettings::SynchronizeWith: - name = tr("Synchronize with path"); - break; - } - m_ui->typeComboBox->insertItem(type, name, static_cast(type)); - } + const auto types = QList() + << KeeShareSettings::Inactive << KeeShareSettings::ImportFrom << KeeShareSettings::ExportTo + << KeeShareSettings::SynchronizeWith; + for (const auto& type : types) { + QString name; + switch (type) { + case KeeShareSettings::Inactive: + name = tr("Inactive"); + break; + case KeeShareSettings::ImportFrom: + name = tr("Import from path"); + break; + case KeeShareSettings::ExportTo: + name = tr("Export to path"); + break; + case KeeShareSettings::SynchronizeWith: + name = tr("Synchronize with path"); + break; + } + m_ui->typeComboBox->insertItem(type, name, static_cast(type)); + } } EditGroupWidgetKeeShare::~EditGroupWidgetKeeShare() @@ -87,198 +86,217 @@ EditGroupWidgetKeeShare::~EditGroupWidgetKeeShare() void EditGroupWidgetKeeShare::setGroup(Group* temporaryGroup) { - if (m_temporaryGroup) { - m_temporaryGroup->disconnect(this); - } + if (m_temporaryGroup) { + m_temporaryGroup->disconnect(this); + } - m_temporaryGroup = temporaryGroup; + m_temporaryGroup = temporaryGroup; - if (m_temporaryGroup) { - connect(m_temporaryGroup, SIGNAL(groupModified()), SLOT(update())); - } + if (m_temporaryGroup) { + connect(m_temporaryGroup, SIGNAL(groupModified()), SLOT(update())); + } - update(); + update(); } void EditGroupWidgetKeeShare::showSharingState() { - if (!m_temporaryGroup) { - return; - } + if (!m_temporaryGroup) { + return; + } - auto supportedExtensions = QStringList(); + auto supportedExtensions = QStringList(); #if defined(WITH_XC_KEESHARE_INSECURE) - supportedExtensions << KeeShare::unsignedContainerFileType(); + supportedExtensions << KeeShare::unsignedContainerFileType(); #endif #if defined(WITH_XC_KEESHARE_SECURE) - supportedExtensions << KeeShare::signedContainerFileType(); + supportedExtensions << KeeShare::signedContainerFileType(); #endif - const auto reference = KeeShare::referenceOf(m_temporaryGroup); - if (!reference.path.isEmpty()) { - bool supported = false; - for(const auto &extension : supportedExtensions){ - if (reference.path.endsWith(extension, Qt::CaseInsensitive)){ - supported = true; - break; - } - } - if (!supported) { - m_ui->messageWidget->showMessage( - tr("Your KeePassXC version does not support sharing your container type. Please use %1.") - .arg(supportedExtensions.join(", ")), - MessageWidget::Warning); - return; - } - } - const auto active = KeeShare::active(); - if (!active.in && !active.out) { - m_ui->messageWidget->showMessage(tr("Database sharing is disabled"), MessageWidget::Information); - return; - } - if (active.in && !active.out) { - m_ui->messageWidget->showMessage(tr("Database export is disabled"), MessageWidget::Information); - return; - } - if (!active.in && active.out) { - m_ui->messageWidget->showMessage(tr("Database import is disabled"), MessageWidget::Information); - return; - } + const auto reference = KeeShare::referenceOf(m_temporaryGroup); + if (!reference.path.isEmpty()) { + bool supported = false; + for (const auto& extension : supportedExtensions) { + if (reference.path.endsWith(extension, Qt::CaseInsensitive)) { + supported = true; + break; + } + } + if (!supported) { + m_ui->messageWidget->showMessage( + tr("Your KeePassXC version does not support sharing your container type. Please use %1.") + .arg(supportedExtensions.join(", ")), + MessageWidget::Warning); + return; + } + } + const auto active = KeeShare::active(); + if (!active.in && !active.out) { + m_ui->messageWidget->showMessage(tr("Database sharing is disabled"), MessageWidget::Information); + return; + } + if (active.in && !active.out) { + m_ui->messageWidget->showMessage(tr("Database export is disabled"), MessageWidget::Information); + return; + } + if (!active.in && active.out) { + m_ui->messageWidget->showMessage(tr("Database import is disabled"), MessageWidget::Information); + return; + } } void EditGroupWidgetKeeShare::update() { - if (!m_temporaryGroup) { - m_ui->passwordEdit->clear(); - m_ui->pathEdit->clear(); - } else { - const auto reference = KeeShare::referenceOf(m_temporaryGroup); + if (!m_temporaryGroup) { + m_ui->passwordEdit->clear(); + m_ui->pathEdit->clear(); + } else { + const auto reference = KeeShare::referenceOf(m_temporaryGroup); - m_ui->typeComboBox->setCurrentIndex(reference.type); - m_ui->passwordEdit->setText(reference.password); - m_ui->pathEdit->setText(reference.path); + m_ui->typeComboBox->setCurrentIndex(reference.type); + m_ui->passwordEdit->setText(reference.password); + m_ui->pathEdit->setText(reference.path); - showSharingState(); - } + showSharingState(); + } - m_ui->passwordGenerator->hide(); - m_ui->togglePasswordGeneratorButton->setChecked(false); - m_ui->togglePasswordButton->setChecked(false); + m_ui->passwordGenerator->hide(); + m_ui->togglePasswordGeneratorButton->setChecked(false); + m_ui->togglePasswordButton->setChecked(false); } void EditGroupWidgetKeeShare::togglePasswordGeneratorButton(bool checked) { - m_ui->passwordGenerator->regeneratePassword(); - m_ui->passwordGenerator->setVisible(checked); + m_ui->passwordGenerator->regeneratePassword(); + m_ui->passwordGenerator->setVisible(checked); } void EditGroupWidgetKeeShare::setGeneratedPassword(const QString& password) { - if (!m_temporaryGroup) { - return; - } - auto reference = KeeShare::referenceOf(m_temporaryGroup); - reference.password = password; - KeeShare::setReferenceTo(m_temporaryGroup, reference); - m_ui->togglePasswordGeneratorButton->setChecked(false); + if (!m_temporaryGroup) { + return; + } + auto reference = KeeShare::referenceOf(m_temporaryGroup); + reference.password = password; + KeeShare::setReferenceTo(m_temporaryGroup, reference); + m_ui->togglePasswordGeneratorButton->setChecked(false); } void EditGroupWidgetKeeShare::selectPath() { - if (!m_temporaryGroup) { - return; - } - auto reference = KeeShare::referenceOf(m_temporaryGroup); - reference.path = m_ui->pathEdit->text(); - KeeShare::setReferenceTo(m_temporaryGroup, reference); + if (!m_temporaryGroup) { + return; + } + auto reference = KeeShare::referenceOf(m_temporaryGroup); + reference.path = m_ui->pathEdit->text(); + KeeShare::setReferenceTo(m_temporaryGroup, reference); } void EditGroupWidgetKeeShare::launchPathSelectionDialog() { - if (!m_temporaryGroup) { - return; - } - QString defaultDirPath = config()->get("KeeShare/LastShareDir").toString(); - const bool dirExists = !defaultDirPath.isEmpty() && QDir(defaultDirPath).exists(); - if (!dirExists) { - defaultDirPath = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation).first(); - } - auto reference = KeeShare::referenceOf(m_temporaryGroup); - QString defaultFiletype = ""; - auto supportedExtensions = QStringList(); - auto unsupportedExtensions = QStringList(); - auto knownFilters = QStringList() << QString("%1 (*)").arg("All files"); + if (!m_temporaryGroup) { + return; + } + QString defaultDirPath = config()->get("KeeShare/LastShareDir").toString(); + const bool dirExists = !defaultDirPath.isEmpty() && QDir(defaultDirPath).exists(); + if (!dirExists) { + defaultDirPath = QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation).first(); + } + auto reference = KeeShare::referenceOf(m_temporaryGroup); + QString defaultFiletype = ""; + auto supportedExtensions = QStringList(); + auto unsupportedExtensions = QStringList(); + auto knownFilters = QStringList() << QString("%1 (*)").arg("All files"); #if defined(WITH_XC_KEESHARE_INSECURE) - defaultFiletype = KeeShare::unsignedContainerFileType(); - supportedExtensions << KeeShare::unsignedContainerFileType(); - knownFilters.prepend(QString("%1 (*.%2)").arg(tr("KeeShare unsigned container"), KeeShare::unsignedContainerFileType())); + defaultFiletype = KeeShare::unsignedContainerFileType(); + supportedExtensions << KeeShare::unsignedContainerFileType(); + knownFilters.prepend( + QString("%1 (*.%2)").arg(tr("KeeShare unsigned container"), KeeShare::unsignedContainerFileType())); #else - unsupportedExtensions << KeeShare::unsignedContainerFileType(); + unsupportedExtensions << KeeShare::unsignedContainerFileType(); #endif #if defined(WITH_XC_KEESHARE_SECURE) - defaultFiletype = KeeShare::signedContainerFileType(); - supportedExtensions << KeeShare::signedContainerFileType(); - knownFilters.prepend(QString("%1 (*.%2)").arg(tr("KeeShare signed container"), KeeShare::signedContainerFileType())); + defaultFiletype = KeeShare::signedContainerFileType(); + supportedExtensions << KeeShare::signedContainerFileType(); + knownFilters.prepend( + QString("%1 (*.%2)").arg(tr("KeeShare signed container"), KeeShare::signedContainerFileType())); #else - unsupportedExtensions << KeeShare::signedContainerFileType(); + unsupportedExtensions << KeeShare::signedContainerFileType(); #endif - const auto filters = knownFilters.join(";;"); - auto filename = reference.path; - if (filename.isEmpty()) { - filename = m_temporaryGroup->name(); - } - switch (reference.type) { - case KeeShareSettings::ImportFrom: - filename = fileDialog()->getFileName( - this, tr("Select import source"), defaultDirPath, filters, nullptr, QFileDialog::DontConfirmOverwrite, - defaultFiletype, filename); - break; - case KeeShareSettings::ExportTo: - filename = fileDialog()->getFileName( - this, tr("Select export target"), defaultDirPath, filters, nullptr, QFileDialog::Option(0), defaultFiletype, filename); - break; - case KeeShareSettings::SynchronizeWith: - case KeeShareSettings::Inactive: - filename = fileDialog()->getFileName( - this, tr("Select import/export file"), defaultDirPath, filters, nullptr, QFileDialog::Option(0), defaultFiletype, filename); - break; - } + const auto filters = knownFilters.join(";;"); + auto filename = reference.path; + if (filename.isEmpty()) { + filename = m_temporaryGroup->name(); + } + switch (reference.type) { + case KeeShareSettings::ImportFrom: + filename = fileDialog()->getFileName(this, + tr("Select import source"), + defaultDirPath, + filters, + nullptr, + QFileDialog::DontConfirmOverwrite, + defaultFiletype, + filename); + break; + case KeeShareSettings::ExportTo: + filename = fileDialog()->getFileName(this, + tr("Select export target"), + defaultDirPath, + filters, + nullptr, + QFileDialog::Option(0), + defaultFiletype, + filename); + break; + case KeeShareSettings::SynchronizeWith: + case KeeShareSettings::Inactive: + filename = fileDialog()->getFileName(this, + tr("Select import/export file"), + defaultDirPath, + filters, + nullptr, + QFileDialog::Option(0), + defaultFiletype, + filename); + break; + } - if (filename.isEmpty()) { - return; - } - bool validFilename = false; - for(const auto& extension : supportedExtensions + unsupportedExtensions){ - if (filename.endsWith(extension, Qt::CaseInsensitive)) { - validFilename = true; - break; - } - } - if (!validFilename){ - filename += (!filename.endsWith(".") ? "." : "") + defaultFiletype; - } + if (filename.isEmpty()) { + return; + } + bool validFilename = false; + for (const auto& extension : supportedExtensions + unsupportedExtensions) { + if (filename.endsWith(extension, Qt::CaseInsensitive)) { + validFilename = true; + break; + } + } + if (!validFilename) { + filename += (!filename.endsWith(".") ? "." : "") + defaultFiletype; + } - m_ui->pathEdit->setText(filename); - selectPath(); - config()->set("KeeShare/LastShareDir", QFileInfo(filename).absolutePath()); + m_ui->pathEdit->setText(filename); + selectPath(); + config()->set("KeeShare/LastShareDir", QFileInfo(filename).absolutePath()); } void EditGroupWidgetKeeShare::selectPassword() { - if (!m_temporaryGroup) { - return; - } - auto reference = KeeShare::referenceOf(m_temporaryGroup); - reference.password = m_ui->passwordEdit->text(); - KeeShare::setReferenceTo(m_temporaryGroup, reference); + if (!m_temporaryGroup) { + return; + } + auto reference = KeeShare::referenceOf(m_temporaryGroup); + reference.password = m_ui->passwordEdit->text(); + KeeShare::setReferenceTo(m_temporaryGroup, reference); } void EditGroupWidgetKeeShare::selectType() { - if (!m_temporaryGroup) { - return; - } - auto reference = KeeShare::referenceOf(m_temporaryGroup); - reference.type = static_cast(m_ui->typeComboBox->currentData().toInt()); - KeeShare::setReferenceTo(m_temporaryGroup, reference); + if (!m_temporaryGroup) { + return; + } + auto reference = KeeShare::referenceOf(m_temporaryGroup); + reference.type = static_cast(m_ui->typeComboBox->currentData().toInt()); + KeeShare::setReferenceTo(m_temporaryGroup, reference); }