Remove direct bitcoin calls from qt/paymentserver.cpp

This commit is contained in:
Russell Yanofsky 2018-03-23 17:14:39 -04:00 committed by John Newbery
parent 3ec2ebcd9b
commit 3cab2ce5f9
8 changed files with 29 additions and 26 deletions

View file

@ -56,6 +56,7 @@ class NodeImpl : public Node
bool softSetArg(const std::string& arg, const std::string& value) override { return gArgs.SoftSetArg(arg, value); } bool softSetArg(const std::string& arg, const std::string& value) override { return gArgs.SoftSetArg(arg, value); }
bool softSetBoolArg(const std::string& arg, bool value) override { return gArgs.SoftSetBoolArg(arg, value); } bool softSetBoolArg(const std::string& arg, bool value) override { return gArgs.SoftSetBoolArg(arg, value); }
void selectParams(const std::string& network) override { SelectParams(network); } void selectParams(const std::string& network) override { SelectParams(network); }
std::string getNetwork() override { return Params().NetworkIDString(); }
void initLogging() override { InitLogging(); } void initLogging() override { InitLogging(); }
void initParameterInteraction() override { InitParameterInteraction(); } void initParameterInteraction() override { InitParameterInteraction(); }
std::string getWarnings(const std::string& type) override { return GetWarnings(type); } std::string getWarnings(const std::string& type) override { return GetWarnings(type); }

View file

@ -54,6 +54,9 @@ public:
//! Choose network parameters. //! Choose network parameters.
virtual void selectParams(const std::string& network) = 0; virtual void selectParams(const std::string& network) = 0;
//! Get network name.
virtual std::string getNetwork() = 0;
//! Init logging. //! Init logging.
virtual void initLogging() = 0; virtual void initLogging() = 0;

View file

@ -476,8 +476,8 @@ void BitcoinApplication::initializeResult(bool success)
fFirstWallet = false; fFirstWallet = false;
} }
connect(walletModel, SIGNAL(coinsSent(CWallet*,SendCoinsRecipient,QByteArray)), connect(walletModel, SIGNAL(coinsSent(WalletModel*,SendCoinsRecipient,QByteArray)),
paymentServer, SLOT(fetchPaymentACK(CWallet*,const SendCoinsRecipient&,QByteArray))); paymentServer, SLOT(fetchPaymentACK(WalletModel*,const SendCoinsRecipient&,QByteArray)));
m_wallet_models.push_back(walletModel); m_wallet_models.push_back(walletModel);
} }
@ -638,7 +638,7 @@ int main(int argc, char *argv[])
} }
#ifdef ENABLE_WALLET #ifdef ENABLE_WALLET
// Parse URIs on command line -- this can affect Params() // Parse URIs on command line -- this can affect Params()
PaymentServer::ipcParseCommandLine(argc, argv); PaymentServer::ipcParseCommandLine(*node, argc, argv);
#endif #endif
QScopedPointer<const NetworkStyle> networkStyle(NetworkStyle::instantiate(QString::fromStdString(Params().NetworkIDString()))); QScopedPointer<const NetworkStyle> networkStyle(NetworkStyle::instantiate(QString::fromStdString(Params().NetworkIDString())));

View file

