Discussion: Problème de droit
Afficher un message
Vieux 26/02/2006, 14h33   #3
Emmanuel Dreyfus
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Problème de droit

Bruno-L <bruno@bluesilk.be.invalid> wrote:

> quelqu'un voit il un moyen d'interdire le renomage de répertoire tout en
> y autorisant l'ajout de fichiers ?


Je ferais un petit programme en C qui serait set-UID sur un usager
adequat pour ajouter des fichiers au repertoire et qui appellera cp en
sous main après avoir validé que l'UID réel a bien le droit de lire le
fichier qu'il veut deplacer, que ce fichier en est bien un, et tout ce
genre de chose...

Un truc du genre ca (pas compilé, pas testé. Y'aura peut être un
problème à prévoir avec le repertoire courrant)

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <err.h>
#include <sysexits.h>
#include <sys/stat.h>

#define OUTPUT_DIR "/var/tmp/truc"
#define _BIN_CP "/bin/cp"
int
main(argc, argv)
int argc;
char **argv;
{
struct stat st;
char *ap[] = { _BIN_CP, NULL, OUTPUT_DIR, NULL };
char *ep[] = { NULL };

if (argc != 2)
errx(EX_USAGE, "usage: %s filename", argv[0]);

if (access(argv[1], R_OK) != 0)
err(EX_NOPERM, "unable to read \"%s\"", argv[1]);

if (stat(argv[1], &st) != 0)
err(EX_OSERR, "stat failed on \"%s\"", argv[1]);

if (st.st_mode & S_IFMT != S_IFREG)
errx(EX_NOPERM, "\"%s\" is not a plain file", argv[1]);

ap[1] = argv[1];
(void)execve(_BIN_CP, ap, ep);
err(EX_OSERR, "%s %s %s failed", _BIN_CP, argv[1], OUTPUT_DIR);

/* NOTREACHED */
return EX_SOFTWARE;
}

--
Emmanuel Dreyfus
Publicité subliminale: achetez ce livre!
http://www.eyrolles.com/Informatique.../livre-bsd.php
manu@netbsd.org
  Réponse avec citation
 
Page generated in 0,05046 seconds with 9 queries