mirror of https://github.com/lianthony/NT4.0
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.
407 lines
15 KiB
407 lines
15 KiB
/*---------------------------------------------------------------------------
|
|
|
|
File: CAccCntrl.h
|
|
|
|
Copyright (c) 1996-1996, Microsoft Corp. All rights reserved.
|
|
|
|
Description: This file contains the class definitions of COAccessControl,
|
|
CImpAccessControl, and CFAccessControl.
|
|
Note that the class and structure declarations contained in
|
|
are not meant to be used and seen directly by developers who
|
|
only uses the IAccessControl interface.
|
|
|
|
Classes: COAccessControl - This is the principle class that implements
|
|
the DCOM IAccessControl component object.
|
|
Except the nondelegating IUnknown interface, the
|
|
COAccessControl class supports the IPersist,
|
|
IPersistStream and IAccessControl interfaces by
|
|
exposing its inner CImpAccessCOntrol pointer.
|
|
Through this arrangement, the COAccessControl
|
|
class is able to support aggregation by
|
|
controlling the object to which the IUnknown
|
|
calls of the inner CImpAccess control are
|
|
delegated at object contruction.
|
|
|
|
CImpAccessControl - This is the class that nested inside
|
|
COAccessControl. CImpAccessControl
|
|
implements the IPersist, IPersistStream,
|
|
IAccessControl interfaces and the IUnknown
|
|
interface which always delegates the call to
|
|
the IUnknown methods of the controlling object.
|
|
When COAccessControl is not part of an
|
|
aggregate CImpAccessControl IUnknown calls
|
|
should be delegated to its outer
|
|
COAccessControl, otherwise the IUnknown calls
|
|
should be delegated to the object controlling
|
|
the outer COAccessControl object.
|
|
|
|
CFAccessControl - Class factory for manufacturing COAccessControl
|
|
objects.
|
|
|
|
Notes: The definition of IAccessControl interface can be found in
|
|
oleext.h in ...sdk\inc and the data types that are defined to use with
|
|
IAccessControl can be found in sdk\inc\accctrl.h.
|
|
|
|
--------------------------------------------------------------------------*/
|
|
|
|
#ifndef _CACCCNTRL_H_
|
|
#define _CACCCNTRL_H_
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// Internal data types
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*////////////////////////////////////////////////////////////////////////////
|
|
PCB- Pickle Control Block.
|
|
Originally intended to be a structure for maintaining the information
|
|
about the pickling buffer, the PCB has become something that transcends
|
|
its intended purposes. Besides data related to the pickling buffer, the
|
|
structure also contains a copy of the access control object's ACL in a
|
|
format that can readily be serialized into a buffer by one of the type
|
|
encoding function generated by the midl compiler, see acpickl.idl for
|
|
details. The bDirtyHandle and the bPickled fields in the PCB structure
|
|
are control flags which allows better coordination between different
|
|
methods in CImpAccessControl. The purpose of the bDirtyHandle flag is
|
|
to minimize the number of times the encoding handle has to be reset
|
|
and the purpose of the bPickled flag is to minimize the number of times
|
|
the ACL has to be serialized into a buffer.
|
|
|
|
////////////////////////////////////////////////////////////////////////////*/
|
|
typedef struct tagPCB
|
|
{
|
|
char *pPicklingBuff; // This pointer is always aligned on the 8-byte
|
|
// boundary
|
|
char *pTruePicklingBuff; // This is the true pickling buffer pointer
|
|
ULONG ulPicklingBuffSize; // Size of the pickling buffer after the 8-byte alignment
|
|
ULONG ulBytesUsed; // This field indicates the number of bytes requires
|
|
// to serialize the interanl ACL
|
|
STREAM_ACL StreamACL; // The stream format ACL
|
|
handle_t PickleHandle; // Handle for encoding and decoding
|
|
BOOL bDirtyHandle; // This flag indicates whether the handle needs to be reset
|
|
BOOL bPickled; // This flag indicates whether the current stream ACL has been encoded
|
|
// into the pickling buffer.
|
|
ULONG ulMaxNumOfStreamACEs;// The maximum number of stream ACEs that the StreamACL structure has been allocated for
|
|
ULONG ulNumOfStreamACEs; // The number of stream ACEs that the StreamACL structure is holding
|
|
|
|
} PCB;
|
|
|
|
#ifdef _CHICAGO_
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// ACL_IMAGE - This structure is used on Chicago only
|
|
// This structure can only be considered a partial representation of the
|
|
// ACL using the native structure available on the Chicago plaform. Owing
|
|
// to fact that the LAN Manager APIs available on the Chicago platform
|
|
// can distinguish between GRANT_ACCESS mode ACEs and DENY_MODE ACEs, two
|
|
// LAN Manager ACLs are used to create the illusion of having two different
|
|
// types of ACEs can appear simultaneously in the ACL.
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
typedef struct tagACL_IMAGE
|
|
{
|
|
char *pACL; // Pointer to a LAN Manager ACL.
|
|
// Format: |access_info_1|array of access_list|
|
|
SHORT *psNumOfACEs; // The number of ACE
|
|
SHORT sMaxNumOfACEs; // The maximum number of ACEs that the
|
|
// structure can hold
|
|
BOOL bDirtyACL; // This flag indicatess whether the ACL has
|
|
// changed since the last time it was mapped to
|
|
// the system registry use the NetAccess* functions
|
|
} ACL_IMAGE;
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// ACL_DESC - ACL Descriptor
|
|
// The ACL descriptor is a structure that describes how access control
|
|
// native to specific platform can be used to emulate the ACL as perceived
|
|
// through the IAccessControl interface.
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// The following structure is the ACL descriptor on the Chicago platform.
|
|
// This structure is divided into two symmetric portions, one portion holds
|
|
// the DENY_ACCESS mode ACEs while the other holds GRANT_ACCESS mode ACEs.
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
typedef struct tagACLDescriptor
|
|
{
|
|
ACL_IMAGE DenyACL;
|
|
ACL_IMAGE GrantACL;
|
|
} ACL_DESCRIPTOR;
|
|
|
|
#else
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// The following is supposed to be the ACL descriptor on the Windows NT
|
|
// platform. Since the Windows NT version of DCOM IAccessControl implementation
|
|
// is still under developement, the content of the following structure may
|
|
// change in the future.
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
typedef struct tagACL_DESCRIPTOR
|
|
{
|
|
void *pACLBuffer; // Pointer to the NT ACL buffer
|
|
ULONG ulACLBufferSize; // Size of the ACL buffer
|
|
ULONG ulSIDSize; // Exacted size of all the SIDs in the NT ACL
|
|
BOOL bDirtyACL; // This flag indicates whether the internal
|
|
// ACL has been chcanged since the last time
|
|
// it was mapped to an NT ACL.
|
|
SECURITY_DESCRIPTOR SecDesc; // We need the security descriptor to call
|
|
// AccessCheck
|
|
|
|
} ACL_DESCRIPTOR;
|
|
|
|
|
|
|
|
#endif
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// CFAccessControl - COAccessControl class factory.
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
class CFAccessControl : public IClassFactory
|
|
{
|
|
private:
|
|
|
|
// Private variables.
|
|
LONG m_cRefs; // Object reference count
|
|
|
|
public:
|
|
|
|
// IUnknown methods
|
|
|
|
STDMETHODIMP_(HRESULT) QueryInterface
|
|
(
|
|
REFIID iid,
|
|
void **ppv
|
|
);
|
|
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
|
|
// If the object's reference count reaches zero, the RElease method will
|
|
// decrement the global object count named g_cObjects in acsrv.cxx.
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
|
|
// IClassFactory methods
|
|
// Upon successful creation of a new COAccessControl object,
|
|
// the following function will increment the global object
|
|
// count named g_cObjects by one.
|
|
STDMETHODIMP_(HRESULT) CreateInstance
|
|
(
|
|
IUnknown *pUnkOuter,
|
|
REFIID riid,
|
|
void **ppv
|
|
);
|
|
|
|
// The following method relies on a global lock count named g_cServer
|
|
// which is maintained inside acsrv.cxx.
|
|
STDMETHODIMP_(HRESULT) LockServer
|
|
(
|
|
BOOL fLock
|
|
);
|
|
|
|
// Constructor
|
|
CFAccessControl(void);
|
|
|
|
// Destructor
|
|
~CFAccessControl(void);
|
|
|
|
}; // CFAccessControl
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// COAccessControl - The DCOM IAccessControl implementation component. The
|
|
// COAccessControl componnet is implemented as a nested
|
|
// class to support aggregation.
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
class COAccessControl : public IUnknown
|
|
{
|
|
public:
|
|
|
|
// Main object IUnknown Methods - These IUnknown methods are non-delegating
|
|
STDMETHODIMP_(HRESULT) QueryInterface
|
|
(
|
|
REFIID riid,
|
|
void **ppv
|
|
);
|
|
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
|
|
// The following method relies on a global lock count named g_cServer
|
|
// which is maintained inside acsrv.cxx.
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
// Constructor
|
|
COAccessControl(void);
|
|
STDMETHODIMP_(HRESULT) Init(IUnknown *pOuter);
|
|
|
|
// Destructor
|
|
~COAccessControl(void);
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// CImpAccessControl - This class is nested inside COAccessControl.
|
|
// The CImpAccessControl class implements
|
|
// the IPersistStream interface, IPersist interface
|
|
// , and the IAccessControl interface
|
|
//////////////////////////////////////////////////////////////////////
|
|
class CImpAccessControl : public IPersistStream, public IAccessControl
|
|
{
|
|
public:
|
|
|
|
// IUnknown methods, all calls are delegated to the controlling object.
|
|
STDMETHODIMP_(HRESULT) QueryInterface
|
|
(
|
|
REFIID riid,
|
|
void **ppv
|
|
);
|
|
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
// IPersist method
|
|
|
|
STDMETHODIMP_(HRESULT) GetClassID
|
|
(
|
|
CLSID *pClassID
|
|
);
|
|
|
|
// IPersistStream Methods
|
|
STDMETHODIMP_(HRESULT) IsDirty
|
|
(
|
|
void
|
|
);
|
|
|
|
// Object initialization method. This method must be called
|
|
// before any non-IUnknown methods.
|
|
STDMETHODIMP_(HRESULT)Load
|
|
(
|
|
IStream *pStm
|
|
);
|
|
|
|
STDMETHODIMP_(HRESULT)Save
|
|
(
|
|
IStream *pStm,
|
|
BOOL fClearDirty
|
|
);
|
|
|
|
STDMETHODIMP_(HRESULT) GetSizeMax
|
|
(
|
|
ULARGE_INTEGER *pcdSize
|
|
);
|
|
|
|
// IAccessControl Methods
|
|
STDMETHODIMP_(HRESULT) GrantAccessRights
|
|
(
|
|
PACTRL_ACCESSW pAccessList
|
|
);
|
|
|
|
// This function is not implemented.
|
|
STDMETHODIMP_(HRESULT) SetAccessRights
|
|
(
|
|
PACTRL_ACCESSW pAccessList
|
|
);
|
|
|
|
// This function is not implemented.
|
|
STDMETHODIMP_(HRESULT) SetOwner
|
|
(
|
|
PTRUSTEEW pOwner,
|
|
PTRUSTEEW pGroup
|
|
);
|
|
|
|
STDMETHODIMP_(HRESULT) RevokeAccessRights
|
|
(
|
|
LPWSTR lpProperty,
|
|
ULONG cCount,
|
|
TRUSTEEW pTrustee[]
|
|
);
|
|
|
|
STDMETHODIMP_(HRESULT) GetAllAccessRights
|
|
(
|
|
LPWSTR lpProperty,
|
|
PACTRL_ACCESSW *ppAccessList,
|
|
PTRUSTEEW *ppOwner,
|
|
PTRUSTEEW *ppGroup
|
|
);
|
|
|
|
STDMETHODIMP_(HRESULT) IsAccessAllowed
|
|
(
|
|
PTRUSTEEW pTrustee,
|
|
LPWSTR lpProperty,
|
|
ACCESS_RIGHTS AccessRights,
|
|
BOOL *pfAccessAllowed
|
|
);
|
|
|
|
// Constructor
|
|
CImpAccessControl
|
|
(
|
|
IUnknown *pBackPtr,
|
|
IUnknown *pUnkOuter
|
|
);
|
|
|
|
// Destructor
|
|
~CImpAccessControl(void);
|
|
|
|
|
|
private:
|
|
|
|
STDMETHODIMP_(void) CleanupAccessList
|
|
(
|
|
BOOL fReleaseAll,
|
|
STREAM_ACE *pStreamACEReqs,
|
|
void *pACEReqs,
|
|
ULONG cGrant,
|
|
ULONG cDeny
|
|
);
|
|
|
|
STDMETHODIMP_(HRESULT) AddAccessList
|
|
(
|
|
STREAM_ACE *pStreamACEReqs,
|
|
void *pACEReqs,
|
|
ULONG ulEstPickledSize,
|
|
ULONG cGrant,
|
|
ULONG cDeny
|
|
);
|
|
|
|
#ifndef _CHICAGO_
|
|
STDMETHODIMP_(HRESULT) GetEffAccRightsUsingSID
|
|
(
|
|
PSID pSID,
|
|
DWORD *pdwRights
|
|
);
|
|
|
|
STDMETHODIMP_(HRESULT) GetEffAccRightsUsingName
|
|
(
|
|
LPWSTR pTrusteeName,
|
|
DWORD *pdwRights
|
|
);
|
|
#endif
|
|
// Static data members
|
|
BOOL m_bInitialized; // Object initialization flag.
|
|
BOOL m_bDirty; // This flag is set to TRUE if the
|
|
// object has been changed since the
|
|
// last save.
|
|
IUnknown *m_pUnkOuter; // Pointer to the controlling object's
|
|
// IUnkown implementation.
|
|
CRITICAL_SECTION m_ACLLock; // Critical section object for
|
|
// protecting the ACL from concurrent
|
|
// access.
|
|
#ifdef _CHICAGO_
|
|
CEffectivePermsCache m_Cache; // This cache stroes the results of
|
|
// previous access checking.
|
|
#else
|
|
CEffPermsCacheString m_CacheString; // Access check results cache indexed by Unicode string
|
|
CEffPermsCacheSID m_CacheSID; // Access check results cache indexed by SID.
|
|
#endif
|
|
ACL_DESCRIPTOR m_ACLDesc; // Platform dependent representation
|
|
// of the ACL
|
|
PCB m_pcb; // Pickle control block
|
|
|
|
}; // COAccessControl::CImpAccessControl
|
|
|
|
// Private variables
|
|
|
|
LONG m_cRefs; // Object's reference count
|
|
CImpAccessControl *m_ImpObj; // Pointer to the inner CImpAccessControl object
|
|
|
|
}; // COAccessControl
|
|
|
|
|
|
#endif // #ifndef _CACCCNTRL_H_
|