Leaked source code of windows server 2003
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.
 
 
 
 
 
 

468 lines
12 KiB

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright (c) 1997-1999 Microsoft Corporation
/**********************************************************************/
#include "precomp.h"
#include "NSPage.h"
#include "resource.h"
#include "CHString1.h"
#include "wbemerror.h"
#include "RootSecPage.h"
#include "ErrorSecPage.h"
#include "DataSrc.h"
#include "WMIHelp.h"
#include <cominit.h>
#include <stdio.h>
const static DWORD nsPageHelpIDs[] = { // Context Help IDs
IDC_NS_PARA, -1,
IDC_NSTREE, IDH_WMI_CTRL_SECURITY_NAMESPACE_BOX,
IDC_PROPERTIES, IDH_WMI_CTRL_SECURITY_SECURITY_BUTTON,
0, 0
};
//-------------------------------------------------------------------------
CNamespacePage::CNamespacePage(DataSource *ds, bool htmlSupport) :
CUIHelpers(ds, &(ds->m_rootThread), htmlSupport),
m_HWNDAlcui(0)
{
m_connected = false;
m_hSelectedItem = 0;
}
//-------------------------------------------------------------------------
CNamespacePage::~CNamespacePage(void)
{
if(m_HWNDAlcui)
{
FreeLibrary(m_HWNDAlcui);
m_HWNDAlcui = NULL;
}
}
//---------------------------------------------------------------------------
void CNamespacePage::InitDlg(HWND hDlg)
{
m_hDlg = hDlg;
m_DS->SetControlHandles(GetDlgItem(hDlg,IDC_ENUM_STATIC),GetDlgItem(hDlg,IDC_CANCEL_ENUM));
Refresh(m_hDlg);
}
//---------------------------------------------------------------------------
typedef HPROPSHEETPAGE (WINAPI *CREATEPAGE_PROC) (LPSECURITYINFO);
HPROPSHEETPAGE CNamespacePage::CreateSecurityPage(struct NSNODE *node)
/* CWbemServices &ns,
_bstr_t path,
_bstr_t display)
*/
{
HPROPSHEETPAGE hPage = NULL;
// NOTE: (si == NULL) means the target is pre-M3 (RootSecStyle).
ISecurityInformation *si = m_DS->GetSI(node);
// NS_MethodStyle on NT....this is full ACL security.
if(si != NULL)
{
// try to load aclui.
if(m_HWNDAlcui == NULL)
{
m_HWNDAlcui = LoadLibrary(_T("aclui.dll"));
}
// client has a aclui
if(m_HWNDAlcui != NULL)
{
// create aclui with full si.
CREATEPAGE_PROC createPage = (CREATEPAGE_PROC)GetProcAddress(m_HWNDAlcui, "CreateSecurityPage");
if(createPage)
{
si->AddRef();
hPage = createPage(si);
}
else
{
// couldnt get the exported routines.
CErrorSecurityPage *pPage = new CErrorSecurityPage(IDS_NO_CREATE_SEC);
hPage = pPage->CreatePropSheetPage(MAKEINTRESOURCE(IDD_SEC_ERROR));
}
}
else // no editor dude. Upgrade the client to atleast nt4sp4.
{
// cant run aclui from here.
CErrorSecurityPage *pPage = NULL;
if(IsNT())
{
pPage = new CErrorSecurityPage(IDS_NO_ACLUI);
}
else
{
pPage = new CErrorSecurityPage(IDS_NO_98TONT_SEC);
}
if(pPage)
{
hPage = pPage->CreatePropSheetPage(MAKEINTRESOURCE(IDD_SEC_ERROR));
}
}
}
/* else // not new NT
{
// RootSecStyle on 9x or NT (basically pre-M3 on anything)
if(m_DS->IsAncient())
{
// must use internal editor for schema security.
CRootSecurityPage *pPage = new CRootSecurityPage( ns,
CPrincipal::RootSecStyle, path,
m_htmlSupport,
m_DS->m_OSType);
hPage = pPage->CreatePropSheetPage(MAKEINTRESOURCE(IDD_9XSEC));
}
else // NS_MethodStyle on 9x...
{
// must use internal editor for schema security.
CRootSecurityPage *pPage = new CRootSecurityPage(ns, CPrincipal::NS_MethodStyle, path,
m_htmlSupport,
m_DS->m_OSType);
hPage = pPage->CreatePropSheetPage(MAKEINTRESOURCE(IDD_9XSEC));
}
}
*/
return hPage;
}
//--------------------------------------------------------------------
void CNamespacePage::OnProperties(HWND hDlg)
{
HPROPSHEETPAGE hPage;
UINT cPages = 0;
BOOL bResult = FALSE;
// get the selected item.
HWND treeHWND = GetDlgItem(hDlg, IDC_NSTREE);
TV_ITEM item;
item.mask = TVIF_PARAM;
if(!m_hSelectedItem)
{
m_hSelectedItem = TreeView_GetRoot(treeHWND);
TreeView_SelectItem(treeHWND,m_hSelectedItem);
}
item.hItem = m_hSelectedItem;
BOOL x = TreeView_GetItem(treeHWND, &item);
if ( FALSE == x )
return;
struct NSNODE *node = ((ITEMEXTRA *)item.lParam)->nsNode;
//TreeView_SelectItem(TreeView_GetRoot(treeHWND))
/* _bstr_t relName(node->fullPath);
// WARNING: [5] ignores the 'root\' part cuz this call is relative to
// the 'root' namespace anyway. If the root name changes length, this
// assumption will break.
CWbemServices ns;
_bstr_t tempName = m_DS->m_whackedMachineName;
if(tempName.length() > 0)
{
tempName += L"\\";
}
tempName += relName;
if(m_DS->IsAncient())
{
ns = m_DS->RootSecNS();
tempName += L"\\security";
// VERY WIERD HACK: if I dont 'exercise' it here, it will hang later on
// when connected to a wmi 698 build.
IEnumWbemClassObject *users = NULL;
HRESULT hr = ns.CreateInstanceEnum(L"__NTLMUser", 0, &users);
users->Release();
users = 0;
}
else
{
ns.ConnectServer(tempName, m_DS->GetCredentials());
}
*/ // - - - - - - - - - - - - - - - -
// build the sheet.
// if((bool)ns)
// {
hPage = CreateSecurityPage(node);
if(hPage)
{
// Build dialog title string
TCHAR szTitle[MAX_PATH + 20] = {0};
LoadString(_Module.GetModuleInstance(), IDS_NS_PROP_TITLE,
szTitle, ARRAYSIZE(szTitle));
struct NSNODE *node = ((ITEMEXTRA *)item.lParam)->nsNode;
if(node)
{
lstrcat(szTitle, node->fullPath);
}
PROPSHEETHEADER psh = {0};
psh.dwSize = sizeof(psh);
psh.dwFlags = PSH_DEFAULT;
psh.hwndParent = hDlg;
psh.hInstance = _Module.GetModuleInstance();
psh.pszCaption = szTitle;
psh.nPages = 1;
psh.nStartPage = 0;
psh.phpage = &hPage;
bResult = (BOOL)(PropertySheet(&psh) + 1);
}
// }
}
//---------------------------------------------------------------------------
void CNamespacePage::Refresh(HWND hDlg)
{
if(m_DS && m_DS->IsNewConnection(&m_sessionID))
{
// 9x machines cant manage security on NT machines.
bool is9xToNT = (IsNT() == false) && (m_DS->m_OSType == OSTYPE_WINNT);
EnableWindow(GetDlgItem(hDlg, IDC_NSTREE), !is9xToNT);
EnableWindow(GetDlgItem(hDlg, IDC_PROPERTIES), !is9xToNT);
CHString1 para;
if(is9xToNT)
{
para.LoadString(IDS_NO_98TONT_SEC);
SetWindowText(GetDlgItem(hDlg, IDC_NS_PARA), para);
return; // early.
}
else
{
para.LoadString(IDS_NS_PARA);
SetWindowText(GetDlgItem(hDlg, IDC_NS_PARA), para);
}
CHString1 initMsg;
if(m_DS->m_rootThread.m_status == WbemServiceThread::ready)
{
HWND hTree = GetDlgItem(hDlg, IDC_NSTREE);
TreeView_DeleteAllItems(hTree);
m_DS->DeleteAllNodes();
// bool hideMfls = false; //TODO
m_NSflag = SHOW_ALL;
// old targets only use the the root node for security.
if(m_DS->IsAncient())
{
m_NSflag = ROOT_ONLY;
// TODO: hide the 'hide mfls' checkbox. Moot point on old targets.
}
// else if(hideMfls)
// {
// m_NSflag = DataSource::HIDE_SOME;
// }
m_DS->LoadImageList(hTree);
m_DS->LoadNode(hTree, TVI_ROOT, m_NSflag);
}
else
{
::EnableWindow(GetDlgItem(hDlg, IDC_NSTREE), FALSE);
::EnableWindow(GetDlgItem(hDlg, IDC_PROPERTIES), FALSE);
} //endif ServiceIsReady()
}
}
//------------------------------------------------------------------------
void CNamespacePage::OnApply(HWND hDlg, bool bClose)
{
::SendMessage(GetParent(hDlg), PSM_UNCHANGED, (WPARAM)hDlg, 0L);
}
//------------------------------------------------------------------------
BOOL CNamespacePage::DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HWND hTree = GetDlgItem(hDlg,IDC_NSTREE);
struct NSNODE *node;
LPNMTREEVIEW pnm = (LPNMTREEVIEW)lParam;
TCHAR strTemp[1024];
switch(uMsg)
{
case WM_INITDIALOG:
// OutputDebugString(_T("Inside InitDialog!!!!\n"));
InitDlg(hDlg);
break;
case WM_ASYNC_CIMOM_CONNECTED:
if(!m_connected)
{
m_connected = true;
Refresh(hDlg);
}
break;
case WM_NOTIFY:
{
if(pnm->hdr.code == NM_CUSTOMDRAW)
{
LPNMTREEVIEW pnm = (LPNMTREEVIEW)lParam;
LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam;
switch(lplvcd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT :
SetWindowLong(hDlg,DWLP_MSGRESULT,CDRF_NOTIFYITEMDRAW);
return CDRF_NOTIFYITEMDRAW;
break;
case CDDS_ITEMPREPAINT:
{
if(lplvcd->nmcd.uItemState != CDIS_SELECTED)
{
ITEMEXTRA *pExtra = (ITEMEXTRA *)lplvcd->nmcd.lItemlParam;
node = pExtra->nsNode;
if(node->sType == TYPE_DYNAMIC_CLASS)
{
lplvcd->clrText = RGB(128,128,128);
SetWindowLong(hDlg,DWLP_MSGRESULT,CDRF_NEWFONT);
return CDRF_NEWFONT;
}
}
break;
}
case CDDS_SUBITEM | CDDS_ITEMPREPAINT :
{
if(lplvcd->nmcd.uItemState != CDIS_SELECTED)
{
node = (struct NSNODE *)lplvcd->nmcd.lItemlParam;
if(node->sType == TYPE_DYNAMIC_CLASS)
{
lplvcd->clrText = RGB(128,128,128);
SetWindowLong(hDlg,DWLP_MSGRESULT,CDRF_NEWFONT);
return CDRF_NEWFONT;
}
}
break;
}
default:
// _stprintf(strTemp,_T("*********************** Default : %x *****************\n"),lplvcd->nmcd.dwDrawStage);
// OutputDebugString(strTemp);
break;
}
}
else
{
switch(((LPNMHDR)lParam)->code)
{
// TODO: this one's more complex.
case PSN_SETACTIVE:
Refresh(hDlg);
break;
case PSN_HELP:
HTMLHelper(hDlg);
break;
case PSN_APPLY:
OnApply(hDlg, (((LPPSHNOTIFY)lParam)->lParam == 1));
break;
case TVN_SELCHANGED:
if(((LPNMHDR)lParam)->idFrom == IDC_NSTREE)
{
ITEMEXTRA *extra;
// remember the selection change for OnProperties()
LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam;
m_hSelectedItem = pnmtv->itemNew.hItem;
extra = (ITEMEXTRA *)pnmtv->itemNew.lParam;
if((extra->nsNode->sType == TYPE_STATIC_CLASS) ||
(extra->nsNode->sType == TYPE_DYNAMIC_CLASS) ||
(extra->nsNode->sType == TYPE_SCOPE_CLASS))
{
//Disable the Security Button
EnableWindow(GetDlgItem(hDlg,IDC_PROPERTIES),FALSE);
}
else
{
//In all other cases,enable the Security Button
EnableWindow(GetDlgItem(hDlg,IDC_PROPERTIES),TRUE);
}
}
break;
case TVN_ITEMEXPANDING:
if(((LPNMHDR)lParam)->idFrom == IDC_NSTREE)
{
// expand the node.
LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam;
if(pnmtv->action == TVE_EXPAND)
{
HWND hTree = GetDlgItem(hDlg, IDC_NSTREE);
m_DS->LoadNode(hTree, pnmtv->itemNew.hItem, m_NSflag);
}
}
break;
}
}
}
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_PROPERTIES:
if(HIWORD(wParam) == BN_CLICKED)
{
OnProperties(hDlg);
SetFocus(GetDlgItem(hDlg, IDC_NSTREE));
}
break;
case IDC_CANCEL_ENUM:
{
m_DS->CancelAllAsyncCalls();
break;
}
default: break;
};
break;
case WM_HELP:
if (IsWindowEnabled(hDlg))
{
WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle,
c_HelpFile,
HELP_WM_HELP,
(ULONG_PTR)nsPageHelpIDs);
}
break;
case WM_CONTEXTMENU:
if (IsWindowEnabled(hDlg))
{
WinHelp(hDlg, c_HelpFile,
HELP_CONTEXTMENU,
(ULONG_PTR)nsPageHelpIDs);
}
break;
default:
return FALSE;
}
return TRUE;
}