diff --git a/configure b/configure index 34793f20..5ee5e46a 100755 --- a/configure +++ b/configure @@ -3490,7 +3490,7 @@ fi echo "\"Configure command: ./configure $PARAMS\"" >> $CONFIGURE_PARAMS_FILE -SUBDIRS="src etc util init.d test" +SUBDIRS="src etc util init.d unit_tests" @@ -4891,7 +4891,7 @@ CFLAGS="$static -O2 -Wall -g" LIBS="$antispam_libs $sunos_libs " OBJS="dirs.o base64.o misc.o counters.o cfg.o sig.o decoder.o hash.o parser.o parser_utils.o rules.o session.o message.o attachment.o digest.o store.o archive.o tai.o import.o imap.o pop3.o extract.o mydomains.o $objs" -ac_config_files="$ac_config_files Makefile src/Makefile etc/Makefile util/Makefile init.d/Makefile test/Makefile contrib/imap/Makefile" +ac_config_files="$ac_config_files Makefile src/Makefile etc/Makefile util/Makefile init.d/Makefile unit_tests/Makefile contrib/imap/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -5589,7 +5589,7 @@ do "etc/Makefile") CONFIG_FILES="$CONFIG_FILES etc/Makefile" ;; "util/Makefile") CONFIG_FILES="$CONFIG_FILES util/Makefile" ;; "init.d/Makefile") CONFIG_FILES="$CONFIG_FILES init.d/Makefile" ;; - "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; + "unit_tests/Makefile") CONFIG_FILES="$CONFIG_FILES unit_tests/Makefile" ;; "contrib/imap/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/imap/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; diff --git a/configure.in b/configure.in index caf66e9d..a7b91eab 100644 --- a/configure.in +++ b/configure.in @@ -86,7 +86,7 @@ fi echo "\"Configure command: ./configure $PARAMS\"" >> $CONFIGURE_PARAMS_FILE -SUBDIRS="src etc util init.d test" +SUBDIRS="src etc util init.d unit_tests" dnl static build @@ -558,7 +558,7 @@ CFLAGS="$static -O2 -Wall -g" LIBS="$antispam_libs $sunos_libs " OBJS="dirs.o base64.o misc.o counters.o cfg.o sig.o decoder.o hash.o parser.o parser_utils.o rules.o session.o message.o attachment.o digest.o store.o archive.o tai.o import.o imap.o pop3.o extract.o mydomains.o $objs" -AC_CONFIG_FILES([Makefile src/Makefile etc/Makefile util/Makefile init.d/Makefile test/Makefile contrib/imap/Makefile]) +AC_CONFIG_FILES([Makefile src/Makefile etc/Makefile util/Makefile init.d/Makefile unit_tests/Makefile contrib/imap/Makefile]) AC_OUTPUT diff --git a/src/parser.c b/src/parser.c index fca6526f..a0b6bb6b 100644 --- a/src/parser.c +++ b/src/parser.c @@ -679,7 +679,7 @@ int parse_line(char *buf, struct parser_state *state, struct session_data *sdata strncat(puf, " ", sizeof(puf)-1); - if(strncasecmp(puf, "http://", 7) == 0 || strncasecmp(puf, "https://", 8) == 0) fixURL(puf); + if(strncasecmp(puf, "http://", 7) == 0 || strncasecmp(puf, "https://", 8) == 0) fixURL(puf, sizeof(puf)-1); if(state->is_header == 0 && strncmp(puf, "__URL__", 7) && (puf[0] == ' ' || (strlen(puf) > MAX_WORD_LEN && cfg->enable_cjk == 0) || isHexNumber(puf)) ) continue; diff --git a/src/parser.h b/src/parser.h index f9df74fd..cce3eb69 100644 --- a/src/parser.h +++ b/src/parser.h @@ -28,8 +28,8 @@ void split_email_address(char *s); int does_it_seem_like_an_email_address(char *email); void reassembleToken(char *p); void degenerateToken(unsigned char *p); -void fixURL(char *url); -int extractNameFromHeaderLine(char *s, char *name, char *resultbuf); +void fixURL(char *buf, int buflen); +void extractNameFromHeaderLine(char *s, char *name, char *resultbuf); char *determine_attachment_type(char *filename, char *type); char *get_attachment_extractor_by_filename(char *filename); void parse_reference(struct parser_state *state, char *s); diff --git a/src/parser_utils.c b/src/parser_utils.c index 46e80b9f..bc94116d 100644 --- a/src/parser_utils.c +++ b/src/parser_utils.c @@ -723,18 +723,18 @@ void degenerateToken(unsigned char *p){ } -void fixURL(char *url){ +void fixURL(char *buf, int buflen){ int len=0; char *p, *q, fixed_url[SMALLBUFSIZE]; - if(strlen(url) < 3) return; + if(strlen(buf) < 3) return; memset(fixed_url, 0, sizeof(fixed_url)); - p = url; + p = buf; - if(strncasecmp(url, "http://", 7) == 0) p += 7; - if(strncasecmp(url, "https://", 8) == 0) p += 8; + if(strncasecmp(buf, "http://", 7) == 0) p += 7; + if(strncasecmp(buf, "https://", 8) == 0) p += 8; q = strchr(p, '/'); if(q) *q = '\0'; @@ -748,12 +748,12 @@ void fixURL(char *url){ fixed_url[len-1] = '\0'; } - strcpy(url, fixed_url); + snprintf(buf, buflen, "%s", fixed_url); } -int extractNameFromHeaderLine(char *s, char *name, char *resultbuf){ - int rc=0, extended=0; +void extractNameFromHeaderLine(char *s, char *name, char *resultbuf){ + int extended=0; char buf[SMALLBUFSIZE], puf[SMALLBUFSIZE], *p, *q, *encoding; snprintf(buf, sizeof(buf)-1, "%s", s); @@ -826,11 +826,9 @@ int extractNameFromHeaderLine(char *s, char *name, char *resultbuf){ snprintf(resultbuf, TINYBUFSIZE-1, "%s", puf); } - rc = 1; } } - return rc; } diff --git a/unit_tests/Makefile.in b/unit_tests/Makefile.in new file mode 100644 index 00000000..9be77d13 --- /dev/null +++ b/unit_tests/Makefile.in @@ -0,0 +1,36 @@ +SHELL = @SHELL@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +sbindir = @sbindir@ +includedir = @includedir@ +libdir = @libdir@ +libexecdir = @libexecdir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +mandir = @mandir@ +datarootdir = @datarootdir@ +localstatedir = @localstatedir@ + +CC = @CC@ +CFLAGS = @CFLAGS@ @CPPFLAGS@ +DEFS = @defs@ +INCDIR = -I. -I.. -I../.. -I../../src -I../src @INCDIR@ @sql_includes@ +LIBDIR = -L. @LIBDIR@ @LDFLAGS@ -L../src +LIBS = @LIBS@ @sql_libs@ +RUNNING_USER = @RUNNING_USER@ +RUNNING_GROUP = `@id_bin@ -gn $(RUNNING_USER)` + +INSTALL = @INSTALL@ + +all: check_parser_utils + +check_parser_utils: check_parser_utils.c ../src/libpiler.a + $(CC) $(CFLAGS) $(INCDIR) $(DEFS) -o $@ $< -lpiler $(LIBS) $(LIBDIR) + +clean: + rm -f check_parser_utils + +distclean: clean + rm -f Makefile diff --git a/unit_tests/check_parser_utils.c b/unit_tests/check_parser_utils.c new file mode 100644 index 00000000..a1d02406 --- /dev/null +++ b/unit_tests/check_parser_utils.c @@ -0,0 +1,285 @@ +/* + * check_parser_utils.c, SJ + */ + +#include +#include +#include +#include +#include "../src/piler.h" + + +struct date_test { + char date_str[SMALLBUFSIZE]; + time_t timestamp; +}; + +struct name_from_header_test { + char line[SMALLBUFSIZE]; + char *token; + char *expected_result; +}; + +struct str_pair { + char line[SMALLBUFSIZE]; + char *expected_result; +}; + + +static void test_parse_date_header(){ + int i; + struct __config cfg; + struct date_test date_test[] = { + {"Date: Mon, 02 Nov 2015 09:39:31 -0000", 1446457171}, + {"Date: Mon, 2 Nov 2015 10:39:45 +0100", 1446457185}, + {"Date: Sun, 1 Nov 2015 17:23:07 +0100 (CET)", 1446394987}, + {"Date: 3 Nov 2015 15:19:30 +0100", 1446560370}, + {"Date: Mon, 3 Feb 2014 13:21:07 +0100", 1391430067}, + {"Date: Sat, 4 Aug 2007 13:36:52 GMT-0700", 1186256212}, + {"Date: Sat, 4 Aug 07 13:36:52 GMT-0700", 1186256212}, + {"Date: 16 Dec 07 20:45:52", 1197837952}, + {"Date: 03 Jun 06 05:59:00 +0100", 1149307140}, + {"Date: 30.06.2005 17:47:42", 1120150062}, + {"Date: 03-Feb-2014 08:09:10", 1391414950}, + {"Date: 13 Mar 2013 14:56:02 UTC", 1363186562} + }; + + cfg = read_config("test.conf"); + + setlocale(LC_MESSAGES, cfg.locale); + setlocale(LC_CTYPE, cfg.locale); + + for(i=0; i=20www.xxxxx.com=20new=20virtual=20?=", " www.xxxxx.com new virtual "}, + {"Re: FW: =?ISO-8859-2?Q?Sopron-Gy=F5r_optikai_sz=E1l_probl=E9?=", "Re: FW: Sopron-Győr optikai szál problé"}, + {"=?UTF-8?Q?Megh=C3=ADv=C3=B3=20a=20Pulzus=20felm=C3=A9r=C3=A9sre=20/=20Inv?= =?UTF-8?Q?itation=20to=20the=20Pulse=20Survey?=", "Meghívó a Pulzus felmérésre / Inv itation to the Pulse Survey"}, + {"=?iso-8859-2?Q?vhost_l=E9trehoz=E1sa?=", "vhost létrehozása"}, + {"Re: MAIL =?UTF-8?B?U1pPTEfDgUxUQVTDgVMgSElCQSAgIEdUUzogOTE1NDUyMQ==?=", "Re: MAIL SZOLGÁLTATÁS HIBA GTS: 9154521"}, + {"[spam???] Better Sex. Better Body. Better Life.", "[spam???] Better Sex. Better Body. Better Life."}, + {"1gy2tt. V3l4d. M5sk6nt", "1gy2tt. V3l4d. M5sk6nt"}, + {"=?iso-8859-2?B?03Jp4XNpIG1lZ2xlcGV06XMsIG5pbmNzIHT2YmIgbWVudHPpZyBBbWVyaWthIHN64W3hcmEgKDIwMTUuMTEuMDYuIC0gc2pAYWN0cy5odSk=?=", "Óriási meglepetés, nincs több mentség Amerika számára (2015.11.06. - sj@acts.hu)"}, + {"=?utf-8?B?Rlc6IEVtYWlsIGZvZ2Fkw6FzaSBoaWJh?=", "FW: Email fogadási hiba"}, + {"=?ISO-8859-15?Q?RE=3A_FW=3A_K=E9rd=E9s?=", "RE: FW: Kérdés"}, + {"=?iso-8859-2?Q?RE:_spam_tilt=E1s?=", "RE: spam tiltás"}, + {"Subject: Administrator has responded to your request for 'Cloud Operations", "Subject: Administrator has responded to your request for 'Cloud Operations"}, + {"Subject: =?GB2312?B?VFYgYmFjayBLSVQgc3RyaXAgcmYgcmVtb3RlIENvbnRyb2wgIFVTRDUuNS9TRVQ=?=", "Subject: TV back KIT strip rf remote Control USD5.5/SET"}, + {"Subject: =?UTF-8?Q?Ha_rossz_a_k=C3=B6z=C3=A9rzete?=", "Subject: Ha rossz a közérzete"}, + {"Subject: =?UTF-8?B?SsOhdHNzeiBhIHZpbMOhZyBsZWdixZFrZXrFsWJiIGxvdHTDs2rDoW4gSU5HWUVO?=", "Subject: Játssz a világ legbőkezűbb lottóján INGYEN"}, + {"Subject: =?UTF-8?B?w5Zua29ybcOhbnl6YXRpIGFkYXRiw6F6aXMgMiwzIEZ0IC8gZGIgw6Fyb24=?=", "Subject: Önkormányzati adatbázis 2,3 Ft / db áron"}, + {"Subject: =?UTF-8?Q?Experience=20a=20Crazy=20Reward=20Delivered=20to=20you?=", "Subject: Experience a Crazy Reward Delivered to you"}, + {"Subject: =?windows-1251?B?ze7i7uPu5O3o5SDv7uTg8OroIOTr/yDC4Pjo?=", "Subject: Новогодние подарки для Ваши"}, + {"Subject: =?utf-8?Q?Divatos,_=C3=BCde_sz=C3=ADneinek_k=C3=B6sz=C3=B6nhet=C5=91en_el?=", "Subject: Divatos, üde színeinek köszönhetően el"}, + }; + + + for(i=0; i", "From Mike D'Amaaaaa mike@aaa.fu "}, + {"From: VMware Technical Support ", "From VMware Technical Support webform@vmware.com "} + + /* + * TODO: we need many more tests here + */ + }; + + + for(i=0; i