aboutsummaryrefslogtreecommitdiffstats
path: root/smtp.c
diff options
context:
space:
mode:
Diffstat (limited to 'smtp.c')
-rw-r--r--smtp.c214
1 files changed, 105 insertions, 109 deletions
diff --git a/smtp.c b/smtp.c
index ee99bcf7..68908412 100644
--- a/smtp.c
+++ b/smtp.c
@@ -16,8 +16,6 @@
#include "smtp.h"
#include "config.h"
-static void SMTP_auth(int, char *);
-
struct opt
{
const char *name;
@@ -37,8 +35,6 @@ static struct opt extensions[] =
};
char smtp_response[MSGBUFSIZE];
-char esmtp_auth_username[65];
-char esmtp_auth_password[256];
static char smtp_mode = 'S';
@@ -60,7 +56,110 @@ int SMTP_helo(int sock,const char *host)
return ok;
}
-int SMTP_ehlo(int sock, const char *host, int *opt)
+static void SMTP_auth(int sock, char *username, char *password, char *buf)
+/* ESMTP Authentication support for fetchmail by Wojciech Polak */
+{
+ int c;
+ char *p = 0;
+ char b64buf[512];
+ char tmp[512];
+
+ memset(b64buf, 0, sizeof(b64buf));
+ memset(tmp, 0, sizeof(tmp));
+
+ if (strstr(buf, "CRAM-MD5")) {
+ unsigned char digest[16];
+ static char ascii_digest[33];
+ memset(digest, 0, 16);
+
+ if (outlevel >= O_MONITOR)
+ report(stdout, "ESMTP CRAM-MD5 Authentication...\n");
+ SockPrintf(sock, "AUTH CRAM-MD5\r\n");
+ SockRead(sock, smtp_response, sizeof(smtp_response) - 1);
+ strncpy(tmp, smtp_response, sizeof(tmp));
+
+ if (strncmp(tmp, "334 ", 4)) { /* Server rejects AUTH */
+ SockPrintf(sock, "*\r\n");
+ SockRead(sock, smtp_response, sizeof(smtp_response) - 1);
+ if (outlevel >= O_MONITOR)
+ report(stdout, "Server rejected the AUTH command.\n");
+ return;
+ }
+
+ p = strchr(tmp, ' ');
+ p++;
+ from64tobits(b64buf, p, sizeof(b64buf));
+ if (outlevel >= O_DEBUG)
+ report(stdout, "Challenge decoded: %s\n", b64buf);
+ hmac_md5(password, strlen(password),
+ b64buf, strlen(b64buf), digest, sizeof(digest));
+ for (c = 0; c < 16; c++)
+ sprintf(ascii_digest + 2 * c, "%02x", digest[c]);
+#ifdef HAVE_SNPRINTF
+ snprintf(tmp, sizeof(tmp),
+#else
+ sprintf(tmp,
+#endif /* HAVE_SNPRINTF */
+ "%s %s", username, ascii_digest);
+
+ to64frombits(b64buf, tmp, strlen(tmp));
+ SockPrintf(sock, "%s\r\n", b64buf);
+ SMTP_ok(sock);
+ }
+ else if (strstr(buf, "PLAIN")) {
+ int len;
+ if (outlevel >= O_MONITOR)
+ report(stdout, "ESMTP PLAIN Authentication...\n");
+#ifdef HAVE_SNPRINTF
+ snprintf(tmp, sizeof(tmp),
+#else
+ sprintf(tmp,
+#endif /* HAVE_SNPRINTF */
+ "^%s^%s", username, password);
+
+ len = strlen(tmp);
+ for (c = len - 1; c >= 0; c--)
+ {
+ if (tmp[c] == '^')
+ tmp[c] = '\0';
+ }
+ to64frombits(b64buf, tmp, len);
+ SockPrintf(sock, "AUTH PLAIN %s\r\n", b64buf);
+ SMTP_ok(sock);
+ }
+ else if (strstr(buf, "LOGIN")) {
+ if (outlevel >= O_MONITOR)
+ report(stdout, "ESMTP LOGIN Authentication...\n");
+ SockPrintf(sock, "AUTH LOGIN\r\n");
+ SockRead(sock, smtp_response, sizeof(smtp_response) - 1);
+ strncpy(tmp, smtp_response, sizeof(tmp));
+
+ if (strncmp(tmp, "334 ", 4)) { /* Server rejects AUTH */
+ SockPrintf(sock, "*\r\n");
+ SockRead(sock, smtp_response, sizeof(smtp_response) - 1);
+ if (outlevel >= O_MONITOR)
+ report(stdout, "Server rejected the AUTH command.\n");
+ return;
+ }
+
+ p = strchr(tmp, ' ');
+ p++;
+ from64tobits(b64buf, p, sizeof(b64buf));
+ to64frombits(b64buf, username, strlen(username));
+ SockPrintf(sock, "%s\r\n", b64buf);
+ SockRead(sock, smtp_response, sizeof(smtp_response) - 1);
+ strncpy(tmp, smtp_response, sizeof(tmp));
+ p = strchr(tmp, ' ');
+ p++;
+ from64tobits(b64buf, p, sizeof(b64buf));
+ to64frombits(b64buf, password, strlen(password));
+ SockPrintf(sock, "%s\r\n", b64buf);
+ SMTP_ok(sock);
+ }
+ return;
+}
+
+int SMTP_ehlo(int sock, const char *host, char *name, char *password, int *opt)
/* send a "EHLO" message to the SMTP listener, return extension status bits */
{
struct opt *hp;
@@ -93,7 +192,7 @@ int SMTP_ehlo(int sock, const char *host, int *opt)
}
if ((smtp_response[0] == '1' || smtp_response[0] == '2' || smtp_response[0] == '3') && smtp_response[3] == ' ') {
if (*opt & ESMTP_AUTH)
- SMTP_auth(sock, auth_response);
+ SMTP_auth(sock, name, password, auth_response);
return SM_OK;
}
else if (smtp_response[3] != '-')
@@ -227,107 +326,4 @@ int SMTP_ok(int sock)
return SM_UNRECOVERABLE;
}
-static void SMTP_auth(int sock, char *buf)
-/* ESMTP Authentication support for Fetchmail by Wojciech Polak */
-{
- int c;
- char *p = 0;
- char b64buf[512];
- char tmp[512];
-
- memset(b64buf, 0, sizeof(b64buf));
- memset(tmp, 0, sizeof(tmp));
-
- if (strstr(buf, "CRAM-MD5")) {
- unsigned char digest[16];
- static char ascii_digest[33];
- memset(digest, 0, 16);
-
- if (outlevel >= O_MONITOR)
- report(stdout, "ESMTP CRAM-MD5 Authentication...\n");
- SockPrintf(sock, "AUTH CRAM-MD5\r\n");
- SockRead(sock, smtp_response, sizeof(smtp_response) - 1);
- strncpy(tmp, smtp_response, sizeof(tmp));
-
- if (strncmp(tmp, "334 ", 4)) { /* Server rejects AUTH */
- SockPrintf(sock, "*\r\n");
- SockRead(sock, smtp_response, sizeof(smtp_response) - 1);
- if (outlevel >= O_MONITOR)
- report(stdout, "Server rejected the AUTH command.\n");
- return;
- }
-
- p = strchr(tmp, ' ');
- p++;
- from64tobits(b64buf, p, sizeof(b64buf));
- if (outlevel >= O_DEBUG)
- report(stdout, "Challenge decoded: %s\n", b64buf);
- hmac_md5(esmtp_auth_password, strlen(esmtp_auth_password),
- b64buf, strlen(b64buf), digest, sizeof(digest));
- for (c = 0; c < 16; c++)
- sprintf(ascii_digest + 2 * c, "%02x", digest[c]);
-#ifdef HAVE_SNPRINTF
- snprintf(tmp, sizeof(tmp),
-#else
- sprintf(tmp,
-#endif /* HAVE_SNPRINTF */
- "%s %s", esmtp_auth_username, ascii_digest);
-
- to64frombits(b64buf, tmp, strlen(tmp));
- SockPrintf(sock, "%s\r\n", b64buf);
- SMTP_ok(sock);
- }
- else if (strstr(buf, "PLAIN")) {
- int len;
- if (outlevel >= O_MONITOR)
- report(stdout, "ESMTP PLAIN Authentication...\n");
-#ifdef HAVE_SNPRINTF
- snprintf(tmp, sizeof(tmp),
-#else
- sprintf(tmp,
-#endif /* HAVE_SNPRINTF */
- "^%s^%s", esmtp_auth_username, esmtp_auth_password);
-
- len = strlen(tmp);
- for (c = len - 1; c >= 0; c--)
- {
- if (tmp[c] == '^')
- tmp[c] = '\0';
- }
- to64frombits(b64buf, tmp, len);
- SockPrintf(sock, "AUTH PLAIN %s\r\n", b64buf);
- SMTP_ok(sock);
- }
- else if (strstr(buf, "LOGIN")) {
- if (outlevel >= O_MONITOR)
- report(stdout, "ESMTP LOGIN Authentication...\n");
- SockPrintf(sock, "AUTH LOGIN\r\n");
- SockRead(sock, smtp_response, sizeof(smtp_response) - 1);
- strncpy(tmp, smtp_response, sizeof(tmp));
-
- if (strncmp(tmp, "334 ", 4)) { /* Server rejects AUTH */
- SockPrintf(sock, "*\r\n");
- SockRead(sock, smtp_response, sizeof(smtp_response) - 1);
- if (outlevel >= O_MONITOR)
- report(stdout, "Server rejected the AUTH command.\n");
- return;
- }
-
- p = strchr(tmp, ' ');
- p++;
- from64tobits(b64buf, p, sizeof(b64buf));
- to64frombits(b64buf, esmtp_auth_username, strlen(esmtp_auth_username));
- SockPrintf(sock, "%s\r\n", b64buf);
- SockRead(sock, smtp_response, sizeof(smtp_response) - 1);
- strncpy(tmp, smtp_response, sizeof(tmp));
- p = strchr(tmp, ' ');
- p++;
- from64tobits(b64buf, p, sizeof(b64buf));
- to64frombits(b64buf, esmtp_auth_password, strlen(esmtp_auth_password));
- SockPrintf(sock, "%s\r\n", b64buf);
- SMTP_ok(sock);
- }
- return;
-}
-
/* smtp.c ends here */