mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-02-22 10:20:52 +00:00
Plumbing through trusted path stuff to OneService.
This commit is contained in:
parent
5d7174b162
commit
9657675755
@ -892,6 +892,11 @@ typedef struct
|
|||||||
*/
|
*/
|
||||||
uint64_t lastReceive;
|
uint64_t lastReceive;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is this a trusted path? If so this will be its nonzero ID.
|
||||||
|
*/
|
||||||
|
uint64_t trustedPathId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is path active?
|
* Is path active?
|
||||||
*/
|
*/
|
||||||
|
@ -43,6 +43,8 @@ namespace ZeroTier {
|
|||||||
bool IncomingPacket::tryDecode(const RuntimeEnvironment *RR,bool deferred)
|
bool IncomingPacket::tryDecode(const RuntimeEnvironment *RR,bool deferred)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
|
const Address sourceAddress(source());
|
||||||
|
|
||||||
// Check for trusted paths or unencrypted HELLOs (HELLO is the only packet sent in the clear)
|
// Check for trusted paths or unencrypted HELLOs (HELLO is the only packet sent in the clear)
|
||||||
const unsigned int c = cipher();
|
const unsigned int c = cipher();
|
||||||
bool trusted = false;
|
bool trusted = false;
|
||||||
@ -52,8 +54,9 @@ bool IncomingPacket::tryDecode(const RuntimeEnvironment *RR,bool deferred)
|
|||||||
// packets are dropped on the floor.
|
// packets are dropped on the floor.
|
||||||
if (RR->topology->shouldInboundPathBeTrusted(_remoteAddress,trustedPathId())) {
|
if (RR->topology->shouldInboundPathBeTrusted(_remoteAddress,trustedPathId())) {
|
||||||
trusted = true;
|
trusted = true;
|
||||||
|
printf("TRUSTED PATH packet from %s(%s), trusted path ID %llx\n",sourceAddress.toString().c_str(),_remoteAddress.toString().c_str(),trustedPathId());
|
||||||
} else {
|
} else {
|
||||||
TRACE("dropped packet from %s(%s), cipher set to trusted path mode but path %.16llx@%s is not trusted!",peer->address().toString().c_str(),_remoteAddress.toString().c_str(),trustedPathId(),_remoteAddress.toString().c_str());
|
TRACE("dropped packet from %s(%s), cipher set to trusted path mode but path %llx@%s is not trusted!",sourceAddress.toString().c_str(),_remoteAddress.toString().c_str(),trustedPathId(),_remoteAddress.toString().c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else if ((c == ZT_PROTO_CIPHER_SUITE__C25519_POLY1305_NONE)&&(verb() == Packet::VERB_HELLO)) {
|
} else if ((c == ZT_PROTO_CIPHER_SUITE__C25519_POLY1305_NONE)&&(verb() == Packet::VERB_HELLO)) {
|
||||||
@ -71,18 +74,17 @@ bool IncomingPacket::tryDecode(const RuntimeEnvironment *RR,bool deferred)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const Address sourceAddress(source());
|
|
||||||
SharedPtr<Peer> peer(RR->topology->getPeer(sourceAddress));
|
SharedPtr<Peer> peer(RR->topology->getPeer(sourceAddress));
|
||||||
if (peer) {
|
if (peer) {
|
||||||
if (!trusted) {
|
if (!trusted) {
|
||||||
if (!dearmor(peer->key())) {
|
if (!dearmor(peer->key())) {
|
||||||
TRACE("dropped packet from %s(%s), MAC authentication failed (size: %u)",peer->address().toString().c_str(),_remoteAddress.toString().c_str(),size());
|
TRACE("dropped packet from %s(%s), MAC authentication failed (size: %u)",sourceAddress.toString().c_str(),_remoteAddress.toString().c_str(),size());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!uncompress()) {
|
if (!uncompress()) {
|
||||||
TRACE("dropped packet from %s(%s), compressed data invalid",peer->address().toString().c_str(),_remoteAddress.toString().c_str());
|
TRACE("dropped packet from %s(%s), compressed data invalid",sourceAddress.toString().c_str(),_remoteAddress.toString().c_str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -447,6 +447,7 @@ ZT_PeerList *Node::peers() const
|
|||||||
p->paths[p->pathCount].lastReceive = path->lastReceived();
|
p->paths[p->pathCount].lastReceive = path->lastReceived();
|
||||||
p->paths[p->pathCount].active = path->active(_now) ? 1 : 0;
|
p->paths[p->pathCount].active = path->active(_now) ? 1 : 0;
|
||||||
p->paths[p->pathCount].preferred = ((bestPath)&&(*path == *bestPath)) ? 1 : 0;
|
p->paths[p->pathCount].preferred = ((bestPath)&&(*path == *bestPath)) ? 1 : 0;
|
||||||
|
p->paths[p->pathCount].trustedPathId = RR->topology->getOutboundPathTrust(path->address());
|
||||||
++p->pathCount;
|
++p->pathCount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -190,13 +190,15 @@ static std::string _jsonEnumerate(unsigned int depth,const ZT_PeerPhysicalPath *
|
|||||||
"%s\t\"lastSend\": %llu,\n"
|
"%s\t\"lastSend\": %llu,\n"
|
||||||
"%s\t\"lastReceive\": %llu,\n"
|
"%s\t\"lastReceive\": %llu,\n"
|
||||||
"%s\t\"active\": %s,\n"
|
"%s\t\"active\": %s,\n"
|
||||||
"%s\t\"preferred\": %s\n"
|
"%s\t\"preferred\": %s,\n"
|
||||||
|
"%s\t\"trustedPathId\": %llx\n"
|
||||||
"%s}",
|
"%s}",
|
||||||
prefix,_jsonEscape(reinterpret_cast<const InetAddress *>(&(pp[i].address))->toString()).c_str(),
|
prefix,_jsonEscape(reinterpret_cast<const InetAddress *>(&(pp[i].address))->toString()).c_str(),
|
||||||
prefix,pp[i].lastSend,
|
prefix,pp[i].lastSend,
|
||||||
prefix,pp[i].lastReceive,
|
prefix,pp[i].lastReceive,
|
||||||
prefix,(pp[i].active == 0) ? "false" : "true",
|
prefix,(pp[i].active == 0) ? "false" : "true",
|
||||||
prefix,(pp[i].preferred == 0) ? "false" : "true",
|
prefix,(pp[i].preferred == 0) ? "false" : "true",
|
||||||
|
prefix,pp[i].trustedPathId,
|
||||||
prefix);
|
prefix);
|
||||||
buf.append(json);
|
buf.append(json);
|
||||||
}
|
}
|
||||||
|
@ -759,6 +759,38 @@ public:
|
|||||||
for(int i=0;i<3;++i)
|
for(int i=0;i<3;++i)
|
||||||
_portsBE[i] = Utils::hton((uint16_t)_ports[i]);
|
_portsBE[i] = Utils::hton((uint16_t)_ports[i]);
|
||||||
|
|
||||||
|
{
|
||||||
|
FILE *trustpaths = fopen((_homePath + ZT_PATH_SEPARATOR_S + "trustpaths").c_str(),"r");
|
||||||
|
uint64_t ids[ZT_MAX_TRUSTED_PATHS];
|
||||||
|
InetAddress addresses[ZT_MAX_TRUSTED_PATHS];
|
||||||
|
if (trustpaths) {
|
||||||
|
char buf[1024];
|
||||||
|
unsigned int count = 0;
|
||||||
|
while ((fgets(buf,sizeof(buf),trustpaths))&&(count < ZT_MAX_TRUSTED_PATHS)) {
|
||||||
|
int fno = 0;
|
||||||
|
char *saveptr = (char *)0;
|
||||||
|
uint64_t trustedPathId = 0;
|
||||||
|
InetAddress trustedPathNetwork;
|
||||||
|
for(char *f=Utils::stok(buf,"=\r\n \t",&saveptr);(f);f=Utils::stok((char *)0,"=\r\n \t",&saveptr)) {
|
||||||
|
if (fno == 0) {
|
||||||
|
trustedPathId = Utils::hexStrToU64(f);
|
||||||
|
} else if (fno == 1) {
|
||||||
|
trustedPathNetwork = InetAddress(f);
|
||||||
|
} else break;
|
||||||
|
++fno;
|
||||||
|
}
|
||||||
|
if ( (trustedPathId != 0) && ((trustedPathNetwork.ss_family == AF_INET)||(trustedPathNetwork.ss_family == AF_INET6)) && (trustedPathNetwork.ipScope() != InetAddress::IP_SCOPE_GLOBAL) && (trustedPathNetwork.netmaskBits() > 0) ) {
|
||||||
|
ids[count] = trustedPathId;
|
||||||
|
addresses[count] = trustedPathNetwork;
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(trustpaths);
|
||||||
|
if (count)
|
||||||
|
_node->setTrustedPaths(reinterpret_cast<const struct sockaddr_storage *>(addresses),ids,count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
|
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
|
||||||
_controller = new SqliteNetworkController(_node,(_homePath + ZT_PATH_SEPARATOR_S + ZT_CONTROLLER_DB_PATH).c_str(),(_homePath + ZT_PATH_SEPARATOR_S + "circuitTestResults.d").c_str());
|
_controller = new SqliteNetworkController(_node,(_homePath + ZT_PATH_SEPARATOR_S + ZT_CONTROLLER_DB_PATH).c_str(),(_homePath + ZT_PATH_SEPARATOR_S + "circuitTestResults.d").c_str());
|
||||||
_node->setNetconfMaster((void *)_controller);
|
_node->setNetconfMaster((void *)_controller);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user