struct smtp_server_command *command = cmd->cmd;
struct smtp_server_cmd_mail *mail_data;
enum smtp_address_parse_flags path_parse_flags;
+ const char *const *param_extensions = NULL;
struct smtp_address *path;
enum smtp_param_parse_error pperror;
const char *error;
mail_data = p_new(cmd->pool, struct smtp_server_cmd_mail, 1);
/* [SP Mail-parameters] */
- if (smtp_params_mail_parse(cmd->pool, params, caps,
- set->mail_param_extensions, NULL,
- &mail_data->params, &pperror, &error) < 0) {
+ if (array_is_created(&conn->mail_param_extensions))
+ param_extensions = array_idx(&conn->mail_param_extensions, 0);
+ if (smtp_params_mail_parse(cmd->pool, params, caps, param_extensions,
+ NULL, &mail_data->params, &pperror,
+ &error) < 0) {
switch (pperror) {
case SMTP_PARAM_PARSE_ERROR_BAD_SYNTAX:
smtp_server_reply(cmd, 501, "5.5.4", "%s", error);
struct smtp_server_command *command = cmd->cmd;
struct smtp_server_cmd_rcpt *rcpt_data;
enum smtp_address_parse_flags path_parse_flags;
+ const char *const *param_extensions = NULL;
struct smtp_address *path;
enum smtp_param_parse_error pperror;
const char *error;
rcpt_data = p_new(cmd->pool, struct smtp_server_cmd_rcpt, 1);
/* [SP Rcpt-parameters] */
- if (smtp_params_rcpt_parse(cmd->pool, params, caps,
- set->rcpt_param_extensions,
+ if (array_is_created(&conn->rcpt_param_extensions))
+ param_extensions = array_idx(&conn->rcpt_param_extensions, 0);
+ if (smtp_params_rcpt_parse(cmd->pool, params, caps, param_extensions,
&rcpt_data->params, &pperror, &error) < 0) {
switch (pperror) {
case SMTP_PARAM_PARSE_ERROR_BAD_SYNTAX:
conn->set.debug = conn->set.debug || set->debug;
}
+ if (set != NULL && set->mail_param_extensions != NULL) {
+ const char *const *extp;
+
+ p_array_init(&conn->mail_param_extensions, pool,
+ str_array_length(set->mail_param_extensions) + 8);
+ for (extp = set->mail_param_extensions; *extp != NULL; extp++) {
+ const char *ext = p_strdup(pool, *extp);
+ array_append(&conn->mail_param_extensions, &ext, 1);
+ }
+ array_append_zero(&conn->mail_param_extensions);
+ }
+ if (set != NULL && set->rcpt_param_extensions != NULL) {
+ const char *const *extp;
+
+ p_array_init(&conn->rcpt_param_extensions, pool,
+ str_array_length(set->rcpt_param_extensions) + 8);
+ for (extp = set->rcpt_param_extensions; *extp != NULL; extp++) {
+ const char *ext = p_strdup(pool, *extp);
+ array_append(&conn->rcpt_param_extensions, &ext, 1);
+ }
+ array_append_zero(&conn->rcpt_param_extensions);
+ }
+
conn->remote_pid = (pid_t)-1;
conn->remote_uid = (uid_t)-1;
if (remote_ip != NULL && remote_ip->family != 0) {
}
}
+void smtp_server_connection_register_mail_param(
+ struct smtp_server_connection *conn, const char *param)
+{
+ param = p_strdup(conn->pool, param);
+
+ if (!array_is_created(&conn->mail_param_extensions)) {
+ p_array_init(&conn->mail_param_extensions, conn->pool, 8);
+ array_append(&conn->mail_param_extensions, ¶m, 1);
+ } else {
+ unsigned int count = array_count(&conn->mail_param_extensions);
+
+ i_assert(count > 0);
+ array_idx_set(&conn->mail_param_extensions,
+ count - 1, ¶m);
+ }
+ array_append_zero(&conn->mail_param_extensions);
+}
+
+void smtp_server_connection_register_rcpt_param(
+ struct smtp_server_connection *conn, const char *param)
+{
+ param = p_strdup(conn->pool, param);
+
+ if (!array_is_created(&conn->rcpt_param_extensions)) {
+ p_array_init(&conn->rcpt_param_extensions, conn->pool, 8);
+ array_append(&conn->rcpt_param_extensions, ¶m, 1);
+ } else {
+ unsigned int count = array_count(&conn->rcpt_param_extensions);
+
+ i_assert(count > 0);
+ array_idx_set(&conn->rcpt_param_extensions,
+ count - 1, ¶m);
+ }
+ array_append_zero(&conn->rcpt_param_extensions);
+}
+
void smtp_server_connection_switch_ioloop(struct smtp_server_connection *conn)
{
if (conn->to_idle != NULL)
unsigned int refcount;
struct smtp_server_settings set;
+
+ ARRAY_TYPE(const_string) mail_param_extensions; /* NULL-terminated */
+ ARRAY_TYPE(const_string) rcpt_param_extensions; /* NULL-terminated */
+
const struct smtp_server_callbacks *callbacks;
void *context;
void smtp_server_connection_set_capabilities(
struct smtp_server_connection *conn, enum smtp_capability capabilities);
+void smtp_server_connection_register_mail_param(
+ struct smtp_server_connection *conn, const char *param);
+void smtp_server_connection_register_rcpt_param(
+ struct smtp_server_connection *conn, const char *param);
+
bool smtp_server_connection_is_ssl_secured(struct smtp_server_connection *conn);
bool smtp_server_connection_is_trusted(struct smtp_server_connection *conn);