|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation 1996-2001.
//
// File: aright.cpp
//
// Contents: implementation of CAttrRight
//
//----------------------------------------------------------------------------
#include "stdafx.h"
#include "wsecmgr.h"
#include "snapmgr.h"
#include "attr.h"
#include "util.h"
#include "chklist.h"
#include "ARight.h"
#include "getuser.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
/////////////////////////////////////////////////////////////////////////////
// CAttrRight dialog
CAttrRight::CAttrRight() : CAttribute(IDD), m_pMergeList(NULL), m_bDirty(false)
{ //{{AFX_DATA_INIT(CAttrRight)
//}}AFX_DATA_INIT
m_pHelpIDs = (DWORD_PTR)a191HelpIDs; m_uTemplateResID = IDD; }
CAttrRight::~CAttrRight() { if ( m_pMergeList ) { SceFreeMemory(m_pMergeList, SCE_STRUCT_NAME_STATUS_LIST); m_pMergeList = NULL; } }
void CAttrRight::DoDataExchange(CDataExchange* pDX) { CAttribute::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAttrRight)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAttrRight, CAttribute) //{{AFX_MSG_MAP(CAttrRight)
ON_BN_CLICKED(IDC_ADD, OnAdd) //}}AFX_MSG_MAP
ON_NOTIFY(CLN_CLICK, IDC_RIGHTS, OnClickCheckBox) END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAttrRight message handlers
void CAttrRight::Initialize(CResult * pData) { CAttribute::Initialize(pData);
//
// The default for Not configured is false.
//
PSCE_PRIVILEGE_ASSIGNMENT pInspect, pTemplate; PSCE_NAME_LIST pnlTemplate=NULL,pnlInspect=NULL;
pTemplate = (PSCE_PRIVILEGE_ASSIGNMENT) m_pData->GetBase(); pInspect = (PSCE_PRIVILEGE_ASSIGNMENT) m_pData->GetSetting();
if ((LONG_PTR)ULongToPtr(SCE_NO_VALUE) == (LONG_PTR)pTemplate || !pTemplate) { m_bConfigure = FALSE; pTemplate = NULL; }
if ((LONG_PTR)ULongToPtr(SCE_NO_VALUE) == (LONG_PTR)pInspect) { pInspect = NULL; }
if ( pTemplate ) { pnlTemplate = pTemplate->AssignedTo; } if ( pInspect ) { pnlInspect = pInspect->AssignedTo; }
m_pMergeList = MergeNameStatusList(pnlTemplate, pnlInspect);
m_bDirty=false; }
BOOL CAttrRight::OnInitDialog() { CAttribute::OnInitDialog();
PSCE_NAME_STATUS_LIST pItem; HWND hCheckList; LRESULT nItem;
pItem = m_pMergeList; hCheckList = ::GetDlgItem(m_hWnd,IDC_RIGHTS); ::SendMessage(hCheckList,CLM_RESETCONTENT, 0, 0); RECT rAnal; LONG lWidth;
GetDlgItem(IDC_ANALYZED_SETTING_STATIC)->GetWindowRect(&rAnal); // lWidth = rAnal.right - rAnal.left / 2;
lWidth = 64;
::SendMessage(hCheckList,CLM_SETCOLUMNWIDTH,0,lWidth);
while (pItem) { // Store the name of the item in the item data so we can retrieve it later
nItem = ::SendMessage(hCheckList,CLM_ADDITEM,(WPARAM) pItem->Name,(LPARAM) pItem->Name); ::SendMessage(hCheckList,CLM_SETSTATE,MAKELONG(nItem,1), ((pItem->Status & MERGED_TEMPLATE) ? CLST_CHECKED : CLST_UNCHECKED)); ::SendMessage(hCheckList,CLM_SETSTATE,MAKELONG(nItem,2), ((pItem->Status & MERGED_INSPECT) ? CLST_CHECKDISABLED : CLST_DISABLED)); pItem = pItem->Next; }
AddUserControl( IDC_RIGHTS ); AddUserControl( IDC_ADD ); OnConfigure(); return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CAttrRight::OnApply() { if ( !m_bReadOnly ) //Raid #388710, #471660, #471653, Yang Gao
{ PEDITTEMPLATE pet = NULL; CWnd *pCheckList = GetDlgItem(IDC_RIGHTS); if ( !pCheckList ) { return FALSE; } UpdateData(TRUE);
int iItem; PSCE_NAME_STATUS_LIST pIndex; PSCE_NAME_LIST pTemplate=NULL; PSCE_NAME_LIST pInspect=NULL; PSCE_NAME_LIST pTemp = NULL; DWORD status; DWORD misMatch = SCE_STATUS_GOOD;
pIndex = m_pMergeList; iItem = 0; HRESULT hr=S_OK; PSCE_PROFILE_INFO pspi = (PSCE_PROFILE_INFO)m_pData->GetBaseProfile(); //
// should not change the list for last inspection
// only change the base
//
if( m_bConfigure ){ while (pIndex) { if (pCheckList->SendMessage(CLM_GETSTATE,MAKELONG(iItem,1)) & CLST_CHECKED) {
if ( !(pIndex->Status & MERGED_TEMPLATE) ) m_bDirty = true;
if ( SCESTATUS_SUCCESS != SceAddToNameList(&pTemplate, pIndex->Name, lstrlen(pIndex->Name))) { hr = E_FAIL; break; } } else if ( pIndex->Status & MERGED_TEMPLATE ) { m_bDirty = true; } pIndex = pIndex->Next; iItem++; } }
status = ERROR_SUCCESS; if ( SUCCEEDED(hr) ) {
PSCE_PRIVILEGE_ASSIGNMENT pSetting,pBasePriv; LPTSTR szPrivName=NULL;
//
// Get privilege rights from the CResult item.
//
pBasePriv = (PSCE_PRIVILEGE_ASSIGNMENT) (m_pData->GetBase()); if(pBasePriv == (PSCE_PRIVILEGE_ASSIGNMENT)ULongToPtr(SCE_NO_VALUE) ){ pBasePriv = NULL; } pSetting = (PSCE_PRIVILEGE_ASSIGNMENT) (m_pData->GetSetting()); if(pSetting == (PSCE_PRIVILEGE_ASSIGNMENT)ULongToPtr(SCE_NO_VALUE) ){ pSetting = NULL; }
if(!m_bConfigure){ //
// If not configured then
misMatch = SCE_STATUS_NOT_CONFIGURED; if(pBasePriv) { status = m_pSnapin->UpdateAnalysisInfo( m_pData, TRUE, &pBasePriv ); if(pSetting){ pSetting->Status = SCE_STATUS_NOT_CONFIGURED; } m_bDirty = TRUE; } } else { if ( pSetting ) { szPrivName = pSetting->Name; }
if ( !pBasePriv ) { status = m_pSnapin->UpdateAnalysisInfo( m_pData, FALSE, &pBasePriv, szPrivName ); } if ( pSetting ) { //
// Check mismatch
//
if ( !SceCompareNameList(pTemplate, pSetting->AssignedTo) ) { pSetting->Status = SCE_STATUS_MISMATCH; } else { pSetting->Status = SCE_STATUS_GOOD; } misMatch = pSetting->Status; } else { // else should NEVER occur
misMatch = SCE_STATUS_MISMATCH; } }
//
// Set mismatch status of the result item.
//
if(misMatch != (DWORD)m_pData->GetStatus()){ m_pData->SetStatus(misMatch); m_bDirty = TRUE; }
if(status != ERROR_SUCCESS){ hr = E_FAIL; } else if ( pBasePriv ) {
pTemp = pBasePriv->AssignedTo; pBasePriv->AssignedTo = pTemplate; pTemplate = NULL; m_bDirty = TRUE;
SceFreeMemory(pTemp,SCE_STRUCT_NAME_LIST); //
// update dirty flag
//
if(m_pData->GetBaseProfile()){ m_pData->GetBaseProfile()->SetDirty( AREA_PRIVILEGES ); } } } // failed
SceFreeMemory(pTemplate,SCE_STRUCT_NAME_LIST);
if ( FAILED(hr) ) { CString str; str.LoadString(IDS_SAVE_FAILED); m_bDirty = FALSE; AfxMessageBox(str); } if (m_bDirty) { m_pData->Update(m_pSnapin); } }
return CAttribute::OnApply(); }
void CAttrRight::OnCancel() { if ( m_pMergeList ) SceFreeMemory(m_pMergeList,SCE_STRUCT_NAME_STATUS_LIST); m_pMergeList = NULL;
//
// Should not call base class
//
//CAttribute::OnCancel();
DestroyWindow(); }
void CAttrRight::OnAdd() { CGetUser gu; HRESULT hr=S_OK;
if (gu.Create(GetSafeHwnd(),SCE_SHOW_SCOPE_ALL|SCE_SHOW_DIFF_MODE_OFF_DC| SCE_SHOW_USERS | SCE_SHOW_LOCALGROUPS | SCE_SHOW_GLOBAL | SCE_SHOW_WELLKNOWN | SCE_SHOW_BUILTIN)) { CWnd *pCheckList; PSCE_NAME_STATUS_LIST pList,pLast=NULL; LRESULT iItem; bool bFound;
pCheckList = GetDlgItem(IDC_RIGHTS);
PSCE_NAME_LIST pName = gu.GetUsers(); while (pName) { if ( pName->Name ) { pList = m_pMergeList; pLast = NULL; iItem = 0;
bFound = false; while (pList) { // If so, then make sure its "Template" box is checked
if (lstrcmp(pList->Name,pName->Name) == 0) { if (!(pCheckList->SendMessage(CLM_GETSTATE,MAKELONG(iItem,1)) & CLST_CHECKED)) { m_bDirty = true; pCheckList->SendMessage(CLM_SETSTATE,MAKELONG(iItem,1),CLST_CHECKED); } bFound = true; break; } pLast = pList; pList = pList->Next; iItem++; }
// Otherwise add it both to m_pMerged and to the CheckList
if (!bFound) {
PSCE_NAME_STATUS_LIST pNewNode;
pNewNode = (PSCE_NAME_STATUS_LIST)LocalAlloc(0,sizeof(SCE_NAME_STATUS_LIST)); if ( pNewNode ) {
pNewNode->Name = (LPTSTR)LocalAlloc(0, (lstrlen(pName->Name)+1)*sizeof(TCHAR)); if ( pNewNode->Name ) { // This may not be a safe usage. pNewNode->Name is PWSTR, using WCHAR instead of TCHAR. Consider fix.
lstrcpy(pNewNode->Name, pName->Name); pNewNode->Next = NULL; pNewNode->Status = MERGED_TEMPLATE; } else { LocalFree(pNewNode); pNewNode = NULL; } } if ( pNewNode ) { if ( pLast ) { pLast->Next = pNewNode; } else { m_pMergeList = pNewNode; } pLast = pNewNode;
iItem = pCheckList->SendMessage(CLM_ADDITEM,(WPARAM)pLast->Name,(LPARAM)pLast->Name); pCheckList->SendMessage(CLM_SETSTATE,MAKELONG(iItem,1),CLST_CHECKED); pCheckList->SendMessage(CLM_SETSTATE,MAKELONG(iItem,2),CLST_DISABLED); m_bDirty = true;
} else { hr = E_OUTOFMEMORY; ASSERT(FALSE); break; } } } pName = pName->Next; } }
if (m_bDirty) { SetModified(TRUE); }
if ( FAILED(hr) ) { CString str; str.LoadString(IDS_CANT_ADD_USER); AfxMessageBox(str); } }
void CAttrRight::OnClickCheckBox(NMHDR *pNM, LRESULT *pResult) //Raid #396108, 5/17/2001
{ SetModified(TRUE); }
|