mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2026-09-22 15:29:03 -07:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f8364ba59 | ||
|
|
eadff71d37 | ||
|
|
af62a6cade | ||
|
|
de4e29288d | ||
|
|
44d58ee871 | ||
|
|
9d5819ff44 | ||
|
|
08d7fe0432 | ||
|
|
9f2571cc01 | ||
|
|
b4b2e2ed9f | ||
|
|
17ebd0afc7 | ||
|
|
351b7f3a09 | ||
|
|
721625d512 | ||
|
|
282114e96c | ||
|
|
95d123cfc2 | ||
|
|
f5cbb45ab9 | ||
|
|
b7b9b9c0b7 | ||
|
|
715afc0314 | ||
|
|
f281886bfd | ||
|
|
4f0fcc582e | ||
|
|
aa59cfd545 | ||
|
|
f696299cfc | ||
|
|
b0719eacf9 | ||
|
|
c2187c8759 | ||
|
|
56296f96db | ||
|
|
be6b61b1bc | ||
|
|
f8d4611d15 | ||
|
|
f25bd41a03 | ||
|
|
fe3ad5e2cc | ||
|
|
502ea66f15 | ||
|
|
673aab5ba2 | ||
|
|
77457cbff1 | ||
|
|
db0d17cebb | ||
|
|
dd58006d65 | ||
|
|
f0ebb0b0f1 | ||
|
|
8c9d3146df | ||
|
|
117f977ce3 | ||
|
|
d8e5d9d6e8 | ||
|
|
1f5feb75fb | ||
|
|
05031ff938 | ||
|
|
adfb71fa6b | ||
|
|
37341048a9 | ||
|
|
b3491f9de1 | ||
|
|
80fc584923 | ||
|
|
b7389995f4 | ||
|
|
92d9ad4a7f | ||
|
|
8a804b5257 | ||
|
|
e3c5ada3a7 | ||
|
|
7adf0eac7e | ||
|
|
df0a8e8450 | ||
|
|
526435859f | ||
|
|
98d426e1d5 | ||
|
|
b80c229d87 | ||
|
|
9b93141dd0 | ||
|
|
59ebc9d41e | ||
|
|
f0199d6770 | ||
|
|
f2d372545a | ||
|
|
9809511c4c | ||
|
|
538e8a86c8 | ||
|
|
27aa6ea44e | ||
|
|
7475c4047e | ||
|
|
5e58a7d54a | ||
|
|
6a174483d8 | ||
|
|
a76d9d4408 | ||
|
|
1189f4a568 | ||
|
|
51766e6549 | ||
|
|
d315156733 | ||
|
|
4c4675e3ac | ||
|
|
49ef980ecf | ||
|
|
12692c551e | ||
|
|
00f9305ad8 | ||
|
|
0097949ba9 | ||
|
|
1b33a9e807 | ||
|
|
4a0b33561c | ||
|
|
96faaa85cf | ||
|
|
f82c7006ea | ||
|
|
681af253ef | ||
|
|
88bdb81791 | ||
|
|
458f6ae7c3 | ||
|
|
999e963533 | ||
|
|
5336f2600a | ||
|
|
38433e85bf | ||
|
|
c3cbc92757 | ||
|
|
45a1e048bb | ||
|
|
40bd460b1c | ||
|
|
ae7143d693 | ||
|
|
aead1050fb | ||
|
|
6e485833ef | ||
|
|
be0a8ec1f1 | ||
|
|
11e1f7a3fb | ||
|
|
0b0d5fabac | ||
|
|
35aa0921ee | ||
|
|
2f8936181c | ||
|
|
4c3fb8cf10 | ||
|
|
c3cea55493 | ||
|
|
5d467f0f45 | ||
|
|
2162a419e3 | ||
|
|
f15271f31f | ||
|
|
9d6488c31a | ||
|
|
adc922d7fb | ||
|
|
cf4700bc26 | ||
|
|
367b5439e1 | ||
|
|
6802da457e | ||
|
|
5682f0b772 | ||
|
|
08b7bb3c7a | ||
|
|
d6a4f8d77b | ||
|
|
c30f9832b0 | ||
|
|
d44e1349d8 | ||
|
|
6f831d5370 | ||
|
|
4e1f49258b | ||
|
|
fb31f93c52 | ||
|
|
f720f04fa0 | ||
|
|
7a56c3c396 | ||
|
|
994565bdeb | ||
|
|
67498e576c | ||
|
|
eae130467b | ||
|
|
f764cf8d31 | ||
|
|
49247180dc | ||
|
|
914bebba31 | ||
|
|
4b773b61f5 | ||
|
|
657f6ae342 | ||
|
|
2861229558 | ||
|
|
f939d0ee62 | ||
|
|
77c58e741d | ||
|
|
66a38a9e7c | ||
|
|
31ddc49da2 | ||
|
|
317995b921 | ||
|
|
beb7b5bbe5 | ||
|
|
05f5755bb1 | ||
|
|
cfd92cb18d | ||
|
|
2456d3a197 | ||
|
|
f0b821f880 | ||
|
|
319f9a9346 | ||
|
|
596e5dd583 | ||
|
|
b958a2d30c | ||
|
|
e270887391 | ||
|
|
986773cc9c | ||
|
|
ecbcc9eb2c | ||
|
|
1ad29fe31f | ||
|
|
42f6aae259 | ||
|
|
de485ad900 | ||
|
|
99c5fae9da | ||
|
|
98f0418fb9 | ||
|
|
d7977fa3e1 | ||
|
|
1e6475fad6 | ||
|
|
d5f95b721d | ||
|
|
ae2eeff5c6 | ||
|
|
08da4b8c7b | ||
|
|
0ba0c6d04d | ||
|
|
93f24ea86a | ||
|
|
f8eae84e15 | ||
|
|
7831c4bfef | ||
|
|
5f45977e3e | ||
|
|
d187ec82d4 | ||
|
|
42c3474223 | ||
|
|
aee742e767 | ||
|
|
c9294c1a78 | ||
|
|
b117ff5435 | ||
|
|
119ef5ecbf | ||
|
|
8fb442d81a | ||
|
|
73153b89b4 | ||
|
|
d9836adbf6 | ||
|
|
420edf23ad | ||
|
|
6c5f6feb5e | ||
|
|
a1c1c82b0d | ||
|
|
83a0d988ec | ||
|
|
a8c12369fd | ||
|
|
28a6d328a5 | ||
|
|
dd404b8ba3 | ||
|
|
1c636afe3f | ||
|
|
48a1799f49 | ||
|
|
bf24de43fe | ||
|
|
76d9ea911d | ||
|
|
ff773def26 | ||
|
|
5abfb11813 | ||
|
|
0b8d6c7f4a | ||
|
|
6c60305a96 | ||
|
|
19c4d82512 | ||
|
|
e11149bcae | ||
|
|
fe85426df6 | ||
|
|
158002d2d1 | ||
|
|
c96d3ebf8c | ||
|
|
b1088a6bd7 | ||
|
|
f0223490be | ||
|
|
81e5690410 | ||
|
|
700a450806 | ||
|
|
0e1fc06a6f | ||
|
|
c3b41c289d | ||
|
|
6ab95e0391 | ||
|
|
67b3fa9311 | ||
|
|
316e8d1939 | ||
|
|
f13493edb2 | ||
|
|
595b386afc | ||
|
|
8e587ae481 | ||
|
|
acb056e3b1 | ||
|
|
5ef2c6fd6f | ||
|
|
1a0572d7e7 | ||
|
|
7957ab6b1d | ||
|
|
e8b613e625 | ||
|
|
9c68a343f6 | ||
|
|
881ff08269 | ||
|
|
e3239d23f4 | ||
|
|
f9c92b0351 | ||
|
|
b73c36acbf | ||
|
|
181369964f | ||
|
|
d2c5d71502 | ||
|
|
c231510f8b | ||
|
|
2ac56fd120 | ||
|
|
e6b23059ac | ||
|
|
04169b5150 | ||
|
|
daaec84c6b | ||
|
|
73c1d43f2f | ||
|
|
ab5a460177 | ||
|
|
67a85221d5 | ||
|
|
328be8f846 | ||
|
|
d9b91758e0 | ||
|
|
4e26ade2df | ||
|
|
8d3eb1a258 | ||
|
|
33ad3deaee | ||
|
|
ba3f04deed | ||
|
|
45e823d27c | ||
|
|
70b736f440 | ||
|
|
97e6b38144 | ||
|
|
7a45ff460d | ||
|
|
6f5a4d7e29 | ||
|
|
4d0ad9abb6 | ||
|
|
15e8c18106 | ||
|
|
1c555e4b96 | ||
|
|
6fdb360e2a | ||
|
|
0d847d9410 | ||
|
|
abc82d6a52 | ||
|
|
acf7d70d24 | ||
|
|
3be4c38946 | ||
|
|
6a1bd52854 | ||
|
|
0b75992737 | ||
|
|
91fef21973 | ||
|
|
dc0f3559be | ||
|
|
bb25128406 | ||
|
|
bf5d8de999 | ||
|
|
1a0a6755b1 | ||
|
|
8adbbe092d | ||
|
|
bd749e040d | ||
|
|
7e80d7e551 | ||
|
|
ce09d00679 | ||
|
|
dbd7a06ea9 | ||
|
|
74c2e644a9 | ||
|
|
dfee7e0389 | ||
|
|
60f25ccdf9 | ||
|
|
2b0dbead17 | ||
|
|
d0b506c12b | ||
|
|
742261c7fc | ||
|
|
939cdc82a2 | ||
|
|
a207ce13c0 | ||
|
|
17c77da38f | ||
|
|
54313212a4 | ||
|
|
b2673eab55 | ||
|
|
282d41bc94 | ||
|
|
b72c2c6358 | ||
|
|
5581339d5b | ||
|
|
78f3966d66 | ||
|
|
bae9fa1480 | ||
|
|
cef750d1d2 | ||
|
|
be36eda858 | ||
|
|
13fbf9a200 | ||
|
|
f2a03f68bd | ||
|
|
d997c1a32a | ||
|
|
d27251ec4e | ||
|
|
9ae6403346 | ||
|
|
39d411ce0b | ||
|
|
93fe848bb6 | ||
|
|
9d05897f7a | ||
|
|
cbeb9c5236 | ||
|
|
2203958798 | ||
|
|
268ec8d1e0 | ||
|
|
093d745b86 | ||
|
|
655b6d1996 | ||
|
|
833a0621fa | ||
|
|
b5c3a92be2 | ||
|
|
78694bb2f5 | ||
|
|
297cfd86fa | ||
|
|
43b2bf6c16 | ||
|
|
aceb938e07 | ||
|
|
68f44fb932 | ||
|
|
e38619dd02 | ||
|
|
4ec7cd2760 | ||
|
|
b0277ab904 | ||
|
|
87b26b0aaf | ||
|
|
01d13c153d |
No files matched your search
+7
-5
@@ -6,16 +6,20 @@
|
||||
.DS_Store
|
||||
.Apple*
|
||||
*.dSYM
|
||||
/netconf-service/netconf-test
|
||||
/netconf-service/netconf.service
|
||||
/netconf-service/node_modules
|
||||
/ipch
|
||||
/windows/ZeroTierOne.sdf
|
||||
/windows/ZeroTierOne.v11.suo
|
||||
/windows/x64
|
||||
/windows/Win32
|
||||
/windows/*/x64
|
||||
/windows/*/Win32
|
||||
/windows/ZeroTierOne/Release
|
||||
/windows/ZeroTierOneService/obj
|
||||
/windows/ZeroTierOneService/bin
|
||||
/windows/Build
|
||||
/ext/installfiles/windows/ZeroTier One-SetupFiles
|
||||
/ext/installfiles/windows/Prerequisites
|
||||
*.log
|
||||
*.opensdf
|
||||
*.user
|
||||
@@ -26,7 +30,5 @@
|
||||
/ZeroTierOneInstaller-*
|
||||
.qmake.stash
|
||||
*.autosave
|
||||
/ZeroTier One.zip
|
||||
/ZeroTier One.dmg
|
||||
/windows/x64
|
||||
/windows/ZeroTierOneInstaller/ZeroTierOneInstaller
|
||||
/root-topology/*.secret
|
||||
+2
-10
@@ -8,21 +8,13 @@ do this eventually.
|
||||
|
||||
-- Linux
|
||||
|
||||
make
|
||||
|
||||
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.
|
||||
Just type 'make'. You'll need gcc and g++ installed, but ZeroTier One requires
|
||||
no other third party libraries beyond the standard libc, libstdc++, and libm.
|
||||
|
||||
-- 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:
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
ZeroTier One
|
||||
ZeroTier One - Ethernet Virtualization
|
||||
======
|
||||
|
||||
ZeroTier One creates flat virtual Ethernet networks of almost unlimited size. [Visit ZeroTier Networks on the web](https://www.zerotier.com/) for more information.
|
||||
ZeroTier One is an ethernet virtualization engine. It creates virtual LANs of almost unlimited size that span physical network boundaries.
|
||||
|
||||
This project is now in beta, which means that major incompatible protocol shifts should now become considerably more rare. You should still update very often if you plan to use it. Binary packages with auto-update are coming very soon.
|
||||
The underlying protocol is peer to peer with managed anchor points ("supernodes") for instant-on communication, assisted NAT traversal, and relaying for users who cannot make P2P connections. All unicast packets are encrypted end-to-end using private keys that only you control. Multicast and broadcast work as they would on a normal LAN, except that traffic is throttled and intelligently prioritized on large networks to stay within bandwidth limits while preserving essential functionality (multicast triage algorithm). Its behavior is not unlike some enterprise-grade intelligent ethernet switches designed for huge wired networks such as university LANs.
|
||||
|
||||
Follow the [ZeroTier blog](http://blog.zerotier.com/) and the [GitHub project](https://github.com/zerotier/ZeroTierOne) to stay up to date.
|
||||
[Visit ZeroTier Networks on the web](https://www.zerotier.com/) for more information. Follow the [ZeroTier blog](https://www.zerotier.com/blog/) and the [GitHub project](https://github.com/zerotier/ZeroTierOne) to stay up to date. See the GitHub-hosted wiki (sidebar) for technical info and help for various platforms.
|
||||
|
||||
See BUILDING.txt and RUNNING.txt for instructions. It currently runs on Mac and Linux. A Windows port is well along the way to completion. If you're brave you can load the Visual Studio 2012 solution and play around.
|
||||
Auto-updating binary packages that install easily [can be found here.](https://www.zerotier.com/download.html) Packages for popular Linux distributions that neatly wrap the Linux installer/uninstaller are coming soon. If you want to build from source, clone this repository and see BUILDING.txt and RUNNING.txt. If you build manually you'll have to update manually.
|
||||
|
||||
Once you have it running you can join the Earth network -- a LAN for the planet -- by using the 'zerotier-cli' tool: 'sudo zerotier-cli join 8056c2e21c000001'. Right now Earth is the only network. Ability to create private networks, as well as some additional special-purpose public ones, will be coming soon. (Note: previous alpha versions auto-joined Earth, but since 0.5.0 it no longer does this.)
|
||||
Once you are up and running, you can [create an account on the network control panel](https://www.zerotier.com/networks.html) if you want to create a private network or you can join [Earth](https://www.zerotier.com/earth.html) by running (on Linux and Mac) `sudo ./zerotier-cli join 8056c2e21c000001`. (Earth is a public virtual network, meaning that it has no access control and allows anyone to join. Make sure your system is up to date and you have no unprotected network services listening.)
|
||||
|
||||
Note that this won't work if your firewall does not allow outbound UDP. It must allow two way UDP conversations on port 9993 at a minimum.
|
||||
Note: If UDP traffic over port 9993 (at a minimum) is not permitted by your local or network firewall(s), ZeroTier One will fall back to TCP tunneling to supernodes over port 443 and will not be able to make direct NAT-t connections to other peers. This fallback mode slows things down considerably. If you're getting very poor performance check your firewall settings. You can see if fallback mode is active by checking for outbound TCP connections from the zerotier-one process to port 443 on five or six hosts in the zerotier.com domain. (See Defaults.cpp for a list of these hosts.)
|
||||
|
||||
ZeroTier One is licensed under the GNU General Public License version 3. You are free to use, modify, or redistribute it under the terms of that license. If you would like to embed ZeroTier One in a closed source product or create a closed source derivative product, contact ZeroTier Networks LLC.
|
||||
Most users will use IPv4 and/or IPv6 over ZeroTier One, but since it virtualizes at the ethernet (layer 2) level it can technically host almost any protocol. Users have made classic multiplayer games work over IPX, for example. Services like DHCP and IPv6 NDP for link-local addresses can work automatically.
|
||||
|
||||
(c)2012-2013 [ZeroTier Networks LLC](https://www.zerotier.com/)
|
||||
The service is free for public networks and for managed private networks up to ten users. The code is open source and is licensed under the GNU GPL v3 (not LGPL). If you'd like to embed it in a closed-source commercial product, please e-mail [contact@zerotier.com](mailto:contact@zerotier.com) to discuss licensing.
|
||||
+31
-35
@@ -1,15 +1,19 @@
|
||||
First build it -- see BUILDING.txt -- then...
|
||||
This guide is for those building and running from source. See BUILDING.txt
|
||||
first.
|
||||
|
||||
-- MacOS --
|
||||
The wiki at GitHub contains several pages that are probably also of interest:
|
||||
https://github.com/zerotier/ZeroTierOne/wiki
|
||||
|
||||
By convention, ZeroTier One will keep its state here on mac:
|
||||
--- MacOS
|
||||
|
||||
On Mac, the default ZeroTier home is:
|
||||
|
||||
/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, type:
|
||||
|
||||
sudo make -f Makefile.mac install-mac-tap
|
||||
sudo make install-mac-tap
|
||||
|
||||
This will create the ZeroTier One home above if it does not exist and install
|
||||
the kext there. Note that the kext must be owned by root:wheel. The make
|
||||
@@ -20,14 +24,7 @@ If run with no options, it will use the default home directory above.
|
||||
|
||||
sudo ./zerotier-one &
|
||||
|
||||
Finally, join the Earth network (the big public LAN and the only net for now):
|
||||
|
||||
sudo zerotier-cli join 8056c2e21c000001
|
||||
|
||||
Try pinging earth.zerotier.net and going to http://earth.zerotier.net/ in a
|
||||
browser to see if you're online.
|
||||
|
||||
-- Linux
|
||||
--- LINUX
|
||||
|
||||
On Linux, the default ZeroTier home is:
|
||||
|
||||
@@ -38,31 +35,14 @@ Just type:
|
||||
sudo mkdir /var/lib/zerotier-one
|
||||
sudo ./zerotier-one &
|
||||
|
||||
When run with no options, ZT1 uses its default home path on the current
|
||||
platform. Note that ZT1 requires the Linux tap driver, so it must be
|
||||
available in the kernel or as a module. In most Linux distributions it's
|
||||
included out of the box and should just work.
|
||||
Your system must have the Linux tun/tap driver available (tun). All tested
|
||||
distributions so far ship with this driver as a module that will load
|
||||
automatically.
|
||||
|
||||
Finally, join the Earth network (the big public LAN and the only net for now):
|
||||
UDP port 9993 must be open in your local firewall for this to work properly.
|
||||
How to do this varies by Linux distribution.
|
||||
|
||||
sudo zerotier-cli join bc8f9a8ee3000001
|
||||
|
||||
Try pinging earth.zerotier.net and going to http://earth.zerotier.net/ in a
|
||||
browser to see if you're online.
|
||||
|
||||
-- Windows
|
||||
|
||||
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)
|
||||
- Opening port 9993 on Ubuntu
|
||||
|
||||
Follow the Ubuntu documentation about UFW https://help.ubuntu.com/community/UFW
|
||||
|
||||
@@ -76,3 +56,19 @@ sudo ufw allow 9993/udp
|
||||
|
||||
You should now be able to ping and browse earth.zerotier.net
|
||||
|
||||
--- WINDOWS
|
||||
|
||||
A windows port is in progress.
|
||||
|
||||
--- ONCE IT'S RUNNING:
|
||||
|
||||
To use the command line interface, see this guide:
|
||||
https://github.com/zerotier/ZeroTierOne/wiki/Command-Line-Interface
|
||||
|
||||
If you want to test by joining the Earth network, try:
|
||||
sudo ./zerotier-cli join 8056c2e21c000001
|
||||
|
||||
An interface called 'zt0' should appear and should get an IP address in
|
||||
the 28.0.0.0/7 range (28.* or 29.*) within a few seconds or so. Then try
|
||||
pinging earth.zerotier.net or navigating to http://earth.zerotier.net/ in
|
||||
a web browser.
|
||||
@@ -0,0 +1,9 @@
|
||||
REM If you're an OSS user and want to run this batch file, edit to change the path to Qt.
|
||||
REM Start Visual Studio command prompt and run this from within the ZeroTierUI subfolder.
|
||||
|
||||
CD ..
|
||||
MKDIR build-ZeroTierUI-win32-release
|
||||
CD build-ZeroTierUI-win32-release
|
||||
C:\Qt\5.2.1\Src\qtbase\bin\qmake.exe ..\ZeroTierUI\ZeroTierUI.pro
|
||||
nmake clean
|
||||
nmake
|
||||
+38
-32
@@ -12,16 +12,20 @@ mac:QMAKE_INFO_PLIST = Info.plist
|
||||
mac:LIBS += -framework Cocoa
|
||||
|
||||
SOURCES += main.cpp \
|
||||
mainwindow.cpp \
|
||||
aboutwindow.cpp \
|
||||
mainwindow.cpp \
|
||||
aboutwindow.cpp \
|
||||
networkwidget.cpp \
|
||||
installdialog.cpp \
|
||||
licensedialog.cpp \
|
||||
onetimedialog.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/IpcConnection.cpp \
|
||||
../node/IpcListener.cpp \
|
||||
../node/Logger.cpp \
|
||||
../node/Multicaster.cpp \
|
||||
../node/Network.cpp \
|
||||
@@ -32,27 +36,28 @@ SOURCES += main.cpp \
|
||||
../node/PacketDecoder.cpp \
|
||||
../node/Peer.cpp \
|
||||
../node/Poly1305.cpp \
|
||||
../node/RoutingTable.cpp \
|
||||
../node/Salsa20.cpp \
|
||||
../node/Service.cpp \
|
||||
../node/SHA512.cpp \
|
||||
../node/SocketManager.cpp \
|
||||
../node/SoftwareUpdater.cpp \
|
||||
../node/Switch.cpp \
|
||||
../node/SysEnv.cpp \
|
||||
../node/TcpSocket.cpp \
|
||||
../node/Topology.cpp \
|
||||
../node/UdpSocket.cpp \
|
||||
../node/Utils.cpp \
|
||||
../ext/lz4/lz4.c \
|
||||
../ext/lz4/lz4hc.c \
|
||||
networkwidget.cpp \
|
||||
installdialog.cpp \
|
||||
licensedialog.cpp \
|
||||
onetimedialog.cpp
|
||||
../node/Dictionary.cpp
|
||||
|
||||
HEADERS += mainwindow.h \
|
||||
aboutwindow.h \
|
||||
../node/Node.hpp \
|
||||
../node/Utils.hpp \
|
||||
../node/Defaults.hpp \
|
||||
aboutwindow.h \
|
||||
networkwidget.h \
|
||||
installdialog.h \
|
||||
mac_doprivileged.h \
|
||||
licensedialog.h \
|
||||
main.h \
|
||||
onetimedialog.h \
|
||||
../node/Address.hpp \
|
||||
../node/Array.hpp \
|
||||
../node/AtomicCounter.hpp \
|
||||
@@ -61,14 +66,14 @@ HEADERS += mainwindow.h \
|
||||
../node/C25519.hpp \
|
||||
../node/CertificateOfMembership.hpp \
|
||||
../node/CMWC4096.hpp \
|
||||
../node/Condition.hpp \
|
||||
../node/Constants.hpp \
|
||||
../node/Demarc.hpp \
|
||||
../node/Defaults.hpp \
|
||||
../node/Dictionary.hpp \
|
||||
../node/EthernetTap.hpp \
|
||||
../node/HttpClient.hpp \
|
||||
../node/Identity.hpp \
|
||||
../node/InetAddress.hpp \
|
||||
../node/IpcConnection.hpp \
|
||||
../node/IpcListener.hpp \
|
||||
../node/Logger.hpp \
|
||||
../node/MAC.hpp \
|
||||
../node/Multicaster.hpp \
|
||||
@@ -76,10 +81,12 @@ HEADERS += mainwindow.h \
|
||||
../node/Mutex.hpp \
|
||||
../node/Network.hpp \
|
||||
../node/NetworkConfig.hpp \
|
||||
../node/Node.hpp \
|
||||
../node/NodeConfig.hpp \
|
||||
../node/NonCopyable.hpp \
|
||||
../node/Packet.hpp \
|
||||
../node/PacketDecoder.hpp \
|
||||
../node/Path.hpp \
|
||||
../node/Peer.hpp \
|
||||
../node/Poly1305.hpp \
|
||||
../node/RuntimeEnvironment.hpp \
|
||||
@@ -87,28 +94,27 @@ HEADERS += mainwindow.h \
|
||||
../node/Service.hpp \
|
||||
../node/SHA512.hpp \
|
||||
../node/SharedPtr.hpp \
|
||||
../node/Socket.hpp \
|
||||
../node/SocketManager.hpp \
|
||||
../node/SoftwareUpdater.hpp \
|
||||
../node/Switch.hpp \
|
||||
../node/SysEnv.hpp \
|
||||
../node/RoutingTable.hpp \
|
||||
../node/TcpSocket.hpp \
|
||||
../node/Thread.hpp \
|
||||
../node/Topology.hpp \
|
||||
../node/UdpSocket.hpp \
|
||||
../node/Utils.hpp \
|
||||
../ext/lz4/lz4.h \
|
||||
../ext/lz4/lz4hc.h \
|
||||
networkwidget.h \
|
||||
installdialog.h \
|
||||
mac_doprivileged.h \
|
||||
licensedialog.h \
|
||||
main.h \
|
||||
onetimedialog.h
|
||||
../node/EthernetTap.hpp \
|
||||
../node/EthernetTapFactory.hpp
|
||||
|
||||
FORMS += mainwindow.ui \
|
||||
aboutwindow.ui \
|
||||
networkwidget.ui \
|
||||
installdialog.ui \
|
||||
licensedialog.ui \
|
||||
quickstartdialog.ui \
|
||||
onetimedialog.ui
|
||||
aboutwindow.ui \
|
||||
networkwidget.ui \
|
||||
installdialog.ui \
|
||||
licensedialog.ui \
|
||||
quickstartdialog.ui \
|
||||
onetimedialog.ui
|
||||
|
||||
RESOURCES += \
|
||||
resources.qrc
|
||||
@@ -117,4 +123,4 @@ mac:OBJECTIVE_SOURCES += \
|
||||
mac_doprivileged.mm
|
||||
|
||||
OTHER_FILES += \
|
||||
stylesheet.css
|
||||
stylesheet.css
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ZeroTier One - Global Peer to Peer Ethernet
|
||||
* Copyright (C) 2012-2013 ZeroTier Networks LLC
|
||||
* Copyright (C) 2011-2014 ZeroTier Networks LLC
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -39,7 +39,19 @@ AboutWindow::AboutWindow(QWidget *parent) :
|
||||
ui(new Ui::AboutWindow)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
ui->aboutTextLabel->setText(QString("ZeroTier One\nVersion ")+ZeroTier::Node::versionString()+"\nQt Graphical User Interface\n\n(c)2011-2014 ZeroTier Networks LLC\n\nReleased under the terms of the GNU\nGeneral Public License v3.0, see: http://gplv3.fsf.org for terms.\n\nAuthor(s): Adam Ierymenko");
|
||||
ui->aboutTextLabel->setText(QString("ZeroTier One\nVersion ")+ZeroTier::Node::versionString()+"\nDesktop Graphical User Interface\n\n(c)2011-2014 ZeroTier Networks LLC\n\nReleased under the terms of the GNU\nGeneral Public License v3.0, see: http://gplv3.fsf.org for terms.\n\nAuthor(s): Adam Ierymenko");
|
||||
|
||||
#ifdef __WINDOWS__
|
||||
/*
|
||||
QWidgetList widgets = this->findChildren<QWidget*>();
|
||||
foreach(QWidget *widget, widgets) {
|
||||
QFont font(widget->font());
|
||||
font.setPointSizeF(font.pointSizeF() * 0.75);
|
||||
widget->setFont(font);
|
||||
}
|
||||
*/
|
||||
this->raise();
|
||||
#endif
|
||||
}
|
||||
|
||||
AboutWindow::~AboutWindow()
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ZeroTier One - Global Peer to Peer Ethernet
|
||||
* Copyright (C) 2012-2013 ZeroTier Networks LLC
|
||||
* Copyright (C) 2011-2014 ZeroTier Networks LLC
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ZeroTier One - Global Peer to Peer Ethernet
|
||||
* Copyright (C) 2012-2013 ZeroTier Networks LLC
|
||||
* Copyright (C) 2011-2014 ZeroTier Networks LLC
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ZeroTier One - Global Peer to Peer Ethernet
|
||||
* Copyright (C) 2012-2013 ZeroTier Networks LLC
|
||||
* Copyright (C) 2011-2014 ZeroTier Networks LLC
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -38,6 +38,8 @@
|
||||
|
||||
#include "../node/Address.hpp"
|
||||
|
||||
// Right now InstallDialog is only used on Mac
|
||||
|
||||
namespace Ui {
|
||||
class InstallDialog;
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ LicenseDialog::LicenseDialog(QWidget *parent) :
|
||||
font.setPointSizeF(font.pointSizeF() * 0.75);
|
||||
widget->setFont(font);
|
||||
}
|
||||
this->raise();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
+105
-5
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ZeroTier One - Global Peer to Peer Ethernet
|
||||
* Copyright (C) 2012-2013 ZeroTier Networks LLC
|
||||
* Copyright (C) 2011-2014 ZeroTier Networks LLC
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -25,6 +25,10 @@
|
||||
* LLC. Start here: http://www.zerotier.com/
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "mainwindow.h"
|
||||
#include "installdialog.h"
|
||||
#include "licensedialog.h"
|
||||
@@ -33,12 +37,66 @@
|
||||
#include <QDir>
|
||||
#include <QString>
|
||||
#include <QFont>
|
||||
#include <QMessageBox>
|
||||
|
||||
#include "../node/Constants.hpp"
|
||||
#include "../node/Defaults.hpp"
|
||||
|
||||
// Uncomment for testing to disable making sure Windows service is running
|
||||
#define DISABLE_WINDOWS_SERVICE_MANAGEMENT
|
||||
|
||||
#ifdef __WINDOWS__
|
||||
#include <WinSock2.h>
|
||||
#include <windows.h>
|
||||
#endif
|
||||
#include "../windows/ZeroTierOne/ZeroTierOneService.h"
|
||||
|
||||
#ifndef DISABLE_WINDOWS_SERVICE_MANAGEMENT
|
||||
// Returns true if started or already running, false if failed or not installed
|
||||
static bool startWindowsService()
|
||||
{
|
||||
SERVICE_STATUS ssSvcStatus;
|
||||
SC_HANDLE schSCManager = NULL;
|
||||
SC_HANDLE schService = NULL;
|
||||
|
||||
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
|
||||
if (schSCManager == NULL)
|
||||
return false;
|
||||
|
||||
schService = OpenServiceA(schSCManager, ZT_SERVICE_NAME, SERVICE_QUERY_STATUS | SERVICE_START);
|
||||
if (schService == NULL) {
|
||||
CloseServiceHandle(schSCManager);
|
||||
return false;
|
||||
}
|
||||
|
||||
int tries = 0;
|
||||
bool running = true;
|
||||
|
||||
for(;;) {
|
||||
memset(&ssSvcStatus,0,sizeof(ssSvcStatus));
|
||||
if ((++tries > 20)||(!QueryServiceStatus(schService,&ssSvcStatus))) {
|
||||
running = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ssSvcStatus.dwCurrentState == SERVICE_RUNNING) {
|
||||
break;
|
||||
} else if (ssSvcStatus.dwCurrentState == SERVICE_START_PENDING) {
|
||||
Sleep(500);
|
||||
continue;
|
||||
}
|
||||
|
||||
StartService(schService,0,NULL);
|
||||
Sleep(500);
|
||||
}
|
||||
|
||||
CloseServiceHandle(schService);
|
||||
CloseServiceHandle(schSCManager);
|
||||
return running;
|
||||
}
|
||||
#endif // !DISABLE_WINDOWS_SERVICE_MANAGEMENT
|
||||
#endif // __WINDOWS__
|
||||
|
||||
// Globally visible settings for the app
|
||||
QSettings *settings = (QSettings *)0;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
@@ -46,6 +104,7 @@ int main(int argc, char *argv[])
|
||||
QApplication a(argc, argv);
|
||||
|
||||
#ifdef __WINDOWS__
|
||||
// Start up Winsock2
|
||||
{
|
||||
WSADATA wsaData;
|
||||
WSAStartup(MAKEWORD(2,2),&wsaData);
|
||||
@@ -65,12 +124,11 @@ int main(int argc, char *argv[])
|
||||
// InstallDialog is an alternative main window. It will re-launch the app
|
||||
// when done.
|
||||
InstallDialog id;
|
||||
id.setStyleSheet(a.styleSheet());
|
||||
id.show();
|
||||
return a.exec();
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
{
|
||||
// Put QSettings here because this is one of the writable directories allowed
|
||||
// in Apple's app store sandbox specs. We might end up in app store someday.
|
||||
@@ -78,7 +136,7 @@ int main(int argc, char *argv[])
|
||||
QDir::root().mkpath(zt1AppSupport);
|
||||
settings = new QSettings(zt1AppSupport + "/ui.ini",QSettings::IniFormat);
|
||||
}
|
||||
#else
|
||||
#else // on non-Apple boxen put it in the standard place using the default format
|
||||
settings = new QSettings("ZeroTier Networks","ZeroTier One");
|
||||
#endif
|
||||
|
||||
@@ -88,6 +146,48 @@ int main(int argc, char *argv[])
|
||||
ld.exec();
|
||||
}
|
||||
|
||||
#if defined(__WINDOWS__) && !defined(DISABLE_WINDOWS_SERVICE_MANAGEMENT)
|
||||
{
|
||||
bool winSvcInstalled = false;
|
||||
while (!startWindowsService()) {
|
||||
if (winSvcInstalled) {
|
||||
// Service was installed and subsequently failed to start again, so
|
||||
// something is wrong!
|
||||
QMessageBox::critical((QWidget *)0,"Service Not Available","Unable to locate or start ZeroTier One service. There may be a problem with the installation. Try installing from the .msi file again or e-mail contact@zerotier.com if you cannot install. (Error: service failed to start)",QMessageBox::Ok);
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef _WIN64
|
||||
BOOL is64Bit = TRUE;
|
||||
#else
|
||||
BOOL is64Bit = FALSE;
|
||||
IsWow64Process(GetCurrentProcess(),&is64Bit);
|
||||
#endif
|
||||
std::string exe(ZeroTier::ZT_DEFAULTS.defaultHomePath + "\\zerotier-one_");
|
||||
exe.append((is64Bit == TRUE) ? "x64.exe" : "x86.exe");
|
||||
|
||||
if (QFile::exists(exe.c_str())) {
|
||||
STARTUPINFOA si;
|
||||
PROCESS_INFORMATION pi;
|
||||
memset(&si,0,sizeof(si));
|
||||
memset(&pi,0,sizeof(pi));
|
||||
if (CreateProcessA(NULL,const_cast <LPSTR>((exe + " -I").c_str()),NULL,NULL,FALSE,CREATE_NO_WINDOW|CREATE_NEW_PROCESS_GROUP,NULL,NULL,&si,&pi)) {
|
||||
WaitForSingleObject(pi.hProcess,INFINITE);
|
||||
CloseHandle(pi.hProcess);
|
||||
CloseHandle(pi.hThread);
|
||||
winSvcInstalled = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!winSvcInstalled) {
|
||||
// Service failed to install -- installation problem like missing .exe
|
||||
QMessageBox::critical((QWidget *)0,"Service Not Available","Unable to locate or start ZeroTier One service. There may be a problem with the installation. Try installing from the .msi file again or e-mail contact@zerotier.com if you cannot install. (Error: service not installed)",QMessageBox::Ok);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
MainWindow w;
|
||||
w.show();
|
||||
return a.exec();
|
||||
|
||||
+99
-95
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ZeroTier One - Global Peer to Peer Ethernet
|
||||
* Copyright (C) 2012-2013 ZeroTier Networks LLC
|
||||
* Copyright (C) 2011-2014 ZeroTier Networks LLC
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -63,32 +63,32 @@
|
||||
#endif
|
||||
|
||||
// Globally visible
|
||||
ZeroTier::Node::LocalClient *zeroTierClient = (ZeroTier::Node::LocalClient *)0;
|
||||
ZeroTier::Node::NodeControlClient *zeroTierClient = (ZeroTier::Node::NodeControlClient *)0;
|
||||
|
||||
// Main window instance for app
|
||||
QMainWindow *mainWindow = (MainWindow *)0;
|
||||
|
||||
// Handles message from ZeroTier One service
|
||||
static void handleZTMessage(void *arg,unsigned long id,const char *line)
|
||||
static void handleZTMessage(void *arg,const char *line)
|
||||
{
|
||||
static std::map< unsigned long,std::vector<std::string> > ztReplies;
|
||||
static 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()) {
|
||||
|
||||
if (line) {
|
||||
if ((line[0] == '.')&&(line[1] == (char)0)) {
|
||||
// The message is packed into an event and sent to the main window where
|
||||
// the actual parsing code lives.
|
||||
MainWindow::ZTMessageEvent *event = new MainWindow::ZTMessageEvent(r->second);
|
||||
ztReplies.erase(r);
|
||||
ztReplies_m.unlock();
|
||||
MainWindow::ZTMessageEvent *event = new MainWindow::ZTMessageEvent(ztReplies);
|
||||
ztReplies.clear();
|
||||
QCoreApplication::postEvent(mainWindow,event); // must post since this may be another thread
|
||||
} else ztReplies_m.unlock();
|
||||
} else if (line[0]) {
|
||||
ztReplies.push_back(std::string(line));
|
||||
}
|
||||
}
|
||||
|
||||
ztReplies_m.unlock();
|
||||
}
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent) :
|
||||
@@ -109,12 +109,17 @@ MainWindow::MainWindow(QWidget *parent) :
|
||||
#endif
|
||||
|
||||
#ifdef __WINDOWS__
|
||||
// Windows operates at a different DPI, so we have to rescale the default Qt
|
||||
// font sizes so everything isn't huge. Yeah.
|
||||
QWidgetList widgets = this->findChildren<QWidget*>();
|
||||
foreach(QWidget *widget, widgets) {
|
||||
QFont font(widget->font());
|
||||
font.setPointSizeF(font.pointSizeF() * 0.75);
|
||||
widget->setFont(font);
|
||||
if (typeid(*widget) != typeid(*ui->menuFile)) { // menus don't need the DPI shift apparently
|
||||
QFont font(widget->font());
|
||||
font.setPointSizeF(font.pointSizeF() * 0.75);
|
||||
widget->setFont(font);
|
||||
}
|
||||
}
|
||||
this->raise();
|
||||
#endif
|
||||
|
||||
ui->noNetworksLabel->setVisible(true);
|
||||
@@ -131,7 +136,7 @@ MainWindow::~MainWindow()
|
||||
{
|
||||
delete ui;
|
||||
delete zeroTierClient;
|
||||
zeroTierClient = (ZeroTier::Node::LocalClient *)0;
|
||||
zeroTierClient = (ZeroTier::Node::NodeControlClient *)0;
|
||||
mainWindow = (MainWindow *)0;
|
||||
}
|
||||
|
||||
@@ -142,89 +147,89 @@ void MainWindow::timerEvent(QTimerEvent *event) // event can be null since code
|
||||
if (this->pollServiceTimerId < 0)
|
||||
return;
|
||||
|
||||
// Show quick start dialog on first launch, then reset timer to normal rate
|
||||
if (this->firstTimerTick) {
|
||||
this->firstTimerTick = false;
|
||||
this->killTimer(this->pollServiceTimerId);
|
||||
|
||||
if (!settings->value("shown_quickStart",false).toBool()) {
|
||||
on_actionQuick_Start_triggered();
|
||||
settings->setValue("shown_quickStart",true);
|
||||
settings->sync();
|
||||
}
|
||||
|
||||
this->pollServiceTimerId = this->startTimer(1500);
|
||||
this->pollServiceTimerId = this->startTimer(2000);
|
||||
}
|
||||
|
||||
if (!zeroTierClient) {
|
||||
std::string authToken;
|
||||
if (!ZeroTier::Utils::readFile(ZeroTier::Node::LocalClient::authTokenDefaultUserPath().c_str(),authToken)) {
|
||||
#ifdef __APPLE__
|
||||
if (QFile::exists("/Library/Application Support/ZeroTier/One/zerotier-one")) {
|
||||
// Authorize user by copying auth token into local home directory
|
||||
QMessageBox::information(this,"Authorization Needed","Administrator privileges are required to allow the current user to control ZeroTier One on this computer. (You only have to do this once.)",QMessageBox::Ok,QMessageBox::NoButton);
|
||||
if ((!QFile::exists(ZeroTier::Node::NodeControlClient::authTokenDefaultUserPath()))&&(QFile::exists("/Library/Application Support/ZeroTier/One/zerotier-one"))) {
|
||||
// Authorize user by copying auth token into local home directory
|
||||
QMessageBox::information(this,"Authorization Needed","Administrator privileges are required to allow the current user to control ZeroTier One on this computer. (You only have to do this once.)",QMessageBox::Ok,QMessageBox::NoButton);
|
||||
|
||||
std::string homePath(QDir::homePath().toStdString());
|
||||
QString zt1Caches(QDir::homePath() + "/Library/Caches/ZeroTier/One");
|
||||
QDir::root().mkpath(zt1Caches);
|
||||
std::string tmpPath((zt1Caches + "/auth.sh").toStdString());
|
||||
std::string homePath(QDir::homePath().toStdString());
|
||||
QString zt1Caches(QDir::homePath() + "/Library/Caches/ZeroTier/One");
|
||||
QDir::root().mkpath(zt1Caches);
|
||||
std::string tmpPath((zt1Caches + "/auth.sh").toStdString());
|
||||
|
||||
FILE *scr = fopen(tmpPath.c_str(),"w");
|
||||
if (!scr) {
|
||||
QMessageBox::critical(this,"Cannot Authorize","Unable to authorize this user to administrate ZeroTier One. (Cannot write to temporary Library/Caches/ZeroTier/One folder.)",QMessageBox::Ok,QMessageBox::NoButton);
|
||||
QApplication::exit(1);
|
||||
return;
|
||||
}
|
||||
|
||||
fprintf(scr,"#!/bin/bash\n");
|
||||
fprintf(scr,"export PATH=\"/bin:/usr/bin:/sbin:/usr/sbin\"\n");
|
||||
fprintf(scr,"if [ -f '/Library/Application Support/ZeroTier/One/authtoken.secret' ]; then\n");
|
||||
fprintf(scr," mkdir -p '%s/Library/Application Support/ZeroTier/One'\n",homePath.c_str());
|
||||
fprintf(scr," chown %d '%s/Library/Application Support/ZeroTier'\n",(int)getuid(),homePath.c_str());
|
||||
fprintf(scr," chgrp %d '%s/Library/Application Support/ZeroTier'\n",(int)getgid(),homePath.c_str());
|
||||
fprintf(scr," chmod 0700 '%s/Library/Application Support/ZeroTier'\n",homePath.c_str());
|
||||
fprintf(scr," chown %d '%s/Library/Application Support/ZeroTier/One'\n",(int)getuid(),homePath.c_str());
|
||||
fprintf(scr," chgrp %d '%s/Library/Application Support/ZeroTier/One'\n",(int)getgid(),homePath.c_str());
|
||||
fprintf(scr," chmod 0700 '%s/Library/Application Support/ZeroTier/One'\n",homePath.c_str());
|
||||
fprintf(scr," cp -f '/Library/Application Support/ZeroTier/One/authtoken.secret' '%s/Library/Application Support/ZeroTier/One/authtoken.secret'\n",homePath.c_str());
|
||||
fprintf(scr," chown %d '%s/Library/Application Support/ZeroTier/One/authtoken.secret'\n",(int)getuid(),homePath.c_str());
|
||||
fprintf(scr," chgrp %d '%s/Library/Application Support/ZeroTier/One/authtoken.secret'\n",(int)getgid(),homePath.c_str());
|
||||
fprintf(scr," chmod 0600 '%s/Library/Application Support/ZeroTier/One/authtoken.secret'\n",homePath.c_str());
|
||||
fprintf(scr,"fi\n");
|
||||
fprintf(scr,"exit 0\n");
|
||||
|
||||
fclose(scr);
|
||||
chmod(tmpPath.c_str(),0755);
|
||||
|
||||
macExecutePrivilegedShellCommand((std::string("'")+tmpPath+"' >>/dev/null 2>&1").c_str());
|
||||
|
||||
unlink(tmpPath.c_str());
|
||||
FILE *scr = fopen(tmpPath.c_str(),"w");
|
||||
if (!scr) {
|
||||
QMessageBox::critical(this,"Cannot Authorize","Unable to authorize this user to administrate ZeroTier One. (Cannot write to temporary Library/Caches/ZeroTier/One folder.)",QMessageBox::Ok,QMessageBox::NoButton);
|
||||
QApplication::exit(1);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!ZeroTier::Utils::readFile(ZeroTier::Node::LocalClient::authTokenDefaultUserPath().c_str(),authToken)) {
|
||||
if (!ZeroTier::Utils::readFile(ZeroTier::Node::LocalClient::authTokenDefaultSystemPath().c_str(),authToken)) {
|
||||
QMessageBox::critical(this,"Cannot Authorize","Unable to authorize this user to administrate ZeroTier One. (Did you enter your password correctly?)",QMessageBox::Ok,QMessageBox::NoButton);
|
||||
QApplication::exit(1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
fprintf(scr,"#!/bin/bash\n");
|
||||
fprintf(scr,"export PATH=\"/bin:/usr/bin:/sbin:/usr/sbin\"\n");
|
||||
fprintf(scr,"if [ -f '/Library/Application Support/ZeroTier/One/authtoken.secret' ]; then\n");
|
||||
fprintf(scr," mkdir -p '%s/Library/Application Support/ZeroTier/One'\n",homePath.c_str());
|
||||
fprintf(scr," chown %d '%s/Library/Application Support/ZeroTier'\n",(int)getuid(),homePath.c_str());
|
||||
fprintf(scr," chgrp %d '%s/Library/Application Support/ZeroTier'\n",(int)getgid(),homePath.c_str());
|
||||
fprintf(scr," chmod 0700 '%s/Library/Application Support/ZeroTier'\n",homePath.c_str());
|
||||
fprintf(scr," chown %d '%s/Library/Application Support/ZeroTier/One'\n",(int)getuid(),homePath.c_str());
|
||||
fprintf(scr," chgrp %d '%s/Library/Application Support/ZeroTier/One'\n",(int)getgid(),homePath.c_str());
|
||||
fprintf(scr," chmod 0700 '%s/Library/Application Support/ZeroTier/One'\n",homePath.c_str());
|
||||
fprintf(scr," cp -f '/Library/Application Support/ZeroTier/One/authtoken.secret' '%s/Library/Application Support/ZeroTier/One/authtoken.secret'\n",homePath.c_str());
|
||||
fprintf(scr," chown %d '%s/Library/Application Support/ZeroTier/One/authtoken.secret'\n",(int)getuid(),homePath.c_str());
|
||||
fprintf(scr," chgrp %d '%s/Library/Application Support/ZeroTier/One/authtoken.secret'\n",(int)getgid(),homePath.c_str());
|
||||
fprintf(scr," chmod 0600 '%s/Library/Application Support/ZeroTier/One/authtoken.secret'\n",homePath.c_str());
|
||||
fprintf(scr,"fi\n");
|
||||
fprintf(scr,"exit 0\n");
|
||||
|
||||
fclose(scr);
|
||||
chmod(tmpPath.c_str(),0755);
|
||||
|
||||
macExecutePrivilegedShellCommand((std::string("'")+tmpPath+"' >>/dev/null 2>&1").c_str());
|
||||
|
||||
unlink(tmpPath.c_str());
|
||||
}
|
||||
#endif // __APPLE__
|
||||
|
||||
zeroTierClient = new ZeroTier::Node::LocalClient(authToken.c_str(),0,&handleZTMessage,this);
|
||||
try {
|
||||
zeroTierClient = new ZeroTier::Node::NodeControlClient((const char *)0,&handleZTMessage,this);
|
||||
const char *err = zeroTierClient->error();
|
||||
if (err) {
|
||||
delete zeroTierClient;
|
||||
zeroTierClient = (ZeroTier::Node::NodeControlClient *)0;
|
||||
}
|
||||
} catch ( ... ) {
|
||||
zeroTierClient = (ZeroTier::Node::NodeControlClient *)0;
|
||||
}
|
||||
}
|
||||
|
||||
if (++this->cyclesSinceResponseFromService >= 3) {
|
||||
if (this->cyclesSinceResponseFromService == 3)
|
||||
if (this->cyclesSinceResponseFromService == 3) {
|
||||
QMessageBox::warning(this,"Service Not Running","Can't connect to the ZeroTier One service. Is it running?",QMessageBox::Ok);
|
||||
}
|
||||
ui->noNetworksLabel->setVisible(true);
|
||||
ui->noNetworksLabel->setText("Connecting to Service...");
|
||||
ui->bottomContainerWidget->setVisible(false);
|
||||
ui->networkListWidget->setVisible(false);
|
||||
}
|
||||
|
||||
zeroTierClient->send("info");
|
||||
zeroTierClient->send("listnetworks");
|
||||
zeroTierClient->send("listpeers");
|
||||
if (zeroTierClient) {
|
||||
zeroTierClient->send("info");
|
||||
zeroTierClient->send("listnetworks");
|
||||
zeroTierClient->send("listpeers");
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::customEvent(QEvent *event)
|
||||
@@ -232,15 +237,14 @@ void MainWindow::customEvent(QEvent *event)
|
||||
ZTMessageEvent *m = (ZTMessageEvent *)event; // only one custom event type so far
|
||||
if (m->ztMessage.size() == 0)
|
||||
return;
|
||||
|
||||
this->cyclesSinceResponseFromService = 0;
|
||||
|
||||
std::vector<std::string> hdr(ZeroTier::Node::LocalClient::splitLine(m->ztMessage[0]));
|
||||
std::vector<std::string> hdr(ZeroTier::Node::NodeControlClient::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();
|
||||
@@ -251,9 +255,9 @@ void MainWindow::customEvent(QEvent *event)
|
||||
} 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))
|
||||
std::vector<std::string> l(ZeroTier::Node::NodeControlClient::splitLine(m->ztMessage[i]));
|
||||
// 200 listnetworks <nwid> <name> <mac> <status> <config age> <type> <dev> <ips>
|
||||
if ((l.size() == 10)&&(l[2].length() == 16))
|
||||
newNetworks[l[2]] = l;
|
||||
}
|
||||
|
||||
@@ -280,10 +284,11 @@ void MainWindow::customEvent(QEvent *event)
|
||||
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]);
|
||||
nw->setMAC(l[4]);
|
||||
nw->setStatus(l[5],l[6]);
|
||||
nw->setNetworkType(l[7]);
|
||||
nw->setNetworkDeviceName(l[8]);
|
||||
nw->setIps(l[9]);
|
||||
}
|
||||
}
|
||||
for(std::map< std::string,std::vector<std::string> >::iterator nwdata(networks.begin());nwdata!=networks.end();++nwdata) {
|
||||
@@ -291,10 +296,11 @@ void MainWindow::customEvent(QEvent *event)
|
||||
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]);
|
||||
nw->setMAC(l[4]);
|
||||
nw->setStatus(l[5],l[6]);
|
||||
nw->setNetworkType(l[7]);
|
||||
nw->setNetworkDeviceName(l[8]);
|
||||
nw->setIps(l[9]);
|
||||
QListWidgetItem *item = new QListWidgetItem();
|
||||
item->setSizeHint(nw->sizeHint());
|
||||
ui->networkListWidget->addItem(item);
|
||||
@@ -304,12 +310,10 @@ void MainWindow::customEvent(QEvent *event)
|
||||
}
|
||||
} 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
|
||||
}
|
||||
}
|
||||
for(unsigned long i=1;i<m->ztMessage.size();++i)
|
||||
++this->numPeers;
|
||||
} else
|
||||
return;
|
||||
|
||||
if (!ui->networkListWidget->count()) {
|
||||
ui->noNetworksLabel->setText("You Have Not Joined Any Networks");
|
||||
@@ -330,7 +334,7 @@ void MainWindow::customEvent(QEvent *event)
|
||||
st += this->myVersion;
|
||||
st += ", ";
|
||||
st += QString::number(this->numPeers);
|
||||
st += " direct links to peers";
|
||||
st += " peers";
|
||||
ui->statusLabel->setText(st);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ZeroTier One - Global Peer to Peer Ethernet
|
||||
* Copyright (C) 2012-2013 ZeroTier Networks LLC
|
||||
* Copyright (C) 2011-2014 ZeroTier Networks LLC
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -49,7 +49,7 @@ class MainWindow;
|
||||
|
||||
// Globally visible instance of local client for communicating with ZT1
|
||||
// Can be null if not connected, or will point to current
|
||||
extern ZeroTier::Node::LocalClient *zeroTierClient;
|
||||
extern ZeroTier::Node::NodeControlClient *zeroTierClient;
|
||||
|
||||
// Globally visible pointer to main app window
|
||||
extern QMainWindow *mainWindow;
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>720</width>
|
||||
<height>300</height>
|
||||
<width>850</width>
|
||||
<height>400</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@@ -229,8 +229,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>720</width>
|
||||
<height>22</height>
|
||||
<width>850</width>
|
||||
<height>34</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="font">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ZeroTier One - Global Peer to Peer Ethernet
|
||||
* Copyright (C) 2012-2013 ZeroTier Networks LLC
|
||||
* Copyright (C) 2011-2014 ZeroTier Networks LLC
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -53,8 +53,8 @@ NetworkWidget::NetworkWidget(QWidget *parent,const std::string &nwid) :
|
||||
|
||||
QFontMetrics fm(ui->ipListWidget->font());
|
||||
int lineHeight = ui->ipListWidget->spacing() + fm.height();
|
||||
ui->ipListWidget->setMinimumHeight(lineHeight * 4);
|
||||
ui->ipListWidget->setMaximumHeight(lineHeight * 4);
|
||||
ui->ipListWidget->setMinimumHeight(lineHeight * 6);
|
||||
ui->ipListWidget->setMaximumHeight(lineHeight * 6);
|
||||
|
||||
#ifdef __APPLE__
|
||||
QWidgetList widgets = this->findChildren<QWidget*>();
|
||||
@@ -80,9 +80,6 @@ NetworkWidget::~NetworkWidget()
|
||||
void NetworkWidget::setStatus(const std::string &status,const std::string &age)
|
||||
{
|
||||
ui->statusLabel->setText(QString(status.c_str()));
|
||||
if (status == "OK")
|
||||
ui->ageLabel->setText(QString("[") + age.c_str() + "s ago]");
|
||||
else ui->ageLabel->setText(QString());
|
||||
}
|
||||
|
||||
void NetworkWidget::setNetworkName(const std::string &name)
|
||||
@@ -148,6 +145,11 @@ void NetworkWidget::setIps(const std::string &commaSeparatedList)
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkWidget::setMAC(const std::string &mac)
|
||||
{
|
||||
ui->macLabel->setText(QString(mac.c_str()));
|
||||
}
|
||||
|
||||
const std::string &NetworkWidget::networkId()
|
||||
{
|
||||
return networkIdStr;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ZeroTier One - Global Peer to Peer Ethernet
|
||||
* Copyright (C) 2012-2013 ZeroTier Networks LLC
|
||||
* Copyright (C) 2011-2014 ZeroTier Networks LLC
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -50,6 +50,7 @@ public:
|
||||
void setNetworkType(const std::string &type);
|
||||
void setNetworkDeviceName(const std::string &dev);
|
||||
void setIps(const std::string &commaSeparatedList);
|
||||
void setMAC(const std::string &mac);
|
||||
|
||||
const std::string &networkId();
|
||||
|
||||
|
||||
+108
-94
@@ -6,12 +6,12 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>580</width>
|
||||
<width>689</width>
|
||||
<height>253</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Maximum">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
@@ -40,6 +40,12 @@
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QWidget" name="leftWidget" native="true">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<property name="spacing">
|
||||
<number>2</number>
|
||||
@@ -57,7 +63,13 @@
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QWidget" name="widget" native="true">
|
||||
<widget class="QWidget" name="networkInfoWidget" native="true">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
@@ -179,7 +191,7 @@
|
||||
<item>
|
||||
<widget class="QWidget" name="networkStatsWidget" native="true">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
@@ -232,6 +244,12 @@
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLabel" name="networkTypeLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
@@ -265,7 +283,33 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<item row="3" column="1">
|
||||
<widget class="QLabel" name="statusLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Status of this network.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>?</string>
|
||||
</property>
|
||||
<property name="textFormat">
|
||||
<enum>Qt::PlainText</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="font">
|
||||
<font>
|
||||
@@ -280,101 +324,14 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QWidget" name="widget" native="true">
|
||||
<item row="5" column="1">
|
||||
<widget class="QLabel" name="deviceLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<property name="spacing">
|
||||
<number>12</number>
|
||||
</property>
|
||||
<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="statusLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Status of this network.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>?</string>
|
||||
</property>
|
||||
<property name="textFormat">
|
||||
<enum>Qt::PlainText</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="ageLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>10</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>How recently did this network refresh its settings?</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>[0s ago]</string>
|
||||
</property>
|
||||
<property name="textFormat">
|
||||
<enum>Qt::PlainText</enum>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::NoTextInteraction</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>1</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QLabel" name="deviceLabel">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
@@ -393,9 +350,66 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>MAC:</string>
|
||||
</property>
|
||||
<property name="textFormat">
|
||||
<enum>Qt::PlainText</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QLabel" name="macLabel">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Your system's Ethernet MAC address.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>?</string>
|
||||
</property>
|
||||
<property name="textFormat">
|
||||
<enum>Qt::PlainText</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Expanding</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ZeroTier One - Global Peer to Peer Ethernet
|
||||
* Copyright (C) 2012-2013 ZeroTier Networks LLC
|
||||
* Copyright (C) 2011-2014 ZeroTier Networks LLC
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ZeroTier One - Global Peer to Peer Ethernet
|
||||
* Copyright (C) 2012-2013 ZeroTier Networks LLC
|
||||
* Copyright (C) 2011-2014 ZeroTier Networks LLC
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
||||
Loaded 20 of 179 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user