Changeset View
Changeset View
Standalone View
Standalone View
src/qt/test/paymentservertests.cpp
Show All 17 Lines | |||||
#include <openssl/x509_vfy.h> | #include <openssl/x509_vfy.h> | ||||
#include <QFileOpenEvent> | #include <QFileOpenEvent> | ||||
#include <QTemporaryFile> | #include <QTemporaryFile> | ||||
X509 *parse_b64der_cert(const char *cert_data) { | X509 *parse_b64der_cert(const char *cert_data) { | ||||
std::vector<uint8_t> data = DecodeBase64(cert_data); | std::vector<uint8_t> data = DecodeBase64(cert_data); | ||||
assert(data.size() > 0); | assert(data.size() > 0); | ||||
const uint8_t *dptr = &data[0]; | const uint8_t *dptr = data.data(); | ||||
X509 *cert = d2i_X509(nullptr, &dptr, data.size()); | X509 *cert = d2i_X509(nullptr, &dptr, data.size()); | ||||
assert(cert); | assert(cert); | ||||
return cert; | return cert; | ||||
} | } | ||||
// | // | ||||
// Test payment request handling | // Test payment request handling | ||||
// | // | ||||
static SendCoinsRecipient handleRequest(PaymentServer *server, | static SendCoinsRecipient handleRequest(PaymentServer *server, | ||||
std::vector<uint8_t> &data) { | std::vector<uint8_t> &data) { | ||||
RecipientCatcher sigCatcher; | RecipientCatcher sigCatcher; | ||||
QObject::connect(server, SIGNAL(receivedPaymentRequest(SendCoinsRecipient)), | QObject::connect(server, SIGNAL(receivedPaymentRequest(SendCoinsRecipient)), | ||||
&sigCatcher, SLOT(getRecipient(SendCoinsRecipient))); | &sigCatcher, SLOT(getRecipient(SendCoinsRecipient))); | ||||
// Write data to a temp file: | // Write data to a temp file: | ||||
QTemporaryFile f; | QTemporaryFile f; | ||||
f.open(); | f.open(); | ||||
f.write((const char *)&data[0], data.size()); | f.write((const char *)data.data(), data.size()); | ||||
f.close(); | f.close(); | ||||
// Create a QObject, install event filter from PaymentServer and send a file | // Create a QObject, install event filter from PaymentServer and send a file | ||||
// open event to the object | // open event to the object | ||||
QObject object; | QObject object; | ||||
object.installEventFilter(server); | object.installEventFilter(server); | ||||
QFileOpenEvent event(f.fileName()); | QFileOpenEvent event(f.fileName()); | ||||
// If sending the event fails, this will cause sigCatcher to be empty, which | // If sending the event fails, this will cause sigCatcher to be empty, which | ||||
▲ Show 20 Lines • Show All 82 Lines • ▼ Show 20 Lines | void PaymentServerTests::paymentServerTests() { | ||||
// -> PaymentServer::eventFilter() | // -> PaymentServer::eventFilter() | ||||
// -> PaymentServer::handleURIOrFile() | // -> PaymentServer::handleURIOrFile() | ||||
// -> PaymentServer::readPaymentRequestFromFile() | // -> PaymentServer::readPaymentRequestFromFile() | ||||
// -> PaymentServer::processPaymentRequest() | // -> PaymentServer::processPaymentRequest() | ||||
// Contains a testnet paytoaddress, so payment request network doesn't match | // Contains a testnet paytoaddress, so payment request network doesn't match | ||||
// client network: | // client network: | ||||
data = DecodeBase64(paymentrequest1_cert2_BASE64); | data = DecodeBase64(paymentrequest1_cert2_BASE64); | ||||
byteArray = QByteArray((const char *)&data[0], data.size()); | byteArray = QByteArray((const char *)data.data(), data.size()); | ||||
r.paymentRequest.parse(byteArray); | r.paymentRequest.parse(byteArray); | ||||
// Ensure the request is initialized, because network "main" is default, | // Ensure the request is initialized, because network "main" is default, | ||||
// even for uninitialized payment requests and that will fail our test here. | // even for uninitialized payment requests and that will fail our test here. | ||||
QVERIFY(r.paymentRequest.IsInitialized()); | QVERIFY(r.paymentRequest.IsInitialized()); | ||||
QCOMPARE(PaymentServer::verifyNetwork(*node, r.paymentRequest.getDetails()), | QCOMPARE(PaymentServer::verifyNetwork(*node, r.paymentRequest.getDetails()), | ||||
false); | 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); | ||||
byteArray = QByteArray((const char *)&data[0], data.size()); | byteArray = QByteArray((const char *)data.data(), data.size()); | ||||
r.paymentRequest.parse(byteArray); | r.paymentRequest.parse(byteArray); | ||||
// Ensure the request is initialized | // Ensure the request is initialized | ||||
QVERIFY(r.paymentRequest.IsInitialized()); | QVERIFY(r.paymentRequest.IsInitialized()); | ||||
// compares 1 < GetTime() == false (treated as expired payment request) | // compares 1 < GetTime() == false (treated as expired payment request) | ||||
QCOMPARE(PaymentServer::verifyExpired(r.paymentRequest.getDetails()), true); | QCOMPARE(PaymentServer::verifyExpired(r.paymentRequest.getDetails()), true); | ||||
// Unexpired payment request (expires is set to 0x7FFFFFFFFFFFFFFF = max. | // Unexpired payment request (expires is set to 0x7FFFFFFFFFFFFFFF = max. | ||||
// int64_t): | // int64_t): | ||||
// 9223372036854775807 (uint64), 9223372036854775807 (int64_t) and -1 | // 9223372036854775807 (uint64), 9223372036854775807 (int64_t) and -1 | ||||
// (int32_t) | // (int32_t) | ||||
// -1 is 1969-12-31 23:59:59 (for a 32 bit time values) | // -1 is 1969-12-31 23:59:59 (for a 32 bit time values) | ||||
data = DecodeBase64(paymentrequest3_cert2_BASE64); | data = DecodeBase64(paymentrequest3_cert2_BASE64); | ||||
byteArray = QByteArray((const char *)&data[0], data.size()); | byteArray = QByteArray((const char *)data.data(), data.size()); | ||||
r.paymentRequest.parse(byteArray); | r.paymentRequest.parse(byteArray); | ||||
// Ensure the request is initialized | // Ensure the request is initialized | ||||
QVERIFY(r.paymentRequest.IsInitialized()); | QVERIFY(r.paymentRequest.IsInitialized()); | ||||
// compares 9223372036854775807 < GetTime() == false (treated as unexpired | // compares 9223372036854775807 < GetTime() == false (treated as unexpired | ||||
// payment request) | // payment request) | ||||
QCOMPARE(PaymentServer::verifyExpired(r.paymentRequest.getDetails()), | QCOMPARE(PaymentServer::verifyExpired(r.paymentRequest.getDetails()), | ||||
false); | false); | ||||
// Unexpired payment request (expires is set to 0x8000000000000000 > max. | // Unexpired payment request (expires is set to 0x8000000000000000 > max. | ||||
// int64_t, allowed uint64): | // int64_t, allowed uint64): | ||||
// 9223372036854775808 (uint64), -9223372036854775808 (int64_t) and 0 | // 9223372036854775808 (uint64), -9223372036854775808 (int64_t) and 0 | ||||
// (int32_t) | // (int32_t) | ||||
// 0 is 1970-01-01 00:00:00 (for a 32 bit time values) | // 0 is 1970-01-01 00:00:00 (for a 32 bit time values) | ||||
data = DecodeBase64(paymentrequest4_cert2_BASE64); | data = DecodeBase64(paymentrequest4_cert2_BASE64); | ||||
byteArray = QByteArray((const char *)&data[0], data.size()); | byteArray = QByteArray((const char *)data.data(), data.size()); | ||||
r.paymentRequest.parse(byteArray); | r.paymentRequest.parse(byteArray); | ||||
// Ensure the request is initialized | // Ensure the request is initialized | ||||
QVERIFY(r.paymentRequest.IsInitialized()); | QVERIFY(r.paymentRequest.IsInitialized()); | ||||
// compares -9223372036854775808 < GetTime() == true (treated as expired | // compares -9223372036854775808 < GetTime() == true (treated as expired | ||||
// payment request) | // payment request) | ||||
QCOMPARE(PaymentServer::verifyExpired(r.paymentRequest.getDetails()), true); | QCOMPARE(PaymentServer::verifyExpired(r.paymentRequest.getDetails()), true); | ||||
// Test BIP70 DoS protection: | // Test BIP70 DoS protection: | ||||
uint8_t randData[BIP70_MAX_PAYMENTREQUEST_SIZE + 1]; | uint8_t randData[BIP70_MAX_PAYMENTREQUEST_SIZE + 1]; | ||||
GetRandBytes(randData, sizeof(randData)); | GetRandBytes(randData, sizeof(randData)); | ||||
// Write data to a temp file: | // Write data to a temp file: | ||||
QTemporaryFile tempFile; | QTemporaryFile tempFile; | ||||
tempFile.open(); | tempFile.open(); | ||||
tempFile.write((const char *)randData, sizeof(randData)); | tempFile.write((const char *)randData, sizeof(randData)); | ||||
tempFile.close(); | tempFile.close(); | ||||
// compares 50001 <= BIP70_MAX_PAYMENTREQUEST_SIZE == false | // compares 50001 <= BIP70_MAX_PAYMENTREQUEST_SIZE == false | ||||
QCOMPARE(PaymentServer::verifySize(tempFile.size()), false); | QCOMPARE(PaymentServer::verifySize(tempFile.size()), false); | ||||
// Payment request with amount overflow (amount is set to 21000001 BCH): | // Payment request with amount overflow (amount is set to 21000001 BCH): | ||||
data = DecodeBase64(paymentrequest5_cert2_BASE64); | data = DecodeBase64(paymentrequest5_cert2_BASE64); | ||||
byteArray = QByteArray((const char *)&data[0], data.size()); | byteArray = QByteArray((const char *)data.data(), data.size()); | ||||
r.paymentRequest.parse(byteArray); | r.paymentRequest.parse(byteArray); | ||||
// Ensure the request is initialized | // Ensure the request is initialized | ||||
QVERIFY(r.paymentRequest.IsInitialized()); | QVERIFY(r.paymentRequest.IsInitialized()); | ||||
// Extract address and amount from the request | // Extract address and amount from the request | ||||
QList<std::pair<CScript, Amount>> sendingTos = r.paymentRequest.getPayTo(); | QList<std::pair<CScript, Amount>> sendingTos = r.paymentRequest.getPayTo(); | ||||
for (const std::pair<CScript, Amount> &sendingTo : sendingTos) { | for (const std::pair<CScript, Amount> &sendingTo : sendingTos) { | ||||
CTxDestination dest; | CTxDestination dest; | ||||
if (ExtractDestination(sendingTo.first, dest)) | if (ExtractDestination(sendingTo.first, dest)) | ||||
Show All 9 Lines |