u32 mai_save_file(struct sk_buff* skb,cam_session_context_2_t* sc, u8* start, u32 len,u32 protocol_id) { u32 err_id = ERROR_SUCCESS; mpsa_ac_result_s* mail_ac_search_result = mail_get_ac_result_data(); u32 mail_search_result_count = mail_get_ac_result_num(); u64 sessionid = 0; u32 end_offset = 0; u32 end_ac_len = 0; u32 length = 0; u32 index = 0; (void)skb; err_id = cam_get_logic_id_2(sc, e_mail_keyid_session_id_index, &sessionid); if(ERROR_SUCCESS != err_id) { MAIL_DEBUG(MAIL_DEBUG_SWITCH, "cam_get_logic_id_2 in mai_save_file\n"); return err_id; } err_id = cam_get_content_len_and_ac_res_slice(mail_ac_search_result, mail_search_result_count, &index, AC_SIGNATURE_MAIL_END, &end_offset, &end_ac_len); if(ERROR_SUCCESS != err_id) { length = len; } else { if (end_offset <= end_ac_len) { return ERROR_SUCCESS; } length = end_offset - end_ac_len; MAIL_DEBUG(MAIL_DEBUG_SWITCH, "else length in mai_save_file = %d\n",length); } if(0 != length) { err_id = cam_send_data_2(sc, sessionid, protocol_id, CAM_TYPE_MIDDLE, (char*)start, length,NULL); } return err_id; }
u32 mail_audit_process(struct sk_buff * skb,cam_session_context_2_t* sc,u8* start,u32 len) { u32 err_id = ERROR_SUCCESS; u32 i; mpsa_ac_result_s* ac_result; u32 is_save = cam_check_save_file_flag(skb); u32 result_count; u32 protocol_id; u64 sessionid = 0; u32 log_type = CAM_LOG_TYPE_CONTENT; u32 data_type = CAM_TYPE_END; spam_priv_s *spam_priv = NULL; ac_result = mail_get_ac_result_data(); result_count = mail_get_ac_result_num(); protocol_id = dcdm_get_top_proto(); MAIL_DEBUG(MAIL_DEBUG_SWITCH,"mail_audit_processs sc->flag=%d,sc->client_ip=%d\n",sc->flag,sc->client_ip); if(sc->flag == MAIL_PASSWORD) { if(sc->item[e_mail_keyid_passwd_index] == NULL && skb_get_dse_dir(skb) == DSESSION_DIR_CLIENT) { cam_process_item_common_2(sc, start, len, e_mail_keyid_passwd_index, e_cam_mail_password_id, CAM_ITEM_NOT_KEEP, 0); } sc->flag = MAIL_END; goto err_list; } else if(sc->flag == MAIL_START && CAM_SAVE_FILE_YES == is_save) { if( protocol_id != DCDM_PROTOCOL_SMTP_ID || skb_get_dse_dir(skb) != DSESSION_DIR_SERVER ) { err_id = mai_save_file(skb, sc, start, len,protocol_id); if(err_id != ERROR_SUCCESS) { goto err_list; } } } for(i=0;i<result_count;i++) { switch(ac_result[i].id) { case AC_SIGNATURE_MAIL_PASSWORD_START: if(sc->item[e_mail_keyid_passwd_index] == NULL && skb_get_dse_dir(skb) == DSESSION_DIR_SERVER) { sc->flag = MAIL_PASSWORD; } break; case AC_SIGNATURE_SMTP_DATA: case AC_SIGNATURE_POP3_RETR: if((skb_get_dse_dir(skb) == DSESSION_DIR_CLIENT) && sc->flag == MAIL_END) { MAIL_DEBUG(MAIL_DEBUG_SWITCH,"AC_SIGNATURE_SMTP_DATA\n"); if(CAM_SAVE_FILE_YES == is_save) { err_id = mail_create_file(skb,sc,start,protocol_id); if(err_id != ERROR_SUCCESS) { MAIL_DEBUG(MAIL_DEBUG_SWITCH,"mail_create_file\n"); goto err_list; } } sc->flag = MAIL_START; } break; case AC_SIGNATURE_SMTP_REV: if((skb_get_dse_dir(skb) == DSESSION_DIR_CLIENT) && sc->flag == MAIL_END) { MAIL_DEBUG(MAIL_DEBUG_SWITCH,"AC_SIGNATURE_SMTP_REV\n"); if(len <= (u32)(ac_result[i].end) + 2) { goto err_list; } err_id = smtp_save_rev_item(sc,start,len,(u32)(ac_result[i].end)); if(err_id != ERROR_SUCCESS) { goto err_list; } if(sc->item[e_mail_keyid_username_index] != NULL) { if((sc->item[e_mail_keyid_username_index]->len + (len - (u32)(ac_result[i].end)-2)) < MAIL_RCPT_MAX_LEN) { err_id = cam_add_item_data(sc->item[e_mail_keyid_username_index], start + (u32)(ac_result[i].end), (len - (u32)(ac_result[i].end)-2),0); if(err_id != ERROR_SUCCESS) { goto err_list; } } } err_id = cam_process_item_common_2(sc, start + (u32)(ac_result[i].end), (len - (u32)(ac_result[i].end)-2), e_mail_keyid_username_index, e_cam_mail_rcpt_to, CAM_ITEM_NOT_KEEP, CAM_ITEM_COMPLETE); if(err_id != ERROR_SUCCESS) { goto err_list; } } break; case AC_SIGNATURE_MAIL_END: if(sc->flag == MAIL_START) { spam_priv = dse_priv_info_get(g_spam_policy_handle, skb_get_dse(skb)); if(spam_priv != NULL && SPAM_CHECK_FLAG(spam_priv->total_flag, SPAM_BLOCK_DELAY_AUDIT)) { log_type = CAM_LOG_TYPE_WAIT_AUDIT; data_type = CAM_TYPE_DELAY; } MAIL_DEBUG(MAIL_DEBUG_SWITCH,"AC_SIGNATURE_MAIL_END\n"); if(sc->client_ip != e_app_filter_block || log_type == CAM_LOG_TYPE_WAIT_AUDIT) { err_id = mai_send_log(sc,protocol_id,log_type); if(err_id != ERROR_SUCCESS) { MAIL_DEBUG(MAIL_DEBUG_SWITCH,"mai_send_log\n"); goto err_list; } } err_id = cam_get_logic_id_2(sc, e_mail_keyid_session_id_index, &sessionid); if(ERROR_SUCCESS != err_id) { MAIL_DEBUG(MAIL_DEBUG_SWITCH, "cam_get_logic_id_2 in mai_save_file\n"); return err_id; } if(CAM_SAVE_FILE_YES == is_save) { err_id = cam_send_data_2(sc, sessionid, protocol_id, data_type, NULL, 0, NULL); } sc->flag = MAIL_END; } break; default: break; } } err_list: return err_id; }
/* OS_Sendmail v0.1: 2005/03/18 */ int OS_Sendmail(MailConfig *mail, struct tm *p) { int socket,i=0; char *msg; char snd_msg[128]; char additional_to[512]; MailNode *mailmsg; additional_to[0] = '\0'; /* If there is no sms message, we attempt to get from the * email list. */ mailmsg = OS_PopLastMail(); if(mailmsg == NULL) { merror("%s: No email to be sent. Inconsistent state.",ARGV0); } /* Connecting to the smtp server */ socket = OS_ConnectTCP(SMTP_DEFAULT_PORT, mail->smtpserver); if(socket < 0) { return(socket); } /* Receiving the banner */ msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDBANNER, msg))) { merror(BANNER_ERROR); if(msg) free(msg); close(socket); return(OS_INVALID); } MAIL_DEBUG("DEBUG: Received banner: '%s' %s", msg, ""); free(msg); /* Sending HELO message */ OS_SendTCP(socket,HELOMSG); msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDMAIL, msg))) { if(msg) { /* Ugly fix warning :) */ /* In some cases (with virus scans in the middle) * we may get two banners. Check for that in here. */ if(OS_Match(VALIDBANNER, msg)) { free(msg); /* Try again */ msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDMAIL, msg))) { merror("%s:%s",HELO_ERROR,msg!= NULL?msg:"null"); if(msg) free(msg); close(socket); return(OS_INVALID); } } else { merror("%s:%s",HELO_ERROR,msg); free(msg); close(socket); return(OS_INVALID); } } else { merror("%s:%s",HELO_ERROR,"null"); close(socket); return(OS_INVALID); } } MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", HELOMSG, msg); free(msg); /* Building "Mail from" msg */ memset(snd_msg,'\0',128); snprintf(snd_msg,127, MAILFROM, mail->from); OS_SendTCP(socket, snd_msg); msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDMAIL, msg))) { merror(FROM_ERROR); if(msg) free(msg); close(socket); return(OS_INVALID); } MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", snd_msg, msg); free(msg); /* Building "RCPT TO" msg */ while(1) { if(mail->to[i] == NULL) { if(i == 0) { merror(INTERNAL_ERROR); close(socket); return(OS_INVALID); } break; } memset(snd_msg,'\0',128); snprintf(snd_msg,127,RCPTTO, mail->to[i++]); OS_SendTCP(socket,snd_msg); msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDMAIL, msg))) { merror(TO_ERROR, mail->to[i -1]); if(msg) free(msg); close(socket); return(OS_INVALID); } MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", snd_msg, msg); free(msg); } /* Additional RCPT to */ if(mail->gran_to) { i = 0; while(mail->gran_to[i] != NULL) { if(mail->gran_set[i] != FULL_FORMAT) { i++; continue; } memset(snd_msg,'\0',128); snprintf(snd_msg,127,RCPTTO, mail->gran_to[i]); OS_SendTCP(socket,snd_msg); msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDMAIL, msg))) { merror(TO_ERROR, mail->gran_to[i]); if(msg) free(msg); i++; continue; } MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", snd_msg, msg); free(msg); i++; continue; } } /* Sending the "DATA" msg */ OS_SendTCP(socket,DATAMSG); msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDDATA, msg))) { merror(DATA_ERROR); if(msg) free(msg); close(socket); return(OS_INVALID); } MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", DATAMSG, msg); free(msg); /* Building "From" and "To" in the e-mail header */ memset(snd_msg,'\0',128); snprintf(snd_msg,127, TO, mail->to[0]); OS_SendTCP(socket, snd_msg); memset(snd_msg,'\0',128); snprintf(snd_msg,127, FROM, mail->from); OS_SendTCP(socket, snd_msg); /* Adding CCs */ if(mail->to[1]) { i = 1; while(1) { if(mail->to[i] == NULL) { break; } memset(snd_msg,'\0',128); snprintf(snd_msg,127, TO, mail->to[i]); OS_SendTCP(socket,snd_msg); i++; } } /* More CCs - from granular options */ if(mail->gran_to) { i = 0; while(mail->gran_to[i] != NULL) { if(mail->gran_set[i] != FULL_FORMAT) { i++; continue; } memset(snd_msg,'\0',128); snprintf(snd_msg,127, TO, mail->gran_to[i]); OS_SendTCP(socket, snd_msg); i++; continue; } } /* Sending date */ memset(snd_msg,'\0',128); /* Solaris doesn't have the "%z", so we set the timezone to 0. */ #ifdef SOLARIS strftime(snd_msg, 127, "Date: %a, %d %b %Y %T -0000\r\n",p); #else strftime(snd_msg, 127, "Date: %a, %d %b %Y %T %z\r\n",p); #endif OS_SendTCP(socket,snd_msg); /* Sending subject */ memset(snd_msg,'\0',128); /* Checking if global subject is available */ if((_g_subject_level != 0) && (_g_subject[0] != '\0')) { snprintf(snd_msg, 127, SUBJECT, _g_subject); /* Clearing global values */ _g_subject[0] = '\0'; _g_subject_level = 0; } else { snprintf(snd_msg, 127, SUBJECT, mailmsg->mail->subject); } OS_SendTCP(socket,snd_msg); /* Sending body */ /* Sending multiple emails together if we have to */ do { OS_SendTCP(socket, mailmsg->mail->body); mailmsg = OS_PopLastMail(); }while(mailmsg); /* Sending end of data \r\n.\r\n */ OS_SendTCP(socket,ENDDATA); msg = OS_RecvTCP(socket, OS_SIZE_1024); if(mail->strict_checking && ((msg == NULL)||(!OS_Match(VALIDMAIL, msg)))) { merror(END_DATA_ERROR); if(msg) free(msg); close(socket); return(OS_INVALID); } /* Checking msg in here, since it may be null */ if(msg) free(msg); /* quitting and closing socket */ OS_SendTCP(socket,QUITMSG); msg = OS_RecvTCP(socket, OS_SIZE_1024); if(msg) free(msg); memset(snd_msg,'\0',128); /* Returning 0 (success) */ close(socket); return(0); }
/* OS_Sendsms. */ int OS_Sendsms(MailConfig *mail, struct tm *p, MailMsg *sms_msg) { int socket, i = 0, final_to_sz; char *msg; char snd_msg[128]; char final_to[512]; /* Connecting to the smtp server */ socket = OS_ConnectTCP(SMTP_DEFAULT_PORT, mail->smtpserver); if(socket < 0) { return(socket); } /* Receiving the banner */ msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDBANNER, msg))) { merror(BANNER_ERROR); if(msg) free(msg); close(socket); return(OS_INVALID); } MAIL_DEBUG("DEBUG: Received banner: '%s' %s", msg, ""); free(msg); /* Sending HELO message */ OS_SendTCP(socket,HELOMSG); msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDMAIL, msg))) { if(msg) { /* Ugly fix warning :) */ /* In some cases (with virus scans in the middle) * we may get two banners. Check for that in here. */ if(OS_Match(VALIDBANNER, msg)) { free(msg); /* Try again */ msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDMAIL, msg))) { merror("%s:%s",HELO_ERROR,msg!= NULL?msg:"null"); if(msg) free(msg); close(socket); return(OS_INVALID); } } else { merror("%s:%s",HELO_ERROR,msg); free(msg); close(socket); return(OS_INVALID); } } else { merror("%s:%s",HELO_ERROR,"null"); close(socket); return(OS_INVALID); } } MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", HELOMSG, msg); free(msg); /* Building "Mail from" msg */ memset(snd_msg,'\0',128); snprintf(snd_msg,127, MAILFROM, mail->from); OS_SendTCP(socket, snd_msg); msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDMAIL, msg))) { merror(FROM_ERROR); if(msg) free(msg); close(socket); return(OS_INVALID); } MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", snd_msg, msg); free(msg); /* Additional RCPT to */ final_to[0] = '\0'; final_to_sz = sizeof(final_to) -2; if(mail->gran_to) { i = 0; while(mail->gran_to[i] != NULL) { if(mail->gran_set[i] != SMS_FORMAT) { i++; continue; } memset(snd_msg,'\0',128); snprintf(snd_msg,127, RCPTTO, mail->gran_to[i]); OS_SendTCP(socket, snd_msg); msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDMAIL, msg))) { merror(TO_ERROR, mail->gran_to[i]); if(msg) free(msg); close(socket); return(OS_INVALID); } MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", snd_msg, msg); free(msg); /* Creating header for to */ memset(snd_msg,'\0',128); snprintf(snd_msg,127, TO, mail->gran_to[i]); strncat(final_to, snd_msg, final_to_sz); final_to_sz -= strlen(snd_msg) +2; i++; continue; } } /* Sending the "DATA" msg */ OS_SendTCP(socket,DATAMSG); msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDDATA, msg))) { merror(DATA_ERROR); if(msg) free(msg); close(socket); return(OS_INVALID); } MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", DATAMSG, msg); free(msg); /* Building "From" and "To" in the e-mail header */ OS_SendTCP(socket, final_to); memset(snd_msg,'\0',128); snprintf(snd_msg,127, FROM, mail->from); OS_SendTCP(socket, snd_msg); /* Sending date */ memset(snd_msg,'\0',128); /* Solaris doesn't have the "%z", so we set the timezone to 0. */ #ifdef SOLARIS strftime(snd_msg, 127, "Date: %a, %d %b %Y %T -0000\r\n",p); #else strftime(snd_msg, 127, "Date: %a, %d %b %Y %T %z\r\n",p); #endif OS_SendTCP(socket,snd_msg); /* Sending subject */ memset(snd_msg,'\0',128); snprintf(snd_msg, 127, SUBJECT, sms_msg->subject); OS_SendTCP(socket,snd_msg); /* Sending body */ OS_SendTCP(socket, sms_msg->body); /* Sending end of data \r\n.\r\n */ OS_SendTCP(socket,ENDDATA); msg = OS_RecvTCP(socket, OS_SIZE_1024); if(mail->strict_checking && ((msg == NULL)||(!OS_Match(VALIDMAIL, msg)))) { merror(END_DATA_ERROR); if(msg) free(msg); close(socket); return(OS_INVALID); } /* Checking msg in here, since it may be null */ if(msg) free(msg); /* quitting and closing socket */ OS_SendTCP(socket,QUITMSG); msg = OS_RecvTCP(socket, OS_SIZE_1024); if(msg) free(msg); memset(snd_msg,'\0',128); /* Returning 0 (success) */ close(socket); return(0); }
/* OS_SendCustomEmail */ int OS_SendCustomEmail(char **to, char *subject, char *smtpserver, char *from, FILE *fp, struct tm *p) { int socket,i = 0; char *msg; char snd_msg[128]; char buffer[2049]; buffer[2048] = '\0'; /* Connecting to the smtp server */ socket = OS_ConnectTCP(SMTP_DEFAULT_PORT, smtpserver, 0); if(socket < 0) { return(socket); } /* Receiving the banner */ msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDBANNER, msg))) { merror(BANNER_ERROR); if(msg) free(msg); close(socket); return(OS_INVALID); } MAIL_DEBUG("DEBUG: Received banner: '%s' %s", msg, ""); free(msg); /* Sending HELO message */ OS_SendTCP(socket,HELOMSG); msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDMAIL, msg))) { if(msg) { /* Ugly fix warning :) */ /* In some cases (with virus scans in the middle) * we may get two banners. Check for that in here. */ if(OS_Match(VALIDBANNER, msg)) { free(msg); /* Try again */ msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDMAIL, msg))) { merror("%s:%s",HELO_ERROR,msg!= NULL?msg:"null"); if(msg) free(msg); close(socket); return(OS_INVALID); } } else { merror("%s:%s",HELO_ERROR,msg); free(msg); close(socket); return(OS_INVALID); } } else { merror("%s:%s",HELO_ERROR,"null"); close(socket); return(OS_INVALID); } } MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", HELOMSG, msg); free(msg); /* Building "Mail from" msg */ memset(snd_msg,'\0',128); snprintf(snd_msg,127, MAILFROM, from); OS_SendTCP(socket, snd_msg); msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDMAIL, msg))) { merror(FROM_ERROR); if(msg) free(msg); close(socket); return(OS_INVALID); } MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", snd_msg, msg); free(msg); /* Building "RCPT TO" msg */ while(to[i]) { memset(snd_msg,'\0',128); snprintf(snd_msg,127,RCPTTO, to[i]); OS_SendTCP(socket,snd_msg); msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDMAIL, msg))) { merror(TO_ERROR, to[i]); if(msg) free(msg); close(socket); return(OS_INVALID); } MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", snd_msg, msg); free(msg); i++; } /* Sending the "DATA" msg */ OS_SendTCP(socket,DATAMSG); msg = OS_RecvTCP(socket, OS_SIZE_1024); if((msg == NULL)||(!OS_Match(VALIDDATA, msg))) { merror(DATA_ERROR); if(msg) free(msg); close(socket); return(OS_INVALID); } MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", DATAMSG, msg); free(msg); /* Building "From" and "To" in the e-mail header */ memset(snd_msg,'\0',128); snprintf(snd_msg,127, TO, to[0]); OS_SendTCP(socket, snd_msg); memset(snd_msg,'\0',128); snprintf(snd_msg,127, FROM, from); OS_SendTCP(socket, snd_msg); /* Adding CCs */ if(to[1]) { i = 1; while(1) { if(to[i] == NULL) { break; } memset(snd_msg,'\0',128); snprintf(snd_msg,127, TO, to[i]); OS_SendTCP(socket,snd_msg); i++; } } /* Sending date */ memset(snd_msg,'\0',128); /* Solaris doesn't have the "%z", so we set the timezone to 0. */ #ifdef SOLARIS strftime(snd_msg, 127, "Date: %a, %d %b %Y %T -0000\r\n",p); #else strftime(snd_msg, 127, "Date: %a, %d %b %Y %T %z\r\n",p); #endif OS_SendTCP(socket,snd_msg); /* Sending subject */ memset(snd_msg, '\0', 128); snprintf(snd_msg, 127, SUBJECT, subject); OS_SendTCP(socket, snd_msg); OS_SendTCP(socket,ENDHEADER); /* Sending body */ fseek(fp, 0, SEEK_SET); while(fgets(buffer, 2048, fp) != NULL) { OS_SendTCP(socket,buffer); } /* Sending end of data \r\n.\r\n */ OS_SendTCP(socket,ENDDATA); msg = OS_RecvTCP(socket, OS_SIZE_1024); /* Checking msg in here, since it may be null */ if(msg) free(msg); /* quitting and closing socket */ OS_SendTCP(socket,QUITMSG); msg = OS_RecvTCP(socket, OS_SIZE_1024); if(msg) free(msg); memset(snd_msg,'\0',128); /* Returning 0 (success) */ close(socket); return(0); }