SmtpParser::Action SmtpParser::parse(SmtpClient *client) { SmtpParser::State last_state; const std::string *cdata; cdata = &client->get_data(); last_state = client->get_last_state(); if (((last_state == SmtpParser::START) || (last_state == SmtpParser::RCPT)) && (helo(client) || mail_from(client) || rcpt_to(client))) { return SmtpParser::OK; } else if (last_state == SmtpParser::RCPT && data(client)) { return SmtpParser::END_DATA; } else if (last_state == SmtpParser::DATA) { parse_mail(client); return SmtpParser::OK; } else if (cdata->compare(0,4,"QUIT") == 0) return SmtpParser::BYE; return SmtpParser::NOT_IMP;; }
transition_result_t handle_mail(context_t *context) { buffer_t *in_buf = &context->in_message; size_t reverse_path_length; const char *reverse_path = parse_mail(in_buf, &reverse_path_length); if (NULL == reverse_path) { if (buffer_shift_read_after(&context->in_message, CRLF, sizeof(CRLF) - 1) < 0) { return TRANSITION_ERROR; } if (BUFFER_TAILQ_PUSH_BACK_STRING(&context->out_message_queue, "555 Syntax error in reverse-path or not present" CRLF) < 0) { return TRANSITION_ERROR; } return TRANSITION_FAILED; } if (transaction_begin(&context->transaction) < 0) { return TRANSITION_ERROR; } if (transaction_set_reverse_path(&context->transaction, reverse_path, reverse_path_length) < 0) { CALL_ERR("transaction_set_reverse_path"); return TRANSITION_ERROR; } if (buffer_shift_read_after(&context->in_message, CRLF, sizeof(CRLF) - 1) < 0) { return TRANSITION_ERROR; } if (buffer_space(&context->in_message) == 0) { buffer_drop_read(&context->in_message); } if (BUFFER_TAILQ_PUSH_BACK_STRING(&context->out_message_queue, "250 Ok" CRLF) < 0) { return TRANSITION_ERROR; } log_write(context->log, "[%s] begin transaction", context->uuid); return TRANSITION_SUCCEED; }
static int api_mail_get_content(ONION_FUNC_PROTO_STR, int mode) { const char * userid = onion_request_get_query(req, "userid"); const char * sessid = onion_request_get_query(req, "sessid"); const char * appkey = onion_request_get_query(req, "appkey"); const char * str_num = onion_request_get_query(req, "num"); const char * box_type = onion_request_get_query(req, "box_type"); if(!userid || !sessid || !appkey || !str_num) return api_error(p, req, res, API_RT_WRONGPARAM); struct userec * ue = getuser(userid); if(ue == 0) return api_error(p, req, res, API_RT_WRONGPARAM); if(check_user_session(ue, sessid, appkey) != API_RT_SUCCESSFUL) { free(ue); return api_error(p, req, res, API_RT_WRONGSESS); } char mail_dir[80]; struct fileheader fh; int box_type_i = (box_type != NULL && box_type[0] == '1') ? API_MAIL_SENT_BOX : API_MAIL_RECIEVE_BOX; if(box_type_i == API_MAIL_RECIEVE_BOX) setmailfile(mail_dir, ue->userid, ".DIR"); else setsentmailfile(mail_dir, ue->userid, ".DIR"); FILE *fp = fopen(mail_dir, "r"); if(fp==0) { free(ue); return api_error(p, req, res, API_RT_MAILINNERR); } int total = file_size_s(mail_dir) / sizeof(struct fileheader); int num = atoi(str_num); if(num<=0) num = 1; if(num>total) num = total; fseek(fp, (num-1)*sizeof(struct fileheader), SEEK_SET); if(fread(&fh, sizeof(fh), 1, fp) <= 0) { fclose(fp); free(ue); return api_error(p, req, res, API_RT_MAILINNERR); } fclose(fp); char title_utf[240]; g2u(fh.title, strlen(fh.title), title_utf, 240); struct attach_link *attach_link_list = NULL; char * mail_content_utf8 = parse_mail(ue->userid, fh.filetime, mode, &attach_link_list); if(!mail_content_utf8) { // 文件不存在 free(ue); free_attach_link_list(attach_link_list); return api_error(p, req, res, API_RT_MAILEMPTY); } char * mail_json_str = (char *)malloc(strlen(mail_content_utf8) + 512); if(!mail_json_str) { free(ue); free(mail_content_utf8); free_attach_link_list(attach_link_list); return api_error(p, req, res, API_RT_NOTENGMEM); } memset(mail_json_str, 0, strlen(mail_content_utf8)+512); sprintf(mail_json_str, "{\"errcode\": 0, \"attach\":[]}"); struct json_object * jp = json_tokener_parse(mail_json_str); if(!jp) { free(ue); free(mail_content_utf8); free_attach_link_list(attach_link_list); free(mail_json_str); return api_error(p, req, res, API_RT_NOTENGMEM); } json_object_object_add(jp, "content", json_object_new_string(mail_content_utf8)); json_object_object_add(jp, "title", json_object_new_string(title_utf)); if(attach_link_list) { struct json_object * attach_array = json_object_object_get(jp, "attach"); char at_buf[320]; struct attach_link * alp = attach_link_list; while(alp) { memset(at_buf, 0, 320); sprintf(at_buf, "{\"link\": \"%s\", \"size\": %d}", alp->link, alp->size); json_object_array_add(attach_array, json_tokener_parse(at_buf)); alp=alp->next; } } char * api_output = strdup(json_object_to_json_string(jp)); free(ue); free(mail_content_utf8); free_attach_link_list(attach_link_list); free(mail_json_str); json_object_put(jp); api_set_json_header(res); onion_response_write0(res, api_output); free(api_output); return OCS_PROCESSED; }