// Copyright (c) 2001 Microsoft Corporation // // File: DomainPage.cpp // // Synopsis: Defines the new domain name page used in the // Express path for the CYS Wizard // // History: 02/08/2001 JeffJon Created #include "pch.h" #include "resource.h" #include "InstallationUnitProvider.h" #include "DomainPage.h" static PCWSTR DOMAIN_PAGE_HELP = L"cys.chm::/typical_setup.htm#typicaldomainname"; ADDomainPage::ADDomainPage() : CYSWizardPage( IDD_AD_DOMAIN_NAME_PAGE, IDS_AD_DOMAIN_TITLE, IDS_AD_DOMAIN_SUBTITLE, DOMAIN_PAGE_HELP) { LOG_CTOR(ADDomainPage); } ADDomainPage::~ADDomainPage() { LOG_DTOR(ADDomainPage); } void ADDomainPage::OnInit() { LOG_FUNCTION(ADDomainPage::OnInit); CYSWizardPage::OnInit(); // Set the default DNS domain name SetDefaultDNSName(); } void ADDomainPage::SetDefaultDNSName() { LOG_FUNCTION(ADDomainPage::SetDefaultDNSName); // default to smallbusiness.local unless we can construct // the name from the RegisteredOrganization regkey String newDomainDNSName = L"smallbusiness.local"; do { String organizationName; bool regResult = GetRegKeyValue( CYS_ORGNAME_REGKEY, CYS_ORGNAME_VALUE, organizationName); if (!regResult || organizationName.empty()) { // default back to smallbusiness.local LOG(L"Failed to read the orgname from registry so defaulting to smallbusiness.local"); break; } String dnsName = String::format(IDS_EXPRESS_DNS_NAME_FORMAT, organizationName.c_str()); DNSNameSyntaxError dnsNameError = ValidateDomainDnsNameSyntax(dnsName); if (dnsNameError == DNS_NAME_VALID || dnsNameError == DNS_NAME_NON_RFC || dnsNameError == DNS_NAME_NON_RFC_WITH_UNDERSCORE) { LOG( String::format( L"Name is either valid or non RFC: %1", dnsName.c_str())); newDomainDNSName = dnsName; break; } // since the name was invalid, try trimming // some illegal characters (note that space is included) static const String illegalDNSCharacters = L"\\ \'{|}~[]^`:;<>=?@!\"#$%^&()+/,*."; static const String emptyString = L""; organizationName = organizationName.replace_each_of(illegalDNSCharacters, emptyString); LOG( String::format( L"organization name after stripping: %1", organizationName.c_str())); dnsName = String::format(IDS_EXPRESS_DNS_NAME_FORMAT, organizationName.c_str()); dnsNameError = ValidateDomainDnsNameSyntax(dnsName); if (dnsNameError == DNS_NAME_VALID || dnsNameError == DNS_NAME_NON_RFC || dnsNameError == DNS_NAME_NON_RFC_WITH_UNDERSCORE) { LOG( String::format( L"Stripped name is either valid or non RFC: %1", dnsName.c_str())); newDomainDNSName = dnsName; break; } // fall back to using smallbusiness.local LOG(L"All attempts to convert the organization name have failed."); } while (false); LOG( String::format( L"Using DNS name: %1", newDomainDNSName.c_str())); Win::SetDlgItemText( hwnd, IDC_DOMAIN, newDomainDNSName); } static void enable(HWND dialog) { ASSERT(Win::IsWindow(dialog)); int next = !Win::GetTrimmedDlgItemText(dialog, IDC_DOMAIN).empty() ? PSWIZB_NEXT : 0; Win::PropSheet_SetWizButtons( Win::GetParent(dialog), PSWIZB_BACK | next); } bool ADDomainPage::OnSetActive() { LOG_FUNCTION(ADDomainPage::OnSetActive); Win::Edit_LimitText( Win::GetDlgItem(hwnd, IDC_DOMAIN), DNS_DOMAIN_NAME_MAX_LIMIT_DUE_TO_POLICY); enable(hwnd); return true; } bool ADDomainPage::OnCommand( HWND /* windowFrom */ , unsigned controlIDFrom, unsigned code) { // LOG_FUNCTION(ForestPage::OnCommand); switch (controlIDFrom) { case IDC_DOMAIN: { if (code == EN_CHANGE) { enable(hwnd); } break; } default: { // do nothing break; } } return false; } int ADDomainPage::Validate() { LOG_FUNCTION(ADDomainPage::Validate); int nextPage = -1; do { String domain = Win::GetTrimmedDlgItemText(hwnd, IDC_DOMAIN); LOG(String::format(L"domain = %1", domain.c_str())); if (!ValidateDomainDnsNameSyntax(hwnd, IDC_DOMAIN, popup)) { nextPage = -1; break; } if (!ConfirmNetbiosLookingNameIsReallyDnsName(hwnd, IDC_DOMAIN, popup)) { nextPage = -1; break; } // do this test last, as it is expensive if (!ForestValidateDomainDoesNotExist(hwnd, IDC_DOMAIN, popup)) { nextPage = -1; break; } InstallationUnitProvider::GetInstance().GetADInstallationUnit().SetNewDomainDNSName(domain); nextPage = IDD_NETBIOS_NAME; } while(false); LOG(String::format(L"%1!d!", nextPage)); return nextPage; }