From fb7917a71189e392d8558500d51e4b1f14ace910 Mon Sep 17 00:00:00 2001 From: Ugo Cirmignani Date: Tue, 4 Dec 2018 21:50:28 +0100 Subject: [PATCH] TLS almost ok --- build/modules/connection.o | Bin 50656 -> 50752 bytes build/modules/ftpCommandElaborate.o | Bin 70448 -> 70672 bytes build/modules/ftpData.o | Bin 44072 -> 44072 bytes build/modules/ftpServer.o | Bin 56448 -> 57360 bytes build/uFTP | Bin 189440 -> 189456 bytes ftpCommandElaborate.c | 19 +++++++---- ftpCommandsElaborate.h | 2 +- ftpData.c | 9 +++-- ftpServer.c | 51 +++++++++++++++++++++------- library/connection.c | 5 ++- 10 files changed, 58 insertions(+), 28 deletions(-) diff --git a/build/modules/connection.o b/build/modules/connection.o index 7066c7bd0bf079e0f1dad5073e67357767a9eef7..62c0fac61db848d94720ae957437ec72a7acb515 100644 GIT binary patch delta 7310 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 VrqXAj;$+&eqaDJg3utHj{{R3dZ*%|v delta 7156 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 diff --git a/build/modules/ftpServer.o b/build/modules/ftpServer.o index 1c71db436971041e8550bb90fb9ff096bdb456bd..46125a5c3090c379db04ac13e0df28880b9b0060 100644 GIT binary patch delta 13070 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 WXWEeyVC(73sP2b7w%w3lmHZ#rN9C*l diff --git a/build/uFTP b/build/uFTP index f6864a09e7b48b50765ce52d820eda994a739b36..e611b6095a0bede7b01844bba110143e2aa73694 100755 GIT binary patch delta 31225 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 delta 30919 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[theSocketId].fileToRetr.text, "rb"); #endif #ifndef LARGE_FILE_SUPPORT_ENABLED #warning LARGE FILE SUPPORT IS NOT ENABLED! - retrFP = fopen(theFilename, "rb"); + retrFP = fopen(data->clients[theSocketId].fileToRetr.text, "rb"); #endif if (retrFP == NULL) @@ -1208,7 +1208,6 @@ long long int writeRetrFile(char * theFilename, int thePasvSocketConnection, lon if (startFrom > 0) { - #ifdef LARGE_FILE_SUPPORT_ENABLED //#warning LARGE FILE SUPPORT IS ENABLED! currentPosition = (long long int) lseek64(fileno(retrFP), startFrom, SEEK_SET); @@ -1229,8 +1228,16 @@ long long int writeRetrFile(char * theFilename, int thePasvSocketConnection, lon while ((readen = (long long int) fread(buffer, sizeof(char), FTP_COMMAND_ELABORATE_CHAR_BUFFER, retrFP)) > 0) { - writtenSize = write(thePasvSocketConnection, buffer, readen); - + + if (data->clients[theSocketId].dataChannelIsTls != 1) + { + writtenSize = write(data->clients[theSocketId].workerData.socketConnection, buffer, readen); + } + else + { + writtenSize = SSL_write(data->clients[theSocketId].workerData.ssl, buffer, readen); + } + if (writtenSize <= 0) { fclose(retrFP); diff --git a/ftpCommandsElaborate.h b/ftpCommandsElaborate.h index 1bb997c..1268617 100644 --- a/ftpCommandsElaborate.h +++ b/ftpCommandsElaborate.h @@ -85,7 +85,7 @@ 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); +long long int writeRetrFile(ftpDataType * data, int theSocketId, long long int startFrom, FILE *retrFP); char *getFtpCommandArg(char * theCommand, char *theCommandString, int skipArgs); int getFtpCommandArgWithOptions(char * theCommand, char *theCommandString, ftpCommandDataType *ftpCommand); int setPermissions(char * permissionsCommand, char * basePath, ownerShip_DataType ownerShip); diff --git a/ftpData.c b/ftpData.c index a4d85d0..b8b7f6d 100644 --- a/ftpData.c +++ b/ftpData.c @@ -592,7 +592,6 @@ void resetWorkerData(ftpDataType *data, int clientId, int isInitialization) #ifdef OPENSSL_ENABLED SSL_free(data->clients[clientId].workerData.ssl); #endif - } else { @@ -623,11 +622,9 @@ void resetWorkerData(ftpDataType *data, int clientId, int isInitialization) data->clients[clientId].workerData.directoryInfo.Destroy(&data->clients[clientId].workerData.directoryInfo, deleteListDataInfoVector); free(lastToDestroy); } - #ifdef OPENSSL_ENABLED - data->clients[clientId].ssl = SSL_new(data->ctx); + data->clients[clientId].workerData.ssl = SSL_new(data->ctx); #endif - } void resetClientData(ftpDataType *data, int clientId, int isInitialization) @@ -651,6 +648,7 @@ void resetClientData(ftpDataType *data, int clientId, int isInitialization) #ifdef OPENSSL_ENABLED SSL_free(data->clients[clientId].ssl); + //SSL_free(data->clients[clientId].workerData.ssl); #endif } @@ -699,7 +697,8 @@ void resetClientData(ftpDataType *data, int clientId, int isInitialization) data->clients[clientId].lastActivityTimeStamp = 0; #ifdef OPENSSL_ENABLED - data->clients[clientId].workerData.ssl = SSL_new(data->ctx); + //data->clients[clientId].workerData.ssl = SSL_new(data->ctx); + data->clients[clientId].ssl = SSL_new(data->ctx); #endif } diff --git a/ftpServer.c b/ftpServer.c index a5277b2..2ecc256 100644 --- a/ftpServer.c +++ b/ftpServer.c @@ -53,14 +53,30 @@ static int processCommand(int processingElement); void workerCleanup(void *socketId) { - int theSocketId = *(int *)socketId; - //printf("\nClosing pasv socket (%d) ok!", theSocketId); + int theSocketId = *(int *)socketId; + int returnCode = 0; + #ifdef OPENSSL_ENABLED - if (ftpData.clients[theSocketId].dataChannelIsTls == 1) - { - printf("\nSSL worker Shutdown!"); - SSL_shutdown(ftpData.clients[theSocketId].workerData.ssl); - } + if (ftpData.clients[theSocketId].dataChannelIsTls == 1) + { + printf("\nSSL worker Shutdown 1"); + returnCode = SSL_shutdown(ftpData.clients[theSocketId].workerData.ssl); + printf(" return code : %d", returnCode); + + if (returnCode < 0) + { + printf("SSL_shutdown failed return code %d", returnCode); + } + else if (returnCode == 0) + { + returnCode = SSL_shutdown(ftpData.clients[theSocketId].workerData.ssl); + + if (returnCode <= 0) + { + printf("SSL_shutdown (2nd time) failed"); + } + } + } #endif shutdown(ftpData.clients[theSocketId].workerData.socketConnection, SHUT_RDWR); @@ -190,7 +206,6 @@ void *connectionWorkerHandle(void * socketId) ftpData.clients[theSocketId].workerData.theStorFile = fopen(ftpData.clients[theSocketId].fileToStor.text, "wb"); #endif - if (ftpData.clients[theSocketId].workerData.theStorFile == NULL) { returnCode = socketPrintf(&ftpData, theSocketId, "s", "553 Unable to write the file\r\n"); @@ -216,8 +231,19 @@ void *connectionWorkerHandle(void * socketId) while(1) { - ftpData.clients[theSocketId].workerData.bufferIndex = read(ftpData.clients[theSocketId].workerData.socketConnection, ftpData.clients[theSocketId].workerData.buffer, CLIENT_BUFFER_STRING_SIZE); - + if (ftpData.clients[theSocketId].dataChannelIsTls != 1) + { + ftpData.clients[theSocketId].workerData.bufferIndex = read(ftpData.clients[theSocketId].workerData.socketConnection, ftpData.clients[theSocketId].workerData.buffer, CLIENT_BUFFER_STRING_SIZE); + } + else if (ftpData.clients[theSocketId].dataChannelIsTls == 1) + { + ftpData.clients[theSocketId].workerData.bufferIndex = SSL_read(ftpData.clients[theSocketId].workerData.ssl, ftpData.clients[theSocketId].workerData.buffer, CLIENT_BUFFER_STRING_SIZE); + } + else + { + printf("\nError state"); + } + if (ftpData.clients[theSocketId].workerData.bufferIndex == 0) { break; @@ -234,8 +260,7 @@ void *connectionWorkerHandle(void * socketId) } fclose(ftpData.clients[theSocketId].workerData.theStorFile); ftpData.clients[theSocketId].workerData.theStorFile = NULL; - - + if (ftpData.clients[theSocketId].login.ownerShip.ownerShipSet == 1) { FILE_doChownFromUidGid(ftpData.clients[theSocketId].fileToStor.text, ftpData.clients[theSocketId].login.ownerShip.uid, ftpData.clients[theSocketId].login.ownerShip.gid); @@ -303,7 +328,7 @@ void *connectionWorkerHandle(void * socketId) } - writenSize = writeRetrFile(ftpData.clients[theSocketId].fileToRetr.text, ftpData.clients[theSocketId].workerData.socketConnection, ftpData.clients[theSocketId].workerData.retrRestartAtByte, ftpData.clients[theSocketId].workerData.theStorFile); + writenSize = writeRetrFile(&ftpData, theSocketId, ftpData.clients[theSocketId].workerData.retrRestartAtByte, ftpData.clients[theSocketId].workerData.theStorFile); ftpData.clients[theSocketId].workerData.retrRestartAtByte = 0; if (writenSize == -1) diff --git a/library/connection.c b/library/connection.c index 81a3182..08212b3 100644 --- a/library/connection.c +++ b/library/connection.c @@ -50,7 +50,7 @@ int socketPrintf(ftpDataType * ftpData, int clientId, const char *__restrict __f char theBuffer[2048]; int theStringSize = 0; memset(&theBuffer, 0, SOCKET_PRINTF_BUFFER); - printf("\nWriting to socket id %d: ", clientId); + printf("\nWriting to socket id %d, TLS %d: ", clientId, ftpData->clients[clientId].tlsIsEnabled); va_list args; va_start(args, __fmt); @@ -165,8 +165,7 @@ int socketWorkerPrintf(ftpDataType * ftpData, int clientId, const char *__restri char theBuffer[2048]; int theStringSize = 0; memset(&theBuffer, 0, SOCKET_PRINTF_BUFFER); - printf("\nWriting to worker socket id %d: ", clientId); - + printf("\nWriting to worker socket id %dd, TLS %d: ", clientId, ftpData->clients[clientId].dataChannelIsTls); va_list args; va_start(args, __fmt); while (*__fmt != '\0')