31 #define LOG_REGEX_IP 1 33 #define REGEX_MAX_LEN 256 35 #define REGCOMP_FLAGS (REG_ICASE | REG_NEWLINE | REG_EXTENDED) 38 #define ZE_PCRE_FLAGS (PCRE_CASELESS | PCRE_DOTALL) 40 #define ZE_PCRE_FLAGS (PCRE_CASELESS | PCRE_DOTALL) 44 static bool use_pcre =
TRUE;
46 static bool use_pcre =
FALSE;
60 #define PMATCH_LOCK() MUTEX_LOCK(&p.match.mutex) 61 #define PMATCH_UNLOCK() MUTEX_UNLOCK(&p.match.mutex) 88 static pthread_mutex_t st_mutex = PTHREAD_MUTEX_INITIALIZER;
90 #define DATA_LOCK() MUTEX_LOCK(&st_mutex) 91 #define DATA_UNLOCK() MUTEX_UNLOCK(&st_mutex) 93 static int db_rurlbl_check(
char *,
char *,
char *,
size_t,
char *,
96 static char *ChompDomainName(
char *);
107 printf(
"*** Regular Expressions lookup table : \n");
109 printf(
" ** WHERE : SCORE - Regular Expression\n");
121 add_regex_rec(vk, vv)
125 char *k = (
char *) vk;
126 char *v = (
char *) vv;
130 memset(&r, 0,
sizeof (r));
131 if (k == NULL || strlen(k) == 0)
133 if (v == NULL || strlen(v) == 0)
137 if (strcasecmp(v,
"SUBJECT") == 0)
139 if (strcasecmp(v,
"BODY") == 0)
141 if (strcasecmp(v,
"HEADERS") == 0)
143 if (strcasecmp(v,
"FROM") == 0)
145 if (strcasecmp(v,
"URLSTR") == 0)
147 if (strcasecmp(v,
"URLEXPR") == 0)
149 if (strcasecmp(v,
"HELO") == 0)
151 if (strcasecmp(v,
"EHLO") == 0)
153 if (strcasecmp(v,
"ANYWHERE") == 0)
158 if ((i = strspn(k,
"0123456789")) == (j = strcspn(k,
" \t"))) {
165 r.
score = strtol(k, (
char **) NULL, 10);
166 if (errno == ERANGE || errno == EINVAL)
171 k += strspn(k,
"01234567890");
172 k += strspn(k,
" \t");
184 regerror(r.
re_ok, &r.
re, str, sizeof (str));
190 const char *errptr = NULL;
197 errptr != NULL ? errptr :
"(NULL)");
203 errptr != NULL ? errptr :
"(NULL)");
220 clear_compiled_regex()
263 static bool htbl_ok =
FALSE;
268 if (htbl_ok ==
FALSE) {
269 memset(&htbl, 0,
sizeof (htbl));
276 clear_compiled_regex();
292 #define DIM_VECTOR (3 * 32) 306 if (
msg == NULL || strlen(
msg) == 0)
319 if ((q->
where & where) != 0) {
326 const char *errptr = NULL;
333 errptr != NULL ? errptr :
"(NULL)");
349 if (strlen(ptr) == 0)
364 if (result >= score_min)
379 "use_pcre set, but ze-filter wasn't compiled with lib pcre");
389 regerror(q->
re_ok, &q->
re, str, sizeof (str));
394 while (regexec(&q->
re, ptr, (
size_t) 1, &rm, 0) == 0) {
402 if (result >= score_min)
407 if ((nb > 0) && (result > 0))
409 if (result >= score_min)
435 #define DBBL_RESOLVE 2 436 #define DBBL_ORIGIN 3 439 #define URL_DOMAIN_EXPRESSION "http[s]?://[^ /<>\\(\\)\"\'?]*" 440 #define URL_FULL_EXPRESSION "http[s]?://[^ <>\"\']*" 453 if (
msg == NULL || strlen(
msg) == 0)
472 size_t size = pf - pi + 16;
474 bool alreadydone =
FALSE;
475 char *dirurl, *revurl;
477 bool url_found =
FALSE;
479 dirurl = revurl = NULL;
483 if ((buf = (
char *) malloc(size)) == NULL) {
488 memset(buf, 0, size);
489 memcpy(buf, p + pi, pf - pi);
513 for (q = r = buf; *q !=
'\0'; q++) {
514 if (
strchr(
" \t\n\r", *q) == NULL)
519 ChompDomainName(buf);
547 for (q = revurl; *q !=
'\0'; q++) {
548 if ((*q >=
'A') && (*q <=
'Z'))
550 if ((*q >=
'a') && (*q <=
'z'))
552 if ((*q >=
'0') && (*q <=
'9'))
554 if (
strchr(
".-", *q) != NULL)
588 if (strncasecmp(revurl, sb, strlen(sb)) == 0) {
595 if (url_found && (q->
score > 0))
604 if (url_found || result >= score_min)
616 if (dirurl != NULL) {
625 memset(urlbl, 0,
sizeof (urlbl));
626 size = strlen(dirurl) + 1 + 16;
627 dest = (
char *) malloc(size);
629 memset(dest, 0, size);
631 if ((v = db_rurlbl_check(
id, dirurl, dest, size, urlbl,
632 sizeof (urlbl))) > 0) {
643 if (url_found || result >= score_min)
649 if (dirurl != NULL) {
656 memset(&rbl, 0,
sizeof (rbl));
661 if (p != NULL && *p !=
'\0')
675 snprintf(buf,
sizeof (buf),
"DNSURLBL:%s",
STREMPTY(rbl.
bl,
""));
678 id, dirurl, rbl.
score, rbl.
bl);
684 if (url_found || result >= score_min)
694 if (result >= score_min)
703 if (result < score_min) {
709 size_t size = pf - pi + 16;
712 if ((buf = (
char *) malloc(size)) != NULL) {
716 memset(buf, 0, size);
717 memcpy(buf, p + pi, pf - pi);
749 if (found && (q->
score > 0))
753 if (found || result >= score_min)
770 char *env = getenv(
"URLBL_TIMING");
772 if (n < 500 && env != NULL && strcasecmp(env,
"yes") == 0) {
775 ZE_MessageInfo(9,
"%s URLBL total handling time = %ld ms (%ld)",
id, dt,
801 memset(dbpath, 0,
sizeof (dbpath));
806 if (cfdir == NULL || strlen(cfdir) == 0)
848 memset(dbpath, 0,
sizeof (dbpath));
853 if (cfdir == NULL || strlen(cfdir) == 0)
873 return db_open_rurbl_database();
877 #define MAX_DB_ERROR 16 880 db_rurlbl_check(
id, url, dest, size, urlbl, szurlbl)
888 char key[256], value[256];
890 static int db_error = 0;
892 if ((url == NULL) || (strlen(url) == 0))
913 if ((p = strdup(url)) != NULL) {
916 bool isIPAddr =
FALSE;
920 while (strlen(q) > 0) {
921 snprintf(key,
sizeof (key),
"URLBL:%s", q);
924 if (
zeDb_GetRec(&hdb, key, value,
sizeof (value))) {
925 char *r =
strchr(key,
':');
949 snprintf(urlbl, szurlbl,
"DBURLBL:%s", fields[
DBBL_ORIGIN]);
958 if ((q =
strchr(q,
'.')) == NULL)
964 if ((r =
strrchr(q,
'.')) == NULL)
1000 if ((s == NULL) || (strlen(s) == 0))
1005 while ((n = strlen(s)) > 0) {
1006 char c = tolower(s[n - 1]);
1008 if ((c >=
'a') && (c <=
'z'))
1010 if ((c >=
'0') && (c <=
'9'))
int check_regex(char *id, char *ip, char *msg, int where)
LISTR_T * zeLinkedList_Add(LISTR_T *, char *, int, void *, size_t)
bool zeDb_Unlock(ZEDB_T *h)
Database unlock.
bool zeLinkedList_Clear(LISTR_T *, LISTCLEAR_F)
char revex[REGEX_MAX_LEN]
#define ZE_LogMsgInfo(level,...)
int check_rurlbl(char *id, char *ip, char *msg)
#define ZE_LogMsgError(level,...)
#define ADJUST_FILENAME(path, fname, cfdir, defval)
void * zeTable_Get_Next_Ptr(zeTbl_T *)
bool zeStrRegex(char *, char *, long *, long *, bool)
bool db_open_rurlbl_database()
void * zeTable_Get_First_Ptr(zeTbl_T *)
int zeStr2Tokens(char *, int, char **, char *)
bool load_regex_table(char *cfdir, char *fname)
bool read_conf_data_file(char *cfdir, char *fname, char *dfile, read_conf_data_file_F func)
#define JTABLE_INITIALIZER
bool zeDb_Open(ZEDB_T *h, ZEDB_ENV_T *, char *, int, bool, bool, size_t)
int zeTable_Clear(zeTbl_T *)
#define ZE_MessageNotice(level,...)
bool zeDb_Close(ZEDB_T *h)
int zeTable_Add(zeTbl_T *, void *)
int zm_RdTextFile(char *, int, int, char *, int(*)(void *, void *))
int zeTable_Get_First(zeTbl_T *, void *)
char * zeStrDupRev(char *)
uint32_t check_urlbl_table(char *id, char *name, urlbl_T *bl)
#define URL_DOMAIN_EXPRESSION
#define ZE_MessageInfo(level,...)
bool zeDb_GetRec(ZEDB_T *h, char *, void *, size_t)
int zeStrCountChar(char *, int)
bool log_found_regex(char *, char *, char *, int, int, char *)
#define ZE_LogSysError(...)
char * cf_get_str(int id)
int zeTable_Get_Next(zeTbl_T *, void *)
#define URL_FULL_EXPRESSION
#define ZE_LogMsgWarning(level,...)
LISTR_T * zeLinkedList_Find(LISTR_T *, char *)
int zeTable_Init(zeTbl_T *, size_t, int, int(*)(const void *, const void *))
#define CF_REGEX_MAX_SCORE
char * zeStr2Lower(char *)
bool db_close_rurbl_database()
bool db_reopen_rurlbl_database()
char regex[REGEX_MAX_LEN]
bool zeDb_Lock(ZEDB_T *h)
Database lock.