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

182 lines
4.8 KiB
C

/*****************************************************************************
*
* nntp.c
*
* Copyright (c) 1997 Microsoft Corporation. All Rights Reserved.
*
* Abstract:
*
* Dumb layer that opens the socket to the server.
*
*****************************************************************************/
#include "msnspa.h"
#define PROXY_PORT1 119 /* I listen to this */
#define PROXY_DEST1 119 /* And talk to this */
#define PROXY_HOST1 "msnnews.msn.com" /* And I talk to him */
#define PROTOCOL "MSN" /* with this protocol */
#define PROXY_PORT2 120 /* I listen to this */
#define PROXY_DEST2 119 /* And talk to this */
#define PROXY_HOST2 "netnews.msn.com" /* And I talk to him */
BOOL CALLBACK NNTP_Negotiate(SOCKET s);
/*****************************************************************************
*
* PROXYINFO for NNTP
*
*****************************************************************************/
#pragma BEGIN_CONST_DATA
PROXYINFO g_proxyNntp1 = {
PROXY_PORT1, /* localport */
PROXY_DEST1, /* serverport */
PROXY_HOST1, /* remote server */
&g_cNewsUsers, /* Usage counter */
NNTP_Negotiate, /* Negotiation function */
"400 Server inaccessible\r\n", /* Failed to connect */
"400 Authentication failed\r\n", /* Password problem */
"200 MSN Secure Password Authentication Proxy\r\n", /* Generic happy */
"", /* First 4-char command to ignore */
"", /* Second 4-char command to ignore */
};
PROXYINFO g_proxyNntp2 = {
PROXY_PORT2, /* localport */
PROXY_DEST2, /* serverport */
PROXY_HOST2, /* remote server */
&g_cNewsUsers, /* Usage counter */
NNTP_Negotiate, /* Negotiation function */
"400 Server inaccessible\r\n", /* Failed to connect */
"400 Authentication failed\r\n", /* Password problem */
"200 MSN Secure Password Authentication Proxy\r\n", /* Generic happy */
"", /* First 4-char command to ignore */
"", /* Second 4-char command to ignore */
};
/*****************************************************************************
*
* NNTP_Negotiate
*
* Perform an authenticated MSN logon.
*
*****************************************************************************/
BOOL CALLBACK
NNTP_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] != '2') {
return FALSE;
}
/*
* Tell the server to go into authentication mode.
*/
sendsz(ssfd, "AUTHINFO TRANSACT " PROTOCOL "\r\n");
#ifdef CHATTY
Squirt(">AUTHINFO TRANSACT " 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] != '3') {
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, "AUTHINFO TRANSACT ");
sendsz(ssfd, was.szBuffer);
sendsz(ssfd, "\r\n");
#ifdef CHATTY
Squirt(">AUTHINFO TRANSACT %s\r\n", was.szBuffer);
#endif
/*
* Response should be
*
* 381 <challenge>
*/
cb = recv(ssfd, buf, BUFSIZE, 0);
if (cb <= 0 || buf[0] != '3') {
return FALSE;
}
#ifdef CHATTY
buf[cb] = 0;
Squirt("<%s", buf);
#endif
/*
* Parse the server response and build our response.
*/
if (!Security_GetResponse(&was, buf + 4)) {
Die(TEXT("Cannot build response"));
}
/*
* Now send our response.
*/
sendsz(ssfd, "AUTHINFO TRANSACT ");
sendsz(ssfd, was.szBuffer);
sendsz(ssfd, "\r\n");
#ifdef CHATTY
Squirt(">AUTHINFO TRANSACT %s\r\n", was.szBuffer);
#endif
Security_ReleaseCredentials(&was);
/*
* Now see how that worked. Response should be
*
* 281 OK
*/
cb = recv(ssfd, buf, BUFSIZE, 0);
if (cb <= 0 || buf[0] != '2') {
return FALSE;
}
return TRUE;
}