static int proxy_start(struct client *client, const struct client_auth_reply *reply) { struct login_proxy_settings proxy_set; i_assert(reply->destuser != NULL); i_assert(!client->destroyed); client->v.proxy_reset(client); if (reply->password == NULL) { client_log_err(client, "proxy: password not given"); client_proxy_error(client, PROXY_FAILURE_MSG); return -1; } if (reply->host == NULL || *reply->host == '\0') { client_log_err(client, "proxy: host not given"); client_proxy_error(client, PROXY_FAILURE_MSG); return -1; } i_assert(client->refcount > 1); if (client->destroyed) { /* connection_queue_add() decided that we were the oldest connection and killed us. */ return -1; } if (login_proxy_is_ourself(client, reply->host, reply->port, reply->destuser)) { client_log_err(client, "Proxying loops to itself"); client_proxy_error(client, PROXY_FAILURE_MSG); return -1; } memset(&proxy_set, 0, sizeof(proxy_set)); proxy_set.host = reply->host; if (reply->hostip != NULL && net_addr2ip(reply->hostip, &proxy_set.ip) < 0) proxy_set.ip.family = 0; proxy_set.port = reply->port; proxy_set.connect_timeout_msecs = reply->proxy_timeout_msecs; proxy_set.notify_refresh_secs = reply->proxy_refresh_secs; proxy_set.ssl_flags = reply->ssl_flags; if (login_proxy_new(client, &proxy_set, proxy_input) < 0) { client_proxy_error(client, PROXY_FAILURE_MSG); return -1; } client->proxy_user = i_strdup(reply->destuser); client->proxy_master_user = i_strdup(reply->master_user); client->proxy_password = i_strdup(reply->password); /* disable input until authentication is finished */ if (client->io != NULL) io_remove(&client->io); return 0; }
void client_proxy_failed(struct client *client, bool send_line) { if (send_line) { client_proxy_error(client, PROXY_FAILURE_MSG); } login_proxy_free(&client->login_proxy); proxy_free_password(client); i_free_and_null(client->proxy_user); i_free_and_null(client->proxy_master_user); /* call this last - it may destroy the client */ client_auth_failed(client); }
static int proxy_start(struct client *client, const struct client_auth_reply *reply) { struct login_proxy_settings proxy_set; const struct dsasl_client_mech *sasl_mech = NULL; i_assert(reply->destuser != NULL); i_assert(!client->destroyed); i_assert(client->proxy_sasl_client == NULL); client->proxy_mech = NULL; client->v.proxy_reset(client); if (reply->password == NULL) { client_log_err(client, "proxy: password not given"); client_proxy_error(client, PROXY_FAILURE_MSG); return -1; } if (reply->host == NULL || *reply->host == '\0') { client_log_err(client, "proxy: host not given"); client_proxy_error(client, PROXY_FAILURE_MSG); return -1; } if (reply->proxy_mech != NULL) { sasl_mech = dsasl_client_mech_find(reply->proxy_mech); if (sasl_mech == NULL) { client_log_err(client, t_strdup_printf( "proxy: Unsupported SASL mechanism %s", reply->proxy_mech)); client_proxy_error(client, PROXY_FAILURE_MSG); return -1; } } else if (reply->master_user != NULL) { /* have to use PLAIN authentication with master user logins */ sasl_mech = &dsasl_client_mech_plain; } i_assert(client->refcount > 1); if (client->destroyed) { /* connection_queue_add() decided that we were the oldest connection and killed us. */ return -1; } if (login_proxy_is_ourself(client, reply->host, reply->port, reply->destuser)) { client_log_err(client, "Proxying loops to itself"); client_proxy_error(client, PROXY_FAILURE_MSG); return -1; } memset(&proxy_set, 0, sizeof(proxy_set)); proxy_set.host = reply->host; if (reply->hostip != NULL && net_addr2ip(reply->hostip, &proxy_set.ip) < 0) proxy_set.ip.family = 0; proxy_set.port = reply->port; proxy_set.connect_timeout_msecs = reply->proxy_timeout_msecs; if (proxy_set.connect_timeout_msecs == 0) proxy_set.connect_timeout_msecs = PROXY_DEFAULT_TIMEOUT_MSECS; proxy_set.notify_refresh_secs = reply->proxy_refresh_secs; proxy_set.ssl_flags = reply->ssl_flags; if (login_proxy_new(client, &proxy_set, proxy_input) < 0) { client_proxy_error(client, PROXY_FAILURE_MSG); return -1; } client->proxy_mech = sasl_mech; client->proxy_user = i_strdup(reply->destuser); client->proxy_master_user = i_strdup(reply->master_user); client->proxy_password = i_strdup(reply->password); client->proxy_nopipelining = reply->proxy_nopipelining; /* disable input until authentication is finished */ if (client->io != NULL) io_remove(&client->io); return 0; }