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

165 lines
4.4 KiB
C++

//#--------------------------------------------------------------
//
// File: valattrib.cpp
//
// Synopsis: Implementation of CValAttributes class methods
// The class is responsible for taking the attributes
// in a RADIUS packet and validating their type and
// value
//
// History: 11/22/97 MKarki Created
//
// Copyright (C) 1997-98 Microsoft Corporation
// All rights reserved.
//
//----------------------------------------------------------------
#include "radcommon.h"
#include "valattrib.h"
//+++-------------------------------------------------------------
//
// Function: CValAttributes
//
// Synopsis: This is the constructor of the CValAttributes
// class
//
// Arguments: NONE
//
// Returns: NONE
//
// History: MKarki Created 11/22/97
//
//----------------------------------------------------------------
CValAttributes::CValAttributes(
VOID
)
:m_pCDictionary (NULL)
{
} // end of CValAttributes constructor
//+++-------------------------------------------------------------
//
// Function: ~CValAttributes
//
// Synopsis: This is the destructor of the CValAttributes
// class
//
// Arguments: NONE
//
// Returns: NONE
//
// History: MKarki Created 11/22/97
//
//----------------------------------------------------------------
CValAttributes::~CValAttributes(
VOID
)
{
} // end of CValAttributes destructor
//+++-------------------------------------------------------------
//
// Function: Init
//
// Synopsis: This is the CValAttributes public method used
// to intialize the class object
//
// Arguments:
// [in] CDictionary*
//
// Returns: BOOL - status
//
// History: MKarki Created 11/22/97
//
//----------------------------------------------------------------
BOOL CValAttributes::Init(
CDictionary *pCDictionary,
CReportEvent *pCReportEvent
)
{
BOOL bRetVal = FALSE;
_ASSERT (pCDictionary && pCReportEvent);
m_pCDictionary = pCDictionary;
m_pCReportEvent = pCReportEvent;
return (TRUE);
} // end of CValAttributes::Init method
//+++-------------------------------------------------------------
//
// Function: Validate
//
// Synopsis: This is the CValAttributes public method used
// to validate the packet attributes
//
// Arguments:
// [in] CPacketRadius*
//
// Returns: HRESULT - status
//
// History: MKarki Created 11/22/97
//
//----------------------------------------------------------------
HRESULT
CValAttributes::Validate (
CPacketRadius *pCPacketRadius
)
{
// We only care about Access-Requests.
if (pCPacketRadius->GetInCode() == ACCESS_REQUEST)
{
// We're looking for the Signature and EAP-Message attributes.
BOOL hasSignature = FALSE, hasEapMessage = FALSE;
// Loop through the attributes.
PATTRIBUTEPOSITION p, end;
p = pCPacketRadius->GetInAttributes();
end = p + pCPacketRadius->GetInRadiusAttributeCount();
for ( ; p != end; ++p)
{
if (p->pAttribute->dwId == RADIUS_ATTRIBUTE_SIGNATURE)
{
hasSignature = TRUE;
}
else if (p->pAttribute->dwId == RADIUS_ATTRIBUTE_EAP_MESSAGE)
{
hasEapMessage = TRUE;
}
}
// If EAP-Message is present, then Signature must be as well.
if (hasEapMessage && !hasSignature)
{
IASTraceString("Signature must accompany EAP-Message.");
// Generate audit event.
PCWSTR strings[] = { pCPacketRadius->GetClientName() };
IASReportEvent(
RADIUS_E_NO_SIGNATURE_WITH_EAP_MESSAGE,
1,
0,
strings,
NULL
);
m_pCReportEvent->Process (
RADIUS_MALFORMED_PACKET,
pCPacketRadius->GetInCode(),
pCPacketRadius->GetInLength(),
pCPacketRadius->GetInAddress(),
NULL,
pCPacketRadius->GetInPacket()
);
return RADIUS_E_ERRORS_OCCURRED;
}
}
return S_OK;
}