diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2014-09-17 09:50:49 -0700 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2014-09-17 09:50:49 -0700 |
commit | edff13dcae3c316f7a454fcd3b415c0ef2e4002c (patch) | |
tree | 150368c96d524cf50531e11aa519955a0c296a61 /control/NodeControlClient.cpp | |
parent | e22fae2397f69302820b7a1af2fe2291bb6865e0 (diff) | |
download | infinitytier-edff13dcae3c316f7a454fcd3b415c0ef2e4002c.tar.gz infinitytier-edff13dcae3c316f7a454fcd3b415c0ef2e4002c.zip |
More control/ refactoring
Diffstat (limited to 'control/NodeControlClient.cpp')
-rw-r--r-- | control/NodeControlClient.cpp | 67 |
1 files changed, 26 insertions, 41 deletions
diff --git a/control/NodeControlClient.cpp b/control/NodeControlClient.cpp index 2281a8ad..df1a62b6 100644 --- a/control/NodeControlClient.cpp +++ b/control/NodeControlClient.cpp @@ -51,43 +51,20 @@ static void _CBipcResultHandler(void *arg,IpcConnection *ipcc,IpcConnection::Eve } } -NodeControlClient::NodeControlClient(const char *hp,void (*resultHandler)(void *,const char *),void *arg,const char *authToken) +NodeControlClient::NodeControlClient(const char *ep,const char *authToken,void (*resultHandler)(void *,const char *),void *arg) throw() : _impl((void *)new _NodeControlClientImpl) { _NodeControlClientImpl *impl = (_NodeControlClientImpl *)_impl; - impl->ipcc = (IpcConnection *)0; - - if (!hp) - hp = ZT_DEFAULTS.defaultHomePath.c_str(); - - std::string at; - if (authToken) - at = authToken; - else if (!Utils::readFile(authTokenDefaultSystemPath(),at)) { - if (!Utils::readFile(authTokenDefaultUserPath(),at)) { - impl->err = "no authentication token specified and authtoken.secret not readable"; - return; - } + impl->resultHandler = resultHandler; + impl->arg = arg; + try { + impl->ipcc = new IpcConnection(ep,&_CBipcResultHandler,_impl); + impl->ipcc->printf("auth %s"ZT_EOL_S,authToken); + } catch ( ... ) { + impl->ipcc = (IpcConnection *)0; + impl->err = "failure connecting to running ZeroTier One service"; } - - std::string myid; - if (Utils::readFile((std::string(hp) + ZT_PATH_SEPARATOR_S + "identity.public").c_str(),myid)) { - std::string myaddr(myid.substr(0,myid.find(':'))); - if (myaddr.length() != 10) - impl->err = "invalid address extracted from identity.public"; - else { - try { - impl->resultHandler = resultHandler; - impl->arg = arg; - impl->ipcc = new IpcConnection((std::string(ZT_IPC_ENDPOINT_BASE) + myaddr).c_str(),&_CBipcResultHandler,_impl); - impl->ipcc->printf("auth %s"ZT_EOL_S,at.c_str()); - } catch ( ... ) { - impl->ipcc = (IpcConnection *)0; - impl->err = "failure connecting to running ZeroTier One service"; - } - } - } else impl->err = "unable to read identity.public"; } NodeControlClient::~NodeControlClient() @@ -153,17 +130,25 @@ const char *NodeControlClient::authTokenDefaultUserPath() return dlp.c_str(); } -const char *NodeControlClient::authTokenDefaultSystemPath() +std::string NodeControlClient::getAuthToken(const char *path,bool generateIfNotFound) { - static std::string dsp; - static Mutex dsp_m; - - Mutex::Lock _l(dsp_m); - - if (!dsp.length()) - dsp = (ZT_DEFAULTS.defaultHomePath + ZT_PATH_SEPARATOR_S"authtoken.secret"); + unsigned char randbuf[24]; + std::string token; + + if (Utils::readFile(path,token)) + return Utils::trim(token); + else token = ""; + + if (generateIfNotFound) { + Utils::getSecureRandom(randbuf,sizeof(randbuf)); + for(unsigned int i=0;i<sizeof(randbuf);++i) + token.push_back(("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")[(unsigned int)randbuf[i] % 62]); + if (!Utils::writeFile(path,token)) + return std::string(); + Utils::lockDownFile(path,false); + } - return dsp.c_str(); + return token; } } // namespace ZeroTier |