mirror of https://github.com/tongzx/nt5src
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.
328 lines
11 KiB
328 lines
11 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1998 - 1998
|
|
//
|
|
// File: domain.h
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
#ifndef _DOMAIN_H
|
|
#define _DOMAIN_H
|
|
|
|
#include "dnsutil.h"
|
|
#include "record.h"
|
|
#include "domainUI.h"
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// FORWARD DECLARATIONS
|
|
|
|
class CDNSServerNode;
|
|
class CDNSRecordNodeBase;
|
|
class CDNSZoneNode;
|
|
class CDNSRootHintsNode;
|
|
class CDNS_NS_RecordNodeList;
|
|
class CDNSRecordNodeEditInfoList;
|
|
|
|
|
|
BOOL _match(LPCWSTR lpszNSName, CDNS_A_RecordNode* pARecordNode);
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// CDNSDomainQueryObj
|
|
|
|
|
|
class CDNSDomainQueryObj : public CDNSQueryObj
|
|
{
|
|
public:
|
|
CDNSDomainQueryObj(LPCTSTR lpszServerName,
|
|
LPCTSTR lpszZoneName,
|
|
DWORD dwServerVersion,
|
|
LPCTSTR lpszNodeName,
|
|
LPCTSTR lpszFullNodeName,
|
|
WORD wRecordType,
|
|
DWORD dwSelectFlags,
|
|
BOOL bIsZone,
|
|
BOOL bReverse,
|
|
BOOL bCache,
|
|
BOOL bAdvancedView)
|
|
: CDNSQueryObj(bAdvancedView, dwServerVersion)
|
|
{
|
|
m_szServerName = lpszServerName;
|
|
m_szZoneName = lpszZoneName;
|
|
m_szNodeName = lpszNodeName;
|
|
m_szFullNodeName = lpszFullNodeName;
|
|
m_wRecordType = wRecordType;
|
|
m_dwSelectFlags = dwSelectFlags;
|
|
m_bReverse = bReverse;
|
|
m_bIsZone = bIsZone;
|
|
m_bCache = bCache;
|
|
|
|
// internal state variables
|
|
m_bFirstPass = TRUE;
|
|
}
|
|
virtual BOOL Enumerate();
|
|
|
|
// implementation for DNS domain/zone type
|
|
BOOL CanAddRecord(WORD wRecordType, LPCWSTR lpszRecordName);
|
|
BOOL CanAddDomain(LPCWSTR lpszDomainName)
|
|
{ return MatchName(lpszDomainName);}
|
|
|
|
protected:
|
|
DNS_STATUS EnumerateFiltered(WORD wRecordType);
|
|
|
|
protected:
|
|
// query parameters (in the sequence expected by CDNSDomainNode::EnumerateNodes)
|
|
CString m_szNodeName;
|
|
CString m_szZoneName;
|
|
CString m_szFullNodeName;
|
|
WORD m_wRecordType;
|
|
DWORD m_dwSelectFlags;
|
|
BOOL m_bIsZone;
|
|
BOOL m_bReverse;
|
|
BOOL m_bCache;
|
|
|
|
// query flag to do multiple pass filtered query
|
|
BOOL m_bFirstPass;
|
|
|
|
};
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// CDNSDomainNode
|
|
|
|
class CDNSDomainNode : public CDNSMTContainerNode
|
|
{
|
|
public:
|
|
CDNSDomainNode(BOOL bDelegation = FALSE);
|
|
virtual ~CDNSDomainNode();
|
|
|
|
// node info
|
|
DECLARE_NODE_GUID()
|
|
|
|
void SetZone(CDNSZoneNode* pZoneNode){m_pZoneNode = pZoneNode;}
|
|
virtual CDNSZoneNode* GetZoneNode()
|
|
{ ASSERT(m_pZoneNode != NULL); return m_pZoneNode;}
|
|
|
|
protected:
|
|
// helpers for setting names
|
|
void SetFullDNSName(BOOL bIsZone, BOOL bReverse,
|
|
LPCTSTR lpszNodeName, LPCTSTR lpszParentFullName);
|
|
void SetDisplayDNSName(BOOL bIsZone, BOOL bReverse, BOOL bAdvancedView,
|
|
LPCTSTR lpszNodeName, LPCTSTR lpszParentFullName);
|
|
void ChangePTRRecordsViewOption(BOOL bAdvanced,
|
|
CComponentDataObject* pComponentDataObject);
|
|
|
|
void OnMultiselectDelete(CComponentDataObject* pComponentData, CNodeList* pNodeList);
|
|
|
|
public:
|
|
void SetNames(BOOL bIsZone, BOOL bReverse, BOOL bAdvancedView,
|
|
LPCTSTR lpszNodeName, LPCTSTR lpszParentFullName);
|
|
|
|
virtual HRESULT OnCommand(long nCommandID,
|
|
DATA_OBJECT_TYPES type,
|
|
CComponentDataObject* pComponentData,
|
|
CNodeList* pNodeList);
|
|
virtual void OnDelete(CComponentDataObject* pComponentData,
|
|
CNodeList* pNodeList);
|
|
virtual BOOL OnRefresh(CComponentDataObject* pComponentData,
|
|
CNodeList* pNodeList);
|
|
virtual LPCWSTR GetString(int nCol)
|
|
{
|
|
return (nCol == 0) ? GetDisplayName() : g_lpszNullString;
|
|
}
|
|
|
|
virtual int GetImageIndex(BOOL bOpenImage);
|
|
virtual LPWSTR GetDescriptionBarText();
|
|
|
|
virtual BOOL HasPropertyPages(DATA_OBJECT_TYPES type,
|
|
BOOL* pbHideVerb,
|
|
CNodeList* pNodeList);
|
|
virtual HRESULT CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider,
|
|
LONG_PTR handle,
|
|
CNodeList* pNodeList);
|
|
virtual HRESULT CreatePropertyPagesHelper(LPPROPERTYSHEETCALLBACK lpProvider,
|
|
LONG_PTR handle, long nStartPageCode);
|
|
virtual int Compare(CTreeNode* pNodeA, CTreeNode* pNodeB, int nCol, long lUserParam);
|
|
|
|
virtual void Show(BOOL bShow, CComponentDataObject* pComponentData);
|
|
|
|
virtual RECORD_SEARCH DoesContain(PCWSTR pszFullName,
|
|
CComponentDataObject* pComponentData,
|
|
CDNSDomainNode** ppDomainNode,
|
|
CString& szNonExistentDomain,
|
|
BOOL bExpandNodes = FALSE);
|
|
|
|
protected:
|
|
virtual LPCONTEXTMENUITEM2 OnGetContextMenuItemTable()
|
|
{ return CDNSDomainMenuHolder::GetContextMenuItem(); }
|
|
virtual BOOL OnAddMenuItem(LPCONTEXTMENUITEM2 pContextMenuItem2,
|
|
long *pInsertionAllowed);
|
|
virtual BOOL OnSetDeleteVerbState(DATA_OBJECT_TYPES type,
|
|
BOOL* pbHide,
|
|
CNodeList* pNodeList);
|
|
virtual BOOL OnSetRefreshVerbState(DATA_OBJECT_TYPES type,
|
|
BOOL* pbHide,
|
|
CNodeList* pNodeList);
|
|
virtual HRESULT OnSetToolbarVerbState(IToolbar* pToolbar,
|
|
CNodeList* pNodeList);
|
|
|
|
// query creation
|
|
virtual CQueryObj* OnCreateQuery();
|
|
|
|
// main message handlers for thread messages
|
|
virtual void OnThreadExitingNotification(CComponentDataObject* pComponentDataObject);
|
|
virtual void OnHaveData(CObjBase* pObj, CComponentDataObject* pComponentDataObject);
|
|
|
|
// command handlers
|
|
private:
|
|
void OnNewRecordHelper(CComponentDataObject* pComponentData, WORD wType);
|
|
|
|
protected:
|
|
HRESULT OnNewRecord(CComponentDataObject* pComponentData,
|
|
CNodeList* pNodeList);
|
|
void OnNewDomain(CComponentDataObject* pComponentData);
|
|
void OnNewDelegation(CComponentDataObject* pComponentData);
|
|
|
|
void OnNewHost(CComponentDataObject* pComponentData);
|
|
void OnNewAlias(CComponentDataObject* pComponentData);
|
|
void OnNewMailExchanger(CComponentDataObject* pComponentData);
|
|
void OnNewPointer(CComponentDataObject* pComponentData);
|
|
|
|
// DNS specific data
|
|
protected:
|
|
CString m_szFullName; // FQN for the current zone/domain
|
|
CDNSZoneNode* m_pZoneNode; // pointer to the zone the domain
|
|
BOOL m_bHasDataForPropPages; // TRUE if we have enough data to display PPages
|
|
|
|
private:
|
|
CDNS_NS_RecordNodeList* m_pNSRecordNodeList; // list of cached pointers to NS records
|
|
// (used for zones and delegated domains)
|
|
BOOL m_bDelegation; // TRUE of the node is a delegated domain
|
|
|
|
protected:
|
|
CDNS_NS_RecordNodeList* GetNSRecordNodeList()
|
|
{ ASSERT(m_pNSRecordNodeList != NULL); return m_pNSRecordNodeList; }
|
|
|
|
public:
|
|
LPCWSTR GetFullName() { return m_szFullName; }
|
|
BOOL IsZone() { return (CDNSDomainNode*)m_pZoneNode == this; }
|
|
DWORD GetDefaultTTL();
|
|
|
|
// subdomain creation
|
|
CDNSDomainNode* FindSubdomainNode(LPCTSTR lpszSubdomainNode);
|
|
CDNSDomainNode* CreateSubdomainNode(BOOL bDelegation = FALSE); // create C++ object and hook it up
|
|
void SetSubdomainName(CDNSDomainNode* pSubdomainNode,
|
|
LPCTSTR lpszSubdomainName,
|
|
BOOL bAdvancedView); // set the name of the C++ object
|
|
DNS_STATUS CreateSubdomain(
|
|
CDNSDomainNode* pSubdomainNode,
|
|
CComponentDataObject* pComponentData); // assume the 2 above API's got used
|
|
|
|
DNS_STATUS CreateSubdomain(LPCTSTR lpszDomainName,
|
|
CComponentDataObject* pComponentData); // one step API using the ones above
|
|
DNS_STATUS Create(); // from a new C++ node, create on the server
|
|
|
|
// child enumeration
|
|
static DNS_STATUS EnumerateNodes(LPCTSTR lpszServerName,
|
|
LPCTSTR lpszZoneName,
|
|
LPCTSTR lpszNodeName,
|
|
LPCTSTR lpszFullNodeName,
|
|
WORD wRecordType,
|
|
DWORD dwSelectFlag,
|
|
BOOL bIsZone, BOOL bReverse, BOOL bAdvancedView,
|
|
CDNSDomainQueryObj* pQuery);
|
|
|
|
public:
|
|
BOOL IsDelegation() { return m_bDelegation;}
|
|
|
|
// NS records management
|
|
BOOL HasNSRecords();
|
|
void GetNSRecordNodesInfo(CDNSRecordNodeEditInfoList* pNSInfoList);
|
|
BOOL UpdateNSRecordNodesInfo(CDNSRecordNodeEditInfoList* pNewInfoList,
|
|
CComponentDataObject* pComponentData);
|
|
static void FindARecordsFromNSInfo(LPCWSTR lpszServerName, DWORD dwServerVersion,
|
|
DWORD cServerAddrCount, PIP_ADDRESS pipServerAddrs,
|
|
LPCWSTR lpszZoneName,
|
|
LPCWSTR lpszNSName,
|
|
CDNSRecordNodeEditInfoList* pNSInfoList,
|
|
BOOL bAdvancedView);
|
|
virtual void FindARecordsFromNSInfo(LPCTSTR lpszNSName, CDNSRecordNodeEditInfoList* pNSInfoList);
|
|
|
|
protected:
|
|
virtual void UpdateARecordsOfNSInfo(CDNSRecordNodeEditInfo* pNSInfo,
|
|
CComponentDataObject* pComponentData);
|
|
static void UpdateARecordsOfNSInfoHelper(CDNSDomainNode* pDomainNode,
|
|
CDNSRecordNodeEditInfo* pNSInfo,
|
|
CComponentDataObject* pComponentData,
|
|
BOOL bAskConfirmation);
|
|
|
|
protected:
|
|
// called by OnHaveData() to set cached RR ptrs and generally preprocess RR's
|
|
virtual void OnHaveRecord(CDNSRecordNodeBase* pRecordNode,
|
|
CComponentDataObject* pComponentDataObject);
|
|
|
|
|
|
private:
|
|
DNS_STATUS Delete();
|
|
|
|
DECLARE_TOOLBAR_MAP()
|
|
};
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// CDNSDummyDomainNode
|
|
//
|
|
// * not multithreaded and hidden in the UI
|
|
|
|
class CDNSDummyDomainNode : public CDNSDomainNode
|
|
{
|
|
public:
|
|
CDNSDummyDomainNode()
|
|
{
|
|
m_dwNodeFlags |= TN_FLAG_HIDDEN;
|
|
}
|
|
|
|
protected:
|
|
virtual CQueryObj* OnCreateQuery()
|
|
{
|
|
// should never be called, only for MT objects
|
|
ASSERT(FALSE);
|
|
return NULL;
|
|
}
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// CDNSRootHintsNode
|
|
//
|
|
// * exists only if the server is not authoritated for the root
|
|
// * not multithreaded and hidden in the UI
|
|
|
|
class CDNSRootHintsNode : public CDNSDummyDomainNode
|
|
{
|
|
public:
|
|
CDNSRootHintsNode()
|
|
{
|
|
m_szFullName = _T(".");
|
|
m_szDisplayName = _T(".");
|
|
}
|
|
// this "domain" object is not associated to any zone
|
|
virtual CDNSZoneNode* GetZoneNode()
|
|
{ ASSERT(m_pZoneNode == NULL); return NULL;}
|
|
|
|
DNS_STATUS QueryForRootHints(LPCTSTR lpszServerName, DWORD dwServerVersion);
|
|
|
|
DNS_STATUS InitializeFromDnsQueryData(PDNS_RECORD pRootHintsRecordList);
|
|
|
|
protected:
|
|
virtual void FindARecordsFromNSInfo(LPCTSTR lpszNSName, CDNSRecordNodeEditInfoList* pNSInfoList);
|
|
virtual void UpdateARecordsOfNSInfo(CDNSRecordNodeEditInfo* pNSInfo,
|
|
CComponentDataObject* pComponentData);
|
|
private:
|
|
DNS_STATUS Clear();
|
|
};
|
|
|
|
|
|
|
|
#endif // _DOMAIN_H
|