aboutsummaryrefslogtreecommitdiff
path: root/src/ext/Iis/ca/scauser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ext/Iis/ca/scauser.cpp')
-rw-r--r--src/ext/Iis/ca/scauser.cpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/ext/Iis/ca/scauser.cpp b/src/ext/Iis/ca/scauser.cpp
new file mode 100644
index 00000000..0b99edff
--- /dev/null
+++ b/src/ext/Iis/ca/scauser.cpp
@@ -0,0 +1,91 @@
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
5LPCWSTR vcsUserQuery = L"SELECT `User`, `Component_`, `Name`, `Domain`, `Password` FROM `User` WHERE `User`=?";
6enum eUserQuery { vuqUser = 1, vuqComponent, vuqName, vuqDomain, vuqPassword };
7
8LPCWSTR vcsGroupQuery = L"SELECT `Group`, `Component_`, `Name`, `Domain` FROM `Group` WHERE `Group`=?";
9enum eGroupQuery { vgqGroup = 1, vgqComponent, vgqName, vgqDomain };
10
11LPCWSTR vcsUserGroupQuery = L"SELECT `User_`, `Group_` FROM `UserGroup` WHERE `User_`=?";
12enum eUserGroupQuery { vugqUser = 1, vugqGroup };
13
14LPCWSTR vActionableQuery = L"SELECT `User`,`Component_`,`Name`,`Domain`,`Password`,`Attributes` FROM `User` WHERE `Component_` IS NOT NULL";
15enum eActionableQuery { vaqUser = 1, vaqComponent, vaqName, vaqDomain, vaqPassword, vaqAttributes };
16
17HRESULT __stdcall ScaGetUserDeferred(
18 __in LPCWSTR wzUser,
19 __in WCA_WRAPQUERY_HANDLE hUserQuery,
20 __out SCA_USER* pscau
21 )
22{
23 if (!wzUser || !pscau)
24 {
25 return E_INVALIDARG;
26 }
27
28 HRESULT hr = S_OK;
29 MSIHANDLE hRec, hRecTest;
30
31 LPWSTR pwzData = NULL;
32
33 // clear struct and bail right away if no user key was passed to search for
34 ::ZeroMemory(pscau, sizeof(*pscau));
35 if (!*wzUser)
36 {
37 ExitFunction1(hr = S_OK);
38 }
39
40 // Reset back to the first record
41 WcaFetchWrappedReset(hUserQuery);
42
43 hr = WcaFetchWrappedRecordWhereString(hUserQuery, vuqUser, wzUser, &hRec);
44 if (S_OK == hr)
45 {
46 hr = WcaFetchWrappedRecordWhereString(hUserQuery, vuqUser, wzUser, &hRecTest);
47 if (S_OK == hr)
48 {
49 AssertSz(FALSE, "Found multiple matching User rows");
50 }
51
52 hr = WcaGetRecordString(hRec, vuqUser, &pwzData);
53 ExitOnFailure(hr, "Failed to get User.User");
54 hr = ::StringCchCopyW(pscau->wzKey, countof(pscau->wzKey), pwzData);
55 ExitOnFailure(hr, "Failed to copy key string to user object (in deferred CA)");
56
57 hr = WcaGetRecordString(hRec, vuqComponent, &pwzData);
58 ExitOnFailure(hr, "Failed to get User.Component_");
59 hr = ::StringCchCopyW(pscau->wzComponent, countof(pscau->wzComponent), pwzData);
60 ExitOnFailure(hr, "Failed to copy component string to user object (in deferred CA)");
61
62 hr = WcaGetRecordString(hRec, vuqName, &pwzData);
63 ExitOnFailure(hr, "Failed to get User.Name");
64 hr = ::StringCchCopyW(pscau->wzName, countof(pscau->wzName), pwzData);
65 ExitOnFailure(hr, "Failed to copy name string to user object (in deferred CA)");
66
67 hr = WcaGetRecordString(hRec, vuqDomain, &pwzData);
68 ExitOnFailure(hr, "Failed to get User.Domain");
69 hr = ::StringCchCopyW(pscau->wzDomain, countof(pscau->wzDomain), pwzData);
70 ExitOnFailure(hr, "Failed to copy domain string to user object (in deferred CA)");
71
72 hr = WcaGetRecordString(hRec, vuqPassword, &pwzData);
73 ExitOnFailure(hr, "Failed to get User.Password");
74 hr = ::StringCchCopyW(pscau->wzPassword, countof(pscau->wzPassword), pwzData);
75 ExitOnFailure(hr, "Failed to copy password string to user object (in deferred CA)");
76 }
77 else if (E_NOMOREITEMS == hr)
78 {
79 WcaLog(LOGMSG_STANDARD, "Error: Cannot locate User.User='%ls'", wzUser);
80 hr = E_FAIL;
81 }
82 else
83 {
84 ExitOnFailure(hr, "Error fetching single User row");
85 }
86
87LExit:
88 ReleaseStr(pwzData);
89
90 return hr;
91}