summaryrefslogtreecommitdiff
path: root/lib/imap.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2017-08-23 00:08:18 +0200
committerDaniel Stenberg <daniel@haxx.se>2017-08-23 23:58:49 +0200
commitbefaa7b14fd5d1c1d4e06035c4babc6cb9623722 (patch)
tree282e138e30b42b5ef2bc903153ae40d261baa800 /lib/imap.c
parent00da16ca5b31be84070fc85a85f28b62204d95a8 (diff)
downloadcurl-befaa7b14fd5d1c1d4e06035c4babc6cb9623722.tar.gz
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
Diffstat (limited to 'lib/imap.c')
-rw-r--r--lib/imap.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/lib/imap.c b/lib/imap.c
index bc20110c2..417d48055 100644
--- a/lib/imap.c
+++ b/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') {
+ 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");
- result = CURLE_WEIRD_SERVER_REPLY;
+ return CURLE_WEIRD_SERVER_REPLY;
}
- else
- result = imap_perform_capability(conn);
- return result;
+ return imap_perform_capability(conn);
}
/* For CAPABILITY responses */