*
*******************************************************************/
-/*#include <unistd.h>
-#include <stdio.h>
-#include <netinet/in.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include <netinet/tcp.h>
-#include <netinet/in.h>
-#include <string.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-#include <pthread.h>*/
-
#include <cerrno>
#include <csignal>
+#include <cstdio> // snprintf
#include "configproto.h"
#include "blowfish.h"
+#ifndef ENODATA
+// FreeBSD 4.* - suxx
+#define ENODATA -1
+#endif
+
enum CONF_STATE
{
confHdr,
errorStr = "Listen admin socket failed";
return -1;
}
-outerAddrLen = sizeof(outerAddr);
-
-/*if (0 != fcntl(listenSocket, F_SETFL, O_NONBLOCK))
- {
- errorStr = "fcntl error!";
- return -1;
- }*/
errorStr = "";
nonstop = true;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
-addrLen = sizeof(outerAddr);
+addrLen = sizeof(addr);
sock = socket(PF_INET, SOCK_STREAM, 0);
connect(sock, (sockaddr*)&addr, addrLen);
close(sock);
while (cp->nonstop)
{
cp->state = confHdr;
- cp->outerSocket = accept(cp->listenSocket,
- (struct sockaddr*)(&cp->outerAddr),
- &cp->outerAddrLen);
+ struct sockaddr_in outerAddr;
+ socklen_t outerAddrLen(sizeof(outerAddr));
+ int outerSocket = accept(cp->listenSocket,
+ (struct sockaddr*)(&outerAddr),
+ &outerAddrLen);
if (!cp->nonstop)
{
continue;
}
- if (cp->outerSocket == -1)
+ if (outerSocket == -1)
{
printfd(__FILE__, "accept failed\n");
usleep(100000);
continue;
}
- cp->adminIP = *(unsigned int*)&(cp->outerAddr.sin_addr);
-
- /* TODO
- if (!cp->hostAllow->HostAllowed(cp->adminIP))
- {
- close(outerSocket);
- continue;
- }*/
+ cp->adminIP = *(unsigned int*)&(outerAddr.sin_addr);
- printfd(__FILE__, "Connection accepted from %s\n", inet_ntostring(cp->outerAddr.sin_addr.s_addr).c_str());
+ printfd(__FILE__, "Connection accepted from %s\n", inet_ntostring(outerAddr.sin_addr.s_addr).c_str());
if (cp->state == confHdr)
{
- if (cp->RecvHdr(cp->outerSocket) < 0)
+ if (cp->RecvHdr(outerSocket) < 0)
{
- close(cp->outerSocket);
+ close(outerSocket);
continue;
}
if (cp->state == confLogin)
{
- if (cp->SendHdrAnswer(cp->outerSocket, ans_ok) < 0)
+ if (cp->SendHdrAnswer(outerSocket, ans_ok) < 0)
{
- close(cp->outerSocket);
+ close(outerSocket);
continue;
}
- if (cp->RecvLogin(cp->outerSocket) < 0)
+ if (cp->RecvLogin(outerSocket) < 0)
{
- close(cp->outerSocket);
+ close(outerSocket);
continue;
}
if (cp->state == confLoginCipher)
{
- if (cp->SendLoginAnswer(cp->outerSocket, ans_ok) < 0)
+ if (cp->SendLoginAnswer(outerSocket, ans_ok) < 0)
{
- close(cp->outerSocket);
+ close(outerSocket);
continue;
}
- if (cp->RecvLoginS(cp->outerSocket) < 0)
+ if (cp->RecvLoginS(outerSocket) < 0)
{
- close(cp->outerSocket);
+ close(outerSocket);
continue;
}
if (cp->state == confData)
{
- if (cp->SendLoginSAnswer(cp->outerSocket, ans_ok) < 0)
+ if (cp->SendLoginSAnswer(outerSocket, ans_ok) < 0)
{
- close(cp->outerSocket);
+ close(outerSocket);
continue;
}
- if (cp->RecvData(cp->outerSocket) < 0)
+ if (cp->RecvData(outerSocket) < 0)
{
- close(cp->outerSocket);
+ close(outerSocket);
continue;
}
cp->state = confHdr;
}
else
{
- if (cp->SendLoginSAnswer(cp->outerSocket, ans_err) < 0)
+ if (cp->SendLoginSAnswer(outerSocket, ans_err) < 0)
{
- close(cp->outerSocket);
+ close(outerSocket);
continue;
}
cp->WriteLogAccessFailed(cp->adminIP);
else
{
cp->WriteLogAccessFailed(cp->adminIP);
- if (cp->SendHdrAnswer(cp->outerSocket, ans_err) < 0)
+ if (cp->SendHdrAnswer(outerSocket, ans_err) < 0)
{
- close(cp->outerSocket);
+ close(outerSocket);
continue;
}
}
{
cp->WriteLogAccessFailed(cp->adminIP);
}
- close(cp->outerSocket);
+ close(outerSocket);
}
return NULL;
memset(login, 0, ADM_LOGIN_LEN + 1);
-//printfd(__FILE__, "RecvLogin\n");
-
-/*for (int i = 0; i < ADM_LOGIN_LEN; i++)
- {
- ret = recv(sock, &login[i], 1, 0);
-
- if (ret <= 0)
- {
- close(sock);
- state = confHdr;
- return ENODATA;
- }
- }*/
-
ret = recv(sock, login, ADM_LOGIN_LEN, 0);
if (ret < 0)
state = confHdr;
return ENODATA;
}
-currAdmin.SetAdminIP(adminIP);
+currAdmin->SetIP(adminIP);
adminLogin = login;
state = confLoginCipher;
return 0;
BLOWFISH_CTX ctx;
memset(loginS, 0, ADM_LOGIN_LEN + 1);
-//printfd(__FILE__, "RecvLoginS\n");
-
-/*for (int i = 0; i < ADM_LOGIN_LEN; i++)
- {
- ret = recv(sock, &loginS[i], 1, 0);
-
- if (ret <= 0)
- {
- //printfd(__FILE__, "RecvLoginS close\n");
- close(sock);
- state = confHdr;
- return ENODATA;
- }
- }*/
-
int total = 0;
while (total < ADM_LOGIN_LEN)
total += ret;
}
-// TODO: implement select on socket
-/*if (total < ADM_LOGIN_LEN)
- {
- // Protocol error
- printfd(__FILE__, "Protocol error. Need %d bytes of cryptologin. Got %d bytes.\n", ADM_LOGIN_LEN, ret);
- close(sock);
- state = confHdr;
- return ENODATA;
- }*/
-
-if (currAdmin.GetLogin() == "")
+if (currAdmin->GetLogin() == "")
{
state = confHdr;
return ENODATA;
}
-EnDecodeInit(currAdmin.GetPassword().c_str(), ADM_PASSWD_LEN, &ctx);
+EnDecodeInit(currAdmin->GetPassword().c_str(), ADM_PASSWD_LEN, &ctx);
for (int i = 0; i < ADM_LOGIN_LEN/8; i++)
{
return 0;
}
-if (strncmp(currAdmin.GetLogin().c_str(), login, ADM_LOGIN_LEN) != 0)
+if (strncmp(currAdmin->GetLogin().c_str(), login, ADM_LOGIN_LEN) != 0)
{
state = confHdr;
return ENODATA;
//-----------------------------------------------------------------------------
int CONFIGPROTO::RecvData(int sock)
{
-//printfd(__FILE__, "RecvData\n");
-//int n = 0;
int ret;
char bufferS[8];
char buffer[9];
requestList.clear();
BLOWFISH_CTX ctx;
-EnDecodeInit(currAdmin.GetPassword().c_str(), ADM_PASSWD_LEN, &ctx);
+EnDecodeInit(currAdmin->GetPassword().c_str(), ADM_PASSWD_LEN, &ctx);
while (1)
{
- /*ret = recv(sock, &bufferS[n++], 1, 0);
- if (ret <= 0)
- {
- //printfd(__FILE__, "RecvData close\n");
- close(sock);
- return 0;
- }*/
int total = 0;
bool done = false;
while (total < 8)
}
return SendDataAnswer(sock);
}
-
- /*if (n == 8)
- {
- n = 0;
- DecodeString(buffer, bufferS, &ctx);
- requestList.push_back(std::string(buffer, 8));
- for (int j = 0; j < 8; j++)
- {
- if (buffer[j] == 0)
- {
- // ëÏÎÅà ÐÏÓÙÌËÉ
- if (ParseCommand())
- {
- SendError("Bad command");
- }
- return SendDataAnswer(sock);
- }
- }
- }*/
}
return 0;
}
int k = 0;
int ret = 0;
-EnDecodeInit(currAdmin.GetPassword().c_str(), ADM_PASSWD_LEN, &ctx);
+EnDecodeInit(currAdmin->GetPassword().c_str(), ADM_PASSWD_LEN, &ctx);
while (li != answerList.end())
{
{
char s[255];
answerList.clear();
-sprintf(s, "<Error value=\"%s\"/>", text);
+snprintf(s, 255, "<Error value=\"%s\"/>", text);
answerList.push_back(s);
}
//-----------------------------------------------------------------------------
WriteServLog("Admin's connect failed. IP %s", inet_ntostring(ip).c_str());
}
//-----------------------------------------------------------------------------
-
-
-