2 ** Copyright (C) 2006 Thadeu Lima de Souza Cascardo <cascardo@minaslivre.org>
3 ** Copyright (C) 2009 Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
5 ** This program is free software; you can redistribute it and/or modify
6 ** it under the terms of the GNU General Public License as published by
7 ** the Free Software Foundation; either version 2 of the License, or
8 ** (at your option) any later version.
10 ** This program is distributed in the hope that it will be useful,
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 ** GNU General Public License for more details.
15 ** You should have received a copy of the GNU General Public License
16 ** along with this program; if not, write to the Free Software
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 #include "hcconn_internal.h"
37 pop_destroy (pop_t *pop)
39 g_string_free (pop->buffer, TRUE);
40 g_string_free (pop->line, TRUE);
41 g_string_free (pop->push, TRUE);
44 g_slice_free (pop_t, (gpointer) pop);
48 pop_check_user (pop_t *pop)
52 end = pop->line->str + pop->line->len;
54 while (s < end && *s == ' ') s++;
57 if (g_ascii_strncasecmp (s, "USER ", 5) != 0)
60 while (s < end && *s == ' ') s++;
64 while (end >= s && (*end == '\n' || *end == '\r')) end--;
69 pop->user = g_strndup (s, end - s + 2);
70 pop->user[end - s + 1] = 0;
75 pop_getline (pop_t *pop)
79 if (pop->buffer->len == 0)
81 end = memchr (pop->buffer->str, '\n', pop->buffer->len);
84 len = end - pop->buffer->str + 1;
85 g_string_truncate (pop->line, 0);
86 g_string_append_len (pop->line, pop->buffer->str, len);
87 g_string_erase (pop->buffer, 0, len);
92 pop_watch (HCConn *conn, HCEvent event, gpointer data)
96 HCConn *pop_conn = data;
97 pop_t *pop = pop_conn->layer;
101 while ((r = hc_conn_read (conn, buffer, sizeof (buffer))) > 0)
103 g_string_append_len (pop->buffer, buffer, r);
104 while (pop_getline (pop) == 0)
106 if (pop_check_user (pop) == 0)
108 g_message ("User is trying to authenticate as %s.",
110 if (usermap_perm (pop->user) == ACCESS_DENY)
112 g_message ("Denying access to user %s.", pop->user);
114 pop_conn->func (pop_conn, HC_EVENT_CLOSE,
119 g_string_append_len (pop->push, pop->line->str, pop->line->len);
121 pop_conn->func (pop_conn, HC_EVENT_READ, pop_conn->data);
127 pop_conn->func (pop_conn, event, pop_conn->data);
133 pop_read (gpointer data, gchar *buffer, size_t len)
137 if (len > pop->push->len)
140 memcpy (buffer, pop->push->str, r);
141 g_string_truncate (pop->push, 0);
146 memcpy (buffer, pop->push->str, r);
147 g_string_erase (pop->push, 0, r);
153 pop_write (gpointer data, gchar *buffer, size_t len)
156 hc_conn_write (pop->lowconn, buffer, len);
161 pop_close (gpointer data)
164 hc_conn_close (pop->lowconn);
169 hc_conn_set_driver_pop (HCConn *conn, HCConn *lowconn)
172 pop = g_slice_new (pop_t);
173 pop->buffer = g_string_sized_new (4096);
174 pop->line = g_string_sized_new (4096);
175 pop->push = g_string_sized_new (4096);
177 pop->lowconn = lowconn;
178 conn->read = pop_read;
179 conn->write = pop_write;
180 conn->close = pop_close;
182 hc_conn_set_callback (lowconn, pop_watch, conn);