mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
181 lines
4.8 KiB
181 lines
4.8 KiB
/*****************************************************************************
|
|
*
|
|
* 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;
|
|
}
|