From ddada8bb82cc0d154cde1f687a981d74a05ebe73 Mon Sep 17 00:00:00 2001 From: Georg Reisinger Date: Tue, 27 Oct 2020 18:19:21 +0100 Subject: [PATCH] LDAP Login, Makefile, Output Color --- client | Bin 21824 -> 0 bytes client.c | 91 ++++-- makefile | 9 +- readme.md | 1 + server | Bin 26824 -> 0 bytes server.c | 947 +++++++++++++++++++++++++++++++++++------------------- 6 files changed, 683 insertions(+), 365 deletions(-) delete mode 100644 client delete mode 100644 server diff --git a/client b/client deleted file mode 100644 index 449ced8d28a72f62ba2c216a708541a46cf2fcca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21824 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 diff --git a/client.c b/client.c index 2946ced..ae30345 100644 --- a/client.c +++ b/client.c @@ -54,26 +54,68 @@ int main (int argc, char **argv) { if (connect ( create_socket, (struct sockaddr *) &address, sizeof (address)) == 0) { - printf ("Connection with server (%s) established\n", inet_ntoa (address.sin_addr)); + 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("%s",buffer); + printf("\x1b[36m%s\x1b[0m",buffer); } } else { - perror("Connect error - no server available"); + perror("\x1b[31mConnect error - no server available\x1b[0m"); return EXIT_FAILURE; } - + bool login = false; do { //command vom user überprüfen - char command[6] = ""; - printf ("\nEnter Command: \n"); - fgets (command, 6, stdin); + 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); + + 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) { @@ -87,16 +129,16 @@ int main (int argc, char **argv) { strcat(bufferString, "send"); //User Dateneingabe und daten einlesen - printf("\n"); + printf("\x1b[35m\x1b[0m\n"); fgets (sender, 8, stdin); - printf("\n"); + printf("\x1b[35m\x1b[0m\n"); fgets (empfaenger, 8, stdin); - printf("\n"); + printf("\x1b[35m\x1b[0m\n"); fgets (betreff, 80, stdin); - printf("\n"); + printf("\x1b[35m\x1b[0m\n"); fgets (nachricht, 80, stdin); //Buffer formatieren @@ -114,7 +156,7 @@ int main (int argc, char **argv) { //Response vom Server (OK oder ERR) empfangen und ausgeben char readBuffer[BUF] = ""; - int valread = read(create_socket , readBuffer, 1024); + read(create_socket , readBuffer, 1024); printf("\n%s\n", readBuffer); } @@ -125,9 +167,9 @@ int main (int argc, char **argv) { char p[20] = ""; int counter = 0; - printf("\n"); + printf("\x1b[35m\x1b[0m\n"); fgets (username, 8, stdin); - printf("\n"); + printf("\x1b[35m\x1b[0m\n"); fgets (p, 20, stdin); strcat(bufferString, ";"); @@ -139,7 +181,7 @@ int main (int argc, char **argv) { send(create_socket, bufferString, strlen (bufferString), 0); char readBuffer[BUF] = ""; - int valread = read(create_socket , readBuffer, 1024); + read(create_socket , readBuffer, 1024); char delimiter[] = ";"; char *ptr; @@ -157,7 +199,7 @@ int main (int argc, char **argv) { } else if (counter == 0) { - printf("\n", ptr); + printf("\x1b[35m\x1b[0m\n", ptr); } else { @@ -179,11 +221,11 @@ int main (int argc, char **argv) { char nid[80] = ""; char folder[20] = ""; - printf("\n"); + printf("\x1b[35m\x1b[0m\n"); fgets (username, 8, stdin); - printf("\n"); + printf("\x1b[35m\x1b[0m\n"); fgets (folder, 20, stdin); - printf("\n"); + printf("\x1b[35m\x1b[0m\n"); fgets (nid, 80, stdin); strcat(bufferString, ";"); @@ -201,7 +243,7 @@ int main (int argc, char **argv) { //strcpy(buffer, ""); //buffer[size]= '\0'; char readBuffer[BUF] = ""; - int valread = read(create_socket , readBuffer, 1000); + read(create_socket , readBuffer, 1000); printf("\n%s\n", readBuffer ); } @@ -214,11 +256,11 @@ int main (int argc, char **argv) { char bufferString[BUF] = "del"; char p[20] = ""; - printf("\n"); + printf("\x1b[35m\x1b[0m\n"); fgets (username, 8, stdin); - printf("\n"); + printf("\x1b[35m\x1b[0m\n"); fgets (p, 20, stdin); - printf("\n"); + printf("\x1b[35m\x1b[0m\n"); fgets (nachrichtennummer, 80, stdin); strcat(bufferString, ";"); @@ -232,7 +274,7 @@ int main (int argc, char **argv) { send(create_socket, bufferString, strlen (bufferString), 0); char readBuffer[BUF] = ""; - int valread = read(create_socket , readBuffer, 1024); + read(create_socket , readBuffer, 1024); printf("\n%s\n", readBuffer ); } @@ -244,6 +286,7 @@ int main (int argc, char **argv) { else { printf("DAS IST KEIN COMMAND!!!!!"); } + } diff --git a/makefile b/makefile index e91d609..b3c623b 100755 --- a/makefile +++ b/makefile @@ -1,7 +1,8 @@ #Client und Server kompilieren all: server.c client.c - gcc server.c -o server -lpthread - gcc client.c -o client -lpthread + gcc -Wall -o server server.c -lldap -llber -lpthread + gcc -Wall -o client client.c -lldap -llber -lpthread + #Kompilierten Client und Server löschen clean: client server @@ -9,11 +10,11 @@ clean: client server #Nur den Client kompilieren: client: client.c - gcc client.c -o client -lpthread + gcc -Wall -o client client.c -lldap -llber -lpthread #Nur den Server kompilieren: server: server.c - gcc server.c -o server -lpthread + gcc -Wall -o server server.c -lldap -llber -lpthread #Kompilierten Server löschen cleanS: server diff --git a/readme.md b/readme.md index 8ad382e..125e33d 100644 --- a/readme.md +++ b/readme.md @@ -2,6 +2,7 @@ # Protokoll 🔧 ``` +LOGIN: login;username;passwort SEND: send;sender;empänger;betreff;nachricht LIST: list:username;postEinAusgang READ: read;username;postEinAusgang;nid diff --git a/server b/server deleted file mode 100644 index 84062b82b47b69264933a5c556b97fe53be87084..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26824 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 jrEJ&Jk9 #include #include +#include +#include + #define MAXCHAR 1000 #define BUF 1024 @@ -51,373 +54,646 @@ int countFiles(char path[]) { return file_count; } +int login_user(char username[8], char pw[50]) +{ + //////////////////////////////////////////////////////////////////////////// + // LDAP config + // anonymous bind with user and pw empty + const char *ldapUri = "ldap://ldap.technikum-wien.at:389"; + const int ldapVersion = LDAP_VERSION3; + + // read username (bash: export ldapuser=) + char ldapBindUser[256]; + 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"; + const char *ldapSearchFilter = "(uid=if20b20*)"; + ber_int_t ldapSearchScope = LDAP_SCOPE_SUBTREE; + const char *ldapSearchResultAttributes[] = {"uid", "cn", NULL}; + + // general + int rc = 0; // return code + + //////////////////////////////////////////////////////////////////////////// + // setup LDAP connection + // https://linux.die.net/man/3/ldap_initialize + LDAP *ldapHandle; + rc = ldap_initialize(&ldapHandle, ldapUri); + if (rc != LDAP_SUCCESS) + { + fprintf(stderr, "ldap_init failed\n"); + return 0; + } + printf("connected to LDAP server %s\n", ldapUri); + + //////////////////////////////////////////////////////////////////////////// + // set verison options + // https://linux.die.net/man/3/ldap_set_option + rc = ldap_set_option( + ldapHandle, + LDAP_OPT_PROTOCOL_VERSION, // OPTION + &ldapVersion); // IN-Value + if (rc != LDAP_OPT_SUCCESS) + { + // https://www.openldap.org/software/man.cgi?query=ldap_err2string&sektion=3&apropos=0&manpath=OpenLDAP+2.4-Release + fprintf(stderr, "ldap_set_option(PROTOCOL_VERSION): %s\n", ldap_err2string(rc)); + ldap_unbind_ext_s(ldapHandle, NULL, NULL); + return 0; + } + + //////////////////////////////////////////////////////////////////////////// + // start connection secure (initialize TLS) + // https://linux.die.net/man/3/ldap_start_tls_s + // int ldap_start_tls_s(LDAP *ld, + // LDAPControl **serverctrls, + // LDAPControl **clientctrls); + // https://linux.die.net/man/3/ldap + // https://docs.oracle.com/cd/E19957-01/817-6707/controls.html + // The LDAPv3, as documented in RFC 2251 - Lightweight Directory Access + // Protocol (v3) (http://www.faqs.org/rfcs/rfc2251.html), allows clients + // and servers to use controls as a mechanism for extending an LDAP + // operation. A control is a way to specify additional information as + // part of a request and a response. For example, a client can send a + // control to a server as part of a search request to indicate that the + // server should sort the search results before sending the results back + // to the client. + rc = ldap_start_tls_s( + ldapHandle, + NULL, + NULL); + if (rc != LDAP_SUCCESS) + { + fprintf(stderr, "ldap_start_tls_s(): %s\n", ldap_err2string(rc)); + ldap_unbind_ext_s(ldapHandle, NULL, NULL); + return 0; + } + + //////////////////////////////////////////////////////////////////////////// + // bind credentials + // https://linux.die.net/man/3/lber-types + // SASL (Simple Authentication and Security Layer) + // https://linux.die.net/man/3/ldap_sasl_bind_s + // int ldap_sasl_bind_s( + // LDAP *ld, + // const char *dn, + // const char *mechanism, + // struct berval *cred, + // LDAPControl *sctrls[], + // LDAPControl *cctrls[], + // struct berval **servercredp); + + BerValue bindCredentials; + bindCredentials.bv_val = (char *)ldapBindPassword; + bindCredentials.bv_len = strlen(ldapBindPassword); + BerValue *servercredp; // server's credentials + rc = ldap_sasl_bind_s( + ldapHandle, + ldapBindUser, + LDAP_SASL_SIMPLE, + &bindCredentials, + NULL, + NULL, + &servercredp); + if (rc != LDAP_SUCCESS) + { + fprintf(stderr, "LDAP bind error: %s\n", ldap_err2string(rc)); + ldap_unbind_ext_s(ldapHandle, NULL, NULL); + return 0; + } + + //////////////////////////////////////////////////////////////////////////// + // perform ldap search + // https://linux.die.net/man/3/ldap_search_ext_s + // _s : synchronous + // int ldap_search_ext_s( + // LDAP *ld, + // char *base, + // int scope, + // char *filter, + // char *attrs[], + // int attrsonly, + // LDAPControl **serverctrls, + // LDAPControl **clientctrls, + // struct timeval *timeout, + // int sizelimit, + // LDAPMessage **res ); + LDAPMessage *searchResult; + rc = ldap_search_ext_s( + ldapHandle, + ldapSearchBaseDomainComponent, + ldapSearchScope, + ldapSearchFilter, + (char **)ldapSearchResultAttributes, + 0, + NULL, + NULL, + NULL, + 500, + &searchResult); + if (rc != LDAP_SUCCESS) + { + fprintf(stderr, "LDAP search error: %s\n", ldap_err2string(rc)); + ldap_unbind_ext_s(ldapHandle, NULL, NULL); + return 0; + } + // https://linux.die.net/man/3/ldap_count_entries + printf("Total results: %d\n", ldap_count_entries(ldapHandle, searchResult)); + + //////////////////////////////////////////////////////////////////////////// + // get result of search + // https://linux.die.net/man/3/ldap_first_entry + // https://linux.die.net/man/3/ldap_next_entry + LDAPMessage *searchResultEntry; + for (searchResultEntry = ldap_first_entry(ldapHandle, searchResult); + searchResultEntry != NULL; + searchResultEntry = ldap_next_entry(ldapHandle, searchResultEntry)) + { + ///////////////////////////////////////////////////////////////////////// + // 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)); + + ///////////////////////////////////////////////////////////////////////// + // Attributes + // https://linux.die.net/man/3/ldap_first_attribute + // https://linux.die.net/man/3/ldap_next_attribute + // + // berptr: berptr, a pointer to a BerElement it has allocated to keep + // track of its current position. This pointer should be passed + // to subsequent calls to ldap_next_attribute() and is used to + // effectively step through the entry's attributes. + BerElement *ber; + char *searchResultEntryAttribute; + for (searchResultEntryAttribute = ldap_first_attribute(ldapHandle, searchResultEntry, &ber); + searchResultEntryAttribute != NULL; + searchResultEntryAttribute = ldap_next_attribute(ldapHandle, searchResultEntry, ber)) + { + BerValue **vals; + if ((vals = ldap_get_values_len(ldapHandle, searchResultEntry, searchResultEntryAttribute)) != NULL) + { + for (int i = 0; i < ldap_count_values_len(vals); i++) + { + printf("\t%s: %s\n", searchResultEntryAttribute, vals[i]->bv_val); + if(strcmp(searchResultEntryAttribute,"uid") == 0){ + if(strcmp(vals[i]->bv_val,rawLdapUser) == 0){ + printf("\n\nGEFUNDEN!!!!!!!!!!!!!!!!!\n\n"); + // Free Memory + ldap_value_free_len(vals); + ldap_memfree(searchResultEntryAttribute); + if (ber != NULL){ + ber_free(ber, 0); + } + printf("\n"); + ldap_msgfree(searchResult); + ldap_unbind_ext_s(ldapHandle, NULL, NULL); + return 1; + } + } + } + ldap_value_free_len(vals); + } + + // free memory + ldap_memfree(searchResultEntryAttribute); + } + // free memory + if (ber != NULL) + { + ber_free(ber, 0); + } + + printf("\n"); + } + + // free memory + ldap_msgfree(searchResult); + + //////////////////////////////////////////////////////////////////////////// + // https://linux.die.net/man/3/ldap_unbind_ext_s + // int ldap_unbind_ext_s( + // LDAP *ld, + // LDAPControl *sctrls[], + // LDAPControl *cctrls[]); + ldap_unbind_ext_s(ldapHandle, NULL, NULL); + + return 0; +} + void *threadFun(void *arg){ int new_socket = *((int *)arg); char buffer[BUF]; pthread_detach(pthread_self()); if(new_socket > 0){ - strcpy(buffer, "Welcome to myserver, Please enter your command:\n"); + strcpy(buffer, "Welcome to Lukas & Georgs Server, Please type to login:\n"); send(new_socket, buffer, strlen(buffer),0); } + bool login = false; do { int size = recv (new_socket, buffer, BUF-1, 0); if( size > 0) { buffer[size] = '\0'; - - //Überprüfen welchen command der client eingegeben hat, - // wenn command nicht zutreffend error zurücksenden - if(startsWith("send", buffer) == true) { - - char delimiter[] = ";"; - char *ptr; - //den buffer mit dem seperator splitten - ptr = strtok(buffer, delimiter); - - int counter = 0; - char filename1[] = ""; - char filename2[] = ""; - char sender[8] = ""; - char content[] = ""; - char empfaenger[8] = ""; - char betreff[80] = ""; - char nid[100] = ""; - - //timestamp als ersten teil der id erstellen - char ts[20]; - time_t now = time(NULL); - strftime(ts, 20, "%Y-%m-%d%H:%M:%S", localtime(&now)); - - - //den gesplitteten buffer schritt für schritt durchgehen - while(ptr != NULL) { - //printf("Abschnitt gefunden: %s\n", ptr); - //sender auslesen, ordner für sender erstellen, wenn nicht vorhanden - if (counter == 1) { - struct stat st = {0}; - char dir[] = "./data/postausgang/"; - strcat(dir, ptr); - - if (stat(dir, &st) == -1) { - mkdir(dir, 0700); + if (login == false) + { + // Do login + if (strncmp("login", buffer, 5) == 0) + { + char delimiter[] = ";"; + char *ptr; + //den buffer mit dem seperator splitten + ptr = strtok(buffer, delimiter); + int counter = 0; + char username[9]; + char pw[50]; + while(ptr != NULL) { + if (counter == 1) { + strcpy(username, ptr); + }else if(counter == 2) + { + strcpy(pw, ptr); } - - strcat(sender, ptr); - printf("1 %s \n", ptr); + counter = counter + 1; + // naechsten Abschnitt erstellen + 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 ); + }else + { + printf("Login error!!!"); + //OK an den client zurücksenden + char err[] = "ERR"; + send(new_socket , err , strlen(err) , 0 ); } - //empfänger auslesen, ordner für empfänger erstellen, wenn nicht vorhanden - if (counter == 2) { - struct stat st2 = {0}; - char dir2[] = "./data/posteingang/"; - strcat(dir2, ptr); - - if (stat(dir2, &st2) == -1) { - mkdir(dir2, 0700); - } - - strcat(empfaenger, ptr); - printf("2 %s \n" , ptr); - } - - //betreff auslesen, id (ts) fertigstellen, - //2 dateien erstellen für sender und empfänger mit ts als filename - if (counter == 3) { - //printf("3 %s \n", ptr); - - strcat(betreff, ptr); - strcat(ts, betreff); - - //Pfad erstellen für den sender und file erstellen - char fb[100] = "touch ./data/postausgang/"; - strcat(fb, "/"); - strcat(fb, sender); - strcat(fb, "/"); - strcat(fb, ts); - printf("PATH: %s \n", fb); - system(fb); - - //Pfad erstellen für den empfänger und file erstellen - strcpy(fb, "touch ./data/posteingang/"); - strcat(fb, "/"); - strcat(fb, empfaenger); - strcat(fb, "/"); - strcat(fb, ts); - printf("PATH: %s \n", fb); - system(fb); - - } - - //buffer in files schreiben - if (counter == 4) { - //printf("4 %s \n", ptr); - - //file content für den empfänger erstellen - char fp[100] = "./data/posteingang/"; - char content1[1000] = ""; - strcpy(content1, "ID: "); - strcat(content1, ts); - strcat(content1, "\n"); - strcat(content1, "Received from: "); - strcat(content1, sender); - strcat(content1, "\n"); - strcat(content1, "Betreff: "); - strcat(content1, betreff); - strcat(content1, "\n"); - strcat(content1, "Message: "); - strcat(content1, ptr); - - strcat(fp, empfaenger); - strcat(fp, "/"); - strcat(fp, ts); - //content in das file storen - mstore_data(fp, content1); - - //file content für den sender erstellen - char content2[1000] = ""; - strcpy(content2, "ID: "); - strcat(content2, ts); - strcat(content2, "\n"); - strcat(content2, "Sent to: "); - strcat(content2, empfaenger); - strcat(content2, "\n"); - strcat(content2, "Betreff: "); - strcat(content2, betreff); - strcat(content2, "\n"); - strcat(content2, "Message: "); - strcat(content2, ptr); - - strcpy(fp, "./data/postausgang/"); - strcat(fp, sender); - strcat(fp, "/"); - strcat(fp, ts); - //content2 in das file storen - mstore_data(fp, content2); - - } - counter = counter + 1; - // naechsten Abschnitt erstellen - ptr = strtok(NULL, delimiter); - } + + }else{// Is logedin + // Überprüfen welchen command der client eingegeben hat, + // wenn command nicht zutreffend error zurücksenden + if(startsWith("send", buffer) == true) { - //printf ("\n Message received: \n %s", buffer); - //OK an den client zurücksenden - char suc[] = "OK"; - send(new_socket , suc , strlen(suc) , 0 ); + char delimiter[] = ";"; + char *ptr; + //den buffer mit dem seperator splitten + ptr = strtok(buffer, delimiter); - } + int counter = 0; + char sender[8] = ""; + char empfaenger[8] = ""; + char betreff[80] = ""; - else if(startsWith("del", buffer) == true) { - printf("delete: %s ", buffer); + //timestamp als ersten teil der id erstellen + char ts[20]; + time_t now = time(NULL); + strftime(ts, 20, "%Y-%m-%d%H:%M:%S", localtime(&now)); + - char delimiter[] = ";"; - char *ptr; - ptr = strtok(buffer, delimiter); + //den gesplitteten buffer schritt für schritt durchgehen + while(ptr != NULL) { + //printf("Abschnitt gefunden: %s\n", ptr); + //sender auslesen, ordner für sender erstellen, wenn nicht vorhanden + if (counter == 1) { + struct stat st = {0}; + char dir[] = "./data/postausgang/"; + strcat(dir, ptr); - int counter = 0; - - char username[8] = ""; - char nid[80] = ""; - char p[20] = ""; - char path[100] = ""; - - while(ptr != NULL) { - - //username speichern - if(counter == 1) { - strcat(username, ptr); - } - - //post ein- oder ausgang speichern - if(counter == 2) { - strcpy(p, ptr); - } - - //nid speichern, den path string erstellen, rm -rf path ausführen - if(counter == 3) { - strcat(nid, ptr); - if(strcmp(p, "postausgang") == 0) { - strcpy(path, "rm -rf ./data/postausgang/"); - } - - if(strcmp(p, "posteingang") == 0) { - strcpy(path, "rm -rf ./data/posteingang/"); - } - - strcat(path, username); - strcat(path, "/"); - strcat(path, nid); - - system(path); - } - counter = counter + 1; - - // naechsten Abschnitt erstellen - ptr = strtok(NULL, delimiter); - } - - //OK an client zurücksenden - char resBuff[BUF] = "OK\n"; - send(new_socket, resBuff, strlen(resBuff),0); - strcpy(buffer, ""); - - } - - //read - else if(startsWith("read", buffer) == true) { - - char delimiter[] = ";"; - char *ptr; - ptr = strtok(buffer, delimiter); - - int counter = 0; - char username[8] = ""; - char nid[80] = ""; - char betreff[80] = ""; - char folder[20] = ""; - - while(ptr != NULL) { - - if(counter == 1) { - //username speichern - strcat(username, ptr); - } - - //postein- oder ausgang speichern - if(counter == 2) { - strcpy(folder, ptr); - } - - //nid speichern, file mit dem path lesen und an client zzrücksenden - if(counter == 3) { - //nid - strcat(nid, ptr); - strcpy(betreff, nid); - - - char filename[] = "./data/"; - strcat(filename, folder); - strcat(filename, "/"); - - strcat(filename, username); - strcat(filename, "/"); - strcat(filename, nid); - printf("PATH: %s", filename); - - FILE *ptr_file; - char buf[1000]; - char res[1000]; - - ptr_file = fopen(filename,"r"); - if (!ptr_file) - perror("File Open error!"); - - while (fgets(buf,1000, ptr_file)!=NULL) { - strcat(res, buf); - } - - - fclose(ptr_file); - - - // and send that buffer to client - - printf("%s", res); - send(new_socket , res, strlen(res), 0 ); - - } - - counter = counter + 1; - - // naechsten Abschnitt erstellen - ptr = strtok(NULL, delimiter); - } - } - - //list - else if(startsWith("list", buffer) == true) { - - char delimiter[] = ";"; - char *ptr; - ptr = strtok(buffer, delimiter); - - int counter = 0; - char username[8] = ""; - char p[20] = ""; - char path[100] = ""; - - while(ptr != NULL) { - - //username speichern - if(counter == 1) { - strcat(username, ptr); - } - - //postein - oder ausgang speichern - if(counter == 2) { - strcat(p, ptr); - - if(strcmp(p, "postausgang") == 0) { - strcpy(path, "./data/postausgang/"); - } - - if(strcmp(p, "posteingang") == 0) { - strcpy(path, "./data/posteingang/"); - } - - strcat(path, username); - strcat(path, "/"); - - DIR *d; - struct dirent *dir; - char filenames[1000] = ""; - - //Messages zählen - int fc = countFiles(path); - char str[1000]; - //int in string konverten - sprintf(str, "%d", fc); - - strcat(filenames, str); - strcat(filenames, ";"); - - //file lesen - d = opendir(path); - - if (d) - { - - while ((dir = readdir(d)) != NULL) - { - strcat(filenames, dir->d_name); - strcat(filenames, ";"); + if (stat(dir, &st) == -1) { + mkdir(dir, 0700); } - closedir(d); + strcat(sender, ptr); + printf("1 %s \n", ptr); + } + + //empfänger auslesen, ordner für empfänger erstellen, wenn nicht vorhanden + if (counter == 2) { + struct stat st2 = {0}; + char dir2[] = "./data/posteingang/"; + strcat(dir2, ptr); - //an client senden - send(new_socket , filenames , strlen(filenames) , 0 ); - strcpy(buffer, ""); + if (stat(dir2, &st2) == -1) { + mkdir(dir2, 0700); + } + + strcat(empfaenger, ptr); + printf("2 %s \n" , ptr); + } + + //betreff auslesen, id (ts) fertigstellen, + //2 dateien erstellen für sender und empfänger mit ts als filename + if (counter == 3) { + //printf("3 %s \n", ptr); + + strcat(betreff, ptr); + strcat(ts, betreff); + + //Pfad erstellen für den sender und file erstellen + char fb[100] = "touch ./data/postausgang/"; + strcat(fb, "/"); + strcat(fb, sender); + strcat(fb, "/"); + strcat(fb, ts); + printf("PATH: %s \n", fb); + system(fb); + + //Pfad erstellen für den empfänger und file erstellen + strcpy(fb, "touch ./data/posteingang/"); + strcat(fb, "/"); + strcat(fb, empfaenger); + strcat(fb, "/"); + strcat(fb, ts); + printf("PATH: %s \n", fb); + system(fb); } + //buffer in files schreiben + if (counter == 4) { + //printf("4 %s \n", ptr); + + //file content für den empfänger erstellen + char fp[100] = "./data/posteingang/"; + char content1[1000] = ""; + strcpy(content1, "ID: "); + strcat(content1, ts); + strcat(content1, "\n"); + strcat(content1, "Received from: "); + strcat(content1, sender); + strcat(content1, "\n"); + strcat(content1, "Betreff: "); + strcat(content1, betreff); + strcat(content1, "\n"); + strcat(content1, "Message: "); + strcat(content1, ptr); + + strcat(fp, empfaenger); + strcat(fp, "/"); + strcat(fp, ts); + //content in das file storen + mstore_data(fp, content1); + + //file content für den sender erstellen + char content2[1000] = ""; + strcpy(content2, "ID: "); + strcat(content2, ts); + strcat(content2, "\n"); + strcat(content2, "Sent to: "); + strcat(content2, empfaenger); + strcat(content2, "\n"); + strcat(content2, "Betreff: "); + strcat(content2, betreff); + strcat(content2, "\n"); + strcat(content2, "Message: "); + strcat(content2, ptr); + + strcpy(fp, "./data/postausgang/"); + strcat(fp, sender); + strcat(fp, "/"); + strcat(fp, ts); + //content2 in das file storen + mstore_data(fp, content2); + + } + counter = counter + 1; + // naechsten Abschnitt erstellen + ptr = strtok(NULL, delimiter); + + } + + //printf ("\n Message received: \n %s", buffer); + //OK an den client zurücksenden + char suc[] = "OK"; + send(new_socket , suc , strlen(suc) , 0 ); + + } + + else if(startsWith("del", buffer) == true) { + printf("delete: %s ", buffer); + + char delimiter[] = ";"; + char *ptr; + ptr = strtok(buffer, delimiter); + + int counter = 0; + + char username[8] = ""; + char nid[80] = ""; + char p[20] = ""; + char path[100] = ""; + + while(ptr != NULL) { + + //username speichern + if(counter == 1) { + strcat(username, ptr); + } + + //post ein- oder ausgang speichern + if(counter == 2) { + strcpy(p, ptr); + } + + //nid speichern, den path string erstellen, rm -rf path ausführen + if(counter == 3) { + strcat(nid, ptr); + if(strcmp(p, "postausgang") == 0) { + strcpy(path, "rm -rf ./data/postausgang/"); + } + + if(strcmp(p, "posteingang") == 0) { + strcpy(path, "rm -rf ./data/posteingang/"); + } + + strcat(path, username); + strcat(path, "/"); + strcat(path, nid); + + system(path); + } + counter = counter + 1; + + // naechsten Abschnitt erstellen + ptr = strtok(NULL, delimiter); + } + + //OK an client zurücksenden + char resBuff[BUF] = "OK\n"; + send(new_socket, resBuff, strlen(resBuff),0); + strcpy(buffer, ""); + + } + + //read + else if(startsWith("read", buffer) == true) { + + char delimiter[] = ";"; + char *ptr; + ptr = strtok(buffer, delimiter); + + int counter = 0; + char username[8] = ""; + char nid[80] = ""; + char betreff[80] = ""; + char folder[20] = ""; + + while(ptr != NULL) { + + if(counter == 1) { + //username speichern + strcat(username, ptr); + } + + //postein- oder ausgang speichern + if(counter == 2) { + strcpy(folder, ptr); + } + + //nid speichern, file mit dem path lesen und an client zzrücksenden + if(counter == 3) { + //nid + strcat(nid, ptr); + strcpy(betreff, nid); + + + char filename[] = "./data/"; + strcat(filename, folder); + strcat(filename, "/"); + + strcat(filename, username); + strcat(filename, "/"); + strcat(filename, nid); + printf("PATH: %s", filename); + + FILE *ptr_file; + char buf[1000]; + char res[1000]; + + ptr_file = fopen(filename,"r"); + if (!ptr_file) + perror("File Open error!"); + + while (fgets(buf,1000, ptr_file)!=NULL) { + strcat(res, buf); + } + + + fclose(ptr_file); + + + // and send that buffer to client + + printf("%s", res); + send(new_socket , res, strlen(res), 0 ); + + } + + counter = counter + 1; + + // naechsten Abschnitt erstellen + ptr = strtok(NULL, delimiter); + } + } + + //list + else if(startsWith("list", buffer) == true) { + + char delimiter[] = ";"; + char *ptr; + ptr = strtok(buffer, delimiter); + + int counter = 0; + char username[8] = ""; + char p[20] = ""; + char path[100] = ""; + + while(ptr != NULL) { + + //username speichern + if(counter == 1) { + strcat(username, ptr); + } + + //postein - oder ausgang speichern + if(counter == 2) { + strcat(p, ptr); + + if(strcmp(p, "postausgang") == 0) { + strcpy(path, "./data/postausgang/"); + } + + if(strcmp(p, "posteingang") == 0) { + strcpy(path, "./data/posteingang/"); + } + + strcat(path, username); + strcat(path, "/"); + + DIR *d; + struct dirent *dir; + char filenames[1000] = ""; + + //Messages zählen + int fc = countFiles(path); + char str[1000]; + //int in string konverten + sprintf(str, "%d", fc); + + strcat(filenames, str); + strcat(filenames, ";"); + + //file lesen + d = opendir(path); + + if (d) + { + + while ((dir = readdir(d)) != NULL) + { + strcat(filenames, dir->d_name); + strcat(filenames, ";"); + } + + closedir(d); + + //an client senden + send(new_socket , filenames , strlen(filenames) , 0 ); + strcpy(buffer, ""); + + } + + } + + + counter = counter + 1; + + // naechsten Abschnitt erstellen + ptr = strtok(NULL, delimiter); } - counter = counter + 1; + }else { + printf("error"); + char err[] = "ERR"; + send(new_socket , err , strlen(err) , 0 ); - // naechsten Abschnitt erstellen - ptr = strtok(NULL, delimiter); } - - - }else { - printf("error"); - char err[] = "ERR"; - send(new_socket , err , strlen(err) , 0 ); - } //printf ("\n content: \n %s", buffer); @@ -445,8 +721,6 @@ void *threadFun(void *arg){ int main (int argc, char **argv) { int create_socket, new_socket; socklen_t addrlen; - char buffer[BUF]; - int size; struct sockaddr_in address, cliaddress; if( argc < 3 ){ @@ -473,7 +747,6 @@ int main (int argc, char **argv) { mkdir(argv[2], 0711); pthread_t tid; - int i = 0; while (1) { printf("Waiting for connections...\n"); new_socket = accept ( create_socket, (struct sockaddr *) &cliaddress, &addrlen );