gboolean parse_smtp_from (struct smtp_session *session, struct smtp_command *cmd) { rspamd_ftok_t *arg; GList *cur = cmd->args; if (cmd->args == NULL) { session->error = SMTP_ERROR_BAD_ARGUMENTS; return FALSE; } arg = cur->data; /* First argument MUST be FROM */ if (arg->len != 4 || ( g_ascii_toupper (arg->begin[0]) != 'F' || g_ascii_toupper (arg->begin[1]) != 'R' || g_ascii_toupper (arg->begin[2]) != 'O' || g_ascii_toupper (arg->begin[3]) != 'M')) { session->error = SMTP_ERROR_BAD_ARGUMENTS; return FALSE; } /* Next one is from address */ cur = g_list_next (cur); if (cur == NULL) { session->error = SMTP_ERROR_BAD_ARGUMENTS; return FALSE; } arg = cur->data; if (check_smtp_path (arg)) { session->from = cur; } else { session->error = SMTP_ERROR_BAD_ARGUMENTS; return FALSE; } return TRUE; }
gboolean parse_smtp_rcpt (struct smtp_session *session, struct smtp_command *cmd) { f_str_t *arg; GList *cur = cmd->args; if (cmd->args == NULL) { session->error = SMTP_ERROR_BAD_ARGUMENTS; return FALSE; } arg = cur->data; /* First argument MUST be FROM */ if (arg->len != 2 || ( g_ascii_toupper (arg->begin[0]) != 'T' || g_ascii_toupper (arg->begin[1]) != 'O')) { session->error = SMTP_ERROR_BAD_ARGUMENTS; return FALSE; } /* Next one is from address */ cur = g_list_next (cur); if (cur == NULL) { session->error = SMTP_ERROR_BAD_ARGUMENTS; return FALSE; } arg = cur->data; if (check_smtp_path (arg)) { session->rcpt = g_list_prepend (session->rcpt, cur); } else { session->error = SMTP_ERROR_BAD_ARGUMENTS; return FALSE; } return TRUE; }