mirror of
https://github.com/curl/curl.git
synced 2026-07-24 14:57:17 +03:00
imap: support PREAUTH
It is a defined possible greeting at server startup that means the connection is already authenticated. See https://tools.ietf.org/html/rfc3501#section-7.1.4 Test 846 added to verify. Fixes #1818 Closes #1820
This commit is contained in:
parent
00da16ca5b
commit
befaa7b14f
4 changed files with 69 additions and 13 deletions
27
lib/imap.c
27
lib/imap.c
|
|
@ -254,6 +254,8 @@ static bool imap_endofresp(struct connectdata *conn, char *line, size_t len,
|
|||
*resp = 'N';
|
||||
else if(len >= 3 && !memcmp(line, "BAD", 3))
|
||||
*resp = 'B';
|
||||
else if(len >= 7 && !memcmp(line, "PREAUTH", 7))
|
||||
*resp = 'P';
|
||||
else {
|
||||
failf(conn->data, "Bad tagged response");
|
||||
*resp = -1;
|
||||
|
|
@ -563,9 +565,10 @@ static CURLcode imap_perform_authentication(struct connectdata *conn)
|
|||
struct imap_conn *imapc = &conn->proto.imapc;
|
||||
saslprogress progress;
|
||||
|
||||
/* Check we have enough data to authenticate with and end the
|
||||
connect phase if we don't */
|
||||
if(!Curl_sasl_can_authenticate(&imapc->sasl, conn)) {
|
||||
/* Check if already authenticated OR if there is enough data to authenticate
|
||||
with and end the connect phase if we don't */
|
||||
if(imapc->preauth ||
|
||||
!Curl_sasl_can_authenticate(&imapc->sasl, conn)) {
|
||||
state(conn, IMAP_STOP);
|
||||
return result;
|
||||
}
|
||||
|
|
@ -789,19 +792,21 @@ static CURLcode imap_state_servergreet_resp(struct connectdata *conn,
|
|||
int imapcode,
|
||||
imapstate instate)
|
||||
{
|
||||
CURLcode result = CURLE_OK;
|
||||
struct Curl_easy *data = conn->data;
|
||||
|
||||
(void)instate; /* no use for this yet */
|
||||
|
||||
if(imapcode != 'O') {
|
||||
failf(data, "Got unexpected imap-server response");
|
||||
result = CURLE_WEIRD_SERVER_REPLY;
|
||||
if(imapcode == 'P') {
|
||||
/* PREAUTH */
|
||||
struct imap_conn *imapc = &conn->proto.imapc;
|
||||
imapc->preauth = TRUE;
|
||||
infof(data, "PREAUTH connection, already authenticated!\n");
|
||||
}
|
||||
else if(imapcode != 'O') {
|
||||
failf(data, "Got unexpected imap-server response");
|
||||
return CURLE_WEIRD_SERVER_REPLY;
|
||||
}
|
||||
else
|
||||
result = imap_perform_capability(conn);
|
||||
|
||||
return result;
|
||||
return imap_perform_capability(conn);
|
||||
}
|
||||
|
||||
/* For CAPABILITY responses */
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 2009 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 2009 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
|
|
@ -71,6 +71,7 @@ struct imap_conn {
|
|||
struct pingpong pp;
|
||||
imapstate state; /* Always use imap.c:state() to change state! */
|
||||
bool ssldone; /* Is connect() over SSL done? */
|
||||
bool preauth; /* Is this connection PREAUTH? */
|
||||
struct SASL sasl; /* SASL-related parameters */
|
||||
unsigned int preftype; /* Preferred authentication type */
|
||||
int cmdid; /* Last used command ID */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue