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

De Wiki d'activités IMA
Ligne 41 : Ligne 41 :
  
 
<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>
 
</pre>
 
Ici, on utilise une fonction conditionnelle pour informer que l'on n'est pas parvenu à entrer dans le dossier de redirection de mail.<br/>
 
Ici, on utilise une fonction conditionnelle pour informer que l'on n'est pas parvenu à entrer dans le dossier de redirection de mail.<br/>
 
<pre>
 
<pre>
    fprintf(fptr, "From: %s\r\n", state->sender);  
+
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);
+
fprintf(fptr, "%s\r\n", state->body);
    fclose(fptr);
+
fclose(fptr);
 
</pre>
 
</pre>
 
On transforme les informations stockées dans la structure "state" en format de mail avec la source, le destinataire et le corps.<br/>
 
On transforme les informations stockées dans la structure "state" en format de mail avec la source, le destinataire et le corps.<br/>
Ligne 82 : Ligne 82 :
  
 
'''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<br/>
 +
On lance la compilation du code puis l'executable ./build/MTAext <br/>
 +
La connexion s'établit entre deux terminaux : celui de notre machine virtuelle<br/>
 +
<pre>
 +
root@yamaha:~/SMTP# ./build/MTAext 
 +
[DEBUG] Server opened on 2001:660:4401:60a0::100:0:8025
 +
[DEBUG] loop_server: waiting for incomming connection
 +
[DEBUG] loop_server: waiting for incomming connection
 +
[DEBUG] loop_server: waiting for incomming connection
 +
</pre>
 +
 +
Et celui de la machine PC zabeth19<br/>
 +
<pre>
 +
pifou@zabeth19:~$ telnet yamaha.germond.org 8025
 +
Trying 2001:660:4401:60a0:216:3eff:fe63:515a...
 +
Connected to yamaha.germond.org.
 +
Escape character is '^]'.
 +
250 Welcome
 +
</pre>
  
Le mail est composé d'une entête et d'un corps de mail<br/>
 
 
-> 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/>
 +
On envoit un mail depuis la machine zabeth19<br/>
 +
<pre>
 +
pifou@zabeth19:~$ telnet yamaha.germond.org 8025
 +
Trying 2001:660:4401:60a0:216:3eff:fe63:515a...
 +
Connected to yamaha.germond.org.
 +
Escape character is '^]'.
 +
250 Welcome
 +
HELO zabeth19
 +
250 Hi!
 +
MAIL FROM:<testreception@yamaha.germond.org>           
 +
250 Sender recorded
 +
RCPT TO:<receptiontest@yamaha.germond.org>
 +
250 Target recorded
 +
DATA
 +
Subject: Demonstration du bon fonctionnement de la reception
 +
 +
Avec ce mail nous voyons que nous arrivons à communiquer (envoyer d'une machine quelconque et recevoir sur notre serveur.
 +
</pre>
 +
Et on le reçoit sur notre serveur root@yamaha<br/>
 +
<pre>
 +
[DEBUG] loop_server: waiting for incomming connection
 +
[DEBUG] smtp_process: incomming (cmd: HELO): HELO zabeth19
 +
[DEBUG] _thread_main: process done, closing connection.
 +
[DEBUG] smtp_process: incomming (cmd: MAIL): MAIL FROM:<testreception@yamaha.germond.org>
 +
[DEBUG] smtp_process: incomming (cmd: RCPT): RCPT TO:<receptiontest@yamaha.germond.org>
 +
[DEBUG] smtp_process: incomming (cmd: DATA): DATA
 +
[DEBUG] Processing mail...
 +
[DEBUG] Mail UUID 3a59c1ca-c52a-4af9-8b22-9e9beb1faf53
 +
[DEBUG] Writing mails at /root/Maildir/tmp/3a59c1ca-c52a-4af9-8b22-9e9beb1faf53
 +
[DEBUG] Move mails at /root/Maildir/new/3a59c1ca-c52a-4af9-8b22-9e9beb1faf53
 +
[DEBUG] _thread_main: process done, closing connection.
 +
</pre>
 +
 +
Avec la commande <mutt>, on peut vérifier que le mail est bien parvenu jusqu'à notre serveur : <br/>
 +
<pre>
 +
  1 N  Jan 01 testreception@y (0.1K) Demonstration du bon fonctionnement de la reception
 +
  2    Jan 01 bastien@yamaha. (0.1K)
 +
  3 O  Jan 01 bastien@yamaha. (0.1K) Test mail
 +
  4    Jan 01 a@b.c          (0.1K)
 +
  5    Jan 01 a@b.c          (0.1K)
 +
  6    Jan 01 a@b.c          (0.1K)
 +
</pre>

Version du 17 mars 2023 à 12:22

Infrastructure

Le serveur est disponible sur <yamaha.germond.org> (193.48.57.161), le DNS est hébergé sur l'infrastructure de @Bastien.Germond [1]

[1]


Architecture

Le projet est sous Meson ; pour compiler, on utilise la commande <meson compile -C build>

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).

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.

int server_process(int sfd) {
    return smtp_process(sfd, processing_mail);
}
int main(void) {
    log_init_default("-", LOG_DEBUG);

    int sock = init_server("yamaha.germond.org", "8025", NULL);

    if (sock < 0) {
        LOG_C("Failed to start server");
        return EXIT_FAILURE;
    }

    int status = loop_server(sock, server_process);

    if (status < 0) {
        LOG_E("MTAext: server closed unexpectedly");
    };

    return 0;
}

La fonction main permet d'initialiser et de lancer notre serveur <yamaha.germond.org> (récupérer l'adresse IPV4/V6) et d'informer des erreurs.

Test code MTAext.c : vérification
Le mail est composé d'une entête et d'un corps de mail
On lance la compilation du code puis l'executable ./build/MTAext
La connexion s'établit entre deux terminaux : celui de notre machine virtuelle

root@yamaha:~/SMTP# ./build/MTAext  
[DEBUG] Server opened on 2001:660:4401:60a0::100:0:8025
[DEBUG] loop_server: waiting for incomming connection
[DEBUG] loop_server: waiting for incomming connection
[DEBUG] loop_server: waiting for incomming connection

Et celui de la machine PC zabeth19

pifou@zabeth19:~$ telnet yamaha.germond.org 8025
Trying 2001:660:4401:60a0:216:3eff:fe63:515a...
Connected to yamaha.germond.org.
Escape character is '^]'.
250 Welcome

-> compilation/execution de réception de mails (envoyeur, receveur, corps de mail, UUID)
On envoit un mail depuis la machine zabeth19

pifou@zabeth19:~$ telnet yamaha.germond.org 8025
Trying 2001:660:4401:60a0:216:3eff:fe63:515a...
Connected to yamaha.germond.org.
Escape character is '^]'.
250 Welcome
HELO zabeth19
250 Hi!
MAIL FROM:<testreception@yamaha.germond.org>            
250 Sender recorded
RCPT TO:<receptiontest@yamaha.germond.org>
250 Target recorded
DATA 
Subject: Demonstration du bon fonctionnement de la reception

Avec ce mail nous voyons que nous arrivons à communiquer (envoyer d'une machine quelconque et recevoir sur notre serveur.

Et on le reçoit sur notre serveur root@yamaha

[DEBUG] loop_server: waiting for incomming connection
[DEBUG] smtp_process: incomming (cmd: HELO): HELO zabeth19
[DEBUG] _thread_main: process done, closing connection.
[DEBUG] smtp_process: incomming (cmd: MAIL): MAIL FROM:<testreception@yamaha.germond.org>
[DEBUG] smtp_process: incomming (cmd: RCPT): RCPT TO:<receptiontest@yamaha.germond.org>
[DEBUG] smtp_process: incomming (cmd: DATA): DATA
[DEBUG] Processing mail...
[DEBUG] Mail UUID 3a59c1ca-c52a-4af9-8b22-9e9beb1faf53
[DEBUG] Writing mails at /root/Maildir/tmp/3a59c1ca-c52a-4af9-8b22-9e9beb1faf53
[DEBUG] Move mails at /root/Maildir/new/3a59c1ca-c52a-4af9-8b22-9e9beb1faf53
[DEBUG] _thread_main: process done, closing connection.

Avec la commande <mutt>, on peut vérifier que le mail est bien parvenu jusqu'à notre serveur :

 
   1 N   Jan 01 testreception@y (0.1K) Demonstration du bon fonctionnement de la reception
   2     Jan 01 bastien@yamaha. (0.1K)
   3 O   Jan 01 bastien@yamaha. (0.1K) Test mail
   4     Jan 01 a@b.c           (0.1K)
   5     Jan 01 a@b.c           (0.1K)
   6     Jan 01 a@b.c           (0.1K)