PSR SE2a4 2022/2023 G1 : Différence entre versions
(→RENDU EVALUATION BAPTISTE) |
|||
(105 révisions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
− | 03/02/2023 | + | = guide général = |
− | - prise en main du sujet. Lecture du code in.c qui est à l'origine des fonctions | + | |
− | - dans le IN.c on voit les fonctions de récupérations des MX puis l'envoie du message en | + | == connexion à la VM == |
− | - on a | + | |
+ | <code> ssh root@193.48.57.163 </code> | ||
+ | |||
+ | = Suivi chronologique du projet = | ||
+ | |||
+ | == 03/02/2023 == | ||
+ | - prise en main du sujet. Lecture du code in.c qui est à l'origine des fonctions d’envois de message SMTP, on en déduit que le Out.c sera responsable de la réception des messages SMTP. <br> | ||
+ | - dans le IN.c on voit les fonctions de récupérations des MX puis l'envoie du message en fonction de leur priorité jusqu’à ce qu'un envoie soit réussit. <br> | ||
+ | - on a remarqué une erreur dans la fonction qui gère l'envoi des messages dans in.c. La fonction envoie le message sur chaque MX sans vérifier le succès de l'envoie , on a rajouter un break lorsque l'envoie était réussi afin d'envoyer des duplicatas. <br> | ||
+ | |||
+ | int ss=connexionServeur(*p,SMTP_PORT_DEFAULT); | ||
+ | if(ss==-1){ | ||
+ | ecritureJournal(JOURNIV_ERROR,JOURNAL_CONSERV); | ||
+ | p++; | ||
+ | continue; | ||
+ | } | ||
+ | FILE *dialogue=fdopen(ss,"a+"); | ||
+ | if(dialogue==NULL){ | ||
+ | perror("gestionCourriel.fdopen"); | ||
+ | exit(EXIT_FAILURE); | ||
+ | } | ||
+ | char erreur[MAX_ERREUR]; | ||
+ | int resultat=SMTP_dialogue(dialogue,donnees,erreur,MAX_ERREUR); | ||
+ | fclose(dialogue); | ||
+ | if(resultat<0) ecritureJournal(JOURNIV_DEVERMINE,JOURNAL_MXHS,*p); | ||
+ | // Logguer l'erreur | ||
+ | <b>else{break;}</b> | ||
+ | p++; | ||
+ | } | ||
+ | |||
+ | Le break dans le else était manquant et le programme allait donc tenter de se connecter via tous les mx qu'il avait réussi à initier une connexion ou non. | ||
+ | |||
+ | == 10/02/2023 == | ||
+ | <b> connection à la VM </b> <br> | ||
+ | on se connecte à la VM en utilisant cette ligne <code> ssh root@193.48.57.163 </code> <br> | ||
+ | <br> | ||
+ | <b> Point à réaliser sur le cahier des charges </b> <br> | ||
+ | |||
+ | |||
+ | |||
+ | *un système doit être réalisé permettant au serveur SMTP sortant de mettre en file d’attente les messages non remis à destination pour cause d’erreur transitoire du serveur SMTP cible | ||
+ | *les communications peuvent être chiffrées par TLS, les communication chiffrées peuvent être négociées directement sur le port 465 | ||
+ | *il doit être possible de basculer sur une communication chiffrée à partir du port 25 en utilisant les commandes EHLO et STARTTLS , il faut implémenter ces fonctions dans SMTP.C dans les libs | ||
+ | *un système doit être réalisé permettant au serveur SMTP sortant de mettre en file d’attente les messages non remis à destination pour cause d’erreur transitoire du serveur SMTP cible | ||
+ | *ajouter le déplacement du message du tmp vers le répertoire new lorsque le message est complet. | ||
+ | *pour la transmission vers les serveurs SMTP cibles, une communication chiffrée doit être préférée ; à vérifier avec la commande EHLO si le destinataire est capable de communiquer en chiffrée si oui on bascule en mode chiffrée avec STARTTLS | ||
+ | *Port25: se connecter en administrateur: <code>su-</code> puis <code>ss -tpln</code> : pour visualiser ce qui sur les ports et finalement <code>service <i>nom du service</i> stop </code> | ||
+ | |||
+ | == 17/03/2023 == | ||
+ | envoie des fichier vers la machine virtuel avec la commande suivante <code> scp -r /home/pifou/Desktop/baptiste/PSR-ReX-v6/ root@193.48.57.163:/ </code> | ||
+ | |||
+ | Afin de lancer le serveur sur la machine virtuel il faut rajouter une option lors du lancement de SMTPin et SMTP out afin de leur indiquer quelle interface utiliser pour qu'il puissent tous les deux utiliser le port 25 <br> | ||
+ | |||
+ | On ajoute dans args.h et args.c de SMTPout des lignes de code pour prendre en compte le paramètre -i, afin d'ajouter la possibilité d'avoir un interface:<br> | ||
+ | '''args.h:''' | ||
+ | struct smtp_config{ | ||
+ | char journal[CONFIG_MAX_JOURNAL]; | ||
+ | int niveau; | ||
+ | char port[CONFIG_MAX_PORT]; | ||
+ | char dossier[CONFIG_MAX_CHEMIN]; | ||
+ | char carte[CONFIG_MAX_CHEMIN]; | ||
+ | unsigned char local; | ||
+ | <b>char interface[CONFIG_MAX_INTERFACE]</b>; | ||
+ | }; | ||
+ | |||
+ | '''args.c:''' | ||
+ | case 'i': | ||
+ | strncpy(config->interface,optarg,sizeof(config->interface)-1); | ||
+ | break; | ||
+ | |||
+ | |||
+ | on a modifié le format des chaînes de caractère <code>sprintf(format,"%%4 %s%%s %%s",MAIL_TAG);</code> dans le smtp.c les fonctions gestion_MAIL et gestion_RCPT afin de résoudre l'erreur lorsque l'on ne mettait pas d'espace (RCPT TO: <...> fonctionnait mais pas RCPT TO:<...>) | ||
+ | |||
+ | == 22/03/2023 == | ||
+ | |||
+ | on peut désormais lancer les deux exécutables SMTPout avec l'option <code>-i eth0</code> et SMTPin avec l'option <code>-l</code><br> | ||
+ | On va maintenant tester le serveur SMTP installer sur notre machine virtuelle <br> | ||
+ | |||
+ | |||
+ | == 29/03/2023 == | ||
+ | Après les tests effectués sur la machine on a observer un problème sur la fonction d'obtention de l'adresse mail de réception, que nous avons corriger en remplaçant notre expression régulière pour récupérer les options de la commande MAIL que nous avions mal réalisé. <br> | ||
+ | |||
+ | ==05/04/2023== | ||
+ | |||
+ | A faire ce jour : <br> | ||
+ | * essayer de voir d'ou vient le probleme de la résolution des MX lorsqu’il y en a plusieurs. | ||
+ | * essayer d'envoyer et de recevoir des messages via notre serveur SMTP via la commande <code> sc localhost 25 </code> | ||
+ | |||
+ | En réalité le problème était que nous ne pouvions pas nous connecter à Gmail car l'école ne n'autorise pas les adresses IPV6.De plus Gmail refuse la reception du mail car notre message ne contient pas de message ID. | ||
+ | |||
+ | ==07/06/2023== | ||
+ | |||
+ | Nous réessayons nos tests avec un ficher de test avec l'outil nc à lancer avec la commande <code> nc -i1 -q0 -C localhost 25 < test1* </code>: | ||
+ | |||
+ | HELO detestable.site | ||
+ | MAIL FROM:<root@detestable.site> | ||
+ | RCPT TO:<baptiste.desplaces@polytech-lille.net> | ||
+ | DATA | ||
+ | Subject: test | ||
+ | |||
+ | azdazda | ||
+ | daz | ||
+ | saz | ||
+ | da | ||
+ | . | ||
+ | quit | ||
+ | |||
+ | |||
+ | |||
+ | Nous n'arrivons pas à envoyé un mail malgré aucun message d'erreur, nous essayons de le régler en ajoutant une vérification du code 354 avant d'envoyer le corps de la DATA.<br> | ||
+ | |||
+ | Nous ajoutons donc dans smtp.c la vérification du ocde de CONTINUE_DATA avant d'envoyer le corps du texte.<br> | ||
+ | |||
+ | static int dialogue_DATA(FILE *dialogue,char *corps,char *erreur,int taille){ | ||
+ | int retour=dialogue_generique(dialogue,"DATA","",CONTINUE_DATA_CODE,erreur,taille); | ||
+ | if(retour) return retour; | ||
+ | if(fprintf(dialogue,corps)<0) return -1; | ||
+ | if(fprintf(dialogue,".\r\n")<0) return -1; | ||
+ | return retour_generique(dialogue,SUCCES_DATA_CODE,erreur,taille); | ||
+ | } | ||
+ | |||
+ | Nous avons réussi à envoyer un mail (MAIL FROM:<root@detestable.site>, ajouter sujet dans l’email ) | ||
+ | |||
+ | ==14/06/2023== | ||
+ | '''SMTPout debug''' | ||
+ | |||
+ | On a fait deux modifications (erreur) dans out.c pour recevoir les messages : | ||
+ | |||
+ | * ligne 98 ajout du test de l'égalité à 0 de la fonction strcasecmp pour avoir la bonne ligne de notre carte d'utilisateur | ||
+ | * ligne 127 on alloue à adresse la taille suffisante pour contenir destinataire et non adresse. | ||
+ | |||
+ | |||
+ | |||
+ | Créer la carte dans un fichier map afin d'utiliser l'option utilisateur -u: | ||
+ | |||
+ | ahlamelabkari: ahlamelabkari@detestable.site | ||
+ | baptistedespalces: baptistedesplaces@detestable.site | ||
+ | |||
+ | Crée la structure du repertoire MAILDIR: | ||
+ | /tmp/id/tmp | ||
+ | /new | ||
+ | |||
+ | Nous avons fait nos tests avec un ficher de test avec l'outil nc avec la commande <code> nc -i1 -q0 -C 193.48.57.163 25 < test2* </code> : | ||
+ | |||
+ | HELO detestable.site | ||
+ | MAIL FROM:<baptiste.desplaces@polytech-lille.net> | ||
+ | RCPT TO:<baptistedesplaces@detestable.site> | ||
+ | DATA | ||
+ | Subject: test | ||
+ | |||
+ | azdazda | ||
+ | daz | ||
+ | saz | ||
+ | da | ||
+ | . | ||
+ | quit | ||
+ | |||
+ | Nous avons réussi à recevoir un mail qui sera ici stocké dans /tmp/baptistedesplaces/new/ <br> | ||
+ | |||
+ | Nous n'arrivions pas à recevoir de mail venant d'un outil de gestion de mail (ici Roundcube via portail polytech), avec Strace nous remarquons qu'on reçoit la fonction SMTP EHLO qui n'est pas implémentée dans notre code. On rajoute donc un if qui nous permet d'envoyer le code de retour NON_IMPLEMENTED_CODE qui vaut 500 dans le cas ou on ne fait pas de traitement car le serveur SMTP ne reçoit pas de fonction qu'il prend en charge. On va alors recevoir la commande HELO pour initialiser la communication. <br> | ||
+ | |||
+ | |||
+ | ==Archive fin de projet== | ||
+ | |||
+ | [[file:SMTP.zip]] | ||
+ | |||
+ | |||
+ | == RENDU EVALUATION BAPTISTE == | ||
+ | |||
+ | Ajout d'une fonction dans out.c permettant d'envoyer dans smtp.c l'information de si oui ou non l'id se trouve dans la carte des clients | ||
+ | |||
+ | unsigned char verification(char* id){ | ||
+ | int i=0; | ||
+ | while(adresses[i].id!=NULL){ | ||
+ | if(strcmp(adresses[i].id,id)==0)return 1; | ||
+ | i++; | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | et ajout dans smtp.c de la fonction gestion_VERIFY avec l'ajout des codede retour dans le smtp.h | ||
+ | |||
+ | static int gestion_VERIFY(char *ligne,FILE *client, struct courriel *donnees,unsigned char (*verify)(char *)){ | ||
+ | char cmd[MAX_LIGNE]; | ||
+ | char arg[MAX_LIGNE]; | ||
+ | char suite[MAX_LIGNE]; | ||
+ | int statut=sscanf(ligne,"%4s %s %s",cmd,arg,suite); | ||
+ | if (statut!=2){ | ||
+ | if(fprintf(client,"%03d %s\r\n",ERREUR_VRFY_CODE,ERREUR_VRFY_TEXT)) return GESTION_STOP; | ||
+ | return GESTION_ERREUR; | ||
+ | } | ||
+ | unsigned char test=verify(arg); | ||
+ | if(test==1) fprintf(client,"%03d %s\r\n",EXISTING_ID_CODE,EXISTING_ID_TEXT); | ||
+ | else fprintf(client,"%03d %s\r\n",NON_EXISTING_ID_CODE,NON_EXISTING_ID_TEXT); | ||
+ | return GESTION_OK; | ||
+ | } |
Version actuelle datée du 14 juin 2023 à 18:27
Sommaire
guide général
connexion à la VM
ssh root@193.48.57.163
Suivi chronologique du projet
03/02/2023
- prise en main du sujet. Lecture du code in.c qui est à l'origine des fonctions d’envois de message SMTP, on en déduit que le Out.c sera responsable de la réception des messages SMTP.
- dans le IN.c on voit les fonctions de récupérations des MX puis l'envoie du message en fonction de leur priorité jusqu’à ce qu'un envoie soit réussit.
- on a remarqué une erreur dans la fonction qui gère l'envoi des messages dans in.c. La fonction envoie le message sur chaque MX sans vérifier le succès de l'envoie , on a rajouter un break lorsque l'envoie était réussi afin d'envoyer des duplicatas.
int ss=connexionServeur(*p,SMTP_PORT_DEFAULT); if(ss==-1){ ecritureJournal(JOURNIV_ERROR,JOURNAL_CONSERV); p++; continue; } FILE *dialogue=fdopen(ss,"a+"); if(dialogue==NULL){ perror("gestionCourriel.fdopen"); exit(EXIT_FAILURE); } char erreur[MAX_ERREUR]; int resultat=SMTP_dialogue(dialogue,donnees,erreur,MAX_ERREUR); fclose(dialogue); if(resultat<0) ecritureJournal(JOURNIV_DEVERMINE,JOURNAL_MXHS,*p); // Logguer l'erreur else{break;} p++; }
Le break dans le else était manquant et le programme allait donc tenter de se connecter via tous les mx qu'il avait réussi à initier une connexion ou non.
10/02/2023
connection à la VM
on se connecte à la VM en utilisant cette ligne ssh root@193.48.57.163
Point à réaliser sur le cahier des charges
- un système doit être réalisé permettant au serveur SMTP sortant de mettre en file d’attente les messages non remis à destination pour cause d’erreur transitoire du serveur SMTP cible
- les communications peuvent être chiffrées par TLS, les communication chiffrées peuvent être négociées directement sur le port 465
- il doit être possible de basculer sur une communication chiffrée à partir du port 25 en utilisant les commandes EHLO et STARTTLS , il faut implémenter ces fonctions dans SMTP.C dans les libs
- un système doit être réalisé permettant au serveur SMTP sortant de mettre en file d’attente les messages non remis à destination pour cause d’erreur transitoire du serveur SMTP cible
- ajouter le déplacement du message du tmp vers le répertoire new lorsque le message est complet.
- pour la transmission vers les serveurs SMTP cibles, une communication chiffrée doit être préférée ; à vérifier avec la commande EHLO si le destinataire est capable de communiquer en chiffrée si oui on bascule en mode chiffrée avec STARTTLS
- Port25: se connecter en administrateur:
su-
puisss -tpln
: pour visualiser ce qui sur les ports et finalementservice nom du service stop
17/03/2023
envoie des fichier vers la machine virtuel avec la commande suivante scp -r /home/pifou/Desktop/baptiste/PSR-ReX-v6/ root@193.48.57.163:/
Afin de lancer le serveur sur la machine virtuel il faut rajouter une option lors du lancement de SMTPin et SMTP out afin de leur indiquer quelle interface utiliser pour qu'il puissent tous les deux utiliser le port 25
On ajoute dans args.h et args.c de SMTPout des lignes de code pour prendre en compte le paramètre -i, afin d'ajouter la possibilité d'avoir un interface:
args.h:
struct smtp_config{ char journal[CONFIG_MAX_JOURNAL]; int niveau; char port[CONFIG_MAX_PORT]; char dossier[CONFIG_MAX_CHEMIN]; char carte[CONFIG_MAX_CHEMIN]; unsigned char local; char interface[CONFIG_MAX_INTERFACE]; };
args.c:
case 'i': strncpy(config->interface,optarg,sizeof(config->interface)-1); break;
on a modifié le format des chaînes de caractère sprintf(format,"%%4 %s%%s %%s",MAIL_TAG);
dans le smtp.c les fonctions gestion_MAIL et gestion_RCPT afin de résoudre l'erreur lorsque l'on ne mettait pas d'espace (RCPT TO: <...> fonctionnait mais pas RCPT TO:<...>)
22/03/2023
on peut désormais lancer les deux exécutables SMTPout avec l'option -i eth0
et SMTPin avec l'option -l
On va maintenant tester le serveur SMTP installer sur notre machine virtuelle
29/03/2023
Après les tests effectués sur la machine on a observer un problème sur la fonction d'obtention de l'adresse mail de réception, que nous avons corriger en remplaçant notre expression régulière pour récupérer les options de la commande MAIL que nous avions mal réalisé.
05/04/2023
A faire ce jour :
- essayer de voir d'ou vient le probleme de la résolution des MX lorsqu’il y en a plusieurs.
- essayer d'envoyer et de recevoir des messages via notre serveur SMTP via la commande
sc localhost 25
En réalité le problème était que nous ne pouvions pas nous connecter à Gmail car l'école ne n'autorise pas les adresses IPV6.De plus Gmail refuse la reception du mail car notre message ne contient pas de message ID.
07/06/2023
Nous réessayons nos tests avec un ficher de test avec l'outil nc à lancer avec la commande nc -i1 -q0 -C localhost 25 < test1*
:
HELO detestable.site MAIL FROM:<root@detestable.site> RCPT TO:<baptiste.desplaces@polytech-lille.net> DATA Subject: test azdazda daz saz da . quit
Nous n'arrivons pas à envoyé un mail malgré aucun message d'erreur, nous essayons de le régler en ajoutant une vérification du code 354 avant d'envoyer le corps de la DATA.
Nous ajoutons donc dans smtp.c la vérification du ocde de CONTINUE_DATA avant d'envoyer le corps du texte.
static int dialogue_DATA(FILE *dialogue,char *corps,char *erreur,int taille){ int retour=dialogue_generique(dialogue,"DATA","",CONTINUE_DATA_CODE,erreur,taille); if(retour) return retour; if(fprintf(dialogue,corps)<0) return -1; if(fprintf(dialogue,".\r\n")<0) return -1; return retour_generique(dialogue,SUCCES_DATA_CODE,erreur,taille); }
Nous avons réussi à envoyer un mail (MAIL FROM:<root@detestable.site>, ajouter sujet dans l’email )
14/06/2023
SMTPout debug
On a fait deux modifications (erreur) dans out.c pour recevoir les messages :
- ligne 98 ajout du test de l'égalité à 0 de la fonction strcasecmp pour avoir la bonne ligne de notre carte d'utilisateur
- ligne 127 on alloue à adresse la taille suffisante pour contenir destinataire et non adresse.
Créer la carte dans un fichier map afin d'utiliser l'option utilisateur -u:
ahlamelabkari: ahlamelabkari@detestable.site baptistedespalces: baptistedesplaces@detestable.site
Crée la structure du repertoire MAILDIR:
/tmp/id/tmp /new
Nous avons fait nos tests avec un ficher de test avec l'outil nc avec la commande nc -i1 -q0 -C 193.48.57.163 25 < test2*
:
HELO detestable.site MAIL FROM:<baptiste.desplaces@polytech-lille.net> RCPT TO:<baptistedesplaces@detestable.site> DATA Subject: test azdazda daz saz da . quit
Nous avons réussi à recevoir un mail qui sera ici stocké dans /tmp/baptistedesplaces/new/
Nous n'arrivions pas à recevoir de mail venant d'un outil de gestion de mail (ici Roundcube via portail polytech), avec Strace nous remarquons qu'on reçoit la fonction SMTP EHLO qui n'est pas implémentée dans notre code. On rajoute donc un if qui nous permet d'envoyer le code de retour NON_IMPLEMENTED_CODE qui vaut 500 dans le cas ou on ne fait pas de traitement car le serveur SMTP ne reçoit pas de fonction qu'il prend en charge. On va alors recevoir la commande HELO pour initialiser la communication.
Archive fin de projet
RENDU EVALUATION BAPTISTE
Ajout d'une fonction dans out.c permettant d'envoyer dans smtp.c l'information de si oui ou non l'id se trouve dans la carte des clients
unsigned char verification(char* id){ int i=0; while(adresses[i].id!=NULL){ if(strcmp(adresses[i].id,id)==0)return 1; i++; } return 0; }
et ajout dans smtp.c de la fonction gestion_VERIFY avec l'ajout des codede retour dans le smtp.h
static int gestion_VERIFY(char *ligne,FILE *client, struct courriel *donnees,unsigned char (*verify)(char *)){ char cmd[MAX_LIGNE]; char arg[MAX_LIGNE]; char suite[MAX_LIGNE]; int statut=sscanf(ligne,"%4s %s %s",cmd,arg,suite); if (statut!=2){ if(fprintf(client,"%03d %s\r\n",ERREUR_VRFY_CODE,ERREUR_VRFY_TEXT)) return GESTION_STOP; return GESTION_ERREUR; } unsigned char test=verify(arg); if(test==1) fprintf(client,"%03d %s\r\n",EXISTING_ID_CODE,EXISTING_ID_TEXT); else fprintf(client,"%03d %s\r\n",NON_EXISTING_ID_CODE,NON_EXISTING_ID_TEXT); return GESTION_OK; }