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.