X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/d7a542f962802ad207d823b7e805c9135c1693e3..f5776429a3145d59f5b131c25d0f9428ae947f4e:/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 f494ee40..6ca2b3da 100644 --- a/projects/stargazer/plugins/configuration/sgconfig/rsconf.cpp +++ b/projects/stargazer/plugins/configuration/sgconfig/rsconf.cpp @@ -26,14 +26,15 @@ * *******************************************************************/ -#include // cloase, usleep +#include "configproto.h" + +#include "stg/blowfish.h" #include #include #include // snprintf -#include "stg/blowfish.h" -#include "configproto.h" +#include // close #ifndef ENODATA // FreeBSD 4.* - suxx @@ -57,7 +58,7 @@ enum //----------------------------------------------------------------------------- int CONFIGPROTO::Prepare() { -list ansList; //óÀÄÁ ÂÕÄÅÔ ÐÏÍÅÝÅÎ ÏÔ×ÅÔ ÄÌÑ ÍÅÎÅÄÖÅÒÁ ËÌÉÅÎÔÏ× +std::list ansList; //óÀÄÁ ÂÕÄÅÔ ÐÏÍÅÝÅÎ ÏÔ×ÅÔ ÄÌÑ ÍÅÎÅÄÖÅÒÁ ËÌÉÅÎÔÏ× int res; struct sockaddr_in listenAddr; @@ -74,6 +75,7 @@ listenSocket = socket(PF_INET, SOCK_STREAM, 0); if (listenSocket < 0) { errorStr = "Create NET_CONFIGURATOR socket failed."; + logger("Cannot create a socket: %s", strerror(errno)); return -1; } @@ -85,7 +87,8 @@ int lng = 1; if (0 != setsockopt(listenSocket, SOL_SOCKET, SO_REUSEADDR, &lng, 4)) { - errorStr = "Setsockopt failed. " + string(strerror(errno)); + errorStr = "Setsockopt failed. " + std::string(strerror(errno)); + logger("setsockopt error: %s", strerror(errno)); return -1; } @@ -94,6 +97,7 @@ res = bind(listenSocket, (struct sockaddr*)&listenAddr, sizeof(listenAddr)); if (res == -1) { errorStr = "Bind admin socket failed"; + logger("Cannot bind the socket: %s", strerror(errno)); return -1; } @@ -101,6 +105,7 @@ res = listen(listenSocket, 0); if (res == -1) { errorStr = "Listen admin socket failed"; + logger("Cannot listen the socket: %s", strerror(errno)); return -1; } @@ -143,20 +148,17 @@ while (nonstop) &outerAddrLen); if (!nonstop) - { break; - } - if (outerSocket == -1) + if (outerSocket < 0) { + logger("accept error: %s", strerror(errno)); printfd(__FILE__, "accept failed\n"); continue; } adminIP = *(unsigned int*)&(outerAddr.sin_addr); - printfd(__FILE__, "Connection accepted from %s\n", inet_ntostring(outerAddr.sin_addr.s_addr).c_str()); - if (state == confHdr) { if (RecvHdr(outerSocket) < 0) @@ -171,13 +173,11 @@ while (nonstop) close(outerSocket); continue; } - if (RecvLogin(outerSocket) < 0) { close(outerSocket); continue; } - if (state == confLoginCipher) { if (SendLoginAnswer(outerSocket) < 0) @@ -190,7 +190,6 @@ while (nonstop) close(outerSocket); continue; } - if (state == confData) { if (SendLoginSAnswer(outerSocket, ans_ok) < 0) @@ -234,6 +233,7 @@ while (nonstop) { WriteLogAccessFailed(adminIP); } + printfd(__FILE__, "Successfull connection from %s\n", inet_ntostring(outerAddr.sin_addr.s_addr).c_str()); close(outerSocket); } } @@ -242,16 +242,25 @@ int CONFIGPROTO::RecvHdr(int sock) { char buf[sizeof(STG_HEADER)]; memset(buf, 0, sizeof(STG_HEADER)); -int ret; -size_t stgHdrLen = sizeof(STG_HEADER); -for (size_t i = 0; i < stgHdrLen; i++) +size_t stgHdrLen = sizeof(STG_HEADER) - 1; // Without 0-char +size_t pos = 0; +while (pos < stgHdrLen) { - ret = recv(sock, &buf[i], 1, 0); + if (!WaitPackets(sock)) + { + state = confHdr; + SendError("Bad request"); + return -1; + } + ssize_t ret = recv(sock, &buf[pos], static_cast(stgHdrLen) - static_cast(pos), 0); if (ret <= 0) { + if (ret < 0) + logger("recv error: %s", strerror(errno)); state = confHdr; return -1; } + pos += ret; } if (0 == strncmp(buf, STG_HEADER, strlen(STG_HEADER))) @@ -270,23 +279,19 @@ return -1; //----------------------------------------------------------------------------- int CONFIGPROTO::SendHdrAnswer(int sock, int err) { -int ret; - if (err) { - ret = send(sock, ERR_HEADER, sizeof(ERR_HEADER) - 1, 0); - if (ret < 0) + if (send(sock, ERR_HEADER, sizeof(ERR_HEADER) - 1, 0) < 0) { - WriteServLog("send ERR_HEADER error in SendHdrAnswer."); + logger("send error: %s", strerror(errno)); return -1; } } else { - ret = send(sock, OK_HEADER, sizeof(OK_HEADER) - 1, 0); - if (ret < 0) + if (send(sock, OK_HEADER, sizeof(OK_HEADER) - 1, 0) < 0) { - WriteServLog("send OK_HEADER error in SendHdrAnswer."); + logger("send error: %s", strerror(errno)); return -1; } } @@ -297,32 +302,37 @@ return 0; int CONFIGPROTO::RecvLogin(int sock) { char login[ADM_LOGIN_LEN + 1]; -int ret; memset(login, 0, ADM_LOGIN_LEN + 1); -ret = recv(sock, login, ADM_LOGIN_LEN, 0); +size_t pos = 0; +while (pos < ADM_LOGIN_LEN) { + if (!WaitPackets(sock)) + { + state = confHdr; + return ENODATA; + } -if (ret < 0) - { - // Error in network - state = confHdr; - return ENODATA; - } + ssize_t ret = recv(sock, &login[pos], ADM_LOGIN_LEN - static_cast(pos), 0); -if (ret < ADM_LOGIN_LEN) - { - // Error in protocol - state = confHdr; - return ENODATA; - } + if (ret <= 0) + { + // Error in network + logger("recv error: %s", strerror(errno)); + state = confHdr; + return ENODATA; + } + + pos += ret; +} -if (admins->FindAdmin(login, &currAdmin)) +if (admins->Find(login, &currAdmin)) { // Admin not found state = confHdr; return ENODATA; } + currAdmin->SetIP(adminIP); adminLogin = login; state = confLoginCipher; @@ -331,12 +341,9 @@ return 0; //----------------------------------------------------------------------------- int CONFIGPROTO::SendLoginAnswer(int sock) { -int ret; - -ret = send(sock, OK_LOGIN, sizeof(OK_LOGIN) - 1, 0); -if (ret < 0) +if (send(sock, OK_LOGIN, sizeof(OK_LOGIN) - 1, 0) < 0) { - WriteServLog("Send OK_LOGIN error in SendLoginAnswer."); + logger("Send OK_LOGIN error in SendLoginAnswer."); return -1; } return 0; @@ -345,25 +352,29 @@ return 0; int CONFIGPROTO::RecvLoginS(int sock) { char loginS[ADM_LOGIN_LEN + 1]; -char login[ADM_LOGIN_LEN + 1]; -BLOWFISH_CTX ctx; memset(loginS, 0, ADM_LOGIN_LEN + 1); -int total = 0; - -while (total < ADM_LOGIN_LEN) +size_t pos = 0; +while (pos < ADM_LOGIN_LEN) { - int ret = recv(sock, &loginS[total], ADM_LOGIN_LEN - total, 0); + if (!WaitPackets(sock)) + { + state = confHdr; + return ENODATA; + } + + ssize_t ret = recv(sock, &loginS[pos], ADM_LOGIN_LEN - static_cast(pos), 0); - if (ret < 0) + if (ret <= 0) { // Network error printfd(__FILE__, "recv error: '%s'\n", strerror(errno)); + logger("recv error: %s", strerror(errno)); state = confHdr; return ENODATA; } - total += ret; + pos += ret; } if (currAdmin->GetLogin().empty()) @@ -372,12 +383,12 @@ if (currAdmin->GetLogin().empty()) return ENODATA; } +BLOWFISH_CTX ctx; EnDecodeInit(currAdmin->GetPassword().c_str(), ADM_PASSWD_LEN, &ctx); -for (int i = 0; i < ADM_LOGIN_LEN / 8; i++) - { +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); - } if (currAdmin == admins->GetNoAdmin()) { @@ -393,6 +404,7 @@ if (strncmp(currAdmin->GetLogin().c_str(), login, ADM_LOGIN_LEN) != 0) } state = confData; +adminPassword = currAdmin->GetPassword(); return 0; } //----------------------------------------------------------------------------- @@ -400,19 +412,17 @@ int CONFIGPROTO::SendLoginSAnswer(int sock, int err) { if (err) { - int ret = send(sock, ERR_LOGINS, sizeof(ERR_LOGINS) - 1, 0); - if (ret < 0) + if (send(sock, ERR_LOGINS, sizeof(ERR_LOGINS) - 1, 0) < 0) { - WriteServLog("send ERR_LOGIN error in SendLoginAnswer."); + logger("send error: %s", strerror(errno)); return -1; } } else { - int ret = send(sock, OK_LOGINS, sizeof(OK_LOGINS) - 1, 0); - if (ret < 0) + if (send(sock, OK_LOGINS, sizeof(OK_LOGINS) - 1, 0) < 0) { - WriteServLog("send OK_LOGINS error in SendLoginSAnswer."); + logger("send error: %s", strerror(errno)); return -1; } } @@ -421,11 +431,6 @@ return 0; //----------------------------------------------------------------------------- int CONFIGPROTO::RecvData(int sock) { -char bufferS[8]; -char buffer[9]; - -buffer[8] = 0; - requestList.clear(); BLOWFISH_CTX ctx; @@ -433,14 +438,23 @@ EnDecodeInit(currAdmin->GetPassword().c_str(), ADM_PASSWD_LEN, &ctx); while (1) { - int total = 0; bool done = false; - while (total < 8) + char bufferS[8]; + size_t pos = 0; + while (pos < sizeof(bufferS)) { - int ret = recv(sock, &bufferS[total], 8 - total, 0); + if (!WaitPackets(sock)) + { + done = true; + break; + } + + ssize_t ret = recv(sock, &bufferS[pos], sizeof(bufferS) - static_cast(pos), 0); if (ret < 0) { // Network error + logger("recv error: %s", strerror(errno)); + printfd(__FILE__, "recv error: '%s'\n", strerror(errno)); return -1; } @@ -450,15 +464,18 @@ while (1) break; } - total += ret; + pos += ret; } + char buffer[8]; + buffer[7] = 0; + DecodeString(buffer, bufferS, &ctx); - requestList.push_back(std::string(buffer, total)); + requestList.push_back(std::string(buffer, pos)); - if (done || memchr(buffer, 0, total) != NULL) + if (done || memchr(buffer, 0, pos) != NULL) { - // ëÏÎÅà ÐÏÓÙÌËÉ + // End of data if (ParseCommand()) { SendError("Bad command"); @@ -466,12 +483,12 @@ while (1) return SendDataAnswer(sock); } } -return 0; +//return 0; } //----------------------------------------------------------------------------- int CONFIGPROTO::SendDataAnswer(int sock) { -list::iterator li; +std::list::iterator li; li = answerList.begin(); BLOWFISH_CTX ctx; @@ -481,7 +498,7 @@ char buffS[8]; int n = 0; int k = 0; -EnDecodeInit(currAdmin->GetPassword().c_str(), ADM_PASSWD_LEN, &ctx); +EnDecodeInit(adminPassword.c_str(), ADM_PASSWD_LEN, &ctx); while (li != answerList.end()) { @@ -494,11 +511,8 @@ while (li != answerList.end()) if (n % 8 == 0) { EncodeString(buffS, buff, &ctx); - int ret = send(sock, buffS, 8, 0); - if (ret < 0) - { + if (send(sock, buffS, 8, 0) < 0) return -1; - } } } k = 0;// new node @@ -514,7 +528,7 @@ EncodeString(buffS, buff, &ctx); answerList.clear(); -return send(sock, buffS, 8, 0); +return static_cast(send(sock, buffS, 8, 0)); } //----------------------------------------------------------------------------- void CONFIGPROTO::SendError(const char * text) @@ -527,6 +541,6 @@ answerList.push_back(s); //----------------------------------------------------------------------------- void CONFIGPROTO::WriteLogAccessFailed(uint32_t ip) { -WriteServLog("Admin's connect failed. IP %s", inet_ntostring(ip).c_str()); +logger("Admin's connection failed. IP %s", inet_ntostring(ip).c_str()); } //-----------------------------------------------------------------------------