Changeset 67809 in vbox for trunk/src/VBox/Additions/WINNT/VBoxCredProv
- Timestamp:
- Jul 5, 2017 6:11:47 PM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 116734
- Location:
- trunk/src/VBox/Additions/WINNT/VBoxCredProv
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvCredential.cpp
r67772 r67809 52 52 for (unsigned i = 0; i < VBOXCREDPROV_NUM_FIELDS; i++) 53 53 { 54 m_apwszFields[i] = RTUtf16Alloc(VBOXCREDPROV_MAX_FIELD_LEN * sizeof(RTUTF16) + 1); 54 const VBOXCREDPROV_FIELD *pField = &s_VBoxCredProvDefaultFields[i]; 55 56 m_apwszFields[i] = RTUtf16Dup(pField->desc.pszLabel ? pField->desc.pszLabel : L""); 55 57 AssertPtr(m_apwszFields[i]); 56 58 } … … 387 389 388 390 /** 389 * Resets a credential provider field by zero'ing out its contents in a (hopefully) secure manner. 391 * Sets a credential provider field by first zero'ing out its current content in a (hopefully) secure manner, 392 * then applying either the field's default or a new value. 390 393 * 391 394 * @return HRESULT 392 395 * @param dwFieldID Field ID of the credential provider field to reset. 393 * /394 HRESULT VBoxCredProvCredential::resetField(DWORD dwFieldID) 395 { 396 if ( dwFieldID >= VBOXCREDPROV_NUM_FIELDS 397 || !m_apwszFields[dwFieldID]) 398 {396 * @param pcwszString String to set for the given field. Specify NULL for setting the provider's default value. 397 * @param fNotifyUI Whether to notify the LogonUI about the reset. 398 */ 399 HRESULT VBoxCredProvCredential::setField(DWORD dwFieldID, const PRTUTF16 pcwszString, bool fNotifyUI) 400 { 401 if (dwFieldID >= VBOXCREDPROV_NUM_FIELDS) 399 402 return E_INVALIDARG; 400 }401 403 402 404 HRESULT hr = S_OK; 403 405 404 RTMemWipeThoroughly(m_apwszFields[dwFieldID], 405 (VBOXCREDPROV_MAX_FIELD_LEN + 1) * sizeof(RTUTF16), 3 /* cPasses */); 406 if (m_pEvents) 407 hr = m_pEvents->SetFieldString(this, dwFieldID, m_apwszFields[dwFieldID]); 408 409 VBoxCredProvVerbose(0, "VBoxCredProvCredential::resetField: Resetting field dwFieldID=%ld, hr=0x%08x\n", dwFieldID, hr); 406 PRTUTF16 pwszField = m_apwszFields[dwFieldID]; 407 if (pwszField) 408 { 409 /* First, wipe the existing value thoroughly. */ 410 RTMemWipeThoroughly(pwszField, RTUtf16Len(pwszField) * sizeof(RTUTF16), 3 /* cPasses */); 411 412 /* Second, free the string. */ 413 RTUtf16Free(pwszField); 414 } 415 416 /* Either fill in the default value or the one specified in pcwszString. */ 417 pwszField = RTUtf16Dup(pcwszString ? pcwszString : s_VBoxCredProvDefaultFields[dwFieldID].desc.pszLabel); 418 if (pwszField) 419 { 420 m_apwszFields[dwFieldID] = pwszField; /* Update the pointer. */ 421 422 if ( m_pEvents 423 && fNotifyUI) /* Let the logon UI know if wanted. */ 424 { 425 hr = m_pEvents->SetFieldString(this, dwFieldID, pwszField); 426 } 427 } 428 else 429 hr = E_OUTOFMEMORY; 430 431 VBoxCredProvVerbose(0, "VBoxCredProvCredential::setField: Setting field dwFieldID=%ld to '%ls', fNotifyUI=%RTbool, hr=0x%08x\n", 432 dwFieldID, 433 #ifdef DEBUG 434 pwszField, 435 #else 436 L"XXX" /* Don't show any actual values in release mode. */, 437 #endif 438 fNotifyUI, hr); 410 439 return hr; 411 440 } … … 427 456 m_apwszFields[VBOXCREDPROV_FIELDID_DOMAINNAME] ? m_apwszFields[VBOXCREDPROV_FIELDID_DOMAINNAME] : L"<NULL>"); 428 457 429 if (m_pEvents) 430 { 431 resetField(VBOXCREDPROV_FIELDID_USERNAME); 432 resetField(VBOXCREDPROV_FIELDID_PASSWORD); 433 resetField(VBOXCREDPROV_FIELDID_DOMAINNAME); 434 } 458 /* Note: Do not reset the user name and domain name here, 459 * as they could still being queried (again) by LogonUI on failed login attempts. */ 460 HRESULT hr = setField(VBOXCREDPROV_FIELDID_PASSWORD, NULL /* Use default value */, true /* fNotifyUI */); 435 461 436 462 m_fIsSelected = false; 437 463 438 464 VBoxCredProvVerbose(0, "VBoxCredProvCredential::Reset\n"); 439 return S_OK;465 return hr; 440 466 } 441 467 … … 526 552 VBoxCredProvVerbose(0, "VBoxCredProvCredential::RetrieveCredentials: Credentials already retrieved\n"); 527 553 528 resetField(VBOXCREDPROV_FIELDID_USERNAME); 529 rc = RTUtf16Copy(m_apwszFields[VBOXCREDPROV_FIELDID_USERNAME], VBOXCREDPROV_MAX_FIELD_LEN, pwszUser); 530 531 resetField(VBOXCREDPROV_FIELDID_PASSWORD); 532 int rc2 = RTUtf16Copy(m_apwszFields[VBOXCREDPROV_FIELDID_PASSWORD], VBOXCREDPROV_MAX_FIELD_LEN, pwszPassword); 533 if (RT_SUCCESS(rc)) 534 rc = rc2; 535 536 resetField(VBOXCREDPROV_FIELDID_DOMAINNAME); 537 rc2 = RTUtf16Copy(m_apwszFields[VBOXCREDPROV_FIELDID_DOMAINNAME], VBOXCREDPROV_MAX_FIELD_LEN, pwszDomain); 538 if (RT_SUCCESS(rc)) 539 rc = rc2; 540 541 VBoxCredProvVerbose(0, "VBoxCredProvCredential::RetrieveCredentials: User=%ls, Password=%ls, Domain=%ls\n", 542 m_apwszFields[VBOXCREDPROV_FIELDID_USERNAME], 543 #ifdef DEBUG 544 m_apwszFields[VBOXCREDPROV_FIELDID_PASSWORD], 545 #else 546 L"XXX" /* Don't show any passwords in release mode. */, 547 #endif 548 m_apwszFields[VBOXCREDPROV_FIELDID_DOMAINNAME]); 554 setField(VBOXCREDPROV_FIELDID_USERNAME, pwszUser, true /* fNotifyUI */); 555 setField(VBOXCREDPROV_FIELDID_PASSWORD, pwszPassword, true /* fNotifyUI */); 556 setField(VBOXCREDPROV_FIELDID_DOMAINNAME, pwszDomain, true /* fNotifyUI */); 549 557 } 550 558 … … 657 665 { 658 666 if (pFieldState) 659 *pFieldState = s_VBoxCredProv Fields[dwFieldID].state;667 *pFieldState = s_VBoxCredProvDefaultFields[dwFieldID].state; 660 668 661 669 if (pFieldstateInteractive) 662 *pFieldstateInteractive = s_VBoxCredProv Fields[dwFieldID].stateInteractive;670 *pFieldstateInteractive = s_VBoxCredProvDefaultFields[dwFieldID].stateInteractive; 663 671 } 664 672 else -
trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvCredential.h
r67772 r67809 87 87 /** @} */ 88 88 89 HRESULT resetField(DWORD dwFieldID);89 HRESULT setField(DWORD dwFieldID, const PRTUTF16 pcwszString, bool fNotifyUI); 90 90 HRESULT Reset(void); 91 91 HRESULT Initialize(CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus); -
trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvProvider.cpp
r67808 r67809 411 411 if (pcpFieldDesc) 412 412 { 413 const VBOXCREDPROV_FIELD &field = s_VBoxCredProv Fields[dwIndex];413 const VBOXCREDPROV_FIELD &field = s_VBoxCredProvDefaultFields[dwIndex]; 414 414 415 415 RT_BZERO(pcpFieldDesc, sizeof(CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR)); -
trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredentialProvider.h
r67772 r67809 76 76 #endif 77 77 78 static const VBOXCREDPROV_FIELD s_VBoxCredProvFields[] = 78 /** The credential provider's default fields. */ 79 static const VBOXCREDPROV_FIELD s_VBoxCredProvDefaultFields[] = 79 80 { 80 81 /** The user's profile image (tile). */ 81 { { VBOXCREDPROV_FIELDID_TILEIMAGE, CPFT_TILE_IMAGE, L"Tile Image", 0, }, CPFS_DISPLAY_IN_BOTH, CPFIS_NONE },82 { { VBOXCREDPROV_FIELDID_USERNAME, CPFT_LARGE_TEXT, L"Username", CPFG_LOGON_USERNAME }, CPFS_DISPLAY_IN_BOTH, CPFIS_NONE },83 { { VBOXCREDPROV_FIELDID_PASSWORD, CPFT_PASSWORD_TEXT, L"Password", CPFG_LOGON_PASSWORD }, CPFS_DISPLAY_IN_SELECTED_TILE, CPFIS_FOCUSED },84 { { VBOXCREDPROV_FIELDID_DOMAINNAME, CPFT_LARGE_TEXT, L" Domain Name", 0 }, CPFS_DISPLAY_IN_SELECTED_TILE,CPFIS_FOCUSED },85 { { VBOXCREDPROV_FIELDID_SUBMIT_BUTTON, CPFT_SUBMIT_BUTTON, L"Submit", 0 }, CPFS_DISPLAY_IN_SELECTED_TILE, CPFIS_FOCUSED },82 { { VBOXCREDPROV_FIELDID_TILEIMAGE, CPFT_TILE_IMAGE, L"Tile Image", 0, }, CPFS_DISPLAY_IN_BOTH, CPFIS_NONE }, 83 { { VBOXCREDPROV_FIELDID_USERNAME, CPFT_LARGE_TEXT, L"Username", CPFG_LOGON_USERNAME }, CPFS_DISPLAY_IN_BOTH, CPFIS_NONE }, 84 { { VBOXCREDPROV_FIELDID_PASSWORD, CPFT_PASSWORD_TEXT, L"Password", CPFG_LOGON_PASSWORD }, CPFS_DISPLAY_IN_SELECTED_TILE, CPFIS_FOCUSED }, 85 { { VBOXCREDPROV_FIELDID_DOMAINNAME, CPFT_LARGE_TEXT, L"", 0 }, CPFS_DISPLAY_IN_SELECTED_TILE, CPFIS_FOCUSED }, 86 { { VBOXCREDPROV_FIELDID_SUBMIT_BUTTON, CPFT_SUBMIT_BUTTON, L"Submit", 0 }, CPFS_DISPLAY_IN_SELECTED_TILE, CPFIS_FOCUSED }, 86 87 /** New since Windows 8: The image used to represent a credential provider on the logon page. */ 87 { { VBOXCREDPROV_FIELDID_PROVIDER_LOGO, CPFT_TILE_IMAGE, L"Provider Logo", CPFG_CREDENTIAL_PROVIDER_LOGO }, CPFS_ DISPLAY_IN_BOTH,CPFIS_NONE },88 { { VBOXCREDPROV_FIELDID_PROVIDER_LOGO, CPFT_TILE_IMAGE, L"Provider Logo", CPFG_CREDENTIAL_PROVIDER_LOGO }, CPFS_HIDDEN /* Not used yet. */, CPFIS_NONE }, 88 89 /** New since Windows 8: The label associated with a credential provider on the logon page. */ 89 { { VBOXCREDPROV_FIELDID_PROVIDER_LABEL, CPFT_SMALL_TEXT, L"Provider Label", CPFG_CREDENTIAL_PROVIDER_LABEL }, CPFS_ DISPLAY_IN_BOTH,CPFIS_NONE }90 { { VBOXCREDPROV_FIELDID_PROVIDER_LABEL, CPFT_SMALL_TEXT, L"Provider Label", CPFG_CREDENTIAL_PROVIDER_LABEL }, CPFS_HIDDEN /* Not used yet. */, CPFIS_NONE } 90 91 }; 91 92
Note:
See TracChangeset
for help on using the changeset viewer.