proxy-ftp/dep/server.h

120 lines
4.1 KiB
C

/* Créé et met un serveur sur écoute
*
* ==IN==
* @serverHost<char*> Nom de l'hôte local (localhost)
* @givenPort<char**> Si renseigné, définit le port à utiliser
*
* ==OUT==
* @givenPort<char**> Pointeur sur le <char*> à remplir => contiendra le port donné par le système (si pas renseigné en entrée)
* @listenSocket<int*> Pointeur sur le <int> à remplir => contiendra un pointeur sur la socket d'écoute
*
*
*
* @history
* [1] On définit le filtre/format
* [2] On récupère les infos (adresse, port)
* Note: Gestion IPv4/IPv6
* [3] Création de la socket
* [4] On publie la SOCKET (bind)
* [5] On récupère les informations du serveur (host/port)
* [6] On met la socket sur écoute (listen)
* [7] On envoie les données par référence
*
*/
void DROP_SERVER(const char* serverHost, char** givenPort, int* listenSocket);
/* Gestion de la requête du client
* ==IN/OUT==
* @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
*
*
*
* @history
* [1] On découpe la requête en 2 parties (rCommand, rContent)
* [2] Selection en fonction de @rCommand
* (1) USER username@serveur => connection FTP (commande)
* 1. On extrait @username et @hostname
* 2. On se connecte au serveur FTP (commandes)
* 3. On envoie la séquence d'initialisation
* 4. On envoie la requête USER au serveur FTP auquel on vient de se connecter
*
* (2) PORT a1,a2,a3,a4,p1,p2 => utilisateur (actif)
* 1. On récupère l'ip et le port de la requête
* 2. On se connecte au client
* 3. Envoi de "PASV" car on veut être en mode passif entre le proxy et le serveur FTP
* (n) Si aucun traitement on recopie la requête telquel
*
* [3] Retour de la réponse
*
*/
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
*
*
*
* @history
* [1] On découpe la requête en 2 parties (ftpCode, ftpText)
* [2] Selection en fonction de @ftpCode
* (1) 220- Demande d'username
* (2) 331- username OK -> demande MDP
* (3) 230- Bon mdp -> connection
* (4) 530- Mauvais mdp -> message erreur
* (5) 215- Info SYST [COMMENTÉ]
* (6) 221- LOGOUT => EXIT (commande QUIT)
* (7) 227- Mode passif => On lance les SOCKETS du BUS DE DONNEES
* 1. On récupère l'ip et le port de la réponse
* 2. Connexion au serveur FTP
* 3. Envoi du message de code 200
*
* (8) 150- On lit la SOCKET FTP du BUS DE DONNEES
* 1. Envoi au client de l'écoute de la réponse (associée) du BUS DE DONNEES
* 2. On lit la SOCKET FTP (BUS DE DONNEES)
* 3. On redirige sur la SOCKET utilisateur (BUS DE DONNEES)
* 4. On ferme les SOCKETS du BUS DE DONNEES
* 5. On vide le BUS DE COMMANDE du serveur FTP
* 6. On transmet le message de fin de la transaction (226)
*
* (9) 226- Fin de transfert de données (fermeture SOCKETS du BUS DE DONNEES)
* (n) xxx- Commande inconnue
*
* [3] Retour de la réponse
*/
void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET);
/* Attends une réponse du client
*
* @pSocket<int*> Pointeur sur la SOCKET en question
* @pBuffer<char*> Buffer qui contiendra la réponse
*
* @return nbRead<int> On retourne le nombre de char lus, sinon -1 si erreur
*
*
*
* @history
* [1] On read() tant qu'on a pas les symboles de fin "\r\n"
* [2] On écrit sur le BUFFER
* [3] Si une erreur se produit, on retourne -1
*
*/
int WAIT_CLIENT(int* pSocket, char* pBuffer);