windows-nt/Source/XPSP1/NT/printscan/print/spooler/inetpp2/server/othercon.cxx
2020-09-26 16:20:57 +08:00

173 lines
4.1 KiB
C++

/*****************************************************************************\
* MODULE: iecon.cxx
*
* The module contains class for connections using IE's default configuration
*
* Copyright (C) 1997-1998 Microsoft Corporation
*
* History:
* 07/31/98 Weihaic Created
*
\*****************************************************************************/
#include "precomp.h"
#ifdef WINNT32
#include "priv.h"
const DWORD cdwDialogTimeout = 4000000;
COtherConnection::COtherConnection (
BOOL bSecure,
INTERNET_PORT nServerPort,
LPCTSTR lpszUserName,
LPCTSTR lpszPassword,
BOOL bIgnoreSecurityDlg):
CAnyConnection (bSecure, nServerPort, bIgnoreSecurityDlg, AUTH_OTHER)
{
m_bValid = AssignString (m_lpszUserName, lpszUserName) &&
AssignString (m_lpszPassword, lpszPassword);
}
COtherConnection::~COtherConnection ()
{
}
HINTERNET
COtherConnection::OpenRequest (
LPTSTR lpszUrl)
{
return CAnyConnection::OpenRequest (lpszUrl);
#if 0
// This is not necessary since we have force auth. For those IPP servers that do not support
// force authentication. Although it is possible to submit a job with anonymous user even if the
// connection is established with a credential, it does not prevent the user from
// performing any actions that requires the credential since any denied access will be resolved
// in SendRequest() using the correct credential.
//
HINTERNET hReq = CAnyConnection::OpenRequest (lpszUrl);
if (hReq && _FindAndSetPassword (hReq, FALSE)) {
return hReq;
}
return NULL;
#endif
}
BOOL
COtherConnection::SendRequest(
HINTERNET hReq,
LPCTSTR lpszHdr,
DWORD cbHdr,
LPBYTE pidi)
{
static const DWORD dwMaxRetry = 2;
BOOL bRet = FALSE;
DWORD i;
HANDLE hToken;
//
// We have to revert to the local system account to prevent wininet from sending
// the logon user credential automatically to the remote machine.
//
if (hToken = RevertToPrinterSelf()) {
for (i = 0; i < dwMaxRetry; i++ ) {
if (SetPassword (hReq, m_lpszUserName, m_lpszPassword)) {
bRet = CAnyConnection:: SendRequest (hReq,
lpszHdr,
cbHdr,
pidi);
if (bRet || GetLastError () != ERROR_ACCESS_DENIED) {
break;
}
}
}
if (!ImpersonatePrinterClient(hToken)) {
bRet = FALSE;
}
}
return bRet;
}
BOOL
COtherConnection::SendRequest(
HINTERNET hReq,
LPCTSTR lpszHdr,
CStream *pStream)
{
static const DWORD dwMaxRetry = 2;
BOOL bRet = FALSE;
DWORD i;
HANDLE hToken;
//
// We have to revert to the local system account to prevent wininet from sending
// the logon user credential automatically to the remote machine.
//
if (hToken = RevertToPrinterSelf()) {
for (i = 0; i < dwMaxRetry; i++ ) {
if (SetPassword (hReq, m_lpszUserName, m_lpszPassword)) {
bRet = CAnyConnection:: SendRequest (hReq,
lpszHdr,
pStream);
if (bRet || GetLastError () != ERROR_ACCESS_DENIED) {
break;
}
}
}
if (!ImpersonatePrinterClient(hToken)) {
bRet = FALSE;
}
}
return bRet;
}
BOOL
COtherConnection::ReadFile (
HINTERNET hReq,
LPVOID lpvBuffer,
DWORD cbBuffer,
LPDWORD lpcbRd)
{
BOOL bRet = FALSE;
HANDLE hToken;
if (hToken = RevertToPrinterSelf()) {
bRet = CAnyConnection::ReadFile (hReq, lpvBuffer, cbBuffer, lpcbRd);
if (!ImpersonatePrinterClient(hToken)) {
bRet = FALSE;
}
}
return bRet;
}
#endif