const struct smtp_server_callbacks *callbacks = conn->callbacks;
struct smtp_server_command *command = cmd->cmd;
struct smtp_server_cmd_mail *mail_data;
+ enum smtp_address_parse_flags path_parse_flags;
struct smtp_address *path;
enum smtp_param_parse_error pperror;
const char *error;
smtp_server_reply(cmd, 501, "5.5.4", "Invalid parameters");
return;
}
- if (smtp_address_parse_path_full(pool_datastack_create(), params + 5,
- SMTP_ADDRESS_PARSE_FLAG_ALLOW_EMPTY,
- &path, &error, ¶ms) < 0) {
+ if (params[5] != ' ' && params[5] != '\t') {
+ params += 5;
+ } else if ((set->workarounds &
+ SMTP_SERVER_WORKAROUND_WHITESPACE_BEFORE_PATH) != 0) {
+ params += 5;
+ while (*params == ' ' || *params == '\t')
+ params++;
+ } else {
+ smtp_server_reply(cmd, 501, "5.5.4",
+ "Invalid FROM: "
+ "Unexpected whitespace before path");
+ return;
+ }
+ path_parse_flags = SMTP_ADDRESS_PARSE_FLAG_ALLOW_EMPTY;
+ if (*params != '\0' &&
+ (set->workarounds & SMTP_SERVER_WORKAROUND_MAILBOX_FOR_PATH) != 0)
+ path_parse_flags |= SMTP_ADDRESS_PARSE_FLAG_BRACKETS_OPTIONAL;
+ if (smtp_address_parse_path_full(pool_datastack_create(), params,
+ path_parse_flags, &path, &error,
+ ¶ms) < 0) {
smtp_server_reply(cmd, 501, "5.5.4", "Invalid FROM: %s", error);
return;
}
const struct smtp_server_callbacks *callbacks = conn->callbacks;
struct smtp_server_command *command = cmd->cmd;
struct smtp_server_cmd_rcpt *rcpt_data;
+ enum smtp_address_parse_flags path_parse_flags;
struct smtp_address *path;
enum smtp_param_parse_error pperror;
const char *error;
501, "5.5.4", "Invalid parameters");
return;
}
- if (smtp_address_parse_path_full(pool_datastack_create(), params + 3,
- SMTP_ADDRESS_PARSE_FLAG_ALLOW_LOCALPART,
- &path, &error, ¶ms) < 0) {
+ if (params[3] != ' ' && params[3] != '\t') {
+ params += 3;
+ } else if ((set->workarounds &
+ SMTP_SERVER_WORKAROUND_WHITESPACE_BEFORE_PATH) != 0) {
+ params += 3;
+ while (*params == ' ' || *params == '\t')
+ params++;
+ } else {
+ smtp_server_reply(cmd, 501, "5.5.4",
+ "Invalid TO: "
+ "Unexpected whitespace before path");
+ return;
+ }
+ path_parse_flags = SMTP_ADDRESS_PARSE_FLAG_ALLOW_LOCALPART;
+ if ((set->workarounds & SMTP_SERVER_WORKAROUND_MAILBOX_FOR_PATH) != 0)
+ path_parse_flags |= SMTP_ADDRESS_PARSE_FLAG_BRACKETS_OPTIONAL;
+ if (smtp_address_parse_path_full(pool_datastack_create(), params,
+ path_parse_flags, &path, &error,
+ ¶ms) < 0) {
smtp_server_reply(cmd,
501, "5.5.4", "Invalid TO: %s", error);
return;
}
if (set->capabilities != 0)
conn->set.capabilities = set->capabilities;
+ conn->set.workarounds |= set->workarounds;
+
if (set->max_client_idle_time_msecs > 0) {
conn->set.max_client_idle_time_msecs =
set->max_client_idle_time_msecs;
} else {
server->set.capabilities = set->capabilities;
}
+ server->set.workarounds = set->workarounds;
server->set.max_client_idle_time_msecs = set->max_client_idle_time_msecs;
server->set.max_pipelined_commands = (set->max_pipelined_commands > 0 ?
set->max_pipelined_commands : 1);
* Server
*/
+enum smtp_server_workarounds {
+ SMTP_SERVER_WORKAROUND_WHITESPACE_BEFORE_PATH = BIT(0),
+ SMTP_SERVER_WORKAROUND_MAILBOX_FOR_PATH = BIT(1)
+};
+
struct smtp_server_settings {
enum smtp_protocol protocol;
enum smtp_capability capabilities;
+ enum smtp_server_workarounds workarounds;
const char *hostname;
const char *login_greeting;