From: Thadeu Lima de Souza Cascardo Date: Thu, 11 Jun 2009 00:00:28 +0000 (-0300) Subject: Check for the user trying to authenticate. X-Git-Tag: v0.1.3~92 X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Frnetproxy.git;a=commitdiff_plain;h=8e59dc35c2ded6f600f4c9988d4cfad8e88beab4 Check for the user trying to authenticate. --- diff --git a/pop.c b/pop.c index 6c33235..4e93caa 100644 --- a/pop.c +++ b/pop.c @@ -30,8 +30,36 @@ typedef struct gpointer orig_data; GString *buffer; GString *line; + gchar *user; } pop_t; +static int +pop_check_user (pop_t *pop) +{ + gchar *end; + gchar *s; + end = pop->line->str + pop->line->len; + s = pop->line->str; + while (s < end && *s == ' ') s++; + if (end - s < 5) + return -1; + if (g_ascii_strncasecmp (s, "USER ", 5) != 0) + return -1; + s += 5; + while (s < end && *s == ' ') s++; + if (s == end) + return -1; + end--; + while (end >= s && (*end == '\n' || *end == '\r')) end--; + if (end < s) + return -1; + if (pop->user) + g_free (pop->user); + pop->user = g_strndup (s, end - s + 2); + pop->user[end - s + 1] = 0; + return 0; +} + static int pop_getline (pop_t *pop) { @@ -56,7 +84,11 @@ pop_read (net_hook_t *hook, gchar *buffer, size_t len) g_string_append_len (pop->buffer, buffer, len); hook->data = pop->orig_data; while (pop_getline (pop) == 0) - pop->orig_read (hook, pop->line->str, pop->line->len); + { + if (pop_check_user (pop) == 0) + g_message ("User is trying to authenticate as %s.", pop->user); + pop->orig_read (hook, pop->line->str, pop->line->len); + } hook->data = pop; } @@ -69,6 +101,7 @@ pop_hook_new (net_hook_t *layer) pop->orig_data = layer->data; pop->buffer = g_string_sized_new (4096); pop->line = g_string_sized_new (4096); + pop->user = NULL; layer->read = pop_read; layer->data = pop; return layer; @@ -80,6 +113,8 @@ pop_destroy (net_hook_t *hook) pop_t *pop = hook->data; g_string_free (pop->buffer, TRUE); g_string_free (pop->line, TRUE); + if (pop->user) + g_free (pop->user); hook->read = pop->orig_read; hook->data = pop->orig_data; g_slice_free (net_hook_t, (gpointer) pop);