diff --git a/dep/client.c b/dep/client.c index ffd70b8..ad7881f 100644 --- a/dep/client.c +++ b/dep/client.c @@ -1,115 +1,13 @@ #include "client.h" - - - - - -void CLIENT_REQUEST(char* serverHost, char* serverPort, char* pRequest, char** pAnswer){ - if( DEBUGMOD&HDR ) printf("====== CLIENT_REQUEST(%s, %s, %s, %s) ======\n\n", serverHost, serverPort, pRequest, *pAnswer); - - struct addrinfo hints; // contiendra le filtre/format - struct addrinfo* addrinfo; // contiendra les infos - int SOCKET, CONNECT; // file_desc(s) - char BUFFER[maxBuffLen]; // BUFFER de communication - // char pAnswer[maxBuffLen] = {0}; // on vide la réponse (contiendra la réponse du serveur) - - /* [1] On définit le filtre/format - =======================================================*/ - memset(&hints, 0, sizeof(struct addrinfo)); // on vide le filtre - hints.ai_family = AF_UNSPEC; // Allow IPv4 ou IPv6 - hints.ai_socktype = SOCK_STREAM; // TCP (SOCK_DGRAM = UDP) - hints.ai_flags = 0; // non spécifié - hints.ai_protocol = 0; // non spécifié - - if( DEBUGMOD&SCK ) printf("============HINTS===========\n"); - if( DEBUGMOD&SCK ) printf( "AI_FLAGS = %d\n", hints.ai_flags ); // int - if( DEBUGMOD&SCK ) printf( "AI_FAMILY = %d\n", hints.ai_family ); // int - if( DEBUGMOD&SCK ) printf( "AI_SOCKTYPE = %d\n", hints.ai_socktype ); // int - if( DEBUGMOD&SCK ) printf( "AI_PROTOCOL = %d\n", hints.ai_protocol ); // int - if( DEBUGMOD&SCK ) printf( "AI_ADDRLEN = %d\n", hints.ai_addrlen ); // int - if( DEBUGMOD&SCK ) printf("\n"); - - - /* [2] On récupère les infos - =======================================================*/ - getaddrinfo(serverHost, serverPort, &hints, &addrinfo); - - if( DEBUGMOD&SCK ) printf("=============RES============\n"); - if( DEBUGMOD&SCK ) printf( "AI_FLAGS = %d\n", addrinfo->ai_flags ); // int - if( DEBUGMOD&SCK ) printf( "AI_FAMILY = %d\n", addrinfo->ai_family ); // int - if( DEBUGMOD&SCK ) printf( "AI_SOCKTYPE = %d\n", addrinfo->ai_socktype ); // int - if( DEBUGMOD&SCK ) printf( "AI_PROTOCOL = %d\n", addrinfo->ai_protocol ); // int - if( DEBUGMOD&SCK ) printf( "AI_ADDRLEN = %d\n", addrinfo->ai_addrlen ); // int - if( DEBUGMOD&SCK ) printf("\n"); - - /* [3] Création de la socket - =======================================================*/ - SOCKET = socket(addrinfo->ai_family, addrinfo->ai_socktype, 0); - - if( DEBUGMOD&SCK ) printf("SOCKET = %d\n", SOCKET); - - // si erreur - if( SOCKET == -1 ) return; - - /* [4] On établit la connection - =======================================================*/ - CONNECT = connect( - SOCKET, - addrinfo->ai_addr, - addrinfo->ai_addrlen - ); - - if( DEBUGMOD&SCK ) printf("CONNECT = %d\n", CONNECT); - - // si erreur - if( CONNECT == -1 ) return; - - // on a plus besoin des infos de l'adresse - freeaddrinfo(addrinfo); - - - /* [5] On écrit sur la socket - =======================================================*/ - int nbSend = swrite(&SOCKET, pRequest); - - if( DEBUGMOD&BUF ) printf("nbSend: %d\n", nbSend); - if( DEBUGMOD&BUF ) printf("Message: %s\n", pRequest); - - // si pas tout envoyé - if( strlen(pRequest) != nbSend ) return; - - /* [6] On lit la réponse - =======================================================*/ - // memset(BUFFER, '\0', sizeof(BUFFER)); // on vide le buffer - int nbRecup = sread(&SOCKET, BUFFER); - - *pAnswer = malloc( maxBuffLen ); - strcpy(*pAnswer, BUFFER); - - if( DEBUGMOD&BUF ) printf("nbReceived: %d\n", nbRecup); - if( DEBUGMOD&BUF ) printf("Message: %s\n", *pAnswer); - - - /* [7] On ferme la connection - =======================================================*/ - int closeState = close(SOCKET); - - // if( closeState == -1 ) return; -} - - - - -void CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){ - if( DEBUGMOD&HDR ) printf("====== INIT_CLIENT(%s, %s, %d) ======\n\n", serverHost, serverPort, *pSocket); +int CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){ + if( DEBUGMOD&HDR ) printf("====== CONNECT_CLIENT(%s, %s, %d) ======\n\n", serverHost, serverPort, *pSocket); struct addrinfo hints; // contiendra le filtre/format struct addrinfo* addrinfo; // contiendra les infos int CONNECT; // file_desc(s) - char BUFFER[maxBuffLen]; // BUFFER de communication - // char pAnswer[maxBuffLen] = {0}; // on vide la réponse (contiendra la réponse du serveur) + char BUFFER[maxBuffLen]; // BUFFER de communication /* [1] On définit le filtre/format =======================================================*/ @@ -147,7 +45,7 @@ void CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){ if( DEBUGMOD&SCK ) printf("SOCKET = %d\n", *pSocket); // si erreur - if( *pSocket == -1 ) return; + if( *pSocket == -1 ) return -1; /* [4] On établit la connection =======================================================*/ @@ -160,15 +58,17 @@ void CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){ if( DEBUGMOD&SCK ) printf("CONNECT = %d\n", CONNECT); // si erreur - if( CONNECT == -1 ) return; + if( CONNECT == -1 ) return -1; // on a plus besoin des infos de l'adresse - freeaddrinfo(addrinfo); + freeaddrinfo(addrinfo); + + return *pSocket; } -void CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer){ +int CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer){ if( DEBUGMOD&HDR ) printf("====== CLIENT_SEND(%d, %s, %s) ======\n\n", *pSocket, pRequest, *pAnswer); char BUFFER[maxBuffLen] = {0}; @@ -180,7 +80,7 @@ void CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer){ if( DEBUGMOD&BUF ) printf("Message: %s\n", pRequest); // si pas tout envoyé - if( strlen(pRequest) != nbSend ) return; + if( strlen(pRequest) != nbSend ) return -1; /* [6] On lit la réponse =======================================================*/ diff --git a/dep/client.h b/dep/client.h index 7b87ec1..afb1fa0 100644 --- a/dep/client.h +++ b/dep/client.h @@ -2,16 +2,13 @@ * * @serverHost Nom de l'hôte distant (server) * @serverPort Numéro du port distant (server) -* @pRequest Requête à envoyer au serveur +* @pSocket Pointeur sur la requête à créer * -* @pAnswer Pointeur sur le à remplir => contiendra la réponse du serveur -* +* +* @return error retourne -1 en cas d'erreur, sinon la SOCKET */ -void CLIENT_REQUEST(char* serverHost, char* serverPort, char* pRequest, char** pAnswer); +int CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket); - -void CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket); - - -void CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer); \ No newline at end of file +// retourne -1 en cas d'erreur +int CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer); \ No newline at end of file diff --git a/dep/server.c b/dep/server.c index 8227183..ce3f000 100644 --- a/dep/server.c +++ b/dep/server.c @@ -127,30 +127,71 @@ void DROP_SERVER(char* serverHost, char** givenPort, int* listenSocket){ // CMD: CLIENT (SRV) PROXY (CLT) FTP // DTA: CLIENT (CLT) PROXY (CLT) FTP // -void MANAGE_REQUEST(char* pRequest, int* DUSER_SOCKET, int* DFTP_SOCKET){ - if( DEBUGMOD&HDR ) printf("====== MANAGE_REQUEST(%s, %d, %d) ======\n\n", pRequest, *DUSER_SOCKET, *DFTP_SOCKET); +void MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET){ + if( DEBUGMOD&HDR ) printf("====== MANAGE_REQUEST(%s, %d, %d, %d, %d) ======\n\n", pRequest, *USER_SOCKET, *FTP_SOCKET, *DUSER_SOCKET, *DFTP_SOCKET); - char answer[maxBuffLen]; // contiendra la réponse + + char response[maxBuffLen]; // contiendra la réponse int nbSend; // contiendra le nombre de données envoyées - char rCommand[10]; // contiendra les commandes (1ère partie) + char rCommand[5]; // contiendra les commandes (1ère partie) char rContent[maxBuffLen]; // contiendra le contenu associé à la commande (2ème partie) // on vide les buffers memset(&rCommand, '\0', sizeof(rCommand)); memset(&rContent, '\0', sizeof(rContent)); - memset(&answer, '\0', sizeof(answer)); + memset(&response, '\0', sizeof(response)); /* [1] On découpe la requête en 2 parties ================================================*/ splitFtpRequest(pRequest, rCommand, rContent); + /* [2] Selection en fonction de @rCommand ================================================*/ - /* (1) PORT a1,a2,a3,a4,p1,p2 => utilisateur (actif) + /* (1) USER username@serveur => connection FTP (commande) --------------------------------------------*/ - if( strcmp(rCommand, "PORT") == 0 ){ + if( strcmp(rCommand, "USER") == 0 && indexOf(rContent, '@') >= 0 ){ + char userName[maxBuffLen] = {0}; + char hostName[maxHostLen] = {0}; + + sscanf(rContent, "%[^@]@%s\r\n", userName, hostName); + + + if( DEBUGMOD&BUF ) printf("USERNAME [[%s]]\n", userName); + if( DEBUGMOD&BUF ) printf("HOSTNAME [[%s]]\n", hostName); + + /* On se connecte au serveur FTP (commandes) */ + CONNECT_CLIENT(hostName, FTP_PORT, FTP_SOCKET); + if( *FTP_SOCKET == -1 ) printf("CAN'T CONNECT TO GIVEN SERVER!!\n"); + + if( DEBUGMOD&SCK ) printf("FTP SOCKET CONNECTED AT %s:%s\n", hostName, FTP_PORT); + + /* On envoie la séquence d'initialisation */ + char BUFFER[maxBuffLen] = {0}; + char* ftp_response; ftp_response = malloc(maxBuffLen); + memset(ftp_response, 0, maxBuffLen); + + strcpy(BUFFER, "\r\n"); + CLIENT_SEND(FTP_SOCKET, BUFFER, &ftp_response); + + if( DEBUGMOD&CMD ) xPrint("P->F: %s\n\n", BUFFER); + if( DEBUGMOD&CMD ) xPrint("F->P: %s\n", ftp_response); + + // char BUFF[maxBuffLen] = {0}; + // strcpy(BUFF, ""); + // swrite(FTP_SOCKET, BUFF); + // sread(FTP_SOCKET, BUFF); + // swrite(USER_SOCKET, strcat(BUFF, "\r\n")); + + strcpy(response, "USER xdrm\r\n"); + printf("RESP: [[%s]]\n", response); + } + + /* (2) PORT a1,a2,a3,a4,p1,p2 => utilisateur (actif) + --------------------------------------------*/ + else if( strcmp(rCommand, "PORT") == 0 ){ int a1, a2, a3, a4 = 0; int p1, p2 = 0; @@ -171,19 +212,23 @@ void MANAGE_REQUEST(char* pRequest, int* DUSER_SOCKET, int* DFTP_SOCKET){ if( DEBUGMOD&SCK ) printf("CONNECTED TO CLIENT %s:%s\n", serverHost, serverPort); // on envoie PASV car on veut être en mode passif entre le proxy et le serveur FTP - strcpy(pRequest, "PASV\r\n"); + strcpy(response, "PASV\r\n"); } - // WAIT_SOCKET_UPDATE(DFTP_SOCKET, BUFFER); - // xPrint("FTPLIST: %s\n", BUFFER); - /* [3] Envoi de la réponse + /* (n) Si aucun traitement on recopie la requête telquel + --------------------------------------------*/ + else + strcpy(response, pRequest); + + /* [3] Retour de la réponse ================================================*/ + strcpy(pRequest, response); } -void MANAGE_RESPONSE(int* USER_SOCKET, int* FTP_SOCKET, char* pAnswer, int* DUSER_SOCKET, int* DFTP_SOCKET){ - if( DEBUGMOD&HDR ) printf("====== MANAGE_RESPONSE(%d, %s, %d, %d) ======\n\n", *USER_SOCKET, pAnswer, *DUSER_SOCKET, *DFTP_SOCKET); +void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET){ + if( DEBUGMOD&HDR ) printf("====== MANAGE_RESPONSE(%s, %d, %d, %d, %d) ======\n\n", pAnswer, *USER_SOCKET, *FTP_SOCKET, *DUSER_SOCKET, *DFTP_SOCKET); char response[maxBuffLen]; // contiendra la réponse char ftpCodeStr[4]; // contiendra le code FTP (1ère partie) diff --git a/dep/server.h b/dep/server.h index e3ee8dd..980dbf4 100644 --- a/dep/server.h +++ b/dep/server.h @@ -13,6 +13,8 @@ void DROP_SERVER(char* serverHost, char** givenPort, int* listenSocket); /* Gestion de la requête du client * * @pBuffer Requête en question +* @USER_SOCKET Pointeur sur la SOCKET du BUS DE COMMANDES utilisateur +* @FTP_SOCKET Pointeur sur la SOCKET du BUS DE COMMANDES FTP * @DUSER_SOCKET Pointeur sur la SOCKET du BUS DE DONNEES utilisateur * @DFTP_SOCKET Pointeur sur la SOCKET du BUS DE DONNEES FTP * @@ -21,13 +23,15 @@ void DROP_SERVER(char* serverHost, char** givenPort, int* listenSocket); * [2] * [3] */ -void MANAGE_REQUEST(char* pRequest, int* DUSER_SOCKET, int* DFTP_SOCKET); +void MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET); /* Gestion de la réponse du serveur FTP et modification de la réponse * * @pAnswer Pointeur sur le buffer de réponse du serveur FTP +* @USER_SOCKET Pointeur sur la SOCKET du BUS DE COMMANDES utilisateur +* @FTP_SOCKET Pointeur sur la SOCKET du BUS DE COMMANDES FTP * @DUSER_SOCKET Pointeur sur la SOCKET du BUS DE DONNEES utilisateur * @DFTP_SOCKET Pointeur sur la SOCKET du BUS DE DONNEES FTP * @@ -43,7 +47,7 @@ void MANAGE_REQUEST(char* pRequest, int* DUSER_SOCKET, int* DFTP_SOCKET); * [4] SI 226, on ferme les SOCKETS du BUS DE DONNEES * */ -void MANAGE_RESPONSE(int* USER_SOCKET, int* FTP_SOCKET, char* pAnswer, int* DUSER_SOCKET, int* DFTP_SOCKET); +void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET); diff --git a/dep/utility.c b/dep/utility.c index fd7d532..fa6c205 100644 --- a/dep/utility.c +++ b/dep/utility.c @@ -114,13 +114,12 @@ int swrite(int* pSocket, char* pBuffer){ // formatBuffer(pBuffer); - /* 2. On evoie le Buffer */ + /* 2. On écrit sur la SOCKET */ if( DEBUGMOD&BUF ) printf("SENDLEN_1: %lu\n", strlen(pBuffer)); int nbSent = write(*pSocket, pBuffer, strlen(pBuffer)); if( DEBUGMOD&BUF ) printf("SENDLEN_2: %d\n", nbSent); - /* 3. On vérifie que le retour est correct */ - // si on est déconnecté, on ferme la SOCKET + /* 3. Si on est déconnecté, on retourne une erreur */ if( nbSent <= 0 ){ if( DEBUGMOD&BUF ) printf("NOTHING TO SEND\n"); return -1; // on retourne une erreur @@ -140,13 +139,16 @@ int sread(int* pSocket, char* pBuffer){ if( *pSocket == -1 ) return -1; // si SOCKET fermée, on retourne une erreur - // on vide le buffer avant de lire + /* 1. On vide le buffer avant de lire */ memset(pBuffer, '\0', maxBuffLen); if( DEBUGMOD&BUF ) printf("READLEN_1: %lu\n", strlen(pBuffer)); + + /* 2. On lit la SOCKET */ int nbRead = read(*pSocket, pBuffer, maxBuffLen); if( DEBUGMOD&BUF ) printf("READLEN_3: %d\n", nbRead); - // si on est déconnecté, on ferme la SOCKET + + /* 3. Si on est déconnecté, on retourne une erreur */ if( nbRead <= 0 ){ if( DEBUGMOD&BUF ) printf("NOTHING TO READ\n"); return -1; // on retourne une erreur @@ -156,6 +158,7 @@ int sread(int* pSocket, char* pBuffer){ if( DEBUGMOD&RVL ) revealString(pBuffer); if( DEBUGMOD&RVL ) printf("READ_2\n"); + /* 4. On retourne le nombre de caractères lus */ return nbRead; } diff --git a/proxy_ftp.c b/proxy_ftp.c index 3dcb12c..0f79349 100644 --- a/proxy_ftp.c +++ b/proxy_ftp.c @@ -1,9 +1,7 @@ #include "proxy_ftp.h" // DECLARATIONS -static pthread_t userServer; -static short unsigned int userServerState = 1; -static char remoteAssignedPort[maxPortLen] = {'\0'}; +static pthread_t managers[maxListLen]; /* headers */ static void* testServer(); @@ -42,10 +40,10 @@ int main(int argc, char* argv[]){ static void* testServer(char* localPort){ - int USER_SOCKET; // contiendra le BUS DE COMMANDE utilisateur - int FTP_SOCKET; // contiendra le BUS DE COMMANDE FTP - int DUSER_SOCKET; // contiendra le BUS DE DONNES utilisateur - int DFTP_SOCKET; // contiendra le BUS DE DONNEES FTP + int USER_SOCKET = -1; // contiendra le BUS DE COMMANDE utilisateur + int FTP_SOCKET = -1; // contiendra le BUS DE COMMANDE FTP + int DUSER_SOCKET = -1; // contiendra le BUS DE DONNES utilisateur + int DFTP_SOCKET = -1; // contiendra le BUS DE DONNEES FTP char BUFFER[maxBuffLen]; // contiendra le BUFFER struct sockaddr_storage clientInfo; // contiendra les infos client @@ -67,27 +65,23 @@ static void* testServer(char* localPort){ DROP_SERVER(remoteHost, &serverPort, &LISTENSOCK); - CONNECT_CLIENT(FTP_HOST, FTP_PORT, &FTP_SOCKET); - printf("Port: %s\n", serverPort); - strcpy(remoteAssignedPort, serverPort);// PORT GLOBAL + + /* [1] Attente d'une demande de connection, puis création d'une socket ============================================================================*/ USER_SOCKET = accept(LISTENSOCK, (struct sockaddr *) &clientInfo, &len); - /* [2] On envoie la séquence d'initialisation - ============================================================================*/ - strcpy(BUFFER, ""); - CLIENT_SEND(&FTP_SOCKET, BUFFER, &ftp_response); - MANAGE_RESPONSE(&USER_SOCKET, &FTP_SOCKET, ftp_response, &DUSER_SOCKET, &DFTP_SOCKET); - swrite(&USER_SOCKET, ftp_response); - if( DEBUGMOD&CMD ) xPrint("P->F: %s\n\n", BUFFER); - if( DEBUGMOD&CMD ) xPrint("F->P: %s\n", ftp_response); +// static void* manageConnection(int* USER_SOCKET){ + + /* [2] Envoi de la séquence de Bienvenue + ============================================================================*/ + swrite(&USER_SOCKET, WLCM_MSG); /* BOUCLE DE COMMANDES */ - while( USER_SOCKET != -1 && FTP_SOCKET != -1 ){ + while( USER_SOCKET != -1 ){ /* [3] On récupère les données reçues (+attente) ============================================================================*/ @@ -97,7 +91,10 @@ static void* testServer(char* localPort){ /* [4] Traitement de la requête ============================================================================*/ - MANAGE_REQUEST(BUFFER, &DUSER_SOCKET, &DFTP_SOCKET); + MANAGE_REQUEST(BUFFER, &USER_SOCKET, &FTP_SOCKET, &DUSER_SOCKET, &DFTP_SOCKET); + + // si on a pas la connection FTP (commande) initialisée, on quitte + // if( FTP_SOCKET == -1 ) break; /* [5] Redirection vers le serveur FTP @@ -108,7 +105,7 @@ static void* testServer(char* localPort){ /* [6] Traitement de la réponse (FTP) ============================================================================*/ - MANAGE_RESPONSE(&USER_SOCKET, &FTP_SOCKET, ftp_response, &DUSER_SOCKET, &DFTP_SOCKET); + MANAGE_RESPONSE(ftp_response, &USER_SOCKET, &FTP_SOCKET, &DUSER_SOCKET, &DFTP_SOCKET); @@ -126,10 +123,10 @@ static void* testServer(char* localPort){ /* [9] Fermeture des connections (SOCKETS) ============================================================================*/ + printf("CLOSING CONNECTIONS\n"); close(USER_SOCKET); close(FTP_SOCKET); close(LISTENSOCK); - strcpy(remoteAssignedPort, "\0"); } diff --git a/proxy_ftp.h b/proxy_ftp.h index 4911a5d..b76a557 100644 --- a/proxy_ftp.h +++ b/proxy_ftp.h @@ -15,12 +15,12 @@ /* debug */ -#define ONLY_SOCKETS 0x01 // debug RESEAU -#define ONLY_COMMAND 0x02 // debug COMMANDES -#define ONLY_DATA 0x04 // debug DONNEES -#define ONLY_REVEALS 0x08 // debug EXPLICITATION des strings -#define ONLY_BUFFERS 0x10 // debug des BUFFERS -#define ONLY_HEADERS 0x20 // debug des HEADERS de fonctions +#define SOCKETS 0x01 // debug RESEAU +#define COMMAND 0x02 // debug COMMANDES +#define DATA 0x04 // debug DONNEES +#define REVEALS 0x08 // debug EXPLICITATION des strings +#define BUFFERS 0x10 // debug des BUFFERS +#define HEADERS 0x20 // debug des HEADERS de fonctions #define SCK 0x01 // FILTRE pour ONLY_SOCKET #define CMD 0x02 // FILTRE pour ONLY_COMMAND @@ -31,7 +31,7 @@ // possibilité de cumuler les DEBUGMODES /* DEBUGMOD ONLY_COMMAND + ONLY_DATA + .. */ -#define DEBUGMOD ONLY_REVEALS +#define DEBUGMOD COMMAND // REVEALS + HEADER /* vars */ diff --git a/test b/test index 80474b7..b8d2a49 100755 Binary files a/test and b/test differ