HRESULT ScaSslCertificateRead( __in LPCWSTR wzWebId, __in WCA_WRAPQUERY_HANDLE hSslCertQuery, __inout SCA_WEB_SSL_CERTIFICATE** ppswscList ) { HRESULT hr = S_OK; MSIHANDLE hRec; SCA_WEB_SSL_CERTIFICATE* pswsc = NULL; LPWSTR pwzData = NULL; WcaFetchWrappedReset(hSslCertQuery); // Get the certificate information. while (S_OK == (hr = WcaFetchWrappedRecordWhereString(hSslCertQuery, scqWeb, wzWebId, &hRec))) { hr = AddSslCertificateToList(ppswscList); ExitOnFailure(hr, "failed to add ssl certificate to list"); pswsc = *ppswscList; hr = WcaGetRecordString(hRec, scqStoreName, &pwzData); ExitOnFailure(hr, "Failed to get web ssl certificate store name."); hr = ::StringCchCopyW(pswsc->wzStoreName, countof(pswsc->wzStoreName), pwzData); ExitOnFailure(hr, "Failed to copy web ssl certificate store name."); hr = WcaGetRecordString(hRec, scqHash, &pwzData); ExitOnFailure(hr, "Failed to get hash for web ssl certificate."); hr = StrHexDecode(pwzData, pswsc->rgbSHA1Hash, countof(pswsc->rgbSHA1Hash)); ExitOnFailure2(hr, "Failed to decode certificate hash for web: %ls, data: %ls", wzWebId, pwzData); } if (E_NOMOREITEMS == hr) { hr = S_OK; } ExitOnFailure(hr, "Failed to read IIsWebSiteCertificates table."); LExit: ReleaseStr(pwzData); return hr; }
HRESULT __stdcall ScaGetUserDeferred( __in LPCWSTR wzUser, __in WCA_WRAPQUERY_HANDLE hUserQuery, __out SCA_USER* pscau ) { if (!wzUser || !pscau) { return E_INVALIDARG; } HRESULT hr = S_OK; MSIHANDLE hRec, hRecTest; LPWSTR pwzData = NULL; // clear struct and bail right away if no user key was passed to search for ::ZeroMemory(pscau, sizeof(*pscau)); if (!*wzUser) { ExitFunction1(hr = S_OK); } // Reset back to the first record WcaFetchWrappedReset(hUserQuery); hr = WcaFetchWrappedRecordWhereString(hUserQuery, vuqUser, wzUser, &hRec); if (S_OK == hr) { hr = WcaFetchWrappedRecordWhereString(hUserQuery, vuqUser, wzUser, &hRecTest); if (S_OK == hr) { AssertSz(FALSE, "Found multiple matching User rows"); } hr = WcaGetRecordString(hRec, vuqUser, &pwzData); ExitOnFailure(hr, "Failed to get User.User"); hr = ::StringCchCopyW(pscau->wzKey, countof(pscau->wzKey), pwzData); ExitOnFailure(hr, "Failed to copy key string to user object (in deferred CA)"); hr = WcaGetRecordString(hRec, vuqComponent, &pwzData); ExitOnFailure(hr, "Failed to get User.Component_"); hr = ::StringCchCopyW(pscau->wzComponent, countof(pscau->wzComponent), pwzData); ExitOnFailure(hr, "Failed to copy component string to user object (in deferred CA)"); hr = WcaGetRecordString(hRec, vuqName, &pwzData); ExitOnFailure(hr, "Failed to get User.Name"); hr = ::StringCchCopyW(pscau->wzName, countof(pscau->wzName), pwzData); ExitOnFailure(hr, "Failed to copy name string to user object (in deferred CA)"); hr = WcaGetRecordString(hRec, vuqDomain, &pwzData); ExitOnFailure(hr, "Failed to get User.Domain"); hr = ::StringCchCopyW(pscau->wzDomain, countof(pscau->wzDomain), pwzData); ExitOnFailure(hr, "Failed to copy domain string to user object (in deferred CA)"); hr = WcaGetRecordString(hRec, vuqPassword, &pwzData); ExitOnFailure(hr, "Failed to get User.Password"); hr = ::StringCchCopyW(pscau->wzPassword, countof(pscau->wzPassword), pwzData); ExitOnFailure(hr, "Failed to copy password string to user object (in deferred CA)"); } else if (E_NOMOREITEMS == hr) { WcaLog(LOGMSG_STANDARD, "Error: Cannot locate User.User='******'", wzUser); hr = E_FAIL; } else { ExitOnFailure(hr, "Error fetching single User row"); } LExit: ReleaseStr(pwzData); return hr; }
HRESULT ScaWebsRead( __in IMSAdminBase* piMetabase, __in SCA_MIMEMAP** ppsmmList, __in SCA_WEB** ppswList, __in SCA_HTTP_HEADER** ppshhList, __in SCA_WEB_ERROR** ppsweList, __in WCA_WRAPQUERY_HANDLE hUserQuery, __in WCA_WRAPQUERY_HANDLE hWebDirPropQuery, __in WCA_WRAPQUERY_HANDLE hSslCertQuery, __in WCA_WRAPQUERY_HANDLE hWebLogQuery, __in WCA_WRAPQUERY_HANDLE hWebAppQuery, __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery, __inout LPWSTR *ppwzCustomActionData ) { Assert(piMetabase && ppswList); HRESULT hr = S_OK; MSIHANDLE hRec; MSIHANDLE hRecAddresses; SCA_WEB* psw = NULL; LPWSTR pwzData = NULL; int iSiteId; DWORD dwLen = 0; WCA_WRAPQUERY_HANDLE hQueryWebSite = NULL; WCA_WRAPQUERY_HANDLE hQueryWebAddress = NULL; hr = WcaBeginUnwrapQuery(&hQueryWebSite, ppwzCustomActionData); ExitOnFailure(hr, "Failed to unwrap query for ScaWebsRead"); hr = WcaBeginUnwrapQuery(&hQueryWebAddress, ppwzCustomActionData); ExitOnFailure(hr, "Failed to unwrap query for ScaWebsRead"); if (0 == WcaGetQueryRecords(hQueryWebSite)) { WcaLog(LOGMSG_VERBOSE, "Required tables not present"); ExitFunction1(hr = S_FALSE); } // loop through all the webs while (S_OK == (hr = WcaFetchWrappedRecord(hQueryWebSite, &hRec))) { psw = NewWeb(); ExitOnNull(psw, hr, E_OUTOFMEMORY, "Failed to allocate memory for web object in memory"); // get the darwin information hr = WcaGetRecordString(hRec, wqWeb, &pwzData); ExitOnFailure(hr, "Failed to get Web"); hr = ::StringCchCopyW(psw->wzKey, countof(psw->wzKey), pwzData); ExitOnFailure(hr, "Failed to copy key string to web object"); if (*pwzData && *ppsmmList) { hr = ScaGetMimeMap(mmptWeb, pwzData, ppsmmList, &psw->psmm); ExitOnFailure(hr, "Failed to get mimemap for VirtualDir"); } // get component install state hr = WcaGetRecordString(hRec, wqComponent, &pwzData); ExitOnFailure(hr, "Failed to get Component for Web"); hr = ::StringCchCopyW(psw->wzComponent, countof(psw->wzComponent), pwzData); ExitOnFailure(hr, "Failed to copy component string to web object"); if (*(psw->wzComponent)) { psw->fHasComponent = TRUE; hr = WcaGetRecordInteger(hRec, wqInstalled, (int *)&psw->isInstalled); ExitOnFailure(hr, "Failed to get web Component's installed state"); WcaGetRecordInteger(hRec, wqAction, (int *)&psw->isAction); ExitOnFailure(hr, "Failed to get web Component's action state"); if (!WcaIsInstalling(psw->isInstalled, psw->isAction) && !WcaIsUninstalling(psw->isInstalled, psw->isAction) && !WcaIsReInstalling(psw->isInstalled, psw->isAction)) { FreeWeb(psw); psw = NULL; continue; // If we aren't acting on this component, skip it } } hr = WcaGetRecordInteger(hRec, wqId, &iSiteId); ExitOnFailure(hr, "Failed to get SiteId for Web"); // Get the web's key address. hr = WcaGetRecordString(hRec, wqAddress, &pwzData); ExitOnFailure(hr, "Failed to get Address for Web"); hr = ::StringCchCopyW(psw->swaKey.wzKey, countof(psw->swaKey.wzKey), pwzData); ExitOnFailure(hr, "Failed to copy key string to web object"); hr = WcaGetRecordString(hRec, wqIP, &pwzData); ExitOnFailure(hr, "Failed to get IP for Web"); hr = ::StringCchCopyW(psw->swaKey.wzIP, countof(psw->swaKey.wzIP), pwzData); ExitOnFailure(hr, "Failed to copy IP string to web object"); hr = WcaGetRecordString(hRec, wqPort, &pwzData); ExitOnFailure(hr, "Failed to get Web Address port"); psw->swaKey.iPort = wcstol(pwzData, NULL, 10); hr = WcaGetRecordString(hRec, wqHeader, &pwzData); ExitOnFailure(hr, "Failed to get Header for Web"); hr = ::StringCchCopyW(psw->swaKey.wzHeader, countof(psw->swaKey.wzHeader), pwzData); ExitOnFailure(hr, "Failed to copy header string to web object"); hr = WcaGetRecordInteger(hRec, wqSecure, &psw->swaKey.fSecure); ExitOnFailure(hr, "Failed to get if Web is secure"); if (S_FALSE == hr) { psw->swaKey.fSecure = FALSE; } // Get the web's description. hr = WcaGetRecordString(hRec, wqDescription, &pwzData); ExitOnFailure(hr, "Failed to get Description for Web"); hr = ::StringCchCopyW(psw->wzDescription, countof(psw->wzDescription), pwzData); ExitOnFailure(hr, "Failed to copy description string to web object"); // Try to find the web root in case it already exists. dwLen = METADATA_MAX_NAME_LEN; hr = ScaWebFindBase(piMetabase, *ppswList, psw->wzKey, iSiteId, psw->swaKey.wzIP, psw->swaKey.iPort, psw->swaKey.wzHeader, psw->swaKey.fSecure, psw->wzDescription, psw->wzWebBase, dwLen); if (S_OK == hr) { psw->fBaseExists = TRUE; } else if (S_FALSE == hr) // didn't find the web site. { psw->fBaseExists = FALSE; // If we're actually configuring the web site. if (psw->fHasComponent) { if (WcaIsInstalling(psw->isInstalled, psw->isAction)) { hr = ScaWebFindFreeBase(piMetabase, *ppswList, iSiteId, psw->wzDescription, psw->wzWebBase, countof(psw->wzWebBase)); ExitOnFailure(hr, "Failed to find free web root."); } else if (WcaIsUninstalling(psw->isInstalled, psw->isAction)) { WcaLog(LOGMSG_VERBOSE, "Web site: '%ls' was already removed, skipping.", psw->wzKey); hr = S_OK; continue; } } } ExitOnFailure(hr, "Failed to find web root"); // get any extra web addresses WcaFetchWrappedReset(hQueryWebAddress); while (S_OK == (hr = WcaFetchWrappedRecordWhereString(hQueryWebAddress, 2, psw->wzKey, &hRecAddresses))) { if (MAX_ADDRESSES_PER_WEB <= psw->cExtraAddresses) { hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); ExitOnFailure(hr, "Failure to get more extra web addresses, max exceeded."); } hr = WcaGetRecordString(hRecAddresses, waqAddress, &pwzData); ExitOnFailure(hr, "Failed to get extra web Address"); // if this isn't the key address add it if (0 != lstrcmpW(pwzData, psw->swaKey.wzKey)) { hr = ::StringCchCopyW(psw->swaExtraAddresses[psw->cExtraAddresses].wzKey, countof(psw->swaExtraAddresses[psw->cExtraAddresses].wzKey), pwzData); ExitOnFailure(hr, "Failed to copy extra addresses key string to web object"); hr = WcaGetRecordString(hRecAddresses, waqIP, &pwzData); ExitOnFailure(hr, "Failed to get extra web IP"); hr = ::StringCchCopyW(psw->swaExtraAddresses[psw->cExtraAddresses].wzIP, countof(psw->swaExtraAddresses[psw->cExtraAddresses].wzIP), pwzData); ExitOnFailure(hr, "Failed to copy extra addresses IP string to web object"); hr = WcaGetRecordString(hRecAddresses, waqPort, &pwzData); ExitOnFailure(hr, "Failed to get port for extra web IP"); psw->swaExtraAddresses[psw->cExtraAddresses].iPort= wcstol(pwzData, NULL, 10); hr = WcaGetRecordString(hRecAddresses, waqHeader, &pwzData); ExitOnFailure(hr, "Failed to get header for extra web IP"); hr = ::StringCchCopyW(psw->swaExtraAddresses[psw->cExtraAddresses].wzHeader, countof(psw->swaExtraAddresses[psw->cExtraAddresses].wzHeader), pwzData); ExitOnFailure(hr, "Failed to copy extra addresses header string to web object"); hr = WcaGetRecordInteger(hRecAddresses, waqSecure, &psw->swaExtraAddresses[psw->cExtraAddresses].fSecure); ExitOnFailure(hr, "Failed to get if secure extra web IP"); if (S_FALSE == hr) psw->swaExtraAddresses[psw->cExtraAddresses].fSecure = FALSE; ++psw->cExtraAddresses; } } if (E_NOMOREITEMS == hr) hr = S_OK; ExitOnFailure(hr, "Failure occured while getting extra web addresses"); hr = WcaGetRecordInteger(hRec, wqConnectionTimeout, &psw->iConnectionTimeout); ExitOnFailure(hr, "Failed to get connection timeout for Web"); if (psw->fHasComponent) // If we're installing it, it needs a dir { // get the web's directory if (INSTALLSTATE_SOURCE == psw->isAction) { hr = WcaGetRecordString(hRec, wqSourcePath, &pwzData); } else { hr = WcaGetRecordString(hRec, wqTargetPath, &pwzData); } ExitOnFailure(hr, "Failed to get Source/TargetPath for Directory"); // remove trailing backslashes while (lstrlenW(pwzData) > 0 && pwzData[lstrlenW(pwzData)-1] == L'\\') { pwzData[lstrlenW(pwzData)-1] = 0; } hr = ::StringCchCopyW(psw->wzDirectory, countof(psw->wzDirectory), pwzData); ExitOnFailure(hr, "Failed to copy directory string to web object"); } hr = WcaGetRecordInteger(hRec, wqState, &psw->iState); ExitOnFailure(hr, "Failed to get state for Web"); hr = WcaGetRecordInteger(hRec, wqAttributes, &psw->iAttributes); ExitOnFailure(hr, "Failed to get attributes for Web"); // get the dir properties for this web hr = WcaGetRecordString(hRec, wqProperties, &pwzData); ExitOnFailure(hr, "Failed to get directory property record for Web"); if (*pwzData) { hr = ScaGetWebDirProperties(pwzData, hUserQuery, hWebDirPropQuery, &psw->swp); ExitOnFailure(hr, "Failed to get directory properties for Web"); psw->fHasProperties = TRUE; } // get the application information for this web hr = WcaGetRecordString(hRec, wqApplication, &pwzData); ExitOnFailure(hr, "Failed to get application identifier for Web"); if (*pwzData) { hr = ScaGetWebApplication(NULL, pwzData, hWebAppQuery, hWebAppExtQuery, &psw->swapp); ExitOnFailure(hr, "Failed to get application for Web"); psw->fHasApplication = TRUE; } // get the SSL certificates hr = ScaSslCertificateRead(psw->wzKey, hSslCertQuery, &(psw->pswscList)); ExitOnFailure(hr, "Failed to get SSL Certificates."); // get the custom headers if (*ppshhList) { hr = ScaGetHttpHeader(hhptWeb, psw->wzKey, ppshhList, &(psw->pshhList)); ExitOnFailure(hr, "Failed to get Custom HTTP Headers"); } // get the errors if (*ppsweList) { hr = ScaGetWebError(weptWeb, psw->wzKey, ppsweList, &(psw->psweList)); ExitOnFailure(hr, "Failed to get Custom Errors"); } // get the log information for this web hr = WcaGetRecordString(hRec, wqLog, &pwzData); ExitOnFailure(hr, "Failed to get log identifier for Web"); if (*pwzData) { hr = ScaGetWebLog(piMetabase, pwzData, hWebLogQuery, &psw->swl); ExitOnFailure(hr, "Failed to get Log for Web."); psw->fHasLog = TRUE; } *ppswList = AddWebToList(*ppswList, psw); psw = NULL; // set the web NULL so it doesn't accidentally get freed below } if (E_NOMOREITEMS == hr) { hr = S_OK; } LExit: // if anything was left over after an error clean it all up WcaFinishUnwrapQuery(hQueryWebSite); WcaFinishUnwrapQuery(hQueryWebAddress); if (psw) { ScaWebsFreeList(psw); } ReleaseStr(pwzData); return hr; }
{ HRESULT hr = S_OK; MSIHANDLE hRec; int iSiteId; WCHAR wzIP[MAX_PATH]; int iPort = -1; WCHAR wzHeader[MAX_PATH]; BOOL fSecure = FALSE; LPWSTR pwzData = NULL; // get the web information WcaFetchWrappedReset(hWrapQuery); hr = WcaFetchWrappedRecordWhereString(hWrapQuery, 1, wzWeb, &hRec); if (S_OK == hr) { // get the data to search for hr = WcaGetRecordInteger(hRec, wbqId, &iSiteId); ExitOnFailure(hr, "Failed to get SiteId for Web for VirtualDir"); hr = WcaGetRecordString(hRec, wbqIP, &pwzData); ExitOnFailure(hr, "Failed to get IP for Web for VirtualDir"); hr = ::StringCchCopyW(wzIP, countof(wzIP), pwzData); ExitOnFailure(hr, "Failed to copy IP for Web for VirtualDir"); hr = WcaGetRecordString(hRec, wbqPort, &pwzData); ExitOnFailure(hr, "Failed to get port for extra web IP"); iPort = wcstol(pwzData, NULL, 10);
HRESULT ScaGetWebDirProperties( __in LPCWSTR wzProperties, __in WCA_WRAPQUERY_HANDLE hUserQuery, __in WCA_WRAPQUERY_HANDLE hWebDirPropQuery, __inout SCA_WEB_PROPERTIES* pswp ) { Assert(*wzProperties && pswp); HRESULT hr = S_OK; MSIHANDLE hRec; LPWSTR pwzData = NULL; ExitOnNull(wzProperties, hr, E_INVALIDARG, "Failed to get web directory properties because no properties were provided to get"); WcaFetchWrappedReset(hWebDirPropQuery); hr = WcaFetchWrappedRecordWhereString(hWebDirPropQuery, 1, wzProperties, &hRec); if (S_OK == hr) { hr = WcaGetRecordString(hRec, wpqProperties, &pwzData); ExitOnFailure(hr, "Failed to get IIsWebDirProperties.DirProperties"); hr = ::StringCchCopyW(pswp->wzKey, countof(pswp->wzKey), pwzData); ExitOnFailure(hr, "Failed to copy key string to webdirproperties object"); Assert(0 == lstrcmpW(pswp->wzKey, wzProperties)); hr = WcaGetRecordInteger(hRec, wpqAccess, &pswp->iAccess); ExitOnFailure(hr, "Failed to get access value"); hr = WcaGetRecordInteger(hRec, wpqAuthorization, &pswp->iAuthorization); ExitOnFailure(hr, "Failed to get authorization value"); // if allow anonymous users if (S_OK == hr && pswp->iAuthorization & 1) { // if there is an anonymous user specified hr = WcaGetRecordString(hRec, wpqUser, &pwzData); ExitOnFailure(hr, "Failed to get AnonymousUser_"); if (pwzData && *pwzData) { hr = WcaGetRecordInteger(hRec, wpqControlledPassword, &pswp->fIIsControlledPassword); ExitOnFailure(hr, "Failed to get IIsControlledPassword"); if (S_FALSE == hr) { pswp->fIIsControlledPassword = FALSE; hr = S_OK; } hr = ScaGetUserDeferred(pwzData, hUserQuery, &pswp->scau); ExitOnFailure(hr, "Failed to get User information for Web"); pswp->fHasUser = TRUE; } else pswp->fHasUser = FALSE; } hr = WcaGetRecordInteger(hRec, wpqLogVisits, &pswp->fLogVisits); ExitOnFailure(hr, "Failed to get IIsWebDirProperties.LogVisits"); hr = WcaGetRecordInteger(hRec, wpqIndex, &pswp->fIndex); ExitOnFailure(hr, "Failed to get IIsWebDirProperties.Index"); hr = WcaGetRecordString(hRec, wpqDefaultDoc, &pwzData); ExitOnFailure(hr, "Failed to get IIsWebDirProperties.DefaultDoc"); if (pwzData && *pwzData) { pswp->fHasDefaultDoc = TRUE; if (0 == lstrcmpW(L"-", pwzData)) // remove any existing default documents by setting them blank { pswp->wzDefaultDoc[0] = L'\0'; } else // set the default documents { hr = ::StringCchCopyW(pswp->wzDefaultDoc, countof(pswp->wzDefaultDoc), pwzData); ExitOnFailure(hr, "Failed to copy default document string to webdirproperties object"); } } else { pswp->fHasDefaultDoc = FALSE; } hr = WcaGetRecordInteger(hRec, wpqAspDetailedError, &pswp->fAspDetailedError); ExitOnFailure(hr, "Failed to get IIsWebDirProperties.AspDetailedError"); hr = WcaGetRecordString(hRec, wpqHttpExp, &pwzData); ExitOnFailure(hr, "Failed to get IIsWebDirProperties.HttpExp"); if (pwzData && *pwzData) { pswp->fHasHttpExp = TRUE; if (0 == lstrcmpW(L"-", pwzData)) // remove any existing default expiration settings by setting them blank { pswp->wzHttpExp[0] = L'\0'; } else // set the expiration setting { hr = ::StringCchCopyW(pswp->wzHttpExp, countof(pswp->wzHttpExp), pwzData); ExitOnFailure(hr, "Failed to copy http expiration string to webdirproperties object"); } } else { pswp->fHasHttpExp = FALSE; } hr = WcaGetRecordInteger(hRec, wpqCCMaxAge, &pswp->iCacheControlMaxAge); ExitOnFailure(hr, "failed to get IIsWebDirProperties.CacheControlMaxAge"); hr = WcaGetRecordString(hRec, wpqCCCustom, &pwzData); ExitOnFailure(hr, "Failed to get IIsWebDirProperties.CacheControlCustom"); if (pwzData && *pwzData) { pswp->fHasCacheControlCustom = TRUE; if (0 == lstrcmpW(L"-", pwzData)) // remove any existing default cache control custom settings by setting them blank { pswp->wzCacheControlCustom[0] = L'\0'; } else // set the custom cache control setting { hr = ::StringCchCopyW(pswp->wzCacheControlCustom, countof(pswp->wzCacheControlCustom), pwzData); ExitOnFailure(hr, "Failed to copy cache control custom settings to webdirproperites object"); } } else { pswp->fHasCacheControlCustom = FALSE; } hr = WcaGetRecordInteger(hRec, wpqNoCustomError, &pswp->fNoCustomError); ExitOnFailure(hr, "failed to get IIsWebDirProperties.NoCustomError"); if (MSI_NULL_INTEGER == pswp->fNoCustomError) pswp->fNoCustomError = FALSE; hr = WcaGetRecordInteger(hRec, wpqAccessSSLFlags, &pswp->iAccessSSLFlags); ExitOnFailure(hr, "failed to get IIsWebDirProperties.AccessSSLFlags"); hr = WcaGetRecordString(hRec, wpqAuthenticationProviders, &pwzData); ExitOnFailure(hr, "Failed to get IIsWebDirProperties.AuthenticationProviders"); if (pwzData && *pwzData) { hr = ::StringCchCopyW(pswp->wzAuthenticationProviders, countof(pswp->wzAuthenticationProviders), pwzData); ExitOnFailure(hr, "Failed to copy authentication providers string to webdirproperties object"); } else { pswp->wzAuthenticationProviders[0] = L'\0'; } } else if (E_NOMOREITEMS == hr) { WcaLog(LOGMSG_STANDARD, "Error: Cannot locate IIsWebDirProperties.DirProperties='%ls'", wzProperties); hr = E_FAIL; } else { ExitOnFailure(hr, "Error getting appropriate webdirproperty"); } // Let's check that there isn't more than one record found - if there is, throw an assert like WcaFetchSingleRecord() would HRESULT hrTemp = WcaFetchWrappedRecordWhereString(hWebDirPropQuery, 1, wzProperties, &hRec); if (SUCCEEDED(hrTemp)) { AssertSz(E_NOMOREITEMS == hrTemp, "ScaGetWebDirProperties found more than one record"); } LExit: ReleaseStr(pwzData); return hr; }
HRESULT ScaWebAppExtensionsRead( __in LPCWSTR wzApplication, __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery, __inout SCA_WEB_APPLICATION_EXTENSION** ppswappextList ) { HRESULT hr = S_OK; MSIHANDLE hRec; SCA_WEB_APPLICATION_EXTENSION* pswappext = NULL; LPWSTR pwzData = NULL; // Reset back to the first record WcaFetchWrappedReset(hWebAppExtQuery); // get the application extension information while (S_OK == (hr = WcaFetchWrappedRecordWhereString(hWebAppExtQuery, wappextqApplication, wzApplication, &hRec))) { hr = NewAppExt(&pswappext); ExitOnFailure(hr, "failed to create new web app extension"); // get the extension hr = WcaGetRecordString(hRec, wappextqExtension, &pwzData); ExitOnFailure(hr, "Failed to get Web Application Extension"); hr = ::StringCchCopyW(pswappext->wzExtension, countof(pswappext->wzExtension), pwzData); ExitOnFailure(hr, "Failed to copy extension string to webappext object"); // application extension verbs hr = WcaGetRecordString(hRec, wappextqVerbs, &pwzData); ExitOnFailure1(hr, "Failed to get Verbs for Application: '%ls'", wzApplication); hr = ::StringCchCopyW(pswappext->wzVerbs, countof(pswappext->wzVerbs), pwzData); ExitOnFailure(hr, "Failed to copy verbs string to webappext object"); // extension executeable hr = WcaGetRecordString(hRec, wappextqExecutable, &pwzData); ExitOnFailure1(hr, "Failed to get Executable for Application: '%ls'", wzApplication); hr = ::StringCchCopyW(pswappext->wzExecutable, countof(pswappext->wzExecutable), pwzData); ExitOnFailure(hr, "Failed to copy executable string to webappext object"); hr = WcaGetRecordInteger(hRec, wappextqAttributes, &pswappext->iAttributes); if (S_FALSE == hr) { pswappext->iAttributes = 0; hr = S_OK; } ExitOnFailure(hr, "Failed to get App isolation"); *ppswappextList = AddAppExtToList(*ppswappextList, pswappext); pswappext = NULL; // set the appext NULL so it doesn't accidentally get freed below } if (E_NOMOREITEMS == hr) { hr = S_OK; } LExit: // if anything was left over after an error clean it all up if (pswappext) { ScaWebAppExtensionsFreeList(pswappext); } ReleaseStr(pwzData); return hr; }
/* **************************************************************** * ScaGetWebLog7 -Retrieves Log table data for the specified Log key * * ****************************************************************/ HRESULT ScaGetWebLog7( __in_z LPCWSTR wzLog, __in WCA_WRAPQUERY_HANDLE hWebLogQuery, __out SCA_WEB_LOG* pswl ) { HRESULT hr = S_OK; LPWSTR pwzData = NULL; MSIHANDLE hRec; if (0 == WcaGetQueryRecords(hWebLogQuery)) { WcaLog(LOGMSG_VERBOSE, "Skipping ScaGetWebLog() - no records to process"); ExitFunction1(hr = S_FALSE); } WcaFetchWrappedReset(hWebLogQuery); hr = WcaFetchWrappedRecordWhereString(hWebLogQuery, wlqLog, wzLog, &hRec); if (E_NOMOREITEMS == hr) { ExitOnFailure(hr, "cannot locate IIsWebLog.Log='%ls'", wzLog); } HRESULT hrTemp = WcaFetchWrappedRecordWhereString(hWebLogQuery, wlqLog, wzLog, &hRec); if (SUCCEEDED(hrTemp)) { ExitOnFailure(hr, "error - found multiple matching IIsWebLog rows"); } ::ZeroMemory(pswl, sizeof(SCA_WEB_LOG)); // check that log key matches hr = WcaGetRecordString(hRec, wlqLog, &pwzData); ExitOnFailure(hr, "failed to get IIsWebLog.Log for Log: %ls", wzLog); hr = ::StringCchCopyW(pswl->wzLog, countof(pswl->wzLog), pwzData); ExitOnFailure(hr, "failed to copy log name: %ls", pwzData); hr = WcaGetRecordString(hRec, wlqFormat, &pwzData); ExitOnFailure(hr, "failed to get IIsWebLog.Format for Log:", wzLog); //translate WIX log format name strings to IIS7 if (0 == lstrcmpW(pwzData, L"Microsoft IIS Log File Format")) { hr = ::StringCchCopyW(pswl->wzFormat, countof(pswl->wzFormat), L"IIS"); ExitOnFailure(hr, "failed to copy log format: %ls", pwzData); } else if (0 == lstrcmpW(pwzData, L"NCSA Common Log File Format")) { hr = ::StringCchCopyW(pswl->wzFormat, countof(pswl->wzFormat), L"NCSA"); ExitOnFailure(hr, "failed to copy log format: %ls", pwzData); } else if (0 == lstrcmpW(pwzData, L"none")) { hr = ::StringCchCopyW(pswl->wzFormat, countof(pswl->wzFormat), L"none"); ExitOnFailure(hr, "failed to copy log format: %ls", pwzData); } else if (0 == lstrcmpW(pwzData, L"ODBC Logging")) { hr = ::StringCchCopyW(pswl->wzFormat, countof(pswl->wzFormat), L"W3C"); ExitOnFailure(hr, "failed to copy log format: %ls", pwzData); } else if (0 == lstrcmpW(pwzData, L"W3C Extended Log File Format")) { hr = ::StringCchCopyW(pswl->wzFormat, countof(pswl->wzFormat), L"W3C"); ExitOnFailure(hr, "failed to copy log format: %ls", pwzData); } else { hr = HRESULT_FROM_WIN32(ERROR_INVALID_INDEX); ExitOnFailure(hr, "Invalid log file format: %ls", pwzData); } LExit: ReleaseStr(pwzData); return hr; }
HRESULT ScaWebsRead7( __in SCA_WEB7** ppswList, __in SCA_HTTP_HEADER** ppshhList, __in SCA_WEB_ERROR** ppsweList, __in WCA_WRAPQUERY_HANDLE hUserQuery, __in WCA_WRAPQUERY_HANDLE hWebDirPropQuery, __in WCA_WRAPQUERY_HANDLE hSslCertQuery, __in WCA_WRAPQUERY_HANDLE hWebLogQuery, __in WCA_WRAPQUERY_HANDLE hWebAppQuery, __in WCA_WRAPQUERY_HANDLE hWebAppExtQuery, __inout LPWSTR *ppwzCustomActionData ) { Assert(ppswList); WcaLog(LOGMSG_VERBOSE, "Entering ScaWebsRead7()"); HRESULT hr = S_OK; MSIHANDLE hRec; MSIHANDLE hRecAddresses; WCA_WRAPQUERY_HANDLE hQueryWebSite = NULL; WCA_WRAPQUERY_HANDLE hQueryWebAddress = NULL; SCA_WEB7* psw = NULL; LPWSTR pwzData = NULL; DWORD dwLen = 0; errno_t error = EINVAL; // check to see what tables are available hr = WcaBeginUnwrapQuery(&hQueryWebSite, ppwzCustomActionData); ExitOnFailure(hr, "Failed to unwrap query for ScaWebsRead"); hr = WcaBeginUnwrapQuery(&hQueryWebAddress, ppwzCustomActionData); ExitOnFailure(hr, "Failed to unwrap query for ScaWebsRead"); if (0 == WcaGetQueryRecords(hQueryWebSite) || 0 == WcaGetQueryRecords(hQueryWebAddress)) { WcaLog(LOGMSG_VERBOSE, "Required tables not present"); ExitFunction1(hr = S_FALSE); } // loop through all the webs while (S_OK == (hr = WcaFetchWrappedRecord(hQueryWebSite, &hRec))) { psw = NewWeb7(); if (!psw) { hr = E_OUTOFMEMORY; break; } // get the darwin information hr = WcaGetRecordString(hRec, wqWeb, &pwzData); ExitOnFailure(hr, "Failed to get Web"); hr = ::StringCchCopyW(psw->wzKey, countof(psw->wzKey), pwzData); ExitOnFailure(hr, "Failed to copy key string to web object"); // get component install state hr = WcaGetRecordString(hRec, wqComponent, &pwzData); ExitOnFailure(hr, "Failed to get Component for Web"); hr = ::StringCchCopyW(psw->wzComponent, countof(psw->wzComponent), pwzData); ExitOnFailure(hr, "Failed to copy component string to web object"); if (*(psw->wzComponent)) { psw->fHasComponent = TRUE; hr = WcaGetRecordInteger(hRec, wqInstalled, (int *)&psw->isInstalled); ExitOnFailure(hr, "Failed to get web Component's installed state"); WcaGetRecordInteger(hRec, wqAction, (int *)&psw->isAction); ExitOnFailure(hr, "Failed to get web Component's action state"); } // Get the web's description. hr = WcaGetRecordString(hRec, wqDescription, &pwzData); ExitOnFailure(hr, "Failed to get Description for Web"); hr = ::StringCchCopyW(psw->wzDescription, countof(psw->wzDescription), pwzData); ExitOnFailure(hr, "Failed to copy description string to web object"); //get web's site Id hr = WcaGetRecordInteger(hRec, wqId, &psw->iSiteId); ExitOnFailure(hr, "Failed to get SiteId for Web"); // get the web's key address (Bindings) hr = WcaGetRecordString(hRec, wqAddress, &pwzData); ExitOnFailure(hr, "Failed to get Address for Web"); hr = ::StringCchCopyW(psw->swaBinding.wzKey, countof(psw->swaBinding.wzKey), pwzData); ExitOnFailure(hr, "Failed to copy web binding key"); hr = WcaGetRecordString(hRec, wqIP, &pwzData); ExitOnFailure(hr, "Failed to get IP for Web"); hr = ::StringCchCopyW(psw->swaBinding.wzIP, countof(psw->swaBinding.wzIP), pwzData); ExitOnFailure(hr, "Failed to copy web IP"); hr = WcaGetRecordString(hRec, wqPort, &pwzData); ExitOnFailure(hr, "Failed to get Web Address port"); psw->swaBinding.iPort = wcstol(pwzData, NULL, 10); hr = WcaGetRecordString(hRec, wqHeader, &pwzData); ExitOnFailure(hr, "Failed to get Header for Web"); hr = ::StringCchCopyW(psw->swaBinding.wzHeader, countof(psw->swaBinding.wzHeader), pwzData); ExitOnFailure(hr, "Failed to copy web header"); hr = WcaGetRecordInteger(hRec, wqSecure, &psw->swaBinding.fSecure); ExitOnFailure(hr, "Failed to get if Web is secure"); if (S_FALSE == hr) { psw->swaBinding.fSecure = FALSE; } // look to see if site exists dwLen = METADATA_MAX_NAME_LEN; hr = ScaWebFindBase7(*ppswList, psw->wzDescription); // If we didn't find a web in memory, ignore it - during execute CA // if the site truly does not exist then there will be an error. if (S_OK == hr) { // site exists in config psw->fBaseExists = TRUE; } else if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr) { hr = S_OK; // site does not exists in config psw->fBaseExists = FALSE; } ExitOnFailure(hr, "Failed to find web site"); // get any extra web addresses WcaFetchWrappedReset(hQueryWebAddress); while (S_OK == (hr = WcaFetchWrappedRecordWhereString(hQueryWebAddress, 2, psw->wzKey, &hRecAddresses))) { if (MAX_ADDRESSES_PER_WEB <= psw->cExtraAddresses) { hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); ExitOnFailure(hr, "Failure to get more extra web addresses, max exceeded."); } hr = WcaGetRecordString(hRecAddresses, waqAddress, &pwzData); ExitOnFailure(hr, "Failed to get extra web Address"); // if this isn't the key address add it if (0 != lstrcmpW(pwzData, psw->swaBinding.wzKey)) { hr = ::StringCchCopyW(psw->swaExtraAddresses[psw->cExtraAddresses].wzKey, countof(psw->swaExtraAddresses[psw->cExtraAddresses].wzKey), pwzData); ExitOnFailure(hr, "Failed to copy web binding key"); hr = WcaGetRecordString(hRecAddresses, waqIP, &pwzData); ExitOnFailure(hr, "Failed to get extra web IP"); hr = ::StringCchCopyW(psw->swaExtraAddresses[psw->cExtraAddresses].wzIP, countof(psw->swaExtraAddresses[psw->cExtraAddresses].wzIP), pwzData); ExitOnFailure(hr, "Failed to copy web binding IP"); hr = WcaGetRecordString(hRecAddresses, waqPort, &pwzData); ExitOnFailure(hr, "Failed to get port for extra web IP"); psw->swaExtraAddresses[psw->cExtraAddresses].iPort= wcstol(pwzData, NULL, 10); // errno is set to ERANGE if overflow or underflow occurs _get_errno(&error); if (ERANGE == error) { hr = E_INVALIDARG; ExitOnFailure(hr, "Failed to convert web Port address"); } hr = WcaGetRecordString(hRecAddresses, waqHeader, &pwzData); ExitOnFailure(hr, "Failed to get header for extra web IP"); hr = ::StringCchCopyW(psw->swaExtraAddresses[psw->cExtraAddresses].wzHeader, countof(psw->swaExtraAddresses[psw->cExtraAddresses].wzHeader), pwzData); ExitOnFailure(hr, "Failed to copy web binding header"); hr = WcaGetRecordInteger(hRecAddresses, waqSecure, &psw->swaExtraAddresses[psw->cExtraAddresses].fSecure); ExitOnFailure(hr, "Failed to get if secure extra web IP"); if (S_FALSE == hr) { psw->swaExtraAddresses[psw->cExtraAddresses].fSecure = FALSE; } ++psw->cExtraAddresses; } } if (E_NOMOREITEMS == hr) { hr = S_OK; } ExitOnFailure(hr, "Failure occured while getting extra web addresses"); // // Connection time out // hr = WcaGetRecordInteger(hRec, wqConnectionTimeout, &psw->iConnectionTimeout); ExitOnFailure(hr, "Failed to get connection timeout for Web"); if (psw->fHasComponent) // If we're installing it, it needs a dir { // get the web's directory if (INSTALLSTATE_SOURCE == psw->isAction) { hr = WcaGetRecordString(hRec, wqSourcePath, &pwzData); } else { hr = WcaGetRecordString(hRec, wqTargetPath, &pwzData); } ExitOnFailure(hr, "Failed to get Source/TargetPath for Directory"); dwLen = lstrlenW(pwzData); // remove trailing backslash if (dwLen > 0 && pwzData[dwLen-1] == L'\\') { pwzData[dwLen-1] = 0; } hr = ::StringCchCopyW(psw->wzDirectory, countof(psw->wzDirectory), pwzData); ExitOnFailure1(hr, "Failed to copy web dir: '%ls'", pwzData); } hr = WcaGetRecordInteger(hRec, wqState, &psw->iState); ExitOnFailure(hr, "Failed to get state for Web"); hr = WcaGetRecordInteger(hRec, wqAttributes, &psw->iAttributes); ExitOnFailure(hr, "Failed to get attributes for Web"); // get the dir properties for this web hr = WcaGetRecordString(hRec, wqProperties, &pwzData); ExitOnFailure(hr, "Failed to get directory properties for Web"); if (*pwzData) { hr = ScaGetWebDirProperties(pwzData, hUserQuery, hWebDirPropQuery, &psw->swp); ExitOnFailure(hr, "Failed to get directory properties for Web"); psw->fHasProperties = TRUE; } // get the application information for this web hr = WcaGetRecordString(hRec, wqApplication, &pwzData); ExitOnFailure(hr, "Failed to get application identifier for Web"); if (*pwzData) { hr = ScaGetWebApplication(NULL, pwzData, hWebAppQuery, hWebAppExtQuery, &psw->swapp); ExitOnFailure(hr, "Failed to get application for Web"); psw->fHasApplication = TRUE; } // get the SSL certificates hr = ScaSslCertificateRead(psw->wzKey, hSslCertQuery, &(psw->pswscList)); ExitOnFailure(hr, "Failed to get SSL Certificates."); // get the custom headers if (*ppshhList) { hr = ScaGetHttpHeader(hhptWeb, psw->wzKey, ppshhList, &(psw->pshhList)); ExitOnFailure(hr, "Failed to get Custom HTTP Headers"); } // get the errors if (*ppsweList) { hr = ScaGetWebError(weptWeb, psw->wzKey, ppsweList, &(psw->psweList)); ExitOnFailure(hr, "Failed to get Custom Errors"); } // get the log information for this web hr = WcaGetRecordString(hRec, wqLog, &pwzData); ExitOnFailure(hr, "Failed to get log identifier for Web"); if (*pwzData) { hr = ScaGetWebLog7(pwzData, hWebLogQuery, &psw->swl); ExitOnFailure(hr, "Failed to get Log for Web."); psw->fHasLog = TRUE; } *ppswList = AddWebToList7(*ppswList, psw); psw = NULL; // set the web NULL so it doesn't accidentally get freed below } if (E_NOMOREITEMS == hr) { hr = S_OK; } LExit: // if anything was left over after an error clean it all up WcaFinishUnwrapQuery(hQueryWebSite); WcaFinishUnwrapQuery(hQueryWebAddress); ScaWebsFreeList7(psw); ReleaseStr(pwzData); WcaLog(LOGMSG_VERBOSE, "Exiting ScaWebsRead7()"); return hr; }