mirror of
https://github.com/kingk85/uFTP.git
synced 2025-04-12 10:48:40 +03:00
working on ipv6 preliminary implementation okay
This commit is contained in:
8
Makefile
8
Makefile
@ -16,7 +16,7 @@ ENDFLAG=
|
||||
#ENDFLAG=-static
|
||||
|
||||
#FOR RELEASE
|
||||
CFLAGSTEMP=-c -Wall -I.
|
||||
CFLAGSTEMP=-c -Wall -Wno-unused-variable -Wno-unused-but-set-variable -I.
|
||||
|
||||
OPTIMIZATION=-O3
|
||||
HEADERS=-I
|
||||
@ -33,13 +33,17 @@ ENABLE_OPENSSL_SUPPORT=
|
||||
ENABLE_OPENSSL_SUPPORT=-D OPENSSL_ENABLED
|
||||
LIBS=-lpthread -lssl -lcrypto
|
||||
|
||||
|
||||
ENABLE_IPV6_SUPPORT=
|
||||
ENABLE_IPV6_SUPPORT=-D IPV6_ENABLED
|
||||
|
||||
ENABLE_PAM_SUPPORT=
|
||||
PAM_AUTH_LIB=
|
||||
#TO ENABLE PAM AUTH UNCOMMENT NEXT TWO LINES
|
||||
#ENABLE_PAM_SUPPORT= -D PAM_SUPPORT_ENABLED
|
||||
#PAM_AUTH_LIB= -lpam
|
||||
|
||||
CFLAGS=$(CFLAGSTEMP) $(ENABLE_LARGE_FILE_SUPPORT) $(ENABLE_OPENSSL_SUPPORT) $(ENABLE_PAM_SUPPORT)
|
||||
CFLAGS=$(CFLAGSTEMP) $(ENABLE_LARGE_FILE_SUPPORT) $(ENABLE_OPENSSL_SUPPORT) $(ENABLE_IPV6_SUPPORT) $(ENABLE_PAM_SUPPORT)
|
||||
|
||||
all: $(BUILDFILES)
|
||||
|
||||
|
@ -546,8 +546,19 @@ int parseCommandPasv(ftpDataType *data, int socketId)
|
||||
void *pReturn;
|
||||
int returnCode;
|
||||
// my_printf("\n data->clients[%d].workerData.workerThread = %d",socketId, (int)data->clients[socketId].workerData.workerThread);
|
||||
|
||||
// my_printf("\n data->clients[%d].workerData.threadHasBeenCreated = %d", socketId, data->clients[socketId].workerData.threadHasBeenCreated);
|
||||
|
||||
if(data->ftpParameters.serverIsIpV6 == 1)
|
||||
{
|
||||
returnCode = socketPrintf(data, socketId, "s", "500 Server use IPV6, use EPSV instead.\r\n");
|
||||
|
||||
if (returnCode <= 0)
|
||||
{
|
||||
addLog("socketPrintfError ", CURRENT_FILE, CURRENT_LINE, CURRENT_FUNC);
|
||||
return FTP_COMMAND_PROCESSED_WRITE_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
if (data->clients[socketId].workerData.threadIsAlive == 1)
|
||||
{
|
||||
cancelWorker(data, socketId);
|
||||
|
@ -42,6 +42,8 @@
|
||||
#include "library/dynamicMemory.h"
|
||||
|
||||
#include "debugHelper.h"
|
||||
#include "library/log.h"
|
||||
|
||||
|
||||
static int is_prefix(const char *str, const char *prefix);
|
||||
static char *my_realpath(const char *path, char *resolved_path);
|
||||
@ -368,7 +370,7 @@ int writeListDataInfoToSocket(ftpDataType *ftpData, int clientId, int *filesNumb
|
||||
my_printf("\n ********************** void inode permission string");
|
||||
}
|
||||
|
||||
if (data.isLink = 1 &&
|
||||
if (data.isLink == 1 &&
|
||||
data.inodePermissionString != NULL &&
|
||||
strlen(data.inodePermissionString) > 0 &&
|
||||
data.inodePermissionString[0] == 'l')
|
||||
@ -382,6 +384,7 @@ int writeListDataInfoToSocket(ftpDataType *ftpData, int clientId, int *filesNumb
|
||||
FILE_AppendToString(&data.finalStringPath, " -> ", memoryTable);
|
||||
FILE_AppendToString(&data.finalStringPath, data.linkPath, memoryTable);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
memset(data.lastModifiedDataString, 0, LIST_DATA_TYPE_MODIFIED_DATA_STR_SIZE);
|
||||
@ -811,10 +814,6 @@ void resetClientData(ftpDataType *data, int clientId, int isInitialization)
|
||||
data->clients[clientId].closeTheClient = 0;
|
||||
data->clients[clientId].sockaddr_in_size = sizeof(struct sockaddr_in);
|
||||
data->clients[clientId].sockaddr_in_server_size = sizeof(struct sockaddr_in);
|
||||
data->clients[clientId].serverIpAddressInteger[0] = 0;
|
||||
data->clients[clientId].serverIpAddressInteger[1] = 0;
|
||||
data->clients[clientId].serverIpAddressInteger[2] = 0;
|
||||
data->clients[clientId].serverIpAddressInteger[3] = 0;
|
||||
|
||||
|
||||
memset(&data->clients[clientId].client_sockaddr_in, 0, data->clients[clientId].sockaddr_in_size);
|
||||
|
@ -87,7 +87,9 @@ struct usersParameters
|
||||
|
||||
struct ftpParameters
|
||||
{
|
||||
int ftpIpAddress[4];
|
||||
int ftpIpAddressV4[4];
|
||||
int serverIsIpV6;
|
||||
int serverIpSet;
|
||||
int port;
|
||||
int maxClients;
|
||||
int daemonModeOn;
|
||||
@ -184,6 +186,7 @@ struct clientData
|
||||
SSL *ssl;
|
||||
#endif
|
||||
|
||||
int isIpV6;
|
||||
int tlsIsEnabled;
|
||||
int tlsIsNegotiating;
|
||||
unsigned long long int tlsNegotiatingTimeStart;
|
||||
@ -214,7 +217,7 @@ struct clientData
|
||||
loginDataType login;
|
||||
workerDataType workerData;
|
||||
|
||||
int sockaddr_in_size, sockaddr_in_server_size;
|
||||
socklen_t sockaddr_in_size, sockaddr_in_server_size;
|
||||
struct sockaddr_in6 client_sockaddr_in, server_sockaddr_in;
|
||||
|
||||
int clientPort;
|
||||
@ -222,7 +225,7 @@ struct clientData
|
||||
|
||||
int serverPort;
|
||||
char serverIpAddress[INET6_ADDRSTRLEN];
|
||||
int serverIpAddressInteger[4];
|
||||
int serverIpV4AddressInteger[4];
|
||||
ftpCommandDataType ftpCommand;
|
||||
int closeTheClient;
|
||||
|
||||
|
@ -167,7 +167,7 @@ void *connectionWorkerHandle(void * socketId)
|
||||
else
|
||||
{
|
||||
my_printf("\n Using server ip: %s", ftpData.ftpParameters.natIpAddress);
|
||||
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");
|
||||
returnCode = socketPrintf(&ftpData, theSocketId, "sdsdsdsdsdsds", "227 Entering Passive Mode (", ftpData.clients[theSocketId].serverIpV4AddressInteger[0], ",", ftpData.clients[theSocketId].serverIpV4AddressInteger[1], ",", ftpData.clients[theSocketId].serverIpV4AddressInteger[2], ",", ftpData.clients[theSocketId].serverIpV4AddressInteger[3], ",", (ftpData.clients[theSocketId].workerData.connectionPort / 256), ",", (ftpData.clients[theSocketId].workerData.connectionPort % 256), ")\r\n");
|
||||
}
|
||||
}
|
||||
else if (ftpData.clients[theSocketId].workerData.passiveModeOn == 1 && ftpData.clients[theSocketId].workerData.extendedPassiveModeOn == 1)
|
||||
|
@ -528,7 +528,7 @@ static int parseConfigurationFile(ftpParameters_DataType *ftpParameters, DYNV_Ve
|
||||
searchIndex = searchParameter("SERVER_IP", parametersVector);
|
||||
if (searchIndex != -1)
|
||||
{
|
||||
strncpy(&ftpParameters->natIpAddress, ((parameter_DataType *) parametersVector->Data[searchIndex])->value, STRING_SZ_SMALL);
|
||||
strncpy(ftpParameters->natIpAddress, ((parameter_DataType *) parametersVector->Data[searchIndex])->value, STRING_SZ_SMALL);
|
||||
my_printf("\n SERVER_IP parameter:%s", ftpParameters->natIpAddress);
|
||||
}
|
||||
else
|
||||
@ -552,10 +552,10 @@ static int parseConfigurationFile(ftpParameters_DataType *ftpParameters, DYNV_Ve
|
||||
searchIndex = searchParameter("FTP_SERVER_IP", parametersVector);
|
||||
if (searchIndex != -1)
|
||||
{
|
||||
sscanf (((parameter_DataType *) parametersVector->Data[searchIndex])->value,"%d.%d.%d.%d", &ftpParameters->ftpIpAddress[0],
|
||||
&ftpParameters->ftpIpAddress[1],
|
||||
&ftpParameters->ftpIpAddress[2],
|
||||
&ftpParameters->ftpIpAddress[3]);
|
||||
sscanf (((parameter_DataType *) parametersVector->Data[searchIndex])->value,"%d.%d.%d.%d", &ftpParameters->ftpIpAddressV4[0],
|
||||
&ftpParameters->ftpIpAddressV4[1],
|
||||
&ftpParameters->ftpIpAddressV4[2],
|
||||
&ftpParameters->ftpIpAddressV4[3]);
|
||||
//my_printf("\nFTP_SERVER_IP value: %d.%d.%d.%d", ftpParameters->ftpIpAddress[0],
|
||||
// ftpParameters->ftpIpAddress[1],
|
||||
// ftpParameters->ftpIpAddress[2],
|
||||
@ -563,10 +563,10 @@ static int parseConfigurationFile(ftpParameters_DataType *ftpParameters, DYNV_Ve
|
||||
}
|
||||
else
|
||||
{
|
||||
ftpParameters->ftpIpAddress[0] = 127;
|
||||
ftpParameters->ftpIpAddress[1] = 0;
|
||||
ftpParameters->ftpIpAddress[2] = 0;
|
||||
ftpParameters->ftpIpAddress[3] = 1;
|
||||
ftpParameters->ftpIpAddressV4[0] = 127;
|
||||
ftpParameters->ftpIpAddressV4[1] = 0;
|
||||
ftpParameters->ftpIpAddressV4[2] = 0;
|
||||
ftpParameters->ftpIpAddressV4[3] = 1;
|
||||
//my_printf("\nFTP_SERVER_IP parameter not found in the configuration file, listening on all available networks");
|
||||
}
|
||||
|
||||
|
@ -744,7 +744,7 @@ int evaluateClientSocketConnection(ftpDataType * ftpData)
|
||||
ftpData->clients[availableSocketIndex].sockaddr_in_server_size = sizeof(ftpData->clients[availableSocketIndex].server_sockaddr_in);
|
||||
ftpData->clients[availableSocketIndex].sockaddr_in_size = sizeof(ftpData->clients[availableSocketIndex].client_sockaddr_in);
|
||||
|
||||
getpeername(ftpData->clients[availableSocketIndex].socketDescriptor, (struct sockaddr_in6 *)&ftpData->clients[availableSocketIndex].client_sockaddr_in, &ftpData->clients[availableSocketIndex].sockaddr_in_size);
|
||||
getpeername(ftpData->clients[availableSocketIndex].socketDescriptor, (struct sockaddr *)&ftpData->clients[availableSocketIndex].client_sockaddr_in, &ftpData->clients[availableSocketIndex].sockaddr_in_size);
|
||||
if(inet_ntop(AF_INET6, &ftpData->clients[availableSocketIndex].client_sockaddr_in.sin6_addr, ftpData->clients[availableSocketIndex].clientIpAddress, sizeof(ftpData->clients[availableSocketIndex].clientIpAddress)))
|
||||
{
|
||||
ftpData->clients[availableSocketIndex].clientPort = (int) ntohs(ftpData->clients[availableSocketIndex].client_sockaddr_in.sin6_port);
|
||||
@ -752,35 +752,44 @@ int evaluateClientSocketConnection(ftpDataType * ftpData)
|
||||
printf("\n--> Client port is %d\n", ftpData->clients[availableSocketIndex].clientPort);
|
||||
}
|
||||
|
||||
getsockname(ftpData->clients[availableSocketIndex].socketDescriptor, (struct sockaddr_in6 *)&ftpData->clients[availableSocketIndex].server_sockaddr_in, &ftpData->clients[availableSocketIndex].sockaddr_in_server_size);
|
||||
if(inet_ntop(AF_INET6, &ftpData->clients[availableSocketIndex].server_sockaddr_in.sin6_addr, ftpData->clients[availableSocketIndex].serverIpAddress, sizeof(ftpData->clients[availableSocketIndex].serverIpAddress)))
|
||||
if (ftpData->ftpParameters.serverIpSet == 0)
|
||||
{
|
||||
printf("\n--> Server ip address is %s\n", ftpData->clients[availableSocketIndex].serverIpAddress);
|
||||
getsockname(ftpData->clients[availableSocketIndex].socketDescriptor, (struct sockaddr *)&ftpData->clients[availableSocketIndex].server_sockaddr_in, &ftpData->clients[availableSocketIndex].sockaddr_in_server_size);
|
||||
if(inet_ntop(AF_INET6, &ftpData->clients[availableSocketIndex].server_sockaddr_in.sin6_addr, ftpData->clients[availableSocketIndex].serverIpAddress, sizeof(ftpData->clients[availableSocketIndex].serverIpAddress)))
|
||||
{
|
||||
printf("\n--> Server ip address is %s\n", ftpData->clients[availableSocketIndex].serverIpAddress);
|
||||
}
|
||||
|
||||
if (ftpData->clients[availableSocketIndex].server_sockaddr_in.sin6_family == AF_INET6 && IN6_IS_ADDR_V4MAPPED(&ftpData->clients[availableSocketIndex].server_sockaddr_in.sin6_addr))
|
||||
{
|
||||
|
||||
printf("\nServer is IPv4-mapped IPv6 address");
|
||||
sscanf (ftpData->clients[availableSocketIndex].serverIpAddress,"::ffff:%d.%d.%d.%d", &ftpData->clients[availableSocketIndex].serverIpV4AddressInteger[0],
|
||||
&ftpData->clients[availableSocketIndex].serverIpV4AddressInteger[1],
|
||||
&ftpData->clients[availableSocketIndex].serverIpV4AddressInteger[2],
|
||||
&ftpData->clients[availableSocketIndex].serverIpV4AddressInteger[3]);
|
||||
printf("\nServer ip saved: %d.%d.%d.%d", ftpData->clients[availableSocketIndex].serverIpV4AddressInteger[0], ftpData->clients[availableSocketIndex].serverIpV4AddressInteger[1], ftpData->clients[availableSocketIndex].serverIpV4AddressInteger[2], ftpData->clients[availableSocketIndex].serverIpV4AddressInteger[3]);
|
||||
}
|
||||
else
|
||||
{
|
||||
ftpData->ftpParameters.serverIsIpV6 = 1;
|
||||
printf("\nServer is ipv6");
|
||||
}
|
||||
|
||||
ftpData->ftpParameters.serverIpSet = 1;
|
||||
}
|
||||
|
||||
|
||||
if (ftpData->clients[availableSocketIndex].server_sockaddr_in.sin6_family == AF_INET6 && IN6_IS_ADDR_V4MAPPED(&ftpData->clients[availableSocketIndex].server_sockaddr_in.sin6_addr))
|
||||
{
|
||||
printf("\nServer is IPv4-mapped IPv6 address");
|
||||
sscanf (ftpData->clients[availableSocketIndex].serverIpAddress,"::ffff:%d.%d.%d.%d", &ftpData->clients[availableSocketIndex].serverIpAddressInteger[0],
|
||||
&ftpData->clients[availableSocketIndex].serverIpAddressInteger[1],
|
||||
&ftpData->clients[availableSocketIndex].serverIpAddressInteger[2],
|
||||
&ftpData->clients[availableSocketIndex].serverIpAddressInteger[3]);
|
||||
printf("\nServer ip saved: %d.%d.%d.%d", ftpData->clients[availableSocketIndex].serverIpAddressInteger[0], ftpData->clients[availableSocketIndex].serverIpAddressInteger[1], ftpData->clients[availableSocketIndex].serverIpAddressInteger[2], ftpData->clients[availableSocketIndex].serverIpAddressInteger[3]);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\nServer is ipv6");
|
||||
}
|
||||
|
||||
// Check if it's an IPv4-mapped address
|
||||
if (ftpData->clients[availableSocketIndex].client_sockaddr_in.sin6_family == AF_INET6 && IN6_IS_ADDR_V4MAPPED(&ftpData->clients[availableSocketIndex].client_sockaddr_in.sin6_addr))
|
||||
{
|
||||
printf("\nClient connected from IPv4-mapped IPv6 address: ");
|
||||
ftpData->clients[availableSocketIndex].isIpV6 = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\nClient connected from ipv6");
|
||||
ftpData->clients[availableSocketIndex].isIpV6 = 1;
|
||||
}
|
||||
|
||||
|
||||
@ -828,8 +837,9 @@ int evaluateClientSocketConnection(ftpDataType * ftpData)
|
||||
}
|
||||
else
|
||||
{
|
||||
int socketRefuseFd, socketRefuse_in_size;
|
||||
int socketRefuseFd;
|
||||
struct sockaddr_in6 socketRefuse_sockaddr_in;
|
||||
socklen_t socketRefuse_in_size = sizeof(socketRefuse_sockaddr_in);
|
||||
if ((socketRefuseFd = accept(ftpData->connectionData.theMainSocket, (struct sockaddr *)&socketRefuse_sockaddr_in, &socketRefuse_in_size))!=-1)
|
||||
{
|
||||
int theReturnCode = 0;
|
||||
|
@ -204,7 +204,7 @@ int FILE_IsLink( char* path)
|
||||
}
|
||||
|
||||
/* Check if a file is valid */
|
||||
int FILE_IsFile(const char *TheFileName, int checkExist)
|
||||
int FILE_IsFile(char *TheFileName, int checkExist)
|
||||
{
|
||||
FILE *TheFile;
|
||||
|
||||
@ -750,7 +750,7 @@ char * FILE_GetGroupOwner(char *fileName, DYNMEM_MemoryTable_DataType **memoryTa
|
||||
}
|
||||
|
||||
|
||||
char * FILE_AppendStringToFile(char *fileName, char *theString)
|
||||
void FILE_AppendStringToFile(char *fileName, char *theString)
|
||||
{
|
||||
FILE *fp = fopen(fileName, "a");
|
||||
if (fp == NULL)
|
||||
|
@ -58,7 +58,7 @@
|
||||
long long int FILE_GetFileSize(FILE *theFilePointer);
|
||||
long int FILE_GetAvailableSpace(const char* ThePath);
|
||||
long long int FILE_GetFileSizeFromPath(char *TheFileName);
|
||||
int FILE_IsFile(const char *theFileName, int checkExist);
|
||||
int FILE_IsFile(char *theFileName, int checkExist);
|
||||
int FILE_IsDirectory (char *directory_path, int checkExist);
|
||||
int FILE_IsLink (char *directory_path);
|
||||
void FILE_GetDirectoryInodeList(char * DirectoryInodeName, char *** InodeList, int * filesandfolders, int recursive, char* commandOps, int checkIfInodeExist, DYNMEM_MemoryTable_DataType ** memoryTable);
|
||||
@ -71,7 +71,7 @@
|
||||
char * FILE_GetListPermissionsString(char *file, DYNMEM_MemoryTable_DataType ** memoryTable);
|
||||
char * FILE_GetOwner(char *fileName, DYNMEM_MemoryTable_DataType ** memoryTable);
|
||||
char * FILE_GetGroupOwner(char *fileName, DYNMEM_MemoryTable_DataType ** memoryTable);
|
||||
char * FILE_AppendStringToFile(char *fileName, char *theString);
|
||||
void FILE_AppendStringToFile(char *fileName, char *theString);
|
||||
time_t FILE_GetLastModifiedData(char *path);
|
||||
void FILE_AppendToString(char ** sourceString, char *theString, DYNMEM_MemoryTable_DataType ** memoryTable);
|
||||
void FILE_DirectoryToParent(char ** sourceString, DYNMEM_MemoryTable_DataType ** memoryTable);
|
||||
|
@ -181,7 +181,7 @@ static void *logThread(void * arg)
|
||||
if (strftime(dayString, sizeof(dayString), "%d", info) == 0)
|
||||
{
|
||||
my_printfError("strftime error");
|
||||
return -1;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
day = atoi(dayString);
|
||||
@ -195,7 +195,7 @@ static void *logThread(void * arg)
|
||||
if (strftime(logName, sizeof(logName), LOG_FILENAME_PREFIX"%Y-%m-%d", info) == 0)
|
||||
{
|
||||
my_printfError("strftime error");
|
||||
return -1;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
strncpy(theLogFilename, logFolder, PATH_MAX);
|
||||
|
@ -33,7 +33,7 @@
|
||||
#include "openSsl.h"
|
||||
#include "fileManagement.h"
|
||||
#include "../debugHelper.h"
|
||||
|
||||
#include "log.h"
|
||||
|
||||
|
||||
#define MUTEX_TYPE pthread_mutex_t
|
||||
|
@ -30,6 +30,7 @@
|
||||
|
||||
#include "../ftpServer.h"
|
||||
#include "../debugHelper.h"
|
||||
#include "log.h"
|
||||
|
||||
static void ignore_sigpipe(void);
|
||||
|
||||
|
Reference in New Issue
Block a user