Leaked source code of windows server 2003
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.
 
 
 
 
 
 

190 lines
5.5 KiB

#pragma once
#include "wrappers.h"
struct _CallbackInfo
{
typedef void (*PFN_CALLBACK)( void*, LPCWSTR, bool );
_CallbackInfo( PFN_CALLBACK pCB = NULL, void* pContext = NULL )
{
pCallback = pCB;
pCtx = pContext;
}
PFN_CALLBACK pCallback;
void* pCtx;
};
// Class for writing files to the package
// Note that the class does not own any of the handles it contains. It just caches them
/////////////////////////////////////////////////////////////////////////////////////////
class COutPackage
{
// Data types
public:
enum AddFileOptions
{
afNone = 0x0000,
afNoDACL = 0x0001,
afAllowNoInhAce = 0x0002, // Allows for inherited ACEs to be not exported.
};
private:
enum
{
DefaultBufferSize = 4 * 1024,
};
enum _SidType
{
sidInvalid,
sidIISUser,
sidWellKnown,
sidExternal
};
// Used for exporting file object's security settings
typedef std::list<_sid_ptr> TSIDList;
// Ctor / Dtor
public:
COutPackage ( HANDLE hFile, bool bCompress, HCRYPTKEY hCryptKey );
// Class interface
public:
void AddFile ( LPCWSTR wszName,
const IXMLDOMDocumentPtr& spXMLDoc,
const IXMLDOMElementPtr& spEl,
DWORD dwOptions )const;
void AddPath ( LPCWSTR wszPath,
const IXMLDOMDocumentPtr& spXMLDoc,
const IXMLDOMElementPtr& spEl,
DWORD dwOptions )const;
void WriteSIDsToXML ( DWORD dwSiteID,
const IXMLDOMDocumentPtr& spXMLDoc,
const IXMLDOMElementPtr& spEl )const;
void ResetSIDList ( void )const{ m_SIDList.clear();}
void SetCallback ( const _CallbackInfo& Info )const
{
m_CallbackInfo = Info;
}
// Implementation
private:
DWORDLONG GetCurrentPos ( void )const;
void ExportFileDACL ( LPCWSTR wszObject,
const IXMLDOMDocumentPtr& spDoc,
const IXMLDOMElementPtr& spRoot,
bool bAllowSkipInherited )const;
void ExportAce ( LPVOID pACE,
const IXMLDOMDocumentPtr& spDoc,
const IXMLDOMElementPtr& spRoot,
bool bAllowSkipInherited )const;
DWORD IDFromSID ( PSID pSID )const;
bool GetSIDDetails ( PSID pSID,
LPCWSTR wszIISUser,
LPCWSTR wszMachine,
std::wstring& rstrAccount,
std::wstring& rstrDomain,
SID_NAME_USE& rSidUsage,
_SidType& rSidType )const;
void WriteSIDToXML ( const IXMLDOMElementPtr& spSid,
DWORD dwID,
LPCWSTR wszAccount,
LPCWSTR wszDomain,
SID_NAME_USE SidUsage,
_SidType SidType )const;
void RemoveSidFromXML( const IXMLDOMDocumentPtr& spDoc, DWORD nSidID )const;
void AddPathOnly ( LPCWSTR wszPath,
LPCWSTR wszName,
const IXMLDOMDocumentPtr& spXMLDoc,
const IXMLDOMElementPtr& spEl,
DWORD dwOptions )const;
// Data members
private:
mutable TSIDList m_SIDList; // Contains all SIDs for files, added to the package
HANDLE m_hFile; // The file handle
bool m_bCompress; // If true - files are compressed
HCRYPTKEY m_hCryptKey; // If not null - used to encrypt files
TByteAutoPtr m_spBuffer; // Buffer used for the file operations
mutable _CallbackInfo m_CallbackInfo; // Calbback for add file
};
// Class for restoring files/dirs from the package
/////////////////////////////////////////////////////////////////////////////////////////
class CInPackage
{
// Data types
public:
enum ExtractDirOptions
{
edNone = 0x0000,
edNoDACL = 0x0001 // Security settings will not be extracted
};
private:
typedef std::map<DWORD, _sid_ptr> TSIDMap; // These are the SIDs for file/dir permissions
enum
{
DefaultBufferSize = 4 * 1024,
};
// Class interface
public:
CInPackage ( const IXMLDOMNodePtr& spSite,
HANDLE hFile,
bool bCompressed,
HCRYPTKEY hDecryptKey );
void ExtractVDir ( const IXMLDOMNodePtr& spVDir, DWORD dwOptions );
void ExtractFile ( const IXMLDOMNodePtr& spFile, LPCWSTR wszDir, DWORD dwOptions );
void SetCallback ( const _CallbackInfo& Info )const
{
m_CallbackInfo = Info;
}
// Implementation
private:
void LoadSIDs ( const IXMLDOMNodePtr& spSIDs );
bool LookupSID ( const IXMLDOMNodePtr& spSID,
LPCWSTR wszLocalMachine,
LPCWSTR wszSourceMachine,
DWORD& rdwID,
TByteAutoPtr& rspData );
void ExtractDir ( const IXMLDOMNodePtr& spDir, LPCWSTR wszRoot, DWORD dwOptions );
void ApplyFileObjSecurity( const IXMLDOMNodePtr& spObj, LPCWSTR wszName );
// Data
private:
TSIDMap m_SIDs; // SID used for file.dir access permissions
HANDLE m_hFile; // The input file ( the package )
bool m_bCompressed; // Is the package data compressed
HCRYPTKEY m_hDecryptKey; // Used to decrypt the data. If NULL - data is not encrypted
TByteAutoPtr m_spBuffer; // General memory buffer
mutable _CallbackInfo m_CallbackInfo;
};