smtp-server-reply.c revision 20b78f502ff73c8c081a0af138ea403418d7d899
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2013-2018 Dovecot authors, see the included COPYING file */
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschsmtp_server_reply_debug(struct smtp_server_reply *reply,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch const char *format, ...)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct smtp_server_command *command = reply->command;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct smtp_server_connection *conn = command->context.conn;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch const struct smtp_server_settings *set = &conn->set;
bac6427712674cd4b6146ef51f90c14eb9603db6Timo Sirainen "command %s; %u reply [%u/%u]: %s",
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch reply->status, reply->index+1, command->replies_expected,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen "command %s; %u reply: %s",
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch reply->status, t_strdup_vprintf(format, args));
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic void smtp_server_reply_clear(struct smtp_server_reply *reply)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschsmtp_server_reply_create_index(struct smtp_server_command *cmd,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen /* RFC 5321, Section 4.2:
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen In the absence of extensions negotiated with the client, SMTP servers
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen MUST NOT send reply codes whose first digits are other than 2, 3, 4,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen or 5. Clients that receive such out-of-range codes SHOULD normally
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen treat them as fatal errors and terminate the mail transaction.
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch /* RFC 2034, Section 4:
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch All status codes returned by the server must agree with the primary
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch response code, that is, a 2xx response must incorporate a 2.X.X code,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch a 4xx response must incorporate a 4.X.X code, and a 5xx response must
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch incorporate a 5.X.X code.
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainen i_assert(enh_code == NULL || *enh_code == '\0' ||
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch ((unsigned int)(enh_code[0] - '0') == (status / 100)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch reply = array_idx_modifiable(&cmd->replies, index);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch /* get rid of any existing reply */
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch p_array_init(&cmd->replies, pool, cmd->replies_expected);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch array_idx_clear(&cmd->replies, cmd->replies_expected - 1);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch reply = array_idx_modifiable(&cmd->replies, index);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch p_strdup_printf(pool, "%03u-%s ", status, enh_code);
04f9886078d53b136f747484b3ad9e1f7fad5994Timo Sirainensmtp_server_reply_create(struct smtp_server_command *cmd,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch return smtp_server_reply_create_index(cmd, 0, status, enh_code);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschsmtp_server_reply_create_forward(struct smtp_server_command *cmd,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch unsigned int index, const struct smtp_reply *from)
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen reply = smtp_server_reply_create_index(cmd, index,
bac6427712674cd4b6146ef51f90c14eb9603db6Timo Sirainenvoid smtp_server_reply_free(struct smtp_server_command *cmd)
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen unsigned int i;
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainenvoid smtp_server_reply_add_text(struct smtp_server_reply *reply,
1a3254b83ba00315cfc47d3c6e99e837914594cfTimo Sirainen const char *p;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch str_append(reply->text, reply->status_prefix);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch str_append_n(reply->text, text, p - text - 1);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschvoid smtp_server_reply_submit(struct smtp_server_reply *reply)
3ab672903a7ed98263b89180261079870c964831Timo Sirainen smtp_server_command_submit_reply(reply->command);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschvoid smtp_server_reply_indexv(struct smtp_server_cmd_ctx *_cmd,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch unsigned int index, unsigned int status, const char *enh_code,
3ab672903a7ed98263b89180261079870c964831Timo Sirainen reply = smtp_server_reply_create_index(cmd, index, status, enh_code);
3ab672903a7ed98263b89180261079870c964831Timo Sirainen smtp_server_reply_add_text(reply, t_strdup_vprintf(fmt, args));
3ab672903a7ed98263b89180261079870c964831Timo Sirainenvoid smtp_server_reply(struct smtp_server_cmd_ctx *_cmd,
3ab672903a7ed98263b89180261079870c964831Timo Sirainen unsigned int status, const char *enh_code, const char *fmt, ...)
c67f6d09c1aa9d8bfdce4167da8ac009fd2917ceTimo Sirainen smtp_server_reply_indexv(_cmd, 0, status, enh_code, fmt, args);
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainenvoid smtp_server_reply_index(struct smtp_server_cmd_ctx *_cmd,
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen unsigned int index, unsigned int status, const char *enh_code,
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen const char *fmt, ...)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch smtp_server_reply_indexv(_cmd, index, status, enh_code, fmt, args);
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainenvoid smtp_server_reply_index_forward(struct smtp_server_cmd_ctx *cmd,
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen unsigned int index, const struct smtp_reply *from)
2c42748505ef4aed83ff59b34e50ed5606900c86Timo Sirainen smtp_server_reply_create_forward(cmd->cmd, index, from));
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainenvoid smtp_server_reply_forward(struct smtp_server_cmd_ctx *_cmd,
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen smtp_server_reply_create_forward(cmd, 0, from));
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschsmtp_server_reply_allv(struct smtp_server_cmd_ctx *_cmd,
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen unsigned int i = 0;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch /* find the first unsent reply */
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch /* compose the reply text */
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch /* submit remaining replies */
3ab672903a7ed98263b89180261079870c964831Timo Sirainenvoid smtp_server_reply_all(struct smtp_server_cmd_ctx *_cmd,
3ab672903a7ed98263b89180261079870c964831Timo Sirainen const char *fmt, ...)
3ab672903a7ed98263b89180261079870c964831Timo Sirainen smtp_server_reply_allv(_cmd, status, enh_code, fmt, args);
3ab672903a7ed98263b89180261079870c964831Timo Sirainenvoid smtp_server_reply_early(struct smtp_server_cmd_ctx *_cmd,
3ab672903a7ed98263b89180261079870c964831Timo Sirainen const char *fmt, ...)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch smtp_server_reply_allv(_cmd, status, enh_code, fmt, args);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschvoid smtp_server_reply_quit(struct smtp_server_cmd_ctx *_cmd)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch reply = smtp_server_reply_create(cmd, 221, "2.0.0");
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschconst char *smtp_server_reply_get_one_line(struct smtp_server_reply *reply)
const char *text, *p;
const char **error_r)
char *text;
int ret = 0;
return ret;
const char **error_r)
int ret;
T_BEGIN {
} T_END;
return ret;
struct smtp_server_reply *
return reply;
const char *keyword)
static const char *base_fields =
NULL));