// 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 tr("Error: Peer-to-peer functionality missing or disabled"); if (type == "onetry") { CAddress addr; g_connman->OpenNetworkConnection(addr, false, NULL, peerAddress.c_str()); return tr("Attempted to one try node."); } if (type == "add") { if(!g_connman->AddNode(peerAddress)) return tr("Error: Node already added"); } else if(type == "remove") { if(!g_connman->RemoveAddedNode(peerAddress)) { if(!g_connman->DisconnectNode(peerAddress)) return tr("Node not found in connected nodes"); return tr("Disconnected the node: ") + peer; } else { if(!g_connman->DisconnectNode(peerAddress)) return tr("Node not found in connected nodes"); } } return tr("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, tr("Add Peer"), tr("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, tr("Add Peer"), tr("Please enter a valid peer address."), QMessageBox::Ok, QMessageBox::Ok); return; } data = address + ":" + port; if(QMessageBox::Ok == QMessageBox::information(this, tr("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, tr("Test Peer"), tr("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, tr("Test Peer"), tr("Please enter a valid peer address."), QMessageBox::Ok, QMessageBox::Ok); return; } data = address + ":" + port; if(QMessageBox::Ok == QMessageBox::information(this, tr("Try Peer"), PeerTools::ManagePeer("onetry", data), QMessageBox::Ok, QMessageBox::Ok)) this->close(); }