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.
 
 
 
 
 
 

415 lines
10 KiB

//+-------------------------------------------------------------------------
//
// 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 ());
}
}