private void RestoreDomainsByWebSite(ServerBinding[] bindings, int packageId, int webSiteId, string itemName)
        {
            // detect all web site related domains
            List<string> domainNames = new List<string>();
            foreach (ServerBinding binding in bindings)
            {
                string pointerName = binding.Host;
                if (pointerName == null)
                    continue;
                pointerName = pointerName.ToLower();
                if (pointerName.StartsWith("www."))
                    pointerName = pointerName.Substring(4);

                if (!domainNames.Contains(pointerName) && !String.IsNullOrEmpty(pointerName))
                    domainNames.Add(pointerName);
            }

            string siteName = itemName.ToLower();
            if (siteName.StartsWith("www."))
                siteName = siteName.Substring(4);
            if (!domainNames.Contains(siteName))
                domainNames.Add(siteName);

            foreach (string domainName in domainNames)
            {
                DomainInfo domain = ServerController.GetDomain(domainName);
                if (domain == null)
                {
                    domain = new DomainInfo();
                    domain.DomainName = domainName;
                    domain.PackageId = packageId;
                    domain.WebSiteId = webSiteId;
                    ServerController.AddDomainItem(domain);
                }
                else
                {
                    domain.WebSiteId = webSiteId;
                    ServerController.UpdateDomain(domain);
                }
            }
        }
		/// <summary>
		/// Sets ftp site bindings.
		/// </summary>
		/// <param name="siteName">Site's name to set bindings for.</param>
		/// <param name="bindings">Ftp bindings to set.</param>
		public void SetSiteBindings(string siteName, ServerBinding[] bindings)
		{
			if (this.SiteExists(siteName))
			{
				Site site = this.GetIisSite(siteName);
				List<Binding> originalBindingsToRemove = new List<Binding>();
				foreach (Binding binding in site.Bindings)
				{
					if (string.Equals(binding.Protocol, "ftp", StringComparison.OrdinalIgnoreCase))
					{
						originalBindingsToRemove.Add(binding);
					}
				}
				// Remove all ftp bindings.
				foreach (Binding binding in originalBindingsToRemove)
				{
					site.Bindings.Remove(binding);
				}
				// Add new ones.
				foreach(ServerBinding binding in bindings)
				{
					site.Bindings.Add(binding.ToString(), "ftp");
				}
			}
			else
			{
				throw new InvalidOperationException("Site doesn't exist.");
			}
		}
 public void UpdateSiteBindings(string siteId, ServerBinding[] bindings)
 {
     try
     {
         Log.WriteStart("'{0}' UpdateSiteBindings", ProviderSettings.ProviderName);
         WebProvider.UpdateSiteBindings(siteId, bindings);
         Log.WriteEnd("'{0}' UpdateSiteBindings", ProviderSettings.ProviderName);
     }
     catch (Exception ex)
     {
         Log.WriteError(String.Format("'{0}' UpdateSiteBindings", ProviderSettings.ProviderName), ex);
         throw;
     }
 }
        public static int SwitchWebSiteToDedicatedIP(int siteItemId, int ipAddressId)
        {
            // check account
            int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
            if (accountCheck < 0) return accountCheck;

            // load web site item
            WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId);
            if (siteItem == null)
                return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND;

            
            int addressId = 0;
            PackageIPAddress packageIp = ServerController.GetPackageIPAddress(ipAddressId);
            if (packageIp != null)
            {
                addressId = packageIp.AddressID;
            }

            List<GlobalDnsRecord> dnsRecords = ServerController.GetDnsRecordsByService(siteItem.ServiceId);

            foreach (GlobalDnsRecord d in dnsRecords)
            {
                if (!string.IsNullOrEmpty(d.ExternalIP))
                {
                    if (!IsValidIPAdddress(d.ExternalIP)) return BusinessErrorCodes.ERROR_GLOBALDNS_FOR_DEDICATEDIP;
                }
            }

            // place log record
            TaskManager.StartTask("WEB_SITE", "SWITCH_TO_DEDICATED_IP", siteItem.Name, siteItemId);

            try
            {
                IPAddressInfo ip;

                // remove all web site pointers
                DomainInfo domain = ServerController.GetDomain(siteItem.Name);
                DomainInfo ZoneInfo = ServerController.GetDomain(domain.DomainItemId);

                if (ZoneInfo == null)
                    throw new Exception("Parent zone not found");

                //cleanup certificates
                List<SSLCertificate> certificates = GetCertificatesForSite(siteItemId);
                foreach (SSLCertificate c in certificates)
                {
                    DeleteCertificate(siteItemId, c);
                }

                certificates = GetPendingCertificates(siteItemId);
                foreach (SSLCertificate c in certificates)
                {
                    DeleteCertificateRequest(siteItemId, c.id);
                }
                
                List<DomainInfo> pointers = GetWebSitePointers(siteItemId);
                foreach (DomainInfo pointer in pointers)
                    DeleteWebSitePointer(siteItemId, pointer.DomainId, true, true, false);

                // remove web site main pointer
                if (domain != null)
                    DeleteWebSitePointer(siteItemId, domain.DomainId, true, true, false);

                // clear binding left overs
                List<ServerBinding> newBindings = new List<ServerBinding>();
                WebServer web = new WebServer();
                ServiceProviderProxy.Init(web, siteItem.ServiceId);
                try
                {
                    web.UpdateSiteBindings(siteItem.SiteId, newBindings.ToArray(), true);
                }
                catch (Exception)
                {

                }

                List<WebSite> sites = WebServerController.GetWebSites(domain.PackageId, false);
                bool oneSiteOnly = (sites.Count == 1);

                if (oneSiteOnly)
                {
                    // load site item
                    ip = ServerController.GetIPAddress(sites[0].SiteIPAddressId);

                    string serviceIp = (ip != null) ? ip.ExternalIP : null;

                    if (string.IsNullOrEmpty(serviceIp))
                    {
                        StringDictionary settings = ServerController.GetServiceSettings(sites[0].ServiceId);
                        if (settings["PublicSharedIP"] != null)
                            serviceIp = settings["PublicSharedIP"].ToString();
                    }

                    ServerController.RemoveServiceDNSRecords(domain.PackageId, ResourceGroups.Web, domain, serviceIp, true);
                }


                // update site item
                siteItem.SiteIPAddressId = addressId;
                PackageController.UpdatePackageItem(siteItem);

                // associate IP with web site
                ServerController.AddItemIPAddress(siteItemId, ipAddressId);


                string parentZone = domain.ZoneName;
                if (string.IsNullOrEmpty(parentZone))
                {
                    DomainInfo parentDomain = ServerController.GetDomain(domain.DomainItemId);
                    parentZone = parentDomain.DomainName;
                }


                AddWebSitePointer(siteItemId,
                    ((domain.DomainName.Replace("." + parentZone, "") == parentZone) |
                    (domain.DomainName == parentZone))
                    ? "" : domain.DomainName.Replace("." + parentZone, "")
                    , ZoneInfo.DomainId, true, true, true);

                foreach (DomainInfo pointer in pointers)
                {
                    string pointerParentZone = pointer.ZoneName;
                    if (string.IsNullOrEmpty(pointerParentZone))
                    {
                        DomainInfo parentDomain = ServerController.GetDomain(pointer.DomainItemId);
                        pointerParentZone = parentDomain.DomainName;
                    }


                    ZoneInfo = ServerController.GetDomain(pointerParentZone);

                    AddWebSitePointer(siteItemId,
                        ((pointer.DomainName.Replace("." + pointerParentZone, "") == pointerParentZone)  |
                        (pointer.DomainName == pointerParentZone))
                        ? "" : pointer.DomainName.Replace("." + pointerParentZone, "")
                        , ZoneInfo.DomainId, true, true, true);
                }

                // load web site IP address
                ip = ServerController.GetIPAddress(siteItem.SiteIPAddressId);
                string ipAddr = "*";
                if (ip != null)
                    ipAddr = !String.IsNullOrEmpty(ip.InternalIP) ? ip.InternalIP : ip.ExternalIP;

                newBindings = new List<ServerBinding>();

                ServerBinding srvBinding = new ServerBinding(ipAddr, "80", "");
                newBindings.Add(srvBinding);

                foreach (ServerBinding b in web.GetSiteBindings(siteItem.SiteId))
                {
                    if (!((b.Host == srvBinding.Host) &
                        (b.IP == srvBinding.IP) &
                        (b.Port == srvBinding.Port)))
                        newBindings.Add(b);
                }
               
                web.UpdateSiteBindings(siteItem.SiteId, newBindings.ToArray(), false);

                if (oneSiteOnly)
                {
                    sites = WebServerController.GetWebSites(domain.PackageId, false);

                    // load site item
                    ip = ServerController.GetIPAddress(sites[0].SiteIPAddressId);

                    string serviceIp = (ip != null) ? ip.ExternalIP : null;

                    if (string.IsNullOrEmpty(serviceIp))
                    {
                        StringDictionary settings = ServerController.GetServiceSettings(sites[0].ServiceId);
                        if (settings["PublicSharedIP"] != null)
                            serviceIp = settings["PublicSharedIP"].ToString();
                    }

                    ServerController.AddServiceDNSRecords(domain.PackageId, ResourceGroups.Web, domain, serviceIp, true);
                }
                
                return 0;
            }
            catch (Exception ex)
            {
                throw TaskManager.WriteError(ex);
            }
            finally
            {
                TaskManager.CompleteTask();
            }
        }
        private static void AddBinding(List<ServerBinding> bindings, ServerBinding binding)
        {
            foreach (ServerBinding b in bindings)
            {
                if (string.Compare(b.Host, binding.Host, true) == 0)
                    return;
            }

            bindings.Add(binding);
        }
		private void BindListOfAvailableSslDomains(ServerBinding[] siteBindings, SSLCertificate[] siteCertificates)
		{
			lstDomains.Items.Clear();
			//
			foreach (ServerBinding binding in siteBindings)
			{
				//
				lstDomains.Items.Add(new ListItem(binding.Host, binding.Host));
			}
		}