|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1997 - 2002
//
// File: simdata.cpp
//
//--------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////
// SimData.cpp - Implementation of Security Identity Mapping
//
// HISTORY
// 23-Jun-97 t-danm Creation.
/////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "common.h"
#include "dsutil.h"
#include "helpids.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
/////////////////////////////////////////////////////////////////////
TCHAR szSchemaSim[] = _T("altSecurityIdentities"); // per Murlis 6/16/98
/////////////////////////////////////////////////////////////////////
void CSimEntry::SetString(CString& rstrData) { m_strData = rstrData; LPCTSTR pszT = (LPCTSTR)rstrData; if (_wcsnicmp(szX509, pszT, wcslen (szX509)) == 0) { m_eDialogTarget = eX509; } else if (_wcsnicmp(szKerberos, pszT, wcslen (szKerberos)) == 0) { m_eDialogTarget = eKerberos; } else { m_eDialogTarget = eOther; TRACE1("INFO: Unknown string type \"%s\".\n", pszT); } } // CSimEntry::SetString()
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
CSimData::CSimData() : m_hwndParent (0) { m_fIsDirty = FALSE; m_pSimEntryList = NULL; m_paPage1 = new CSimX509PropPage; m_paPage1->m_pData = this; m_paPage2 = new CSimKerberosPropPage; m_paPage2->m_pData = this; #ifdef _DEBUG
m_paPage3 = new CSimOtherPropPage; m_paPage3->m_pData = this; #endif
}
CSimData::~CSimData() { delete m_paPage1; delete m_paPage2; #ifdef _DEBUG
delete m_paPage3; #endif
FlushSimList(); }
/////////////////////////////////////////////////////////////////////
void CSimData::FlushSimList() { // Delete the list
CSimEntry * pSimEntry = m_pSimEntryList; while (pSimEntry != NULL) { CSimEntry * pSimEntryT = pSimEntry; pSimEntry = pSimEntry->m_pNext; delete pSimEntryT; } m_pSimEntryList = NULL; }
/////////////////////////////////////////////////////////////////////
BOOL CSimData::FInit(CString strUserPath, CString strADsIPath, HWND hwndParent) { m_hwndParent = hwndParent; m_strUserPath = strUserPath; m_strADsIPath = strADsIPath;
if (!FQuerySimData()) { ReportErrorEx (hwndParent,IDS_SIM_ERR_CANNOT_READ_SIM_DATA,S_OK, MB_OK | MB_ICONERROR, NULL, 0); return FALSE; } return TRUE; }
/////////////////////////////////////////////////////////////////////
// Return FALSE if some data could not be written.
// Otherwise return TRUE.
BOOL CSimData::FOnApply(HWND hwndParent) { if (!m_fIsDirty) return TRUE;
HRESULT hr = FUpdateSimData (); if ( FAILED (hr) ) { ReportErrorEx (hwndParent, IDS_SIM_ERR_CANNOT_WRITE_SIM_DATA, hr, MB_OK | MB_ICONERROR, NULL, 0); return FALSE; } // Re-load the data
(void)FQuerySimData();
// We have successfully written all the data
m_fIsDirty = FALSE; // Clear the dirty bit
return TRUE; }
/////////////////////////////////////////////////////////////////////
void CSimData::GetUserAccountName(OUT CString * pstrName) { ASSERT(pstrName != NULL); *pstrName = m_strUserPath; }
/////////////////////////////////////////////////////////////////////
// Query the database for the list of security identities.
//
// Return FALSE if an error occured.
//
BOOL CSimData::FQuerySimData() { CWaitCursor wait; FlushSimList();
HRESULT hr; IADs * pADs = NULL; hr = DSAdminOpenObject(m_strADsIPath, IID_IADs, OUT (void **)&pADs, TRUE /*bServer*/); if (FAILED(hr)) { ASSERT(pADs == NULL); return FALSE; } ASSERT(pADs != NULL); CComVariant vtData; // Read data from database
hr = pADs->Get (CComBSTR (szSchemaSim), OUT &vtData); if (FAILED(hr)) { if (hr == E_ADS_PROPERTY_NOT_FOUND) hr = S_OK; } else { CStringList stringlist; hr = HrVariantToStringList(IN vtData, OUT stringlist); if (FAILED(hr)) goto End; POSITION pos = stringlist.GetHeadPosition(); while (pos != NULL) { (void)PAddSimEntry(stringlist.GetNext(INOUT pos)); } // while
} // if...else
End: if (pADs != NULL) pADs->Release(); return SUCCEEDED(hr); } // FQuerySimData()
/////////////////////////////////////////////////////////////////////
// Update the list of security identities to the database.
//
// Return FALSE if an error occured.
//
HRESULT CSimData::FUpdateSimData() { CWaitCursor wait; IADs * pADs = NULL; HRESULT hr = DSAdminOpenObject(m_strADsIPath, IID_IADs, OUT (void **)&pADs, TRUE /*bServer*/); if (FAILED(hr)) { ASSERT(pADs == NULL); // NTRAID# 448521 dsa.msc: Name Mapping Dlg: Buttons do nothing (and
// other UI oddness) if an object is moved from "under" dlg
// return FALSE;
return hr; } ASSERT(pADs != NULL);
// Build the string list
CStringList stringlist; for (const CSimEntry * pSimEntry = m_pSimEntryList; pSimEntry != NULL; pSimEntry = pSimEntry->m_pNext) { switch (pSimEntry->m_eDialogTarget) { case eNone: ASSERT(FALSE && "Invalid Data"); case eNil: case eOther: continue; } // switch
stringlist.AddHead(pSimEntry->PchGetString()); } // for
CComVariant vtData; hr = HrStringListToVariant(OUT vtData, IN stringlist); if ( SUCCEEDED (hr) ) { // Put data back to database
hr = pADs->Put (CComBSTR (szSchemaSim), IN vtData); if ( SUCCEEDED (hr) ) { // Persist the data (write to database)
hr = pADs->SetInfo(); } }
if (pADs != NULL) pADs->Release(); return hr; } // FUpdateSimData()
/////////////////////////////////////////////////////////////////////
// Allocate a new CSimEntry node to the linked list
//
CSimEntry * CSimData::PAddSimEntry(CString& rstrData) { CSimEntry * pSimEntry = new CSimEntry; if (pSimEntry) { pSimEntry->SetString(rstrData); pSimEntry->m_pNext = m_pSimEntryList; } m_pSimEntryList = pSimEntry; return pSimEntry; }
/////////////////////////////////////////////////////////////////////
void CSimData::DeleteSimEntry(CSimEntry * pSimEntryDelete) { CSimEntry * p = m_pSimEntryList; CSimEntry * pPrev = NULL; while (p != NULL) { if (p == pSimEntryDelete) { if (pPrev == NULL) { ASSERT(pSimEntryDelete == m_pSimEntryList); m_pSimEntryList = p->m_pNext; } else { pPrev->m_pNext = p->m_pNext; } delete pSimEntryDelete; return; } pPrev = p; p = p->m_pNext; } TRACE0("ERROR: CSimData::DeleteSimEntry() - Node not found.\n"); } // DeleteSimEntry()
/////////////////////////////////////////////////////////////////////
void CSimData::AddEntriesToListview(HWND hwndListview, DIALOG_TARGET_ENUM eDialogTarget) { CSimEntry * pSimEntry = m_pSimEntryList; while (pSimEntry != NULL) { if (pSimEntry->m_eDialogTarget == eDialogTarget) { ListView_AddString(hwndListview, pSimEntry->PchGetString()); } pSimEntry = pSimEntry->m_pNext; }
} // AddEntriesToListview()
/////////////////////////////////////////////////////////////////////
void CSimData::DoModal() { CThemeContextActivator activator;
CWnd parentWnd;
VERIFY (parentWnd.Attach (m_hwndParent));
CSimPropertySheet ps(IDS_SIM_SECURITY_IDENTITY_MAPPING, &parentWnd);
ps.AddPage(m_paPage1); ps.AddPage(m_paPage2); #ifdef _DEBUG
ps.AddPage(m_paPage3); #endif
(void)ps.DoModal();
parentWnd.Detach (); }
/////////////////////////////////////////////////////////////////////////////
// CSimPropertySheet
IMPLEMENT_DYNAMIC(CSimPropertySheet, CPropertySheet)
CSimPropertySheet::CSimPropertySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(nIDCaption, pParentWnd, iSelectPage) { }
CSimPropertySheet::CSimPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage) :CPropertySheet(pszCaption, pParentWnd, iSelectPage) { }
CSimPropertySheet::~CSimPropertySheet() { }
BEGIN_MESSAGE_MAP(CSimPropertySheet, CPropertySheet) //{{AFX_MSG_MAP(CSimPropertySheet)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
ON_MESSAGE(WM_HELP, OnHelp) END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSimPropertySheet message handlers
BOOL CSimPropertySheet::OnInitDialog() { BOOL bResult = CPropertySheet::OnInitDialog(); DWORD dwStyle = GetWindowLong (m_hWnd, GWL_STYLE); dwStyle |= DS_CONTEXTHELP; SetWindowLong (m_hWnd, GWL_STYLE, dwStyle);
DWORD dwExStyle = GetWindowLong (m_hWnd, GWL_EXSTYLE); dwExStyle |= WS_EX_CONTEXTHELP; SetWindowLong (m_hWnd, GWL_EXSTYLE, dwExStyle); return bResult; }
BOOL CSimPropertySheet::OnHelp(WPARAM /*wParam*/, LPARAM lParam) { const LPHELPINFO pHelpInfo = (LPHELPINFO)lParam; if (pHelpInfo && pHelpInfo->iContextType == HELPINFO_WINDOW) { DoContextHelp ((HWND) pHelpInfo->hItemHandle); }
return TRUE; }
void CSimPropertySheet::DoContextHelp (HWND hWndControl) { const int IDC_COMM_APPLYNOW = 12321; const int IDH_COMM_APPLYNOW = 28447; const DWORD aHelpIDs_PropSheet[]= { IDC_COMM_APPLYNOW, IDH_COMM_APPLYNOW, 0, 0 };
if ( !::WinHelp ( hWndControl, IDC_COMM_APPLYNOW == ::GetDlgCtrlID (hWndControl) ? L"windows.hlp" : DSADMIN_CONTEXT_HELP_FILE, HELP_WM_HELP, (DWORD_PTR) aHelpIDs_PropSheet) ) { TRACE1 ("WinHelp () failed: 0x%x\n", GetLastError ()); } }
|