smtp-server-private.h revision 1d4c4128808d04cf4b8396ce04ce524da9194782
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#define SMTP_SERVER_COMMAND_POOL_MAX (8 * 1024)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#define SMTP_SERVER_DEFAULT_MAX_COMMAND_LINE (4 * 1024)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#define SMTP_SERVER_DEFAULT_MAX_BAD_COMMANDS 10
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen (SMTP_CAPABILITY_SIZE | SMTP_CAPABILITY_ENHANCEDSTATUSCODES | \
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen SMTP_CAPABILITY_8BITMIME | SMTP_CAPABILITY_CHUNKING)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo SirainenARRAY_DEFINE_TYPE(smtp_server_reply, struct smtp_server_reply);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* New command; callback to command start handler executing. */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* This command is being processed; command data is fully read, but no
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen reply is yet submitted */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* A reply is submitted for this command. If not all command data was
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen read by the handler, it is first skipped on the input. If this is a
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen multi-reply command (LMTP->DATA), not all replies may be submitted
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* Request is ready for sending reply; a reply is submitted and the
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen command payload is fully read. If this is a multi-reply command
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen (LMTP->DATA), not all replies may be submitted yet. In that case the
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen command state goes back to PROCESSING once the all submitted replies
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* The reply for the command is sent */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* Request is aborted; still lingering due to references */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen unsigned int status;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen unsigned int index;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* replies may share content */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* private hooks */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* next: command is next to reply but has not submittted all replies yet */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* replied: command has submitted all replies */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* completed: server is about to send last replies for this command */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* destroy: command is about to be destroyed */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen /* private context data */
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen unsigned int pending_mail_cmds, pending_rcpt_cmds;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct istream *data_input, *data_chain_input;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const struct smtp_server_callbacks *callbacks;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct smtp_server_helo_data helo, *pending_helo;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen unsigned int id;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct smtp_server_command *command_queue_head, *command_queue_tail;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen ARRAY(struct smtp_server_command_reg) commands_reg;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic inline const char *
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainensmtp_server_command_label(struct smtp_server_command *cmd)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen return "[INVALID]";
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic inline const char *
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainensmtp_server_connection_label(struct smtp_server_connection *conn)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenbool smtp_server_connection_pending_command_data(
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_reply_free(struct smtp_server_command *cmd);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenint smtp_server_reply_send(struct smtp_server_reply *resp,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const char **error_r);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenint smtp_server_reply_send_more(struct smtp_server_reply *resp,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const char **error_r);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenconst char *smtp_server_reply_get_one_line(struct smtp_server_reply *reply);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_commands_init(struct smtp_server *server);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_command_debug(struct smtp_server_cmd_ctx *cmd,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainensmtp_server_command_alloc(struct smtp_server_connection *conn);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainensmtp_server_command_new(struct smtp_server_connection *conn,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_command_ref(struct smtp_server_command *cmd);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenbool smtp_server_command_unref(struct smtp_server_command **_cmd);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_command_abort(struct smtp_server_command **_cmd);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_command_submit_reply(struct smtp_server_command *cmd);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenint smtp_server_connection_flush(struct smtp_server_connection *conn);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_command_ready_to_reply(struct smtp_server_command *cmd);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_command_next_to_reply(struct smtp_server_command *cmd);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_command_completed(struct smtp_server_command *cmd);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_command_finished(struct smtp_server_command *cmd);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic inline bool
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainensmtp_server_command_is_complete(struct smtp_server_command *cmd)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct smtp_server_connection *conn = cmd->context.conn;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen return (conn->input_broken || (cmd->next != NULL) || cmd->reply_early ||
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen !smtp_server_connection_pending_command_data(conn));
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_cmd_ehlo(struct smtp_server_cmd_ctx *cmd,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const char *params);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_cmd_helo(struct smtp_server_cmd_ctx *cmd,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const char *params);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_cmd_xclient(struct smtp_server_cmd_ctx *cmd,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const char *params);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_cmd_starttls(struct smtp_server_cmd_ctx *cmd,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const char *params);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_cmd_auth(struct smtp_server_cmd_ctx *cmd,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const char *params);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_cmd_mail(struct smtp_server_cmd_ctx *cmd,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const char *params);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_cmd_rcpt(struct smtp_server_cmd_ctx *cmd,
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen const char *params);
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainenvoid smtp_server_cmd_data(struct smtp_server_cmd_ctx *cmd,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const char *params);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_cmd_bdat(struct smtp_server_cmd_ctx *cmd,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const char *params);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_cmd_rset(struct smtp_server_cmd_ctx *cmd,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const char *params);
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainenvoid smtp_server_cmd_noop(struct smtp_server_cmd_ctx *cmd,
9f19a50d5966643c4d1c5ca06868ac2ad31bc4d5Timo Sirainen const char *params);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_cmd_vrfy(struct smtp_server_cmd_ctx *cmd,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const char *params);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_cmd_quit(struct smtp_server_cmd_ctx *cmd,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const char *params);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainentypedef void smtp_server_input_callback_t(void *context);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_connection_debug(struct smtp_server_connection *conn,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_connection_error(struct smtp_server_connection *conn,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstruct connection_list *smtp_server_connection_list_init(void);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_connection_switch_ioloop(struct smtp_server_connection *conn);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_connection_trigger_output(struct smtp_server_connection *conn);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenbool smtp_server_connection_pending_payload(struct smtp_server_connection *conn);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_connection_cork(struct smtp_server_connection *conn);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_connection_uncork(struct smtp_server_connection *conn);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_connection_input_halt(struct smtp_server_connection *conn);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_connection_input_resume(struct smtp_server_connection *conn);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen smtp_server_input_callback_t *callback, void *context);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen#define smtp_server_connection_input_capture(conn, callback, context) \
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen CALLBACK_TYPECHECK(callback, void (*)(typeof(context))), \
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen (smtp_server_input_callback_t *)callback, context)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_connection_timeout_stop(struct smtp_server_connection *conn);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_connection_timeout_start(struct smtp_server_connection *conn);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_connection_timeout_reset(struct smtp_server_connection *conn);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_connection_send_line(struct smtp_server_connection *conn,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct smtp_server_connection *conn, unsigned int status,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_connection_reset_state(struct smtp_server_connection *conn);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_connection_set_state(struct smtp_server_connection *conn,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenint smtp_server_connection_ssl_init(struct smtp_server_connection *conn);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_connection_clear(struct smtp_server_connection *conn);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainensmtp_server_connection_get_transaction(struct smtp_server_connection *conn);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_connection_set_proxy_data(struct smtp_server_connection *conn,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen * Transaction
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainensmtp_server_transaction_create(struct smtp_server_connection *conn,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenvoid smtp_server_transaction_free(struct smtp_server_transaction **_trans);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainensmtp_server_transaction_add_rcpt(struct smtp_server_transaction *trans,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenbool smtp_server_transaction_has_rcpt(struct smtp_server_transaction *trans);