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.
615 lines
14 KiB
615 lines
14 KiB
/*****************************************************************************\
|
|
* MODULE: config.cxx
|
|
*
|
|
* The module contains class to manage connection configurations
|
|
*
|
|
* Copyright (C) 2000 Microsoft Corporation
|
|
*
|
|
* History:
|
|
* 05/12/00 Weihaic Created
|
|
*
|
|
\*****************************************************************************/
|
|
#include "precomp.h"
|
|
#include "priv.h"
|
|
|
|
CPortConfigData::CPortConfigData():
|
|
m_bValid (TRUE),
|
|
m_pUserName (NULL),
|
|
m_pPassword (NULL),
|
|
m_dwAuthMethod (AUTH_UNKNOWN),
|
|
m_bIgnoreSecurityDlg (FALSE)
|
|
|
|
{
|
|
}
|
|
|
|
CPortConfigData::CPortConfigData(
|
|
LPCTSTR pUserName,
|
|
LPCTSTR pPassword):
|
|
m_bValid (FALSE),
|
|
m_pUserName (NULL),
|
|
m_pPassword (NULL),
|
|
m_dwAuthMethod (AUTH_UNKNOWN),
|
|
m_bIgnoreSecurityDlg (FALSE)
|
|
{
|
|
if (AssignString (m_pUserName, pUserName) &&
|
|
AssignString (m_pPassword, pPassword))
|
|
m_bValid = TRUE;
|
|
}
|
|
|
|
CPortConfigData::~CPortConfigData()
|
|
{
|
|
LocalFree (m_pUserName);
|
|
LocalFree (m_pPassword);
|
|
}
|
|
|
|
BOOL
|
|
CPortConfigData::SetUserName (
|
|
LPCTSTR pUserName)
|
|
{
|
|
BOOL bRet = FALSE;
|
|
if (m_bValid) {
|
|
bRet = AssignString(m_pUserName, pUserName);
|
|
}
|
|
return bRet;
|
|
}
|
|
|
|
BOOL
|
|
CPortConfigData::SetPassword (
|
|
LPCTSTR pPassword)
|
|
{
|
|
BOOL bRet = FALSE;
|
|
if (m_bValid) {
|
|
bRet = AssignString (m_pPassword, pPassword);
|
|
}
|
|
return bRet;
|
|
}
|
|
|
|
|
|
BOOL
|
|
CPortConfigData::SetAuthMethod (
|
|
DWORD dwAuthMethod)
|
|
{
|
|
BOOL bRet = FALSE;
|
|
if (m_bValid) {
|
|
m_dwAuthMethod = dwAuthMethod;
|
|
bRet = TRUE;
|
|
}
|
|
return bRet;
|
|
}
|
|
|
|
|
|
extern HKEY
|
|
GetClientUserHandle(
|
|
IN REGSAM samDesired
|
|
);
|
|
|
|
CPortConfigDataMgr::CPortConfigDataMgr (
|
|
LPCTSTR pszPortName):
|
|
m_bValid (FALSE),
|
|
m_pszPortName (NULL)
|
|
{
|
|
if (AssignString (m_pszPortName, pszPortName)) {
|
|
m_bValid = TRUE;
|
|
}
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Delete everyone's personal setting for the http printer
|
|
|
|
|
|
Return Value:
|
|
|
|
--*/
|
|
BOOL
|
|
CPortConfigDataMgr::DeleteAllSettings (
|
|
VOID)
|
|
{
|
|
BOOL bRet = FALSE;
|
|
WCHAR szKey[MAX_PATH];
|
|
DWORD cchKey;
|
|
DWORD i;
|
|
FILETIME ftLastWriteTime;
|
|
DWORD dwError;
|
|
static LPWSTR szDotDefault = L".Default";
|
|
HANDLE hToken;
|
|
|
|
if (hToken = RevertToPrinterSelf()) {
|
|
|
|
|
|
//
|
|
// Go through all keys and fix them up.
|
|
//
|
|
for (i=0; TRUE; i++) {
|
|
|
|
cchKey = COUNTOF(szKey);
|
|
|
|
dwError = RegEnumKeyEx(HKEY_USERS,
|
|
i,
|
|
szKey,
|
|
&cchKey,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
&ftLastWriteTime);
|
|
|
|
if (dwError != ERROR_SUCCESS)
|
|
break;
|
|
|
|
if (!_wcsicmp(szKey, szDotDefault) || wcschr(szKey, L'_'))
|
|
continue;
|
|
|
|
DeletePerUserSettings (szKey);
|
|
|
|
}
|
|
DeletePerPortSettings ();
|
|
|
|
bRet = ImpersonatePrinterClient(hToken);
|
|
}
|
|
return bRet;
|
|
}
|
|
|
|
|
|
BOOL
|
|
CPortConfigDataMgr::GetPortSettings (
|
|
HKEY hkPath,
|
|
CPortConfigData* pConfigData) CONST
|
|
{
|
|
LONG lStat;
|
|
HKEY hkPortNames;
|
|
HKEY hkThisPortName;
|
|
BOOL bRet = FALSE;
|
|
DWORD dwType;
|
|
DWORD dwSize;
|
|
DWORD dwAuthMethod;
|
|
PBYTE pbData = NULL;
|
|
|
|
//
|
|
// Open registry key for Provider-Name.
|
|
//
|
|
lStat = RegOpenKeyEx(hkPath, g_szRegPorts, 0, KEY_READ, &hkPortNames);
|
|
|
|
if (lStat == ERROR_SUCCESS) {
|
|
|
|
lStat = RegOpenKeyEx(hkPortNames, m_pszPortName, 0, KEY_READ, &hkThisPortName);
|
|
|
|
if (lStat == ERROR_SUCCESS) {
|
|
|
|
dwType = REG_DWORD;
|
|
dwSize = sizeof (dwAuthMethod);
|
|
|
|
lStat = RegQueryValueEx (hkThisPortName, g_szAuthMethod, 0, &dwType, (LPBYTE) &dwAuthMethod, &dwSize);
|
|
|
|
if (lStat == ERROR_SUCCESS && dwType == REG_DWORD) {
|
|
|
|
switch (dwAuthMethod)
|
|
{
|
|
case AUTH_ANONYMOUS:
|
|
case AUTH_NT:
|
|
case AUTH_OTHER:
|
|
break;
|
|
|
|
default:
|
|
//
|
|
// If the register is messed up because of upgrade,
|
|
// we set it to anonymous by default.
|
|
//
|
|
dwAuthMethod = AUTH_ANONYMOUS;
|
|
break;
|
|
}
|
|
|
|
pConfigData->SetAuthMethod (dwAuthMethod);
|
|
|
|
//
|
|
// Read the user name from the registry.
|
|
//
|
|
if (SUCCEEDED(SafeRegQueryValueAsStringPointer(hkThisPortName,
|
|
g_szUserName,
|
|
reinterpret_cast<PWSTR *>(&pbData),
|
|
0))) {
|
|
|
|
pConfigData->SetUserName(reinterpret_cast<LPCTSTR>(pbData));
|
|
}
|
|
|
|
FreeSplMem(pbData);
|
|
|
|
//
|
|
// Read the password from the registry.
|
|
//
|
|
dwType = REG_BINARY;
|
|
dwSize = 0;
|
|
|
|
lStat = RegQueryValueEx (hkThisPortName, g_szPassword, 0, &dwType, NULL, &dwSize);
|
|
|
|
if (lStat == ERROR_SUCCESS && dwType == REG_BINARY) {
|
|
|
|
pbData = new BYTE [dwSize];
|
|
|
|
lStat = RegQueryValueEx (hkThisPortName, g_szPassword, 0, &dwType, pbData, &dwSize);
|
|
|
|
if (lStat == ERROR_SUCCESS) {
|
|
|
|
LPTSTR pPassword;
|
|
DWORD dwPasswordSize;
|
|
|
|
//
|
|
// Decrypt the password
|
|
//
|
|
if (DecryptData (pbData, dwSize, (PBYTE *)&pPassword, &dwPasswordSize)) {
|
|
|
|
pConfigData->SetPassword (pPassword);
|
|
}
|
|
}
|
|
|
|
delete [] pbData;
|
|
}
|
|
|
|
bRet = TRUE;
|
|
}
|
|
|
|
RegCloseKey (hkThisPortName);
|
|
|
|
} else {
|
|
|
|
SetLastError(lStat);
|
|
}
|
|
|
|
RegCloseKey(hkPortNames);
|
|
|
|
} else {
|
|
|
|
SetLastError(lStat);
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|
|
BOOL
|
|
CPortConfigDataMgr::SetPortSettings (
|
|
HKEY hkPath,
|
|
CPortConfigData &ConfigData)
|
|
{
|
|
LONG lStat;
|
|
HKEY hkPortNames;
|
|
HKEY hkThisPortName;
|
|
BOOL bRet = FALSE;
|
|
|
|
lStat = RegCreateKeyEx(hkPath,
|
|
g_szRegPorts,
|
|
0,
|
|
NULL,
|
|
0,
|
|
KEY_WRITE,
|
|
NULL,
|
|
&hkPortNames,
|
|
NULL);
|
|
|
|
if (lStat == ERROR_SUCCESS) {
|
|
|
|
|
|
lStat = RegCreateKeyEx(hkPortNames,
|
|
m_pszPortName,
|
|
0,
|
|
NULL,
|
|
0,
|
|
KEY_WRITE,
|
|
NULL,
|
|
&hkThisPortName,
|
|
NULL);
|
|
|
|
if (lStat == ERROR_SUCCESS) {
|
|
|
|
DWORD dwAuthMethod = ConfigData.GetAuthMethod ();
|
|
|
|
lStat = RegSetValueEx(hkThisPortName,
|
|
g_szAuthMethod,
|
|
0,
|
|
REG_DWORD,
|
|
(LPBYTE)&dwAuthMethod,
|
|
sizeof (dwAuthMethod));
|
|
|
|
bRet = (lStat == ERROR_SUCCESS ? TRUE : FALSE);
|
|
|
|
|
|
if (lStat == ERROR_SUCCESS) {
|
|
|
|
LPCTSTR pUserName = ConfigData.GetUserName ();
|
|
LPCTSTR pPassword = ConfigData.GetPassword ();
|
|
|
|
if (pUserName) {
|
|
|
|
lStat = RegSetValueEx(hkThisPortName,
|
|
g_szUserName,
|
|
0,
|
|
REG_SZ,
|
|
(LPBYTE) pUserName,
|
|
sizeof (TCHAR) * (1 + lstrlen (pUserName)));
|
|
} else
|
|
lStat = RegDeleteValue (hkThisPortName, g_szUserName);
|
|
|
|
if (pPassword) {
|
|
|
|
LPBYTE pEncryptedPassword;
|
|
DWORD dwEncryptedSize;
|
|
|
|
if (EncryptData ((PBYTE) pPassword,
|
|
sizeof (TCHAR) * (lstrlen (pPassword) + 1),
|
|
&pEncryptedPassword,
|
|
&dwEncryptedSize)) {
|
|
|
|
lStat = RegSetValueEx(hkThisPortName,
|
|
g_szPassword,
|
|
0,
|
|
REG_BINARY,
|
|
pEncryptedPassword,
|
|
dwEncryptedSize);
|
|
}
|
|
else
|
|
lStat = GetLastError ();
|
|
|
|
} else
|
|
lStat = RegDeleteValue (hkThisPortName, g_szPassword);
|
|
|
|
bRet = TRUE;
|
|
|
|
}
|
|
|
|
RegCloseKey(hkThisPortName);
|
|
}
|
|
|
|
RegCloseKey(hkPortNames);
|
|
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|
|
BOOL
|
|
CPortConfigDataMgr::SetPerPortSettings (
|
|
CPortConfigData &ConfigData)
|
|
{
|
|
LONG lStat;
|
|
HKEY hkPath;
|
|
BOOL bRet = FALSE;
|
|
HANDLE hToken;
|
|
|
|
if (hToken = RevertToPrinterSelf()) {
|
|
|
|
|
|
lStat = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
|
|
g_szRegProvider,
|
|
0,
|
|
NULL,
|
|
0,
|
|
KEY_WRITE,
|
|
NULL,
|
|
&hkPath,
|
|
NULL);
|
|
|
|
if (lStat == ERROR_SUCCESS) {
|
|
|
|
bRet = SetPortSettings (hkPath, ConfigData);
|
|
|
|
RegCloseKey (hkPath);
|
|
|
|
}
|
|
|
|
|
|
if (!ImpersonatePrinterClient(hToken))
|
|
bRet = FALSE;
|
|
}
|
|
|
|
|
|
return bRet;
|
|
}
|
|
|
|
BOOL
|
|
CPortConfigDataMgr::SetPerUserSettings (
|
|
CPortConfigData &ConfigData)
|
|
{
|
|
LONG lStat;
|
|
HKEY hkPath;
|
|
HKEY hkPortNames;
|
|
HKEY hkCurUser;
|
|
BOOL bRet = FALSE;
|
|
|
|
|
|
|
|
hkCurUser = GetClientUserHandle (KEY_WRITE);
|
|
|
|
if (hkCurUser) {
|
|
|
|
lStat = RegCreateKeyEx(hkCurUser,
|
|
g_szPerUserPath,
|
|
0,
|
|
NULL,
|
|
0,
|
|
KEY_WRITE,
|
|
NULL,
|
|
&hkPath,
|
|
NULL);
|
|
|
|
if (lStat == ERROR_SUCCESS) {
|
|
|
|
bRet = SetPortSettings (hkPath, ConfigData);
|
|
|
|
RegCloseKey (hkPath);
|
|
}
|
|
|
|
RegCloseKey (hkCurUser);
|
|
}
|
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
|
BOOL
|
|
CPortConfigDataMgr::GetPerPortSettings (
|
|
CPortConfigData* pConfigData) CONST
|
|
{
|
|
LONG lStat;
|
|
HKEY hkPath;
|
|
BOOL bRet = FALSE;
|
|
|
|
HANDLE hToken;
|
|
|
|
if (hToken = RevertToPrinterSelf()) {
|
|
|
|
|
|
lStat = RegOpenKeyEx(HKEY_LOCAL_MACHINE, g_szRegProvider, 0, KEY_READ, &hkPath);
|
|
|
|
if (lStat == ERROR_SUCCESS) {
|
|
|
|
bRet = GetPortSettings (hkPath, pConfigData);
|
|
|
|
RegCloseKey (hkPath);
|
|
|
|
}
|
|
|
|
if (!ImpersonatePrinterClient(hToken))
|
|
bRet = FALSE;
|
|
}
|
|
|
|
|
|
return bRet;
|
|
}
|
|
|
|
BOOL
|
|
CPortConfigDataMgr::GetPerUserSettings (
|
|
CPortConfigData* pConfigData) CONST
|
|
{
|
|
LONG lStat;
|
|
HKEY hkPath;
|
|
HKEY hkCurUser;
|
|
BOOL bRet = FALSE;
|
|
|
|
hkCurUser = GetClientUserHandle (KEY_WRITE);
|
|
|
|
if (hkCurUser) {
|
|
|
|
lStat = RegOpenKeyEx(hkCurUser, g_szPerUserPath, 0, KEY_READ, &hkPath);
|
|
|
|
if (lStat == ERROR_SUCCESS) {
|
|
|
|
bRet = GetPortSettings (hkPath, pConfigData);
|
|
|
|
RegCloseKey (hkPath);
|
|
}
|
|
|
|
RegCloseKey (hkCurUser);
|
|
}
|
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
BOOL
|
|
CPortConfigDataMgr::GetCurrentSettings (
|
|
CPortConfigData* pConfigData) CONST
|
|
{
|
|
BOOL bRet = FALSE;
|
|
|
|
bRet = GetPerUserSettings (pConfigData);
|
|
|
|
if (!bRet) {
|
|
bRet = GetPerPortSettings (pConfigData);
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
CPortConfigDataMgr::DeleteSettings (
|
|
HKEY hkPath)
|
|
{
|
|
LONG lStat;
|
|
HKEY hkPortNames;
|
|
BOOL bRet = FALSE;
|
|
|
|
lStat = RegOpenKeyEx(hkPath,
|
|
g_szRegPorts,
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hkPortNames);
|
|
|
|
if (lStat == ERROR_SUCCESS) {
|
|
|
|
lStat = RegDeleteKey(hkPortNames,
|
|
m_pszPortName);
|
|
|
|
RegCloseKey(hkPortNames);
|
|
|
|
bRet = (lStat == ERROR_SUCCESS ? TRUE : FALSE);
|
|
|
|
} else {
|
|
|
|
DBG_MSG(DBG_LEV_ERROR, (TEXT("RegOpenKeyEx (%s) failed: Error = %d"), g_szRegPorts, lStat));
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|
|
|
|
BOOL
|
|
CPortConfigDataMgr::DeletePerPortSettings (
|
|
VOID)
|
|
{
|
|
LONG lStat;
|
|
HKEY hkPath;
|
|
HKEY hkPortNames;
|
|
BOOL bRet = FALSE;
|
|
|
|
lStat = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
|
g_szRegProvider,
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hkPath);
|
|
|
|
if (lStat == ERROR_SUCCESS) {
|
|
|
|
bRet = DeleteSettings (hkPath);
|
|
RegCloseKey(hkPath);
|
|
|
|
} else {
|
|
|
|
DBG_MSG(DBG_LEV_ERROR, (TEXT("RegOpenKeyEx (%s) failed: Error = %d"), g_szRegProvider, lStat));
|
|
}
|
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
BOOL
|
|
CPortConfigDataMgr::DeletePerUserSettings (
|
|
LPTSTR pUser)
|
|
|
|
{
|
|
LONG lStat;
|
|
HKEY hkPath;
|
|
HKEY hkCurUser;
|
|
BOOL bRet = FALSE;
|
|
|
|
lStat = RegOpenKeyEx( HKEY_USERS, pUser, 0,KEY_ALL_ACCESS, &hkCurUser);
|
|
|
|
if (lStat == ERROR_SUCCESS) {
|
|
|
|
lStat = RegOpenKeyEx(hkCurUser, g_szPerUserPath, 0, KEY_ALL_ACCESS, &hkPath);
|
|
|
|
if (lStat == ERROR_SUCCESS) {
|
|
|
|
bRet = DeleteSettings (hkPath);
|
|
|
|
RegCloseKey (hkPath);
|
|
}
|
|
|
|
RegCloseKey (hkCurUser);
|
|
}
|
|
|
|
return bRet;
|
|
|
|
}
|