From f248eb5518daf79a1671ee1c1890abb0d56550e0 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Tue, 7 Nov 2017 11:30:09 -0800 Subject: [PATCH 1/8] Change wallet home when 0 transactions --- .../qml/hifi/commerce/wallet/WalletHome.qml | 62 +++++++++++++++---- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml b/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml index 1fe0dcc58b..ff89f01943 100644 --- a/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml +++ b/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml @@ -196,7 +196,52 @@ Item { anchors.bottom: parent.bottom; anchors.left: parent.left; anchors.right: parent.right; - anchors.rightMargin: 24; + + Item { + visible: transactionHistoryModel.count === 0 && root.historyReceived; + anchors.centerIn: parent; + width: parent.width - 12; + height: parent.height; + + HifiControlsUit.Separator { + colorScheme: 1; + anchors.left: parent.left; + anchors.right: parent.right; + anchors.top: parent.top; + } + + RalewayRegular { + id: noActivityText; + text: "No activity yet.


Looking for a little spending money?
Click the button below to apply for your free HFC!"; + // Text size + size: 24; + // Style + color: hifi.colors.blueAccent; + anchors.top: parent.top; + anchors.topMargin: 26; + anchors.left: parent.left; + anchors.right: parent.right; + height: paintedHeight; + wrapMode: Text.WordWrap; + horizontalAlignment: Text.AlignHCenter; + } + + // "Apply" button + HifiControlsUit.Button { + id: changePassphraseButton; + color: hifi.buttons.blue; + colorScheme: hifi.colorSchemes.dark; + anchors.top: noActivityText.bottom; + anchors.topMargin: 25; + anchors.horizontalCenter: parent.horizontalCenter; + width: 180; + height: 40; + text: "Apply Now"; + onClicked: { + Qt.openUrlExternally("https://www.highfidelity.com/"); + } + } + } ListView { id: transactionHistory; @@ -294,17 +339,6 @@ Item { } } } - - // This should never be visible (since you immediately get 100 HFC) - FiraSansRegular { - id: emptyTransationHistory; - size: 24; - visible: !transactionHistory.visible && root.historyReceived; - text: "Recent Activity Unavailable"; - anchors.fill: parent; - horizontalAlignment: Text.AlignHCenter; - verticalAlignment: Text.AlignVCenter; - } } } @@ -350,7 +384,9 @@ Item { } root.pendingCount = pendingCount; - transactionHistoryModel.insert(0, {"transaction_type": "pendingCount"}); + if (pendingCount > 0) { + transactionHistoryModel.insert(0, {"transaction_type": "pendingCount"}); + } } // From 8f54c106f6411ad8cfe624fdf3a32ac72fbb0e5f Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Tue, 7 Nov 2017 12:12:27 -0800 Subject: [PATCH 2/8] Could it be this simple? --- interface/src/commerce/Ledger.cpp | 9 +++++++++ interface/src/commerce/Wallet.cpp | 16 ++++++++++++---- interface/src/commerce/Wallet.h | 5 +++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/interface/src/commerce/Ledger.cpp b/interface/src/commerce/Ledger.cpp index f607c923ee..ed862384dc 100644 --- a/interface/src/commerce/Ledger.cpp +++ b/interface/src/commerce/Ledger.cpp @@ -90,6 +90,15 @@ void Ledger::buy(const QString& hfc_key, int cost, const QString& asset_id, cons signedSend("transaction", transactionString, hfc_key, "buy", "buySuccess", "buyFailure", controlled_failure); } +void Ledger::receiveAtSuccess(QNetworkReply& reply) { + auto wallet = DependencyManager::get(); + QByteArray response = reply.readAll(); + QJsonObject data = QJsonDocument::fromJson(response).object(); + + if (data["status"] == "fail") { // Not on "The List" for receiving HFC + wallet->setMustRegenerateKeypair(true); + } +} bool Ledger::receiveAt(const QString& hfc_key, const QString& old_key, const QString& machine_fingerprint) { auto accountManager = DependencyManager::get(); if (!accountManager->isLoggedIn()) { diff --git a/interface/src/commerce/Wallet.cpp b/interface/src/commerce/Wallet.cpp index 9bc8dc9e43..b746b58015 100644 --- a/interface/src/commerce/Wallet.cpp +++ b/interface/src/commerce/Wallet.cpp @@ -327,6 +327,12 @@ Wallet::Wallet() { auto walletScriptingInterface = DependencyManager::get(); uint status; + if (_mustRegenerateKeypair) { + _mustRegenerateKeypair = false; + resetKeysOnly(); + generateKeyPair(); + } + if (wallet->getKeyFilePath() == "" || !wallet->getSecurityImage()) { status = (uint)WalletStatus::WALLET_STATUS_NOT_SET_UP; } else if (!wallet->walletIsAuthenticatedWithPassphrase()) { @@ -661,9 +667,13 @@ QString Wallet::getKeyFilePath() { } } -void Wallet::reset() { +void Wallet::resetKeysOnly() { _publicKeys.clear(); + QFile keyFile(keyFilePath()); + keyFile.remove(); +} +void Wallet::reset() { delete _securityImage; _securityImage = nullptr; @@ -671,9 +681,7 @@ void Wallet::reset() { updateImageProvider(); _passphrase->clear(); - - QFile keyFile(keyFilePath()); - keyFile.remove(); + resetKeysOnly(); } bool Wallet::writeWallet(const QString& newPassphrase) { RSA* keys = readKeys(keyFilePath().toStdString().c_str()); diff --git a/interface/src/commerce/Wallet.h b/interface/src/commerce/Wallet.h index ed145df451..f0f13aaf6e 100644 --- a/interface/src/commerce/Wallet.h +++ b/interface/src/commerce/Wallet.h @@ -49,6 +49,7 @@ public: bool walletIsAuthenticatedWithPassphrase(); bool changePassphrase(const QString& newPassphrase); + void resetKeysOnly(); void reset(); void getWalletStatus(); @@ -59,6 +60,8 @@ public: WALLET_STATUS_READY }; + void setMustRegenerateKeypair(const bool& val) { _mustRegenerateKeypair = val; } + signals: void securityImageResult(bool exists); void keyFilePathIfExistsResult(const QString& path); @@ -83,6 +86,8 @@ private: bool writeBackupInstructions(); void account(); + + bool _mustRegenerateKeypair { false }; }; #endif // hifi_Wallet_h From b7163bb8fc1bf1e9425ae3a2c12e487f14f84ccd Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 8 Nov 2017 10:24:26 -0800 Subject: [PATCH 3/8] Frontend changes --- interface/resources/qml/hifi/commerce/wallet/WalletHome.qml | 3 ++- interface/src/commerce/Ledger.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml b/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml index ff89f01943..9b244d66ca 100644 --- a/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml +++ b/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml @@ -212,7 +212,8 @@ Item { RalewayRegular { id: noActivityText; - text: "No activity yet.


Looking for a little spending money?
Click the button below to apply for your free HFC!"; + text: "The Wallet app is in closed Beta.

To request entry and receive free HFC, please contact " + + "info@highfidelity.com with your High Fidelity account username and the email address registered to that account."; // Text size size: 24; // Style diff --git a/interface/src/commerce/Ledger.cpp b/interface/src/commerce/Ledger.cpp index ed862384dc..01c11347fd 100644 --- a/interface/src/commerce/Ledger.cpp +++ b/interface/src/commerce/Ledger.cpp @@ -43,7 +43,6 @@ QJsonObject Ledger::failResponse(const QString& label, QNetworkReply& reply) { #define FailHandler(NAME) void Ledger::NAME##Failure(QNetworkReply& reply) { emit NAME##Result(failResponse(#NAME, reply)); } #define Handler(NAME) ApiHandler(NAME) FailHandler(NAME) Handler(buy) -Handler(receiveAt) Handler(balance) Handler(inventory) @@ -99,6 +98,7 @@ void Ledger::receiveAtSuccess(QNetworkReply& reply) { wallet->setMustRegenerateKeypair(true); } } +void Ledger::receiveAtFailure(QNetworkReply& reply) { failResponse("receiveAt", reply); } bool Ledger::receiveAt(const QString& hfc_key, const QString& old_key, const QString& machine_fingerprint) { auto accountManager = DependencyManager::get(); if (!accountManager->isLoggedIn()) { From 72fa0823ba05a21bf04af4358070e70c09843ca6 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 8 Nov 2017 10:40:47 -0800 Subject: [PATCH 4/8] Logic changes --- .../qml/hifi/commerce/wallet/WalletHome.qml | 21 +++---------------- interface/src/commerce/Wallet.cpp | 6 +++++- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml b/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml index 9b244d66ca..fd7ce0fdfd 100644 --- a/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml +++ b/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml @@ -218,30 +218,15 @@ Item { size: 24; // Style color: hifi.colors.blueAccent; - anchors.top: parent.top; - anchors.topMargin: 26; anchors.left: parent.left; + anchors.leftMargin: 12; anchors.right: parent.right; + anchors.rightMargin: 12; + anchors.verticalCenter: parent.verticalCenter; height: paintedHeight; wrapMode: Text.WordWrap; horizontalAlignment: Text.AlignHCenter; } - - // "Apply" button - HifiControlsUit.Button { - id: changePassphraseButton; - color: hifi.buttons.blue; - colorScheme: hifi.colorSchemes.dark; - anchors.top: noActivityText.bottom; - anchors.topMargin: 25; - anchors.horizontalCenter: parent.horizontalCenter; - width: 180; - height: 40; - text: "Apply Now"; - onClicked: { - Qt.openUrlExternally("https://www.highfidelity.com/"); - } - } } ListView { diff --git a/interface/src/commerce/Wallet.cpp b/interface/src/commerce/Wallet.cpp index b746b58015..fa72d02cca 100644 --- a/interface/src/commerce/Wallet.cpp +++ b/interface/src/commerce/Wallet.cpp @@ -324,12 +324,16 @@ Wallet::Wallet() { connect(ledger.data(), &Ledger::accountResult, this, [&]() { auto wallet = DependencyManager::get(); + auto ledger = DependencyManager::get(); auto walletScriptingInterface = DependencyManager::get(); uint status; - if (_mustRegenerateKeypair) { + if (_mustRegenerateKeypair || (!_passphrase->isEmpty() && _publicKeys.count() == 0)) { + qCDebug(commerce) << "Regenerating keys and resetting user_hfc_account. _mustRegenerateKeypair:" + << _mustRegenerateKeypair << "_publicKeys.count():" << _publicKeys.count(); _mustRegenerateKeypair = false; resetKeysOnly(); + ledger->reset(); generateKeyPair(); } From 3190fe1f325dd7851a605abc6df7d9fc88ad7745 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 8 Nov 2017 11:44:21 -0800 Subject: [PATCH 5/8] Use keyfilepath instead of cached public keys --- .../qml/hifi/commerce/wallet/WalletHome.qml | 4 ++ interface/src/commerce/Ledger.cpp | 4 +- interface/src/commerce/QmlCommerce.cpp | 5 +++ interface/src/commerce/QmlCommerce.h | 1 + interface/src/commerce/Wallet.cpp | 45 +++++++++++-------- 5 files changed, 39 insertions(+), 20 deletions(-) diff --git a/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml b/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml index fd7ce0fdfd..44d3d54f58 100644 --- a/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml +++ b/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml @@ -43,6 +43,10 @@ Item { calculatePendingAndInvalidated(); } + + if (transactionHistoryModel.count === 0) { + commerce.setMustRegenerateKeypair(true); + } refreshTimer.start(); } } diff --git a/interface/src/commerce/Ledger.cpp b/interface/src/commerce/Ledger.cpp index 01c11347fd..519c906fd8 100644 --- a/interface/src/commerce/Ledger.cpp +++ b/interface/src/commerce/Ledger.cpp @@ -94,7 +94,9 @@ void Ledger::receiveAtSuccess(QNetworkReply& reply) { QByteArray response = reply.readAll(); QJsonObject data = QJsonDocument::fromJson(response).object(); - if (data["status"] == "fail") { // Not on "The List" for receiving HFC + // ZRF FIXME! Change to something like `data["status"] == fail` + // Not on "The List" for receiving HFC + if (true) { wallet->setMustRegenerateKeypair(true); } } diff --git a/interface/src/commerce/QmlCommerce.cpp b/interface/src/commerce/QmlCommerce.cpp index f29e46d843..ebd2d9ae7c 100644 --- a/interface/src/commerce/QmlCommerce.cpp +++ b/interface/src/commerce/QmlCommerce.cpp @@ -57,6 +57,11 @@ void QmlCommerce::getWalletAuthenticatedStatus() { emit walletAuthenticatedStatusResult(wallet->walletIsAuthenticatedWithPassphrase()); } +void QmlCommerce::setMustRegenerateKeypair(const bool& val) { + auto wallet = DependencyManager::get(); + wallet->setMustRegenerateKeypair(val); +} + void QmlCommerce::getSecurityImage() { auto wallet = DependencyManager::get(); wallet->getSecurityImage(); diff --git a/interface/src/commerce/QmlCommerce.h b/interface/src/commerce/QmlCommerce.h index d4f4aa35d2..a4e2ab8f42 100644 --- a/interface/src/commerce/QmlCommerce.h +++ b/interface/src/commerce/QmlCommerce.h @@ -54,6 +54,7 @@ protected: Q_INVOKABLE void getKeyFilePathIfExists(); Q_INVOKABLE void getSecurityImage(); Q_INVOKABLE void getWalletAuthenticatedStatus(); + Q_INVOKABLE void setMustRegenerateKeypair(const bool& val); Q_INVOKABLE void chooseSecurityImage(const QString& imageFile); Q_INVOKABLE void setPassphrase(const QString& passphrase); diff --git a/interface/src/commerce/Wallet.cpp b/interface/src/commerce/Wallet.cpp index fa72d02cca..07861d0633 100644 --- a/interface/src/commerce/Wallet.cpp +++ b/interface/src/commerce/Wallet.cpp @@ -328,9 +328,9 @@ Wallet::Wallet() { auto walletScriptingInterface = DependencyManager::get(); uint status; - if (_mustRegenerateKeypair || (!_passphrase->isEmpty() && _publicKeys.count() == 0)) { + if (_mustRegenerateKeypair || getKeyFilePath() == "") { qCDebug(commerce) << "Regenerating keys and resetting user_hfc_account. _mustRegenerateKeypair:" - << _mustRegenerateKeypair << "_publicKeys.count():" << _publicKeys.count(); + << _mustRegenerateKeypair << "keyFilePath:" << getKeyFilePath(); _mustRegenerateKeypair = false; resetKeysOnly(); ledger->reset(); @@ -535,25 +535,32 @@ bool Wallet::generateKeyPair() { // FIXME: initialize OpenSSL elsewhere soon initialize(); - qCInfo(commerce) << "Generating keypair."; - auto keyPair = generateRSAKeypair(); - - writeBackupInstructions(); - - // TODO: redo this soon -- need error checking and so on - writeSecurityImage(_securityImage, keyFilePath()); + qCInfo(commerce) << "Generating keypair..."; + QPair keyPair = generateRSAKeypair(); QString oldKey = _publicKeys.count() == 0 ? "" : _publicKeys.last(); - QString key = keyPair.first->toBase64(); - _publicKeys.push_back(key); - qCDebug(commerce) << "public key:" << key; + if (keyPair.first) { + writeBackupInstructions(); - // It's arguable whether we want to change the receiveAt every time, but: - // 1. It's certainly needed the first time, when createIfNeeded answers true. - // 2. It is maximally private, and we can step back from that later if desired. - // 3. It maximally exercises all the machinery, so we are most likely to surface issues now. - auto ledger = DependencyManager::get(); - QString machineFingerprint = uuidStringWithoutCurlyBraces(FingerprintUtils::getMachineFingerprint()); - return ledger->receiveAt(key, oldKey, machineFingerprint); + // TODO: redo this soon -- need error checking and so on + if (_securityImage) { + writeSecurityImage(_securityImage, keyFilePath()); + } + + QString key = keyPair.first->toBase64(); + _publicKeys.push_back(key); + qCDebug(commerce) << "public key:" << key; + + // It's arguable whether we want to change the receiveAt every time, but: + // 1. It's certainly needed the first time, when createIfNeeded answers true. + // 2. It is maximally private, and we can step back from that later if desired. + // 3. It maximally exercises all the machinery, so we are most likely to surface issues now. + auto ledger = DependencyManager::get(); + QString machineFingerprint = uuidStringWithoutCurlyBraces(FingerprintUtils::getMachineFingerprint()); + return ledger->receiveAt(key, oldKey, machineFingerprint); + } else { + qCDebug(commerce) << "Failure generating keys!"; + return false; + } } QStringList Wallet::listPublicKeys() { From 7995f50fab0cc1cd945b3deb572567ea2cb74c45 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 8 Nov 2017 12:52:53 -0800 Subject: [PATCH 6/8] Fix seeding --- interface/src/commerce/Ledger.cpp | 2 +- interface/src/commerce/Wallet.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/src/commerce/Ledger.cpp b/interface/src/commerce/Ledger.cpp index 519c906fd8..b344e00430 100644 --- a/interface/src/commerce/Ledger.cpp +++ b/interface/src/commerce/Ledger.cpp @@ -111,7 +111,7 @@ bool Ledger::receiveAt(const QString& hfc_key, const QString& old_key, const QSt } QJsonObject transaction; - transaction["hfc_key"] = hfc_key; + transaction["public_key"] = hfc_key; transaction["machine_fingerprint"] = machine_fingerprint; QJsonDocument transactionDoc{ transaction }; auto transactionString = transactionDoc.toJson(QJsonDocument::Compact); diff --git a/interface/src/commerce/Wallet.cpp b/interface/src/commerce/Wallet.cpp index 07861d0633..05c356cea9 100644 --- a/interface/src/commerce/Wallet.cpp +++ b/interface/src/commerce/Wallet.cpp @@ -333,8 +333,8 @@ Wallet::Wallet() { << _mustRegenerateKeypair << "keyFilePath:" << getKeyFilePath(); _mustRegenerateKeypair = false; resetKeysOnly(); - ledger->reset(); - generateKeyPair(); + ledger->reset(); // Hits `reset_user_hfc_account` endpoint + generateKeyPair(); // Hits `receive_at` endpoint } if (wallet->getKeyFilePath() == "" || !wallet->getSecurityImage()) { From 38fde43009e4221030b89285791f9e397d6f2548 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 8 Nov 2017 13:19:47 -0800 Subject: [PATCH 7/8] ...simplify your life --- .../qml/hifi/commerce/wallet/WalletHome.qml | 4 -- interface/src/commerce/Ledger.cpp | 13 +--- interface/src/commerce/QmlCommerce.cpp | 5 -- interface/src/commerce/QmlCommerce.h | 1 - interface/src/commerce/Wallet.cpp | 61 +++++++------------ interface/src/commerce/Wallet.h | 5 -- 6 files changed, 22 insertions(+), 67 deletions(-) diff --git a/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml b/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml index 44d3d54f58..fd7ce0fdfd 100644 --- a/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml +++ b/interface/resources/qml/hifi/commerce/wallet/WalletHome.qml @@ -43,10 +43,6 @@ Item { calculatePendingAndInvalidated(); } - - if (transactionHistoryModel.count === 0) { - commerce.setMustRegenerateKeypair(true); - } refreshTimer.start(); } } diff --git a/interface/src/commerce/Ledger.cpp b/interface/src/commerce/Ledger.cpp index b344e00430..49ae1bc18c 100644 --- a/interface/src/commerce/Ledger.cpp +++ b/interface/src/commerce/Ledger.cpp @@ -43,6 +43,7 @@ QJsonObject Ledger::failResponse(const QString& label, QNetworkReply& reply) { #define FailHandler(NAME) void Ledger::NAME##Failure(QNetworkReply& reply) { emit NAME##Result(failResponse(#NAME, reply)); } #define Handler(NAME) ApiHandler(NAME) FailHandler(NAME) Handler(buy) +Handler(receiveAt) Handler(balance) Handler(inventory) @@ -89,18 +90,6 @@ void Ledger::buy(const QString& hfc_key, int cost, const QString& asset_id, cons signedSend("transaction", transactionString, hfc_key, "buy", "buySuccess", "buyFailure", controlled_failure); } -void Ledger::receiveAtSuccess(QNetworkReply& reply) { - auto wallet = DependencyManager::get(); - QByteArray response = reply.readAll(); - QJsonObject data = QJsonDocument::fromJson(response).object(); - - // ZRF FIXME! Change to something like `data["status"] == fail` - // Not on "The List" for receiving HFC - if (true) { - wallet->setMustRegenerateKeypair(true); - } -} -void Ledger::receiveAtFailure(QNetworkReply& reply) { failResponse("receiveAt", reply); } bool Ledger::receiveAt(const QString& hfc_key, const QString& old_key, const QString& machine_fingerprint) { auto accountManager = DependencyManager::get(); if (!accountManager->isLoggedIn()) { diff --git a/interface/src/commerce/QmlCommerce.cpp b/interface/src/commerce/QmlCommerce.cpp index ebd2d9ae7c..f29e46d843 100644 --- a/interface/src/commerce/QmlCommerce.cpp +++ b/interface/src/commerce/QmlCommerce.cpp @@ -57,11 +57,6 @@ void QmlCommerce::getWalletAuthenticatedStatus() { emit walletAuthenticatedStatusResult(wallet->walletIsAuthenticatedWithPassphrase()); } -void QmlCommerce::setMustRegenerateKeypair(const bool& val) { - auto wallet = DependencyManager::get(); - wallet->setMustRegenerateKeypair(val); -} - void QmlCommerce::getSecurityImage() { auto wallet = DependencyManager::get(); wallet->getSecurityImage(); diff --git a/interface/src/commerce/QmlCommerce.h b/interface/src/commerce/QmlCommerce.h index a4e2ab8f42..d4f4aa35d2 100644 --- a/interface/src/commerce/QmlCommerce.h +++ b/interface/src/commerce/QmlCommerce.h @@ -54,7 +54,6 @@ protected: Q_INVOKABLE void getKeyFilePathIfExists(); Q_INVOKABLE void getSecurityImage(); Q_INVOKABLE void getWalletAuthenticatedStatus(); - Q_INVOKABLE void setMustRegenerateKeypair(const bool& val); Q_INVOKABLE void chooseSecurityImage(const QString& imageFile); Q_INVOKABLE void setPassphrase(const QString& passphrase); diff --git a/interface/src/commerce/Wallet.cpp b/interface/src/commerce/Wallet.cpp index 05c356cea9..9bc8dc9e43 100644 --- a/interface/src/commerce/Wallet.cpp +++ b/interface/src/commerce/Wallet.cpp @@ -324,19 +324,9 @@ Wallet::Wallet() { connect(ledger.data(), &Ledger::accountResult, this, [&]() { auto wallet = DependencyManager::get(); - auto ledger = DependencyManager::get(); auto walletScriptingInterface = DependencyManager::get(); uint status; - if (_mustRegenerateKeypair || getKeyFilePath() == "") { - qCDebug(commerce) << "Regenerating keys and resetting user_hfc_account. _mustRegenerateKeypair:" - << _mustRegenerateKeypair << "keyFilePath:" << getKeyFilePath(); - _mustRegenerateKeypair = false; - resetKeysOnly(); - ledger->reset(); // Hits `reset_user_hfc_account` endpoint - generateKeyPair(); // Hits `receive_at` endpoint - } - if (wallet->getKeyFilePath() == "" || !wallet->getSecurityImage()) { status = (uint)WalletStatus::WALLET_STATUS_NOT_SET_UP; } else if (!wallet->walletIsAuthenticatedWithPassphrase()) { @@ -535,32 +525,25 @@ bool Wallet::generateKeyPair() { // FIXME: initialize OpenSSL elsewhere soon initialize(); - qCInfo(commerce) << "Generating keypair..."; - QPair keyPair = generateRSAKeypair(); + qCInfo(commerce) << "Generating keypair."; + auto keyPair = generateRSAKeypair(); + + writeBackupInstructions(); + + // TODO: redo this soon -- need error checking and so on + writeSecurityImage(_securityImage, keyFilePath()); QString oldKey = _publicKeys.count() == 0 ? "" : _publicKeys.last(); - if (keyPair.first) { - writeBackupInstructions(); + QString key = keyPair.first->toBase64(); + _publicKeys.push_back(key); + qCDebug(commerce) << "public key:" << key; - // TODO: redo this soon -- need error checking and so on - if (_securityImage) { - writeSecurityImage(_securityImage, keyFilePath()); - } - - QString key = keyPair.first->toBase64(); - _publicKeys.push_back(key); - qCDebug(commerce) << "public key:" << key; - - // It's arguable whether we want to change the receiveAt every time, but: - // 1. It's certainly needed the first time, when createIfNeeded answers true. - // 2. It is maximally private, and we can step back from that later if desired. - // 3. It maximally exercises all the machinery, so we are most likely to surface issues now. - auto ledger = DependencyManager::get(); - QString machineFingerprint = uuidStringWithoutCurlyBraces(FingerprintUtils::getMachineFingerprint()); - return ledger->receiveAt(key, oldKey, machineFingerprint); - } else { - qCDebug(commerce) << "Failure generating keys!"; - return false; - } + // It's arguable whether we want to change the receiveAt every time, but: + // 1. It's certainly needed the first time, when createIfNeeded answers true. + // 2. It is maximally private, and we can step back from that later if desired. + // 3. It maximally exercises all the machinery, so we are most likely to surface issues now. + auto ledger = DependencyManager::get(); + QString machineFingerprint = uuidStringWithoutCurlyBraces(FingerprintUtils::getMachineFingerprint()); + return ledger->receiveAt(key, oldKey, machineFingerprint); } QStringList Wallet::listPublicKeys() { @@ -678,13 +661,9 @@ QString Wallet::getKeyFilePath() { } } -void Wallet::resetKeysOnly() { +void Wallet::reset() { _publicKeys.clear(); - QFile keyFile(keyFilePath()); - keyFile.remove(); -} -void Wallet::reset() { delete _securityImage; _securityImage = nullptr; @@ -692,7 +671,9 @@ void Wallet::reset() { updateImageProvider(); _passphrase->clear(); - resetKeysOnly(); + + QFile keyFile(keyFilePath()); + keyFile.remove(); } bool Wallet::writeWallet(const QString& newPassphrase) { RSA* keys = readKeys(keyFilePath().toStdString().c_str()); diff --git a/interface/src/commerce/Wallet.h b/interface/src/commerce/Wallet.h index f0f13aaf6e..ed145df451 100644 --- a/interface/src/commerce/Wallet.h +++ b/interface/src/commerce/Wallet.h @@ -49,7 +49,6 @@ public: bool walletIsAuthenticatedWithPassphrase(); bool changePassphrase(const QString& newPassphrase); - void resetKeysOnly(); void reset(); void getWalletStatus(); @@ -60,8 +59,6 @@ public: WALLET_STATUS_READY }; - void setMustRegenerateKeypair(const bool& val) { _mustRegenerateKeypair = val; } - signals: void securityImageResult(bool exists); void keyFilePathIfExistsResult(const QString& path); @@ -86,8 +83,6 @@ private: bool writeBackupInstructions(); void account(); - - bool _mustRegenerateKeypair { false }; }; #endif // hifi_Wallet_h From 19b7c6e025113eceeb40d2b1fbb1ce39543a011e Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 8 Nov 2017 17:14:14 -0800 Subject: [PATCH 8/8] Remove machine fingerprint from receiveAt --- interface/src/commerce/Ledger.cpp | 10 ++-------- interface/src/commerce/Ledger.h | 2 +- interface/src/commerce/Wallet.cpp | 4 +--- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/interface/src/commerce/Ledger.cpp b/interface/src/commerce/Ledger.cpp index 49ae1bc18c..904847cb5f 100644 --- a/interface/src/commerce/Ledger.cpp +++ b/interface/src/commerce/Ledger.cpp @@ -90,7 +90,7 @@ void Ledger::buy(const QString& hfc_key, int cost, const QString& asset_id, cons signedSend("transaction", transactionString, hfc_key, "buy", "buySuccess", "buyFailure", controlled_failure); } -bool Ledger::receiveAt(const QString& hfc_key, const QString& old_key, const QString& machine_fingerprint) { +bool Ledger::receiveAt(const QString& hfc_key, const QString& old_key) { auto accountManager = DependencyManager::get(); if (!accountManager->isLoggedIn()) { qCWarning(commerce) << "Cannot set receiveAt when not logged in."; @@ -99,13 +99,7 @@ bool Ledger::receiveAt(const QString& hfc_key, const QString& old_key, const QSt return false; // We know right away that we will fail, so tell the caller. } - QJsonObject transaction; - transaction["public_key"] = hfc_key; - transaction["machine_fingerprint"] = machine_fingerprint; - QJsonDocument transactionDoc{ transaction }; - auto transactionString = transactionDoc.toJson(QJsonDocument::Compact); - - signedSend("transaction", transactionString, old_key, "receive_at", "receiveAtSuccess", "receiveAtFailure"); + signedSend("public_key", hfc_key.toUtf8(), old_key, "receive_at", "receiveAtSuccess", "receiveAtFailure"); return true; // Note that there may still be an asynchronous signal of failure that callers might be interested in. } diff --git a/interface/src/commerce/Ledger.h b/interface/src/commerce/Ledger.h index 54f3f780f3..42eb0ffc49 100644 --- a/interface/src/commerce/Ledger.h +++ b/interface/src/commerce/Ledger.h @@ -26,7 +26,7 @@ class Ledger : public QObject, public Dependency { public: void buy(const QString& hfc_key, int cost, const QString& asset_id, const QString& inventory_key, const bool controlled_failure = false); - bool receiveAt(const QString& hfc_key, const QString& old_key, const QString& machine_fingerprint); + bool receiveAt(const QString& hfc_key, const QString& old_key); void balance(const QStringList& keys); void inventory(const QStringList& keys); void history(const QStringList& keys); diff --git a/interface/src/commerce/Wallet.cpp b/interface/src/commerce/Wallet.cpp index 9bc8dc9e43..85632ff8f1 100644 --- a/interface/src/commerce/Wallet.cpp +++ b/interface/src/commerce/Wallet.cpp @@ -16,7 +16,6 @@ #include "ui/ImageProvider.h" #include "scripting/HMDScriptingInterface.h" -#include #include #include #include @@ -542,8 +541,7 @@ bool Wallet::generateKeyPair() { // 2. It is maximally private, and we can step back from that later if desired. // 3. It maximally exercises all the machinery, so we are most likely to surface issues now. auto ledger = DependencyManager::get(); - QString machineFingerprint = uuidStringWithoutCurlyBraces(FingerprintUtils::getMachineFingerprint()); - return ledger->receiveAt(key, oldKey, machineFingerprint); + return ledger->receiveAt(key, oldKey); } QStringList Wallet::listPublicKeys() {