1102 lines
34 KiB
C++
1102 lines
34 KiB
C++
|
/**************************************************************************
|
||
|
Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
|
||
|
|
||
|
MODULE: REGCFG.CPP
|
||
|
|
||
|
PURPOSE: Source module reading/writing PM config sets from the registry
|
||
|
|
||
|
FUNCTIONS:
|
||
|
|
||
|
COMMENTS:
|
||
|
|
||
|
**************************************************************************/
|
||
|
|
||
|
/**************************************************************************
|
||
|
Include Files
|
||
|
**************************************************************************/
|
||
|
|
||
|
#include "pmcfg.h"
|
||
|
#include "keycrypto.h"
|
||
|
|
||
|
// Reg Keys/values that we care about
|
||
|
TCHAR g_szPassportReg[] = TEXT("Software\\Microsoft\\Passport");
|
||
|
TCHAR g_szPassportSites[] = TEXT("Software\\Microsoft\\Passport\\Sites");
|
||
|
TCHAR g_szEncryptionKeyData[] = TEXT("KeyData");
|
||
|
TCHAR g_szInstallDir[] = TEXT("InstallDir");
|
||
|
TCHAR g_szVersion[] = TEXT("Version");
|
||
|
TCHAR g_szTimeWindow[] = TEXT("TimeWindow");
|
||
|
TCHAR g_szForceSignIn[] = TEXT("ForceSignIn");
|
||
|
TCHAR g_szLanguageID[] = TEXT("LanguageID");
|
||
|
TCHAR g_szCoBrandTemplate[] = TEXT("CoBrandTemplate");
|
||
|
TCHAR g_szSiteID[] = TEXT("SiteID");
|
||
|
TCHAR g_szReturnURL[] = TEXT("ReturnURL");
|
||
|
TCHAR g_szTicketDomain[] = TEXT("TicketDomain");
|
||
|
TCHAR g_szTicketPath[] = TEXT("TicketPath");
|
||
|
TCHAR g_szProfileDomain[] = TEXT("ProfileDomain");
|
||
|
TCHAR g_szProfilePath[] = TEXT("ProfilePath");
|
||
|
TCHAR g_szSecureDomain[] = TEXT("SecureDomain");
|
||
|
TCHAR g_szSecurePath[] = TEXT("SecurePath");
|
||
|
TCHAR g_szCurrentKey[] = TEXT("CurrentKey");
|
||
|
TCHAR g_szStandAlone[] = TEXT("StandAlone");
|
||
|
TCHAR g_szDisableCookies[] = TEXT("DisableCookies");
|
||
|
TCHAR g_szDisasterURL[] = TEXT("DisasterURL");
|
||
|
TCHAR g_szHostName[] = TEXT("HostName");
|
||
|
TCHAR g_szHostIP[] = TEXT("HostIP");
|
||
|
|
||
|
|
||
|
|
||
|
/**************************************************************************
|
||
|
|
||
|
WriteRegTestKey
|
||
|
|
||
|
Installs the default test key for the named config set. This is
|
||
|
only called in the case where a new config set key was created in
|
||
|
OpenRegConfigSet.
|
||
|
|
||
|
**************************************************************************/
|
||
|
BOOL
|
||
|
WriteRegTestKey
|
||
|
(
|
||
|
HKEY hkeyConfigKey
|
||
|
)
|
||
|
{
|
||
|
BOOL bReturn;
|
||
|
CKeyCrypto kc;
|
||
|
HKEY hkDataKey = NULL, hkTimeKey = NULL;
|
||
|
TCHAR szKeyNum[2];
|
||
|
DWORD dwKeyVer = 1;
|
||
|
|
||
|
// Try to encrypt it with MAC address
|
||
|
BYTE original[CKeyCrypto::RAWKEY_SIZE];
|
||
|
DATA_BLOB iBlob;
|
||
|
DATA_BLOB oBlob;
|
||
|
|
||
|
iBlob.cbData = sizeof(original);
|
||
|
iBlob.pbData = original;
|
||
|
|
||
|
ZeroMemory(&oBlob, sizeof(oBlob));
|
||
|
|
||
|
memcpy(original, "123456781234567812345678", CKeyCrypto::RAWKEY_SIZE);
|
||
|
if (kc.encryptKey(&iBlob, &oBlob) != S_OK)
|
||
|
{
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
// Now add it to registry
|
||
|
|
||
|
lstrcpy(szKeyNum, TEXT("1"));
|
||
|
|
||
|
if(ERROR_SUCCESS != RegCreateKeyEx(hkeyConfigKey,
|
||
|
TEXT("KeyData"),
|
||
|
0,
|
||
|
TEXT(""),
|
||
|
0,
|
||
|
KEY_ALL_ACCESS,
|
||
|
NULL,
|
||
|
&hkDataKey,
|
||
|
NULL))
|
||
|
{
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
if(ERROR_SUCCESS != RegCreateKeyEx(hkeyConfigKey,
|
||
|
TEXT("KeyTimes"),
|
||
|
0,
|
||
|
TEXT(""),
|
||
|
0,
|
||
|
KEY_ALL_ACCESS,
|
||
|
NULL,
|
||
|
&hkTimeKey,
|
||
|
NULL))
|
||
|
{
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
if(ERROR_SUCCESS != RegSetValueExA(hkDataKey,
|
||
|
szKeyNum,
|
||
|
0,
|
||
|
REG_BINARY,
|
||
|
oBlob.pbData,
|
||
|
oBlob.cbData))
|
||
|
{
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
if(ERROR_SUCCESS != RegSetValueExA(hkeyConfigKey,
|
||
|
"CurrentKey",
|
||
|
0,
|
||
|
REG_DWORD,
|
||
|
(LPBYTE)&dwKeyVer,
|
||
|
sizeof(DWORD)))
|
||
|
{
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
bReturn = TRUE;
|
||
|
|
||
|
Cleanup:
|
||
|
if (hkDataKey)
|
||
|
RegCloseKey(hkDataKey);
|
||
|
if (hkTimeKey)
|
||
|
RegCloseKey(hkTimeKey);
|
||
|
|
||
|
if (oBlob.pbData)
|
||
|
::LocalFree(oBlob.pbData);
|
||
|
|
||
|
return bReturn;
|
||
|
}
|
||
|
/**************************************************************************
|
||
|
|
||
|
OpenRegConfigSet
|
||
|
|
||
|
Open and return an HKEY for a named configuration set
|
||
|
current passport manager config set from the registry
|
||
|
|
||
|
**************************************************************************/
|
||
|
HKEY OpenRegConfigSet
|
||
|
(
|
||
|
HKEY hkeyLocalMachine, // Local or remote HKLM
|
||
|
LPTSTR lpszConfigSetName // Name of config set
|
||
|
)
|
||
|
{
|
||
|
HKEY hkeyConfigSets = NULL;
|
||
|
HKEY hkeyConfigSet;
|
||
|
DWORD dwDisp;
|
||
|
|
||
|
//
|
||
|
// Can't create an unnamed config set.
|
||
|
//
|
||
|
|
||
|
if(lpszConfigSetName == NULL ||
|
||
|
lpszConfigSetName[0] == TEXT('\0'))
|
||
|
{
|
||
|
hkeyConfigSet = NULL;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
if (ERROR_SUCCESS != RegCreateKeyEx(hkeyLocalMachine,
|
||
|
g_szPassportSites,
|
||
|
0,
|
||
|
TEXT(""),
|
||
|
0,
|
||
|
KEY_ALL_ACCESS,
|
||
|
NULL,
|
||
|
&hkeyConfigSets,
|
||
|
NULL))
|
||
|
{
|
||
|
hkeyConfigSet = NULL;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Create the key if it doesn't exist, otherwise
|
||
|
// open it.
|
||
|
//
|
||
|
|
||
|
if (ERROR_SUCCESS != RegCreateKeyEx(hkeyConfigSets,
|
||
|
lpszConfigSetName,
|
||
|
0,
|
||
|
TEXT(""),
|
||
|
0,
|
||
|
KEY_ALL_ACCESS,
|
||
|
NULL,
|
||
|
&hkeyConfigSet,
|
||
|
&dwDisp))
|
||
|
{
|
||
|
hkeyConfigSet = NULL;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// If we created a new regkey, add encryption keys
|
||
|
//
|
||
|
|
||
|
if(dwDisp == REG_CREATED_NEW_KEY)
|
||
|
{
|
||
|
WriteRegTestKey(hkeyConfigSet);
|
||
|
}
|
||
|
|
||
|
Cleanup:
|
||
|
|
||
|
if(hkeyConfigSets)
|
||
|
RegCloseKey(hkeyConfigSets);
|
||
|
|
||
|
return hkeyConfigSet;
|
||
|
}
|
||
|
|
||
|
/**************************************************************************
|
||
|
|
||
|
ReadRegConfigSet
|
||
|
|
||
|
Read the current passport manager config set from the registry
|
||
|
|
||
|
**************************************************************************/
|
||
|
BOOL ReadRegConfigSet
|
||
|
(
|
||
|
HWND hWndDlg,
|
||
|
LPPMSETTINGS lpPMConfig,
|
||
|
LPTSTR lpszRemoteComputer,
|
||
|
LPTSTR lpszConfigSetName
|
||
|
)
|
||
|
{
|
||
|
BOOL bReturn;
|
||
|
HKEY hkeyPassport = NULL; // Regkey where Passport Setting live
|
||
|
HKEY hkeyConfigSets = NULL;
|
||
|
HKEY hkeyConfig = NULL;
|
||
|
HKEY hklm = NULL;
|
||
|
DWORD dwcbTemp;
|
||
|
DWORD dwType;
|
||
|
TCHAR szText[MAX_RESOURCE];
|
||
|
TCHAR szTitle[MAX_RESOURCE];
|
||
|
|
||
|
// Open the Passport Regkey ( either locally or remotly
|
||
|
if (lpszRemoteComputer && ('\0' != lpszRemoteComputer[0]))
|
||
|
{
|
||
|
//
|
||
|
// Attempt to connect to the HKEY_LOCAL_MACHINE of the remote computer.
|
||
|
// If this fails, assume that the computer doesn't exist or doesn't have
|
||
|
// the registry server running.
|
||
|
//
|
||
|
switch (RegConnectRegistry(lpszRemoteComputer,
|
||
|
HKEY_LOCAL_MACHINE,
|
||
|
&hklm))
|
||
|
{
|
||
|
|
||
|
case ERROR_SUCCESS:
|
||
|
break;
|
||
|
|
||
|
case ERROR_ACCESS_DENIED:
|
||
|
ReportError(hWndDlg, IDS_CONNECTACCESSDENIED);
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
|
||
|
default:
|
||
|
ReportError(hWndDlg, IDS_CONNECTBADNAME);
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hklm = HKEY_LOCAL_MACHINE;
|
||
|
}
|
||
|
|
||
|
// Open the key we want
|
||
|
if (ERROR_SUCCESS != RegOpenKeyEx(hklm,
|
||
|
g_szPassportReg,
|
||
|
0,
|
||
|
KEY_ALL_ACCESS,
|
||
|
&hkeyPassport))
|
||
|
{
|
||
|
ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
if(lpszConfigSetName && lpszConfigSetName[0] != TEXT('\0'))
|
||
|
{
|
||
|
hkeyConfig = OpenRegConfigSet(hklm, lpszConfigSetName);
|
||
|
if(hkeyConfig == NULL)
|
||
|
{
|
||
|
ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hkeyConfig = hkeyPassport;
|
||
|
}
|
||
|
|
||
|
// The Install dir and Version number go into globals, because they are read
|
||
|
// only values that must come from the target machine's registry.
|
||
|
|
||
|
// Read the Install Dir.
|
||
|
dwcbTemp = MAX_PATH;
|
||
|
dwType = REG_SZ;
|
||
|
g_szInstallPath[0] = '\0'; // Default value
|
||
|
RegQueryValueEx(hkeyPassport,
|
||
|
g_szInstallDir,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)g_szInstallPath,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
// Read the version Number
|
||
|
dwcbTemp = MAX_REGISTRY_STRING;
|
||
|
dwType = REG_SZ;
|
||
|
g_szPMVersion[0] = '\0'; // Default value
|
||
|
RegQueryValueEx(hkeyPassport,
|
||
|
g_szVersion,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)&g_szPMVersion,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
// The Remaining settings are read/write and get put into a PMSETTINGS struct
|
||
|
|
||
|
// Read the Time Window Number
|
||
|
dwcbTemp = sizeof(DWORD);
|
||
|
dwType = REG_DWORD;
|
||
|
lpPMConfig->dwTimeWindow = DEFAULT_TIME_WINDOW;
|
||
|
RegQueryValueEx(hkeyConfig,
|
||
|
g_szTimeWindow,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)&lpPMConfig->dwTimeWindow,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
// Read the value for Forced Signin
|
||
|
dwcbTemp = sizeof(DWORD);
|
||
|
dwType = REG_DWORD;
|
||
|
lpPMConfig->dwForceSignIn = 0; // Don't force a signin by default
|
||
|
RegQueryValueEx(hkeyConfig,
|
||
|
g_szForceSignIn,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)&lpPMConfig->dwForceSignIn,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
// Read the default language ID
|
||
|
dwcbTemp = sizeof(DWORD);
|
||
|
dwType = REG_DWORD;
|
||
|
lpPMConfig->dwLanguageID = DEFAULT_LANGID; // english
|
||
|
RegQueryValueEx(hkeyConfig,
|
||
|
g_szLanguageID,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)&lpPMConfig->dwLanguageID,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
// Get the co-branding template
|
||
|
dwcbTemp = lpPMConfig->cbCoBrandTemplate;
|
||
|
dwType = REG_SZ;
|
||
|
lpPMConfig->szCoBrandTemplate[0] = '\0'; // Default value
|
||
|
RegQueryValueEx(hkeyConfig,
|
||
|
g_szCoBrandTemplate,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)lpPMConfig->szCoBrandTemplate,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
// Get the SiteID
|
||
|
dwcbTemp = sizeof(DWORD);
|
||
|
dwType = REG_DWORD;
|
||
|
lpPMConfig->dwSiteID = 1; // Default Site ID
|
||
|
RegQueryValueEx(hkeyConfig,
|
||
|
g_szSiteID,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)&lpPMConfig->dwSiteID,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
// Get the return URL template
|
||
|
dwcbTemp = lpPMConfig->cbReturnURL;
|
||
|
dwType = REG_SZ;
|
||
|
lpPMConfig->szReturnURL[0] = '\0'; // Set a default for the current value
|
||
|
RegQueryValueEx(hkeyConfig,
|
||
|
g_szReturnURL,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)lpPMConfig->szReturnURL,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
// Get the ticket cookie domain
|
||
|
dwcbTemp = lpPMConfig->cbTicketDomain;
|
||
|
dwType = REG_SZ;
|
||
|
lpPMConfig->szTicketDomain[0] = '\0'; // Set a default for the current value
|
||
|
RegQueryValueEx(hkeyConfig,
|
||
|
g_szTicketDomain,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)lpPMConfig->szTicketDomain,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
// Get the ticket cookie path
|
||
|
dwcbTemp = lpPMConfig->cbTicketPath;
|
||
|
dwType = REG_SZ;
|
||
|
lpPMConfig->szTicketPath[0] = '\0'; // Set a default for the current value
|
||
|
RegQueryValueEx(hkeyConfig,
|
||
|
g_szTicketPath,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)lpPMConfig->szTicketPath,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
// Get the profile cookie domain
|
||
|
dwcbTemp = lpPMConfig->cbProfileDomain;
|
||
|
dwType = REG_SZ;
|
||
|
lpPMConfig->szProfileDomain[0] = '\0'; // Set a default for the current value
|
||
|
RegQueryValueEx(hkeyConfig,
|
||
|
g_szProfileDomain,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)lpPMConfig->szProfileDomain,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
// Get the profile cookie path
|
||
|
dwcbTemp = lpPMConfig->cbProfilePath;
|
||
|
dwType = REG_SZ;
|
||
|
lpPMConfig->szProfilePath[0] = '\0'; // Set a default for the current value
|
||
|
RegQueryValueEx(hkeyConfig,
|
||
|
g_szProfilePath,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)lpPMConfig->szProfilePath,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
// Get the secure cookie domain
|
||
|
dwcbTemp = lpPMConfig->cbSecureDomain;
|
||
|
dwType = REG_SZ;
|
||
|
lpPMConfig->szSecureDomain[0] = '\0'; // Set a default for the current value
|
||
|
RegQueryValueEx(hkeyConfig,
|
||
|
g_szSecureDomain,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)lpPMConfig->szSecureDomain,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
// Get the secure cookie path
|
||
|
dwcbTemp = lpPMConfig->cbSecurePath;
|
||
|
dwType = REG_SZ;
|
||
|
lpPMConfig->szSecurePath[0] = '\0'; // Set a default for the current value
|
||
|
RegQueryValueEx(hkeyConfig,
|
||
|
g_szSecurePath,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)lpPMConfig->szSecurePath,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
// Get the Disaster URL
|
||
|
dwcbTemp = lpPMConfig->cbDisasterURL;
|
||
|
dwType = REG_SZ;
|
||
|
lpPMConfig->szDisasterURL[0] = '\0'; // Set a default for the current value
|
||
|
RegQueryValueEx(hkeyConfig,
|
||
|
g_szDisasterURL,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)lpPMConfig->szDisasterURL,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
// Get Standalone mode setting
|
||
|
dwcbTemp = sizeof(DWORD);
|
||
|
dwType = REG_DWORD;
|
||
|
lpPMConfig->dwStandAlone = 0; // NOT standalone by default
|
||
|
RegQueryValueEx(hkeyConfig,
|
||
|
g_szStandAlone,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)&lpPMConfig->dwStandAlone,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
// Get DisableCookies mode setting
|
||
|
dwcbTemp = sizeof(DWORD);
|
||
|
dwType = REG_DWORD;
|
||
|
lpPMConfig->dwDisableCookies = 0; // Cookies ENABLED by default
|
||
|
RegQueryValueEx(hkeyConfig,
|
||
|
g_szDisableCookies,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)&lpPMConfig->dwDisableCookies,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
#ifdef DO_KEYSTUFF
|
||
|
// Get the current encryption key
|
||
|
dwcbTemp = sizeof(DWORD);
|
||
|
dwType = REG_DWORD;
|
||
|
lpPMConfig->dwCurrentKey = 1;
|
||
|
RegQueryValueEx(hkeyConfig,
|
||
|
g_szCurrentKey,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)&lpPMConfig->dwCurrentKey,
|
||
|
&dwcbTemp);
|
||
|
#endif
|
||
|
|
||
|
// For these next two, since they're required for named configs, we need
|
||
|
// to check for too much data and truncate it.
|
||
|
|
||
|
// Get the Host Name
|
||
|
dwcbTemp = lpPMConfig->cbHostName;
|
||
|
dwType = REG_SZ;
|
||
|
lpPMConfig->szHostName[0] = '\0'; // Set a default for the current value
|
||
|
if(ERROR_MORE_DATA == RegQueryValueEx(hkeyConfig,
|
||
|
g_szHostName,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)lpPMConfig->szHostName,
|
||
|
&dwcbTemp))
|
||
|
{
|
||
|
LPBYTE pb = (LPBYTE)malloc(dwcbTemp);
|
||
|
if(pb)
|
||
|
{
|
||
|
RegQueryValueEx(hkeyConfig,
|
||
|
g_szHostName,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
pb,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
memcpy(lpPMConfig->szHostName, pb, lpPMConfig->cbHostName);
|
||
|
free(pb);
|
||
|
|
||
|
ReportError(hWndDlg, IDS_HOSTNAMETRUNC_WARN);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Get the Host IP
|
||
|
dwcbTemp = lpPMConfig->cbHostIP;
|
||
|
dwType = REG_SZ;
|
||
|
lpPMConfig->szHostIP[0] = '\0'; // Set a default for the current value
|
||
|
if(ERROR_MORE_DATA == RegQueryValueEx(hkeyConfig,
|
||
|
g_szHostIP,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(LPBYTE)lpPMConfig->szHostIP,
|
||
|
&dwcbTemp))
|
||
|
{
|
||
|
LPBYTE pb = (LPBYTE)malloc(dwcbTemp);
|
||
|
if(pb)
|
||
|
{
|
||
|
RegQueryValueEx(hkeyConfig,
|
||
|
g_szHostIP,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
pb,
|
||
|
&dwcbTemp);
|
||
|
|
||
|
memcpy(lpPMConfig->szHostIP, pb, lpPMConfig->cbHostIP);
|
||
|
free(pb);
|
||
|
|
||
|
ReportError(hWndDlg, IDS_HOSTIPTRUNC_WARN);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// If we got empty strings for HostName or
|
||
|
// HostIP, and we have a named config it
|
||
|
// means someone's been mucking with
|
||
|
// the registry. Give them a warning and
|
||
|
// return FALSE.
|
||
|
if(lpszConfigSetName && lpszConfigSetName[0] &&
|
||
|
(lpPMConfig->szHostName[0] == TEXT('\0') ||
|
||
|
lpPMConfig->szHostIP[0] == TEXT('\0')))
|
||
|
{
|
||
|
ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
bReturn = TRUE;
|
||
|
|
||
|
Cleanup:
|
||
|
|
||
|
if (hkeyConfig && hkeyConfig != hkeyPassport)
|
||
|
RegCloseKey(hkeyConfig);
|
||
|
if (hkeyPassport)
|
||
|
RegCloseKey(hkeyPassport);
|
||
|
if (hkeyConfigSets)
|
||
|
RegCloseKey(hkeyConfigSets);
|
||
|
if (hklm && hklm != HKEY_LOCAL_MACHINE)
|
||
|
RegCloseKey(hklm);
|
||
|
|
||
|
return bReturn;
|
||
|
}
|
||
|
|
||
|
/**************************************************************************
|
||
|
|
||
|
WriteRegConfigSet
|
||
|
|
||
|
Write the current passport manager config set from the registry
|
||
|
|
||
|
**************************************************************************/
|
||
|
|
||
|
BOOL WriteRegConfigSet
|
||
|
(
|
||
|
HWND hWndDlg,
|
||
|
LPPMSETTINGS lpPMConfig,
|
||
|
LPTSTR lpszRemoteComputer,
|
||
|
LPTSTR lpszConfigSetName
|
||
|
)
|
||
|
{
|
||
|
BOOL bReturn;
|
||
|
HKEY hkeyPassport = NULL; // Regkey where Passport Setting live
|
||
|
HKEY hkeyConfigSets = NULL;
|
||
|
HKEY hklm = NULL;
|
||
|
|
||
|
// Open the Passport Regkey ( either locally or remotly
|
||
|
if (lpszRemoteComputer && ('\0' != lpszRemoteComputer[0]))
|
||
|
{
|
||
|
//
|
||
|
// Attempt to connect to the HKEY_LOCAL_MACHINE of the remote computer.
|
||
|
// If this fails, assume that the computer doesn't exist or doesn't have
|
||
|
// the registry server running.
|
||
|
//
|
||
|
switch (RegConnectRegistry(lpszRemoteComputer,
|
||
|
HKEY_LOCAL_MACHINE,
|
||
|
&hklm))
|
||
|
{
|
||
|
|
||
|
case ERROR_SUCCESS:
|
||
|
break;
|
||
|
|
||
|
case ERROR_ACCESS_DENIED:
|
||
|
ReportError(hWndDlg, IDS_CONNECTACCESSDENIED);
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
|
||
|
default:
|
||
|
ReportError(hWndDlg, IDS_CONNECTBADNAME);
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hklm = HKEY_LOCAL_MACHINE;
|
||
|
}
|
||
|
|
||
|
// Open the key we want
|
||
|
if(lpszConfigSetName && lpszConfigSetName[0] != TEXT('\0'))
|
||
|
{
|
||
|
hkeyPassport = OpenRegConfigSet(hklm, lpszConfigSetName);
|
||
|
if(hkeyPassport == NULL)
|
||
|
{
|
||
|
ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (ERROR_SUCCESS != RegOpenKeyEx(hklm,
|
||
|
g_szPassportReg,
|
||
|
0,
|
||
|
KEY_ALL_ACCESS,
|
||
|
&hkeyPassport))
|
||
|
{
|
||
|
ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Write the Time Window Number
|
||
|
RegSetValueEx(hkeyPassport,
|
||
|
g_szTimeWindow,
|
||
|
NULL,
|
||
|
REG_DWORD,
|
||
|
(LPBYTE)&lpPMConfig->dwTimeWindow,
|
||
|
sizeof(DWORD));
|
||
|
|
||
|
// Write the value for Forced Signin
|
||
|
RegSetValueEx(hkeyPassport,
|
||
|
g_szForceSignIn,
|
||
|
NULL,
|
||
|
REG_DWORD,
|
||
|
(LPBYTE)&lpPMConfig->dwForceSignIn,
|
||
|
sizeof(DWORD));
|
||
|
|
||
|
// Write the default language ID
|
||
|
RegSetValueEx(hkeyPassport,
|
||
|
g_szLanguageID,
|
||
|
NULL,
|
||
|
REG_DWORD,
|
||
|
(LPBYTE)&lpPMConfig->dwLanguageID,
|
||
|
sizeof(DWORD));
|
||
|
|
||
|
// Write the co-branding template
|
||
|
RegSetValueEx(hkeyPassport,
|
||
|
g_szCoBrandTemplate,
|
||
|
NULL,
|
||
|
REG_SZ,
|
||
|
(LPBYTE)lpPMConfig->szCoBrandTemplate,
|
||
|
lstrlen(lpPMConfig->szCoBrandTemplate) + 1);
|
||
|
|
||
|
// Write the SiteID
|
||
|
RegSetValueEx(hkeyPassport,
|
||
|
g_szSiteID,
|
||
|
NULL,
|
||
|
REG_DWORD,
|
||
|
(LPBYTE)&lpPMConfig->dwSiteID,
|
||
|
sizeof(DWORD));
|
||
|
|
||
|
// Write the return URL template
|
||
|
RegSetValueEx(hkeyPassport,
|
||
|
g_szReturnURL,
|
||
|
NULL,
|
||
|
REG_SZ,
|
||
|
(LPBYTE)lpPMConfig->szReturnURL,
|
||
|
lstrlen(lpPMConfig->szReturnURL) + 1);
|
||
|
|
||
|
// Write the ticket cookie domain
|
||
|
RegSetValueEx(hkeyPassport,
|
||
|
g_szTicketDomain,
|
||
|
NULL,
|
||
|
REG_SZ,
|
||
|
(LPBYTE)lpPMConfig->szTicketDomain,
|
||
|
lstrlen(lpPMConfig->szTicketDomain) + 1);
|
||
|
|
||
|
// Write the ticket cookie path
|
||
|
RegSetValueEx(hkeyPassport,
|
||
|
g_szTicketPath,
|
||
|
NULL,
|
||
|
REG_SZ,
|
||
|
(LPBYTE)lpPMConfig->szTicketPath,
|
||
|
lstrlen(lpPMConfig->szTicketPath) + 1);
|
||
|
|
||
|
// Write the profile cookie domain
|
||
|
RegSetValueEx(hkeyPassport,
|
||
|
g_szProfileDomain,
|
||
|
NULL,
|
||
|
REG_SZ,
|
||
|
(LPBYTE)lpPMConfig->szProfileDomain,
|
||
|
lstrlen(lpPMConfig->szProfileDomain) + 1);
|
||
|
|
||
|
// Write the profile cookie path
|
||
|
RegSetValueEx(hkeyPassport,
|
||
|
g_szProfilePath,
|
||
|
NULL,
|
||
|
REG_SZ,
|
||
|
(LPBYTE)lpPMConfig->szProfilePath,
|
||
|
lstrlen(lpPMConfig->szProfilePath) + 1);
|
||
|
|
||
|
// Write the secure cookie domain
|
||
|
RegSetValueEx(hkeyPassport,
|
||
|
g_szSecureDomain,
|
||
|
NULL,
|
||
|
REG_SZ,
|
||
|
(LPBYTE)lpPMConfig->szSecureDomain,
|
||
|
lstrlen(lpPMConfig->szSecureDomain) + 1);
|
||
|
|
||
|
// Write the secure cookie path
|
||
|
RegSetValueEx(hkeyPassport,
|
||
|
g_szSecurePath,
|
||
|
NULL,
|
||
|
REG_SZ,
|
||
|
(LPBYTE)lpPMConfig->szSecurePath,
|
||
|
lstrlen(lpPMConfig->szSecurePath) + 1);
|
||
|
|
||
|
// Write the DisasterURL
|
||
|
RegSetValueEx(hkeyPassport,
|
||
|
g_szDisasterURL,
|
||
|
NULL,
|
||
|
REG_SZ,
|
||
|
(LPBYTE)lpPMConfig->szDisasterURL,
|
||
|
lstrlen(lpPMConfig->szDisasterURL) + 1);
|
||
|
|
||
|
// Write Standalone mode setting
|
||
|
RegSetValueEx(hkeyPassport,
|
||
|
g_szStandAlone,
|
||
|
NULL,
|
||
|
REG_DWORD,
|
||
|
(LPBYTE)&lpPMConfig->dwStandAlone,
|
||
|
sizeof(DWORD));
|
||
|
|
||
|
// Write DisableCookies mode setting
|
||
|
RegSetValueEx(hkeyPassport,
|
||
|
g_szDisableCookies,
|
||
|
NULL,
|
||
|
REG_DWORD,
|
||
|
(LPBYTE)&lpPMConfig->dwDisableCookies,
|
||
|
sizeof(DWORD));
|
||
|
|
||
|
// Only write HostName and HostIP for non-default config sets.
|
||
|
if(lpszConfigSetName && lpszConfigSetName[0])
|
||
|
{
|
||
|
// Write the HostName
|
||
|
RegSetValueEx(hkeyPassport,
|
||
|
g_szHostName,
|
||
|
NULL,
|
||
|
REG_SZ,
|
||
|
(LPBYTE)lpPMConfig->szHostName,
|
||
|
lstrlen(lpPMConfig->szHostName) + 1);
|
||
|
|
||
|
// Write the HostIP
|
||
|
RegSetValueEx(hkeyPassport,
|
||
|
g_szHostIP,
|
||
|
NULL,
|
||
|
REG_SZ,
|
||
|
(LPBYTE)lpPMConfig->szHostIP,
|
||
|
lstrlen(lpPMConfig->szHostIP) + 1);
|
||
|
}
|
||
|
|
||
|
bReturn = TRUE;
|
||
|
|
||
|
Cleanup:
|
||
|
|
||
|
if(hklm && hklm != HKEY_LOCAL_MACHINE)
|
||
|
RegCloseKey(hklm);
|
||
|
if(hkeyConfigSets)
|
||
|
RegCloseKey(hkeyConfigSets);
|
||
|
if(hkeyPassport)
|
||
|
RegCloseKey(hkeyPassport);
|
||
|
|
||
|
return bReturn;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**************************************************************************
|
||
|
|
||
|
RemoveRegConfigSet
|
||
|
|
||
|
Verify that the passed in config set is consistent with the current
|
||
|
values in the registry.
|
||
|
|
||
|
**************************************************************************/
|
||
|
BOOL RemoveRegConfigSet
|
||
|
(
|
||
|
HWND hWndDlg,
|
||
|
LPTSTR lpszRemoteComputer,
|
||
|
LPTSTR lpszConfigSetName
|
||
|
)
|
||
|
{
|
||
|
BOOL bReturn;
|
||
|
HKEY hklm = NULL;
|
||
|
HKEY hkeyPassportConfigSets = NULL;
|
||
|
|
||
|
// Can't delete the default configuration set.
|
||
|
if(lpszConfigSetName == NULL || lpszConfigSetName[0] == TEXT('\0'))
|
||
|
{
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
// Open the Passport Configuration Sets Regkey ( either locally or remotly
|
||
|
if (lpszRemoteComputer && ('\0' != lpszRemoteComputer[0]))
|
||
|
{
|
||
|
//
|
||
|
// Attempt to connect to the HKEY_LOCAL_MACHINE of the remote computer.
|
||
|
// If this fails, assume that the computer doesn't exist or doesn't have
|
||
|
// the registry server running.
|
||
|
//
|
||
|
switch (RegConnectRegistry(lpszRemoteComputer,
|
||
|
HKEY_LOCAL_MACHINE,
|
||
|
&hklm))
|
||
|
{
|
||
|
|
||
|
case ERROR_SUCCESS:
|
||
|
break;
|
||
|
|
||
|
case ERROR_ACCESS_DENIED:
|
||
|
ReportError(hWndDlg, IDS_CONNECTACCESSDENIED);
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
|
||
|
default:
|
||
|
ReportError(hWndDlg, IDS_CONNECTBADNAME);
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hklm = HKEY_LOCAL_MACHINE;
|
||
|
}
|
||
|
|
||
|
// Open the key we want
|
||
|
if (ERROR_SUCCESS != RegOpenKeyEx(hklm,
|
||
|
g_szPassportSites,
|
||
|
0,
|
||
|
KEY_ALL_ACCESS,
|
||
|
&hkeyPassportConfigSets))
|
||
|
{
|
||
|
ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
// Delete the config set key
|
||
|
if (ERROR_SUCCESS != SHDeleteKey(hkeyPassportConfigSets, lpszConfigSetName))
|
||
|
{
|
||
|
ReportError(hWndDlg, IDS_CONFIGREAD_ERROR);
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
bReturn = TRUE;
|
||
|
|
||
|
Cleanup:
|
||
|
|
||
|
if(hklm && hklm != HKEY_LOCAL_MACHINE)
|
||
|
RegCloseKey(hklm);
|
||
|
if(hkeyPassportConfigSets)
|
||
|
RegCloseKey(hkeyPassportConfigSets);
|
||
|
|
||
|
return bReturn;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**************************************************************************
|
||
|
|
||
|
VerifyRegConfigSet
|
||
|
|
||
|
Verify that the passed in config set is consistent with the current
|
||
|
values in the registry.
|
||
|
|
||
|
**************************************************************************/
|
||
|
BOOL VerifyRegConfigSet
|
||
|
(
|
||
|
HWND hWndDlg,
|
||
|
LPPMSETTINGS lpPMConfig,
|
||
|
LPTSTR lpszRemoteComputer,
|
||
|
LPTSTR lpszConfigSetName
|
||
|
)
|
||
|
{
|
||
|
PMSETTINGS pmCurrent;
|
||
|
|
||
|
InitializePMConfigStruct(&pmCurrent);
|
||
|
ReadRegConfigSet(hWndDlg, &pmCurrent, lpszRemoteComputer, lpszConfigSetName);
|
||
|
|
||
|
return (0 == memcmp(&pmCurrent, lpPMConfig, sizeof(PMSETTINGS)));
|
||
|
}
|
||
|
|
||
|
/**************************************************************************
|
||
|
|
||
|
ReadRegConfigSetNames
|
||
|
|
||
|
Get back a list of config set names on a local or remote machine.
|
||
|
Caller is responsible for calling free() on the returned pointer.
|
||
|
|
||
|
When this function returns TRUE, lppszConfigSetNames will either
|
||
|
contain NULL or a string containing the NULL delimited config set
|
||
|
names on the given computer.
|
||
|
|
||
|
When this function returns FALSE, *lppszConfigSetNames will not
|
||
|
be modified.
|
||
|
|
||
|
**************************************************************************/
|
||
|
BOOL ReadRegConfigSetNames
|
||
|
(
|
||
|
HWND hWndDlg,
|
||
|
LPTSTR lpszRemoteComputer,
|
||
|
LPTSTR* lppszConfigSetNames
|
||
|
)
|
||
|
{
|
||
|
BOOL bReturn;
|
||
|
HKEY hklm = NULL;
|
||
|
HKEY hkeyConfigSets = NULL;
|
||
|
DWORD dwIndex;
|
||
|
DWORD dwNumSubKeys;
|
||
|
DWORD dwMaxKeyNameLen;
|
||
|
TCHAR achKeyName[MAX_PATH];
|
||
|
ULONGLONG ullAllocSize;
|
||
|
LPTSTR lpszConfigSetNames;
|
||
|
LPTSTR lpszCur;
|
||
|
|
||
|
// Open the Passport Regkey ( either locally or remotly
|
||
|
if (lpszRemoteComputer && (TEXT('\0') != lpszRemoteComputer[0]))
|
||
|
{
|
||
|
//
|
||
|
// Attempt to connect to the HKEY_LOCAL_MACHINE of the remote computer.
|
||
|
// If this fails, assume that the computer doesn't exist or doesn't have
|
||
|
// the registry server running.
|
||
|
//
|
||
|
switch (RegConnectRegistry(lpszRemoteComputer,
|
||
|
HKEY_LOCAL_MACHINE,
|
||
|
&hklm))
|
||
|
{
|
||
|
|
||
|
case ERROR_SUCCESS:
|
||
|
break;
|
||
|
|
||
|
case ERROR_ACCESS_DENIED:
|
||
|
ReportError(hWndDlg, IDS_CONNECTACCESSDENIED);
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
|
||
|
default:
|
||
|
ReportError(hWndDlg, IDS_CONNECTBADNAME);
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hklm = HKEY_LOCAL_MACHINE;
|
||
|
}
|
||
|
|
||
|
if (ERROR_SUCCESS != RegOpenKeyEx(hklm,
|
||
|
g_szPassportSites,
|
||
|
0,
|
||
|
KEY_ALL_ACCESS,
|
||
|
&hkeyConfigSets))
|
||
|
{
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
if (ERROR_SUCCESS != RegQueryInfoKey(hkeyConfigSets,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
&dwNumSubKeys,
|
||
|
&dwMaxKeyNameLen,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
NULL))
|
||
|
{
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Nothing to do!
|
||
|
//
|
||
|
|
||
|
if(dwNumSubKeys == 0)
|
||
|
{
|
||
|
bReturn = TRUE;
|
||
|
*lppszConfigSetNames = NULL;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
// Too big? BUGBUG - We should make sure we check for this
|
||
|
// When writing out config sets.
|
||
|
ullAllocSize = UInt32x32To64(dwNumSubKeys, dwMaxKeyNameLen);
|
||
|
if(ullAllocSize & 0xFFFFFFFF00000000)
|
||
|
{
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
// This should allocate more space than we need.
|
||
|
lpszConfigSetNames = (LPTSTR)malloc(((dwNumSubKeys * (dwMaxKeyNameLen + 1)) + 1) * sizeof(TCHAR));
|
||
|
if(lpszConfigSetNames == NULL)
|
||
|
{
|
||
|
bReturn = FALSE;
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
// Read all names into the buffer. Names are NULL delimited and
|
||
|
// two NULLs end the entire thing.
|
||
|
dwIndex = 0;
|
||
|
lpszCur = lpszConfigSetNames;
|
||
|
while (ERROR_SUCCESS == RegEnumKey(hkeyConfigSets, dwIndex++, achKeyName, sizeof(achKeyName)))
|
||
|
{
|
||
|
_tcscpy(lpszCur, achKeyName);
|
||
|
lpszCur = _tcschr(lpszCur, TEXT('\0')) + 1;
|
||
|
}
|
||
|
|
||
|
*lpszCur = TEXT('\0');
|
||
|
|
||
|
*lppszConfigSetNames = lpszConfigSetNames;
|
||
|
bReturn = TRUE;
|
||
|
|
||
|
Cleanup:
|
||
|
|
||
|
if(hklm)
|
||
|
RegCloseKey(hklm);
|
||
|
if(hkeyConfigSets)
|
||
|
RegCloseKey(hkeyConfigSets);
|
||
|
|
||
|
return bReturn;
|
||
|
}
|