#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#include <unistd.h>
#include <sys/stat.h>
void Login_or_Register(); //bekannt machen der Funktion Login_or_Register
void Registr(); //bekannt machen der Funktion Registr
void Login(); //bekannt machen der Funktion Login
void Changepw(); //bekannt machen der Funktion Changepw
bool usernameFree(); //bekannt machen der Funktion usernameFree
bool pwok(); //bekannt machen der Funktion pwbloed
void Menu(); //bekannt machen der Funktion Menu
void init();
bool laengekorrekt();
bool istsonderzeichen(char);
bool hatGrossbuschstabe();
bool hatSonderzeichen();
int count = 0; //bekannt machen der Variable count
struct user{ //struct für einen user definieren
char benutzername[255];
char password[255];
char id[255];
}userbuf; //struct userbuf anlegen
struct bedingung{ //struct für das zwischenspeichern der Passwortbedingungen
int laenge;
char sonder[10];
bool upchar;
}pwdbedingung;
unsigned char state = 1; //Variable für switch Statement
int main(){
init();
while(1){
switch(state){ //steuerung der Funktionsaufrufe
case 1: Login_or_Register(); break;
case 2: Registr(); break;
case 3: Login(); break;
case 4: Menu();break;
case 5: Changepw(); break;
}
}
}
void Login_or_Register(){ //Funktion für das Auswählen von anmelden oder registrieren
char a[1];
printf("a for Login or r for register \n");
while(1){
fgets(a,16,stdin);
if(a[0] == 'a'){
state = 3; break;
}else if(a[0] == 'r'){
state = 2; break;
}
printf("Nicht korrekte Eingabe");
}
}
void Registr(){ //Registriervorgang
while(1){
printf("Benutername: ");
fgets(userbuf.benutzername,255,stdin);
userbuf.benutzername[strlen(userbuf.benutzername)-1] = 0;
if(usernameFree()){ //ruft die Funktion userFree auf, um zu Prüfen ob es den Username schon gibt
break;
}
printf("username already exists \n");
}
while(1){
printf("Passwort: ");
fgets(userbuf.password,255,stdin);
if(pwok()){
printf("Sie haben sich Registriert\n");
break;
}
printf("Passwort entspricht nicht den Vorgaben\n");
}
state = 3;
saveUser(); //speichert den User in eine Datei
}
bool laengekorrekt(){ //Überprüft ob die Länge des Passwortes den Vorgaben entspricht
return strlen(userbuf.password) >= pwdbedingung.laenge;
}
bool hatSonderzeichen(){ //Überprüft ob das Passwort eines der Vorgegebenen Sonderzeichen hat
for(int i = 0; i < strlen(userbuf.password);i++){
if(istsonderzeichen(userbuf.password[i])){
return 1; //wenn eins vorkommt bricht return die for schleife ab
}
}
return 0;
}
bool hatGrossbuschstabe(){ //Überprüft ob das Passwort ein Großbuchstaben hat
for(int i = 0; i < strlen(userbuf.password);i++){
if(userbuf.password[i] >= 'A' && userbuf.password[i] <= 'Z'){
return 1;
}
}
return 0;
}
bool istsonderzeichen(char s){ //Geht jedes Zeichen des Passworts durch und schaut ob es eines der Vorgegebenen Sonderzeichen ist
unsigned char c;
for(c=0; c<strlen(pwdbedingung.sonder);c++){
return pwdbedingung.sonder[c] == s;
}
return 0;
}
bool usualPw(){ //Überprüft ob es eines der angegebenen Standardpasswörter ist
char buff[255];
FILE * fp;
fp = fopen("cirt-defauld-passwords.txt","r");
while(EOF != fgetc((FILE*)fp)){
fscanf(fp,"%s",buff);
if(!strcmp(buff,userbuf.password)){
fclose(fp);
return 1;
}
}
fclose(fp);
return 0;
}
bool pwok(){ //gibt zurück ob das Passwort den Anforderungen entspricht
return laengekorrekt()
&&hatSonderzeichen()
&&hatGrossbuschstabe()
&&!usualPw();
}
bool usernameFree(){ //Überprüft ob es den Usernamen schon gibt
char buff[255];
FILE * fp;
fp = fopen("User.txt","r");
while(EOF != fgetc((FILE*)fp)){
fscanf(fp,"%s",buff);
fscanf(fp,"%s",buff);
if(!strcmp(buff,userbuf.benutzername)){
fclose(fp);
return 0;
}
fscanf(fp,"%s",buff);
}
fclose(fp);
return 1;
}
bool passwortCorrect(){
char buff[255];
FILE * fp;
fp = fopen("User.txt","r");
while(EOF != fgetc((FILE*)fp)){
fscanf(fp,"%s",userbuf.id);
fscanf(fp,"%s",buff);
if(!strcmp(buff,userbuf.benutzername)){
fscanf(fp,"%s",buff);
fclose(fp);
return !strcmp(buff,userbuf.password);
}
fscanf(fp,"%s",buff);
}
fclose(fp);
return 0;
}
void log(){ //Schreibt in eine Datei wann sich ein User angemeldet hat
FILE * fp;
fp = fopen("log.txt","a+");
time_t current_time;
char* c_time_string;
current_time = (unsigned long)time(NULL);
c_time_string = ctime(¤t_time);
c_time_string[strlen(c_time_string)-1]=0;
fprintf(fp,"der User: %s mit der ID: %s hat sich zum Zeitpunkt: %s angemeldet\n ",userbuf.benutzername,userbuf.id,c_time_string);
fclose(fp);
}
void Login(){ //Loginvorgang
while(1){
printf("Benutzername: ");
fgets(userbuf.benutzername,255,stdin);
userbuf.benutzername[strlen(userbuf.benutzername)-1]=0;
if(usernameFree()){
printf("Benutzer existiert nicht\n");
continue;
}
break;
}
for(int f = 2; f >= 0;f--){
printf("Passwort: ");
fgets(userbuf.password,255,stdin);
userbuf.password[strlen(userbuf.password)-1]=0;
if(passwortCorrect()){
printf("Sie sind eingeloggt!\n");
break;
}
printf("Passwort falsch , sie haben noch %i Versuche.\n",f);
if(!f){
Sleep(15000);
return ;
}
}
checkMark();
log();
state = 4;
}
void checkMark(){ //überprüft ob der User auf der Liste mit veralteten Passwörtern steht
char buff[255];
FILE * fp;
fp = fopen("uptodatepw.txt","r");
while(!feof(fp)){
fscanf(fp,"%s",buff);
if(!strcmp(buff,userbuf.benutzername)){
printf("Ihr Passwort entspricht nicht den aktuellen Vorgaben!\n");
Changepw();
break;
}
}
fclose(fp);
}
void Changepw(){ //Passwort des Users wird geändert
char s1[80], s2[80], s3[80], *b = calloc(1, 100000), *alt = "vorher", *neu = "nachher";
FILE* f = fopen("User.txt", "r+");
while (fscanf(f, "%s%s%s", s1, s2, s3) == 3)
{
strcat(b, s1); strcat(b, " "); strcat(b, s2); strcat(b, " ");
if (strcmp(s3, alt)) strcat(b, s3); else strcat(b, neu);
strcat(b, "\n");
}
rewind(f);
fprintf(f, "%s", b);
fclose(f);
free(b);
return 0;
}
void Menu(){ //das Menü wird aufgerufen
}
void saveUser(){ //User wird in eine Datei geschrieben
FILE * user;
user = fopen("User.txt","a+");
fprintf(user," %d %s %s",count,userbuf.benutzername,userbuf.password);
fclose(user);
setupcount();
}
void setupcount(){ //Zähler wird hochgesetzt(für die ID)
count++;
FILE * fp;
fp = fopen("usercount.txt","w");
fprintf(fp,"%i",count);
fclose(fp);
}
void init(){ //Passwortbedingungen werden eingelesen und in den struct gespeichert
char buff[255];
FILE * fp;
fp = fopen("pwd-specification.txt","r");
fscanf(fp,"%s",buff);
fscanf(fp,"%s",buff);//min-length
pwdbedingung.laenge = atoi(buff);
fscanf(fp,"%s",buff);
fscanf(fp,"%s",buff);//charset
strcpy(pwdbedingung.sonder,buff);
fscanf(fp,"%s",buff);
fscanf(fp,"%s",buff);//upchar
pwdbedingung.upchar = strcmp(buff,"false");
fclose(fp);
fp = fopen("usercount.txt","r");
fscanf(fp,"%s",buff);
count=atoi(buff);
fclose(fp);
struct stat stats;
stat("pwd-specification.txt",&stats);
struct tm dt;
char timeString[20];
dt = *(gmtime(&stats.st_mtime));
snprintf(timeString, 20, "%04d-%02d-%02d %02d:%02d:%02d",dt.tm_year + 1900, dt.tm_mon+1,dt.tm_mday,
dt.tm_hour, dt.tm_min, dt.tm_sec);
fp = fopen("logaenderung.txt","r");
fscanf(fp,"%s",buff);
fclose(fp);
fp = fopen("logaenderung.txt","w");
if(strcmp(timeString,buff)){
fprintf(fp,"%s",timeString);
checkUpdatePw();
}
fclose(fp);
}
void markUser(){ //schreibt die User zum überprüfen in eine Datei bei denen die Passwortvorgaben nicht mehr mit dem Passwort übereinstimmen
FILE * fp;
fp = fopen("uptodatepw.txt","a+");
fprintf(fp,"%s\n",userbuf.benutzername);
fclose(fp);
}
void checkUpdatePw(){ //liest die User mit veralteten Passwort ein
remove("uptodatepw.txt");
char buff[255];
FILE * fp;
fp = fopen("User.txt","r");
while(EOF != fgetc((FILE*)fp)){
fscanf(fp,"%s",userbuf.id);
fscanf(fp,"%s",userbuf.benutzername);
fscanf(fp,"%s",userbuf.password);
if(!pwok()){
markUser();
}
}
}