ze-filter  (ze-filter-0.8.0-develop-180218)
ze-bfilter.c
Go to the documentation of this file.
1 /*
2  *
3  * ze-filter - Mail Server Filter for sendmail
4  *
5  * Copyright (c) 2001-2018 - Jose-Marcio Martins da Cruz
6  *
7  * Auteur : Jose Marcio Martins da Cruz
8  * jose.marcio.mc@gmail.org
9  *
10  * Historique :
11  * Creation : Thu Jun 15 13:41:01 CEST 2006
12  *
13  * This program is free software, but with restricted license :
14  *
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
19  *
20  * More details about ze-filter license can be found at ze-filter
21  * web site : http://foss.jose-marcio.org
22  */
23 
24 
25 #include <ze-sys.h>
26 #include <libze.h>
27 #include <ze-msg-score.h>
28 #include <libml.h>
29 #include <ze-filter.h>
30 
34 /* ****************************************************************************
35  * *
36  * *
37  **************************************************************************** */
38 
39 static bool bfilter_db2bf(bfilter_T * bf);
40 
41 /* ****************************************************************************
42 ** ##### ###### # # ##### ###### #####
43 ** # # # # # # # # #
44 ** ##### ##### ##### # # # ##### # #
45 ** # # # # # # # #####
46 ** # # # # # # # # #
47 ** ##### # # ###### # ###### # #
48  **************************************************************************** */
49 
50 static bfilter_T bfilter = BFILTER_INITIALIZER;
51 
52 #define BFILTER_LOCK() MUTEX_LOCK(&(bfilter.mutex))
53 #define BFILTER_UNLOCK() MUTEX_UNLOCK(&(bfilter.mutex))
54 
55 /* ****************************************************************************
56  * *
57  * *
58  **************************************************************************** */
59 bfilter_T *
61 {
62  return &bfilter;
63 }
64 
65 /* ****************************************************************************
66  * *
67  * *
68  **************************************************************************** */
69 static bool
70 bfilter_db2bf(bf)
71  bfilter_T *bf;
72 {
73  bool res = FALSE;
74 
75  char k[256];
76  char v[256];
77 
78  ASSERT(bf->signature == SIGNATURE);
79 
80  /*
81  ** fill filter data
82  ** * count of messages : spams and hams
83  ** from record msgs:total-tokens
84  */
85  memset(k, 0, sizeof (k));
86  memset(v, 0, sizeof (v));
87 
88  snprintf(k, sizeof (k), "%s:%s", "count", "msgs");
89  ZE_MessageInfo(19, "Looking for %s", k);
90  if (zeDb_GetRec(&bf->bdb, k, v, sizeof (v)))
91  {
92  int ns, nh;
93  int n;
94 
95  ZE_MessageInfo(19, " Found %s", v);
96  ns = nh = 0;
97  n = sscanf(v, "%d %d", &ns, &nh);
98  if (n < 2)
99  {
100  ZE_LogMsgWarning(0, "Error : %s %s", k, v);
101 
102  goto fin;
103  }
104  bf->nbMsgsHam = nh;
105  bf->nbMsgsSpam = ns;
106 
107  bf->kms = bf->kmh = 1.;
108  if (ns != nh)
109  {
110  if (nh == 0 || nh > ns)
111  bf->kms = (double) nh / (double) ns;
112  if (ns == 0 || nh < ns)
113  bf->kmh = (double) ns / (double) nh;
114  }
115  }
116 
117  snprintf(k, sizeof (k), "%s:%s", "count", "tokens");
118  ZE_MessageInfo(19, "Looking for %s", k);
119  if (zeDb_GetRec(&bf->bdb, k, v, sizeof (v)))
120  {
121  int ns, nh;
122  int n;
123 
124  ZE_MessageInfo(19, " Found %s", v);
125  ns = nh = 0;
126  n = sscanf(v, "%d %d", &ns, &nh);
127  if (n < 2)
128  {
129  ZE_LogMsgWarning(0, "Error : %s %s", k, v);
130 
131  goto fin;
132  }
133  bf->nbTokensHam = nh;
134  bf->nbTokensSpam = ns;
135  bf->kts = bf->kth = 1.;
136  if (ns != nh)
137  {
138  if (nh == 0 || nh > ns)
139  bf->kts = (double) nh / (double) ns;
140  if (ns == 0 || nh < ns)
141  bf->kth = (double) ns / (double) nh;
142  }
143  }
144 
145  snprintf(k, sizeof (k), "%s:%s", "count", "features");
146  ZE_MessageInfo(19, "Looking for %s", k);
147  if (zeDb_GetRec(&bf->bdb, k, v, sizeof (v)))
148  {
149  int ns, nh;
150  int n;
151 
152  ZE_MessageInfo(19, " Found %s", v);
153  ns = nh = 0;
154  n = sscanf(v, "%d %d", &ns, &nh);
155  if (n < 2)
156  {
157  ZE_LogMsgWarning(0, "Error : %s %s", k, v);
158 
159  goto fin;
160  }
161  bf->nbFeaturesHam = nh;
162  bf->nbFeaturesSpam = ns;
163  bf->kfs = bf->kfh = 1.;
164  if (ns != nh)
165  {
166  if (nh == 0 || nh > ns)
167  bf->kfs = (double) nh / (double) ns;
168  if (ns == 0 || nh < ns)
169  bf->kfh = (double) ns / (double) nh;
170  }
171  }
172 
173  memset(k, 0, sizeof (k));
174  memset(v, 0, sizeof (v));
175  snprintf(k, sizeof (k), "%s:%s", "crypt", "tokens");
176  ZE_MessageInfo(19, "Looking for %s", k);
177  if (zeDb_GetRec(&bf->bdb, k, v, sizeof (v)))
178  {
179  int code;
180 
181  ZE_MessageInfo(19, " Found %s", v);
182  code = hash_label2code(v);
183  (void) set_bfilter_db_crypt(code);
184 
185  ZE_MessageInfo(9, "Setting bayes filter encode mode to %s",
187  }
188 
189  res = TRUE;
190 
191 fin:
192  return res;
193 }
194 
195 /* ****************************************************************************
196  * *
197  * *
198  **************************************************************************** */
199 bool
201  char *dbname;
202 {
203  bool res = TRUE;
204  bfilter_T *bf = &bfilter;
205  char *env = NULL;
206 
207  ASSERT(bf->signature == SIGNATURE);
208 
209  if (bf->ok)
210  return TRUE;
211 
212  memset(bf->histo, 0, sizeof (bf->histo));
213  if (dbname != NULL)
214  {
215  if ((bf->dbname = strdup(dbname)) == NULL)
216  {
217  res = FALSE;
218  ZE_LogSysError("strdup(%s) error", dbname);
219  goto fin;
220  }
221 
222  res = zeDb_Open(&bf->bdb, NULL, dbname, 0444, TRUE, TRUE, 0);
223  if (!res)
224  goto fin;
225 
226  res = bfilter_db2bf(bf);
227  if (!res)
228  goto fin;
229  }
230 
231  env = getenv("CLASSIFIER");
232  if (env != NULL)
233  {
234  int argc;
235  char *argv[32];
236  int i;
237  char *tenv = NULL;
238 
239  tenv = strdup(env);
240  if (tenv == NULL)
241  goto err1;
242 
243  argc = zeStr2Tokens(tenv, 32, argv, "; ");
244  for (i = 0; i < argc; i++)
245  {
246  int vargc;
247  char *vargv[3];
248 
249  vargc = zeStr2Tokens(argv[i], 32, vargv, "= ");
250  if (vargc > 1)
251  {
252  if (STRCASEEQUAL(vargv[0], "TYPE"))
253  {
254 #if 0
255  if (zeStrRegex(varg[1], "^yes|true", NULL, NULL, TRUE))
256  {
257  bf->segDouble = TRUE;
258  continue;
259  }
260  if (zeStrRegex(vargv[1], "^no|false", NULL, NULL, TRUE))
261  {
262  bf->segDouble = FALSE;
263  continue;
264  }
265 #endif
266  continue;
267  }
268  if (STRCASEEQUAL(vargv[0], "FSEL"))
269  {
270 #if 0
271  if (zeStrRegex(vargv[1], "^yes|true", NULL, NULL, TRUE))
272  {
273  bf->segRecurse = TRUE;
274  continue;
275  }
276  if (zeStrRegex(varg[1], "^no|false", NULL, NULL, TRUE))
277  {
278  bf->segRecurse = FALSE;
279  continue;
280  }
281 #endif
282  continue;
283  }
284  }
285  }
286  err1:
287  FREE(tenv);
288  }
289 
290  env = getenv("SEGMENTER");
291  if (env != NULL)
292  {
293  int argc;
294  char *argv[32];
295  int i;
296  char *tenv = NULL;
297 
298  tenv = strdup(env);
299  if (tenv == NULL)
300  goto err2;
301 
302  argc = zeStr2Tokens(tenv, 32, argv, "; ");
303  for (i = 0; i < argc; i++)
304  {
305  int vargc;
306  char *vargv[3];
307 
308  vargc = zeStr2Tokens(argv[i], 32, vargv, "=: ");
309  if (vargc > 1)
310  {
311  if (STRCASEEQUAL(vargv[0], "DOUBLE"))
312  {
313  if (zeStrRegex(vargv[1], "^yes|true", NULL, NULL, TRUE))
314  {
315  bf->segDouble = TRUE;
316  continue;
317  }
318  if (zeStrRegex(vargv[1], "^no|false", NULL, NULL, TRUE))
319  {
320  bf->segDouble = FALSE;
321  continue;
322  }
323  continue;
324  }
325  if (STRCASEEQUAL(vargv[0], "RECURSE"))
326  {
327  if (zeStrRegex(vargv[1], "^yes|true", NULL, NULL, TRUE))
328  {
329  bf->segRecurse = TRUE;
330  continue;
331  }
332  if (zeStrRegex(vargv[1], "^no|false", NULL, NULL, TRUE))
333  {
334  bf->segRecurse = FALSE;
335  continue;
336  }
337  continue;
338  }
339  }
340  }
341 
342  err2:
343  FREE(tenv);
344  }
345 
346  env = getenv("TOKENIZER");
347  if (env != NULL)
348  {
349  int argc;
350  char *argv[32];
351  int i, j;
352  char *tenv = NULL;
353 
354  tenv = strdup(env);
355  if (tenv == NULL)
356  goto err3;
357 
358  argc = zeStr2Tokens(tenv, 32, argv, "; ");
359  for (i = 0; i < argc; i++)
360  {
361  int vargc;
362  char *vargv[3];
363 
364  vargc = zeStr2Tokens(argv[i], 32, vargv, "=:");
365  if (vargc > 1)
366  {
367  if (STRCASEEQUAL(vargv[0], "ENABLE"))
368  {
369  int xargc;
370  char *xargv[32];
371 
372  xargc = zeStr2Tokens(vargv[1], 32, xargv, ",");
373  for (j = 0; j < xargc; j++)
374  set_tokconf_active(xargv[j], TRUE);
375  }
376  if (STRCASEEQUAL(vargv[0], "DISABLE"))
377  {
378  int xargc;
379  char *xargv[32];
380 
381  xargc = zeStr2Tokens(vargv[1], 32, xargv, ",");
382  for (j = 0; j < xargc; j++)
383  set_tokconf_active(xargv[j], FALSE);
384  }
385  }
386  }
387  err3:
388  FREE(tenv);
389  }
390 
391  ZE_MessageInfo(18, "DOUBLE = %s", STRBOOL(bf->segDouble, "TRUE", "FALSE"));
392 
393 fin:
394 
395  bf->ok = res;
396  return res;
397 }
398 
399 /* ****************************************************************************
400  * *
401  * *
402  **************************************************************************** */
403 bool
405  bool enable;
406 {
407  bfilter_T *bf = &bfilter;
408  bool old = bf->logit;
409 
410  ASSERT(bf->signature == SIGNATURE);
411 
412  bf->logit = enable;
413  return old;
414 }
415 
416 /* ****************************************************************************
417  * *
418  * *
419  **************************************************************************** */
420 uint32_t
422  uint32_t flags;
423 {
424  bfilter_T *bf = &bfilter;
425  uint32_t old = bf->flags;
426 
427  ASSERT(bf->signature == SIGNATURE);
428 
429  bf->flags = flags;
430  return old;
431 }
432 
433 /* ****************************************************************************
434  * *
435  * *
436  **************************************************************************** */
437 bool
439  double ratio;
440 {
441  bfilter_T *bf = &bfilter;
442 
443  ASSERT(bf->signature == SIGNATURE);
444 
445  bf->rhs = ratio;
446  return TRUE;
447 }
448 
449 /* ****************************************************************************
450  * *
451  * *
452  **************************************************************************** */
453 bool
455  double ut_prob;
456 {
457  bfilter_T *bf = &bfilter;
458 
459  ASSERT(bf->signature == SIGNATURE);
460 
461  bf->ut_prob = ut_prob;
462  return TRUE;
463 }
464 
465 /* ****************************************************************************
466  * *
467  * *
468  **************************************************************************** */
469 bool
471  int nbt;
472 {
473  bfilter_T *bf = &bfilter;
474 
475  ASSERT(bf->signature == SIGNATURE);
476 
477  bf->nbt = nbt;
478  return TRUE;
479 }
480 
481 /* ****************************************************************************
482  * *
483  * *
484  **************************************************************************** */
485 bool
487  size_t msg;
488  size_t part;
489 {
490  bfilter_T *bf = &bfilter;
491 
492  ASSERT(bf->signature == SIGNATURE);
493 
494  if (msg > 0)
495  bf->maxMsgSize = msg;
496  if (part > 0)
497  bf->maxPartSize = part;
498 
499  return TRUE;
500 }
501 
502 /* ****************************************************************************
503  * *
504  * *
505  **************************************************************************** */
506 bool
508  int crypt;
509 {
510  bfilter_T *bf = &bfilter;
511 
512  ASSERT(bf->signature == SIGNATURE);
513 
514  bf->crypt = crypt;
515 
516  return TRUE;
517 }
518 
519 /* ****************************************************************************
520  * *
521  * *
522  **************************************************************************** */
523 uint32_t
525 {
526  bfilter_T *bf = &bfilter;
527 
528  ASSERT(bf->signature == SIGNATURE);
529 
530  return bf->flags;
531 }
532 
533 /* ****************************************************************************
534  * *
535  * *
536  **************************************************************************** */
537 double
539 {
540  bfilter_T *bf = &bfilter;
541 
542  ASSERT(bf->signature == SIGNATURE);
543 
544  return bf->rhs;
545 }
546 
547 /* ****************************************************************************
548  * *
549  * *
550  **************************************************************************** */
551 double
553 {
554  bfilter_T *bf = &bfilter;
555 
556  ASSERT(bf->signature == SIGNATURE);
557 
558  return bf->ut_prob;
559 }
560 
561 /* ****************************************************************************
562  * *
563  * *
564  **************************************************************************** */
565 int
567 {
568  bfilter_T *bf = &bfilter;
569 
570  ASSERT(bf->signature == SIGNATURE);
571 
572  return bf->nbt;
573 }
574 
575 /* ****************************************************************************
576  * *
577  * *
578  **************************************************************************** */
579 size_t
581 {
582  bfilter_T *bf = &bfilter;
583 
584  ASSERT(bf->signature == SIGNATURE);
585 
586 #if 0
587  if (msg > 0)
588  bf->maxMsgSize = msg;
589  if (part > 0)
590  bf->maxPartSize = part;
591 #endif
592  return 0;
593 }
594 
595 /* ****************************************************************************
596  * *
597  * *
598  **************************************************************************** */
599 int
601 {
602  bfilter_T *bf = &bfilter;
603 
604  ASSERT(bf->signature == SIGNATURE);
605 
606  return bf->crypt;
607 }
608 
609 /* ****************************************************************************
610  * *
611  * *
612  **************************************************************************** */
613 bool
615 {
616  bool res = FALSE;
617  bfilter_T *bf = &bfilter;
618 
619  ASSERT(bf->signature == SIGNATURE);
620 
621  BFILTER_LOCK();
622 #if 0
623  if (bf->ok)
624  {
625  res = TRUE;
626  goto fin;
627  }
628 #endif
629  if (bf->dbname != NULL)
630  {
631  zeDb_Close(&bf->bdb);
632 
633  res = zeDb_Open(&bf->bdb, NULL, bf->dbname, 0444, TRUE, TRUE, 0);
634  if (!res)
635  goto fin;
636 
637  res = bf->ok = bfilter_db2bf(bf);
638  }
639 
640 fin:
641  BFILTER_UNLOCK();
642 
643  return res;
644 }
645 
646 /* ****************************************************************************
647  * *
648  * *
649  **************************************************************************** */
650 bool
652 {
653  bool res = TRUE;
654  bfilter_T *bf = &bfilter;
655 
656  ASSERT(bf->signature == SIGNATURE);
657 
658  if (bf->ok)
659  {
660  if (zeDb_OK(&bf->bdb))
661  res = zeDb_Close(&bf->bdb);
662 
663  FREE(bf->dbname);
664 
665  bf->ok = FALSE;
666  }
667  return res;
668 }
669 
670 
671 /* ****************************************************************************
672  * *
673  * *
674  **************************************************************************** */
675 bool
677 {
678  bfilter_T *bf = &bfilter;
679 
680  return bf->ok;
681 }
682 
683 
684 /* ****************************************************************************
685  * *
686  * *
687  **************************************************************************** */
688 double
689 information_gain(nms, nmh, nts, nth)
690  double nms;
691  double nmh;
692  double nts;
693  double nth;
694 {
695  double p;
696  double ig = 0.;
697 
698 #define HW(x) ((x) * log((x)) + (1. - (x)) * log(1. - (x)))
699 
700 #if 0
701  ig = -HW(0.5);
702 #endif
703 
704  nts = MAX(nts, 0.5);
705  nth = MAX(nth, 0.5);
706  p = nts / (nts + nth);
707 
708 #if 1
709  ig = ((nts + nth) * (1 - HW(p))) / (nms + nmh);
710 #else
711  ig += ((nts + nth) * HW(p)) / (nms + nmh);
712 #endif
713 #if 0
714  nts = nms - nts;
715  nth = nmh - nth;
716  p = nts / (nts + nth);
717  ig += (nts + nth) * HW(p) / (nms + nmh);
718 #endif
719  return fabs(ig);
720 }
721 
722 bool
724  char *key;
725  sfilter_token_T *token;
726 {
727  bool res = FALSE;
728  char k[256];
729  char v[256];
730  bfilter_T *bf = &bfilter;
731 
732  ASSERT(bf->signature == SIGNATURE);
733 
734  if (key == NULL || strlen(key) == 0)
735  goto fin;
736 
737 #if 0
738  ASSERT(token != NULL);
739 #endif
740 
741  BFILTER_LOCK();
742  if (!zeDb_OK(&(bf->bdb)))
743  {
744  ZE_LogMsgError(0, "Bayes database not opened");
745  goto fin;
746  }
747 
748  memset(k, 0, sizeof (k));
749  memset(v, 0, sizeof (v));
750 
751  switch (bf->crypt)
752  {
753  case HASH_MD5:
754  case HASH_SHA1:
755  {
756  char buf[64];
757 
758  memset(buf, 0, sizeof (buf));
759  (void) str2hash2hex(bf->crypt, buf, key, sizeof (buf));
760  snprintf(k, sizeof (k), "%s:%s", "token", buf);
761  }
762  break;
763  default:
764  snprintf(k, sizeof (k), "%s:%s", "token", key);
765  break;
766  }
767 
768  zeStr2Lower(k);
769  ZE_MessageInfo(19, "Looking for %s", k);
770  if (zeDb_GetRec(&bf->bdb, k, v, sizeof (v)))
771  {
772  int ns, nh;
773  double dns, dnh;
774  double ks, kh = 0.;
775  double prob = UT_PROB;
776 
777  ZE_MessageInfo(19, " Found %s %s", k, v);
778  ns = nh = 0;
779  if (sscanf(v, "%d %d", &ns, &nh) < 2)
780  {
781  ZE_LogMsgWarning(0, "Error : %s %s", k, v);
782  goto fin;
783  }
784 
785  dnh = (double) nh;
786  dns = (double) ns;
787 
788  ks = kh = 1.;
789  ks = bf->kms;
790  kh = bf->kmh;
791 
792 #if 1
793 # if 1
794  prob = (ks * dns + 0.5) / (kh * dnh + ks * dns + 1.);
795 # else
796  prob = (ks * dns + 0.5) / (kh * dnh * bf->rhs + ks * dns + 1.);
797 # endif
798 #else
799  {
800  double p, q;
801  double tnm = 0.;
802 
803  tnm = kh * dnh + ks * dns;
804 
805  p = (double) (dns * bf->nbMsgsHam);
806  q = (double) (dns * bf->nbMsgsHam + bf->rhs * dnh * bf->nbMsgsSpam);
807 
808  prob = (q != 0 ? p / q : 0.5);
809  prob = (1 * UT_PROB + tnm * prob) / (1 + tnm);
810  }
811 #endif
812 
813  if (token != NULL)
814  {
815 #if 0
816  double ig = 0.;
817 
818  ig = information_gain(ks * bf->nbMsgsSpam,
819  kh * bf->nbMsgsHam, ks * dns, kh * dnh);
820  token->value = fabs(ig);
821 #else
822  token->value = fabs(prob - 0.5);
823 #endif
824 
825  token->prob = prob;
826 
827  token->nts = dns;
828  token->nth = dnh;
829 
830  token->ok = TRUE;
831  }
832  res = TRUE;
833  }
834 
835 fin:
836  BFILTER_UNLOCK();
837 
838  return res;
839 }
840 
841 /* ****************************************************************************
842  * *
843  * *
844  **************************************************************************** */
845 void
846 smodel_db_info(prefix, func, arg)
847  char *prefix;
848  smodel_db_browse_F func;
849  void *arg;
850 {
851  bfilter_T *bf = &bfilter;
852 
853  ASSERT(bf->signature == SIGNATURE);
854 
855  if (!zeDb_OK(&(bf->bdb)))
856  {
857  ZE_LogMsgError(0, "Bayes database not opened");
858  return;
859  }
860 
861  if (zeDb_CursorOpen(&(bf->bdb), TRUE))
862  {
863  char k[256], d[256];
864 
865  char *skey = STRNULL(prefix, "");
866 
867  memset(k, 0, sizeof (k));
868  memset(d, 0, sizeof (d));
869 
870  snprintf(k, sizeof (k), "%s", skey);
871 
872  if (zeDb_CursorGetFirst(&(bf->bdb), k, sizeof (k), d, sizeof (d)))
873  {
875  do
876  {
877  DB_BTREE_SEQ_CHECK(skey, NULL);
878  if (strncasecmp(k, skey, strlen(skey)) != 0)
879  break;
880  if (func != NULL)
881  func(k, d, arg);
882  } while (zeDb_CursorGetNext(&(bf->bdb), k, sizeof (k), d, sizeof (d)));
884  }
885  zeDb_CursorClose(&(bf->bdb));
886  }
887 }
888 
bool bfilter_db_reopen()
Definition: ze-bfilter.c:614
int(* smodel_db_browse_F)(void *, void *, void *)
Definition: ze-bfilter.h:174
#define MAX(a, b)
Definition: macros.h:139
#define STRBOOL(x, t, f)
Definition: macros.h:87
bool set_bfilter_nb_tokens(int nbt)
Definition: ze-bfilter.c:470
#define HASH_SHA1
Definition: ze-msg-hash.h:29
bool set_bfilter_max_sizes(size_t msg, size_t mime)
Definition: ze-bfilter.c:486
#define ASSERT(a)
Definition: macros.h:27
bfilter_T * bfilter_ptr()
Definition: ze-bfilter.c:60
bool zeDb_OK(ZEDB_T *h)
Definition: zeDb.c:649
#define FREE(x)
Definition: macros.h:37
uint32_t get_bfilter_flags()
Definition: ze-bfilter.c:524
bool logit
Definition: ze-bfilter.h:80
bool segDouble
Definition: ze-bfilter.h:83
double get_bfilter_ham_spam_ratio()
Definition: ze-bfilter.c:538
#define HASH_MD5
Definition: ze-msg-hash.h:28
bool smodel_db_check_token(char *key, sfilter_token_T *token)
Definition: ze-bfilter.c:723
#define STRNULL(x, r)
Definition: macros.h:81
size_t maxPartSize
Definition: ze-bfilter.h:78
void set_tokconf_active(char *tag, bool active)
#define FALSE
Definition: macros.h:160
#define DB_BTREE_SEQ_START()
Definition: zeDb.h:176
double information_gain(double nms, double nmh, double nts, double nth)
Definition: ze-bfilter.c:689
bool set_bfilter_unknown_token_prob(double prob)
Definition: ze-bfilter.c:454
#define ZE_LogMsgError(level,...)
Definition: zeSyslog.h:113
bool zeDb_CursorGetFirst(ZEDB_T *h, char *, size_t, void *, size_t)
Definition: zeDb.c:1041
bool zeStrRegex(char *, char *, long *, long *, bool)
Definition: zeStrings.c:544
uint32_t flags
Definition: ze-bfilter.h:75
int crypt
Definition: ze-bfilter.h:73
bool bfilter_init(char *dbname)
Definition: ze-bfilter.c:200
int zeStr2Tokens(char *, int, char **, char *)
Definition: zeStrings.c:610
#define UT_PROB
Definition: ze-bfilter.h:190
double kms
Definition: ze-bfilter.h:51
size_t get_bfilter_max_sizes()
Definition: ze-bfilter.c:580
bool bfilter_close()
Definition: ze-bfilter.c:651
double rhs
Definition: ze-bfilter.h:68
bool zeDb_Open(ZEDB_T *h, ZEDB_ENV_T *, char *, int, bool, bool, size_t)
Definition: zeDb.c:462
long nbMsgsSpam
Definition: ze-bfilter.h:48
bool str2hash2hex(int code, char *sout, char *sin, size_t szout)
Definition: ze-msg-hash.c:107
uint32_t signature
Definition: ze-bfilter.h:40
int get_bfilter_nb_tokens()
Definition: ze-bfilter.c:566
bool zeDb_Close(ZEDB_T *h)
Definition: zeDb.c:667
#define DB_BTREE_SEQ_END()
Definition: zeDb.h:196
char * hash_code2label(int code)
Definition: ze-msg-hash.c:209
bool bfilter_ok()
Definition: ze-bfilter.c:676
#define ZE_MessageInfo(level,...)
Definition: zeSyslog.h:90
bool zeDb_GetRec(ZEDB_T *h, char *, void *, size_t)
Definition: zeDb.c:791
bool set_bfilter_ham_spam_ratio(double ratio)
Definition: ze-bfilter.c:438
#define TRUE
Definition: macros.h:157
double get_bfilter_unknown_token_prob()
Definition: ze-bfilter.c:552
#define HW(x)
#define BFILTER_INITIALIZER
Definition: ze-bfilter.h:100
double ut_prob
Definition: ze-bfilter.h:69
#define ZE_LogSysError(...)
Definition: zeSyslog.h:129
long nbMsgsHam
Definition: ze-bfilter.h:49
bool zeDb_CursorOpen(ZEDB_T *h, bool)
Definition: zeDb.c:936
bool set_bfilter_logit(bool enable)
Definition: ze-bfilter.c:404
#define ZE_LogMsgWarning(level,...)
Definition: zeSyslog.h:112
#define BFILTER_LOCK()
Definition: ze-bfilter.c:52
void smodel_db_info(char *prefix, smodel_db_browse_F func, void *arg)
Definition: ze-bfilter.c:846
double kmh
Definition: ze-bfilter.h:52
int histo[BFHISTODIM]
Definition: ze-bfilter.h:88
#define DB_BTREE_SEQ_CHECK(key, dbname)
Definition: zeDb.h:182
char * zeStr2Lower(char *)
Definition: zeStrings.c:295
bool zeDb_CursorClose(ZEDB_T *h)
Definition: zeDb.c:991
#define STRCASEEQUAL(a, b)
Definition: macros.h:72
char * dbname
Definition: ze-bfilter.h:45
ZEDB_T bdb
Definition: ze-bfilter.h:44
bool set_bfilter_db_crypt(int crypt)
Definition: ze-bfilter.c:507
uint32_t set_bfilter_flags(uint32_t flags)
Definition: ze-bfilter.c:421
bool ok
Definition: ze-bfilter.h:41
#define BFILTER_UNLOCK()
Definition: ze-bfilter.c:53
bool segRecurse
Definition: ze-bfilter.h:82
#define SIGNATURE
Definition: ze-libjc.h:75
int hash_label2code(char *label)
Definition: ze-msg-hash.c:189
long uint32_t
Definition: ze-sys.h:489
size_t maxMsgSize
Definition: ze-bfilter.h:77
int msg[MAX_SCORE+2]
Definition: ze-stats.c:41
bool zeDb_CursorGetNext(ZEDB_T *h, char *, size_t, void *, size_t)
Definition: zeDb.c:1116
int get_bfilter_db_crypt()
Definition: ze-bfilter.c:600