/***************************************************************************** * * pop3.c * * Copyright (c) 1997 Microsoft Corporation. All Rights Reserved. * * Abstract: * * Prepares for and waits for client connections. * *****************************************************************************/ #include "msnspa.h" #define PROXY_PORT 110 /* I listen to this */ #define PROXY_DEST 110 /* And talk to this */ #define PROXY_HOST "pop3.email.msn.com" /* And I talk to him */ #define PROTOCOL "MSN" /* with this protocol */ BOOL CALLBACK POP3_Negotiate(SOCKET s); /***************************************************************************** * * PROXYINFO for POP3 * *****************************************************************************/ #pragma BEGIN_CONST_DATA PROXYINFO g_proxyPop = { PROXY_PORT, /* localport */ PROXY_DEST, /* serverport */ PROXY_HOST, /* remote server */ &g_cMailUsers, /* Usage counter */ POP3_Negotiate, /* Negotiation function */ "-ERR Server inaccessible\r\n", /* Failed to connect */ "-ERR Authentication failed\r\n", /* Password problem */ "+OK MSN Secure Password Authentication Proxy\r\n", /* Generic happy */ "USER", /* First 4-char command to ignore */ "PASS", /* Second 4-char command to ignore */ }; /***************************************************************************** * * POP3_Negotiate * * Perform an authenticated MSN logon. * *****************************************************************************/ BOOL CALLBACK POP3_Negotiate(SOCKET ssfd) { WIN32AUTHSTATE was; char buf[BUFSIZE+1]; int cb; /* * Wait for the greeting. */ cb = recv(ssfd, buf, BUFSIZE, 0); /* read a hunk */ #ifdef CHATTY if (cb >= 0) { buf[cb] = 0; Squirt("<%s\r\n", buf); } #endif if (cb <= 0 || buf[0] != '+') { return FALSE; } /* * Tell the server to go into authentication mode. */ sendsz(ssfd, "AUTH " PROTOCOL "\r\n"); #ifdef CHATTY Squirt(">AUTH " PROTOCOL "\r\n"); #endif /* * Wait for the Proceed. */ cb = recv(ssfd, buf, BUFSIZE, 0); /* read a hunk */ #ifdef CHATTY if (cb >= 0) { buf[cb] = 0; Squirt("<%s\r\n", buf); } #endif if (cb <= 0 || buf[0] != '+') { return FALSE; } if (!Security_AcquireCredentials(&was, TEXT(PROTOCOL))) { Die(TEXT("Cannot acquire credentials handle")); } if (!Security_GetNegotiation(&was)) { Die(TEXT("Cannot get negotiation string")); } /* * Now send the initial cookie. */ sendsz(ssfd, was.szBuffer); sendsz(ssfd, "\r\n"); #ifdef CHATTY Squirt(">%s\r\n", was.szBuffer); #endif /* * Response should be * * + */ cb = recv(ssfd, buf, BUFSIZE, 0); if (cb <= 0 || buf[0] != '+') { return FALSE; } #ifdef CHATTY buf[cb] = 0; Squirt("<%s", buf); #endif /* * Parse the server response and build our response. */ if (!Security_GetResponse(&was, buf + 2)) { Die(TEXT("Cannot build response")); } /* * Now send our response. */ sendsz(ssfd, was.szBuffer); sendsz(ssfd, "\r\n"); #ifdef CHATTY Squirt(">%s\r\n", was.szBuffer); #endif Security_ReleaseCredentials(&was); /* * Now see how that worked. Response should be * * + OK */ cb = recv(ssfd, buf, BUFSIZE, 0); if (cb <= 0 || buf[0] != '+') { return FALSE; } return TRUE; }