mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-04-19 16:30:50 +00:00
Merge pull request #2163 from zerotier:temporal
Temporal integration with hosted controllers
This commit is contained in:
commit
f89cde8186
12
.github/workflows/build.yml
vendored
12
.github/workflows/build.yml
vendored
@ -22,10 +22,10 @@ jobs:
|
||||
uses: Swatinem/rust-cache@v2
|
||||
continue-on-error: false
|
||||
with:
|
||||
key: ${{ runner.os }}-cargo-${{ hashFiles('zeroidc//Cargo.lock') }}
|
||||
key: ${{ runner.os }}-cargo-${{ hashFiles('rustybits//Cargo.lock') }}
|
||||
shared-key: ${{ runner.os }}-cargo-
|
||||
workspaces: |
|
||||
zeroidc/
|
||||
rustybits/
|
||||
|
||||
- name: make
|
||||
run: make
|
||||
@ -54,10 +54,10 @@ jobs:
|
||||
uses: Swatinem/rust-cache@v2
|
||||
continue-on-error: false
|
||||
with:
|
||||
key: ${{ runner.os }}-cargo-${{ hashFiles('zeroidc//Cargo.lock') }}
|
||||
key: ${{ runner.os }}-cargo-${{ hashFiles('rustybits//Cargo.lock') }}
|
||||
shared-key: ${{ runner.os }}-cargo-
|
||||
workspaces: |
|
||||
zeroidc/
|
||||
rustybits/
|
||||
|
||||
- name: make
|
||||
run: make
|
||||
@ -86,10 +86,10 @@ jobs:
|
||||
uses: Swatinem/rust-cache@v2
|
||||
continue-on-error: false
|
||||
with:
|
||||
key: ${{ runner.os }}-cargo-${{ hashFiles('zeroidc//Cargo.lock') }}
|
||||
key: ${{ runner.os }}-cargo-${{ hashFiles('rustybits//Cargo.lock') }}
|
||||
shared-key: ${{ runner.os }}-cargo-
|
||||
workspaces: |
|
||||
zeroidc/
|
||||
rustybits/
|
||||
|
||||
- name: setup msbuild
|
||||
uses: microsoft/setup-msbuild@v1.1.3
|
||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -138,3 +138,4 @@ __pycache__
|
||||
*_source.tar.bz2
|
||||
snap/.snapcraft
|
||||
tcp-proxy/tcp-proxy
|
||||
rustybits/target
|
||||
|
@ -21,6 +21,8 @@
|
||||
#include "../version.h"
|
||||
#include "Redis.hpp"
|
||||
|
||||
#include <smeeclient.h>
|
||||
|
||||
#include <libpq-fe.h>
|
||||
#include <sstream>
|
||||
#include <iomanip>
|
||||
@ -159,6 +161,8 @@ using Attrs = std::vector<std::pair<std::string, std::string>>;
|
||||
using Item = std::pair<std::string, Attrs>;
|
||||
using ItemStream = std::vector<Item>;
|
||||
|
||||
|
||||
|
||||
PostgreSQL::PostgreSQL(const Identity &myId, const char *path, int listenPort, RedisConfig *rc)
|
||||
: DB()
|
||||
, _pool()
|
||||
@ -173,6 +177,7 @@ PostgreSQL::PostgreSQL(const Identity &myId, const char *path, int listenPort, R
|
||||
, _redis(NULL)
|
||||
, _cluster(NULL)
|
||||
, _redisMemberStatus(false)
|
||||
, _smee(NULL)
|
||||
{
|
||||
char myAddress[64];
|
||||
_myAddressStr = myId.address().toString(myAddress);
|
||||
@ -248,10 +253,17 @@ PostgreSQL::PostgreSQL(const Identity &myId, const char *path, int listenPort, R
|
||||
_commitThread[i] = std::thread(&PostgreSQL::commitThread, this);
|
||||
}
|
||||
_onlineNotificationThread = std::thread(&PostgreSQL::onlineNotificationThread, this);
|
||||
|
||||
configureSmee();
|
||||
}
|
||||
|
||||
PostgreSQL::~PostgreSQL()
|
||||
{
|
||||
if (_smee != NULL) {
|
||||
smeeclient::smee_client_delete(_smee);
|
||||
_smee = NULL;
|
||||
}
|
||||
|
||||
_run = 0;
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||
|
||||
@ -265,6 +277,31 @@ PostgreSQL::~PostgreSQL()
|
||||
_onlineNotificationThread.join();
|
||||
}
|
||||
|
||||
void PostgreSQL::configureSmee()
|
||||
{
|
||||
const char *TEMPORAL_SCHEME = "ZT_TEMPORAL_SCHEME";
|
||||
const char *TEMPORAL_HOST = "ZT_TEMPORAL_HOST";
|
||||
const char *TEMPORAL_PORT = "ZT_TEMPORAL_PORT";
|
||||
const char *TEMPORAL_NAMESPACE = "ZT_TEMPORAL_NAMESPACE";
|
||||
const char *SMEE_TASK_QUEUE = "ZT_SMEE_TASK_QUEUE";
|
||||
|
||||
const char *scheme = getenv(TEMPORAL_SCHEME);
|
||||
if (scheme == NULL) {
|
||||
scheme = "http";
|
||||
}
|
||||
const char *host = getenv(TEMPORAL_HOST);
|
||||
const char *port = getenv(TEMPORAL_PORT);
|
||||
const char *ns = getenv(TEMPORAL_NAMESPACE);
|
||||
const char *task_queue = getenv(SMEE_TASK_QUEUE);
|
||||
|
||||
if (scheme != NULL && host != NULL && port != NULL && ns != NULL && task_queue != NULL) {
|
||||
fprintf(stderr, "creating smee client\n");
|
||||
std::string hostPort = std::string(scheme) + std::string("://") + std::string(host) + std::string(":") + std::string(port);
|
||||
this->_smee = smeeclient::smee_client_new(hostPort.c_str(), ns, task_queue);
|
||||
} else {
|
||||
fprintf(stderr, "Smee client not configured\n");
|
||||
}
|
||||
}
|
||||
|
||||
bool PostgreSQL::waitForReady()
|
||||
{
|
||||
@ -1306,40 +1343,72 @@ void PostgreSQL::commitThread()
|
||||
continue;
|
||||
}
|
||||
|
||||
pqxx::result res = w.exec_params0(
|
||||
"INSERT INTO ztc_member (id, network_id, active_bridge, authorized, capabilities, "
|
||||
"identity, last_authorized_time, last_deauthorized_time, no_auto_assign_ips, "
|
||||
"remote_trace_level, remote_trace_target, revision, tags, v_major, v_minor, v_rev, v_proto) "
|
||||
"VALUES ($1, $2, $3, $4, $5, $6, "
|
||||
"TO_TIMESTAMP($7::double precision/1000), TO_TIMESTAMP($8::double precision/1000), "
|
||||
"$9, $10, $11, $12, $13, $14, $15, $16, $17) ON CONFLICT (network_id, id) DO UPDATE SET "
|
||||
"active_bridge = EXCLUDED.active_bridge, authorized = EXCLUDED.authorized, capabilities = EXCLUDED.capabilities, "
|
||||
"identity = EXCLUDED.identity, last_authorized_time = EXCLUDED.last_authorized_time, "
|
||||
"last_deauthorized_time = EXCLUDED.last_deauthorized_time, no_auto_assign_ips = EXCLUDED.no_auto_assign_ips, "
|
||||
"remote_trace_level = EXCLUDED.remote_trace_level, remote_trace_target = EXCLUDED.remote_trace_target, "
|
||||
"revision = EXCLUDED.revision+1, tags = EXCLUDED.tags, v_major = EXCLUDED.v_major, "
|
||||
"v_minor = EXCLUDED.v_minor, v_rev = EXCLUDED.v_rev, v_proto = EXCLUDED.v_proto",
|
||||
memberId,
|
||||
networkId,
|
||||
(bool)config["activeBridge"],
|
||||
(bool)config["authorized"],
|
||||
OSUtils::jsonDump(config["capabilities"], -1),
|
||||
OSUtils::jsonString(config["identity"], ""),
|
||||
(uint64_t)config["lastAuthorizedTime"],
|
||||
(uint64_t)config["lastDeauthorizedTime"],
|
||||
(bool)config["noAutoAssignIps"],
|
||||
(int)config["remoteTraceLevel"],
|
||||
target,
|
||||
(uint64_t)config["revision"],
|
||||
OSUtils::jsonDump(config["tags"], -1),
|
||||
(int)config["vMajor"],
|
||||
(int)config["vMinor"],
|
||||
(int)config["vRev"],
|
||||
(int)config["vProto"]);
|
||||
|
||||
pqxx::row mrow = w.exec_params1("SELECT COUNT(id) FROM ztc_member WHERE id = $1 AND network_id = $2", memberId, networkId);
|
||||
int membercount = mrow[0].as<int>();
|
||||
|
||||
res = w.exec_params0("DELETE FROM ztc_member_ip_assignment WHERE member_id = $1 AND network_id = $2",
|
||||
memberId, networkId);
|
||||
bool isNewMember = false;
|
||||
if (membercount == 0) {
|
||||
// new member
|
||||
isNewMember = true;
|
||||
pqxx::result res = w.exec_params0(
|
||||
"INSERT INTO ztc_member (id, network_id, active_bridge, authorized, capabilities, "
|
||||
"identity, last_authorized_time, last_deauthorized_time, no_auto_assign_ips, "
|
||||
"remote_trace_level, remote_trace_target, revision, tags, v_major, v_minor, v_rev, v_proto) "
|
||||
"VALUES ($1, $2, $3, $4, $5, $6, "
|
||||
"TO_TIMESTAMP($7::double precision/1000), TO_TIMESTAMP($8::double precision/1000), "
|
||||
"$9, $10, $11, $12, $13, $14, $15, $16, $17)",
|
||||
memberId,
|
||||
networkId,
|
||||
(bool)config["activeBridge"],
|
||||
(bool)config["authorized"],
|
||||
OSUtils::jsonDump(config["capabilities"], -1),
|
||||
OSUtils::jsonString(config["identity"], ""),
|
||||
(uint64_t)config["lastAuthorizedTime"],
|
||||
(uint64_t)config["lastDeauthorizedTime"],
|
||||
(bool)config["noAutoAssignIps"],
|
||||
(int)config["remoteTraceLevel"],
|
||||
target,
|
||||
(uint64_t)config["revision"],
|
||||
OSUtils::jsonDump(config["tags"], -1),
|
||||
(int)config["vMajor"],
|
||||
(int)config["vMinor"],
|
||||
(int)config["vRev"],
|
||||
(int)config["vProto"]);
|
||||
} else {
|
||||
// existing member
|
||||
pqxx::result res = w.exec_params0(
|
||||
"UPDATE ztc_member "
|
||||
"SET active_bridge = $3, authorized = $4, capabilities = $5, identity = $6, "
|
||||
"last_authorized_time = TO_TIMESTAMP($7::double precision/1000), "
|
||||
"last_deauthorized_time = TO_TIMESTAMP($8::double precision/1000), "
|
||||
"no_auto_assign_ips = $9, remote_trace_level = $10, remote_trace_target= $11, "
|
||||
"revision = $12, tags = $13, v_major = $14, v_minor = $15, v_rev = $16, v_proto = $17 "
|
||||
"WHERE id = $1 AND network_id = $2",
|
||||
memberId,
|
||||
networkId,
|
||||
(bool)config["activeBridge"],
|
||||
(bool)config["authorized"],
|
||||
OSUtils::jsonDump(config["capabilities"], -1),
|
||||
OSUtils::jsonString(config["identity"], ""),
|
||||
(uint64_t)config["lastAuthorizedTime"],
|
||||
(uint64_t)config["lastDeauthorizedTime"],
|
||||
(bool)config["noAutoAssignIps"],
|
||||
(int)config["remoteTraceLevel"],
|
||||
target,
|
||||
(uint64_t)config["revision"],
|
||||
OSUtils::jsonDump(config["tags"], -1),
|
||||
(int)config["vMajor"],
|
||||
(int)config["vMinor"],
|
||||
(int)config["vRev"],
|
||||
(int)config["vProto"]
|
||||
);
|
||||
}
|
||||
|
||||
if (!isNewMember) {
|
||||
pqxx::result res = w.exec_params0("DELETE FROM ztc_member_ip_assignment WHERE member_id = $1 AND network_id = $2",
|
||||
memberId, networkId);
|
||||
}
|
||||
|
||||
std::vector<std::string> assignments;
|
||||
bool ipAssignError = false;
|
||||
@ -1350,7 +1419,7 @@ void PostgreSQL::commitThread()
|
||||
continue;
|
||||
}
|
||||
|
||||
res = w.exec_params0(
|
||||
pqxx::result res = w.exec_params0(
|
||||
"INSERT INTO ztc_member_ip_assignment (member_id, network_id, address) VALUES ($1, $2, $3) ON CONFLICT (network_id, member_id, address) DO NOTHING",
|
||||
memberId, networkId, addr);
|
||||
|
||||
@ -1366,6 +1435,17 @@ void PostgreSQL::commitThread()
|
||||
|
||||
w.commit();
|
||||
|
||||
if (_smee != NULL && isNewMember) {
|
||||
notifyNewMember(networkId, memberId);
|
||||
} else {
|
||||
if (_smee == NULL) {
|
||||
fprintf(stderr, "smee is NULL\n");
|
||||
}
|
||||
if (!isNewMember) {
|
||||
fprintf(stderr, "nt a new member\n");
|
||||
}
|
||||
}
|
||||
|
||||
const uint64_t nwidInt = OSUtils::jsonIntHex(config["nwid"], 0ULL);
|
||||
const uint64_t memberidInt = OSUtils::jsonIntHex(config["id"], 0ULL);
|
||||
if (nwidInt && memberidInt) {
|
||||
@ -1609,6 +1689,13 @@ void PostgreSQL::commitThread()
|
||||
fprintf(stderr, "%s commitThread finished\n", _myAddressStr.c_str());
|
||||
}
|
||||
|
||||
void PostgreSQL::notifyNewMember(const std::string &networkID, const std::string &memberID) {
|
||||
smeeclient::smee_client_notify_network_joined(
|
||||
_smee,
|
||||
networkID.c_str(),
|
||||
memberID.c_str());
|
||||
}
|
||||
|
||||
void PostgreSQL::onlineNotificationThread()
|
||||
{
|
||||
waitForReady();
|
||||
|
@ -32,6 +32,10 @@ extern "C" {
|
||||
typedef struct pg_conn PGconn;
|
||||
}
|
||||
|
||||
namespace smeeclient {
|
||||
struct SmeeClient;
|
||||
}
|
||||
|
||||
namespace ZeroTier {
|
||||
|
||||
struct RedisConfig;
|
||||
@ -144,6 +148,9 @@ private:
|
||||
uint64_t _doRedisUpdate(sw::redis::Transaction &tx, std::string &controllerId,
|
||||
std::unordered_map< std::pair<uint64_t,uint64_t>,std::pair<int64_t,InetAddress>,_PairHasher > &lastOnline);
|
||||
|
||||
void configureSmee();
|
||||
void notifyNewMember(const std::string &networkID, const std::string &memberID);
|
||||
|
||||
enum OverrideMode {
|
||||
ALLOW_PGBOUNCER_OVERRIDE = 0,
|
||||
NO_OVERRIDE = 1
|
||||
@ -178,6 +185,8 @@ private:
|
||||
std::shared_ptr<sw::redis::Redis> _redis;
|
||||
std::shared_ptr<sw::redis::RedisCluster> _cluster;
|
||||
bool _redisMemberStatus;
|
||||
|
||||
smeeclient::SmeeClient *_smee;
|
||||
};
|
||||
|
||||
} // namespace ZeroTier
|
||||
|
@ -20,6 +20,7 @@ RUN apt -y install \
|
||||
postgresql-client-common \
|
||||
curl \
|
||||
google-perftools \
|
||||
libgoogle-perftools-dev
|
||||
libgoogle-perftools-dev \
|
||||
protobuf-compiler
|
||||
|
||||
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
|
||||
|
@ -3,6 +3,7 @@ FROM ubuntu:jammy
|
||||
RUN apt update && apt upgrade -y
|
||||
|
||||
RUN apt -y install \
|
||||
netcat \
|
||||
postgresql-client \
|
||||
postgresql-client-common \
|
||||
libjemalloc2 \
|
||||
@ -11,4 +12,4 @@ RUN apt -y install \
|
||||
binutils \
|
||||
linux-tools-gke \
|
||||
perf-tools-unstable \
|
||||
google-perftools
|
||||
google-perftools
|
||||
|
@ -100,6 +100,13 @@ else
|
||||
done
|
||||
fi
|
||||
|
||||
echo "Waiting for temporal"
|
||||
while ! nc -z ${ZT_TEMPORAL_HOST} ${ZT_TEMPORAL_PORT}; do
|
||||
echo "waiting...";
|
||||
sleep 1;
|
||||
done
|
||||
echo "Temporal is up"
|
||||
|
||||
export GLIBCXX_FORCE_NEW=1
|
||||
export GLIBCPP_FORCE_NEW=1
|
||||
export LD_PRELOAD="/usr/lib/x86_64-linux-gnu/libjemalloc.so.2"
|
||||
|
@ -9,10 +9,11 @@ ifeq ($(origin CXX),default)
|
||||
CXX:=$(shell if [ -e /opt/rh/devtoolset-8/root/usr/bin/g++ ]; then echo /opt/rh/devtoolset-8/root/usr/bin/g++; else echo $(CXX); fi)
|
||||
endif
|
||||
|
||||
INCLUDES?=-Izeroidc/target -isystem ext -Iext/prometheus-cpp-lite-1.0/core/include -Iext-prometheus-cpp-lite-1.0/3rdparty/http-client-lite/include -Iext/prometheus-cpp-lite-1.0/simpleapi/include
|
||||
INCLUDES?=-Irustybits/target -isystem ext -Iext/prometheus-cpp-lite-1.0/core/include -Iext-prometheus-cpp-lite-1.0/3rdparty/http-client-lite/include -Iext/prometheus-cpp-lite-1.0/simpleapi/include
|
||||
DEFS?=
|
||||
LDLIBS?=
|
||||
DESTDIR?=
|
||||
EXTRA_DEPS?=
|
||||
|
||||
include objects.mk
|
||||
ONE_OBJS+=osdep/LinuxEthernetTap.o
|
||||
@ -295,9 +296,9 @@ ifeq ($(ZT_SSO_SUPPORTED), 1)
|
||||
ifeq ($(ZT_EMBEDDED),)
|
||||
override DEFS+=-DZT_SSO_SUPPORTED=1
|
||||
ifeq ($(ZT_DEBUG),1)
|
||||
LDLIBS+=zeroidc/target/debug/libzeroidc.a -ldl -lssl -lcrypto
|
||||
LDLIBS+=rustybits/target/debug/libzeroidc.a -ldl -lssl -lcrypto
|
||||
else
|
||||
LDLIBS+=zeroidc/target/release/libzeroidc.a -ldl -lssl -lcrypto
|
||||
LDLIBS+=rustybits/target/release/libzeroidc.a -ldl -lssl -lcrypto
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
@ -324,6 +325,11 @@ ifeq ($(ZT_CONTROLLER),1)
|
||||
override LDLIBS+=-Lext/libpqxx-7.7.3/install/ubuntu22.04/$(EXT_ARCH)/lib -lpqxx -lpq ext/hiredis-1.0.2/lib/ubuntu22.04/$(EXT_ARCH)/libhiredis.a ext/redis-plus-plus-1.3.3/install/ubuntu22.04/$(EXT_ARCH)/lib/libredis++.a -lssl -lcrypto
|
||||
override DEFS+=-DZT_CONTROLLER_USE_LIBPQ -DZT_NO_PEER_METRICS
|
||||
override INCLUDES+=-I/usr/include/postgresql -Iext/libpqxx-7.7.3/install/ubuntu22.04/$(EXT_ARCH)/include -Iext/hiredis-1.0.2/include/ -Iext/redis-plus-plus-1.3.3/install/ubuntu22.04/$(EXT_ARCH)/include/sw/
|
||||
ifeq ($(ZT_DEBUG),1)
|
||||
override LDLIBS+=rustybits/target/debug/libsmeeclient.a
|
||||
else
|
||||
override LDLIBS+=rustybits/target/release/libsmeeclient.a
|
||||
endif
|
||||
endif
|
||||
|
||||
# ARM32 hell -- use conservative CFLAGS
|
||||
@ -370,7 +376,7 @@ from_builder: FORCE
|
||||
ln -sf zerotier-one zerotier-idtool
|
||||
ln -sf zerotier-one zerotier-cli
|
||||
|
||||
zerotier-one: $(CORE_OBJS) $(ONE_OBJS) one.o
|
||||
zerotier-one: $(CORE_OBJS) $(ONE_OBJS) one.o
|
||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) -o zerotier-one $(CORE_OBJS) $(ONE_OBJS) one.o $(LDLIBS)
|
||||
|
||||
zerotier-idtool: zerotier-one
|
||||
@ -379,7 +385,7 @@ zerotier-idtool: zerotier-one
|
||||
zerotier-cli: zerotier-one
|
||||
ln -sf zerotier-one zerotier-cli
|
||||
|
||||
$(ONE_OBJS): zeroidc
|
||||
$(ONE_OBJS): zeroidc smeeclient
|
||||
|
||||
libzerotiercore.a: FORCE
|
||||
make CFLAGS="-O3 -fstack-protector -fPIC" CXXFLAGS="-O3 -std=c++17 -fstack-protector -fPIC" $(CORE_OBJS)
|
||||
@ -399,7 +405,7 @@ manpages: FORCE
|
||||
doc: manpages
|
||||
|
||||
clean: FORCE
|
||||
rm -rf *.a *.so *.o node/*.o controller/*.o osdep/*.o service/*.o ext/http-parser/*.o ext/miniupnpc/*.o ext/libnatpmp/*.o $(CORE_OBJS) $(ONE_OBJS) zerotier-one zerotier-idtool zerotier-cli zerotier-selftest build-* ZeroTierOneInstaller-* *.deb *.rpm .depend debian/files debian/zerotier-one*.debhelper debian/zerotier-one.substvars debian/*.log debian/zerotier-one doc/node_modules ext/misc/*.o debian/.debhelper debian/debhelper-build-stamp docker/zerotier-one zeroidc/target
|
||||
rm -rf *.a *.so *.o node/*.o controller/*.o osdep/*.o service/*.o ext/http-parser/*.o ext/miniupnpc/*.o ext/libnatpmp/*.o $(CORE_OBJS) $(ONE_OBJS) zerotier-one zerotier-idtool zerotier-cli zerotier-selftest build-* ZeroTierOneInstaller-* *.deb *.rpm .depend debian/files debian/zerotier-one*.debhelper debian/zerotier-one.substvars debian/*.log debian/zerotier-one doc/node_modules ext/misc/*.o debian/.debhelper debian/debhelper-build-stamp docker/zerotier-one rustybits/target
|
||||
|
||||
distclean: clean
|
||||
|
||||
@ -433,12 +439,19 @@ ifeq ($(ZT_SSO_SUPPORTED), 1)
|
||||
ifeq ($(ZT_EMBEDDED),)
|
||||
zeroidc: FORCE
|
||||
# export PATH=/root/.cargo/bin:$$PATH; cd zeroidc && cargo build -j1 $(RUSTFLAGS)
|
||||
export PATH=/${HOME}/.cargo/bin:$$PATH; cd zeroidc && cargo build $(RUSTFLAGS)
|
||||
export PATH=/${HOME}/.cargo/bin:$$PATH; cd rustybits && cargo build $(RUSTFLAGS) -p zeroidc
|
||||
endif
|
||||
else
|
||||
zeroidc:
|
||||
endif
|
||||
|
||||
ifeq ($(ZT_CONTROLLER), 1)
|
||||
smeeclient: FORCE
|
||||
export PATH=/${HOME}/.cargo/bin:$$PATH; cd rustybits && cargo build $(RUSTFLAGS) -p smeeclient
|
||||
else
|
||||
smeeclient:
|
||||
endif
|
||||
|
||||
# Note: keep the symlinks in /var/lib/zerotier-one to the binaries since these
|
||||
# provide backward compatibility with old releases where the binaries actually
|
||||
# lived here. Folks got scripts.
|
||||
|
21
make-mac.mk
21
make-mac.mk
@ -2,7 +2,7 @@ CC=clang
|
||||
CXX=clang++
|
||||
TOPDIR=$(shell PWD)
|
||||
|
||||
INCLUDES=-I$(shell PWD)/zeroidc/target -isystem $(TOPDIR)/ext -I$(TOPDIR)/ext/prometheus-cpp-lite-1.0/core/include -I$(TOPDIR)/ext-prometheus-cpp-lite-1.0/3rdparty/http-client-lite/include -I$(TOPDIR)/ext/prometheus-cpp-lite-1.0/simpleapi/include
|
||||
INCLUDES=-I$(shell PWD)/rustybits/target -isystem $(TOPDIR)/ext -I$(TOPDIR)/ext/prometheus-cpp-lite-1.0/core/include -I$(TOPDIR)/ext-prometheus-cpp-lite-1.0/3rdparty/http-client-lite/include -I$(TOPDIR)/ext/prometheus-cpp-lite-1.0/simpleapi/include
|
||||
DEFS=
|
||||
LIBS=
|
||||
ARCH_FLAGS=-arch x86_64 -arch arm64
|
||||
@ -114,7 +114,7 @@ osdep/MacDNSHelper.o: osdep/MacDNSHelper.mm
|
||||
$(CXX) $(CXXFLAGS) -c osdep/MacDNSHelper.mm -o osdep/MacDNSHelper.o
|
||||
|
||||
one: zeroidc $(CORE_OBJS) $(ONE_OBJS) one.o mac-agent
|
||||
$(CXX) $(CXXFLAGS) -o zerotier-one $(CORE_OBJS) $(ONE_OBJS) one.o $(LIBS) zeroidc/target/libzeroidc.a
|
||||
$(CXX) $(CXXFLAGS) -o zerotier-one $(CORE_OBJS) $(ONE_OBJS) one.o $(LIBS) rustybits/target/libzeroidc.a
|
||||
# $(STRIP) zerotier-one
|
||||
ln -sf zerotier-one zerotier-idtool
|
||||
ln -sf zerotier-one zerotier-cli
|
||||
@ -122,12 +122,12 @@ one: zeroidc $(CORE_OBJS) $(ONE_OBJS) one.o mac-agent
|
||||
|
||||
zerotier-one: one
|
||||
|
||||
zeroidc: zeroidc/target/libzeroidc.a
|
||||
zeroidc: rustybits/target/libzeroidc.a
|
||||
|
||||
zeroidc/target/libzeroidc.a: FORCE
|
||||
cd zeroidc && MACOSX_DEPLOYMENT_TARGET=$(MACOS_VERSION_MIN) cargo build --target=x86_64-apple-darwin $(EXTRA_CARGO_FLAGS)
|
||||
cd zeroidc && MACOSX_DEPLOYMENT_TARGET=$(MACOS_VERSION_MIN) cargo build --target=aarch64-apple-darwin $(EXTRA_CARGO_FLAGS)
|
||||
cd zeroidc && lipo -create target/x86_64-apple-darwin/$(RUST_VARIANT)/libzeroidc.a target/aarch64-apple-darwin/$(RUST_VARIANT)/libzeroidc.a -output target/libzeroidc.a
|
||||
rustybits/target/libzeroidc.a: FORCE
|
||||
cd rustybits && MACOSX_DEPLOYMENT_TARGET=$(MACOS_VERSION_MIN) cargo build -p zeroidc --target=x86_64-apple-darwin $(EXTRA_CARGO_FLAGS)
|
||||
cd rustybits && MACOSX_DEPLOYMENT_TARGET=$(MACOS_VERSION_MIN) cargo build -p zeroidc --target=aarch64-apple-darwin $(EXTRA_CARGO_FLAGS)
|
||||
cd rustybits && lipo -create target/x86_64-apple-darwin/$(RUST_VARIANT)/libzeroidc.a target/aarch64-apple-darwin/$(RUST_VARIANT)/libzeroidc.a -output target/libzeroidc.a
|
||||
|
||||
central-controller:
|
||||
make ARCH_FLAGS="-arch x86_64" ZT_CONTROLLER=1 one
|
||||
@ -149,7 +149,7 @@ core: libzerotiercore.a
|
||||
# $(STRIP) zerotier
|
||||
|
||||
selftest: $(CORE_OBJS) $(ONE_OBJS) selftest.o
|
||||
$(CXX) $(CXXFLAGS) -o zerotier-selftest selftest.o $(CORE_OBJS) $(ONE_OBJS) $(LIBS) zeroidc/target/libzeroidc.a
|
||||
$(CXX) $(CXXFLAGS) -o zerotier-selftest selftest.o $(CORE_OBJS) $(ONE_OBJS) $(LIBS) rustybits/target/libzeroidc.a
|
||||
$(STRIP) zerotier-selftest
|
||||
|
||||
zerotier-selftest: selftest
|
||||
@ -183,12 +183,15 @@ _buildx:
|
||||
@echo docker buildx create --name multiarch --driver docker-container --use
|
||||
@echo docker buildx inspect --bootstrap
|
||||
|
||||
controller-builder: _buildx FORCE
|
||||
docker buildx build --platform linux/arm64,linux/amd64 --no-cache -t registry.zerotier.com/zerotier/ctlbuild:latest -f ext/central-controller-docker/Dockerfile.builder . --push
|
||||
|
||||
central-controller-docker: _buildx FORCE
|
||||
docker buildx build --platform linux/arm64,linux/amd64 --no-cache -t registry.zerotier.com/zerotier-central/ztcentral-controller:${TIMESTAMP} -f ext/central-controller-docker/Dockerfile --build-arg git_branch=$(shell git name-rev --name-only HEAD) . --push
|
||||
@echo Image: registry.zerotier.com/zerotier-central/ztcentral-controller:${TIMESTAMP}
|
||||
|
||||
clean:
|
||||
rm -rf MacEthernetTapAgent *.dSYM build-* *.a *.pkg *.dmg *.o node/*.o controller/*.o service/*.o osdep/*.o ext/http-parser/*.o $(CORE_OBJS) $(ONE_OBJS) zerotier-one zerotier-idtool zerotier-selftest zerotier-cli zerotier doc/node_modules zt1_update_$(ZT_BUILD_PLATFORM)_$(ZT_BUILD_ARCHITECTURE)_* zeroidc/target/
|
||||
rm -rf MacEthernetTapAgent *.dSYM build-* *.a *.pkg *.dmg *.o node/*.o controller/*.o service/*.o osdep/*.o ext/http-parser/*.o $(CORE_OBJS) $(ONE_OBJS) zerotier-one zerotier-idtool zerotier-selftest zerotier-cli zerotier doc/node_modules zt1_update_$(ZT_BUILD_PLATFORM)_$(ZT_BUILD_ARCHITECTURE)_* rustybits/target/
|
||||
|
||||
distclean: clean
|
||||
|
||||
|
3725
rustybits/Cargo.lock
generated
Normal file
3725
rustybits/Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
3
rustybits/Cargo.toml
Normal file
3
rustybits/Cargo.toml
Normal file
@ -0,0 +1,3 @@
|
||||
[workspace]
|
||||
resolver = "2"
|
||||
members = ["smeeclient", "zeroidc"]
|
15
rustybits/rustfmt.toml
Normal file
15
rustybits/rustfmt.toml
Normal file
@ -0,0 +1,15 @@
|
||||
#unstable_features = true
|
||||
max_width = 120
|
||||
#use_small_heuristics = "Max"
|
||||
edition = "2021"
|
||||
#empty_item_single_line = true
|
||||
newline_style = "Unix"
|
||||
struct_lit_width = 60
|
||||
tab_spaces = 4
|
||||
use_small_heuristics = "Default"
|
||||
#fn_single_line = true
|
||||
#hex_literal_case = "Lower"
|
||||
#merge_imports = true
|
||||
#group_imports = "StdExternalCrate"
|
||||
single_line_if_else_max_width = 0
|
||||
use_try_shorthand = true
|
21
rustybits/smeeclient/Cargo.toml
Normal file
21
rustybits/smeeclient/Cargo.toml
Normal file
@ -0,0 +1,21 @@
|
||||
[package]
|
||||
name = "smeeclient"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[lib]
|
||||
crate-type = ["staticlib", "rlib"]
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
temporal-sdk = { git = "https://github.com/temporalio/sdk-core", branch = "master" }
|
||||
temporal-client = { git = "https://github.com/temporalio/sdk-core", branch = "master" }
|
||||
temporal-sdk-core-protos = { git = "https://github.com/temporalio/sdk-core", branch = "master" }
|
||||
tokio = { version = "1.29", features = ["full"] }
|
||||
url = { version = "2" }
|
||||
uuid = { version = "1.4", features = ["v4"] }
|
||||
|
||||
[build-dependencies]
|
||||
cbindgen = "0.20"
|
36
rustybits/smeeclient/build.rs
Normal file
36
rustybits/smeeclient/build.rs
Normal file
@ -0,0 +1,36 @@
|
||||
extern crate cbindgen;
|
||||
|
||||
use cbindgen::{Config, Language};
|
||||
use std::env;
|
||||
use std::path::PathBuf;
|
||||
|
||||
fn main() {
|
||||
let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
|
||||
|
||||
let package_name = env::var("CARGO_PKG_NAME").unwrap();
|
||||
let output_file = target_dir().join(format!("{}.h", package_name)).display().to_string();
|
||||
|
||||
let config = Config {
|
||||
language: Language::C,
|
||||
cpp_compat: true,
|
||||
namespace: Some(String::from("smeeclient")),
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
cbindgen::generate_with_config(&crate_dir, config)
|
||||
.unwrap()
|
||||
.write_to_file(&output_file);
|
||||
}
|
||||
|
||||
/// Find the location of the `target/` directory. Note that this may be
|
||||
/// overridden by `cmake`, so we also need to check the `CARGO_TARGET_DIR`
|
||||
/// variable.
|
||||
fn target_dir() -> PathBuf {
|
||||
if let Ok(target) = env::var("CARGO_TARGET_DIR") {
|
||||
PathBuf::from(target)
|
||||
} else {
|
||||
PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap())
|
||||
.join("..")
|
||||
.join("target")
|
||||
}
|
||||
}
|
1
rustybits/smeeclient/rustfmt.toml
Symbolic link
1
rustybits/smeeclient/rustfmt.toml
Symbolic link
@ -0,0 +1 @@
|
||||
../rustfmt.toml
|
92
rustybits/smeeclient/src/ext.rs
Normal file
92
rustybits/smeeclient/src/ext.rs
Normal file
@ -0,0 +1,92 @@
|
||||
/*
|
||||
* Copyright (c)2021 ZeroTier, Inc.
|
||||
*
|
||||
* Use of this software is governed by the Business Source License included
|
||||
* in the LICENSE.TXT file in the project's root directory.
|
||||
*
|
||||
* Change Date: 2025-01-01
|
||||
*
|
||||
* On the date above, in accordance with the Business Source License, use
|
||||
* of this software will be governed by version 2.0 of the Apache License.
|
||||
*/
|
||||
|
||||
use std::ffi::CStr;
|
||||
use std::os::raw::c_char;
|
||||
|
||||
use crate::NetworkJoinedParams;
|
||||
use crate::SmeeClient;
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn smee_client_new(
|
||||
temporal_url: *const c_char,
|
||||
namespace: *const c_char,
|
||||
task_queue: *const c_char,
|
||||
) -> *mut SmeeClient {
|
||||
let url = unsafe {
|
||||
assert!(!temporal_url.is_null());
|
||||
CStr::from_ptr(temporal_url).to_str().unwrap()
|
||||
};
|
||||
|
||||
let ns = unsafe {
|
||||
assert!(!namespace.is_null());
|
||||
CStr::from_ptr(namespace).to_str().unwrap()
|
||||
};
|
||||
|
||||
let tq = unsafe {
|
||||
assert!(!task_queue.is_null());
|
||||
CStr::from_ptr(task_queue).to_str().unwrap()
|
||||
};
|
||||
|
||||
match SmeeClient::new(url, ns, tq) {
|
||||
Ok(c) => Box::into_raw(Box::new(c)),
|
||||
Err(e) => {
|
||||
println!("error creating smee client instance: {}", e);
|
||||
std::ptr::null_mut()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn smee_client_delete(ptr: *mut SmeeClient) {
|
||||
if ptr.is_null() {
|
||||
return;
|
||||
}
|
||||
let smee = unsafe {
|
||||
assert!(!ptr.is_null());
|
||||
Box::from_raw(&mut *ptr)
|
||||
};
|
||||
|
||||
smee.shutdown();
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn smee_client_notify_network_joined(
|
||||
smee_instance: *mut SmeeClient,
|
||||
network_id: *const c_char,
|
||||
member_id: *const c_char,
|
||||
) -> bool {
|
||||
let nwid = unsafe {
|
||||
assert!(!network_id.is_null());
|
||||
CStr::from_ptr(network_id).to_str().unwrap()
|
||||
};
|
||||
|
||||
let mem_id = unsafe {
|
||||
assert!(!member_id.is_null());
|
||||
CStr::from_ptr(member_id).to_str().unwrap()
|
||||
};
|
||||
|
||||
let smee = unsafe {
|
||||
assert!(!smee_instance.is_null());
|
||||
&mut *smee_instance
|
||||
};
|
||||
|
||||
let params = NetworkJoinedParams::new(nwid, mem_id);
|
||||
|
||||
match smee.notify_network_joined(params) {
|
||||
Ok(()) => true,
|
||||
Err(e) => {
|
||||
println!("error notifying network joined: {0}", e.to_string());
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
106
rustybits/smeeclient/src/lib.rs
Normal file
106
rustybits/smeeclient/src/lib.rs
Normal file
@ -0,0 +1,106 @@
|
||||
/*
|
||||
* Copyright (c)2023 ZeroTier, Inc.
|
||||
*
|
||||
* Use of this software is governed by the Business Source License included
|
||||
* in the LICENSE.TXT file in the project's root directory.
|
||||
*
|
||||
* Change Date: 2025-01-01
|
||||
*
|
||||
* On the date above, in accordance with the Business Source License, use
|
||||
* of this software will be governed by version 2.0 of the Apache License.
|
||||
*/
|
||||
|
||||
pub mod ext;
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::str::FromStr;
|
||||
use std::time::Duration;
|
||||
use temporal_client::{Client, ClientOptionsBuilder, RetryClient, WorkflowClientTrait, WorkflowOptions};
|
||||
use temporal_sdk_core_protos::{coresdk::AsJsonPayloadExt, temporal::api::enums::v1::WorkflowIdReusePolicy};
|
||||
use url::Url;
|
||||
use uuid::Uuid;
|
||||
|
||||
const CLIENT_NAME: &str = "SmeeClient-Rust";
|
||||
const CLIENT_VERSION: &str = "0.1";
|
||||
const NETWORK_JOINED_WORKFLOW: &str = "NetworkJoinedWorkflow";
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
|
||||
pub struct NetworkJoinedParams {
|
||||
#[serde(rename = "NetworkID")]
|
||||
pub network_id: String,
|
||||
|
||||
#[serde(rename = "MemberID")]
|
||||
pub member_id: String,
|
||||
}
|
||||
|
||||
impl NetworkJoinedParams {
|
||||
fn new(network_id: &str, member_id: &str) -> Self {
|
||||
Self {
|
||||
network_id: network_id.to_string(),
|
||||
member_id: member_id.to_string(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct SmeeClient {
|
||||
tokio_rt: tokio::runtime::Runtime,
|
||||
client: RetryClient<Client>,
|
||||
task_queue: String,
|
||||
}
|
||||
|
||||
impl SmeeClient {
|
||||
pub fn new(temporal_url: &str, namespace: &str, task_queue: &str) -> Result<Self, Box<dyn std::error::Error>> {
|
||||
// start tokio runtime. Required by temporal
|
||||
let rt = tokio::runtime::Runtime::new()?;
|
||||
|
||||
let c = ClientOptionsBuilder::default()
|
||||
.target_url(Url::from_str(temporal_url).unwrap())
|
||||
.client_name(CLIENT_NAME)
|
||||
.client_version(CLIENT_VERSION)
|
||||
.build()?;
|
||||
|
||||
let con = rt.block_on(async { c.connect(namespace.to_string(), None, None).await })?;
|
||||
|
||||
Ok(Self {
|
||||
tokio_rt: rt,
|
||||
client: con,
|
||||
task_queue: task_queue.to_string(),
|
||||
})
|
||||
}
|
||||
|
||||
pub fn notify_network_joined(&self, params: NetworkJoinedParams) -> Result<(), Box<dyn std::error::Error>> {
|
||||
println!("notifying network joined");
|
||||
let options = WorkflowOptions {
|
||||
id_reuse_policy: WorkflowIdReusePolicy::RejectDuplicate,
|
||||
execution_timeout: None,
|
||||
run_timeout: None,
|
||||
task_timeout: None,
|
||||
cron_schedule: None,
|
||||
search_attributes: None,
|
||||
};
|
||||
|
||||
let payload = vec![params.as_json_payload()?];
|
||||
|
||||
let workflow_id = Uuid::new_v4();
|
||||
|
||||
self.tokio_rt.block_on(async {
|
||||
println!("calilng start_workflow");
|
||||
self.client
|
||||
.start_workflow(
|
||||
payload,
|
||||
self.task_queue.clone(),
|
||||
workflow_id.hyphenated().to_string(),
|
||||
String::from(NETWORK_JOINED_WORKFLOW),
|
||||
None,
|
||||
options,
|
||||
)
|
||||
.await
|
||||
})?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn shutdown(self) {
|
||||
self.tokio_rt.shutdown_timeout(Duration::from_secs(5))
|
||||
}
|
||||
}
|
@ -87,7 +87,7 @@
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<NMakeBuildCommandLine>cargo build --release --target=x86_64-pc-windows-msvc</NMakeBuildCommandLine>
|
||||
<NMakeBuildCommandLine>cargo build -p zeroidc --release --target=x86_64-pc-windows-msvc</NMakeBuildCommandLine>
|
||||
<NMakeOutput>
|
||||
</NMakeOutput>
|
||||
<NMakeCleanCommandLine>cargo clean</NMakeCleanCommandLine>
|
||||
@ -95,41 +95,41 @@
|
||||
<NMakePreprocessorDefinitions>NDEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||
<NMakeBuildCommandLine>cargo build --release --target=aarch64-pc-windows-msvc</NMakeBuildCommandLine>
|
||||
<NMakeBuildCommandLine>cargo build -p zeroidc --release --target=aarch64-pc-windows-msvc</NMakeBuildCommandLine>
|
||||
<NMakeOutput />
|
||||
<NMakeCleanCommandLine>cargo clean</NMakeCleanCommandLine>
|
||||
<NMakeReBuildCommandLine>cargo clean & cargo build --release --target=aarch64-pc-windows-msvc</NMakeReBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>cargo clean & cargo build -p zeroidc --release --target=aarch64-pc-windows-msvc</NMakeReBuildCommandLine>
|
||||
<NMakePreprocessorDefinitions>NDEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<NMakeBuildCommandLine>cargo build --target=i686-pc-windows-msvc</NMakeBuildCommandLine>
|
||||
<NMakeBuildCommandLine>cargo build -p zeroidc --target=i686-pc-windows-msvc</NMakeBuildCommandLine>
|
||||
<NMakeOutput>
|
||||
</NMakeOutput>
|
||||
<NMakeCleanCommandLine>cargo clean</NMakeCleanCommandLine>
|
||||
<NMakeReBuildCommandLine>cargo clean & cargo build --target=i686-pc-windows-msvc</NMakeReBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>cargo clean & cargo build -p zeroidc --target=i686-pc-windows-msvc</NMakeReBuildCommandLine>
|
||||
<NMakePreprocessorDefinitions>WIN32;_DEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<NMakeBuildCommandLine>cargo build --target=x86_64-pc-windows-msvc</NMakeBuildCommandLine>
|
||||
<NMakeBuildCommandLine>cargo build -p zeroidc --target=x86_64-pc-windows-msvc</NMakeBuildCommandLine>
|
||||
<NMakeOutput>
|
||||
</NMakeOutput>
|
||||
<NMakeCleanCommandLine>cargo clean</NMakeCleanCommandLine>
|
||||
<NMakeReBuildCommandLine>cargo clean & cargo build --target=x86_64-pc-windows-msvc</NMakeReBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>cargo clean & cargo build -p zeroidc --target=x86_64-pc-windows-msvc</NMakeReBuildCommandLine>
|
||||
<NMakePreprocessorDefinitions>_DEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||
<NMakeBuildCommandLine>cargo build --target=aarch64-pc-windows-msvc</NMakeBuildCommandLine>
|
||||
<NMakeBuildCommandLine>cargo build -p zeroidc --target=aarch64-pc-windows-msvc</NMakeBuildCommandLine>
|
||||
<NMakeOutput />
|
||||
<NMakeCleanCommandLine>cargo clean</NMakeCleanCommandLine>
|
||||
<NMakeReBuildCommandLine>cargo clean & cargo build --target=aarch64-pc-windows-msvc</NMakeReBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>cargo clean & cargo build -p zeroidc --target=aarch64-pc-windows-msvc</NMakeReBuildCommandLine>
|
||||
<NMakePreprocessorDefinitions>_DEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<NMakeBuildCommandLine>cargo build --release --target=i686-pc-windows-msvc</NMakeBuildCommandLine>
|
||||
<NMakeBuildCommandLine>cargo build --release -p zeroidc --target=i686-pc-windows-msvc</NMakeBuildCommandLine>
|
||||
<NMakeOutput>
|
||||
</NMakeOutput>
|
||||
<NMakeCleanCommandLine>cargo clean</NMakeCleanCommandLine>
|
||||
<NMakeReBuildCommandLine>cargo clean & cargo build --release --target=i686-pc-windows-msvc</NMakeReBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>cargo clean & cargo build -p zeroidc --release --target=i686-pc-windows-msvc</NMakeReBuildCommandLine>
|
||||
<NMakePreprocessorDefinitions>WIN32;NDEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup>
|
@ -6,14 +6,18 @@ build = "build.rs"
|
||||
publish = false
|
||||
|
||||
[lib]
|
||||
crate-type = ["staticlib","rlib"]
|
||||
crate-type = ["staticlib", "rlib"]
|
||||
|
||||
[dependencies]
|
||||
openidconnect = { version = "2.5", default-features = false, features = ["reqwest", "native-tls", "accept-rfc3339-timestamps"] }
|
||||
openidconnect = { version = "3.4", default-features = false, features = [
|
||||
"reqwest",
|
||||
"native-tls",
|
||||
"accept-rfc3339-timestamps",
|
||||
] }
|
||||
base64 = "0.21"
|
||||
url = "2.3"
|
||||
reqwest = "0.11"
|
||||
jwt = {version = "0.16", git = "https://github.com/glimberg/rust-jwt"}
|
||||
jwt = { version = "0.16", git = "https://github.com/glimberg/rust-jwt" }
|
||||
serde = "1.0"
|
||||
time = { version = "~0.3", features = ["formatting"] }
|
||||
bytes = "1.3"
|
@ -1,17 +1,14 @@
|
||||
extern crate cbindgen;
|
||||
|
||||
use cbindgen::{Config, Language};
|
||||
use std::env;
|
||||
use std::path::PathBuf;
|
||||
use cbindgen::{Config, Language};
|
||||
|
||||
fn main() {
|
||||
let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
|
||||
|
||||
let package_name = env::var("CARGO_PKG_NAME").unwrap();
|
||||
let output_file = target_dir()
|
||||
.join(format!("{}.h", package_name))
|
||||
.display()
|
||||
.to_string();
|
||||
let output_file = target_dir().join(format!("{}.h", package_name)).display().to_string();
|
||||
|
||||
let config = Config {
|
||||
language: Language::C,
|
||||
@ -21,17 +18,19 @@ fn main() {
|
||||
};
|
||||
|
||||
cbindgen::generate_with_config(&crate_dir, config)
|
||||
.unwrap()
|
||||
.write_to_file(&output_file);
|
||||
.unwrap()
|
||||
.write_to_file(&output_file);
|
||||
}
|
||||
|
||||
/// Find the location of the `target/` directory. Note that this may be
|
||||
/// overridden by `cmake`, so we also need to check the `CARGO_TARGET_DIR`
|
||||
/// Find the location of the `target/` directory. Note that this may be
|
||||
/// overridden by `cmake`, so we also need to check the `CARGO_TARGET_DIR`
|
||||
/// variable.
|
||||
fn target_dir() -> PathBuf {
|
||||
if let Ok(target) = env::var("CARGO_TARGET_DIR") {
|
||||
PathBuf::from(target)
|
||||
} else {
|
||||
PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()).join("target")
|
||||
PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap())
|
||||
.join("..")
|
||||
.join("target")
|
||||
}
|
||||
}
|
1
rustybits/zeroidc/rustfmt.toml
Symbolic link
1
rustybits/zeroidc/rustfmt.toml
Symbolic link
@ -0,0 +1 @@
|
||||
../rustfmt.toml
|
@ -15,9 +15,7 @@ use thiserror::Error;
|
||||
#[derive(Error, Debug)]
|
||||
pub enum ZeroIDCError {
|
||||
#[error(transparent)]
|
||||
DiscoveryError(
|
||||
#[from] openidconnect::DiscoveryError<openidconnect::reqwest::Error<reqwest::Error>>,
|
||||
),
|
||||
DiscoveryError(#[from] openidconnect::DiscoveryError<openidconnect::reqwest::Error<reqwest::Error>>),
|
||||
|
||||
#[error(transparent)]
|
||||
ParseError(#[from] url::ParseError),
|
@ -160,11 +160,7 @@ pub extern "C" fn zeroidc_get_exp_time(ptr: *mut ZeroIDC) -> u64 {
|
||||
target_os = "macos",
|
||||
))]
|
||||
#[no_mangle]
|
||||
pub extern "C" fn zeroidc_set_nonce_and_csrf(
|
||||
ptr: *mut ZeroIDC,
|
||||
csrf_token: *const c_char,
|
||||
nonce: *const c_char,
|
||||
) {
|
||||
pub extern "C" fn zeroidc_set_nonce_and_csrf(ptr: *mut ZeroIDC, csrf_token: *const c_char, nonce: *const c_char) {
|
||||
let idc = unsafe {
|
||||
assert!(!ptr.is_null());
|
||||
&mut *ptr
|
||||
@ -180,14 +176,8 @@ pub extern "C" fn zeroidc_set_nonce_and_csrf(
|
||||
return;
|
||||
}
|
||||
|
||||
let csrf_token = unsafe { CStr::from_ptr(csrf_token) }
|
||||
.to_str()
|
||||
.unwrap()
|
||||
.to_string();
|
||||
let nonce = unsafe { CStr::from_ptr(nonce) }
|
||||
.to_str()
|
||||
.unwrap()
|
||||
.to_string();
|
||||
let csrf_token = unsafe { CStr::from_ptr(csrf_token) }.to_str().unwrap().to_string();
|
||||
let nonce = unsafe { CStr::from_ptr(nonce) }.to_str().unwrap().to_string();
|
||||
|
||||
idc.set_nonce_and_csrf(csrf_token, nonce);
|
||||
}
|
||||
@ -275,10 +265,7 @@ pub extern "C" fn zeroidc_token_exchange(idc: *mut ZeroIDC, code: *const c_char)
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn zeroidc_get_url_param_value(
|
||||
param: *const c_char,
|
||||
path: *const c_char,
|
||||
) -> *mut c_char {
|
||||
pub extern "C" fn zeroidc_get_url_param_value(param: *const c_char, path: *const c_char) -> *mut c_char {
|
||||
if param.is_null() {
|
||||
println!("param is null");
|
||||
return std::ptr::null_mut();
|
@ -26,9 +26,8 @@ use jwt::Token;
|
||||
use openidconnect::core::{CoreClient, CoreProviderMetadata, CoreResponseType};
|
||||
use openidconnect::reqwest::http_client;
|
||||
use openidconnect::{
|
||||
AccessToken, AccessTokenHash, AuthenticationFlow, AuthorizationCode, ClientId, CsrfToken,
|
||||
IssuerUrl, Nonce, OAuth2TokenResponse, PkceCodeChallenge, PkceCodeVerifier, RedirectUrl,
|
||||
RefreshToken, Scope, TokenResponse,
|
||||
AccessToken, AccessTokenHash, AuthenticationFlow, AuthorizationCode, ClientId, CsrfToken, IssuerUrl, Nonce,
|
||||
OAuth2TokenResponse, PkceCodeChallenge, PkceCodeVerifier, RedirectUrl, RefreshToken, Scope, TokenResponse,
|
||||
};
|
||||
use std::error::Error;
|
||||
use std::str::from_utf8;
|
||||
@ -153,13 +152,9 @@ impl ZeroIDC {
|
||||
let redirect = RedirectUrl::new(redir_url.to_string())?;
|
||||
|
||||
idc.inner.lock().unwrap().oidc_client = Some(
|
||||
CoreClient::from_provider_metadata(
|
||||
provider_meta,
|
||||
ClientId::new(client_id.to_string()),
|
||||
None,
|
||||
)
|
||||
.set_redirect_uri(redirect)
|
||||
.set_auth_type(openidconnect::AuthType::RequestBody),
|
||||
CoreClient::from_provider_metadata(provider_meta, ClientId::new(client_id.to_string()), None)
|
||||
.set_redirect_uri(redirect)
|
||||
.set_auth_type(openidconnect::AuthType::RequestBody),
|
||||
);
|
||||
|
||||
Ok(idc)
|
||||
@ -184,22 +179,15 @@ impl ZeroIDC {
|
||||
let nonce = inner_local.lock().unwrap().nonce.clone();
|
||||
|
||||
while running {
|
||||
let exp =
|
||||
UNIX_EPOCH + Duration::from_secs(inner_local.lock().unwrap().exp_time);
|
||||
let exp = UNIX_EPOCH + Duration::from_secs(inner_local.lock().unwrap().exp_time);
|
||||
let now = SystemTime::now();
|
||||
|
||||
#[cfg(debug_assertions)]
|
||||
{
|
||||
println!(
|
||||
"refresh token thread tick, now: {}, exp: {}",
|
||||
systemtime_strftime(
|
||||
now,
|
||||
"[year]-[month]-[day] [hour]:[minute]:[second]"
|
||||
),
|
||||
systemtime_strftime(
|
||||
exp,
|
||||
"[year]-[month]-[day] [hour]:[minute]:[second]"
|
||||
)
|
||||
systemtime_strftime(now, "[year]-[month]-[day] [hour]:[minute]:[second]"),
|
||||
systemtime_strftime(exp, "[year]-[month]-[day] [hour]:[minute]:[second]")
|
||||
);
|
||||
}
|
||||
let refresh_token = inner_local.lock().unwrap().refresh_token.clone();
|
||||
@ -220,14 +208,11 @@ impl ZeroIDC {
|
||||
println!("Refresh Token: {}", refresh_token.secret());
|
||||
}
|
||||
|
||||
let token_response =
|
||||
inner_local.lock().unwrap().oidc_client.as_ref().map(|c| {
|
||||
let res = c
|
||||
.exchange_refresh_token(&refresh_token)
|
||||
.request(http_client);
|
||||
let token_response = inner_local.lock().unwrap().oidc_client.as_ref().map(|c| {
|
||||
let res = c.exchange_refresh_token(&refresh_token).request(http_client);
|
||||
|
||||
res
|
||||
});
|
||||
res
|
||||
});
|
||||
|
||||
if let Some(res) = token_response {
|
||||
match res {
|
||||
@ -246,20 +231,11 @@ impl ZeroIDC {
|
||||
];
|
||||
#[cfg(debug_assertions)]
|
||||
{
|
||||
println!(
|
||||
"New ID token: {}",
|
||||
id_token.to_string()
|
||||
);
|
||||
println!("New ID token: {}", id_token.to_string());
|
||||
}
|
||||
let client = reqwest::blocking::Client::new();
|
||||
let r = client
|
||||
.post(
|
||||
inner_local
|
||||
.lock()
|
||||
.unwrap()
|
||||
.auth_endpoint
|
||||
.clone(),
|
||||
)
|
||||
.post(inner_local.lock().unwrap().auth_endpoint.clone())
|
||||
.form(¶ms)
|
||||
.send();
|
||||
|
||||
@ -268,10 +244,7 @@ impl ZeroIDC {
|
||||
if r.status().is_success() {
|
||||
#[cfg(debug_assertions)]
|
||||
{
|
||||
println!(
|
||||
"hit url: {}",
|
||||
r.url().as_str()
|
||||
);
|
||||
println!("hit url: {}", r.url().as_str());
|
||||
println!("status: {}", r.status());
|
||||
}
|
||||
|
||||
@ -279,24 +252,16 @@ impl ZeroIDC {
|
||||
let idt = &id_token.to_string();
|
||||
|
||||
let t: Result<
|
||||
Token<
|
||||
jwt::Header,
|
||||
jwt::Claims,
|
||||
jwt::Unverified<'_>,
|
||||
>,
|
||||
Token<jwt::Header, jwt::Claims, jwt::Unverified<'_>>,
|
||||
jwt::Error,
|
||||
> = Token::parse_unverified(idt);
|
||||
|
||||
if let Ok(t) = t {
|
||||
let claims =
|
||||
t.claims().registered.clone();
|
||||
let claims = t.claims().registered.clone();
|
||||
match claims.expiration {
|
||||
Some(exp) => {
|
||||
println!("exp: {}", exp);
|
||||
inner_local
|
||||
.lock()
|
||||
.unwrap()
|
||||
.exp_time = exp;
|
||||
inner_local.lock().unwrap().exp_time = exp;
|
||||
}
|
||||
None => {
|
||||
panic!("expiration is None. This shouldn't happen")
|
||||
@ -306,17 +271,11 @@ impl ZeroIDC {
|
||||
panic!("error parsing claims");
|
||||
}
|
||||
|
||||
inner_local
|
||||
.lock()
|
||||
.unwrap()
|
||||
.access_token =
|
||||
inner_local.lock().unwrap().access_token =
|
||||
Some(access_token.clone());
|
||||
if let Some(t) = res.refresh_token() {
|
||||
// println!("New Refresh Token: {}", t.secret());
|
||||
inner_local
|
||||
.lock()
|
||||
.unwrap()
|
||||
.refresh_token =
|
||||
inner_local.lock().unwrap().refresh_token =
|
||||
Some(t.clone());
|
||||
}
|
||||
#[cfg(debug_assertions)]
|
||||
@ -324,35 +283,22 @@ impl ZeroIDC {
|
||||
println!("Central post succeeded");
|
||||
}
|
||||
} else {
|
||||
println!(
|
||||
"Central post failed: {}",
|
||||
r.status()
|
||||
);
|
||||
println!(
|
||||
"hit url: {}",
|
||||
r.url().as_str()
|
||||
);
|
||||
println!("Central post failed: {}", r.status());
|
||||
println!("hit url: {}", r.url().as_str());
|
||||
println!("Status: {}", r.status());
|
||||
if let Ok(body) = r.bytes() {
|
||||
if let Ok(body) =
|
||||
std::str::from_utf8(&body)
|
||||
{
|
||||
if let Ok(body) = std::str::from_utf8(&body) {
|
||||
println!("Body: {}", body);
|
||||
}
|
||||
}
|
||||
|
||||
inner_local.lock().unwrap().exp_time =
|
||||
0;
|
||||
inner_local.lock().unwrap().running =
|
||||
false;
|
||||
inner_local.lock().unwrap().exp_time = 0;
|
||||
inner_local.lock().unwrap().running = false;
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
println!("Central post failed: {}", e);
|
||||
println!(
|
||||
"hit url: {}",
|
||||
e.url().unwrap().as_str()
|
||||
);
|
||||
println!("hit url: {}", e.url().unwrap().as_str());
|
||||
println!("Status: {}", e.status().unwrap());
|
||||
inner_local.lock().unwrap().exp_time = 0;
|
||||
inner_local.lock().unwrap().running = false;
|
||||
@ -421,88 +367,86 @@ impl ZeroIDC {
|
||||
|
||||
pub fn set_nonce_and_csrf(&mut self, csrf_token: String, nonce: String) {
|
||||
let local = Arc::clone(&self.inner);
|
||||
(*local.lock().expect("can't lock inner"))
|
||||
.as_opt()
|
||||
.map(|i| {
|
||||
if i.running {
|
||||
println!("refresh thread running. not setting new nonce or csrf");
|
||||
return;
|
||||
}
|
||||
(*local.lock().expect("can't lock inner")).as_opt().map(|i| {
|
||||
if i.running {
|
||||
println!("refresh thread running. not setting new nonce or csrf");
|
||||
return;
|
||||
}
|
||||
|
||||
let need_verifier = matches!(i.pkce_verifier, None);
|
||||
let need_verifier = matches!(i.pkce_verifier, None);
|
||||
|
||||
let csrf_diff = if let Some(csrf) = i.csrf_token.clone() {
|
||||
*csrf.secret() != csrf_token
|
||||
} else {
|
||||
false
|
||||
};
|
||||
let csrf_diff = if let Some(csrf) = i.csrf_token.clone() {
|
||||
*csrf.secret() != csrf_token
|
||||
} else {
|
||||
false
|
||||
};
|
||||
|
||||
let nonce_diff = if let Some(n) = i.nonce.clone() {
|
||||
*n.secret() != nonce
|
||||
} else {
|
||||
false
|
||||
};
|
||||
let nonce_diff = if let Some(n) = i.nonce.clone() {
|
||||
*n.secret() != nonce
|
||||
} else {
|
||||
false
|
||||
};
|
||||
|
||||
if need_verifier || csrf_diff || nonce_diff {
|
||||
let (pkce_challenge, pkce_verifier) = PkceCodeChallenge::new_random_sha256();
|
||||
let r = i.oidc_client.as_ref().map(|c| {
|
||||
let mut auth_builder = c
|
||||
.authorize_url(
|
||||
AuthenticationFlow::<CoreResponseType>::AuthorizationCode,
|
||||
csrf_func(csrf_token),
|
||||
nonce_func(nonce),
|
||||
)
|
||||
.set_pkce_challenge(pkce_challenge);
|
||||
match i.provider.as_str() {
|
||||
"auth0" => {
|
||||
auth_builder = auth_builder
|
||||
.add_scope(Scope::new("profile".to_string()))
|
||||
.add_scope(Scope::new("email".to_string()))
|
||||
.add_scope(Scope::new("offline_access".to_string()));
|
||||
}
|
||||
"okta" => {
|
||||
auth_builder = auth_builder
|
||||
.add_scope(Scope::new("profile".to_string()))
|
||||
.add_scope(Scope::new("email".to_string()))
|
||||
.add_scope(Scope::new("groups".to_string()))
|
||||
.add_scope(Scope::new("offline_access".to_string()));
|
||||
}
|
||||
"keycloak" => {
|
||||
auth_builder = auth_builder
|
||||
.add_scope(Scope::new("profile".to_string()))
|
||||
.add_scope(Scope::new("email".to_string()));
|
||||
}
|
||||
"onelogin" => {
|
||||
auth_builder = auth_builder
|
||||
.add_scope(Scope::new("profile".to_string()))
|
||||
.add_scope(Scope::new("email".to_string()))
|
||||
.add_scope(Scope::new("groups".to_string()))
|
||||
}
|
||||
"default" => {
|
||||
auth_builder = auth_builder
|
||||
.add_scope(Scope::new("profile".to_string()))
|
||||
.add_scope(Scope::new("email".to_string()))
|
||||
.add_scope(Scope::new("offline_access".to_string()));
|
||||
}
|
||||
_ => {
|
||||
auth_builder = auth_builder
|
||||
.add_scope(Scope::new("profile".to_string()))
|
||||
.add_scope(Scope::new("email".to_string()))
|
||||
.add_scope(Scope::new("offline_access".to_string()));
|
||||
}
|
||||
if need_verifier || csrf_diff || nonce_diff {
|
||||
let (pkce_challenge, pkce_verifier) = PkceCodeChallenge::new_random_sha256();
|
||||
let r = i.oidc_client.as_ref().map(|c| {
|
||||
let mut auth_builder = c
|
||||
.authorize_url(
|
||||
AuthenticationFlow::<CoreResponseType>::AuthorizationCode,
|
||||
csrf_func(csrf_token),
|
||||
nonce_func(nonce),
|
||||
)
|
||||
.set_pkce_challenge(pkce_challenge);
|
||||
match i.provider.as_str() {
|
||||
"auth0" => {
|
||||
auth_builder = auth_builder
|
||||
.add_scope(Scope::new("profile".to_string()))
|
||||
.add_scope(Scope::new("email".to_string()))
|
||||
.add_scope(Scope::new("offline_access".to_string()));
|
||||
}
|
||||
"okta" => {
|
||||
auth_builder = auth_builder
|
||||
.add_scope(Scope::new("profile".to_string()))
|
||||
.add_scope(Scope::new("email".to_string()))
|
||||
.add_scope(Scope::new("groups".to_string()))
|
||||
.add_scope(Scope::new("offline_access".to_string()));
|
||||
}
|
||||
"keycloak" => {
|
||||
auth_builder = auth_builder
|
||||
.add_scope(Scope::new("profile".to_string()))
|
||||
.add_scope(Scope::new("email".to_string()));
|
||||
}
|
||||
"onelogin" => {
|
||||
auth_builder = auth_builder
|
||||
.add_scope(Scope::new("profile".to_string()))
|
||||
.add_scope(Scope::new("email".to_string()))
|
||||
.add_scope(Scope::new("groups".to_string()))
|
||||
}
|
||||
"default" => {
|
||||
auth_builder = auth_builder
|
||||
.add_scope(Scope::new("profile".to_string()))
|
||||
.add_scope(Scope::new("email".to_string()))
|
||||
.add_scope(Scope::new("offline_access".to_string()));
|
||||
}
|
||||
_ => {
|
||||
auth_builder = auth_builder
|
||||
.add_scope(Scope::new("profile".to_string()))
|
||||
.add_scope(Scope::new("email".to_string()))
|
||||
.add_scope(Scope::new("offline_access".to_string()));
|
||||
}
|
||||
|
||||
auth_builder.url()
|
||||
});
|
||||
|
||||
if let Some(r) = r {
|
||||
i.url = Some(r.0);
|
||||
i.csrf_token = Some(r.1);
|
||||
i.nonce = Some(r.2);
|
||||
i.pkce_verifier = Some(pkce_verifier);
|
||||
}
|
||||
|
||||
auth_builder.url()
|
||||
});
|
||||
|
||||
if let Some(r) = r {
|
||||
i.url = Some(r.0);
|
||||
i.csrf_token = Some(r.1);
|
||||
i.nonce = Some(r.2);
|
||||
i.pkce_verifier = Some(pkce_verifier);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
pub fn auth_url(&self) -> String {
|
||||
@ -572,10 +516,7 @@ impl ZeroIDC {
|
||||
};
|
||||
|
||||
if let Some(expected_hash) = claims.access_token_hash() {
|
||||
let actual_hash = match AccessTokenHash::from_token(
|
||||
res.access_token(),
|
||||
&signing_algo,
|
||||
) {
|
||||
let actual_hash = match AccessTokenHash::from_token(res.access_token(), &signing_algo) {
|
||||
Ok(h) => h,
|
||||
Err(e) => {
|
||||
println!("Error hashing access token: {}", e);
|
||||
@ -616,10 +557,7 @@ impl ZeroIDC {
|
||||
let split = split.split('_').collect::<Vec<&str>>();
|
||||
|
||||
if split.len() == 2 {
|
||||
let params = [
|
||||
("id_token", id_token.to_string()),
|
||||
("state", split[0].to_string()),
|
||||
];
|
||||
let params = [("id_token", id_token.to_string()), ("state", split[0].to_string())];
|
||||
let client = reqwest::blocking::Client::new();
|
||||
let res = client.post(i.auth_endpoint.clone()).form(¶ms).send();
|
||||
|
||||
@ -634,10 +572,8 @@ impl ZeroIDC {
|
||||
|
||||
let idt = &id_token.to_string();
|
||||
|
||||
let t: Result<
|
||||
Token<jwt::Header, jwt::Claims, jwt::Unverified<'_>>,
|
||||
jwt::Error,
|
||||
> = Token::parse_unverified(idt);
|
||||
let t: Result<Token<jwt::Header, jwt::Claims, jwt::Unverified<'_>>, jwt::Error> =
|
||||
Token::parse_unverified(idt);
|
||||
|
||||
if let Ok(t) = t {
|
||||
let claims = t.claims().registered.clone();
|
||||
@ -682,13 +618,12 @@ impl ZeroIDC {
|
||||
} else if res.status() == 402 {
|
||||
i.running = false;
|
||||
Err(SSOExchangeError::new(
|
||||
"additional license seats required. Please contact your network administrator.".to_string(),
|
||||
"additional license seats required. Please contact your network administrator."
|
||||
.to_string(),
|
||||
))
|
||||
} else {
|
||||
i.running = false;
|
||||
Err(SSOExchangeError::new(
|
||||
"error from central endpoint".to_string(),
|
||||
))
|
||||
Err(SSOExchangeError::new("error from central endpoint".to_string()))
|
||||
}
|
||||
}
|
||||
Err(res) => {
|
||||
@ -697,16 +632,12 @@ impl ZeroIDC {
|
||||
println!("Post error: {}", res);
|
||||
i.exp_time = 0;
|
||||
i.running = false;
|
||||
Err(SSOExchangeError::new(
|
||||
"error from central endpoint".to_string(),
|
||||
))
|
||||
Err(SSOExchangeError::new("error from central endpoint".to_string()))
|
||||
}
|
||||
}
|
||||
} else {
|
||||
i.running = false;
|
||||
Err(SSOExchangeError::new(
|
||||
"error splitting state token".to_string(),
|
||||
))
|
||||
Err(SSOExchangeError::new("error splitting state token".to_string()))
|
||||
}
|
||||
} else {
|
||||
i.running = false;
|
@ -10,7 +10,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZeroTierOne", "ZeroTierOne\
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TapDriver6", "TapDriver6\TapDriver6.vcxproj", "{43BA7584-D4DB-4F7C-90FC-E2B18A68A213}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zeroidc", "..\zeroidc\zeroidc.vcxproj", "{175C340F-F5BA-4CB1-88AD-533B102E3799}"
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zeroidc", "..\rustybits\zeroidc.vcxproj", "{175C340F-F5BA-4CB1-88AD-533B102E3799}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
|
@ -414,7 +414,7 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\ext;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\core\include;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\simpleapi\include;$(SolutionDir)\..\zeroidc\target;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\ext;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\core\include;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\simpleapi\include;$(SolutionDir)\..\rustybits\target;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>ZT_SSO_ENABLED=1;ZT_EXPORT;FD_SETSIZE=1024;NOMINMAX;STATICLIB;WIN32;ZT_TRACE;ZT_USE_MINIUPNPC;MINIUPNP_STATICLIB;ZT_SOFTWARE_UPDATE_DEFAULT="disable";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
|
||||
<RuntimeTypeInfo>true</RuntimeTypeInfo>
|
||||
@ -428,7 +428,7 @@
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalDependencies>wsock32.lib;ws2_32.lib;Iphlpapi.lib;Rpcrt4.lib;zeroidc.lib;bcrypt.lib;userenv.lib;crypt32.lib;secur32.lib;ncrypt.lib;ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)\..\zeroidc\target\i686-pc-windows-msvc\debug\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)\..\rustybits\target\i686-pc-windows-msvc\debug\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Profile|Win32'">
|
||||
@ -436,7 +436,7 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\ext;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\core\include;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\simpleapi\include;$(SolutionDir)\..\zeroidc\target;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\ext;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\core\include;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\simpleapi\include;$(SolutionDir)\..\rustybits\target;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>ZT_SSO_ENABLED=1;ZT_EXPORT;FD_SETSIZE=1024;NOMINMAX;STATICLIB;WIN32;ZT_TRACE;ZT_USE_MINIUPNPC;MINIUPNP_STATICLIB;ZT_SOFTWARE_UPDATE_DEFAULT="disable";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
|
||||
<RuntimeTypeInfo>true</RuntimeTypeInfo>
|
||||
@ -457,7 +457,7 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\ext;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\core\include;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\simpleapi\include;$(SolutionDir)\..\zeroidc\target;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\ext;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\core\include;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\simpleapi\include;$(SolutionDir)\..\rustybits\target;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>ZT_SSO_ENABLED=1;ZT_EXPORT;FD_SETSIZE=1024;NOMINMAX;STATICLIB;WIN32;ZT_TRACE;ZT_RULES_ENGINE_DEBUGGING;ZT_USE_MINIUPNPC;MINIUPNP_STATICLIB;ZT_SOFTWARE_UPDATE_DEFAULT="disable";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
|
||||
@ -472,7 +472,7 @@
|
||||
<AdditionalDependencies>wbemuuid.lib;wsock32.lib;ws2_32.lib;Iphlpapi.lib;Rpcrt4.lib;zeroidc.lib;bcrypt.lib;userenv.lib;crypt32.lib;secur32.lib;ncrypt.lib;ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
|
||||
<AdditionalOptions>"notelemetry.obj" %(AdditionalOptions)</AdditionalOptions>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)..\zeroidc\target\x86_64-pc-windows-msvc\debug\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)..\rustybits\target\x86_64-pc-windows-msvc\debug\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||
@ -480,7 +480,7 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\ext;$(SolutionDir)\..\zeroidc\target;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\ext;$(SolutionDir)\..\rustybits\target;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>ZT_EXPORT;FD_SETSIZE=1024;NOMINMAX;STATICLIB;WIN32;ZT_TRACE;ZT_RULES_ENGINE_DEBUGGING;ZT_USE_MINIUPNPC;MINIUPNP_STATICLIB;ZT_SOFTWARE_UPDATE_DEFAULT="disable";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
|
||||
@ -495,7 +495,7 @@
|
||||
<AdditionalDependencies>wbemuuid.lib;wsock32.lib;ws2_32.lib;Iphlpapi.lib;Rpcrt4.lib;zeroidc.lib;bcrypt.lib;userenv.lib;crypt32.lib;secur32.lib;ncrypt.lib;ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
|
||||
<AdditionalOptions>"notelemetry.obj" %(AdditionalOptions)</AdditionalOptions>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)..\zeroidc\target\x86_64-pc-windows-msvc\debug\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)..\rustybits\target\x86_64-pc-windows-msvc\debug\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Profile|x64'">
|
||||
@ -503,7 +503,7 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\ext;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\core\include;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\simpleapi\include;$(SolutionDir)\..\zeroidc\target;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\ext;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\core\include;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\simpleapi\include;$(SolutionDir)\..\rustybits\target;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>ZT_SSO_ENABLED=1;ZT_EXPORT;FD_SETSIZE=1024;NOMINMAX;STATICLIB;WIN32;ZT_USE_MINIUPNPC;MINIUPNP_STATICLIB;ZT_SOFTWARE_UPDATE_DEFAULT="disable";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
|
||||
@ -525,7 +525,7 @@
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\ext;$(SolutionDir)\..\zeroidc\target;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\ext;$(SolutionDir)\..\rustybits\target;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>ZT_EXPORT;FD_SETSIZE=1024;NOMINMAX;STATICLIB;WIN32;ZT_USE_MINIUPNPC;MINIUPNP_STATICLIB;ZT_SOFTWARE_UPDATE_DEFAULT="disable";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
|
||||
@ -549,7 +549,7 @@
|
||||
<FunctionLevelLinking>false</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\ext;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\core\include;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\simpleapi\include;$(SolutionDir)\..\zeroidc\target;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\ext;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\core\include;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\simpleapi\include;$(SolutionDir)\..\rustybits\target;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>ZT_SSO_ENABLED=1;ZT_EXPORT;FD_SETSIZE=1024;STATICLIB;ZT_SALSA20_SSE;ZT_USE_MINIUPNPC;MINIUPNP_STATICLIB;WIN32;NOMINMAX;ZT_SOFTWARE_UPDATE_DEFAULT="apply";ZT_BUILD_PLATFORM=2;ZT_BUILD_ARCHITECTURE=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<StringPooling>true</StringPooling>
|
||||
@ -575,7 +575,7 @@
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalDependencies>wsock32.lib;ws2_32.lib;Iphlpapi.lib;Rpcrt4.lib;zeroidc.lib;bcrypt.lib;userenv.lib;crypt32.lib;secur32.lib;ncrypt.lib;ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)..\zeroidc\target\i686-pc-windows-msvc\release\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)..\rustybits\target\i686-pc-windows-msvc\release\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
@ -585,7 +585,7 @@
|
||||
<FunctionLevelLinking>false</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\ext;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\core\include;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\simpleapi\include;$(SolutionDir)\..\zeroidc\target;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\ext;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\core\include;$(SolutionDir)\..\ext\prometheus-cpp-lite-1.0\simpleapi\include;$(SolutionDir)\..\rustybits\target;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>ZT_SSO_ENABLED=1;ZT_EXPORT;FD_SETSIZE=1024;STATICLIB;ZT_SOFTWARE_UPDATE_DEFAULT="apply";ZT_SALSA20_SSE;ZT_USE_MINIUPNPC;MINIUPNP_STATICLIB;WIN32;NOMINMAX;ZT_BUILD_PLATFORM=2;ZT_BUILD_ARCHITECTURE=2;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||
@ -613,7 +613,7 @@
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalDependencies>wbemuuid.lib;wsock32.lib;ws2_32.lib;Iphlpapi.lib;Rpcrt4.lib;zeroidc.lib;bcrypt.lib;userenv.lib;crypt32.lib;secur32.lib;ncrypt.lib;ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)..\zeroidc\target\x86_64-pc-windows-msvc\release\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)..\rustybits\target\x86_64-pc-windows-msvc\release\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||
@ -623,7 +623,7 @@
|
||||
<FunctionLevelLinking>false</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\ext;$(SolutionDir)\..\zeroidc\target;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>$(SolutionDir)\..\ext;$(SolutionDir)\..\rustybits\target;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>ZT_SSO_ENABLED=1;ZT_EXPORT;FD_SETSIZE=1024;STATICLIB;ZT_SOFTWARE_UPDATE_DEFAULT="apply";ZT_USE_MINIUPNPC;MINIUPNP_STATICLIB;WIN32;NOMINMAX;ZT_BUILD_PLATFORM=2;ZT_BUILD_ARCHITECTURE=2;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
|
||||
@ -651,7 +651,7 @@
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalDependencies>wbemuuid.lib;wsock32.lib;ws2_32.lib;Iphlpapi.lib;Rpcrt4.lib;zeroidc.lib;bcrypt.lib;userenv.lib;crypt32.lib;secur32.lib;ncrypt.lib;ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)..\zeroidc\target\x86_64-pc-windows-msvc\release\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)..\rustybits\target\x86_64-pc-windows-msvc\release\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
|
1699
zeroidc/Cargo.lock
generated
1699
zeroidc/Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user