Andreas Krennmair:
[apps/madmutt.git] / pop_auth.c
index 9353eef..0aa49c9 100644 (file)
  *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  */
 
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "mutt.h"
 #include "mx.h"
 #include "md5.h"
 
 #ifdef USE_SASL
 /* SASL authenticator */
-static pop_auth_res_t pop_auth_sasl (POP_DATA *pop_data, const char *method)
+static pop_auth_res_t pop_auth_sasl (POP_DATA * pop_data, const char *method)
 {
   sasl_conn_t *saslconn;
   sasl_interact_t *interaction = NULL;
   int rc;
   char buf[LONG_STRING];
   char inbuf[LONG_STRING];
-  const char* mech;
+  const char *mech;
+
 #ifdef USE_SASL2
   const char *pc = NULL;
 #else
-  charpc = NULL;
+  char *pc = NULL;
 #endif
   unsigned int len, olen;
   unsigned char client_start;
 
-  if (mutt_sasl_client_new (pop_data->conn, &saslconn) < 0)
-  {
-    dprint (1, (debugfile, "pop_auth_sasl: Error allocating SASL connection.\n"));
+  if (mutt_sasl_client_new (pop_data->conn, &saslconn) < 0) {
+    dprint (1,
+            (debugfile,
+             "pop_auth_sasl: Error allocating SASL connection.\n"));
     return POP_A_FAILURE;
   }
 
   if (!method)
     method = pop_data->auth_list;
 
-  FOREVER
-  {
+  FOREVER {
 #ifdef USE_SASL2
-       rc = sasl_client_start(saslconn, method, &interaction, &pc, &olen, &mech);
+    rc =
+      sasl_client_start (saslconn, method, &interaction, &pc, &olen, &mech);
 #else
     rc = sasl_client_start (saslconn, method, NULL,
-                           &interaction, &pc, &olen, &mech);
+                            &interaction, &pc, &olen, &mech);
 #endif
     if (rc != SASL_INTERACT)
       break;
     mutt_sasl_interact (interaction);
   }
 
-  if (rc != SASL_OK && rc != SASL_CONTINUE)
-  {
-    dprint (1, (debugfile, "pop_auth_sasl: Failure starting authentication exchange. No shared mechanisms?\n"));
+  if (rc != SASL_OK && rc != SASL_CONTINUE) {
+    dprint (1,
+            (debugfile,
+             "pop_auth_sasl: Failure starting authentication exchange. No shared mechanisms?\n"));
 
     /* SASL doesn't support suggested mechanisms, so fall back */
     return POP_A_UNAVAIL;
@@ -92,12 +99,10 @@ static pop_auth_res_t pop_auth_sasl (POP_DATA *pop_data, const char *method)
   olen = strlen (buf);
 
   /* looping protocol */
-  FOREVER
-  {
+  FOREVER {
     strfcpy (buf + olen, "\r\n", sizeof (buf) - olen);
     mutt_socket_write (pop_data->conn, buf);
-    if (mutt_socket_readln (inbuf, sizeof (inbuf), pop_data->conn) < 0)
-    {
+    if (mutt_socket_readln (inbuf, sizeof (inbuf), pop_data->conn) < 0) {
       sasl_dispose (&saslconn);
       pop_data->status = POP_DISCONNECTED;
       return POP_A_SOCKET;
@@ -108,23 +113,25 @@ static pop_auth_res_t pop_auth_sasl (POP_DATA *pop_data, const char *method)
 
 #ifdef USE_SASL2
     if (!mutt_strncmp (inbuf, "+ ", 2)
-        && sasl_decode64 (inbuf, strlen (inbuf), buf, LONG_STRING-1, &len) != SASL_OK)
+        && sasl_decode64 (inbuf, strlen (inbuf), buf, LONG_STRING - 1,
+                          &len) != SASL_OK)
 #else
     if (!mutt_strncmp (inbuf, "+ ", 2)
         && sasl_decode64 (inbuf, strlen (inbuf), buf, &len) != SASL_OK)
 #endif
     {
-      dprint (1, (debugfile, "pop_auth_sasl: error base64-decoding server response.\n"));
+      dprint (1,
+              (debugfile,
+               "pop_auth_sasl: error base64-decoding server response.\n"));
       goto bail;
     }
 
     if (!client_start)
-      FOREVER
-      {
-       rc = sasl_client_step (saslconn, buf, len, &interaction, &pc, &olen);
-       if (rc != SASL_INTERACT)
-         break;
-       mutt_sasl_interact (interaction);
+      FOREVER {
+      rc = sasl_client_step (saslconn, buf, len, &interaction, &pc, &olen);
+      if (rc != SASL_INTERACT)
+        break;
+      mutt_sasl_interact (interaction);
       }
     else
       client_start = 0;
@@ -133,12 +140,12 @@ static pop_auth_res_t pop_auth_sasl (POP_DATA *pop_data, const char *method)
       break;
 
     /* send out response, or line break if none needed */
-    if (pc)
-    {
-      if (sasl_encode64 (pc, olen, buf, sizeof (buf), &olen) != SASL_OK)
-      {
-       dprint (1, (debugfile, "pop_auth_sasl: error base64-encoding client response.\n"));
-       goto bail;
+    if (pc) {
+      if (sasl_encode64 (pc, olen, buf, sizeof (buf), &olen) != SASL_OK) {
+        dprint (1,
+                (debugfile,
+                 "pop_auth_sasl: error base64-encoding client response.\n"));
+        goto bail;
       }
 
       /* sasl_client_st(art|ep) allocate pc with malloc, expect me to 
@@ -152,8 +159,7 @@ static pop_auth_res_t pop_auth_sasl (POP_DATA *pop_data, const char *method)
   if (rc != SASL_OK)
     goto bail;
 
-  if (!mutt_strncmp (inbuf, "+OK", 3))
-  {
+  if (!mutt_strncmp (inbuf, "+OK", 3)) {
     mutt_sasl_setup_conn (pop_data->conn, saslconn);
     return POP_A_SUCCESS;
   }
@@ -162,14 +168,14 @@ bail:
   sasl_dispose (&saslconn);
 
   /* terminate SASL sessoin if the last responce is not +OK nor -ERR */
-  if (!mutt_strncmp (inbuf, "+ ", 2))
-  {
+  if (!mutt_strncmp (inbuf, "+ ", 2)) {
     snprintf (buf, sizeof (buf), "*\r\n");
     if (pop_query (pop_data, buf, sizeof (buf)) == -1)
       return POP_A_SOCKET;
   }
 
   mutt_error _("SASL authentication failed.");
+
   mutt_sleep (2);
 
   return POP_A_FAILURE;
@@ -177,21 +183,20 @@ bail:
 #endif
 
 /* Get the server timestamp for APOP authentication */
-void pop_apop_timestamp (POP_DATA *pop_data, char *buf)
+void pop_apop_timestamp (POP_DATA * pop_data, char *buf)
 {
   char *p1, *p2;
 
   FREE (&pop_data->timestamp);
 
-  if ((p1 = strchr (buf, '<')) && (p2 = strchr (p1, '>')))
-  {
+  if ((p1 = strchr (buf, '<')) && (p2 = strchr (p1, '>'))) {
     p2[1] = '\0';
     pop_data->timestamp = safe_strdup (p1);
   }
 }
 
 /* APOP authenticator */
-static pop_auth_res_t pop_auth_apop (POP_DATA *pop_data, const char *method)
+static pop_auth_res_t pop_auth_apop (POP_DATA * pop_data, const char *method)
 {
   MD5_CTX mdContext;
   unsigned char digest[16];
@@ -206,34 +211,35 @@ static pop_auth_res_t pop_auth_apop (POP_DATA *pop_data, const char *method)
 
   /* Compute the authentication hash to send to the server */
   MD5Init (&mdContext);
-  MD5Update (&mdContext, (unsigned char *)pop_data->timestamp,
-            strlen (pop_data->timestamp));
-  MD5Update (&mdContext, (unsigned char *)pop_data->conn->account.pass,
-            strlen (pop_data->conn->account.pass));
+  MD5Update (&mdContext, (unsigned char *) pop_data->timestamp,
+             strlen (pop_data->timestamp));
+  MD5Update (&mdContext, (unsigned char *) pop_data->conn->account.pass,
+             strlen (pop_data->conn->account.pass));
   MD5Final (digest, &mdContext);
 
   for (i = 0; i < sizeof (digest); i++)
     sprintf (hash + 2 * i, "%02x", digest[i]);
 
   /* Send APOP command to server */
-  snprintf (buf, sizeof (buf), "APOP %s %s\r\n", pop_data->conn->account.user, hash);
+  snprintf (buf, sizeof (buf), "APOP %s %s\r\n", pop_data->conn->account.user,
+            hash);
 
-  switch (pop_query (pop_data, buf, sizeof (buf)))
-  {
-    case 0:
-      return POP_A_SUCCESS;
-    case -1:
-      return POP_A_SOCKET;
+  switch (pop_query (pop_data, buf, sizeof (buf))) {
+  case 0:
+    return POP_A_SUCCESS;
+  case -1:
+    return POP_A_SOCKET;
   }
 
   mutt_error _("APOP authentication failed.");
+
   mutt_sleep (2);
 
   return POP_A_FAILURE;
 }
 
 /* USER authenticator */
-static pop_auth_res_t pop_auth_user (POP_DATA *pop_data, const char *method)
+static pop_auth_res_t pop_auth_user (POP_DATA * pop_data, const char *method)
 {
   char buf[LONG_STRING];
   int ret;
@@ -246,42 +252,37 @@ static pop_auth_res_t pop_auth_user (POP_DATA *pop_data, const char *method)
   snprintf (buf, sizeof (buf), "USER %s\r\n", pop_data->conn->account.user);
   ret = pop_query (pop_data, buf, sizeof (buf));
 
-  if (pop_data->cmd_user == 2)
-  {
-    if (ret == 0)
-    {
+  if (pop_data->cmd_user == 2) {
+    if (ret == 0) {
       pop_data->cmd_user = 1;
 
       dprint (1, (debugfile, "pop_auth_user: set USER capability\n"));
     }
 
-    if (ret == -2)
-    {
+    if (ret == -2) {
       pop_data->cmd_user = 0;
 
       dprint (1, (debugfile, "pop_auth_user: unset USER capability\n"));
       snprintf (pop_data->err_msg, sizeof (pop_data->err_msg),
-              _("Command USER is not supported by server."));
+                _("Command USER is not supported by server."));
     }
   }
 
-  if (ret == 0)
-  {
+  if (ret == 0) {
     snprintf (buf, sizeof (buf), "PASS %s\r\n", pop_data->conn->account.pass);
-    ret = pop_query_d (pop_data, buf, sizeof (buf), 
+    ret = pop_query_d (pop_data, buf, sizeof (buf),
 #ifdef DEBUG
-       /* don't print the password unless we're at the ungodly debugging level */
-       debuglevel < M_SOCK_LOG_FULL ? "PASS *\r\n" :
+                       /* don't print the password unless we're at the ungodly debugging level */
+                       debuglevel < M_SOCK_LOG_FULL ? "PASS *\r\n" :
 #endif
-       NULL);
+                       NULL);
   }
 
-  switch (ret)
-  {
-    case 0:
-      return POP_A_SUCCESS;
-    case -1:
-      return POP_A_SOCKET;
+  switch (ret) {
+  case 0:
+    return POP_A_SUCCESS;
+  case -1:
+    return POP_A_SOCKET;
   }
 
   mutt_error ("%s %s", _("Login failed."), pop_data->err_msg);
@@ -292,11 +293,11 @@ static pop_auth_res_t pop_auth_user (POP_DATA *pop_data, const char *method)
 
 static pop_auth_t pop_authenticators[] = {
 #ifdef USE_SASL
-  { pop_auth_sasl, NULL },
+  {pop_auth_sasl, NULL},
 #endif
-  { pop_auth_apop, "apop" },
-  { pop_auth_user, "user" },
-  { NULL }
+  {pop_auth_apop, "apop"},
+  {pop_auth_user, "user"},
+  {NULL}
 };
 
 /*
@@ -306,13 +307,13 @@ static pop_auth_t pop_authenticators[] = {
  * -2 - login failed,
  * -3 - authentication canceled.
 */
-int pop_authenticate (POP_DATA* pop_data)
+int pop_authenticate (POP_DATA * pop_data)
 {
   ACCOUNT *acct = &pop_data->conn->account;
-  pop_auth_tauthenticator;
-  charmethods;
-  charcomma;
-  charmethod;
+  pop_auth_t *authenticator;
+  char *methods;
+  char *comma;
+  char *method;
   int attempts = 0;
   int ret = POP_A_UNAVAIL;
 
@@ -320,48 +321,42 @@ int pop_authenticate (POP_DATA* pop_data)
       mutt_account_getpass (acct) || !acct->pass[0])
     return -3;
 
-  if (PopAuthenticators && *PopAuthenticators)
-  {
+  if (PopAuthenticators && *PopAuthenticators) {
     /* Try user-specified list of authentication methods */
     methods = safe_strdup (PopAuthenticators);
     method = methods;
 
-    while (method)
-    {
+    while (method) {
       comma = strchr (method, ':');
       if (comma)
-       *comma++ = '\0';
+        *comma++ = '\0';
       dprint (2, (debugfile, "pop_authenticate: Trying method %s\n", method));
       authenticator = pop_authenticators;
 
-      while (authenticator->authenticate)
-      {
-       if (!authenticator->method ||
-           !ascii_strcasecmp (authenticator->method, method))
-       {
-         ret = authenticator->authenticate (pop_data, method);
-         if (ret == POP_A_SOCKET)
-           switch (pop_connect (pop_data))
-           {
-             case 0:
-             {
-               ret = authenticator->authenticate (pop_data, method);
-               break;
-             }
-             case -2:
-               ret = POP_A_FAILURE;
-           }
-
-         if (ret != POP_A_UNAVAIL)
-           attempts++;
-         if (ret == POP_A_SUCCESS || ret == POP_A_SOCKET ||
-             (ret == POP_A_FAILURE && !option (OPTPOPAUTHTRYALL)))
-         {
-           comma = NULL;
-           break;
-         }
-       }
-       authenticator++;
+      while (authenticator->authenticate) {
+        if (!authenticator->method ||
+            !ascii_strcasecmp (authenticator->method, method)) {
+          ret = authenticator->authenticate (pop_data, method);
+          if (ret == POP_A_SOCKET)
+            switch (pop_connect (pop_data)) {
+            case 0:
+              {
+                ret = authenticator->authenticate (pop_data, method);
+                break;
+              }
+            case -2:
+              ret = POP_A_FAILURE;
+            }
+
+          if (ret != POP_A_UNAVAIL)
+            attempts++;
+          if (ret == POP_A_SUCCESS || ret == POP_A_SOCKET ||
+              (ret == POP_A_FAILURE && !option (OPTPOPAUTHTRYALL))) {
+            comma = NULL;
+            break;
+          }
+        }
+        authenticator++;
       }
 
       method = comma;
@@ -369,46 +364,44 @@ int pop_authenticate (POP_DATA* pop_data)
 
     FREE (&methods);
   }
-  else
-  {
+  else {
     /* Fall back to default: any authenticator */
-    dprint (2, (debugfile, "pop_authenticate: Using any available method.\n"));
+    dprint (2,
+            (debugfile, "pop_authenticate: Using any available method.\n"));
     authenticator = pop_authenticators;
 
-    while (authenticator->authenticate)
-    {
+    while (authenticator->authenticate) {
       ret = authenticator->authenticate (pop_data, authenticator->method);
       if (ret == POP_A_SOCKET)
-       switch (pop_connect (pop_data))
-       {
-         case 0:
-         {
-           ret = authenticator->authenticate (pop_data, authenticator->method);
-           break;
-         }
-         case -2:
-           ret = POP_A_FAILURE;
-       }
+        switch (pop_connect (pop_data)) {
+        case 0:
+          {
+            ret =
+              authenticator->authenticate (pop_data, authenticator->method);
+            break;
+          }
+        case -2:
+          ret = POP_A_FAILURE;
+        }
 
       if (ret != POP_A_UNAVAIL)
-       attempts++;
+        attempts++;
       if (ret == POP_A_SUCCESS || ret == POP_A_SOCKET ||
-         (ret == POP_A_FAILURE && !option (OPTPOPAUTHTRYALL)))
-       break;
+          (ret == POP_A_FAILURE && !option (OPTPOPAUTHTRYALL)))
+        break;
 
       authenticator++;
     }
   }
 
-  switch (ret)
-  {
-    case POP_A_SUCCESS:
-      return 0;
-    case POP_A_SOCKET:
-      return -1;
-    case POP_A_UNAVAIL:
-      if (!attempts)
-       mutt_error (_("No authenticators available"));
+  switch (ret) {
+  case POP_A_SUCCESS:
+    return 0;
+  case POP_A_SOCKET:
+    return -1;
+  case POP_A_UNAVAIL:
+    if (!attempts)
+      mutt_error (_("No authenticators available"));
   }
 
   return -2;