aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/release-process.md2
-rw-r--r--src/qt/openuridialog.cpp2
-rw-r--r--src/qt/paymentserver.cpp25
-rw-r--r--src/qt/paymentserver.h9
-rw-r--r--src/qt/test/paymentservertests.cpp14
-rw-r--r--src/qt/test/paymentservertests.h2
-rw-r--r--src/qt/test/test_main.cpp8
-rw-r--r--src/rpcnet.cpp2
-rw-r--r--src/rpcrawtransaction.cpp2
-rw-r--r--src/wallet.cpp9
10 files changed, 49 insertions, 26 deletions
diff --git a/doc/release-process.md b/doc/release-process.md
index feadb3c1b0..3d5c577f86 100644
--- a/doc/release-process.md
+++ b/doc/release-process.md
@@ -17,7 +17,7 @@ Release Process
###tag version in git
- git tag -a v(new version, e.g. 0.8.0)
+ git tag -s v(new version, e.g. 0.8.0)
###write release notes. git shortlog helps a lot, for example:
diff --git a/src/qt/openuridialog.cpp b/src/qt/openuridialog.cpp
index 803a3c9ddb..06189aeaf3 100644
--- a/src/qt/openuridialog.cpp
+++ b/src/qt/openuridialog.cpp
@@ -48,5 +48,5 @@ void OpenURIDialog::on_selectFileButton_clicked()
if(filename.isEmpty())
return;
QUrl fileUri = QUrl::fromLocalFile(filename);
- ui->uriEdit->setText("bitcoin:?request=" + QUrl::toPercentEncoding(fileUri.toString()));
+ ui->uriEdit->setText("bitcoin:?r=" + QUrl::toPercentEncoding(fileUri.toString()));
}
diff --git a/src/qt/paymentserver.cpp b/src/qt/paymentserver.cpp
index 34da0f90ec..ba5c06064f 100644
--- a/src/qt/paymentserver.cpp
+++ b/src/qt/paymentserver.cpp
@@ -232,7 +232,10 @@ bool PaymentServer::ipcSendCommandLine(int argc, char* argv[])
QLocalSocket* socket = new QLocalSocket();
socket->connectToServer(ipcServerName(), QIODevice::WriteOnly);
if (!socket->waitForConnected(BITCOIN_IPC_CONNECT_TIMEOUT))
+ {
+ delete socket;
return false;
+ }
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
@@ -277,8 +280,11 @@ PaymentServer::PaymentServer(QObject* parent, bool startLocalServer) :
{
uriServer = new QLocalServer(this);
- if (!uriServer->listen(name))
- qDebug() << "PaymentServer::PaymentServer : Cannot start bitcoin: click-to-pay handler";
+ if (!uriServer->listen(name)) {
+ // constructor is called early in init, so don't use "emit message()" here
+ QMessageBox::critical(0, tr("Payment request error"),
+ tr("Cannot start bitcoin: click-to-pay handler"));
+ }
else {
connect(uriServer, SIGNAL(newConnection()), this, SLOT(handleURIConnection()));
connect(this, SIGNAL(receivedPaymentACK(QString)), this, SLOT(handlePaymentACK(QString)));
@@ -295,12 +301,12 @@ PaymentServer::~PaymentServer()
// OSX-specific way of handling bitcoin: URIs and
// PaymentRequest mime types
//
-bool PaymentServer::eventFilter(QObject *, QEvent *event)
+bool PaymentServer::eventFilter(QObject *object, QEvent *event)
{
- // clicking on bitcoin: URIs creates FileOpen events on the Mac:
+ // clicking on bitcoin: URIs creates FileOpen events on the Mac
if (event->type() == QEvent::FileOpen)
{
- QFileOpenEvent* fileEvent = static_cast<QFileOpenEvent*>(event);
+ QFileOpenEvent *fileEvent = static_cast<QFileOpenEvent*>(event);
if (!fileEvent->file().isEmpty())
handleURIOrFile(fileEvent->file());
else if (!fileEvent->url().isEmpty())
@@ -308,7 +314,8 @@ bool PaymentServer::eventFilter(QObject *, QEvent *event)
return true;
}
- return false;
+
+ return QObject::eventFilter(object, event);
}
void PaymentServer::initNetManager()
@@ -359,17 +366,17 @@ void PaymentServer::handleURIOrFile(const QString& s)
return;
}
- if (s.startsWith(BITCOIN_IPC_PREFIX, Qt::CaseInsensitive)) // bitcoin:
+ if (s.startsWith(BITCOIN_IPC_PREFIX, Qt::CaseInsensitive)) // bitcoin: URI
{
#if QT_VERSION < 0x050000
QUrl uri(s);
#else
QUrlQuery uri((QUrl(s)));
#endif
- if (uri.hasQueryItem("request"))
+ if (uri.hasQueryItem("r"))
{
QByteArray temp;
- temp.append(uri.queryItemValue("request"));
+ temp.append(uri.queryItemValue("r"));
QString decoded = QUrl::fromPercentEncoding(temp);
QUrl fetchUrl(decoded, QUrl::StrictMode);
diff --git a/src/qt/paymentserver.h b/src/qt/paymentserver.h
index 50f077f3bc..ab59388acc 100644
--- a/src/qt/paymentserver.h
+++ b/src/qt/paymentserver.h
@@ -77,10 +77,6 @@ public:
// Return certificate store
static X509_STORE* getCertStore() { return certStore; }
- // Constructor registers this on the parent QApplication to
- // receive QEvent::FileOpen events
- bool eventFilter(QObject *object, QEvent *event);
-
// OptionsModel is used for getting proxy settings and display unit
void setOptionsModel(OptionsModel *optionsModel);
@@ -111,6 +107,11 @@ private slots:
void reportSslErrors(QNetworkReply*, const QList<QSslError> &);
void handlePaymentACK(const QString& paymentACKMsg);
+protected:
+ // Constructor registers this on the parent QApplication to
+ // receive QEvent::FileOpen and QEvent:Drop events
+ bool eventFilter(QObject *object, QEvent *event);
+
private:
static bool readPaymentRequest(const QString& filename, PaymentRequestPlus& request);
bool processPaymentRequest(PaymentRequestPlus& request, SendCoinsRecipient& recipient);
diff --git a/src/qt/test/paymentservertests.cpp b/src/qt/test/paymentservertests.cpp
index b8f2cc65cb..7dee7a9cda 100644
--- a/src/qt/test/paymentservertests.cpp
+++ b/src/qt/test/paymentservertests.cpp
@@ -7,12 +7,9 @@
#include <openssl/x509.h>
#include <openssl/x509_vfy.h>
-#include <QCoreApplication>
-#include <QDebug>
+
#include <QFileOpenEvent>
#include <QTemporaryFile>
-#include <QVariant>
-
X509 *parse_b64der_cert(const char* cert_data)
{
@@ -41,9 +38,14 @@ static SendCoinsRecipient handleRequest(PaymentServer* server, std::vector<unsig
f.write((const char*)&data[0], data.size());
f.close();
- // Create a FileOpenEvent and send it directly to the server's event filter:
+ // Create a QObject, install event filter from PaymentServer
+ // and send a file open event to the object
+ QObject object;
+ object.installEventFilter(server);
QFileOpenEvent event(f.fileName());
- server->eventFilter(NULL, &event);
+ // If sending the event fails, this will cause sigCatcher to be empty,
+ // which will lead to a test failure anyway.
+ QCoreApplication::sendEvent(&object, &event);
QObject::disconnect(server, SIGNAL(receivedPaymentRequest(SendCoinsRecipient)),
&sigCatcher, SLOT(getRecipient(SendCoinsRecipient)));
diff --git a/src/qt/test/paymentservertests.h b/src/qt/test/paymentservertests.h
index 0bff923ad4..884e535a60 100644
--- a/src/qt/test/paymentservertests.h
+++ b/src/qt/test/paymentservertests.h
@@ -20,8 +20,10 @@ private slots:
class RecipientCatcher : public QObject
{
Q_OBJECT
+
public slots:
void getRecipient(SendCoinsRecipient r);
+
public:
SendCoinsRecipient recipient;
};
diff --git a/src/qt/test/test_main.cpp b/src/qt/test/test_main.cpp
index 5c941c6387..ae584706f1 100644
--- a/src/qt/test/test_main.cpp
+++ b/src/qt/test/test_main.cpp
@@ -1,8 +1,7 @@
-
-
#include "paymentservertests.h"
#include "uritests.h"
+#include <QCoreApplication>
#include <QObject>
#include <QTest>
@@ -11,6 +10,11 @@ int main(int argc, char *argv[])
{
bool fInvalid = false;
+ // Don't remove this, it's needed to access
+ // QCoreApplication:: in the tests
+ QCoreApplication app(argc, argv);
+ app.setApplicationName("Bitcoin-Qt-test");
+
URITests test1;
if (QTest::qExec(&test1) != 0)
fInvalid = true;
diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp
index 89bf53060e..baa3268fb0 100644
--- a/src/rpcnet.cpp
+++ b/src/rpcnet.cpp
@@ -319,7 +319,7 @@ Value getnettotals(const Array& params, bool fHelp)
"\nResult:\n"
"{\n"
" \"totalbytesrecv\": n, (numeric) Total bytes received\n"
- " \"totalbytessent\": n, (numeric) Total Bytes sent\n"
+ " \"totalbytessent\": n, (numeric) Total bytes sent\n"
" \"timemillis\": t (numeric) Total cpu time\n"
"}\n"
"\nExamples:\n"
diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp
index abbc33cc56..86025918ef 100644
--- a/src/rpcrawtransaction.cpp
+++ b/src/rpcrawtransaction.cpp
@@ -83,7 +83,7 @@ void TxToJSON(const CTransaction& tx, const uint256 hashBlock, Object& entry)
out.push_back(Pair("value", ValueFromAmount(txout.nValue)));
out.push_back(Pair("n", (boost::int64_t)i));
Object o;
- ScriptPubKeyToJSON(txout.scriptPubKey, o, false);
+ ScriptPubKeyToJSON(txout.scriptPubKey, o, true);
out.push_back(Pair("scriptPubKey", o));
vout.push_back(out);
}
diff --git a/src/wallet.cpp b/src/wallet.cpp
index 14d685d6e2..241e937b1b 100644
--- a/src/wallet.cpp
+++ b/src/wallet.cpp
@@ -765,6 +765,10 @@ void CWalletTx::AddSupportingTransactions()
{
tx = *mapWalletPrev[hash];
}
+ else
+ {
+ continue;
+ }
int nDepth = tx.SetMerkleBranch();
vtxPrev.push_back(tx);
@@ -895,7 +899,10 @@ void CWalletTx::RelayWalletTransaction()
{
BOOST_FOREACH(const CMerkleTx& tx, vtxPrev)
{
- if (!tx.IsCoinBase())
+ // Important: versions of bitcoin before 0.8.6 had a bug that inserted
+ // empty transactions into the vtxPrev, which will cause the node to be
+ // banned when retransmitted, hence the check for !tx.vin.empty()
+ if (!tx.IsCoinBase() && !tx.vin.empty())
if (tx.GetDepthInMainChain() == 0)
RelayTransaction((CTransaction)tx, tx.GetHash());
}