diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2002-03-10 19:59:59 +0000 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2002-03-10 19:59:59 +0000 |
commit | a016460027f89e7c81106a0560d1d495f727c182 (patch) | |
tree | 0daf10c7b95f73d7ed3f3330f11f35a00cc96c78 /smtp.c | |
parent | 7c33daaf6fd2bd4342903ad5ce025b5ab6bc89bd (diff) | |
download | fetchmail-a016460027f89e7c81106a0560d1d495f727c182.tar.gz fetchmail-a016460027f89e7c81106a0560d1d495f727c182.tar.bz2 fetchmail-a016460027f89e7c81106a0560d1d495f727c182.zip |
Expose the ESMTP name and password options.
svn path=/trunk/; revision=3596
Diffstat (limited to 'smtp.c')
-rw-r--r-- | smtp.c | 214 |
1 files changed, 105 insertions, 109 deletions
@@ -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 */ |