From 13c3e9b8e2b8f7a3e5ed08d5a19f98dee4cbda4e Mon Sep 17 00:00:00 2001 From: tobtoht Date: Wed, 25 May 2022 12:59:28 +0200 Subject: [PATCH] Wizard: add seed passphrase to wallet creation --- src/WindowManager.cpp | 1 + src/utils/Seed.cpp | 2 + src/utils/Seed.h | 2 + src/wizard/PageSetSeedPassphrase.cpp | 29 ++++++++++ src/wizard/PageSetSeedPassphrase.h | 34 +++++++++++ src/wizard/PageSetSeedPassphrase.ui | 87 ++++++++++++++++++++++++++++ src/wizard/PageWalletRestoreSeed.cpp | 6 ++ src/wizard/PageWalletSeed.cpp | 23 ++++++++ src/wizard/PageWalletSeed.h | 1 + src/wizard/PageWalletSeed.ui | 24 ++++---- src/wizard/WalletWizard.cpp | 9 ++- src/wizard/WalletWizard.h | 6 ++ 12 files changed, 211 insertions(+), 13 deletions(-) create mode 100644 src/wizard/PageSetSeedPassphrase.cpp create mode 100644 src/wizard/PageSetSeedPassphrase.h create mode 100644 src/wizard/PageSetSeedPassphrase.ui diff --git a/src/WindowManager.cpp b/src/WindowManager.cpp index 072f54af..cd0f6390 100644 --- a/src/WindowManager.cpp +++ b/src/WindowManager.cpp @@ -565,6 +565,7 @@ void WindowManager::showWizard(WalletWizard::Page startPage) { m_wizard = this->createWizard(startPage); } + m_wizard->resetFields(); m_wizard->setStartId(startPage); m_wizard->restart(); m_wizard->setEnabled(true); diff --git a/src/utils/Seed.cpp b/src/utils/Seed.cpp index 6013adcf..67e39574 100644 --- a/src/utils/Seed.cpp +++ b/src/utils/Seed.cpp @@ -77,6 +77,8 @@ Seed::Seed(Type type, QStringList mnemonic, NetworkType::Type networkType) this->time = seed.birthday(); this->setRestoreHeight(); + + this->encrypted = seed.encrypted(); } catch (const std::exception &e) { this->errorString = e.what(); diff --git a/src/utils/Seed.h b/src/utils/Seed.h index 19890680..8ece5268 100644 --- a/src/utils/Seed.h +++ b/src/utils/Seed.h @@ -38,6 +38,8 @@ struct Seed { QString errorString; + bool encrypted = false; + explicit Seed(); explicit Seed(Type type, NetworkType::Type networkType = NetworkType::MAINNET, QString language = "English"); explicit Seed(Type type, QStringList mnemonic, NetworkType::Type networkType = NetworkType::MAINNET); diff --git a/src/wizard/PageSetSeedPassphrase.cpp b/src/wizard/PageSetSeedPassphrase.cpp new file mode 100644 index 00000000..1d166be5 --- /dev/null +++ b/src/wizard/PageSetSeedPassphrase.cpp @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: BSD-3-Clause +// SPDX-FileCopyrightText: 2020-2022 The Monero Project + +#include "PageSetSeedPassphrase.h" +#include "ui_PageSetSeedPassphrase.h" +#include "WalletWizard.h" + +PageSetSeedPassphrase::PageSetSeedPassphrase(WizardFields *fields, QWidget *parent) + : QWizardPage(parent) + , ui(new Ui::PageSetSeedPassphrase) + , m_fields(fields) +{ + ui->setupUi(this); + + this->setTitle("Seed Passphrase"); +} + +void PageSetSeedPassphrase::initializePage() { + ui->linePassphrase->setText(""); +} + +bool PageSetSeedPassphrase::validatePage() { + m_fields->seedOffsetPassphrase = ui->linePassphrase->text(); + return true; +} + +int PageSetSeedPassphrase::nextId() const { + return WalletWizard::Page_WalletFile; +} \ No newline at end of file diff --git a/src/wizard/PageSetSeedPassphrase.h b/src/wizard/PageSetSeedPassphrase.h new file mode 100644 index 00000000..919ed6b7 --- /dev/null +++ b/src/wizard/PageSetSeedPassphrase.h @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: BSD-3-Clause +// SPDX-FileCopyrightText: 2020-2022 The Monero Project + +#ifndef FEATHER_PAGESETSEEDPASSPHRASE_H +#define FEATHER_PAGESETSEEDPASSPHRASE_H + +#include +#include + +#include "appcontext.h" +#include "WalletWizard.h" + +namespace Ui { + class PageSetSeedPassphrase; +} + +class PageSetSeedPassphrase : public QWizardPage +{ +Q_OBJECT + +public: + explicit PageSetSeedPassphrase(WizardFields *fields, QWidget *parent = nullptr); + void initializePage() override; + bool validatePage() override; + int nextId() const override; + +private: + Ui::PageSetSeedPassphrase *ui; + + WizardFields *m_fields; +}; + + +#endif //FEATHER_PAGESETSEEDPASSPHRASE_H diff --git a/src/wizard/PageSetSeedPassphrase.ui b/src/wizard/PageSetSeedPassphrase.ui new file mode 100644 index 00000000..8a9273c2 --- /dev/null +++ b/src/wizard/PageSetSeedPassphrase.ui @@ -0,0 +1,87 @@ + + + PageSetSeedPassphrase + + + + 0 + 0 + 710 + 524 + + + + WizardPage + + + + + + You may extend your seed with a passphrase. + + + true + + + + + + + This is referred to as the "seed offset passphrase", or simply seed passphrase. + + + true + + + + + + + Your seed and seed passphrase are both required to restore your wallet. + + + true + + + + + + + + + + Note that this is NOT your wallet password. + + + true + + + + + + + If you do not know what this is, leave this field empty. + + + true + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + + diff --git a/src/wizard/PageWalletRestoreSeed.cpp b/src/wizard/PageWalletRestoreSeed.cpp index e4c752a9..61883890 100644 --- a/src/wizard/PageWalletRestoreSeed.cpp +++ b/src/wizard/PageWalletRestoreSeed.cpp @@ -61,6 +61,7 @@ PageWalletRestoreSeed::PageWalletRestoreSeed(WizardFields *fields, QWidget *pare this->onSeedTypeToggled(); } + void PageWalletRestoreSeed::onSeedTypeToggled() { if (ui->radio16->isChecked()) { m_mode = &m_polyseed; @@ -140,6 +141,11 @@ bool PageWalletRestoreSeed::validatePage() { Seed _seed = Seed(m_fields->seedType, seedSplit, constants::networkType); + if (_seed.encrypted) { + QMessageBox::warning(this, "Encrypted seed", QString("This seed is encrypted. Encrypted seeds are not supported")); + return false; + } + if (!_seed.errorString.isEmpty()) { QMessageBox::warning(this, "Invalid seed", QString("Invalid seed:\n\n%1").arg(_seed.errorString)); ui->seedEdit->setStyleSheet(errStyle); diff --git a/src/wizard/PageWalletSeed.cpp b/src/wizard/PageWalletSeed.cpp index 7e238ffc..49fc45d3 100644 --- a/src/wizard/PageWalletSeed.cpp +++ b/src/wizard/PageWalletSeed.cpp @@ -8,6 +8,9 @@ #include "Seed.h" #include +#include +#include +#include PageWalletSeed::PageWalletSeed(WizardFields *fields, QWidget *parent) : QWizardPage(parent) @@ -32,6 +35,7 @@ PageWalletSeed::PageWalletSeed(WizardFields *fields, QWidget *parent) connect(ui->btnCopy, &QPushButton::clicked, [this]{ Utils::copyToClipboard(m_seed.mnemonic.join(" ")); }); + connect(ui->btnOptions, &QPushButton::clicked, this, &PageWalletSeed::onOptionsClicked); } void PageWalletSeed::initializePage() { @@ -89,7 +93,26 @@ void PageWalletSeed::displaySeed(const QString &seed){ ui->seedWord16->setText(seedSplit[15]); } +void PageWalletSeed::onOptionsClicked() { + QDialog dialog(this); + QVBoxLayout layout; + QCheckBox checkbox("Extend this seed with a passphrase"); + checkbox.setChecked(m_fields->seedOffsetPassphraseEnabled); + layout.addWidget(&checkbox); + QDialogButtonBox buttons(QDialogButtonBox::Ok); + layout.addWidget(&buttons); + dialog.setLayout(&layout); + connect(&buttons, &QDialogButtonBox::accepted, [&dialog]{ + dialog.close(); + }); + dialog.exec(); + m_fields->seedOffsetPassphraseEnabled = checkbox.isChecked(); +} + int PageWalletSeed::nextId() const { + if (m_fields->seedOffsetPassphraseEnabled) { + return WalletWizard::Page_SetSeedPassphrase; + } return WalletWizard::Page_WalletFile; } diff --git a/src/wizard/PageWalletSeed.h b/src/wizard/PageWalletSeed.h index 835c050f..926fdc6d 100644 --- a/src/wizard/PageWalletSeed.h +++ b/src/wizard/PageWalletSeed.h @@ -31,6 +31,7 @@ public slots: private: void seedRoulette(int count); void generateSeed(); + void onOptionsClicked(); signals: void createWallet(); diff --git a/src/wizard/PageWalletSeed.ui b/src/wizard/PageWalletSeed.ui index af3dff25..99e4512f 100644 --- a/src/wizard/PageWalletSeed.ui +++ b/src/wizard/PageWalletSeed.ui @@ -6,8 +6,8 @@ 0 0 - 654 - 594 + 777 + 658 @@ -129,16 +129,6 @@ - - - - Please take note that mnemonic seeds now consist of 16 words instead of 14. - - - true - - - @@ -891,6 +881,9 @@ + + + @@ -906,6 +899,13 @@ + + + + Options + + + diff --git a/src/wizard/WalletWizard.cpp b/src/wizard/WalletWizard.cpp index deaab505..a5c22da7 100644 --- a/src/wizard/WalletWizard.cpp +++ b/src/wizard/WalletWizard.cpp @@ -13,6 +13,7 @@ #include "PageWalletRestoreKeys.h" #include "PageSetPassword.h" #include "PageSetRestoreHeight.h" +#include "PageSetSeedPassphrase.h" #include "PageHardwareDevice.h" #include "PageNetworkTor.h" #include "constants.h" @@ -37,6 +38,7 @@ WalletWizard::WalletWizard(QWidget *parent) auto createWallet = new PageWalletFile(&m_wizardFields , this); auto createWalletSeed = new PageWalletSeed(&m_wizardFields, this); auto walletSetPasswordPage = new PageSetPassword(&m_wizardFields, this); + auto walletSetSeedPassphrasePage = new PageSetSeedPassphrase(&m_wizardFields, this); setPage(Page_Menu, menuPage); setPage(Page_WalletFile, createWallet); setPage(Page_OpenWallet, openWalletPage); @@ -48,6 +50,7 @@ WalletWizard::WalletWizard(QWidget *parent) setPage(Page_WalletRestoreKeys, new PageWalletRestoreKeys(&m_wizardFields, this)); setPage(Page_SetRestoreHeight, new PageSetRestoreHeight(&m_wizardFields, this)); setPage(Page_HardwareDevice, new PageHardwareDevice(&m_wizardFields, this)); + setPage(Page_SetSeedPassphrase, walletSetSeedPassphrasePage); setStartId(Page_Menu); @@ -79,6 +82,10 @@ WalletWizard::WalletWizard(QWidget *parent) }); } +void WalletWizard::resetFields() { + m_wizardFields = {}; +} + void WalletWizard::onCreateWallet() { auto walletPath = QString("%1/%2").arg(m_wizardFields.walletDir, m_wizardFields.walletName); @@ -127,4 +134,4 @@ void WalletWizard::onCreateWallet() { } emit createWallet(m_wizardFields.seed, walletPath, m_wizardFields.password, m_wizardFields.seedLanguage, m_wizardFields.seedOffsetPassphrase); -} +} \ No newline at end of file diff --git a/src/wizard/WalletWizard.h b/src/wizard/WalletWizard.h index 57ae9fc1..3e50c0b3 100644 --- a/src/wizard/WalletWizard.h +++ b/src/wizard/WalletWizard.h @@ -31,6 +31,7 @@ struct WizardFields { QString walletName; QString walletDir; Seed seed; + bool seedOffsetPassphraseEnabled = false; QString seedOffsetPassphrase; QString seedLanguage = constants::seedLanguage; QString password; @@ -42,6 +43,9 @@ struct WizardFields { int restoreHeight = 0; Seed::Type seedType; DeviceType deviceType; + + WizardFields(): deviceType(DeviceType::LEDGER), mode(WizardMode::CreateWallet), + seedType(Seed::POLYSEED), seedOffsetPassphraseEnabled(false), restoreHeight(0) {} }; class WalletWizard : public QWizard @@ -53,6 +57,7 @@ public: Page_Menu, Page_WalletFile, Page_CreateWalletSeed, + Page_SetSeedPassphrase, Page_SetPasswordPage, Page_OpenWallet, Page_Network, @@ -64,6 +69,7 @@ public: }; explicit WalletWizard(QWidget *parent = nullptr); + void resetFields(); signals: void initialNetworkConfigured(); -- 2.52.0