00001
00008 #include <gtk/gtk.h>
00009 #include <string.h>
00010 #include <stdio.h>
00011 #include <stdlib.h>
00012 #include <ctype.h>
00013 #include <sys/types.h>
00014 #include <unistd.h>
00015 #include <signal.h>
00016 #include <sqlite3.h>
00017 #include <netdb.h>
00018 #include <arpa/inet.h>
00019 #include <netinet/in.h>
00020
00021 #define BUFFER 4096
00022
00023 sqlite3 *db1;
00024
00025 pid_t pid;
00026 char *zErrMsg = 0;
00027 int rc;
00028 char sql_query[BUFFER];
00029 GtkTextBuffer *buffer;
00030 GtkTextIter end_iter;
00031 GtkWidget *start,*stop;
00032 char str[BUFFER];
00033
00034
00035 void proxy_server_main();
00036
00043 static int callback (void *NotUsed, int argc, char **argv, char **azColName)
00044 {
00045 NotUsed = 0;
00046 int i;
00047 for (i = 0; i < argc; i++)
00048 {
00049 printf ("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
00050 }
00051 printf ("\n");
00052 return 0;
00053 }
00054
00061 static int callback2 (void *NotUsed, int argc, char **argv, char **azColName)
00062 {
00063 NotUsed = 0;
00064 int i;
00065 for (i = 0; i < argc; i++)
00066 {
00067 if((i==2 || i==3) && (atoi(argv[i]))%1000 == 0)
00068 sprintf (str," %s \t\t", argv[i] ? argv[i] : "NULL");
00069 else
00070 sprintf (str," %s \t", argv[i] ? argv[i] : "NULL");
00071 gtk_text_buffer_get_end_iter(buffer, &end_iter);
00072 gtk_text_buffer_insert(buffer, &end_iter, str, -1);
00073 }
00074 sprintf (str,"\n");
00075 gtk_text_buffer_get_end_iter(buffer, &end_iter);
00076 gtk_text_buffer_insert(buffer, &end_iter, str, -1);
00077 return 0;
00078 }
00079
00086 void block(GtkWidget *widget1, gpointer data)
00087 {
00088 const gchar * text = gtk_entry_get_text(data);
00089 char host_ip[100];
00090 struct hostent *host_struct;
00091 struct in_addr h_addr;
00092 host_struct = (struct hostent *)gethostbyname(text);
00093 if (host_struct == NULL)
00094 {
00095 fprintf(stderr,"ERROR, no such host\n");
00096
00097 }
00098 h_addr.s_addr = *((unsigned long *) host_struct->h_addr_list[0]);
00099 strcpy(host_ip, inet_ntoa(h_addr));
00100
00101 sprintf(sql_query, "INSERT INTO blocked_ip values('%s')", host_ip);
00102 rc = sqlite3_exec (db1, sql_query, callback, 0, &zErrMsg);
00103 sprintf(sql_query, "INSERT INTO blocked_ip values('%s')", text);
00104 rc = sqlite3_exec (db1, sql_query, callback, 0, &zErrMsg);
00105 }
00106
00113 void unblock(GtkWidget *widget1, gpointer data)
00114 {
00115 const gchar * text = gtk_entry_get_text(data);
00116 char host_ip[100];
00117 struct hostent *host_struct;
00118 struct in_addr h_addr;
00119 host_struct = (struct hostent *)gethostbyname(text);
00120 if (host_struct == NULL)
00121 {
00122 fprintf(stderr,"ERROR, no such host\n");
00123
00124 }
00125 h_addr.s_addr = *((unsigned long *) host_struct->h_addr_list[0]);
00126 strcpy(host_ip, inet_ntoa(h_addr));
00127 sprintf(sql_query, "DELETE from blocked_ip where blocked_ip='%s' ", host_ip);
00128 rc = sqlite3_exec (db1, sql_query, callback, 0, &zErrMsg);
00129 sprintf(sql_query, "DELETE from blocked_ip where blocked_ip='%s'", text);
00130 rc = sqlite3_exec (db1, sql_query, callback, 0, &zErrMsg);
00131 }
00132
00140 void display_log(GtkWidget *widget1, gpointer data)
00141 {
00142 gtk_text_buffer_set_text (data, " Client_IP \t\t\t\t Time \t\t Downloads\tUploads \t\tURL_Requested\n----------------------------------------------------------------------------------------------------------------------------\n", -1);
00143
00144 sprintf(sql_query, "SELECT * from log_details");
00145 rc = sqlite3_exec (db1, sql_query, callback2, 0, &zErrMsg);
00146 }
00147
00154 void display_usage(GtkWidget *widget1, gpointer data)
00155 {
00156 gtk_text_buffer_set_text (data, " Client_IP \t\tDownloads \t Uploads\n-------------------------------------------------------------\n", -1);
00157 sprintf(sql_query, "SELECT * from usage_details");
00158 rc = sqlite3_exec (db1, sql_query, callback2, 0, &zErrMsg);
00159 }
00160
00167 void on_window_destroy (GtkWidget *widget, gpointer data)
00168 {
00169 kill(pid, SIGTERM);
00170 gtk_main_quit ();
00171 }
00172
00179 void start_server(GtkWidget *widget1, gpointer data)
00180 {
00181 const gchar * text_port = gtk_entry_get_text(data);
00182 int port = atoi(text_port);
00183 pid = fork();
00184 if (pid == 0)
00185 {
00186 proxy_server_main(port);
00187 }
00188 else
00189 {
00190
00191 gtk_widget_set_sensitive(widget1, FALSE);
00192 gtk_widget_set_sensitive(stop, TRUE);
00193 if(port > 0)
00194 sprintf(str, "Proxy Server Started Listening on Port %d\n",port);
00195 else
00196 sprintf(str, "Proxy Server Started Listening on Port 8080\n");
00197 gtk_text_buffer_set_text (buffer, str ,-1);
00198 }
00199 }
00200
00208 void stop_server(GtkWidget *widget1, gpointer data)
00209 {
00210 kill(pid, SIGTERM);
00211 gtk_text_buffer_set_text (buffer, "Server Stopped..." ,-1);
00212
00213 gtk_widget_set_sensitive(widget1, FALSE);
00214 gtk_widget_set_sensitive(start, TRUE);
00215 }
00216
00225 int main( int argc, char *argv[])
00226 {
00227
00228 GtkWidget *window;
00229 GtkWidget *text_view;
00230 GtkWidget *entry,*port;
00231 GtkWidget *vbox;
00232 GtkWidget *bbox;
00233 GtkWidget *table;
00234 GtkWidget *scroll_window;
00235 GtkWidget *label,*label1,*label2;
00236 GtkWidget *block_ip,*unblock_ip,*log,*ip_stats;
00237
00238
00239 rc = sqlite3_open ("proxyDB.sqlite", &db1);
00240 if (rc)
00241 {
00242 fprintf (stderr, "Can't open database: %s\n", sqlite3_errmsg (db1));
00243 sqlite3_close (db1);
00244 exit (1);
00245 }
00246
00247 gtk_init (&argc, &argv);
00248
00249 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
00250 gtk_window_set_title (GTK_WINDOW (window), "Proxy Server");
00251 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
00252 gtk_window_set_default_size (GTK_WINDOW (window), 500, 500);
00253 g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (on_window_destroy), NULL);
00254
00255 scroll_window = gtk_scrolled_window_new(NULL, NULL);
00256
00257
00258 entry = gtk_entry_new();
00259 gtk_entry_set_text(GTK_ENTRY(entry), "0.0.0.0");
00260
00261
00262 port = gtk_entry_new();
00263 gtk_entry_set_text(GTK_ENTRY(port), "8080");
00264
00265 label1 = gtk_label_new("IP Address/Website");
00266 label2 = gtk_label_new("Port");
00267
00268
00269 vbox = gtk_vbox_new (FALSE, 2);
00270 gtk_container_add (GTK_CONTAINER (window), vbox);
00271
00272 label=gtk_label_new("\nIn order to configure Proxy Server to a particular port give 'Port Number',\n to Block/Unblock IP/destinataions give 'IP Address/Website', \n and to View Logs and Per IP Statistitcs Press Buttons. \n\n");
00273 gtk_box_pack_start (GTK_BOX (vbox), label, 0, 0, 0);
00274
00275 table = gtk_table_new(1, 1, TRUE);
00276 gtk_box_pack_start(GTK_BOX(vbox), table, 0, 0, 0);
00277 gtk_table_attach_defaults(GTK_TABLE(table), label1, 0, 1, 0, 1 );
00278 gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, 0, 1 );
00279 gtk_table_attach_defaults(GTK_TABLE(table), label2, 2.5, 3, 0, 1 );
00280 gtk_table_attach_defaults(GTK_TABLE(table), port, 3, 4, 0, 1 );
00281
00282
00283
00284 bbox = gtk_hbutton_box_new ();
00285 gtk_box_pack_start (GTK_BOX (vbox), bbox, 0, 0, 0);
00286
00287
00288 text_view = gtk_text_view_new ();
00289 gtk_container_add (GTK_CONTAINER (scroll_window), text_view);
00290 gtk_box_pack_start (GTK_BOX (vbox), scroll_window, 1, 1, 0);
00291 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view));
00292
00293 block_ip = gtk_button_new_with_label ("Block IP");
00294 g_signal_connect(G_OBJECT(block_ip),"clicked",G_CALLBACK(block), (gpointer)entry);
00295 gtk_container_add (GTK_CONTAINER (bbox), block_ip);
00296
00297 unblock_ip = gtk_button_new_with_label ("UnBlock IP");
00298 g_signal_connect(G_OBJECT(unblock_ip),"clicked",G_CALLBACK(unblock), (gpointer)entry);
00299 gtk_container_add (GTK_CONTAINER (bbox), unblock_ip);
00300
00301 log = gtk_button_new_with_label ("View Log");
00302 g_signal_connect(G_OBJECT(log),"clicked",G_CALLBACK(display_log), (gpointer)buffer);
00303 gtk_container_add (GTK_CONTAINER (bbox), log);
00304
00305 ip_stats = gtk_button_new_with_label ("IP Statistics");
00306 g_signal_connect(G_OBJECT(ip_stats),"clicked",G_CALLBACK(display_usage), (gpointer)buffer);
00307 gtk_container_add (GTK_CONTAINER (bbox), ip_stats);
00308
00309 start = gtk_button_new_with_label ("Start Server");
00310 g_signal_connect(G_OBJECT(start),"clicked",G_CALLBACK(start_server), (gpointer)port);
00311 gtk_container_add (GTK_CONTAINER (bbox), start);
00312
00313 stop = gtk_button_new_with_label ("Stop Server");
00314 g_signal_connect(G_OBJECT(stop),"clicked",G_CALLBACK(stop_server), (gpointer)start);
00315 gtk_container_add (GTK_CONTAINER (bbox), stop);
00316 gtk_widget_set_sensitive(stop, FALSE);
00317
00318 gtk_widget_show_all (window);
00319
00320 gtk_main ();
00321 return 0;
00322 }
00323
00324
00325