--- Makefile.orig Sat Dec 22 12:00:30 2001
+++ Makefile Sat Dec 22 12:20:30 2001
@@ -39,6 +39,9 @@
misc.o \
md5/md5.o
+OBJS += pop_db.o
+CFLAGS += -DPOPB4SMTP -DVALIDTIME=600
+
all: $(PROJ)
popa3d: $(OBJS)
--- pop_auth.c.orig Thu Sep 6 01:52:35 2001
+++ pop_auth.c Sat Dec 22 17:41:02 2001
@@ -14,6 +14,7 @@
#if POP_VIRTUAL
#include "virtual.h"
#endif
+#include "pop_db.h"
static char *pop_user, *pop_pass;
@@ -75,15 +76,17 @@
#if POP_VIRTUAL
if (virtual_domain) {
syslog(result == AUTH_OK ? SYSLOG_PRI_LO : SYSLOG_PRI_HI,
- "Authentication %s for %s@%s",
+ "Authentication %s for %s@%s from %s",
result == AUTH_OK ? "passed" : "failed",
user ? user : "UNKNOWN USER",
- virtual_domain);
+ virtual_domain,
+ client_addr(1) );
return;
}
#endif
syslog(result == AUTH_OK ? SYSLOG_PRI_LO : SYSLOG_PRI_HI,
- "Authentication %s for %s",
+ "Authentication %s for %s from %s",
result == AUTH_OK ? "passed" : "failed",
- user ? user : "UNKNOWN USER");
+ user ? user : "UNKNOWN USER",
+ client_addr(1));
}
--- pop_db.c.orig Sat Dec 22 15:55:37 2001
+++ pop_db.c Sat Dec 22 17:41:50 2001
@@ -0,0 +1,107 @@
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/stat.h>
+
+#ifdef POPB4SMTP
+#include <fcntl.h>
+#include <db.h>
+#include <time.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#endif
+
+#include "pop_db.h"
+
+int log_error(char *s);
+
+
+/* Function from G.Glendown Dec 2000 */
+
+char addr_buf[256];
+
+char *client_addr(int fd)
+{
+ struct sockaddr sa;
+ struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
+ int length = sizeof(sa);
+
+ strcpy(addr_buf,"0.0.0.0");
+
+ if (fd == -1) {
+ return addr_buf;
+ }
+
+ if (getpeername(fd, &sa, &length) < 0) {
+ return addr_buf;
+ }
+
+ strcpy(addr_buf, (char *)inet_ntoa(sockin->sin_addr));
+ return addr_buf;
+}
+
+#ifdef POPB4SMTP
+
+/* Function written by Dirk Meyer */
+
+void write_db_entry(void)
+{
+ DB *db;
+ DBT key, data;
+ char ts[16];
+ int ret, fd, st;
+ time_t tv;
+
+ /* create is not set, this is intended,
+ function will be ignored, if database was not created */
+ db = dbopen("/etc/mail/popauth.db", O_RDWR, 0644, DB_HASH, NULL);
+ if ( db == NULL )
+ return;
+
+ /* lock all changes */
+ fd = db->fd(db);
+ if ( fd == -1 ) {
+ st = -1;
+ log_error( "db->fd() failed" );
+ } else {
+ st = flock(fd, LOCK_EX);
+ }
+
+ if (st == 0) {
+ /* generate entry */
+ key.data = client_addr(1);
+ key.size = strlen(key.data);
+ sprintf(ts, "%lu", (long)time(NULL));
+ data.data = ts;
+ data.size = strlen(ts);
+ db->put(db, &key, &data, 0);
+ db->sync(db,0);
+
+ /* cleanup old entrys */
+ ret = db->seq(db, &key, &data, R_FIRST);
+ while (!ret) {
+ data.size = data.size < 16 ? data.size : 15;
+ strncpy(ts,data.data, data.size);
+ ts[data.size] = 0;
+ tv = atol(ts);
+ if ((tv+VALIDTIME) < time(NULL)) {
+ db->del(db, &key, 0);
+ db->sync(db, 0);
+ /* start over */
+ ret = db->seq(db, &key, &data, R_FIRST);
+ continue;
+ }
+ ret = db->seq(db, &key, &data, R_NEXT);
+ }
+ st = flock(fd, LOCK_UN);
+ } else {
+ log_error( "lock() failed" );
+ }
+ db->close(db);
+}
+
+#endif
+
--- pop_db.h.orig Sat Dec 22 15:55:37 2001
+++ pop_db.h Sat Dec 22 15:55:37 2001
@@ -0,0 +1,4 @@
+
+char *client_addr(int fd);
+void write_db_entry(void);
+
--- pop_root.c.orig Sat Sep 8 14:58:32 2001
+++ pop_root.c Sat Dec 22 17:27:37 2001
@@ -32,6 +32,9 @@
#if POP_VIRTUAL
#include "virtual.h"
#endif
+#ifdef POPB4SMTP
+#include "pop_db.h"
+#endif
#if !VIRTUAL_ONLY
extern struct passwd *auth_userpass(char *user, char *pass, int *known);
@@ -151,6 +154,10 @@
if (!*pass) return AUTH_FAILED;
memset(pass, 0, strlen(pass));
if (!*user) return AUTH_FAILED;
+
+#ifdef POPB4SMTP
+ write_db_entry();
+#endif
if (set_user(pw)) return AUTH_FAILED;
syntax highlighted by Code2HTML, v. 0.9.1