summaryrefslogtreecommitdiff
path: root/decoders/mail/mail_smtp.h
diff options
context:
space:
mode:
Diffstat (limited to 'decoders/mail/mail_smtp.h')
-rw-r--r--decoders/mail/mail_smtp.h90
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);