iadded ban mechanism - fiche - A pastebin adjusted for gopher use Err vernunftzentrum.de 70 hgit clone git://vernunftzentrum.de/fiche.git URL:git://vernunftzentrum.de/fiche.git vernunftzentrum.de 70 1Log /ckeen/repos/fiche/log.gph vernunftzentrum.de 70 1Files /ckeen/repos/fiche/files.gph vernunftzentrum.de 70 1Refs /ckeen/repos/fiche/refs.gph vernunftzentrum.de 70 1LICENSE /ckeen/repos/fiche/file/LICENSE.gph vernunftzentrum.de 70 i--- Err vernunftzentrum.de 70 1commit 0f7583f3ed375841540d284f83047b727942af97 /ckeen/repos/fiche/commit/0f7583f3ed375841540d284f83047b727942af97.gph vernunftzentrum.de 70 1parent d25e9baf02dc4a59d00e5878e2463f506e992413 /ckeen/repos/fiche/commit/d25e9baf02dc4a59d00e5878e2463f506e992413.gph vernunftzentrum.de 70 hAuthor: solusipse URL:mailto:solus1ps3@gmail.com vernunftzentrum.de 70 iDate: Tue, 10 Sep 2013 10:30:49 +0200 Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 iadded ban mechanism Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 iDiffstat: Err vernunftzentrum.de 70 i fiche.c | 109 ++++++++++++++++++++++--------- Err vernunftzentrum.de 70 i fiche.h | 20 +++++++++++++++++--- Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i2 files changed, 96 insertions(+), 33 deletions(-) Err vernunftzentrum.de 70 i--- Err vernunftzentrum.de 70 1diff --git a/fiche.c b/fiche.c /ckeen/repos/fiche/file/fiche.c.gph vernunftzentrum.de 70 i@@ -11,8 +11,8 @@ Live example: http://code.solusipse.net/ Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i usage: fiche [-bdpqs]. Err vernunftzentrum.de 70 i [-d domain] [-p port] [-s slug_size] Err vernunftzentrum.de 70 i- [-o output directory] [-b buffer_size] Err vernunftzentrum.de 70 i- [-l log file] [-q queue_size] Err vernunftzentrum.de 70 i+ [-o output directory] [-B buffer_size] Err vernunftzentrum.de 70 i+ [-l log file] [-q queue_size] [-b banlist] Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i Compile with Makefile or manually with -O2 and -pthread flags. Err vernunftzentrum.de 70 i To install use `make install` command. Err vernunftzentrum.de 70 i@@ -53,31 +53,41 @@ void *thread_connection(void *args) Err vernunftzentrum.de 70 i int connection_socket = ((struct thread_arguments *) args ) -> connection_socket; Err vernunftzentrum.de 70 i struct sockaddr_in client_address = ((struct thread_arguments *) args ) -> client_address; Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i+ struct client_data data = get_client_address(client_address); Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i int n; Err vernunftzentrum.de 70 i char buffer[BUFSIZE]; Err vernunftzentrum.de 70 i bzero(buffer, BUFSIZE); Err vernunftzentrum.de 70 i int status = recv(connection_socket, buffer, BUFSIZE, 0); Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i+ if (BANLIST != NULL) Err vernunftzentrum.de 70 i+ if (check_banlist(data.ip_address) != NULL) Err vernunftzentrum.de 70 i+ { Err vernunftzentrum.de 70 i+ printf("Rejected connection from banned user.\n"); Err vernunftzentrum.de 70 i+ display_line(); Err vernunftzentrum.de 70 i+ save_log(NULL, data.ip_address, data.hostname); Err vernunftzentrum.de 70 i+ write(connection_socket, "You are banned!\n", 17); Err vernunftzentrum.de 70 i+ close(connection_socket); Err vernunftzentrum.de 70 i+ pthread_exit(NULL); Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i if (status != -1) Err vernunftzentrum.de 70 i { Err vernunftzentrum.de 70 i char slug[SLUG_SIZE]; Err vernunftzentrum.de 70 i generate_url(buffer, slug); Err vernunftzentrum.de 70 i- Err vernunftzentrum.de 70 i- get_client_address(client_address, slug); Err vernunftzentrum.de 70 i- Err vernunftzentrum.de 70 i+ save_log(slug, data.ip_address, data.hostname); Err vernunftzentrum.de 70 i char response[strlen(slug) + strlen(DOMAIN) + 2]; Err vernunftzentrum.de 70 i- strcpy(response, DOMAIN); Err vernunftzentrum.de 70 i- strcat(response, slug); Err vernunftzentrum.de 70 i- strcat(response, "/\n"); Err vernunftzentrum.de 70 i+ snprintf(response, sizeof response, "%s%s\n", DOMAIN, slug); Err vernunftzentrum.de 70 i write(connection_socket, response, strlen(response)); Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i else Err vernunftzentrum.de 70 i { Err vernunftzentrum.de 70 i- get_client_address(client_address, NULL); Err vernunftzentrum.de 70 i printf("Invalid connection.\n"); Err vernunftzentrum.de 70 i+ display_line(); Err vernunftzentrum.de 70 i+ save_log(NULL, data.ip_address, data.hostname); Err vernunftzentrum.de 70 i write(connection_socket, "Use netcat.\n", 13); Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i- Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i close(connection_socket); Err vernunftzentrum.de 70 i pthread_exit(NULL); Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i@@ -108,22 +118,28 @@ void perform_connection(int listen_socket) Err vernunftzentrum.de 70 i error(); Err vernunftzentrum.de 70 i else Err vernunftzentrum.de 70 i pthread_detach(thread_id); Err vernunftzentrum.de 70 i- Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i void display_date() Err vernunftzentrum.de 70 i { Err vernunftzentrum.de 70 i+ printf("%s", get_date()); Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+char *get_date() Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i time_t rawtime; Err vernunftzentrum.de 70 i struct tm *timeinfo; Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i time(&rawtime); Err vernunftzentrum.de 70 i timeinfo = localtime(&rawtime); Err vernunftzentrum.de 70 i- printf("%s", asctime(timeinfo)); Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ return asctime(timeinfo); Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i-void get_client_address(struct sockaddr_in client_address, char *slug) Err vernunftzentrum.de 70 i+struct client_data get_client_address(struct sockaddr_in client_address) Err vernunftzentrum.de 70 i { Err vernunftzentrum.de 70 i struct hostent *hostp; Err vernunftzentrum.de 70 i+ struct client_data data; Err vernunftzentrum.de 70 i char *hostaddrp; Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i hostp = gethostbyaddr((const char *)&client_address.sin_addr.s_addr, sizeof(client_address.sin_addr.s_addr), AF_INET); Err vernunftzentrum.de 70 i@@ -135,24 +151,52 @@ void get_client_address(struct sockaddr_in client_address, char *slug) Err vernunftzentrum.de 70 i display_date(); Err vernunftzentrum.de 70 i printf("Client: %s (%s)\n", hostaddrp, hostp->h_name); Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i- if (LOG != NULL) Err vernunftzentrum.de 70 i- save_log(slug, hostaddrp, hostp->h_name); Err vernunftzentrum.de 70 i+ data.ip_address = hostaddrp; Err vernunftzentrum.de 70 i+ data.hostname = hostp->h_name; Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ return data; Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i void save_log(char *slug, char *hostaddrp, char *h_name) Err vernunftzentrum.de 70 i { Err vernunftzentrum.de 70 i- char contents[256]; Err vernunftzentrum.de 70 i- snprintf(contents, sizeof contents, "%s:%s:%s\n", slug, hostaddrp, h_name); Err vernunftzentrum.de 70 i+ if (LOG != NULL) Err vernunftzentrum.de 70 i+ { Err vernunftzentrum.de 70 i+ char contents[256]; Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i- if (slug != NULL) Err vernunftzentrum.de 70 i- snprintf(contents, sizeof contents, "%s:%s:%s\n", slug, hostaddrp, h_name); Err vernunftzentrum.de 70 i- else Err vernunftzentrum.de 70 i- snprintf(contents, sizeof contents, "%s:%s:%s\n", "error", hostaddrp, h_name); Err vernunftzentrum.de 70 i+ if (slug != NULL) Err vernunftzentrum.de 70 i+ snprintf(contents, sizeof contents, "\n%s%s|%s|%s%s", get_date(), slug, hostaddrp, h_name, return_line()); Err vernunftzentrum.de 70 i+ else Err vernunftzentrum.de 70 i+ snprintf(contents, sizeof contents, "\n%s%s|%s|%s%s", get_date(), "rejected", hostaddrp, h_name, return_line()); Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i- FILE *fp; Err vernunftzentrum.de 70 i- fp = fopen(LOG, "a"); Err vernunftzentrum.de 70 i- fprintf(fp, "%s", contents); Err vernunftzentrum.de 70 i+ FILE *fp; Err vernunftzentrum.de 70 i+ fp = fopen(LOG, "a"); Err vernunftzentrum.de 70 i+ fprintf(fp, "%s", contents); Err vernunftzentrum.de 70 i+ fclose(fp); Err vernunftzentrum.de 70 i+ } Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+char *check_banlist(char *ip_address) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ load_banlist(BANFILE); Err vernunftzentrum.de 70 i+ return strstr(BANLIST, ip_address); Err vernunftzentrum.de 70 i+} Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+void load_banlist(char *file_path) Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ FILE *fp = fopen(file_path, "r"); Err vernunftzentrum.de 70 i+ fseek(fp, 0, SEEK_END); Err vernunftzentrum.de 70 i+ long fsize = ftell(fp); Err vernunftzentrum.de 70 i+ fseek(fp, 0, SEEK_SET); Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ char *buffer = malloc(fsize + 1); Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ fread(buffer, fsize, 1, fp); Err vernunftzentrum.de 70 i fclose(fp); Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ buffer[fsize] = 0; Err vernunftzentrum.de 70 i+ BANLIST = buffer; Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i+ free(buffer); Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i int create_socket() Err vernunftzentrum.de 70 i@@ -227,9 +271,8 @@ void save_to_file(char *slug, char *buffer) Err vernunftzentrum.de 70 i fprintf(fp, "%s", buffer); Err vernunftzentrum.de 70 i fclose(fp); Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i- display_line(); Err vernunftzentrum.de 70 i- Err vernunftzentrum.de 70 i printf("Saved to: %s\n", directory); Err vernunftzentrum.de 70 i+ display_line(); Err vernunftzentrum.de 70 i free(directory); Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i@@ -241,16 +284,18 @@ void set_basedir() Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i void startup_message() Err vernunftzentrum.de 70 i { Err vernunftzentrum.de 70 i+ display_line(); Err vernunftzentrum.de 70 i printf("Domain name: %s\n", DOMAIN); Err vernunftzentrum.de 70 i printf("Saving files to: %s\n", BASEDIR); Err vernunftzentrum.de 70 i printf("Fiche started listening on port %d.\n", PORT); Err vernunftzentrum.de 70 i+ display_line(); Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i void parse_parameters(int argc, char **argv) Err vernunftzentrum.de 70 i { Err vernunftzentrum.de 70 i int c; Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i- while ((c = getopt (argc, argv, "p:b:q:s:d:o:l:")) != -1) Err vernunftzentrum.de 70 i+ while ((c = getopt (argc, argv, "p:b:q:s:d:o:l:B:")) != -1) Err vernunftzentrum.de 70 i switch (c) Err vernunftzentrum.de 70 i { Err vernunftzentrum.de 70 i case 'd': Err vernunftzentrum.de 70 i@@ -259,10 +304,14 @@ void parse_parameters(int argc, char **argv) Err vernunftzentrum.de 70 i case 'p': Err vernunftzentrum.de 70 i PORT = atoi(optarg); Err vernunftzentrum.de 70 i break; Err vernunftzentrum.de 70 i- case 'b': Err vernunftzentrum.de 70 i+ case 'B': Err vernunftzentrum.de 70 i BUFSIZE = atoi(optarg); Err vernunftzentrum.de 70 i printf("Buffer size set to: %d.\n", BUFSIZE); Err vernunftzentrum.de 70 i break; Err vernunftzentrum.de 70 i+ case 'b': Err vernunftzentrum.de 70 i+ BANFILE = optarg; Err vernunftzentrum.de 70 i+ load_banlist(BANFILE); Err vernunftzentrum.de 70 i+ break; Err vernunftzentrum.de 70 i case 'q': Err vernunftzentrum.de 70 i QUEUE_SIZE = atoi(optarg); Err vernunftzentrum.de 70 i printf("Queue size set to: %d.\n", QUEUE_SIZE); Err vernunftzentrum.de 70 i@@ -283,8 +332,8 @@ void parse_parameters(int argc, char **argv) Err vernunftzentrum.de 70 i default: Err vernunftzentrum.de 70 i printf("usage: fiche [-bdpqs].\n"); Err vernunftzentrum.de 70 i printf(" [-d domain] [-p port] [-s slug_size]\n"); Err vernunftzentrum.de 70 i- printf(" [-o output directory] [-b buffer_size]\n"); Err vernunftzentrum.de 70 i- printf(" [-l log file] [-q queue_size]\n"); Err vernunftzentrum.de 70 i+ printf(" [-o output directory] [-B buffer_size]\n"); Err vernunftzentrum.de 70 i+ printf(" [-l log file] [-q queue_size] [-b banlist]\n"); Err vernunftzentrum.de 70 i exit(1); Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i } Err vernunftzentrum.de 70 i \ No newline at end of file Err vernunftzentrum.de 70 1diff --git a/fiche.h b/fiche.h /ckeen/repos/fiche/file/fiche.h.gph vernunftzentrum.de 70 i@@ -10,8 +10,9 @@ Live example: http://code.solusipse.net/ Err vernunftzentrum.de 70 i ------------------------------------------------------------------------------- Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i usage: fiche [-bdpqs]. Err vernunftzentrum.de 70 i- [-d host_domain.com] [-p port] [-s slug_size] Err vernunftzentrum.de 70 i- [-o output_directory] [-b buffer_size] [-q queue_size] Err vernunftzentrum.de 70 i+ [-d domain] [-p port] [-s slug_size] Err vernunftzentrum.de 70 i+ [-o output directory] [-B buffer_size] Err vernunftzentrum.de 70 i+ [-l log file] [-q queue_size] Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i Compile with Makefile or manually with -O2 and -pthread flags. Err vernunftzentrum.de 70 i To install use `make install` command. Err vernunftzentrum.de 70 i@@ -41,6 +42,8 @@ $ cat fiche.c | nc localhost 9999 Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i char *LOG; Err vernunftzentrum.de 70 i char *BASEDIR; Err vernunftzentrum.de 70 i+char *BANLIST; Err vernunftzentrum.de 70 i+char *BANFILE; Err vernunftzentrum.de 70 i int PORT = 9999; Err vernunftzentrum.de 70 i int SLUG_SIZE = 4; Err vernunftzentrum.de 70 i int BUFSIZE = 8192; Err vernunftzentrum.de 70 i@@ -57,16 +60,21 @@ void bind_to_port(int listen_socket, struct sockaddr_in serveraddr); Err vernunftzentrum.de 70 i void display_line(){printf("====================================\n");} Err vernunftzentrum.de 70 i void error(){perror("ERROR"); exit(1);} Err vernunftzentrum.de 70 i void display_date(); Err vernunftzentrum.de 70 i-void get_client_address(struct sockaddr_in client_address, char *slug); Err vernunftzentrum.de 70 i void perform_connection(int listen_socket); Err vernunftzentrum.de 70 i void generate_url(char *buffer, char *slug); Err vernunftzentrum.de 70 i void save_to_file(char *buffer, char *slug); Err vernunftzentrum.de 70 i void startup_message(); Err vernunftzentrum.de 70 i void set_basedir(); Err vernunftzentrum.de 70 i+void load_banlist(); Err vernunftzentrum.de 70 i void parse_parameters(int argc, char **argv); Err vernunftzentrum.de 70 i void save_log(char *slug, char *hostaddrp, char *h_name); Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i+char *return_line(){return("\n====================================");} Err vernunftzentrum.de 70 i+char *check_banlist(char *ip_address); Err vernunftzentrum.de 70 i+char *get_date(); Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i struct sockaddr_in set_address(struct sockaddr_in serveraddr); Err vernunftzentrum.de 70 i+struct client_data get_client_address(struct sockaddr_in client_address); Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i struct thread_arguments Err vernunftzentrum.de 70 i { Err vernunftzentrum.de 70 i@@ -74,4 +82,10 @@ struct thread_arguments Err vernunftzentrum.de 70 i struct sockaddr_in client_address; Err vernunftzentrum.de 70 i }; Err vernunftzentrum.de 70 i Err vernunftzentrum.de 70 i+struct client_data Err vernunftzentrum.de 70 i+{ Err vernunftzentrum.de 70 i+ char *ip_address; Err vernunftzentrum.de 70 i+ char *hostname; Err vernunftzentrum.de 70 i+}; Err vernunftzentrum.de 70 i+ Err vernunftzentrum.de 70 i #endif Err vernunftzentrum.de 70 i \ No newline at end of file Err vernunftzentrum.de 70 .