]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
*-login: Get auth connection cookie earlier so its lookup can't fail.
authorTimo Sirainen <tss@iki.fi>
Thu, 10 Dec 2009 01:19:03 +0000 (20:19 -0500)
committerTimo Sirainen <tss@iki.fi>
Thu, 10 Dec 2009 01:19:03 +0000 (20:19 -0500)
--HG--
branch : HEAD

src/lib-auth/auth-client-request.c
src/lib-auth/auth-client.c
src/lib-auth/auth-client.h
src/login-common/sasl-server.c

index a1e71755e40d2e2fc003468823bb4abd2a974390..5de6e9fa8f0d675da568d5a324afc59d5d594d80 100644 (file)
@@ -134,6 +134,11 @@ auth_client_request_get_server_pid(struct auth_client_request *request)
        return request->conn->server_pid;
 }
 
+const char *auth_client_request_get_cookie(struct auth_client_request *request)
+{
+       return request->conn->cookie;
+}
+
 bool auth_client_request_is_aborted(struct auth_client_request *request)
 {
        return request->callback == NULL;
index 121db484e212493995f3b56807e801d49410d1b3..9504a7f44df3ed1ee05018a9af8d7977f943eec5 100644 (file)
@@ -74,10 +74,3 @@ void auth_client_get_connect_id(struct auth_client *client,
        *server_pid_r = client->conn->server_pid;
        *connect_uid_r = client->conn->connect_uid;
 }
-
-const char *auth_client_get_cookie(struct auth_client *client)
-{
-       i_assert(auth_client_is_connected(client));
-
-       return client->conn->cookie;
-}
index 3bbe71a9d684a4fcac596ce0658a34d3879ef5a5..73694a420c7608f0ec98f317d0b56b94c3f9fcd7 100644 (file)
@@ -68,7 +68,6 @@ auth_client_find_mech(struct auth_client *client, const char *name);
 void auth_client_get_connect_id(struct auth_client *client,
                                unsigned int *server_pid_r,
                                unsigned int *connect_uid_r);
-const char *auth_client_get_cookie(struct auth_client *client);
 
 /* Create a new authentication request. callback is called whenever something
    happens for the request. */
@@ -87,5 +86,7 @@ unsigned int auth_client_request_get_id(struct auth_client_request *request);
 /* Return the PID of the server that handled this request. */
 unsigned int
 auth_client_request_get_server_pid(struct auth_client_request *request);
+/* Return cookie of the server that handled this request. */
+const char *auth_client_request_get_cookie(struct auth_client_request *request);
 
 #endif
index bfce1dc4ec3cd958ff39e621669b91c92d274bd9..bf5f8a3ba14bad4ca6c26588b709a23e48515dff 100644 (file)
@@ -26,6 +26,7 @@
 struct anvil_request {
        struct client *client;
        unsigned int auth_pid, auth_id;
+       unsigned char cookie[MASTER_AUTH_COOKIE_SIZE];
 };
 
 const struct auth_mech_desc *
@@ -109,24 +110,18 @@ static void master_send_request(struct anvil_request *anvil_request)
        struct client *client = anvil_request->client;
        struct master_auth_request req;
        const unsigned char *data;
-       const char *cookie;
        size_t size;
        buffer_t *buf;
 
-       buf = buffer_create_dynamic(pool_datastack_create(), 256);
-
        memset(&req, 0, sizeof(req));
        req.auth_pid = anvil_request->auth_pid;
        req.auth_id = anvil_request->auth_id;
        req.local_ip = client->local_ip;
        req.remote_ip = client->ip;
        req.client_pid = getpid();
+       memcpy(req.cookie, anvil_request->cookie, sizeof(req.cookie));
 
-       cookie = auth_client_get_cookie(auth_client);
-       if (hex_to_binary(cookie, buf) == 0 && buf->used == sizeof(req.cookie))
-               memcpy(req.cookie, buf->data, sizeof(req.cookie));
-
-       buffer_set_used_size(buf, 0);
+       buf = buffer_create_dynamic(pool_datastack_create(), 256);
        buffer_append(buf, client->master_data_prefix,
                      client->master_data_prefix_len);
 
@@ -159,13 +154,19 @@ anvil_check_too_many_connections(struct client *client,
                                 struct auth_client_request *request)
 {
        struct anvil_request *req;
-       const char *query;
+       const char *query, *cookie;
+       buffer_t buf;
 
        req = i_new(struct anvil_request, 1);
        req->client = client;
        req->auth_pid = auth_client_request_get_server_pid(request);
        req->auth_id = auth_client_request_get_id(request);
 
+       buffer_create_data(&buf, req->cookie, sizeof(req->cookie));
+       cookie = auth_client_request_get_cookie(request);
+       if (strlen(cookie) == MASTER_AUTH_COOKIE_SIZE*2)
+               (void)hex_to_binary(cookie, &buf);
+
        if (client->virtual_user == NULL ||
            client->set->mail_max_userip_connections == 0) {
                anvil_lookup_callback(NULL, req);