diff --git a/question7/file_testA b/question7/file_testA new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/question8/Makefile b/question8/Makefile index ec724a5e4eb9f8da7dcfb2180a6da073fc856a90..171d29b218615c16236ecc606578d41ad04cd778 100644 --- a/question8/Makefile +++ b/question8/Makefile @@ -1,8 +1,8 @@ CC = gcc CFLAGS = -Wall -Werror -Wextra -lab : delFile +lab : rmg -delFile : supprimerFichier.o +rmg : supprimerFichier.o $(CC) -o $@ $^ -supprimerFichier.o : supprimerFichier.c \ No newline at end of file +supprimerFichier.o : supprimerFichier.c diff --git a/question8/delFile b/question8/delFile deleted file mode 100755 index d96f43e80279942110e97ba5b27a62dd33657ee5..0000000000000000000000000000000000000000 Binary files a/question8/delFile and /dev/null differ diff --git a/question9/Makefile b/question9/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..84c90b0d50520f8e265220093955bd1a1dafd12b --- /dev/null +++ b/question9/Makefile @@ -0,0 +1,12 @@ +CC = gcc +CFLAGS = -Wall -Werror -Wextra + +lab : rmg pwg + +rmg : supprimerFichier.o + $(CC) -o $@ $^ +supprimerFichier.o : supprimerFichier.c + +pwg : pwg.o + $(CC) -o $@ $^ +pwg.o : pwg.c \ No newline at end of file diff --git a/question9/pwg b/question9/pwg new file mode 100755 index 0000000000000000000000000000000000000000..5edf9ec8f2de996f5ee3d95b285bc9f9c67b3abe Binary files /dev/null and b/question9/pwg differ diff --git a/question9/pwg.c b/question9/pwg.c new file mode 100644 index 0000000000000000000000000000000000000000..01e030674d4d4976fb62ab99990bd8d8ef18ecaa --- /dev/null +++ b/question9/pwg.c @@ -0,0 +1,116 @@ +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <sys/types.h> +#include <stdlib.h> +#include <errno.h> + + +char * encrypt(char * message){ + char * encrypted = malloc(strlen(message)); + + for(int i = 0 ; i < (int)strlen(message); i++){ + encrypted[i] = message[i]-5; + } + + return encrypted; +} + +char * crypted(char * message){ + char * crypted = malloc(strlen(message)); + + for(int i = 0 ; i < (int)strlen(message); i++){ + crypted[i] = message[i]+5; + } + + return crypted; +} + +int main(int argc , char * argv[]){ + + if(argc < 3){ + fprintf(stderr,"Erreur : veuillez mettre votre login et mots de passe dans la commmande\n "); + fprintf(stderr,"Usage : ./pwg username password\n "); + exit(EXIT_FAILURE); + } + + // On ouvre le fichier passwd en lecture + FILE * passwd; + passwd = fopen("/home/admin/passwd", "r"); + if(passwd == NULL){ + fprintf(stderr, "Erreur : Incapable d'ouvrir le fichier /home/admin/passwd \n"); + return -1; + } + + // On créer un nouveau fichier dans lequelle on va écrire + FILE * newpasswd; + newpasswd = fopen("/home/admin/newpasswd","a+"); + if(newpasswd == NULL){ + fprintf(stderr, "Erreur : Incapable d'ouvrir le fichier /home/admin/newpasswd %d\n",errno); + return -1; + } + + // On regarde si l'utilisateur a deja un mot de passe dans le fichier passwd + char * username = argv[1]; + char * oldPassword = malloc(50); + int hasOldPassword = 0; + int try = 3; + int passcheck = 0; + char enterOldPassword[50]; + // On parcours le fichier pour voir si son login existe + char buffer[50]; + while ( ! feof( passwd) ) { + fgets( buffer, 50 , passwd ); + if ( ferror( passwd ) ) { + fprintf( stderr, "Erreur : Probléme lors de la lecture du fichier /home/admin/passwd , code de retour %d\n", errno ); + break; + } + + char * line = malloc(50); + line= strcpy(line,buffer); + char *ptr = strtok(buffer, " "); + if(ptr != NULL){ + // Si le login existe on récupere le mot de passe + if(strncmp(username,ptr,strlen(username)) == 0){ + char * tmp = strtok(NULL," "); + oldPassword = strcpy(oldPassword,tmp); + hasOldPassword = 1; + }else if(! feof(passwd)) { + //On écrit chaque ligne si elle ne correspond pas au login + fprintf(newpasswd,"%s",line); + } + } + + } + // On saisie l'ancien mot de passe et on verifie si c'est le bon + while(hasOldPassword && !passcheck && try > 0){ + fprintf(stdout,"Veuillez saisir votre ancien mot de passe : \n"); + scanf("%s",enterOldPassword); + + if(strncmp(encrypt(oldPassword),enterOldPassword,strlen(enterOldPassword))){ + fprintf(stderr,"ERREUR : Mot de passe incorrect veuillez recommencer \n"); + try = try - 1; + }else{ + passcheck = 1; + } + } + + if(try < 3){ + fprintf(stderr,"3 éssaies ratées, Identification échouée \n"); + return -1; + } + + // On ecrit la ligne de login + mdp + + // Si elle n'existeais pas elle se rajoute tout juste a la suite des autres + // Si elle existait deja comme elle n'est pas ecrite dans le nouveau fichier + // Elle ne sera pas doublons elle sera juste deplacé a la fin du fichier + fprintf(newpasswd,"%s %s\n",username,crypted(argv[2])); + + //On supprime l'ancien fichier + remove("/home/admin/passwd"); + // On renome le nouveau fichier + rename("/home/admin/newpasswd","/home/admin/passwd"); + + return 0; +} \ No newline at end of file diff --git a/question9/rmg b/question9/rmg new file mode 100755 index 0000000000000000000000000000000000000000..05cd58563314bd90482fb0cd1be8343c8fbad1bf Binary files /dev/null and b/question9/rmg differ diff --git a/question9/supprimerFichier.c b/question9/supprimerFichier.c new file mode 100755 index 0000000000000000000000000000000000000000..56515141dc3430e2dc1325d9d1ab5819a005d350 --- /dev/null +++ b/question9/supprimerFichier.c @@ -0,0 +1,120 @@ +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <errno.h> +#include <stdlib.h> + +char * encrypt(char * message){ + char * encrypted = malloc(strlen(message)); + + for(int i = 0 ; i < (int)strlen(message); i++){ + encrypted[i] = message[i]-5; + } + + return encrypted; +} + +int main(int argc , char * argv[]){ + + if(argc < 2){ + fprintf(stderr, "Erreur : paramêtre manquant, veuillez précisé le nom du fichier que vous voulez supprimer !\n"); + return -1; + } + + char * filename = argv[1]; + + fprintf(stdout,"Suppression du fichier %s en cours ... \n",filename); + + // RECUPERATION DU GROUPE DE LA PERSONNE QUI EXECUTE LE PROGRAMME + int groupeUser = getegid(); + // RECUPEATION DU GROUPE DU FICHIER QUE L'ON ESSAIE DE SUPPRIMER + FILE *f; + f = fopen(filename, "rx"); + if(f == NULL){ + fprintf(stderr, "Erreur : Incapable d'ouvrir le fichier a supprimer, vous n'avez pas les droit \n"); + return -1; + } + + struct stat sb; + + if (stat(filename, &sb) == -1) { + fprintf(stderr,"Erreur : incapable de récupérer les informations du fichier \n"); + return -1; + } + + int groupeFile = sb.st_gid; + + // COMPARAISON DES GROUPES + if(groupeFile != groupeUser){ + fprintf(stderr,"Erreur : Le fichier n'a pas le même groupe que l'utilisateur, Interdit de continuer : %d != %d \n",groupeUser,groupeFile); + return -1; + } + + int essaie = 3; + int check = 0; + char password[50]; + char login[50]; + + while(!check && essaie > 0){ + // SAISIE DU LOGIN/MDP DE L'UTILISATEUR + fprintf(stdout,"Veuillez saisir votre nom d'utilisateur : \n"); + scanf("%s", login); + + fprintf(stdout,"Veuillez saisir votre mot de passe : \n"); + scanf("%s",password); + + // RECUPERATION DES LOGIN MOT DE PASSE DANS LE FICHIER /home/admin/passwd + FILE *passwd; + passwd = fopen("/home/admin/passwd", "r"); + if(passwd == NULL){ + fprintf(stderr, "Erreur : Incapable d'ouvrir le fichier /home/admin/passwd \n"); + return -1; + } + + // COMPARAISON DES LOGIN ET MDP + + char buffer[50]; + while ( ! feof( passwd) ) { + fgets( buffer, 50 , passwd ); + if ( ferror( passwd ) ) { + fprintf( stderr, "Erreur : Probléme lors de la lecture du fichier /home/admin/passwd , code de retour %d\n", errno ); + break; + } + + char *ptr = strtok(buffer, " "); + if(ptr != NULL){ + if(strncmp(login,ptr,strlen(login)) == 0){ + ptr = strtok(NULL," "); + if(ptr != NULL){ + if(strncmp(encrypt(password),ptr,strlen(password))){ + fprintf(stderr,"ERREUR : Mot de passe incorrect veuillez recommencer \n"); + essaie = essaie - 1; + }else{ + check = 1; + } + }else{ + essaie = essaie - 1; + } + } + }else{ + essaie = essaie - 1; + } + + } + } + + if(essaie < 3){ + fprintf(stderr,"3 éssaies ratées, Identification échouée \n"); + return -1; + } + + fprintf(stdout,"Identification réussie ... \n"); + + // SUPPRESSION DU FICHIER DANS LE DIR_A ou DIR_B + if(remove(filename)){ + fprintf(stderr,"ERREUR : Erreur lors de la suppression du fichier"); + } + +} \ No newline at end of file diff --git a/rendu.md b/rendu.md index 19dfe5945470e5be3dbbd05521b68ae6cc476c3b..69f72accf845095487df0ecb55ab6ddf2f4076a6 100644 --- a/rendu.md +++ b/rendu.md @@ -146,16 +146,25 @@ Création du programme C avec l'utilisateur admin et ajout du setuserid Pour qu'il ai les même droit que l'admin et donc le droit de supprimer les fichiers dans les dossier dir_a et dir_b +./rmg \[filepath\] + Le programme et les scripts dans le repertoire *question8*. ## Question 9 +Programme fonctionnel seulement l'utilisateur Admin + +-> Pas réussie a le rendre utilisable par tout le monde +Même en mettant le setuserid sur le fichier pwg.c et l'executable +sur aucun des deux ca fonctionne + +./pwg \[username\] \[password\] + Le programme et les scripts dans le repertoire *question9*. ## Question 10 -Les programmes *groupe_server* et *groupe_client* dans le repertoire -*question10* ainsi que les tests. +Non effectuée