windows-nt/Source/XPSP1/NT/net/ias/protocol/proxy/radshare.h
2020-09-26 16:20:57 +08:00

228 lines
4.4 KiB
C++

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000, Microsoft Corp. All rights reserved.
//
// FILE
//
// radutil.h
//
// SYNOPSIS
//
// Declarations that are shared across the proxy and server components.
//
// MODIFICATION HISTORY
//
// 02/14/2000 Original version.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef RADSHARE_H
#define RADSHARE_H
#if _MSC_VER >= 1000
#pragma once
#endif
//////////
// RADIUS port types
//////////
enum RadiusPortType
{
portAuthentication,
portAccounting
};
//////////
// RADIUS protocol events
//////////
enum RadiusEventType
{
eventNone,
eventInvalidAddress,
eventAccessRequest,
eventAccessAccept,
eventAccessReject,
eventAccessChallenge,
eventAccountingRequest,
eventAccountingResponse,
eventMalformedPacket,
eventBadAuthenticator,
eventBadSignature,
eventMissingSignature,
eventTimeout,
eventUnknownType,
eventUnexpectedResponse,
eventLateResponse,
eventRoundTrip,
eventSendError,
eventReceiveError,
eventServerAvailable,
eventServerUnavailable
};
///////////////////////////////////////////////////////////////////////////////
//
// STRUCT
//
// RadiusEvent
//
// DESCRIPTION
//
// Used for reporting events from the RADIUS protocol layer.
//
///////////////////////////////////////////////////////////////////////////////
struct RadiusEvent
{
RadiusPortType portType;
RadiusEventType eventType;
PVOID context;
ULONG ipAddress;
USHORT ipPort;
const BYTE* packet;
ULONG packetLength;
ULONG data;
};
///////////////////////////////////////////////////////////////////////////////
//
// CLASS
//
// RadiusString
//
// DESCRIPTION
//
// Simple wrapper around a read-only string.
//
///////////////////////////////////////////////////////////////////////////////
class RadiusString
{
public:
RadiusString(PCWSTR p)
{ alloc(p); }
RadiusString(const RadiusString& x)
{ alloc(x.value); }
RadiusString& operator=(const RadiusString& x)
{
if (this != &x)
{
delete[] value;
value = NULL;
alloc(x.value);
}
return *this;
}
~RadiusString() throw ()
{ delete[] value; }
operator PCWSTR() const throw ()
{ return value; }
bool operator==(const RadiusString& s) const throw ()
{ return !wcscmp(value, s.value); }
private:
PWSTR value;
void alloc(PCWSTR p)
{ value = wcscpy(new WCHAR[wcslen(p) + 1], p); }
};
///////////////////////////////////////////////////////////////////////////////
//
// STRUCT
//
// RadiusRawOctets
//
// DESCRIPTION
//
// Plain ol' data.
//
///////////////////////////////////////////////////////////////////////////////
struct RadiusRawOctets
{
BYTE* value;
ULONG len;
};
///////////////////////////////////////////////////////////////////////////////
//
// CLASS
//
// RadiusOctets
//
// DESCRIPTION
//
// Simple wrapper around a read-only octet string.
//
///////////////////////////////////////////////////////////////////////////////
class RadiusOctets : RadiusRawOctets
{
public:
RadiusOctets(const BYTE* buf, ULONG buflen)
{ alloc(buf, buflen); }
RadiusOctets(const RadiusRawOctets& x)
{ alloc(x.value, x.len); }
RadiusOctets(const RadiusOctets& x)
{ alloc(x.value, x.len); }
RadiusOctets& operator=(const RadiusOctets& x)
{
if (this != &x)
{
delete[] value;
value = NULL;
alloc(x.value, x.len);
}
return *this;
}
~RadiusOctets() throw ()
{ delete[] value; }
ULONG length() const throw ()
{ return len; }
operator const BYTE*() const throw ()
{ return value; }
bool operator==(const RadiusOctets& o) const throw ()
{ return len == o.len && !memcmp(value, o.value, len); }
private:
void alloc(const BYTE* buf, ULONG buflen)
{
value = (PBYTE)memcpy(new BYTE[buflen], buf, buflen);
len = buflen;
}
};
//////////
// Macro to add reference counting to a class definition.
//////////
#define DECLARE_REFERENCE_COUNT() \
private: \
Count refCount; \
public: \
void AddRef() throw () \
{ ++refCount; } \
void Release() throw () \
{ if (--refCount == 0) delete this; }
//////////
// Helper function to get system time as 64-bit integer.
//////////
inline ULONG64 GetSystemTime64() throw ()
{
ULONG64 val;
GetSystemTimeAsFileTime((FILETIME*)&val);
return val;
}
#endif // RADSHARE_H