VirtualBox

Ignore:
Timestamp:
Jul 5, 2017 6:11:47 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
116734
Message:

Additions/VBoxCredProv: Renamed resetField() to setField() and implemented the ability to notify LogonUI + set a new value if needed. Fixed default value handling / resetting.

Location:
trunk/src/VBox/Additions/WINNT/VBoxCredProv
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvCredential.cpp

    r67772 r67809  
    5252    for (unsigned i = 0; i < VBOXCREDPROV_NUM_FIELDS; i++)
    5353    {
    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"");
    5557        AssertPtr(m_apwszFields[i]);
    5658    }
     
    387389
    388390/**
    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.
    390393 *
    391394 * @return  HRESULT
    392395 * @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 */
     399HRESULT VBoxCredProvCredential::setField(DWORD dwFieldID, const PRTUTF16 pcwszString, bool fNotifyUI)
     400{
     401    if (dwFieldID >= VBOXCREDPROV_NUM_FIELDS)
    399402        return E_INVALIDARG;
    400     }
    401403
    402404    HRESULT hr = S_OK;
    403405
    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);
    410439    return hr;
    411440}
     
    427456                        m_apwszFields[VBOXCREDPROV_FIELDID_DOMAINNAME] ? m_apwszFields[VBOXCREDPROV_FIELDID_DOMAINNAME] : L"<NULL>");
    428457
    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 */);
    435461
    436462    m_fIsSelected = false;
    437463
    438464    VBoxCredProvVerbose(0, "VBoxCredProvCredential::Reset\n");
    439     return S_OK;
     465    return hr;
    440466}
    441467
     
    526552        VBoxCredProvVerbose(0, "VBoxCredProvCredential::RetrieveCredentials: Credentials already retrieved\n");
    527553
    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 */);
    549557    }
    550558
     
    657665    {
    658666        if (pFieldState)
    659             *pFieldState            = s_VBoxCredProvFields[dwFieldID].state;
     667            *pFieldState            = s_VBoxCredProvDefaultFields[dwFieldID].state;
    660668
    661669        if (pFieldstateInteractive)
    662             *pFieldstateInteractive = s_VBoxCredProvFields[dwFieldID].stateInteractive;
     670            *pFieldstateInteractive = s_VBoxCredProvDefaultFields[dwFieldID].stateInteractive;
    663671    }
    664672    else
  • trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvCredential.h

    r67772 r67809  
    8787    /** @} */
    8888
    89     HRESULT resetField(DWORD dwFieldID);
     89    HRESULT setField(DWORD dwFieldID, const PRTUTF16 pcwszString, bool fNotifyUI);
    9090    HRESULT Reset(void);
    9191    HRESULT Initialize(CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus);
  • trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvProvider.cpp

    r67808 r67809  
    411411        if (pcpFieldDesc)
    412412        {
    413             const VBOXCREDPROV_FIELD &field = s_VBoxCredProvFields[dwIndex];
     413            const VBOXCREDPROV_FIELD &field = s_VBoxCredProvDefaultFields[dwIndex];
    414414
    415415            RT_BZERO(pcpFieldDesc, sizeof(CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR));
  • trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredentialProvider.h

    r67772 r67809  
    7676#endif
    7777
    78 static const VBOXCREDPROV_FIELD s_VBoxCredProvFields[] =
     78/** The credential provider's default fields. */
     79static const VBOXCREDPROV_FIELD s_VBoxCredProvDefaultFields[] =
    7980{
    8081    /** 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 },
    8687    /** 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 },
    8889    /** 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 }
    9091};
    9192
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette