X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=pop_auth.c;fp=pop_auth.c;h=0aa49c9e2d56126ef0f7696b2959d5207ee91e2a;hp=3491fb49b495caf05af5463cd30bba11babe7c18;hb=df70e07e24add1869bcc9b7af2277d9d0c09a281;hpb=31edbe030ac69952aa535730427246b5e9a1603c diff --git a/pop_auth.c b/pop_auth.c index 3491fb4..0aa49c9 100644 --- a/pop_auth.c +++ b/pop_auth.c @@ -42,47 +42,50 @@ #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 - char* pc = 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; @@ -96,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; @@ -112,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; @@ -137,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 @@ -156,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; } @@ -166,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; @@ -181,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]; @@ -210,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; @@ -250,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); @@ -296,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} }; /* @@ -310,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_t* authenticator; - char* methods; - char* comma; - char* method; + pop_auth_t *authenticator; + char *methods; + char *comma; + char *method; int attempts = 0; int ret = POP_A_UNAVAIL; @@ -324,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; @@ -373,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;