mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2026-09-22 15:29:03 -07:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
83a38b8f46 | ||
|
|
83fc684b20 | ||
|
|
f9d31605b8 | ||
|
|
c9c093777f | ||
|
|
c33e2e5d66 | ||
|
|
a6dc4caecf | ||
|
|
a5b3747c01 | ||
|
|
ec3a6428b8 | ||
|
|
7a6fe203ee | ||
|
|
a8345b6a44 | ||
|
|
df84bcf3bf | ||
|
|
c8166b2db1 | ||
|
|
54c2c945e0 | ||
|
|
92969b4426 | ||
|
|
026442f28f | ||
|
|
fe6b7f477c | ||
|
|
434a2f7071 | ||
|
|
704ee6f6c7 | ||
|
|
f311be96a9 | ||
|
|
191d204674 | ||
|
|
4ddf97be4e | ||
|
|
a388830983 | ||
|
|
ea4269e0d2 | ||
|
|
77683eda0c | ||
|
|
42ed37b385 | ||
|
|
eadd69f843 | ||
|
|
99213ef59a | ||
|
|
b54f998a85 | ||
|
|
b792ab8ff1 | ||
|
|
27a5237462 | ||
|
|
50ef47cf0a | ||
|
|
8cc9692cd9 | ||
|
|
9ffda4f955 | ||
|
|
239c9e46ea | ||
|
|
54d1b11b19 | ||
|
|
68defd9980 | ||
|
|
f7e3c10eca | ||
|
|
f8be0d2961 | ||
|
|
8c58635ea7 | ||
|
|
7eac53a178 | ||
|
|
ec4ffc0c2c | ||
|
|
a22a3ed7e8 | ||
|
|
c5ef502b42 | ||
|
|
f7f3bef313 | ||
|
|
d3bcc58074 | ||
|
|
bf0da9f2f7 | ||
|
|
612c17240a | ||
|
|
b59a7cf1d8 | ||
|
|
518410b7e0 | ||
|
|
0a0ed893c3 | ||
|
|
e565656865 | ||
|
|
59b26faaba | ||
|
|
f5d397e8c8 | ||
|
|
66cff2e98d | ||
|
|
2133984318 | ||
|
|
64bc0e4929 | ||
|
|
8ffa6b2bb7 | ||
|
|
f038ed9ca2 | ||
|
|
66f627da04 | ||
|
|
e108924060 | ||
|
|
b699bdefbd | ||
|
|
74af234305 | ||
|
|
4296db2358 | ||
|
|
31d718c4a4 | ||
|
|
e3b0197e57 | ||
|
|
4d86b2f02f | ||
|
|
c979a695c5 | ||
|
|
902c8c38d2 | ||
|
|
14b0639181 | ||
|
|
bf02c6661a | ||
|
|
0adc91d6cb | ||
|
|
77bab13546 | ||
|
|
f1b0178a85 | ||
|
|
10f03d4119 | ||
|
|
b3fdb37b87 | ||
|
|
bdc0ed8065 | ||
|
|
165bc589fd | ||
|
|
15375ef6b9 | ||
|
|
7ec433a452 | ||
|
|
085ad9073b | ||
|
|
34302edcc5 | ||
|
|
c93de67d79 | ||
|
|
5179dfafbe | ||
|
|
9c4d5f8bb2 | ||
|
|
f51478b470 | ||
|
|
93427b8cb6 | ||
|
|
5d7fea2047 | ||
|
|
35fe5ea166 | ||
|
|
bbe5a6f5d1 | ||
|
|
6b8c90bffd | ||
|
|
9455b1cc81 | ||
|
|
9fdec3acfc | ||
|
|
f189b9b6e9 | ||
|
|
6c63bfce69 | ||
|
|
d398c0aed2 | ||
|
|
ac4e657aaa | ||
|
|
ae138566a9 | ||
|
|
e4044eeb70 | ||
|
|
d5fdfaea56 | ||
|
|
d92da40bff | ||
|
|
5750cf6b72 | ||
|
|
7015017686 | ||
|
|
12b297a712 | ||
|
|
d290306bb3 | ||
|
|
60ac1b77c5 | ||
|
|
e514fe2bff | ||
|
|
148619f0ba | ||
|
|
17778a36ba | ||
|
|
df28cd88b8 | ||
|
|
942cc0ca21 | ||
|
|
010616e3ae | ||
|
|
1505e8dd50 | ||
|
|
5901972958 | ||
|
|
bbcd76ecd0 | ||
|
|
3de76fcab1 | ||
|
|
d496304bbf | ||
|
|
719dd2870d | ||
|
|
2f00ae4fd7 | ||
|
|
5e71e07f59 | ||
|
|
40e4f39181 | ||
|
|
6e217dfcb0 |
No files matched your search
+11
-3
@@ -1,5 +1,8 @@
|
||||
zerotier-*
|
||||
/Makefile
|
||||
/ext/llvm-g++-Xcode4.6.2
|
||||
/ext/llvm-g++-Xcode4.6.2.tar.bz2
|
||||
/zerotier-*
|
||||
/build-ZeroTierUI-*
|
||||
/ZeroTierUI/*.user
|
||||
*.o
|
||||
.DS_Store
|
||||
.Apple*
|
||||
@@ -20,6 +23,7 @@ mac-tap/tuntap/tap.kext
|
||||
/vsprojects/TapDriver/x64
|
||||
/vsprojects/InstallerUpdater/obj
|
||||
/vsprojects/Service/obj
|
||||
/vsprojects/SelfTest/SelfTest.aps
|
||||
/Build/*
|
||||
*.log
|
||||
*.opensdf
|
||||
@@ -27,4 +31,8 @@ mac-tap/tuntap/tap.kext
|
||||
*.cache
|
||||
*.obj
|
||||
*.tlog
|
||||
/vsprojects/SelfTest/SelfTest.aps
|
||||
/installer-build
|
||||
/zt1-*-install
|
||||
/file2lz4c
|
||||
.qmake.stash
|
||||
*.autosave
|
||||
+31
-23
@@ -6,32 +6,40 @@ Developers note: there is currently no management of dependencies on *nix
|
||||
platforms, so you should make clean ; make if you change a header. Will
|
||||
do this eventually.
|
||||
|
||||
-- MacOS
|
||||
|
||||
make -f Makefile.mac
|
||||
|
||||
Edit Makefile.mac if you want to change between debug or release build.
|
||||
|
||||
-- Linux
|
||||
|
||||
make -f Makefile.linux
|
||||
make
|
||||
|
||||
Edit Makefile.linux if you want to change between debug or release build.
|
||||
That's it. Add ZT_AUTO_UPDATE=1 to the make command line to build an
|
||||
auto-update-enabled version that will update from ZeroTier's servers.
|
||||
This is disabled by default since such a build will automatically
|
||||
replace itself with our binary distributions.
|
||||
|
||||
-- MacOS
|
||||
|
||||
make
|
||||
|
||||
The same ZT_AUTO_UPDATE=1 option as Linux supports can be used here to
|
||||
build an auto-update-enabled version. By default auto-updates are not
|
||||
enabled.
|
||||
|
||||
If you are building ext/tap-mac you will need a different version of the
|
||||
OSX gcc compiler chain than what currently ships (clang). We've got a copy
|
||||
available here:
|
||||
|
||||
http://download.zerotier.com/dev/llvm-g++-Xcode4.6.2.tar.bz2
|
||||
|
||||
Un-tar this into ext/ (it's excluded in .gitignore) and then 'make' in
|
||||
ext/tap-mac/tuntap/src/tap.
|
||||
|
||||
Most users should not need to build tap-mac, since a binary is included
|
||||
in ext/bin.
|
||||
|
||||
To build the UI you will need Qt version 5.0 or later. The Qt home must
|
||||
be symbolically linked into "Qt" in the parent directory of the ZeroTier
|
||||
One source tree. Then you can type "make mac-ui" and the UI should build.
|
||||
You can also load the UI in Qt Creator and build/test it that way.
|
||||
|
||||
-- Windows
|
||||
|
||||
Right now Windows builds using Visual Studio 2012. Technically it should also
|
||||
build with other tools, but VS2012 is what your author is using.
|
||||
|
||||
Load the ZeroTierOne.sln solution. Typically you won't need to worry about
|
||||
any projects other than ZeroTierOne, Service, and InstallerUpdater. SelfTest
|
||||
builds the selftest program which can be used to test many aspects of the
|
||||
core code base. TapDriver builds the Ethernet tap driver, which shouldn't
|
||||
be something end users need to do and requires a driver signing key to create
|
||||
a publishable driver that users can load without big red warnings.
|
||||
|
||||
To just test ZeroTier One itself, build ZeroTierOne and run the binary in
|
||||
an administrator-mode command window.
|
||||
|
||||
Instructions for doing a full build will be forthcoming once all the details
|
||||
are worked out. Windows is still a work in progress.
|
||||
Here be dragons.
|
||||
@@ -0,0 +1,11 @@
|
||||
# Common makefile -- loads make rules for each platform
|
||||
|
||||
OSTYPE=$(shell uname -s)
|
||||
|
||||
ifeq ($(OSTYPE),Darwin)
|
||||
include make-mac.mk
|
||||
endif
|
||||
|
||||
ifeq ($(OSTYPE),Linux)
|
||||
include make-linux.mk
|
||||
endif
|
||||
@@ -1,52 +0,0 @@
|
||||
CC=gcc
|
||||
CXX=g++
|
||||
|
||||
INCLUDES=
|
||||
DEFS=-DZT_ARCH="x86_combined" -DZT_OSNAME="mac" -DZT_TRACE
|
||||
LIBS=-lm
|
||||
|
||||
# Uncomment for a release optimized universal binary build
|
||||
CFLAGS=-arch i386 -arch x86_64 -Wall -O3 -ftree-vectorize -fstack-protector -pthread -mmacosx-version-min=10.6 -DNDEBUG $(INCLUDES) $(DEFS)
|
||||
STRIP=strip
|
||||
|
||||
# Uncomment for a debug build
|
||||
#CFLAGS=-Wall -g -pthread -DZT_TRACE -DZT_LOG_STDOUT $(INCLUDES) $(DEFS)
|
||||
#STRIP=echo
|
||||
|
||||
CXXFLAGS=$(CFLAGS) -fno-rtti
|
||||
|
||||
include objects.mk
|
||||
|
||||
all: one cli mac-tap
|
||||
|
||||
one: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -o zerotier-one main.cpp $(OBJS) $(LIBS)
|
||||
$(STRIP) zerotier-one
|
||||
|
||||
cli: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -o zerotier-cli cli.cpp $(OBJS) $(LIBS)
|
||||
$(STRIP) zerotier-cli
|
||||
|
||||
selftest: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -o zerotier-selftest selftest.cpp $(OBJS) $(LIBS)
|
||||
$(STRIP) zerotier-selftest
|
||||
|
||||
idtool: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -o zerotier-idtool idtool.cpp $(OBJS) $(LIBS)
|
||||
$(STRIP) zerotier-idtool
|
||||
|
||||
mac-tap: FORCE
|
||||
cd mac-tap/tuntap ; make tap.kext
|
||||
|
||||
install-mac-tap: FORCE
|
||||
mkdir -p /Library/Application\ Support/ZeroTier/One
|
||||
rm -rf /Library/Application\ Support/ZeroTier/One/tap.kext
|
||||
cp -R mac-tap/tuntap/tap.kext /Library/Application\ Support/ZeroTier/One
|
||||
chown -R root:wheel /Library/Application\ Support/ZeroTier/One/tap.kext
|
||||
|
||||
clean:
|
||||
rm -rf *.dSYM
|
||||
rm -f $(OBJS) zerotier-*
|
||||
cd mac-tap/tuntap ; make clean
|
||||
|
||||
FORCE:
|
||||
+22
-1
@@ -7,7 +7,7 @@ By convention, ZeroTier One will keep its state here on mac:
|
||||
/Library/Application Support/ZeroTier/One
|
||||
|
||||
ZeroTier ships with a kernel extension for its own tap device, which it
|
||||
stores in the above directory. To install this from source, type:
|
||||
stores in the above directory. To install this, type:
|
||||
|
||||
sudo make -f Makefile.mac install-mac-tap
|
||||
|
||||
@@ -55,3 +55,24 @@ browser to see if you're online.
|
||||
Port in progress, and it's going to pretty much always be more painful to
|
||||
build than *nix systems. Just wait for the binary release unless you're
|
||||
brave, in which case you can load the VS2012 solution and play around.
|
||||
|
||||
-- Open UDP port 9993
|
||||
|
||||
As noted in README.md, to actually function properly, you need to open
|
||||
UDP port 9993 in your firewall. Following are instructions to open UDP port
|
||||
9993 for specific operating systems.
|
||||
|
||||
--- Ubuntu (version 12.04 and possibly other versions, too)
|
||||
|
||||
Follow the Ubuntu documentation about UFW https://help.ubuntu.com/community/UFW
|
||||
|
||||
Check if your UFW is active.
|
||||
|
||||
sudo ufw status verbose
|
||||
|
||||
If it is active, open UDP port 9993
|
||||
|
||||
sudo ufw allow 9993/udp
|
||||
|
||||
You should now be able to ping and browse earth.zerotier.net
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
|
||||
<plist version="0.9">
|
||||
<dict>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>NSApplication</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>zt1icon.icns</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>ZeroTier One (Mac GUI)</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>ZeroTier One</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.zerotier.ZeroTierOne</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,98 @@
|
||||
QT += core gui widgets
|
||||
TARGET = "ZeroTier One"
|
||||
TEMPLATE = app
|
||||
|
||||
win32:RC_FILE = ZeroTierUI.rc
|
||||
mac:ICON = zt1icon.icns
|
||||
mac:QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6
|
||||
mac:QMAKE_INFO_PLIST = Info.plist
|
||||
|
||||
SOURCES += main.cpp\
|
||||
mainwindow.cpp \
|
||||
aboutwindow.cpp \
|
||||
../node/C25519.cpp \
|
||||
../node/CertificateOfMembership.cpp \
|
||||
../node/Defaults.cpp \
|
||||
../node/Demarc.cpp \
|
||||
../node/EthernetTap.cpp \
|
||||
../node/HttpClient.cpp \
|
||||
../node/Identity.cpp \
|
||||
../node/InetAddress.cpp \
|
||||
../node/Logger.cpp \
|
||||
../node/Multicaster.cpp \
|
||||
../node/Network.cpp \
|
||||
../node/NetworkConfig.cpp \
|
||||
../node/Node.cpp \
|
||||
../node/NodeConfig.cpp \
|
||||
../node/Packet.cpp \
|
||||
../node/PacketDecoder.cpp \
|
||||
../node/Peer.cpp \
|
||||
../node/Poly1305.cpp \
|
||||
../node/Salsa20.cpp \
|
||||
../node/Service.cpp \
|
||||
../node/SHA512.cpp \
|
||||
../node/SoftwareUpdater.cpp \
|
||||
../node/Switch.cpp \
|
||||
../node/SysEnv.cpp \
|
||||
../node/Topology.cpp \
|
||||
../node/UdpSocket.cpp \
|
||||
../node/Utils.cpp \
|
||||
../ext/lz4/lz4.c \
|
||||
../ext/lz4/lz4hc.c \
|
||||
networkwidget.cpp
|
||||
|
||||
HEADERS += mainwindow.h \
|
||||
aboutwindow.h \
|
||||
../node/Node.hpp \
|
||||
../node/Utils.hpp \
|
||||
../node/Defaults.hpp \
|
||||
../node/Address.hpp \
|
||||
../node/Array.hpp \
|
||||
../node/AtomicCounter.hpp \
|
||||
../node/BandwidthAccount.hpp \
|
||||
../node/Buffer.hpp \
|
||||
../node/C25519.hpp \
|
||||
../node/CertificateOfMembership.hpp \
|
||||
../node/CMWC4096.hpp \
|
||||
../node/Condition.hpp \
|
||||
../node/Constants.hpp \
|
||||
../node/Demarc.hpp \
|
||||
../node/Dictionary.hpp \
|
||||
../node/EthernetTap.hpp \
|
||||
../node/HttpClient.hpp \
|
||||
../node/Identity.hpp \
|
||||
../node/InetAddress.hpp \
|
||||
../node/Logger.hpp \
|
||||
../node/MAC.hpp \
|
||||
../node/Multicaster.hpp \
|
||||
../node/MulticastGroup.hpp \
|
||||
../node/Mutex.hpp \
|
||||
../node/Network.hpp \
|
||||
../node/NetworkConfig.hpp \
|
||||
../node/NodeConfig.hpp \
|
||||
../node/NonCopyable.hpp \
|
||||
../node/Packet.hpp \
|
||||
../node/PacketDecoder.hpp \
|
||||
../node/Peer.hpp \
|
||||
../node/Poly1305.hpp \
|
||||
../node/RuntimeEnvironment.hpp \
|
||||
../node/Salsa20.hpp \
|
||||
../node/Service.hpp \
|
||||
../node/SHA512.hpp \
|
||||
../node/SharedPtr.hpp \
|
||||
../node/SoftwareUpdater.hpp \
|
||||
../node/Switch.hpp \
|
||||
../node/SysEnv.hpp \
|
||||
../node/Thread.hpp \
|
||||
../node/Topology.hpp \
|
||||
../node/UdpSocket.hpp \
|
||||
../ext/lz4/lz4.h \
|
||||
../ext/lz4/lz4hc.h \
|
||||
networkwidget.h
|
||||
|
||||
FORMS += mainwindow.ui \
|
||||
aboutwindow.ui \
|
||||
networkwidget.ui
|
||||
|
||||
RESOURCES += \
|
||||
resources.qrc
|
||||
@@ -0,0 +1 @@
|
||||
IDI_ICON1 ICON DISCARDABLE "zt1icon.ico"
|
||||
@@ -0,0 +1,17 @@
|
||||
#include "aboutwindow.h"
|
||||
#include "ui_aboutwindow.h"
|
||||
|
||||
#include <QMessageBox>
|
||||
#include "../node/Defaults.hpp"
|
||||
|
||||
AboutWindow::AboutWindow(QWidget *parent) :
|
||||
QDialog(parent),
|
||||
ui(new Ui::AboutWindow)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
}
|
||||
|
||||
AboutWindow::~AboutWindow()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
#ifndef AboutWindow_H
|
||||
#define AboutWindow_H
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
namespace Ui {
|
||||
class AboutWindow;
|
||||
}
|
||||
|
||||
class AboutWindow : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit AboutWindow(QWidget *parent = 0);
|
||||
virtual ~AboutWindow();
|
||||
|
||||
private:
|
||||
Ui::AboutWindow *ui;
|
||||
};
|
||||
|
||||
#endif // AboutWindow_H
|
||||
@@ -0,0 +1,261 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>AboutWindow</class>
|
||||
<widget class="QDialog" name="AboutWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>508</width>
|
||||
<height>261</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>About ZeroTier One</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset resource="resources.qrc">
|
||||
<normaloff>:/img/zt1icon.png</normaloff>:/img/zt1icon.png</iconset>
|
||||
</property>
|
||||
<property name="sizeGripEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QFrame" name="frame">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::StyledPanel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QWidget" name="widget" native="true">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="iconLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>128</width>
|
||||
<height>128</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>128</width>
|
||||
<height>128</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="textFormat">
|
||||
<enum>Qt::PlainText</enum>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap resource="resources.qrc">:/img/zt1icon.png</pixmap>
|
||||
</property>
|
||||
<property name="scaledContents">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::NoTextInteraction</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="frame_2">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::StyledPanel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QLabel" name="aboutTextLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>50</weight>
|
||||
<bold>false</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>ZeroTier One GUI
|
||||
(c)2012-2013 ZeroTier Networks LLC
|
||||
|
||||
Author(s): Adam Ierymenko
|
||||
Version: 1.0</string>
|
||||
</property>
|
||||
<property name="textFormat">
|
||||
<enum>Qt::PlainText</enum>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignHCenter|Qt::AlignTop</set>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::NoTextInteraction</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QWidget" name="widget_2" native="true">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
<property name="centerButtons">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="resources.qrc"/>
|
||||
</resources>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>AboutWindow</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>248</x>
|
||||
<y>254</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>AboutWindow</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
||||
@@ -0,0 +1,50 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleAllowMixedLocalizations</key>
|
||||
<true/>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>applet</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>applet</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.zerotier.one.ZeroTierOneMacAuthenticateScript</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>ZeroTier One (Authenticate)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>aplt</string>
|
||||
<key>LSMinimumSystemVersionByArchitecture</key>
|
||||
<dict>
|
||||
<key>x86_64</key>
|
||||
<string>10.6</string>
|
||||
</dict>
|
||||
<key>LSRequiresCarbon</key>
|
||||
<true/>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>(c) 2013 ZeroTier Networks LLC</string>
|
||||
<key>WindowState</key>
|
||||
<dict>
|
||||
<key>dividerCollapsed</key>
|
||||
<false/>
|
||||
<key>eventLogLevel</key>
|
||||
<integer>-1</integer>
|
||||
<key>name</key>
|
||||
<string>ScriptWindowState</string>
|
||||
<key>positionOfDivider</key>
|
||||
<real>333</real>
|
||||
<key>savedFrame</key>
|
||||
<string>7 181 602 597 0 0 1280 778 </string>
|
||||
<key>selectedTabView</key>
|
||||
<string>result</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
BIN
Binary file not shown.
@@ -0,0 +1 @@
|
||||
APPLaplt
|
||||
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 362 B |
+4
@@ -0,0 +1,4 @@
|
||||
{\rtf1\ansi\ansicpg1252\cocoartf1265
|
||||
{\fonttbl}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
#include "mainwindow.h"
|
||||
#include <QApplication>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication a(argc, argv);
|
||||
MainWindow w;
|
||||
w.show();
|
||||
|
||||
return a.exec();
|
||||
}
|
||||
@@ -0,0 +1,289 @@
|
||||
#include "mainwindow.h"
|
||||
#include "aboutwindow.h"
|
||||
#include "networkwidget.h"
|
||||
#include "ui_mainwindow.h"
|
||||
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <vector>
|
||||
#include <stdexcept>
|
||||
#include <utility>
|
||||
|
||||
#include <QClipboard>
|
||||
#include <QMutex>
|
||||
#include <QCoreApplication>
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
#include <QMessageBox>
|
||||
#include <QDebug>
|
||||
#include <QProcess>
|
||||
#include <QStringList>
|
||||
#include <QVBoxLayout>
|
||||
#include <QScrollBar>
|
||||
#include <QEventLoop>
|
||||
|
||||
// Globally visible
|
||||
ZeroTier::Node::LocalClient *zeroTierClient = (ZeroTier::Node::LocalClient *)0;
|
||||
|
||||
// Main window instance for app
|
||||
static MainWindow *mainWindow = (MainWindow *)0;
|
||||
|
||||
static void handleZTMessage(void *arg,unsigned long id,const char *line)
|
||||
{
|
||||
static std::map< unsigned long,std::vector<std::string> > ztReplies;
|
||||
static QMutex ztReplies_m;
|
||||
|
||||
ztReplies_m.lock();
|
||||
if (*line) {
|
||||
ztReplies[id].push_back(std::string(line));
|
||||
ztReplies_m.unlock();
|
||||
} else { // empty lines conclude transmissions
|
||||
std::map< unsigned long,std::vector<std::string> >::iterator r(ztReplies.find(id));
|
||||
if (r != ztReplies.end()) {
|
||||
MainWindow::ZTMessageEvent *event = new MainWindow::ZTMessageEvent(r->second);
|
||||
ztReplies.erase(r);
|
||||
ztReplies_m.unlock();
|
||||
QCoreApplication::postEvent(mainWindow,event); // must post since this may be another thread
|
||||
} else ztReplies_m.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent) :
|
||||
QMainWindow(parent),
|
||||
ui(new Ui::MainWindow)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->startTimer(1000); // poll service every second
|
||||
this->setEnabled(false); // gets enabled when updates are received
|
||||
mainWindow = this;
|
||||
this->cyclesSinceResponseFromService = 0;
|
||||
|
||||
if (ui->networkListWidget->verticalScrollBar())
|
||||
ui->networkListWidget->verticalScrollBar()->setSingleStep(8);
|
||||
|
||||
QWidgetList widgets = this->findChildren<QWidget*>();
|
||||
foreach(QWidget* widget, widgets)
|
||||
widget->setAttribute(Qt::WA_MacShowFocusRect,false);
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
{
|
||||
delete ui;
|
||||
delete zeroTierClient;
|
||||
zeroTierClient = (ZeroTier::Node::LocalClient *)0;
|
||||
mainWindow = (MainWindow *)0;
|
||||
}
|
||||
|
||||
void MainWindow::timerEvent(QTimerEvent *event)
|
||||
{
|
||||
event->accept();
|
||||
|
||||
if (!zeroTierClient) {
|
||||
std::string dotAuthFile((QDir::homePath() + QDir::separator() + ".zeroTierOneAuthToken").toStdString());
|
||||
std::string authToken;
|
||||
if (!ZeroTier::Utils::readFile(dotAuthFile.c_str(),authToken)) {
|
||||
#ifdef __APPLE__
|
||||
// Run the little AppleScript hack that asks for admin credentials and
|
||||
// then installs the auth token file in the current user's home.
|
||||
QString authHelperPath(QCoreApplication::applicationDirPath() + "/../Resources/helpers/mac/ZeroTier One (Authenticate).app/Contents/MacOS/applet");
|
||||
if (!QFile::exists(authHelperPath)) {
|
||||
// Allow this to also work from the source tree if it's run from there.
|
||||
// This is for debugging purposes and shouldn't harm the live release
|
||||
// in any way.
|
||||
authHelperPath = QCoreApplication::applicationDirPath() + "/../../../../ZeroTierUI/helpers/mac/ZeroTier One (Authenticate).app/Contents/MacOS/applet";
|
||||
if (!QFile::exists(authHelperPath)) {
|
||||
QMessageBox::critical(this,"Unable to Locate Helper","Unable to locate authorization helper, cannot obtain authentication token.",QMessageBox::Ok,QMessageBox::NoButton);
|
||||
QApplication::exit(1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
QProcess::execute(authHelperPath,QStringList());
|
||||
#endif
|
||||
|
||||
if (!ZeroTier::Utils::readFile(dotAuthFile.c_str(),authToken)) {
|
||||
QMessageBox::critical(this,"Cannot Authorize","Unable to authorize this user to administrate ZeroTier One.\n\nTo do so manually, copy 'authtoken.secret' from the ZeroTier One home directory to '.zeroTierOneAuthToken' in your home directory and set file modes on this file to only be readable by you (e.g. 0600 on Mac or Linux systems).",QMessageBox::Ok,QMessageBox::NoButton);
|
||||
QApplication::exit(1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
zeroTierClient = new ZeroTier::Node::LocalClient(authToken.c_str(),0,&handleZTMessage,this);
|
||||
}
|
||||
|
||||
// TODO: do something more user-friendly here... or maybe try to restart
|
||||
// the service?
|
||||
if (++this->cyclesSinceResponseFromService == 3)
|
||||
QMessageBox::critical(this,"No Response from Service","The ZeroTier One service does not appear to be running.",QMessageBox::Ok,QMessageBox::NoButton);
|
||||
|
||||
zeroTierClient->send("info");
|
||||
zeroTierClient->send("listnetworks");
|
||||
zeroTierClient->send("listpeers");
|
||||
}
|
||||
|
||||
void MainWindow::customEvent(QEvent *event)
|
||||
{
|
||||
ZTMessageEvent *m = (ZTMessageEvent *)event; // only one custom event type so far
|
||||
if (m->ztMessage.size() == 0)
|
||||
return;
|
||||
|
||||
std::vector<std::string> hdr(ZeroTier::Node::LocalClient::splitLine(m->ztMessage[0]));
|
||||
if (hdr.size() < 2)
|
||||
return;
|
||||
if (hdr[0] != "200")
|
||||
return;
|
||||
|
||||
this->cyclesSinceResponseFromService = 0;
|
||||
|
||||
if (hdr[1] == "info") {
|
||||
if (hdr.size() >= 3)
|
||||
this->myAddress = hdr[2].c_str();
|
||||
if (hdr.size() >= 4)
|
||||
this->myStatus = hdr[3].c_str();
|
||||
if (hdr.size() >= 5)
|
||||
this->myVersion = hdr[4].c_str();
|
||||
} else if (hdr[1] == "listnetworks") {
|
||||
std::map< std::string,std::vector<std::string> > newNetworks;
|
||||
for(unsigned long i=1;i<m->ztMessage.size();++i) {
|
||||
std::vector<std::string> l(ZeroTier::Node::LocalClient::splitLine(m->ztMessage[i]));
|
||||
// 200 listnetworks <nwid> <name> <status> <config age> <type> <dev> <ips>
|
||||
if ((l.size() == 9)&&(l[2].length() == 16))
|
||||
newNetworks[l[2]] = l;
|
||||
}
|
||||
|
||||
if (newNetworks != networks) {
|
||||
networks = newNetworks;
|
||||
|
||||
for (bool removed=true;removed;) {
|
||||
removed = false;
|
||||
for(int r=0;r<ui->networkListWidget->count();++r) {
|
||||
NetworkWidget *nw = (NetworkWidget *)ui->networkListWidget->itemWidget(ui->networkListWidget->item(r));
|
||||
if (!networks.count(nw->networkId())) {
|
||||
ui->networkListWidget->setVisible(false); // HACK to prevent an occasional crash here, discovered through hours of shotgun debugging... :P
|
||||
delete ui->networkListWidget->takeItem(r);
|
||||
removed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
ui->networkListWidget->setVisible(true);
|
||||
std::set<std::string> alreadyDisplayed;
|
||||
for(int r=0;r<ui->networkListWidget->count();++r) {
|
||||
NetworkWidget *nw = (NetworkWidget *)ui->networkListWidget->itemWidget(ui->networkListWidget->item(r));
|
||||
if (networks.count(nw->networkId()) > 0) {
|
||||
alreadyDisplayed.insert(nw->networkId());
|
||||
std::vector<std::string> &l = networks[nw->networkId()];
|
||||
nw->setNetworkName(l[3]);
|
||||
nw->setStatus(l[4],l[5]);
|
||||
nw->setNetworkType(l[6]);
|
||||
nw->setNetworkDeviceName(l[7]);
|
||||
nw->setIps(l[8]);
|
||||
}
|
||||
}
|
||||
for(std::map< std::string,std::vector<std::string> >::iterator nwdata(networks.begin());nwdata!=networks.end();++nwdata) {
|
||||
if (alreadyDisplayed.count(nwdata->first) == 0) {
|
||||
std::vector<std::string> &l = nwdata->second;
|
||||
NetworkWidget *nw = new NetworkWidget((QWidget *)0,nwdata->first);
|
||||
nw->setNetworkName(l[3]);
|
||||
nw->setStatus(l[4],l[5]);
|
||||
nw->setNetworkType(l[6]);
|
||||
nw->setNetworkDeviceName(l[7]);
|
||||
nw->setIps(l[8]);
|
||||
QListWidgetItem *item = new QListWidgetItem();
|
||||
item->setSizeHint(nw->sizeHint());
|
||||
ui->networkListWidget->addItem(item);
|
||||
ui->networkListWidget->setItemWidget(item,nw);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (hdr[1] == "listpeers") {
|
||||
this->numPeers = 0;
|
||||
for(unsigned long i=1;i<m->ztMessage.size();++i) {
|
||||
std::vector<std::string> l(ZeroTier::Node::LocalClient::splitLine(m->ztMessage[i]));
|
||||
if ((l.size() >= 5)&&((l[3] != "-")||(l[4] != "-")))
|
||||
++this->numPeers; // number of direct peers online -- check for active IPv4 and/or IPv6 address
|
||||
}
|
||||
}
|
||||
|
||||
if (this->myAddress.size())
|
||||
ui->addressButton->setText(this->myAddress);
|
||||
else ui->addressButton->setText(" ");
|
||||
|
||||
QString st(this->myStatus);
|
||||
st += ", v";
|
||||
st += this->myVersion;
|
||||
st += ", ";
|
||||
st += QString::number(this->numPeers);
|
||||
st += " direct links to peers";
|
||||
ui->statusLabel->setText(st);
|
||||
|
||||
if (this->myStatus == "ONLINE") {
|
||||
if (!this->isEnabled())
|
||||
this->setEnabled(true);
|
||||
} else {
|
||||
if (this->isEnabled())
|
||||
this->setEnabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
AboutWindow *about = new AboutWindow(this);
|
||||
about->show();
|
||||
}
|
||||
|
||||
void MainWindow::on_networkIdLineEdit_textChanged(const QString &text)
|
||||
{
|
||||
QString newText;
|
||||
for(QString::const_iterator i(text.begin());i!=text.end();++i) {
|
||||
switch(i->toLatin1()) {
|
||||
case '0': newText.append('0'); break;
|
||||
case '1': newText.append('1'); break;
|
||||
case '2': newText.append('2'); break;
|
||||
case '3': newText.append('3'); break;
|
||||
case '4': newText.append('4'); break;
|
||||
case '5': newText.append('5'); break;
|
||||
case '6': newText.append('6'); break;
|
||||
case '7': newText.append('7'); break;
|
||||
case '8': newText.append('8'); break;
|
||||
case '9': newText.append('9'); break;
|
||||
case 'a': newText.append('a'); break;
|
||||
case 'b': newText.append('b'); break;
|
||||
case 'c': newText.append('c'); break;
|
||||
case 'd': newText.append('d'); break;
|
||||
case 'e': newText.append('e'); break;
|
||||
case 'f': newText.append('f'); break;
|
||||
case 'A': newText.append('a'); break;
|
||||
case 'B': newText.append('b'); break;
|
||||
case 'C': newText.append('c'); break;
|
||||
case 'D': newText.append('d'); break;
|
||||
case 'E': newText.append('e'); break;
|
||||
case 'F': newText.append('f'); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
if (newText.size() > 16)
|
||||
newText.truncate(16);
|
||||
ui->networkIdLineEdit->setText(newText);
|
||||
}
|
||||
|
||||
void MainWindow::on_addressButton_clicked()
|
||||
{
|
||||
QApplication::clipboard()->setText(this->myAddress);
|
||||
}
|
||||
Loaded 20 of 239 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user