windows-nt/Source/XPSP1/NT/net/ias/protocol/radius/prevalidator.cpp
2020-09-26 16:20:57 +08:00

367 lines
8.3 KiB
C++

//#--------------------------------------------------------------
//
// File: prevalidator.cpp
//
// Synopsis: Implementation of CPreValidator class methods
//
//
// History: 9/23/97 MKarki Created
//
// Copyright (C) 1997-98 Microsoft Corporation
// All rights reserved.
//
//----------------------------------------------------------------
#include "radcommon.h"
#include "radpkt.h"
#include "prevalidator.h"
#include <new>
//+++-------------------------------------------------------------
//
// Function: CPreValidator
//
// Synopsis: This is the constructor of the CPreValidator class
//
// Arguments: NONE
//
// Returns: NONE
//
//
// History: MKarki Created 9/26/97
//
//----------------------------------------------------------------
CPreValidator::CPreValidator(
VOID
)
: m_pCValAccess (NULL),
m_pCValAttributes (NULL),
m_pCValAccounting (NULL),
m_pCValProxy (NULL)
{
} // end of CPreValidator constructor
//+++-------------------------------------------------------------
//
// Function: ~CPreValidator
//
// Synopsis: This is the destructor of the CPreValidator class
//
// Arguments: NONE
//
// Returns: NONE
//
//
// History: MKarki Created 9/26/97
//
//----------------------------------------------------------------
CPreValidator::~CPreValidator(
VOID
)
{
if (m_pCValProxy) {delete m_pCValProxy;}
if (m_pCValAttributes) {delete m_pCValAttributes;}
if (m_pCValAccess) {delete m_pCValAccess;}
if (m_pCValAccounting) {delete m_pCValAccounting;}
} // end of CPreValidator::~CPreValidator
//+++-------------------------------------------------------------
//
// Function: Init
//
// Synopsis: This is the CPreValidator class initialization method
//
// Arguments:
// [in] - CDictionary*
// [in] - CPreProcsssor*
// [in] - CClients*
// [in] - CHashMD5*
// [in] - CProxyState*
// [in] - CSendToPipe*
// [in] - CReportEvent*
//
// Returns: BOOL - status
//
// Called By: CController::OnInit class public method
//
// History: MKarki Created 9/26/97
//
//----------------------------------------------------------------
BOOL CPreValidator::Init(
CDictionary *pCDictionary,
CPreProcessor *pCPreProcessor,
CClients *pCClients,
CHashMD5 *pCHashMD5,
CProxyState *pCProxyState,
CSendToPipe *pCSendToPipe,
CReportEvent *pCReportEvent
)
{
BOOL bRetVal = FALSE;
BOOL bStatus = FALSE;
_ASSERT (
(NULL != pCDictionary) &&
(NULL != pCPreProcessor)&&
(NULL != pCClients) &&
(NULL != pCHashMD5) &&
(NULL != pCProxyState) &&
(NULL != pCSendToPipe) &&
(NULL != pCReportEvent)
);
//
// attribute validator
//
m_pCValAttributes = new (std::nothrow) CValAttributes();
if (NULL == m_pCValAttributes)
{
IASTracePrintf (
"Memory allocation for Attribute Validator failed during "
"Pre-Validation"
);
goto Cleanup;
}
//
// initalize the attribute validator class object
//
bStatus = m_pCValAttributes->Init (pCDictionary, pCReportEvent);
if (FALSE == bStatus)
{
IASTracePrintf ("Attribute Validator Initialization failed");
goto Cleanup;
}
//
// Accounting Request validator
//
m_pCValAccounting = new (std::nothrow) CValAccounting ();
if (NULL == m_pCValAccounting)
{
IASTracePrintf (
"Memory allocation for accounting validator failed "
"during pre-validation"
);
goto Cleanup;
}
bStatus = m_pCValAccounting->Init (
m_pCValAttributes,
pCPreProcessor,
pCClients,
pCHashMD5,
pCReportEvent
);
if (FALSE == bStatus)
{
IASTracePrintf ("Accounting Validator Initialization failed");
goto Cleanup;
}
//
// Access Request validator
//
m_pCValAccess = new (std::nothrow) CValAccess();
if (NULL == m_pCValAccess)
{
IASTracePrintf (
"Memory allocation for access validator failed "
"during pre-validation"
);
goto Cleanup;
}
bStatus = m_pCValAccess->Init (
m_pCValAttributes,
pCPreProcessor,
pCClients,
pCHashMD5,
pCReportEvent
);
if (FALSE == bStatus)
{
IASTracePrintf ("Accounting Validator Initialization failed");
goto Cleanup;
}
//
// Proxy Packet validator
//
m_pCValProxy = new (std::nothrow) CValProxy ();
if (NULL == m_pCValAttributes)
{
IASTracePrintf (
"Memory allocation for proxy alidator failed "
"during pre-validation"
);
goto Cleanup;
}
//
// initialize the CValProxy class object
//
bStatus = m_pCValProxy->Init (
m_pCValAttributes,
pCPreProcessor,
pCClients,
pCHashMD5,
pCProxyState,
pCSendToPipe,
pCReportEvent
);
if (FALSE == bStatus)
{
IASTracePrintf ("Proxy Validator Initialization failed");
goto Cleanup;
}
//
// success
//
bRetVal = TRUE;
Cleanup:
if (FALSE == bRetVal)
{
if (m_pCValProxy) {delete m_pCValProxy;}
if (m_pCValAttributes) {delete m_pCValAttributes;}
if (m_pCValAccess) {delete m_pCValAccess;}
if (m_pCValAccounting) {delete m_pCValAccounting;}
}
return (bRetVal);
} // end of CPreValidator::Init method
//+++-------------------------------------------------------------
//
// Function: StartInValidation
//
// Synopsis: This is the CPreValidator class method used to
// initiate the validation of an inbound RADIUS packet
//
// Arguments: [in] - CPacketRadius*
//
// Returns: HRESULT - status
//
// History: MKarki Created 9/26/97
//
// Called By: CPacketReceiver::ReceivePacket class private method
//
//----------------------------------------------------------------
HRESULT
CPreValidator::StartInValidation(
CPacketRadius * pCPacketRadius
)
{
HRESULT hr = S_OK;
PACKETTYPE ePacketType;
_ASSERT (NULL != pCPacketRadius);
__try
{
//
// get the packet type for this RADIUS packet
//
ePacketType = pCPacketRadius->GetInCode ();
//
// call the appropriate validator depending upon the packet
// type
//
switch (ePacketType)
{
case ACCESS_REQUEST:
hr = m_pCValAccess->ValidateInPacket (pCPacketRadius);
break;
case ACCOUNTING_REQUEST:
hr = m_pCValAccounting->ValidateInPacket (pCPacketRadius);
break;
case ACCESS_REJECT:
case ACCESS_CHALLENGE:
case ACCESS_ACCEPT:
case ACCOUNTING_RESPONSE:
hr = m_pCValProxy->ValidateInPacket (pCPacketRadius);
break;
default:
//
// should never reach here
//
_ASSERT (0);
IASTracePrintf (
"Packet of Unknown Type:%d, in pre-validator",
static_cast <DWORD> (ePacketType)
);
hr = E_FAIL;
break;
}
}
__finally
{
}
return (hr);
} // end of CPreValidator::StartInValidation method
//+++-------------------------------------------------------------
//
// Function: StartOutValidation
//
// Synopsis: This is the CPreValidator class method used to
// initiate the validation of an outbound RADIUS packet
//
// Arguments:
// [in] CPacketRadius*
//
// Returns: HRESULT - status
//
// History: MKarki Created 9/26/97
//
// Called By:
//
//----------------------------------------------------------------
HRESULT
CPreValidator::StartOutValidation(
CPacketRadius * pCPacketRadius
)
{
HRESULT hr = S_OK;
__try
{
/*
bStatus = pCValidator->ValidateOutPacket (pCPacketRadius);
if (FALSE == bStatus) { __leave; }
*/
//
// we have completeted the pre-validation successfully
//
}
__finally
{
//
// nothing here for now
//
}
return (hr);
} // end of CPreValidator::StartOutValidation method