LIST and NLST with -a and -A tested

This commit is contained in:
root
2024-04-20 09:49:29 +02:00
parent dfb525fca7
commit e8002fa094
4 changed files with 97 additions and 4 deletions

View File

@ -676,6 +676,91 @@ int parseCommandList(ftpDataType *data, int socketId)
return FTP_COMMAND_PROCESSED;
}
int parseCommandStat(ftpDataType *data, int socketId)
{
return FTP_COMMAND_NOT_RECONIZED;
/*
-A List all files except "." and ".."
-a List all files including those whose names start with "."
*/
int isSafePath = 0;
int returnCode = 0;
char *theNameToList;
if(!data->clients[socketId].workerData.socketIsReadyForConnection)
{
returnCode = socketPrintf(data, socketId, "s", "425 Use PORT or PASV first.\r\n");
if (returnCode <= 0)
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
return FTP_COMMAND_PROCESSED;
}
cleanDynamicStringDataType(&data->clients[socketId].workerData.ftpCommand.commandArgs, 0, &data->clients[socketId].workerData.memoryTable);
cleanDynamicStringDataType(&data->clients[socketId].workerData.ftpCommand.commandOps, 0, &data->clients[socketId].workerData.memoryTable);
theNameToList = getFtpCommandArg("LIST", data->clients[socketId].theCommandReceived, 1);
getFtpCommandArgWithOptions("LIST", data->clients[socketId].theCommandReceived, &data->clients[socketId].workerData.ftpCommand, &data->clients[socketId].workerData.memoryTable);
if (data->clients[socketId].workerData.ftpCommand.commandArgs.text != NULL)
my_printf("\nLIST COMMAND ARG: %s", data->clients[socketId].workerData.ftpCommand.commandArgs.text);
if (data->clients[socketId].workerData.ftpCommand.commandOps.text != NULL)
my_printf("\nLIST COMMAND OPS: %s", data->clients[socketId].workerData.ftpCommand.commandOps.text);
cleanDynamicStringDataType(&data->clients[socketId].listPath, 0, &data->clients[socketId].memoryTable);
if (strnlen(theNameToList, 1) > 0)
{
isSafePath = getSafePath(&data->clients[socketId].listPath, theNameToList, &data->clients[socketId].login, &data->clients[socketId].memoryTable);
}
if (isSafePath == 0)
{
cleanDynamicStringDataType(&data->clients[socketId].listPath, 0, &data->clients[socketId].memoryTable);
setDynamicStringDataType(&data->clients[socketId].listPath, data->clients[socketId].login.absolutePath.text, data->clients[socketId].login.absolutePath.textLen, &data->clients[socketId].memoryTable);
}
if(FILE_IsDirectory(data->clients[socketId].listPath.text) == 0 && FILE_IsFile(data->clients[socketId].listPath.text) == 0)
{
my_printf("\nLIST path not file or directoy: %s ", data->clients[socketId].listPath.text);
cleanDynamicStringDataType(&data->clients[socketId].listPath, 0, &data->clients[socketId].memoryTable);
setDynamicStringDataType(&data->clients[socketId].listPath, data->clients[socketId].login.absolutePath.text, data->clients[socketId].login.absolutePath.textLen, &data->clients[socketId].memoryTable);
returnCode = socketPrintf(data, socketId, "s", "550 wrong path\r\n");
if (returnCode <= 0)
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
return FTP_COMMAND_PROCESSED;
}
if ((checkUserFilePermissions(data->clients[socketId].listPath.text, data->clients[socketId].login.ownerShip.uid, data->clients[socketId].login.ownerShip.gid) & FILE_PERMISSION_R) != FILE_PERMISSION_R)
{
cleanDynamicStringDataType(&data->clients[socketId].listPath, 0, &data->clients[socketId].memoryTable);
setDynamicStringDataType(&data->clients[socketId].listPath, data->clients[socketId].login.absolutePath.text, data->clients[socketId].login.absolutePath.textLen, &data->clients[socketId].memoryTable);
returnCode = socketPrintf(data, socketId, "s", "550 no permissions.\r\n");
if (returnCode <= 0)
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
return FTP_COMMAND_PROCESSED;
}
pthread_mutex_lock(&data->clients[socketId].conditionMutex);
memset(data->clients[socketId].workerData.theCommandReceived, 0, CLIENT_COMMAND_STRING_SIZE+1);
strncpy(data->clients[socketId].workerData.theCommandReceived, data->clients[socketId].theCommandReceived, CLIENT_COMMAND_STRING_SIZE);
data->clients[socketId].workerData.commandReceived = 1;
pthread_cond_signal(&data->clients[socketId].conditionVariable);
pthread_mutex_unlock(&data->clients[socketId].conditionMutex);
return FTP_COMMAND_PROCESSED;
}
int parseCommandNlst(ftpDataType *data, int socketId)
{
int isSafePath = 0;
@ -696,7 +781,8 @@ int parseCommandNlst(ftpDataType *data, int socketId)
cleanDynamicStringDataType(&data->clients[socketId].workerData.ftpCommand.commandArgs, 0, &data->clients[socketId].workerData.memoryTable);
cleanDynamicStringDataType(&data->clients[socketId].workerData.ftpCommand.commandOps, 0, &data->clients[socketId].workerData.memoryTable);
theNameToNlist = getFtpCommandArg("NLIST", data->clients[socketId].theCommandReceived, 1);
theNameToNlist = getFtpCommandArg("NLST", data->clients[socketId].theCommandReceived, 1);
getFtpCommandArgWithOptions("NLST", data->clients[socketId].theCommandReceived, &data->clients[socketId].workerData.ftpCommand, &data->clients[socketId].workerData.memoryTable);
cleanDynamicStringDataType(&data->clients[socketId].listPath, 0, &data->clients[socketId].memoryTable);
my_printf("\nNLIST COMMAND ARG: %s", data->clients[socketId].workerData.ftpCommand.commandArgs.text);

View File

@ -70,6 +70,7 @@ int parseCommandPasv(ftpDataType * data, int socketId);
int parseCommandEpsv(ftpDataType * data, int socketId);
int parseCommandPort(ftpDataType * data, int socketId);
int parseCommandList(ftpDataType * data, int socketId);
int parseCommandStat(ftpDataType *data, int socketId);
int parseCommandNlst(ftpDataType * data, int socketId);
int parseCommandRetr(ftpDataType * data, int socketId);
int parseCommandMkd(ftpDataType * data, int socketId);

View File

@ -843,6 +843,11 @@ static int processCommand(int processingElement)
//my_printf("\nLIST COMMAND RECEIVED");
toReturn = parseCommandList(&ftpData, processingElement);
}
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "STAT", strlen("STAT")) == 1)
{
//my_printf("\nSTAT COMMAND RECEIVED");
toReturn = parseCommandStat(&ftpData, processingElement);
}
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "CDUP", strlen("CDUP")) == 1 ||
compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "XCUP", strlen("XCUP")) == 1 ||
compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "CWD ..", strlen("CWD ..")) == 1)

View File

@ -223,11 +223,12 @@ void FILE_GetDirectoryInodeList(char * DirectoryInodeName, char *** InodeList, i
{
while ((dir = readdir(TheDirectory)) != NULL)
{
if ( dir->d_name[0] == '.' && strnlen(dir->d_name, 2) == 1)
//
if ((dir->d_name[0] == '.' && strnlen(dir->d_name, 2) == 1) && (commandOps == NULL || commandOps[0] != 'a'))
continue;
if ( dir->d_name[0] == '.' && dir->d_name[1] == '.' && strnlen(dir->d_name, 3) == 2)
//
if ((dir->d_name[0] == '.' && dir->d_name[1] == '.' && strnlen(dir->d_name, 3) == 2) && (commandOps == NULL || commandOps[0] != 'a'))
continue;
//Skips all files and dir starting with .