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.
 
 
 
 
 
 

254 lines
6.3 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation 1996-2001.
//
// File: addobj.cpp
//
// Contents: implementation of CAddObject
//
//----------------------------------------------------------------------------
#include "stdafx.h"
#include "wsecmgr.h"
#include "attr.h"
#include "resource.h"
#include "snapmgr.h"
#include "util.h"
#include <accctrl.h>
#include "servperm.h"
#include "AddObj.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAddObject dialog
CAddObject::CAddObject(SE_OBJECT_TYPE SeType, LPTSTR ObjName, BOOL bIsContainer, CWnd* pParent)
: CHelpDialog(a197HelpIDs, IDD, pParent)
{
//{{AFX_DATA_INIT(CAddObject)
m_radConfigPrevent = 0;
m_radInheritOverwrite = 0;
//}}AFX_DATA_INIT
m_pfnCreateDsPage=NULL;
m_pSI=NULL;
m_pNewSD=NULL;
m_NewSeInfo = 0;
m_Status=0;
m_SeType=SeType;
m_ObjName=ObjName;
m_bIsContainer = bIsContainer;
m_hwndACL = NULL;
}
void CAddObject::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAddObject)
DDX_Radio(pDX, IDC_CONFIG, m_radConfigPrevent);
DDX_Radio(pDX, IDC_INHERIT, m_radInheritOverwrite);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAddObject, CHelpDialog)
//{{AFX_MSG_MAP(CAddObject)
ON_BN_CLICKED(IDC_SECURITY, OnTemplateSecurity)
ON_BN_CLICKED(IDC_CONFIG, OnConfig)
ON_BN_CLICKED(IDC_PREVENT, OnPrevent)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAddObject message handlers
void CAddObject::OnTemplateSecurity()
{
INT_PTR nRet = 0;
if( ::IsWindow( m_hwndACL ) )
return;
if ( SE_DS_OBJECT == m_SeType )
{
if ( !m_pfnCreateDsPage )
{
if (!g_hDsSecDll)
g_hDsSecDll = LoadLibrary(TEXT("dssec.dll")); //This is safe usage.
if ( g_hDsSecDll)
{
m_pfnCreateDsPage = (PFNDSCREATEISECINFO)GetProcAddress(g_hDsSecDll,
"DSCreateISecurityInfoObject");
}
}
if ( m_pfnCreateDsPage ) {
m_hwndACL = (HWND)MyCreateDsSecurityPage(&m_pSI, m_pfnCreateDsPage,
&m_pNewSD, &m_NewSeInfo,
(LPCTSTR)m_ObjName,
CONFIG_SECURITY_PAGE,
GetSafeHwnd()
);
} else
nRet = -1;
} else {
m_hwndACL = (HWND)MyCreateSecurityPage2(m_bIsContainer, &m_pNewSD, &m_NewSeInfo,
(LPCTSTR)m_ObjName,
m_SeType,
CONFIG_SECURITY_PAGE,
GetSafeHwnd(),
FALSE // not modeless
);
}
if ( (HWND)-1 == m_hwndACL ) {
CString str;
str.LoadString(IDS_CANT_ASSIGN_SECURITY);
AfxMessageBox(str);
} else if ( !m_pNewSD ) {
//
// if m_pNewSD is still NULL, create a new one for everyone Full control
//
DWORD SDSize;
if (SE_REGISTRY_KEY == m_SeType) {
GetDefaultRegKeySecurity(&m_pNewSD,&m_NewSeInfo);
} else {
GetDefaultFileSecurity(&m_pNewSD,&m_NewSeInfo);
}
}
}
BOOL CAddObject::OnInitDialog()
{
CDialog::OnInitDialog();
SetDlgItemText(IDC_TITLE,m_ObjName);
if (SE_REGISTRY_KEY == m_SeType) {
CString str;
str.LoadString(IDS_REGISTRY_CONFIGURE);
SetDlgItemText(IDC_CONFIG,str);
str.LoadString(IDS_REGISTRY_APPLY);
SetDlgItemText(IDC_OVERWRITE,str);
str.LoadString(IDS_REGISTRY_INHERIT);
SetDlgItemText(IDC_INHERIT,str);
str.LoadString(IDS_REGISTRY_PREVENT);
SetDlgItemText(IDC_PREVENT,str);
}
if (1 == m_radConfigPrevent) {
OnPrevent();
} else {
OnConfig();
}
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CAddObject::OnOK()
{
UpdateData(TRUE);
if ( !m_pNewSD ) {
CString str;
str.LoadString(IDS_SECURITY_REQUIRED);
AfxMessageBox(str);
return;
}
switch (m_radConfigPrevent) {
case 0:
// config
switch(m_radInheritOverwrite) {
case 0:
// inherit
m_Status = SCE_STATUS_CHECK;
break;
case 1:
// overwrite
m_Status = SCE_STATUS_OVERWRITE;
break;
}
break;
case 1:
// prevent
m_Status = SCE_STATUS_IGNORE;
break;
}
if ( m_pSI ) {
m_pSI->Release();
m_pSI = NULL;
}
m_pfnCreateDsPage=NULL;
CDialog::OnOK();
}
void CAddObject::OnCancel()
{
if ( m_pNewSD ) {
LocalFree(m_pNewSD);
m_pNewSD = NULL;
}
m_NewSeInfo = 0;
if ( m_pSI ) {
m_pSI->Release();
m_pSI = NULL;
}
m_pfnCreateDsPage=NULL;
CDialog::OnCancel();
}
void CAddObject::OnConfig()
{
CWnd *pRadio = GetDlgItem(IDC_INHERIT);
if (pRadio)
pRadio->EnableWindow(TRUE);
pRadio = GetDlgItem(IDC_OVERWRITE);
if (pRadio)
pRadio->EnableWindow(TRUE);
pRadio = GetDlgItem(IDC_SECURITY); //Raid #501901, #501891
if (pRadio) {
pRadio->EnableWindow(TRUE);
}
}
void CAddObject::OnPrevent()
{
CWnd *pRadio = GetDlgItem(IDC_INHERIT);
if (pRadio) {
pRadio->EnableWindow(FALSE);
}
pRadio = GetDlgItem(IDC_OVERWRITE);
if (pRadio) {
pRadio->EnableWindow(FALSE);
}
pRadio = GetDlgItem(IDC_SECURITY); //Raid #501901, #501891
if (pRadio) {
pRadio->EnableWindow(FALSE);
}
}