コード例 #1
0
ファイル: SmtpParser.cpp プロジェクト: koolkt/mendoza
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;;
}
コード例 #2
0
ファイル: handle.c プロジェクト: elsid/smtp-server
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;
}
コード例 #3
0
ファイル: api_mail.c プロジェクト: bmybbs/api
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;
}