IMA4 2021/2022 EC4

De Wiki d'activités IMA
Révision datée du 6 septembre 2022 à 03:17 par Kpatrike (discussion | contributions) (Etape 5)

Objectif

Terminer le projet système réseau SE2a4 2021/2022 à partir d'un source incomplet.

Le sujet du projet est ici : https://rex.plil.fr/Enseignement/Systeme/Tutorat.IMA2a4.Messagerie/

Le source incomplet est disponible en ligne Fichier:PSR-ReX-v6.zip.

Vous devez documenter vos avancées sur cette page Wiki.

Travail réalisé

Etape1:

- args.c : traitement des arguments courts et longs - libcom : Fonctions Initialisation, Connexion, BoucleServeur et résolution de nom de domaine - MTAint/tcpint.c : Code source pour le test de la communication TCP avec notre serveur fonctionne avec nc [ipv4_serveur] [port]

L'étape suivante sera d'implémenter les threads pour gérer plusieurs communications en même temps.


Etape2:

- MTAint: gestion_stmp : fonction de traitement et de stockage des informations avec des commandes HELO, MAIL, RCPT, DATA, QUIT dans une structure client réorganisation des fichiers : Test(test connection tcp, répertoire MTAint Etape1) , implémentation de la bibliothèque SMTP

L'implémentation des threads nous donne des erreurs. Librarire Threads non implémentée pour l'instant.

Etape2_finale:

MTAint: Implémentation des threads réalisée à l'aide d'une structure {void * arg, void * f(*f)(void *). Conflits de librairies résolus, nouvelle fonction serverLoop2 pour les threads et changement de void * gestionsmtp(int) en void * gestionsmtp(void *) pour être pris en charge par un thread

La prochaine étape est d'envoyer les donnés sur le port 25 et de recevoir un mail.

Etape3

Suite à une mauvaise compréhension du sujet de ma part, j'ai recommencé le projet avec le code fourni.

Erreurs corrigés:

smtp.c:184:23: warning: format not a string literal and no format arguments [-Wformat-security]

 184 |   if(fprintf(dialogue,envoi)<0) return -1;
     |                       

smtp.c: In function ‘dialogue_DATA’: smtp.c:211:1: warning: format not a string literal and no format arguments [-Wformat-security]

 211 | if(fprintf(dialogue,corps)<0) return -1;
     | ^~

smtp.c: In function ‘afficheCourriel’: smtp.c:239:3: warning: format not a string literal and no format arguments [-Wformat-security]

 239 |   if(complet) fprintf(sortie,donnees->corps);
     |   ^~

La fonction fprintf ne reconnaissait pas le dernier argument en paramètre. Ajout d'un %s : fprintf(FILE *,"%s",char *)

smtp_private.h : ACCUEIL_CODE = 250 => ACCUEIL_CODE 220

smtp.c : Affichage de la première réponse serveur distant dans retourGénérique

Script pour netcat

Automatisation des tests avec les commandes :
$ function slowcat(){ while read; do sleep .05; echo "$REPLY"; done; }
$ cat txt | slowcat | nc localhost [port]

Et le fichier "txt":

HELO localhost
MAIL FROM: <patrikeev@gmail.com>
RCPT TO: <konstantin.patrikeev@polytech-lille.net>
DATA
From: [IES] <patrikeev@gmail.com>
To: <konstantin.patrikeev@polytech-lille.net>
Date: Fri, 27 Oct 2017 06:14:11 +0000
Subject: Test Message

Hi there! This is supposed to be a real email...

Have a good day!
-- System


.
QUIT

Etape4

Lors de cette étape, j'ai réussi à m'envoyer un mail sur le serveur mail woody.escaut.net de polytech. Le test doit obligatoirement se faire à partir de l'adresse d'un nom de domaine internet sinon le serveur SMTP ne répondra pas.

Dans la partie précédentes, le SMTPin arrivait à établir une connexion avec le serveur mail 193.48.57.36 en effectuant le test à polytech.

Cependant il n'allait pas plus loins dans l'envoi des requetes HELO, MAIL, RCPT, DATA et QUIT.

2 erreurs on étés corrigées:

-  int statut=sscanf(ligne,"%3d",&code); // au lieur de "%4d" dans scmtpin:ligne181
-  #define ACCUEIL_CODE     220 // au lieu de 250 pour la reconnaissance du code d'accueil

Ainsi le programme n'arrivait pas à :

1. Reconnaître le bon code d'accueil 220 dans la fonction retour_generique

- static int retour_generique(FILE *dialogue,int succes,char *erreur,int taille) // smtp.c:ligne 170

2. Identifier correctement ce code dans le message de réponse du serveur. sscanf prenait une chaîne de caractères %4s au lieur d'un entier %3d (Les codes sont donnés sur 3 chiffres)

- De plus, pour automatiser les tests, un fichier txt est disponible dans le répertoire EtapeN du projet avec un fichier README.txt qui explique comment s'en servir.

Etape 5

Pour cette partie, nous nous focalisons sur les fichiers du répertoire src/SMTout et nous réalisons les tests en local. Un repertoire tmp est déjà créé à la racine.

Le but est de pouvoir stocker les donnés des mails reçus dans un dossier (/tmp par défault) en triant les mails par destinataire.

Plusieurs erreurs on été corrigés dans out.c. Il manquait notamment des fonctions pour créer des répertoires. Nous avons choisit d'utiliser la foonction system qui nous permet de lancer des commandes linux (pour utiliser mkdir).

Nous avons également simplifié le code en enlevant la partir sur les cartes utilisateur.

Voici les passages modifiés dans out.c :

  • Fonction main

- // Repertoire de mails racine stocké dans racine - if (strlen(config.dossier) > 0 ) { strcpy(racine, config.dossier); - } else { strcpy(racine, MAILDIR_DFLTBASE); - }

Documents Rendus

Lien du répertoire git : https://archives.plil.fr/kpatrike/EC_Messagerie.git