windows-nt/Source/XPSP1/NT/shell/ext/msnspa/pop3.c
2020-09-26 16:20:57 +08:00

164 lines
3.8 KiB
C

/*****************************************************************************
*
* 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
*
* + <challenge>
*/
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;
}