Skip to content

Commit 31f8494

Browse files
author
Philip Kaufmann
committed
[Qt] add BIP70 payment request size DoS protection for URIs
- current code only does this for payment request files, which are used on Mac - also rename readPaymentRequest to readPaymentRequestFromFile, so it's obvious that function only handles payment request files and not URIs - small logging changes in readPaymentRequestFromFile
1 parent 2284ccb commit 31f8494

File tree

2 files changed

+33
-13
lines changed

2 files changed

+33
-13
lines changed

src/qt/paymentserver.cpp

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ void PaymentServer::ipcParseCommandLine(int argc, char* argv[])
226226
savedPaymentRequests.append(arg);
227227

228228
PaymentRequestPlus request;
229-
if (readPaymentRequest(arg, request))
229+
if (readPaymentRequestFromFile(arg, request))
230230
{
231231
if (request.getDetails().network() == "main")
232232
{
@@ -452,7 +452,7 @@ void PaymentServer::handleURIOrFile(const QString& s)
452452
{
453453
PaymentRequestPlus request;
454454
SendCoinsRecipient recipient;
455-
if (!readPaymentRequest(s, request))
455+
if (!readPaymentRequestFromFile(s, request))
456456
{
457457
emit message(tr("Payment request file handling"),
458458
tr("Payment request file cannot be read! This can be caused by an invalid payment request file."),
@@ -486,18 +486,25 @@ void PaymentServer::handleURIConnection()
486486
handleURIOrFile(msg);
487487
}
488488

489-
bool PaymentServer::readPaymentRequest(const QString& filename, PaymentRequestPlus& request)
489+
//
490+
// Warning: readPaymentRequestFromFile() is used in ipcSendCommandLine()
491+
// so don't use "emit message()", but "QMessageBox::"!
492+
//
493+
bool PaymentServer::readPaymentRequestFromFile(const QString& filename, PaymentRequestPlus& request)
490494
{
491495
QFile f(filename);
492-
if (!f.open(QIODevice::ReadOnly))
493-
{
494-
qWarning() << "PaymentServer::readPaymentRequest : Failed to open " << filename;
496+
if (!f.open(QIODevice::ReadOnly)) {
497+
qWarning() << QString("PaymentServer::%1: Failed to open %2").arg(__func__).arg(filename);
495498
return false;
496499
}
497500

498-
if (f.size() > BIP70_MAX_PAYMENTREQUEST_SIZE)
499-
{
500-
qWarning() << "PaymentServer::readPaymentRequest : " << filename << " too large";
501+
// BIP70 DoS protection
502+
if (f.size() > BIP70_MAX_PAYMENTREQUEST_SIZE) {
503+
qWarning() << QString("PaymentServer::%1: Payment request %2 is too large (%3 bytes, allowed %4 bytes).")
504+
.arg(__func__)
505+
.arg(filename)
506+
.arg(f.size())
507+
.arg(BIP70_MAX_PAYMENTREQUEST_SIZE);
501508
return false;
502509
}
503510

@@ -657,13 +664,26 @@ void PaymentServer::fetchPaymentACK(CWallet* wallet, SendCoinsRecipient recipien
657664
void PaymentServer::netRequestFinished(QNetworkReply* reply)
658665
{
659666
reply->deleteLater();
660-
if (reply->error() != QNetworkReply::NoError)
661-
{
667+
668+
// BIP70 DoS protection
669+
if (reply->size() > BIP70_MAX_PAYMENTREQUEST_SIZE) {
670+
QString msg = tr("Payment request %2 is too large (%3 bytes, allowed %4 bytes).")
671+
.arg(__func__)
672+
.arg(reply->request().url().toString())
673+
.arg(reply->size())
674+
.arg(BIP70_MAX_PAYMENTREQUEST_SIZE);
675+
676+
qWarning() << QString("PaymentServer::%1:").arg(__func__) << msg;
677+
emit message(tr("Payment request DoS protection"), msg, CClientUIInterface::MSG_ERROR);
678+
return;
679+
}
680+
681+
if (reply->error() != QNetworkReply::NoError) {
662682
QString msg = tr("Error communicating with %1: %2")
663683
.arg(reply->request().url().toString())
664684
.arg(reply->errorString());
665685

666-
qWarning() << "PaymentServer::netRequestFinished : " << msg;
686+
qWarning() << "PaymentServer::netRequestFinished: " << msg;
667687
emit message(tr("Payment request error"), msg, CClientUIInterface::MSG_ERROR);
668688
return;
669689
}

src/qt/paymentserver.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ private slots:
118118
bool eventFilter(QObject *object, QEvent *event);
119119

120120
private:
121-
static bool readPaymentRequest(const QString& filename, PaymentRequestPlus& request);
121+
static bool readPaymentRequestFromFile(const QString& filename, PaymentRequestPlus& request);
122122
bool processPaymentRequest(PaymentRequestPlus& request, SendCoinsRecipient& recipient);
123123
void fetchRequest(const QUrl& url);
124124

0 commit comments

Comments
 (0)