Ejemplo n.º 1
0
static int fetch_section_mime(mailmessage * msg_info,
    struct mailmime * mime,
    char ** result, size_t * result_len)
{
  int r;
  int res;
  int col;
  MMAPString * str;

  if (msg_info->msg_mime == NULL)
    return MAIL_ERROR_INVAL;

  str = mmap_string_new("");
  if (str == NULL) {
    res = MAIL_ERROR_MEMORY;
    goto err;
  }
  
  col = 0;
  if (mime->mm_content_type != NULL) {
    r = mailmime_content_write_mem(str, &col, mime->mm_content_type);
    if (r != MAILIMF_NO_ERROR) {
      res = maildriver_imf_error_to_mail_error(r);
      goto free;
    }
  }
  if (mime->mm_mime_fields != NULL) {
    r = mailmime_fields_write_mem(str, &col, mime->mm_mime_fields);
    if (r != MAILIMF_NO_ERROR) {
      res = maildriver_imf_error_to_mail_error(r);
      goto free;
    }
  }
  mailimf_string_write_mem(str, &col, "\r\n", 2);
  
  r = mmap_string_ref(str);
  if (r < 0) {
    res = MAIL_ERROR_MEMORY;
    goto free;
  }

  * result = str->str;
  * result_len = str->len;
  
  return MAIL_NO_ERROR;

 free:
  mmap_string_free(str);
 err:
  return res;
}
Ejemplo n.º 2
0
static int body_body_to_mmapstr(char * data, size_t size,
    char ** result, size_t * result_len)
{
  size_t cur_token;
  int res;
  int r;
  
  cur_token = 0;
  
  /* skip header */
  
  /* MIME header */
  
  while (1) {
    r = mailimf_ignore_field_parse(data, size, &cur_token);
    if (r == MAILIMF_NO_ERROR) {
      /* do nothing */
    }
    else
      break;
  }
  
  r = mailimf_crlf_parse(data, size, &cur_token);
  if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) {
    res = maildriver_imf_error_to_mail_error(r);
    goto err;
  }
  
  return body_to_mmapstr(data + cur_token, size - cur_token,
      result, result_len);
  
 err:
  return res;
}
Ejemplo n.º 3
0
int
mailmessage_generic_fetch_section_body(mailmessage * msg_info,
				       struct mailmime * mime,
				       char ** result,
				       size_t * result_len)
{
  MMAPString * mmapstr;
  int r;
  int res;
  size_t cur_token;

  cur_token = 0;

  if (mime->mm_type == MAILMIME_MESSAGE) {

    /* skip header */

    while (1) {
      r = mailimf_ignore_field_parse(mime->mm_body->dt_data.dt_text.dt_data,
          mime->mm_body->dt_data.dt_text.dt_length, &cur_token);
      if (r == MAILIMF_NO_ERROR) {
	/* do nothing */
      }
      else
	break;
    }
    
    r = mailimf_crlf_parse(mime->mm_body->dt_data.dt_text.dt_data,
        mime->mm_body->dt_data.dt_text.dt_length, &cur_token);
    if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) {
      res = maildriver_imf_error_to_mail_error(r);
      goto err;
    }
  }

  mmapstr = mmap_string_new_len(mime->mm_body->dt_data.dt_text.dt_data +
      cur_token, mime->mm_body->dt_data.dt_text.dt_length - cur_token);
  if (mmapstr == NULL) {
    res = MAIL_ERROR_MEMORY;
    goto err;
  }

  r = mmap_string_ref(mmapstr);
  if (r < 0) {
    res = MAIL_ERROR_MEMORY;
    goto free_mmap;
  }

  * result = mmapstr->str;
  * result_len = mmapstr->len;

  return MAIL_NO_ERROR;

 free_mmap:
  mmap_string_free(mmapstr);
 err:
  return res;
}
Ejemplo n.º 4
0
static int fetch_section(mailmessage * msg_info,
    struct mailmime * mime,
    char ** result, size_t * result_len)
{
  int r;
  int res;
  int col;
  MMAPString * str;
  
  if (msg_info->msg_mime == NULL)
    return MAIL_ERROR_INVAL;
  
  str = mmap_string_new("");
  if (str == NULL) {
    res = MAILIMF_ERROR_MEMORY;
    goto err;
  }
  
  col = 0;
  r = mailmime_write_mem(str, &col, mime);
  if (r != MAILIMF_NO_ERROR) {
    res = maildriver_imf_error_to_mail_error(r);
    goto free;
  }
  
  if (mime->mm_parent == NULL) {
    r = mmap_string_ref(str);
    if (r < 0) {
      res = MAIL_ERROR_MEMORY;
      goto free;
    }
    
    * result = str->str;
    * result_len = str->len;
    
    r = MAIL_NO_ERROR;
  }
  else {
    r = body_to_mmapstr(str->str, str->len, result, result_len);
    if (r == MAIL_NO_ERROR) {
      mmap_string_free(str);
    }
  }
  
  if (r != MAIL_NO_ERROR) {
    res = r;
    goto free;
  }
  
  return MAIL_NO_ERROR;

 free:
  mmap_string_free(str);
 err:
  return res;
}
Ejemplo n.º 5
0
static int imap_fetch_section_body(mailmessage * msg_info,
				   struct mailmime * mime,
				   char ** result,
				   size_t * result_len)
{
  struct mailimap_section * section;
  struct mailimap_fetch_att * fetch_att;
  int r;
  struct mailimap_fetch_type * fetch_type;
  char * text;
  size_t text_length;
  struct mailmime_section * part;

  if (mime->mm_parent == NULL)
    return imap_fetch_body(msg_info, result, result_len);

  if (mime->mm_parent->mm_parent == NULL)
    return imap_fetch_body(msg_info, result, result_len);

  r = mailmime_get_section_id(mime, &part);
  if (r != MAILIMF_NO_ERROR)
    return maildriver_imf_error_to_mail_error(r);

  r = imap_section_to_imap_section(part, IMAP_SECTION_BODY, &section);
  mailmime_section_free(part);
  if (r != MAIL_NO_ERROR)
    return MAIL_ERROR_MEMORY;

  fetch_att = mailimap_fetch_att_new_body_peek_section(section);
  if (fetch_att == NULL) {
    mailimap_section_free(section);
    return MAIL_ERROR_MEMORY;
  }
  
  fetch_type = mailimap_fetch_type_new_fetch_att(fetch_att);
  if (fetch_type == NULL) {
    mailimap_fetch_att_free(fetch_att);
    return MAIL_ERROR_MEMORY;
  }
  
  text = NULL;
  text_length = 0;
  r = fetch_imap(msg_info, fetch_type, &text, &text_length);

  mailimap_fetch_type_free(fetch_type);

  if (r != MAIL_NO_ERROR)
    return r;
  
  * result = text;
  * result_len = text_length;

  return MAIL_NO_ERROR;
}
Ejemplo n.º 6
0
static int body_to_mmapstr(char * data, size_t size,
    char ** result, size_t * result_len)
{
  MMAPString * mmapstr;
  size_t cur_token;
  int res;
  int r;
  
  cur_token = 0;
  
  /* skip header */
  
  while (1) {
    r = mailimf_ignore_field_parse(data, size, &cur_token);
    if (r == MAILIMF_NO_ERROR) {
      /* do nothing */
    }
    else
      break;
  }
  
  r = mailimf_crlf_parse(data, size, &cur_token);
  if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) {
    res = maildriver_imf_error_to_mail_error(r);
    goto err;
  }
  
  mmapstr = mmap_string_new_len(data + cur_token, size - cur_token);
  if (mmapstr == NULL) {
    res = MAIL_ERROR_MEMORY;
    
    goto err;
  }
  
  r = mmap_string_ref(mmapstr);
  if (r != 0) {
    mmap_string_free(mmapstr);
    res = MAIL_ERROR_MEMORY;
    
    goto err;
  }
  
  * result = mmapstr->str;
  * result_len = mmapstr->len;

  return MAIL_NO_ERROR;

 err:
  return res;
}
Ejemplo n.º 7
0
static int fetch_section_body(mailmessage * msg_info,
    struct mailmime * mime,
    char ** result, size_t * result_len)
{
  int r;
  int res;
  int col;
  MMAPString * str;
  
  if (msg_info->msg_mime == NULL)
    return MAIL_ERROR_INVAL;

  str = mmap_string_new("");
  if (str == NULL) {
    res = MAIL_ERROR_MEMORY;
    goto err;
  }
  
  col = 0;
  if (mime->mm_mime_fields != NULL) {
    r = mailmime_write_mem(str, &col, mime);
    if (r != MAILIMF_NO_ERROR) {
      res = maildriver_imf_error_to_mail_error(r);
      goto free;
    }
  }
  
  if (mime->mm_type == MAILMIME_MESSAGE)
    r = body_body_to_mmapstr(str->str, str->len, result, result_len);
  else
    r = body_to_mmapstr(str->str, str->len, result, result_len);
  
  if (r != MAIL_NO_ERROR) {
    res = r;
    goto free;
  }
  
  mmap_string_free(str);
  
  return MAIL_NO_ERROR;
  
 free:
  mmap_string_free(str);
 err:
  return res;
}
Ejemplo n.º 8
0
int mailmessage_generic_fetch_envelope(mailmessage * msg_info,
				       struct mailimf_fields ** result)
{
  int r;
  int res;
  size_t cur_token;
  char * header;
  size_t length;
  struct mailimf_fields * fields;

