summaryrefslogtreecommitdiff
path: root/protocols/Tox/src/tox_bootstrap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Tox/src/tox_bootstrap.cpp')
-rw-r--r--protocols/Tox/src/tox_bootstrap.cpp146
1 files changed, 74 insertions, 72 deletions
diff --git a/protocols/Tox/src/tox_bootstrap.cpp b/protocols/Tox/src/tox_bootstrap.cpp
index f144c0af16..7bdf45bbdc 100644
--- a/protocols/Tox/src/tox_bootstrap.cpp
+++ b/protocols/Tox/src/tox_bootstrap.cpp
@@ -33,76 +33,57 @@ void CToxProto::BootstrapNodesFromDb(Tox *tox, bool isIPv6)
char module[MAX_PATH];
mir_snprintf(module, "%s_Nodes", m_szModuleName);
int nodeCount = db_get_w(NULL, module, TOX_SETTINGS_NODE_COUNT, 0);
- if (nodeCount > 0) {
- char setting[MAX_PATH];
- for (int i = 0; i < nodeCount; i++) {
- mir_snprintf(setting, TOX_SETTINGS_NODE_IPV4, i);
- ptrA address(db_get_sa(NULL, module, setting));
- mir_snprintf(setting, TOX_SETTINGS_NODE_PORT, i);
- int port = db_get_w(NULL, module, setting, 33445);
- mir_snprintf(setting, TOX_SETTINGS_NODE_PKEY, i);
- ptrA pubKey(db_get_sa(NULL, module, setting));
+ if (nodeCount == 0)
+ return;
+
+ char setting[MAX_PATH];
+ for (int i = 0; i < nodeCount; i++) {
+ mir_snprintf(setting, TOX_SETTINGS_NODE_IPV4, i);
+ ptrA address(db_get_sa(NULL, module, setting));
+ mir_snprintf(setting, TOX_SETTINGS_NODE_PORT, i);
+ int port = db_get_w(NULL, module, setting, 33445);
+ mir_snprintf(setting, TOX_SETTINGS_NODE_PKEY, i);
+ ptrA pubKey(db_get_sa(NULL, module, setting));
+ BootstrapUdpNode(tox, address, port, pubKey);
+ BootstrapTcpRelay(tox, address, port, pubKey);
+ if (isIPv6) {
+ mir_snprintf(setting, TOX_SETTINGS_NODE_IPV6, i);
+ address = db_get_sa(NULL, module, setting);
BootstrapUdpNode(tox, address, port, pubKey);
BootstrapTcpRelay(tox, address, port, pubKey);
- if (isIPv6) {
- mir_snprintf(setting, TOX_SETTINGS_NODE_IPV6, i);
- address = db_get_sa(NULL, module, setting);
- BootstrapUdpNode(tox, address, port, pubKey);
- BootstrapTcpRelay(tox, address, port, pubKey);
- }
}
}
}
void CToxProto::BootstrapNodesFromJson(Tox *tox, bool isIPv6)
{
- ptrA json;
-
- VARSW path(_A2W(TOX_JSON_PATH));
-
- if (!IsFileExists(path))
+ VARSW path(TOX_JSON_PATH);
+ long lastUpdate = getDword("NodesUpdate", 0);
+ if (!IsFileExists(path) || lastUpdate < (now() - 86400 /* 24h */))
UpdateNodes();
- if (IsFileExists(path)) {
- FILE *hFile = _wfopen(path, L"r");
- if (hFile != nullptr) {
- _fseeki64(hFile, 0, SEEK_END);
- size_t size = _ftelli64(hFile);
- json = (char*)mir_calloc(size);
- rewind(hFile);
- fread(json, sizeof(char), size, hFile);
- fclose(hFile);
- }
- }
+ JSONNode nodes = ParseNodes();
+ for (const auto &node : nodes) {
+ JSONNode address = node.at("ipv4");
+ JSONNode pubKey = node.at("public_key");
- if (json) {
- JSONNode root = JSONNode::parse(json);
- if (!root.empty()) {
- JSONNode nodes = root.at("nodes").as_array();
- for (size_t i = 0; i < nodes.size(); i++) {
- JSONNode node = nodes[i];
- JSONNode address = node.at("ipv4");
- JSONNode pubKey = node.at("public_key");
-
- if (node.at("status_udp").as_bool()) {
- int port = node.at("port").as_int();
- BootstrapUdpNode(tox, address.as_string().c_str(), port, pubKey.as_string().c_str());
- if (isIPv6) {
- address = node.at("ipv6");
- BootstrapUdpNode(tox, address.as_string().c_str(), port, pubKey.as_string().c_str());
- }
- }
+ if (node.at("status_udp").as_bool()) {
+ int port = node.at("port").as_int();
+ BootstrapUdpNode(tox, address.as_string().c_str(), port, pubKey.as_string().c_str());
+ if (isIPv6) {
+ address = node.at("ipv6");
+ BootstrapUdpNode(tox, address.as_string().c_str(), port, pubKey.as_string().c_str());
+ }
+ }
- if (node.at("status_tcp").as_bool()) {
- JSONNode tcpPorts = node.at("tcp_ports").as_array();
- for (size_t k = 0; k < tcpPorts.size(); k++) {
- int port = tcpPorts[k].as_int();
- BootstrapTcpRelay(tox, address.as_string().c_str(), port, pubKey.as_string().c_str());
- if (isIPv6) {
- address = node.at("ipv6");
- BootstrapTcpRelay(tox, address.as_string().c_str(), port, pubKey.as_string().c_str());
- }
- }
+ if (node.at("status_tcp").as_bool()) {
+ JSONNode tcpPorts = node.at("tcp_ports").as_array();
+ for (size_t k = 0; k < tcpPorts.size(); k++) {
+ int port = tcpPorts[k].as_int();
+ BootstrapTcpRelay(tox, address.as_string().c_str(), port, pubKey.as_string().c_str());
+ if (isIPv6) {
+ address = node.at("ipv6");
+ BootstrapTcpRelay(tox, address.as_string().c_str(), port, pubKey.as_string().c_str());
}
}
}
@@ -111,16 +92,16 @@ void CToxProto::BootstrapNodesFromJson(Tox *tox, bool isIPv6)
void CToxProto::BootstrapNodes(Tox *tox)
{
- UpdateNodes();
debugLogA(__FUNCTION__": bootstraping DHT");
- // bool isUdp = getBool("EnableUDP", 1);
bool isIPv6 = getBool("EnableIPv6", 0);
- BootstrapNodesFromDb(tox, isIPv6);
BootstrapNodesFromJson(tox, isIPv6);
+ BootstrapNodesFromDb(tox, isIPv6);
}
void CToxProto::UpdateNodes()
{
+ VARSW path(TOX_JSON_PATH);
+
debugLogA(__FUNCTION__": updating nodes");
HttpRequest request(REQUEST_GET, "https://nodes.tox.chat/json");
NLHR_PTR response(request.Send(m_hNetlibUser));
@@ -139,18 +120,8 @@ void CToxProto::UpdateNodes()
if (lastUpdate <= getDword("NodesUpdate", 0))
return;
- ptrW path(mir_wstrdup((wchar_t*)VARSW(_A2W(TOX_JSON_PATH))));
- if (!IsFileExists(path)) {
- HANDLE hProfile = CreateFile(path, GENERIC_READ | GENERIC_WRITE, 0, nullptr, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, nullptr);
- if (hProfile == nullptr) {
- debugLogA(__FUNCTION__": failed to create tox.json");
- return;
- }
- CloseHandle(hProfile);
- }
-
FILE *hFile = _wfopen(path, L"w");
- if (!hFile) {
+ if (hFile == nullptr) {
debugLogA(__FUNCTION__": failed to open tox.json");
return;
}
@@ -162,3 +133,34 @@ void CToxProto::UpdateNodes()
setDword("NodesUpdate", lastUpdate);
}
+
+JSONNode CToxProto::ParseNodes()
+{
+ VARSW path(TOX_JSON_PATH);
+
+ if (!IsFileExists(path)) {
+ debugLogA(__FUNCTION__": could not find tox.json");
+ return JSONNode(JSON_ARRAY);
+ }
+
+ FILE *hFile = _wfopen(path, L"r");
+ if (hFile == nullptr) {
+ debugLogA(__FUNCTION__": failed to open tox.json");
+ return JSONNode(JSON_ARRAY);
+ }
+
+ _fseeki64(hFile, 0, SEEK_END);
+ size_t size = _ftelli64(hFile);
+ ptrA json((char*)mir_calloc(size));
+ rewind(hFile);
+ fread(json, sizeof(char), size, hFile);
+ fclose(hFile);
+
+ JSONNode root = JSONNode::parse(json);
+ if (root.empty()) {
+ debugLogA(__FUNCTION__": failed to parse tox.json");
+ return JSONNode(JSON_ARRAY);
+ }
+
+ return root.at("nodes").as_array();
+}