Kedves János. Szeretném használni az ön által írt Clapf program 0.4.2-es verzióját.
Az alábbi konfigurációs paraméterekkel fordítom: ./configure --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/lib \ --libdir=/usr/lib --localstatedir=/var --sysconfdir=/etc \ --includedir=/usr/include --datarootdir=/usr/share \ --with-tokendb=sqlite3 --with-userdb=sqlite3 \ --with-clapf-user=avclient --enable-spamdrop-helper \ --enable-whitelist --enable-blacklist --enable-language-detection make all su -c 'make install' Olyan megoldásban szeretném használni, hogy a felhasználóknak saját token adatbázisuk van. A clapf.conf állományban ezt állitottam be az "sqlite3 stuff" résznél: --- ;sqlite3=/var/lib/clapf/data/tokens.sdb sqlite3_pragma=PRAGMA synchronous = OFF --- Így a felhasználónkénti adatbázist kellene megnyitnia a spamdrop programnak. Sajnos a program hamarabb nyitja meg az adatbázist a konfigurációs fájl alapján, mint ahogyan a felhasználói névből előállítaná az adatbázis elérésének útvonalát. Ez az egyik hiba amit felfedeztem. A másik hiba, hogy a levél fejlécében kiszűrné a cfg->clapf_header_field változó értékét tartalmazó sort. if(strncmp(buf, cfg->clapf_header_field, strlen(cfg->clapf_header_field))) Sajnos nem csak a levél fejlécében szűri ki ezt az értéket, hanem a teljes levélben. Ezeket kijavítva már működik a spamdrop program, igaz, még vannak problémák. Az install (make install) a --localstatedir=/var -ban megadott helyre hozza létre a könyvtár szerkezetét, ahol tárolja majd a clapf.sdb fájlt (proba felhasználóval -> /var/lib/clapf/data/p/proba/clapf.sdb), de a --enable-spamdrop-helper szkript nem tudja létrehozni a könyvtárakat, mert nincs joga. Szintén nincs joga a /var/lib/clapf/queue és a /var/lib/clapf/tmp könyvtárakhoz sem. Javítottam a spamdrop_helper programon is, hogy a megfelelő jogokkal hozza létre a könyvtárakat. A spamdrop programot a felhasználó nevében futó MAILDROP program hívja xfilter segítségével. Ha a könyvtáraknak adtam 777-es jogot, akkor már jól létrehozta a felhasználóhoz tartozó könyvtárakat. Itt módosítottam a Makefile.in-t, hogy milyen jogokkal hozza létre az alap könyvtárakat. A spamdrop működik, detektál és tanítani is lehet. Találtam viszont egy levelet, ahol a spamdrop hibás fejlécet állít be. Egy üres sor a program által betett információban: ------- X-Clapf-spamicity: en X-Clapf-spamicity: 4b274bf405fb1ec72c218c85d6575a X-Clapf-spamicity: 1.0000 X-Clapf-spamicity: 4 ms X-Clapf-spamicity: message is absolutely spam X-Clapf-spamicity: Yes ------- Megkerestem a programban, mi okozhatja ezt, és meg is megtaláltam: snprintf(buf, MAXBUFSIZE-1, "%s%s\r\n%s%s%.4f\r\n%s%ld ms\r\n", cfg.clapf_header_field, sdata.ttmpfile, trainbuf, cfg.clapf_header_field, spaminess, cfg.clapf_header_field, tvdiff(tv_stop, tv_start)/1000); Ennél a kiírásnál a trainbuf értéke egy '<CR><LF>', ami szerintem nem kell. Így a kiírás előtt van egy feltételes értékadás a trainbuf-nak if(!(strlen(trainbuf) > 3)) trainbuf[0] = 0; Máshol is így vizsgáltad a trainbuf értékét. A cfg.clapf_header_field-es fejléc kiírásnál nem kell <CR><LF> csak <LF>, így ezeket is javítottam (nem DOS-os formátumú a csővezetéken keresztül kapott levél). Letöltöttem az aktuális programokat a weboldaladról és megnéztem azokban, hátha ezeket kijavítottad, de sajnos nem lett javítva. Download Latest stable: 0.4.2, 2009.09.28 10:18:00 CET, MD5: 58a8755caf14dea6f0d501fdcb46cc2b Latest development: 0.4.3-rc1, 2009.11.04 11:03:00 CET, MD5: bc7a577e1c0b475f8435aec8b59d36ff Nightly build, 2009.12.11, MD5: 5465e15d048664c49c6043b70299fb1f Egy összefoglaló hibajavítást küldenék (vg1.diff). De készítettem egy másik javítást is (vg2.diff), de az nem a hibákra vonatkozna, hanem egy kis saját módosítás lenne a spamdrop programhoz. Megköszönném, ha ezek is részévé válnának a programnak. Ezekről írnék egy keveset. - kikapcsolható lenne a syslog-ba való írás a konfigurációs fájl alapján. - lehetne egy rövidített fejléc, ami csak a Yes/No-t és a hozzátartozó spamlevel értékét tartalmazná. -- [Varadi Gabor]
diff -ruN clapf-0.4.2.eta/configure.in clapf-0.4.2.vg1/configure.in --- clapf-0.4.2.eta/configure.in 2009-09-21 10:24:10.000000000 +0200 +++ clapf-0.4.2.vg1/configure.in 2009-12-15 11:13:58.000000000 +0100 @@ -490,15 +490,26 @@ if test "$prefix" = "NONE" then cfg_dir="$ac_default_prefix/etc" - my_prefix=$ac_default_prefix else cfg_dir="$prefix/etc" - my_prefix=$prefix fi else cfg_dir="$sysconfdir" fi +my_prefix=`echo $libexecdir | grep prefix` + +if test -n "$my_prefix"; then + if test "$prefix" = "NONE" + then + my_prefix=$ac_default_prefix/usr/lib + else + my_prefix=$prefix/usr/lib + fi +else + my_prefix="$libexecdir" +fi + CFGDIR=$cfg_dir AC_SUBST(CFGDIR) AC_DEFINE_UNQUOTED(CONFDIR,"$cfg_dir",[where to look for the config file]) @@ -533,8 +544,8 @@ fi -AC_DEFINE_UNQUOTED(SPAMDROP_HELPER_PROGRAM,"$my_prefix/libexec/clapf/spamdrop_helper",[where to look for the spamdrop helper file]) -AC_DEFINE_UNQUOTED(VIRUS_TEMPLATE, "$my_prefix/share/clapf/template.virus", [where the virus template is]) +AC_DEFINE_UNQUOTED(SPAMDROP_HELPER_PROGRAM,"$my_prefix/clapf/spamdrop_helper",[where to look for the spamdrop helper file]) +AC_DEFINE_UNQUOTED(VIRUS_TEMPLATE, "$my_prefix/clapf/template.virus", [where the virus template is]) diff -ruN clapf-0.4.2.eta/Makefile.in clapf-0.4.2.vg1/Makefile.in --- clapf-0.4.2.eta/Makefile.in 2009-09-21 10:24:10.000000000 +0200 +++ clapf-0.4.2.vg1/Makefile.in 2009-12-15 11:13:58.000000000 +0100 @@ -40,10 +40,10 @@ clapf.conf: - sed -e 's%pidfile=.*%pidfile=$(localstatedir)/lib/clapf/clapf.pid%' \ - -e 's%sqlite3=.*%sqlite3=$(localstatedir)/lib/clapf/data/tokens.sdb%' \ - -e 's%workdir=.*%workdir=$(localstatedir)/lib/clapf/tmp%' \ - -e 's%mydbfile=.*%mydbfile=$(localstatedir)/lib/clapf/tokens.mydb%' < $(srcdir)/example.conf >$@ + sed -e 's%pidfile=.*%pidfile=$(localstatedir)/lib/clapf/clapf.pid%g' \ + -e 's%sqlite3=.*%sqlite3=$(localstatedir)/lib/clapf/data/tokens.sdb%g' \ + -e 's%workdir=.*%workdir=$(localstatedir)/lib/clapf/tmp%g' \ + -e 's%mydbfile=.*%mydbfile=$(localstatedir)/lib/clapf/tokens.mydb%g' < $(srcdir)/example.conf >$@ clapf: % : %.o $(CC) $(CFLAGS) $(INCDIR) $(DEFS) -o $@ $^ -lclapf $(LIBS) $(LDAP_LIBS) $(LIBDIR) @LDFLAGS@ @libclamav_extra_libs@ @@ -101,9 +101,9 @@ $(INSTALL) -m 0644 $(srcdir)/db-sqlite3.sql $(DESTDIR)$(datarootdir)/clapf/db.sql $(INSTALL) -d $(DESTDIR)$(libexecdir)/clapf $(INSTALL) -m 0755 $(srcdir)/util/purge-sqlite3.sh $(DESTDIR)$(libexecdir)/clapf - $(INSTALL) -d $(DESTDIR)$(localstatedir)/lib/clapf/data + $(INSTALL) -d -m 0777 $(DESTDIR)$(localstatedir)/lib/clapf/data if [ ! -f "$(DESTDIR)/$(localstatedir)/lib/clapf/data/tokens.sdb" ]; then sqlite3 -batch $(DESTDIR)/$(localstatedir)/lib/clapf/data/tokens.sdb <$(srcdir)/db-sqlite3.sql; \ - chown -R $(CLAPF_USER):$(CLAPF_GROUP) $(DESTDIR)$(localstatedir)/lib/clapf/data/tokens.sdb; fi + chown $(CLAPF_USER):$(CLAPF_GROUP) $(DESTDIR)$(localstatedir)/lib/clapf/data/tokens.sdb; fi install-clapf: clapf $(INSTALL) -d $(DESTDIR)$(includedir) @@ -146,20 +146,21 @@ $(INSTALL) -m 0755 $(srcdir)/stat/clapf-rrd-update.sh $(DESTDIR)$(libexecdir)/clapf if [ -f "$(srcdir)/spamstat" ]; then $(INSTALL) -m 0755 $(srcdir)/spamstat $(DESTDIR)$(libexecdir)/clapf; fi - $(INSTALL) -d $(DESTDIR)$(localstatedir)/lib/clapf/data - $(INSTALL) -d -m 755 $(DESTDIR)$(localstatedir)/lib/clapf/queue - $(INSTALL) -d -m 711 $(DESTDIR)$(localstatedir)/lib/clapf/tmp - $(INSTALL) -d $(DESTDIR)$(localstatedir)/lib/clapf/stat - $(INSTALL) -d $(DESTDIR)$(localstatedir)/lib/clapf/hold + $(INSTALL) -d -m 0777 $(DESTDIR)$(localstatedir)/lib/clapf/data + $(INSTALL) -d -m 0777 $(DESTDIR)$(localstatedir)/lib/clapf/queue + $(INSTALL) -d -m 0777 $(DESTDIR)$(localstatedir)/lib/clapf/tmp + $(INSTALL) -d -m 0755 $(DESTDIR)$(localstatedir)/lib/clapf/stat + $(INSTALL) -d -m 0755 $(DESTDIR)$(localstatedir)/lib/clapf/hold $(INSTALL) -d $(DESTDIR)$(datarootdir)/clapf $(INSTALL) -m 0644 $(srcdir)/templates/template.virus $(DESTDIR)$(datarootdir)/clapf $(INSTALL) -m 0644 $(srcdir)/history/mail.sql $(DESTDIR)$(datarootdir)/clapf - chown -R $(CLAPF_USER):$(CLAPF_GROUP) $(DESTDIR)$(localstatedir)/lib/clapf - cat $(srcdir)/util/check_clapf.sh.in | sed -e "s%YOUR_PATH%$(sbindir)%" -e "s%YOUR_QUEUE%$(localstatedir)/lib/clapf/queue%" -e "s%USER%$(CLAPF_USER)%g" > $(srcdir)/util/check_clapf.sh + chown $(CLAPF_USER):$(CLAPF_GROUP) $(DESTDIR)$(localstatedir)/lib/clapf + chown $(CLAPF_USER):$(CLAPF_GROUP) $(DESTDIR)$(localstatedir)/lib/clapf/{data,hold,queue,stat,tmp} + cat $(srcdir)/util/check_clapf.sh.in | sed -e "s%YOUR_PATH%$(sbindir)%g" -e "s%YOUR_QUEUE%$(localstatedir)/lib/clapf/queue%g" -e "s%USER%$(CLAPF_USER)%g" > $(srcdir)/util/check_clapf.sh $(INSTALL) -m 0755 util/check_clapf.sh $(DESTDIR)$(libexecdir)/clapf - cat $(srcdir)/util/spamdrop_helper.in | sed -e "s%YOUR_STATE_DIR%$(localstatedir)%" > $(srcdir)/util/spamdrop_helper + cat $(srcdir)/util/spamdrop_helper.in | sed -e "s%YOUR_STATE_DIR%$(localstatedir)%g" > $(srcdir)/util/spamdrop_helper $(INSTALL) -m 0755 util/spamdrop_helper $(DESTDIR)$(libexecdir)/clapf $(INSTALL) -m 0755 clapf $(DESTDIR)$(sbindir) $(INSTALL) -d $(DESTDIR)$(sysconfdir) @@ -187,10 +188,10 @@ $(INSTALL) -m 0755 $(srcdir)/perl/shrink.pl $(DESTDIR)$(libexecdir)/clapf $(INSTALL) -m 0755 $(srcdir)/perl/uribl.pl $(DESTDIR)$(libexecdir)/clapf $(INSTALL) -m 0755 $(srcdir)/stat/process_syslog.pl $(DESTDIR)$(libexecdir)/clapf - cat $(srcdir)/util/db_init_mydb.sh.in | sed -e "s%YOUR_LIBEXECDIR%$(libexecdir)/clapf%" -e "s%YOUR_BINDIR%$(bindir)%" -e "s%YOUR_SHAREDIR%$(datarootdir)/clapf%" > $(srcdir)/util/db_init_mydb.sh - cat $(srcdir)/util/db_init_mysql.sh.in | sed -e "s%YOUR_LIBEXECDIR%$(libexecdir)/clapf%" -e "s%YOUR_BINDIR%$(bindir)%" -e "s%YOUR_SHAREDIR%$(datarootdir)/clapf%" > $(srcdir)/util/db_init_mysql.sh - cat $(srcdir)/util/db_init_sqlite3.sh.in | sed -e "s%YOUR_LIBEXECDIR%$(libexecdir)/clapf%" -e "s%YOUR_BINDIR%$(bindir)%" -e "s%YOUR_SHAREDIR%$(datarootdir)/clapf%" > $(srcdir)/util/db_init_sqlite3.sh - if test `echo $(DEFS) | grep -c USERS_IN_LDAP ` -eq 1 ; then cat $(srcdir)/util/clapf_admin-ldap.sh.in > $(srcdir)/util/clapf_admin.sh; else cat $(srcdir)/util/clapf_admin-sql.sh.in | sed -e "s%MYSQLBINPROG%`which mysql`%" -e "s%YOUR_DATAROOTDIR%$(datarootdir)/clapf%" > $(srcdir)/util/clapf_admin.sh; fi + cat $(srcdir)/util/db_init_mydb.sh.in | sed -e "s%YOUR_LIBEXECDIR%$(libexecdir)/clapf%g" -e "s%YOUR_BINDIR%$(bindir)%g" -e "s%YOUR_SHAREDIR%$(datarootdir)/clapf%g" > $(srcdir)/util/db_init_mydb.sh + cat $(srcdir)/util/db_init_mysql.sh.in | sed -e "s%YOUR_LIBEXECDIR%$(libexecdir)/clapf%g" -e "s%YOUR_BINDIR%$(bindir)%g" -e "s%YOUR_SHAREDIR%$(datarootdir)/clapf%g" > $(srcdir)/util/db_init_mysql.sh + cat $(srcdir)/util/db_init_sqlite3.sh.in | sed -e "s%YOUR_LIBEXECDIR%$(libexecdir)/clapf%g" -e "s%YOUR_BINDIR%$(bindir)%g" -e "s%YOUR_SHAREDIR%$(datarootdir)/clapf%g" > $(srcdir)/util/db_init_sqlite3.sh + if test `echo $(DEFS) | grep -c USERS_IN_LDAP ` -eq 1 ; then cat $(srcdir)/util/clapf_admin-ldap.sh.in > $(srcdir)/util/clapf_admin.sh; else cat $(srcdir)/util/clapf_admin-sql.sh.in | sed -e "s%MYSQLBINPROG%`which mysql`%g" -e "s%YOUR_DATAROOTDIR%$(datarootdir)/clapf%g" > $(srcdir)/util/clapf_admin.sh; fi $(INSTALL) -m 0755 $(srcdir)/util/db_init_mydb.sh $(DESTDIR)$(libexecdir)/clapf $(INSTALL) -m 0755 $(srcdir)/util/db_init_mysql.sh $(DESTDIR)$(libexecdir)/clapf $(INSTALL) -m 0755 $(srcdir)/util/db_init_sqlite3.sh $(DESTDIR)$(libexecdir)/clapf diff -ruN clapf-0.4.2.eta/spamdrop.c clapf-0.4.2.vg1/spamdrop.c --- clapf-0.4.2.eta/spamdrop.c 2009-09-21 10:24:10.000000000 +0200 +++ clapf-0.4.2.vg1/spamdrop.c 2009-12-15 11:13:58.000000000 +0100 @@ -114,8 +114,6 @@ ofile = popen(buf, "w"); } - if(clapf_info) fprintf(ofile, "%s", clapf_info); - while(fgets(buf, MAXBUFSIZE-1, f)){ @@ -136,12 +134,19 @@ /* if we did not find a Subject line, add one - if we have to */ if(sent_subject_spam_prefix == 0 && put_subject_spam_prefix == 1 && spaminess >= cfg->spam_overall_limit && spaminess < 1.01) - fprintf(ofile, "Subject: %s\r\n", cfg->spam_subject_prefix); + fprintf(ofile, "Subject: %s\n", cfg->spam_subject_prefix); + + if(clapf_info) fprintf(ofile, "%s", clapf_info); } - if(strncmp(buf, cfg->clapf_header_field, strlen(cfg->clapf_header_field))) + if(is_header == 1){ + if(strncmp(buf, cfg->clapf_header_field, strlen(cfg->clapf_header_field))) + fprintf(ofile, "%s", buf); + } + else { fprintf(ofile, "%s", buf); + } } fclose(stdout); @@ -385,18 +390,6 @@ } - /* open database connection */ - - if(open_db(&sdata, &cfg) == 0){ - rc = print_message_stdout(&sdata, NULL, spaminess, &cfg); - unlink(sdata.ttmpfile); - if(rc) - return EX_TEMPFAIL; - else - return 0; - } - - /* fix username and uid */ if(recipient) get_user_from_email(&sdata, recipient, &cfg); @@ -445,6 +438,17 @@ } #endif + /* open database connection */ + + if(open_db(&sdata, &cfg) == 0){ + rc = print_message_stdout(&sdata, NULL, spaminess, &cfg); + unlink(sdata.ttmpfile); + if(rc) + return EX_TEMPFAIL; + else + return 0; + } + @@ -579,7 +583,7 @@ #ifdef HAVE_WHITELIST if(is_sender_on_black_or_white_list(&sdata, from, SQL_WHITE_FIELD_NAME, SQL_WHITE_LIST, &cfg)){ syslog(LOG_PRIORITY, "%s: sender (%s) found on whitelist", sdata.ttmpfile, from); - snprintf(whitelistbuf, SMALLBUFSIZE-1, "%sFound on whitelist\r\n", cfg.clapf_header_field); + snprintf(whitelistbuf, SMALLBUFSIZE-1, "%sFound on whitelist\n", cfg.clapf_header_field); strncat(clapf_info, whitelistbuf, MAXBUFSIZE-1); is_spam = 0; goto ENDE_SPAMDROP; @@ -591,7 +595,7 @@ #ifdef HAVE_BLACKLIST if(is_sender_on_black_or_white_list(&sdata, from, SQL_BLACK_FIELD_NAME, SQL_BLACK_LIST, &cfg) == 1){ syslog(LOG_PRIORITY, "%s: sender (%s) found on blacklist", sdata.ttmpfile, from); - snprintf(whitelistbuf, SMALLBUFSIZE-1, "%sFound on blacklist\r\n", cfg.clapf_header_field); + snprintf(whitelistbuf, SMALLBUFSIZE-1, "%sFound on blacklist\n", cfg.clapf_header_field); is_spam = 1; unlink(sdata.ttmpfile); return 0; @@ -622,7 +626,7 @@ strncat(clapf_info, cfg.clapf_header_field, MAXBUFSIZE-1); strncat(clapf_info, lang, MAXBUFSIZE-1); - strncat(clapf_info, "\r\n", MAXBUFSIZE-1); + strncat(clapf_info, "\n", MAXBUFSIZE-1); if(cfg.debug == 1) printf("lang detected: %s\n", lang); #endif @@ -636,7 +640,7 @@ if(sum){ spamsum_score = spamsum_match_db(cfg.sig_db, sum, 55); if(spamsum_score >= 50) spaminess = 0.9988; - snprintf(spamsum_buf, SMALLBUFSIZE-1, "%sspamsum=%d\r\n", cfg.clapf_header_field, spamsum_score); + snprintf(spamsum_buf, SMALLBUFSIZE-1, "%sspamsum=%d\n", cfg.clapf_header_field, spamsum_score); strncat(clapf_info, spamsum_buf, MAXBUFSIZE-1); free(sum); } @@ -674,7 +678,7 @@ else syslog(LOG_PRIORITY, "%s: TUM training a ham", sdata.ttmpfile); - snprintf(trainbuf, SMALLBUFSIZE-1, "%sTUM\r\n", cfg.clapf_header_field); + snprintf(trainbuf, SMALLBUFSIZE-1, "%sTUM\n", cfg.clapf_header_field); train_message(&sdata, &state, 1, is_spam, train_mode, &cfg); } @@ -692,7 +696,7 @@ rounds = MAX_ITERATIVE_TRAIN_LOOPS; syslog(LOG_PRIORITY, "%s: training on a blackhole message", sdata.ttmpfile); - snprintf(trainbuf, SMALLBUFSIZE-1, "%sTUM on blackhole\r\n", cfg.clapf_header_field); + snprintf(trainbuf, SMALLBUFSIZE-1, "%sTUM on blackhole\n", cfg.clapf_header_field); sdata.uid = 0; train_message(&sdata, &state, rounds, 1, T_TOE, &cfg); @@ -741,7 +745,9 @@ if(print_message == 1){ - snprintf(buf, MAXBUFSIZE-1, "%s%s\r\n%s%s%.4f\r\n%s%ld ms\r\n", + if(!(strlen(trainbuf) > 3)) trainbuf[0] = 0; + + snprintf(buf, MAXBUFSIZE-1, "%s%s\n%s%s%.4f\n%s%ld ms\n", cfg.clapf_header_field, sdata.ttmpfile, trainbuf, cfg.clapf_header_field, spaminess, cfg.clapf_header_field, tvdiff(tv_stop, tv_start)/1000); strncat(clapf_info, buf, MAXBUFSIZE-1); @@ -749,12 +755,12 @@ if(spaminess > 0.9999){ strncat(clapf_info, cfg.clapf_header_field, MAXBUFSIZE-1); strncat(clapf_info, MSG_ABSOLUTELY_SPAM, MAXBUFSIZE-1); - strncat(clapf_info, "\r\n", MAXBUFSIZE-1); + strncat(clapf_info, "\n", MAXBUFSIZE-1); } if(spaminess >= cfg.spam_overall_limit && spaminess < 1.01){ strncat(clapf_info, cfg.clapf_header_field, MAXBUFSIZE-1); - strncat(clapf_info, "Yes\r\n", MAXBUFSIZE-1); + strncat(clapf_info, "Yes\n", MAXBUFSIZE-1); } #ifdef MY_TEST @@ -763,13 +769,14 @@ memset(rblbuf, 0, SMALLBUFSIZE); reverse_ipv4_addr(state.ip); if(rbl_list_check("zen.spamhaus.org", state.ip, cfg.verbosity) == 1) - snprintf(rblbuf, SMALLBUFSIZE-1, "%sZEN=1\r\n", cfg.clapf_header_field); + snprintf(rblbuf, SMALLBUFSIZE-1, "%sZEN=1\n", cfg.clapf_header_field); else - snprintf(rblbuf, SMALLBUFSIZE-1, "%sZEN=0\r\n", cfg.clapf_header_field); + snprintf(rblbuf, SMALLBUFSIZE-1, "%sZEN=0\n", cfg.clapf_header_field); strncat(clapf_info, rblbuf, MAXBUFSIZE-1); #endif + } rc = print_message_stdout(&sdata, clapf_info, spaminess, &cfg); if(rc) return rc; } diff -ruN clapf-0.4.2.eta/util/purge-sqlite3.sh clapf-0.4.2.vg1/util/purge-sqlite3.sh --- clapf-0.4.2.eta/util/purge-sqlite3.sh 2009-09-21 10:24:10.000000000 +0200 +++ clapf-0.4.2.vg1/util/purge-sqlite3.sh 2009-12-15 11:14:39.000000000 +0100 @@ -22,7 +22,7 @@ echo "DELETE FROM t_token WHERE timestamp < $_90_DAYS;" | $SQLITE3 $DB # purge aged entries from the t_minefield table -echo "DELETE FROM t_minefield WHERE ts < (SELECT strftime('%s','now')-$MINEFIELD_TTL)" | $SQLITE3 $DB +echo "DELETE FROM t_minefield WHERE ts < (SELECT strftime('%s','now')-$MINEFIELD_TTL);" | $SQLITE3 $DB # clean aged queue entries from the database echo "DELETE FROM t_queue WHERE ts < $_7_DAYS;" | $SQLITE3 $DB diff -ruN clapf-0.4.2.eta/util/spamdrop_helper.in clapf-0.4.2.vg1/util/spamdrop_helper.in --- clapf-0.4.2.eta/util/spamdrop_helper.in 2009-09-21 10:24:10.000000000 +0200 +++ clapf-0.4.2.vg1/util/spamdrop_helper.in 2009-12-15 11:13:58.000000000 +0100 @@ -8,10 +8,17 @@ ## database for the user, etc. ## You are encouraged to customise this script -if [ "$YOURUSERNAME" = "" ]; then echo "please set the YOURUSERNAME environmnet variable"; exit 1; fi - -mkdir -p YOUR_STATE_DIR/lib/clapf/queue/${YOURUSERNAME:0:1}/$YOURUSERNAME -mkdir -p YOUR_STATE_DIR/lib/clapf/data/${YOURUSERNAME:0:1}/$YOURUSERNAME - -#cp /usr/local/etc/defaults/clapf.sdb YOUR_STATE_DIR/lib/clapf/data/${YOURUSERNAME:0:1}/$YOURUSERNAME +if [ -z "$YOURUSERNAME" ]; then + echo "please set the YOURUSERNAME environmnet variable" + exit 1 +fi +mkdir -p YOUR_STATE_DIR/lib/clapf/queue/${YOURUSERNAME:0:1}/$YOURUSERNAME 1>/dev/zero 2>&1 +chmod 777 YOUR_STATE_DIR/lib/clapf/queue/${YOURUSERNAME:0:1}/ 1>/dev/zero 2>&1 +chmod 700 YOUR_STATE_DIR/lib/clapf/queue/${YOURUSERNAME:0:1}/$YOURUSERNAME 1>/dev/zero 2>&1 +mkdir -p YOUR_STATE_DIR/lib/clapf/data/${YOURUSERNAME:0:1}/$YOURUSERNAME 1>/dev/zero 2>&1 +chmod 777 YOUR_STATE_DIR/lib/clapf/data/${YOURUSERNAME:0:1}/ 1>/dev/zero 2>&1 +chmod 700 YOUR_STATE_DIR/lib/clapf/data/${YOURUSERNAME:0:1}/$YOURUSERNAME 1>/dev/zero 2>&1 +if [ ! -s YOUR_STATE_DIR/lib/clapf/data/${YOURUSERNAME:0:1}/$YOURUSERNAME/clapf.sdb ]; then + sqlite3 YOUR_STATE_DIR/lib/clapf/data/${YOURUSERNAME:0:1}/$YOURUSERNAME/clapf.sdb < /usr/share/clapf/db.sql 1>/dev/zero 2>&1 || true +fi
diff -ruN clapf-0.4.2.vg1/cfg.c clapf-0.4.2.vg2/cfg.c --- clapf-0.4.2.vg1/cfg.c 2009-09-21 10:24:10.000000000 +0200 +++ clapf-0.4.2.vg2/cfg.c 2009-12-15 11:28:31.000000000 +0100 @@ -132,6 +132,9 @@ cfg.update_tokens = 1; + cfg.one_line_hdr = 0; + cfg.to_syslog = 1; + /* parse the config file */ @@ -475,6 +478,11 @@ if(strcmp(key, "spamc_user") == 0) memcpy(cfg.spamc_user, val, MAXVAL-1); + if(strcmp(key, "one_line_hdr") == 0) + cfg.one_line_hdr = atoi(val); + if(strcmp(key, "to_syslog") == 0) + cfg.to_syslog = atoi(val); + } } diff -ruN clapf-0.4.2.vg1/cfg.h clapf-0.4.2.vg2/cfg.h --- clapf-0.4.2.vg1/cfg.h 2009-09-21 10:24:10.000000000 +0200 +++ clapf-0.4.2.vg2/cfg.h 2009-12-15 11:20:39.000000000 +0100 @@ -180,6 +180,12 @@ int spamd_port; char spamc_user[MAXVAL]; + // One Line Header + int one_line_hdr; + + // Syslog on/off + int to_syslog; + }; struct __config read_config(char *configfile); diff -ruN clapf-0.4.2.vg1/example.conf clapf-0.4.2.vg2/example.conf --- clapf-0.4.2.vg1/example.conf 2009-09-21 10:24:10.000000000 +0200 +++ clapf-0.4.2.vg2/example.conf 2009-12-15 11:36:03.000000000 +0100 @@ -7,6 +7,16 @@ ; 5: debug verbosity=1 +; message to syslog +; 0: off +; 1: on +to_syslog=1 + +; One header line +; 0: all info in header lines +; 1: small info in header +one_line_hdr=0 + ; if you are using an extended latin character set, eg. hu_HU, than ; set this variable. It will help to reassemble words. ;locale= diff -ruN clapf-0.4.2.vg1/spamdrop.c clapf-0.4.2.vg2/spamdrop.c --- clapf-0.4.2.vg1/spamdrop.c 2009-12-15 11:13:58.000000000 +0100 +++ clapf-0.4.2.vg2/spamdrop.c 2009-12-15 11:32:05.000000000 +0100 @@ -42,7 +42,8 @@ mysql_init(&(sdata->mysql)); mysql_options(&(sdata->mysql), MYSQL_OPT_CONNECT_TIMEOUT, (const char*)&cfg->mysql_connect_timeout); if(mysql_real_connect(&(sdata->mysql), cfg->mysqlhost, cfg->mysqluser, cfg->mysqlpwd, cfg->mysqldb, cfg->mysqlport, cfg->mysqlsocket, 0) == 0){ - syslog(LOG_PRIORITY, "%s: %s", sdata->ttmpfile, ERR_MYSQL_CONNECT); + if(cfg->to_syslog == 1) + syslog(LOG_PRIORITY, "%s: %s", sdata->ttmpfile, ERR_MYSQL_CONNECT); return 0; } #endif @@ -52,12 +53,13 @@ rc = sqlite3_open(cfg->sqlite3, &(sdata->db)); if(rc){ - syslog(LOG_PRIORITY, "%s: %s: %s", sdata->ttmpfile, ERR_SQLITE3_OPEN, cfg->sqlite3); + if(cfg->to_syslog == 1) + syslog(LOG_PRIORITY, "%s: %s: %s", sdata->ttmpfile, ERR_SQLITE3_OPEN, cfg->sqlite3); return 0; } else { rc = sqlite3_exec(sdata->db, cfg->sqlite3_pragma, 0, 0, NULL); - if(rc != SQLITE_OK) syslog(LOG_PRIORITY, "%s: could not set pragma", sdata->ttmpfile); + if(rc != SQLITE_OK && cfg->to_syslog == 1) syslog(LOG_PRIORITY, "%s: could not set pragma", sdata->ttmpfile); } #endif @@ -102,7 +104,8 @@ f = fopen(sdata->ttmpfile, "r"); if(!f){ - syslog(LOG_PRIORITY, "cannot read: %s", sdata->ttmpfile); + if(cfg->to_syslog == 1) + syslog(LOG_PRIORITY, "cannot read: %s", sdata->ttmpfile); return EX_TEMPFAIL; } @@ -310,7 +313,8 @@ fd = open(sdata.ttmpfile, O_CREAT|O_EXCL|O_RDWR|O_TRUNC, S_IRUSR|S_IWUSR); if(fd == -1){ close(fd); - syslog(LOG_PRIORITY, "cannot open: %s", sdata.ttmpfile); + if(cfg.to_syslog == 1) + syslog(LOG_PRIORITY, "cannot open: %s", sdata.ttmpfile); return EX_TEMPFAIL; } @@ -323,7 +327,8 @@ /* make sure we had a successful read */ if(fsync(fd)){ - syslog(LOG_PRIORITY, "failed writing data: %s", sdata.ttmpfile); + if(cfg.to_syslog == 1) + syslog(LOG_PRIORITY, "failed writing data: %s", sdata.ttmpfile); return EX_TEMPFAIL; } @@ -338,7 +343,8 @@ #ifdef HAVE_ANTIVIRUS #ifndef HAVE_LIBCLAMAV if(do_av_check(&sdata, recipient, from, &virusinfo[0], &cfg) == AVIR_VIRUS){ - syslog(LOG_PRIORITY, "%s: dropping infected message", sdata.ttmpfile); + if(cfg.to_syslog == 1) + syslog(LOG_PRIORITY, "%s: dropping infected message", sdata.ttmpfile); unlink(sdata.ttmpfile); return 0; } @@ -384,7 +390,8 @@ /* we must have a FROM address for training */ if(training_request == 1 && from == NULL){ - syslog(LOG_PRIORITY, "%s: no FROM address detected for training", sdata.ttmpfile); + if(cfg.to_syslog == 1) + syslog(LOG_PRIORITY, "%s: no FROM address detected for training", sdata.ttmpfile); unlink(sdata.ttmpfile); return 0; } @@ -423,7 +430,8 @@ snprintf(buf, MAXBUFSIZE-1, "%s/%s/%c/%s", cfg.chrootdir, USER_QUEUE_DIR, sdata.name[0], sdata.name); if(stat(buf, &st) != 0){ - syslog(LOG_PRIORITY, "%s: running spamdrop helper script: %s, for user: %s", sdata.ttmpfile, SPAMDROP_HELPER_PROGRAM, sdata.name); + if(cfg.to_syslog == 1) + syslog(LOG_PRIORITY, "%s: running spamdrop helper script: %s, for user: %s", sdata.ttmpfile, SPAMDROP_HELPER_PROGRAM, sdata.name); snprintf(envvar, SMALLBUFSIZE-1, "YOURUSERNAME=%s", sdata.name); putenv(envvar); @@ -432,7 +440,8 @@ execl(SPAMDROP_HELPER_PROGRAM, envvar, (char*)0); if(stat(buf, &st) != 0){ - syslog(LOG_PRIORITY, "%s: missing user directory: %s", buf, sdata.ttmpfile); + if(cfg.to_syslog == 1) + syslog(LOG_PRIORITY, "%s: missing user directory: %s", buf, sdata.ttmpfile); return EX_TEMPFAIL; } } @@ -476,10 +485,12 @@ if(!recipient) recipient = trainbuf; - syslog(LOG_PRIORITY, "%s: training request for %s (username: %s, uid: %ld), found id: %s", sdata.ttmpfile, recipient, sdata.name, sdata.uid, ID); + if(cfg.to_syslog == 1) + syslog(LOG_PRIORITY, "%s: training request for %s (username: %s, uid: %ld), found id: %s", sdata.ttmpfile, recipient, sdata.name, sdata.uid, ID); if(strlen(ID) < 5){ - syslog(LOG_PRIORITY, "%s: not found a valid message id (%s)", sdata.ttmpfile, ID); + if(cfg.to_syslog == 1) + syslog(LOG_PRIORITY, "%s: not found a valid message id (%s)", sdata.ttmpfile, ID); return 0; } @@ -518,7 +529,7 @@ memset(trainbuf, 0, SMALLBUFSIZE); - if(cfg.verbosity >= _LOG_DEBUG && debug == 0) syslog(LOG_PRIORITY, "%s: username: %s, uid: %ld", sdata.ttmpfile, sdata.name, sdata.uid); + if(cfg.verbosity >= _LOG_DEBUG && debug == 0 && cfg.to_syslog == 1) syslog(LOG_PRIORITY, "%s: username: %s, uid: %ld", sdata.ttmpfile, sdata.name, sdata.uid); /* parse message */ @@ -573,7 +584,7 @@ /* is this a bounce message? */ if(from && (strcasecmp(from, "MAILER-DAEMON") == 0 || strcmp(from, "<>") == 0) && strlen(cfg.our_signo) > 3){ - if(cfg.verbosity >= _LOG_DEBUG) syslog(LOG_PRIORITY, "%s: from: %s, we should really see our signo", sdata.ttmpfile, from); + if(cfg.verbosity >= _LOG_DEBUG && cfg.to_syslog == 1) syslog(LOG_PRIORITY, "%s: from: %s, we should really see our signo", sdata.ttmpfile, from); sdata.need_signo_check = 1; } @@ -582,7 +593,8 @@ #ifdef HAVE_WHITELIST if(is_sender_on_black_or_white_list(&sdata, from, SQL_WHITE_FIELD_NAME, SQL_WHITE_LIST, &cfg)){ - syslog(LOG_PRIORITY, "%s: sender (%s) found on whitelist", sdata.ttmpfile, from); + if(cfg.to_syslog == 1) + syslog(LOG_PRIORITY, "%s: sender (%s) found on whitelist", sdata.ttmpfile, from); snprintf(whitelistbuf, SMALLBUFSIZE-1, "%sFound on whitelist\n", cfg.clapf_header_field); strncat(clapf_info, whitelistbuf, MAXBUFSIZE-1); is_spam = 0; @@ -594,7 +606,8 @@ #ifdef HAVE_BLACKLIST if(is_sender_on_black_or_white_list(&sdata, from, SQL_BLACK_FIELD_NAME, SQL_BLACK_LIST, &cfg) == 1){ - syslog(LOG_PRIORITY, "%s: sender (%s) found on blacklist", sdata.ttmpfile, from); + if(cfg.to_syslog == 1) + syslog(LOG_PRIORITY, "%s: sender (%s) found on blacklist", sdata.ttmpfile, from); snprintf(whitelistbuf, SMALLBUFSIZE-1, "%sFound on blacklist\n", cfg.clapf_header_field); is_spam = 1; unlink(sdata.ttmpfile); @@ -624,9 +637,11 @@ #ifdef HAVE_LANG_DETECT lang = check_lang(state.token_hash); - strncat(clapf_info, cfg.clapf_header_field, MAXBUFSIZE-1); - strncat(clapf_info, lang, MAXBUFSIZE-1); - strncat(clapf_info, "\n", MAXBUFSIZE-1); + if(cfg.one_line_hdr == 0){ + strncat(clapf_info, cfg.clapf_header_field, MAXBUFSIZE-1); + strncat(clapf_info, lang, MAXBUFSIZE-1); + strncat(clapf_info, "\n", MAXBUFSIZE-1); + } if(cfg.debug == 1) printf("lang detected: %s\n", lang); #endif @@ -640,8 +655,10 @@ if(sum){ spamsum_score = spamsum_match_db(cfg.sig_db, sum, 55); if(spamsum_score >= 50) spaminess = 0.9988; - snprintf(spamsum_buf, SMALLBUFSIZE-1, "%sspamsum=%d\n", cfg.clapf_header_field, spamsum_score); - strncat(clapf_info, spamsum_buf, MAXBUFSIZE-1); + if(cfg.one_line_hdr == 0){ + snprintf(spamsum_buf, SMALLBUFSIZE-1, "%sspamsum=%d\n", cfg.clapf_header_field, spamsum_score); + strncat(clapf_info, spamsum_buf, MAXBUFSIZE-1); + } free(sum); } } @@ -649,10 +666,12 @@ if(sdata.need_signo_check == 1){ if(!state.found_our_signo){ - syslog(LOG_PRIORITY, "%s: looks like a bounce, but our signo is missing", sdata.ttmpfile); + if(cfg.to_syslog == 1) + syslog(LOG_PRIORITY, "%s: looks like a bounce, but our signo is missing", sdata.ttmpfile); } else { - syslog(LOG_PRIORITY, "%s: found our signo, this should be a real bounce message", sdata.ttmpfile); + if(cfg.to_syslog == 1) + syslog(LOG_PRIORITY, "%s: found our signo, this should be a real bounce message", sdata.ttmpfile); spaminess = DEFAULT_SPAMICITY; } } @@ -673,10 +692,12 @@ ) { - if(is_spam == 1) - syslog(LOG_PRIORITY, "%s: TUM training a spam", sdata.ttmpfile); - else - syslog(LOG_PRIORITY, "%s: TUM training a ham", sdata.ttmpfile); + if(cfg.to_syslog == 1){ + if(is_spam == 1) + syslog(LOG_PRIORITY, "%s: TUM training a spam", sdata.ttmpfile); + else + syslog(LOG_PRIORITY, "%s: TUM training a ham", sdata.ttmpfile); + } snprintf(trainbuf, SMALLBUFSIZE-1, "%sTUM\n", cfg.clapf_header_field); @@ -695,7 +716,8 @@ if(spaminess < 0.99){ rounds = MAX_ITERATIVE_TRAIN_LOOPS; - syslog(LOG_PRIORITY, "%s: training on a blackhole message", sdata.ttmpfile); + if(cfg.to_syslog == 1) + syslog(LOG_PRIORITY, "%s: training on a blackhole message", sdata.ttmpfile); snprintf(trainbuf, SMALLBUFSIZE-1, "%sTUM on blackhole\n", cfg.clapf_header_field); sdata.uid = 0; @@ -736,7 +758,7 @@ ENDE_SPAMDROP: - if(cfg.debug == 0) syslog(LOG_PRIORITY, "%s: %.4f %d in %ld [ms]", sdata.ttmpfile, spaminess, sdata.tot_len, tvdiff(tv_stop, tv_start)/1000); + if(cfg.debug == 0 && cfg.to_syslog == 1) syslog(LOG_PRIORITY, "%s: %.4f %d in %ld [ms]", sdata.ttmpfile, spaminess, sdata.tot_len, tvdiff(tv_stop, tv_start)/1000); /********************************/ @@ -747,36 +769,47 @@ if(!(strlen(trainbuf) > 3)) trainbuf[0] = 0; - snprintf(buf, MAXBUFSIZE-1, "%s%s\n%s%s%.4f\n%s%ld ms\n", - cfg.clapf_header_field, sdata.ttmpfile, trainbuf, cfg.clapf_header_field, spaminess, cfg.clapf_header_field, tvdiff(tv_stop, tv_start)/1000); - - strncat(clapf_info, buf, MAXBUFSIZE-1); - - if(spaminess > 0.9999){ - strncat(clapf_info, cfg.clapf_header_field, MAXBUFSIZE-1); - strncat(clapf_info, MSG_ABSOLUTELY_SPAM, MAXBUFSIZE-1); - strncat(clapf_info, "\n", MAXBUFSIZE-1); - } + if(cfg.one_line_hdr == 0){ + snprintf(buf, MAXBUFSIZE-1, "%s%s\n%s%s%.4f\n%s%ld ms\n", + cfg.clapf_header_field, sdata.ttmpfile, trainbuf, cfg.clapf_header_field, spaminess, cfg.clapf_header_field, tvdiff(tv_stop, tv_start)/1000); + + strncat(clapf_info, buf, MAXBUFSIZE-1); + + if(spaminess > 0.9999){ + strncat(clapf_info, cfg.clapf_header_field, MAXBUFSIZE-1); + strncat(clapf_info, MSG_ABSOLUTELY_SPAM, MAXBUFSIZE-1); + strncat(clapf_info, "\n", MAXBUFSIZE-1); + } - if(spaminess >= cfg.spam_overall_limit && spaminess < 1.01){ - strncat(clapf_info, cfg.clapf_header_field, MAXBUFSIZE-1); - strncat(clapf_info, "Yes\n", MAXBUFSIZE-1); - } + if(spaminess >= cfg.spam_overall_limit && spaminess < 1.01){ + strncat(clapf_info, cfg.clapf_header_field, MAXBUFSIZE-1); + strncat(clapf_info, "Yes\n", MAXBUFSIZE-1); + } - #ifdef MY_TEST - char rblbuf[SMALLBUFSIZE]; + #ifdef MY_TEST + char rblbuf[SMALLBUFSIZE]; - memset(rblbuf, 0, SMALLBUFSIZE); - reverse_ipv4_addr(state.ip); - if(rbl_list_check("zen.spamhaus.org", state.ip, cfg.verbosity) == 1) - snprintf(rblbuf, SMALLBUFSIZE-1, "%sZEN=1\n", cfg.clapf_header_field); - else - snprintf(rblbuf, SMALLBUFSIZE-1, "%sZEN=0\n", cfg.clapf_header_field); + memset(rblbuf, 0, SMALLBUFSIZE); + reverse_ipv4_addr(state.ip); + if(rbl_list_check("zen.spamhaus.org", state.ip, cfg.verbosity) == 1) + snprintf(rblbuf, SMALLBUFSIZE-1, "%sZEN=1\n", cfg.clapf_header_field); + else + snprintf(rblbuf, SMALLBUFSIZE-1, "%sZEN=0\n", cfg.clapf_header_field); - strncat(clapf_info, rblbuf, MAXBUFSIZE-1); - #endif + strncat(clapf_info, rblbuf, MAXBUFSIZE-1); + #endif } + else { + if(spaminess >= cfg.spam_overall_limit && spaminess < 1.01){ + snprintf(buf, MAXBUFSIZE-1, "%sYes, %.4f\n", cfg.clapf_header_field, spaminess); + strncat(clapf_info, buf, MAXBUFSIZE-1); + } + else { + snprintf(buf, MAXBUFSIZE-1, "%sNo, %.4f\n", cfg.clapf_header_field, spaminess); + strncat(clapf_info, buf, MAXBUFSIZE-1); + } + } rc = print_message_stdout(&sdata, clapf_info, spaminess, &cfg); if(rc) return rc; } @@ -784,7 +817,7 @@ - if(cfg.debug == 0){ + if(cfg.debug == 0 && cfg.to_syslog == 1){ snprintf(buf, MAXBUFSIZE-1, "%ld", sdata.uid); if(is_spam == 1)