WindowsXP-SP1/admin/snapin/dnsmgr/delegwiz.cpp
2020-09-30 16:53:49 +02:00

410 lines
12 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: delegwiz.cpp
//
//--------------------------------------------------------------------------
#include "preDNSsn.h"
#include <SnapBase.h>
#include "resource.h"
#include "dnsutil.h"
#include "DNSSnap.h"
#include "snapdata.h"
#include "server.h"
#include "domain.h"
#include "record.h"
#include "zone.h"
#include "delegwiz.h"
#ifdef DEBUG_ALLOCATOR
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#endif
///////////////////////////////////////////////////////////////////////////////
// CDNSDelegationWiz_StartPropertyPage
CDNSDelegationWiz_StartPropertyPage::CDNSDelegationWiz_StartPropertyPage()
: CPropertyPageBase(IDD_DELEGWIZ_START)
{
InitWiz97(TRUE, 0,0);
}
BOOL CDNSDelegationWiz_StartPropertyPage::OnInitDialog()
{
CPropertyPageBase::OnInitDialog();
SetBigBoldFont(m_hWnd, IDC_STATIC_WELCOME);
return TRUE;
}
BOOL CDNSDelegationWiz_StartPropertyPage::OnSetActive()
{
// need at least one record in the page to finish
GetHolder()->SetWizardButtonsFirst(TRUE);
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// CDNSDelegationWiz_DomainNamePropertyPage
BEGIN_MESSAGE_MAP(CDNSDelegationWiz_DomainNamePropertyPage, CPropertyPageBase)
ON_EN_CHANGE(IDC_NEW_DOMAIN_NAME_EDIT, OnChangeDomainNameEdit)
END_MESSAGE_MAP()
CDNSDelegationWiz_DomainNamePropertyPage::CDNSDelegationWiz_DomainNamePropertyPage()
: CPropertyPageBase(IDD_DELEGWIZ_DOMAIN_NAME)
{
InitWiz97(FALSE, IDS_DELEGWIZ_DOMAIN_NAME_TITLE,IDS_DELEGWIZ_DOMAIN_NAME_SUBTITLE);
}
BOOL CDNSDelegationWiz_DomainNamePropertyPage::OnInitDialog()
{
CPropertyPageBase::OnInitDialog();
CDNSDelegationWizardHolder* pHolder = (CDNSDelegationWizardHolder*)GetHolder();
m_nUTF8ParentLen = UTF8StringLen(pHolder->GetDomainNode()->GetFullName());
CWnd* pWnd = GetDlgItem(IDC_NEW_DOMAIN_FQDN);
CString szText;
PCWSTR pszFullName = pHolder->GetDomainNode()->GetFullName();
if (pszFullName && pszFullName[0] == L'.')
{
szText = pszFullName;
}
else if (pszFullName)
{
szText.Format(_T(".%s"), pszFullName);
}
pWnd->SetWindowText(szText);
return TRUE;
}
void CDNSDelegationWiz_DomainNamePropertyPage::OnChangeDomainNameEdit()
{
CDNSDelegationWizardHolder* pHolder = (CDNSDelegationWizardHolder*)GetHolder();
DWORD dwNameChecking = pHolder->GetDomainNode()->GetZoneNode()->GetServerNode()->GetNameCheckFlag();
//
// Get the name from the control
//
GetDomainEdit()->GetWindowText(m_szDomainName);
//
// Trim spaces
//
m_szDomainName.TrimLeft();
m_szDomainName.TrimRight();
//
// Construct the FQDN
//
CString szText;
PCWSTR pszFullName = pHolder->GetDomainNode()->GetFullName();
if (pszFullName && pszFullName[0] == L'.')
{
szText.Format(_T("%s%s"), m_szDomainName, pszFullName);
}
else if (pszFullName)
{
szText.Format(_T("%s.%s"), m_szDomainName, pszFullName);
}
//
// Enable next button if it is a valid name
//
BOOL bIsValidName = (0 == ValidateDnsNameAgainstServerFlags(szText,
DnsNameDomain,
dwNameChecking));
GetHolder()->SetWizardButtonsMiddle(bIsValidName);
//
// Set the FQDN in the control
//
CWnd* pWnd = GetDlgItem(IDC_NEW_DOMAIN_FQDN);
pWnd->SetWindowText(szText);
}
BOOL CDNSDelegationWiz_DomainNamePropertyPage::OnSetActive()
{
//
// Retrieve server flags
//
CDNSDelegationWizardHolder* pHolder = (CDNSDelegationWizardHolder*)GetHolder();
DWORD dwNameChecking = pHolder->GetDomainNode()->GetZoneNode()->GetServerNode()->GetNameCheckFlag();
//
// Construct the FQDN
//
CString szText;
szText.Format(_T("%s.%s"), m_szDomainName, pHolder->GetDomainNode()->GetFullName());
//
// Enable next button if it is a valid name
//
BOOL bIsValidName = (0 == ValidateDnsNameAgainstServerFlags(szText,
DnsNameDomain,
dwNameChecking));
//
// Set the next button if its a valid name
//
GetHolder()->SetWizardButtonsMiddle(bIsValidName);
return TRUE;
}
BOOL CDNSDelegationWiz_DomainNamePropertyPage::OnKillActive()
{
CDNSDelegationWizardHolder* pHolder = (CDNSDelegationWizardHolder*)GetHolder();
CDNSRootData* pRootData = (CDNSRootData*)pHolder->GetComponentData()->GetRootData();
ASSERT(pHolder->m_pSubdomainNode != NULL);
pHolder->GetDomainNode()->SetSubdomainName(pHolder->m_pSubdomainNode,
m_szDomainName,
pRootData->IsAdvancedView());
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// CDNSDelegationWiz_NameServersPropertyPage
CDNSDelegationWiz_NameServersPropertyPage::CDNSDelegationWiz_NameServersPropertyPage()
: CDNSNameServersPropertyPage(IDD_DELEGWIZ_NAME_SERVERS)
{
InitWiz97(FALSE, IDS_DELEGWIZ_DOMAIN_NS_TITLE,IDS_DELEGWIZ_DOMAIN_NS_SUBTITLE);
}
BOOL CDNSDelegationWiz_NameServersPropertyPage::OnSetActive()
{
// need at least one record in the page to finish
GetHolder()->SetWizardButtonsMiddle(m_listCtrl.GetItemCount() > 0);
return TRUE;
}
void CDNSDelegationWiz_NameServersPropertyPage::OnCountChange(int nCount)
{
GetHolder()->SetWizardButtonsMiddle(nCount > 0);
}
BOOL CDNSDelegationWiz_NameServersPropertyPage::CreateNewNSRecords(CDNSDomainNode* pSubdomainNode)
{
ASSERT(pSubdomainNode != NULL);
BOOL bRes = pSubdomainNode->UpdateNSRecordNodesInfo(m_pCloneInfoList, GetHolder()->GetComponentData());
if (!bRes)
return OnWriteNSRecordNodesListError();
return bRes;
}
///////////////////////////////////////////////////////////////////////////////
// CDNSDelegationWiz_FinishPropertyPage
CDNSDelegationWiz_FinishPropertyPage::CDNSDelegationWiz_FinishPropertyPage()
: CPropertyPageBase(IDD_DELEGWIZ_FINISH)
{
InitWiz97(TRUE, 0,0);
}
BOOL CDNSDelegationWiz_FinishPropertyPage::OnSetActive()
{
// need at least one record in the page to finish
GetHolder()->SetWizardButtonsLast(TRUE);
DisplaySummaryInfo();
return TRUE;
}
BOOL CDNSDelegationWiz_FinishPropertyPage::OnWizardFinish()
{
CDNSDelegationWizardHolder* pHolder = (CDNSDelegationWizardHolder*)GetHolder();
ASSERT(pHolder->IsWizardMode());
return pHolder->OnFinish();
}
void CDNSDelegationWiz_FinishPropertyPage::DisplaySummaryInfo()
{
CDNSDelegationWizardHolder* pHolder = (CDNSDelegationWizardHolder*)GetHolder();
GetDlgItem(IDC_NAME_STATIC)->SetWindowText(pHolder->m_pSubdomainNode->GetFullName());
}
///////////////////////////////////////////////////////////////////////////////
// CDNSDelegationWizardHolder
CDNSDelegationWizardHolder::CDNSDelegationWizardHolder(CDNSMTContainerNode* pContainerNode,
CDNSDomainNode* pThisDomainNode, CComponentDataObject* pComponentData)
: CPropertyPageHolderBase(pContainerNode, pThisDomainNode, pComponentData)
{
ASSERT(pComponentData != NULL);
ASSERT(pContainerNode != NULL);
ASSERT(pContainerNode == GetContainerNode());
ASSERT(pThisDomainNode != NULL);
ASSERT(pThisDomainNode == GetDomainNode());
m_bAutoDeletePages = FALSE; // we have the page as embedded member
AddPageToList((CPropertyPageBase*)&m_startPage);
AddPageToList((CPropertyPageBase*)&m_domainNamePage);
AddPageToList((CPropertyPageBase*)&m_nameServersPage);
AddPageToList((CPropertyPageBase*)&m_finishPage);
m_pSubdomainNode = GetDomainNode()->CreateSubdomainNode(/*bDelegation*/TRUE);
ASSERT(m_pSubdomainNode != NULL);
m_nameServersPage.SetDomainNode(m_pSubdomainNode);
}
CDNSDelegationWizardHolder::~CDNSDelegationWizardHolder()
{
if (m_pSubdomainNode != NULL)
delete m_pSubdomainNode;
}
CDNSDomainNode* CDNSDelegationWizardHolder::GetDomainNode()
{
return (CDNSDomainNode*)GetTreeNode();
}
BOOL CDNSDelegationWizardHolder::OnFinish()
{
ASSERT(m_pSubdomainNode != NULL);
if (m_pSubdomainNode == NULL)
{
return FALSE;
}
//
// See if a child of that name already exists
//
RECORD_SEARCH recordSearch = RECORD_NOT_FOUND;
CDNSDomainNode* pNewParentDomain = NULL;
CString szFullDomainName;
szFullDomainName = m_pSubdomainNode->GetFullName();
CString szNonExistentDomain;
recordSearch = GetDomainNode()->GetZoneNode()->DoesContain(szFullDomainName,
GetComponentData(),
&pNewParentDomain,
szNonExistentDomain,
TRUE);
if (recordSearch == RECORD_NOT_FOUND && pNewParentDomain != NULL)
{
//
// first create the subdomain in the server and UI
//
DNS_STATUS err = pNewParentDomain->CreateSubdomain(m_pSubdomainNode, GetComponentData());
if (err != 0)
{
DNSErrorDialog(err, IDS_MSG_DELEGWIZ_SUBDOMAIN_FAILED);
}
else
{
//
// mark the node as enumerated and force transition to "loaded"
//
m_pSubdomainNode->MarkEnumeratedAndLoaded(GetComponentData());
//
// then create the NS records underneath
//
BOOL bSuccess = m_nameServersPage.CreateNewNSRecords(m_pSubdomainNode);
if (!bSuccess)
DNSErrorDialog(-1, IDS_MSG_DELEGWIZ_NS_RECORD_FAILED);
m_pSubdomainNode = NULL; // relinquish ownership
}
}
else if (recordSearch == NON_EXISTENT_SUBDOMAIN && pNewParentDomain != NULL)
{
//
// first create the subdomain in the server and UI
//
DNS_STATUS err = m_pSubdomainNode->Create();
if (err != 0)
{
DNSErrorDialog(err, IDS_MSG_DELEGWIZ_SUBDOMAIN_FAILED);
return FALSE;
}
else
{
//
// then create the NS records underneath
//
BOOL bSuccess = m_nameServersPage.CreateNewNSRecords(m_pSubdomainNode);
if (!bSuccess)
{
DNSErrorDialog(-1, IDS_MSG_DELEGWIZ_NS_RECORD_FAILED);
return FALSE;
}
ASSERT(!szNonExistentDomain.IsEmpty());
if (!szNonExistentDomain.IsEmpty())
{
//
// Create the first subdomain because the current domain is already enumerated
// so we have to start the remaining enumeration at the new subdomain that is needed
//
CDNSDomainNode* pSubdomainNode = pNewParentDomain->CreateSubdomainNode();
ASSERT(pSubdomainNode != NULL);
CDNSRootData* pRootData = (CDNSRootData*)GetComponentData()->GetRootData();
pNewParentDomain->SetSubdomainName(pSubdomainNode, szNonExistentDomain, pRootData->IsAdvancedView());
VERIFY(pNewParentDomain->AddChildToListAndUISorted(pSubdomainNode, GetComponentData()));
GetComponentData()->SetDescriptionBarText(pNewParentDomain);
//
// I don't care what the results of this are, I am just using it
// to do the expansion to the new record
//
recordSearch = pSubdomainNode->GetZoneNode()->DoesContain(szFullDomainName,
GetComponentData(),
&pNewParentDomain,
szNonExistentDomain,
TRUE);
}
//
// mark the node as enumerated and force transition to "loaded"
//
m_pSubdomainNode->MarkEnumeratedAndLoaded(GetComponentData());
m_pSubdomainNode = NULL; // relinquish ownership
}
}
else if (recordSearch == RECORD_NOT_FOUND_AT_THE_NODE)
{
DNSMessageBox(IDS_MSG_DELEGWIZ_SUDOMAIN_EXISTS);
return FALSE;
}
else
{
}
return TRUE;
}