new upstream release (3.3.0); modify package compatibility for Stretch
[ossec-hids.git] / src / config / email-alerts-config.c
1 /* Copyright (C) 2009 Trend Micro Inc.
2  * All right reserved.
3  *
4  * This program is a free software; you can redistribute it
5  * and/or modify it under the terms of the GNU General Public
6  * License (version 2) as published by the FSF - Free Software
7  * Foundation
8  */
9
10 #include "shared.h"
11 #include "mail-config.h"
12 #include "config.h"
13
14
15 int Read_EmailAlerts(XML_NODE node, __attribute__((unused)) void *configp, void *mailp)
16 {
17     int i = 0;
18     unsigned int granto_size = 0;
19
20     /* XML definitions */
21     const char *xml_email_to = "email_to";
22     const char *xml_email_format = "format";
23     const char *xml_email_level = "level";
24     const char *xml_email_id = "rule_id";
25     const char *xml_email_group = "group";
26     const char *xml_email_location = "event_location";
27     const char *xml_email_donotdelay = "do_not_delay";
28     const char *xml_email_donotgroup = "do_not_group";
29
30     MailConfig *Mail;
31
32     Mail = (MailConfig *)mailp;
33     if (!Mail) {
34         return (0);
35     }
36
37     /* Get Granular mail_to size */
38     if (Mail && Mail->gran_to) {
39         char **ww;
40         ww = Mail->gran_to;
41         while (*ww != NULL) {
42             ww++;
43             granto_size++;
44         }
45     }
46
47     if (Mail) {
48         os_realloc(Mail->gran_to,
49                    sizeof(char *) * (granto_size + 2), Mail->gran_to);
50         os_realloc(Mail->gran_id,
51                    sizeof(unsigned int *) * (granto_size + 2), Mail->gran_id);
52         os_realloc(Mail->gran_level,
53                    sizeof(unsigned int) * (granto_size + 2), Mail->gran_level);
54         os_realloc(Mail->gran_set,
55                    sizeof(int) * (granto_size + 2), Mail->gran_set);
56         os_realloc(Mail->gran_format,
57                    sizeof(int) * (granto_size + 2), Mail->gran_format);
58         os_realloc(Mail->gran_location,
59                    sizeof(OSMatch *) * (granto_size + 2), Mail->gran_location);
60         os_realloc(Mail->gran_group,
61                    sizeof(OSMatch *) * (granto_size + 2), Mail->gran_group);
62
63         Mail->gran_to[granto_size] = NULL;
64         Mail->gran_to[granto_size + 1] = NULL;
65
66         Mail->gran_id[granto_size] = NULL;
67         Mail->gran_id[granto_size + 1] = NULL;
68
69         Mail->gran_location[granto_size] = NULL;
70         Mail->gran_location[granto_size + 1] = NULL;
71
72         Mail->gran_group[granto_size] = NULL;
73         Mail->gran_group[granto_size + 1] = NULL;
74
75         Mail->gran_level[granto_size] = 0;
76         Mail->gran_level[granto_size + 1] = 0;
77
78         Mail->gran_format[granto_size] = FULL_FORMAT;
79         Mail->gran_format[granto_size + 1] = FULL_FORMAT;
80
81         Mail->gran_set[granto_size] = 0;
82         Mail->gran_set[granto_size + 1] = 0;
83     }
84
85     while (node[i]) {
86         if (!node[i]->element) {
87             merror(XML_ELEMNULL, __local_name);
88             return (OS_INVALID);
89         } else if (!node[i]->content) {
90             merror(XML_VALUENULL, __local_name, node[i]->element);
91             return (OS_INVALID);
92         }
93         /* Mail notification */
94         else if (strcmp(node[i]->element, xml_email_level) == 0) {
95             if (!OS_StrIsNum(node[i]->content)) {
96                 merror(XML_VALUEERR, __local_name, node[i]->element, node[i]->content);
97                 return (OS_INVALID);
98             }
99
100             Mail->gran_level[granto_size] = atoi(node[i]->content);
101         } else if (strcmp(node[i]->element, xml_email_to) == 0) {
102             os_strdup(node[i]->content, Mail->gran_to[granto_size]);
103         } else if (strcmp(node[i]->element, xml_email_id) == 0) {
104             int r_id = 0;
105             char *str_pt = node[i]->content;
106
107             while (*str_pt != '\0') {
108                 /* We allow spaces in between */
109                 if (*str_pt == ' ') {
110                     str_pt++;
111                     continue;
112                 }
113
114                 /* If is digit, we get the value and
115                  * search for the next digit available
116                  */
117                 else if (isdigit((int)*str_pt)) {
118                     unsigned int id_i = 0;
119
120                     r_id = atoi(str_pt);
121                     debug1("%s: DEBUG: Adding '%d' to granular e-mail",
122                            __local_name, r_id);
123
124                     if (!Mail->gran_id[granto_size]) {
125                         os_calloc(2, sizeof(unsigned int), Mail->gran_id[granto_size]);
126                         Mail->gran_id[granto_size][0] = 0;
127                         Mail->gran_id[granto_size][1] = 0;
128                     } else {
129                         while (Mail->gran_id[granto_size][id_i] != 0) {
130                             id_i++;
131                         }
132
133                         os_realloc(Mail->gran_id[granto_size],
134                                    (id_i + 2) * sizeof(unsigned int),
135                                    Mail->gran_id[granto_size]);
136                         Mail->gran_id[granto_size][id_i + 1] = 0;
137                     }
138                     Mail->gran_id[granto_size][id_i] = r_id;
139
140                     str_pt = strchr(str_pt, ',');
141                     if (str_pt) {
142                         str_pt++;
143                     } else {
144                         break;
145                     }
146                 }
147
148                 /* Check for duplicate commas */
149                 else if (*str_pt == ',') {
150                     str_pt++;
151                     continue;
152                 }
153
154                 else {
155                     break;
156                 }
157             }
158
159         } else if (strcmp(node[i]->element, xml_email_format) == 0) {
160             if (strcmp(node[i]->content, "default") == 0) {
161                 /* Default is full format */
162             } else {
163                 merror(XML_VALUEERR, __local_name, node[i]->element, node[i]->content);
164                 return (OS_INVALID);
165             }
166         } else if (strcmp(node[i]->element, xml_email_donotdelay) == 0) {
167             if ((Mail->gran_format[granto_size] != SMS_FORMAT) &&
168                     (Mail->gran_format[granto_size] != DONOTGROUP)) {
169                 Mail->gran_format[granto_size] = FORWARD_NOW;
170             }
171         } else if (strcmp(node[i]->element, xml_email_donotgroup) == 0) {
172             if (Mail->gran_format[granto_size] != SMS_FORMAT) {
173                 Mail->gran_format[granto_size] = DONOTGROUP;
174             }
175         } else if (strcmp(node[i]->element, xml_email_location) == 0) {
176             os_calloc(1, sizeof(OSMatch), Mail->gran_location[granto_size]);
177             if (!OSMatch_Compile(node[i]->content,
178                                  Mail->gran_location[granto_size], 0)) {
179                 merror(REGEX_COMPILE, __local_name, node[i]->content,
180                        Mail->gran_location[granto_size]->error);
181                 return (-1);
182             }
183         } else if (strcmp(node[i]->element, xml_email_group) == 0) {
184             os_calloc(1, sizeof(OSMatch), Mail->gran_group[granto_size]);
185             if (!OSMatch_Compile(node[i]->content,
186                                  Mail->gran_group[granto_size], 0)) {
187                 merror(REGEX_COMPILE, __local_name, node[i]->content,
188                        Mail->gran_group[granto_size]->error);
189                 return (-1);
190             }
191         } else {
192             merror(XML_INVELEM, __local_name, node[i]->element);
193             return (OS_INVALID);
194         }
195         i++;
196     }
197
198     /* We must have at least one entry set */
199     if ((Mail->gran_location[granto_size] == NULL &&
200             Mail->gran_level[granto_size] == 0 &&
201             Mail->gran_group[granto_size] == NULL &&
202             Mail->gran_id[granto_size] == NULL &&
203             Mail->gran_format[granto_size] == FULL_FORMAT) ||
204             Mail->gran_to[granto_size] == NULL) {
205         merror(XML_INV_GRAN_MAIL, __local_name);
206         return (OS_INVALID);
207     }
208
209     return (0);
210 }
211