|
|
/*****************************************************************************\
* 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;
}
|