  r = mailmessage_fetch_header(msg_info, &header, &length);
  if (r != MAIL_NO_ERROR) {
    res = r;
    goto err;
  }
  
  cur_token = 0;
  
  r = mailimf_envelope_fields_parse(header, length, &cur_token,
				    &fields);
  if (r != MAILIMF_NO_ERROR) {
    res = maildriver_imf_error_to_mail_error(r);
    goto free;
    /* do nothing */
  }

  mailmessage_fetch_result_free(msg_info, header);
  
  * result = fields;

  return MAIL_NO_ERROR;

 free:
  mailmessage_fetch_result_free(msg_info, header);
 err:
  return res;
}
Ejemplo n.º 9
0
static int xover_resp_to_fields(struct newsnntp_xover_resp_item * item,
				struct mailimf_fields ** result)
{
  size_t cur_token;
  clist * list;
  int r;
  struct mailimf_fields * fields;
  int res;

  list = clist_new();
  if (list == NULL) {
    res = MAIL_ERROR_MEMORY;
    goto err;
  }

  if (item->ovr_subject != NULL) {
    char * subject_str;
    struct mailimf_subject * subject;
    struct mailimf_field * field;

    subject_str = strdup(item->ovr_subject);
    if (subject_str == NULL) {
      res = MAIL_ERROR_MEMORY;
      goto free_list;
    }
    
    subject = mailimf_subject_new(subject_str);
    if (subject == NULL) {
      free(subject_str);
      res = MAIL_ERROR_MEMORY;
      goto free_list;
    }

    field = mailimf_field_new(MAILIMF_FIELD_SUBJECT,
        NULL, NULL, NULL, NULL, NULL, NULL, NULL,
        NULL, NULL, NULL,
        NULL, NULL, NULL, NULL, NULL, NULL, NULL,
        NULL, subject, NULL, NULL, NULL);
    if (field == NULL) {
      mailimf_subject_free(subject);
      res = MAIL_ERROR_MEMORY;
      goto free_list;
    }

    r = clist_append(list, field);
    if (r < 0) {
      mailimf_field_free(field);
      res = MAIL_ERROR_MEMORY;
      goto free_list;
    }
  }

