diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2018-12-16 21:19:24 -0600 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2018-12-16 21:20:40 -0600 |
| commit | 95a5a8f9efef02ddcec5b3f69be99a00d71a802a (patch) | |
| tree | f0a92b8e8e37e17af6053db11f1b8a7a532cd12c /src/ca/scassl.cpp | |
| parent | aec6e9a4b21accd2e8aeb2cb36ad1cdc8f308f79 (diff) | |
| download | wix-95a5a8f9efef02ddcec5b3f69be99a00d71a802a.tar.gz wix-95a5a8f9efef02ddcec5b3f69be99a00d71a802a.tar.bz2 wix-95a5a8f9efef02ddcec5b3f69be99a00d71a802a.zip | |
Import implementation of IisCA from old repo's scasched/scaexec.
Diffstat (limited to 'src/ca/scassl.cpp')
| -rw-r--r-- | src/ca/scassl.cpp | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/ca/scassl.cpp b/src/ca/scassl.cpp new file mode 100644 index 00000000..4a06b77e --- /dev/null +++ b/src/ca/scassl.cpp | |||
| @@ -0,0 +1,115 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | #include "precomp.h" | ||
| 4 | |||
| 5 | enum eSslCertificateQuery { scqStoreName = 1, scqHash, scqWeb }; | ||
| 6 | |||
| 7 | static HRESULT AddSslCertificateToList( | ||
| 8 | __in SCA_WEB_SSL_CERTIFICATE** ppswscList | ||
| 9 | ); | ||
| 10 | |||
| 11 | |||
| 12 | HRESULT ScaSslCertificateRead( | ||
| 13 | __in LPCWSTR wzWebId, | ||
| 14 | __in WCA_WRAPQUERY_HANDLE hSslCertQuery, | ||
| 15 | __inout SCA_WEB_SSL_CERTIFICATE** ppswscList | ||
| 16 | ) | ||
| 17 | { | ||
| 18 | HRESULT hr = S_OK; | ||
| 19 | |||
| 20 | MSIHANDLE hRec; | ||
| 21 | SCA_WEB_SSL_CERTIFICATE* pswsc = NULL; | ||
| 22 | LPWSTR pwzData = NULL; | ||
| 23 | |||
| 24 | WcaFetchWrappedReset(hSslCertQuery); | ||
| 25 | |||
| 26 | // Get the certificate information. | ||
| 27 | while (S_OK == (hr = WcaFetchWrappedRecordWhereString(hSslCertQuery, scqWeb, wzWebId, &hRec))) | ||
| 28 | { | ||
| 29 | hr = AddSslCertificateToList(ppswscList); | ||
| 30 | ExitOnFailure(hr, "failed to add ssl certificate to list"); | ||
| 31 | |||
| 32 | pswsc = *ppswscList; | ||
| 33 | |||
| 34 | hr = WcaGetRecordString(hRec, scqStoreName, &pwzData); | ||
| 35 | ExitOnFailure(hr, "Failed to get web ssl certificate store name."); | ||
| 36 | |||
| 37 | hr = ::StringCchCopyW(pswsc->wzStoreName, countof(pswsc->wzStoreName), pwzData); | ||
| 38 | ExitOnFailure(hr, "Failed to copy web ssl certificate store name."); | ||
| 39 | |||
| 40 | hr = WcaGetRecordString(hRec, scqHash, &pwzData); | ||
| 41 | ExitOnFailure(hr, "Failed to get hash for web ssl certificate."); | ||
| 42 | |||
| 43 | hr = StrHexDecode(pwzData, pswsc->rgbSHA1Hash, countof(pswsc->rgbSHA1Hash)); | ||
| 44 | ExitOnFailure(hr, "Failed to decode certificate hash for web: %ls, data: %ls", wzWebId, pwzData); | ||
| 45 | } | ||
| 46 | |||
| 47 | if (E_NOMOREITEMS == hr) | ||
| 48 | { | ||
| 49 | hr = S_OK; | ||
| 50 | } | ||
| 51 | ExitOnFailure(hr, "Failed to read IIsWebSiteCertificates table."); | ||
| 52 | |||
| 53 | LExit: | ||
| 54 | ReleaseStr(pwzData); | ||
| 55 | return hr; | ||
| 56 | } | ||
| 57 | |||
| 58 | |||
| 59 | HRESULT ScaSslCertificateWriteMetabase( | ||
| 60 | __in IMSAdminBase* piMetabase, | ||
| 61 | __in LPCWSTR wzWebBase, | ||
| 62 | __in SCA_WEB_SSL_CERTIFICATE* pswscList | ||
| 63 | ) | ||
| 64 | { | ||
| 65 | HRESULT hr = S_OK; | ||
| 66 | BLOB blob; | ||
| 67 | |||
| 68 | for (SCA_WEB_SSL_CERTIFICATE* pswsc = pswscList; pswsc; pswsc = pswsc->pNext) | ||
| 69 | { | ||
| 70 | // Write: /W3SVC/1:SslCertStoreName = "MY", "CA", "Root", etc. | ||
| 71 | hr = ScaWriteMetabaseValue(piMetabase, wzWebBase, L"", MD_SSL_CERT_STORE_NAME, METADATA_INHERIT, IIS_MD_UT_SERVER, STRING_METADATA, static_cast<LPVOID>(pswsc->wzStoreName)); | ||
| 72 | ExitOnFailure(hr, "Failed to write SslCertStoreName"); | ||
| 73 | |||
| 74 | // Write: /W3SVC/1:SslCertHash = <blob> | ||
| 75 | blob.pBlobData = pswsc->rgbSHA1Hash; | ||
| 76 | blob.cbSize = countof(pswsc->rgbSHA1Hash); | ||
| 77 | hr = ScaWriteMetabaseValue(piMetabase, wzWebBase, L"", MD_SSL_CERT_HASH, METADATA_INHERIT, IIS_MD_UT_SERVER, BINARY_METADATA, static_cast<LPVOID>(&blob)); | ||
| 78 | ExitOnFailure(hr, "Failed to write SslCertHash"); | ||
| 79 | } | ||
| 80 | |||
| 81 | LExit: | ||
| 82 | return hr; | ||
| 83 | } | ||
| 84 | |||
| 85 | |||
| 86 | void ScaSslCertificateFreeList( | ||
| 87 | __in SCA_WEB_SSL_CERTIFICATE* pswscList | ||
| 88 | ) | ||
| 89 | { | ||
| 90 | SCA_WEB_SSL_CERTIFICATE* pswscDelete = pswscList; | ||
| 91 | while (pswscList) | ||
| 92 | { | ||
| 93 | pswscDelete = pswscList; | ||
| 94 | pswscList = pswscList->pNext; | ||
| 95 | |||
| 96 | MemFree(pswscDelete); | ||
| 97 | } | ||
| 98 | } | ||
| 99 | |||
| 100 | |||
| 101 | static HRESULT AddSslCertificateToList( | ||
| 102 | __in SCA_WEB_SSL_CERTIFICATE** ppswscList | ||
| 103 | ) | ||
| 104 | { | ||
| 105 | HRESULT hr = S_OK; | ||
| 106 | |||
| 107 | SCA_WEB_SSL_CERTIFICATE* pswsc = static_cast<SCA_WEB_SSL_CERTIFICATE*>(MemAlloc(sizeof(SCA_WEB_SSL_CERTIFICATE), TRUE)); | ||
| 108 | ExitOnNull(pswsc, hr, E_OUTOFMEMORY, "failed to allocate memory for new SSL certificate list element"); | ||
| 109 | |||
| 110 | pswsc->pNext = *ppswscList; | ||
| 111 | *ppswscList = pswsc; | ||
| 112 | |||
| 113 | LExit: | ||
| 114 | return hr; | ||
| 115 | } | ||
