]> granicus.if.org Git - curl/commitdiff
pop3: Changed the sasl mechanism detection from auth to capa
authorSteve Holme <steve_holme@hotmail.com>
Mon, 4 Jun 2012 18:09:45 +0000 (19:09 +0100)
committerSteve Holme <steve_holme@hotmail.com>
Mon, 4 Jun 2012 18:09:45 +0000 (19:09 +0100)
Not all SASL enabled POP3 servers support the AUTH command on its own
when trying to detect the supported mechanisms. As such changed the
mechanism detection to use the CAPA command instead.

lib/pop3.c
lib/pop3.h

index 7d22e825132c861f79ad0b4a93027f05e9b9587f..9ed240fed474663555dc05cf8ee07161e177ddcb 100644 (file)
@@ -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:
index 77459aca9258dd027ff011f5d7ce104936a36e88..98954cb0b0d31ad6ea324c08075f2eba303223bd 100644 (file)
@@ -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,