ze-filter  (ze-filter-0.8.0-develop-180218)
ze-headers.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 
27 #include "ze-headers.h"
28 #include "ze-filter.h"
29 
30 
31 /* ****************************************************************************
32  * *
33  * *
34  **************************************************************************** */
35 bool
36 add_to_msgheader_list(head, attr, value)
37  header_T **head;
38  char *attr;
39  char *value;
40 {
41  header_T *p = NULL;
42  bool res = TRUE;
43 
44  if ((head == NULL) || (attr == NULL) || (value == NULL))
45  return FALSE;
46 
47  if (strlen(attr) == 0)
48  return FALSE;
49 
50  if ((p = (header_T *) malloc(sizeof (header_T))) == NULL) {
51  ZE_LogSysError("malloc header_T error");
52  return FALSE;
53  }
54  memset(p, 0, sizeof (header_T));
55 
56  if (attr != NULL) {
57  p->attr = strdup(attr);
58  if (p->attr == NULL) {
59  ZE_LogSysError("strdup(attr) error");
60  res = FALSE;
61  }
62  } else
63  p->attr = attr;
64 
65  if (value != NULL) {
66  p->value = strdup(value);
67  if (p->value == NULL) {
68  ZE_LogSysError("strdup(value) error");
69  res = FALSE;
70  }
71  } else
72  p->value = value;
73 
74  if (res) {
75  p->next = *head;
76  *head = p;
77  } else {
78  FREE(p->attr);
79  FREE(p->value);
80  FREE(p);
81  }
82 
83  ZE_MessageInfo(19, "Adding %s : %s (res = %d)", attr, value, res);
84 
85  return res;
86 }
87 
88 /* ****************************************************************************
89  * *
90  * *
91  **************************************************************************** */
92 header_T *
94  header_T *head;
95 {
96  if (head == NULL)
97  return NULL;
98 
99  while (head != NULL) {
100  header_T *p = head;
101 
102  head = p->next;
103 
104  FREE(p->attr);
105  FREE(p->value);
106  FREE(p);
107  }
108  return head;
109 }
110 
111 /* ****************************************************************************
112  * *
113  * *
114  **************************************************************************** */
115 int
117  header_T *head;
118  char *attr;
119 {
120  int nb = 0;
121  header_T *p;
122 
123  if ((head == NULL) || (attr == NULL))
124  return 0;
125 
126  for (p = head; p != NULL; p = p->next) {
127  if (strlen(attr) == 0) {
128  nb++;
129  continue;
130  }
131  if (p->attr == NULL)
132  continue;
133  if (strcasecmp(p->attr, attr) == 0)
134  nb++;
135  }
136  return nb;
137 }
138 
139 /* ****************************************************************************
140  * *
141  * *
142  **************************************************************************** */
143 header_T *
144 get_msgheader(head, attr)
145  header_T *head;
146  char *attr;
147 {
148  header_T *p;
149 
150  if (head == NULL)
151  return head;
152 
153  if ((attr == NULL) || (strlen(attr) == 0))
154  return head;
155 
156  ZE_LogMsgInfo(19, "Looking for ATTR = %s %s", attr,
157  (head == NULL ? "NULL" : "NOTNULL"));
158 
159  for (p = head; p != NULL; p = p->next) {
160  if (p->attr == NULL)
161  continue;
162 
163  ZE_MessageInfo(19, "ATTR = %-32s %s ", attr, p->attr);
164  if (strcasecmp(attr, p->attr) == 0)
165  return p;
166  }
167  return NULL;
168 }
169 
170 /* ****************************************************************************
171  * *
172  * *
173  **************************************************************************** */
174 header_T *
176  header_T *head;
177  char *attr;
178 {
179  if (head == NULL)
180  return NULL;
181 
182  head = head->next;
183  return get_msgheader(head, attr);
184 }
185 
186 /* ****************************************************************************
187  * *
188  * *
189  **************************************************************************** */
190 int
192  header_T *head;
193  char *attr;
194 {
195  header_T *p;
196  int i = -1;
197 
198  if ((attr == NULL) || (strlen(attr) == 0))
199  return i;
200 
201  ZE_LogMsgInfo(19, "Looking for ATTR = %s %s", attr,
202  (head == NULL ? "NULL" : "NOTNULL"));
203 
204  for (p = head; p != NULL; p = p->next) {
205  i++;
206  if (p->attr == NULL)
207  continue;
208 
209  ZE_MessageInfo(19, "ATTR = %-32s %s ", attr, p->attr);
210  if (strcasecmp(attr, p->attr) == 0)
211  return i;
212  }
213  return -1;
214 }
215 
216 /* ****************************************************************************
217  * *
218  * *
219  **************************************************************************** */
220 header_T *
221 get_msgheader_index_2(head, attr, index)
222  header_T *head;
223  char *attr;
224  int index;
225 {
226  header_T *p;
227  int i = 0;
228 
229  if ((attr == NULL) || (strlen(attr) == 0))
230  return NULL;
231 
232  ZE_LogMsgInfo(19, "Looking for ATTR = %s %s", attr,
233  (head == NULL ? "NULL" : "NOTNULL"));
234 
235  for (p = head; p != NULL; p = p->next) {
236  if (p->attr == NULL)
237  continue;
238 
239  ZE_MessageInfo(19, "ATTR = %-32s %s ", attr, p->attr);
240  if (strcasecmp(attr, p->attr) == 0) {
241  i++;
242  if (i == index)
243  return p;
244  }
245  }
246  return NULL;
247 }
248 
249 /* ****************************************************************************
250  * *
251  * *
252  **************************************************************************** */
253 #ifdef TSPECIALS
254 #undef TSPECIALS
255 #endif
256 
257 #define TSPECIALS "<>@,;:\\/[]?=\" \t\r\n"
258 
259 bool
260 get_msgheader_attribute(header, attr, value, size)
261  header_T *header;
262  char *attr;
263  char *value;
264  size_t size;
265 {
266  long pf;
267  int n = 0;
268  char *p;
269 
270  if ((header == NULL) || (attr == NULL))
271  return FALSE;
272 
273  if (header->value == NULL)
274  return FALSE;
275 
276  ZE_MessageInfo(15, "Looking for %s, in %s = %s", attr,
277  STRNULL(header->attr, "ATTR"), header->value);
278 
279  if (!zeStrRegex(header->value, attr, NULL, &pf, TRUE))
280  return FALSE;
281 
282  p = header->value + pf;
283 
284  if (*p == '=')
285  p++;
286 
287  if (strlen(p) == 0)
288  return FALSE;
289 
290  if (*p == '\"') {
291  p++;
292  n = strcspn(p, "\"\t\r\n");
293  } else
294  n = strcspn(p, TSPECIALS);
295 
296  if ((value == NULL) || (size == 0))
297  return TRUE;
298 
299 #if 1
300  zeSafeStrnCat(value, size, p, n);
301 #else
302  strlcpy(value, p, size);
303 #endif
304 
305  ZE_MessageInfo(15, "FOUND ! %s = %s", attr, value);
306 
307  return TRUE;
308 }
header_T * get_msgheader_index_2(header_T *head, char *attr, int index)
Definition: ze-headers.c:221
header_T * get_msgheader(header_T *head, char *attr)
Definition: ze-headers.c:144
#define FREE(x)
Definition: macros.h:37
#define STRNULL(x, r)
Definition: macros.h:81
#define ZE_LogMsgInfo(level,...)
Definition: zeSyslog.h:110
#define FALSE
Definition: macros.h:160
#define strlcpy
Definition: zeString.h:32
bool zeStrRegex(char *, char *, long *, long *, bool)
Definition: zeStrings.c:544
bool get_msgheader_attribute(header_T *header, char *attr, char *value, size_t size)
Definition: ze-headers.c:260
char * value
Definition: ze-headers.h:36
#define ZE_MessageInfo(level,...)
Definition: zeSyslog.h:90
int nb
Definition: ze-connopen.c:61
bool add_to_msgheader_list(header_T **head, char *attr, char *value)
Definition: ze-headers.c:36
#define TRUE
Definition: macros.h:157
int zeSafeStrnCat(char *, size_t, char *, size_t)
Definition: zeStrings.c:107
#define ZE_LogSysError(...)
Definition: zeSyslog.h:129
char * attr
Definition: ze-headers.h:35
header_T * next
Definition: ze-headers.h:37
header_T * clear_msgheader_list(header_T *head)
Definition: ze-headers.c:93
int count_msgheader_attr(header_T *head, char *attr)
Definition: ze-headers.c:116
int get_msgheader_index(header_T *head, char *attr)
Definition: ze-headers.c:191
#define TSPECIALS
Definition: ze-headers.c:257
header_T * get_msgheader_next(header_T *head, char *attr)
Definition: ze-headers.c:175