From 0eedbf68c00f142e8db1d438bf506a6af37d3010 Mon Sep 17 00:00:00 2001 From: solusipse Date: Sat, 14 Sep 2013 00:17:26 +0200 Subject: [PATCH] added whitelist --- fiche.c | 35 ++++++++++++++++++++++++++++------- fiche.h | 4 +++- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/fiche.c b/fiche.c index e664c7f..b1318f7 100755 --- a/fiche.c +++ b/fiche.c @@ -60,7 +60,18 @@ void *thread_connection(void *args) bzero(buffer, BUFSIZE); int status = recv(connection_socket, buffer, BUFSIZE, MSG_WAITALL); - if (BANLIST != NULL) + if (WHITELIST != NULL) + if (check_whitelist(data.ip_address) == NULL) + { + printf("Rejected connection from unknown user.\n"); + display_line(); + save_log(NULL, data.ip_address, data.hostname); + write(connection_socket, "You are not whitelisted!\n", 17); + close(connection_socket); + pthread_exit(NULL); + } + + if ((BANLIST != NULL)) if (check_banlist(data.ip_address) != NULL) { printf("Rejected connection from banned user.\n"); @@ -177,11 +188,17 @@ void save_log(char *slug, char *hostaddrp, char *h_name) char *check_banlist(char *ip_address) { - load_banlist(BANFILE); + load_list(BANFILE, 0); return strstr(BANLIST, ip_address); } -void load_banlist(char *file_path) +char *check_whitelist(char *ip_address) +{ + load_list(WHITEFILE, 1); + return strstr(WHITELIST, ip_address); +} + +void load_list(char *file_path, int type) { FILE *fp = fopen(file_path, "r"); fseek(fp, 0, SEEK_END); @@ -189,12 +206,15 @@ void load_banlist(char *file_path) fseek(fp, 0, SEEK_SET); char *buffer = malloc(fsize + 1); - fread(buffer, fsize, 1, fp); fclose(fp); buffer[fsize] = 0; - BANLIST = buffer; + + if (type == 0) + BANLIST = buffer; + else + WHITELIST = buffer; free(buffer); } @@ -330,7 +350,7 @@ void parse_parameters(int argc, char **argv) break; case 'b': BANFILE = optarg; - load_banlist(BANFILE); + load_list(BANFILE, 0); break; case 's': SLUG_SIZE = atoi(optarg); @@ -349,7 +369,8 @@ void parse_parameters(int argc, char **argv) set_uid_gid(optarg); break; case 'w': - WHITELIST = optarg; + WHITEFILE = optarg; + load_list(WHITEFILE, 1); break; default: printf("usage: fiche [-bdpqs].\n"); diff --git a/fiche.h b/fiche.h index 92e59ca..23146f7 100644 --- a/fiche.h +++ b/fiche.h @@ -47,6 +47,7 @@ char *LOG; char *BASEDIR; char *BANLIST; char *BANFILE; +char *WHITEFILE; char *WHITELIST; int PORT = 9999; int SLUG_SIZE = 4; @@ -69,7 +70,7 @@ void generate_url(char *buffer, char *slug); void save_to_file(char *buffer, char *slug); void startup_message(); void set_basedir(); -void load_banlist(); +void load_list(char *file_path, int type); void parse_parameters(int argc, char **argv); void save_log(char *slug, char *hostaddrp, char *h_name); void change_owner(char *directory); @@ -77,6 +78,7 @@ void set_uid_gid(); char *return_line(){return("\n====================================");} char *check_banlist(char *ip_address); +char *check_whitelist(char *ip_address); char *get_date(); struct sockaddr_in set_address(struct sockaddr_in serveraddr);