From fe32554e3cef2ef35235a706b925e0cc6188cb37 Mon Sep 17 00:00:00 2001 From: Georg Reisinger Date: Wed, 28 Oct 2020 15:34:51 +0100 Subject: [PATCH] Blocked Clients, Colored Console, Auto Dir Create --- client.c | 462 ++++++++++++++++++++++++------------------------------ readme.md | 7 +- server.c | 414 +++++++++++++++++++++++++++++++++++++++--------- 3 files changed, 556 insertions(+), 327 deletions(-) diff --git a/client.c b/client.c index ae30345..09dee17 100644 --- a/client.c +++ b/client.c @@ -8,6 +8,7 @@ #include #include #include +#include #define BUF 1024 void remN(char *s) { @@ -30,269 +31,218 @@ bool startsWith(const char *pre, const char *str) } int main (int argc, char **argv) { + int create_socket; + char buffer[BUF]; + struct sockaddr_in address; + int size; - int create_socket; - char buffer[BUF]; - struct sockaddr_in address; - int size; - - if( argc < 3 ){ - printf("Usage: %s ServerAdresse Port\n", argv[0]); - exit(EXIT_FAILURE); - } - - if ((create_socket = socket (AF_INET, SOCK_STREAM, 0)) == -1) - { - perror("Socket error"); - return EXIT_FAILURE; - } - - memset(&address,0,sizeof(address)); - address.sin_family = AF_INET; - address.sin_port = htons (atoi(argv[2])); - inet_aton (argv[1], &address.sin_addr); - - if (connect ( create_socket, (struct sockaddr *) &address, sizeof (address)) == 0) - { - printf ("\x1b[32mConnection with server (%s) established\n\x1b[0m", inet_ntoa (address.sin_addr)); - size=recv(create_socket,buffer,BUF-1, 0); - if (size>0) - { - buffer[size]= '\0'; - printf("\x1b[36m%s\x1b[0m",buffer); - } - } - else - { - perror("\x1b[31mConnect error - no server available\x1b[0m"); - return EXIT_FAILURE; - } - + if( argc < 3 ){ + printf("Usage: %s ServerAdresse Port\n", argv[0]); + exit(EXIT_FAILURE); + } + if ((create_socket = socket (AF_INET, SOCK_STREAM, 0)) == -1) + { + perror("Socket error"); + return EXIT_FAILURE; + } + memset(&address,0,sizeof(address)); + address.sin_family = AF_INET; + address.sin_port = htons (atoi(argv[2])); + inet_aton (argv[1], &address.sin_addr); + if (connect ( create_socket, (struct sockaddr *) &address, sizeof (address)) == 0) + { + printf ("\x1b[32mConnection with server (%s) established\n\x1b[0m", inet_ntoa (address.sin_addr)); + size=recv(create_socket,buffer,BUF-1, 0); + if (size>0) + { + buffer[size]= '\0'; + printf("\x1b[36m%s\x1b[0m",buffer); + } + } + else + { + perror("\x1b[31mConnect error - no server available\x1b[0m"); + return EXIT_FAILURE; + } bool login = false; - do { - //command vom user überprüfen - char command[7] = ""; - printf ("\n\x1b[35mEnter Command:\x1b[0m \n"); - fgets (command, 7, stdin); + do { + //command vom user überprüfen + char command[7] = ""; + printf ("\n\x1b[35mEnter Command:\x1b[0m \n"); + fgets (command, 7, stdin); - if (startsWith("login", command) == true && login == false) - { - char username[10] = ""; - char pw[50] = ""; - char bufferString[BUF] = ""; - strcpy(bufferString, "login;"); - //User Dateneingabe und daten einlesen - printf("\x1b[35m\x1b[0m\n"); - fgets (username, 10, stdin); + if (startsWith("login", command) == true && login == false) + { + char username[10] = ""; + char pw[50] = ""; + char bufferString[BUF] = ""; + strcpy(bufferString, "login;"); + //User Dateneingabe und daten einlesen + printf("\x1b[35m\x1b[0m\n"); + fgets (username, 10, stdin); + printf("\x1b[35m\x1b[0m\n"); + //PW eingabe unsichtbar machen + struct termios term, term_orig; + tcgetattr(STDIN_FILENO, &term); + term_orig = term; + term.c_lflag &= ~ECHO; + tcsetattr(STDIN_FILENO, TCSANOW, &term); + scanf("%s", pw); + // Eingabe wieder sichtbar schalten + tcsetattr(STDIN_FILENO, TCSANOW, &term_orig); - printf("\x1b[35m\x1b[0m\n"); - fgets (pw, 50, stdin); - - strcat(bufferString, username); - strcat(bufferString, ";"); - strcat(bufferString, pw); - remN(bufferString); - - send(create_socket, bufferString, strlen (bufferString), 0); - - //Response vom Server (OK oder ERR) empfangen und ausgeben - char readBuffer[BUF] = ""; - read(create_socket , readBuffer, 1024); - printf("\n%s\n", readBuffer); - if (strncmp(readBuffer, "OK", 2) == 0) - { - login = true; - } - }else if (login == false && startsWith("quit", command) == true) - { - strcpy(buffer, "quit\n"); - }else if (login == false) - { - printf("\x1b[33mBitte zuerst eingeben. Erst danach können sie auf das Program zugreifen!\x1b[0m\n"); - } - - - - - if(login == true){ - - - //je nach command wird was audgeführt - if(startsWith("send", command) == true) { - - char sender[8] = ""; - char empfaenger[8] = ""; - char betreff[80] = ""; - char nachricht[128] = ""; - char bufferString[BUF] = ""; - strcpy(bufferString, ""); - strcat(bufferString, "send"); - - //User Dateneingabe und daten einlesen - printf("\x1b[35m\x1b[0m\n"); - fgets (sender, 8, stdin); - - printf("\x1b[35m\x1b[0m\n"); - fgets (empfaenger, 8, stdin); - - printf("\x1b[35m\x1b[0m\n"); - fgets (betreff, 80, stdin); - - printf("\x1b[35m\x1b[0m\n"); - fgets (nachricht, 80, stdin); - - //Buffer formatieren - strcat(bufferString, ";"); - strcat(bufferString, sender); - strcat(bufferString, ";"); - strcat(bufferString, empfaenger); - strcat(bufferString, ";"); - strcat(bufferString, betreff); - strcat(bufferString, ";"); - strcat(bufferString, nachricht); - remN(bufferString); - //printf("Buffer: %s", bufferString); - send(create_socket, bufferString, strlen (bufferString), 0); - - //Response vom Server (OK oder ERR) empfangen und ausgeben - char readBuffer[BUF] = ""; - read(create_socket , readBuffer, 1024); - printf("\n%s\n", readBuffer); - - } - - else if(startsWith("list", command) == true) { - char bufferString[BUF] = "list"; - char username[8] = ""; - char p[20] = ""; - int counter = 0; - - printf("\x1b[35m\x1b[0m\n"); - fgets (username, 8, stdin); - printf("\x1b[35m\x1b[0m\n"); - fgets (p, 20, stdin); - - strcat(bufferString, ";"); - strcat(bufferString, username); - strcat(bufferString, ";"); - strcat(bufferString, p); - remN(bufferString); - printf("%s ", bufferString); - send(create_socket, bufferString, strlen (bufferString), 0); - - char readBuffer[BUF] = ""; - read(create_socket , readBuffer, 1024); - - char delimiter[] = ";"; - char *ptr; - ptr = strtok(readBuffer, delimiter); - - while(ptr != NULL) { - - - if(strcmp(ptr, ".") == 0) { - + strcat(bufferString, username); + strcat(bufferString, ";"); + strcat(bufferString, pw); + remN(bufferString); + send(create_socket, bufferString, strlen (bufferString), 0); + //Response vom Server (OK oder ERR) empfangen und ausgeben + char readBuffer[BUF] = ""; + read(create_socket , readBuffer, 1023); + remN(readBuffer); + if (strcmp("OK", readBuffer) == 0) + { + printf("\n\x1b[32m%s\x1b[0m\n", readBuffer); + login = true; + }else if (strcmp("ERR", readBuffer) == 0 || strcmp("Client Gesperrt", readBuffer) == 0) + { + printf("\n\x1b[31m%s\x1b[0m\n", readBuffer); } - - else if(strcmp(ptr, "..") == 0) { - - } - - else if (counter == 0) { - printf("\x1b[35m\x1b[0m\n", ptr); - } - - else { - printf("Betreff: %s \n", ptr); - //printf("%.*s", 17, ptr + 5); - } - - counter = counter + 1; - - // naechsten Abschnitt erstellen - ptr = strtok(NULL, delimiter); - } - - } - - else if(startsWith("read", command) == true) { - char bufferString[BUF] = "read"; - char username[8] = ""; - char nid[80] = ""; - char folder[20] = ""; - - printf("\x1b[35m\x1b[0m\n"); - fgets (username, 8, stdin); - printf("\x1b[35m\x1b[0m\n"); - fgets (folder, 20, stdin); - printf("\x1b[35m\x1b[0m\n"); - fgets (nid, 80, stdin); - - strcat(bufferString, ";"); - strcat(bufferString, username); - strcat(bufferString, ";"); - strcat(bufferString, folder); - strcat(bufferString, ";"); - strcat(bufferString, nid); - remN(bufferString); - - //printf("%s ", bufferString); - - send(create_socket, bufferString, strlen (bufferString), 0); - - //strcpy(buffer, ""); - //buffer[size]= '\0'; - char readBuffer[BUF] = ""; - read(create_socket , readBuffer, 1000); - printf("\n%s\n", readBuffer ); - - } - - else if(startsWith("del", command) == true) { - //printf("\n del"); - - char username[8] = ""; - char nachrichtennummer[80] = ""; - char bufferString[BUF] = "del"; - char p[20] = ""; - - printf("\x1b[35m\x1b[0m\n"); - fgets (username, 8, stdin); - printf("\x1b[35m\x1b[0m\n"); - fgets (p, 20, stdin); - printf("\x1b[35m\x1b[0m\n"); - fgets (nachrichtennummer, 80, stdin); - - strcat(bufferString, ";"); - strcat(bufferString, username); - strcat(bufferString, ";"); - strcat(bufferString, p); - strcat(bufferString, ";"); - strcat(bufferString, nachrichtennummer); - remN(bufferString); - //printf("%s ", bufferString); - send(create_socket, bufferString, strlen (bufferString), 0); - - char readBuffer[BUF] = ""; - read(create_socket , readBuffer, 1024); - printf("\n%s\n", readBuffer ); - - } - - else if(startsWith("quit", command) == true) { + }else if (login == false && startsWith("quit", command) == true) + { strcpy(buffer, "quit\n"); + }else if (login == false) + { + printf("\x1b[33mBitte zuerst eingeben. Erst danach können sie auf das Program zugreifen!\x1b[0m\n"); } + if(login == true){ + //je nach command wird was audgeführt + if(startsWith("send", command) == true) { + char sender[10] = ""; + char empfaenger[10] = ""; + char betreff[82] = ""; + char nachricht[128] = ""; + char bufferString[BUF] = ""; + strcpy(bufferString, ""); + strcat(bufferString, "send"); + //User Dateneingabe und daten einlesen + printf("\x1b[35m\x1b[0m\n"); + fgets (sender, 10, stdin); + printf("\x1b[35m\x1b[0m\n"); + fgets (empfaenger, 10, stdin); + printf("\x1b[35m\x1b[0m\n"); + fgets (betreff, 82, stdin); + printf("\x1b[35m\x1b[0m\n"); + fgets (nachricht, 82, stdin); + //Buffer formatieren + strcat(bufferString, ";"); + strcat(bufferString, sender); + strcat(bufferString, ";"); + strcat(bufferString, empfaenger); + strcat(bufferString, ";"); + strcat(bufferString, betreff); + strcat(bufferString, ";"); + strcat(bufferString, nachricht); + remN(bufferString); + send(create_socket, bufferString, strlen (bufferString), 0); + //Response vom Server (OK oder ERR) empfangen und ausgeben + char readBuffer[BUF] = ""; + read(create_socket , readBuffer, 1024); + printf("\n%s\n", readBuffer); + }else if(startsWith("list", command) == true) { + char bufferString[BUF] = "list"; + char username[10] = ""; + char p[22] = ""; + int counter = 0; + printf("\x1b[35m\x1b[0m\n"); + fgets (username, 10, stdin); + printf("\x1b[35m\x1b[0m\n"); + fgets (p, 22, stdin); - else { - printf("DAS IST KEIN COMMAND!!!!!"); + strcat(bufferString, ";"); + strcat(bufferString, username); + strcat(bufferString, ";"); + strcat(bufferString, p); + remN(bufferString); + send(create_socket, bufferString, strlen (bufferString), 0); + + char readBuffer[BUF] = ""; + read(create_socket , readBuffer, 1024); + + char delimiter[] = ";"; + char *ptr; + ptr = strtok(readBuffer, delimiter); + + while(ptr != NULL) { + if(strcmp(ptr, ".") == 0) { + + }else if(strcmp(ptr, "..") == 0) { + + }else if (counter == 0) { + printf("\x1b[35m\x1b[0m\n", ptr); + }else { + printf("Betreff: %s \n", ptr); + } + counter = counter + 1; + // naechsten Abschnitt erstellen + ptr = strtok(NULL, delimiter); + } + }else if(startsWith("read", command) == true) { + char bufferString[BUF] = "read"; + char username[10] = ""; + char nid[82] = ""; + char folder[22] = ""; + + printf("\x1b[35m\x1b[0m\n"); + fgets (username, 10, stdin); + printf("\x1b[35m\x1b[0m\n"); + fgets (folder, 22, stdin); + printf("\x1b[35m\x1b[0m\n"); + fgets (nid, 82, stdin); + + strcat(bufferString, ";"); + strcat(bufferString, username); + strcat(bufferString, ";"); + strcat(bufferString, folder); + strcat(bufferString, ";"); + strcat(bufferString, nid); + remN(bufferString); + + send(create_socket, bufferString, strlen (bufferString), 0); + char readBuffer[BUF] = ""; + read(create_socket , readBuffer, 1000); + printf("\n%s\n", readBuffer ); + }else if(startsWith("del", command) == true) { + char username[10] = ""; + char nachrichtennummer[82] = ""; + char bufferString[BUF] = "del"; + char p[22] = ""; + + printf("\x1b[35m\x1b[0m\n"); + fgets (username, 10, stdin); + printf("\x1b[35m\x1b[0m\n"); + fgets (p, 22, stdin); + printf("\x1b[35m\x1b[0m\n"); + fgets (nachrichtennummer, 82, stdin); + + strcat(bufferString, ";"); + strcat(bufferString, username); + strcat(bufferString, ";"); + strcat(bufferString, p); + strcat(bufferString, ";"); + strcat(bufferString, nachrichtennummer); + remN(bufferString); + send(create_socket, bufferString, strlen (bufferString), 0); + char readBuffer[BUF] = ""; + read(create_socket , readBuffer, 1024); + printf("\n%s\n", readBuffer ); + }else if(startsWith("quit", command) == true) { + strcpy(buffer, "quit\n"); + }else { + printf("DAS IST KEIN COMMAND!!!!!"); + } } - } - - - - - } - while (strcmp (buffer, "quit\n") != 0); - close (create_socket); - return EXIT_SUCCESS; + }while (strcmp (buffer, "quit\n") != 0); + close (create_socket); + return EXIT_SUCCESS; } diff --git a/readme.md b/readme.md index 125e33d..e2210dc 100644 --- a/readme.md +++ b/readme.md @@ -2,13 +2,18 @@ # Protokoll 🔧 ``` -LOGIN: login;username;passwort SEND: send;sender;empänger;betreff;nachricht LIST: list:username;postEinAusgang READ: read;username;postEinAusgang;nid DEL: del;username;postEinAusgang;nid ``` +# Installation +``` +sudo apt-install ldap-utils +sudo apt-get install libldap +``` + # Erstellt von * Lukas Nowy diff --git a/server.c b/server.c index 1f088a6..086ab52 100644 --- a/server.c +++ b/server.c @@ -18,44 +18,284 @@ #include #define MAXCHAR 1000 - #define BUF 1024 +char *verzeichnis; -bool startsWith(const char *pre, const char *str) -{ - size_t lenpre = strlen(pre), - lenstr = strlen(str); - return lenstr < lenpre ? false : memcmp(pre, str, lenpre) == 0; +// Entfernt das \n und macht \0 daraus +void remN(char *s) { + char *p2 = s; + while(*s != '\0') { + if(*s != '\t' && *s != '\n') { + *p2++ = *s++; + } else { + ++s; + } + } + *p2 = '\0'; } -void mstore_data(const char *filepath, const char *data) -{ - FILE *fp = fopen(filepath, "ab"); - if (fp != NULL) - { - fputs(data, fp); - fclose(fp); - } +//Checkt ob ein dir bereits existiert +bool dirExists(const char path[300]){ + struct stat st = {0}; + char cwd[300]; + if (getcwd(cwd, sizeof(cwd)) != NULL) { + //printf("Current working dir: %s\n", cwd); + } else { + perror("getcwd() error"); + } + strcat(cwd, path); + if (stat(cwd, &st) == 0) { + printf("\x1b[32mDir: %s exists!\x1b[0m\n", cwd); + return true; + }else + { + printf("\x1b[31mDir: %s gibt es NICHT!\x1b[0m\n", cwd); + return false; + } +} + +//Erstellt ein Dir wenn nicht bereits vorhanden +void createDir(const char dir[]){ + if(dirExists(dir) == false){ + char cwd[300]; + if (getcwd(cwd, sizeof(cwd)) != NULL) { + //printf("Current working dir: %s\n", cwd); + } else { + perror("getcwd() error"); + } + strcat(cwd, dir); + if(mkdir(cwd, 0700) == -1) + { + printf("\x1b[31mFailed to create %s\x1b[0m\n", cwd); + perror("mkdir"); + exit(EXIT_FAILURE); + } + else{ + printf("\x1b[33mCreated directory: %s\x1b[0m\n", cwd); + } + } +} + +// Die Denyfiles werden gelöscht -1 ist error +int stopDenyUser(char username[10]){ + char cwd[300]; + if (getcwd(cwd, sizeof(cwd)) != NULL) { + //printf("Current working dir: %s\n", cwd); + } else { + perror("getcwd() error"); + } + strcat(cwd, "/"); + strcat(cwd, verzeichnis); + strcat(cwd, "/deny/"); + strcat(cwd, username); + DIR *d = opendir(cwd); + size_t path_len = strlen(cwd); + int r = -1; + if (d) { + struct dirent *p; + r = 0; + while (!r && (p=readdir(d))) { + int r2 = -1; + char *buf; + size_t len; + /* Skip the names "." and ".." as we don't want to recurse on them. */ + if (!strcmp(p->d_name, ".") || !strcmp(p->d_name, "..")) + continue; + len = path_len + strlen(p->d_name) + 2; + buf = malloc(len); + if (buf) { + struct stat statbuf; + snprintf(buf, len, "%s/%s", cwd, p->d_name); + if (!stat(buf, &statbuf)) { + if (S_ISDIR(statbuf.st_mode)) + r2 = stopDenyUser(buf); + else + r2 = unlink(buf); + } + free(buf); + } + r = r2; + } + closedir(d); + } + if (!r) + r = rmdir(cwd); + return r; +} + +// Zählt wv denys ein user bereits hat +int countDenyUser(char username[10]){ + char dir[50]; + strcpy(dir, "/"); + strcat(dir, verzeichnis); + strcat(dir, "/deny/"); + strcat(dir, username); + if (dirExists(dir) == false) + { + printf("\x1b[31mDIR Exists NICHT!\x1b[0m\n"); + return 0; + }else + { + int file_count = 0; + DIR * dirp; + struct dirent * entry; + + char cwd[1000]; + if (getcwd(cwd, sizeof(cwd)) != NULL) { + //printf("Current working dir: %s\n", cwd); + } else { + perror("getcwd() error"); + } + strcat(cwd, "/"); + strcat(cwd, verzeichnis); + strcat(cwd, "/deny/"); + strcat(cwd, username); + dirp = opendir(cwd); /* There should be error handling after this */ + while ((entry = readdir(dirp)) != NULL) { + if (entry->d_type == DT_REG) { /* If the entry is a regular file */ + file_count++; + } + } + closedir(dirp); + return file_count; + } +} + +// Wenn der User 3 Deny Files hat, ist er gesperrt und es kommt true zurück +bool userDenied(char username[10]){ + if (countDenyUser(username) == 3) + { + printf("\x1b[31mUser: %s ist gesperrt!\x1b[0m\n", username); + return true; + }else + { + printf("\x1b[32mUser: %s ist NICHT gesperrt!\x1b[0m\n", username); + return false; + } +} + +// Erstellt ein Deny User eintrag +void createDenyUser(char username[10]){ + char filename[1000]; + strcpy(filename, "/"); + strcat(filename, verzeichnis); + strcat(filename, "/deny/"); + strcat(filename, username); + createDir(filename); + FILE *fp; + // Datum besorgen + char timeStr[22]; + time_t now = time(NULL); + struct tm *t = localtime(&now); + strftime(timeStr, sizeof(timeStr)-1, "%H:%M:%S", t); + char cwd[300]; + if (getcwd(cwd, sizeof(cwd)) != NULL) { + //printf("Current working dir: %s\n", cwd); + } else { + perror("getcwd() error"); + } + // Filename erstellen + strcpy(filename, cwd); + strcat(filename, "/"); + strcat(filename, verzeichnis); + strcat(filename, "/deny/"); + strcat(filename, username); + strcat(filename,"/"); + strcat(filename,timeStr); + strcat(filename, ".txt"); + // File erstellen + fp = fopen(filename, "w"); + if(fp == NULL){ + perror("fopen"); + } + fprintf(fp, "DENY"); + fclose(fp); +} + +// True wenn der user wieder zugelassen werden darf +bool checkDeniedUser(char username[10]){ + time_t now; + time(&now); + struct tm*local = localtime(&now); + int readHour = 0, readMinutes = 0, readSekundes = 0; + char cwd[1000]; + if (getcwd(cwd, sizeof(cwd)) != NULL) { + //printf("Current working dir: %s\n", cwd); + } else { + perror("getcwd() error"); + } + strcat(cwd, "/"); + strcat(cwd, verzeichnis); + strcat(cwd, "/deny/"); + strcat(cwd, username); + DIR *d; + struct dirent *dir; + d = opendir(cwd); + if (d) + { + while ((dir = readdir(d)) != NULL) + { + if(strcmp(dir->d_name, ".") != 0 && strcmp(dir->d_name, "..") != 0){ + //printf("%s\n", dir->d_name); + sscanf(dir->d_name, "%2d:%2d:%2d", &readHour, &readMinutes, &readSekundes); + struct tm breakdown = {0}; + breakdown.tm_sec = readSekundes; + breakdown.tm_hour = readHour; + breakdown.tm_min = readMinutes; + breakdown.tm_year = local->tm_year; + breakdown.tm_mon = local->tm_mon; + breakdown.tm_mday = local->tm_mday; + time_t result; + + if ((result = mktime(&breakdown)) == (time_t)-1) { + fprintf(stderr, "Could not convert time input to time_t\n"); + perror("checkDeniedUser Read time from file"); + } + double diff_t; + diff_t = difftime(now, result); + printf("\x1b[34mZeitdifferenz: %f\x1b[0m\n", diff_t); + if (diff_t >= 300 || diff_t <= -300) //300 = 5min + { + return true; + } + } + } + closedir(d); + } + return false; +} + +bool startsWith(const char *pre, const char *str){ + size_t lenpre = strlen(pre), + lenstr = strlen(str); + return lenstr < lenpre ? false : memcmp(pre, str, lenpre) == 0; +} + +void mstore_data(const char *filepath, const char *data){ + FILE *fp = fopen(filepath, "ab"); + if (fp != NULL) + { + fputs(data, fp); + fclose(fp); + } } int countFiles(char path[]) { - int file_count = 0; - DIR * dirp; - struct dirent * entry; + int file_count = 0; + DIR * dirp; + struct dirent * entry; - dirp = opendir(path); /* There should be error handling after this */ - while ((entry = readdir(dirp)) != NULL) { - if (entry->d_type == DT_REG) { /* If the entry is a regular file */ - file_count++; - } - } - closedir(dirp); - - return file_count; + dirp = opendir(path); + while ((entry = readdir(dirp)) != NULL) { + if (entry->d_type == DT_REG) { + file_count++; + } + } + closedir(dirp); + return file_count; } -int login_user(char username[8], char pw[50]) -{ +int login_user(char username[10], char pw[50]){ //////////////////////////////////////////////////////////////////////////// // LDAP config // anonymous bind with user and pw empty @@ -67,14 +307,10 @@ int login_user(char username[8], char pw[50]) char rawLdapUser[128]; strcpy(rawLdapUser, username); sprintf(ldapBindUser, "uid=%s,ou=people,dc=technikum-wien,dc=at", rawLdapUser); - printf("user set to: %s\n", ldapBindUser); - // read password (bash: export ldappw=) char ldapBindPassword[256]; strcpy(ldapBindPassword, pw); - printf("pw taken over from commandline: %s\n", pw); - // search settings const char *ldapSearchBaseDomainComponent = "dc=technikum-wien,dc=at"; @@ -95,7 +331,7 @@ int login_user(char username[8], char pw[50]) fprintf(stderr, "ldap_init failed\n"); return 0; } - printf("connected to LDAP server %s\n", ldapUri); + printf("\x1b[32mconnected to LDAP server %s\x1b[0m\n", ldapUri); //////////////////////////////////////////////////////////////////////////// // set verison options @@ -208,7 +444,7 @@ int login_user(char username[8], char pw[50]) return 0; } // https://linux.die.net/man/3/ldap_count_entries - printf("Total results: %d\n", ldap_count_entries(ldapHandle, searchResult)); + printf("\x1b[34mTotal results: %d\x1b[0m\n", ldap_count_entries(ldapHandle, searchResult)); //////////////////////////////////////////////////////////////////////////// // get result of search @@ -222,7 +458,7 @@ int login_user(char username[8], char pw[50]) ///////////////////////////////////////////////////////////////////////// // Base Information of the search result entry // https://linux.die.net/man/3/ldap_get_dn - printf("DN: %s\n", ldap_get_dn(ldapHandle, searchResultEntry)); + printf("\x1b[35mDN: %s\x1b[0m\n", ldap_get_dn(ldapHandle, searchResultEntry)); ///////////////////////////////////////////////////////////////////////// // Attributes @@ -244,10 +480,10 @@ int login_user(char username[8], char pw[50]) { for (int i = 0; i < ldap_count_values_len(vals); i++) { - printf("\t%s: %s\n", searchResultEntryAttribute, vals[i]->bv_val); + printf("\t\x1b[35m%s: %s\x1b[0m\n", searchResultEntryAttribute, vals[i]->bv_val); if(strcmp(searchResultEntryAttribute,"uid") == 0){ if(strcmp(vals[i]->bv_val,rawLdapUser) == 0){ - printf("\n\nGEFUNDEN!!!!!!!!!!!!!!!!!\n\n"); + printf("\n\n\x1b[32mGEFUNDEN!!!!!!!!!!!!!!!!!\x1b[0m\n\n"); // Free Memory ldap_value_free_len(vals); ldap_memfree(searchResultEntryAttribute); @@ -307,6 +543,7 @@ void *threadFun(void *arg){ buffer[size] = '\0'; if (login == false) { + // Do login if (strncmp("login", buffer, 5) == 0) { @@ -315,7 +552,7 @@ void *threadFun(void *arg){ //den buffer mit dem seperator splitten ptr = strtok(buffer, delimiter); int counter = 0; - char username[9]; + char username[10]; char pw[50]; while(ptr != NULL) { if (counter == 1) { @@ -329,17 +566,38 @@ void *threadFun(void *arg){ ptr = strtok(NULL, delimiter); } if(login_user(username, pw) == 1){ - login = true; - printf("Login geschafft!!"); - //OK an den client zurücksenden - char suc[] = "OK"; - send(new_socket , suc , strlen(suc) , 0 ); + printf("\x1b[32mUser: %s hat den Login geschafft!!\x1b[0m\n", username); + if(checkDeniedUser(username) == true){ + stopDenyUser(username); + } + if(userDenied(username) == true){ + //ERR an den client zurücksenden + char err[] = "Client Gesperrt"; + send(new_socket , err , strlen(err) , 0 ); + }else{ + //OK an den client zurücksenden + char suc[] = "OK"; + login = true; + send(new_socket , suc , strlen(suc) , 0 ); + stopDenyUser(username); + } }else { - printf("Login error!!!"); - //OK an den client zurücksenden - char err[] = "ERR"; - send(new_socket , err , strlen(err) , 0 ); + printf("\x1b[31mUser: %s hat den Login NICHT geschafft!!\x1b[0m\n", username); + + if(userDenied(username) == false){ + createDenyUser(username); + //ERR an den client zurücksenden + char err[] = "ERR"; + send(new_socket , err , strlen(err) , 0 ); + }else{ + //ERR an den client zurücksenden + char err[] = "Client Gesperrt"; + send(new_socket , err , strlen(err) , 0 ); + if(checkDeniedUser(username) == true){ + stopDenyUser(username); + } + } } } @@ -355,14 +613,14 @@ void *threadFun(void *arg){ ptr = strtok(buffer, delimiter); int counter = 0; - char sender[8] = ""; - char empfaenger[8] = ""; - char betreff[80] = ""; + char sender[10] = ""; + char empfaenger[10] = ""; + char betreff[82] = ""; //timestamp als ersten teil der id erstellen - char ts[20]; + char ts[22]; time_t now = time(NULL); - strftime(ts, 20, "%Y-%m-%d%H:%M:%S", localtime(&now)); + strftime(ts, 22, "%Y-%m-%d%H:%M:%S", localtime(&now)); //den gesplitteten buffer schritt für schritt durchgehen @@ -405,7 +663,7 @@ void *threadFun(void *arg){ strcat(ts, betreff); //Pfad erstellen für den sender und file erstellen - char fb[100] = "touch ./data/postausgang/"; + char fb[300] = "touch ./data/postausgang/"; strcat(fb, "/"); strcat(fb, sender); strcat(fb, "/"); @@ -429,7 +687,7 @@ void *threadFun(void *arg){ //printf("4 %s \n", ptr); //file content für den empfänger erstellen - char fp[100] = "./data/posteingang/"; + char fp[300] = "./data/posteingang/"; char content1[1000] = ""; strcpy(content1, "ID: "); strcat(content1, ts); @@ -493,10 +751,10 @@ void *threadFun(void *arg){ int counter = 0; - char username[8] = ""; - char nid[80] = ""; - char p[20] = ""; - char path[100] = ""; + char username[10] = ""; + char nid[82] = ""; + char p[22] = ""; + char path[300] = ""; while(ptr != NULL) { @@ -548,10 +806,10 @@ void *threadFun(void *arg){ ptr = strtok(buffer, delimiter); int counter = 0; - char username[8] = ""; - char nid[80] = ""; - char betreff[80] = ""; - char folder[20] = ""; + char username[10] = ""; + char nid[82] = ""; + char betreff[82] = ""; + char folder[22] = ""; while(ptr != NULL) { @@ -619,9 +877,9 @@ void *threadFun(void *arg){ ptr = strtok(buffer, delimiter); int counter = 0; - char username[8] = ""; - char p[20] = ""; - char path[100] = ""; + char username[10] = ""; + char p[22] = ""; + char path[300] = ""; while(ptr != NULL) { @@ -702,7 +960,7 @@ void *threadFun(void *arg){ } else if (size == 0) { - printf("Client closed remote socket\n"); + printf("\x1b[33mClient closed remote socket\x1b[0m\n"); break; } else @@ -743,16 +1001,32 @@ int main (int argc, char **argv) { addrlen = sizeof (struct sockaddr_in); - //Verzeichniss erstellen + //Verzeichnisse erstellen + verzeichnis = argv[2]; + char tmpVerzeichnis[300]; + strcpy(tmpVerzeichnis, "/"); + strcat(tmpVerzeichnis, verzeichnis); + createDir(tmpVerzeichnis); + char denyDir[300]; + strcpy(denyDir, tmpVerzeichnis); + strcat(denyDir, "/deny"); + createDir(denyDir); + char postausgang[300]; + char posteingang[300]; + strcpy(postausgang, tmpVerzeichnis); + strcat(postausgang, "/postausgang"); + strcpy(posteingang, tmpVerzeichnis); + strcat(posteingang, "/posteingang"); + createDir(postausgang); + createDir(posteingang); - mkdir(argv[2], 0711); pthread_t tid; while (1) { - printf("Waiting for connections...\n"); + printf("\x1b[34mWaiting for connections...\x1b[0m\n"); new_socket = accept ( create_socket, (struct sockaddr *) &cliaddress, &addrlen ); if (new_socket > 0) { - printf ("Client connected from %s:%d...\n", inet_ntoa (cliaddress.sin_addr),ntohs(cliaddress.sin_port)); + printf ("\x1b[32mClient connected from %s:%d...\x1b[0m\n", inet_ntoa (cliaddress.sin_addr),ntohs(cliaddress.sin_port)); } if (pthread_create(&tid, NULL, threadFun, &new_socket) != 0) {