Dateiinhalt auch wieder in original Datei ausgeben
-
Moin Leute,
bin gerade dabei ein automatisiertes Benutzerregistrierungssystem für Slackware(*Nix distro) zu schreiben.
Einfügen in passwd funzt und auch das hinzufügen zur richtigen GRuppe. Bis jetzt hab ich es so gemacht das die original group Datei zeilenweise eingelesen wird, dann wird geguckt ob in der Zeile die GRuppe seteht. Wenn ja überprüfen ob benutzer schon vorhanden. WEnn nicht editieren der Zeile (anhängen eines Kommas und des Namens). Ansonsten wird jede Zeile einfach in einen Zweiten stream geschrieben.
So nachdem die Datei fertig editiert ist werden beide Streams geschlossen. Die orig group datei gelöscht und die zweite Datei in group u,benannt.
So jetzt mal zu meinem Problem. Ich ruf das Programm von einem PHP-Skript aus auf. Daher wird die neue Group datei auch mit den rechten des Webservers abgespeichert, würde aber gerne und muss auch die original Rechte und Besitzereigenschaften behalten.
Is es nicht möglich einfach den zweiten sTream in den ersten Stream zu speichern? Oder gibt es noch andere möglichkeiten. HIer mal der Quellcode:#include <stdio.h> #include <ctype.h> int main(int argc, char **argv) { char *komplett = "\0"; char tempname[80]; char dummy[200] = ""; char line[200] = ""; char *vorhanden = ""; char *Gruppe = ""; int err = 0; int fPos = 0; int x = 0; FILE *stream = 0; FILE *temp; if (argc != 3) { printf("Usage: %s Benutzername Gruppenamme\n", argv[0]); exit(2); } /* Gruppe von argv[2] */ Gruppe = "noob"; /* Gruppen Datei einlesen */ if ( (stream = fopen ("/tmp/group", "r+")) == NULL) { printf("Can't open file\n"); exit(1); } else { temp = fopen("/tmp/fuckalot", "w"); if (temp == NULL) { printf("Can't open file\n"); exit(1); } /* Gesamte Datei durchgegehn */ while (fgets(line, 200 , stream)) { /*Wenn noch dateien vorhanden sind */ if( strstr(line, argv[2])) { if (! strstr(line, argv[1])) { for (x = 0; x < 200; x++) { if (iscntrl(line[x])) { strncpy(dummy, line, x ); strcat(dummy, ","); strcat(dummy, argv[1]); strcat(dummy, "\n"); strcpy(line,dummy); break; } } } } err = fprintf(temp, "%s", line); } fseek(stream, 0, 0); } printf("\t***\n\n"); fclose(stream); fclose(temp); err = remove("/tmp/group"); err = rename ("/tmp/fuckalot", "/tmp/group"); printf("%s", komplett); exit(0); }
Das Problem hierbei liegt darin das ich mit chown net arbeiten kann, da net root und suid will ich net da alles inner chroot umgebung passiert und man ja nicht vorsätzlich Sicherheitslücken erschaffen muss.
Einer ne Idee??--loophole--
-
So hab mal ein bischen das Forum durchforstet und den Code vervollständig: WEnn einer noch nen par Tips performance mäßig oder sicherheit hatt. Gerne
Hier der überarbeitete Code:/**************************************************** ** changer.c - fügt Benutzer in Gruppedatei ein ** ** Argument 1 ist der Benutzer name ** ** Argumetn 2 ist der Gruppenname ** ****************************************************/ #include <stdio.h> #include <ctype.h> int main(int argc, char **argv) { char komplett[5000] = ""; char dummy[200] = ""; char line[200] = ""; char *vorhanden = ""; int err = 0; int x = 0; FILE *stream = 0; if (argc != 3) { printf("Usage: %s Benutzername Gruppenamme\n", argv[0]); exit(2); } /* Gruppen Datei einlesen */ if ( (stream = fopen ("/etc/group", "r+")) == NULL) { printf("Can't open file\n"); exit(1); } else { /* Gesamte Datei durchgegehn */ while (fgets(line, 200 , stream)) { /*Wenn noch dateien vorhanden sind */ if( strstr(line, "beginner")) { if (! strstr(line, argv[1])) { for (x = 0; x < 200; x++) { if (iscntrl(line[x])) { strncpy(dummy, line, x ); strcat(dummy, ","); strncpy(dummy, line, x ); strcat(dummy, ","); strcat(dummy, argv[1]); strcat(dummy, "\n"); strcpy(line,dummy); break; } } } } strcat(komplett, &line); } fseek(stream, 0, 0); err = fprintf(stream, "%s", komplett); } fclose(stream); exit(0); }