mirror of
https://github.com/kingk85/uFTP.git
synced 2025-07-25 13:16:12 +03:00
socketWrite custom function added
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
build/uFTP
BIN
build/uFTP
Binary file not shown.
@ -41,20 +41,21 @@
|
||||
#include "library/fileManagement.h"
|
||||
#include "library/configRead.h"
|
||||
#include "library/openSsl.h"
|
||||
#include "library/connection.h"
|
||||
#include "ftpCommandsElaborate.h"
|
||||
|
||||
|
||||
/* Elaborate the User login command */
|
||||
int parseCommandUser(clientDataType *theClientData)
|
||||
int parseCommandUser(ftpDataType * data, int socketId)
|
||||
{
|
||||
int returnCode;
|
||||
char *theUserName;
|
||||
theUserName = getFtpCommandArg("USER", theClientData->theCommandReceived, 0);
|
||||
theUserName = getFtpCommandArg("USER", data->clients[socketId].theCommandReceived, 0);
|
||||
|
||||
if (strlen(theUserName) >= 1)
|
||||
{
|
||||
setDynamicStringDataType(&theClientData->login.name, theUserName, strlen(theUserName));
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "331 User ok, Waiting for the password.\r\n");
|
||||
setDynamicStringDataType(&data->clients[socketId].login.name, theUserName, strlen(theUserName));
|
||||
returnCode = socketPrintf(data, socketId, "s", "331 User ok, Waiting for the password.\r\n");
|
||||
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
@ -63,9 +64,9 @@ int parseCommandUser(clientDataType *theClientData)
|
||||
}
|
||||
else
|
||||
{
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "430 Invalid username.\r\n");
|
||||
|
||||
if (returnCode <= 0)
|
||||
returnCode = socketPrintf(data, socketId, "s", "430 Invalid username.\r\n");
|
||||
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
|
||||
return FTP_COMMAND_PROCESSED;
|
||||
@ -73,33 +74,33 @@ int parseCommandUser(clientDataType *theClientData)
|
||||
}
|
||||
|
||||
/* Elaborate the User login command */
|
||||
int parseCommandSite(clientDataType *theClientData)
|
||||
int parseCommandSite(ftpDataType * data, int socketId)
|
||||
{
|
||||
int returnCode, setPermissionsReturnCode;
|
||||
char *theCommand;
|
||||
theCommand = getFtpCommandArg("SITE", theClientData->theCommandReceived, 0);
|
||||
theCommand = getFtpCommandArg("SITE", data->clients[socketId].theCommandReceived, 0);
|
||||
|
||||
if(compareStringCaseInsensitive(theCommand, "CHMOD", strlen("CHMOD")) == 1)
|
||||
{
|
||||
setPermissionsReturnCode = setPermissions(theCommand, theClientData->login.absolutePath.text, theClientData->login.ownerShip);
|
||||
setPermissionsReturnCode = setPermissions(theCommand, data->clients[socketId].login.absolutePath.text, data->clients[socketId].login.ownerShip);
|
||||
|
||||
switch (setPermissionsReturnCode)
|
||||
{
|
||||
case FTP_CHMODE_COMMAND_RETURN_CODE_OK:
|
||||
{
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "200 Permissions changed\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "200 Permissions changed\r\n");
|
||||
}
|
||||
break;
|
||||
|
||||
case FTP_CHMODE_COMMAND_RETURN_CODE_NO_FILE:
|
||||
{
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "550 chmod no such file\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "550 chmod no such file\r\n");
|
||||
}
|
||||
break;
|
||||
|
||||
case FTP_CHMODE_COMMAND_RETURN_CODE_NO_PERMISSIONS:
|
||||
{
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "550 Some errors occoured while changing file permissions.\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "550 Some errors occurred while changing file permissions.\r\n");
|
||||
}
|
||||
break;
|
||||
|
||||
@ -113,7 +114,7 @@ int parseCommandSite(clientDataType *theClientData)
|
||||
}
|
||||
else
|
||||
{
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "500 unknown extension\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "500 unknown extension\r\n");
|
||||
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
@ -145,7 +146,7 @@ int parseCommandPass(ftpDataType * data, int socketId)
|
||||
{
|
||||
printf("\n TOO MANY LOGIN FAILS! \n");
|
||||
data->clients[socketId].closeTheClient = 1;
|
||||
returnCode = dprintf(data->clients[socketId].socketDescriptor, "430 Too many login failure detected, your ip will be blacklisted for 5 minutes\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "430 Too many login failure detected, your ip will be blacklisted for 5 minutes\r\n");
|
||||
if (returnCode <= 0) return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
return FTP_COMMAND_PROCESSED;
|
||||
}
|
||||
@ -172,9 +173,9 @@ int parseCommandPass(ftpDataType * data, int socketId)
|
||||
((loginFailsDataType *) data->loginFailsVector.Data[searchPosition])->failureNumbers++;
|
||||
((loginFailsDataType *) data->loginFailsVector.Data[searchPosition])->failTimeStamp = time(NULL);
|
||||
}
|
||||
|
||||
returnCode = dprintf(data->clients[socketId].socketDescriptor, "430 Invalid username or password\r\n");
|
||||
if (returnCode <= 0) return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
returnCode = socketPrintf(data, socketId, "s", "430 Invalid username or password\r\n");
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -188,8 +189,9 @@ int parseCommandPass(ftpDataType * data, int socketId)
|
||||
data->clients[socketId].login.ownerShip.uid = ((usersParameters_DataType *) data->ftpParameters.usersVector.Data[searchUserNameIndex])->ownerShip.uid;
|
||||
data->clients[socketId].login.userLoggedIn = 1;
|
||||
|
||||
returnCode = dprintf(data->clients[socketId].socketDescriptor, "230 Login Ok.\r\n");
|
||||
if (returnCode <= 0) return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
returnCode = socketPrintf(data, socketId, "s", "230 Login Ok.\r\n");
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
}
|
||||
|
||||
return FTP_COMMAND_PROCESSED;
|
||||
@ -209,8 +211,9 @@ int parseCommandPass(ftpDataType * data, int socketId)
|
||||
((loginFailsDataType *) data->loginFailsVector.Data[searchPosition])->failTimeStamp = time(NULL);
|
||||
}
|
||||
|
||||
returnCode = dprintf(data->clients[socketId].socketDescriptor, "430 Invalid username or password\r\n");
|
||||
if (returnCode <= 0) return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
returnCode = socketPrintf(data, socketId, "s", "430 Invalid username or password\r\n");
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@ -218,8 +221,7 @@ int parseCommandPass(ftpDataType * data, int socketId)
|
||||
int parseCommandAuth(clientDataType *theClientData, SSL_CTX *ctx)
|
||||
{
|
||||
int returnCode;
|
||||
//returnCode = dprintf(theClientData->socketDescriptor, "502 Security extensions not implemented.\r\n");
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "234 AUTH TLS OK..\r\n");
|
||||
//returnCode = socketPrintf(data, socketId, "s", "234 AUTH TLS OK..\r\n");
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
|
||||
@ -244,27 +246,28 @@ int parseCommandAuth(clientDataType *theClientData, SSL_CTX *ctx)
|
||||
return FTP_COMMAND_PROCESSED;
|
||||
}
|
||||
|
||||
int parseCommandPwd(clientDataType *theClientData)
|
||||
int parseCommandPwd(ftpDataType * data, int socketId)
|
||||
{
|
||||
int returnCode;
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "257 \"%s\" is your current location\r\n", theClientData->login.ftpPath.text);
|
||||
returnCode = socketPrintf(data, socketId, "sss", "257 \"", data->clients[socketId].login.ftpPath.text ,"\" is your current location\r\n");
|
||||
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
|
||||
return FTP_COMMAND_PROCESSED;
|
||||
}
|
||||
|
||||
int parseCommandSyst(clientDataType *theClientData)
|
||||
int parseCommandSyst(ftpDataType * data, int socketId)
|
||||
{
|
||||
int returnCode;
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "215 UNIX Type: L8\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "215 UNIX Type: L8\r\n");
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
|
||||
return FTP_COMMAND_PROCESSED;
|
||||
}
|
||||
|
||||
int parseCommandFeat(clientDataType *theClientData)
|
||||
int parseCommandFeat(ftpDataType * data, int socketId)
|
||||
{
|
||||
/*
|
||||
211-Extensions supported:
|
||||
@ -289,27 +292,28 @@ int parseCommandFeat(clientDataType *theClientData)
|
||||
211 End.
|
||||
*/
|
||||
int returnCode;
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "211-Extensions supported:\r\n PASV\r\nUTF8\r\nAUTH TLS\r\n211 End.\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "211-Extensions supported:\r\n PASV\r\nUTF8\r\nAUTH TLS\r\n211 End.\r\n");
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
|
||||
return FTP_COMMAND_PROCESSED;
|
||||
}
|
||||
|
||||
int parseCommandTypeA(clientDataType *theClientData)
|
||||
int parseCommandTypeA(ftpDataType * data, int socketId)
|
||||
{
|
||||
int returnCode;
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "200 TYPE is now 8-bit binary\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "200 TYPE is now 8-bit binary\r\n");
|
||||
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
|
||||
return FTP_COMMAND_PROCESSED;
|
||||
}
|
||||
|
||||
int parseCommandTypeI(clientDataType *theClientData)
|
||||
int parseCommandTypeI(ftpDataType * data, int socketId)
|
||||
{
|
||||
int returnCode;
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "200 TYPE is now 8-bit binary\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "200 TYPE is now 8-bit binary\r\n");
|
||||
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
@ -317,21 +321,21 @@ int parseCommandTypeI(clientDataType *theClientData)
|
||||
return FTP_COMMAND_PROCESSED;
|
||||
}
|
||||
|
||||
int parseCommandStruF(clientDataType *theClientData)
|
||||
int parseCommandStruF(ftpDataType * data, int socketId)
|
||||
{
|
||||
int returnCode;
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "200 TYPE is now 8-bit binary\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "200 TYPE is now 8-bit binary\r\n");
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
|
||||
return FTP_COMMAND_PROCESSED;
|
||||
}
|
||||
|
||||
int parseCommandModeS(clientDataType *theClientData)
|
||||
int parseCommandModeS(ftpDataType * data, int socketId)
|
||||
{
|
||||
int returnCode;
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "200 TYPE is now 8-bit binary\r\n");
|
||||
|
||||
returnCode = socketPrintf(data, socketId, "s", "200 TYPE is now 8-bit binary\r\n");
|
||||
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
|
||||
@ -396,17 +400,17 @@ int parseCommandAbor(ftpDataType * data, int socketId)
|
||||
}
|
||||
pthread_join(data->clients[socketId].workerData.workerThread, &pReturn);
|
||||
|
||||
returnCode = dprintf(data->clients[socketId].socketDescriptor, "426 ABORT\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "426 ABORT\r\n");
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
|
||||
returnCode = dprintf(data->clients[socketId].socketDescriptor, "226 Transfer aborted\r\n");
|
||||
|
||||
returnCode = socketPrintf(data, socketId, "s", "226 Transfer aborted\r\n");
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
returnCode = dprintf(data->clients[socketId].socketDescriptor, "226 Since you see this ABOR must've succeeded\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "226 Since you see this ABOR must've succeeded\r\n");
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
}
|
||||
@ -559,7 +563,7 @@ int parseCommandStor(ftpDataType * data, int socketId)
|
||||
return FTP_COMMAND_PROCESSED;
|
||||
}
|
||||
|
||||
int parseCommandCwd(clientDataType *theClientData)
|
||||
int parseCommandCwd(ftpDataType * data, int socketId)
|
||||
{
|
||||
dynamicStringDataType absolutePathPrevious, ftpPathPrevious, theSafePath;
|
||||
int isSafePath;
|
||||
@ -570,62 +574,62 @@ int parseCommandCwd(clientDataType *theClientData)
|
||||
cleanDynamicStringDataType(&ftpPathPrevious, 1);
|
||||
cleanDynamicStringDataType(&theSafePath, 1);
|
||||
|
||||
thePath = getFtpCommandArg("CWD", theClientData->theCommandReceived, 0);
|
||||
thePath = getFtpCommandArg("CWD", data->clients[socketId].theCommandReceived, 0);
|
||||
|
||||
if (strlen(thePath) > 0)
|
||||
{
|
||||
isSafePath = getSafePath(&theSafePath, thePath, &theClientData->login);
|
||||
isSafePath = getSafePath(&theSafePath, thePath, &data->clients[socketId].login);
|
||||
}
|
||||
|
||||
if (isSafePath == 1)
|
||||
{
|
||||
printf("\n The Path requested for CWD IS:%s", theSafePath.text);
|
||||
setDynamicStringDataType(&absolutePathPrevious, theClientData->login.absolutePath.text, theClientData->login.absolutePath.textLen);
|
||||
setDynamicStringDataType(&ftpPathPrevious, theClientData->login.ftpPath.text, theClientData->login.ftpPath.textLen);
|
||||
setDynamicStringDataType(&absolutePathPrevious, data->clients[socketId].login.absolutePath.text, data->clients[socketId].login.absolutePath.textLen);
|
||||
setDynamicStringDataType(&ftpPathPrevious, data->clients[socketId].login.ftpPath.text, data->clients[socketId].login.ftpPath.textLen);
|
||||
|
||||
if (theSafePath.text[0] != '/')
|
||||
{
|
||||
if (theClientData->login.absolutePath.text[theClientData->login.absolutePath.textLen-1] != '/')
|
||||
appendToDynamicStringDataType(&theClientData->login.absolutePath, "/", 1);
|
||||
if (data->clients[socketId].login.absolutePath.text[data->clients[socketId].login.absolutePath.textLen-1] != '/')
|
||||
appendToDynamicStringDataType(&data->clients[socketId].login.absolutePath, "/", 1);
|
||||
|
||||
if (theClientData->login.ftpPath.text[theClientData->login.ftpPath.textLen-1] != '/')
|
||||
appendToDynamicStringDataType(&theClientData->login.ftpPath, "/", 1);
|
||||
if (data->clients[socketId].login.ftpPath.text[data->clients[socketId].login.ftpPath.textLen-1] != '/')
|
||||
appendToDynamicStringDataType(&data->clients[socketId].login.ftpPath, "/", 1);
|
||||
|
||||
appendToDynamicStringDataType(&theClientData->login.absolutePath, theSafePath.text, theSafePath.textLen);
|
||||
appendToDynamicStringDataType(&theClientData->login.ftpPath, theSafePath.text, theSafePath.textLen);
|
||||
appendToDynamicStringDataType(&data->clients[socketId].login.absolutePath, theSafePath.text, theSafePath.textLen);
|
||||
appendToDynamicStringDataType(&data->clients[socketId].login.ftpPath, theSafePath.text, theSafePath.textLen);
|
||||
}
|
||||
else if (theSafePath.text[0] == '/')
|
||||
{
|
||||
cleanDynamicStringDataType(&theClientData->login.ftpPath, 0);
|
||||
cleanDynamicStringDataType(&theClientData->login.absolutePath, 0);
|
||||
cleanDynamicStringDataType(&data->clients[socketId].login.ftpPath, 0);
|
||||
cleanDynamicStringDataType(&data->clients[socketId].login.absolutePath, 0);
|
||||
|
||||
setDynamicStringDataType(&theClientData->login.ftpPath, theSafePath.text, theSafePath.textLen);
|
||||
setDynamicStringDataType(&theClientData->login.absolutePath, theClientData->login.homePath.text, theClientData->login.homePath.textLen);
|
||||
setDynamicStringDataType(&data->clients[socketId].login.ftpPath, theSafePath.text, theSafePath.textLen);
|
||||
setDynamicStringDataType(&data->clients[socketId].login.absolutePath, data->clients[socketId].login.homePath.text, data->clients[socketId].login.homePath.textLen);
|
||||
|
||||
if (strlen(theSafePath.text)> 0)
|
||||
{
|
||||
char *theDirPointer = theSafePath.text;
|
||||
|
||||
if (theClientData->login.absolutePath.text[theClientData->login.absolutePath.textLen-1] == '/')
|
||||
if (data->clients[socketId].login.absolutePath.text[data->clients[socketId].login.absolutePath.textLen-1] == '/')
|
||||
{
|
||||
while(theDirPointer[0] == '/')
|
||||
theDirPointer++;
|
||||
}
|
||||
|
||||
if (strlen(theDirPointer) > 0)
|
||||
appendToDynamicStringDataType(&theClientData->login.absolutePath, theDirPointer, strlen(theDirPointer));
|
||||
appendToDynamicStringDataType(&data->clients[socketId].login.absolutePath, theDirPointer, strlen(theDirPointer));
|
||||
}
|
||||
}
|
||||
|
||||
if (FILE_IsDirectory(theClientData->login.absolutePath.text) == 1)
|
||||
if (FILE_IsDirectory(data->clients[socketId].login.absolutePath.text) == 1)
|
||||
{
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "250 OK. Current directory is %s\r\n", theClientData->login.ftpPath.text);
|
||||
returnCode = socketPrintf(data, socketId, "sss", "250 OK. Current directory is ", data->clients[socketId].login.ftpPath.text, "\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
setDynamicStringDataType(&theClientData->login.absolutePath, absolutePathPrevious.text, absolutePathPrevious.textLen);
|
||||
setDynamicStringDataType(&theClientData->login.ftpPath, ftpPathPrevious.text, ftpPathPrevious.textLen);
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "530 Can't change directory to %s: No such file or directory\r\n", theClientData->login.absolutePath.text);
|
||||
setDynamicStringDataType(&data->clients[socketId].login.absolutePath, absolutePathPrevious.text, absolutePathPrevious.textLen);
|
||||
setDynamicStringDataType(&data->clients[socketId].login.ftpPath, ftpPathPrevious.text, ftpPathPrevious.textLen);
|
||||
returnCode = socketPrintf(data, socketId, "sss", "530 Can't change directory to ", data->clients[socketId].login.absolutePath.text, ": No such file or directory\r\n");
|
||||
}
|
||||
|
||||
cleanDynamicStringDataType(&absolutePathPrevious, 0);
|
||||
@ -647,7 +651,7 @@ int parseCommandCwd(clientDataType *theClientData)
|
||||
}
|
||||
}
|
||||
|
||||
int parseCommandRest(clientDataType *theClientData)
|
||||
int parseCommandRest(ftpDataType * data, int socketId)
|
||||
{
|
||||
int returnCode;
|
||||
int i, theSizeIndex;
|
||||
@ -655,33 +659,33 @@ int parseCommandRest(clientDataType *theClientData)
|
||||
memset(theSize, 0, FTP_COMMAND_ELABORATE_CHAR_BUFFER);
|
||||
theSizeIndex = 0;
|
||||
|
||||
for (i = strlen("REST")+1; i < theClientData->commandIndex; i++)
|
||||
for (i = strlen("REST")+1; i < data->clients[socketId].commandIndex; i++)
|
||||
{
|
||||
if (theClientData->theCommandReceived[i] == '\r' ||
|
||||
theClientData->theCommandReceived[i] == '\0' ||
|
||||
theClientData->theCommandReceived[i] == '\n')
|
||||
if (data->clients[socketId].theCommandReceived[i] == '\r' ||
|
||||
data->clients[socketId].theCommandReceived[i] == '\0' ||
|
||||
data->clients[socketId].theCommandReceived[i] == '\n')
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if (theSizeIndex < FTP_COMMAND_ELABORATE_CHAR_BUFFER &&
|
||||
(theClientData->theCommandReceived[i] == '0' ||
|
||||
theClientData->theCommandReceived[i] == '1' ||
|
||||
theClientData->theCommandReceived[i] == '2' ||
|
||||
theClientData->theCommandReceived[i] == '3' ||
|
||||
theClientData->theCommandReceived[i] == '4' ||
|
||||
theClientData->theCommandReceived[i] == '5' ||
|
||||
theClientData->theCommandReceived[i] == '6' ||
|
||||
theClientData->theCommandReceived[i] == '7' ||
|
||||
theClientData->theCommandReceived[i] == '8' ||
|
||||
theClientData->theCommandReceived[i] == '9' ))
|
||||
(data->clients[socketId].theCommandReceived[i] == '0' ||
|
||||
data->clients[socketId].theCommandReceived[i] == '1' ||
|
||||
data->clients[socketId].theCommandReceived[i] == '2' ||
|
||||
data->clients[socketId].theCommandReceived[i] == '3' ||
|
||||
data->clients[socketId].theCommandReceived[i] == '4' ||
|
||||
data->clients[socketId].theCommandReceived[i] == '5' ||
|
||||
data->clients[socketId].theCommandReceived[i] == '6' ||
|
||||
data->clients[socketId].theCommandReceived[i] == '7' ||
|
||||
data->clients[socketId].theCommandReceived[i] == '8' ||
|
||||
data->clients[socketId].theCommandReceived[i] == '9' ))
|
||||
{
|
||||
theSize[theSizeIndex++] = theClientData->theCommandReceived[i];
|
||||
theSize[theSizeIndex++] = data->clients[socketId].theCommandReceived[i];
|
||||
}
|
||||
}
|
||||
|
||||
theClientData->workerData.retrRestartAtByte = atoll(theSize);
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "350 Restarting at %s\r\n", theSize);
|
||||
data->clients[socketId].workerData.retrRestartAtByte = atoll(theSize);
|
||||
returnCode = socketPrintf(data, socketId, "sss", "350 Restarting at ", theSize, "\r\n");
|
||||
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
@ -689,7 +693,7 @@ int parseCommandRest(clientDataType *theClientData)
|
||||
return FTP_COMMAND_PROCESSED;
|
||||
}
|
||||
|
||||
int parseCommandMkd(clientDataType *theClientData)
|
||||
int parseCommandMkd(ftpDataType * data, int socketId)
|
||||
{
|
||||
int returnCode;
|
||||
int functionReturnCode = FTP_COMMAND_NOT_RECONIZED;
|
||||
@ -697,11 +701,11 @@ int parseCommandMkd(clientDataType *theClientData)
|
||||
char *theDirectoryFilename;
|
||||
dynamicStringDataType mkdFileName;
|
||||
|
||||
theDirectoryFilename = getFtpCommandArg("MKD", theClientData->theCommandReceived, 0);
|
||||
theDirectoryFilename = getFtpCommandArg("MKD", data->clients[socketId].theCommandReceived, 0);
|
||||
|
||||
cleanDynamicStringDataType(&mkdFileName, 1);
|
||||
|
||||
isSafePath = getSafePath(&mkdFileName, theDirectoryFilename, &theClientData->login);
|
||||
isSafePath = getSafePath(&mkdFileName, theDirectoryFilename, &data->clients[socketId].login);
|
||||
|
||||
if (isSafePath == 1)
|
||||
{
|
||||
@ -710,8 +714,7 @@ int parseCommandMkd(clientDataType *theClientData)
|
||||
|
||||
if (returnStatus == -1)
|
||||
{
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "550 error while creating directory %s\r\n", theDirectoryFilename);
|
||||
|
||||
returnCode = socketPrintf(data, socketId, "sss", "550 error while creating directory ", theDirectoryFilename, "\r\n");
|
||||
if (returnCode <= 0)
|
||||
{
|
||||
functionReturnCode = FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
@ -723,12 +726,12 @@ int parseCommandMkd(clientDataType *theClientData)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (theClientData->login.ownerShip.ownerShipSet == 1)
|
||||
if (data->clients[socketId].login.ownerShip.ownerShipSet == 1)
|
||||
{
|
||||
returnStatus = FILE_doChownFromUidGid(mkdFileName.text, theClientData->login.ownerShip.uid, theClientData->login.ownerShip.gid);
|
||||
returnStatus = FILE_doChownFromUidGid(mkdFileName.text, data->clients[socketId].login.ownerShip.uid, data->clients[socketId].login.ownerShip.gid);
|
||||
}
|
||||
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "257 \"%s\" : The directory was successfully created\r\n", theDirectoryFilename);
|
||||
returnCode = socketPrintf(data, socketId, "sss", "257 \"", theDirectoryFilename, "\" : The directory was successfully created\r\n");
|
||||
|
||||
if (returnCode <= 0)
|
||||
{
|
||||
@ -750,10 +753,10 @@ int parseCommandMkd(clientDataType *theClientData)
|
||||
return functionReturnCode;
|
||||
}
|
||||
|
||||
int parseCommandOpts(clientDataType *theClientData)
|
||||
int parseCommandOpts(ftpDataType * data, int socketId)
|
||||
{
|
||||
int returnCode;
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "200 OK\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "200 OK\r\n");
|
||||
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
@ -761,7 +764,7 @@ int parseCommandOpts(clientDataType *theClientData)
|
||||
return FTP_COMMAND_PROCESSED;
|
||||
}
|
||||
|
||||
int parseCommandDele(clientDataType *theClientData)
|
||||
int parseCommandDele(ftpDataType * data, int socketId)
|
||||
{
|
||||
int functionReturnCode = 0;
|
||||
int returnCode;
|
||||
@ -770,10 +773,10 @@ int parseCommandDele(clientDataType *theClientData)
|
||||
char *theFileToDelete;
|
||||
dynamicStringDataType deleFileName;
|
||||
|
||||
theFileToDelete = getFtpCommandArg("DELE", theClientData->theCommandReceived, 0);
|
||||
theFileToDelete = getFtpCommandArg("DELE", data->clients[socketId].theCommandReceived, 0);
|
||||
|
||||
cleanDynamicStringDataType(&deleFileName, 1);
|
||||
isSafePath = getSafePath(&deleFileName, theFileToDelete, &theClientData->login);
|
||||
isSafePath = getSafePath(&deleFileName, theFileToDelete, &data->clients[socketId].login);
|
||||
|
||||
if (isSafePath == 1)
|
||||
{
|
||||
@ -784,11 +787,11 @@ int parseCommandDele(clientDataType *theClientData)
|
||||
|
||||
if (returnStatus == -1)
|
||||
{
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "550 Could not delete the file: %s some errors occoured\r\n", theFileToDelete);
|
||||
returnCode = socketPrintf(data, socketId, "sss", "550 Could not delete the file: ", theFileToDelete, " some errors occurred\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "250 Deleted %s\r\n", theFileToDelete);
|
||||
returnCode = socketPrintf(data, socketId, "sss", "250 Deleted ", theFileToDelete, "\r\n");
|
||||
}
|
||||
|
||||
functionReturnCode = FTP_COMMAND_PROCESSED;
|
||||
@ -798,7 +801,7 @@ int parseCommandDele(clientDataType *theClientData)
|
||||
}
|
||||
else
|
||||
{
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "550 Could not delete the file: No such file or file is a directory\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "550 Could not delete the file: No such file or file is a directory\r\n");
|
||||
functionReturnCode = FTP_COMMAND_PROCESSED;
|
||||
|
||||
if (returnCode <= 0)
|
||||
@ -814,11 +817,11 @@ int parseCommandDele(clientDataType *theClientData)
|
||||
return functionReturnCode;
|
||||
}
|
||||
|
||||
int parseCommandNoop(clientDataType *theClientData)
|
||||
int parseCommandNoop(ftpDataType * data, int socketId)
|
||||
{
|
||||
int returnCode;
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "200 Zzz...\r\n");
|
||||
|
||||
|
||||
returnCode = socketPrintf(data, socketId, "s", "200 Zzz...\r\n");
|
||||
if (returnCode <= 0) {
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
}
|
||||
@ -826,10 +829,11 @@ int parseCommandNoop(clientDataType *theClientData)
|
||||
return FTP_COMMAND_PROCESSED;
|
||||
}
|
||||
|
||||
int notLoggedInMessage(clientDataType *theClientData)
|
||||
int notLoggedInMessage(ftpDataType * data, int socketId)
|
||||
{
|
||||
int returnCode;
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "530 You aren't logged in\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "530 You aren't logged in\r\n");
|
||||
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
|
||||
@ -839,7 +843,8 @@ int notLoggedInMessage(clientDataType *theClientData)
|
||||
int parseCommandQuit(ftpDataType * data, int socketId)
|
||||
{
|
||||
int returnCode;
|
||||
returnCode = dprintf(data->clients[socketId].socketDescriptor, "221 Logout.\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "221 Logout.\r\n");
|
||||
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
|
||||
@ -848,7 +853,7 @@ int parseCommandQuit(ftpDataType * data, int socketId)
|
||||
return FTP_COMMAND_PROCESSED;
|
||||
}
|
||||
|
||||
int parseCommandRmd(clientDataType *theClientData)
|
||||
int parseCommandRmd(ftpDataType * data, int socketId)
|
||||
{
|
||||
int functionReturnCode = 0;
|
||||
int returnCode;
|
||||
@ -857,11 +862,9 @@ int parseCommandRmd(clientDataType *theClientData)
|
||||
char *theDirectoryFilename;
|
||||
dynamicStringDataType rmdFileName;
|
||||
|
||||
theDirectoryFilename = getFtpCommandArg("RMD", theClientData->theCommandReceived, 0);
|
||||
|
||||
theDirectoryFilename = getFtpCommandArg("RMD", data->clients[socketId].theCommandReceived, 0);
|
||||
cleanDynamicStringDataType(&rmdFileName, 1);
|
||||
|
||||
isSafePath = getSafePath(&rmdFileName, theDirectoryFilename, &theClientData->login);
|
||||
isSafePath = getSafePath(&rmdFileName, theDirectoryFilename, &data->clients[socketId].login);
|
||||
|
||||
if (isSafePath == 1)
|
||||
{
|
||||
@ -871,11 +874,11 @@ int parseCommandRmd(clientDataType *theClientData)
|
||||
|
||||
if (returnStatus == -1)
|
||||
{
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "550 Could not remove the directory, some errors occoured.\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "550 Could not remove the directory, some errors occurred.\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "250 The directory was successfully removed\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "250 The directory was successfully removed\r\n");
|
||||
}
|
||||
|
||||
functionReturnCode = FTP_COMMAND_PROCESSED;
|
||||
@ -885,7 +888,7 @@ int parseCommandRmd(clientDataType *theClientData)
|
||||
}
|
||||
else
|
||||
{
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "550 Could not delete the directory:No such directory\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "550 Could not delete the directory:No such directory\r\n");
|
||||
functionReturnCode = FTP_COMMAND_PROCESSED;
|
||||
|
||||
if (returnCode <= 0)
|
||||
@ -902,7 +905,7 @@ int parseCommandRmd(clientDataType *theClientData)
|
||||
return functionReturnCode;
|
||||
}
|
||||
|
||||
int parseCommandSize(clientDataType *theClientData)
|
||||
int parseCommandSize(ftpDataType * data, int socketId)
|
||||
{
|
||||
int returnCode;
|
||||
int isSafePath;
|
||||
@ -910,11 +913,11 @@ int parseCommandSize(clientDataType *theClientData)
|
||||
char *theFileName;
|
||||
dynamicStringDataType getSizeFromFileName;
|
||||
|
||||
theFileName = getFtpCommandArg("SIZE", theClientData->theCommandReceived, 0);
|
||||
theFileName = getFtpCommandArg("SIZE", data->clients[socketId].theCommandReceived, 0);
|
||||
|
||||
cleanDynamicStringDataType(&getSizeFromFileName, 1);
|
||||
|
||||
isSafePath = getSafePath(&getSizeFromFileName, theFileName, &theClientData->login);
|
||||
isSafePath = getSafePath(&getSizeFromFileName, theFileName, &data->clients[socketId].login);
|
||||
|
||||
if (isSafePath == 1)
|
||||
{
|
||||
@ -922,16 +925,16 @@ int parseCommandSize(clientDataType *theClientData)
|
||||
if (FILE_IsFile(getSizeFromFileName.text)== 1)
|
||||
{
|
||||
theSize = FILE_GetFileSizeFromPath(getSizeFromFileName.text);
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "213 %lld\r\n", theSize);
|
||||
returnCode = socketPrintf(data, socketId, "sls", "213 ", theSize, "\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "550 Can't check for file existence\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "550 Can't check for file existence\r\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "550 Can't check for file existence\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "550 Can't check for file existence\r\n");
|
||||
}
|
||||
cleanDynamicStringDataType(&getSizeFromFileName, 0);
|
||||
|
||||
@ -941,34 +944,34 @@ int parseCommandSize(clientDataType *theClientData)
|
||||
return FTP_COMMAND_PROCESSED;
|
||||
}
|
||||
|
||||
int parseCommandRnfr(clientDataType *theClientData)
|
||||
int parseCommandRnfr(ftpDataType * data, int socketId)
|
||||
{
|
||||
int returnCode;
|
||||
int isSafePath;
|
||||
char *theRnfrFileName;
|
||||
|
||||
theRnfrFileName = getFtpCommandArg("RNFR", theClientData->theCommandReceived, 0);
|
||||
cleanDynamicStringDataType(&theClientData->renameFromFile, 0);
|
||||
theRnfrFileName = getFtpCommandArg("RNFR", data->clients[socketId].theCommandReceived, 0);
|
||||
cleanDynamicStringDataType(&data->clients[socketId].renameFromFile, 0);
|
||||
|
||||
isSafePath = getSafePath(&theClientData->renameFromFile, theRnfrFileName, &theClientData->login);
|
||||
isSafePath = getSafePath(&data->clients[socketId].renameFromFile, theRnfrFileName, &data->clients[socketId].login);
|
||||
|
||||
if (isSafePath == 1&&
|
||||
(FILE_IsFile(theClientData->renameFromFile.text) == 1 ||
|
||||
FILE_IsDirectory(theClientData->renameFromFile.text) == 1))
|
||||
(FILE_IsFile(data->clients[socketId].renameFromFile.text) == 1 ||
|
||||
FILE_IsDirectory(data->clients[socketId].renameFromFile.text) == 1))
|
||||
{
|
||||
if (FILE_IsFile(theClientData->renameFromFile.text) == 1 ||
|
||||
FILE_IsDirectory(theClientData->renameFromFile.text) == 1)
|
||||
if (FILE_IsFile(data->clients[socketId].renameFromFile.text) == 1 ||
|
||||
FILE_IsDirectory(data->clients[socketId].renameFromFile.text) == 1)
|
||||
{
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "350 RNFR accepted - file exists, ready for destination\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "350 RNFR accepted - file exists, ready for destination\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "550 Sorry, but that file doesn't exist\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "550 Sorry, but that file doesn't exist\r\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "550 Sorry, but that file doesn't exist\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "550 Sorry, but that file doesn't exist\r\n");
|
||||
}
|
||||
|
||||
|
||||
@ -976,74 +979,70 @@ int parseCommandRnfr(clientDataType *theClientData)
|
||||
return FTP_COMMAND_PROCESSED;
|
||||
}
|
||||
|
||||
int parseCommandRnto(clientDataType *theClientData)
|
||||
int parseCommandRnto(ftpDataType * data, int socketId)
|
||||
{
|
||||
int returnCode = 0;
|
||||
int isSafePath;
|
||||
char *theRntoFileName;
|
||||
|
||||
theRntoFileName = getFtpCommandArg("RNTO", theClientData->theCommandReceived, 0);
|
||||
cleanDynamicStringDataType(&theClientData->renameToFile, 0);
|
||||
theRntoFileName = getFtpCommandArg("RNTO", data->clients[socketId].theCommandReceived, 0);
|
||||
cleanDynamicStringDataType(&data->clients[socketId].renameToFile, 0);
|
||||
|
||||
isSafePath = getSafePath(&theClientData->renameToFile, theRntoFileName, &theClientData->login);
|
||||
isSafePath = getSafePath(&data->clients[socketId].renameToFile, theRntoFileName, &data->clients[socketId].login);
|
||||
|
||||
if (isSafePath == 1 &&
|
||||
theClientData->renameFromFile.textLen > 0)
|
||||
data->clients[socketId].renameFromFile.textLen > 0)
|
||||
{
|
||||
|
||||
if (FILE_IsFile(theClientData->renameFromFile.text) == 1 ||
|
||||
FILE_IsDirectory(theClientData->renameFromFile.text) == 1)
|
||||
if (FILE_IsFile(data->clients[socketId].renameFromFile.text) == 1 ||
|
||||
FILE_IsDirectory(data->clients[socketId].renameFromFile.text) == 1)
|
||||
{
|
||||
returnCode = rename (theClientData->renameFromFile.text, theClientData->renameToFile.text);
|
||||
returnCode = rename (data->clients[socketId].renameFromFile.text, data->clients[socketId].renameToFile.text);
|
||||
if (returnCode == 0)
|
||||
{
|
||||
printf("\n250 File successfully renamed or moved");
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "250 File successfully renamed or moved\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "250 File successfully renamed or moved\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\n503 Error Renaming the file");
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "503 Error Renaming the file\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "503 Error Renaming the file\r\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\n503 Need RNFR before RNTO");
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "503 Need RNFR before RNTO\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "503 Need RNFR before RNTO\r\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\n503 Error Renaming the file");
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "503 Error Renaming the file\r\n");
|
||||
returnCode = socketPrintf(data, socketId, "s", "503 Error Renaming the file\r\n");
|
||||
}
|
||||
|
||||
if (returnCode <= 0)
|
||||
{
|
||||
printf("\, parseCommandRnto return code: %d", returnCode);
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
return FTP_COMMAND_PROCESSED;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int parseCommandCdup(clientDataType *theClientData)
|
||||
int parseCommandCdup(ftpDataType * data, int socketId)
|
||||
{
|
||||
int returnCode;
|
||||
|
||||
FILE_DirectoryToParent(&theClientData->login.absolutePath.text);
|
||||
FILE_DirectoryToParent(&theClientData->login.ftpPath.text);
|
||||
theClientData->login.absolutePath.textLen = strlen(theClientData->login.absolutePath.text);
|
||||
theClientData->login.ftpPath.textLen = strlen(theClientData->login.ftpPath.text);
|
||||
FILE_DirectoryToParent(&data->clients[socketId].login.absolutePath.text);
|
||||
FILE_DirectoryToParent(&data->clients[socketId].login.ftpPath.text);
|
||||
data->clients[socketId].login.absolutePath.textLen = strlen(data->clients[socketId].login.absolutePath.text);
|
||||
data->clients[socketId].login.ftpPath.textLen = strlen(data->clients[socketId].login.ftpPath.text);
|
||||
|
||||
if(strncmp(theClientData->login.absolutePath.text, theClientData->login.homePath.text, theClientData->login.homePath.textLen) != 0)
|
||||
if(strncmp(data->clients[socketId].login.absolutePath.text, data->clients[socketId].login.homePath.text, data->clients[socketId].login.homePath.textLen) != 0)
|
||||
{
|
||||
setDynamicStringDataType(&theClientData->login.absolutePath, theClientData->login.homePath.text, theClientData->login.homePath.textLen);
|
||||
setDynamicStringDataType(&data->clients[socketId].login.absolutePath, data->clients[socketId].login.homePath.text, data->clients[socketId].login.homePath.textLen);
|
||||
}
|
||||
|
||||
returnCode = dprintf(theClientData->socketDescriptor, "250 OK. Current directory is %s\r\n", theClientData->login.ftpPath.text);
|
||||
returnCode = socketPrintf(data, socketId, "sss", "250 OK. Current directory is ", data->clients[socketId].login.ftpPath.text, "\r\n");
|
||||
|
||||
if (returnCode <= 0)
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
|
@ -47,37 +47,39 @@ extern "C" {
|
||||
|
||||
|
||||
/* Elaborate the User login command */
|
||||
int parseCommandUser(clientDataType *theClientData);
|
||||
int parseCommandSite(clientDataType *theClientData);
|
||||
int parseCommandUser(ftpDataType * data, int socketId);
|
||||
int parseCommandSite(ftpDataType * data, int socketId);
|
||||
int parseCommandPass(ftpDataType * data, int socketId);
|
||||
|
||||
int parseCommandAuth(clientDataType *theClientData, SSL_CTX *);
|
||||
int parseCommandPwd(clientDataType *theClientData);
|
||||
int parseCommandSyst(clientDataType *theClientData);
|
||||
int parseCommandFeat(clientDataType *theClientData);
|
||||
int parseCommandStruF(clientDataType *theClientData);
|
||||
int parseCommandTypeI(clientDataType *theClientData);
|
||||
int parseCommandModeS(clientDataType *theClientData);
|
||||
int parseCommandTypeA(clientDataType *theClientData);
|
||||
|
||||
int parseCommandPwd(ftpDataType * data, int socketId);
|
||||
int parseCommandSyst(ftpDataType * data, int socketId);
|
||||
int parseCommandFeat(ftpDataType * data, int socketId);
|
||||
int parseCommandStruF(ftpDataType * data, int socketId);
|
||||
int parseCommandTypeI(ftpDataType * data, int socketId);
|
||||
int parseCommandModeS(ftpDataType * data, int socketId);
|
||||
int parseCommandTypeA(ftpDataType * data, int socketId);
|
||||
int parseCommandAbor(ftpDataType * data, int socketId);
|
||||
int parseCommandPasv(ftpDataType * data, int socketId);
|
||||
int parseCommandPort(ftpDataType * data, int socketId);
|
||||
int parseCommandList(ftpDataType * data, int socketId);
|
||||
int parseCommandNlst(ftpDataType * data, int socketId);
|
||||
int parseCommandRetr(ftpDataType * data, int socketId);
|
||||
int parseCommandMkd(clientDataType *theClientData);
|
||||
int parseCommandNoop(clientDataType *theClientData);
|
||||
int notLoggedInMessage(clientDataType *theClientData);
|
||||
int parseCommandRmd(clientDataType *theClientData);
|
||||
int parseCommandMkd(ftpDataType * data, int socketId);
|
||||
int parseCommandNoop(ftpDataType * data, int socketId);
|
||||
int notLoggedInMessage(ftpDataType * data, int socketId);
|
||||
int parseCommandRmd(ftpDataType * data, int socketId);
|
||||
int parseCommandQuit(ftpDataType * data, int socketId);
|
||||
int parseCommandSize(clientDataType *theClientData);
|
||||
int parseCommandSize(ftpDataType * data, int socketId);
|
||||
int parseCommandStor(ftpDataType * data, int socketId);
|
||||
int parseCommandCwd(clientDataType *theClientData);
|
||||
int parseCommandRest(clientDataType *theClientData);
|
||||
int parseCommandCdup(clientDataType *theClientData);
|
||||
int parseCommandDele(clientDataType *theClientData);
|
||||
int parseCommandOpts(clientDataType *theClientData);
|
||||
int parseCommandRnfr(clientDataType *theClientData);
|
||||
int parseCommandRnto(clientDataType *theClientData);
|
||||
int parseCommandCwd(ftpDataType * data, int socketId);
|
||||
int parseCommandRest(ftpDataType * data, int socketId);
|
||||
int parseCommandCdup(ftpDataType * data, int socketId);
|
||||
int parseCommandDele(ftpDataType * data, int socketId);
|
||||
int parseCommandOpts(ftpDataType * data, int socketId);
|
||||
int parseCommandRnfr(ftpDataType * data, int socketId);
|
||||
int parseCommandRnto(ftpDataType * data, int socketId);
|
||||
|
||||
long long int writeRetrFile(char * theFilename, int thePasvSocketConnection, long long int startFrom, FILE *retrFP);
|
||||
char *getFtpCommandArg(char * theCommand, char *theCommandString, int skipArgs);
|
||||
|
45
ftpData.c
45
ftpData.c
@ -241,14 +241,10 @@ int writeListDataInfoToSocket(char * thePath, int theSocket, int *filesNumber, i
|
||||
data.fileNameWithPath = NULL;
|
||||
data.finalStringPath = NULL;
|
||||
data.linkPath = NULL;
|
||||
|
||||
|
||||
data.isFile = 0;
|
||||
data.isDirectory = 0;
|
||||
|
||||
|
||||
|
||||
//printf("\nPROCESSING: %s", fileList[i]);
|
||||
//fflush(0);
|
||||
|
||||
if (FILE_IsDirectory(fileList[i]) == 1)
|
||||
{
|
||||
@ -329,7 +325,7 @@ int writeListDataInfoToSocket(char * thePath, int theSocket, int *filesNumber, i
|
||||
|
||||
case COMMAND_TYPE_NLST:
|
||||
{
|
||||
returnCode = dprintf(theSocket, "%s\r\n",data.fileNameNoPath);
|
||||
returnCode = dprintf(theSocket, "%s\r\n",data.fileNameNoPath);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -339,7 +335,6 @@ int writeListDataInfoToSocket(char * thePath, int theSocket, int *filesNumber, i
|
||||
printf("\nWarning switch default in function writeListDataInfoToSocket (%d)", commandType);
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -370,12 +365,12 @@ int writeListDataInfoToSocket(char * thePath, int theSocket, int *filesNumber, i
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (fileList != NULL)
|
||||
{
|
||||
free (fileList);
|
||||
}
|
||||
|
||||
|
||||
if (fileList != NULL)
|
||||
{
|
||||
free (fileList);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -584,9 +579,19 @@ void resetWorkerData(workerDataType *workerData, int isInitialization)
|
||||
workerData->workerThread = 0;
|
||||
}
|
||||
|
||||
pthread_mutex_init(&workerData->conditionMutex, NULL);
|
||||
pthread_cond_init(&workerData->conditionVariable, NULL);
|
||||
|
||||
if (pthread_mutex_init(&workerData->conditionMutex, NULL) != 0)
|
||||
{
|
||||
printf("\nworkerData->conditionMutex init failed\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
if (pthread_cond_init(&workerData->conditionVariable, NULL) != 0)
|
||||
{
|
||||
printf("\nworkerData->conditionVariable init failed\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
//Clear the dynamic vector structure
|
||||
int theSize = workerData->directoryInfo.Size;
|
||||
char ** lastToDestroy = NULL;
|
||||
@ -613,8 +618,16 @@ void resetClientData(clientDataType *clientData, int isInitialization)
|
||||
void *pReturn = NULL;
|
||||
pthread_join(clientData->workerData.workerThread, &pReturn);
|
||||
}
|
||||
|
||||
pthread_mutex_destroy(&clientData->writeMutex);
|
||||
}
|
||||
|
||||
if (pthread_mutex_init(&clientData->writeMutex, NULL) != 0)
|
||||
{
|
||||
printf("\nclientData->writeMutex init failed\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
clientData->socketDescriptor = -1;
|
||||
clientData->socketCommandReceived = 0;
|
||||
clientData->socketIsConnected = 0;
|
||||
|
@ -117,8 +117,6 @@ struct ipData
|
||||
|
||||
struct workerData
|
||||
{
|
||||
|
||||
|
||||
int threadIsAlive;
|
||||
int connectionPort;
|
||||
int passiveModeOn;
|
||||
@ -152,6 +150,7 @@ struct clientData
|
||||
{
|
||||
SSL *ssl;
|
||||
int tlsIsEnabled;
|
||||
pthread_mutex_t writeMutex;
|
||||
|
||||
int clientProgressiveNumber;
|
||||
int socketDescriptor;
|
||||
|
83
ftpServer.c
83
ftpServer.c
@ -22,8 +22,6 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
@ -39,19 +37,19 @@
|
||||
#include <errno.h>
|
||||
|
||||
/* FTP LIBS */
|
||||
#include "ftpServer.h"
|
||||
#include "ftpData.h"
|
||||
#include "ftpCommandsElaborate.h"
|
||||
|
||||
#include "library/fileManagement.h"
|
||||
#include "library/logFunctions.h"
|
||||
#include "library/configRead.h"
|
||||
#include "library/signals.h"
|
||||
#include "library/openSsl.h"
|
||||
#include "library/connection.h"
|
||||
#include "ftpServer.h"
|
||||
#include "ftpData.h"
|
||||
#include "ftpCommandsElaborate.h"
|
||||
|
||||
ftpDataType ftpData;
|
||||
SSL_CTX *ctx;
|
||||
|
||||
static int processCommand(int processingElement);
|
||||
|
||||
void workerCleanup(void *socketId)
|
||||
@ -85,7 +83,7 @@ void *connectionWorkerHandle(void * socketId)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
tries--;
|
||||
}
|
||||
if (ftpData.clients[theSocketId].workerData.passiveListeningSocket == -1)
|
||||
@ -98,7 +96,7 @@ void *connectionWorkerHandle(void * socketId)
|
||||
if (ftpData.clients[theSocketId].workerData.socketIsConnected == 0)
|
||||
{
|
||||
|
||||
returnCode = dprintf(ftpData.clients[theSocketId].socketDescriptor, "227 Entering Passive Mode (%d,%d,%d,%d,%d,%d)\r\n", ftpData.clients[theSocketId].serverIpAddressInteger[0], ftpData.clients[theSocketId].serverIpAddressInteger[1], ftpData.clients[theSocketId].serverIpAddressInteger[2], ftpData.clients[theSocketId].serverIpAddressInteger[3], (ftpData.clients[theSocketId].workerData.connectionPort / 256), (ftpData.clients[theSocketId].workerData.connectionPort % 256));
|
||||
returnCode = socketPrintf(&ftpData, theSocketId, "sdsdsdsdsdsds", "227 Entering Passive Mode (", ftpData.clients[theSocketId].serverIpAddressInteger[0], ",", ftpData.clients[theSocketId].serverIpAddressInteger[1], ",", ftpData.clients[theSocketId].serverIpAddressInteger[2], ",", ftpData.clients[theSocketId].serverIpAddressInteger[3], ",", (ftpData.clients[theSocketId].workerData.connectionPort / 256), ",", (ftpData.clients[theSocketId].workerData.connectionPort % 256), ")\r\n");
|
||||
if (returnCode <= 0)
|
||||
{
|
||||
ftpData.clients[theSocketId].closeTheClient = 1;
|
||||
@ -130,7 +128,7 @@ void *connectionWorkerHandle(void * socketId)
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
returnCode = dprintf(ftpData.clients[theSocketId].socketDescriptor, "200 connection accepted\r\n");
|
||||
returnCode = socketPrintf(&ftpData, theSocketId, "s", "200 connection accepted\r\n");
|
||||
|
||||
if (returnCode <= 0)
|
||||
{
|
||||
@ -172,8 +170,8 @@ void *connectionWorkerHandle(void * socketId)
|
||||
|
||||
|
||||
if (ftpData.clients[theSocketId].workerData.theStorFile == NULL)
|
||||
{
|
||||
returnCode = dprintf(ftpData.clients[theSocketId].socketDescriptor, "553 Unable to write the file\r\n");
|
||||
{
|
||||
returnCode = socketPrintf(&ftpData, theSocketId, "s", "553 Unable to write the file\r\n");
|
||||
|
||||
if (returnCode <= 0)
|
||||
{
|
||||
@ -185,7 +183,7 @@ void *connectionWorkerHandle(void * socketId)
|
||||
break;
|
||||
}
|
||||
|
||||
returnCode = dprintf(ftpData.clients[theSocketId].socketDescriptor, "150 Accepted data connection\r\n");
|
||||
returnCode = socketPrintf(&ftpData, theSocketId, "s", "150 Accepted data connection\r\n");
|
||||
|
||||
if (returnCode <= 0)
|
||||
{
|
||||
@ -221,7 +219,7 @@ void *connectionWorkerHandle(void * socketId)
|
||||
FILE_doChownFromUidGid(ftpData.clients[theSocketId].fileToStor.text, ftpData.clients[theSocketId].login.ownerShip.uid, ftpData.clients[theSocketId].login.ownerShip.gid);
|
||||
}
|
||||
|
||||
returnCode = dprintf(ftpData.clients[theSocketId].socketDescriptor, "226 file stor ok\r\n");
|
||||
returnCode = socketPrintf(&ftpData, theSocketId, "s", "226 file stor ok\r\n");
|
||||
if (returnCode <= 0)
|
||||
{
|
||||
ftpData.clients[theSocketId].closeTheClient = 1;
|
||||
@ -243,7 +241,7 @@ void *connectionWorkerHandle(void * socketId)
|
||||
else if (compareStringCaseInsensitive(ftpData.clients[theSocketId].workerData.theCommandReceived, "NLST", strlen("NLST")) == 1)
|
||||
theCommandType = COMMAND_TYPE_NLST;
|
||||
|
||||
returnCode = dprintf(ftpData.clients[theSocketId].socketDescriptor, "150 Accepted data connection\r\n");
|
||||
returnCode = socketPrintf(&ftpData, theSocketId, "s", "150 Accepted data connection\r\n");
|
||||
if (returnCode <= 0)
|
||||
{
|
||||
ftpData.clients[theSocketId].closeTheClient = 1;
|
||||
@ -259,7 +257,7 @@ void *connectionWorkerHandle(void * socketId)
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
returnCode = dprintf(ftpData.clients[theSocketId].socketDescriptor, "226 %d matches total\r\n", theFiles);
|
||||
returnCode = socketPrintf(&ftpData, theSocketId, "sds", "226 ", theFiles, " matches total\r\n");
|
||||
if (returnCode <= 0)
|
||||
{
|
||||
ftpData.clients[theSocketId].closeTheClient = 1;
|
||||
@ -273,8 +271,7 @@ void *connectionWorkerHandle(void * socketId)
|
||||
compareStringCaseInsensitive(ftpData.clients[theSocketId].workerData.theCommandReceived, "RETR", strlen("RETR")) == 1)
|
||||
{
|
||||
long long int writenSize = 0, writeReturn = 0;
|
||||
|
||||
writeReturn = dprintf(ftpData.clients[theSocketId].socketDescriptor, "150 Accepted data connection\r\n");
|
||||
writeReturn = socketPrintf(&ftpData, theSocketId, "s", "150 Accepted data connection\r\n");
|
||||
if (writeReturn <= 0)
|
||||
{
|
||||
ftpData.clients[theSocketId].closeTheClient = 1;
|
||||
@ -288,7 +285,7 @@ void *connectionWorkerHandle(void * socketId)
|
||||
|
||||
if (writenSize == -1)
|
||||
{
|
||||
writeReturn = dprintf(ftpData.clients[theSocketId].socketDescriptor, "550 unable to open the file for reading\r\n");
|
||||
writeReturn = socketPrintf(&ftpData, theSocketId, "s", "550 unable to open the file for reading\r\n");
|
||||
|
||||
if (writeReturn <= 0)
|
||||
{
|
||||
@ -299,7 +296,7 @@ void *connectionWorkerHandle(void * socketId)
|
||||
break;
|
||||
}
|
||||
|
||||
writeReturn = dprintf(ftpData.clients[theSocketId].socketDescriptor, "226-File successfully transferred\r\n226 done\r\n");
|
||||
writeReturn = socketPrintf(&ftpData, theSocketId, "s", "226-File successfully transferred\r\n226 done\r\n");
|
||||
|
||||
if (writeReturn <= 0)
|
||||
{
|
||||
@ -328,6 +325,7 @@ void runFtpServer(void)
|
||||
{
|
||||
printf("\nHello uFTP server v%s starting..\n", UFTP_SERVER_VERSION);
|
||||
|
||||
|
||||
/* Needed for Select*/
|
||||
static int processingSock = 0, returnCode = 0;
|
||||
|
||||
@ -434,7 +432,7 @@ void runFtpServer(void)
|
||||
if (commandProcessStatus == FTP_COMMAND_NOT_RECONIZED)
|
||||
{
|
||||
int returnCode = 0;
|
||||
returnCode = dprintf(ftpData.clients[processingSock].socketDescriptor, "500 Unknown command\r\n");
|
||||
returnCode = socketPrintf(&ftpData, processingSock, "s", "500 Unknown command\r\n");
|
||||
if (returnCode < 0)
|
||||
{
|
||||
ftpData.clients[processingSock].closeTheClient = 1;
|
||||
@ -459,7 +457,7 @@ void runFtpServer(void)
|
||||
int returnCode;
|
||||
ftpData.clients[processingSock].commandIndex = 0;
|
||||
memset(ftpData.clients[processingSock].theCommandReceived, 0, CLIENT_COMMAND_STRING_SIZE);
|
||||
returnCode = dprintf(ftpData.clients[processingSock].socketDescriptor, "500 Unknown command\r\n");
|
||||
returnCode = socketPrintf(&ftpData, processingSock, "s", "500 Unknown command\r\n");
|
||||
if (returnCode <= 0)
|
||||
ftpData.clients[processingSock].closeTheClient = 1;
|
||||
|
||||
@ -496,7 +494,7 @@ static int processCommand(int processingElement)
|
||||
compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "QUIT", strlen("QUIT")) != 1 &&
|
||||
compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "AUTH", strlen("AUTH")) != 1))
|
||||
{
|
||||
toReturn = notLoggedInMessage(&ftpData.clients[processingElement]);
|
||||
toReturn = notLoggedInMessage(&ftpData, processingElement);
|
||||
ftpData.clients[processingElement].commandIndex = 0;
|
||||
memset(ftpData.clients[processingElement].theCommandReceived, 0, CLIENT_COMMAND_STRING_SIZE);
|
||||
return 1;
|
||||
@ -506,7 +504,7 @@ static int processCommand(int processingElement)
|
||||
if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "USER", strlen("USER")) == 1)
|
||||
{
|
||||
printf("\nUSER COMMAND RECEIVED");
|
||||
toReturn = parseCommandUser(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandUser(&ftpData, processingElement);
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "PASS", strlen("PASS")) == 1)
|
||||
{
|
||||
@ -516,7 +514,7 @@ static int processCommand(int processingElement)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "SITE", strlen("SITE")) == 1)
|
||||
{
|
||||
printf("\nSITE COMMAND RECEIVED");
|
||||
toReturn = parseCommandSite(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandSite(&ftpData, processingElement);
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "AUTH", strlen("AUTH")) == 1)
|
||||
{
|
||||
@ -567,37 +565,37 @@ static int processCommand(int processingElement)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "PWD", strlen("PWD")) == 1)
|
||||
{
|
||||
printf("\nPWD COMMAND RECEIVED");
|
||||
toReturn = parseCommandPwd(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandPwd(&ftpData, processingElement);
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "SYST", strlen("SYST")) == 1)
|
||||
{
|
||||
printf("\nSYST COMMAND RECEIVED");
|
||||
toReturn = parseCommandSyst(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandSyst(&ftpData, processingElement);
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "FEAT", strlen("FEAT")) == 1)
|
||||
{
|
||||
printf("\nFEAT COMMAND RECEIVED");
|
||||
toReturn = parseCommandFeat(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandFeat(&ftpData, processingElement);
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "TYPE I", strlen("TYPE I")) == 1)
|
||||
{
|
||||
printf("\nTYPE I COMMAND RECEIVED");
|
||||
toReturn = parseCommandTypeI(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandTypeI(&ftpData, processingElement);
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "STRU F", strlen("STRU F")) == 1)
|
||||
{
|
||||
printf("\nTYPE I COMMAND RECEIVED");
|
||||
toReturn = parseCommandStruF(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandStruF(&ftpData, processingElement);
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "MODE S", strlen("MODE S")) == 1)
|
||||
{
|
||||
printf("\nMODE S COMMAND RECEIVED");
|
||||
toReturn = parseCommandModeS(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandModeS(&ftpData, processingElement);
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "TYPE A", strlen("TYPE A")) == 1)
|
||||
{
|
||||
printf("\nTYPE A COMMAND RECEIVED");
|
||||
toReturn = parseCommandTypeI(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandTypeI(&ftpData, processingElement);
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "PASV", strlen("PASV")) == 1)
|
||||
{
|
||||
@ -617,17 +615,17 @@ static int processCommand(int processingElement)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "CWD", strlen("CWD")) == 1)
|
||||
{
|
||||
printf("\nCWD COMMAND RECEIVED");
|
||||
toReturn = parseCommandCwd(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandCwd(&ftpData, processingElement);
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "CDUP", strlen("CDUP")) == 1)
|
||||
{
|
||||
printf("\nCDUP COMMAND RECEIVED");
|
||||
toReturn = parseCommandCdup(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandCdup(&ftpData, processingElement);
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "REST", strlen("REST")) == 1)
|
||||
{
|
||||
printf("\nREST COMMAND RECEIVED");
|
||||
toReturn = parseCommandRest(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandRest(&ftpData, processingElement);
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "RETR", strlen("RETR")) == 1)
|
||||
{
|
||||
@ -642,7 +640,7 @@ static int processCommand(int processingElement)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "MKD", strlen("MKD")) == 1)
|
||||
{
|
||||
printf("\nMKD command received");
|
||||
toReturn = parseCommandMkd(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandMkd(&ftpData, processingElement);
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "ABOR", strlen("ABOR")) == 1)
|
||||
{
|
||||
@ -652,12 +650,12 @@ static int processCommand(int processingElement)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "DELE", strlen("DELE")) == 1)
|
||||
{
|
||||
printf("\nDELE command received");
|
||||
toReturn = parseCommandDele(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandDele(&ftpData, processingElement);
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "OPTS", strlen("OPTS")) == 1)
|
||||
{
|
||||
printf("\nOPTS command received");
|
||||
toReturn = parseCommandOpts(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandOpts(&ftpData, processingElement);
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "MTDM", strlen("MTDM")) == 1)
|
||||
{
|
||||
@ -682,23 +680,23 @@ static int processCommand(int processingElement)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "RMD", strlen("RMD")) == 1)
|
||||
{
|
||||
printf("\nRMD command received");
|
||||
toReturn = parseCommandRmd(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandRmd(&ftpData, processingElement);
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "RNFR", strlen("RNFR")) == 1)
|
||||
{
|
||||
printf("\nRNFR command received");
|
||||
toReturn = parseCommandRnfr(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandRnfr(&ftpData, processingElement);
|
||||
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "RNTO", strlen("RNTO")) == 1)
|
||||
{
|
||||
printf("\nRNTO command received");
|
||||
toReturn = parseCommandRnto(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandRnto(&ftpData, processingElement);
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "SIZE", strlen("SIZE")) == 1)
|
||||
{
|
||||
printf("\nSIZE command received");
|
||||
toReturn = parseCommandSize(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandSize(&ftpData, processingElement);
|
||||
}
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "APPE", strlen("APPE")) == 1)
|
||||
{
|
||||
@ -708,7 +706,7 @@ static int processCommand(int processingElement)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "NOOP", strlen("NOOP")) == 1)
|
||||
{
|
||||
printf("\nNOOP command received");
|
||||
toReturn = parseCommandNoop(&ftpData.clients[processingElement]);
|
||||
toReturn = parseCommandNoop(&ftpData, processingElement);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -720,7 +718,6 @@ static int processCommand(int processingElement)
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
|
||||
void deallocateMemory(void)
|
||||
{
|
||||
printf("\n Deallocating the memory.. ");
|
||||
|
105
key.pem
105
key.pem
@ -1,54 +1,51 @@
|
||||
-----BEGIN ENCRYPTED PRIVATE KEY-----
|
||||
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
|
||||
K2EdyPkehQ1J4kxpT5WkMQ==
|
||||
-----END ENCRYPTED PRIVATE KEY-----
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
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
|
||||
-----END RSA PRIVATE KEY-----
|
||||
|
54
key.pem.cfr
Normal file
54
key.pem.cfr
Normal file
@ -0,0 +1,54 @@
|
||||
-----BEGIN ENCRYPTED PRIVATE KEY-----
|
||||
MIIJnDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIk9UFKRwEjw8CAggA
|
||||
MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECGutkv5IqpwYBIIJSOqHgV8C9ZRY
|
||||
okfTbCG9TxaCwX8Lxy0+7/FK2hpRDv3WwdNN5YYyr7iTUl5EiL2MsBpWshtIpT0H
|
||||
P4ODORNWA1ZbQAYdPvdwsyo+Q1+A9j9Cl02Us9t8D2OSHWjxKzaJJrWgROtHicYP
|
||||
t1V3tgLpQikG8idL9/eIy4os/i3HMZPTRrzs7XfsH5YWQKEcHS0hjJkeZy5uVAKz
|
||||
J2UEiQJBS/DP+bvS0dTyU8JwbXpVjSXFHNWy0a5AhdddXL5etWWaZn+VJaWjvYI6
|
||||
IkOP6bk0V9YcbvLm5rmXoWkQ3ZufFP+T/HU1bFFEpy1H1aV9aE91UBXxQm9ShOIU
|
||||
0f9itc19JUg1P7Z1IK7J3f332Wy2/tjVX/XQ5rQqMrC/qsH9llfBeZshb+2SmNzC
|
||||
vs88hSH4KZ2dAehyUazW4z6RGzH26V+CK2MXc1UV3ocTRvhiMux2XFlni1yyd0hy
|
||||
2uSFT6a2rRPMoVzW0mLzu4qTgFf0vDaihGrJGFZH/WBcSiSvKzSDg86LfO5ZVAWQ
|
||||
JHAdP4il9IraMQo9ugAK/EmkDDGN+d0VnLAmtuwkxAI/QhUGYkGfGIn8FEx8xLpL
|
||||
lGcQqwJQBmd3FL6oOpISvaba+ZeawK7QtUjGiWj7IjahJLdmrnI5W8dLf7l+rQRY
|
||||
VYfv4qvoB5oZLrS7/DGBQs/zNv9uY6pKv4dwoilGkv+hTbAtfMp/VlqhM49mSgdA
|
||||
nNXnRGy0dfG3R8nymcaCXz5gU3VLB7J8Gcmo93L9XKz9LCUjourmCW2u9hDMXBXh
|
||||
La/6F88wOiwhi1ZfLQjMr+eaM0QjVWhrt9GnRl9Qp6qGmiAErnWUeMl2iYnEx0kq
|
||||
PvfmdlMiZpnw4JcErblFR4XWyGwfH9EBpU7t9CLTkqqgW+vJdYBIXisy9AWwJOrB
|
||||
746BiceBwW2HpaEcskeh3DRtLp6FJM7pCUfyfNLzII28/p1z+ZmY8RAro+Nhiv2j
|
||||
SOz4ZvwKTt7CKYmZj6IQw4+fxzysHAV4wYSAGYcztOHnK7PVwqb+kvfmCTfvnnUX
|
||||
BPOULPex7dtzQWuGFGWL0+rpygzvnzD/TWj1DyWCpxCpcPfRGwBU9mWgfMibOJ2Y
|
||||
f52TIlf2EWgHOBJJFlT2WVu2lPTV7V1twtssvDrhvpzP6D3Di3VRnF3aEGkMPW6J
|
||||
Y6iJpMpc3SxcgP2V+0Sgqghw2VsU3BALGVtY7VcSpQXP0FwhuRlYSwz1HuKsnYbs
|
||||
OnGnKTtWBTUYPtW+kPsyQ3CRIPicJrzV3uAEo9SGZvcxSIi06FI7VBjpLeqYv4tU
|
||||
or7PILQrETIgPWr2HRXn/I6Gj9T0I0FwhJFPEVvIAmDRnZs0/j5/QJBLj3CI0jCN
|
||||
nAg6rsjicBKw564+8xPtkWM8/RgSF/t4Wg6Bp6iA2EiPxfCW4BCBqYyMlMTFKy3h
|
||||
RRdXqPCE8j1JFdTlQFw6fjEAq780Uoc6kLi5bDs/mWWaKYII/1Kn7+KT91XDz4Bv
|
||||
pZBTxgIGgkbNGB/drF+I4jRgn8+sPRXBoIItKpQBPxjKnISJ3HUG703XQPxfJo+p
|
||||
nw5/lRw4DafBOY4AIL4dG0aiRT7G6hyrf1jTQgme4k/vRy+WIcxIiSo4lIYA4zqb
|
||||
6E2T55S2fCLmRsZus4f2s7xHf677rCEon2Z44zDhVlmr1C8HXbaitvEWsflSAQ8+
|
||||
kgD2PgqmT/D/GXCikbwyHt1aRJh0ze1rPqnR35gR3giSe+7LXB2KMCq4qVfTbM9s
|
||||
QCLBPc+Xkg7V8B/xGKPvQscsP5ZojVIlQDW03fT9EN8kFFgPuzYMamP48AKly4HT
|
||||
6ADWaVM1u6OpwSK5dxdBUXiNmqCkCEGX8UUXiWSbmsxNjmSUM8DCikCCUf//ZGC1
|
||||
ZuDA6WowQh5l9dPKhAINDof+cjmrojX2YQbXo9QTkTVopEPxeued9abrS+r7w3k7
|
||||
ltwZOb31Ifzx0kx1uFlEKPMX6vL2atFhPPZY4Yg1d97oBVwIlxnUERr4pE/+Bz6y
|
||||
fbDAeyXI9GUWbPLM/tMx3TuCRc1daMQml/8wCj1S5bnWNB7MQiadce9eHc8UZXRv
|
||||
a1NWeJxRElS+TY89ou81CUgwISdu6QUMZwIXITYPFBnMnlh+l1R4JUxB5+PhwZmJ
|
||||
SQUunfXnLhRzCj2ch9dt9bgOVdKm/KuSz0CSwdEtopLyDXZSyvinx/G1jqSUWhlB
|
||||
y6DFwERdLGQcO3srrTpF2B+8IIljdozk+F2tCjCb8Aal01iJ/0Km3MC4czK2wkiV
|
||||
5U0ahcwEgA5lH/5TSUubLlxvSsOTqXGfuyOtk2WLHwDdBCBJcw5y9YrJvJeIFNb0
|
||||
z/5b1p6b2R4vHjt4cQYYvQJ5YiK/yFbEcqNVmC7yiTb4jZifwpfaTVygmU2Yz9wl
|
||||
rArPAERSiCTsce/5DGsW9tqeeHvKSt7wMJeEiuKWvegp8yvOqy57u3nsZv++bx1a
|
||||
N1Y0bqxbc6iW/eUJ7M7ekTJIvM5rAp2aShPlg+fHJnUHddl7RnSo+QyKwTYYeRDw
|
||||
fluSfoMB+F7j42auh7GnOV4Mdpw4CyXW4SbFrsrJiPQx3JXqLCMw9sgw0k/33IVc
|
||||
Zx6Lca9KjUwtgsK0oTUMvvN8M/tL1z17Lf/KKQ7JMw4ANtnQSRARkElLJ7IAhM6K
|
||||
5bHbPaNGr3Uj/r2wrrvAdjbe2uIyAmW8kP65l5Aw1cHh3GNbc23oSfE7yVBeoEHo
|
||||
QVc4GX5waiqtgfjhbb8u+KD+26y3W6wq0clTseTq1tw0qWU3uCJbG/4//nbtf6/e
|
||||
hoR7gux+YRliEqAkVhIQFMtMQNSViAx5liPIwklZ68qKmHQ779C1OUqBwoYSHRUg
|
||||
JzWCLmcAjd1v16na+CRjpyPi7zdEeC2JJq7Aq6Kd6z8mxbHAwd03ZkFaf8NRukh6
|
||||
B1b4G2AwQVFMBKCHV/bourQgmc9HbxquT7BOMQrMtXcCJZ3d8S/xaMqUdgtJcJvY
|
||||
HLJ2pchHH/14crDeE2eUobRt50LEC8aoqn+LeCtJtM8AW1qnPoVUR8ng/jL5ABqw
|
||||
+bEdTualgsLaBay+4VwoaypxAFh1WZKew+2mkoANLFtWWfOB/HazNh442iOsv5g2
|
||||
ptRDth1SZsFhKa0ovi88avQji3zBQWoz7lp9L4W7VR2Y8bR33KHG2T9sTdv/+rxG
|
||||
K2EdyPkehQ1J4kxpT5WkMQ==
|
||||
-----END ENCRYPTED PRIVATE KEY-----
|
@ -34,10 +34,119 @@
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
|
||||
#include "../ftpData.h"
|
||||
#include "connection.h"
|
||||
|
||||
|
||||
|
||||
int socketPrintf(ftpDataType * ftpData, int clientId, const char *__restrict __fmt, ...)
|
||||
{
|
||||
#define SOCKET_PRINTF_BUFFER 2048
|
||||
|
||||
int bytesWritten = 0;
|
||||
char theBuffer[2048];
|
||||
int theStringSize = 0;
|
||||
memset(&theBuffer, 0, SOCKET_PRINTF_BUFFER);
|
||||
printf("\nWriting to socket id %d: ", clientId);
|
||||
|
||||
va_list args;
|
||||
va_start(args, __fmt);
|
||||
//pthread_mutex_lock(&ftpData->clients[clientId].writeMutex);
|
||||
|
||||
while (*__fmt != '\0')
|
||||
{
|
||||
theStringSize = 0;
|
||||
switch(*__fmt)
|
||||
{
|
||||
case 'd':
|
||||
case 'D':
|
||||
{
|
||||
int theInteger = va_arg(args, int);
|
||||
memset(&theBuffer, 0, SOCKET_PRINTF_BUFFER);
|
||||
theStringSize = snprintf(theBuffer, SOCKET_PRINTF_BUFFER, "%d", theInteger);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
case 'C':
|
||||
{
|
||||
int theCharInteger = va_arg(args, int);
|
||||
memset(&theBuffer, 0, SOCKET_PRINTF_BUFFER);
|
||||
theStringSize = snprintf(theBuffer, SOCKET_PRINTF_BUFFER, "%c", theCharInteger);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
case 'F':
|
||||
{
|
||||
float theDouble = va_arg(args, double);
|
||||
memset(&theBuffer, 0, SOCKET_PRINTF_BUFFER);
|
||||
theStringSize = snprintf(theBuffer, SOCKET_PRINTF_BUFFER, "%f", theDouble);
|
||||
}
|
||||
break;
|
||||
|
||||
case 's':
|
||||
case 'S':
|
||||
{
|
||||
char * theString = va_arg(args, char *);
|
||||
memset(&theBuffer, 0, SOCKET_PRINTF_BUFFER);
|
||||
theStringSize = snprintf(theBuffer, SOCKET_PRINTF_BUFFER, "%s", theString);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'l':
|
||||
case 'L':
|
||||
{
|
||||
long long int theLongLongInt = va_arg(args, long long int);
|
||||
memset(&theBuffer, 0, SOCKET_PRINTF_BUFFER);
|
||||
theStringSize = snprintf(theBuffer, SOCKET_PRINTF_BUFFER, "%lld", theLongLongInt);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
printf("\n Switch is default (%c)", *__fmt);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (theStringSize >= SOCKET_PRINTF_BUFFER) {
|
||||
printf("\n String buffer is full!");
|
||||
}
|
||||
else if (theStringSize < SOCKET_PRINTF_BUFFER &&
|
||||
theStringSize > 0)
|
||||
{
|
||||
int theReturnCode = 0;
|
||||
theReturnCode = write(ftpData->clients[clientId].socketDescriptor, theBuffer, theStringSize);
|
||||
printf("%s", theBuffer);
|
||||
|
||||
if (theReturnCode > 0)
|
||||
{
|
||||
bytesWritten += theReturnCode;
|
||||
}
|
||||
else
|
||||
{
|
||||
bytesWritten = theReturnCode;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(theStringSize == 0)
|
||||
{
|
||||
printf("\n Nothing to write.. ");
|
||||
}
|
||||
|
||||
++__fmt;
|
||||
}
|
||||
|
||||
//pthread_mutex_unlock(&ftpData->clients[clientId].writeMutex);
|
||||
va_end(args);
|
||||
return bytesWritten;
|
||||
}
|
||||
|
||||
|
||||
/* Return the higher socket available*/
|
||||
int getMaximumSocketFd(int mainSocket, ftpDataType * ftpData)
|
||||
{
|
||||
@ -381,12 +490,16 @@ int evaluateClientSocketConnection(ftpDataType * ftpData)
|
||||
if (ftpData->ftpParameters.maximumConnectionsPerIp > 0 &&
|
||||
numberOfConnectionFromSameIp >= ftpData->ftpParameters.maximumConnectionsPerIp)
|
||||
{
|
||||
dprintf(ftpData->clients[availableSocketIndex].socketDescriptor, "530 too many connection from your ip address %s \r\n", ftpData->clients[availableSocketIndex].clientIpAddress);
|
||||
int theReturnCode = socketPrintf(ftpData, availableSocketIndex, "sss", "530 too many connection from your ip address ", ftpData->clients[availableSocketIndex].clientIpAddress, " \r\n");
|
||||
ftpData->clients[availableSocketIndex].closeTheClient = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
write(ftpData->clients[availableSocketIndex].socketDescriptor, ftpData->welcomeMessage, strlen(ftpData->welcomeMessage));
|
||||
int returnCode = socketPrintf(&ftpData, availableSocketIndex, "s", ftpData->welcomeMessage);
|
||||
if (returnCode <= 0)
|
||||
{
|
||||
ftpData->clients[availableSocketIndex].closeTheClient = 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
@ -48,7 +48,7 @@ int selectWait(ftpDataType * ftpData);
|
||||
int isClientConnected(ftpDataType * ftpData, int cliendId);
|
||||
int getAvailableClientSocketIndex(ftpDataType * ftpData);
|
||||
int evaluateClientSocketConnection(ftpDataType * ftpData);
|
||||
|
||||
int socketPrintf(ftpDataType * ftpData, int clientId, const char *__restrict __fmt, ...);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
Reference in New Issue
Block a user