Add sharing of groups between databases
* Add source folder keeshare for sharing with corresponding define WITH_XC_KEESHARE * Move common crypto parts to src/crypto/ssh * Extended OpenSSHKey * Move filewatching to own file (currently in two related classes DelayedFileWatcher and BulkFileWatcher) * Small improvements for style and code in several classes * Sharing is secured using RSA-Keys which are generated on demand * Publisher signs the container using their private key * Client can verify the signed container and choose to decline an import, import only once or trust the publisher and automatically import all data of this source henceforth * Integration of settings into Group-Settings, Database-Settings and Application-Settings * Introduced dependency QuaZip as dependency to allow combined export of key container and the (custom format) certificate
This commit is contained in:
committed by
Jonathan White
parent
c1e9f45df9
commit
eca9c658f4
@@ -23,14 +23,40 @@
|
||||
#include "gui/EditWidgetIcons.h"
|
||||
#include "gui/EditWidgetProperties.h"
|
||||
|
||||
#ifdef WITH_XC_KEESHARE
|
||||
#include "keeshare/group/EditGroupPageKeeShare.h"
|
||||
#endif
|
||||
|
||||
class EditGroupWidget::ExtraPage
|
||||
{
|
||||
public:
|
||||
ExtraPage(IEditGroupPage* page, QWidget* widget)
|
||||
: editPage(page)
|
||||
, widget(widget)
|
||||
{
|
||||
}
|
||||
|
||||
void set(Group* temporaryGroup) const
|
||||
{
|
||||
editPage->set(widget, temporaryGroup);
|
||||
}
|
||||
|
||||
void assign() const
|
||||
{
|
||||
editPage->assign(widget);
|
||||
}
|
||||
|
||||
private:
|
||||
QSharedPointer<IEditGroupPage> editPage;
|
||||
QWidget* widget;
|
||||
};
|
||||
|
||||
EditGroupWidget::EditGroupWidget(QWidget* parent)
|
||||
: EditWidget(parent)
|
||||
, m_mainUi(new Ui::EditGroupWidgetMain())
|
||||
, m_editGroupWidgetMain(new QWidget())
|
||||
, m_editGroupWidgetIcons(new EditWidgetIcons())
|
||||
, m_editWidgetProperties(new EditWidgetProperties())
|
||||
, m_group(nullptr)
|
||||
, m_database(nullptr)
|
||||
{
|
||||
m_mainUi->setupUi(m_editGroupWidgetMain);
|
||||
|
||||
@@ -52,6 +78,10 @@ EditGroupWidget::EditGroupWidget(QWidget* parent)
|
||||
SIGNAL(messageEditEntry(QString, MessageWidget::MessageType)),
|
||||
SLOT(showMessage(QString, MessageWidget::MessageType)));
|
||||
connect(m_editGroupWidgetIcons, SIGNAL(messageEditEntryDismiss()), SLOT(hideMessage()));
|
||||
|
||||
#ifdef WITH_XC_KEESHARE
|
||||
addEditPage(new EditGroupPageKeeShare(this));
|
||||
#endif
|
||||
}
|
||||
|
||||
EditGroupWidget::~EditGroupWidget()
|
||||
@@ -63,6 +93,8 @@ void EditGroupWidget::loadGroup(Group* group, bool create, Database* database)
|
||||
m_group = group;
|
||||
m_database = database;
|
||||
|
||||
m_temporaryGroup.reset(group->clone(Entry::CloneNoFlags, Group::CloneNoFlags));
|
||||
|
||||
if (create) {
|
||||
setHeadline(tr("Add group"));
|
||||
} else {
|
||||
@@ -91,12 +123,15 @@ void EditGroupWidget::loadGroup(Group* group, bool create, Database* database)
|
||||
m_mainUi->autoTypeSequenceCustomEdit->setText(group->effectiveAutoTypeSequence());
|
||||
|
||||
IconStruct iconStruct;
|
||||
iconStruct.uuid = group->iconUuid();
|
||||
iconStruct.number = group->iconNumber();
|
||||
m_editGroupWidgetIcons->load(group->uuid(), database, iconStruct);
|
||||
iconStruct.uuid = m_temporaryGroup->iconUuid();
|
||||
iconStruct.number = m_temporaryGroup->iconNumber();
|
||||
m_editGroupWidgetIcons->load(m_temporaryGroup->uuid(), m_database, iconStruct);
|
||||
m_editWidgetProperties->setFields(m_temporaryGroup->timeInfo(), m_temporaryGroup->uuid());
|
||||
m_editWidgetProperties->setCustomData(m_temporaryGroup->customData());
|
||||
|
||||
m_editWidgetProperties->setFields(group->timeInfo(), group->uuid());
|
||||
m_editWidgetProperties->setCustomData(group->customData());
|
||||
for (const ExtraPage& page : asConst(m_extraPages)) {
|
||||
page.set(m_temporaryGroup.data());
|
||||
}
|
||||
|
||||
setCurrentPage(0);
|
||||
|
||||
@@ -112,50 +147,61 @@ void EditGroupWidget::save()
|
||||
|
||||
void EditGroupWidget::apply()
|
||||
{
|
||||
m_group->setName(m_mainUi->editName->text());
|
||||
m_group->setNotes(m_mainUi->editNotes->toPlainText());
|
||||
m_group->setExpires(m_mainUi->expireCheck->isChecked());
|
||||
m_group->setExpiryTime(m_mainUi->expireDatePicker->dateTime().toUTC());
|
||||
m_temporaryGroup->setName(m_mainUi->editName->text());
|
||||
m_temporaryGroup->setNotes(m_mainUi->editNotes->toPlainText());
|
||||
m_temporaryGroup->setExpires(m_mainUi->expireCheck->isChecked());
|
||||
m_temporaryGroup->setExpiryTime(m_mainUi->expireDatePicker->dateTime().toUTC());
|
||||
|
||||
m_group->setSearchingEnabled(triStateFromIndex(m_mainUi->searchComboBox->currentIndex()));
|
||||
m_group->setAutoTypeEnabled(triStateFromIndex(m_mainUi->autotypeComboBox->currentIndex()));
|
||||
|
||||
m_group->customData()->copyDataFrom(m_editWidgetProperties->customData());
|
||||
m_temporaryGroup->setSearchingEnabled(triStateFromIndex(m_mainUi->searchComboBox->currentIndex()));
|
||||
m_temporaryGroup->setAutoTypeEnabled(triStateFromIndex(m_mainUi->autotypeComboBox->currentIndex()));
|
||||
|
||||
if (m_mainUi->autoTypeSequenceInherit->isChecked()) {
|
||||
m_group->setDefaultAutoTypeSequence(QString());
|
||||
m_temporaryGroup->setDefaultAutoTypeSequence(QString());
|
||||
} else {
|
||||
m_group->setDefaultAutoTypeSequence(m_mainUi->autoTypeSequenceCustomEdit->text());
|
||||
m_temporaryGroup->setDefaultAutoTypeSequence(m_mainUi->autoTypeSequenceCustomEdit->text());
|
||||
}
|
||||
|
||||
IconStruct iconStruct = m_editGroupWidgetIcons->state();
|
||||
|
||||
if (iconStruct.number < 0) {
|
||||
m_group->setIcon(Group::DefaultIconNumber);
|
||||
m_temporaryGroup->setIcon(Group::DefaultIconNumber);
|
||||
} else if (iconStruct.uuid.isNull()) {
|
||||
m_group->setIcon(iconStruct.number);
|
||||
m_temporaryGroup->setIcon(iconStruct.number);
|
||||
} else {
|
||||
m_group->setIcon(iconStruct.uuid);
|
||||
m_temporaryGroup->setIcon(iconStruct.uuid);
|
||||
}
|
||||
|
||||
for (const ExtraPage& page : asConst(m_extraPages)) {
|
||||
page.assign();
|
||||
}
|
||||
|
||||
// Icons add/remove are applied globally outside the transaction!
|
||||
m_group->copyDataFrom(m_temporaryGroup.data());
|
||||
}
|
||||
|
||||
void EditGroupWidget::cancel()
|
||||
{
|
||||
if (!m_group->iconUuid().isNull() && !m_database->metadata()->containsCustomIcon(m_group->iconUuid())) {
|
||||
m_group->setIcon(Entry::DefaultIconNumber);
|
||||
}
|
||||
|
||||
clear();
|
||||
emit editFinished(false);
|
||||
}
|
||||
|
||||
void EditGroupWidget::clear()
|
||||
{
|
||||
m_group = nullptr;
|
||||
m_database = nullptr;
|
||||
m_temporaryGroup.reset(nullptr);
|
||||
m_database.clear();
|
||||
m_group.clear();
|
||||
m_editGroupWidgetIcons->reset();
|
||||
}
|
||||
|
||||
void EditGroupWidget::addEditPage(IEditGroupPage* page)
|
||||
{
|
||||
QWidget* widget = page->createWidget();
|
||||
widget->setParent(this);
|
||||
|
||||
m_extraPages.append(ExtraPage(page, widget));
|
||||
addPage(page->name(), page->icon(), widget);
|
||||
}
|
||||
|
||||
void EditGroupWidget::addTriStateItems(QComboBox* comboBox, bool inheritDefault)
|
||||
{
|
||||
QString inheritDefaultString;
|
||||
|
||||
Reference in New Issue
Block a user