X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/e9cb0683c0b33d8458c1d9b2558bbeb5d101e680..9dc2984179d989f8774ea7ff6d72c81d376b5a2c:/projects/stargazer/plugins/configuration/sgconfig/rsconf.cpp diff --git a/projects/stargazer/plugins/configuration/sgconfig/rsconf.cpp b/projects/stargazer/plugins/configuration/sgconfig/rsconf.cpp index 6ca2b3da..c06b99da 100644 --- a/projects/stargazer/plugins/configuration/sgconfig/rsconf.cpp +++ b/projects/stargazer/plugins/configuration/sgconfig/rsconf.cpp @@ -14,27 +14,28 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/******************************************************************* -* -* DESCRIPTION: æÁÊÌ Ó ÏÓÎÏ×ÎÙÍÉ ÆÕÎËÃÉÑÍÉ ÄÌÑ ÓÅÔÅ×ÏÇÏ ÏÂÍÅÎÁ ÄÁÎÎÙÍÉ -* Ó ÍÅÎÅÄÖÅÒÏÍ ËÌÉÅÎÔÏ×. ðÒÉÅÍ, ÐÅÒÅÄÁÞÁ É ÛÉÆÒÏ×ÁÎÉÅ ÓÏÏÂÝÅÎÉÊ. -* -* AUTHOR: Boris Mikhailenko -* -* $Revision: 1.24 $ -* $Date: 2010/10/04 20:24:54 $ -* -*******************************************************************/ +/* + * Author : Boris Mikhailenko + */ #include "configproto.h" +#include "parser.h" + +#include "stg/admins.h" +#include "stg/logger.h" +#include "stg/common.h" #include "stg/blowfish.h" #include #include -#include // snprintf +#include // strerror #include // close +#include +#include +#include +#include #ifndef ENODATA // FreeBSD 4.* - suxx @@ -58,10 +59,6 @@ enum //----------------------------------------------------------------------------- int CONFIGPROTO::Prepare() { -std::list ansList; //óÀÄÁ ÂÕÄÅÔ ÐÏÍÅÝÅÎ ÏÔ×ÅÔ ÄÌÑ ÍÅÎÅÄÖÅÒÁ ËÌÉÅÎÔÏ× -int res; -struct sockaddr_in listenAddr; - sigset_t sigmask, oldmask; sigemptyset(&sigmask); sigaddset(&sigmask, SIGINT); @@ -74,11 +71,12 @@ listenSocket = socket(PF_INET, SOCK_STREAM, 0); if (listenSocket < 0) { - errorStr = "Create NET_CONFIGURATOR socket failed."; + errorStr = "Create socket failed."; logger("Cannot create a socket: %s", strerror(errno)); return -1; } +struct sockaddr_in listenAddr; listenAddr.sin_family = PF_INET; listenAddr.sin_port = htons(port); listenAddr.sin_addr.s_addr = inet_addr("0.0.0.0"); @@ -92,17 +90,14 @@ if (0 != setsockopt(listenSocket, SOL_SOCKET, SO_REUSEADDR, &lng, 4)) return -1; } -res = bind(listenSocket, (struct sockaddr*)&listenAddr, sizeof(listenAddr)); - -if (res == -1) +if (bind(listenSocket, (struct sockaddr*)&listenAddr, sizeof(listenAddr)) == -1) { errorStr = "Bind admin socket failed"; logger("Cannot bind the socket: %s", strerror(errno)); return -1; } -res = listen(listenSocket, 0); -if (res == -1) +if (listen(listenSocket, 0) == -1) { errorStr = "Listen admin socket failed"; logger("Cannot listen the socket: %s", strerror(errno)); @@ -117,18 +112,18 @@ return 0; int CONFIGPROTO::Stop() { nonstop = false; +shutdown(listenSocket, SHUT_RDWR); close(listenSocket); //TODO: Idiotism -int sock; struct sockaddr_in addr; -socklen_t addrLen; addr.sin_family = PF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = inet_addr("127.0.0.1"); -addrLen = sizeof(addr); -sock = socket(PF_INET, SOCK_STREAM, 0); +socklen_t addrLen = sizeof(addr); +int sock = socket(PF_INET, SOCK_STREAM, 0); connect(sock, (sockaddr*)&addr, addrLen); +shutdown(sock, SHUT_RDWR); close(sock); //Idiotism end return 0; @@ -136,8 +131,6 @@ return 0; //----------------------------------------------------------------------------- void CONFIGPROTO::Run() { -state = confHdr; - while (nonstop) { state = confHdr; @@ -163,6 +156,7 @@ while (nonstop) { if (RecvHdr(outerSocket) < 0) { + shutdown(outerSocket, SHUT_RDWR); close(outerSocket); continue; } @@ -170,11 +164,13 @@ while (nonstop) { if (SendHdrAnswer(outerSocket, ans_ok) < 0) { + shutdown(outerSocket, SHUT_RDWR); close(outerSocket); continue; } if (RecvLogin(outerSocket) < 0) { + shutdown(outerSocket, SHUT_RDWR); close(outerSocket); continue; } @@ -182,11 +178,13 @@ while (nonstop) { if (SendLoginAnswer(outerSocket) < 0) { + shutdown(outerSocket, SHUT_RDWR); close(outerSocket); continue; } if (RecvLoginS(outerSocket) < 0) { + shutdown(outerSocket, SHUT_RDWR); close(outerSocket); continue; } @@ -194,11 +192,13 @@ while (nonstop) { if (SendLoginSAnswer(outerSocket, ans_ok) < 0) { + shutdown(outerSocket, SHUT_RDWR); close(outerSocket); continue; } if (RecvData(outerSocket) < 0) { + shutdown(outerSocket, SHUT_RDWR); close(outerSocket); continue; } @@ -208,6 +208,7 @@ while (nonstop) { if (SendLoginSAnswer(outerSocket, ans_err) < 0) { + shutdown(outerSocket, SHUT_RDWR); close(outerSocket); continue; } @@ -224,6 +225,7 @@ while (nonstop) WriteLogAccessFailed(adminIP); if (SendHdrAnswer(outerSocket, ans_err) < 0) { + shutdown(outerSocket, SHUT_RDWR); close(outerSocket); continue; } @@ -234,6 +236,7 @@ while (nonstop) WriteLogAccessFailed(adminIP); } printfd(__FILE__, "Successfull connection from %s\n", inet_ntostring(outerAddr.sin_addr.s_addr).c_str()); + shutdown(outerSocket, SHUT_RDWR); close(outerSocket); } } @@ -249,7 +252,7 @@ while (pos < stgHdrLen) if (!WaitPackets(sock)) { state = confHdr; - SendError("Bad request"); + SendError(sock, "Bad request"); return -1; } ssize_t ret = recv(sock, &buf[pos], static_cast(stgHdrLen) - static_cast(pos), 0); @@ -270,7 +273,7 @@ if (0 == strncmp(buf, STG_HEADER, strlen(STG_HEADER))) } else { - SendError("Bad request"); + SendError(sock, "Bad request"); } state = confHdr; @@ -384,11 +387,11 @@ if (currAdmin->GetLogin().empty()) } BLOWFISH_CTX ctx; -EnDecodeInit(currAdmin->GetPassword().c_str(), ADM_PASSWD_LEN, &ctx); +InitContext(currAdmin->GetPassword().c_str(), ADM_PASSWD_LEN, &ctx); char login[ADM_LOGIN_LEN + 1]; for (size_t i = 0; i < ADM_LOGIN_LEN / 8; i++) - DecodeString(login + i * 8, loginS + i * 8, &ctx); + DecryptBlock(login + i * 8, loginS + i * 8, &ctx); if (currAdmin == admins->GetNoAdmin()) { @@ -434,7 +437,7 @@ int CONFIGPROTO::RecvData(int sock) requestList.clear(); BLOWFISH_CTX ctx; -EnDecodeInit(currAdmin->GetPassword().c_str(), ADM_PASSWD_LEN, &ctx); +InitContext(currAdmin->GetPassword().c_str(), ADM_PASSWD_LEN, &ctx); while (1) { @@ -470,73 +473,47 @@ while (1) char buffer[8]; buffer[7] = 0; - DecodeString(buffer, bufferS, &ctx); + DecryptBlock(buffer, bufferS, &ctx); requestList.push_back(std::string(buffer, pos)); if (done || memchr(buffer, 0, pos) != NULL) { // End of data if (ParseCommand()) - { - SendError("Bad command"); - } - return SendDataAnswer(sock); + return SendError(sock, "Bad command"); + else + return SendDataAnswer(sock, GetDataAnswer()); } } //return 0; } //----------------------------------------------------------------------------- -int CONFIGPROTO::SendDataAnswer(int sock) +int CONFIGPROTO::SendDataAnswer(int sock, const std::string & answer) { -std::list::iterator li; -li = answerList.begin(); +if (answer.empty()) + return 0; BLOWFISH_CTX ctx; +InitContext(adminPassword.c_str(), ADM_PASSWD_LEN, &ctx); -char buff[8]; -char buffS[8]; -int n = 0; -int k = 0; - -EnDecodeInit(adminPassword.c_str(), ADM_PASSWD_LEN, &ctx); - -while (li != answerList.end()) +std::string::size_type pos = 0; +std::string::size_type length = answer.length() + 1; +while (pos < length) { - while ((*li).c_str()[k]) - { - buff[n % 8] = (*li).c_str()[k]; - n++; - k++; - - if (n % 8 == 0) - { - EncodeString(buffS, buff, &ctx); - if (send(sock, buffS, 8, 0) < 0) - return -1; - } - } - k = 0;// new node - ++li; + char buffer[1024]; + std::string::size_type chunkLength = std::min(length - pos, sizeof(buffer)); + EncryptString(buffer, answer.c_str() + pos, chunkLength, &ctx); + if (send(sock, buffer, (chunkLength & ~7) < chunkLength ? chunkLength + 8 : chunkLength, 0) < 0) // Need to send data adjusted to the 8-byte boundary. + return -1; + pos += chunkLength; } -if (answerList.empty()) { - return 0; -} - -buff[n % 8] = 0; -EncodeString(buffS, buff, &ctx); - -answerList.clear(); - -return static_cast(send(sock, buffS, 8, 0)); +return 1; } //----------------------------------------------------------------------------- -void CONFIGPROTO::SendError(const char * text) +int CONFIGPROTO::SendError(int sock, const std::string & text) { -char s[255]; -answerList.clear(); -snprintf(s, 255, "", text); -answerList.push_back(s); +return SendDataAnswer(sock, ""); } //----------------------------------------------------------------------------- void CONFIGPROTO::WriteLogAccessFailed(uint32_t ip)