Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

436 lines
13 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997 - 1998.
//
// File: WSecStor.cxx
//
// Contents: Wrapper around the security store
//
// Classes: CSecurityStoreWrapper
//
// History: 7-14-97 srikants Created
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include "wsecstor.hxx"
#include <imprsnat.hxx>
//+---------------------------------------------------------------------------
//
// Member: CSecurityStoreWrapper::CSecurityStoreWrapper
//
// Synopsis: Constructor of the security store wrapper. It stores the
// ICiCAdviseStatus interface for use later during initialization
// save and load.
//
// Arguments: [pAdviseStatus] - The ICiCAdviseStatus interface needed by
// the CiStorage object.
// [cMegToLeaveOnDisk] - Megabytes not to write to on disk
//
// History: 7-20-97 srikants Created
// 01-Nov-98 KLam Added cMegToLeaveOnDisk to constructor
//
//----------------------------------------------------------------------------
CSecurityStoreWrapper::CSecurityStoreWrapper( ICiCAdviseStatus *pAdviseStatus,
ULONG cMegToLeaveOnDisk )
:_lRefCount(1),
_cMegToLeaveOnDisk( cMegToLeaveOnDisk )
{
Win4Assert( 0 != pAdviseStatus );
pAdviseStatus->AddRef();
_xAdviseStatus.Set( pAdviseStatus );
}
CSecurityStoreWrapper::~CSecurityStoreWrapper()
{
Win4Assert( 0 == _lRefCount );
}
//+---------------------------------------------------------------------------
//
// Member: CSecurityStoreWrapper::Init
//
// Synopsis: Initializes the security store using the given directory.
// If a security store already exists in the directory, then
// it is loaded. Otherwise, a new empty security store is
// created.
//
// Arguments: [pwszDirectory] - Directory from which to load the security
// table.
//
// Returns: S_OK if successful; Other error code as appropriate.
//
// Notes: Assumed to be operating in the system security context
//
// History: 7-20-97 srikants Created
// 01-Nov-98 KLam Pass _cMegToLeaveOnDisk to CiStorage
//
//----------------------------------------------------------------------------
SCODE CSecurityStoreWrapper::Init( WCHAR const * pwszDirectory )
{
if ( !_xStorage.IsNull() )
return CI_E_ALREADY_INITIALIZED;
SCODE sc = S_OK;
TRY
{
XPtr<CiStorage> xStorage(new CiStorage( pwszDirectory,
_xAdviseStatus.GetReference(),
_cMegToLeaveOnDisk ) );
_secStore.Init( xStorage.GetPointer() );
_xStorage.Set( xStorage.Acquire() );
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
ciDebugOut(( DEB_ERROR,
"Exception 0x%X caught in CSecurityStoreWrapper::Load\n",sc ));
}
END_CATCH
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CSecurityStoreWrapper::Load
//
// Synopsis: Loads the data that was produced using a "Save". The files
// specified in the pFileList are moved/copied to the target
// directory. Note that the security table is not initialized
// as a result of calling Load. An explicit Init must be called
// after the Load to cause the new files to be used by the
// security store.
//
// Arguments: [pwszDestDir] - Destination directory in which to
// copy/move the files.
// [pFileList] - List of files that must be loaded.
// [pProgressNotify] - Progress notification (optional)
// [fCallerOwnsFiles] - Set to TRUE if the caller owns files.
// If set to FALSE, the caller expects us to cleanup the files
// before returning.
// [pfAbort] - Flag set to TRUE if the load must be
// aborted prematurely.
//
// Returns: S_OK if successful. Other ole error code if there is an error.
//
// Notes: Assumed to be operating in the system security context
//
// History: 7-20-97 srikants Created
// 01-Nov-98 KLam Passed _cMegToLeaveOnDisk to CiStorage
//
//----------------------------------------------------------------------------
SCODE CSecurityStoreWrapper::Load(
WCHAR const * pwszDestDir, // dest dir
IEnumString * pFileList, // list of files to copy
IProgressNotify * pProgressNotify,
BOOL fCallerOwnsFiles,
BOOL * pfAbort )
{
SCODE sc = S_OK;
TRY
{
XPtr<CiStorage> xStorage(new CiStorage( pwszDestDir,
_xAdviseStatus.GetReference(),
_cMegToLeaveOnDisk ) );
_secStore.Load( xStorage.GetPointer(),
pFileList,
pProgressNotify,
fCallerOwnsFiles,
pfAbort);
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
ciDebugOut((DEB_ERROR, "CSecurityStoreWrapper::Load caught exception 0x%X\n", sc));
}
END_CATCH
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CSecurityStoreWrapper::Save
//
// Synopsis: Saves the current security table to the specified target
// directory.
//
// Arguments: [pwszSaveDir] - Directory in which to serialize the
// security store.
// [pfAbort] - Flag to abort the save process prematurely.
// [ppFileList] - If successful, on output will have the
// list of files serialized.
// [pProgress] - (optional) Progress Notification.
//
// Returns: S_OK if successful; Other error code as appropriate.
//
// Notes: Assumed to be operating in the system security context
//
// History: 7-20-97 srikants Created
// 01-Nov-98 KLam Passed _cMegToLeaveOnDisk to CiStorage
//
//----------------------------------------------------------------------------
SCODE
CSecurityStoreWrapper::Save( WCHAR const * pwszSaveDir,
BOOL * pfAbort,
IEnumString ** ppFileList,
IProgressNotify * pProgress )
{
if ( pwszSaveDir == 0 || pfAbort == 0 || ppFileList == 0 )
return E_POINTER;
SCODE sc= S_OK;
TRY
{
XPtr<CiStorage> xStorage(
new CiStorage( pwszSaveDir,
_xAdviseStatus.GetReference(),
_cMegToLeaveOnDisk ) );
_secStore.Save( pProgress,
*pfAbort,
xStorage.GetReference(),
ppFileList );
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CSecurityStoreWrapper::Empty
//
// Synopsis: Empties the contents of the security store.
//
// Notes: Assumed to be operating in the system security context
//
// History: 7-20-97 srikants Created
//
//----------------------------------------------------------------------------
SCODE
CSecurityStoreWrapper::Empty()
{
SCODE sc = S_OK;
TRY
{
_secStore.Empty();
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
ciDebugOut(( DEB_ERROR, "SecurityStoreWrapper::Empty exception 0x%X\n", sc ));
}
END_CATCH
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CSecurityStoreWrapper::LookupSDID
//
// Synopsis: Looks up the SDID for the given security descriptor. If one
// doesn't exist, a new SDID will be created for the SD.
//
// Arguments: [pSD] - Security descriptor.
// [cbSD] - Length of the security descriptor.
// [sdid] - [out] SDID of the security descriptor.
//
// Returns: S_OK if successful; Other error code as appropriate.
//
// History: 7-20-97 srikants Created
//
//----------------------------------------------------------------------------
SCODE
CSecurityStoreWrapper::LookupSDID( PSECURITY_DESCRIPTOR pSD,
ULONG cbSD,
SDID & sdid )
{
Win4Assert( !_xStorage.IsNull() );
SCODE sc = S_OK;
TRY
{
CImpersonateSystem impersonate;
sdid = _secStore.LookupSDID( pSD, cbSD );
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
ciDebugOut(( DEB_ERROR, "Exception 0x%X in LookupSDID\n", sc ));
}
END_CATCH
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CSecurityStoreWrapper::AccessCheck
//
// Synopsis: Verifies if the given token has the requested access to the
// document with the given SDID.
//
// Arguments: [sdid] - The SDID to check security against.
// [hToken] - The security token against which to check the
// security.
// [am] - Access mode requested.
// [fGranted] - [out] Set to TRUE if access is granted. FALSE if
// access is granted.
// This parameter is valid only if this method returns success.
//
// Returns: S_OK if successful;
// CI_E_NOT_FOUND if the given SDID not a valid one.
// Other error code as appropriate.
//
// History: 7-20-97 srikants Created
//
//----------------------------------------------------------------------------
SCODE
CSecurityStoreWrapper::AccessCheck( SDID sdid,
HANDLE hToken,
ACCESS_MASK am,
BOOL & fGranted )
{
Win4Assert( !_xStorage.IsNull() );
SCODE sc = S_OK;
TRY
{
CImpersonateSystem impersonate;
if ( !_secStore.AccessCheck( sdid, hToken, am, fGranted ) )
{
sc = CI_E_NOT_FOUND;
}
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
return sc;
}
//+---------------------------------------------------------------------------
//
// Member: CSecurityStoreWrapper::GetSecurityDescriptor
//
// Synopsis: Obtains the security descriptor of the given SDID.
//
// Arguments: [sdid] - SDID whose Security Descriptor is needed.
// [psd] - Pointer to the buffer in which to write the
// security desciptor.
// [cbSdIn] - Number of bytes in the psd buffer.
// [cbSdOut] - Number of bytes in the security descriptor.
//
// Returns: S_OK if successful;
// CI_E_NOT_FOUND if the given SDID is an invalid SDID.
// S_FALSE if the sdid is found but the buffer is not big enough
// to hold the security descriptor. cbSdOut will have the size
// of the buffer needed to hold the security descriptor.
//
// History: 7-20-97 srikants Created
//
//----------------------------------------------------------------------------
SCODE
CSecurityStoreWrapper::GetSecurityDescriptor( SDID sdid,
PSECURITY_DESCRIPTOR psd,
ULONG cbSdIn,
ULONG & cbSdOut )
{
Win4Assert( !_xStorage.IsNull() );
SCODE sc = S_OK;
TRY
{
CImpersonateSystem impersonate;
sc = _secStore.GetSecurityDescriptor( sdid, psd, cbSdIn, cbSdOut );
}
CATCH( CException, e )
{
sc = e.GetErrorCode();
}
END_CATCH
return sc;
}
//+---------------------------------------------------------------------------
//
// Function: CreateSecurityStore
//
// Synopsis: Creates the security store object and returns its pointer.
//
// Arguments: [ppSecurityStore] - Out parameter to hold the security store
// pointer.
// [cMegToLeaveOnDisk] - Number of megabytes to leave on disk
//
// Returns: S_OK if successful;
// Other error code as appropriate.
//
// History: 7-14-97 srikants Created
// 02-Nov-98 KLam Added cbDiskSpaceToLeave parameter
//
//----------------------------------------------------------------------------
SCODE CreateSecurityStore( ICiCAdviseStatus * pAdviseStatus,
PSecurityStore ** ppSecurityStore,
ULONG cMegToLeaveOnDisk )
{
if ( 0 == ppSecurityStore)
return E_POINTER;
*ppSecurityStore = 0;
SCODE sc = S_OK;
TRY
{
*ppSecurityStore = new CSecurityStoreWrapper( pAdviseStatus, cMegToLeaveOnDisk );
}
CATCH( CException, e)
{
sc = e.GetErrorCode();
ciDebugOut((DEB_ERROR, "CreateSecurityStore caught exception 0x%X\n", sc));
}
END_CATCH
return sc;
}