// ImportExportConfig.cpp : Implementation of CImportExportConfig #include "stdafx.h" #include "IISUIObj.h" #include "ImportExportConfig.h" #include "ExportUI.h" #include "ImportUI.h" #include "util.h" #include #include "cryptpass.h" ///////////////////////////////////////////////////////////////////////////// // CImportExportConfig // Checks a pointer which should be non NULL - can be used as follows. #define CheckPointer(p,ret) {if((p)==NULL) return (ret);} // HRESULT Foo(VOID *pBar) // { // CheckPointer(pBar,E_INVALIDARG) // } // // Or if the function returns a boolean // // BOOL Foo(VOID *pBar) // { // CheckPointer(pBar,FALSE) // } HRESULT ValidateBSTRIsntNULL(BSTR pbstrString) { if( !pbstrString ) return E_INVALIDARG; if( pbstrString[0] == 0 ) return E_INVALIDARG; return NOERROR; } STDMETHODIMP CImportExportConfig::get_MachineName(BSTR *pVal) { CheckPointer(pVal, E_POINTER); _bstr_t bstrTempName = (LPCTSTR) m_strMachineName; *pVal = bstrTempName.copy(); return S_OK; } STDMETHODIMP CImportExportConfig::put_MachineName(BSTR newVal) { HRESULT hr = S_OK; if(FAILED(hr = ValidateBSTRIsntNULL(newVal))){return hr;} // buffer overflow paranoia, make sure it's less than 255 characters long if (wcslen(newVal) > _MAX_PATH){return RPC_S_STRING_TOO_LONG;} m_strMachineName = newVal; return S_OK; } STDMETHODIMP CImportExportConfig::get_UserName(BSTR *pVal) { CheckPointer(pVal, E_POINTER); _bstr_t bstrTempName = (LPCTSTR) m_strUserName; *pVal = bstrTempName.copy(); return S_OK; } STDMETHODIMP CImportExportConfig::put_UserName(BSTR newVal) { HRESULT hr = S_OK; if(FAILED(hr = ValidateBSTRIsntNULL(newVal))){return hr;} // buffer overflow paranoia, make sure it's less than 255 characters long if (wcslen(newVal) > _MAX_PATH){return RPC_S_STRING_TOO_LONG;} m_strUserName = newVal; return S_OK; } STDMETHODIMP CImportExportConfig::put_UserPassword(BSTR newVal) { HRESULT hr = S_OK; if(FAILED(hr = ValidateBSTRIsntNULL(newVal))){return hr;} // buffer overflow paranoia, make sure it's less than 255 characters long if (wcslen(newVal) > _MAX_PATH){return RPC_S_STRING_TOO_LONG;} m_strUserPasswordEncrypted = NULL; m_cbUserPasswordEncrypted = 0; // encrypt the password in memory (CryptProtectMemory) // this way if the process get's paged out to the swapfile, // the password won't be in clear text. if (FAILED(EncryptMemoryPassword(newVal,&m_strUserPasswordEncrypted,&m_cbUserPasswordEncrypted))) { return E_FAIL; } return S_OK; } STDMETHODIMP CImportExportConfig::ExportConfigToFile(BSTR bstrFileNameAndPath,BSTR bstrMetabasePath,BSTR bstrPassword) { HRESULT hr = S_OK; if(FAILED(hr = ValidateBSTRIsntNULL(bstrFileNameAndPath))){return hr;} if(FAILED(hr = ValidateBSTRIsntNULL(bstrMetabasePath))){return hr;} if(FAILED(hr = ValidateBSTRIsntNULL(bstrPassword))){return hr;} CONNECTION_INFO ConnectionInfo; memset((void *)&ConnectionInfo,0,sizeof(CONNECTION_INFO)); ConnectionInfo.IsLocal = IsLocalComputer(m_strMachineName); ConnectionInfo.pszMachineName = m_strMachineName; ConnectionInfo.pszUserName = m_strUserName; ConnectionInfo.pszUserPasswordEncrypted = m_strUserPasswordEncrypted; ConnectionInfo.cbUserPasswordEncrypted = m_cbUserPasswordEncrypted; return DoExportConfigToFile(&ConnectionInfo,bstrFileNameAndPath,bstrMetabasePath,bstrPassword,m_dwExportFlags);; } STDMETHODIMP CImportExportConfig::ExportConfigToFileUI(BSTR bstrMetabasePath) { HRESULT hr = S_OK; if(FAILED(hr = ValidateBSTRIsntNULL(bstrMetabasePath))){return hr;} m_strMetabasePath = bstrMetabasePath; // verify Parameters if (_tcslen(m_strMachineName) > _MAX_PATH){return RPC_S_STRING_TOO_LONG;} if (_tcslen(m_strMetabasePath) > _MAX_PATH){return RPC_S_STRING_TOO_LONG;} COMMONDLGPARAM dlgParam; memset((void *)&dlgParam,0,sizeof(COMMONDLGPARAM)); // Copy into a structure so that we can pass it to the dialog function. dlgParam.ConnectionInfo.IsLocal = IsLocalComputer(m_strMachineName); dlgParam.ConnectionInfo.pszMachineName = (LPCTSTR) m_strMachineName; dlgParam.ConnectionInfo.pszUserName = (LPCTSTR) m_strUserName; dlgParam.ConnectionInfo.pszUserPasswordEncrypted = (LPCTSTR) m_strUserPasswordEncrypted; dlgParam.ConnectionInfo.cbUserPasswordEncrypted = m_cbUserPasswordEncrypted; dlgParam.pszMetabasePath = (LPCTSTR) m_strMetabasePath; dlgParam.pszKeyType = NULL; dlgParam.dwImportFlags = m_dwImportFlags; dlgParam.dwExportFlags = m_dwExportFlags; if (FALSE == DialogBoxParam((HINSTANCE) _Module.m_hInst, MAKEINTRESOURCE(IDD_DIALOG_EXPORT), GetActiveWindow(), ShowExportDlgProc, (LPARAM) &dlgParam)) { return HRESULT_FROM_WIN32(GetLastError()); } else { return S_OK; } } STDMETHODIMP CImportExportConfig::ImportConfigFromFile(BSTR bstrFileNameAndPath, BSTR bstrSourcePath, BSTR bstrDestinationPath, BSTR bstrPassword) { HRESULT hr = S_OK; if(FAILED(hr = ValidateBSTRIsntNULL(bstrFileNameAndPath))){return hr;} if(FAILED(hr = ValidateBSTRIsntNULL(bstrSourcePath))){return hr;} if(FAILED(hr = ValidateBSTRIsntNULL(bstrDestinationPath))){return hr;} if(FAILED(hr = ValidateBSTRIsntNULL(bstrPassword))){return hr;} CONNECTION_INFO ConnectionInfo; memset((void *)&ConnectionInfo,0,sizeof(CONNECTION_INFO)); ConnectionInfo.IsLocal = IsLocalComputer(m_strMachineName); ConnectionInfo.pszMachineName = m_strMachineName; ConnectionInfo.pszUserName = m_strUserName; ConnectionInfo.pszUserPasswordEncrypted = m_strUserPasswordEncrypted; ConnectionInfo.cbUserPasswordEncrypted = m_cbUserPasswordEncrypted; return DoImportConfigFromFile(&ConnectionInfo,bstrFileNameAndPath,bstrSourcePath,bstrDestinationPath,bstrPassword,m_dwImportFlags); } STDMETHODIMP CImportExportConfig::ImportConfigFromFileUI(BSTR bstrMetabasePath,BSTR bstrKeyType) { HRESULT hr = S_OK; if(FAILED(hr = ValidateBSTRIsntNULL(bstrMetabasePath))){return hr;} if(FAILED(hr = ValidateBSTRIsntNULL(bstrKeyType))){return hr;} m_strMetabasePath = bstrMetabasePath; m_strKeyType = bstrKeyType; if (_tcslen(m_strMachineName) > _MAX_PATH){return RPC_S_STRING_TOO_LONG;} if (_tcslen(m_strMetabasePath) > _MAX_PATH){return RPC_S_STRING_TOO_LONG;} if (_tcslen(m_strKeyType) > _MAX_PATH){return RPC_S_STRING_TOO_LONG;} COMMONDLGPARAM dlgParam; memset((void *)&dlgParam,0,sizeof(COMMONDLGPARAM)); // Copy into a structure so that we can pass it to the dialog function. dlgParam.ConnectionInfo.IsLocal = IsLocalComputer(m_strMachineName); dlgParam.ConnectionInfo.pszMachineName = (LPCTSTR) m_strMachineName; dlgParam.ConnectionInfo.pszUserName = (LPCTSTR) m_strUserName; dlgParam.ConnectionInfo.pszUserPasswordEncrypted = (LPCTSTR) m_strUserPasswordEncrypted; dlgParam.ConnectionInfo.cbUserPasswordEncrypted = m_cbUserPasswordEncrypted; dlgParam.pszMetabasePath = (LPCTSTR) m_strMetabasePath; dlgParam.pszKeyType = (LPCTSTR) m_strKeyType; dlgParam.dwImportFlags = m_dwImportFlags; dlgParam.dwExportFlags = m_dwExportFlags; if (FALSE == DialogBoxParam((HINSTANCE) _Module.m_hInst, MAKEINTRESOURCE(IDD_DIALOG_IMPORT), GetActiveWindow(), ShowImportDlgProc, (LPARAM) &dlgParam)) { return HRESULT_FROM_WIN32(GetLastError()); } else { return S_OK; } } STDMETHODIMP CImportExportConfig::get_ImportFlags(DWORD *pVal) { CheckPointer(pVal, E_POINTER); *pVal = m_dwImportFlags; return S_OK; } STDMETHODIMP CImportExportConfig::put_ImportFlags(DWORD newVal) { // 0 = default //#define MD_IMPORT_INHERITED 0x00000001 //#define MD_IMPORT_NODE_ONLY 0x00000002 //#define MD_IMPORT_MERGE 0x00000004 m_dwImportFlags = newVal; return S_OK; } STDMETHODIMP CImportExportConfig::get_ExportFlags(DWORD *pVal) { CheckPointer(pVal, E_POINTER); *pVal = m_dwExportFlags; return S_OK; } STDMETHODIMP CImportExportConfig::put_ExportFlags(DWORD newVal) { //#define MD_EXPORT_INHERITED 0x00000001 (default) //#define MD_EXPORT_NODE_ONLY 0x00000002 m_dwExportFlags = newVal; return S_OK; }