ze-filter  (ze-filter-0.8.0-develop-180218)
ze-policy-lookup.c
Go to the documentation of this file.
1 
2 /*
3  *
4  * ze-filter - Mail Server Filter for sendmail
5  *
6  * Copyright (c) 2001-2018 - Jose-Marcio Martins da Cruz
7  *
8  * Auteur : Jose Marcio Martins da Cruz
9  * jose.marcio.mc@gmail.org
10  *
11  * Historique :
12  * Creation : janvier 2002
13  *
14  * This program is free software, but with restricted license :
15  *
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20  *
21  * More details about ze-filter license can be found at ze-filter
22  * web site : http://foss.jose-marcio.org
23  */
24 
25 #include <ze-sys.h>
26 #include <ze-filter.h>
27 
28 void
29 usage(arg)
30  char *arg;
31 {
32  char *tprefix, *kprefix, *ip, *name, *from, *to, *key;
33 
34  tprefix = "GreyCheck";;
35  kprefix = "NetClass";
36 
37  ip = "10.3.5.5";
38  name = "minho.ensmp.fr";
39  from = "root@domain.com";
40  to = "joe@domain.com";
41  key = "10.3.5.5";
42 
43  printf("Usage : %s options\n"
44  " -t : prefix + triplet (default is prefix + key)\n"
45  " -P prefix : e.g. -P %s\n"
46  " -K key : e.g. -K %s\n"
47  " -I address : e.g. -I %s\n"
48  " -H hostname : e.g. -H %s\n"
49  " -F from : e.g. -F %s\n"
50  " -T to : e.g. -T %s\n"
51  " -v : increase log level\n"
52  " -h : help - this message\n"
53  "\n"
54  " Sample queries : \n"
55  " %s -t -P %s -I %s -H %s -F %s -T %s\n"
56  " %s -P %s -K %s\n"
57  "\n"
58  " %s\n" " Compiled on %s\n",
59  arg,
60  tprefix, key, ip, name, from, to,
61  arg, tprefix, ip, name, from, to,
62  arg, kprefix, key, PACKAGE, __DATE__ " " __TIME__);
63 }
64 
65 static void HandleStdin();
66 
67 int
68 main(argc, argv)
69  int argc;
70  char **argv;
71 {
72  int res = 0;
73  extern int ze_logLevel;
74 
75  char *prefix, *ip, *name, *from, *to, *key;
76  int netclass = NET_UNKNOWN;
77  bool triplet = FALSE;
78  bool fromStdin = FALSE;
79 
80  prefix = "ContentCheck";
81  ip = "0.0.0.0";
82  name = "localhost";
83  from = "nobody@localhost";
84  to = "nobody@localdomain";
85  key = "0.0.0.0";
86 
87  configure("ze-policy-lookup", conf_file, FALSE);
88 
90  ze_logLevel = 10;
91 
92  {
93  const char *args = "P:K:I:H:F:T:htvs";
94  int c;
95 
96  while ((c = getopt(argc, argv, args)) != -1) {
97  switch (c) {
98  case 'h':
99  usage(argv[0]);
100  exit(0);
101  break;
102  case 'P':
103  prefix = optarg;
104  break;
105  case 'K':
106  key = optarg;
107  break;
108  case 'I':
109  ip = optarg;
110  break;
111  case 'H':
112  name = optarg;
113  break;
114  case 'F':
115  from = optarg;
116  break;
117  case 'T':
118  to = optarg;
119  break;
120  case 't':
121  triplet = !triplet;
122  break;
123  case 's':
124  fromStdin = TRUE;
125  break;
126  case 'v':
127  ze_logLevel++;
128  break;
129  case 'l':
130  break;
131  default:
132  exit(0);
133  break;
134  }
135  }
136  }
137 
138  if (!policy_init()) {
139  ZE_MessageInfo(0, "Error opening policy database !");
140  exit(1);
141  }
142 
143  if (fromStdin) {
144  HandleStdin();
145  goto end;
146  }
147 
148  if (triplet) {
149  bool flag;
150  char class[256];
151 
152  memset(class, 0, sizeof (class));
153  netclass = GetClientNetClass(ip, name, NULL, class, sizeof (class));
154 
155  if (strlen(class) == 0)
156  strlcpy(class, NET_CLASS_LABEL(netclass), sizeof (class));
157  ZE_MessageInfo(0, "Client IP address : %s", ip);
158  ZE_MessageInfo(0, "Client hostname : %s", name);
159  ZE_MessageInfo(0, "Sender : %s", from);
160  ZE_MessageInfo(0, "Recipient : %s", to);
161  ZE_MessageInfo(0, "Client NET class : %02X %s", netclass, class);
162  ZE_MessageInfo(0, "");
163  ZE_MessageInfo(0, "Checking = %s %s %s %s %s", prefix, ip, name, from, to);
164  flag = check_policy_tuple(prefix, ip, name, class, from, to, TRUE);
165  ZE_MessageInfo(0, "RESULT = %s", STRBOOL(flag, "YES", "NO"));
166 
167  goto end;
168  }
169 
170  {
171  bool flag;
172  char buf[256];
173 
174  ZE_MessageInfo(0, "Checking = %s %s", prefix, key);
175  memset(buf, 0, sizeof (buf));
176  flag = check_policy(prefix, key, buf, sizeof (buf), TRUE);
177  ZE_MessageInfo(0, "RESULT = %s - %s", buf, STRBOOL(flag, "YES", "NO"));
178  }
179 
180 end:
181  policy_close();
182 
183  return 0;
184 }
185 
186 void
187 HandleStdin()
188 {
189  char buf[1024], args[1024];
190 
191  setenv("SHOWLOOKUP", "YES", FALSE);
192  for (memset(buf, 0, sizeof (buf)); fgets(buf, sizeof (buf), stdin) != NULL;
193  memset(buf, 0, sizeof (buf))) {
194  char *argv[32];
195  int argc;
196  bool ok = FALSE;
197  char *pBuf;
198 
199  zeStrChomp(buf);
200 
201  pBuf = buf;
202  pBuf += strspn(pBuf, " ");
203  if (*pBuf == '#')
204  continue;
205 
206  strlcpy(args, pBuf, sizeof (args));
207  argc = zeStr2Tokens(pBuf, 32, argv, " ");
208  if (argc > 0) {
209  if (STRCASEEQUAL(argv[0], "quit"))
210  break;
211 
212  if (STRCASEEQUAL(argv[0], "Email")) {
213  char eMail[256];
214 
215  extract_email_address(eMail, argv[2], sizeof (eMail));
216  if (strlen(eMail) == 0)
217  strlcpy(eMail, "nullsender", sizeof (eMail));
218  ZE_MessageInfo(0, "====== %s", args);
219  ok = PolicyLookupEmailAddr(argv[1], eMail, buf, sizeof (buf));
220  ZE_MessageInfo(0, " -> Result : %-5s : %s", (ok ? "OK" : "--"),
221  (ok ? buf : ""));
222  ZE_MessageInfo(0, "");
223  continue;
224  }
225 
226  if (STRCASEEQUAL(argv[0], "Client")) {
227  netclass_T nClass;
228 
229  memset(&nClass, 0, sizeof (nClass));
230  if (argv[4] != NULL && strlen(argv[4]) > 0) {
231  strlcpy(nClass.label, argv[4], sizeof (nClass.label));
232  nClass.ok = TRUE;
233  }
234  ZE_MessageInfo(0, "====== %s", args);
235  ok =
236  PolicyLookupClient(argv[1], argv[2], argv[3], &nClass, buf,
237  sizeof (buf));
238  ZE_MessageInfo(0, " -> Result : %-5s : %s", (ok ? "OK" : "--"),
239  (ok ? buf : ""));
240  ZE_MessageInfo(0, "");
241  continue;
242  }
243 
244  if (STRCASEEQUAL(argv[0], "NetClass")) {
245  netclass_T nClass;
246 
247  memset(&nClass, 0, sizeof (nClass));
248 
249  ZE_MessageInfo(0, "====== %s", args);
250  ok = PolicyLookupNetClass(argv[1], argv[2], &nClass, buf, sizeof (buf));
251  ZE_MessageInfo(0, " -> Result : %-5s : %s %s", (ok ? "OK" : "--"),
252  (ok ? nClass.label : ""), (ok ? nClass.equiv : ""));
253  ZE_MessageInfo(0, "");
254  continue;
255  }
256 
257  if (STRCASEEQUAL(argv[0], "Access")) {
258  char *addr = NULL, *from = NULL, *to = NULL;
259  char *s = "OK";
260 
261  ZE_MessageInfo(0, "====== %s", args);
262  if (argc < 4) {
263  ZE_MessageInfo(0, " Not enough arguments");
264  continue;
265  }
266  if (!STRCASEEQUAL(argv[1], "null"))
267  addr = argv[1];
268  if (!STRCASEEQUAL(argv[2], "null"))
269  from = argv[2];
270  if (!STRCASEEQUAL(argv[3], "null"))
271  to = argv[3];
272  ok = AccessLookup(addr, from, to);
273  switch (ok) {
274  case 0:
275  s = "OK";
276  break;
277  case 1:
278  s = "TEMPFAIL";
279  break;
280  case 2:
281  s = "REJECT";
282  break;
283  }
284  ZE_MessageInfo(0, " -> Result : %d %s", ok, s);
285  ZE_MessageInfo(0, "");
286  continue;
287  }
288 
289  }
290 
291  }
292 
293 }
char equiv[32]
Definition: ze-netclass.h:73
#define STRBOOL(x, t, f)
Definition: macros.h:87
bool policy_close()
Definition: ze-policy.c:702
bool check_policy(char *prefix, char *key, char *buf, size_t size, bool cdef)
Definition: ze-policy.c:119
bool PolicyLookupEmailAddr(char *prefix, char *key, char *buf, size_t size)
Definition: zePolicy.c:230
int ze_logLevel
Definition: zeSyslog.c:34
bool ok
Definition: ze-connopen.c:59
#define NET_UNKNOWN
Definition: ze-netclass.h:31
int GetClientNetClass(char *ip, char *name, netclass_T *class, char *label, size_t sz)
Definition: ze-netclass.c:49
void zeLog_SetOutput(bool, bool)
Definition: zeSyslog.c:490
#define FALSE
Definition: macros.h:160
#define strlcpy
Definition: zeString.h:32
char * extract_email_address(char *, char *, size_t)
char * zeStrChomp(char *)
Definition: zeStrings.c:501
int zeStr2Tokens(char *, int, char **, char *)
Definition: zeStrings.c:610
bool policy_init()
Definition: ze-policy.c:692
bool PolicyLookupNetClass(char *addr, char *name, netclass_T *class, char *buf, size_t size)
Definition: zePolicy.c:215
int AccessLookup(char *addr, char *from, char *to)
Definition: zeAccess.c:48
bool PolicyLookupClient(char *prefix, char *addr, char *name, netclass_T *netClass, char *buf, size_t size)
Definition: zePolicy.c:86
#define ZE_MessageInfo(level,...)
Definition: zeSyslog.h:90
#define TRUE
Definition: macros.h:157
char * conf_file
Definition: ze-cf.c:38
void usage(char *arg)
int configure(char *, char *, bool)
Definition: ze-cf.c:1203
#define PACKAGE
Definition: version.h:28
#define STRCASEEQUAL(a, b)
Definition: macros.h:72
char label[32]
Definition: ze-netclass.h:72
#define NET_CLASS_LABEL(class)
Definition: ze-netclass.h:57
bool check_policy_tuple(char *prefix, char *ip, char *name, char *netclass, char *from, char *to, bool result)
Definition: ze-policy.c:277
int main(int argc, char **argv)