Compare commits

...

2 Commits

Author SHA1 Message Date
Lukas Nowy
f8b5c93e2d
Protokoll beschrieben 2020-11-01 19:20:18 +01:00
fe32554e3c Blocked Clients, Colored Console, Auto Dir Create 2020-10-28 15:34:51 +01:00
3 changed files with 584 additions and 328 deletions

462
client.c
View File

@ -8,6 +8,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdbool.h> #include <stdbool.h>
#include <termios.h>
#define BUF 1024 #define BUF 1024
void remN(char *s) { void remN(char *s) {
@ -30,269 +31,218 @@ bool startsWith(const char *pre, const char *str)
} }
int main (int argc, char **argv) { int main (int argc, char **argv) {
int create_socket;
char buffer[BUF];
struct sockaddr_in address;
int size;
int create_socket; if( argc < 3 ){
char buffer[BUF]; printf("Usage: %s ServerAdresse Port\n", argv[0]);
struct sockaddr_in address; exit(EXIT_FAILURE);
int size; }
if ((create_socket = socket (AF_INET, SOCK_STREAM, 0)) == -1)
if( argc < 3 ){ {
printf("Usage: %s ServerAdresse Port\n", argv[0]); perror("Socket error");
exit(EXIT_FAILURE); return EXIT_FAILURE;
} }
memset(&address,0,sizeof(address));
if ((create_socket = socket (AF_INET, SOCK_STREAM, 0)) == -1) address.sin_family = AF_INET;
{ address.sin_port = htons (atoi(argv[2]));
perror("Socket error"); inet_aton (argv[1], &address.sin_addr);
return EXIT_FAILURE; 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));
memset(&address,0,sizeof(address)); size=recv(create_socket,buffer,BUF-1, 0);
address.sin_family = AF_INET; if (size>0)
address.sin_port = htons (atoi(argv[2])); {
inet_aton (argv[1], &address.sin_addr); buffer[size]= '\0';
printf("\x1b[36m%s\x1b[0m",buffer);
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)); else
size=recv(create_socket,buffer,BUF-1, 0); {
if (size>0) perror("\x1b[31mConnect error - no server available\x1b[0m");
{ return EXIT_FAILURE;
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; bool login = false;
do { do {
//command vom user überprüfen //command vom user überprüfen
char command[7] = ""; char command[7] = "";
printf ("\n\x1b[35mEnter Command:\x1b[0m \n"); printf ("\n\x1b[35mEnter Command:\x1b[0m \n");
fgets (command, 7, stdin); fgets (command, 7, stdin);
if (startsWith("login", command) == true && login == false) if (startsWith("login", command) == true && login == false)
{ {
char username[10] = ""; char username[10] = "";
char pw[50] = ""; char pw[50] = "";
char bufferString[BUF] = ""; char bufferString[BUF] = "";
strcpy(bufferString, "login;"); strcpy(bufferString, "login;");
//User Dateneingabe und daten einlesen //User Dateneingabe und daten einlesen
printf("\x1b[35m<Username max. 8 Zeichen>\x1b[0m\n"); printf("\x1b[35m<Username max. 8 Zeichen>\x1b[0m\n");
fgets (username, 10, stdin); fgets (username, 10, stdin);
printf("\x1b[35m<Passwort max. 50 Zeichen>\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<Passwort max. 50 Zeichen>\x1b[0m\n"); strcat(bufferString, username);
fgets (pw, 50, stdin); strcat(bufferString, ";");
strcat(bufferString, pw);
strcat(bufferString, username); remN(bufferString);
strcat(bufferString, ";"); send(create_socket, bufferString, strlen (bufferString), 0);
strcat(bufferString, pw); //Response vom Server (OK oder ERR) empfangen und ausgeben
remN(bufferString); char readBuffer[BUF] = "";
read(create_socket , readBuffer, 1023);
send(create_socket, bufferString, strlen (bufferString), 0); remN(readBuffer);
if (strcmp("OK", readBuffer) == 0)
//Response vom Server (OK oder ERR) empfangen und ausgeben {
char readBuffer[BUF] = ""; printf("\n\x1b[32m%s\x1b[0m\n", readBuffer);
read(create_socket , readBuffer, 1024); login = true;
printf("\n%s\n", readBuffer); }else if (strcmp("ERR", readBuffer) == 0 || strcmp("Client Gesperrt", readBuffer) == 0)
if (strncmp(readBuffer, "OK", 2) == 0) {
{ printf("\n\x1b[31m%s\x1b[0m\n", readBuffer);
login = true;
}
}else if (login == false && startsWith("quit", command) == true)
{
strcpy(buffer, "quit\n");
}else if (login == false)
{
printf("\x1b[33mBitte zuerst <login> 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<Sender max. 8 Zeichen>\x1b[0m\n");
fgets (sender, 8, stdin);
printf("\x1b[35m<Empfänger max. 8 Zeichen>\x1b[0m\n");
fgets (empfaenger, 8, stdin);
printf("\x1b[35m<Betreff max. 80 Zeichen>\x1b[0m\n");
fgets (betreff, 80, stdin);
printf("\x1b[35m<Nachricht, beliebige Anzahl an Zeilen>\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<Username max. 8 Zeichen>\x1b[0m\n");
fgets (username, 8, stdin);
printf("\x1b[35m<Posteingang oder Postausgang>\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) {
} }
}else if (login == false && startsWith("quit", command) == true)
else if(strcmp(ptr, "..") == 0) { {
}
else if (counter == 0) {
printf("\x1b[35m<Anzahl der Nachrichten für den User: %s>\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<Username max. 8 Zeichen>\x1b[0m\n");
fgets (username, 8, stdin);
printf("\x1b[35m<posteingang oder postausgang>\x1b[0m\n");
fgets (folder, 20, stdin);
printf("\x1b[35m<Nachrichten-Nummer>\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<Username max. 8 Zeichen>\x1b[0m\n");
fgets (username, 8, stdin);
printf("\x1b[35m<Posteingang oder Postausgang>\x1b[0m\n");
fgets (p, 20, stdin);
printf("\x1b[35m<Nachrichten-Nummer>\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) {
strcpy(buffer, "quit\n"); strcpy(buffer, "quit\n");
}else if (login == false)
{
printf("\x1b[33mBitte zuerst <login> 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<Sender max. 8 Zeichen>\x1b[0m\n");
fgets (sender, 10, stdin);
printf("\x1b[35m<Empfänger max. 8 Zeichen>\x1b[0m\n");
fgets (empfaenger, 10, stdin);
printf("\x1b[35m<Betreff max. 80 Zeichen>\x1b[0m\n");
fgets (betreff, 82, stdin);
printf("\x1b[35m<Nachricht, beliebige Anzahl an Zeilen>\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<Username max. 8 Zeichen>\x1b[0m\n");
fgets (username, 10, stdin);
printf("\x1b[35m<Posteingang oder Postausgang>\x1b[0m\n");
fgets (p, 22, stdin);
else { strcat(bufferString, ";");
printf("DAS IST KEIN COMMAND!!!!!"); 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<Anzahl der Nachrichten für den User: %s>\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<Username max. 8 Zeichen>\x1b[0m\n");
fgets (username, 10, stdin);
printf("\x1b[35m<posteingang oder postausgang>\x1b[0m\n");
fgets (folder, 22, stdin);
printf("\x1b[35m<Nachrichten-Nummer>\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<Username max. 8 Zeichen>\x1b[0m\n");
fgets (username, 10, stdin);
printf("\x1b[35m<Posteingang oder Postausgang>\x1b[0m\n");
fgets (p, 22, stdin);
printf("\x1b[35m<Nachrichten-Nummer>\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;
} }

View File

@ -2,11 +2,43 @@
# Protokoll 🔧 # Protokoll 🔧
``` ```
LOGIN: login;username;passwort Als erstes muss der User immer der Befehl eingegeben (send, read, list oder delete). Danach schreibt der Client
immer eine Zeile, was der User als nächstes eingeben soll. Die Buffer Strings der Befehle sind folgerndermaßen
aufgebaut:
SEND: send;sender;empänger;betreff;nachricht SEND: send;sender;empänger;betreff;nachricht
LIST: list:username;postEinAusgang LIST: list;username;postEinAusgang
READ: read;username;postEinAusgang;nid READ: read;username;postEinAusgang;nid
DEL: del;username;postEinAusgang;nid DEL: del;username;postEinAusgang;nid
Der Buffer wird immer als Ganzes (wie oben beschrieben) vom Client an den Server übertragen (nicht Blockweise).
Der Client fügt die Usereingaben als String zusammen und trennt sie mit einem ";". Der Server splittet den Befehl
dann anhand des Delimiters ";" und geht jedes einzelne Attribut (z.B. username, nid) in einer Schleife durch und
führt den entsprechende Aktionen aus. Als erstes Attribut steht immer der Befehl, damit der Server sofort erkennt,
welche Aktion er ausführen soll. Die nid (Nachrichten ID) wird am Server erzeugt und setzt sich aus einem Timestamp
+ dem Betreff zusammen.
Bei send und delete sendet der Server entweder OK oder ERR zurück. Bei list, die Anzahl der Nachrichten und pro
Zeile den Betreff. Bei read wird die gesamte Nachricht (nid, Sent From/To, Betreff, Nachricht) zurückgesendet.
Am Server gibt es die Verzeichnisse Posteingang und Postausgang. Darin sind Verzeichniss mit den jeweiligen
Usernamen und darin befinden sich .txt Dateien mit den Nachrichten.
Eine Nachricht wird zb. folgerndermaßen am Server gespeichert:
ID: 2020-10-2918:05:32hallo
Sent to: if20b206
Betreff: hallo
Message: wie gehts
```
# Installation
```
sudo apt-get install ldap-utils
sudo apt-get install libldap
sudo apt-get update -y
sudo apt-get install -y libldap-dev
``` ```
# Erstellt von # Erstellt von

414
server.c
View File

@ -18,44 +18,284 @@
#include <termios.h> #include <termios.h>
#define MAXCHAR 1000 #define MAXCHAR 1000
#define BUF 1024 #define BUF 1024
char *verzeichnis;
bool startsWith(const char *pre, const char *str) // Entfernt das \n und macht \0 daraus
{ void remN(char *s) {
size_t lenpre = strlen(pre), char *p2 = s;
lenstr = strlen(str); while(*s != '\0') {
return lenstr < lenpre ? false : memcmp(pre, str, lenpre) == 0; if(*s != '\t' && *s != '\n') {
*p2++ = *s++;
} else {
++s;
}
}
*p2 = '\0';
} }
void mstore_data(const char *filepath, const char *data) //Checkt ob ein dir bereits existiert
{ bool dirExists(const char path[300]){
FILE *fp = fopen(filepath, "ab"); struct stat st = {0};
if (fp != NULL) char cwd[300];
{ if (getcwd(cwd, sizeof(cwd)) != NULL) {
fputs(data, fp); //printf("Current working dir: %s\n", cwd);
fclose(fp); } 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 countFiles(char path[]) {
int file_count = 0; int file_count = 0;
DIR * dirp; DIR * dirp;
struct dirent * entry; struct dirent * entry;
dirp = opendir(path); /* There should be error handling after this */ dirp = opendir(path);
while ((entry = readdir(dirp)) != NULL) { while ((entry = readdir(dirp)) != NULL) {
if (entry->d_type == DT_REG) { /* If the entry is a regular file */ if (entry->d_type == DT_REG) {
file_count++; file_count++;
} }
} }
closedir(dirp); closedir(dirp);
return file_count;
return file_count;
} }
int login_user(char username[8], char pw[50]) int login_user(char username[10], char pw[50]){
{
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
// LDAP config // LDAP config
// anonymous bind with user and pw empty // anonymous bind with user and pw empty
@ -67,14 +307,10 @@ int login_user(char username[8], char pw[50])
char rawLdapUser[128]; char rawLdapUser[128];
strcpy(rawLdapUser, username); strcpy(rawLdapUser, username);
sprintf(ldapBindUser, "uid=%s,ou=people,dc=technikum-wien,dc=at", rawLdapUser); sprintf(ldapBindUser, "uid=%s,ou=people,dc=technikum-wien,dc=at", rawLdapUser);
printf("user set to: %s\n", ldapBindUser);
// read password (bash: export ldappw=<yourPW>) // read password (bash: export ldappw=<yourPW>)
char ldapBindPassword[256]; char ldapBindPassword[256];
strcpy(ldapBindPassword, pw); strcpy(ldapBindPassword, pw);
printf("pw taken over from commandline: %s\n", pw);
// search settings // search settings
const char *ldapSearchBaseDomainComponent = "dc=technikum-wien,dc=at"; 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"); fprintf(stderr, "ldap_init failed\n");
return 0; return 0;
} }
printf("connected to LDAP server %s\n", ldapUri); printf("\x1b[32mconnected to LDAP server %s\x1b[0m\n", ldapUri);
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
// set verison options // set verison options
@ -208,7 +444,7 @@ int login_user(char username[8], char pw[50])
return 0; return 0;
} }
// https://linux.die.net/man/3/ldap_count_entries // 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 // get result of search
@ -222,7 +458,7 @@ int login_user(char username[8], char pw[50])
///////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////
// Base Information of the search result entry // Base Information of the search result entry
// https://linux.die.net/man/3/ldap_get_dn // 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 // 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++) 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(searchResultEntryAttribute,"uid") == 0){
if(strcmp(vals[i]->bv_val,rawLdapUser) == 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 // Free Memory
ldap_value_free_len(vals); ldap_value_free_len(vals);
ldap_memfree(searchResultEntryAttribute); ldap_memfree(searchResultEntryAttribute);
@ -307,6 +543,7 @@ void *threadFun(void *arg){
buffer[size] = '\0'; buffer[size] = '\0';
if (login == false) if (login == false)
{ {
// Do login // Do login
if (strncmp("login", buffer, 5) == 0) if (strncmp("login", buffer, 5) == 0)
{ {
@ -315,7 +552,7 @@ void *threadFun(void *arg){
//den buffer mit dem seperator splitten //den buffer mit dem seperator splitten
ptr = strtok(buffer, delimiter); ptr = strtok(buffer, delimiter);
int counter = 0; int counter = 0;
char username[9]; char username[10];
char pw[50]; char pw[50];
while(ptr != NULL) { while(ptr != NULL) {
if (counter == 1) { if (counter == 1) {
@ -329,17 +566,38 @@ void *threadFun(void *arg){
ptr = strtok(NULL, delimiter); ptr = strtok(NULL, delimiter);
} }
if(login_user(username, pw) == 1){ if(login_user(username, pw) == 1){
login = true; printf("\x1b[32mUser: %s hat den Login geschafft!!\x1b[0m\n", username);
printf("Login geschafft!!"); if(checkDeniedUser(username) == true){
//OK an den client zurücksenden stopDenyUser(username);
char suc[] = "OK"; }
send(new_socket , suc , strlen(suc) , 0 ); 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 }else
{ {
printf("Login error!!!"); printf("\x1b[31mUser: %s hat den Login NICHT geschafft!!\x1b[0m\n", username);
//OK an den client zurücksenden
char err[] = "ERR"; if(userDenied(username) == false){
send(new_socket , err , strlen(err) , 0 ); 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); ptr = strtok(buffer, delimiter);
int counter = 0; int counter = 0;
char sender[8] = ""; char sender[10] = "";
char empfaenger[8] = ""; char empfaenger[10] = "";
char betreff[80] = ""; char betreff[82] = "";
//timestamp als ersten teil der id erstellen //timestamp als ersten teil der id erstellen
char ts[20]; char ts[22];
time_t now = time(NULL); 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 //den gesplitteten buffer schritt für schritt durchgehen
@ -405,7 +663,7 @@ void *threadFun(void *arg){
strcat(ts, betreff); strcat(ts, betreff);
//Pfad erstellen für den sender und file erstellen //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, "/");
strcat(fb, sender); strcat(fb, sender);
strcat(fb, "/"); strcat(fb, "/");
@ -429,7 +687,7 @@ void *threadFun(void *arg){
//printf("4 %s \n", ptr); //printf("4 %s \n", ptr);
//file content für den empfänger erstellen //file content für den empfänger erstellen
char fp[100] = "./data/posteingang/"; char fp[300] = "./data/posteingang/";
char content1[1000] = ""; char content1[1000] = "";
strcpy(content1, "ID: "); strcpy(content1, "ID: ");
strcat(content1, ts); strcat(content1, ts);
@ -493,10 +751,10 @@ void *threadFun(void *arg){
int counter = 0; int counter = 0;
char username[8] = ""; char username[10] = "";
char nid[80] = ""; char nid[82] = "";
char p[20] = ""; char p[22] = "";
char path[100] = ""; char path[300] = "";
while(ptr != NULL) { while(ptr != NULL) {
@ -548,10 +806,10 @@ void *threadFun(void *arg){
ptr = strtok(buffer, delimiter); ptr = strtok(buffer, delimiter);
int counter = 0; int counter = 0;
char username[8] = ""; char username[10] = "";
char nid[80] = ""; char nid[82] = "";
char betreff[80] = ""; char betreff[82] = "";
char folder[20] = ""; char folder[22] = "";
while(ptr != NULL) { while(ptr != NULL) {
@ -619,9 +877,9 @@ void *threadFun(void *arg){
ptr = strtok(buffer, delimiter); ptr = strtok(buffer, delimiter);
int counter = 0; int counter = 0;
char username[8] = ""; char username[10] = "";
char p[20] = ""; char p[22] = "";
char path[100] = ""; char path[300] = "";
while(ptr != NULL) { while(ptr != NULL) {
@ -702,7 +960,7 @@ void *threadFun(void *arg){
} }
else if (size == 0) else if (size == 0)
{ {
printf("Client closed remote socket\n"); printf("\x1b[33mClient closed remote socket\x1b[0m\n");
break; break;
} }
else else
@ -743,16 +1001,32 @@ int main (int argc, char **argv) {
addrlen = sizeof (struct sockaddr_in); 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; pthread_t tid;
while (1) { while (1) {
printf("Waiting for connections...\n"); printf("\x1b[34mWaiting for connections...\x1b[0m\n");
new_socket = accept ( create_socket, (struct sockaddr *) &cliaddress, &addrlen ); new_socket = accept ( create_socket, (struct sockaddr *) &cliaddress, &addrlen );
if (new_socket > 0) 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) if (pthread_create(&tid, NULL, threadFun, &new_socket) != 0)
{ {