Travaux Dirigés de aci
1. Le Post Office Protocol coté serveur

Cette séance étudie la relation client/serveur à travers un protocole textuel très simple mais mondialement utilisé : le POST OFFICE PROTOCOL. La plupart des machines sans adresse Internet permanente s’en serve pour retirer leur courrier auprès d’une machine en possédant une. Ce protocole est constitué de requêtes exprimées par quatre lettres majuscules suivies éventuellement d’arguments et obligatoirement d’un saut de ligne (voir le RFC1939 pour une étude complète). Ces requêtes sont envoyées exclusivement par le client, nommé Mail Retrieval Agent. Le serveur, nommé Mail User Agent, répond par une ligne dont les premiers caractères sont soit +OK soit -ERR, suivis éventuellement d’autres informations.

La séance en salle machine sera consacrée à l’écriture du client, la présente séance étant consacrée à l’écriture du serveur en C à partir du canevas serveur.c fourni en annexe. Ce canevas comporte des appels à des fonctions qu’il s’agit d’écrire, et dont la signature est fournie dans peroraison.h également en annexe. Chaque fonction f est supposée rédigée dans un fichier homonyme (au .c final près), dont la première ligne sera #include "peroraison.h" ce qui permettra une compilation séparée par make f.o grace au Makefile fourni. En cas d’erreur, il faudra appeler la fonction peroraison présente dans le fichier C homonyme.

La structure de données mra, déclarée dans peroraison.h, contient des champs dont voici la signification, et qui seront initialisés à des valeurs conventionnelles indiquant à quel moment du dialogue se trouve le client :

La fonction PopQUIT est donnée comme exemple de traitement d’une requête. Normalement elle détruit les messages indiqués par les requêtes DELE précédentes, mais il faudrait gérer les accès simultanés ce qui déborde le cadre de cet enseignement.


peroraison.c
peroraison.h
Makefile
serveur.c


1 Caractéristiques de l’implémentation

Le serveur

  1. alloue-t-il de la mémoire au cours de son exécution et risque-t-il de ne pas rendre toute celle demandée ?
  2. risque-t-il de saturer la table des processus ?
  3. peut écouter au maximum combien de clients ?
  4. invoque la fonction traitant une requête donnée par quel moyen ?

Obtenir un formulaire de soumission de comptes rendus

2 Surveillance du serveur POP

Ecrire la fonction surveillance qui surveille l’ensemble des descripteurs en lecture, à l’aide de la fonction select. Normalement un serveur POP s’exécute indéfiniment, mais dans le cadre d’un exercice on prendra soin de l’arrêter si pendant MAXWAIT secondes aucun client ne s’est manifesté


Obtenir un formulaire de soumission de comptes rendus

3 Initialisation d’une connexion POP

Définir la fonction initclient devant accepter la connection d’un nouveau client sur une nouvelle socket. Celle-ci sera ajoutée à l’ensemble à surveiller et mémorisée dans la structure mra associée au client, dont tous les autres champs seront initialisés à la chaîne vide. La socket sera retournée en résultat de la fonction.

On pourra également utiliser la fonction gethostbyaddr pour avoir une trace dans le flux de sortie des noms des machines que le serveur a acceptées comme clientes.


Obtenir un formulaire de soumission de comptes rendus

4 La requête USER côté serveur

La requête USER donne comme argument un nom d’utilisateur. La liste des propriétaires de boites aux lettres est fournie par le fichier /etc/passwd du serveur (il y a évidemment d’autres situations possibles). Ce fichier est structuré en ligne de texte comportant des champs séparés par des deux-points, le premier champ indiquant le nom de l’utilisateur et le sixième son répertoire principal.

Par ailleurs, la version standard de ce protocole exige la transmission en clair sur le réseau du mot de passe de l’utilisateur avec la requête PASS. Cette technique peu fiable étant à réprouver et son implémentation ne relevant pas de cet enseignement, on implémentera une alternative, insuffisante mais proche de méthodes plus modernes : regarder si l’adresse du client figure dans un fichier des machines considérées comme propriété exclusive du propriétaire de la boîte aux lettres.

En conséquence, écrire la fonction PopUSER qui :

et renvoie l’avis d’échec ou de réussite de la requête.


Obtenir un formulaire de soumission de comptes rendus

5 La requête LIST côté serveur

La requête LIST vérifie tout d’abord que le client s’est authentifié, puis retourne l’avis d’échec ou de réussite, et dans ce dernier cas une suite de lignes dont la dernière se réduit à un point. Les autres sont constituées de deux nombres, le premier indiquant un numéro de message et le deuxième sa taille en octets. La requête indique ainsi l’intégralité des messages présents (en fait elle admet des arguments mais on ne s’en occupera pas ici).

Pour répondre à cette question, il est indispensable de connaître le format standard dit MBOX. Dans un fichier de boîte aux lettres, un message commence par la chaîne ``From ’’ terminée par une espace (pas d’un deux-points ! ce cas dénote un en-tête SMTP qui en général figure juste après mais peu importe) et précédée d’une ligne blanche ou du début du fichier (on verra à la question suivante comment est résolu le cas d’un message comportement une telle ligne).

Écrire la fonction PopLIST, réalisant ces spécifications.


Obtenir un formulaire de soumission de comptes rendus

6 La requête RETR côté serveur

La requête RETR admet un argument, numéro d’un message effectivement présent dans la boîte. Elle vérifie tout d’abord que le client s’est authentifié, puis renvoie l’intégralité du message demandé (en-têtes SMTP puis corps du message), suivie d’un ligne réduite à un point. Afin de lever tout ambiguîté, toute ligne commençant par un point dans le corps du message devra être envoyée avec un point supplémentaire au début, charge au client de ne pas en tenir compte.

Un problème analogue est traité en amont : lorsque le corps d’un message contient une ligne commençant par ``From ’’, cette ligne aura été placée dans le fichier MBOX avec un > en début. Comme de nouveau il peut exister une ligne commençant par ``>From ’’, une telle ligne aura été placée dans le fichier avec >> et ainsi de suite. Autrement dit, toute ligne commençant par des > suivis de ``From ’’ sera renvoyée sans son > initial.

Ecrire la fonction PopRETR implémentant ces fonctionnalités.


Obtenir un formulaire de soumission de comptes rendus

logo-spip E. Saint-James & F. Kordon - Master Informatique - UPMC Valid XHTML 1.0!
Calculé le 21 janvier 2021 à 18h58min