PSR SE2a4 2022/2023 G4
De Wiki d'activités IMA
Groupe Numéro 4 Rayane et Simon
Sommaire
À faire:
- 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
- Les serveurs SMTP doivent gérer les enregistrements MX permettant d’associer un nom de domaine à un serveur de messagerie, le recours aux enregistrements AAAA et A est à utiliser en cas d’absence de MX => Partiellement
- Pour la transmission vers les serveurs SMTP cibles, une communication chiffrée doit être préférée => SMTP dialogue à modifier => commande EHLO => permet de connaitre les fonctions du serveur
- Le processus de remise stocke le message dans le sous-répertoire Maildir/tmp puis le déplace dans le sous-répertoire Maildir/new, déplacement doit être fait par la primitive rename => Partiellement fait, ajout du move dans la fonction gestionCourriel du fichier out.c
Séance 1:
- Lecture du Sujet
- On examine le code:- fonction in.c => fonction chercheMX (fct de résolution) => Permet d'obtenir le MX (nom d'un MTA) et donc le MTA (agent de transfert)
- Compilation du code
- Il faut determiner les tâches à effectuer
Prise en main de la VM (VMALAD):
- Allumer la VM => capbreton.plil.info => xen create /etc/xen/VMALAD.cfg
- Se connecter => ssh root@193.48.57.166 => mdp : glopglopglop
Modif code:
- Changement dans gestionCourriel() -> in.c / changement pour éviter d'envoyer le message sur tout les mx mais sur celui qui marche
while(*p!=NULL){ #ifdef DEVERMINE printf("Serveur : %s\n",*p); #endif int ss=connexionServeur(*p,SMTP_PORT_DEFAULT); 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++; } }
Séance 2:
- Explication du code en salle de cours (1h)
Modif code:
- Dans Mutex.c => ajout d'un free(mutexes) | Car le threads est détruit mais pas l'allocation mémoire des mutexes
- Dans out.c => fonction gestionCourriel => ajout d'un rename (move) du fichier TMP vers le fichier NEW
char new_fichier[MAX_CHEMIN]; sprintf(new_fichier, "%s/%s/%s/%ld_%010d_%010ld",dossier,id,MAILDIR_NEW,time_save,pid,messages); rename(fichier, new_fichier); }
Taches restantes:
En cours:
- 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
- Les serveurs SMTP doivent gérer les enregistrements MX permettant d’associer un nom de domaine à un serveur de messagerie, le recours aux enregistrements AAAA et A est à utiliser en cas d’absence de MX => Partiellement
- Pour la transmission vers les serveurs SMTP cibles, une communication chiffrée doit être préférée => SMTP dialogue à modifier => commande EHLO => permet de connaitre les fonctions du serveur
Terminé:
- Le processus de remise stocke le message dans le sous-répertoire Maildir/tmp puis le déplace dans le sous-répertoire Maildir/new, déplacement doit être fait par la primitive rename => ajout du move dans la fonction gestionCourriel du fichier out.c
Séance 3:
- Remise en forme du Wiki
- Tester la communication de notre application et debuguer
- Problème: SMTPin & SMTPout sur la même interface du port 25 ==> Il faut trouver un moyen de déplacer l'un des 2 sur une autre interface
- Solution: Créer un argument a notre apllication pour pouvoir modifier l'interface, (précision de l'interface pour SMTPin & SMTPout)
Modif code:
- Dans SMTPout ==> args.h => ajout d'une variable "interface" à la structure "stmp_config
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]; };
- Dans SMTPout ==> args.c => ajout d'un case i "interface" dans le switch
static struct option long_options[] = { {"local",no_argument,0,'l'}, {"port",required_argument,0,'p'}, {"journal",required_argument,0,'j'}, {"niveau",required_argument,0,'n'}, {"dossier",required_argument,0,'d'}, {"utilisateurs",required_argument,0,'u'}, {"interfaces", required_argument,0, 'i'}, {0,0,0,0} };
while(1){ int c=getopt_long(argc,argv,"lp:j:n:d:u:i:",long_options,NULL); if(c<0) break; switch(c){ case 'l': config->local=1; break; case 'i': strncpy(config->interface,optarg,sizeof(config->interface)-1); break; case 'p': strncpy(config->port,optarg,sizeof(config->port)-1); break; case 'j': strncpy(config->journal,optarg,sizeof(config->journal)-1); break; case 'd': strncpy(config->dossier,optarg,sizeof(config->dossier)-1); break; case 'u': strncpy(config->carte,optarg,sizeof(config->carte)-1); break; case 'n': config->niveau=atoi(optarg); break; default: afficheSyntaxe(argv[0]); break; } }
Test solution:
- Commande pour lancer SMTPin sur la VM avec la séléction de l'interface local du port 25: root@VMALAD:~/SMTP/PSR-ReX-v6/src/SMTPin# ./SMTPin -l
- Commande pour lancer SMTPin sur la VM avec la séléction de l'interface eth0 du port 25: root@VMALAD:~/SMTP/PSR-ReX-v6/src/SMTPout# ./SMTPout -i eth0
- On utilise la commande suivante pour s'assurer que les 2 applications se trouvent sur les bons interfaces: root@VMALAD:~# ss -tlpn
Séance 4:
- Test du serveur SMTP avec l'envoi de mail grâce à l'outil telnet => le process d'envoi de mail fonctionne
- A faire => relancer les applications en mode debug pour voir ce que l'ont obtient en sortie