Plusieurs à éditer un fichier
Objectif
On suppose qu'un petit groupe d'utilisateurs
travaille en commun à modifier un (ou quelques) fichier(s).
Il s'agit de proposer et de programmer un
moyen de réaliser ceci.
Il y a deux approches possibles :
-
Donner au fichier des droits Unix
qui limitent les droits en écriture aux
utilisateurs concernés ;
-
Une première technique passe par la création d'un compte
spécifique (e.g. gourous) qui sera
propriétaire et aura
le droit d'écrire dans ce fichier, et de donner
le mot de passe de ce compte à tous les
utilisateurs concernés.
-
Une autre technique passe par la création d'un groupe unix
dont seront membres tous les
utilisateurs concernés.
Le fichier sera autorisé en écriture
pour les membres du groupe.
Le problème pour ces deux solutions est qu'elles
ne permettent pas de s'assurer que deux utilisateurs
n'éditent pas le fichier simultanément.
De plus, il faut être root pour créer
un compte ou un groupe.
-
Réaliser un programme spécifique
pour éditer ce fichier.
-
Une première approche utilise un programme set-uid
qui a ainsi les droits d'écriture dans le fichier.
C'est cette approche qu'on utilisera aujourd'hui.
-
Une seconde approche utilise une architecture de type
client-serveur. C'est cette approche qui est la plus
utilisée en pratique, par exemple à l'aide de cvs.
Ce programme vérifiera l'identité de l'utilisateur
avant d'autoriser l'édition.
On préfère un programme configurable dont le fichier de
configuration indique pour chaque fichier géré par le programme
la liste des utilisateurs autorisés.
L'avantage est que n'importe qui peut mettre
en place ce système et qu'il est possible
d'y rajouter une vérification pour éviter
les accès simultanés (lock).
Un inconvénient est qu'à moins de créer
un compte réservé à cet usage (par exemple appelé cvs)
le propriétaire du fichier (qui est a priori l'un des utilisateurs)
a la possibilité de contourner le système de verrous.
Pour l'édition du fichier, trois techniques peuvent être imaginées.
-
Une première solution est de
programmer dans le programme de modification un éditeur de texte.
C'est un peu fastidieux.
-
Une seconde solution est que le programme
sous-traite l'édition à un éditeur de texte particulier,
par exemple choisi par l'utilisateur avec l'une des
variables d'environnement VISUAL
ou EDITOR.
-
Une troisième solution est de
faire éditer une copie du fichier.
Exercices
Le programme modif peut être réalisé
indifféremment en C, en perl ou en shell.
Pour changer des TP précédents, on préférera le C...
Vérification d'appartenance à la liste des utilisateurs autorisés
Le programme
est appelé avec un argument, le nom du fichier
qu'on veut éditer. Il lit la liste des utilisateurs autorisés
dans son fichier de configuration (par exemple .modifrc)
et renvoie un message qui dit si la modification de
ce fichier est autorisée pour l'utilisateur qui
a exécuté le programme.
Attention. Pour des raisons de sécurité, on place le fichier
.modifrc dans le homedir du
propriétaire du programme modif, et on s'arrange
pour qu'il ne soit lisible que par celui-ci.
NB : faites des vérifications en collaboration avec votre voisin !
Solution
Modification du fichier
Modifier le programme de l'exercice précédent
pour qu'il appelle un éditeur externe,
selon les variables d'environnement VISUAL ou EDITOR.
On utilise system ou fork et exec
(vous verrez ces fonctions en détail plus tard).
Réfléchir aux problèmes de sécurité.
Regarder par exemple la description du shell
/usr/lib/rsh (Solaris)
ou /usr/libexec/smrsh (FreeBSD).
Verrouillage du fichier
Il existe des primitives pour permettre le verrouillage
d'un fichier et éviter l'édition simultanée.
Regarder flock et fcntl.
Une autre solution, a priori plus simple à implanter,
est de créer un fichier qui s'appelle
filename.lock et dont l'existence indique que le fichier
est en cours de modification
(c'est par exemple
ce que fait netscape
pour ne pas être lancé plusieurs fois).
Comparer ces méthodes et programmer l'une d'entre elles.