aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/pop3.c56
-rw-r--r--lib/pop3.h2
2 files changed, 31 insertions, 27 deletions
diff --git a/lib/pop3.c b/lib/pop3.c
index 7d22e8251..9ed240fed 100644
--- a/lib/pop3.c
+++ b/lib/pop3.c
@@ -213,7 +213,7 @@ static const struct Curl_handler Curl_handler_pop3s_proxy = {
/* Function that checks for an ending pop3 status code at the start of the
given string, but also detects the allowed authentication mechanisms
- according to the AUTH response. */
+ according to the CAPA response. */
static int pop3_endofresp(struct pingpong *pp, int *resp)
{
char *line = pp->linestart_resp;
@@ -229,20 +229,31 @@ static int pop3_endofresp(struct pingpong *pp, int *resp)
return FALSE;
}
- /* Are we processing reponses to our AUTH command */
- if(pop3c->state == POP3_AUTH) {
+ /* Are we processing reponses to our CAPA command? */
+ if(pop3c->state == POP3_CAPA) {
- /* Advance past our positive response if necessary */
- if(len >= 3 && !memcmp(line, "+OK", 3)) {
- line += 3;
- len -= 3;
+ /* Do we have the terminating character? */
+ if(len >= 1 && !memcmp(line, ".", 1)) {
+ *resp = '+';
+
+ return TRUE;
+ }
+
+ /* We are only interested in the SASL line */
+ if(len < 4 || memcmp(line, "SASL", 3)) {
+ return FALSE;
}
+ /* Advance past the SASL keyword */
+ line += 4;
+ len -= 4;
+
/* Loop through the data line */
for(;;) {
while(len &&
(*line == ' ' || *line == '\t' ||
*line == '\r' || *line == '\n')) {
+
if(*line == '\n')
return FALSE;
@@ -253,13 +264,6 @@ static int pop3_endofresp(struct pingpong *pp, int *resp)
if(!len)
break;
- /* Until we receive the terminating character */
- if(*line == '.') {
- *resp = '+';
-
- return TRUE;
- }
-
/* Extract the word */
for(wordlen = 0; wordlen < len && line[wordlen] != ' ' &&
line[wordlen] != '\t' && line[wordlen] != '\r' &&
@@ -306,7 +310,7 @@ static void state(struct connectdata *conn, pop3state newstate)
"STOP",
"SERVERGREET",
"STARTTLS",
- "AUTH",
+ "CAPA",
"AUTH_PLAIN",
"AUTH_LOGIN",
"AUTH_LOGIN_PASSWD",
@@ -330,7 +334,7 @@ static void state(struct connectdata *conn, pop3state newstate)
pop3c->state = newstate;
}
-static CURLcode pop3_state_auth(struct connectdata *conn)
+static CURLcode pop3_state_capa(struct connectdata *conn)
{
CURLcode result = CURLE_OK;
struct pop3_conn *pop3c = &conn->proto.pop3c;
@@ -346,13 +350,13 @@ static CURLcode pop3_state_auth(struct connectdata *conn)
return result;
}
- /* send AUTH */
- result = Curl_pp_sendf(&pop3c->pp, "AUTH");
+ /* send CAPA */
+ result = Curl_pp_sendf(&pop3c->pp, "CAPA");
if(result)
return result;
- state(conn, POP3_AUTH);
+ state(conn, POP3_CAPA);
return CURLE_OK;
}
@@ -462,7 +466,7 @@ static CURLcode pop3_state_servergreet_resp(struct connectdata *conn,
state(conn, POP3_STARTTLS);
}
else
- result = pop3_state_auth(conn);
+ result = pop3_state_capa(conn);
return result;
}
@@ -484,14 +488,14 @@ static CURLcode pop3_state_starttls_resp(struct connectdata *conn,
state(conn, POP3_STOP);
}
else
- result = pop3_state_auth(conn);
+ result = pop3_state_capa(conn);
}
else {
/* Curl_ssl_connect is BLOCKING */
result = Curl_ssl_connect(conn, FIRSTSOCKET);
if(CURLE_OK == result) {
pop3_to_pop3s(conn);
- result = pop3_state_auth(conn);
+ result = pop3_state_capa(conn);
}
else {
state(conn, POP3_STOP);
@@ -501,8 +505,8 @@ static CURLcode pop3_state_starttls_resp(struct connectdata *conn,
return result;
}
-/* For AUTH responses */
-static CURLcode pop3_state_auth_resp(struct connectdata *conn,
+/* For CAPA responses */
+static CURLcode pop3_state_capa_resp(struct connectdata *conn,
int pop3code,
pop3state instate)
{
@@ -937,8 +941,8 @@ static CURLcode pop3_statemach_act(struct connectdata *conn)
result = pop3_state_starttls_resp(conn, pop3code, pop3c->state);
break;
- case POP3_AUTH:
- result = pop3_state_auth_resp(conn, pop3code, pop3c->state);
+ case POP3_CAPA:
+ result = pop3_state_capa_resp(conn, pop3code, pop3c->state);
break;
case POP3_AUTH_PLAIN:
diff --git a/lib/pop3.h b/lib/pop3.h
index 77459aca9..98954cb0b 100644
--- a/lib/pop3.h
+++ b/lib/pop3.h
@@ -30,7 +30,7 @@ typedef enum {
POP3_SERVERGREET, /* waiting for the initial greeting immediately after
a connect */
POP3_STARTTLS,
- POP3_AUTH,
+ POP3_CAPA,
POP3_AUTH_PLAIN,
POP3_AUTH_LOGIN,
POP3_AUTH_LOGIN_PASSWD,