#include #include #include #include #include #include "openssl/blowfish.h" #include "draw_user.h" #include "read_file.h" static irc_session_t *session; irc_callbacks_t callbacks; char sender_name[100]; char own_nickname[100]; char *receiver_server_ip; int username_length; struct sender **s_sender; int s_sender_size; BF_KEY key; void receiver_set_ip(char *_ip) { receiver_server_ip = _ip; } int init_connection_receiver(char* server_ip, char* user) { printf("RECEIVER: initialising connection...\n"); session = irc_create_session(&callbacks); int con = irc_connect(session, server_ip, 6666, NULL, user, "receiver", "receiver"); if (con != 0) { printf("RECEIVER: connection error-code: %i \n", con); return 1; } if (irc_is_connected(session) == 1) { printf("RECEIVER: connected...\n"); return 0; } } void disconnect_receiver() { irc_disconnect(session); irc_destroy_session(session); printf("RECEIVER: disconnected...\n"); } int get_sender_array_pos(char* nick) { for (int i = 0; i < s_sender_size; i++) { if (s_sender[i]->is_init == 1 && strcmp(s_sender[i]->nick, nick) == 0) { return i; } if (s_sender[i]->is_init == 0 && strcmp(s_sender[i]->nick, nick) != 0) { s_sender[i]->is_init = 1; s_sender[i]->nick = nick; return i; } } } void dump_data(char* lat, char* lon, char* nick) { struct position *pos = (struct position*) malloc(sizeof(struct position)); pos->lat = lat; pos->lon = lon; pos->nick = nick; draw_user(pos); } void get_position(irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count) { char *decrypted; char *sender_org = (char*) malloc(username_length + 1); irc_target_get_nick(origin, sender_name, sizeof(sender_name)); strncpy(sender_org, sender_name, username_length); sender_org[username_length] = '\0'; if (strcmp(sender_org, own_nickname) != 0 && strcmp(sender_name, "_s") > 0 && strcmp(params[1], "connected") != 0 && strcmp(params[1], "ack") != 0) { int pos = get_sender_array_pos(sender_org); if (s_sender[pos]->lat_set == 0) { decrypted = (char*) malloc(sizeof(char) * 8); BF_ecb_encrypt(params[1], decrypted, &key, BF_DECRYPT); s_sender[pos]->lat = decrypted; // printf("s_sender[%i]->lat: %s \n", pos, s_sender[pos]->lat); s_sender[pos]->lat_set = 1; } else if (s_sender[pos]->lon_set == 0) { decrypted = (char*) malloc(sizeof(char) * 8); BF_ecb_encrypt(params[1], decrypted, &key, BF_DECRYPT); s_sender[pos]->lon = decrypted; // printf("s_sender[%i]->lon: %s \n", pos, s_sender[pos]->lon); s_sender[pos]->lon_set = 1; } if(s_sender[pos]->lon_set == 1 && s_sender[pos]->lat_set == 1)// && lon != NULL && lat != NULL) { double _lat, _lon; _lat = atof(s_sender[pos]->lat); _lon = atof(s_sender[pos]->lon); if (_lat > _lon && _lat == _lat && _lon == _lon) { dump_data(s_sender[pos]->lat, s_sender[pos]->lon, s_sender[pos]->nick); } if (_lat < _lon && _lat == _lat && _lon == _lon) { dump_data(s_sender[pos]->lon, s_sender[pos]->lat, s_sender[pos]->nick); } s_sender[pos]->lon_set = 0; s_sender[pos]->lat_set = 0; free(decrypted); free(sender_org); } irc_cmd_msg(session, "#test", "ack"); } } void init_sender_struct(int number) { s_sender = (struct sender(*)[number]) malloc(sizeof(struct sender*) * number); s_sender_size = number; for (int i = 0; i < number; i++) { s_sender[i] = (struct sender*) malloc(sizeof(struct sender)); s_sender[i]->nick = (char*) malloc(sizeof(char) * 20); s_sender[i]->lat = (char*) malloc(sizeof(char) * 8); s_sender[i]->lon = (char*) malloc(sizeof(char) * 8); s_sender[i]->is_init = (int) malloc(sizeof(int)); s_sender[i]->is_init = 0; s_sender[i]->lat_set = (int) malloc(sizeof(int)); s_sender[i]->lat_set = 0; s_sender[i]->lon_set = (int) malloc(sizeof(int)); s_sender[i]->lon_set = 0; } } void on_connect_receiver(irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count) { printf("RECEIVER: on_connect_receiver \n"); struct key_data *keyd = (struct key_data*) malloc(sizeof(struct key_data)); keyd->key = (char*) malloc(sizeof(char) * 300); keyd = read_key(); BF_set_key(&key, keyd->key_length, keyd->key); init_sender_struct(3); irc_cmd_join(session, "#test", NULL); irc_cmd_msg(session, "#test", "connected"); } void receiver_main(void *user) { memset(&callbacks, 0, sizeof(callbacks)); callbacks.event_channel = get_position; callbacks.event_connect = on_connect_receiver; char username[20]; sprintf(username, "%s", (char*) user); sprintf(own_nickname, "%s", username); username_length = strlen(username); if (receiver_server_ip != NULL && user != NULL) { strcat(username, "_r"); if (init_connection_receiver(receiver_server_ip, username) == 0) { printf("RECEIVER: connection succesfull...\n"); irc_run(session); } } else { printf("RECEIVER: error ip not set! Receiver can't be started\n"); } }