  if (item->ovr_author != NULL) {
    struct mailimf_mailbox_list * mb_list;
    struct mailimf_from * from;
    struct mailimf_field * field;

    cur_token = 0;
    r = mailimf_mailbox_list_parse(item->ovr_author, strlen(item->ovr_author),
				   &cur_token, &mb_list);
    switch (r) {
    case MAILIMF_NO_ERROR:
      from = mailimf_from_new(mb_list);
      if (from == NULL) {
	mailimf_mailbox_list_free(mb_list);
	res = MAIL_ERROR_MEMORY;
	goto free_list;
      }

      field = mailimf_field_new(MAILIMF_FIELD_FROM,
          NULL, NULL, NULL, NULL, NULL, NULL, NULL,
          NULL, NULL, from,
          NULL, NULL, NULL, NULL, NULL, NULL, NULL,
          NULL, NULL, NULL, NULL, NULL);
      if (field == NULL) {
	mailimf_from_free(from);
	res = MAIL_ERROR_MEMORY;
	goto free_list;
      }

      r = clist_append(list, field);
      if (r < 0) {
	mailimf_field_free(field);
	res = MAIL_ERROR_MEMORY;
	goto free_list;
      }
      break;

    case MAILIMF_ERROR_PARSE:
      break;

    default:
      res = maildriver_imf_error_to_mail_error(r);
      goto free_list;
    }
  }

