diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h --- a/src/qt/guiutil.h +++ b/src/qt/guiutil.h @@ -53,8 +53,10 @@ // Parse "bitcoincash:" URI into recipient object, return true on successful // parsing -bool parseBitcoinURI(const QUrl &uri, SendCoinsRecipient *out); -bool parseBitcoinURI(QString uri, SendCoinsRecipient *out); +bool parseBitcoinURI(const QString &scheme, const QUrl &uri, + SendCoinsRecipient *out); +bool parseBitcoinURI(const QString &scheme, QString uri, + SendCoinsRecipient *out); QString formatBitcoinURI(const Config &cfg, const SendCoinsRecipient &info); // Returns true if given address+amount meets "dust" definition diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -172,9 +172,12 @@ return !decoded.first.empty(); } -bool parseBitcoinURI(const QUrl &uri, SendCoinsRecipient *out) { - // return if URI is not valid or is no bitcoincash: URI - if (!uri.isValid() || uri.scheme() != URI_SCHEME) return false; +bool parseBitcoinURI(const QString &scheme, const QUrl &uri, + SendCoinsRecipient *out) { + // return if URI has wrong scheme. + if (!uri.isValid() || uri.scheme() != scheme) { + return false; + } SendCoinsRecipient rv; if (IsCashAddrEncoded(uri)) { @@ -231,17 +234,17 @@ return true; } -bool parseBitcoinURI(QString uri, SendCoinsRecipient *out) { - // Convert bitcoincash:// to bitcoincash: +bool parseBitcoinURI(const QString &scheme, QString uri, + SendCoinsRecipient *out) { // // Cannot handle this later, because bitcoincash:// // will cause Qt to see the part after // as host, // which will lower-case it (and thus invalidate the address). - if (uri.startsWith(URI_SCHEME + "://", Qt::CaseInsensitive)) { - uri.replace(0, URI_SCHEME.length() + 3, URI_SCHEME + ":"); + if (uri.startsWith(scheme + "://", Qt::CaseInsensitive)) { + uri.replace(0, scheme.length() + 3, scheme + ":"); } QUrl uriInstance(uri); - return parseBitcoinURI(uriInstance, out); + return parseBitcoinURI(scheme, uriInstance, out); } QString formatBitcoinURI(const Config &cfg, const SendCoinsRecipient &info) { diff --git a/src/qt/openuridialog.cpp b/src/qt/openuridialog.cpp --- a/src/qt/openuridialog.cpp +++ b/src/qt/openuridialog.cpp @@ -28,7 +28,7 @@ void OpenURIDialog::accept() { SendCoinsRecipient rcp; - if (GUIUtil::parseBitcoinURI(getURI(), &rcp)) { + if (GUIUtil::parseBitcoinURI(GUIUtil::URI_SCHEME, getURI(), &rcp)) { /* Only accept value URIs */ QDialog::accept(); } else { diff --git a/src/qt/paymentserver.cpp b/src/qt/paymentserver.cpp --- a/src/qt/paymentserver.cpp +++ b/src/qt/paymentserver.cpp @@ -222,7 +222,8 @@ savedPaymentRequests.append(arg); SendCoinsRecipient r; - if (GUIUtil::parseBitcoinURI(arg, &r) && !r.address.isEmpty()) { + if (GUIUtil::parseBitcoinURI(GUIUtil::URI_SCHEME, arg, &r) && + !r.address.isEmpty()) { if (IsValidDestinationString(r.address.toStdString(), Params(CBaseChainParams::MAIN))) { SelectParams(CBaseChainParams::MAIN); @@ -420,7 +421,7 @@ } else { // normal URI SendCoinsRecipient recipient; - if (GUIUtil::parseBitcoinURI(s, &recipient)) { + if (GUIUtil::parseBitcoinURI(GUIUtil::URI_SCHEME, s, &recipient)) { if (!IsValidDestinationString( recipient.address.toStdString())) { Q_EMIT message( diff --git a/src/qt/test/uritests.cpp b/src/qt/test/uritests.cpp --- a/src/qt/test/uritests.cpp +++ b/src/qt/test/uritests.cpp @@ -1,9 +1,11 @@ // Copyright (c) 2009-2014 The Bitcoin Core developers +// Copyright (c) 2017 The Bitcoin developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include "uritests.h" +#include "chainparams.h" #include "config.h" #include "guiutil.h" #include "walletmodel.h" @@ -12,35 +14,36 @@ void URITests::uriTestsBase58() { SendCoinsRecipient rv; + QString scheme = + QString::fromStdString(Params(CBaseChainParams::MAIN).CashAddrPrefix()); QUrl uri; - uri.setUrl(QString( - "bitcoincash:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?req-dontexist=")); - QVERIFY(!GUIUtil::parseBitcoinURI(uri, &rv)); + uri.setUrl(QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?req-dontexist=")); + QVERIFY(!GUIUtil::parseBitcoinURI(scheme, uri, &rv)); uri.setUrl( QString("bitcoincash:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?dontexist=")); - QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(GUIUtil::parseBitcoinURI(scheme, uri, &rv)); QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W")); QVERIFY(rv.label == QString()); QVERIFY(rv.amount == 0); uri.setUrl(QString("bitcoincash:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?label=" "Wikipedia Example Address")); - QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(GUIUtil::parseBitcoinURI(scheme, uri, &rv)); QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W")); QVERIFY(rv.label == QString("Wikipedia Example Address")); QVERIFY(rv.amount == 0); uri.setUrl( QString("bitcoincash:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=0.001")); - QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(GUIUtil::parseBitcoinURI(scheme, uri, &rv)); QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W")); QVERIFY(rv.label == QString()); QVERIFY(rv.amount == 100000); uri.setUrl( QString("bitcoincash:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=1.001")); - QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(GUIUtil::parseBitcoinURI(scheme, uri, &rv)); QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W")); QVERIFY(rv.label == QString()); QVERIFY(rv.amount == 100100000); @@ -48,18 +51,19 @@ uri.setUrl( QString("bitcoincash:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=100&" "label=Wikipedia Example")); - QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(GUIUtil::parseBitcoinURI(scheme, uri, &rv)); QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W")); QVERIFY(rv.amount == 10000000000LL); QVERIFY(rv.label == QString("Wikipedia Example")); uri.setUrl(QString("bitcoincash:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?message=" "Wikipedia Example Address")); - QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(GUIUtil::parseBitcoinURI(scheme, uri, &rv)); QVERIFY(rv.address == QString("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W")); QVERIFY(rv.label == QString()); - QVERIFY(GUIUtil::parseBitcoinURI("bitcoincash://" + QVERIFY(GUIUtil::parseBitcoinURI(scheme, + "bitcoincash://" "175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?" "message=Wikipedia Example Address", &rv)); @@ -69,29 +73,31 @@ uri.setUrl( QString("bitcoincash:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?req-message=" "Wikipedia Example Address")); - QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(GUIUtil::parseBitcoinURI(scheme, uri, &rv)); uri.setUrl( QString("bitcoincash:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=1," "000&label=Wikipedia Example")); - QVERIFY(!GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(!GUIUtil::parseBitcoinURI(scheme, uri, &rv)); uri.setUrl( QString("bitcoincash:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=1," "000.0&label=Wikipedia Example")); - QVERIFY(!GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(!GUIUtil::parseBitcoinURI(scheme, uri, &rv)); } void URITests::uriTestsCashAddr() { SendCoinsRecipient rv; QUrl uri; + QString scheme = + QString::fromStdString(Params(CBaseChainParams::MAIN).CashAddrPrefix()); uri.setUrl(QString("bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a?" "req-dontexist=")); - QVERIFY(!GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(!GUIUtil::parseBitcoinURI(scheme, uri, &rv)); uri.setUrl(QString( "bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a?dontexist=")); - QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(GUIUtil::parseBitcoinURI(scheme, uri, &rv)); QVERIFY(rv.address == QString("bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a")); QVERIFY(rv.label == QString()); @@ -100,7 +106,7 @@ uri.setUrl( QString("bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a?label=" "Wikipedia Example Address")); - QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(GUIUtil::parseBitcoinURI(scheme, uri, &rv)); QVERIFY(rv.address == QString("bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a")); QVERIFY(rv.label == QString("Wikipedia Example Address")); @@ -108,7 +114,7 @@ uri.setUrl(QString( "bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a?amount=0.001")); - QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(GUIUtil::parseBitcoinURI(scheme, uri, &rv)); QVERIFY(rv.address == QString("bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a")); QVERIFY(rv.label == QString()); @@ -116,7 +122,7 @@ uri.setUrl(QString( "bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a?amount=1.001")); - QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(GUIUtil::parseBitcoinURI(scheme, uri, &rv)); QVERIFY(rv.address == QString("bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a")); QVERIFY(rv.label == QString()); @@ -125,7 +131,7 @@ uri.setUrl(QString( "bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a?amount=100&" "label=Wikipedia Example")); - QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(GUIUtil::parseBitcoinURI(scheme, uri, &rv)); QVERIFY(rv.address == QString("bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a")); QVERIFY(rv.amount == 10000000000LL); @@ -134,16 +140,16 @@ uri.setUrl(QString( "bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a?message=" "Wikipedia Example Address")); - QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(GUIUtil::parseBitcoinURI(scheme, uri, &rv)); QVERIFY(rv.address == QString("bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a")); QVERIFY(rv.label == QString()); - QVERIFY( - GUIUtil::parseBitcoinURI("bitcoincash://" - "qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a?" - "message=Wikipedia Example Address", - &rv)); + QVERIFY(GUIUtil::parseBitcoinURI( + scheme, "bitcoincash://" + "qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a?" + "message=Wikipedia Example Address", + &rv)); QVERIFY(rv.address == QString("bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a")); QVERIFY(rv.label == QString()); @@ -151,17 +157,17 @@ uri.setUrl(QString( "bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a?req-message=" "Wikipedia Example Address")); - QVERIFY(GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(GUIUtil::parseBitcoinURI(scheme, uri, &rv)); uri.setUrl(QString( "bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a?amount=1," "000&label=Wikipedia Example")); - QVERIFY(!GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(!GUIUtil::parseBitcoinURI(scheme, uri, &rv)); uri.setUrl(QString( "bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a?amount=1," "000.0&label=Wikipedia Example")); - QVERIFY(!GUIUtil::parseBitcoinURI(uri, &rv)); + QVERIFY(!GUIUtil::parseBitcoinURI(scheme, uri, &rv)); } namespace {