MyFTPd
Transcription
MyFTPd
MyFTPd Version 1 4 janvier 2007 Yaka 2008 <yaka.fr> 1 Copyright This document is for internal use only at EPITA <http://www.epita.fr/>. c 2006 Assistants <[email protected]> Copyright Copying is allowed only under these conditions: • You must have downloaded your copy from the Assistants Intranet <https://www.acu.epita.fr/intra/>. • You must make sure you have the latest version of this document. • It is your responsibility to make sure that this document stays out of reach of students or individuals outside your year (your "promotion"). i Table des matières 1 Obligations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 Rendu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 Consignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 Mise en situation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 5 Serveur FTP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 5.1 5.2 5.3 5.4 6 0, 1, 2, 3, Brigitte Lahaye . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Laure St-Clair. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clara Morgane . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Estelle Desanges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 8 8 9 Bonus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 6.1 6.2 6.3 6.4 7 Level Level Level Level Bonus Bonus Bonus Bonus 0, Katsumi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1, Mélanie Coste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2, Julia Channel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 ..., Laurence Boccolini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 10 10 10 Dernières remaques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 7.1 Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Chapitre 1: Obligations 1 Obligations • lire le sujet en entier, • suivre les consignes, • respecter le rendu. 2 Chapitre 2: Rendu 3 2 Rendu Date de rendu : Responsables du projet : Ramassage par upload sur l’intranet. Nom de la tarball : Répertoire de décompression : Nom de l’exécutable : Répertoire de l’exécutable : Newsgroup dédié : Langage : Architecture/OS : Compilateur sous NetBSD : Options de compilation NetBSD : Compilateur sous Alpha : Options de compilation Alpha : Compilateur sous SunOS : Options de compilation SunOS : Compilateur sous Linux : Options de compilation Linux : Compilateur sous MacOSX : Options de compilation MacOSX : Compilateur sous HP-UX : Options de compilation HP-UX : Fonctions autorisées : 28/01/2007 12h00, heure du serveur NFS Edouard Bataille <[email protected]> Damien Leduc <[email protected]> Martin Van-Laere <[email protected]> ‘login_l-MyFTPd.tar.bz2’ ‘login_l-MyFTPd’ ‘myftpd’ ‘myftp’ ‘login_l-MyFTPd/’ epita.cours.c-unix.ispe C exclusivement i386 NetBSD Alpha OSF1 (solaria, gaia, aurora, guiscar) Sparc SunOS (totec, atlaua, maya) i386 Linux (Villejuif) PowerPC/MacOS X (azteque) ia64/HP-UX (inca) /usr/bin/gcc ‘-Wall -W -Werror -ansi -pedantic -fomit-frame-pointer’ /bin/cc ‘-w2 -std1 -warnprotos’ /usr/local/bin/gcc ‘-Wall -W -Werror -ansi -pedantic -m64 -fomit-frame-pointer’ /usr/bin/gcc ‘-Wall -W -Werror -pedantic -fomit-frame-pointer’ /usr/bin/gcc ‘-Wall -W -Werror -ansi -pedantic -fomit-frame-pointer’ /usr/local/bin/gcc ‘-W all -W -Werror -pedantic -fomit-frame-pointer’ read(2), write(2), open(2), close(2), fork(2), exit(2), wait*(2)+macros, socket(2), accept(2), bind(2), connect(2), listen(2), recv(2), send(2), inet_addr(3), byteorder(3), gethostbyname(3), malloc(3), free(3), assert(3), perror(3), errno(3), memset(3), unlink(2), rmdir(2), mkdir(2), opendir(3), closedir(3), readdir(3), pthread_*(3), setsid(2), realloc(3), getcwd(3), gethostname(2) Chapitre 3: Consignes 4 3 Consignes Les informations qui suivent sont très importantes : Le non-respect d’une des consignes suivantes entraı̂nera des sanctions pouvant aller jusqu’à la multiplication de la note finale par 0. Ces consignes sont claires, non-ambiguës, et ont un objectif précis. En outre, elles ne sont pas négociables. Si vous ne comprenez pas une consigne, demandez de l’aide. • consigne 01 : Ce travail est à réaliser en groupe de 4. • consigne 02 : Toutes les fonctions et commandes qui ne sont pas explicitement autorisées sont interdites. Les abus peuvent entraı̂ner jusqu’à l’obtention de la note de -21 non négociable. • consigne 03 : La triche, l’échange de code source, de tests, d’outils de tests et de correction de norme, sont pénalisés par une note de -42 non négociable. • consigne 04 : Les includes standards sont autorisés. Vous devez également rendre vos propres fichiers d’en-tête. Pensez à enlever les sources qui ne sont pas nécessaires afin d’éviter d’enfreindre involontairement une des consignes. • consigne 05 : Lorsque des formats de sortie vous sont donnés en exemple, vous devez les respecter scrupuleusement. Les exemples sont indentés, faites attention ! Le prompt est symbolisé par ‘42sh$ ’, servez-vous en comme point de repérage. • consigne 06 : Vous devez automagiquement et systémagiquement coder à la norme, si elle existe pour le langage à utiliser, sauf mention contraire dans le sujet ou par l’intermédiaire des responsables de projet. Dans tous les cas, votre code devra rester propre et lisible, en ne dépassant pas 80 colonnes. • consigne 07 : Si un exécutable est demandé, vous devez uniquement fournir ses sources dans le répertoire ‘src’, sauf mention contraire. Ils seront compilés par nos soins. • consigne 08 : Une tarball non propre est une tarball qui contient des fichiers interdits (‘*~’, ‘*.o’, ‘*.a’, ‘*.so’, ‘*#*’, ‘*core’, binaires, ‘*.Dstore’, ‘*.log’, . . . ). Une tarball non propre est également celle qui contient des fichiers ayant des droits d’exécution qui n’ont pas lieu d’être. La tarball doit renfermer les fichiers usuels ayant les droits 604, et 705 pour les scripts et les répertoires. Toute tarball non propre coûtera 2 points. • consigne 09 : Si un fichier ‘configure’ se trouve à la racine de votre rendu il sera exécuté avec la commande ./configure1 avant tout autre chose. Le fichier ‘configure’ devra donc être un exécutable. 1 Vous ne devez jamais supposer que la variable d’environnement PATH inclue le répertoire courant. Chapitre 3: Consignes 5 • consigne 10 : La racine de votre rendu doit contenir un fichier ‘Makefile’ contenant les règles : all doit compiler les sources de votre projet avec les options de compilations précisées dans le sujet. Les binaires ‘myftpd’ ‘myftp’ compilés devront se trouver à la racine de votre rendu. server doit compiler les sources de votre server FTP avec les options de compilations précisées dans le sujet. Le binaire ‘myftpd’ compilé devra se trouver à la racine de votre rendu. doc doit générer la documentation de votre projet aux format html et pdf, à partir des commentaires au format Doxygen présent dans votre code source. La documentation doit se trouver dans le répertoire ‘doc’. clean doit supprimer tous les fichiers temporaires générés à la compilation, ainsi que les fichiers temporaires. distclean doit avoir les mêmes fonctionalités que clean, et supprimer également tous les binaires et bibliothèques générées à la compilation. dist doit générer votre tarball, propre, pour le rendu, dans le dossier racine de votre projet (‘login_l-MyFTPd’). check doit appeler votre moulinette de test et tester votre projet de manière autonome. bonus doit compiler les sources de votre projet avec les options de compilations de votre choix. Les binaires ‘myftpd’ et ‘myftp’ compilés avec les bonus activés devront se trouver à la racine de votre rendu. Pour tester votre projet, nous exécuterons la commande gmake dist. La tarball ainsi générée sera ensuite décompressée et nous compilerons au moyen de la commande gmake clean all. • consigne 11 : Arborescence de rendu attendue. L’existence des fichiers suivis d’un astérisque sera testée. login_l-MyFTPd/AUTHORS * login_l-MyFTPd/ChangeLog login_l-MyFTPd/Makefile * login_l-MyFTPd/README * login_l-MyFTPd/TODO * login_l-MyFTPd/BONUS login_l-MyFTPd/configure login_l-MyFTPd/src/{sources} login_l-MyFTPd/check/{scripts, tests...} * login_l-MyFTPd/src/Makefile * login_l-MyFTPd/lib/ login_l-MyFTPd/doc/{Doxyfile, ...} On appelle répertoire racine de votre rendu le répertoire ‘login_l-MyFTPd’ où ‘login_l’ est à remplacer par le login du chef de groupe (votre login si c’est un projet à réaliser seul). On trouvera dans celui-ci les fichiers suivants : ‘AUTHORS’ le (ou les) auteur(s) du projet. Il doit respecter le format de la norme EPITA. Toute erreur dans celui-ci peut multiplier votre note par zéro. Chapitre 3: Consignes 6 ‘Changelog’ décrit les modifications apportées au projet. • • • • ‘README’ décrit le projet et les algorithmes utilisés en quelques phrases rédigées dans un anglais correct. Il doit également expliquer comment utiliser votre programme. ‘TODO’ décrit les différentes tâches à accomplir. régulièrement. ‘BONUS’ décrit les différentes bonus. Il doit contenir la liste de ceux-ci. Il doit être mis à jour Votre moulinette de tests et vos bonus seront évalués par un assistant en soutenance. Il regardera les fonctionnalités de ceux-ci et pourra vous rapporter des points supplémentaires en soutenance. Une moulinette ne respectant pas les règles énoncées précédemment entraı̂nera un malus sur la note globale du projet. Vos bonus ne devront pas interférer avec la partie obligatoire. consigne 12 : Pour tout problème relatif au projet, vous pouvez rentrer en contact avec les assistants : [email protected]. Étant donné que le traitement des courriels est en partie automatisé, il est impératif de respecter un certain format pour le sujet des mails. Vous pouvez consulter le règlement à l’adresse https://www.acu.epita.fr/intra/docs/mails.html. consigne 13 : Il est strictement interdit de supprimer le répertoire ‘rendu’ placé à la racine de votre compte. Cette règle est valable pour toute votre année. consigne 14 : Vous devez rendre à l’heure. Tout retard, même d’une seconde, entraı̂nera au mieux la note de zéro non négociable. conseil : N’attendez pas les derniers jours pour commencer le mini-projet. Chapitre 4: Mise en situation 7 4 Mise en situation L’objectif de ce mini-projet est de vous familiariser avec la programmation réseau. Afin d’assurer l’inter-compatibilité entre un client et un serveur, ont été défini des protocoles standards qui permettent aux clients et aux serveurs de se comprendre. Nous allons vous demander d’implémenter un serveur FTP (File Transfert Protocol) qui respecte ces standards. La RFC 959 décrit ce protocole. http://rfc.net/rfc0959.html http://www.faqs.org/rfcs/rfc959.html Chapitre 5: Serveur FTP 8 5 Serveur FTP 5.1 Level 0, Brigitte Lahaye Vous devez implémenter un serveur FTP minimaliste qui n’accepte que les connections anonymes (USER anonymous, PASS <n’importe quoi>) et qui supporte les commandes suivantes: USER PASS HELP NOOP CWD PWD SYST QUIT user name password help no operation change working directory print working directory system logout A ce niveau votre programme devra pouvoir être lancé avec les options suivantes: -h -p <num> affiche l’aide port sur lequel le serveur écoute (n’étant pas root vous ne pouvez pas utiliser les ports inférieurs à 1024). 5.2 Level 1, Laure St-Clair Un serveur FTP, à la base, doit servir à échanger des fichiers. Vous devez donc gérer les commandes suivantes: TYPE PORT LIST RETR STOR representation type data port list directory retrieve store Remarque: On ne vous demandera que de gérer le type I (image) et A (ascii). A ce niveau votre programme devra pouvoir être lancé avec les options suivantes: -d -l <‘journal.log’> "Démonise" le serveur. Log (enregistre) les requêtes effectuées sur le serveur dans le fichier spécifier en paramètre. 5.3 Level 2, Clara Morgane Le mode passif c’est bien pratique, surtout quand on a un firewall. On va donc vous demander d’implémenter la gestion de ce mode. Et puis tant qu’on y est on va rajouter trois autres commandes qui sont vraiment facile à faire et bien pratique. PASV DELE MKD RMD passive delete create directory remove directory A ce niveau votre programme devra pouvoir être lancé avec les options suivantes: -i <adresse IP> -P <port inf-port sup> Adresse IP du serveur (utile si le serveur est derrière une gate). Range de ports disponible pour le mode passif. Chapitre 5: Serveur FTP 9 5.4 Level 3, Estelle Desanges Maintenant que votre serveur fonctionne il serait bien de le sécuriser un peu. Vous devez gérer l’authentification des utilisateurs. Les comptes utilisateurs seront stockés dans un fichier sous la forme suivante: login:password:home_dir 42sh$ cat -e user.db lahaye_b:qwerty:~/my_ftp/home/vieillepeau$ st-cla_l:12345678:~/my_ftp/home/bellissima$ morgan_c:@&42zA)w:~/my_ftp/home/calendrier$ ftp::~/my_ftp/pub$ epita:epita:/sgoinfre$ Pour ce niveau, votre programme devra supporter l’option suivante: -a <file> spécifie le fichier avec les comptes utilisateurs Ne nous et ne vous prenez pas la tête avec des “Et si y a un ’:’ dans le mot de passe ?” sinon la réponse sera “MAINTENANT OUI !!!” Exemple d’utilisation du serveur avec toutes les options. 42sh$ ./myftpd -p 2048 -d -l journal.log -i 127.0.0.1 -P 17125-23420 -a user.db 42sh$ Chapitre 6: Bonus 10 6 Bonus Les bonus seront évalués en soutenance. Voici une liste d’idées de bonus, personne ne vous force à les faire. Vous pouvez faire les bonus dans n’importe quel ordre. Certain sont super hardcore, ne perdez pas votre temps dessus. Si vous avez d’autres idées, n’hésitez pas, faites vous plaisir, lâchez vous ! Remarque: Certain bonus peuvent nécessiter l’utilisation de bibliothèques qui ne sont pas présentes sur tous les systèmes, les systèmes obligatoires pour les bonus sont NetBSD et Linux, les autres systèmes sont optionnels. 6.1 Bonus 0, Katsumi Le protocole FTP n’est pas sûr, les mots de passe, logins, et fichiers circulent en clair sur le réseau. Sécurisons tout cela avec des systèmes simples et pratiques. • Faire une authentification plus sûre (MD5, SHA, Challenge-Response, etc) • Utiliser la OpenSSL (libcrypt ou libcrypto) pour sécuriser les transferts. 6.2 Bonus 1, Mélanie Coste Le serveur implémentés comportent les fonctionnalitées de base du protocole FTP. Ajoutons donc quelques commandes supplémentaires. • réaliser le support de la commande : resume (reprise de transfert). • réaliser le support du FXP (transfert de serveur à serveur). • Gerer les connexions via un pool de threads dont le nombre serait configurable. 6.3 Bonus 2, Julia Channel Le serveur est un bon serveur, il fait bien sont boulot, mais il est un peut galère à lancer au démarrage du systième et à administrer. • Faire un fichier de configuration pour éviter de passer des arguments au serveur. • Interface d’administration (basic, ncurses, gtk, web, autres ...). 6.4 Bonus 3..., Laurence Boccolini Voilà, vous avez eu quelques exemples de bonus réalisables, maitenant si vous avez d’autres idées pour rendre le serveur plus agréable à utiliser, ajouter de nouvelles fonctionnalités, etc... Tout est permis tant que cela n’altère en rien la partie obligatoire. L’activation des bonus peut se faire via des macros, l’ajout de fichiers ‘.c’, le patch des sources, etc... Chapitre 7: Dernières remaques 11 7 Dernières remaques 7.1 Code • Essayez de vous amuser, ne cherchez pas la petite bête, le sujet n’est pas fait pour ça. • De même, l’utilisation des threads, semaphores, mutex est fortement recommandée (N’oubliez pas que le fork est interdit). • Le fait de faire des bonus, à fortiori que des bonus, alors que le serveur n’est pas fonctionnels (valide au moins plus de la moitié des niveaux disponibles), sera assimilé à du foutage de gueule. • Lors de vos tests, faites attention à ne pas utiliser le même port qu’une autre personne testant son projet sur la même machine. Utiliser votre UID comme port est globalement une bonne idée.