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
10 /* Basic e-mailing operations */
13 #include "os_net/os_net.h"
15 /* Return codes (from SMTP server) */
16 #define VALIDBANNER "220"
17 #define VALIDMAIL "250"
18 #define VALIDDATA "354"
20 /* Default values used to connect */
21 #define SMTP_DEFAULT_PORT "25"
22 #define HELOMSG "Helo notify.ossec.net\r\n"
23 #define MAILFROM "Mail From: <%s>\r\n"
24 #define RCPTTO "Rcpt To: <%s>\r\n"
25 #define DATAMSG "DATA\r\n"
26 #define FROM "From: OSSEC HIDS <%s>\r\n"
27 #define REPLYTO "Reply-To: OSSEC HIDS <%s>\r\n"
28 #define TO "To: <%s>\r\n"
29 #define CC "Cc: <%s>\r\n"
30 #define SUBJECT "Subject: %s\r\n"
31 #define ENDHEADER "\r\n"
32 #define ENDDATA "\r\n.\r\n"
33 #define QUITMSG "QUIT\r\n"
34 #define XHEADER "X-IDS-OSSEC: %s\r\n"
36 /* Error messages - Can be translated */
37 #define INTERNAL_ERROR "os_maild (1760): ERROR: Memory/configuration error"
38 #define BANNER_ERROR "os_sendmail(1762): WARN: Banner not received from server"
39 #define HELO_ERROR "os_sendmail(1763): WARN: Hello not accepted by server"
40 #define FROM_ERROR "os_sendmail(1764): WARN: Mail from not accepted by server"
41 #define TO_ERROR "os_sendmail(1765): WARN: RCPT TO not accepted by server - '%s'."
42 #define DATA_ERROR "os_sendmail(1766): WARN: DATA not accepted by server"
43 #define END_DATA_ERROR "os_sendmail(1767): WARN: End of DATA not accepted by server"
45 #define MAIL_DEBUG_FLAG 0
46 #define MAIL_DEBUG(x,y,z) if(MAIL_DEBUG_FLAG) merror(x,y,z)
49 int OS_SendCustomEmail2(char **to, char *subject, char *smtpserver, char *from, char *replyto, char *idsname, __attribute__((unused)) char *fname)
51 FILE *sendmail = NULL;
52 int socket = -1, i = 0;
59 if (smtpserver[0] == '/') {
60 sendmail = popen(smtpserver, "w");
65 /* Connect to the SMTP server */
66 socket = OS_ConnectTCP(SMTP_DEFAULT_PORT, smtpserver);
71 /* Receive the banner */
72 msg = OS_RecvTCP(socket, OS_SIZE_1024);
73 if ((msg == NULL) || (!OS_Match(VALIDBANNER, msg))) {
81 MAIL_DEBUG("DEBUG: Received banner: '%s' %s", msg, "");
84 /* Send HELO message */
85 OS_SendTCP(socket, HELOMSG);
86 msg = OS_RecvTCP(socket, OS_SIZE_1024);
87 if ((msg == NULL) || (!OS_Match(VALIDMAIL, msg))) {
89 /* In some cases (with virus scans in the middle)
90 * we may get two banners. Check for that in here.
92 if (OS_Match(VALIDBANNER, msg)) {
96 msg = OS_RecvTCP(socket, OS_SIZE_1024);
97 if ((msg == NULL) || (!OS_Match(VALIDMAIL, msg))) {
98 merror("%s:%s", HELO_ERROR, msg != NULL ? msg : "null");
106 merror("%s:%s", HELO_ERROR, msg);
112 merror("%s:%s", HELO_ERROR, "null");
118 MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", HELOMSG, msg);
121 /* Build "Mail from" msg */
122 memset(snd_msg, '\0', 128);
123 snprintf(snd_msg, 127, MAILFROM, from);
124 OS_SendTCP(socket, snd_msg);
125 msg = OS_RecvTCP(socket, OS_SIZE_1024);
126 if ((msg == NULL) || (!OS_Match(VALIDMAIL, msg))) {
134 MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", snd_msg, msg);
137 /* Build "RCPT TO" msg */
139 memset(snd_msg, '\0', 128);
140 snprintf(snd_msg, 127, RCPTTO, to[i]);
141 OS_SendTCP(socket, snd_msg);
142 msg = OS_RecvTCP(socket, OS_SIZE_1024);
143 if ((msg == NULL) || (!OS_Match(VALIDMAIL, msg))) {
144 merror(TO_ERROR, to[i]);
151 MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", snd_msg, msg);
157 /* Send the "DATA" msg */
158 OS_SendTCP(socket, DATAMSG);
159 msg = OS_RecvTCP(socket, OS_SIZE_1024);
160 if ((msg == NULL) || (!OS_Match(VALIDDATA, msg))) {
168 MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", DATAMSG, msg);
172 /* Build "From" and "To" in the e-mail header */
173 memset(snd_msg, '\0', 128);
174 snprintf(snd_msg, 127, TO, to[0]);
177 fprintf(sendmail, "%s", snd_msg);
179 OS_SendTCP(socket, snd_msg);
182 memset(snd_msg, '\0', 128);
183 snprintf(snd_msg, 127, FROM, from);
186 fprintf(sendmail, "%s", snd_msg);
188 OS_SendTCP(socket, snd_msg);
192 memset(snd_msg, '\0', 128);
193 snprintf(snd_msg, 127, REPLYTO, replyto);
195 fprintf(sendmail, "%s", snd_msg);
197 OS_SendTCP(socket, snd_msg);
210 memset(snd_msg, '\0', 128);
211 snprintf(snd_msg, 127, TO, to[i]);
214 fprintf(sendmail, "%s", snd_msg);
216 OS_SendTCP(socket, snd_msg);
224 memset(snd_msg, '\0', 128);
230 /* Solaris doesn't have the "%z", so we set the timezone to 0 */
232 strftime(snd_msg, 127, "Date: %a, %d %b %Y %T -0000\r\n", p);
234 strftime(snd_msg, 127, "Date: %a, %d %b %Y %T %z\r\n", p);
238 fprintf(sendmail, "%s", snd_msg);
240 OS_SendTCP(socket, snd_msg);
244 /* Send server name header */
245 memset(snd_msg, '\0', 128);
246 snprintf(snd_msg, 127, XHEADER, idsname);
249 fprintf(sendmail, "%s", snd_msg);
251 OS_SendTCP(socket, snd_msg);
256 memset(snd_msg, '\0', 128);
257 snprintf(snd_msg, 127, SUBJECT, subject);
260 fprintf(sendmail, "%s", snd_msg);
261 fprintf(sendmail, ENDHEADER);
263 OS_SendTCP(socket, snd_msg);
264 OS_SendTCP(socket, ENDHEADER);
270 snprintf(fname2, 255, "/logs/.report-%d.log", getpid());
274 fp = fopen(fname2, "r");
276 merror("%s: ERROR: Cannot open %s: %s", __local_name, fname2, strerror(errno));
287 while (fgets(buffer, 2048, fp) != NULL) {
289 fprintf(sendmail, "%s", buffer);
291 OS_SendTCP(socket, buffer);
297 if (pclose(sendmail) == -1) {
298 merror(WAITPID_ERROR, ARGV0, errno, strerror(errno));
301 /* Send end of data \r\n.\r\n */
302 OS_SendTCP(socket, ENDDATA);
303 msg = OS_RecvTCP(socket, OS_SIZE_1024);
305 /* Check msg, since it may be null */
310 /* Quit and close socket */
311 OS_SendTCP(socket, QUITMSG);
312 msg = OS_RecvTCP(socket, OS_SIZE_1024);
321 memset_secure(snd_msg, '\0', 128);