// TranxMgr.cpp: implementation for the CTranxMgr // // Copyright (c)1997-2001 Microsoft Corporation // ////////////////////////////////////////////////////////////////////// #include "precomp.h" #include "TranxMgr.h" #include "FilterMM.h" #include "FilterTr.h" #include "FilterTun.h" #include "PolicyMM.h" #include "PolicyQM.h" #include "AuthMM.h" /* Routine Description: Name: CTranxManager::ExecMethod Functionality: This is our C++ class implmeneting Nsp_TranxManager WMI class which can execute methods. The class is defined to support "rollback". Virtual: Yes (part of IIPSecObjectImpl) Arguments: pNamespace - our namespace. pszMethod - The name of the method. pCtx - COM interface pointer by WMI and needed for various WMI APIs pInParams - COM interface pointer to the input parameter object. pSink - COM interface pointer for notifying WMI about results. Return Value: Success: Various success codes indicating the result. Failure: Various errors may occur. We return various error code to indicate such errors. Notes: Even if errors happen amid the rolling back execution, we will continue. However, we will return the first error. */ HRESULT CTranxManager::ExecMethod ( IN IWbemServices * pNamespace, IN LPCWSTR pszMethod, IN IWbemContext * pCtx, IN IWbemClassObject * pInParams, IN IWbemObjectSink * pSink ) { if (pszMethod == NULL || *pszMethod == L'\0') { return WBEM_E_INVALID_PARAMETER; } else if (_wcsicmp(pszMethod, g_pszRollback) != 0) { // // we only support Rollback method // // // $undone:shawnwu, don't check in this code. This is to test // /* if (_wcsicmp(pszMethod, L"ParseXMLFile") == 0) { if (pInParams == NULL) { return WBEM_E_INVALID_PARAMETER; } CComVariant varInput; HRESULT hrIgnore = pInParams->Get(L"InputFile", 0, &varInput, NULL, NULL); if (SUCCEEDED(hrIgnore) && varInput.vt == VT_BSTR && varInput.bstrVal != NULL) { CComVariant varOutput; hrIgnore = pInParams->Get(L"OutputFile", 0, &varOutput, NULL, NULL); if (SUCCEEDED(hrIgnore) && varOutput.vt == VT_BSTR && varOutput.bstrVal != NULL) { CComVariant varArea; hrIgnore = pInParams->Get(L"Area", 0, &varArea, NULL, NULL); // // allow the section to be empty - meaning all areas. // if (FAILED(hrIgnore) || varArea.vt != VT_BSTR || varArea.bstrVal == NULL) { varArea.Clear(); varArea.vt = VT_BSTR; varArea.bstrVal = NULL; } // // get element info we care about // CComVariant varElement; hrIgnore = pInParams->Get(L"Element", 0, &varElement, NULL, NULL); // // allow the element to be empty - meaning every element. // if (FAILED(hrIgnore) || varElement.vt != VT_BSTR || varElement.bstrVal == NULL) { varElement.Clear(); varElement.vt = VT_BSTR; varElement.bstrVal = NULL; } CComVariant varSingleArea; hrIgnore = pInParams->Get(L"SingleArea", 0, &varSingleArea, NULL, NULL); bool bSingleArea = false; if (SUCCEEDED(hrIgnore) && varSingleArea.vt == VT_BOOL) { bSingleArea = (varSingleArea.boolVal == VARIANT_TRUE); } return ParseXMLFile(varInput.bstrVal, varOutput.bstrVal, varArea.bstrVal, varElement.bstrVal, bSingleArea); } } return WBEM_E_INVALID_METHOD_PARAMETERS; } */ return WBEM_E_NOT_SUPPORTED; } else if (pInParams == NULL) { return WBEM_E_INVALID_PARAMETER; } // // we are executing g_pszRollback ("Rollback") method // // // get the in parameters (rollback token and rollback flag) // CComVariant varToken, varClearAll; // // if no token, then we will use the GUID_NULL as the token // HRESULT hr = pInParams->Get(g_pszTokenGuid, 0, &varToken, NULL, NULL); // // We require the input parameter object to be of good type. // We won't tolerate a wrong type of data, either, even though // we can live with missing token, though. // if (FAILED(hr) || SUCCEEDED(hr) && varToken.vt != VT_BSTR) { return WBEM_E_INVALID_OBJECT; } else if (SUCCEEDED(hr) && varToken.bstrVal == NULL || *(varToken.bstrVal) == L'\0') { varToken.Clear(); varToken = pszRollbackAll; } // // we will allow the flag to be missing. // In that case, it is equivalent to false, meaning not to clear all // bool bClearAll = false; hr = pInParams->Get(g_pszClearAll, 0, &varClearAll, NULL, NULL); if (SUCCEEDED(hr) && varClearAll.vt == VT_BOOL) { bClearAll = (varClearAll.boolVal == VARIANT_TRUE); } // // will return the first error // HRESULT hrFirstError = WBEM_NO_ERROR; // // rollback MM filters first // hr = CIPSecFilter::Rollback(pNamespace, varToken.bstrVal, bClearAll); if (FAILED(hr)) { hrFirstError = hr; } // // rollback policies // hr = CIPSecPolicy::Rollback(pNamespace, varToken.bstrVal, bClearAll); if (FAILED(hr) && SUCCEEDED(hrFirstError)) { hrFirstError = hr; } // // rollback main mode authentication // hr = CAuthMM::Rollback(pNamespace, varToken.bstrVal, bClearAll); return FAILED(hrFirstError) ? hrFirstError : hr; } /* Routine Description: Name: CMMPolicy::ParseXMLFile Functionality: Testing the MSXML parser. Virtual: No. Arguments: pszInput - The input file (XML) name. pszOutput - We will write the parsing result into this output file. Return Value: Success: Various success codes indicating the result. Failure: Various errors may occur. We return various error code to indicate such errors. Notes: This is just for testing. HRESULT CTranxManager::ParseXMLFile ( IN LPCWSTR pszInput, IN LPCWSTR pszOutput, IN LPCWSTR pszArea, IN LPCWSTR pszElement, IN bool bSingleArea ) { CComPtr srpRdr; HRESULT hr = ::CoCreateInstance( CLSID_SAXXMLReader, NULL, CLSCTX_ALL, IID_ISAXXMLReader, (void **)&srpRdr); if (SUCCEEDED(hr)) { CComObject * pXMLContent; hr = CComObject::CreateInstance(&pXMLContent); if (SUCCEEDED(hr)) { CComPtr srpHandler; pXMLContent->AddRef(); if (S_OK == pXMLContent->QueryInterface(IID_ISAXContentHandler, (void**)&srpHandler)) { hr = srpRdr->putContentHandler(srpHandler); } else { hr = WBEM_E_NOT_SUPPORTED; } if (SUCCEEDED(hr)) { pXMLContent->SetOutputFile(pszOutput); pXMLContent->SetSection(pszArea, pszElement, bSingleArea); } pXMLContent->Release(); // // CXMLErrorHandler * pEH; // hr = srpRdr->putErrorHandler(pDH); // CXMLDTDHandler * pDH; // hr = srpRdr->putDTDHandler(pDH); // if (SUCCEEDED(hr)) { hr = srpRdr->parseURL(pszInput); // // we allow parseURL to fail because we may stop processing // in the middle of parsing XML. // if (FAILED(hr) && pXMLContent->ParseComplete()) { hr = WBEM_S_FALSE; } } } } return SUCCEEDED(hr) ? WBEM_NO_ERROR : hr; } */ /* //---------------------------------------------------------------------------------- // Implementation for CFileStream //---------------------------------------------------------------------------------- bool CFileStream::Open ( IN LPCWSTR pszName, IN bool bRead = true ) { this->m_bRead = bRead; long len; if (pszName == NULL) { m_hFile = GetStdHandle(STD_INPUT_HANDLE); } else { if (bRead) { m_hFile = ::CreateFile( pszName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); } else { m_hFile = ::CreateFile( pszName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); } } return (m_hFile == INVALID_HANDLE_VALUE) ? false : true; } HRESULT CFileStream::Read ( OUT void * pv, IN ULONG cb, OUT ULONG * pcbRead ) { if (!read) { return E_FAIL; } DWORD len = 0; BOOL rc = ReadFile( m_hFile, // handle of file to read pv, // address of buffer that receives data cb, // number of bytes to read &len, // address of number of bytes read NULL // address of structure for data ); *pcbRead = len; if (*pcbRead == 0) { return S_FALSE; } return (rc) ? S_OK : E_FAIL; } HRESULT CFileStream::Write ( IN const void * pv, IN ULONG cb, OUT ULONG * pcbWritten ) { if (read) { return E_FAIL; } BOOL rc = WriteFile( m_hFile, // handle of file to write pv, // address of buffer that contains data cb, // number of bytes to write pcbWritten, // address of number of bytes written NULL // address of structure for overlapped I/O ); return (rc) ? S_OK : E_FAIL; } */