]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imapc: Added support for PROXYAUTH command by setting imapc_features = proxyauth
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Sat, 16 Jan 2016 19:31:55 +0000 (21:31 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Sat, 16 Jan 2016 19:31:55 +0000 (21:31 +0200)
This can be useful when talking to Sun/Oracle IMAP server, which wants you
to use LOGIN+PROXYAUTH to perform master user logins, instead of supporting
the standard SASL PLAIN authentication.

src/lib-imap-client/imapc-client.c
src/lib-imap-client/imapc-client.h
src/lib-imap-client/imapc-connection.c
src/lib-storage/index/imapc/imapc-settings.c
src/lib-storage/index/imapc/imapc-settings.h
src/lib-storage/index/imapc/imapc-storage.c

index 638790b2cafb462cb62ceda12cb3787740a22a99..fda363eb8ac303f0fba5ddefa7bfda38250e04c3 100644 (file)
@@ -57,6 +57,7 @@ imapc_client_init(const struct imapc_client_settings *set)
        client->set.username = p_strdup(pool, set->username);
        client->set.password = p_strdup(pool, set->password);
        client->set.sasl_mechanisms = p_strdup(pool, set->sasl_mechanisms);
+       client->set.use_proxyauth = set->use_proxyauth;
        client->set.dns_client_socket_path =
                p_strdup(pool, set->dns_client_socket_path);
        client->set.temp_path_prefix =
index 9a0775cbd2f0476089c4f9d1a5bab6e391f684a6..1b3010cba55d7e9cee034faac70224280659308b 100644 (file)
@@ -73,6 +73,7 @@ struct imapc_client_settings {
        /* Space-separated list of SASL mechanisms to try (in the specified
           order). The default is to use only LOGIN command or SASL PLAIN. */
        const char *sasl_mechanisms;
+       bool use_proxyauth; /* Use Sun/Oracle PROXYAUTH command */
        unsigned int max_idle_time;
 
        const char *dns_client_socket_path;
index 97fb5d26a67816d4e52eca68d32cf18df6f43d55..4368c3e64f902f59866504d13fa4cc85425bbbab 100644 (file)
@@ -753,6 +753,25 @@ static void imapc_connection_login_cb(const struct imapc_command_reply *reply,
        imapc_connection_auth_finish(conn, reply);
 }
 
+static void
+imapc_connection_proxyauth_login_cb(const struct imapc_command_reply *reply,
+                                   void *context)
+{
+       struct imapc_connection *conn = context;
+       const struct imapc_client_settings *set = &conn->client->set;
+       struct imapc_command *cmd;
+
+       if (reply->state == IMAPC_COMMAND_STATE_OK) {
+               cmd = imapc_connection_cmd(conn, imapc_connection_login_cb,
+                                          conn);
+               imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_PRELOGIN);
+               imapc_command_sendf(cmd, "PROXYAUTH %s", set->username);
+               imapc_command_send_more(conn);
+       } else {
+               imapc_connection_auth_finish(conn, reply);
+       }
+}
+
 static void
 imapc_connection_authenticate_cb(const struct imapc_command_reply *reply,
                                 void *context)
@@ -861,6 +880,15 @@ static void imapc_connection_authenticate(struct imapc_connection *conn)
                }
        }
 
+       if (set->use_proxyauth && set->master_user != NULL) {
+               /* We can use LOGIN command */
+               cmd = imapc_connection_cmd(conn, imapc_connection_proxyauth_login_cb,
+                                          conn);
+               imapc_command_set_flags(cmd, IMAPC_COMMAND_FLAG_PRELOGIN);
+               imapc_command_sendf(cmd, "LOGIN %s %s",
+                                   set->master_user, set->password);
+               return;
+       }
        if (sasl_mech == NULL &&
            ((set->master_user == NULL &&
              !need_literal(set->username) && !need_literal(set->password)) ||
index b47af9313ee25750a22b0d820d1cae33ddfbec64..9bf13660f9ef6a8d82d2931f3ef6e495e4ccb754 100644 (file)
@@ -88,6 +88,7 @@ static const struct imapc_feature_list imapc_feature_list[] = {
        { "search", IMAPC_FEATURE_SEARCH },
        { "zimbra-workarounds", IMAPC_FEATURE_ZIMBRA_WORKAROUNDS },
        { "no-examine", IMAPC_FEATURE_NO_EXAMINE },
+       { "proxyauth", IMAPC_FEATURE_PROXYAUTH },
        { NULL, 0 }
 };
 
index 34b107716b8632bc2c28316fd76c3c5765d743ed..048ac989aa4400628deae57746bfaf6e704fdd5f 100644 (file)
@@ -11,7 +11,8 @@ enum imapc_features {
        IMAPC_FEATURE_GMAIL_MIGRATION           = 0x08,
        IMAPC_FEATURE_SEARCH                    = 0x10,
        IMAPC_FEATURE_ZIMBRA_WORKAROUNDS        = 0x20,
-       IMAPC_FEATURE_NO_EXAMINE                = 0x40
+       IMAPC_FEATURE_NO_EXAMINE                = 0x40,
+       IMAPC_FEATURE_PROXYAUTH                 = 0x80
 };
 /* </settings checks> */
 
index 0670c260cb073e9b35cc0fcdcf5d19c3fd31a491..217d2fbe2fdb72dfbe2441c787d3fc7652d77403 100644 (file)
@@ -265,6 +265,7 @@ int imapc_storage_client_create(struct mail_namespace *ns,
                return -1;
        }
        set.sasl_mechanisms = imapc_set->imapc_sasl_mechanisms;
+       set.use_proxyauth = (imapc_set->parsed_features & IMAPC_FEATURE_PROXYAUTH) != 0;
        set.max_idle_time = imapc_set->imapc_max_idle_time;
        set.dns_client_socket_path = *ns->user->set->base_dir == '\0' ? "" :
                t_strconcat(ns->user->set->base_dir, "/",