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
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;
|
|
};
|