Compare commits

..

No commits in common. "master" and "1.0.0" have entirely different histories.

6 changed files with 647 additions and 1242 deletions

1
.gitignore vendored
View File

@ -1 +0,0 @@
.vscode/

409
client.c
View File

@ -8,7 +8,6 @@
#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) {
@ -31,218 +30,226 @@ 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;
if( argc < 3 ){ int create_socket;
printf("Usage: %s ServerAdresse Port\n", argv[0]); char buffer[BUF];
exit(EXIT_FAILURE); struct sockaddr_in address;
} int size;
if ((create_socket = socket (AF_INET, SOCK_STREAM, 0)) == -1)
{ if( argc < 3 ){
perror("Socket error"); printf("Usage: %s ServerAdresse Port\n", argv[0]);
return EXIT_FAILURE; exit(EXIT_FAILURE);
} }
memset(&address,0,sizeof(address));
address.sin_family = AF_INET; if ((create_socket = socket (AF_INET, SOCK_STREAM, 0)) == -1)
address.sin_port = htons (atoi(argv[2])); {
inet_aton (argv[1], &address.sin_addr); perror("Socket error");
if (connect ( create_socket, (struct sockaddr *) &address, sizeof (address)) == 0) return EXIT_FAILURE;
{ }
printf ("\x1b[32mConnection with server (%s) established\n\x1b[0m", inet_ntoa (address.sin_addr));
size=recv(create_socket,buffer,BUF-1, 0); memset(&address,0,sizeof(address));
if (size>0) address.sin_family = AF_INET;
{ address.sin_port = htons (atoi(argv[2]));
buffer[size]= '\0'; inet_aton (argv[1], &address.sin_addr);
printf("\x1b[36m%s\x1b[0m",buffer);
if (connect ( create_socket, (struct sockaddr *) &address, sizeof (address)) == 0)
{
printf ("Connection with server (%s) established\n", inet_ntoa (address.sin_addr));
size=recv(create_socket,buffer,BUF-1, 0);
if (size>0)
{
buffer[size]= '\0';
printf("%s",buffer);
}
}
else
{
perror("Connect error - no server available");
return EXIT_FAILURE;
}
do {
//command vom user überprüfen
char command[6] = "";
printf ("\nEnter Command: \n");
fgets (command, 6, stdin);
//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("<Sender max. 8 Zeichen>\n");
fgets (sender, 8, stdin);
printf("<Empfänger max. 8 Zeichen>\n");
fgets (empfaenger, 8, stdin);
printf("<Betreff max. 80 Zeichen>\n");
fgets (betreff, 80, stdin);
printf("<Nachricht, beliebige Anzahl an Zeilen>\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] = "";
int valread = read(create_socket , readBuffer, 1024);
printf("\n%s\n", readBuffer);
} }
}
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);
if (startsWith("login", command) == true && login == false) else if(startsWith("list", command) == true) {
{ char bufferString[BUF] = "list";
char username[10] = ""; char username[8] = "";
char pw[50] = ""; char p[20] = "";
char bufferString[BUF] = ""; int counter = 0;
strcpy(bufferString, "login;");
//User Dateneingabe und daten einlesen printf("<Username max. 8 Zeichen>\n");
printf("\x1b[35m<Username max. 8 Zeichen>\x1b[0m\n"); fgets (username, 8, stdin);
fgets (username, 10, stdin); printf("<Posteingang oder Postausgang>\n");
printf("\x1b[35m<Passwort max. 50 Zeichen>\x1b[0m\n"); fgets (p, 20, stdin);
//PW eingabe unsichtbar machen
struct termios term, term_orig; strcat(bufferString, ";");
tcgetattr(STDIN_FILENO, &term); strcat(bufferString, username);
term_orig = term; strcat(bufferString, ";");
term.c_lflag &= ~ECHO; strcat(bufferString, p);
tcsetattr(STDIN_FILENO, TCSANOW, &term); remN(bufferString);
scanf("%s", pw); printf("%s ", bufferString);
// Eingabe wieder sichtbar schalten send(create_socket, bufferString, strlen (bufferString), 0);
tcsetattr(STDIN_FILENO, TCSANOW, &term_orig);
char readBuffer[BUF] = "";
int valread = 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 (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[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);
strcat(bufferString, ";"); else if(strcmp(ptr, "..") == 0) {
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"); else if (counter == 0) {
fgets (username, 10, stdin); printf("<Anzahl der Nachrichten für den User: %s>\n", ptr);
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, ";"); else {
strcat(bufferString, username); printf("Betreff: %s \n", ptr);
strcat(bufferString, ";"); //printf("%.*s", 17, ptr + 5);
strcat(bufferString, folder); }
strcat(bufferString, ";");
strcat(bufferString, nid);
remN(bufferString);
send(create_socket, bufferString, strlen (bufferString), 0); counter = counter + 1;
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"); // naechsten Abschnitt erstellen
fgets (username, 10, stdin); ptr = strtok(NULL, delimiter);
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); else if(startsWith("read", command) == true) {
return EXIT_SUCCESS; char bufferString[BUF] = "read";
char username[8] = "";
char nid[80] = "";
char folder[20] = "";
printf("<Username max. 8 Zeichen>\n");
fgets (username, 8, stdin);
printf("<posteingang oder postausgang>\n");
fgets (folder, 20, stdin);
printf("<Nachrichten-Nummer>\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] = "";
int valread = 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("<Username max. 8 Zeichen>\n");
fgets (username, 8, stdin);
printf("<Posteingang oder Postausgang>\n");
fgets (p, 20, stdin);
printf("<Nachrichten-Nummer>\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] = "";
int valread = 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;
} }

View File

@ -1,26 +1,25 @@
#Client und Server kompilieren #Client und Server kompilieren
all: server.c client.c all: myserver.c myclient.c
gcc -Wall -o server server.c -lldap -llber -lpthread gcc myserver.c -o myserver
gcc -Wall -o client client.c -lldap -llber -lpthread gcc myclient.c -o myclient
#Kompilierten Client und Server löschen #Kompilierten Client und Server löschen
clean: client server clean: myclient myserver
rm -f client server rm -f myclient myserver
#Nur den Client kompilieren: #Nur den Client kompilieren:
client: client.c client: myclient.c
gcc -Wall -o client client.c -lldap -llber -lpthread gcc myclient.c -o myclient
#Nur den Server kompilieren: #Nur den Server kompilieren:
server: server.c server: myserver.c
gcc -Wall -o server server.c -lldap -llber -lpthread gcc myserver.c -o myserver
#Kompilierten Server löschen #Kompilierten Server löschen
cleanS: server cleanS: myserver
rm -f server rm -f myserver
#Kompilierten Client löschen #Kompilierten Client löschen
cleanC: client cleanC: myclient
rm -f client rm -f myclient

View File

@ -1,47 +0,0 @@
# Protokoll 🔧
```
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
LIST: list;username;postEinAusgang
READ: read;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
* Lukas Nowy
* Georg Reisinger

4
readme.txt Normal file
View File

@ -0,0 +1,4 @@
SEND: send;sender;empänger;betreff;nachricht
LIST: list:username;postEinAusgang
READ: read;username;postEinAusgang;nid
DEL: del;username;postEinAusgang;nid

1397
server.c

File diff suppressed because it is too large Load Diff