strlen(IMAP_RESP_CODE_SERVERBUG"]")) == 0;
}
+static bool auth_resp_code_is_limit(const char *resp)
+{
+ return strncasecmp(resp, IMAP_RESP_CODE_LIMIT"]",
+ strlen(IMAP_RESP_CODE_LIMIT"]")) == 0;
+}
+
static bool
auth_resp_code_parse_referral(struct client *client, const char *resp,
const char **userhostport_r)
else if (auth_resp_code_is_serverbug(line + 4))
failure_type = LOGIN_PROXY_FAILURE_TYPE_REMOTE;
else {
+ if (auth_resp_code_is_limit(line + 4))
+ failure_type = LOGIN_PROXY_FAILURE_TYPE_AUTH_LIMIT_REACHED_REPLIED;
client_send_raw(client, t_strconcat(
imap_client->cmd_tag, " ", line, "\r\n", NULL));
}
imap_client->cmd_tag, " NO ", reason, "\r\n", NULL));
break;
case LOGIN_PROXY_FAILURE_TYPE_AUTH_REPLIED:
+ case LOGIN_PROXY_FAILURE_TYPE_AUTH_LIMIT_REACHED_REPLIED:
/* reply was already sent */
break;
}
event_reason = "redirected";
last_reason = "redirected";
break;
+ case LOGIN_PROXY_FAILURE_TYPE_AUTH_LIMIT_REACHED_REPLIED:
+ event_reason = "connection_limit";
+ last_reason = "connection limit reached";
+ break;
default:
i_unreached();
}
break;
case LOGIN_PROXY_FAILURE_TYPE_AUTH_REPLIED:
case LOGIN_PROXY_FAILURE_TYPE_AUTH_NOT_REPLIED:
+ case LOGIN_PROXY_FAILURE_TYPE_AUTH_LIMIT_REACHED_REPLIED:
log_prefix = "";
try_reconnect = FALSE;
break;
i_strdup_printf("%s%s", log_prefix, reason);
if (type != LOGIN_PROXY_FAILURE_TYPE_AUTH_REPLIED &&
+ type != LOGIN_PROXY_FAILURE_TYPE_AUTH_LIMIT_REACHED_REPLIED &&
type != LOGIN_PROXY_FAILURE_TYPE_AUTH_NOT_REPLIED &&
type != LOGIN_PROXY_FAILURE_TYPE_AUTH_TEMPFAIL)
e_error(event, "%s%s", log_prefix, reason);
/* Authentication requests connecting to another host. The reason
string contains the host (and optionally :port). */
LOGIN_PROXY_FAILURE_TYPE_AUTH_REDIRECT,
+ /* Authentication failed because user has reached some limit.
+ The LOGIN/AUTH command reply was already sent to the client. */
+ LOGIN_PROXY_FAILURE_TYPE_AUTH_LIMIT_REACHED_REPLIED,
};
struct login_proxy_settings {
} else if (pop3_proxy_parse_referral(client, line + 5, &line)) {
failure_type = LOGIN_PROXY_FAILURE_TYPE_AUTH_REDIRECT;
} else {
+ if (str_begins_with(line, "-ERR [IN-USE]"))
+ failure_type = LOGIN_PROXY_FAILURE_TYPE_AUTH_LIMIT_REACHED_REPLIED;
client_send_raw(client, t_strconcat(line, "\r\n", NULL));
line += 5;
}
client_send_reply(client, POP3_CMD_REPLY_ERROR, reason);
break;
case LOGIN_PROXY_FAILURE_TYPE_AUTH_REPLIED:
+ case LOGIN_PROXY_FAILURE_TYPE_AUTH_LIMIT_REACHED_REPLIED:
/* reply was already sent */
break;
}
smtp_server_reply_submit(subm_client->proxy_reply);
break;
case LOGIN_PROXY_FAILURE_TYPE_AUTH_REPLIED:
+ case LOGIN_PROXY_FAILURE_TYPE_AUTH_LIMIT_REACHED_REPLIED:
/* reply was already sent */
i_assert(cmd == NULL);
break;