From 4a6391ce910b5f71574e20b31f1e9429d756b96d Mon Sep 17 00:00:00 2001 From: Ian C Date: Sat, 5 Jun 2004 01:09:58 +0000 Subject: Fixed checking of trusted users. Tweaks to compile under FreeBSD 4.10. Added debug output option. --- src/Makefile | 94 ++++++++++++++++++++++++++++++++++-------------------------- src/dbase.c | 75 +++++++++++++++++++++++++++++++++++++++++++----- src/dbase.h | 5 ++++ src/debug.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++ src/debug.h | 63 ++++++++++++++++++++++++++++++++++++++++ src/kbs.c | 6 ++-- src/pop3.c | 1 + src/rexp.c | 2 ++ src/util.c | 13 +++++++++ src/util.h | 7 +++++ 10 files changed, 293 insertions(+), 50 deletions(-) create mode 100644 src/debug.c create mode 100644 src/debug.h diff --git a/src/Makefile b/src/Makefile index 15b4775..508cd54 100644 --- a/src/Makefile +++ b/src/Makefile @@ -18,11 +18,16 @@ # # ------------------------------------------------------------------------- # -# $Id: Makefile,v 1.7 2004-01-26 02:01:49 ianc Exp $ +# $Id: Makefile,v 1.8 2004-06-05 01:09:58 ianc Exp $ # -# CFLAGS assumes that gcc is being used - simply comment out if required -CFLAGS = -g -Wall -Werror +# Uncomment for debug output +# +# DEBUG = -DKBS_DEBUG + +# CFLAGS assumes that gcc is being used - simply change as required +# +CFLAGS = -g -Wall -Werror $(DEBUG) TARGET = kbs @@ -32,6 +37,7 @@ SOURCE = kbs.c \ rexp.c \ dbase.c \ dstring.c \ + debug.c \ util.c OBJECTS = kbs.o \ @@ -40,6 +46,7 @@ OBJECTS = kbs.o \ rexp.o \ dbase.o \ dstring.o \ + debug.o \ util.o $(TARGET): $(OBJECTS) @@ -50,56 +57,61 @@ clean: depend: make clean - makedepend -- $(CFLAGS) -- $(SOURCE) + makedepend -- $(CFLAGS) $(DEBUG) -- $(SOURCE) if test -e Makefile ; then rm -f Makefile.bak ; fi # DO NOT DELETE THIS LINE -- make depend depends on it kbs.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h -kbs.o: /usr/include/sys/_types.h /usr/include/machine/_types.h -kbs.o: /usr/include/limits.h /usr/include/sys/limits.h -kbs.o: /usr/include/machine/_limits.h /usr/include/sys/syslimits.h -kbs.o: /usr/include/stdio.h /usr/include/string.h /usr/include/strings.h -kbs.o: /usr/include/stdarg.h /usr/include/time.h /usr/include/sys/timespec.h +kbs.o: /usr/include/machine/ansi.h /usr/include/limits.h +kbs.o: /usr/include/sys/_posix.h /usr/include/machine/limits.h +kbs.o: /usr/include/sys/syslimits.h /usr/include/stdio.h +kbs.o: /usr/include/string.h /usr/include/stdarg.h /usr/include/time.h kbs.o: /usr/include/errno.h global.h config.h pop3.h msg.h dbase.h rexp.h -kbs.o: dstring.h util.h +kbs.o: dstring.h debug.h util.h pop3.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h -pop3.o: /usr/include/sys/_types.h /usr/include/machine/_types.h -pop3.o: /usr/include/string.h /usr/include/strings.h /usr/include/stdio.h -pop3.o: /usr/include/stdarg.h /usr/include/ctype.h /usr/include/runetype.h -pop3.o: /usr/include/unistd.h /usr/include/sys/types.h -pop3.o: /usr/include/machine/endian.h /usr/include/sys/select.h -pop3.o: /usr/include/sys/_sigset.h /usr/include/sys/_timeval.h -pop3.o: /usr/include/sys/timespec.h /usr/include/sys/unistd.h -pop3.o: /usr/include/sys/socket.h /usr/include/sys/_iovec.h -pop3.o: /usr/include/machine/param.h /usr/include/netinet/in.h +pop3.o: /usr/include/machine/ansi.h /usr/include/string.h +pop3.o: /usr/include/stdio.h /usr/include/stdarg.h /usr/include/ctype.h +pop3.o: /usr/include/runetype.h /usr/include/unistd.h +pop3.o: /usr/include/sys/types.h /usr/include/sys/inttypes.h +pop3.o: /usr/include/machine/types.h /usr/include/machine/endian.h +pop3.o: /usr/include/sys/unistd.h /usr/include/sys/_posix.h +pop3.o: /usr/include/sys/select.h /usr/include/sys/event.h +pop3.o: /usr/include/sys/queue.h /usr/include/sys/socket.h +pop3.o: /usr/include/machine/param.h /usr/include/sys/time.h +pop3.o: /usr/include/time.h /usr/include/netinet/in.h pop3.o: /usr/include/netinet6/in6.h /usr/include/netinet/tcp.h pop3.o: /usr/include/netdb.h global.h pop3.h msg.h dstring.h util.h config.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h -config.o: /usr/include/sys/_types.h /usr/include/machine/_types.h -config.o: /usr/include/string.h /usr/include/strings.h /usr/include/stdio.h -config.o: /usr/include/errno.h /usr/include/ctype.h /usr/include/runetype.h -config.o: global.h config.h dstring.h dbase.h msg.h rexp.h util.h +config.o: /usr/include/machine/ansi.h /usr/include/string.h +config.o: /usr/include/stdio.h /usr/include/errno.h /usr/include/ctype.h +config.o: /usr/include/runetype.h global.h config.h dstring.h dbase.h msg.h +config.o: rexp.h util.h rexp.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h -rexp.o: /usr/include/sys/_types.h /usr/include/machine/_types.h +rexp.o: /usr/include/machine/ansi.h /usr/include/unistd.h +rexp.o: /usr/include/sys/types.h /usr/include/sys/inttypes.h +rexp.o: /usr/include/machine/types.h /usr/include/machine/endian.h +rexp.o: /usr/include/sys/unistd.h /usr/include/sys/_posix.h rexp.o: /usr/include/regex.h global.h rexp.h config.h util.h dbase.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h -dbase.o: /usr/include/sys/_types.h /usr/include/machine/_types.h -dbase.o: /usr/include/string.h /usr/include/strings.h /usr/include/stdio.h -dbase.o: /usr/include/ctype.h /usr/include/runetype.h global.h dbase.h msg.h -dbase.o: rexp.h dstring.h config.h util.h +dbase.o: /usr/include/machine/ansi.h /usr/include/string.h +dbase.o: /usr/include/strings.h /usr/include/stdio.h /usr/include/ctype.h +dbase.o: /usr/include/runetype.h global.h dbase.h msg.h rexp.h dstring.h +dbase.o: config.h debug.h util.h dstring.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h -dstring.o: /usr/include/sys/_types.h /usr/include/machine/_types.h -dstring.o: /usr/include/string.h /usr/include/strings.h /usr/include/stdio.h -dstring.o: /usr/include/stdarg.h /usr/include/ctype.h /usr/include/runetype.h -dstring.o: /usr/include/sys/types.h /usr/include/machine/endian.h -dstring.o: /usr/include/sys/select.h /usr/include/sys/_sigset.h -dstring.o: /usr/include/sys/_timeval.h /usr/include/sys/timespec.h -dstring.o: /usr/include/sys/socket.h /usr/include/sys/_iovec.h -dstring.o: /usr/include/machine/param.h /usr/include/netinet/in.h -dstring.o: /usr/include/netinet6/in6.h /usr/include/netinet/tcp.h -dstring.o: /usr/include/netdb.h global.h dstring.h util.h +dstring.o: /usr/include/machine/ansi.h /usr/include/string.h +dstring.o: /usr/include/stdio.h /usr/include/stdarg.h /usr/include/ctype.h +dstring.o: /usr/include/runetype.h /usr/include/sys/types.h +dstring.o: /usr/include/sys/inttypes.h /usr/include/machine/types.h +dstring.o: /usr/include/machine/endian.h /usr/include/sys/select.h +dstring.o: /usr/include/sys/event.h /usr/include/sys/queue.h +dstring.o: /usr/include/sys/socket.h /usr/include/machine/param.h +dstring.o: /usr/include/netinet/in.h /usr/include/netinet6/in6.h +dstring.o: /usr/include/netinet/tcp.h /usr/include/netdb.h global.h dstring.h +dstring.o: util.h +debug.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h +debug.o: /usr/include/machine/ansi.h /usr/include/stdio.h +debug.o: /usr/include/stdarg.h global.h debug.h util.o: /usr/include/stdlib.h /usr/include/sys/cdefs.h -util.o: /usr/include/sys/_types.h /usr/include/machine/_types.h -util.o: /usr/include/string.h /usr/include/strings.h /usr/include/stdio.h -util.o: global.h util.h +util.o: /usr/include/machine/ansi.h /usr/include/string.h +util.o: /usr/include/stdio.h global.h util.h diff --git a/src/dbase.c b/src/dbase.c index e1caa04..563de25 100644 --- a/src/dbase.c +++ b/src/dbase.c @@ -35,6 +35,7 @@ static const char id[]="$Id$"; #include "dbase.h" #include "dstring.h" #include "config.h" +#include "debug.h" #include "util.h" static const char header_id[]=KBS_DBASE_H; @@ -77,17 +78,27 @@ static DString reason=NULL; /* ---------------------------------------- PRVIVATE FUNCTIONS */ -static int IsTrustedUser(const char *username) +static int IsTrustedUser(const char *username, const char *domain) { + char *p; int f; + int res=FALSE; - for(f=0;fid)); + KBSDEBUG(("msg.to='%s'\n",msg->to)); + KBSDEBUG(("msg.from='%s'\n",msg->from)); + KBSDEBUG(("msg.from_uname='%s'\n",msg->from_uname)); + KBSDEBUG(("msg.from_domain='%s'\n",msg->from_domain)); + KBSDEBUG(("msg.subject='%s'\n",msg->subject)); + KBSDEBUG(("msg.content_type='%s'\n",msg->content_type)); + show=ConfigInt(CONFIG_SHOWMATCH); reason=DSReset(reason); @@ -259,7 +278,7 @@ int DBBlockMessage(const POP3Message *msg) if (IsTrustedDomain(msg->from_domain)) return FALSE; - if (IsTrustedUser(msg->from_uname)) + if (IsTrustedUser(msg->from_uname,msg->from_domain)) return FALSE; if (ConfigInt(CONFIG_BLOCKHTML) && @@ -428,7 +447,7 @@ void DBClose(void) free(t->allow); - for(f=0;fno_allow;f++) + for(f=0;fno_allow_to;f++) REFree(t->allow_to[f]); free(t->allow_to); @@ -445,4 +464,46 @@ void DBClose(void) } +void DBDump(void) +{ + Domain *d; + int f; + + for(f=0;fname,d->def_block ? "block":"allow")); + + for(f=0;fno_user;f++) + KBSDEBUG((" user[%d]='%s'\n", + f,d->user[f])); + + for(f=0;fno_block;f++) + KBSDEBUG((" block[%d]='%s'\n", + f,REGetExpression(d->block[f]))); + + for(f=0;fno_allow;f++) + KBSDEBUG((" allow[%d]='%s'\n", + f,REGetExpression(d->allow[f]))); + + for(f=0;fno_allow_to;f++) + KBSDEBUG((" allow_to[%d]='%s'\n", + f,REGetExpression(d->allow_to[f]))); + + d=d->next; + } +} + + /* END OF FILE */ diff --git a/src/dbase.h b/src/dbase.h index 1b3dfa6..4a82f9a 100644 --- a/src/dbase.h +++ b/src/dbase.h @@ -106,6 +106,11 @@ const char *DBBlockReason(void); void DBClose(void); +/* Dump the database if debugging is enabled +*/ +void DBDump(void); + + #endif /* END OF FILE */ diff --git a/src/debug.c b/src/debug.c new file mode 100644 index 0000000..5c0b84a --- /dev/null +++ b/src/debug.c @@ -0,0 +1,77 @@ +/* + + kbs - Simple, easily fooled, POP3 spam filter + + Copyright (C) 2003 Ian Cowburn (ianc@noddybox.demon.co.uk) + + This program 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 of the License, or + (at your option) any later version. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------- + + Debug interface + +*/ +static const char id[]="$Id$"; + +#include +#include +#include + +#include "global.h" +#include "debug.h" + +static const char header_id[]=KBS_DEBUG_H; + +#define DEBUG_FILE "kbs_debug.out" + +#define USE_STDERR + + +/* ---------------------------------------- GLOBALS +*/ +int ext_kbsdebug_line=__LINE__; +const char *ext_kbsdebug_file=__FILE__; + + +/* ---------------------------------------- STATICS +*/ +static FILE *fp=NULL; + + +/* ---------------------------------------- INTERFACES +*/ + +void KbsDebug(const char *fmt, ...) +{ + va_list va; + +#ifndef USE_STDERR + if (!fp) + if ((fp=fopen(DEBUG_FILE,"w"))) + setbuf(fp,NULL); + + if (!fp) + return; +#else + fp=stdout; +#endif + + fprintf(fp,"%s(%d):",ext_kbsdebug_file,ext_kbsdebug_line); + va_start(va,fmt); + vfprintf(fp,fmt,va); + va_end(va); +} + +/* END OF FILE */ diff --git a/src/debug.h b/src/debug.h new file mode 100644 index 0000000..1f3498a --- /dev/null +++ b/src/debug.h @@ -0,0 +1,63 @@ +/* + + kbs - Simple, easily fooled, POP3 spam filter + + Copyright (C) 2003 Ian Cowburn (ianc@noddybox.demon.co.uk) + + This program 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 of the License, or + (at your option) any later version. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------- + + $Id$ + + Debug interface + +*/ + +#ifndef KBS_DEBUG_H +#define KBS_DEBUG_H "$Id$" + +/* ---------------------------------------- INTERFACES +*/ + +/* Note that the KBSDEBUG macro is actually used like: + + KBSDEBUG(("string=%s\n",str)); +*/ +#ifdef KBS_DEBUG + +#define KBSDEBUG(x) do \ + { \ + extern int ext_kbsdebug_line; \ + extern const char *ext_kbsdebug_file; \ + ext_kbsdebug_line=__LINE__; \ + ext_kbsdebug_file=__FILE__; \ + KbsDebug x; \ + } while(0) + +#else + +#define KBSDEBUG(x) do {} while(0) + +#endif + + +/* Don't use - use KBSDEBUG() instead +*/ +void KbsDebug(const char *fmt, ...); + +#endif + +/* END OF FILE */ diff --git a/src/kbs.c b/src/kbs.c index 8cdf8be..ef6ab1e 100644 --- a/src/kbs.c +++ b/src/kbs.c @@ -36,6 +36,7 @@ static const char id[]="$Id$"; #include "pop3.h" #include "dbase.h" #include "dstring.h" +#include "debug.h" #include "util.h" static const char header_id[]=KBS_GLOBAL_H; @@ -125,6 +126,8 @@ int main(int argc, char *argv[]) fp=NULL; } + DBDump(); + if ((msg=POP3GetList())) { int tot=0; @@ -189,6 +192,7 @@ static void Log(FILE *fp, const char *fmt,...) char buff[128]; time_t t; struct tm *ts; + va_list va; if (!fp) return; @@ -200,10 +204,8 @@ static void Log(FILE *fp, const char *fmt,...) "%Y-%m-%d %H:%M:%S: ", ts); - fprintf(fp,"%s",buff); - va_list va; va_start(va,fmt); vfprintf(fp,fmt,va); diff --git a/src/pop3.c b/src/pop3.c index bfd9e6c..5d87e9a 100644 --- a/src/pop3.c +++ b/src/pop3.c @@ -35,6 +35,7 @@ static const char id[]="$Id$"; #include #include #include +#include #include #include #include diff --git a/src/rexp.c b/src/rexp.c index effa882..6deeda7 100644 --- a/src/rexp.c +++ b/src/rexp.c @@ -26,6 +26,8 @@ static const char id[]="$Id$"; #include +#include +#include #include #include "global.h" diff --git a/src/util.c b/src/util.c index 62dd79c..4db37f5 100644 --- a/src/util.c +++ b/src/util.c @@ -48,6 +48,19 @@ char *CopyStr(const char *p) } +char *CatStr(char *orig, const char *p) +{ + char *new; + + new=Malloc(strlen(orig)+strlen(p)+1); + strcpy(new,orig); + strcat(new,p); + free(orig); + + return new; +} + + void *F_Malloc(const char *file, int line, size_t len) { void *new; diff --git a/src/util.h b/src/util.h index c754307..88db7ee 100644 --- a/src/util.h +++ b/src/util.h @@ -43,6 +43,13 @@ char *CopyStr(const char *p); +/* Concatante a string. + NOTE: orig must have been allocated with Malloc() or Realloc(), and will + have been free()ed when this returns. +*/ +char *CatStr(char *orig, const char *p); + + /* Malloc wrapper. Just use free() to free. */ void *F_Malloc(const char *file, int line, size_t len); -- cgit v1.2.3