new upstream release (3.3.0); modify package compatibility for Stretch
[ossec-hids.git] / src / config / client-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 "client-config.h"
12 #include "os_net/os_net.h"
13 #include "config.h"
14
15
16 int Read_Client(XML_NODE node, void *d1, __attribute__((unused)) void *d2)
17 {
18     int i = 0, portnum;
19
20     /* XML definitions */
21     const char *xml_server_ip = "server-ip";
22     const char *xml_server_hostname = "server-hostname";
23     const char *xml_local_ip = "local_ip";
24     const char *xml_client_port = "port";
25     const char *xml_ar_disabled = "disable-active-response";
26     const char *xml_notify_time = "notify_time";
27     const char *xml_max_time_reconnect_try = "time-reconnect";
28     const char *xml_profile_name = "config-profile";
29
30     agent *logr;
31
32     logr = (agent *)d1;
33
34     logr->notify_time = 0;
35     logr->max_time_reconnect_try = 0;
36
37     while (node[i]) {
38         if (!node[i]->element) {
39             merror(XML_ELEMNULL, __local_name);
40             return (OS_INVALID);
41         } else if (!node[i]->content) {
42             merror(XML_VALUENULL, __local_name, node[i]->element);
43             return (OS_INVALID);
44         }
45         /* Get local IP */
46         else if (strcmp(node[i]->element, xml_local_ip) == 0) {
47             os_strdup(node[i]->content, logr->lip);
48             if (OS_IsValidIP(logr->lip, NULL) != 1) {
49                 merror(INVALID_IP, __local_name, logr->lip);
50                 return (OS_INVALID);
51             }
52         }
53         /* Get server IP */
54         else if (strcmp(node[i]->element, xml_server_ip) == 0) {
55             unsigned int ip_id = 0;
56
57             /* Get last IP */
58             if (logr->rip) {
59                 while (logr->rip[ip_id]) {
60                     ip_id++;
61                 }
62             }
63             os_realloc(logr->rip, (ip_id + 2) * sizeof(char *), logr->rip);
64             logr->rip[ip_id] = NULL;
65             logr->rip[ip_id + 1] = NULL;
66
67             os_strdup(node[i]->content, logr->rip[ip_id]);
68             if (OS_IsValidIP(logr->rip[ip_id], NULL) != 1) {
69                 merror(INVALID_IP, __local_name, logr->rip[ip_id]);
70                 return (OS_INVALID);
71             }
72             logr->rip_id++;
73         } else if (strcmp(node[i]->element, xml_server_hostname) == 0) {
74             unsigned int ip_id = 0;
75             char *s_ip;
76
77             /* Get last IP */
78             if (logr->rip) {
79                 while (logr->rip[ip_id]) {
80                     ip_id++;
81                 }
82             }
83             os_realloc(logr->rip, (ip_id + 2) * sizeof(char *), logr->rip);
84             s_ip = OS_GetHost(node[i]->content, 5);
85             if (!s_ip) {
86                 merror("%s: WARN: '%s' does not resolve to an address.",
87                        __local_name, node[i]->content);
88                 merror(AG_INV_HOST, __local_name, node[i]->content);
89             }
90             free(s_ip);
91
92             os_strdup(node[i]->content, logr->rip[ip_id]);
93             logr->rip[ip_id + 1] = NULL;
94             logr->rip_id++;
95         } else if (strcmp(node[i]->element, xml_client_port) == 0) {
96             if (!OS_StrIsNum(node[i]->content)) {
97                 merror(XML_VALUEERR, __local_name, node[i]->element, node[i]->content);
98                 return (OS_INVALID);
99             }
100             os_strdup(node[i]->content, logr->port);
101             portnum = atoi(node[i]->content);
102
103             if(portnum <= 0 || portnum > 65535)
104             {
105                 merror(PORT_ERROR, __local_name, portnum);
106                 return(OS_INVALID);
107             }
108         } else if (strcmp(node[i]->element, xml_notify_time) == 0) {
109             if (!OS_StrIsNum(node[i]->content)) {
110                 merror(XML_VALUEERR, __local_name, node[i]->element, node[i]->content);
111                 return (OS_INVALID);
112             }
113             logr->notify_time = atoi(node[i]->content);
114         } else if (strcmp(node[i]->element, xml_max_time_reconnect_try) == 0) {
115             if (!OS_StrIsNum(node[i]->content)) {
116                 merror(XML_VALUEERR, __local_name, node[i]->element, node[i]->content);
117                 return (OS_INVALID);
118             }
119             logr->max_time_reconnect_try = atoi(node[i]->content);
120         } else if (strcmp(node[i]->element, xml_ar_disabled) == 0) {
121             if (strcmp(node[i]->content, "yes") == 0) {
122                 logr->execdq = -1;
123             } else if (strcmp(node[i]->content, "no") == 0) {
124                 logr->execdq = 0;
125             } else {
126                 merror(XML_VALUEERR, __local_name, node[i]->element, node[i]->content);
127                 return (OS_INVALID);
128             }
129         } else if (strcmp(node[i]->element, xml_profile_name) == 0) {
130             /* Profile name can be anything hence no validation */
131             os_strdup(node[i]->content, logr->profile);
132         } else {
133             merror(XML_INVELEM, __local_name, node[i]->element);
134             return (OS_INVALID);
135         }
136         i++;
137     }
138
139     if (!logr->rip) {
140         return (OS_INVALID);
141     }
142
143     return (0);
144 }
145