This is needed at least by Exim authentication until it gets updated.
const char *mechanisms, *mechanisms_cbind = "";
string_t *str;
+ if (conn->handshake_finished)
+ return;
+
if (conn->token_auth) {
mechanisms = t_strconcat("MECH\t",
mech_dovecot_token.mech_name, "\tprivate\n", NULL);
str_append(str, "\nDONE\n");
o_stream_nsend(conn->conn.output, str_data(str), str_len(str));
+ conn->handshake_finished = TRUE;
}
static int auth_client_handshake_args(struct connection *conn, const char *const *args)
conn->conn.list->set.major_version,
conn->conn.list->set.minor_version);
o_stream_nsend(conn->conn.output, str_data(str), str_len(str));
+
+ if ((flags & AUTH_CLIENT_CONNECTION_FLAG_LEGACY) != 0)
+ auth_client_finish_handshake(conn);
}
static void auth_client_connection_unref(struct auth_client_connection **_conn)
enum auth_client_connection_flags {
AUTH_CLIENT_CONNECTION_FLAG_LOGIN_REQUESTS = BIT(0),
AUTH_CLIENT_CONNECTION_FLAG_TOKEN_AUTH = BIT(1),
+ AUTH_CLIENT_CONNECTION_FLAG_LEGACY = BIT(2),
};
struct auth_client_connection {
bool login_requests:1;
bool version_received:1;
bool token_auth:1;
+ bool handshake_finished:1;
};
void auth_client_connection_create(struct auth *auth, int fd, const char *name,
enum auth_client_connection_flags flags);
enum auth_socket_type {
AUTH_SOCKET_AUTH,
+ AUTH_SOCKET_AUTH_LEGACY,
AUTH_SOCKET_LOGIN,
AUTH_SOCKET_MASTER,
AUTH_SOCKET_USERDB,
static const char *const auth_socket_type_names[] = {
"auth",
+ "auth-legacy",
"login",
"master",
"userdb",
case AUTH_SOCKET_AUTH:
auth_client_connection_create(auth, conn->fd, conn->name, 0);
break;
+ case AUTH_SOCKET_AUTH_LEGACY:
+ auth_client_connection_create(auth, conn->fd, conn->name,
+ AUTH_CLIENT_CONNECTION_FLAG_LEGACY);
+ break;
case AUTH_SOCKET_TOKEN_LOGIN:
auth_client_connection_create(auth, conn->fd, conn->name,
AUTH_CLIENT_CONNECTION_FLAG_LOGIN_REQUESTS |