summaryrefslogtreecommitdiff
path: root/netconf-service
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2013-10-24 16:19:53 -0400
committerAdam Ierymenko <adam.ierymenko@gmail.com>2013-10-24 16:19:53 -0400
commitbbcd76ecd0c66adf73d32e2a7ab152a85af9879c (patch)
tree97d1c91058ca85848f1a2da6e44f48d7477aa420 /netconf-service
parent3de76fcab14940c0869e772de7656a1d616f08e6 (diff)
downloadinfinitytier-bbcd76ecd0c66adf73d32e2a7ab152a85af9879c.tar.gz
infinitytier-bbcd76ecd0c66adf73d32e2a7ab152a85af9879c.zip
Netconf updates -- actually issue COM, and log attempts to access networks in NetworkActivity using the new authenticated flag in the new DB schema.
Diffstat (limited to 'netconf-service')
-rw-r--r--netconf-service/Makefile4
-rw-r--r--netconf-service/netconf.cpp62
2 files changed, 41 insertions, 25 deletions
diff --git a/netconf-service/Makefile b/netconf-service/Makefile
index fc26ddbb..23067d48 100644
--- a/netconf-service/Makefile
+++ b/netconf-service/Makefile
@@ -1,7 +1,7 @@
all:
gcc -O6 -c ../ext/lz4/lz4hc.c ../ext/lz4/lz4.c
- g++ -DZT_OSNAME="linux" -DZT_ARCH="x86_64" -I/usr/include/mysql -I../ext/bin/libcrypto/include -O -pthread -o netconf.service netconf.cpp ../node/Utils.cpp ../node/Identity.cpp ../node/Salsa20.cpp ../node/C25519.cpp ../node/SHA512.cpp lz4.o lz4hc.o -lmysqlpp
- g++ -DZT_OSNAME="linux" -DZT_ARCH="x86_64" -I/usr/include/mysql -I../ext/bin/libcrypto/include -O -pthread -o netconf-test netconf-test.cpp ../node/Utils.cpp ../node/Identity.cpp ../node/Salsa20.cpp ../node/Logger.cpp ../node/Service.cpp ../node/C25519.cpp ../node/SHA512.cpp lz4.o lz4hc.o
+ g++ -DZT_OSNAME="linux" -DZT_ARCH="x86_64" -I/usr/include/mysql -I../ext/bin/libcrypto/include -O -pthread -o netconf.service netconf.cpp ../node/Utils.cpp ../node/Identity.cpp ../node/Salsa20.cpp ../node/C25519.cpp ../node/SHA512.cpp ../node/CertificateOfMembership.cpp lz4.o lz4hc.o -lmysqlpp
+# g++ -DZT_OSNAME="linux" -DZT_ARCH="x86_64" -I/usr/include/mysql -I../ext/bin/libcrypto/include -O -pthread -o netconf-test netconf-test.cpp ../node/Utils.cpp ../node/Identity.cpp ../node/Salsa20.cpp ../node/Logger.cpp ../node/Service.cpp ../node/C25519.cpp ../node/SHA512.cpp lz4.o lz4hc.o
clean:
rm -f *.o netconf.service netconf-test
diff --git a/netconf-service/netconf.cpp b/netconf-service/netconf.cpp
index ddb838c1..7a905863 100644
--- a/netconf-service/netconf.cpp
+++ b/netconf-service/netconf.cpp
@@ -69,11 +69,13 @@
#include <mysql++/mysql++.h>
+#include "../node/Constants.hpp"
#include "../node/Dictionary.hpp"
#include "../node/Identity.hpp"
#include "../node/Utils.hpp"
#include "../node/Mutex.hpp"
#include "../node/NetworkConfig.hpp"
+#include "../node/CertificateOfMembership.hpp"
using namespace ZeroTier;
using namespace mysqlpp;
@@ -116,6 +118,7 @@ int main(int argc,char **argv)
}
char buf[131072],buf2[131072];
+ Identity signingIdentity;
std::string dictBuf;
try {
@@ -195,7 +198,15 @@ int main(int argc,char **argv)
try {
const std::string &reqType = request.get("type");
- if (reqType == "netconf-request") { // NETWORK_CONFIG_REQUEST packet
+ if (reqType == "netconf-init") { // initialization to set things like netconf's identity
+ Identity netconfId(request.get("netconfId"));
+ if ((netconfId)&&(netconfId.hasPrivate()))
+ signingIdentity = netconfId;
+ else {
+ fprintf(stderr,"netconfId invalid or lacks private key\n");
+ return -1;
+ }
+ } else if (reqType == "netconf-request") { // NETWORK_CONFIG_REQUEST packet
// Deserialize querying peer identity and network ID
Identity peerIdentity(request.get("peerId"));
uint64_t nwid = strtoull(request.get("nwid").c_str(),(char **)0,16);
@@ -224,7 +235,7 @@ int main(int argc,char **argv)
}
} else {
q = dbCon->query();
- q << "INSERT INTO Node (id,creationTime,lastSeen,identity) VALUES (" << peerIdentity.address().toInt() << "," << Utils::now() << ",0," << quote << peerIdentity.toString(false) << ")";
+ q << "INSERT INTO Node (id,creationTime,identity) VALUES (" << peerIdentity.address().toInt() << "," << Utils::now() << "," << quote << peerIdentity.toString(false) << ")";
if (!q.exec()) {
fprintf(stderr,"error inserting Node row for peer %s, aborting netconf request\n",peerIdentity.address().toString().c_str());
continue;
@@ -233,13 +244,6 @@ int main(int argc,char **argv)
}
}
- // Update lastSeen for Node, which is always updated on a netconf request
- {
- Query q = dbCon->query();
- q << "UPDATE Node SET lastSeen = " << Utils::now() << " WHERE id = " << peerIdentity.address().toInt();
- q.exec();
- }
-
// Look up core network information
bool isOpen = false;
unsigned int multicastPrefixBits = 0;
@@ -278,11 +282,13 @@ int main(int argc,char **argv)
write(STDOUT_FILENO,&respml,4);
write(STDOUT_FILENO,respm.data(),respm.length());
stdoutWriteLock.unlock();
+
continue; // ABORT, wait for next request
}
}
// Check membership if this is a closed network
+ bool authenticated = true;
if (!isOpen) {
Query q = dbCon->query();
q << "SELECT Node_id FROM NetworkNodes WHERE Network_id = " << nwid << " AND Node_id = " << peerIdentity.address().toInt();
@@ -301,10 +307,28 @@ int main(int argc,char **argv)
write(STDOUT_FILENO,&respml,4);
write(STDOUT_FILENO,respm.data(),respm.length());
stdoutWriteLock.unlock();
- continue; // ABORT, wait for next request
+
+ authenticated = false;
+ }
+ }
+
+ // Update most recent activity entry for this peer, also indicating
+ // whether authentication was successful.
+ {
+ if (fromAddr.length()) {
+ Query q = dbCon->query();
+ q << "INSERT INTO NetworkActivity (Network_id,Node_id,lastActivityTime,authenticated,lastActivityFrom) VALUES (" << nwid << "," << peerIdentity.address().toInt() << "," << Utils::now() << "," << (authenticated ? 1 : 0) << "," << quote << fromAddr << ") ON DUPLICATE KEY UPDATE lastActivityTime = VALUES(lastActivityTime),authenticated = VALUES(authenticated),lastActivityFrom = VALUES(lastActivityFrom)";
+ q.exec();
+ } else {
+ Query q = dbCon->query();
+ q << "INSERT INTO NetworkActivity (Network_id,Node_id,lastActivityTime,authenticated) VALUES (" << nwid << "," << peerIdentity.address().toInt() << "," << Utils::now() << "," << (authenticated ? 1 : 0) << ") ON DUPLICATE KEY UPDATE lastActivityTime = VALUES(lastActivityTime),authenticated = VALUES(authenticated)";
+ q.exec();
}
}
+ if (!authenticated)
+ continue; // ABORT, wait for next request
+
// Get list of etherTypes in comma-delimited hex format
std::string etherTypeWhitelist;
{
@@ -401,19 +425,6 @@ int main(int argc,char **argv)
}
}
- // Update activity table for this network to indicate peer's participation
- {
- if (fromAddr.length()) {
- Query q = dbCon->query();
- q << "INSERT INTO NetworkActivity (Network_id,Node_id,lastActivityTime,lastActivityFrom) VALUES (" << nwid << "," << peerIdentity.address().toInt() << "," << Utils::now() << "," << quote << fromAddr << ") ON DUPLICATE KEY UPDATE lastActivityTime = VALUES(lastActivityTime),lastActivityFrom = VALUES(lastActivityFrom)";
- q.exec();
- } else {
- Query q = dbCon->query();
- q << "INSERT INTO NetworkActivity (Network_id,Node_id,lastActivityTime) VALUES (" << nwid << "," << peerIdentity.address().toInt() << "," << Utils::now() << ") ON DUPLICATE KEY UPDATE lastActivityTime = VALUES(lastActivityTime)";
- q.exec();
- }
- }
-
// Assemble response dictionary to send to peer
Dictionary netconf;
sprintf(buf,"%.16llx",(unsigned long long)nwid);
@@ -448,6 +459,11 @@ int main(int argc,char **argv)
netconf[ZT_NETWORKCONFIG_DICT_KEY_IPV4_STATIC] = ipv4Static;
if (ipv6Static.length())
netconf[ZT_NETWORKCONFIG_DICT_KEY_IPV6_STATIC] = ipv6Static;
+ if ((!isOpen)&&(authenticated)&&(signingIdentity)&&(signingIdentity.hasPrivate())) {
+ CertificateOfMembership com(Utils::now(),ZT_NETWORK_AUTOCONF_DELAY * 3,nwid,peerIdentity.address());
+ com.sign(signingIdentity);
+ netconf[ZT_NETWORKCONFIG_DICT_KEY_CERTIFICATE_OF_MEMBERSHIP] = com.toString();
+ }
// Send netconf as service bus response
{