diff --git a/client_NT117.c b/client_NT117.c index 578d6d1..74a4451 100644 --- a/client_NT117.c +++ b/client_NT117.c @@ -11,7 +11,7 @@ #define LENGTH 2048 -// Global variables +// Global variables. volatile sig_atomic_t flag = 0; int sockfd = 0; char name[32]; @@ -40,6 +40,29 @@ void catch_ctrl_c_and_exit(int sig) flag = 1; } +// Simple crypt function XOR. +void fc_xor(char* s, char* k, char* res) +{ + unsigned int len1 = strlen(s); + unsigned int len2 = strlen(k); + unsigned int i = 0; + unsigned int j = 0; + + while (i <= len1) + { + if(j == len2) + { + j = 0; + } + + res[i] = s[i] ^ k[j]; + + j++; + i++; + } +} + +// Simple Send messages. void send_msg_handler() { char message[LENGTH] = {}; @@ -51,10 +74,15 @@ void send_msg_handler() fgets(message, LENGTH, stdin); str_trim_lf(message, LENGTH); - if (strcmp(message, "exit") == 0) + if (strcmp(message, "CMD:exit") == 0) { break; } + else if (strcmp(message, "CMD:clear") == 0) + { + system("clear"); + printf("[+] - Cleaned... \n"); + } else { sprintf(buffer, "%s: %s\n", name, message); @@ -68,6 +96,54 @@ void send_msg_handler() catch_ctrl_c_and_exit(2); } +// Crypt Send messages. +void send_msg_crpt_handler(char* pswd) +{ + char message[LENGTH] = {}; + char buffer[LENGTH + 32] = {}; + char crypt[LENGTH] = {}; + + while(1) + { + str_overwrite_stdout(); + + fgets(message, LENGTH, stdin); + str_trim_lf(message, LENGTH); + + if(strcmp(message, "SRV:con") == 0) + { + sprintf(buffer, "%s \n", message); + send(sockfd, buffer, strlen(buffer), 0); + } + else if (strcmp(message, "CMD:exit") == 0) + { + break; + } + else if (strcmp(message, "CMD:pswd") == 0) + { + printf("[*] - Key: %s \n", pswd); + } + else if (strcmp(message, "CMD:clear") == 0) + { + system("clear"); + printf("[+] - Cleaned... \n"); + } + else + { + sprintf(buffer, "%s: %s \n", name, message); + fc_xor(buffer, pswd, crypt); + send(sockfd, crypt, strlen(crypt), 0); + } + + bzero(crypt, LENGTH); + bzero(message, LENGTH); + bzero(buffer, LENGTH + 32); + } + + catch_ctrl_c_and_exit(2); +} + +// Simple Recive messages. void recv_msg_handler() { char message[LENGTH] = {}; @@ -78,117 +154,179 @@ void recv_msg_handler() if(receive > 0) { - printf("%s", message); - str_overwrite_stdout(); - } + printf("%s \n", message); + str_overwrite_stdout(); + } else if(receive == 0) { break; } else { - // -1 - } - memset(message, 0, sizeof(message)); + // todo: error - recive! + } + memset(message, 0, sizeof(message)); + } +} + +// Crypt Recive messages. +void recv_msg_crpt_handler(char* pswd) +{ + char message[LENGTH] = {}; + char decrypt[LENGTH] = {}; + + while(1) + { + int receive = recv(sockfd, message, LENGTH, 0); + + if(receive > 0) + { + + if(strncmp(message, "SRV_BOT", 7) == 0) + { + printf("%s", message); + str_overwrite_stdout(); + } + else + { + fc_xor(message, pswd, decryt); + printf("%s", decrypt); + str_overwrite_stdout(); + } + + } + else if(receive == 0) + { + break; + } + else + { + // todo: + } + memset(message, 0, sizeof(message)); + memset(decrypt, 0, sizeof(decrypt)); } } int main(int argc, char **argv) { - // Standard parameters - char *ip = "127.0.0.1"; - int port = 10117; - char *pswd = "117"; + // Standard parameters. + char *ip = "127.0.0.1"; + int port = 10117; + char *pswd = "117"; - if(argc == 4) - { - printf("[+] - Set User setting.\n"); - ip = argv[1]; - port = atoi(argv[2]); - pswd = argv[3]; - } - else if(argc == 3) - { - printf("[+] - Set User setting.\n"); - ip = argv[1]; - port = atoi(argv[2]); - } - else if(argc == 2) - { - printf("[+] - Set User setting.\n"); - ip = argv[1]; - } - else if(argc > 4) - { - printf("[!] - Error ENTER KEY!\n"); - return EXIT_FAILURE; - } - else - { - printf("[+] - Set default setting.\n"); - } + if(argc == 4) + { + printf("[+] - Set User setting.\n"); + ip = argv[1]; + port = atoi(argv[2]); + pswd = argv[3]; + } + else if(argc == 3) + { + printf("[+] - Set User setting.\n"); + ip = argv[1]; + port = atoi(argv[2]); + } + else if(argc == 2) + { + printf("[+] - Set User setting.\n"); + ip = argv[1]; + } + else if(argc > 4) + { + printf("[!] - Error ENTER KEY!\n"); + return EXIT_FAILURE; + } + else + { + printf("[+] - Set default setting.\n"); + } printf("Server IP address: %s \n", ip); - printf("Server Port: %d \n", port); - printf("Server Password: %s \n", pswd); + printf("Server Port: %d \n", port); + printf("Server Password: %s \n", pswd); - signal(SIGINT, catch_ctrl_c_and_exit); + signal(SIGINT, catch_ctrl_c_and_exit); - printf("[?] - Please enter your name: "); - fgets(name, 32, stdin); - str_trim_lf(name, strlen(name)); + printf("[?] - Please enter your name: "); + fgets(name, 32, stdin); + str_trim_lf(name, strlen(name)); - if(strlen(name) > 32 || strlen(name) < 2) + if(strlen(name) > 32 || strlen(name) < 2) { - printf("[!] - Name must be less than 30 and more than 2 characters!\n"); - return EXIT_FAILURE; - } + printf("[!] - Name must be less than 30 and more than 2 characters!\n"); + return EXIT_FAILURE; + } - struct sockaddr_in server_addr; + struct sockaddr_in server_addr; - /* Socket settings */ - sockfd = socket(AF_INET, SOCK_STREAM, 0); - server_addr.sin_family = AF_INET; - server_addr.sin_addr.s_addr = inet_addr(ip); - server_addr.sin_port = htons(port); + // Socket settings. + sockfd = socket(AF_INET, SOCK_STREAM, 0); + server_addr.sin_family = AF_INET; + server_addr.sin_addr.s_addr = inet_addr(ip); + server_addr.sin_port = htons(port); - - // Connect to Server - int err = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); - if(err == -1) + // Connect to Server. + int err = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); + if(err == -1) { - printf("[!] - ERROR: connect!\n"); - return EXIT_FAILURE; - } + printf("[!] - ERROR: connect!\n"); + return EXIT_FAILURE; + } - // Send name - send(sockfd, name, 32, 0); + // Send name to Server. + send(sockfd, name, 32, 0); - printf("--=== WELCOME TO THE CHAT NT117 (Client)===--\n"); + printf("--=== WELCOME TO THE CHAT NT117 v0 (Client v0.1.6) ===--\n"); - pthread_t send_msg_thread; - if(pthread_create(&send_msg_thread, NULL, (void *) send_msg_handler, NULL) != 0) + // Creat threads Send||Recive with||not crypt masseges. + if(argc == 4) { - printf("[!] - ERROR: pthread!\n"); - return EXIT_FAILURE; - } - - pthread_t recv_msg_thread; - if(pthread_create(&recv_msg_thread, NULL, (void *) recv_msg_handler, NULL) != 0) - { - printf("[!] - ERROR: pthread!\n"); - return EXIT_FAILURE; - } - - while(1) - { - if(flag) + // Crypt thread Send. + pthread_t send_msg_thread; + if(pthread_create(&send_msg_thread, NULL, (void *) send_msg_crpt_handler, pswd) != 0) { - printf("[*] - Exit...\n"); - break; + printf("[!] - ERROR: pthread!\n"); + return EXIT_FAILURE; } - } - close(sockfd); - return EXIT_SUCCESS; + // Crypt thread Recive. + pthread_t recv_msg_thread; + if(pthread_create(&recv_msg_thread, NULL, (void *) recv_msg_crpt_handler, pswd) != 0) + { + printf("[!] - ERROR: pthread!\n"); + return EXIT_FAILURE; + } + } + else + { + // Simple thread Send. + pthread_t send_msg_thread; + if(pthread_create(&send_msg_thread, NULL, (void *) send_msg_handler, NULL) != 0) + { + printf("[!] - ERROR: pthread!\n"); + return EXIT_FAILURE; + } + + // Simple thread Recive. + pthread_t recv_msg_thread; + if(pthread_create(&recv_msg_thread, NULL, (void *) recv_msg_handler, NULL) != 0) + { + printf("[!] - ERROR: pthread!\n"); + return EXIT_FAILURE; + } + } + + while(1) + { + if(flag) + { + printf("[*] - Exit...\n"); + break; + } + } + + close(sockfd); + return EXIT_SUCCESS; } diff --git a/server_NT117.c b/server_NT117.c index 971090e..dbf0671 100644 --- a/server_NT117.c +++ b/server_NT117.c @@ -17,7 +17,7 @@ static _Atomic unsigned int cli_count = 0; static int uid = 10; -// Client structure +// Client structure. typedef struct { struct sockaddr_in address; @@ -32,7 +32,7 @@ pthread_mutex_t clients_mutex = PTHREAD_MUTEX_INITIALIZER; void str_overwrite_stdout() { - printf("\r%s", "> "); + printf("\r%s", "[>] - "); fflush(stdout); } @@ -58,7 +58,7 @@ void print_client_addr(struct sockaddr_in addr) (addr.sin_addr.s_addr & 0xff000000) >> 24); } -// Add clients to queue +// Add clients to queue. void queue_add(client_t *cl) { pthread_mutex_lock(&clients_mutex); @@ -75,7 +75,7 @@ void queue_add(client_t *cl) pthread_mutex_unlock(&clients_mutex); } -// Remove clients to queue +// Remove clients to queue. void queue_remove(int uid) { pthread_mutex_lock(&clients_mutex); @@ -95,7 +95,7 @@ void queue_remove(int uid) pthread_mutex_unlock(&clients_mutex); } -// Send message to all clients except sender +// Send message to all clients except sender. void send_message(char *s, int uid) { pthread_mutex_lock(&clients_mutex); @@ -118,7 +118,30 @@ void send_message(char *s, int uid) pthread_mutex_unlock(&clients_mutex); } -// Handle all communication with the client +// Send message to client info sender. +void send_message_u(char *s, int uid) +{ + pthread_mutex_lock(&clients_mutex); + + for(int i=0; iuid == uid) + { + if(write(clients[i]->sockfd, s, strlen(s)) < 0) + { + perror("[!] - ERROR: write to descriptor failed"); + break; + } + } + } + } + + pthread_mutex_unlock(&clients_mutex); +} + +// Handle all communication with the client. void *handle_client(void *arg) { char buff_out[BUFFER_SZ]; @@ -128,7 +151,7 @@ void *handle_client(void *arg) cli_count++; client_t *cli = (client_t *)arg; - // Name + // Name. if(recv(cli->sockfd, name, 32, 0) <= 0 || strlen(name) < 2 || strlen(name) >= 32-1) { printf("[!] - Didn't enter the name.\n"); @@ -139,7 +162,6 @@ void *handle_client(void *arg) strcpy(cli->name, name); sprintf(buff_out, "%s has joined\n", cli->name); printf("%s", buff_out); - send_message(buff_out, cli->uid); } bzero(buff_out, BUFFER_SZ); @@ -154,19 +176,30 @@ void *handle_client(void *arg) int receive = recv(cli->sockfd, buff_out, BUFFER_SZ, 0); if (receive > 0) { - if(strlen(buff_out) > 0) + + //printf("[*] - str: %s", buff_out); + + if(strncmp(buff_out, "SRV:con", 7) == 0 && strlen(buff_out) > 0) + { + sprintf(buff_out, "SRV_BOT: ID - %u | Username: %s \n", cli->uid ,cli->name); + send_message_u(buff_out, cli->uid); + } //if( && v == '0') + else if(strlen(buff_out) > 0) { send_message(buff_out, cli->uid); - str_trim_lf(buff_out, strlen(buff_out)); printf("%s -> %s\n", buff_out, cli->name); } + else + { + //todo: + } } - else if (receive == 0 || strcmp(buff_out, "exit") == 0) + else if (receive == 0 || strcmp(buff_out, "CMD:exit") == 0) { + // Output: left user. sprintf(buff_out, "%s has left\n", cli->name); printf("%s", buff_out); - send_message(buff_out, cli->uid); leave_flag = 1; } else @@ -178,7 +211,7 @@ void *handle_client(void *arg) bzero(buff_out, BUFFER_SZ); } - // Delete client from queue and yield thread + // Delete client from queue and yield thread. close(cli->sockfd); queue_remove(cli->uid); free(cli); @@ -190,7 +223,7 @@ void *handle_client(void *arg) int main(int argc, char **argv) { - // Standard parameters + // Standard parameters. char *ip = "127.0.0.1"; int port = 10117; char *pswd = "117"; @@ -233,13 +266,13 @@ int main(int argc, char **argv) struct sockaddr_in cli_addr; pthread_t tid; - // Socket settings + // Socket settings. listenfd = socket(AF_INET, SOCK_STREAM, 0); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(ip); serv_addr.sin_port = htons(port); - // Ignore pipe signals + // Ignore pipe signals. signal(SIGPIPE, SIG_IGN); if(setsockopt(listenfd, SOL_SOCKET,(SO_REUSEPORT | SO_REUSEADDR),(char*)&option,sizeof(option)) < 0) @@ -248,28 +281,28 @@ int main(int argc, char **argv) return EXIT_FAILURE; } - // Bind + // Bind. if(bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) { perror("[!] - ERROR: Socket binding failed!"); return EXIT_FAILURE; } - // Listen + // Listen. if (listen(listenfd, 10) < 0) { perror("[!] - ERROR: Socket listening failed!"); return EXIT_FAILURE; } - printf("--=== WELCOME TO THE CHAT NT117 (Server) ===--\n"); + printf("--=== WELCOME TO THE CHAT NT117 v0 (Server v0.1.4) ===--\n"); while(1) { socklen_t clilen = sizeof(cli_addr); connfd = accept(listenfd, (struct sockaddr*)&cli_addr, &clilen); - // Check if max clients is reached + // Check if max clients is reached. if((cli_count + 1) == MAX_CLIENTS) { printf("[?] - Max clients reached. Rejected: "); @@ -279,17 +312,17 @@ int main(int argc, char **argv) continue; } - // Client settings + // Client settings. client_t *cli = (client_t *)malloc(sizeof(client_t)); cli->address = cli_addr; cli->sockfd = connfd; cli->uid = uid++; - // Add client to the queue and fork thread + // Add client to the queue and fork thread. queue_add(cli); pthread_create(&tid, NULL, &handle_client, (void*)cli); - // Reduce CPU usage + // Reduce CPU usage. sleep(1); }