182 lines
4.8 KiB
C
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;
|
||
|
}
|