From 48aab5c6e57f9e66ffec7cae0c1398ac767381f7 Mon Sep 17 00:00:00 2001 From: xiphon Date: Tue, 11 Feb 2020 23:34:15 +0000 Subject: [PATCH] WalletManager: wallet recovery - seed offset passphrase support --- src/libwalletqt/WalletManager.cpp | 4 ++-- src/libwalletqt/WalletManager.h | 2 +- wizard/WizardController.qml | 4 +++- wizard/WizardRestoreWallet1.qml | 19 ++++++++++++++++++- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/libwalletqt/WalletManager.cpp b/src/libwalletqt/WalletManager.cpp index e089a285..01faf905 100644 --- a/src/libwalletqt/WalletManager.cpp +++ b/src/libwalletqt/WalletManager.cpp @@ -151,14 +151,14 @@ void WalletManager::openWalletAsync(const QString &path, const QString &password } -Wallet *WalletManager::recoveryWallet(const QString &path, const QString &memo, NetworkType::Type nettype, quint64 restoreHeight, quint64 kdfRounds) +Wallet *WalletManager::recoveryWallet(const QString &path, const QString &seed, const QString &seed_offset, NetworkType::Type nettype, quint64 restoreHeight, quint64 kdfRounds) { QMutexLocker locker(&m_mutex); if (m_currentWallet) { qDebug() << "Closing open m_currentWallet" << m_currentWallet; delete m_currentWallet; } - Monero::Wallet * w = m_pimpl->recoveryWallet(path.toStdString(), "", memo.toStdString(), static_cast(nettype), restoreHeight, kdfRounds); + Monero::Wallet * w = m_pimpl->recoveryWallet(path.toStdString(), "", seed.toStdString(), static_cast(nettype), restoreHeight, kdfRounds, seed_offset.toStdString()); m_currentWallet = new Wallet(w); return m_currentWallet; } diff --git a/src/libwalletqt/WalletManager.h b/src/libwalletqt/WalletManager.h index a37d0466..08d8f89c 100644 --- a/src/libwalletqt/WalletManager.h +++ b/src/libwalletqt/WalletManager.h @@ -83,7 +83,7 @@ public: Q_INVOKABLE void openWalletAsync(const QString &path, const QString &password, NetworkType::Type nettype = NetworkType::MAINNET, quint64 kdfRounds = 1); // wizard: recoveryWallet path; hint: internally it recorvers wallet and set password = "" - Q_INVOKABLE Wallet * recoveryWallet(const QString &path, const QString &memo, + Q_INVOKABLE Wallet * recoveryWallet(const QString &path, const QString &seed, const QString &seed_offset, NetworkType::Type nettype = NetworkType::MAINNET, quint64 restoreHeight = 0, quint64 kdfRounds = 1); Q_INVOKABLE Wallet * createWalletFromKeys(const QString &path, diff --git a/wizard/WizardController.qml b/wizard/WizardController.qml index d3157c3e..f71ae108 100644 --- a/wizard/WizardController.qml +++ b/wizard/WizardController.qml @@ -59,6 +59,7 @@ Rectangle { wizardController.walletOptionsLocation = ''; wizardController.walletOptionsPassword = ''; wizardController.walletOptionsSeed = ''; + wizardController.walletOptionsSeedOffset = ''; wizardController.walletOptionsRecoverAddress = '' wizardController.walletOptionsRecoverViewkey = '' wizardController.walletOptionsRecoverSpendkey = '' @@ -92,6 +93,7 @@ Rectangle { property string walletOptionsLocation: '' property string walletOptionsPassword: '' property string walletOptionsSeed: '' + property string walletOptionsSeedOffset: '' property string walletOptionsRecoverAddress: '' property string walletOptionsRecoverViewkey: '' property string walletOptionsRecoverSpendkey: '' @@ -394,7 +396,7 @@ Rectangle { var wallet = '' // From seed or keys if(wizardController.walletRestoreMode === 'seed') - wallet = walletManager.recoveryWallet(tmp_wallet_filename, wizardController.walletOptionsSeed, nettype, restoreHeight, kdfRounds) + wallet = walletManager.recoveryWallet(tmp_wallet_filename, wizardController.walletOptionsSeed, wizardController.walletOptionsSeedOffset, nettype, restoreHeight, kdfRounds); else wallet = walletManager.createWalletFromKeys(tmp_wallet_filename, wizardController.language_wallet, nettype, wizardController.walletOptionsRecoverAddress, wizardController.walletOptionsRecoverViewkey, diff --git a/wizard/WizardRestoreWallet1.qml b/wizard/WizardRestoreWallet1.qml index b9fd5612..cc903bb8 100644 --- a/wizard/WizardRestoreWallet1.qml +++ b/wizard/WizardRestoreWallet1.qml @@ -164,8 +164,8 @@ Rectangle { ColumnLayout { // seed textarea visible: wizardController.walletRestoreMode === 'seed' - Layout.preferredHeight: 100 Layout.fillWidth: true + spacing: 10 Rectangle { color: "transparent" @@ -217,6 +217,20 @@ Rectangle { } } } + + MoneroComponents.CheckBox2 { + id: seedOffsetCheckbox + text: qsTr("Seed offset passphrase (optional)") + translationManager.emptyString + } + + MoneroComponents.LineEdit { + id: seedOffset + echoMode: TextInput.Password + Layout.fillWidth: true + placeholderFontSize: 16 + placeholderText: qsTr("Passphrase") + translationManager.emptyString + visible: seedOffsetCheckbox.checked + } } MoneroComponents.LineEdit { @@ -294,6 +308,7 @@ Rectangle { switch (wizardController.walletRestoreMode) { case 'seed': wizardController.walletOptionsSeed = seedInput.text; + wizardController.walletOptionsSeedOffset = seedOffsetCheckbox.checked ? seedOffset.text : ""; break; default: // walletRestoreMode = keys or qr wizardController.walletOptionsRecoverAddress = addressLine.text; @@ -325,6 +340,8 @@ Rectangle { // cleanup wizardWalletInput.reset(); seedInput.text = ""; + seedOffsetCheckbox.checked = false; + seedOffset.text = ""; addressLine.text = ""; spendKeyLine.text = ""; viewKeyLine.text = "";