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.
251 lines
5.6 KiB
251 lines
5.6 KiB
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright Microsoft Corp. All rights reserved.
|
|
//
|
|
// FILE
|
|
//
|
|
// EAPDnary.h
|
|
//
|
|
// SYNOPSIS
|
|
//
|
|
// This file declares the class EAPTranslator.
|
|
//
|
|
// MODIFICATION HISTORY
|
|
//
|
|
// 01/15/1998 Original version.
|
|
// 05/08/1998 Do not restrict to attributes defined in raseapif.h.
|
|
// Allow filtering of translated attributes.
|
|
// 08/26/1998 Converted to a namespace.
|
|
// 04/09/1999 Fix leak when converting outgoing attributes.
|
|
// 04/17/2000 Port to new dictionary API.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include <ias.h>
|
|
#include <iastlb.h>
|
|
#include <iasutil.h>
|
|
|
|
#include <hashmap.h>
|
|
|
|
#include <eapdnary.h>
|
|
|
|
namespace EAPTranslator
|
|
{
|
|
typedef hash_map < DWORD, IASTYPE, identity<DWORD> > TypeMap;
|
|
|
|
long theRefCount; // Initialization refCount.
|
|
TypeMap theTypeMap(0x200); // Maps attribute ID's to IASTYPE's.
|
|
}
|
|
|
|
|
|
HRESULT EAPTranslator::initialize() throw ()
|
|
{
|
|
IASGlobalLockSentry sentry;
|
|
|
|
if (theRefCount > 0)
|
|
{
|
|
// We're already initialized, so just bump the ref count.
|
|
++theRefCount;
|
|
return S_OK;
|
|
}
|
|
|
|
try
|
|
{
|
|
// Names of various columns in the dictionary.
|
|
const PCWSTR COLUMNS[] =
|
|
{
|
|
L"ID",
|
|
L"Syntax",
|
|
NULL
|
|
};
|
|
|
|
// Open the attributes table.
|
|
IASTL::IASDictionary dnary(COLUMNS);
|
|
|
|
// Iterate through the attributes and populate our dictionary.
|
|
while (dnary.next())
|
|
{
|
|
DWORD id = (DWORD)dnary.getLong(0);
|
|
IASTYPE type = (IASTYPE)dnary.getLong(1);
|
|
|
|
theTypeMap[id] = type;
|
|
}
|
|
}
|
|
catch (std::bad_alloc)
|
|
{
|
|
theTypeMap.clear();
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch (const _com_error& ce)
|
|
{
|
|
theTypeMap.clear();
|
|
return ce.Error();
|
|
}
|
|
|
|
// We made it so increase the refCount.
|
|
++theRefCount;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
void EAPTranslator::finalize() throw ()
|
|
{
|
|
IASGlobalLockSentry sentry;
|
|
|
|
if (--theRefCount == 0)
|
|
{
|
|
theTypeMap.clear();
|
|
}
|
|
}
|
|
|
|
BOOL EAPTranslator::translate(
|
|
IASAttribute& dst,
|
|
const RAS_AUTH_ATTRIBUTE& src
|
|
)
|
|
{
|
|
dst->dwId = (DWORD)src.raaType;
|
|
|
|
const TypeMap::value_type* val = theTypeMap.find(dst->dwId);
|
|
|
|
IASTYPE itType = val ? val->second : IASTYPE_INVALID;
|
|
|
|
switch (itType)
|
|
{
|
|
case IASTYPE_BOOLEAN:
|
|
case IASTYPE_INTEGER:
|
|
case IASTYPE_ENUM:
|
|
case IASTYPE_INET_ADDR:
|
|
{
|
|
switch (src.dwLength)
|
|
{
|
|
case 4:
|
|
case 2:
|
|
case 1:
|
|
dst->Value.Integer = PtrToUlong(src.Value);
|
|
break;
|
|
default:
|
|
_com_issue_error(E_INVALIDARG);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case IASTYPE_STRING:
|
|
{
|
|
dst.setString(src.dwLength, (const BYTE*)src.Value);
|
|
break;
|
|
}
|
|
|
|
case IASTYPE_OCTET_STRING:
|
|
case IASTYPE_PROV_SPECIFIC:
|
|
{
|
|
dst.setOctetString(src.dwLength, (const BYTE*)src.Value);
|
|
break;
|
|
}
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
dst->Value.itType = itType;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL EAPTranslator::translate(
|
|
RAS_AUTH_ATTRIBUTE& dst,
|
|
const IASATTRIBUTE& src
|
|
)
|
|
{
|
|
dst.raaType = (RAS_AUTH_ATTRIBUTE_TYPE)src.dwId;
|
|
|
|
switch (src.Value.itType)
|
|
{
|
|
case IASTYPE_BOOLEAN:
|
|
case IASTYPE_INTEGER:
|
|
case IASTYPE_ENUM:
|
|
case IASTYPE_INET_ADDR:
|
|
{
|
|
dst.dwLength = sizeof(DWORD);
|
|
dst.Value = UlongToPtr(src.Value.Integer);
|
|
break;
|
|
}
|
|
|
|
case IASTYPE_STRING:
|
|
{
|
|
DWORD dwErr = IASAttributeAnsiAlloc(const_cast<PIASATTRIBUTE>(&src));
|
|
if (dwErr != NO_ERROR)
|
|
{
|
|
issue_error(HRESULT_FROM_WIN32(dwErr));
|
|
}
|
|
|
|
if (src.Value.String.pszAnsi)
|
|
{
|
|
dst.dwLength = (DWORD)strlen(src.Value.String.pszAnsi) + 1;
|
|
dst.Value = (PVOID)src.Value.String.pszAnsi;
|
|
}
|
|
else
|
|
{
|
|
dst.dwLength = 0;
|
|
dst.Value = NULL;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case IASTYPE_OCTET_STRING:
|
|
case IASTYPE_PROV_SPECIFIC:
|
|
{
|
|
dst.dwLength = src.Value.OctetString.dwLength;
|
|
dst.Value = (PVOID)src.Value.OctetString.lpValue;
|
|
break;
|
|
}
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void EAPTranslator::translate(
|
|
IASAttributeVector& dst,
|
|
const RAS_AUTH_ATTRIBUTE* src
|
|
)
|
|
{
|
|
IASAttribute attr;
|
|
|
|
const RAS_AUTH_ATTRIBUTE* i;
|
|
for (i = src; i->raaType != raatMinimum; ++i)
|
|
{
|
|
attr.alloc();
|
|
|
|
if (translate(attr, *i))
|
|
{
|
|
dst.push_back(attr, false);
|
|
|
|
attr.detach();
|
|
}
|
|
}
|
|
}
|
|
|
|
void EAPTranslator::translate(
|
|
PRAS_AUTH_ATTRIBUTE dst,
|
|
const IASAttributeVector& src,
|
|
DWORD filter
|
|
)
|
|
{
|
|
PRAS_AUTH_ATTRIBUTE next = dst;
|
|
|
|
IASAttributeVector::const_iterator i;
|
|
for (i = src.begin(); i != src.end(); ++i)
|
|
{
|
|
if ((i->pAttribute->dwFlags & filter) != 0 &&
|
|
translate(*next, *(i->pAttribute)))
|
|
{
|
|
++next;
|
|
}
|
|
}
|
|
|
|
next->raaType = raatMinimum;
|
|
}
|