@ -9,6 +9,7 @@
#include <qt/optionsmodel.h> #include <qt/optionsmodel.h>
#include <chainparams.h> #include <chainparams.h>
#include <interface/node.h>
#include <policy/policy.h> #include <policy/policy.h>
#include <key_io.h> #include <key_io.h>
#include <ui_interface.h> #include <ui_interface.h>
@ -199,7 +200,7 @@ void PaymentServer::LoadRootCAs(X509_STORE* _store)
// Warning: ipcSendCommandLine() is called early in init, // Warning: ipcSendCommandLine() is called early in init,
// so don't use "Q_EMIT message()", but "QMessageBox::"! // so don't use "Q_EMIT message()", but "QMessageBox::"!
// //
void PaymentServer::ipcParseCommandLine(int argc, char* argv[]) void PaymentServer::ipcParseCommandLine(interface::Node& node, int argc, char* argv[])
{ {
for (int i = 1; i < argc; i++) for (int i = 1; i < argc; i++)
{ {
@ -221,11 +222,11 @@ void PaymentServer::ipcParseCommandLine(int argc, char* argv[])
auto tempChainParams = CreateChainParams(CBaseChainParams::MAIN); auto tempChainParams = CreateChainParams(CBaseChainParams::MAIN);
if (IsValidDestinationString(r.address.toStdString(), *tempChainParams)) { if (IsValidDestinationString(r.address.toStdString(), *tempChainParams)) {
SelectParams(CBaseChainParams::MAIN); node.selectParams(CBaseChainParams::MAIN);
} else { } else {
tempChainParams = CreateChainParams(CBaseChainParams::TESTNET); tempChainParams = CreateChainParams(CBaseChainParams::TESTNET);
if (IsValidDestinationString(r.address.toStdString(), *tempChainParams)) { if (IsValidDestinationString(r.address.toStdString(), *tempChainParams)) {
SelectParams(CBaseChainParams::TESTNET); node.selectParams(CBaseChainParams::TESTNET);
} }
} }
} }
@ -239,11 +240,11 @@ void PaymentServer::ipcParseCommandLine(int argc, char* argv[])
{ {
if (request.getDetails().network() == "main") if (request.getDetails().network() == "main")
{ {
SelectParams(CBaseChainParams::MAIN); node.selectParams(CBaseChainParams::MAIN);
} }
else if (request.getDetails().network() == "test") else if (request.getDetails().network() == "test")
{ {
SelectParams(CBaseChainParams::TESTNET); node.selectParams(CBaseChainParams::TESTNET);
} }
} }
} }
@ -526,7 +527,7 @@ bool PaymentServer::processPaymentRequest(const PaymentRequestPlus& request, Sen
if (request.IsInitialized()) { if (request.IsInitialized()) {
// Payment request network matches client network? // Payment request network matches client network?
if (!verifyNetwork(request.getDetails())) { if (!verifyNetwork(optionsModel->node(), request.getDetails())) {
Q_EMIT message(tr("Payment request rejected"), tr("Payment request network doesn't match client network."), Q_EMIT message(tr("Payment request rejected"), tr("Payment request network doesn't match client network."),
CClientUIInterface::MSG_ERROR); CClientUIInterface::MSG_ERROR);
@ -583,7 +584,7 @@ bool PaymentServer::processPaymentRequest(const PaymentRequestPlus& request, Sen
// Extract and check amounts // Extract and check amounts
CTxOut txOut(sendingTo.second, sendingTo.first); CTxOut txOut(sendingTo.second, sendingTo.first);
if (IsDust(txOut, ::dustRelayFee)) { if (IsDust(txOut, optionsModel->node().getDustRelayFee())) {
Q_EMIT message(tr("Payment request error"), tr("Requested payment amount of %1 is too small (considered dust).") Q_EMIT message(tr("Payment request error"), tr("Requested payment amount of %1 is too small (considered dust).")
.arg(BitcoinUnits::formatWithUnit(optionsModel->getDisplayUnit(), sendingTo.second)), .arg(BitcoinUnits::formatWithUnit(optionsModel->getDisplayUnit(), sendingTo.second)),
CClientUIInterface::MSG_ERROR); CClientUIInterface::MSG_ERROR);
@ -621,7 +622,7 @@ void PaymentServer::fetchRequest(const QUrl& url)
netManager->get(netRequest); netManager->get(netRequest);
} }
void PaymentServer::fetchPaymentACK(CWallet* wallet, const SendCoinsRecipient& recipient, QByteArray transaction) void PaymentServer::fetchPaymentACK(WalletModel* walletModel, const SendCoinsRecipient& recipient, QByteArray transaction)
{ {
const payments::PaymentDetails& details = recipient.paymentRequest.getDetails(); const payments::PaymentDetails& details = recipient.paymentRequest.getDetails();
if (!details.has_payment_url()) if (!details.has_payment_url())
@ -640,17 +641,17 @@ void PaymentServer::fetchPaymentACK(CWallet* wallet, const SendCoinsRecipient& r
// Create a new refund address, or re-use: // Create a new refund address, or re-use:
CPubKey newKey; CPubKey newKey;
if (wallet->GetKeyFromPool(newKey)) { if (walletModel->wallet().getKeyFromPool(false /* internal */, newKey)) {
// BIP70 requests encode the scriptPubKey directly, so we are not restricted to address // BIP70 requests encode the scriptPubKey directly, so we are not restricted to address
// types supported by the receiver. As a result, we choose the address format we also // types supported by the receiver. As a result, we choose the address format we also
// use for change. Despite an actual payment and not change, this is a close match: // use for change. Despite an actual payment and not change, this is a close match:
// it's the output type we use subject to privacy issues, but not restricted by what // it's the output type we use subject to privacy issues, but not restricted by what
// other software supports. // other software supports.
const OutputType change_type = wallet->m_default_change_type != OutputType::NONE ? wallet->m_default_change_type : wallet->m_default_address_type; const OutputType change_type = walletModel->wallet().getDefaultChangeType() != OutputType::NONE ? walletModel->wallet().getDefaultChangeType() : walletModel->wallet().getDefaultAddressType();
wallet->LearnRelatedScripts(newKey, change_type); walletModel->wallet().learnRelatedScripts(newKey, change_type);
CTxDestination dest = GetDestinationForKey(newKey, change_type); CTxDestination dest = GetDestinationForKey(newKey, change_type);
std::string label = tr("Refund from %1").arg(recipient.authenticatedMerchant).toStdString(); std::string label = tr("Refund from %1").arg(recipient.authenticatedMerchant).toStdString();
wallet->SetAddressBook(dest, label, "refund"); walletModel->wallet().setAddressBook(dest, label, "refund");
CScript s = GetScriptForDestination(dest); CScript s = GetScriptForDestination(dest);
payments::Output* refund_to = payment.add_refund_to(); payments::Output* refund_to = payment.add_refund_to();
@ -758,14 +759,14 @@ void PaymentServer::handlePaymentACK(const QString& paymentACKMsg)
Q_EMIT message(tr("Payment acknowledged"), paymentACKMsg, CClientUIInterface::ICON_INFORMATION | CClientUIInterface::MODAL); Q_EMIT message(tr("Payment acknowledged"), paymentACKMsg, CClientUIInterface::ICON_INFORMATION | CClientUIInterface::MODAL);
} }
bool PaymentServer::verifyNetwork(const payments::PaymentDetails& requestDetails) bool PaymentServer::verifyNetwork(interface::Node& node, const payments::PaymentDetails& requestDetails)
{ {
bool fVerified = requestDetails.network() == Params().NetworkIDString(); bool fVerified = requestDetails.network() == node.getNetwork();
if (!fVerified) { if (!fVerified) {
qWarning() << QString("PaymentServer::%1: Payment request network \"%2\" doesn't match client network \"%3\".") qWarning() << QString("PaymentServer::%1: Payment request network \"%2\" doesn't match client network \"%3\".")
.arg(__func__) .arg(__func__)
.arg(QString::fromStdString(requestDetails.network())) .arg(QString::fromStdString(requestDetails.network()))
.arg(QString::fromStdString(Params().NetworkIDString())); .arg(QString::fromStdString(node.getNetwork()));
} }
return fVerified; return fVerified;
} }

View file

@ -40,8 +40,6 @@
class OptionsModel; class OptionsModel;
class CWallet;
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QApplication; class QApplication;
class QByteArray; class QByteArray;
@ -62,7 +60,7 @@ class PaymentServer : public QObject
public: public:
// Parse URIs on command line // Parse URIs on command line
// Returns false on error // Returns false on error
static void ipcParseCommandLine(int argc, char *argv[]); static void ipcParseCommandLine(interface::Node& node, int argc, char *argv[]);
// Returns true if there were URIs on the command line // Returns true if there were URIs on the command line
// which were successfully sent to an already-running // which were successfully sent to an already-running
@ -89,7 +87,7 @@ public:
void setOptionsModel(OptionsModel *optionsModel); void setOptionsModel(OptionsModel *optionsModel);
// Verify that the payment request network matches the client network // Verify that the payment request network matches the client network
static bool verifyNetwork(const payments::PaymentDetails& requestDetails); static bool verifyNetwork(interface::Node& node, const payments::PaymentDetails& requestDetails);
// Verify if the payment request is expired // Verify if the payment request is expired
static bool verifyExpired(const payments::PaymentDetails& requestDetails); static bool verifyExpired(const payments::PaymentDetails& requestDetails);
// Verify the payment request size is valid as per BIP70 // Verify the payment request size is valid as per BIP70
@ -113,7 +111,7 @@ public Q_SLOTS:
void uiReady(); void uiReady();
// Submit Payment message to a merchant, get back PaymentACK: // Submit Payment message to a merchant, get back PaymentACK:
void fetchPaymentACK(CWallet* wallet, const SendCoinsRecipient& recipient, QByteArray transaction); void fetchPaymentACK(WalletModel* walletModel, const SendCoinsRecipient& recipient, QByteArray transaction);
// Handle an incoming URI, URI with local file scheme or file // Handle an incoming URI, URI with local file scheme or file
void handleURIOrFile(const QString& s); void handleURIOrFile(const QString& s);

View file

@ -147,7 +147,7 @@ void PaymentServerTests::paymentServerTests()
// Ensure the request is initialized, because network "main" is default, even for // Ensure the request is initialized, because network "main" is default, even for
// uninitialized payment requests and that will fail our test here. // uninitialized payment requests and that will fail our test here.
QVERIFY(r.paymentRequest.IsInitialized()); QVERIFY(r.paymentRequest.IsInitialized());
QCOMPARE(PaymentServer::verifyNetwork(r.paymentRequest.getDetails()), false); QCOMPARE(PaymentServer::verifyNetwork(*node, r.paymentRequest.getDetails()), false);
// Expired payment request (expires is set to 1 = 1970-01-01 00:00:01): // Expired payment request (expires is set to 1 = 1970-01-01 00:00:01):
data = DecodeBase64(paymentrequest2_cert2_BASE64); data = DecodeBase64(paymentrequest2_cert2_BASE64);

View file

@ -295,7 +295,7 @@ WalletModel::SendCoinsReturn WalletModel::sendCoins(WalletModelTransaction &tran
} }
} }
} }
Q_EMIT coinsSent(cwallet, rcp, transaction_array); Q_EMIT coinsSent(this, rcp, transaction_array);
} }
checkBalanceChanged(m_wallet->getBalances()); // update balance immediately, otherwise there could be a short noticeable delay until pollBalanceChanged hits checkBalanceChanged(m_wallet->getBalances()); // update balance immediately, otherwise there could be a short noticeable delay until pollBalanceChanged hits

View file

@ -253,7 +253,7 @@ Q_SIGNALS:
void message(const QString &title, const QString &message, unsigned int style); void message(const QString &title, const QString &message, unsigned int style);
// Coins sent: from wallet, to recipient, in (serialized) transaction: // Coins sent: from wallet, to recipient, in (serialized) transaction:
void coinsSent(CWallet* wallet, SendCoinsRecipient recipient, QByteArray transaction); void coinsSent(WalletModel* wallet, SendCoinsRecipient recipient, QByteArray transaction);
// Show progress dialog e.g. for rescan // Show progress dialog e.g. for rescan
void showProgress(const QString &title, int nProgress); void showProgress(const QString &title, int nProgress);