summaryrefslogtreecommitdiff
path: root/pop3d
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2003-10-11 10:58:50 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2003-10-11 10:58:50 +0000
commita3ad9cf8e7cd9d82b786a06a82f16d23d80c6ccc (patch)
tree24bdad57adcdb1b7c94ec6db6b79b3defc1e6b0d /pop3d
parent7f53db7bad06605ce710ac4ff32c2ba49f2a0a23 (diff)
downloadmailutils-a3ad9cf8e7cd9d82b786a06a82f16d23d80c6ccc.tar.gz
mailutils-a3ad9cf8e7cd9d82b786a06a82f16d23d80c6ccc.tar.bz2
Add logindelay.c
Diffstat (limited to 'pop3d')
-rw-r--r--pop3d/Makefile.am2
-rw-r--r--pop3d/logindelay.c113
2 files changed, 114 insertions, 1 deletions
diff --git a/pop3d/Makefile.am b/pop3d/Makefile.am
index 90b7d722b..55ab42731 100644
--- a/pop3d/Makefile.am
+++ b/pop3d/Makefile.am
@@ -26,7 +26,7 @@ SUBDIRS = testsuite
pop3d_SOURCES = apop.c auth.c capa.c dele.c extra.c pop3d.c pop3d.h \
list.c lock.c noop.c quit.c retr.c rset.c stat.c stls.c signal.c top.c \
- uidl.c user.c
+ uidl.c user.c logindelay.c
pop3d_LDADD = \
../mailbox/mbox/libmu_mbox.la\
diff --git a/pop3d/logindelay.c b/pop3d/logindelay.c
new file mode 100644
index 000000000..373bda270
--- /dev/null
+++ b/pop3d/logindelay.c
@@ -0,0 +1,113 @@
+/* GNU Mailutils -- a suite of utilities for electronic mail
+ Copyright (C) 2003 Free Software Foundation, Inc.
+
+ GNU Mailutils is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Mailutils is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Mailutils; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#include "pop3d.h"
+
+#ifdef ENABLE_LOGIN_DELAY
+
+static int
+open_stat_db (DBM_FILE *db, int mode)
+{
+ int rc = mu_dbm_open (login_stat_file, db, mode, 0600);
+ if (rc)
+ {
+ if (rc == -1)
+ syslog (LOG_INFO, _("Bad permissions on statistics db"));
+ else
+ syslog (LOG_ERR, _("Unable to open statistics db: %s"),
+ mu_strerror (rc));
+ }
+ return rc;
+}
+
+int
+check_login_delay (char *username)
+{
+ time_t now, prev_time;
+ DBM_FILE db;
+ DBM_DATUM key, data;
+ char text[64], *p;
+ int rc;
+
+ if (login_delay == 0)
+ return 0;
+
+ time (&now);
+ if (open_stat_db (&db, MU_STREAM_READ))
+ return 0;
+
+ MU_DATUM_PTR(key) = username;
+ MU_DATUM_SIZE(key) = strlen (username);
+ memset (&data, 0, sizeof data);
+
+ rc = mu_dbm_fetch (db, key, &data);
+ mu_dbm_close (db);
+ if (rc)
+ {
+ syslog (LOG_ERR, _("Can't fetch APOP data: %s"), mu_strerror (rc));
+ return 0;
+ }
+
+ if (MU_DATUM_SIZE(data) > sizeof (text) - 1)
+ {
+ syslog (LOG_ERR, _("Invalid entry for '%s': wrong timestamp size"),
+ username);
+ return 0;
+ }
+
+ memcpy (text, MU_DATUM_PTR(data), MU_DATUM_SIZE(data));
+ text[MU_DATUM_SIZE(data)] = 0;
+
+ prev_time = strtoul (text, &p, 0);
+ if (*p)
+ {
+ syslog (LOG_ERR, _("Malformed timestamp for '%s': %s"),
+ username, text);
+ return 0;
+ }
+
+ return now - prev_time < login_delay;
+}
+
+void
+update_login_delay (char *username)
+{
+ time_t now;
+ DBM_FILE db;
+ DBM_DATUM key, data;
+ char text[64];
+
+ if (login_delay == 0 || username == NULL)
+ return;
+
+ time (&now);
+ if (open_stat_db (&db, MU_STREAM_RDWR))
+ return;
+
+ MU_DATUM_PTR(key) = username;
+ MU_DATUM_SIZE(key) = strlen (username);
+ snprintf (text, sizeof text, "%lu", (unsigned long) now);
+ MU_DATUM_PTR(data) = text;
+ MU_DATUM_SIZE(data) = strlen (text);
+ if (mu_dbm_insert (db, key, data, 1))
+ mu_error (_("%s: can't store datum %s/%s"),
+ login_stat_file, username, text);
+
+ mu_dbm_close (db);
+}
+
+#endif

Return to:

Send suggestions and report system problems to the System administrator.