diff options
Diffstat (limited to 'decoders/mail/mail_smtp.h')
| -rw-r--r-- | decoders/mail/mail_smtp.h | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/decoders/mail/mail_smtp.h b/decoders/mail/mail_smtp.h new file mode 100644 index 0000000..5d74b48 --- /dev/null +++ b/decoders/mail/mail_smtp.h @@ -0,0 +1,90 @@ +#pragma once + +#include "mail_internal.h" +#include "mail_util.h" +#include "mail_email.h" + +#define SMTP_STR_220 "220" +#define SMTP_STR_HELO "HELO " +#define SMTP_STR_EHLO "EHLO " +#define SMTP_LINE_END "\r\n" + +#define SMTP_COMMAND_LINE_PART_CMD 0 +#define SMTP_COMMAND_LINE_PART_ARG 1 +#define SMTP_COMMAND_LINE_PART_NUM 2 + +#define SMTP_LINE_BUFFER_MAX 4096 +#define SMTP_USERNAME_LEN_MAX 128; +#define SMTP_PASSWORD_LEN_MAX 128; + +enum SMTP_COMMAND { + SMTP_COMMAND_UNKNOWN, + SMTP_COMMAND_EHLO, + SMTP_COMMAND_HELO, + SMTP_COMMAND_AUTH, + SMTP_COMMAND_STARTTLS, + SMTP_COMMAND_MAIL, + SMTP_COMMAND_SEND, + SMTP_COMMAND_SOML, + SMTP_COMMAND_SAML, + SMTP_COMMAND_RCPT, + SMTP_COMMAND_DATA, + SMTP_COMMAND_VRFY, + SMTP_COMMAND_EXPN, + SMTP_COMMAND_NOOP, + SMTP_COMMAND_RSET, + SMTP_COMMAND_QUIT, + SMTP_COMMAND_MAX, +}; + +enum SMTP_STATE { + SMTP_STATE_WAITING_COMMAND, + SMTP_STATE_WAITING_AUTHENTICATION, + SMTP_STATE_WAITING_MAIL_DATA, + SMTP_STATE_EXIT, +}; + +struct smtp_command { + enum SMTP_COMMAND cmd; + char *arg; + size_t arg_len; + char *cmd_line; + size_t cmd_line_len; +}; + +enum SMTP_AUTH_TYPE { + SMTP_AUTH_TYPE_UNKNOWN, + SMTP_AUTH_TYPE_LOGIN, + SMTP_AUTH_TYPE_PLAIN, + SMTP_AUTH_TYPE_XOAUTH2, + SMTP_AUTH_TYPE_MAX, +}; + +enum SMTP_AUTH_STATE { + SMTP_AUTH_INIT, + SMTP_AUTH_WAITING_USERNAME, + SMTP_AUTH_WAITING_PASSWORD, + SMTP_AUTH_DONE, +}; + +struct smtp_authentication { + enum SMTP_AUTH_TYPE type; + enum SMTP_AUTH_STATE state; + char username[SMTP_USERNAME_LEN_MAX]; + size_t username_len; + char password[SMTP_PASSWORD_LEN_MAX]; + size_t password_len; +}; + +struct smtp_parser { + enum SMTP_STATE state; + + struct stream_buffer line_buffer; + struct smtp_authentication authentication; + + struct mail_parser *mail_parser; + struct mail_env *mail_env_ref; +}; + +int smtp_identify(const char *payload, size_t payload_len, int is_c2s); +int smtp_parser_process(struct smtp_parser *parser, struct session *sess, const char *payload, size_t payload_len, int is_c2s); |