  if (item->ovr_date != NULL) {
    struct mailimf_date_time * date_time;
    struct mailimf_orig_date * orig_date;
    struct mailimf_field * field;

    cur_token = 0;
    r = mailimf_date_time_parse(item->ovr_date, strlen(item->ovr_date),
				&cur_token, &date_time);
    switch (r) {
    case MAILIMF_NO_ERROR:
      orig_date = mailimf_orig_date_new(date_time);
      if (orig_date == NULL) {
	mailimf_date_time_free(date_time);
	res = MAIL_ERROR_MEMORY;
	goto free_list;
      }

      field = mailimf_field_new(MAILIMF_FIELD_ORIG_DATE,
          NULL, NULL, NULL, NULL, NULL, NULL, NULL,
          NULL, orig_date, NULL,
          NULL, NULL, NULL, NULL, NULL, NULL, NULL,
          NULL, NULL, NULL, NULL, NULL);
      if (field == NULL) {
	mailimf_orig_date_free(orig_date);
	res = MAIL_ERROR_MEMORY;
	goto free_list;
      }

      r = clist_append(list, field);
      if (r < 0) {
	mailimf_field_free(field);
	res = MAIL_ERROR_MEMORY;
	goto free_list;
      }
      break;

    case MAILIMF_ERROR_PARSE:
      break;

    default:
      res = maildriver_imf_error_to_mail_error(r);
      goto free_list;
    }
  }

  if (item->ovr_message_id != NULL)  {
    char * msgid_str;
    struct mailimf_message_id * msgid;
    struct mailimf_field * field;

    cur_token = 0;
    r = mailimf_msg_id_parse(item->ovr_message_id, strlen(item->ovr_message_id),
			     &cur_token, &msgid_str);
    
    switch (r) {
    case MAILIMF_NO_ERROR:
      msgid = mailimf_message_id_new(msgid_str);
      if (msgid == NULL) {
	mailimf_msg_id_free(msgid_str);
	res = MAIL_ERROR_MEMORY;
	goto free_list;
      }

      field = mailimf_field_new(MAILIMF_FIELD_MESSAGE_ID,
          NULL, NULL, NULL, NULL, NULL, NULL, NULL,
          NULL, NULL, NULL,
          NULL, NULL, NULL, NULL, NULL, msgid, NULL,
          NULL, NULL, NULL, NULL, NULL);

      r = clist_append(list, field);
      if (r < 0) {
	mailimf_field_free(field);
	res = MAIL_ERROR_MEMORY;
	goto free_list;
      }
      break;

    case MAILIMF_ERROR_PARSE:
      break;

    default:
      res = maildriver_imf_error_to_mail_error(r);
      goto free_list;
    }
  }

  if (item->ovr_references != NULL) {
    clist * msgid_list;
    struct mailimf_references * references;
    struct mailimf_field * field;
    
    cur_token = 0;

    r = mailimf_msg_id_list_parse(item->ovr_references, strlen(item->ovr_references),
				  &cur_token, &msgid_list);

    switch (r) {
    case MAILIMF_NO_ERROR:
      references = mailimf_references_new(msgid_list);
      if (references == NULL) {
	clist_foreach(msgid_list,
		      (clist_func) mailimf_msg_id_free, NULL);
	clist_free(msgid_list);
	res = MAIL_ERROR_MEMORY;
	goto free_list;
      }

      field = mailimf_field_new(MAILIMF_FIELD_REFERENCES,
          NULL, NULL, NULL, NULL, NULL, NULL, NULL,
          NULL, NULL, NULL,
          NULL, NULL, NULL, NULL, NULL, NULL, NULL,
          references, NULL, NULL, NULL, NULL);

      r = clist_append(list, field);
      if (r < 0) {
	mailimf_field_free(field);
	res = MAIL_ERROR_MEMORY;
	goto free_list;
      }

    case MAILIMF_ERROR_PARSE:
      break;

    default:
      res = maildriver_imf_error_to_mail_error(r);
      goto free_list;
    }
  }

  fields = mailimf_fields_new(list);
  if (fields == NULL) {
    res = MAIL_ERROR_MEMORY;
    goto free_list;
  }

  * result = fields;

  return MAIL_NO_ERROR;

 free_list:
  clist_foreach(list, (clist_func) mailimf_field_free, NULL);
  clist_free(list);
 err:
  return res;
}