PSR SE2a4 2022/2023 G6 : Différence entre versions

De Wiki d'activités IMA
Ligne 19 : Ligne 19 :
  
 
Réécriture du code<br/>
 
Réécriture du code<br/>
 +
-> à compléter par @Bastien.Germond
 
Création code Maildir/tmp -> réception message (MTAext.c)<br/>
 
Création code Maildir/tmp -> réception message (MTAext.c)<br/>
 
Pour générer un identifiant unique, on utilise la librairie <libuuid> : #include <uuid/uuid.h> <br/>
 
Pour générer un identifiant unique, on utilise la librairie <libuuid> : #include <uuid/uuid.h> <br/>
Ligne 30 : Ligne 31 :
 
     uuid_generate_random(binuuid);
 
     uuid_generate_random(binuuid);
 
     char *uuid = malloc(37);//Nb of characters for unique id
 
     char *uuid = malloc(37);//Nb of characters for unique id
     uuid_unparse_lower(binuuid, uuid);//lettre minuscule
+
     uuid_unparse_lower(binuuid, uuid);//unique id en lettre minuscule
 
+
</pre>
 +
On définit ici un identifiant unique pour pouvoir suivre le mail envoyé (éviter toutes collisions ou perdition de données)
 +
<pre>
 
     LOG_D("Mail UUID %s", uuid);
 
     LOG_D("Mail UUID %s", uuid);
 
     char tmp_path[256];
 
     char tmp_path[256];
Ligne 39 : Ligne 42 :
 
     FILE *fptr;
 
     FILE *fptr;
 
     fptr = fopen(tmp_path, "w");
 
     fptr = fopen(tmp_path, "w");
   
+
</pre>
 +
 
 +
<pre>
 
     if(fptr == NULL){
 
     if(fptr == NULL){
 
         LOG_E("Couldn't open Maildir tmp");
 
         LOG_E("Couldn't open Maildir tmp");
 
         exit(1);
 
         exit(1);
 
     }
 
     }
 
+
</pre>
     fprintf(fptr, "From: %s\r\n", state->sender);
+
Ici, on utilise une fonction conditionnelle pour informer que l'on n'est pas parvenu à entrer dans le dossier de redirection de mail
 +
<pre>
 +
     fprintf(fptr, "From: %s\r\n", state->sender);  
 
     fprintf(fptr, "To: %s\r\n", state->recipient);
 
     fprintf(fptr, "To: %s\r\n", state->recipient);
     fprintf(fptr, "%s\r\n", state->body); // TODO: change to data
+
     fprintf(fptr, "%s\r\n", state->body);
 
     fclose(fptr);
 
     fclose(fptr);
 
+
</pre>
 +
On transforme les informations stockées dans la structure "state" en format de mail avec la source, le destinataire et le corps.
 +
<pre>
 
     char new_path[256];
 
     char new_path[256];
 
     sprintf(new_path, "/root/Maildir/new/%s", uuid);
 
     sprintf(new_path, "/root/Maildir/new/%s", uuid);
Ligne 59 : Ligne 68 :
 
}
 
}
 
</pre>
 
</pre>
 +
  
 
Test code MTAext.c : vérification<br/>
 
Test code MTAext.c : vérification<br/>
 +
 +
Le mail est composé d'une entête et d'un corps de mail
 
-> compilation/execution de réception de mails (envoyeur, receveur, corps de mail, UUID)<br/>
 
-> compilation/execution de réception de mails (envoyeur, receveur, corps de mail, UUID)<br/>

Version du 17 mars 2023 à 11:26

Infrastructure

Le serveur est disponible sur `yamaha.germond.org` (193.48.57.161), le DNS est hébergé sur mon (bastien) infrastructure[1]

[1]

03/02/2023

Création VM : yamaha (IP : 193.48.57.161)
Lancement de la VM
Ouverture du projet beta

Découverte STMPin


10/02/2023

Réécriture du code
-> à compléter par @Bastien.Germond Création code Maildir/tmp -> réception message (MTAext.c)
Pour générer un identifiant unique, on utilise la librairie <libuuid> : #include <uuid/uuid.h>
https://stackoverflow.com/questions/51053568/generating-a-random-uuid-in-c

int processing_mail(struct smtp_state *state) {
    LOG_D("Processing mail...");

    uuid_t binuuid;// Unique ID in binary
    uuid_generate_random(binuuid);
    char *uuid = malloc(37);//Nb of characters for unique id
    uuid_unparse_lower(binuuid, uuid);//unique id en lettre minuscule

On définit ici un identifiant unique pour pouvoir suivre le mail envoyé (éviter toutes collisions ou perdition de données)

    LOG_D("Mail UUID %s", uuid);
    char tmp_path[256];
    sprintf(tmp_path, "/root/Maildir/tmp/%s", uuid);
    LOG_D("Writing mails at %s", tmp_path);

    FILE *fptr;
    fptr = fopen(tmp_path, "w");
    if(fptr == NULL){
        LOG_E("Couldn't open Maildir tmp");
        exit(1);
    }

Ici, on utilise une fonction conditionnelle pour informer que l'on n'est pas parvenu à entrer dans le dossier de redirection de mail

    fprintf(fptr, "From: %s\r\n", state->sender); 
    fprintf(fptr, "To: %s\r\n", state->recipient);
    fprintf(fptr, "%s\r\n", state->body);
    fclose(fptr);

On transforme les informations stockées dans la structure "state" en format de mail avec la source, le destinataire et le corps.

    char new_path[256];
    sprintf(new_path, "/root/Maildir/new/%s", uuid);
    LOG_D("Move mails at %s", new_path);

    rename(tmp_path, new_path);

    return 0;
}


Test code MTAext.c : vérification

Le mail est composé d'une entête et d'un corps de mail -> compilation/execution de réception de mails (envoyeur, receveur, corps de mail, UUID)