uFTP/ftpData.c
2018-01-27 11:59:49 -08:00

354 lines
12 KiB
C

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
#include "ftpServer.h"
#include "ftpCommandsElaborate.h"
#include "ftpData.h"
#include "library/fileManagement.h"
void cleanDynamicStringDataType(dynamicStringDataType *dynamicString, int init)
{
if (init == 1)
{
dynamicString->text = 0;
dynamicString->textLen = 0;
}
else
{
if (dynamicString->textLen != 0)
{
if (dynamicString->text != 0) {
free(dynamicString->text);
}
}
dynamicString->textLen = 0;
}
}
void cleanLoginData(loginDataType *loginData, int init)
{
loginData->userLoggedIn = 0;
cleanDynamicStringDataType(&loginData->homePath, init);
cleanDynamicStringDataType(&loginData->ftpPath, init);
cleanDynamicStringDataType(&loginData->name, init);
cleanDynamicStringDataType(&loginData->password, init);
cleanDynamicStringDataType(&loginData->absolutePath, init);
}
void setDynamicStringDataType(dynamicStringDataType *dynamicString, char *theString, int stringLen)
{
if (dynamicString->textLen == 0)
{
dynamicString->text = (char *) malloc ((sizeof(char) * stringLen) + 1);
memset(dynamicString->text, 0, stringLen + 1);
memcpy(dynamicString->text, theString, stringLen);
dynamicString->textLen = stringLen;
}
else
{
if(stringLen != dynamicString->textLen) {
dynamicString->text = (char *) realloc (dynamicString->text, (sizeof(char) * stringLen) + 1);
}
memset(dynamicString->text, 0, stringLen + 1);
memcpy(dynamicString->text, theString, stringLen);
dynamicString->textLen = stringLen;
}
}
int getSafePath(dynamicStringDataType *safePath, char *theDirectoryName, loginDataType *loginData)
{
int theLen, i;
if (theDirectoryName == NULL)
return 0;
theLen = strlen(theDirectoryName);
if (theLen <= 0)
return 0;
if (theLen == 2 &&
theDirectoryName[0] == '.' &&
theDirectoryName[1] == '.')
{
return 0;
}
if (theLen == 3 &&
((theDirectoryName[0] == '.' &&
theDirectoryName[1] == '.' &&
theDirectoryName[2] == '/') ||
(theDirectoryName[0] == '/' &&
theDirectoryName[1] == '.' &&
theDirectoryName[2] == '.')
)
)
{
return 0;
}
//Check for /../
char theDirectoryToCheck[2048];
int theDirectoryToCheckIndex = 0;
memset(theDirectoryToCheck, 0, 2048);
for (i = 0; i< theLen; i++)
{
if (theDirectoryName[i] == '/')
{
if (theDirectoryToCheckIndex == 2 &&
theDirectoryToCheck[0] == '.' &&
theDirectoryToCheck[1] == '.')
{
return 0;
}
theDirectoryToCheckIndex = 0;
memset(theDirectoryToCheck, 0, 2048);
continue;
}
if (theDirectoryToCheckIndex<2048)
theDirectoryToCheck[theDirectoryToCheckIndex++] = theDirectoryName[i];
else
return 0; /* Directory size too long */
}
if (theDirectoryName[0] == '/')
{
setDynamicStringDataType(safePath, loginData->homePath.text, loginData->homePath.textLen);
appendToDynamicStringDataType(safePath, theDirectoryName, strlen(theDirectoryName));
}
else
{
setDynamicStringDataType(safePath, loginData->absolutePath.text, loginData->absolutePath.textLen);
appendToDynamicStringDataType(safePath, "/", 1);
appendToDynamicStringDataType(safePath, theDirectoryName, strlen(theDirectoryName));
}
return 1;
}
void appendToDynamicStringDataType(dynamicStringDataType *dynamicString, char *theString, int stringLen)
{
printf("\n Appending in %s --> %s", dynamicString->text, theString);
int theNewSize = dynamicString->textLen + stringLen;
dynamicString->text = realloc(dynamicString->text, theNewSize + 1);
memset(dynamicString->text+dynamicString->textLen, 0, stringLen+1);
memcpy(dynamicString->text+dynamicString->textLen, theString, stringLen);
dynamicString->text[theNewSize] = '\0';
dynamicString->textLen = theNewSize;
printf("\n Append done --> %s", dynamicString->text);
}
void setRandomicPort(ftpDataType *data, int socketPosition)
{
static unsigned short int randomizeInteger = 0;
unsigned short int randomicPort = 5000;
int i;
time_t t;
randomizeInteger += 7;
if (randomizeInteger > 50000 )
randomizeInteger = 1;
/* Intializes random number generator */
srand( time(NULL));
randomicPort = ((rand() + socketPosition + randomizeInteger) % (10000 - 50000)) + 10000;
i = 0;
printf("randomicPort = %d", randomicPort);
while (i < data->ftpParameters.maxClients)
{
if (randomicPort == data->clients[i].pasvData.passivePort)
{
printf("randomicPort already in use = %d", randomicPort);
randomicPort = ((rand() + socketPosition + i + randomizeInteger) % (10000 - 50000)) + 10000;
i = 0;
}
else
{
i++;
}
}
data->clients[socketPosition].pasvData.passivePort = randomicPort;
}
void getListDataInfo(char * thePath, DYNV_VectorGenericDataType *directoryInfo)
{
//printf("\ngetListDataInfo address: %lX", directoryInfo);
int i;
int fileAndFoldersCount = 0;
ftpListDataType data;
data.fileList = NULL;
//printf("\nThePath = %s", thePath);
FILE_GetDirectoryInodeList(thePath, &data.fileList, &fileAndFoldersCount, 0);
for (i = 0; i < fileAndFoldersCount; i++)
{
data.numberOfSubDirectories = 1; /* to Do*/
if (FILE_IsDirectory(data.fileList[i]) == 1)
{
data.isDirectory = 1;
data.isFile = 0;
data.fileSize = 4096;
}
else if (FILE_IsFile(data.fileList[i]) == 1)
{
data.isDirectory = 0;
data.isFile = 1;
data.fileSize = FILE_GetFileSizeFromPath(data.fileList[i]);
}
data.owner = FILE_GetOwner(data.fileList[i]);
data.groupOwner = FILE_GetGroupOwner(data.fileList[i]);
data.fileNameWithPath = data.fileList[i];
data.fileNameNoPath = FILE_GetFilenameFromPath(data.fileList[i]);
data.inodePermissionString = FILE_GetListPermissionsString(data.fileList[i]);
data.lastModifiedData = FILE_GetLastModifiedData(data.fileList[i]);
memset(data.lastModifiedDataString, 0, LIST_DATA_TYPE_MODIFIED_DATA_STR_SIZE);
strftime(data.lastModifiedDataString, 80, "%b %d %Y", localtime(&data.lastModifiedData));
/*
%a Abbreviated weekday name Sun
%A Full weekday name Sunday
%b Abbreviated month name Mar
%B Full month name March
%c Date and time representation Sun Aug 19 02:56:02 2012
%d Day of the month (01-31) 19
%H Hour in 24h format (00-23) 14
%I Hour in 12h format (01-12) 05
%j Day of the year (001-366) 231
%m Month as a decimal number (01-12) 08
%M Minute (00-59) 55
%p AM or PM designation PM
%S Second (00-61) 02
%U Week number with the first Sunday as the first day of week one (00-53) 33
%w Weekday as a decimal number with Sunday as 0 (0-6) 4
%W Week number with the first Monday as the first day of week one (00-53) 34
%x Date representation 08/19/12
%X Time representation 02:50:06
%y Year, last two digits (00-99) 01
%Y Year 2012
%Z Timezone name or abbreviation CDT
%% A % sign %
*/
/*
printf("\n\ndata.numberOfSubDirectories = %d", data.numberOfSubDirectories);
printf("\ndata.isDirectory = %d", data.isDirectory);
printf("\ndata.isFile = %d", data.isFile);
printf("\ndata.fileSize = %d", data.fileSize);
printf("\ndata.owner = %s", data.owner);
printf("\ndata.groupOwner = %s", data.groupOwner);
printf("\ndata.fileNameWithPath = %s", data.fileNameWithPath);
printf("\ndata.fileNameNoPath = %s", data.fileNameNoPath);
printf("\ndata.inodePermissionString = %s", data.inodePermissionString);
printf("\ndata.lastModifiedDataString = %s", data.lastModifiedDataString);
*/
directoryInfo->PushBack(directoryInfo, &data, sizeof(ftpListDataType));
}
/*printf("\n\ntotal %d", directoryInfo->Size);
for (i = 0; i < directoryInfo->Size; i++)
{
printf("\n%s %d %s %s %d %s %s", ((ftpListDataType *)directoryInfo->Data[i])->inodePermissionString
,((ftpListDataType *)directoryInfo->Data[i])->numberOfSubDirectories
,((ftpListDataType *)directoryInfo->Data[i])->owner
,((ftpListDataType *)directoryInfo->Data[i])->groupOwner
,((ftpListDataType *)directoryInfo->Data[i])->fileSize
,((ftpListDataType *)directoryInfo->Data[i])->lastModifiedDataString
,((ftpListDataType *)directoryInfo->Data[i])->fileNameNoPath);
}*/
}
void deleteListDataInfoVector(void *TheElementToDelete)
{
ftpListDataType *data = (ftpListDataType *)TheElementToDelete;
/*
printf("\nDeleteListData Address of TheElementToDelete = %lX", TheElementToDelete);
printf("\n\nDeleting element\ndata.numberOfSubDirectories = %d", data->numberOfSubDirectories);
printf("\ndata.isDirectory = %d", data->isDirectory);
printf("\ndata.isFile = %d", data->isFile);
printf("\ndata.fileSize = %d", data->fileSize);
printf("\ndata.owner = %s", data->owner);
printf("\ndata.groupOwner = %s", data->groupOwner);
printf("\ndata.fileNameWithPath = %s", data->fileNameWithPath);
printf("\ndata.fileNameNoPath = %s", data->fileNameNoPath);
printf("\ndata.inodePermissionString = %s", data->inodePermissionString);
printf("\ndata.lastModifiedDataString = %s", data->lastModifiedDataString);
*/
free(data->owner);
free(data->groupOwner);
free(data->inodePermissionString);
free(data->fileNameWithPath);
}
void resetPasvData(passiveDataType *pasvData, int isInitialization)
{
pasvData->passivePort = 0;
pasvData->threadIsBusy = 0;
pasvData->passiveModeOn = 0;
pasvData->passiveSocketIsConnected = 0;
pasvData->commandIndex = 0;
pasvData->passiveSocket = 0;
pasvData->passiveSocketConnection = 0;
pasvData->bufferIndex = 0;
pasvData->commandReceived = 0;
pasvData->retrRestartAtByte = 0;
pasvData->threadIsAlive = 0;
memset(pasvData->buffer, 0, CLIENT_BUFFER_STRING_SIZE);
memset(pasvData->theCommandReceived, 0, CLIENT_BUFFER_STRING_SIZE);
cleanDynamicStringDataType(&pasvData->theFileNameToStor, isInitialization);
/* wait main for action */
if (isInitialization != 1)
{
pthread_mutex_destroy(&pasvData->conditionMutex);
pthread_cond_destroy(&pasvData->conditionVariable);
}
pthread_mutex_init(&pasvData->conditionMutex, NULL);
pthread_cond_init(&pasvData->conditionVariable, NULL);
}
void resetClientData(clientDataType *clientData, int isInitialization)
{
clientData->socketDescriptor = 0;
clientData->socketCommandReceived = 0;
clientData->socketIsConnected = 0;
clientData->bufferIndex = 0;
clientData->commandIndex = 0;
memset(clientData->buffer, 0, CLIENT_BUFFER_STRING_SIZE);
memset(clientData->theCommandReceived, 0, CLIENT_COMMAND_STRING_SIZE);
cleanLoginData(&clientData->login, isInitialization);
//Rename from and to data init
cleanDynamicStringDataType(&clientData->renameFromFile, isInitialization);
cleanDynamicStringDataType(&clientData->renameToFile, isInitialization);
}