void ConnectionManager::connect(const Node::Ptr& node, const string& token, bool secure) { // don't allow connection if we didn't proceed a handshake if(!node->isOnline()) { // do handshake at first DHT::getInstance()->info(node->getIdentity().getIp(), static_cast<uint16_t>(Util::toInt(node->getIdentity().getUdpPort())), DHT::PING | DHT::MAKE_ONLINE, node->getUser()->getCID(), node->getUdpKey()); return; } bool active = ClientManager::getInstance()->isActive(); // if I am not active, send reverse connect to me request AdcCommand cmd(active ? AdcCommand::CMD_CTM : AdcCommand::CMD_RCM, AdcCommand::TYPE_UDP); cmd.addParam(secure ? SECURE_CLIENT_PROTOCOL_TEST : CLIENT_PROTOCOL); if(active) { uint16_t port = secure ? dcpp::ConnectionManager::getInstance()->getSecurePort() : dcpp::ConnectionManager::getInstance()->getPort(); cmd.addParam(Util::toString(port)); } cmd.addParam(token); DHT::getInstance()->send(cmd, node->getIdentity().getIp(), static_cast<uint16_t>(Util::toInt(node->getIdentity().getUdpPort())), node->getUser()->getCID(), node->getUdpKey()); }
/* * Creates connection to specified node */ void ConnectionManager::connectToMe(const Node::Ptr& node, const AdcCommand& cmd) { // don't allow connection if we didn't proceed a handshake if(!node->isOnline()) { // do handshake at first DHT::getInstance()->info(node->getIdentity().getIp(), static_cast<uint16_t>(Util::toInt(node->getIdentity().getUdpPort())), DHT::PING | DHT::MAKE_ONLINE, node->getUser()->getCID(), node->getUdpKey()); return; } const string& protocol = cmd.getParam(1); const string& port = cmd.getParam(2); const string& token = cmd.getParam(3); bool secure = false; if(protocol == CLIENT_PROTOCOL) { // Nothing special } else if(protocol == SECURE_CLIENT_PROTOCOL_TEST && CryptoManager::getInstance()->TLSOk()) { secure = true; } else { AdcCommand cmd(AdcCommand::SEV_FATAL, AdcCommand::ERROR_PROTOCOL_UNSUPPORTED, "Protocol unknown", AdcCommand::TYPE_UDP); cmd.addParam("PR", protocol); cmd.addParam("TO", token); DHT::getInstance()->send(cmd, node->getIdentity().getIp(), static_cast<uint16_t>(Util::toInt(node->getIdentity().getUdpPort())), node->getUser()->getCID(), node->getUdpKey()); return; } if(!node->getIdentity().isTcpActive(0)) { AdcCommand err(AdcCommand::SEV_FATAL, AdcCommand::ERROR_PROTOCOL_GENERIC, "IP unknown", AdcCommand::TYPE_UDP); DHT::getInstance()->send(err, node->getIdentity().getIp(), static_cast<uint16_t>(Util::toInt(node->getIdentity().getUdpPort())), node->getUser()->getCID(), node->getUdpKey()); return; } dcpp::ConnectionManager::getInstance()->adcConnect(*node, static_cast<uint16_t>(Util::toInt(port)), token, secure); }