diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 723e29dc5..1b734ff2b 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -109,6 +109,8 @@ QT_FORMS_UI = \ qt/forms/receivecoinsdialog.ui \ qt/forms/receiverequestdialog.ui \ qt/forms/debugwindow.ui \ + qt/forms/addpeerdialog.ui \ + qt/forms/testpeerdialog.ui \ qt/forms/sendcoinsdialog.ui \ qt/forms/sendcoinsentry.ui \ qt/forms/signverifymessagedialog.ui \ @@ -157,6 +159,7 @@ QT_MOC_CPP = \ qt/moc_transactiontablemodel.cpp \ qt/moc_transactionview.cpp \ qt/moc_utilitydialog.cpp \ + qt/moc_peerdialog.cpp \ qt/moc_verticallabel.cpp \ qt/moc_walletframe.cpp \ qt/moc_walletmodel.cpp \ @@ -230,6 +233,7 @@ BITCOIN_QT_H = \ qt/transactiontablemodel.h \ qt/transactionview.h \ qt/utilitydialog.h \ + qt/peerdialog.h \ qt/verticallabel.h \ qt/walletframe.h \ qt/walletmodel.h \ @@ -320,6 +324,7 @@ BITCOIN_QT_BASE_CPP = \ qt/splashscreen.cpp \ qt/trafficgraphwidget.cpp \ qt/utilitydialog.cpp \ + qt/peerdialog.cpp \ qt/verticallabel.cpp BITCOIN_QT_WINDOWS_CPP = qt/winshutdownmonitor.cpp diff --git a/src/qt/forms/addpeerdialog.ui b/src/qt/forms/addpeerdialog.ui new file mode 100644 index 000000000..7cb09dea3 --- /dev/null +++ b/src/qt/forms/addpeerdialog.ui @@ -0,0 +1,73 @@ + + + AddPeerDialog + + + + 0 + 0 + 466 + 186 + + + + Add Peer + + + + + + + 11 + 75 + true + + + + Enter the peer details below. + + + Qt::AlignCenter + + + + + + + Be careful! Do not blindly trust anyone that tells you to add their node. + + + Qt::AlignCenter + + + + + + + + + Enter the peer's address + + + + + + + Enter the peer's port + + + + + + + + + Add! + + + + + + + + diff --git a/src/qt/forms/debugwindow.ui b/src/qt/forms/debugwindow.ui index 8be4a955b..6eb838c91 100644 --- a/src/qt/forms/debugwindow.ui +++ b/src/qt/forms/debugwindow.ui @@ -165,17 +165,17 @@ - - - - 75 - true - - - - Network - - + + + + 75 + true + + + + Network + + @@ -433,12 +433,12 @@ 24 - - - Decrease font size + + + :/icons/fontsmaller:/icons/fontsmaller @@ -854,6 +854,33 @@ 0 + + + + + 300 + 32 + + + + + 16777215 + 32 + + + + + 12 + + + + IBeamCursor + + + Connected peers + + + @@ -870,6 +897,46 @@ + + + + 0 + + + 0 + + + + + PointingHandCursor + + + Add new peer + + + + + + + PointingHandCursor + + + Remove peer + + + + + + + PointingHandCursor + + + One try peer + + + + + diff --git a/src/qt/forms/testpeerdialog.ui b/src/qt/forms/testpeerdialog.ui new file mode 100644 index 000000000..471860529 --- /dev/null +++ b/src/qt/forms/testpeerdialog.ui @@ -0,0 +1,73 @@ + + + TestPeerDialog + + + + 0 + 0 + 466 + 186 + + + + Test Peer + + + + + + + 11 + 75 + true + + + + Enter the peer details below. + + + Qt::AlignCenter + + + + + + + Be careful! Do not blindly trust anyone that tells you to add their node. + + + Qt::AlignCenter + + + + + + + + + Enter the peer's address + + + + + + + Enter the peer's port + + + + + + + + + Test! + + + + + + + + diff --git a/src/qt/peerdialog.cpp b/src/qt/peerdialog.cpp new file mode 100644 index 000000000..3c35c686f --- /dev/null +++ b/src/qt/peerdialog.cpp @@ -0,0 +1,176 @@ +// Copyright (c) 2011-2016 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "guiutil.h" +#if defined(HAVE_CONFIG_H) +#include "config/bitcoin-config.h" +#endif + +#include +#include + +#include "peerdialog.h" + +#include "ui_addpeerdialog.h" +#include "ui_testpeerdialog.h" + +#include "net.h" +#include "net_processing.h" +#include "netbase.h" +#include "protocol.h" +#include "chainparams.h" +#include "util.h" + +#include + +#include +#include +#include +#include + +/** Function to manage peers */ +QString PeerTools::ManagePeer(QString type, QString peer) +{ + std::string peerAddress = peer.toStdString(); + + if(!g_connman) + return "Error: Peer-to-peer functionality missing or disabled"; + + if (type == "onetry") + { + CAddress addr; + g_connman->OpenNetworkConnection(addr, false, NULL, peerAddress.c_str()); + return "Attempted to one try node."; + } + + if (type == "add") + { + if(!g_connman->AddNode(peerAddress)) + return "Error: Node already added"; + } + else if(type == "remove") + { + if(!g_connman->RemoveAddedNode(peerAddress)) + { + if(!g_connman->DisconnectNode(peerAddress)) + return "Node not found in connected nodes"; + + return "Disconnected the node: " + peer; + } + else + { + if(!g_connman->DisconnectNode(peerAddress)) + return "Node not found in connected nodes"; + } + } + + return "Returned OK."; +} + +/** Check if Peer is valid */ +bool PeerTools::CheckPeerAddress(QString address) +{ + CNetAddr addr; + return LookupHost(address.toStdString().c_str(), addr, true); +} + +/** Get port based on current chain */ +QString PeerTools::GetPort() +{ + return QString::number(Params().GetDefaultPort()); +} + +/** Add Peer Dialog */ +AddPeerDialog::AddPeerDialog(QWidget *parent) : + QWidget(parent), + ui(new Ui::AddPeerDialog) +{ + ui->setupUi(this); + + ui->peerPort->setValidator( new QIntValidator(1, 65535, this) ); + + connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(on_addPeer_clicked())); +} + +AddPeerDialog::~AddPeerDialog() +{ + delete ui; +} + +void AddPeerDialog::on_addPeer_clicked() +{ + QString address = ui->peerAddress->text(); + QString port = ui->peerPort->text(); + QString data = ""; + + if(address.isEmpty()) + { + QMessageBox::critical(this, "Add Peer", "Please enter an address.", QMessageBox::Ok, QMessageBox::Ok); + return; + } + + if(port.isEmpty()) + { + port = PeerTools::GetPort(); + ui->peerPort->setText(port); + } + + if(!PeerTools::CheckPeerAddress(address)) + { + QMessageBox::critical(this, "Add Peer", "Please enter a vaild peer address.", QMessageBox::Ok, QMessageBox::Ok); + return; + } + + data = address + ":" + port; + + if(QMessageBox::Ok == QMessageBox::information(this, "Add Peer", PeerTools::ManagePeer("add", data), QMessageBox::Ok, QMessageBox::Ok)) + this->close(); +} + +/** Add Test Peer Dialog */ +TestPeerDialog::TestPeerDialog(QWidget *parent) : + QWidget(parent), + ui(new Ui::TestPeerDialog) +{ + ui->setupUi(this); + + ui->peerPort->setValidator( new QIntValidator(1, 65535, this) ); + + connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(on_testPeer_clicked())); +} + +TestPeerDialog::~TestPeerDialog() +{ + delete ui; +} + +void TestPeerDialog::on_testPeer_clicked() +{ + QString address = ui->peerAddress->text(); + QString port = ui->peerPort->text(); + QString data = ""; + + if(address.isEmpty()) + { + QMessageBox::critical(this, "Test Peer", "Please enter an address.", QMessageBox::Ok, QMessageBox::Ok); + return; + } + + if(port.isEmpty()) + { + port = PeerTools::GetPort(); + ui->peerPort->setText(port); + } + + if(!PeerTools::CheckPeerAddress(address)) + { + QMessageBox::critical(this, "Test Peer", "Please enter a vaild peer address.", QMessageBox::Ok, QMessageBox::Ok); + return; + } + + data = address + ":" + port; + + if(QMessageBox::Ok == QMessageBox::information(this, "Try Peer", PeerTools::ManagePeer("onetry", data), QMessageBox::Ok, QMessageBox::Ok)) + this->close(); +} diff --git a/src/qt/peerdialog.h b/src/qt/peerdialog.h new file mode 100644 index 000000000..45d3215c4 --- /dev/null +++ b/src/qt/peerdialog.h @@ -0,0 +1,62 @@ +// Copyright (c) 2011-2016 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_QT_PEERDIALOG_H +#define BITCOIN_QT_PEERDIALOG_H + +#include +#include +#include +#include "guiutil.h" + +class PeerTools; + +namespace Ui { + class AddPeerDialog; + class RemovePeerDialog; + class TestPeerDialog; +} + +/** Class to manage peers */ +class PeerTools : public QObject +{ + Q_OBJECT + +public: + static QString ManagePeer(QString type, QString peer); + static bool CheckPeerAddress(QString address); + static bool CheckIPAddress(QString ip); + static bool CheckDNS(QString dns); + static QString GetPort(); +}; + +/** "Add peer" dialog box */ +class AddPeerDialog : public QWidget +{ + Q_OBJECT + +public: + explicit AddPeerDialog(QWidget *parent); + ~AddPeerDialog(); +private: + Ui::AddPeerDialog *ui; +private Q_SLOTS: + void on_addPeer_clicked(); +}; + +/** "Test peer" dialog box */ +class TestPeerDialog : public QWidget +{ + Q_OBJECT + +public: + explicit TestPeerDialog(QWidget *parent); + ~TestPeerDialog(); +private: + Ui::TestPeerDialog *ui; +private Q_SLOTS: + void on_testPeer_clicked(); +}; + +#endif diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp index 77e5e03e6..075da382c 100644 --- a/src/qt/rpcconsole.cpp +++ b/src/qt/rpcconsole.cpp @@ -2,11 +2,13 @@ // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include "bitcoingui.h" #if defined(HAVE_CONFIG_H) #include "config/bitcoin-config.h" #endif #include "rpcconsole.h" +#include "peerdialog.h" #include "ui_debugwindow.h" #include "bantablemodel.h" @@ -14,6 +16,7 @@ #include "guiutil.h" #include "platformstyle.h" #include "bantablemodel.h" +#include "utilitydialog.h" #include "chainparams.h" #include "netbase.h" @@ -39,6 +42,7 @@ #include #include #include +#include #if QT_VERSION < 0x050000 #include @@ -441,6 +445,15 @@ RPCConsole::RPCConsole(const PlatformStyle *_platformStyle, QWidget *parent) : connect(ui->fontSmallerButton, SIGNAL(clicked()), this, SLOT(fontSmaller())); connect(ui->btnClearTrafficGraph, SIGNAL(clicked()), ui->trafficGraph, SLOT(clear())); + // Allow user to add new peer + connect(ui->peerAdd, SIGNAL(clicked()), this, SLOT(on_addPeer_clicked())); + + // Allow user to remove peer + connect(ui->peerRemove, SIGNAL(clicked()), this, SLOT(on_removePeer_clicked())); + + // Allow user to test peer + connect(ui->peerTest, SIGNAL(clicked()), this, SLOT(on_testPeer_clicked())); + // set library version labels #ifdef ENABLE_WALLET ui->berkeleyDBVersion->setText(DbEnv::version(0, 0, 0)); @@ -901,6 +914,54 @@ void RPCConsole::on_openDebugLogfileButton_clicked() GUIUtil::openDebugLogfile(); } +void RPCConsole::on_addPeer_clicked() +{ + + QWidget *win = new AddPeerDialog(0); + + win->showNormal(); + win->show(); + win->raise(); + win->activateWindow(); + + /** Center window */ + const QPoint global = ui->tabWidget->mapToGlobal(ui->tabWidget->rect().center()); + win->move(global.x() - win->width() / 2, global.y() - win->height() / 2); +} + +void RPCConsole::on_removePeer_clicked() +{ + QList ips = GUIUtil::getEntryData(ui->peerWidget, PeerTableModel::Address); + + if(ips.size() != 0) + { + QString address = ips[0].data().toString(); + + if(QMessageBox::Yes == QMessageBox::question(this, "Remove Peer", "Are you sure you want to remove the peer: " + address + "?", QMessageBox::Yes | QMessageBox::No)) + { + QMessageBox::information(this, "Remove Peer", PeerTools::ManagePeer("remove", address), QMessageBox::Ok, QMessageBox::Ok); + } + + } else + { + QMessageBox::information(this, "Remove Peer", "No peer was selected.", QMessageBox::Ok, QMessageBox::Ok); + } +} + +void RPCConsole::on_testPeer_clicked() +{ + QWidget *win = new TestPeerDialog(0); + + win->showNormal(); + win->show(); + win->raise(); + win->activateWindow(); + + /** Center window */ + const QPoint global = ui->tabWidget->mapToGlobal(ui->tabWidget->rect().center()); + win->move(global.x() - win->width() / 2, global.y() - win->height() / 2); +} + void RPCConsole::scrollToEnd() { QScrollBar *scrollbar = ui->messagesWidget->verticalScrollBar(); diff --git a/src/qt/rpcconsole.h b/src/qt/rpcconsole.h index ec531c99c..4176e2acf 100644 --- a/src/qt/rpcconsole.h +++ b/src/qt/rpcconsole.h @@ -17,6 +17,7 @@ class ClientModel; class PlatformStyle; class RPCTimerInterface; +class RPCExecutor; namespace Ui { class RPCConsole; @@ -67,6 +68,12 @@ private Q_SLOTS: void on_tabWidget_currentChanged(int index); /** open the debug.log from the current datadir */ void on_openDebugLogfileButton_clicked(); + /** open dialog to add new peer */ + void on_addPeer_clicked(); + /** open dialog to remove peer */ + void on_removePeer_clicked(); + /** open dialog to test peer */ + void on_testPeer_clicked(); /** change the time range of the network traffic graph */ void on_sldGraphRange_valueChanged(int value); /** update traffic statistics */ @@ -152,7 +159,6 @@ private: int consoleFontSize; QCompleter *autoCompleter; QThread thread; - /** Update UI with latest network info from model. */ void updateNetworkState(); };