Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1998, Microsoft Corp. All rights reserved.
//
// FILE
//
// EAPState.cpp
//
// SYNOPSIS
//
// This file defines the class EAPState.
//
// MODIFICATION HISTORY
//
// 01/15/1998 Original version.
// 08/26/1998 Consolidated into a single class.
// 01/25/2000 User IASGetHostByName.
//
///////////////////////////////////////////////////////////////////////////////
#include <ias.h>
#include <iastlutl.h>
#include <sdoias.h>
#include <lmcons.h>
#include <winsock2.h>
#include <eapstate.h>
//////////
// Current version of the state attribute.
//////////
const WORD IAS_STATE_VERSION = 1;
//////////
// Stores invariant fields of the state attribute. Computed during
// initialization.
//////////
EAPState::Layout invariant;
bool EAPState::isValid() const throw () { //////////
// State attribute must have:
// (1) The correct length.
// (2) Same invariants.
// (3) A valid checksum.
//////////
return dwLength == sizeof(Layout) && memcmp(get().vendorID, invariant.vendorID, 14) == 0 && getChecksum() == IASAdler32( get().vendorID, sizeof(Layout) - FIELD_OFFSET(Layout, vendorID) ); }
void EAPState::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_STATE_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 source ID.
IASInsertDWORD(invariant.sourceID, IASAllocateUniqueID()); }
PIASATTRIBUTE EAPState::createAttribute(DWORD sessionID) { //////////
// Start with the parts that never change.
//////////
Layout value(invariant);
//////////
// Set the unique session ID.
//////////
IASInsertDWORD(value.sessionID, sessionID);
//////////
// Compute and insert the checksum.
//////////
IASInsertDWORD( value.checksum, IASAdler32( value.vendorID, sizeof(Layout) - FIELD_OFFSET(Layout, vendorID) ) );
//////////
// Fill in the attribute fields.
//////////
IASTL::IASAttribute attr(true); attr->dwId = RADIUS_ATTRIBUTE_STATE; attr->dwFlags = IAS_INCLUDE_IN_CHALLENGE; attr.setOctetString(sizeof(value), (const BYTE*)&value);
return attr.detach(); }
|