File indexing completed on 2024-05-05 17:43:14

0001 /*
0002  *   SPDX-FileCopyrightText: 2017 Ivan Cukic <ivan.cukic (at) kde.org>
0003  *
0004  *   SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #include "vaultimportingwizard.h"
0008 #include "ui_vaultimportingwizard.h"
0009 
0010 #include <QMap>
0011 #include <QPushButton>
0012 #include <QStackedLayout>
0013 #include <QVector>
0014 
0015 #include "dialogdsl.h"
0016 #include "vault.h"
0017 
0018 using namespace DialogDsl;
0019 using namespace DialogDsl::operators;
0020 
0021 #include "activitieslinkingwidget.h"
0022 #include "backendchooserwidget.h"
0023 #include "cryfscypherchooserwidget.h"
0024 #include "directorypairchooserwidget.h"
0025 #include "noticewidget.h"
0026 #include "offlineonlywidget.h"
0027 #include "passwordchooserwidget.h"
0028 
0029 #include "vaultwizardbase.h"
0030 
0031 class VaultImportingWizard::Private : public WBASE(VaultImportingWizard)
0032 {
0033 public:
0034     Logic logic{{"encfs" / i18n("EncFS"),
0035                  {step{directoryPairChooser(DirectoryPairChooserWidget::ShowDevicePicker | DirectoryPairChooserWidget::ShowMountPointPicker
0036                                             | DirectoryPairChooserWidget::RequireExistingDevice | DirectoryPairChooserWidget::RequireEmptyMountPoint)},
0037                   step{passwordChooser()},
0038                   step{activitiesChooser(), offlineOnlyChooser()}}},
0039 
0040                 {"cryfs" / i18n("CryFS"),
0041                  {step{directoryPairChooser(DirectoryPairChooserWidget::ShowDevicePicker | DirectoryPairChooserWidget::ShowMountPointPicker
0042                                             | DirectoryPairChooserWidget::RequireExistingDevice | DirectoryPairChooserWidget::RequireEmptyMountPoint)},
0043                   step{passwordChooser()},
0044                   step{activitiesChooser(), offlineOnlyChooser()}}},
0045 
0046                 {"gocryptfs" / i18n("gocryptfs"),
0047                  {step{directoryPairChooser(DirectoryPairChooserWidget::ShowDevicePicker | DirectoryPairChooserWidget::ShowMountPointPicker
0048                                             | DirectoryPairChooserWidget::RequireExistingDevice | DirectoryPairChooserWidget::RequireEmptyMountPoint)},
0049                   step{passwordChooser()},
0050                   step{activitiesChooser(), offlineOnlyChooser()}}}};
0051 
0052     Private(VaultImportingWizard *parent)
0053         : WBASE(VaultImportingWizard)(parent)
0054     {
0055         lastButtonText = i18n("Import");
0056         initBase();
0057     }
0058 
0059     void finish()
0060     {
0061         auto collectedPayload = firstStepModule->fields();
0062         for (const auto *module : currentStepModules) {
0063             collectedPayload.insert(module->fields());
0064         }
0065 
0066         const auto name = collectedPayload[KEY_NAME].toString();
0067         const PlasmaVault::Device device(collectedPayload[KEY_DEVICE].toString());
0068         const PlasmaVault::MountPoint mountPoint(collectedPayload[KEY_MOUNT_POINT].toString());
0069 
0070         auto vault = new PlasmaVault::Vault(device, q);
0071 
0072         auto future = vault->import(name, mountPoint, collectedPayload);
0073 
0074         auto result = AsynQt::await(future);
0075 
0076         if (result) {
0077             Q_EMIT q->importedVault(vault);
0078             q->QDialog::accept();
0079 
0080         } else {
0081             ui.message->setText(result.error().message());
0082             ui.message->setMessageType(KMessageWidget::Error);
0083             ui.message->show();
0084             vault->scheduleDeletion();
0085         }
0086     }
0087 };
0088 
0089 VaultImportingWizard::VaultImportingWizard(QWidget *parent)
0090     : QDialog(parent)
0091     , d(new Private(this))
0092 {
0093     setWindowTitle(i18nc("@title:window", "Import an Existing Vault"));
0094 }
0095 
0096 VaultImportingWizard::~VaultImportingWizard()
0097 {
0098 }