usr@srv presque totalement opérationnel, encore pb de buffer au niveau du -->LIST et des fois à la co + core dump si mauvais serveur

This commit is contained in:
xdrm-brackets 2015-12-16 21:38:39 +01:00
parent a61bb83c3a
commit 5cb2b373b4
8 changed files with 114 additions and 168 deletions

View File

@ -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);
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
=======================================================*/

View File

@ -2,16 +2,13 @@
*
* @serverHost<char*> Nom de l'hôte distant (server)
* @serverPort<char*> Numéro du port distant (server)
* @pRequest<char*> Requête à envoyer au serveur
* @pSocket<int*> Pointeur sur la requête à créer
*
* @pAnswer<char**> Pointeur sur le <char*> à remplir => contiendra la réponse du serveur
*
* @return error<int> 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);
// retourne -1 en cas d'erreur
int CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer);

View File

@ -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)

View File

@ -13,6 +13,8 @@ void DROP_SERVER(char* serverHost, char** givenPort, int* listenSocket);
/* Gestion de la requête du client
*
* @pBuffer<char*> Requête en question
* @USER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE COMMANDES utilisateur
* @FTP_SOCKET<int*> Pointeur sur la SOCKET du BUS DE COMMANDES FTP
* @DUSER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE DONNEES utilisateur
* @DFTP_SOCKET<int*> 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<char**> Pointeur sur le buffer de réponse du serveur FTP
* @USER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE COMMANDES utilisateur
* @FTP_SOCKET<int*> Pointeur sur la SOCKET du BUS DE COMMANDES FTP
* @DUSER_SOCKET<int*> Pointeur sur la SOCKET du BUS DE DONNEES utilisateur
* @DFTP_SOCKET<int*> 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);

View File

@ -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;
}

View File

@ -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");
}

View File

@ -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 */

BIN
test

Binary file not shown.