You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
3.6 KiB
142 lines
3.6 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1993 - 2000.
|
|
//
|
|
// File: PassportManager.cpp
|
|
//
|
|
// Contents: implementation of CPassportManager
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "stdafx.h"
|
|
#include "passportmanager.h"
|
|
#include <wincrui.h> // credui
|
|
#include <wininet.h> // INTERNET_MAX_URL_LENGTH
|
|
#include <keymgr.h> // KRShowKeyMgr
|
|
|
|
|
|
const TCHAR c_szWininetKey[] = TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Passport");
|
|
const TCHAR c_szMemberServicesVal[] = TEXT("Properties");
|
|
|
|
|
|
void PassportForceNexusRepopulate()
|
|
{
|
|
HMODULE hm = LoadLibrary(TEXT("wininet.dll"));
|
|
if (hm)
|
|
{
|
|
typedef void (STDAPICALLTYPE *PFN_FORCENEXUSLOOKUP)(void);
|
|
PFN_FORCENEXUSLOOKUP pfnForceNexusLookup = (PFN_FORCENEXUSLOOKUP)GetProcAddress(hm, "ForceNexusLookup");
|
|
if (pfnForceNexusLookup)
|
|
{
|
|
pfnForceNexusLookup();
|
|
}
|
|
FreeLibrary(hm);
|
|
}
|
|
}
|
|
|
|
HWND _VariantToHWND(const VARIANT& varOwner)
|
|
{
|
|
HWND hwndResult = NULL;
|
|
|
|
if (VT_BSTR == varOwner.vt && varOwner.bstrVal && *varOwner.bstrVal != TEXT('\0'))
|
|
{
|
|
hwndResult = FindWindow(NULL, varOwner.bstrVal);
|
|
}
|
|
|
|
return hwndResult;
|
|
}
|
|
|
|
|
|
//
|
|
// IPassportManager Interface
|
|
//
|
|
STDMETHODIMP CPassportManager::get_currentPassport(BSTR* pbstrPassport)
|
|
{
|
|
if (!pbstrPassport)
|
|
return E_POINTER;
|
|
|
|
*pbstrPassport = NULL;
|
|
|
|
LPWSTR pszCred = NULL;
|
|
if (ERROR_SUCCESS == CredUIReadSSOCredW(NULL, &pszCred))
|
|
{
|
|
*pbstrPassport = SysAllocString(pszCred);
|
|
LocalFree(pszCred);
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CPassportManager::get_memberServicesURL(BSTR* pbstrURL)
|
|
{
|
|
if (!pbstrURL)
|
|
return E_POINTER;
|
|
|
|
*pbstrURL = NULL;
|
|
|
|
BSTR bstrURL = SysAllocStringLen(NULL, INTERNET_MAX_URL_LENGTH);
|
|
|
|
if (!bstrURL)
|
|
return E_OUTOFMEMORY;
|
|
|
|
// This ensures that the correct reg values are populated.
|
|
PassportForceNexusRepopulate();
|
|
|
|
// Try HKEY_CURRENT_USER first
|
|
DWORD cbData = SysStringByteLen(bstrURL);
|
|
DWORD dwErr = SHGetValue(HKEY_CURRENT_USER, c_szWininetKey, c_szMemberServicesVal, NULL, bstrURL, &cbData);
|
|
|
|
if (ERROR_SUCCESS != dwErr)
|
|
{
|
|
// Not under HKEY_CURRENT_USER, try HKEY_LOCAL_MACHINE instead
|
|
cbData = SysStringByteLen(bstrURL);
|
|
dwErr = SHGetValue(HKEY_LOCAL_MACHINE, c_szWininetKey, c_szMemberServicesVal, NULL, bstrURL, &cbData);
|
|
}
|
|
|
|
if (ERROR_SUCCESS != dwErr)
|
|
{
|
|
SysFreeString(bstrURL);
|
|
bstrURL = NULL;
|
|
}
|
|
|
|
*pbstrURL = bstrURL;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CPassportManager::showWizard(VARIANT varOwner, VARIANT_BOOL *pbRet)
|
|
{
|
|
if (!pbRet)
|
|
return E_POINTER;
|
|
|
|
*pbRet = VARIANT_FALSE;
|
|
|
|
IPassportWizard *pPW;
|
|
if (SUCCEEDED(CoCreateInstance(CLSID_PassportWizard, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IPassportWizard, &pPW))))
|
|
{
|
|
pPW->SetOptions(PPW_LAUNCHEDBYUSER);
|
|
if (S_OK == pPW->Show(_VariantToHWND(varOwner)))
|
|
{
|
|
*pbRet = VARIANT_TRUE;
|
|
}
|
|
pPW->Release();
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CPassportManager::showKeyManager(VARIANT varOwner, VARIANT_BOOL *pbRet)
|
|
{
|
|
if (!pbRet)
|
|
return E_POINTER;
|
|
|
|
// This returns void, so we claim to always succeed
|
|
KRShowKeyMgr(_VariantToHWND(varOwner), NULL, NULL, 0);
|
|
*pbRet = VARIANT_TRUE;
|
|
|
|
return S_OK;
|
|
}
|