From 350cee5f35d471575509d9b0e314d48de87c6c36 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Tue, 5 Sep 2017 16:33:16 -0700 Subject: [PATCH 1/3] Wallet cleanup --- .../commerce/wallet/WalletSetupLightbox.qml | 2 +- interface/src/commerce/QmlCommerce.cpp | 8 ++++- interface/src/commerce/QmlCommerce.h | 2 +- interface/src/commerce/Wallet.cpp | 34 ++++--------------- interface/src/commerce/Wallet.h | 1 - 5 files changed, 15 insertions(+), 32 deletions(-) diff --git a/interface/resources/qml/hifi/commerce/wallet/WalletSetupLightbox.qml b/interface/resources/qml/hifi/commerce/wallet/WalletSetupLightbox.qml index 2956dfb518..a623c2bcf7 100644 --- a/interface/resources/qml/hifi/commerce/wallet/WalletSetupLightbox.qml +++ b/interface/resources/qml/hifi/commerce/wallet/WalletSetupLightbox.qml @@ -325,7 +325,7 @@ Rectangle { onClicked: { if (passphraseSelection.validateAndSubmitPassphrase()) { root.lastPage = "choosePassphrase"; - commerce.balance(); // Do this here so that keys are generated. Order might change as backend changes? + commerce.generateKeyPair(); choosePassphraseContainer.visible = false; privateKeysReadyContainer.visible = true; } diff --git a/interface/src/commerce/QmlCommerce.cpp b/interface/src/commerce/QmlCommerce.cpp index 96f2a02f31..8681fcba50 100644 --- a/interface/src/commerce/QmlCommerce.cpp +++ b/interface/src/commerce/QmlCommerce.cpp @@ -86,7 +86,7 @@ void QmlCommerce::history() { void QmlCommerce::setPassphrase(const QString& passphrase) { auto wallet = DependencyManager::get(); - if (wallet->getPassphrase() && !wallet->getPassphrase()->isEmpty()) { + if(wallet->getPassphrase() && !wallet->getPassphrase()->isEmpty() && !passphrase.isEmpty()) { wallet->changePassphrase(passphrase); } else { wallet->setPassphrase(passphrase); @@ -94,6 +94,12 @@ void QmlCommerce::setPassphrase(const QString& passphrase) { getWalletAuthenticatedStatus(); } +void QmlCommerce::generateKeyPair() { + auto wallet = DependencyManager::get(); + wallet->generateKeyPair(); + getWalletAuthenticatedStatus(); +} + void QmlCommerce::reset() { auto ledger = DependencyManager::get(); auto wallet = DependencyManager::get(); diff --git a/interface/src/commerce/QmlCommerce.h b/interface/src/commerce/QmlCommerce.h index f66bf518f5..7d9317efae 100644 --- a/interface/src/commerce/QmlCommerce.h +++ b/interface/src/commerce/QmlCommerce.h @@ -53,7 +53,7 @@ protected: Q_INVOKABLE void balance(); Q_INVOKABLE void inventory(); Q_INVOKABLE void history(); - + Q_INVOKABLE void generateKeyPair(); Q_INVOKABLE void reset(); }; diff --git a/interface/src/commerce/Wallet.cpp b/interface/src/commerce/Wallet.cpp index 69327b09a6..8bdb8305d5 100644 --- a/interface/src/commerce/Wallet.cpp +++ b/interface/src/commerce/Wallet.cpp @@ -245,6 +245,8 @@ RSA* readPrivateKey(const char* filename) { } else { qCDebug(commerce) << "couldn't parse" << filename; + // if the passphrase is wrong, then let's not cache it + DependencyManager::get()->setPassphrase(""); } fclose(fp); } else { @@ -273,8 +275,6 @@ void Wallet::setPassphrase(const QString& passphrase) { } _passphrase = new QString(passphrase); - // no matter what, we now need to clear the keys as they - // need to be read using this passphrase _publicKeys.clear(); } @@ -413,28 +413,10 @@ bool Wallet::walletIsAuthenticatedWithPassphrase() { return false; } -bool Wallet::createIfNeeded() { - if (_publicKeys.count() > 0) return false; - +bool Wallet::generateKeyPair() { // FIXME: initialize OpenSSL elsewhere soon initialize(); - // try to read existing keys if they exist... - auto publicKey = readPublicKey(keyFilePath().toStdString().c_str()); - if (publicKey.size() > 0) { - if (auto key = readPrivateKey(keyFilePath().toStdString().c_str()) ) { - qCDebug(commerce) << "read private key"; - RSA_free(key); - // K -- add the public key since we have a legit private key associated with it - _publicKeys.push_back(publicKey.toBase64()); - return false; - } - } - qCInfo(commerce) << "Creating wallet."; - return generateKeyPair(); -} - -bool Wallet::generateKeyPair() { qCInfo(commerce) << "Generating keypair."; auto keyPair = generateRSAKeypair(); sendKeyFilePathIfExists(); @@ -453,7 +435,6 @@ bool Wallet::generateKeyPair() { QStringList Wallet::listPublicKeys() { qCInfo(commerce) << "Enumerating public keys."; - createIfNeeded(); return _publicKeys; } @@ -572,12 +553,8 @@ void Wallet::reset() { // tell the provider we got nothing updateImageProvider(); - delete _passphrase; + _passphrase->clear(); - // for now we need to maintain the hard-coded passphrase. - // FIXME: remove this line as part of wiring up the passphrase - // and probably set it to nullptr - _passphrase = new QString("pwd"); QFile keyFile(keyFilePath()); QFile imageFile(imageFilePath()); @@ -608,6 +585,7 @@ bool Wallet::changePassphrase(const QString& newPassphrase) { return false; } } - qCDebug(commerce) << "couldn't read keys"; + qCDebug(commerce) << "couldn't decrypt keys with current passphrase, clearing"; + setPassphrase(QString("")); return false; } diff --git a/interface/src/commerce/Wallet.h b/interface/src/commerce/Wallet.h index 3b470210de..f72b7adc41 100644 --- a/interface/src/commerce/Wallet.h +++ b/interface/src/commerce/Wallet.h @@ -26,7 +26,6 @@ public: ~Wallet(); // These are currently blocking calls, although they might take a moment. - bool createIfNeeded(); bool generateKeyPair(); QStringList listPublicKeys(); QString signWithKey(const QByteArray& text, const QString& key); From 1fd30b1e0fffa5fd26ce6b599efcab8d11a8196a Mon Sep 17 00:00:00 2001 From: David Kelly Date: Tue, 5 Sep 2017 17:03:11 -0700 Subject: [PATCH 2/3] fix passphrase reset --- interface/resources/qml/hifi/commerce/wallet/Help.qml | 1 + interface/resources/qml/hifi/commerce/wallet/Wallet.qml | 2 +- scripts/system/commerce/wallet.js | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/hifi/commerce/wallet/Help.qml b/interface/resources/qml/hifi/commerce/wallet/Help.qml index 402209f38d..19273298b6 100644 --- a/interface/resources/qml/hifi/commerce/wallet/Help.qml +++ b/interface/resources/qml/hifi/commerce/wallet/Help.qml @@ -55,6 +55,7 @@ Item { text: "DEBUG: Clear Cached Passphrase"; onClicked: { commerce.setPassphrase(""); + sendSignalToWallet({method: 'passphraseReset'}); } } HifiControlsUit.Button { diff --git a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml index 4fcfc0c93b..169060887a 100644 --- a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml +++ b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml @@ -318,7 +318,7 @@ Rectangle { Connections { onSendSignalToWallet: { - if (msg.method === 'walletReset') { + if (msg.method === 'walletReset' || msg.method == 'passphraseReset') { sendToScript(msg); } } diff --git a/scripts/system/commerce/wallet.js b/scripts/system/commerce/wallet.js index 5f07c4cbe7..5a668a3d6e 100644 --- a/scripts/system/commerce/wallet.js +++ b/scripts/system/commerce/wallet.js @@ -71,6 +71,10 @@ case 'maybeEnableHmdPreview': Menu.setIsOptionChecked("Disable Preview", isHmdPreviewDisabled); break; + case 'passphraseReset': + onButtonClicked(); + onButtonClicked(); + break; case 'walletReset': onButtonClicked(); onButtonClicked(); From 89cda8d3062b7bcdee55b793f467551f40d4b6e9 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Tue, 5 Sep 2017 17:15:25 -0700 Subject: [PATCH 3/3] oops -- === not == --- interface/resources/qml/hifi/commerce/wallet/Wallet.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml index 169060887a..401ef89374 100644 --- a/interface/resources/qml/hifi/commerce/wallet/Wallet.qml +++ b/interface/resources/qml/hifi/commerce/wallet/Wallet.qml @@ -318,7 +318,7 @@ Rectangle { Connections { onSendSignalToWallet: { - if (msg.method === 'walletReset' || msg.method == 'passphraseReset') { + if (msg.method === 'walletReset' || msg.method === 'passphraseReset') { sendToScript(msg); } }