sasl-server.c revision 9137c55411aa39d41c1e705ddc34d5bd26c65021
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen "Maximum number of connections from user+IP exceeded " \
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen "(mail_max_userip_connections)"
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainensasl_server_get_advertised_mechs(struct client *client, unsigned int *count_r)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen unsigned int i, j, count;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen mech = auth_client_get_available_mechs(auth_client, &count);
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen ret_mech = t_new(struct auth_mech_desc, count);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen for (i = j = 0; i < count; i++) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen /* a) transport is secured
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen b) auth mechanism isn't plaintext
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen c) we allow insecure authentication
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if ((mech[i].flags & MECH_SEC_PRIVATE) == 0 &&
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen (client->secured || !client->set->disable_plaintext_auth ||
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ssl_proxy_has_valid_client_cert(client->ssl_proxy))
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen auth_flags |= AUTH_REQUEST_FLAG_VALID_CLIENT_CERT;
3b49aee9ced3b0370a3be396aca53acd5f21418cTimo Sirainencall_client_callback(struct client *client, enum sasl_server_reply reply,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen i_assert(reply != SASL_SERVER_REPLY_CONTINUE);
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen /* NOTE: client may be destroyed now */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenmaster_auth_callback(const struct master_auth_reply *reply, void *context)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen enum sasl_server_reply sasl_reply = SASL_SERVER_REPLY_MASTER_FAILED;
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen call_client_callback(client, sasl_reply, data, NULL);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenmaster_send_request(struct client *client, struct auth_client_request *request)
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen const unsigned char *data;
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen req.auth_pid = auth_client_request_get_server_pid(request);
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen req.auth_id = auth_client_request_get_id(request);
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen buf = buffer_create_dynamic(pool_datastack_create(), 256);
dee43975a70bcdb9dc83d34d6a2b177d37bb7194Timo Sirainen buffer_append(buf, client->master_data_prefix,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen data = i_stream_get_data(client->input, &size);
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen master_auth_request(master_service, client->fd, &req, buf->data,
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainenstatic bool anvil_has_too_many_connections(struct client *client)
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen const char *ident;
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen if (client->set->mail_max_userip_connections == 0)
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen ident = t_strconcat("LOOKUP\t", net_ip2addr(&client->ip), "/",
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen if (write_full(anvil_fd, ident, strlen(ident)) < 0) {
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen /* anvil process was probably recreated, don't bother
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen logging an error about losing connection to it */
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen else if (ret == 0)
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen i_fatal("anvil lookup failed: Invalid input in reply");
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainenauthenticate_callback(struct auth_client_request *request,
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen enum auth_request_status status, const char *data_base64,
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen unsigned int i;
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen /* client aborted */
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen /* continue */
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen client->sasl_callback(client, SASL_SERVER_REPLY_CONTINUE,
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen /* user can't login */
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen call_client_callback(client, SASL_SERVER_REPLY_SUCCESS,
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen } else if (anvil_has_too_many_connections(client)) {
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen /* parse our username if it's there */
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen call_client_callback(client, SASL_SERVER_REPLY_AUTH_FAILED,
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainenvoid sasl_server_auth_begin(struct client *client,
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen client->auth_mech_name = str_ucase(i_strdup(mech_name));
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen mech = auth_client_find_mech(auth_client, mech_name);
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen "Unsupported authentication mechanism.");
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen if (!client->secured && client->set->disable_plaintext_auth &&
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen "Plaintext authentication disabled.");
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen info.cert_username = client->ssl_proxy == NULL ? NULL :
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen info.initial_resp_base64 = initial_resp_base64;
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainenstatic void sasl_server_auth_cancel(struct client *client, const char *reason,
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen if (client->set->verbose_auth && reason != NULL) {
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen str_sanitize(client->auth_mech_name, MAX_MECH_NAME);
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen "Authenticate %s failed: %s", auth_name, reason));
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen auth_client_request_abort(&client->auth_request);
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen call_client_callback(client, reply, reason, NULL);
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainenvoid sasl_server_auth_failed(struct client *client, const char *reason)
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen sasl_server_auth_cancel(client, reason, SASL_SERVER_REPLY_AUTH_FAILED);
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainenvoid sasl_server_auth_abort(struct client *client)