164 lines
3.8 KiB
C
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;
|
||
|
}
|