summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ZeroTierUI/aboutwindow.h2
-rw-r--r--ZeroTierUI/mainwindow.cpp21
-rw-r--r--ZeroTierUI/mainwindow.h3
-rw-r--r--ZeroTierUI/mainwindow.ui8
-rw-r--r--ZeroTierUI/network.cpp79
-rw-r--r--ZeroTierUI/network.h16
-rw-r--r--ZeroTierUI/network.ui65
-rw-r--r--node/Node.hpp4
-rw-r--r--node/NodeConfig.cpp5
9 files changed, 178 insertions, 25 deletions
diff --git a/ZeroTierUI/aboutwindow.h b/ZeroTierUI/aboutwindow.h
index 41adc64d..6c883b9b 100644
--- a/ZeroTierUI/aboutwindow.h
+++ b/ZeroTierUI/aboutwindow.h
@@ -13,7 +13,7 @@ class AboutWindow : public QDialog
public:
explicit AboutWindow(QWidget *parent = 0);
- ~AboutWindow();
+ virtual ~AboutWindow();
private slots:
void on_uninstallButton_clicked();
diff --git a/ZeroTierUI/mainwindow.cpp b/ZeroTierUI/mainwindow.cpp
index 04a7919d..c618243a 100644
--- a/ZeroTierUI/mainwindow.cpp
+++ b/ZeroTierUI/mainwindow.cpp
@@ -127,6 +127,11 @@ void MainWindow::customEvent(QEvent *event)
if (hdr.size() >= 5)
this->myVersion = hdr[4].c_str();
} else if (hdr[1] == "listnetworks") {
+ const QObjectList &existingNetworks = ui->networksScrollAreaContentWidget->children();
+
+ for(unsigned long i=1;i<m->ztMessage.size();++i) {
+ std::vector<std::string> l(ZeroTier::Node::LocalClient::splitLine(m->ztMessage[i]));
+ }
} else if (hdr[1] == "listpeers") {
this->numPeers = 0;
for(unsigned long i=1;i<m->ztMessage.size();++i) {
@@ -151,6 +156,18 @@ void MainWindow::customEvent(QEvent *event)
void MainWindow::on_joinNetworkButton_clicked()
{
+ QString toJoin(ui->networkIdLineEdit->text());
+ ui->networkIdLineEdit->setText(QString());
+
+ if (!zeroTierClient) // sanity check
+ return;
+
+ if (toJoin.size() != 16) {
+ QMessageBox::information(this,"Invalid Network ID","The network ID you entered was not valid. Enter a 16-digit hexadecimal network ID, like '8056c2e21c000001'.",QMessageBox::Ok,QMessageBox::NoButton);
+ return;
+ }
+
+ zeroTierClient->send((QString("join ") + toJoin).toStdString());
}
void MainWindow::on_actionAbout_triggered()
@@ -165,10 +182,6 @@ void MainWindow::on_actionJoin_Network_triggered()
on_joinNetworkButton_clicked();
}
-void MainWindow::on_actionShow_Detailed_Status_triggered()
-{
-}
-
void MainWindow::on_networkIdLineEdit_textChanged(const QString &text)
{
QString newText;
diff --git a/ZeroTierUI/mainwindow.h b/ZeroTierUI/mainwindow.h
index 39c4318a..ed11ff44 100644
--- a/ZeroTierUI/mainwindow.h
+++ b/ZeroTierUI/mainwindow.h
@@ -21,6 +21,8 @@ class MainWindow : public QMainWindow
Q_OBJECT
public:
+ // Event used to pass messages from the Node::LocalClient thread to the
+ // main window to update network lists and stats.
class ZTMessageEvent : public QEvent
{
public:
@@ -44,7 +46,6 @@ private slots:
void on_joinNetworkButton_clicked();
void on_actionAbout_triggered();
void on_actionJoin_Network_triggered();
- void on_actionShow_Detailed_Status_triggered();
void on_networkIdLineEdit_textChanged(const QString &arg1);
void on_statusAndAddressButton_clicked();
diff --git a/ZeroTierUI/mainwindow.ui b/ZeroTierUI/mainwindow.ui
index a09460ae..45b8fe63 100644
--- a/ZeroTierUI/mainwindow.ui
+++ b/ZeroTierUI/mainwindow.ui
@@ -54,7 +54,7 @@
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
- <widget class="QWidget" name="scrollAreaWidgetContents">
+ <widget class="QWidget" name="networksScrollAreaContentWidget">
<property name="geometry">
<rect>
<x>0</x>
@@ -225,7 +225,6 @@
<string>File</string>
</property>
<addaction name="actionJoin_Network"/>
- <addaction name="actionShow_Detailed_Status"/>
<addaction name="separator"/>
<addaction name="actionExit"/>
</widget>
@@ -242,11 +241,6 @@
<string>Join Network</string>
</property>
</action>
- <action name="actionShow_Detailed_Status">
- <property name="text">
- <string>Show Detailed Status</string>
- </property>
- </action>
<action name="actionExit">
<property name="text">
<string>Exit</string>
diff --git a/ZeroTierUI/network.cpp b/ZeroTierUI/network.cpp
index 3826a8da..1a6a631d 100644
--- a/ZeroTierUI/network.cpp
+++ b/ZeroTierUI/network.cpp
@@ -1,13 +1,22 @@
#include "network.h"
+#include "mainwindow.h"
#include "ui_network.h"
#include <QClipboard>
+#include <QString>
+#include <QStringList>
+#include <QCoreApplication>
+#include <QProcess>
+#include <QList>
+#include <QMessageBox>
-Network::Network(QWidget *parent) :
+Network::Network(QWidget *parent,const std::string &nwid) :
QWidget(parent),
- ui(new Ui::Network)
+ ui(new Ui::Network),
+ networkIdStr(nwid)
{
ui->setupUi(this);
+ ui->networkIdPushButton->setText(QString(nwid.c_str()));
}
Network::~Network()
@@ -15,8 +24,74 @@ Network::~Network()
delete ui;
}
+void Network::setStatus(const std::string &status)
+{
+ ui->statusLabel->setText(QString(status.c_str()));
+}
+
+void Network::setNetworkName(const std::string &status)
+{
+ ui->nameLabel->setText(QString(status.c_str()));
+}
+
+void Network::setNetworkType(const std::string &type)
+{
+ ui->networkTypeLabel->setText(QString(status.c_str()));
+ if (type == "?")
+ ui->networkTypeLabel->setToolTip("Waiting for configuration...");
+ else if (type == "public")
+ ui->networkTypeLabel->setToolTip("This network can be joined by anyone.");
+ else if (type == "private")
+ ui->networkTypeLabel->setToolTip("This network is private, only authorized peers can join.");
+ else ui->networkTypeLabel->setToolTip(QString());
+}
+
+void Network::setNetworkDeviceName(const std::string &dev)
+{
+ ui->deviceLabel->setText(QString(dev.c_str()));
+}
+
+void Network::setIps(const std::string &commaSeparatedList)
+{
+ QStringList ips(QString(commaSeparatedList.c_str()).split(QChar(','),QString::SkipEmptyParts));
+ if (commaSeparatedList == "-")
+ ips.clear();
+
+ QStringList tmp;
+ ips.sort();
+ for(QStringList::iterator i(ips.begin());i!=ips.end();++i) {
+ QString ipOnly(*i);
+ int slashIdx = ipOnly.indexOf('/');
+ if (slashIdx > 0)
+ ipOnly.truncate(slashIdx);
+ tmp.append(ipOnly);
+ }
+ ips = tmp;
+
+ for(QStringList::iterator i(ips.begin());i!=ips.end();++i) {
+ if (ui->ipListWidget->findItems(*i).size() == 0)
+ ui->ipListWidget->addItem(*i);
+ }
+
+ QList<QListWidgetItem *> inList(ui->ipListWidget->items());
+ for(QList<QListWidgetItem *>::iterator i(inList.begin());i!=inList.end();++i) {
+ QListWidgetItem *item = *i;
+ if (!ips.contains(item->text()))
+ ui->ipListWidget->removeItemWidget(item);
+ }
+}
+
+const std::string &Network::networkId()
+{
+ return networkIdStr;
+}
+
void Network::on_leaveNetworkButton_clicked()
{
+ if (QMessageBox::question(this,"Leave Network?",QString("Are you sure you want to leave network '") + networkIdStr.c_str() + "'?",QMessageBox::No,QMessageBox::Yes) == QMessageBox::Yes) {
+ zeroTierClient->send((QString("leave ") + networkIdStr.c_str()).toStdString());
+ this->setEnabled(false);
+ }
}
void Network::on_networkIdPushButton_clicked()
diff --git a/ZeroTierUI/network.h b/ZeroTierUI/network.h
index 730b7982..1048767e 100644
--- a/ZeroTierUI/network.h
+++ b/ZeroTierUI/network.h
@@ -1,6 +1,8 @@
#ifndef NETWORK_H
#define NETWORK_H
+#include <string>
+
#include <QWidget>
namespace Ui {
@@ -12,16 +14,24 @@ class Network : public QWidget
Q_OBJECT
public:
- explicit Network(QWidget *parent = 0);
- ~Network();
+ explicit Network(QWidget *parent = 0,const std::string &nwid);
+ virtual ~Network();
+
+ void setStatus(const std::string &status);
+ void setNetworkName(const std::string &name);
+ void setNetworkType(const std::string &type);
+ void setNetworkDeviceName(const std::string &dev);
+ void setIps(const std::string &commaSeparatedList);
+
+ const std::string &networkId();
private slots:
void on_leaveNetworkButton_clicked();
-
void on_networkIdPushButton_clicked();
private:
Ui::Network *ui;
+ std::string networkIdStr;
};
#endif // NETWORK_H
diff --git a/ZeroTierUI/network.ui b/ZeroTierUI/network.ui
index 1f80a4c8..a9b288a3 100644
--- a/ZeroTierUI/network.ui
+++ b/ZeroTierUI/network.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>618</width>
- <height>93</height>
+ <height>108</height>
</rect>
</property>
<property name="sizePolicy">
@@ -112,6 +112,16 @@ text-align: left;</string>
</widget>
</item>
<item row="3" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Name:</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Status:</string>
@@ -121,7 +131,7 @@ text-align: left;</string>
</property>
</widget>
</item>
- <item row="3" column="1">
+ <item row="5" column="1">
<widget class="QLabel" name="statusLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -143,7 +153,7 @@ text-align: left;</string>
</property>
</widget>
</item>
- <item row="4" column="0">
+ <item row="6" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Device:</string>
@@ -153,7 +163,7 @@ text-align: left;</string>
</property>
</widget>
</item>
- <item row="4" column="1">
+ <item row="6" column="1">
<widget class="QLabel" name="deviceLabel">
<property name="font">
<font>
@@ -169,7 +179,7 @@ text-align: left;</string>
</property>
</widget>
</item>
- <item row="5" column="1">
+ <item row="7" column="1">
<widget class="QWidget" name="leaveNetworkButtonContainerWidget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
@@ -231,6 +241,48 @@ text-align: left;</string>
</layout>
</widget>
</item>
+ <item row="3" column="1">
+ <widget class="QLabel" name="nameLabel">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>(name)</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>Type:</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QLabel" name="networkTypeLabel">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>public</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
</item>
@@ -251,6 +303,9 @@ text-align: left;</string>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
+ <property name="sortingEnabled">
+ <bool>true</bool>
+ </property>
</widget>
</item>
</layout>
diff --git a/node/Node.hpp b/node/Node.hpp
index 2f7d43ed..476ec7cd 100644
--- a/node/Node.hpp
+++ b/node/Node.hpp
@@ -28,6 +28,9 @@
#ifndef _ZT_NODE_HPP
#define _ZT_NODE_HPP
+#include <string>
+#include <vector>
+
namespace ZeroTier {
/**
@@ -70,6 +73,7 @@ public:
*/
unsigned long send(const char *command)
throw();
+ inline unsigned long send(const std::string &command) throw() { return send(command.c_str()); }
/**
* Split a line of results by space
diff --git a/node/NodeConfig.cpp b/node/NodeConfig.cpp
index 027f65ce..d56c73ae 100644
--- a/node/NodeConfig.cpp
+++ b/node/NodeConfig.cpp
@@ -200,7 +200,7 @@ std::vector<std::string> NodeConfig::execute(const char *command)
_r->topology->eachPeer(_DumpPeerStatistics(r));
} else if (cmd[0] == "listnetworks") {
Mutex::Lock _l(_networks_m);
- _P("200 listnetworks <nwid> <status> <type> <dev> <ips>");
+ _P("200 listnetworks <nwid> <name> <status> <type> <dev> <ips>");
for(std::map< uint64_t,SharedPtr<Network> >::const_iterator nw(_networks.begin());nw!=_networks.end();++nw) {
std::string tmp;
std::set<InetAddress> ips(nw->second->tap().ips());
@@ -211,8 +211,9 @@ std::vector<std::string> NodeConfig::execute(const char *command)
}
SharedPtr<NetworkConfig> nconf(nw->second->config2());
- _P("200 listnetworks %.16llx %s %s %s %s",
+ _P("200 listnetworks %.16llx %s %s %s %s %s",
(unsigned long long)nw->first,
+ ((nconf) ? nconf->name().c_str() : "?"),
Network::statusString(nw->second->status()),
((nconf) ? (nconf->isOpen() ? "public" : "private") : "?"),
nw->second->tap().deviceName().c_str(),