|
|
/*++
Copyright (c) 2001 Microsoft Corporation
Module Name:
objects.h
Abstract:
Definitions for the sundry objects implemented by azroles
Author:
Cliff Van Dyke (cliffv) 11-Apr-2001
Revision History:
20-Aug-2001 chaitu
Added critical section serialization for LDAP
6-Oct-2001
Added private variables to AzApplication and AzScope to temporarily store GUIDized CN for AD store
--*/
#ifdef __cplusplus
extern "C" { #endif
/////////////////////////////////////////////////////////////////////////////
//
// Structure definitions
//
/////////////////////////////////////////////////////////////////////////////
//
// An Authorization Store
//
typedef struct _AZP_AZSTORE {
//
// All objects are a generic objects
//
GENERIC_OBJECT GenericObject;
//
// Define objects that can be children of this AuthorizationStore
//
GENERIC_OBJECT_HEAD Applications; GENERIC_OBJECT_HEAD Groups;
//
// Identifies the persistence provider
//
PAZPE_PROVIDER_INFO ProviderInfo;
//
// This context identifies the instance of the persistence provider.
//
AZPE_PERSIST_CONTEXT PersistContext; HMODULE ProviderDll;
//
// Policy type/URL
//
AZP_STRING PolicyUrl;
//
// target machine name for the policy URL
//
AZP_STRING TargetMachine;
//
// Persistence engine operations are serialized by PersistCritSect
//
SAFE_CRITICAL_SECTION PersistCritSect; BOOLEAN PersistCritSectInitialized;
//
// List of NEW_OBJECT_NAME structs.
// (See the comment on NEW_OBJECT_NAME)
//
LIST_ENTRY NewNames;
//
// Domain Timeout.
// These variables represent our ability to cache the fact that a DC is down in a domain.
// Access to all variables are serialized by DomainCritSect.
//
SAFE_CRITICAL_SECTION DomainCritSect; BOOLEAN DomainCritSectInitialized;
//
// Time (in milliseconds) after a domain is detected to be unreachable before we'll attempt
// to contact a DC again.
//
LONG DomainTimeout;
//
// List of domains we've used.
//
LIST_ENTRY Domains;
//
// List of Free scripts in LRU order
// Access serialized by FreeScriptCritSect
LIST_ENTRY LruFreeScriptHead; LONG LruFreeScriptCount;
SAFE_CRITICAL_SECTION FreeScriptCritSect; BOOLEAN FreeScriptCritSectInitialized;
//
// Maximum number of script engines that can be cached at one time
//
LONG MaxScriptEngines;
//
// Time (in milliseconds) that a script is allowed to run before being automatically
// terminated.
//
LONG ScriptEngineTimeout; HANDLE ScriptEngineTimerQueue;
//
// Count of the number of times group evaluation has been flushed
//
ULONG GroupEvalSerialNumber;
//
// Count of the number of times the operation cache has been flushed
//
ULONG OpCacheSerialNumber;
//
// Audit related structures.
//
//
// TRUE if a user has SE_SECURITY_PRIVILEGE
//
BOOLEAN HasSecurityPrivilege;
// Audit handles for different audit types.
AUTHZ_AUDIT_EVENT_TYPE_HANDLE hClientContextCreateAuditEventType; AUTHZ_AUDIT_EVENT_TYPE_HANDLE hClientContextDeleteAuditEventType; AUTHZ_AUDIT_EVENT_TYPE_HANDLE hAccessCheckAuditEventType; AUTHZ_AUDIT_EVENT_TYPE_HANDLE hApplicationInitializationAuditEventType; AUTHZ_AUDIT_EVENT_TYPE_HANDLE hClientContextCreateNameAuditEventType; AUTHZ_AUDIT_EVENT_TYPE_HANDLE hClientContextDeleteNameAuditEventType; AUTHZ_AUDIT_EVENT_TYPE_HANDLE hAccessCheckNameAuditEventType;
//
// Version numbers
//
ULONG MajorVersion; ULONG MinorVersion;
//
// Initialize flag
//
ULONG InitializeFlag;
//
// TRUE if the provider supports lazy load for children
//
BOOLEAN ChildLazyLoadSupported;
} AZP_AZSTORE, *PAZP_AZSTORE;
//
// An Application
//
typedef struct _AZP_APPLICATION {
//
// All objects are a generic objects
//
GENERIC_OBJECT GenericObject;
//
// Attributes from the external definition of the object
//
AZP_STRING AuthzInterfaceClsid; AZP_STRING AppVersion;
//
// Define objects that can be children of this application
//
GENERIC_OBJECT_HEAD Operations; GENERIC_OBJECT_HEAD Tasks; GENERIC_OBJECT_HEAD Scopes; GENERIC_OBJECT_HEAD Groups; GENERIC_OBJECT_HEAD Roles; GENERIC_OBJECT_HEAD ClientContexts;
//
// An application is known as a resource manager to the authz code
//
AUTHZ_RESOURCE_MANAGER_HANDLE AuthzResourceManager;
//
// Application instace Luid.
//
LUID InstanceId;
//
// Boolean to indicate if the application object needs to be unloaded
// from the cache, i.e., its children removed from cache. The application
// object will continue to reside in the cache for enumeration purposes
//
BOOLEAN UnloadApplicationObject;
//
// A sequence number needed to check if a COM handle to this object is
// valid after the application object has been closed
//
DWORD AppSequenceNumber;
} AZP_APPLICATION, *PAZP_APPLICATION;
//
// An Operation
//
typedef struct _AZP_OPERATION {
//
// All objects are generic objects
//
GENERIC_OBJECT GenericObject;
//
// Attributes from the external definition of the object
//
LONG OperationId;
//
// An Operation object is referenced by Tasks objects and Role objects
//
GENERIC_OBJECT_LIST backTasks; GENERIC_OBJECT_LIST backRoles;
} AZP_OPERATION, *PAZP_OPERATION;
//
// A Task
//
typedef struct _AZP_TASK {
//
// All objects are generic objects
//
GENERIC_OBJECT GenericObject;
//
// Attributes from the external definition of the object
//
AZP_STRING BizRule; // Modification serialized by RunningScriptCritSect
AZP_STRING BizRuleLanguage; CLSID BizRuleLanguageClsid; //The CLSID corresponding to BizRuleLanguage
AZP_STRING BizRuleImportedPath; LONG IsRoleDefinition;
//
// A Task object references a list of Operation objects
//
GENERIC_OBJECT_LIST Operations;
//
// An Task object is referenced by Role objects
//
GENERIC_OBJECT_LIST backRoles;
//
// An Task object references other task objects
//
GENERIC_OBJECT_LIST Tasks; GENERIC_OBJECT_LIST backTasks;
//
// Maintain a list of free script engines for running the bizrule
// Access serialized by AzAuthorizationStore->FreeScriptCritSect
//
LIST_ENTRY FreeScriptHead;
//
// Maintain a cache of running script engines
//
SAFE_CRITICAL_SECTION RunningScriptCritSect; BOOLEAN RunningScriptCritSectInitialized;
LIST_ENTRY RunningScriptHead; ULONG BizRuleSerialNumber; // Access serialized by RunningScriptCritSect
} AZP_TASK, *PAZP_TASK;
//
// A Scope
//
typedef struct _AZP_SCOPE {
//
// All objects are generic objects
//
GENERIC_OBJECT GenericObject;
//
// Attributes from the external definition of the object
//
//
// Roles defined for this scope
//
GENERIC_OBJECT_HEAD Tasks; GENERIC_OBJECT_HEAD Groups; GENERIC_OBJECT_HEAD Roles;
} AZP_SCOPE, *PAZP_SCOPE;
//
// A Group
//
typedef struct _AZP_GROUP {
//
// All objects are generic objects
//
GENERIC_OBJECT GenericObject;
//
// Attributes from the external definition of the object
//
LONG GroupType; AZP_STRING LdapQuery;
//
// A Group object references a list of Group objects as members and non members
//
GENERIC_OBJECT_LIST AppMembers; GENERIC_OBJECT_LIST AppNonMembers;
GENERIC_OBJECT_LIST backAppMembers; GENERIC_OBJECT_LIST backAppNonMembers;
//
// A Group object is referenced by Role objects
//
GENERIC_OBJECT_LIST backRoles;
//
// A Group object references a list of Sid objects as members and non members
//
GENERIC_OBJECT_LIST SidMembers; GENERIC_OBJECT_LIST SidNonMembers;
} AZP_GROUP, *PAZP_GROUP;
//
// A Role
//
typedef struct _AZP_ROLE {
//
// All objects are generic objects
//
GENERIC_OBJECT GenericObject;
//
// Attributes from the external definition of the object
//
//
// A Role object references a list of Group objects, a list of operation objects,
// and a list of task objects.
//
//
GENERIC_OBJECT_LIST AppMembers; GENERIC_OBJECT_LIST Operations; GENERIC_OBJECT_LIST Tasks;
//
// A Role object references a list of Sid objects as members
//
GENERIC_OBJECT_LIST SidMembers;
} AZP_ROLE, *PAZP_ROLE;
//
// A Sid.
//
// A Sid object is a pseudo-object. It really doesn't exist from any external
// interface. It exists simply as a holder of back-references to real objects
// that contain lists of sids
//
typedef struct _AZP_SID {
//
// All objects are generic objects
//
// Note that the "ObjectName" of the generic object is really a binary SID.
//
GENERIC_OBJECT GenericObject;
//
// A Sid is referenced by Group objects and Role Objects
//
GENERIC_OBJECT_LIST backGroupMembers; GENERIC_OBJECT_LIST backGroupNonMembers;
GENERIC_OBJECT_LIST backRoles;
GENERIC_OBJECT_LIST backAdmins; GENERIC_OBJECT_LIST backReaders;
GENERIC_OBJECT_LIST backDelegatedPolicyUsers;
} AZP_SID, *PAZP_SID;
//
// A Client Context
//
// A client context object is a pseudo-object. It is not persisted.
//
typedef struct _AZP_CLIENT_CONTEXT {
//
// All objects are generic objects
//
// Note that the "ObjectName" of the generic object is empty
//
GENERIC_OBJECT GenericObject;
//
// A ClientContext is referenced by Application objects
//
GENERIC_OBJECT_LIST backApplications;
//
// The client context is typically accessed with the AzGlResource locked shared.
// That allows multiple access check operations to be performed simultaneously.
// This crit sect protects the field of the client context.
//
SAFE_CRITICAL_SECTION CritSect; BOOLEAN CritSectInitialized;
//
// A client context has an underlying authz context
//
// This field is only modified during ClientContext creation and deletion. Both
// of which happen with AzGlResource locked exclusively. So, references to this field
// are allowed anytime the GenericObject.ReferenceCount is incremented.
//
AUTHZ_CLIENT_CONTEXT_HANDLE AuthzClientContext;
//
// Creation routine for the client context.
// We only have two creation routines right now.
// FromToken
// FromName
//
#define AZP_CONTEXT_CREATED_FROM_TOKEN 0x1
#define AZP_CONTEXT_CREATED_FROM_NAME 0x2
#define AZP_CONTEXT_CREATED_FROM_SID 0x4
DWORD CreationType;
//
// The token handle of the client.
// If the client has no token, this value is INVALID_TOKEN_HANDLE.
//
// This field is only modified during ClientContext creation and deletion. Both
// of which happen with AzGlResource locked exclusively. So, references to this field
// are allowed anytime the GenericObject.ReferenceCount is incremented.
// This has a valid handle if the CreationType is AZP_CONTEXT_CREATED_FROM_TOKEN.
//
HANDLE TokenHandle;
//
// The (Domain, Client) pair to represent the client.
// This has valid strings if CreationType is AZP_CONTEXT_CREATED_FROM_NAME.
//
LPWSTR DomainName; LPWSTR ClientName; UCHAR SidBuffer[SECURITY_MAX_SID_SIZE];
//
// The DN of the account representing the user sid
// Access to this field is serialized by ClientContext->CritSect.
//
LPWSTR AccountDn;
//
// The Domain handle of the account domain for the user account.
// If the Domain is NULL, either the domain isn't known or the domain doesn't
// support LDAP (because either the domain is an NT 4.0 (or older) domain or the account
// is a local account). Check the LdapNotSupported boolean to differentiate.
//
// Access to these fields are serialized by ClientContext->CritSect.
//
PVOID Domain; BOOLEAN LdapNotSupported;
//
// List of our status' for evaluating membership in app groups
// Access to this field is serialized by ClientContext->CritSect.
//
LIST_ENTRY MemEval;
//
// Count of the number of times group evaluation has been flushed
//
ULONG GroupEvalSerialNumber;
//
// Count of the number of times the operation cache has been flushed
//
ULONG OpCacheSerialNumber;
//
// Cache of operations that have already been Access Checked
//
RTL_GENERIC_TABLE OperationCacheAvlTree;
//
// Parameters to pass to Bizrules
// See AzContextAccessCheck parameters for descriptions
//
// This copy of the parameters was captured from the most recent AccessCheck.
// It is used on the next AccessCheck to determine whether cached results
// can be used. Currently it is only used for the OperationCacheAvlTree.
// In the future, it may be used for the MemEval cache when ldap query groups
// become parameterized.
//
// These arrays are sparse. The UsedParameterNames type is VT_EMPTY for unused parameters
//
VARIANT *UsedParameterNames; VARIANT *UsedParameterValues; ULONG UsedParameterCount;
//
// Logon Id of the client token. This is needed for generating audits.
//
LUID LogonId;
//
// role name (if specified by client) for access check
//
AZP_STRING RoleName;
} AZP_CLIENT_CONTEXT, *PAZP_CLIENT_CONTEXT;
/////////////////////////////////////////////////////////////////////////////
//
// Global definitions
//
/////////////////////////////////////////////////////////////////////////////
extern SAFE_RESOURCE AzGlCloseApplication; extern SAFE_RESOURCE AzGlResource; extern GUID AzGlZeroGuid;
/////////////////////////////////////////////////////////////////////////////
//
// Procedure definitions
//
/////////////////////////////////////////////////////////////////////////////
//
// Init functions for the various specific objects
//
DWORD AzpAzStoreInit( IN PGENERIC_OBJECT ParentGenericObject, IN PGENERIC_OBJECT ChildGenericObject );
DWORD AzpApplicationInit( IN PGENERIC_OBJECT ParentGenericObject, IN PGENERIC_OBJECT ChildGenericObject );
DWORD AzpOperationInit( IN PGENERIC_OBJECT ParentGenericObject, IN PGENERIC_OBJECT ChildGenericObject );
DWORD AzpTaskInit( IN PGENERIC_OBJECT ParentGenericObject, IN PGENERIC_OBJECT ChildGenericObject );
DWORD AzpScopeInit( IN PGENERIC_OBJECT ParentGenericObject, IN PGENERIC_OBJECT ChildGenericObject );
DWORD AzpGroupInit( IN PGENERIC_OBJECT ParentGenericObject, IN PGENERIC_OBJECT ChildGenericObject );
DWORD AzpRoleInit( IN PGENERIC_OBJECT ParentGenericObject, IN PGENERIC_OBJECT ChildGenericObject );
DWORD AzpSidInit( IN PGENERIC_OBJECT ParentGenericObject, IN PGENERIC_OBJECT ChildGenericObject );
DWORD AzpClientContextInit( IN PGENERIC_OBJECT ParentGenericObject, IN PGENERIC_OBJECT ChildGenericObject );
//
// NameConflict routines for the specific objects
//
DWORD AzpOperationNameConflict( IN PGENERIC_OBJECT ParentGenericObject, IN PAZP_STRING ChildObjectNameString );
DWORD AzpTaskNameConflict( IN PGENERIC_OBJECT ParentGenericObject, IN PAZP_STRING ChildObjectNameString );
DWORD AzpGroupNameConflict( IN PGENERIC_OBJECT ParentGenericObject, IN PAZP_STRING ChildObjectNameString );
DWORD AzpRoleNameConflict( IN PGENERIC_OBJECT ParentGenericObject, IN PAZP_STRING ChildObjectNameString );
//
// Get/Set property functions for the specific objects
//
DWORD AzpAzStoreGetProperty( IN PGENERIC_OBJECT GenericObject, IN ULONG Flags, IN ULONG PropertyId, OUT PVOID *PropertyValue );
DWORD AzpAzStoreSetProperty( IN PGENERIC_OBJECT GenericObject, IN ULONG Flags, IN ULONG PropertyId, IN PVOID PropertyValue );
DWORD AzpApplicationGetProperty( IN PGENERIC_OBJECT GenericObject, IN ULONG Flags, IN ULONG PropertyId, OUT PVOID *PropertyValue );
DWORD AzpApplicationSetProperty( IN PGENERIC_OBJECT GenericObject, IN ULONG Flags, IN ULONG PropertyId, IN PVOID PropertyValue );
DWORD AzpOperationGetProperty( IN PGENERIC_OBJECT GenericObject, IN ULONG Flags, IN ULONG PropertyId, OUT PVOID *PropertyValue );
DWORD AzpOperationSetProperty( IN PGENERIC_OBJECT GenericObject, IN ULONG Flags, IN ULONG PropertyId, IN PVOID PropertyValue );
DWORD AzpTaskGetProperty( IN PGENERIC_OBJECT GenericObject, IN ULONG Flags, IN ULONG PropertyId, OUT PVOID *PropertyValue );
DWORD AzpTaskSetProperty( IN PGENERIC_OBJECT GenericObject, IN ULONG Flags, IN ULONG PropertyId, IN PVOID PropertyValue );
DWORD AzpGroupGetProperty( IN PGENERIC_OBJECT GenericObject, IN ULONG Flags, IN ULONG PropertyId, OUT PVOID *PropertyValue );
DWORD AzpScopeGetProperty( IN PGENERIC_OBJECT GenericObject, IN ULONG Flags, IN ULONG PropertyId, OUT PVOID *PropertyValue );
DWORD AzpGroupSetProperty( IN PGENERIC_OBJECT GenericObject, IN ULONG Flags, IN ULONG PropertyId, IN PVOID PropertyValue );
DWORD AzpClientContextSetProperty( IN PGENERIC_OBJECT GenericObject, IN ULONG Flags, IN ULONG PropertyId, IN PVOID PropertyValue );
DWORD AzpTaskAddPropertyItem( IN PGENERIC_OBJECT GenericObject, IN PGENERIC_OBJECT_LIST GenericObjectList, IN PGENERIC_OBJECT LinkedToObject );
DWORD AzpGroupAddPropertyItem( IN PGENERIC_OBJECT GenericObject, IN PGENERIC_OBJECT_LIST GenericObjectList, IN PGENERIC_OBJECT LinkedToObject );
DWORD AzpRoleGetProperty( IN PGENERIC_OBJECT GenericObject, IN ULONG Flags, IN ULONG PropertyId, OUT PVOID *PropertyValue );
DWORD AzpRoleAddPropertyItem( IN PGENERIC_OBJECT GenericObject, IN ULONG PropertyId, IN PGENERIC_OBJECT_LIST GenericObjectList, IN AZP_STRING ObjectName );
DWORD AzpClientContextGetProperty( IN PGENERIC_OBJECT GenericObject, IN ULONG Flags, IN ULONG PropertyId, OUT PVOID *PropertyValue );
//
// Free routines for the various object types
//
VOID AzpAzStoreFree( IN PGENERIC_OBJECT GenericObject );
VOID AzpApplicationFree( IN PGENERIC_OBJECT GenericObject );
VOID AzpOperationFree( IN PGENERIC_OBJECT GenericObject );
VOID AzpTaskFree( IN PGENERIC_OBJECT GenericObject );
VOID AzpScopeFree( IN PGENERIC_OBJECT GenericObject );
VOID AzpGroupFree( IN PGENERIC_OBJECT GenericObject );
VOID AzpRoleFree( IN PGENERIC_OBJECT GenericObject );
VOID AzpSidFree( IN PGENERIC_OBJECT GenericObject );
VOID AzpClientContextFree( IN PGENERIC_OBJECT GenericObject );
//
// Other object specific functions
//
DWORD AzpReferenceOperationByOpId( IN PAZP_APPLICATION Application, IN LONG OperationId, IN BOOLEAN RefreshCache, OUT PAZP_OPERATION *RetOperation );
BOOL AzpOpenToManageStore ( IN PAZP_AZSTORE pAzStore );
//
// Object specific default value arrays
//
extern AZP_DEFAULT_VALUE AzGlAzStoreDefaultValues[]; extern AZP_DEFAULT_VALUE AzGlApplicationDefaultValues[]; extern AZP_DEFAULT_VALUE AzGlOperationDefaultValues[]; extern AZP_DEFAULT_VALUE AzGlTaskDefaultValues[]; extern AZP_DEFAULT_VALUE AzGlGroupDefaultValues[];
//
// Procedures from domain.cxx
//
typedef struct _AZP_DC {
//
// Reference count for this structure
//
LONG ReferenceCount;
//
// Name of the DC
//
AZP_STRING DcName;
//
// Ldap Handle to the DC
//
LDAP *LdapHandle;
} AZP_DC, *PAZP_DC;
PVOID AzpReferenceDomain( IN PAZP_AZSTORE AzAuthorizationStore, IN LPWSTR DomainName, IN BOOLEAN IsDnsDomainName );
VOID AzpDereferenceDomain( IN PVOID DomainHandle );
VOID AzpUnlinkDomains( IN PAZP_AZSTORE AzAuthorizationStore );
DWORD AzpLdapErrorToWin32Error( IN ULONG LdapStatus );
DWORD AzpGetDc( IN PAZP_AZSTORE AzAuthorizationStore, IN PVOID DomainHandle, IN OUT PULONG Context, OUT PAZP_DC *RetDc );
VOID AzpDereferenceDc( IN PAZP_DC Dc );
//
// These are the current major and minor versions for authorization store
//
extern ULONG AzGlCurrAzRolesMajorVersion; extern ULONG AzGlCurrAzRolesMinorVersion;
//
// version control routine. Here are the rules:
// MajorVersion (DWORD) - Specifies the major version of the azroles.dll
// that wrote this policy. An azroles.dll with an older major version
// number cannot read nor write a database with a newer major version number.
// The version 1 value of this DWORD is 1. We hope to never have to
// change this value in future releases.
//
// MinorVersion (DWORD) - Specifies the minor version of the azroles.dll
// that wrote this policy. An azroles.dll with an older minor version
// number can read but cannot write a database with a newer minor version number.
// The version 1 value of this DWORD is 0.
//
BOOL AzpAzStoreVersionAllowWrite( IN PAZP_AZSTORE AzAuthorizationStore );
DWORD AzpScopeCanBeDelegated( IN PGENERIC_OBJECT GenericObject, IN BOOL bLockedShared );
#ifdef __cplusplus
} #endif
|