diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-05-17 09:36:35 -0700 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-05-17 09:36:35 -0700 |
commit | 651e67f2e5755813e8d830178a57358e1cd8e933 (patch) | |
tree | 0b45d58d05e0c22330b96b9b02d3f024da6b4fd8 /controller | |
parent | e0090e56f4b9ed70687c16ef3629a1ec6f8d2bbb (diff) | |
download | infinitytier-651e67f2e5755813e8d830178a57358e1cd8e933.tar.gz infinitytier-651e67f2e5755813e8d830178a57358e1cd8e933.zip |
Add a feature to generate a new network ID on POST.
Diffstat (limited to 'controller')
-rw-r--r-- | controller/SqliteNetworkController.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/controller/SqliteNetworkController.cpp b/controller/SqliteNetworkController.cpp index 4ac40fc4..25a491dc 100644 --- a/controller/SqliteNetworkController.cpp +++ b/controller/SqliteNetworkController.cpp @@ -697,6 +697,37 @@ unsigned int SqliteNetworkController::handleControlPlaneHttpPOST( } else { if (!networkExists) { + if (path[1].substr(10) == "______") { + // A special POST /network/##########______ feature lets users create a network + // with an arbitrary unused network ID. + nwid = 0; + + uint64_t nwidPrefix = (Utils::hexStrToU64(path[1].substr(0,10).c_str()) << 24) & 0xffffffffff000000ULL; + uint64_t nwidPostfix = 0; + Utils::getSecureRandom(&nwidPostfix,sizeof(nwidPostfix)); + nwidPostfix &= 0xffffffULL; + uint64_t nwidOriginalPostfix = nwidPostfix; + do { + uint64_t tryNwid = nwidPrefix | nwidPostfix; + Utils::snprintf(nwids,sizeof(nwids),"%.16llx",(unsigned long long)tryNwid); + + sqlite3_reset(_sGetNetworkRevision); + sqlite3_bind_text(_sGetNetworkRevision,1,nwids,16,SQLITE_STATIC); + if (sqlite3_step(_sGetNetworkRevision) != SQLITE_ROW) { + nwid = tryNwid; + break; + } + + ++nwidPostfix; + nwidPostfix &= 0xffffffULL; + } while (nwidPostfix != nwidOriginalPostfix); + + // 503 means we have no more free IDs for this prefix. You shouldn't host anywhere + // near 16 million networks on the same controller, so shouldn't happen. + if (!nwid) + return 503; + } + sqlite3_reset(_sCreateNetwork); sqlite3_bind_text(_sCreateNetwork,1,nwids,16,SQLITE_STATIC); sqlite3_bind_text(_sCreateNetwork,2,nwids,16,SQLITE_STATIC); // default name, will be changed below if a name is specified in JSON |