summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2015-04-14 13:56:28 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2015-04-14 13:56:28 -0700
commit1cfa67bbdd4242a52484f13f3533babb4d4c07a6 (patch)
treed772b3b7cc40371afaa494c4e623511133e0e33e
parenta2605561af19d7de7ed492d1faf00d7ff161c6ea (diff)
downloadinfinitytier-1cfa67bbdd4242a52484f13f3533babb4d4c07a6.tar.gz
infinitytier-1cfa67bbdd4242a52484f13f3533babb4d4c07a6.zip
Bunch more control plane work, and shelve old UI -- React FTW.
-rw-r--r--attic/ZeroTierUI/Info.plist (renamed from ZeroTierUI/Info.plist)0
-rw-r--r--attic/ZeroTierUI/README.md (renamed from ZeroTierUI/README.md)0
-rw-r--r--attic/ZeroTierUI/WindowsBuildOfficial.bat (renamed from ZeroTierUI/WindowsBuildOfficial.bat)0
-rw-r--r--attic/ZeroTierUI/ZT1GUI.png (renamed from ZeroTierUI/ZT1GUI.png)bin53611 -> 53611 bytes
-rw-r--r--attic/ZeroTierUI/ZT1GUI.xcf (renamed from ZeroTierUI/ZT1GUI.xcf)bin259875 -> 259875 bytes
-rw-r--r--attic/ZeroTierUI/ZeroTierUI.pro (renamed from ZeroTierUI/ZeroTierUI.pro)0
-rw-r--r--attic/ZeroTierUI/ZeroTierUI.rc (renamed from ZeroTierUI/ZeroTierUI.rc)0
-rw-r--r--attic/ZeroTierUI/aboutwindow.cpp (renamed from ZeroTierUI/aboutwindow.cpp)0
-rw-r--r--attic/ZeroTierUI/aboutwindow.h (renamed from ZeroTierUI/aboutwindow.h)0
-rw-r--r--attic/ZeroTierUI/aboutwindow.ui (renamed from ZeroTierUI/aboutwindow.ui)0
-rw-r--r--attic/ZeroTierUI/installdialog.cpp (renamed from ZeroTierUI/installdialog.cpp)0
-rw-r--r--attic/ZeroTierUI/installdialog.h (renamed from ZeroTierUI/installdialog.h)0
-rw-r--r--attic/ZeroTierUI/installdialog.ui (renamed from ZeroTierUI/installdialog.ui)0
-rw-r--r--attic/ZeroTierUI/licensedialog.cpp (renamed from ZeroTierUI/licensedialog.cpp)0
-rw-r--r--attic/ZeroTierUI/licensedialog.h (renamed from ZeroTierUI/licensedialog.h)0
-rw-r--r--attic/ZeroTierUI/licensedialog.ui (renamed from ZeroTierUI/licensedialog.ui)0
-rw-r--r--attic/ZeroTierUI/mac_doprivileged.h (renamed from ZeroTierUI/mac_doprivileged.h)0
-rw-r--r--attic/ZeroTierUI/mac_doprivileged.mm (renamed from ZeroTierUI/mac_doprivileged.mm)0
-rw-r--r--attic/ZeroTierUI/main.cpp (renamed from ZeroTierUI/main.cpp)0
-rw-r--r--attic/ZeroTierUI/main.h (renamed from ZeroTierUI/main.h)0
-rw-r--r--attic/ZeroTierUI/mainwindow.cpp (renamed from ZeroTierUI/mainwindow.cpp)0
-rw-r--r--attic/ZeroTierUI/mainwindow.h (renamed from ZeroTierUI/mainwindow.h)0
-rw-r--r--attic/ZeroTierUI/mainwindow.ui (renamed from ZeroTierUI/mainwindow.ui)0
-rw-r--r--attic/ZeroTierUI/networkwidget.cpp (renamed from ZeroTierUI/networkwidget.cpp)0
-rw-r--r--attic/ZeroTierUI/networkwidget.h (renamed from ZeroTierUI/networkwidget.h)0
-rw-r--r--attic/ZeroTierUI/networkwidget.ui (renamed from ZeroTierUI/networkwidget.ui)0
-rw-r--r--attic/ZeroTierUI/onetimedialog.cpp (renamed from ZeroTierUI/onetimedialog.cpp)0
-rw-r--r--attic/ZeroTierUI/onetimedialog.h (renamed from ZeroTierUI/onetimedialog.h)0
-rw-r--r--attic/ZeroTierUI/onetimedialog.ui (renamed from ZeroTierUI/onetimedialog.ui)0
-rw-r--r--attic/ZeroTierUI/quickstartdialog.ui (renamed from ZeroTierUI/quickstartdialog.ui)0
-rw-r--r--attic/ZeroTierUI/resources.qrc (renamed from ZeroTierUI/resources.qrc)0
-rw-r--r--attic/ZeroTierUI/stylesheet.css (renamed from ZeroTierUI/stylesheet.css)0
-rw-r--r--attic/ZeroTierUI/zt1icon.icns (renamed from ZeroTierUI/zt1icon.icns)bin188489 -> 188489 bytes
-rw-r--r--attic/ZeroTierUI/zt1icon.ico (renamed from ZeroTierUI/zt1icon.ico)bin370070 -> 370070 bytes
-rw-r--r--attic/ZeroTierUI/zt1icon.png (renamed from ZeroTierUI/zt1icon.png)bin44700 -> 44700 bytes
-rw-r--r--attic/testnet.cpp (renamed from testnet.cpp)0
-rw-r--r--include/ZeroTierOne.h13
-rw-r--r--make-mac.mk21
-rw-r--r--node/Node.cpp3
-rw-r--r--node/Peer.cpp2
-rw-r--r--service/ControlPlane.cpp291
-rw-r--r--service/ControlPlane.hpp5
-rw-r--r--service/One.cpp18
43 files changed, 233 insertions, 120 deletions
diff --git a/ZeroTierUI/Info.plist b/attic/ZeroTierUI/Info.plist
index 06f680c6..06f680c6 100644
--- a/ZeroTierUI/Info.plist
+++ b/attic/ZeroTierUI/Info.plist
diff --git a/ZeroTierUI/README.md b/attic/ZeroTierUI/README.md
index 49f25d29..49f25d29 100644
--- a/ZeroTierUI/README.md
+++ b/attic/ZeroTierUI/README.md
diff --git a/ZeroTierUI/WindowsBuildOfficial.bat b/attic/ZeroTierUI/WindowsBuildOfficial.bat
index 06cad543..06cad543 100644
--- a/ZeroTierUI/WindowsBuildOfficial.bat
+++ b/attic/ZeroTierUI/WindowsBuildOfficial.bat
diff --git a/ZeroTierUI/ZT1GUI.png b/attic/ZeroTierUI/ZT1GUI.png
index d31c8bcf..d31c8bcf 100644
--- a/ZeroTierUI/ZT1GUI.png
+++ b/attic/ZeroTierUI/ZT1GUI.png
Binary files differ
diff --git a/ZeroTierUI/ZT1GUI.xcf b/attic/ZeroTierUI/ZT1GUI.xcf
index 7d21a641..7d21a641 100644
--- a/ZeroTierUI/ZT1GUI.xcf
+++ b/attic/ZeroTierUI/ZT1GUI.xcf
Binary files differ
diff --git a/ZeroTierUI/ZeroTierUI.pro b/attic/ZeroTierUI/ZeroTierUI.pro
index 98e306b5..98e306b5 100644
--- a/ZeroTierUI/ZeroTierUI.pro
+++ b/attic/ZeroTierUI/ZeroTierUI.pro
diff --git a/ZeroTierUI/ZeroTierUI.rc b/attic/ZeroTierUI/ZeroTierUI.rc
index 2c5365c0..2c5365c0 100644
--- a/ZeroTierUI/ZeroTierUI.rc
+++ b/attic/ZeroTierUI/ZeroTierUI.rc
diff --git a/ZeroTierUI/aboutwindow.cpp b/attic/ZeroTierUI/aboutwindow.cpp
index 0d35e1e6..0d35e1e6 100644
--- a/ZeroTierUI/aboutwindow.cpp
+++ b/attic/ZeroTierUI/aboutwindow.cpp
diff --git a/ZeroTierUI/aboutwindow.h b/attic/ZeroTierUI/aboutwindow.h
index 836954b2..836954b2 100644
--- a/ZeroTierUI/aboutwindow.h
+++ b/attic/ZeroTierUI/aboutwindow.h
diff --git a/ZeroTierUI/aboutwindow.ui b/attic/ZeroTierUI/aboutwindow.ui
index 568082af..568082af 100644
--- a/ZeroTierUI/aboutwindow.ui
+++ b/attic/ZeroTierUI/aboutwindow.ui
diff --git a/ZeroTierUI/installdialog.cpp b/attic/ZeroTierUI/installdialog.cpp
index 41dffe48..41dffe48 100644
--- a/ZeroTierUI/installdialog.cpp
+++ b/attic/ZeroTierUI/installdialog.cpp
diff --git a/ZeroTierUI/installdialog.h b/attic/ZeroTierUI/installdialog.h
index b54e4690..b54e4690 100644
--- a/ZeroTierUI/installdialog.h
+++ b/attic/ZeroTierUI/installdialog.h
diff --git a/ZeroTierUI/installdialog.ui b/attic/ZeroTierUI/installdialog.ui
index 71b2d0f1..71b2d0f1 100644
--- a/ZeroTierUI/installdialog.ui
+++ b/attic/ZeroTierUI/installdialog.ui
diff --git a/ZeroTierUI/licensedialog.cpp b/attic/ZeroTierUI/licensedialog.cpp
index 4baebb72..4baebb72 100644
--- a/ZeroTierUI/licensedialog.cpp
+++ b/attic/ZeroTierUI/licensedialog.cpp
diff --git a/ZeroTierUI/licensedialog.h b/attic/ZeroTierUI/licensedialog.h
index 9a13be9c..9a13be9c 100644
--- a/ZeroTierUI/licensedialog.h
+++ b/attic/ZeroTierUI/licensedialog.h
diff --git a/ZeroTierUI/licensedialog.ui b/attic/ZeroTierUI/licensedialog.ui
index 495ef562..495ef562 100644
--- a/ZeroTierUI/licensedialog.ui
+++ b/attic/ZeroTierUI/licensedialog.ui
diff --git a/ZeroTierUI/mac_doprivileged.h b/attic/ZeroTierUI/mac_doprivileged.h
index 52fba922..52fba922 100644
--- a/ZeroTierUI/mac_doprivileged.h
+++ b/attic/ZeroTierUI/mac_doprivileged.h
diff --git a/ZeroTierUI/mac_doprivileged.mm b/attic/ZeroTierUI/mac_doprivileged.mm
index 5bd6a7a6..5bd6a7a6 100644
--- a/ZeroTierUI/mac_doprivileged.mm
+++ b/attic/ZeroTierUI/mac_doprivileged.mm
diff --git a/ZeroTierUI/main.cpp b/attic/ZeroTierUI/main.cpp
index e3d24939..e3d24939 100644
--- a/ZeroTierUI/main.cpp
+++ b/attic/ZeroTierUI/main.cpp
diff --git a/ZeroTierUI/main.h b/attic/ZeroTierUI/main.h
index bee0e51b..bee0e51b 100644
--- a/ZeroTierUI/main.h
+++ b/attic/ZeroTierUI/main.h
diff --git a/ZeroTierUI/mainwindow.cpp b/attic/ZeroTierUI/mainwindow.cpp
index c7cf2b60..c7cf2b60 100644
--- a/ZeroTierUI/mainwindow.cpp
+++ b/attic/ZeroTierUI/mainwindow.cpp
diff --git a/ZeroTierUI/mainwindow.h b/attic/ZeroTierUI/mainwindow.h
index 581cff1d..581cff1d 100644
--- a/ZeroTierUI/mainwindow.h
+++ b/attic/ZeroTierUI/mainwindow.h
diff --git a/ZeroTierUI/mainwindow.ui b/attic/ZeroTierUI/mainwindow.ui
index 0cedce31..0cedce31 100644
--- a/ZeroTierUI/mainwindow.ui
+++ b/attic/ZeroTierUI/mainwindow.ui
diff --git a/ZeroTierUI/networkwidget.cpp b/attic/ZeroTierUI/networkwidget.cpp
index ff127c71..ff127c71 100644
--- a/ZeroTierUI/networkwidget.cpp
+++ b/attic/ZeroTierUI/networkwidget.cpp
diff --git a/ZeroTierUI/networkwidget.h b/attic/ZeroTierUI/networkwidget.h
index 72115c6f..72115c6f 100644
--- a/ZeroTierUI/networkwidget.h
+++ b/attic/ZeroTierUI/networkwidget.h
diff --git a/ZeroTierUI/networkwidget.ui b/attic/ZeroTierUI/networkwidget.ui
index af025d5d..af025d5d 100644
--- a/ZeroTierUI/networkwidget.ui
+++ b/attic/ZeroTierUI/networkwidget.ui
diff --git a/ZeroTierUI/onetimedialog.cpp b/attic/ZeroTierUI/onetimedialog.cpp
index 1c1d983b..1c1d983b 100644
--- a/ZeroTierUI/onetimedialog.cpp
+++ b/attic/ZeroTierUI/onetimedialog.cpp
diff --git a/ZeroTierUI/onetimedialog.h b/attic/ZeroTierUI/onetimedialog.h
index 3e76cd05..3e76cd05 100644
--- a/ZeroTierUI/onetimedialog.h
+++ b/attic/ZeroTierUI/onetimedialog.h
diff --git a/ZeroTierUI/onetimedialog.ui b/attic/ZeroTierUI/onetimedialog.ui
index 227cdc38..227cdc38 100644
--- a/ZeroTierUI/onetimedialog.ui
+++ b/attic/ZeroTierUI/onetimedialog.ui
diff --git a/ZeroTierUI/quickstartdialog.ui b/attic/ZeroTierUI/quickstartdialog.ui
index 411f89e3..411f89e3 100644
--- a/ZeroTierUI/quickstartdialog.ui
+++ b/attic/ZeroTierUI/quickstartdialog.ui
diff --git a/ZeroTierUI/resources.qrc b/attic/ZeroTierUI/resources.qrc
index 32f7c346..32f7c346 100644
--- a/ZeroTierUI/resources.qrc
+++ b/attic/ZeroTierUI/resources.qrc
diff --git a/ZeroTierUI/stylesheet.css b/attic/ZeroTierUI/stylesheet.css
index 31904df5..31904df5 100644
--- a/ZeroTierUI/stylesheet.css
+++ b/attic/ZeroTierUI/stylesheet.css
diff --git a/ZeroTierUI/zt1icon.icns b/attic/ZeroTierUI/zt1icon.icns
index ce07eb9e..ce07eb9e 100644
--- a/ZeroTierUI/zt1icon.icns
+++ b/attic/ZeroTierUI/zt1icon.icns
Binary files differ
diff --git a/ZeroTierUI/zt1icon.ico b/attic/ZeroTierUI/zt1icon.ico
index eb29c09b..eb29c09b 100644
--- a/ZeroTierUI/zt1icon.ico
+++ b/attic/ZeroTierUI/zt1icon.ico
Binary files differ
diff --git a/ZeroTierUI/zt1icon.png b/attic/ZeroTierUI/zt1icon.png
index bc265167..bc265167 100644
--- a/ZeroTierUI/zt1icon.png
+++ b/attic/ZeroTierUI/zt1icon.png
Binary files differ
diff --git a/testnet.cpp b/attic/testnet.cpp
index 5b175728..5b175728 100644
--- a/testnet.cpp
+++ b/attic/testnet.cpp
diff --git a/include/ZeroTierOne.h b/include/ZeroTierOne.h
index 870255f1..fa4c48d6 100644
--- a/include/ZeroTierOne.h
+++ b/include/ZeroTierOne.h
@@ -524,6 +524,16 @@ typedef struct
* Is path fixed? (i.e. not learned, static)
*/
int fixed;
+
+ /**
+ * Is path active?
+ */
+ int active;
+
+ /**
+ * Is path preferred?
+ */
+ int preferred;
} ZT1_PeerPhysicalPath;
/**
@@ -796,6 +806,9 @@ enum ZT1_ResultCode ZT1_Node_processBackgroundTasks(ZT1_Node *node,uint64_t now,
* This may generate calls to the port config callback before it returns,
* or these may be deffered if a netconf is not available yet.
*
+ * If we are already a member of the network, nothing is done and OK is
+ * returned.
+ *
* @param node Node instance
* @param nwid 64-bit ZeroTier network ID
* @return OK (0) or error code if a fatal error condition has occurred
diff --git a/make-mac.mk b/make-mac.mk
index 840a47b3..1492a6b1 100644
--- a/make-mac.mk
+++ b/make-mac.mk
@@ -63,18 +63,18 @@ selftest: $(OBJS) selftest.o
$(CXX) $(CXXFLAGS) -o zerotier-selftest selftest.o $(OBJS) $(LIBS)
$(STRIP) zerotier-selftest
-testnet: $(TESTNET_OBJS) $(OBJS) testnet.o
- $(CXX) $(CXXFLAGS) -o zerotier-testnet testnet.o $(OBJS) $(TESTNET_OBJS) $(LIBS)
- $(STRIP) zerotier-testnet
+#testnet: $(TESTNET_OBJS) $(OBJS) testnet.o
+# $(CXX) $(CXXFLAGS) -o zerotier-testnet testnet.o $(OBJS) $(TESTNET_OBJS) $(LIBS)
+# $(STRIP) zerotier-testnet
# Requires that ../Qt be symlinked to the Qt root to use for UI build
-mac-ui: FORCE
- mkdir -p build-ZeroTierUI-release
- cd build-ZeroTierUI-release ; ../../Qt/bin/qmake ../ZeroTierUI/ZeroTierUI.pro ; make -j 4
- strip "build-ZeroTierUI-release/ZeroTier One.app/Contents/MacOS/ZeroTier One"
- find "build-ZeroTierUI-release/ZeroTier One.app" -type f -name '.DS_Store' -print0 | xargs -0 rm -f
- $(CODESIGN) -f -s $(CODESIGN_CERT) "build-ZeroTierUI-release/ZeroTier One.app"
- $(CODESIGN) -vvv "build-ZeroTierUI-release/ZeroTier One.app"
+#mac-ui: FORCE
+# mkdir -p build-ZeroTierUI-release
+# cd build-ZeroTierUI-release ; ../../Qt/bin/qmake ../ZeroTierUI/ZeroTierUI.pro ; make -j 4
+# strip "build-ZeroTierUI-release/ZeroTier One.app/Contents/MacOS/ZeroTier One"
+# find "build-ZeroTierUI-release/ZeroTier One.app" -type f -name '.DS_Store' -print0 | xargs -0 rm -f
+# $(CODESIGN) -f -s $(CODESIGN_CERT) "build-ZeroTierUI-release/ZeroTier One.app"
+# $(CODESIGN) -vvv "build-ZeroTierUI-release/ZeroTier One.app"
clean:
rm -rf *.dSYM build-* *.o netconf/*.o service/*.o node/*.o osdep/*.o ext/http-parser/*.o ext/lz4/*.o zerotier-* ZeroTierOneInstaller-* "ZeroTier One.zip" "ZeroTier One.dmg"
@@ -82,7 +82,6 @@ clean:
# For our use -- builds official signed binary, packages in installer and download DMG
official: FORCE
make -j 4 ZT_OFFICIAL_RELEASE=1
- make mac-ui ZT_OFFICIAL_RELEASE=1
./buildinstaller.sh
make mac-dmg ZT_OFFICIAL_RELEASE=1
diff --git a/node/Node.cpp b/node/Node.cpp
index be9eadfa..beb06430 100644
--- a/node/Node.cpp
+++ b/node/Node.cpp
@@ -357,12 +357,15 @@ ZT1_PeerList *Node::peers() const
p->role = RR->topology->isSupernode(pi->second->address()) ? ZT1_PEER_ROLE_SUPERNODE : ZT1_PEER_ROLE_LEAF;
std::vector<Path> paths(pi->second->paths());
+ Path *bestPath = pi->second->getBestPath(_now);
p->pathCount = 0;
for(std::vector<Path>::iterator path(paths.begin());path!=paths.end();++path) {
memcpy(&(p->paths[p->pathCount].address),&(path->address()),sizeof(struct sockaddr_storage));
p->paths[p->pathCount].lastSend = path->lastSend();
p->paths[p->pathCount].lastReceive = path->lastReceived();
p->paths[p->pathCount].fixed = path->fixed() ? 1 : 0;
+ p->paths[p->pathCount].active = path->active(_now) ? 1 : 0;
+ p->paths[p->pathCount].preferred = ((bestPath)&&(*path == *bestPath)) ? 1 : 0;
++p->pathCount;
}
}
diff --git a/node/Peer.cpp b/node/Peer.cpp
index 541fe5dd..4d942957 100644
--- a/node/Peer.cpp
+++ b/node/Peer.cpp
@@ -111,7 +111,7 @@ void Peer::received(
* paths without confirming that a bidirectional link is in
* fact present, but any packet that decodes and authenticates
* correctly is considered valid. */
- TRACE("got non-confirmation packet from unknown path %s(%s), pinging...",_id.address().toString().c_str(),remoteAddr.toString().c_str());
+ TRACE("got non-confirmation %s from unknown path %s(%s), pinging...",Packet::verbString(verb),_id.address().toString().c_str(),remoteAddr.toString().c_str());
attemptToContactAt(RR,remoteAddr,linkDesperation,now);
}
}
diff --git a/service/ControlPlane.cpp b/service/ControlPlane.cpp
index dceba8d6..5077dce9 100644
--- a/service/ControlPlane.cpp
+++ b/service/ControlPlane.cpp
@@ -36,6 +36,8 @@
#include "../node/Node.hpp"
#include "../node/Utils.hpp"
+#define ZT_BUILD_IN_WEB_UI
+
namespace ZeroTier {
static std::string _jsonEscape(const char *s)
@@ -102,7 +104,12 @@ static std::string _jsonEnumerate(const ZT1_PeerPhysicalPath *pp,unsigned int co
buf.push_back(',');
buf.append("{\"address\":\"");
buf.append(_jsonEscape(reinterpret_cast<const InetAddress *>(&(pp[i].address))->toString()));
- Utils::snprintf(tmp,sizeof(tmp),"\",\"lastSend\":%llu,\"lastReceive\":%llu,\"fixed\":%s}",pp[i].lastSend,pp[i].lastReceive,(pp[i].fixed == 0) ? "falase" : "true");
+ Utils::snprintf(tmp,sizeof(tmp),"\",\"lastSend\":%llu,\"lastReceive\":%llu,\"fixed\":%s,\"active\":%s,\"preferred\":%s}",
+ pp[i].lastSend,
+ pp[i].lastReceive,
+ (pp[i].fixed == 0) ? "false" : "true",
+ (pp[i].active == 0) ? "false" : "true",
+ (pp[i].preferred == 0) ? "false" : "true");
buf.append(tmp);
}
buf.push_back(']');
@@ -186,9 +193,8 @@ static void _jsonAppend(std::string &buf,const ZT1_Peer *peer)
buf.append(json);
}
-ControlPlane::ControlPlane(Node *n,const std::set<std::string> atoks) :
- _node(n),
- _authTokens(atoks)
+ControlPlane::ControlPlane(Node *n) :
+ _node(n)
{
}
@@ -197,6 +203,7 @@ ControlPlane::~ControlPlane()
}
unsigned int ControlPlane::handleRequest(
+ const InetAddress &fromAddress,
unsigned int httpMethod,
const std::string &path,
const std::map<std::string,std::string> &headers,
@@ -209,11 +216,13 @@ unsigned int ControlPlane::handleRequest(
std::vector<std::string> ps(Utils::split(path.c_str(),"/","",""));
std::map<std::string,std::string> urlArgs;
+ if (!((fromAddress.ipsEqual(InetAddress::LO4))||(fromAddress.ipsEqual(InetAddress::LO6))))
+ return 403; // Forbidden: we only allow access from localhost right now
+
/* Note: this is kind of restricted in what it'll take. It does not support
* URL encoding, and /'s in URL args will screw it up. But the only URL args
* it really uses in ?jsonp=funcionName, and otherwise it just takes simple
* paths to simply-named resources. */
-
if (ps.size() > 0) {
std::size_t qpos = ps[ps.size() - 1].find('?');
if (qpos != std::string::npos) {
@@ -228,112 +237,202 @@ unsigned int ControlPlane::handleRequest(
}
}
} else {
- ps.push_back(std::string("index"));
+ ps.push_back(std::string("index.html"));
}
+ bool isAuth = true; // TODO: auth tokens
+
if (httpMethod == HTTP_GET) {
- if (ps[0] == "index") {
- responseContentType = "text/html";
+
+ std::string ext;
+ std::size_t dotIdx = ps[0].find_last_of('.');
+ if (dotIdx != std::string::npos)
+ ext = ps[0].substr(dotIdx);
+
+ if ((ps.size() == 1)&&(ext.length() >= 2)&&(ext[0] == '.')) {
+#ifdef ZT_BUILD_IN_WEB_UI
+ // .anything == static page -- also the only thing you can get without isAuth == true
+ if (ext == ".html")
+ responseContentType = "text/html";
+ else if (ext == ".js")
+ responseContentType = "application/javascript";
+ else if (ext == ".json")
+ responseContentType = "application/json";
+ else if (ext == ".css")
+ responseContentType = "text/css";
+ else if (ext == ".png")
+ responseContentType = "image/png";
+ else if (ext == ".jpg")
+ responseContentType = "image/jpeg";
+ else if (ext == ".gif")
+ responseContentType = "image/gif";
+ else if (ext == ".txt")
+ responseContentType = "text/plain";
+ else if (ext == ".xml")
+ responseContentType = "text/xml";
+ else if (ext == ".svg")
+ responseContentType = "image/svg+xml";
+ else responseContentType = "application/octet-stream";
responseBody = "<html><body>Hello World!</body></html>";
scode = 200;
- } else if (ps[0] == "status") {
- responseContentType = "application/json";
- ZT1_NodeStatus status;
- _node->status(&status);
- Utils::snprintf(json,sizeof(json),
- "{"
- "\"address\":\"%.10llx\","
- "\"publicIdentity\":\"%s\","
- "\"online\":%s,"
- "\"versionMajor\":%d,"
- "\"versionMinor\":%d,"
- "\"versionRev\":%d,"
- "\"version\":\"%d.%d.%d\""
- "}",
- status.address,
- status.publicIdentity,
- (status.online) ? "true" : "false",
- ZEROTIER_ONE_VERSION_MAJOR,
- ZEROTIER_ONE_VERSION_MINOR,
- ZEROTIER_ONE_VERSION_REVISION,
- ZEROTIER_ONE_VERSION_MAJOR,ZEROTIER_ONE_VERSION_MINOR,ZEROTIER_ONE_VERSION_REVISION);
- responseBody = json;
- scode = 200;
- } else if (ps[0] == "config") {
- responseContentType = "application/json";
- responseBody = "{}"; // TODO
- scode = 200;
- } else if (ps[0] == "network") {
- ZT1_VirtualNetworkList *nws = _node->networks();
- if (nws) {
- if (ps.size() == 1) {
- // Return [array] of all networks
- responseContentType = "application/json";
- responseBody = "[";
- for(unsigned long i=0;i<nws->networkCount;++i) {
- if (i > 0)
- responseBody.push_back(',');
- _jsonAppend(responseBody,&(nws->networks[i]));
- }
- responseBody.push_back(']');
- scode = 200;
- } else if (ps.size() == 2) {
- // Return a single network by ID or 404 if not found
- uint64_t wantnw = Utils::hexStrToU64(ps[1].c_str());
- for(unsigned long i=0;i<nws->networkCount;++i) {
- if (nws->networks[i].nwid == wantnw) {
+#endif // ZT_BUILD_IN_WEB_UI
+ } else if (isAuth) {
+ if (ps[0] == "status") {
+ responseContentType = "application/json";
+ ZT1_NodeStatus status;
+ _node->status(&status);
+ Utils::snprintf(json,sizeof(json),
+ "{"
+ "\"address\":\"%.10llx\","
+ "\"publicIdentity\":\"%s\","
+ "\"online\":%s,"
+ "\"versionMajor\":%d,"
+ "\"versionMinor\":%d,"
+ "\"versionRev\":%d,"
+ "\"version\":\"%d.%d.%d\""
+ "}",
+ status.address,
+ status.publicIdentity,
+ (status.online) ? "true" : "false",
+ ZEROTIER_ONE_VERSION_MAJOR,
+ ZEROTIER_ONE_VERSION_MINOR,
+ ZEROTIER_ONE_VERSION_REVISION,
+ ZEROTIER_ONE_VERSION_MAJOR,ZEROTIER_ONE_VERSION_MINOR,ZEROTIER_ONE_VERSION_REVISION);
+ responseBody = json;
+ scode = 200;
+ } else if (ps[0] == "config") {
+ responseContentType = "application/json";
+ responseBody = "{}"; // TODO
+ scode = 200;
+ } else if (ps[0] == "network") {
+ if ((ps.size() > 1)&&(ps[1] == "controller")) {
+ // TODO
+ } else {
+ ZT1_VirtualNetworkList *nws = _node->networks();
+ if (nws) {
+ if (ps.size() == 1) {
+ // Return [array] of all networks
responseContentType = "application/json";
- _jsonAppend(responseBody,&(nws->networks[i]));
+ responseBody = "[";
+ for(unsigned long i=0;i<nws->networkCount;++i) {
+ if (i > 0)
+ responseBody.push_back(',');
+ _jsonAppend(responseBody,&(nws->networks[i]));
+ }
+ responseBody.push_back(']');
scode = 200;
- break;
- }
- }
- } // else 404
- _node->freeQueryResult((void *)nws);
- } else {
- scode = 500;
- }
- } else if (ps[0] == "peer") {
- ZT1_PeerList *pl = _node->peers();
- if (pl) {
- if (ps.size() == 1) {
- // Return [array] of all peers
- responseContentType = "application/json";
- responseBody = "[";
- for(unsigned long i=0;i<pl->peerCount;++i) {
- if (i > 0)
- responseBody.push_back(',');
- _jsonAppend(responseBody,&(pl->peers[i]));
- }
- responseBody.push_back(']');
- scode = 200;
- } else if (ps.size() == 2) {
- // Return a single peer by ID or 404 if not found
- uint64_t wantp = Utils::hexStrToU64(ps[1].c_str());
- for(unsigned long i=0;i<pl->peerCount;++i) {
- if (pl->peers[i].address == wantp) {
- responseContentType = "application/json";
+ } else if (ps.size() == 2) {
+ // Return a single network by ID or 404 if not found
+ uint64_t wantnw = Utils::hexStrToU64(ps[1].c_str());
+ for(unsigned long i=0;i<nws->networkCount;++i) {
+ if (nws->networks[i].nwid == wantnw) {
+ responseContentType = "application/json";
+ _jsonAppend(responseBody,&(nws->networks[i]));
+ scode = 200;
+ break;
+ }
+ }
+ } // else 404
+ _node->freeQueryResult((void *)nws);
+ } else scode = 500;
+ }
+ } else if (ps[0] == "peer") {
+ ZT1_PeerList *pl = _node->peers();
+ if (pl) {
+ if (ps.size() == 1) {
+ // Return [array] of all peers
+ responseContentType = "application/json";
+ responseBody = "[";
+ for(unsigned long i=0;i<pl->peerCount;++i) {
+ if (i > 0)
+ responseBody.push_back(',');
_jsonAppend(responseBody,&(pl->peers[i]));
- scode = 200;
- break;
}
- }
- } // else 404
- _node->freeQueryResult((void *)pl);
- } else {
- scode = 500;
- }
- }
- } else if ((httpMethod == HTTP_POST)||(httpMethod == HTTP_PUT)) { // PUT is weird in REST but we'll take it anyway
+ responseBody.push_back(']');
+ scode = 200;
+ } else if (ps.size() == 2) {
+ // Return a single peer by ID or 404 if not found
+ uint64_t wantp = Utils::hexStrToU64(ps[1].c_str());
+ for(unsigned long i=0;i<pl->peerCount;++i) {
+ if (pl->peers[i].address == wantp) {
+ responseContentType = "application/json";
+ _jsonAppend(responseBody,&(pl->peers[i]));
+ scode = 200;
+ break;
+ }
+ }
+ } // else 404
+ _node->freeQueryResult((void *)pl);
+ } else scode = 500;
+ } // else 404
+ } else scode = 401; // isAuth == false
+
+ } else if ((httpMethod == HTTP_POST)||(httpMethod == HTTP_PUT)) {
+
+ if (isAuth) {
+ if (ps[0] == "config") {
+ // TODO
+ } else if (ps[0] == "network") {
+ if ((ps.size() > 1)&&(ps[1] == "controller")) {
+ // TODO
+ } else {
+ if (ps.size() == 2) {
+ uint64_t wantnw = Utils::hexStrToU64(ps[1].c_str());
+ _node->join(wantnw); // does nothing if we are a member
+ ZT1_VirtualNetworkList *nws = _node->networks();
+ if (nws) {
+ for(unsigned long i=0;i<nws->networkCount;++i) {
+ if (nws->networks[i].nwid == wantnw) {
+ responseContentType = "application/json";
+ _jsonAppend(responseBody,&(nws->networks[i]));
+ scode = 200;
+ break;
+ }
+ }
+ _node->freeQueryResult((void *)nws);
+ } else scode = 500;
+ } // else 404
+ }
+ } // else 404
+ } else scode = 401; // isAuth == false
+
} else if (httpMethod == HTTP_DELETE) {
+
+ if (isAuth) {
+ if (ps[0] == "config") {
+ // TODO
+ } else if (ps[0] == "network") {
+ if ((ps.size() > 1)&&(ps[1] == "controller")) {
+ // TODO
+ } else {
+ ZT1_VirtualNetworkList *nws = _node->networks();
+ if (nws) {
+ if (ps.size() == 2) {
+ uint64_t wantnw = Utils::hexStrToU64(ps[1].c_str());
+ for(unsigned long i=0;i<nws->networkCount;++i) {
+ if (nws->networks[i].nwid == wantnw) {
+ _node->leave(wantnw);
+ responseBody = "true";
+ responseContentType = "application/json";
+ scode = 200;
+ break;
+ }
+ }
+ } // else 404
+ _node->freeQueryResult((void *)nws);
+ } else scode = 500;
+ }
+ } // else 404
+ } else scode = 401; // isAuth = false
+
} else {
scode = 400;
- responseBody = "Method not supported for resource ";
- responseBody.append(path);
+ responseBody = "Method not supported.";
}
+ // Wrap result in jsonp function call if the user included a jsonp= url argument
std::map<std::string,std::string>::const_iterator jsonp(urlArgs.find("jsonp"));
- if (jsonp != urlArgs.end()) {
+ if ((jsonp != urlArgs.end())&&(responseContentType == "application/json")) {
if (responseBody.length() > 0)
responseBody = jsonp->second + "(" + responseBody + ");";
else responseBody = jsonp->second + "(null);";
diff --git a/service/ControlPlane.hpp b/service/ControlPlane.hpp
index 29b84faa..87a65ead 100644
--- a/service/ControlPlane.hpp
+++ b/service/ControlPlane.hpp
@@ -37,6 +37,7 @@
namespace ZeroTier {
class Node;
+struct InetAddress;
/**
* HTTP control plane and static web server
@@ -44,12 +45,13 @@ class Node;
class ControlPlane
{
public:
- ControlPlane(Node *n,const std::set<std::string> atoks);
+ ControlPlane(Node *n);
~ControlPlane();
/**
* Handle HTTP request
*
+ * @param fromAddress Originating IP address of request
* @param httpMethod HTTP method (as defined in ext/http-parser/http_parser.h)
* @param path Request path
* @param headers Request headers
@@ -59,6 +61,7 @@ public:
* @return HTTP response code
*/
unsigned int handleRequest(
+ const InetAddress &fromAddress,
unsigned int httpMethod,
const std::string &path,
const std::map<std::string,std::string> &headers,
diff --git a/service/One.cpp b/service/One.cpp
index 08210da1..5e81bc61 100644
--- a/service/One.cpp
+++ b/service/One.cpp
@@ -189,7 +189,7 @@ public:
if (_master)
_node->setNetconfMaster((void *)_master);
- _controlPlane = new ControlPlane(_node,std::set<std::string>());
+ _controlPlane = new ControlPlane(_node);
_nextBackgroundTaskDeadline = 0;
for(;;) {
@@ -454,16 +454,12 @@ public:
std::string contentType("text/plain"); // default if not changed in handleRequest()
unsigned int scode = 404;
- if ((htc->from.ipsEqual(InetAddress::LO4))||(htc->from.ipsEqual(InetAddress::LO6))) {
- try {
- if (_controlPlane)
- scode = _controlPlane->handleRequest(htc->parser.method,htc->url,htc->headers,htc->body,data,contentType);
- } catch ( ... ) {
- scode = 500;
- }
- } else {
- scode = 403;
- htc->shouldKeepAlive = false;
+ try {
+ if (_controlPlane)
+ scode = _controlPlane->handleRequest(htc->from,htc->parser.method,htc->url,htc->headers,htc->body,data,contentType);
+ else scode = 500;
+ } catch ( ... ) {
+ scode = 500;
}
const char *scodestr;