Skip to content

Commit

Permalink
pop3: send back auth reply sooner
Browse files Browse the repository at this point in the history
If possible (i.e., pop3_lock_session=no), we can send back the OK
response earlier.
  • Loading branch information
Josef 'Jeff' Sipek authored and villesavolainen committed Jun 16, 2017
1 parent 9a08424 commit 7f3ca7e
Showing 1 changed file with 31 additions and 8 deletions.
39 changes: 31 additions & 8 deletions src/pop3/main.c
Expand Up @@ -128,9 +128,9 @@ static int lock_session(struct client *client)
int ret;

i_assert(client->user->namespaces != NULL);
i_assert(client->set->pop3_lock_session);

if (client->set->pop3_lock_session &&
(ret = pop3_lock_session(client)) <= 0) {
if ((ret = pop3_lock_session(client)) <= 0) {
client_send_line(client, ret < 0 ?
"-ERR [SYS/TEMP] Failed to create POP3 session lock." :
"-ERR [IN-USE] Mailbox is locked by another POP3 session.");
Expand Down Expand Up @@ -168,14 +168,37 @@ static void add_input(struct client *client,
{
const char *error;

if (init_namespaces(client, FALSE) < 0)
return; /* no need to propagate an error */
/*
* RFC 1939 requires that the session lock gets acquired before the
* positive response is sent to the client indicating a transition
* to the TRANSACTION state.
*
* Since the session lock is stored under the INBOX's storage
* directory, the locking code requires that the namespaces are
* initialized first.
*
* If the system administrator configured dovecot to not use session
* locks, we can send back the positive response before the
* potentially long-running namespace initialization occurs. This
* avoids the client possibly timing out during authentication due
* to storage initialization taking too long.
*/
if (client->set->pop3_lock_session) {
if (init_namespaces(client, FALSE) < 0)
return; /* no need to propagate an error */

if (lock_session(client) < 0)
return; /* no need to propagate an error */
if (lock_session(client) < 0)
return; /* no need to propagate an error */

if (!IS_STANDALONE())
client_send_line(client, "+OK Logged in.");
if (!IS_STANDALONE())
client_send_line(client, "+OK Logged in.");
} else {
if (!IS_STANDALONE())
client_send_line(client, "+OK Logged in.");

if (init_namespaces(client, TRUE) < 0)
return; /* no need to propagate an error */
}

if (client_init_mailbox(client, &error) < 0) {
i_error("%s", error);
Expand Down

0 comments on commit 7f3ca7e

Please sign in to comment.