@@ -226,7 +226,7 @@ void PaymentServer::ipcParseCommandLine(int argc, char* argv[])
226
226
savedPaymentRequests.append (arg);
227
227
228
228
PaymentRequestPlus request;
229
- if (readPaymentRequest (arg, request))
229
+ if (readPaymentRequestFromFile (arg, request))
230
230
{
231
231
if (request.getDetails ().network () == " main" )
232
232
{
@@ -452,7 +452,7 @@ void PaymentServer::handleURIOrFile(const QString& s)
452
452
{
453
453
PaymentRequestPlus request;
454
454
SendCoinsRecipient recipient;
455
- if (!readPaymentRequest (s, request))
455
+ if (!readPaymentRequestFromFile (s, request))
456
456
{
457
457
emit message (tr (" Payment request file handling" ),
458
458
tr (" Payment request file cannot be read! This can be caused by an invalid payment request file." ),
@@ -486,18 +486,25 @@ void PaymentServer::handleURIConnection()
486
486
handleURIOrFile (msg);
487
487
}
488
488
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)
490
494
{
491
495
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);
495
498
return false ;
496
499
}
497
500
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);
501
508
return false ;
502
509
}
503
510
@@ -657,13 +664,26 @@ void PaymentServer::fetchPaymentACK(CWallet* wallet, SendCoinsRecipient recipien
657
664
void PaymentServer::netRequestFinished (QNetworkReply* reply)
658
665
{
659
666
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) {
662
682
QString msg = tr (" Error communicating with %1: %2" )
663
683
.arg (reply->request ().url ().toString ())
664
684
.arg (reply->errorString ());
665
685
666
- qWarning () << " PaymentServer::netRequestFinished : " << msg;
686
+ qWarning () << " PaymentServer::netRequestFinished: " << msg;
667
687
emit message (tr (" Payment request error" ), msg, CClientUIInterface::MSG_ERROR);
668
688
return ;
669
689
}
0 commit comments