std::string Messaging::retrievePublicIpFromServer() { SWBaseSocket::SWBaseError error; SWInetSocket mySocket; if (!mySocket.connect(80, REPO_SERVER, &error)) return ""; char query[2048] = { 0 }; sprintf(query, "GET /getpublicip/ HTTP/1.1\r\nHost: %s\r\n\r\n", REPO_SERVER); Logger::log(LOG_DEBUG, "Query to get public IP: %s\n", query); if (mySocket.sendmsg(query, &error) < 0) return ""; std::string retval = mySocket.recvmsg(250, &error); if (error != SWBaseSocket::ok) return ""; Logger::log(LOG_DEBUG, "Response from public IP request :'%s'", retval.c_str()); HttpMsg msg(retval); retval = msg.getBody(); // printf("Response:'%s'\n", pubip); // disconnect mySocket.disconnect(); return retval; }
int Notifier::HTTPPOST(const char* URL, const char* data) { STACKLOG; int res=0; SWBaseSocket::SWBaseError error; SWInetSocket mySocket; if (mySocket.connect(80, REPO_SERVER, &error)) { char query[2048]; int len = (int)strnlen(data, 16000); sprintf(query, "POST %s HTTP/1.0\r\n" \ "Host: %s\r\n" \ "Content-Type: application/octet-stream\r\n" \ "Content-Length: %d\r\n" "\r\n" \ "%s", \ URL, REPO_SERVER, len, data); Logger::log(LOG_DEBUG,"Query to Master server: %s", query); if (mySocket.sendmsg(query, &error)<0) { Logger::log(LOG_ERROR,"Notifier: could not send request (%s)", error.get_error().c_str()); res=-1; } int rlen=mySocket.recv(httpresp, 65536, &error); if (rlen>0 && rlen<65535) httpresp[rlen]=0; else { Logger::log(LOG_ERROR,"Notifier: could not get a valid response (%s)", error.get_error().c_str()); res=-1; } Logger::log(LOG_DEBUG,"Response from Master server:'%s'", httpresp); try { resp = HttpMsg(httpresp); } catch( std::runtime_error e) { Logger::log(LOG_ERROR, e.what() ); res = -1; } // disconnect mySocket.disconnect(); } else { Logger::log(LOG_ERROR,"Notifier: could not connect to the Master server (%s)", error.get_error().c_str()); res=-1; } return res; }
int UserAuth::HTTPGET(const char* URL, HttpMsg &resp) { STACKLOG; if(trustlevel<=1) { // If this happens, then you did something wrong in the server code Logger::log(LOG_ERROR, "userauth: tried to contact master server without permission. URL: %s", URL); return 0; } char httpresp[65536]; //!< http response from the master server int res=0; SWBaseSocket::SWBaseError error; SWInetSocket mySocket; if (mySocket.connect(80, REPO_SERVER, &error)) { char query[2048]; sprintf(query, "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n", URL, REPO_SERVER); Logger::log(LOG_DEBUG,"Query to Master server: %s", query); if (mySocket.sendmsg(query, &error)<0) { Logger::log(LOG_ERROR,"Notifier: could not send request (%s)", error.get_error().c_str()); res=-1; } int rlen=mySocket.recv(httpresp, 65536, &error); if (rlen>0 && rlen<65535) httpresp[rlen]=0; else { Logger::log(LOG_ERROR,"Notifier: could not get a valid response (%s)", error.get_error().c_str()); res=-1; } Logger::log(LOG_DEBUG,"Response from Master server:'%s'", httpresp); try { resp = HttpMsg(httpresp); } catch( std::runtime_error e) { Logger::log(LOG_ERROR, e.what() ); res = -1; } // disconnect mySocket.disconnect(); } else { Logger::log(LOG_ERROR,"Notifier: could not connect to the Master server (%s)", error.get_error().c_str()); res=-1; } return res; }
int Notifier::HTTPGET(const char* URL) { STACKLOG; int res=0; SWBaseSocket::SWBaseError error; SWInetSocket mySocket; if (mySocket.connect(80, REPO_SERVER, &error)) { char query[2048]; sprintf(query, "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n", URL, REPO_SERVER); Logger::log(LOG_DEBUG,"Query to Master server: %s", query); if (mySocket.sendmsg(query, &error)<0) { Logger::log(LOG_ERROR,"Notifier: could not send request (%s)", error.get_error().c_str()); res=-1; } int rlen=mySocket.recv(httpresp, 65536, &error); if (rlen>0 && rlen<65535) httpresp[rlen]=0; else { Logger::log(LOG_ERROR,"Notifier: could not get a valid response (%s)", error.get_error().c_str()); res=-1; } Logger::log(LOG_DEBUG,"Response from Master server:'%s'", httpresp); try { resp = HttpMsg(httpresp); } catch( std::runtime_error e) { Logger::log(LOG_ERROR, e.what() ); res = -1; } // disconnect mySocket.disconnect(); } else { Logger::log(LOG_ERROR,"Notifier: could not connect to the Master server (%s)", error.get_error().c_str()); res=-1; } return res; }
void Listener::threadstart() { Logger::Log(LOG_DEBUG, "Listerer thread starting"); //here we start SWBaseSocket::SWBaseError error; //manage the listening socket m_listen_socket.bind(m_listen_port, &error); if (error != SWBaseSocket::ok) { //this is an error! Logger::Log(LOG_ERROR, "FATAL Listerer: %s", error.get_error().c_str()); //there is nothing we can do here return; // exit(1); } m_listen_socket.listen(); Logger::Log(LOG_VERBOSE, "Listener ready"); m_ready_cond.Signal(1); //await connections while (!m_thread_shutdown) { Logger::Log(LOG_VERBOSE, "Listener awaiting connections"); SWInetSocket *ts = (SWInetSocket *) m_listen_socket.accept(&error); if (error != SWBaseSocket::ok) { if (m_thread_shutdown) { Logger::Log(LOG_ERROR, "INFO Listener shutting down"); } else { Logger::Log(LOG_ERROR, "ERROR Listener: %s", error.get_error().c_str()); } } Logger::Log(LOG_VERBOSE, "Listener got a new connection"); ts->set_timeout(5, 0); //receive a magic int type; int source; unsigned int len; unsigned int streamid; char buffer[RORNET_MAX_MESSAGE_LENGTH]; try { // this is the start of it all, it all starts with a simple hello if (Messaging::ReceiveMessage(ts, &type, &source, &streamid, &len, buffer, RORNET_MAX_MESSAGE_LENGTH)) throw std::runtime_error("ERROR Listener: receiving first message"); // make sure our first message is a hello message if (type != RoRnet::MSG2_HELLO) { Messaging::SendMessage(ts, RoRnet::MSG2_WRONG_VER, 0, 0, 0, 0); throw std::runtime_error("ERROR Listener: protocol error"); } // check client version if (source == 5000 && (std::string(buffer) == "MasterServer")) { Logger::Log(LOG_VERBOSE, "Master Server knocked ..."); // send back some information, then close socket char tmp[2048] = ""; sprintf(tmp, "protocol:%s\nrev:%s\nbuild_on:%s_%s\n", RORNET_VERSION, VERSION, __DATE__, __TIME__); if (Messaging::SendMessage(ts, RoRnet::MSG2_MASTERINFO, 0, 0, (unsigned int) strlen(tmp), tmp)) { throw std::runtime_error("ERROR Listener: sending master info"); } // close socket ts->disconnect(&error); delete ts; continue; } // compare the versions if they are compatible if (strncmp(buffer, RORNET_VERSION, strlen(RORNET_VERSION))) { // not compatible Messaging::SendMessage(ts, RoRnet::MSG2_WRONG_VER, 0, 0, 0, 0); throw std::runtime_error("ERROR Listener: bad version: " + std::string(buffer) + ". rejecting ..."); } // compatible version, continue to send server settings std::string motd_str; { std::vector<std::string> lines; if (!Utils::ReadLinesFromFile(Config::getMOTDFile(), lines)) { for (const auto& line : lines) motd_str += line + "\n"; } } Logger::Log(LOG_DEBUG, "Listener sending server settings"); RoRnet::ServerInfo settings; memset(&settings, 0, sizeof(RoRnet::ServerInfo)); settings.has_password = !Config::getPublicPassword().empty(); strncpy(settings.info, motd_str.c_str(), motd_str.size()); strncpy(settings.protocolversion, RORNET_VERSION, strlen(RORNET_VERSION)); strncpy(settings.servername, Config::getServerName().c_str(), Config::getServerName().size()); strncpy(settings.terrain, Config::getTerrainName().c_str(), Config::getTerrainName().size()); if (Messaging::SendMessage(ts, RoRnet::MSG2_HELLO, 0, 0, (unsigned int) sizeof(RoRnet::ServerInfo), (char *) &settings)) throw std::runtime_error("ERROR Listener: sending version"); //receive user infos if (Messaging::ReceiveMessage(ts, &type, &source, &streamid, &len, buffer, RORNET_MAX_MESSAGE_LENGTH)) { std::stringstream error_msg; error_msg << "ERROR Listener: receiving user infos\n" << "ERROR Listener: got that: " << type; throw std::runtime_error(error_msg.str()); } if (type != RoRnet::MSG2_USER_INFO) throw std::runtime_error("Warning Listener: no user name"); if (len > sizeof(RoRnet::UserInfo)) throw std::runtime_error("Error: did not receive proper user credentials"); Logger::Log(LOG_INFO, "Listener creating a new client..."); RoRnet::UserInfo *user = (RoRnet::UserInfo *) buffer; user->authstatus = RoRnet::AUTH_NONE; // authenticate user->username[RORNET_MAX_USERNAME_LEN - 1] = 0; std::string nickname = Str::SanitizeUtf8(user->username); user->authstatus = m_sequencer->AuthorizeNick(std::string(user->usertoken, 40), nickname); strncpy(user->username, nickname.c_str(), RORNET_MAX_USERNAME_LEN - 1); if (Config::isPublic()) { Logger::Log(LOG_DEBUG, "password login: %s == %s?", Config::getPublicPassword().c_str(), std::string(user->serverpassword, 40).c_str()); if (strncmp(Config::getPublicPassword().c_str(), user->serverpassword, 40)) { Messaging::SendMessage(ts, RoRnet::MSG2_WRONG_PW, 0, 0, 0, 0); throw std::runtime_error("ERROR Listener: wrong password"); } Logger::Log(LOG_DEBUG, "user used the correct password, " "creating client!"); } else { Logger::Log(LOG_DEBUG, "no password protection, creating client"); } //create a new client m_sequencer->createClient(ts, *user); // copy the user info, since the buffer will be cleared soon Logger::Log(LOG_DEBUG, "listener returned!"); } catch (std::runtime_error &e) { Logger::Log(LOG_ERROR, e.what()); ts->disconnect(&error); delete ts; } } }