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.
399 lines
11 KiB
399 lines
11 KiB
/**********************************************************************/
|
|
/** Microsoft Windows/NT **/
|
|
/** Copyright (c) 1997-1999 Microsoft Corporation
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
|
|
PAGEBASE.CPP
|
|
|
|
This file contains the implementation of the CBasePage base class.
|
|
|
|
*/
|
|
|
|
#include "precomp.h"
|
|
#include "pagebase.h"
|
|
#include "ServiceThread.h"
|
|
#include "resource.h"
|
|
#include <commctrl.h>
|
|
#include "DataSrc.h"
|
|
#include <commdlg.h>
|
|
#include <cominit.h>
|
|
//#include <afxres.h>
|
|
#include "WMIHelp.h"
|
|
|
|
#ifdef SNAPIN
|
|
const TCHAR c_HelpFile2[] = _T("newfeat1.hlp");
|
|
#else
|
|
const TCHAR c_HelpFile2[] = _T("WbemCntl.hlp");
|
|
#endif
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
CBasePage::CBasePage(DataSource *ds, WbemServiceThread *serviceThread) :
|
|
m_DS(ds),
|
|
m_userCancelled(false),
|
|
m_hDlg(NULL),
|
|
m_alreadyAsked(false),
|
|
m_service(NULL),
|
|
g_serviceThread(serviceThread)
|
|
{
|
|
if((g_serviceThread != 0) &&
|
|
g_serviceThread->m_status == WbemServiceThread::ready)
|
|
{
|
|
m_WbemServices = g_serviceThread->m_WbemServices;
|
|
m_WbemServices.GetServices(&m_service);
|
|
m_WbemServices.SetBlanket(m_service);
|
|
}
|
|
if (m_DS)
|
|
{
|
|
m_DS->AddRef();
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
CBasePage::CBasePage(CWbemServices &service) :
|
|
m_DS(NULL),
|
|
m_userCancelled(false),
|
|
m_hDlg(NULL),
|
|
m_alreadyAsked(false),
|
|
m_service(NULL),
|
|
g_serviceThread(NULL)
|
|
{
|
|
m_WbemServices = service;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
CBasePage::~CBasePage( void )
|
|
{
|
|
if(m_service)
|
|
{
|
|
m_service->Release();
|
|
m_service = 0;
|
|
}
|
|
m_WbemServices.DisconnectServer();
|
|
m_alreadyAsked = false;
|
|
if (m_DS)
|
|
{
|
|
m_DS->Release();
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
HPROPSHEETPAGE CBasePage::CreatePropSheetPage(LPCTSTR pszDlgTemplate,
|
|
LPCTSTR pszDlgTitle,
|
|
DWORD moreFlags)
|
|
{
|
|
PROPSHEETPAGE psp;
|
|
|
|
psp.dwSize = sizeof(psp);
|
|
psp.dwFlags = PSP_USECALLBACK | moreFlags;
|
|
psp.hInstance = _Module.GetModuleInstance();
|
|
psp.pszTemplate = pszDlgTemplate;
|
|
psp.pszTitle = pszDlgTitle;
|
|
psp.pfnDlgProc = CBasePage::_DlgProc;
|
|
psp.lParam = (LPARAM)this;
|
|
psp.pfnCallback = CBasePage::_PSPageCallback;
|
|
|
|
if (pszDlgTitle != NULL)
|
|
psp.dwFlags |= PSP_USETITLE;
|
|
|
|
return CreatePropertySheetPage(&psp);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
UINT CBasePage::PSPageCallback(HWND hwnd,
|
|
UINT uMsg,
|
|
LPPROPSHEETPAGE ppsp)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
INT_PTR CALLBACK CBasePage::_DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
CBasePage *pThis = (CBasePage *)GetWindowLongPtr(hDlg, DWLP_USER);
|
|
|
|
// The following messages arrive before WM_INITDIALOG
|
|
// which means pThis is NULL for them. We don't need these
|
|
// messages so let DefDlgProc handle them.
|
|
//
|
|
// WM_SETFONT
|
|
// WM_NOTIFYFORMAT
|
|
// WM_NOTIFY (LVN_HEADERCREATED)
|
|
|
|
if (uMsg == WM_INITDIALOG)
|
|
{
|
|
pThis = (CBasePage *)(((LPPROPSHEETPAGE)lParam)->lParam);
|
|
SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pThis);
|
|
}
|
|
|
|
if (pThis != NULL) return pThis->DlgProc(hDlg, uMsg, wParam, lParam);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
UINT CALLBACK CBasePage::_PSPageCallback(HWND hWnd, UINT uMsg, LPPROPSHEETPAGE ppsp)
|
|
{
|
|
CBasePage *pThis = (CBasePage *)ppsp->lParam;
|
|
|
|
if (pThis)
|
|
{
|
|
UINT nResult = pThis->PSPageCallback(hWnd, uMsg, ppsp);
|
|
|
|
switch (uMsg)
|
|
{
|
|
case PSPCB_CREATE:
|
|
break;
|
|
case PSPCB_RELEASE:
|
|
ppsp->lParam = NULL;
|
|
delete pThis;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Always return non-zero or else our tab will disappear and whichever
|
|
// property page becomes active won't repaint properly. Instead, use
|
|
// the m_bAbortPage flag during WM_INITDIALOG to disable the page if
|
|
// the callback failed.
|
|
//
|
|
return 1;
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
typedef struct {
|
|
LOGIN_CREDENTIALS *credentials;
|
|
} LOGIN_CFG;
|
|
|
|
//------------------------------------------------------------------------
|
|
size_t CredentialUserLen3(LOGIN_CREDENTIALS *credentials)
|
|
{
|
|
return credentials->authIdent->UserLength;
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
void CredentialUser3(LOGIN_CREDENTIALS *credentials, LPTSTR *user)
|
|
{
|
|
bstr_t trustee = _T("");
|
|
if ((TCHAR *)trustee == NULL)
|
|
return;
|
|
|
|
if(credentials->authIdent->DomainLength > 0)
|
|
{
|
|
trustee += credentials->authIdent->Domain;
|
|
trustee += _T("\\");
|
|
trustee += credentials->authIdent->User;
|
|
}
|
|
else
|
|
{
|
|
trustee = credentials->authIdent->User;
|
|
if ((TCHAR *)trustee == NULL)
|
|
return;
|
|
}
|
|
|
|
#ifdef UNICODE
|
|
if(credentials->authIdent->Flags == SEC_WINNT_AUTH_IDENTITY_ANSI)
|
|
{
|
|
size_t size = mbstowcs(NULL, trustee, 0);
|
|
*user = new wchar_t[size+1];
|
|
if(*user != NULL)
|
|
mbstowcs(*user, trustee, size+1);
|
|
}
|
|
else // already UNICODE
|
|
{
|
|
size_t size = wcslen(trustee);
|
|
*user = new wchar_t[size+1];
|
|
if(*user != NULL)
|
|
wcscpy(*user, trustee);
|
|
}
|
|
#else
|
|
if(credentials->authIdent->Flags == SEC_WINNT_AUTH_IDENTITY_ANSI)
|
|
{
|
|
size_t size = strlen(trustee);
|
|
*user = new char[size+1];
|
|
if(*user != NULL)
|
|
strcpy(*user, (char *)trustee);
|
|
}
|
|
else // convert the UNICODE
|
|
{
|
|
size_t size = wcstombs(NULL, trustee, 0);
|
|
*user = new char[size+1];
|
|
if(*user != NULL)
|
|
wcstombs(*user, trustee, size+1);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
void SetCurrentUser2(HWND hDlg, bool currUser)
|
|
{
|
|
Button_SetCheck(GetDlgItem(hDlg, IDC_CHECKCURRENTUSER),
|
|
(currUser? BST_CHECKED:BST_UNCHECKED));
|
|
|
|
BOOL enable = (currUser? FALSE: TRUE);
|
|
|
|
::EnableWindow(GetDlgItem(hDlg, IDC_EDITUSERNAME), enable);
|
|
::EnableWindow(GetDlgItem(hDlg, IDC_EDITPASSWORD), enable);
|
|
::EnableWindow(GetDlgItem(hDlg, IDC_USER_LABEL), enable);
|
|
::EnableWindow(GetDlgItem(hDlg, IDC_PW_LABEL), enable);
|
|
|
|
}
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
const static DWORD logonHelpIDs[] = { // Context Help IDs
|
|
IDC_CHECKCURRENTUSER, IDH_WMI_CTRL_GENERAL_WMILOGIN_CHECKBOX,
|
|
IDC_USER_LABEL, IDH_WMI_CTRL_GENERAL_WMILOGIN_USERNAME,
|
|
IDC_EDITUSERNAME, IDH_WMI_CTRL_GENERAL_WMILOGIN_USERNAME,
|
|
IDC_PW_LABEL, IDH_WMI_CTRL_GENERAL_WMILOGIN_PASSWORD,
|
|
IDC_EDITPASSWORD, IDH_WMI_CTRL_GENERAL_WMILOGIN_PASSWORD,
|
|
0, 0
|
|
};
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
INT_PTR CALLBACK LoginDlgProc2(HWND hwndDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam)
|
|
{
|
|
BOOL retval = FALSE;
|
|
switch(uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{ //BEGIN
|
|
SetWindowLongPtr(hwndDlg, DWLP_USER, lParam);
|
|
LOGIN_CFG *data = (LOGIN_CFG *)GetWindowLongPtr(hwndDlg, DWLP_USER);
|
|
|
|
SetCurrentUser2(hwndDlg, data->credentials->currUser);
|
|
|
|
} //END
|
|
retval = TRUE;
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
LOGIN_CFG *data = (LOGIN_CFG *)GetWindowLongPtr(hwndDlg, DWLP_USER);
|
|
|
|
switch(LOWORD(wParam))
|
|
{
|
|
case IDC_CHECKCURRENTUSER:
|
|
{
|
|
if(HIWORD(wParam) == BN_CLICKED)
|
|
{
|
|
bool currUser = (IsDlgButtonChecked(hwndDlg, IDC_CHECKCURRENTUSER) == BST_CHECKED ?true:false);
|
|
// toggle and respond.
|
|
SetCurrentUser2(hwndDlg, currUser);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDOK:
|
|
{
|
|
if(HIWORD(wParam) == BN_CLICKED)
|
|
{
|
|
data->credentials->currUser = (IsDlgButtonChecked(hwndDlg, IDC_CHECKCURRENTUSER) == BST_CHECKED ?true:false);
|
|
|
|
if(data->credentials->currUser == false)
|
|
{
|
|
TCHAR user[100] = {0}, pw[100] = {0};
|
|
GetWindowText(GetDlgItem(hwndDlg, IDC_EDITUSERNAME), user, 100);
|
|
GetWindowText(GetDlgItem(hwndDlg, IDC_EDITPASSWORD), pw, 100);
|
|
|
|
BSTR bDomUser, bUser = NULL, bDomain = NULL, bAuth = NULL;
|
|
//#ifdef SNAPIN
|
|
wchar_t *temp = pw;
|
|
bDomUser = SysAllocString(user);
|
|
/*#else
|
|
wchar_t temp[100] = {0};
|
|
mbstowcs(temp, user, 100);
|
|
bDomUser = SysAllocString(temp);
|
|
mbstowcs(temp, pw, 100);
|
|
#endif*/
|
|
if (bDomUser != NULL &&
|
|
SUCCEEDED(DetermineLoginType(bDomain,
|
|
bUser,
|
|
bAuth,
|
|
bDomUser)))
|
|
{
|
|
if(data->credentials->authIdent != 0)
|
|
{
|
|
if(data->credentials->fullAcct)
|
|
{
|
|
data->credentials->fullAcct[0] = 0;
|
|
}
|
|
WbemFreeAuthIdentity(data->credentials->authIdent);
|
|
data->credentials->authIdent = 0;
|
|
}
|
|
|
|
if (SUCCEEDED(WbemAllocAuthIdentity(bUser,
|
|
temp,
|
|
bDomain,
|
|
&(data->credentials->authIdent))))
|
|
{
|
|
_tcscpy(data->credentials->fullAcct,
|
|
user);
|
|
}
|
|
}
|
|
}
|
|
|
|
EndDialog(hwndDlg, IDOK);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
{
|
|
if(HIWORD(wParam) == BN_CLICKED)
|
|
{
|
|
EndDialog(hwndDlg, IDCANCEL);
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return(FALSE);
|
|
} // switch
|
|
break;
|
|
} // - - - - - - - - endswitch LOWORD()
|
|
break;
|
|
|
|
case WM_HELP:
|
|
if(IsWindowEnabled(hwndDlg))
|
|
{
|
|
WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle,
|
|
c_HelpFile2,
|
|
HELP_WM_HELP,
|
|
(ULONG_PTR)logonHelpIDs);
|
|
}
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
if(IsWindowEnabled(hwndDlg))
|
|
{
|
|
WinHelp(hwndDlg, c_HelpFile2,
|
|
HELP_CONTEXTMENU,
|
|
(ULONG_PTR)logonHelpIDs);
|
|
}
|
|
break;
|
|
|
|
default: break;
|
|
} //endswitch uMsg
|
|
|
|
return retval;
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
INT_PTR CBasePage::DisplayLoginDlg(HWND hWnd,
|
|
LOGIN_CREDENTIALS *credentials)
|
|
{
|
|
LOGIN_CFG cfg;
|
|
|
|
cfg.credentials = credentials;
|
|
|
|
return DialogBoxParam(_Module.GetModuleInstance(),
|
|
MAKEINTRESOURCE(IDD_LOGIN),
|
|
hWnd, LoginDlgProc2,
|
|
(LPARAM)&cfg);
|
|
}
|
|
|