windows-nt/Source/XPSP1/NT/net/ias/providers/accounting/classattr.cpp
2020-09-26 16:20:57 +08:00

152 lines
3.6 KiB
C++

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1998, Microsoft Corp. All rights reserved.
//
// FILE
//
// classattr.cpp
//
// SYNOPSIS
//
// Defines the class IASClass.
//
// MODIFICATION HISTORY
//
// 08/06/1998 Original version.
// 01/25/2000 Use IASGetHostByName.
//
///////////////////////////////////////////////////////////////////////////////
#include <ias.h>
#include <iasattr.h>
#include <sdoias.h>
#include <lmcons.h>
#include <winsock2.h>
#include <classattr.h>
const DWORD IAS_CLASS_VERSION = 1;
//////////
// Global variables computed during initialization.
//////////
IASClass invariant; // Stores invariant fields of the class attribute.
LONG nextSerialNumber; // Next serial number to be assigned.
// Returns TRUE if the class attribute is in Microsoft format.
BOOL IASClass::isMicrosoft(DWORD actualLength) const throw ()
{
return actualLength >= sizeof(IASClass) &&
getVendorID() == IAS_VENDOR_MICROSOFT &&
getVersion() == IAS_CLASS_VERSION &&
getChecksum() == IASAdler32(
vendorID,
actualLength - offsetof(IASClass, vendorID)
);
}
void IASClass::initialize() throw ()
{
// Null everything out.
memset(&invariant, 0, sizeof(invariant));
// Set the vendor ID and version.
IASInsertDWORD(invariant.vendorID, IAS_VENDOR_MICROSOFT);
IASInsertWORD (invariant.version, IAS_CLASS_VERSION);
// Try to set the server IP address. We don't care if this fails since
// we may be running on a computer without IP installed.
WCHAR computerName[CNLEN + 1];
DWORD nchar = CNLEN + 1;
if (GetComputerNameW(computerName, &nchar))
{
PHOSTENT hostEnt = IASGetHostByName(computerName);
if (hostEnt)
{
memcpy(invariant.serverAddress, hostEnt->h_addr, 4);
LocalFree(hostEnt);
}
}
// Set the boot time.
FILETIME ft;
GetSystemTimeAsFileTime(&ft);
IASInsertDWORD(invariant.lastReboot, ft.dwHighDateTime);
IASInsertDWORD(invariant.lastReboot + 4, ft.dwLowDateTime);
// Reset the serial number.
nextSerialNumber = 0;
}
PIASATTRIBUTE IASClass::createAttribute(const IAS_OCTET_STRING* tag) throw ()
{
//////////
// Allocate an attribute.
//////////
PIASATTRIBUTE attr;
if (IASAttributeAlloc(1, &attr) != NO_ERROR)
{
return NULL;
}
//////////
// Allocate memory for the value.
//////////
DWORD len = sizeof(IASClass) + (tag ? tag->dwLength : 0);
IASClass* cl = (IASClass*)CoTaskMemAlloc(len);
if (cl == NULL)
{
IASAttributeRelease(attr);
return NULL;
}
//////////
// Copy in the parts that never change.
//////////
memcpy(cl->vendorID, invariant.vendorID, 22);
//////////
// Set the unique serial number.
//////////
IASInsertDWORD(cl->serialNumber + 4,
InterlockedIncrement(&nextSerialNumber));
//////////
// Add the profile string (if any).
//////////
if (tag)
{
memcpy(cl->serialNumber + 8, tag->lpValue, tag->dwLength);
}
//////////
// Compute and insert the checksum.
//////////
IASInsertDWORD(
cl->checksum,
IASAdler32(
cl->vendorID,
len - offsetof(IASClass, vendorID)
)
);
//////////
// Fill in the attribute fields.
//////////
attr->dwId = RADIUS_ATTRIBUTE_CLASS;
attr->dwFlags = IAS_INCLUDE_IN_ACCEPT;
attr->Value.itType = IASTYPE_OCTET_STRING;
attr->Value.OctetString.lpValue = (PBYTE)cl;
attr->Value.OctetString.dwLength = len;
return attr;
}