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