client-authenticate.c revision 04eb0abcf8f8b0c014499b5c5bae89484553613f
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen/* Copyright (c) 2002-2016 Dovecot authors, see the included COPYING file */
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainenvoid client_authenticate_get_capabilities(struct client *client, string_t *str)
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen unsigned int i, count;
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen mech = sasl_server_get_advertised_mechs(client, &count);
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen for (i = 0; i < count; i++) {
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainenvoid imap_client_auth_result(struct client *client,
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen /* nothing to be done for IMAP */
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen /* IMAP referral
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen [nologin] referral host=.. [port=..] [destuser=..]
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen NO [REFERRAL imap://destuser;AUTH=..@host:port/] Can't login.
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen OK [...] Logged in, but you should use this server instead.
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen .. [REFERRAL ..] (Reason from auth server)
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen if (result == CLIENT_AUTH_RESULT_REFERRAL_SUCCESS) {
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen client_send_reply_code(client, IMAP_CMD_REPLY_OK,
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen client_send_reply_code(client, IMAP_CMD_REPLY_NO,
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen client_send_reply(client, IMAP_CMD_REPLY_BAD, text);
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen client_send_reply(client, IMAP_CMD_REPLY_NO, text);
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen client_send_reply_code(client, IMAP_CMD_REPLY_NO,
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen client_send_reply_code(client, IMAP_CMD_REPLY_NO,
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen client_send_reply_code(client, IMAP_CMD_REPLY_NO,
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen client_send_reply_code(client, IMAP_CMD_REPLY_NO,
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen client_send_reply_code(client, IMAP_CMD_REPLY_NO,
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainenimap_client_auth_begin(struct imap_client *imap_client, const char *mech_name,
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen imap_client->client_ignores_capability_resp_code ? 1 : 0,
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen i_free(imap_client->common.master_data_prefix);
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen imap_client->common.master_data_prefix = (void *)prefix;
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen imap_client->common.master_data_prefix_len = strlen(prefix)+1;
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen return client_auth_begin(&imap_client->common, mech_name, init_resp);
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainenint cmd_authenticate(struct imap_client *imap_client, bool *parsed_r)
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen /* NOTE: This command's input is handled specially because the
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen SASL-IR can be large. */
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen const unsigned char *data;
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen /* <auth mechanism name> [<initial SASL response>] */
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen data = i_stream_get_data(client->input, &size);
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen for (i = 0; i < size; i++) {
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen if (i == 0) {
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen /* empty mechanism name */
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen /* get SASL-IR, if any */
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen if ((ret = client_auth_read_line(client)) <= 0)
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainenint cmd_login(struct imap_client *imap_client, const struct imap_arg *args)
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen /* two arguments: username and password */
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen if (!client_check_plaintext_auth(client, TRUE)) {
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen /* authorization ID \0 authentication ID \0 pass */
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen plain_login = buffer_create_dynamic(pool_datastack_create(), 64);
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen buffer_append(plain_login, user, strlen(user));
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen buffer_append(plain_login, pass, strlen(pass));
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen base64 = buffer_create_dynamic(pool_datastack_create(),
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen base64_encode(plain_login->data, plain_login->used, base64);