397 lines
11 KiB
Plaintext
397 lines
11 KiB
Plaintext
|
///////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//
|
||
|
// Module: iaspolcy.idl
|
||
|
//
|
||
|
// Project: Everest
|
||
|
//
|
||
|
// Description: IAS Policy Subsystem Interface
|
||
|
//
|
||
|
// Author: TLP 12/1/97
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
// This file will be processed by the MIDL tool to
|
||
|
// produce the type library (iaspolcy.tlb) and marshalling code.
|
||
|
|
||
|
import "oaidl.idl";
|
||
|
import "ocidl.idl";
|
||
|
|
||
|
//////////
|
||
|
// IAS Reason-Codes
|
||
|
//////////
|
||
|
typedef enum {
|
||
|
IAS_SUCCESS = 0x00,
|
||
|
IAS_INTERNAL_ERROR = 0x01,
|
||
|
IAS_ACCESS_DENIED = 0x02,
|
||
|
IAS_MALFORMED_REQUEST = 0x03,
|
||
|
IAS_GLOBAL_CATALOG_UNAVAILABLE = 0x04,
|
||
|
IAS_DOMAIN_UNAVAILABLE = 0x05,
|
||
|
IAS_SERVER_UNAVAILABLE = 0x06,
|
||
|
IAS_NO_SUCH_DOMAIN = 0x07,
|
||
|
IAS_NO_SUCH_USER = 0x08,
|
||
|
|
||
|
IAS_AUTH_FAILURE = 0x10,
|
||
|
IAS_CHANGE_PASSWORD_FAILURE = 0x11,
|
||
|
IAS_UNSUPPORTED_AUTH_TYPE = 0x12,
|
||
|
IAS_NO_CLEARTEXT_PASSWORD = 0x13,
|
||
|
IAS_LM_NOT_ALLOWED = 0x14,
|
||
|
|
||
|
IAS_LOCAL_USERS_ONLY = 0x20,
|
||
|
IAS_PASSWORD_MUST_CHANGE = 0x21,
|
||
|
IAS_ACCOUNT_DISABLED = 0x22,
|
||
|
IAS_ACCOUNT_EXPIRED = 0x23,
|
||
|
IAS_ACCOUNT_LOCKED_OUT = 0x24,
|
||
|
IAS_INVALID_LOGON_HOURS = 0x25,
|
||
|
IAS_ACCOUNT_RESTRICTION = 0x26,
|
||
|
|
||
|
IAS_NO_POLICY_MATCH = 0x30,
|
||
|
IAS_NO_CONNECTION_REQUEST_POLICY_MATCH = 0x31,
|
||
|
|
||
|
IAS_DIALIN_LOCKED_OUT = 0x40,
|
||
|
IAS_DIALIN_DISABLED = 0x41,
|
||
|
IAS_INVALID_AUTH_TYPE = 0x42,
|
||
|
IAS_INVALID_CALLING_STATION = 0x43,
|
||
|
IAS_INVALID_DIALIN_HOURS = 0x44,
|
||
|
IAS_INVALID_CALLED_STATION = 0x45,
|
||
|
IAS_INVALID_PORT_TYPE = 0x46,
|
||
|
IAS_DIALIN_RESTRICTION = 0x47,
|
||
|
IAS_CPW_NOT_ALLOWED = 0x48,
|
||
|
IAS_INVALID_CERT_EKU = 0x49,
|
||
|
|
||
|
IAS_NO_RECORD = 0x50,
|
||
|
|
||
|
IAS_SESSION_TIMEOUT = 0x60,
|
||
|
IAS_UNEXPECTED_REQUEST = 0x61,
|
||
|
|
||
|
IAS_PROXY_REJECT = 0x70,
|
||
|
IAS_PROXY_UNKNOWN_GROUP = 0x71,
|
||
|
IAS_PROXY_UNKNOWN_SERVER = 0x72,
|
||
|
IAS_PROXY_PACKET_TOO_LONG = 0x73,
|
||
|
IAS_PROXY_SEND_ERROR = 0x74,
|
||
|
IAS_PROXY_TIMEOUT = 0x75,
|
||
|
IAS_PROXY_MALFORMED_RESPONSE = 0x76
|
||
|
|
||
|
} IASREASON;
|
||
|
|
||
|
/////////////////////////////////////////////
|
||
|
// IASATTRIBUTE structure (raw IAS attribute)
|
||
|
/////////////////////////////////////////////
|
||
|
|
||
|
// Allowed syntaxes
|
||
|
typedef enum IASTYPEENUM {
|
||
|
IASTYPE_INVALID = 0,
|
||
|
IASTYPE_BOOLEAN,
|
||
|
IASTYPE_INTEGER,
|
||
|
IASTYPE_ENUM,
|
||
|
IASTYPE_INET_ADDR,
|
||
|
IASTYPE_STRING,
|
||
|
IASTYPE_OCTET_STRING,
|
||
|
IASTYPE_UTC_TIME,
|
||
|
IASTYPE_PROV_SPECIFIC
|
||
|
} IASTYPE;
|
||
|
|
||
|
// C/C++ type for each allowed syntax.
|
||
|
typedef DWORD IAS_BOOLEAN, *PIAS_BOOLEAN;
|
||
|
|
||
|
typedef DWORD IAS_INTEGER, *PIAS_INTEGER;
|
||
|
|
||
|
typedef DWORD IAS_ENUM, *PIAS_ENUM;
|
||
|
|
||
|
typedef DWORD IAS_INET_ADDR, *PIAS_INET_ADDR;
|
||
|
|
||
|
typedef FILETIME IAS_UTC_TIME, *PIAS_UTC_TIME;
|
||
|
|
||
|
typedef struct _IAS_STRING {
|
||
|
LPSTR pszAnsi;
|
||
|
LPWSTR pszWide;
|
||
|
} IAS_STRING, *PIAS_STRING;
|
||
|
|
||
|
typedef struct _IAS_OCTET_STRING {
|
||
|
DWORD dwLength;
|
||
|
BYTE *lpValue;
|
||
|
} IAS_OCTET_STRING, *PIAS_OCTET_STRING;
|
||
|
|
||
|
typedef IAS_OCTET_STRING IAS_PROV_SPECIFIC, *PIAS_PROV_SPECIFIC;
|
||
|
|
||
|
// Attribute value structure.
|
||
|
typedef struct _IASVALUE
|
||
|
{
|
||
|
IASTYPE itType;
|
||
|
[ switch_is((DWORD)itType) ] union
|
||
|
{
|
||
|
[ case(IASTYPE_BOOLEAN) ]
|
||
|
IAS_BOOLEAN Boolean;
|
||
|
[ case(IASTYPE_INTEGER) ]
|
||
|
IAS_INTEGER Integer;
|
||
|
[ case(IASTYPE_ENUM) ]
|
||
|
IAS_ENUM Enumerator;
|
||
|
[ case(IASTYPE_INET_ADDR) ]
|
||
|
IAS_INET_ADDR InetAddr;
|
||
|
[ case(IASTYPE_STRING) ]
|
||
|
IAS_STRING String;
|
||
|
[ case(IASTYPE_OCTET_STRING) ]
|
||
|
IAS_OCTET_STRING OctetString;
|
||
|
[ case(IASTYPE_UTC_TIME) ]
|
||
|
IAS_UTC_TIME UTCTime;
|
||
|
[ case(IASTYPE_PROV_SPECIFIC) ]
|
||
|
IAS_PROV_SPECIFIC ProviderSpecific;
|
||
|
};
|
||
|
} IASVALUE, *PIASVALUE;
|
||
|
|
||
|
//
|
||
|
// these are the bit values
|
||
|
cpp_quote ("#define IAS_INCLUDE_IN_ACCEPT 0x00000001")
|
||
|
cpp_quote ("#define IAS_INCLUDE_IN_REJECT 0x00000002")
|
||
|
cpp_quote ("#define IAS_INCLUDE_IN_CHALLENGE 0x00000004")
|
||
|
cpp_quote ("#define IAS_INCLUDE_IN_RESPONSE (IAS_INCLUDE_IN_ACCEPT | IAS_INCLUDE_IN_REJECT | IAS_INCLUDE_IN_CHALLENGE)")
|
||
|
cpp_quote ("#define IAS_RECVD_FROM_CLIENT 0x00000008")
|
||
|
cpp_quote ("#define IAS_RECVD_FROM_PROTOCOL 0x00000010")
|
||
|
|
||
|
// Attribute structure.
|
||
|
typedef struct _IASATTRIBUTE {
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////
|
||
|
// (1) dwReserved should be hidden from users
|
||
|
// (2) dwFlags is temporary... plan is to have an in attribute
|
||
|
// collection and an out attribute collection on the request.
|
||
|
//
|
||
|
// Make these changes after NT 5 beta.
|
||
|
/////////////////////////////////////////////////////////////////
|
||
|
|
||
|
DWORD dwReserved; // Reserved (reference count)
|
||
|
DWORD dwFlags; // Reserved (protocol state)
|
||
|
DWORD dwId; // Unique attribute ID - from IAS Dictionary
|
||
|
IASVALUE Value; // Attribute value
|
||
|
|
||
|
} IASATTRIBUTE, *PIASATTRIBUTE;
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////
|
||
|
// IAS request object interface
|
||
|
////////////////////////////////////////////////////////////
|
||
|
|
||
|
// Request Identifiers
|
||
|
typedef enum _IASREQUEST
|
||
|
{
|
||
|
IAS_REQUEST_ACCESS_REQUEST,
|
||
|
IAS_REQUEST_ACCOUNTING,
|
||
|
IAS_REQUEST_CHALLENGE_RESPONSE,
|
||
|
IAS_REQUEST_NAS_STATE,
|
||
|
|
||
|
// Obsolete.
|
||
|
IAS_REQUEST_PROXY_PACKET = 999
|
||
|
|
||
|
} IASREQUEST;
|
||
|
|
||
|
// Response Identifiers
|
||
|
typedef enum _IASRESPONSE
|
||
|
{
|
||
|
IAS_RESPONSE_INVALID,
|
||
|
IAS_RESPONSE_ACCESS_ACCEPT,
|
||
|
IAS_RESPONSE_ACCESS_REJECT,
|
||
|
IAS_RESPONSE_ACCESS_CHALLENGE,
|
||
|
IAS_RESPONSE_ACCOUNTING,
|
||
|
IAS_RESPONSE_DISCARD_PACKET,
|
||
|
|
||
|
// Obsolete.
|
||
|
IAS_RESPONSE_FORWARD_PACKET = 999,
|
||
|
IAS_RESPONSE_RAS,
|
||
|
// New Response Identifiers Here...
|
||
|
|
||
|
IAS_RESPONSE_MAX = 2048
|
||
|
|
||
|
} IASRESPONSE;
|
||
|
|
||
|
// Protocol Identifiers
|
||
|
typedef enum _IASPROTOCOL
|
||
|
{
|
||
|
IAS_PROTOCOL_INVALID=0,
|
||
|
IAS_PROTOCOL_NONE,
|
||
|
IAS_PROTOCOL_RADIUS,
|
||
|
IAS_PROTOCOL_TACACSPLUS,
|
||
|
IAS_PROTOCOL_LDAP,
|
||
|
IAS_PROTOCOL_RAS
|
||
|
// New Protocol Identifiers Here...
|
||
|
|
||
|
} IASPROTOCOL;
|
||
|
|
||
|
// Providers
|
||
|
typedef enum _IASPROVIDER
|
||
|
{
|
||
|
IAS_PROVIDER_NONE,
|
||
|
IAS_PROVIDER_WINDOWS,
|
||
|
IAS_PROVIDER_RADIUS_PROXY
|
||
|
|
||
|
} IASPROVIDER;
|
||
|
|
||
|
interface IRequestSource; // Forward reference
|
||
|
|
||
|
// Request status
|
||
|
typedef [public] enum _IASREQUESTSTATUS
|
||
|
{
|
||
|
IAS_REQUEST_STATUS_ABORT, // Request cannot be handled
|
||
|
IAS_REQUEST_STATUS_CONTINUE, // Pass request to next handler
|
||
|
IAS_REQUEST_STATUS_HANDLED, // Request has been handled
|
||
|
// New Status Types Here...
|
||
|
IAS_REQUEST_STATUS_INVALID
|
||
|
|
||
|
} IASREQUESTSTATUS;
|
||
|
|
||
|
[
|
||
|
object,
|
||
|
uuid(6BC096A7-0CE6-11D1-BAAE-00C04FC2E20D),
|
||
|
pointer_default(unique)
|
||
|
]
|
||
|
interface IRequest : IUnknown
|
||
|
{
|
||
|
[propget, id(1)] HRESULT Request([out, retval] LONG *pVal);
|
||
|
[propput, id(1)] HRESULT Request([in] LONG newVal);
|
||
|
[propget, id(2)] HRESULT Response([out, retval] LONG *pVal);
|
||
|
[propget, id(3)] HRESULT Reason([out, retval] LONG *pVal);
|
||
|
[propget, id(4)] HRESULT Protocol([out, retval] IASPROTOCOL *pVal);
|
||
|
[propput, id(4)] HRESULT Protocol([in] IASPROTOCOL newVal);
|
||
|
[propget, id(5)] HRESULT Source([out, retval] IRequestSource** pVal);
|
||
|
[propput, id(5)] HRESULT Source([in] IRequestSource* newVal);
|
||
|
[id(7)] HRESULT SetResponse([in] IASRESPONSE eResponse,
|
||
|
[in] LONG lReason);
|
||
|
[id(8)] HRESULT ReturnToSource([in] IASREQUESTSTATUS eStatus);
|
||
|
};
|
||
|
|
||
|
////////////////////////////////////////////////////////////
|
||
|
// Raw interface to an IAS request object's attributes
|
||
|
////////////////////////////////////////////////////////////
|
||
|
|
||
|
typedef struct _ATTRIBUTEPOSITION
|
||
|
{
|
||
|
DWORD dwReserved; // For use by request object
|
||
|
PIASATTRIBUTE pAttribute;
|
||
|
|
||
|
} ATTRIBUTEPOSITION, *PATTRIBUTEPOSITION;
|
||
|
|
||
|
[
|
||
|
object,
|
||
|
hidden,
|
||
|
restricted,
|
||
|
uuid(6BC096A8-0CE6-11D1-BAAE-00C04FC2E20D),
|
||
|
pointer_default(unique)
|
||
|
]
|
||
|
interface IAttributesRaw : IUnknown
|
||
|
{
|
||
|
HRESULT AddAttributes([in] DWORD dwPosCount, [in, out] PATTRIBUTEPOSITION pPositions);
|
||
|
HRESULT RemoveAttributes([in] DWORD dwPosCount, [in] PATTRIBUTEPOSITION pPositions);
|
||
|
HRESULT RemoveAttributesByType([in] DWORD dwAttrIDCount, [in] LPDWORD lpdwAttrIDs);
|
||
|
HRESULT GetAttributeCount([in]LPDWORD lpdwCount);
|
||
|
HRESULT GetAttributes([in, out] LPDWORD lpdwPosCount, [out] PATTRIBUTEPOSITION pPositions, [in] DWORD dwAttrIDCount, [in] LPDWORD lpdwAttrIDs);
|
||
|
};
|
||
|
|
||
|
////////////////////////////////////////////////////////////
|
||
|
// Raw interface to an IAS request object's state
|
||
|
////////////////////////////////////////////////////////////
|
||
|
[
|
||
|
object,
|
||
|
hidden,
|
||
|
restricted,
|
||
|
uuid(6BC096BA-0CE6-11D1-BAAE-00C04FC2E20D),
|
||
|
pointer_default(unique)
|
||
|
]
|
||
|
interface IRequestState : IUnknown
|
||
|
{
|
||
|
HRESULT Push([in] unsigned hyper State);
|
||
|
HRESULT Pop([out] unsigned hyper* pState);
|
||
|
HRESULT Top([out] unsigned hyper* pState);
|
||
|
}
|
||
|
|
||
|
////////////////////////////////////////////////////////////
|
||
|
// Interface exported by request comsumer components
|
||
|
////////////////////////////////////////////////////////////
|
||
|
[
|
||
|
object,
|
||
|
uuid(6BC096AA-0CE6-11D1-BAAE-00C04FC2E20D),
|
||
|
dual,
|
||
|
pointer_default(unique)
|
||
|
]
|
||
|
interface IRequestHandler : IDispatch
|
||
|
{
|
||
|
[id(1)] HRESULT OnRequest(IRequest* pRequest);
|
||
|
};
|
||
|
|
||
|
////////////////////////////////////////////////////////////
|
||
|
// Interface exported by request producer components
|
||
|
////////////////////////////////////////////////////////////
|
||
|
[
|
||
|
object,
|
||
|
oleautomation,
|
||
|
uuid(6BC096A9-0CE6-11D1-BAAE-00C04FC2E20D),
|
||
|
pointer_default(unique)
|
||
|
]
|
||
|
interface IRequestSource : IUnknown
|
||
|
{
|
||
|
HRESULT OnRequestComplete(IRequest* pRequest, IASREQUESTSTATUS eStatus);
|
||
|
};
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
// Request Handler Quality Control Interface
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
// INOPERABLE - Request handler cannot process requests. Note that this
|
||
|
// is not necessarily a permanent condition.
|
||
|
//
|
||
|
// FLOODED - Request handler is too busy to accept any more requests.
|
||
|
//
|
||
|
// READY - Request handler is operational and can process requests.
|
||
|
//
|
||
|
// UNKNOWN - Initial state before the handle reports its state
|
||
|
|
||
|
typedef enum _QUALITYSTATUS
|
||
|
{
|
||
|
QUALITY_STATUS_INOPERABLE = 0x0001,
|
||
|
QUALITY_STATUS_FLOODED,
|
||
|
QUALITY_STATUS_READY,
|
||
|
QUALITY_STATUS_UNKNOWN
|
||
|
|
||
|
} QUALITYSTATUS;
|
||
|
|
||
|
[
|
||
|
object,
|
||
|
uuid(6BC096AB-0CE6-11D1-BAAE-00C04FC2E20D),
|
||
|
dual,
|
||
|
pointer_default(unique)
|
||
|
]
|
||
|
interface IQualityControl : IDispatch
|
||
|
{
|
||
|
HRESULT OnQualityNotify(QUALITYSTATUS eQualityStatus, LONG lObjectID);
|
||
|
HRESULT SetQualityNotify(IQualityControl* pQualityControl);
|
||
|
};
|
||
|
|
||
|
|
||
|
///////////////
|
||
|
// Type Library
|
||
|
///////////////
|
||
|
|
||
|
[
|
||
|
uuid(6BC096A5-0CE6-11D1-BAAE-00C04FC2E20D),
|
||
|
version(1.0),
|
||
|
helpstring("IAS Policy 1.0 Type Library")
|
||
|
]
|
||
|
|
||
|
library IASPolicyLib
|
||
|
{
|
||
|
importlib("stdole2.tlb");
|
||
|
|
||
|
//////////
|
||
|
// Classes
|
||
|
//////////
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////
|
||
|
[
|
||
|
uuid(6BC096B1-0CE6-11D1-BAAE-00C04FC2E20D),
|
||
|
helpstring("Request Class")
|
||
|
]
|
||
|
coclass Request
|
||
|
{
|
||
|
[default] interface IRequest;
|
||
|
};
|
||
|
};
|