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