1 /* Copyright (C) 2009 Trend Micro Inc.
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
11 #include "mail-config.h"
15 int Read_EmailAlerts(XML_NODE node, __attribute__((unused)) void *configp, void *mailp)
18 unsigned int granto_size = 0;
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";
32 Mail = (MailConfig *)mailp;
37 /* Get Granular mail_to size */
38 if (Mail && Mail->gran_to) {
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);
63 Mail->gran_to[granto_size] = NULL;
64 Mail->gran_to[granto_size + 1] = NULL;
66 Mail->gran_id[granto_size] = NULL;
67 Mail->gran_id[granto_size + 1] = NULL;
69 Mail->gran_location[granto_size] = NULL;
70 Mail->gran_location[granto_size + 1] = NULL;
72 Mail->gran_group[granto_size] = NULL;
73 Mail->gran_group[granto_size + 1] = NULL;
75 Mail->gran_level[granto_size] = 0;
76 Mail->gran_level[granto_size + 1] = 0;
78 Mail->gran_format[granto_size] = FULL_FORMAT;
79 Mail->gran_format[granto_size + 1] = FULL_FORMAT;
81 Mail->gran_set[granto_size] = 0;
82 Mail->gran_set[granto_size + 1] = 0;
86 if (!node[i]->element) {
87 merror(XML_ELEMNULL, __local_name);
89 } else if (!node[i]->content) {
90 merror(XML_VALUENULL, __local_name, node[i]->element);
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);
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) {
105 char *str_pt = node[i]->content;
107 while (*str_pt != '\0') {
108 /* We allow spaces in between */
109 if (*str_pt == ' ') {
114 /* If is digit, we get the value and
115 * search for the next digit available
117 else if (isdigit((int)*str_pt)) {
118 unsigned int id_i = 0;
121 debug1("%s: DEBUG: Adding '%d' to granular e-mail",
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;
129 while (Mail->gran_id[granto_size][id_i] != 0) {
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;
138 Mail->gran_id[granto_size][id_i] = r_id;
140 str_pt = strchr(str_pt, ',');
148 /* Check for duplicate commas */
149 else if (*str_pt == ',') {
159 } else if (strcmp(node[i]->element, xml_email_format) == 0) {
160 if (strcmp(node[i]->content, "default") == 0) {
161 /* Default is full format */
163 merror(XML_VALUEERR, __local_name, node[i]->element, node[i]->content);
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;
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;
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);
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);
192 merror(XML_INVELEM, __local_name, node[i]->element);
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);