Changeset 95890 in vbox
- Timestamp:
- Jul 28, 2022 1:49:20 AM (3 years ago)
- svn:sync-xref-src-repo-rev:
- 152621
- Location:
- trunk/src/VBox/Additions/WINNT/VBoxCredProv
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvCredential.cpp
r93115 r95890 547 547 */ 548 548 PWSTR pwszExtractedDomain = NULL; 549 if (ExtractAccou tData(pwszUser, &pwszExtractedName, &pwszExtractedDomain))549 if (ExtractAccountData(pwszUser, &pwszExtractedName, &pwszExtractedDomain)) 550 550 { 551 551 /* Update user name. */ … … 842 842 * This might be a principal or FQDN string. 843 843 * 844 * @return TRUE if extraction of the account name was successful, FALSE if not.845 * @param pwszAccountData (Raw)account data string to extract data from.846 * @param ppwszAccou tName Where to store the extracted account name on success.847 * Needs to be free'd with CoTaskMemFree().848 * @param ppwszDomain Where to store the extracted domain name on success.849 * Needs to be free'd with CoTaskMemFree().850 */ 851 BOOL VBoxCredProvCredential::ExtractAccoutData(PWSTR pwszAccountData, PWSTR *ppwszAccoutName, PWSTR *ppwszDomain)844 * @return success indicator. Will fail if input not in a user@domain format. 845 * @param pwszAccountData Raw account data string to extract data from. 846 * @param ppwszAccountName Where to store the extracted account name on 847 * success. Needs to be freed with CoTaskMemFree(). 848 * @param ppwszDomain Where to store the extracted domain name on 849 * success. Needs to be freed with CoTaskMemFree(). 850 */ 851 /*static*/ bool VBoxCredProvCredential::ExtractAccountData(PWSTR pwszAccountData, PWSTR *ppwszAccountName, PWSTR *ppwszDomain) 852 852 { 853 853 AssertPtrReturn(pwszAccountData, FALSE); 854 854 VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccoutData: Getting account name for \"%ls\" ...\n", 855 855 pwszAccountData); 856 HRESULT hr = E_FAIL; 856 857 /** @todo r=bird: The original code seemed a little confused about whether 858 * the domain stuff was optional or not, as it declared pwszDomain 859 * very early and freed it in the error path. Not entirely sure what 860 * to make of that... */ 857 861 858 862 /* Try to figure out whether this is a principal name (user@domain). */ 859 LPWSTR pPos = NULL; 860 if ( (pPos = StrChrW(pwszAccountData, L'@')) != NULL 861 && pPos != pwszAccountData) 862 { 863 size_t cbSize = (pPos - pwszAccountData) * sizeof(WCHAR); 864 LPWSTR pwszName = (LPWSTR)CoTaskMemAlloc(cbSize + sizeof(WCHAR)); /* Space for terminating zero. */ 865 LPWSTR pwszDomain = NULL; 866 AssertPtr(pwszName); 867 hr = StringCbCopyN(pwszName, cbSize + sizeof(WCHAR), pwszAccountData, cbSize); 868 if (SUCCEEDED(hr)) 869 { 870 *ppwszAccoutName = pwszName; 871 pPos++; /* Skip @, point to domain name (if any). */ 872 if ( pPos != NULL 873 && *pPos != L'\0') 863 LPWSTR const pwszAt = StrChrW(pwszAccountData, L'@'); 864 if (pwszAt && pwszAt != pwszAccountData) 865 { 866 if (pwszAt[1]) 867 { 868 size_t cwcUser = (size_t)(pwszAt - pwszAccountData) + 1; 869 LPWSTR pwszName = (LPWSTR)CoTaskMemAlloc(cwcUser * sizeof(WCHAR)); 870 if (pwszName) 874 871 { 875 hr = SHStrDupW(pPos, &pwszDomain);876 if ( SUCCEEDED(hr))872 int rc = RTUtf16CopyEx(pwszName, cwcUser, pwszAccountData, cwcUser - 1); 873 if (RT_SUCCESS(rc)) 877 874 { 878 *ppwszDomain = pwszDomain; 875 LPWSTR pwszDomain = NULL; 876 HRESULT hr = SHStrDupW(&pwszAt[1], &pwszDomain); 877 if (SUCCEEDED(hr)) 878 { 879 *ppwszAccountName = pwszName; 880 *ppwszDomain = pwszDomain; 881 return true; 882 } 883 884 VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccountData: Error copying domain data, hr=%08x\n", hr); 879 885 } 880 886 else 881 VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccoutData: Error copying domain data, hr=%08x\n", hr); 887 VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccountData: Error copying account data, rc=%Rrc\n", rc); 888 CoTaskMemFree(pwszName); 882 889 } 883 890 else 884 { 885 hr = E_FAIL; 886 VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccoutData: No domain name found!\n"); 887 } 891 VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccountData: allocation failure.\n"); 888 892 } 889 893 else 890 VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccoutData: Error copying account data, hr=%08x\n", hr); 891 892 if (hr != S_OK) 893 { 894 CoTaskMemFree(pwszName); 895 if (pwszDomain) 896 CoTaskMemFree(pwszDomain); 897 } 894 VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccountData: No domain name found!\n"); 898 895 } 899 896 else 900 VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccou tData: No valid principal account name found!\n");901 902 return (hr == S_OK);897 VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccountData: No valid principal account name found!\n"); 898 899 return false; 903 900 } 904 901 … … 931 928 { 932 929 if ( m_apwszFields[dwFieldID] 933 && RTUtf16Len(m_apwszFields[dwFieldID])) 934 { 930 && m_apwszFields[dwFieldID][0]) 935 931 hr = SHStrDupW(m_apwszFields[dwFieldID], &pwszString); 936 }937 932 else /* Fill in an empty value. */ 938 933 hr = SHStrDupW(L"", &pwszString); … … 955 950 956 951 if (ppwszString) 957 {958 952 *ppwszString = pwszString; 959 }960 953 else if (pwszString) 961 954 CoTaskMemFree(pwszString); … … 1133 1126 if (SUCCEEDED(hr)) 1134 1127 { 1135 LSA_STRING lsaszKerberosName; 1128 #if 0 /* eeek. leaving this as an example of how not to handle a string constant. */ 1136 1129 size_t cchKerberosName; 1137 1130 hr = StringCchLengthA(NEGOSSP_NAME_A, USHORT_MAX, &cchKerberosName); … … 1141 1134 hr = SizeTToUShort(cchKerberosName, &usLength); 1142 1135 if (SUCCEEDED(hr)) 1136 #endif 1143 1137 { 1138 LSA_STRING lsaszKerberosName; 1144 1139 lsaszKerberosName.Buffer = (PCHAR)NEGOSSP_NAME_A; 1145 lsaszKerberosName.Length = usLength;1146 lsaszKerberosName.MaximumLength = lsaszKerberosName.Length + 1;1140 lsaszKerberosName.Length = sizeof(NEGOSSP_NAME_A) - 1; 1141 lsaszKerberosName.MaximumLength = sizeof(NEGOSSP_NAME_A); 1147 1142 1148 1143 ULONG ulAuthPackage = 0; … … 1166 1161 VBoxCredProvVerbose(1, "VBoxCredProvCredential::GetSerialization: LsaLookupAuthenticationPackage failed with ntStatus=%ld\n", s); 1167 1162 } 1163 #if 0 1168 1164 } 1169 1165 #endif 1170 1166 LsaDeregisterLogonProcess(hLSA); 1171 1167 } -
trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvCredential.h
r93115 r95890 23 23 24 24 25 /*******************************************************************************26 * Header Files *27 *******************************************************************************/28 25 #include <iprt/win/windows.h> 29 26 #include <NTSecAPI.h> … … 31 28 #include <Security.h> 32 29 #include <ShlGuid.h> 33 #include <strsafe.h>34 30 35 31 #include <iprt/win/shlwapi.h> … … 96 92 int RetrieveCredentials(void); 97 93 BOOL TranslateAccountName(PWSTR pwszDisplayName, PWSTR *ppwszAccoutName); 98 BOOL ExtractAccoutData(PWSTR pwszAccountData, PWSTR *ppwszAccoutName, PWSTR *ppwszDomain);94 static bool ExtractAccountData(PWSTR pwszAccountData, PWSTR *ppwszAccountName, PWSTR *ppwszDomain); 99 95 100 96 protected: -
trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvProvider.cpp
r93115 r95890 213 213 { 214 214 HRESULT hr = S_OK; 215 DWORD dwErr;216 215 217 216 VBoxCredProvVerbose(0, "VBoxCredProv::SetUsageScenario: enmUsageScenario=%d, dwFlags=%ld\n", … … 227 226 VBoxCredProvReportStatus(VBoxGuestFacilityStatus_Active); 228 227 229 dwErr = LoadConfiguration();228 DWORD dwErr = LoadConfiguration(); 230 229 if (dwErr != ERROR_SUCCESS) 231 230 VBoxCredProvVerbose(0, "VBoxCredProv: Error while loading configuration, error=%ld\n", dwErr); … … 239 238 break; 240 239 240 hr = S_OK; 241 241 if (!m_pPoller) 242 242 { 243 try 243 #ifdef RT_EXCEPTIONS_ENABLED 244 try { m_pPoller = new VBoxCredProvPoller(); } 245 catch (std::bad_alloc &) { hr = E_OUTOFMEMORY; } 246 #else 247 m_pPoller = new VBoxCredProvPoller(); 248 AssertStmt(m_pPoller, hr = E_OUTOFMEMORY); 249 #endif 250 if (SUCCEEDED(hr)) 244 251 { 245 m_pPoller = new VBoxCredProvPoller();246 AssertPtr(m_pPoller);247 252 int rc = m_pPoller->Initialize(this); 248 253 if (RT_FAILURE(rc)) 249 254 VBoxCredProvVerbose(0, "VBoxCredProv::SetUsageScenario: Error initializing poller thread, rc=%Rrc\n", rc); 250 } 251 catch (std::bad_alloc &ex) 252 { 253 NOREF(ex); 254 hr = E_OUTOFMEMORY; 255 /** @todo r=bird: Why is the initialize failure ignored here? */ 255 256 } 256 257 } … … 259 260 && !m_pCred) 260 261 { 261 try 262 { 263 m_pCred = new VBoxCredProvCredential(); 264 AssertPtr(m_pPoller); 262 #ifdef RT_EXCEPTIONS_ENABLED 263 try { m_pCred = new VBoxCredProvCredential(); } 264 catch (std::bad_alloc &) { hr = E_OUTOFMEMORY; } 265 #else 266 m_pCred = new VBoxCredProvCredential(); 267 AssertStmt(m_pCred, hr = E_OUTOFMEMORY); 268 #endif 269 if (SUCCEEDED(hr)) 265 270 hr = m_pCred->Initialize(m_enmUsageScenario); 266 }267 catch (std::bad_alloc &ex)268 {269 NOREF(ex);270 hr = E_OUTOFMEMORY;271 }272 271 } 273 272 else … … 277 276 278 277 /* If we failed, do some cleanup. */ 278 /** @todo r=bird: Why aren't we cleaning up m_pPoller too? Very confusing given 279 * that m_pCred wasn't necessarily even created above. Always explain the WHY 280 * when doing something that isn't logical like here! */ 279 281 if (FAILED(hr)) 280 282 { … … 291 293 case CPUS_CREDUI: /* Displays an own UI. We don't need that. */ 292 294 case CPUS_PLAP: /* See Pre-Logon-Access Provider. Not needed (yet). */ 293 294 295 hr = E_NOTIMPL; 295 296 break; … … 571 572 VBoxCredProvProviderCreate(REFIID interfaceID, void **ppvInterface) 572 573 { 573 HRESULT hr; 574 575 try 576 { 577 VBoxCredProvProvider *pProvider = new VBoxCredProvProvider(); 578 AssertPtr(pProvider); 579 hr = pProvider->QueryInterface(interfaceID, ppvInterface); 580 pProvider->Release(); 581 } 582 catch (std::bad_alloc &ex) 583 { 584 NOREF(ex); 585 hr = E_OUTOFMEMORY; 586 } 574 VBoxCredProvProvider *pProvider; 575 #ifdef RT_EXCEPTIONS_ENABLED 576 try { pProvider = new VBoxCredProvProvider(); } 577 catch (std::bad_alloc &) { AssertFailedReturn(E_OUTOFMEMORY); } 578 #else 579 pProvider = new VBoxCredProvProvider(); 580 AssertReturn(pProvider, E_OUTOFMEMORY); 581 #endif 582 583 HRESULT hr = pProvider->QueryInterface(interfaceID, ppvInterface); 584 pProvider->Release(); 587 585 588 586 return hr; -
trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvProvider.h
r93115 r95890 24 24 #include <iprt/win/credentialprovider.h> 25 25 #include <iprt/win/windows.h> 26 #include <strsafe.h>27 26 28 27 #include <VBox/VBoxGuestLib.h>
Note:
See TracChangeset
for help on using the changeset viewer.