// Copyright (c) 2012, Outercurve Foundation. // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this // list of conditions and the following disclaimer. // // - Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // // - Neither the name of the Outercurve Foundation nor the names of its // contributors may be used to endorse or promote products derived from this // software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR // ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using System; using System.IO; using System.Data; using System.Linq; using System.Collections.Specialized; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; using System.Xml; using System.Xml.Serialization; using WebsitePanel.Providers; using WebsitePanel.Providers.Web; using WebsitePanel.Providers.DNS; using OS = WebsitePanel.Providers.OS; using WebsitePanel.Providers.Common; using WebsitePanel.Providers.ResultObjects; using System.Resources; using System.Threading; using System.Reflection; using WebsitePanel.Templates; using WebsitePanel.Providers.Database; using WebsitePanel.Providers.FTP; using System.Collections; namespace WebsitePanel.EnterpriseServer { public class WebServerController : IImportController, IBackupController { private const string LOG_SOURCE_WEB = "WEB"; private const int DOMAIN_RANDOM_LENGTH = 8; private const int MAX_ACCOUNT_LENGTH = 20; private const string ANON_ACCOUNT_SUFFIX = "_web"; private const string FRONTPAGE_ACCOUNT_SUFFIX = "_fp"; private const string WEBSITE_ROOT_FOLDER_PATTERN = "\\[DOMAIN_NAME]"; private const string WEBSITE_LOGS_FOLDER_PATTERN = "\\WebLogs\\[DOMAIN_NAME]"; private const string WEBSITE_DATA_FOLDER_PATTERN = "\\WebData\\[DOMAIN_NAME]"; public static WebServer GetWebServer(int serviceId) { WebServer ws = new WebServer(); ServiceProviderProxy.Init(ws, serviceId); return ws; } #region Web Sites public static DataSet GetRawWebSitesPaged(int packageId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) { return PackageController.GetRawPackageItemsPaged(packageId, typeof(WebSite), true, filterColumn, filterValue, sortColumn, startRow, maximumRows); } public static List GetWebSites(int packageId, bool recursive) { List items = PackageController.GetPackageItemsByType( packageId, typeof(WebSite), recursive); List sites = items.ConvertAll(new Converter(ConvertItemToWebSite)); foreach (WebSite site in sites) { IPAddressInfo ip = ServerController.GetIPAddress(site.SiteIPAddressId); if(ip != null) site.SiteIPAddress = ip.ExternalIP; } return sites; } private static WebSite ConvertItemToWebSite(ServiceProviderItem item) { return (WebSite)item; } public static WebSite GetWebSite(int packageId, string siteName) { ServiceProviderItem siteItem = PackageController.GetPackageItemByName(packageId, siteName, typeof(WebSite)); if (siteItem == null) return null; return GetWebSite(siteItem.Id); } public static WebSite GetWebSite(int siteItemId) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return null; // load live site from service WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); WebSite site = web.GetSite(siteItem.SiteId); // set other properties site.Id = siteItem.Id; site.Name = siteItem.Name; site.ServiceId = siteItem.ServiceId; site.PackageId = siteItem.PackageId; // load IP address site.SiteIPAddressId = siteItem.SiteIPAddressId; IPAddressInfo ip = ServerController.GetIPAddress(siteItem.SiteIPAddressId); if(ip != null) site.SiteIPAddress = ip.ExternalIP; // check if site has dedicated IP assigned var siteIpAddresses = ServerController.GetItemIPAddresses(siteItemId, IPAddressPool.None); foreach (var siteIp in siteIpAddresses) { var packageIpAddress = ServerController.GetPackageIPAddress(siteIp.AddressID); if (packageIpAddress != null && packageIpAddress.ExternalIP == site.SiteIPAddress) { site.IsDedicatedIP = true; break; } } // truncate home folder site.ContentPath = FilesController.GetVirtualPackagePath(siteItem.PackageId, site.ContentPath); //check if Coldfusion is available //site.ColdFusionAvailable = siteItem.ColdFusionAvailable; // set FrontPage account site.FrontPageAccount = siteItem.FrontPageAccount; if (String.IsNullOrEmpty(site.FrontPageAccount)) site.FrontPageAccount = GetFrontPageUsername(site.Name); // Set Web Deploy publishing account site.WebDeployPublishingAccount = siteItem.WebDeployPublishingAccount; // Set Web Deploy site publishing enabled site.WebDeploySitePublishingEnabled = siteItem.WebDeploySitePublishingEnabled; // Set Web Deploy site publishing profile site.WebDeploySitePublishingProfile = siteItem.WebDeploySitePublishingProfile; return site; } public static int AddWebSite(int packageId, string hostName, int domainId, int ipAddressId) { return AddWebSite(packageId, hostName, domainId, ipAddressId, false, true); } private static bool IsValidIPAdddress(string addr) { System.Net.IPAddress ip; if (System.Net.IPAddress.TryParse(addr, out ip)) { return ((ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) | (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)); } else { return false; } } public static int AddWebSite(int packageId, string hostName, int domainId, int packageAddressId, bool addInstantAlias, bool ignoreGlobalDNSRecords) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // check package int packageCheck = SecurityContext.CheckPackage(packageId, DemandPackage.IsActive); if (packageCheck < 0) return packageCheck; // check quota QuotaValueInfo sitesQuota = PackageController.GetPackageQuota(packageId, Quotas.WEB_SITES); if (sitesQuota.QuotaExhausted) return BusinessErrorCodes.ERROR_WEB_SITES_QUOTA_LIMIT; // load domain name DomainInfo domain = ServerController.GetDomain(domainId); string domainName = domain.DomainName; string siteName = string.IsNullOrEmpty(hostName) ? domainName : hostName + "." + domainName; // check if the web site already exists (legacy) if (PackageController.GetPackageItemByName(packageId, siteName, typeof(WebSite)) != null) return BusinessErrorCodes.ERROR_WEB_SITE_ALREADY_EXISTS; if (DataProvider.CheckDomain(domain.PackageId, siteName, true) != 0) return BusinessErrorCodes.ERROR_WEB_SITE_ALREADY_EXISTS; // place log record TaskManager.StartTask("WEB_SITE", "ADD", siteName); try { // get service int serviceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.Web); if (serviceId == 0) return BusinessErrorCodes.ERROR_WEB_SITE_SERVICE_UNAVAILABLE; // Initialize IIS provider webservice proxy WebServer web = new WebServer(); ServiceProviderProxy.Init(web, serviceId); // Ensure the web site is being created doesn't exist on the server if (web.SiteExists(siteName)) { // PackageInfo packageInfo = PackageController.GetPackage(packageId); // ServerInfo serverInfo = ServerController.GetServerById(packageInfo.ServerId); // Give as much clues for the issue to an administrator as possible TaskManager.WriteError("Web site '{0}' could not be created because site with the name requested already " + "exists on '{1}' server.", siteName, serverInfo.ServerName); // Return generic operation failed error return BusinessErrorCodes.FAILED_EXECUTE_SERVICE_OPERATION; } // load web settings StringDictionary webSettings = ServerController.GetServiceSettings(serviceId); int addressId = Utils.ParseInt(webSettings["SharedIP"], 0); bool dedicatedIp = false; if (packageAddressId != 0) { // dedicated IP PackageIPAddress packageIp = ServerController.GetPackageIPAddress(packageAddressId); if (packageIp != null) { addressId = packageIp.AddressID; dedicatedIp = true; } } // load assigned IP address string ipAddr = "*"; IPAddressInfo ip = ServerController.GetIPAddress(addressId); if (ip != null) ipAddr = !String.IsNullOrEmpty(ip.InternalIP) ? ip.InternalIP : ip.ExternalIP; // load web DNS records List dnsRecords = ServerController.GetDnsRecordsByService(serviceId); if (dedicatedIp) { foreach (GlobalDnsRecord d in dnsRecords) { if (!string.IsNullOrEmpty(d.ExternalIP)) { if (!IsValidIPAdddress(d.ExternalIP)) return BusinessErrorCodes.ERROR_GLOBALDNS_FOR_DEDICATEDIP; } } } else { if (domain.ZoneItemId > 0) { StringDictionary settings = ServerController.GetServiceSettings(serviceId); if (string.IsNullOrEmpty(settings["PublicSharedIP"])) return BusinessErrorCodes.ERROR_PUBLICSHAREDIP_FOR_SHAREDIP; } } // prepare site bindings List bindings = new List(); // SHARED IP // fill main domain bindings FillWebServerBindings(bindings, dnsRecords, ipAddr, hostName, domain.DomainName, ignoreGlobalDNSRecords); //double check all bindings foreach (ServerBinding b in bindings) { if (DataProvider.CheckDomain(domain.PackageId, b.Host, true) != 0) return BusinessErrorCodes.ERROR_WEB_SITE_ALREADY_EXISTS; } if (dedicatedIp) { // DEDICATED IP bindings.Add(new ServerBinding(ipAddr, "80", "")); } UserInfo user = PackageController.GetPackageOwner(packageId); UserSettings webPolicy = UserController.GetUserSettings(user.UserId, UserSettings.WEB_POLICY); // craete web site string siteId = null; WebSite site = new WebSite(); // web site name and bindings site.Name = siteName; site.Bindings = bindings.ToArray(); site.AnonymousUsername = GetWebSiteUsername(webPolicy, siteName); site.AnonymousUserPassword = Guid.NewGuid().ToString("P"); // folders string packageHome = FilesController.GetHomeFolder(packageId); // add random string to the domain if specified string randDomainName = siteName; if (!String.IsNullOrEmpty(webPolicy["AddRandomDomainString"]) && Utils.ParseBool(webPolicy["AddRandomDomainString"], false)) randDomainName += "_" + Utils.GetRandomString(DOMAIN_RANDOM_LENGTH); // ROOT folder site.ContentPath = GetWebFolder(packageId, WEBSITE_ROOT_FOLDER_PATTERN, randDomainName); if (!String.IsNullOrEmpty(webPolicy["WebRootFolder"])) site.ContentPath = GetWebFolder(packageId, webPolicy["WebRootFolder"], randDomainName); // LOGS folder site.LogsPath = GetWebFolder(packageId, WEBSITE_LOGS_FOLDER_PATTERN, randDomainName); if (!String.IsNullOrEmpty(webPolicy["WebLogsFolder"])) site.LogsPath = GetWebFolder(packageId, webPolicy["WebLogsFolder"], randDomainName); // DATA folder site.DataPath = GetWebFolder(packageId, WEBSITE_DATA_FOLDER_PATTERN, randDomainName); if (!String.IsNullOrEmpty(webPolicy["WebDataFolder"])) site.DataPath = GetWebFolder(packageId, webPolicy["WebDataFolder"], randDomainName); // default documents site.DefaultDocs = null; // inherit from service if (!String.IsNullOrEmpty(webPolicy["DefaultDocuments"])) site.DefaultDocs = webPolicy["DefaultDocuments"]; if (!String.IsNullOrEmpty(webPolicy["EnableWritePermissions"])) { // security settings site.EnableWritePermissions = Utils.ParseBool(webPolicy["EnableWritePermissions"], false); site.EnableDirectoryBrowsing = Utils.ParseBool(webPolicy["EnableDirectoryBrowsing"], false); site.EnableParentPaths = Utils.ParseBool(webPolicy["EnableParentPaths"], false); site.DedicatedApplicationPool = Utils.ParseBool(webPolicy["EnableDedicatedPool"], false); // Ensure the website meets hosting plan quotas QuotaValueInfo quotaInfo = PackageController.GetPackageQuota(packageId, Quotas.WEB_APPPOOLS); site.DedicatedApplicationPool = site.DedicatedApplicationPool && (quotaInfo.QuotaAllocatedValue > 0); site.EnableAnonymousAccess = Utils.ParseBool(webPolicy["EnableAnonymousAccess"], false); site.EnableWindowsAuthentication = Utils.ParseBool(webPolicy["EnableWindowsAuthentication"], false); site.EnableBasicAuthentication = Utils.ParseBool(webPolicy["EnableBasicAuthentication"], false); // extensions site.AspInstalled = Utils.ParseBool(webPolicy["AspInstalled"], false); site.AspNetInstalled = webPolicy["AspNetInstalled"]; site.PhpInstalled = webPolicy["PhpInstalled"]; site.PerlInstalled = Utils.ParseBool(webPolicy["PerlInstalled"], false); site.PythonInstalled = Utils.ParseBool(webPolicy["PythonInstalled"], false); site.CgiBinInstalled = Utils.ParseBool(webPolicy["CgiBinInstalled"], false); site.ColdFusionInstalled = false; } else { // security settings site.EnableWritePermissions = false; site.EnableDirectoryBrowsing = false; site.EnableParentPaths = false; site.DedicatedApplicationPool = false; site.EnableAnonymousAccess = true; site.EnableWindowsAuthentication = true; site.EnableBasicAuthentication = false; // extensions site.AspInstalled = true; site.AspNetInstalled = "1"; site.PhpInstalled = ""; site.PerlInstalled = false; site.PythonInstalled = false; site.CgiBinInstalled = false; site.ColdFusionInstalled = false; } site.HttpRedirect = ""; site.HttpErrors = null; site.MimeMaps = null; // CREATE WEB SITE siteId = web.CreateSite(site); // register item site.ServiceId = serviceId; site.PackageId = packageId; site.Name = siteName; site.SiteIPAddressId = addressId; site.SiteId = siteId; int siteItemId = PackageController.AddPackageItem(site); // associate IP with web site if (packageAddressId != 0) ServerController.AddItemIPAddress(siteItemId, packageAddressId); // update domain // add main pointer AddWebSitePointer(siteItemId, hostName, domain.DomainId, false, ignoreGlobalDNSRecords, false); // add parking page // load package if (webPolicy["AddParkingPage"] != null) { bool addParkingPage = Utils.ParseBool(webPolicy["AddParkingPage"], false); if (addParkingPage) { // add page string pageName = webPolicy["ParkingPageName"]; string pageContent = webPolicy["ParkingPageContent"]; if (!String.IsNullOrEmpty(pageName) && pageContent != null) { if (Utils.ParseBool(webPolicy["EnableParkingPageTokens"], false)) { pageContent = pageContent.Replace("[DOMAIN_NAME]", site.Name); pageContent = pageContent.Replace("[SITE_IP]", site.SiteIPAddress); } string path = Path.Combine( FilesController.GetVirtualPackagePath(packageId, site.ContentPath), pageName); if (!FilesController.FileExists(packageId, path)) { FilesController.CreateFile(packageId, path); byte[] content = Encoding.UTF8.GetBytes(pageContent); byte[] fileContent = new byte[content.Length + 3]; fileContent[0] = 0xEF; fileContent[1] = 0xBB; fileContent[2] = 0xBF; content.CopyTo(fileContent, 3); FilesController.UpdateFileBinaryContent(packageId, path, fileContent); } } } } TaskManager.ItemId = siteItemId; return siteItemId; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static int UpdateWebSite(WebSite site) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load web site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(site.Id); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record TaskManager.StartTask("WEB_SITE", "UPDATE", siteItem.Name, site.Id); try { // update home folder string origPath = site.ContentPath; site.ContentPath = FilesController.GetFullPackagePath(site.PackageId, site.ContentPath); // build data folder path site.DataPath = siteItem.DataPath; // update site on the service WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); web.UpdateSite(site); // Restore settings back #region Web Deploy Settings site.WebDeployPublishingAccount = siteItem.WebDeployPublishingAccount; site.WebDeployPublishingPassword = siteItem.WebDeployPublishingPassword; site.WebDeploySitePublishingEnabled = siteItem.WebDeploySitePublishingEnabled; site.WebDeploySitePublishingProfile = siteItem.WebDeploySitePublishingProfile; #endregion // update service item PackageController.UpdatePackageItem(site); // set origpath site.ContentPath = origPath; return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static int RepairWebSite(int siteItemId) { return 0; } public static int ChangeSiteState(int siteItemId, ServerState state) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // check package int packageCheck = SecurityContext.CheckPackage(siteItem.PackageId, DemandPackage.IsActive); if (packageCheck < 0) return packageCheck; // place log record TaskManager.StartTask("WEB_SITE", "CHANGE_STATE", siteItem.Name, siteItemId); TaskManager.WriteParameter("New state", state); try { // change state WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); web.ChangeSiteState(siteItem.SiteId, state); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } // AppPool public static int ChangeAppPoolState(int siteItemId, AppPoolState state) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // check package int packageCheck = SecurityContext.CheckPackage(siteItem.PackageId, DemandPackage.IsActive); if (packageCheck < 0) return packageCheck; // place log record TaskManager.StartTask("WEB_SITE", "CHANGE_STATE", siteItem.Name); TaskManager.ItemId = siteItemId; TaskManager.WriteParameter("New state", state); try { // change state WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); web.ChangeAppPoolState(siteItem.SiteId, state); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static AppPoolState GetAppPoolState(int siteItemId) { AppPoolState state = AppPoolState.Unknown; // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return state; // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return state; // check package int packageCheck = SecurityContext.CheckPackage(siteItem.PackageId, DemandPackage.IsActive); if (packageCheck < 0) return state; // place log record TaskManager.StartTask("WEB_SITE", "GET_STATE", siteItem.Name); TaskManager.ItemId = siteItemId; try { // get state WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); state = web.GetAppPoolState(siteItem.SiteId); } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } return state; } public static int DeleteWebSite(int siteItemId, bool deleteWebsiteDirectory) { // 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; // place log record TaskManager.StartTask("WEB_SITE", "DELETE", siteItem.Name, siteItemId); // delete web site try { //cleanup certificates //cleanup certificates List certificates = GetCertificatesForSite(siteItemId); foreach (SSLCertificate c in certificates) { DeleteCertificate(siteItemId, c); } // remove all web site pointers List pointers = GetWebSitePointers(siteItemId); foreach (DomainInfo pointer in pointers) DeleteWebSitePointer(siteItemId, pointer.DomainId, false, true, true); // remove web site main pointer DomainInfo domain = ServerController.GetDomain(siteItem.Name); if(domain != null) DeleteWebSitePointer(siteItemId, domain.DomainId, false, true, true); List sites = WebServerController.GetWebSites(domain.PackageId, false); bool oneSiteOnly = (sites.Count == 1); if (oneSiteOnly) { // load site item IPAddressInfo 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); } // delete web site WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); // if (web.IsFrontPageSystemInstalled() && web.IsFrontPageInstalled(siteItem.SiteId)) { web.UninstallFrontPage(siteItem.SiteId, siteItem.FrontPageAccount); } // web.DeleteSite(siteItem.SiteId); // Delete WebManagementAccess Account WebServerController.RevokeWebManagementAccess(siteItemId); if (deleteWebsiteDirectory) { // Delete website directory from file server // This will remove the hard quota as well FilesController.DeleteDirectoryRecursive(siteItem.PackageId, new DirectoryInfo(siteItem.DataPath).Parent.FullName); } // delete service item PackageController.DeletePackageItem(siteItemId); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } 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 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 certificates = GetCertificatesForSite(siteItemId); foreach (SSLCertificate c in certificates) { DeleteCertificate(siteItemId, c); } certificates = GetPendingCertificates(siteItemId); foreach (SSLCertificate c in certificates) { DeleteCertificateRequest(siteItemId, c.id); } List 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 newBindings = new List(); WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); try { web.UpdateSiteBindings(siteItem.SiteId, newBindings.ToArray(), true); } catch (Exception) { } List 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 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(); } } public static int SwitchWebSiteToSharedIP(int siteItemId) { // 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; // place log record TaskManager.StartTask("WEB_SITE", "SWITCH_TO_SHARED_IP", siteItem.Name, siteItemId); try { IPAddressInfo ip; DomainInfo domain = ServerController.GetDomain(siteItem.Name); DomainInfo ZoneInfo = ServerController.GetDomain(domain.DomainItemId); if (ZoneInfo == null) throw new Exception("Parent zone not found"); if (ZoneInfo.ZoneItemId > 0) { StringDictionary settings = ServerController.GetServiceSettings(siteItem.ServiceId); if (string.IsNullOrEmpty(settings["PublicSharedIP"])) return BusinessErrorCodes.ERROR_PUBLICSHAREDIP_FOR_SHAREDIP; } //cleanup certificates List certificates = GetCertificatesForSite(siteItemId); foreach (SSLCertificate c in certificates) { DeleteCertificate(siteItemId, c); } certificates = GetPendingCertificates(siteItemId); foreach (SSLCertificate c in certificates) { DeleteCertificateRequest(siteItemId, c.id); } // remove all web site pointers List 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 WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); List newBindings = new List(); try { web.UpdateSiteBindings(siteItem.SiteId, newBindings.ToArray(), true); } catch (Exception) { } List 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); } //figure out the PackageAddressId PackageIPAddress packageIpAddress = null; var siteIpAddresses = ServerController.GetItemIPAddresses(siteItemId, IPAddressPool.None); foreach (var siteIp in siteIpAddresses) { packageIpAddress = ServerController.GetPackageIPAddress(siteIp.AddressID); if (packageIpAddress != null && packageIpAddress.AddressID == siteItem.SiteIPAddressId) { break; } } //Deallocate IP Address if (packageIpAddress != null) ServerController.DeleteItemIPAddress(siteItemId, packageIpAddress.PackageAddressID); // update site item siteItem.SiteIPAddressId = 0; PackageController.UpdatePackageItem(siteItem); 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); } 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 FillWebServerBindings(List bindings, List dnsRecords, string ipAddr, string hostName, string domainName, bool ignoreGlobalDNSRecords) // TODO test if IPv6 works { int bindingsCount = bindings.Count; foreach (GlobalDnsRecord dnsRecord in dnsRecords) { if ((dnsRecord.RecordType == "A" || dnsRecord.RecordType == "AAAA" || dnsRecord.RecordType == "CNAME") && dnsRecord.RecordName != "*") { string recordData = Utils.ReplaceStringVariable(dnsRecord.RecordName, "host_name", hostName, true); if (!string.IsNullOrEmpty(domainName)) recordData = recordData + ((string.IsNullOrEmpty(recordData)) ? "" : ".") + domainName; //otherwise full recordData is supplied by hostName if (ignoreGlobalDNSRecords) { //only look for the host_nanme record, ignore all others if (dnsRecord.RecordName == "[host_name]") { AddBinding(bindings, new ServerBinding(ipAddr, "80", recordData)); break; } } else { AddBinding(bindings, new ServerBinding(ipAddr, "80", recordData)); } } } if ((bindings.Count == bindingsCount) | (bindings.Count == 0)) { AddBinding(bindings, new ServerBinding(ipAddr, "80", string.IsNullOrEmpty(hostName) ? domainName : string.IsNullOrEmpty(domainName) ? hostName : hostName + "." + domainName)); } } private static void AddBinding(List bindings, ServerBinding binding) { foreach (ServerBinding b in bindings) { if (string.Compare(b.Host, binding.Host, true) == 0) return; } bindings.Add(binding); } private static string GetWebSiteUsername(UserSettings webPolicy, string domainName) { UsernamePolicy policy = new UsernamePolicy(webPolicy["AnonymousAccountPolicy"]); // remove dots from the domain domainName = Regex.Replace(domainName, "\\W+", "", RegexOptions.Compiled); if (!policy.Enabled) { // default algorythm int maxLength = MAX_ACCOUNT_LENGTH - ANON_ACCOUNT_SUFFIX.Length - 2; string username = (domainName.Length > maxLength) ? domainName.Substring(0, maxLength) : domainName; return (username + ANON_ACCOUNT_SUFFIX); // suffix } else { // policy-enabled // use prefix and suffix only // adjust maximum length int maxLength = MAX_ACCOUNT_LENGTH - 2; // 2 symbols for number if (policy.Prefix != null) maxLength -= policy.Prefix.Length; if (policy.Suffix != null) maxLength -= policy.Suffix.Length; string username = (domainName.Length > maxLength) ? domainName.Substring(0, maxLength) : domainName; return ((policy.Prefix != null) ? policy.Prefix : "") + username + ((policy.Suffix != null) ? policy.Suffix : ""); } } private static string GetWebFolder(int packageId, string pattern, string domainName) { string path = Utils.ReplaceStringVariable(pattern, "domain_name", domainName); return FilesController.GetFullPackagePath(packageId, path); } private static string GetFrontPageUsername(string domainName) { int maxLength = MAX_ACCOUNT_LENGTH - FRONTPAGE_ACCOUNT_SUFFIX.Length - 1; string username = (domainName.Length > maxLength) ? domainName.Substring(0, maxLength) : domainName; return (username + FRONTPAGE_ACCOUNT_SUFFIX); // suffix } public static string GetWebUsersOU(int packageId) { int webServiceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.Web); if (webServiceId > 0) { // get users OU defined on web server StringDictionary webSettings = ServerController.GetServiceSettings(webServiceId); return webSettings["ADUsersOU"]; } return null; } #endregion #region Web Site Pointers public static List GetWebSitePointers(int siteItemId) { List pointers = new List(); // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return pointers; // get the list of all domains List myDomains = ServerController.GetMyDomains(siteItem.PackageId); foreach (DomainInfo domain in myDomains) { if (domain.WebSiteId == siteItemId && String.Compare(domain.DomainName, siteItem.Name, true) != 0) pointers.Add(domain); } return pointers; } public static int AddWebSitePointer(int siteItemId, string hostName, int domainId) { return AddWebSitePointer(siteItemId, hostName, domainId, true, true, false); } internal static int AddWebSitePointer(int siteItemId, string hostName, int domainId, bool updateWebSite) { return AddWebSitePointer(siteItemId, hostName, domainId, updateWebSite, false, false); } internal static int AddWebSitePointer(int siteItemId, string hostName, int domainId, bool updateWebSite, bool ignoreGlobalDNSRecords, bool rebuild) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // load domain item DomainInfo domain = ServerController.GetDomain(domainId); if (domain == null) return BusinessErrorCodes.ERROR_DOMAIN_PACKAGE_ITEM_NOT_FOUND; // check if the web site already exists if (!rebuild) { if (DataProvider.CheckDomain(domain.PackageId, string.IsNullOrEmpty(hostName) ? domain.DomainName : hostName + "." + domain.DomainName, true) != 0) return BusinessErrorCodes.ERROR_WEB_SITE_ALREADY_EXISTS; } // get zone records for the service List dnsRecords = ServerController.GetDnsRecordsByService(siteItem.ServiceId); // load web site IP address IPAddressInfo ip = ServerController.GetIPAddress(siteItem.SiteIPAddressId); // place log record TaskManager.StartTask("WEB_SITE", "ADD_POINTER", siteItem.Name, siteItemId); TaskManager.WriteParameter("Domain pointer", domain.DomainName); TaskManager.WriteParameter("Host name", hostName); TaskManager.WriteParameter("updateWebSite", updateWebSite.ToString()); try { // load appropriate zone DnsZone zone = (DnsZone)PackageController.GetPackageItem(domain.ZoneItemId); if (zone != null) { // change DNS zone List tmpDnsRecords = new List(); string serviceIp = (ip != null) ? ip.ExternalIP : null; if (string.IsNullOrEmpty(serviceIp)) { StringDictionary settings = ServerController.GetServiceSettings(siteItem.ServiceId); if (settings["PublicSharedIP"] != null) serviceIp = settings["PublicSharedIP"].ToString(); } //filter initiat GlobaDNSRecords list if (ignoreGlobalDNSRecords) { //ignore all other except the host_name record foreach (GlobalDnsRecord r in dnsRecords) { if (r.RecordName == "[host_name]") { tmpDnsRecords.Add(r); break; } } } else tmpDnsRecords = dnsRecords; List resourceRecords = DnsServerController.BuildDnsResourceRecords(tmpDnsRecords, hostName, domain.DomainName, serviceIp); if (!rebuild) { foreach (DnsRecord r in resourceRecords) { if (r.RecordName != "*") { // check if the web site already exists if (DataProvider.CheckDomain(domain.PackageId, string.IsNullOrEmpty(r.RecordName) ? domain.DomainName : r.RecordName + "." + domain.DomainName, true) != 0) return BusinessErrorCodes.ERROR_WEB_SITE_ALREADY_EXISTS; } } } try { DNSServer dns = new DNSServer(); ServiceProviderProxy.Init(dns, zone.ServiceId); DnsRecord[] domainRecords = dns.GetZoneRecords(zone.Name); var duplicateRecords = (from zoneRecord in domainRecords from resRecord in resourceRecords where zoneRecord.RecordName == resRecord.RecordName where zoneRecord.RecordType == resRecord.RecordType select zoneRecord).ToArray(); if (duplicateRecords != null && duplicateRecords.Count() > 0) { dns.DeleteZoneRecords(zone.Name, duplicateRecords); } // add new resource records dns.AddZoneRecords(zone.Name, resourceRecords.ToArray()); } catch (Exception ex1) { TaskManager.WriteError(ex1, "Error updating DNS records"); } } // update host headers List bindings = new List(); // get existing web site bindings WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); bindings.AddRange(web.GetSiteBindings(siteItem.SiteId)); // check if web site has dedicated IP assigned bool dedicatedIp = bindings.Exists(binding => { return String.IsNullOrEmpty(binding.Host) && binding.IP != "*"; }); // update binding only for "shared" ip addresses // add new host headers string ipAddr = "*"; if (ip != null) ipAddr = !String.IsNullOrEmpty(ip.InternalIP) ? ip.InternalIP : ip.ExternalIP; // fill bindings FillWebServerBindings(bindings, dnsRecords, ipAddr, hostName, domain.DomainName, ignoreGlobalDNSRecords); //for logging purposes foreach (ServerBinding b in bindings) { string header = string.Format("{0} {1} {2}", b.Host, b.IP, b.Port); TaskManager.WriteParameter("Add Binding", header); } // update bindings if (updateWebSite) web.UpdateSiteBindings(siteItem.SiteId, bindings.ToArray(), false); // update domain if (!rebuild) { domain.WebSiteId = siteItemId; domain.IsDomainPointer = true; foreach (ServerBinding b in bindings) { //add new domain record if (!string.IsNullOrEmpty(b.Host)) { domain.DomainName = b.Host; DomainInfo domainTmp = ServerController.GetDomain(domain.DomainName); if (!((domainTmp != null) && (domainTmp.WebSiteId == siteItemId))) { int domainID = ServerController.AddDomain(domain, domain.IsInstantAlias, false); domainTmp = ServerController.GetDomain(domainID); if (domainTmp != null) { domainTmp.WebSiteId = siteItemId; domainTmp.ZoneItemId = domain.ZoneItemId; domainTmp.DomainItemId = domainId; ServerController.UpdateDomain(domainTmp); } } } } } else { if (domain.ZoneItemId > 0) { DomainInfo domainTmp = ServerController.GetDomain(string.IsNullOrEmpty(hostName) ? domain.DomainName : hostName + "." + domain.DomainName, true, true); if (domainTmp != null) { domainTmp.ZoneItemId = domain.ZoneItemId; ServerController.UpdateDomain(domainTmp); } } } return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static int DeleteWebSitePointer(int siteItemId, int domainId) { return DeleteWebSitePointer(siteItemId, domainId, true, true, true); } public static int DeleteWebSitePointer(int siteItemId, int domainId, bool updateWebSite, bool ignoreGlobalDNSRecords, bool deleteDomainsRecord) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // load domain item DomainInfo domain = ServerController.GetDomain(domainId); if (domain == null) return BusinessErrorCodes.ERROR_DOMAIN_PACKAGE_ITEM_NOT_FOUND; // load appropriate zone DnsZone zone = (DnsZone)PackageController.GetPackageItem(domain.ZoneItemId); // get zone records for the service List dnsRecords = ServerController.GetDnsRecordsByService(siteItem.ServiceId); // load web site IP address IPAddressInfo ip = ServerController.GetIPAddress(siteItem.SiteIPAddressId); // place log record TaskManager.StartTask("WEB_SITE", "DELETE_POINTER", siteItem.Name, siteItemId); TaskManager.WriteParameter("Domain pointer", domain.DomainName); TaskManager.WriteParameter("updateWebSite", updateWebSite.ToString()); try { if (zone != null) { // change DNS zone List tmpDnsRecords = new List(); string serviceIp = (ip != null) ? ip.ExternalIP : null; if (string.IsNullOrEmpty(serviceIp)) { StringDictionary settings = ServerController.GetServiceSettings(siteItem.ServiceId); if (settings["PublicSharedIP"] != null) serviceIp = settings["PublicSharedIP"].ToString(); } if (ignoreGlobalDNSRecords) { foreach (GlobalDnsRecord r in dnsRecords) { if ((r.RecordName == "[host_name]") | ((r.RecordName + (string.IsNullOrEmpty(r.RecordName) ? domain.ZoneName : "." + domain.ZoneName)) == domain.DomainName)) tmpDnsRecords.Add(r); } } else tmpDnsRecords = dnsRecords; List resourceRecords = DnsServerController.BuildDnsResourceRecords( tmpDnsRecords, domain.DomainName, "", serviceIp); try { DNSServer dns = new DNSServer(); ServiceProviderProxy.Init(dns, zone.ServiceId); dns.DeleteZoneRecords(zone.Name, resourceRecords.ToArray()); } catch(Exception ex1) { TaskManager.WriteError(ex1, "Error deleting DNS records"); } } // get existing web site bindings WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); List bindings = new List(); bindings.AddRange(web.GetSiteBindings(siteItem.SiteId)); // check if web site has dedicated IP assigned bool dedicatedIp = bindings.Exists(binding => { return String.IsNullOrEmpty(binding.Host) && binding.IP != "*"; }); // update binding only for "shared" ip addresses // remove host headers List domainBindings = new List(); FillWebServerBindings(domainBindings, dnsRecords, "", domain.DomainName, "", ignoreGlobalDNSRecords); // fill to remove list List headersToRemove = new List(); foreach (ServerBinding domainBinding in domainBindings) headersToRemove.Add(domainBinding.Host); // remove bndings bindings.RemoveAll(b => { return headersToRemove.Contains(b.Host) && b.Port == "80"; } ); // update bindings if (updateWebSite) web.UpdateSiteBindings(siteItem.SiteId, bindings.ToArray(), true); // update domain if (deleteDomainsRecord) { if ((domain.WebSiteId > 0) && (!domain.IsDomainPointer)) { domain.WebSiteId = 0; ServerController.UpdateDomain(domain); } else { domain.WebSiteId = 0; ServerController.UpdateDomain(domain); ServerController.DeleteDomain(domain.DomainId); } } return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } #endregion #region Virtual Directories public static List GetVirtualDirectories(int siteItemId) { List dirs = new List(); // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return dirs; // truncate home folders WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); WebVirtualDirectory[] vdirs = web.GetVirtualDirectories(siteItem.SiteId); foreach (WebVirtualDirectory vdir in vdirs) { vdir.ContentPath = FilesController.GetVirtualPackagePath(siteItem.PackageId, vdir.ContentPath); dirs.Add(vdir); } return dirs; } public static WebVirtualDirectory GetVirtualDirectory(int siteItemId, string vdirName) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return null; // create directory WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); WebVirtualDirectory vdir = web.GetVirtualDirectory(siteItem.SiteId, vdirName); // truncate home folder vdir.ContentPath = FilesController.GetVirtualPackagePath(siteItem.PackageId, vdir.ContentPath); // set name vdir.ParentSiteName = siteItem.Name; vdir.PackageId = siteItem.PackageId; return vdir; } public static int AddVirtualDirectory(int siteItemId, string vdirName, string vdirPath) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // check package int packageCheck = SecurityContext.CheckPackage(siteItem.PackageId, DemandPackage.IsActive); if (packageCheck < 0) return packageCheck; // place log record TaskManager.StartTask("WEB_SITE", "ADD_VDIR", vdirName, siteItemId); TaskManager.WriteParameter("Web site", siteItem.Name); try { // create virtual directory WebVirtualDirectory dir = new WebVirtualDirectory(); dir.Name = vdirName; dir.ContentPath = FilesController.GetFullPackagePath(siteItem.PackageId, vdirPath); dir.EnableAnonymousAccess = true; dir.EnableWindowsAuthentication = true; dir.EnableBasicAuthentication = false; //dir.InstalledDotNetFramework = aspNet; dir.DefaultDocs = null; // inherit from service dir.HttpRedirect = ""; dir.HttpErrors = null; dir.MimeMaps = null; // create directory WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); if (web.VirtualDirectoryExists(siteItem.SiteId, vdirName)) return BusinessErrorCodes.ERROR_VDIR_ALREADY_EXISTS; web.CreateVirtualDirectory(siteItem.SiteId, dir); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static int UpdateVirtualDirectory(int siteItemId, WebVirtualDirectory vdir) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record TaskManager.StartTask("WEB_SITE", "UPDATE_VDIR", vdir.Name, siteItemId); TaskManager.WriteParameter("Web site", siteItem.Name); try { // normalize path vdir.ContentPath = FilesController.GetFullPackagePath(siteItem.PackageId, vdir.ContentPath); // create directory WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); web.UpdateVirtualDirectory(siteItem.SiteId, vdir); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static int DeleteVirtualDirectory(int siteItemId, string vdirName) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record // place log record TaskManager.StartTask("WEB_SITE", "DELETE_VDIR", vdirName, siteItemId); TaskManager.WriteParameter("Web site", siteItem.Name); try { // create directory WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); web.DeleteVirtualDirectory(siteItem.SiteId, vdirName); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } #endregion #region FrontPage public static int InstallFrontPage(int siteItemId, string username, string password) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // check package int packageCheck = SecurityContext.CheckPackage(siteItem.PackageId, DemandPackage.IsActive); if (packageCheck < 0) return packageCheck; // place log record TaskManager.StartTask("WEB_SITE", "INSTALL_FP", siteItem.Name, siteItemId); TaskManager.WriteParameter("FrontPage username", username); try { WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); // load original site //WebSite origSite = GetWebSite(siteItemId); // install FP bool success = web.InstallFrontPage(siteItem.SiteId, username, password); if (!success) { TaskManager.WriteWarning("Account exists"); return BusinessErrorCodes.ERROR_FP_ACCOUNT_EXISTS; } // update site with FP account siteItem.FrontPageAccount = username; siteItem.FrontPagePassword = CryptoUtils.Encrypt(password); PackageController.UpdatePackageItem(siteItem); // restore original site //UpdateWebSite(origSite); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static int UninstallFrontPage(int siteItemId) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record TaskManager.StartTask("WEB_SITE", "UNINSTALL_FP", siteItem.Name, siteItemId); TaskManager.WriteParameter("FrontPage username", siteItem.FrontPageAccount); try { if (String.IsNullOrEmpty(siteItem.FrontPageAccount)) siteItem.FrontPageAccount = GetFrontPageUsername(siteItem.Name); WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); web.UninstallFrontPage(siteItem.SiteId, siteItem.FrontPageAccount); // update site with FP account siteItem.FrontPageAccount = ""; PackageController.UpdatePackageItem(siteItem); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static int ChangeFrontPagePassword(int siteItemId, string password) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record TaskManager.StartTask("WEB_SITE", "CHANGE_FP_PASSWORD", siteItem.Name, siteItemId); TaskManager.WriteParameter("FrontPage username", siteItem.FrontPageAccount); try { if (String.IsNullOrEmpty(siteItem.FrontPageAccount)) siteItem.FrontPageAccount = GetFrontPageUsername(siteItem.Name); WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); web.ChangeFrontPagePassword(siteItem.FrontPageAccount, password); // update site with FP account siteItem.FrontPagePassword = CryptoUtils.Encrypt(password); PackageController.UpdatePackageItem(siteItem); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } #endregion #region Secured Folders public static int InstallSecuredFolders(int siteItemId) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record TaskManager.StartTask("WEB_SITE", "INSTALL_SECURED_FOLDERS", siteItem.Name, siteItemId); try { // install folders WebServer web = GetWebServer(siteItem.ServiceId); web.InstallSecuredFolders(siteItem.SiteId); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static int UninstallSecuredFolders(int siteItemId) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record TaskManager.StartTask("WEB_SITE", "UNINSTALL_SECURED_FOLDERS", siteItem.Name, siteItemId); try { // install folders WebServer web = GetWebServer(siteItem.ServiceId); web.UninstallSecuredFolders(siteItem.SiteId); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static WebFolder[] GetFolders(int siteItemId) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return null; // get folders WebServer web = GetWebServer(siteItem.ServiceId); return web.GetFolders(siteItem.SiteId); } public static WebFolder GetFolder(int siteItemId, string folderPath) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return null; // get folder WebServer web = GetWebServer(siteItem.ServiceId); return web.GetFolder(siteItem.SiteId, folderPath); } public static int UpdateFolder(int siteItemId, WebFolder folder) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; folder.Path = FilesController.CorrectRelativePath(folder.Path); // place log record TaskManager.StartTask("WEB_SITE", "UPDATE_SECURED_FOLDER", siteItem.Name, siteItemId); TaskManager.WriteParameter("Folder", folder.Path); try { // update folder WebServer web = GetWebServer(siteItem.ServiceId); web.UpdateFolder(siteItem.SiteId, folder); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static int DeleteFolder(int siteItemId, string folderPath) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record TaskManager.StartTask("WEB_SITE", "DELETE_SECURED_FOLDER", siteItem.Name, siteItemId); TaskManager.WriteParameter("Folder", folderPath); try { // delete folder WebServer web = GetWebServer(siteItem.ServiceId); web.DeleteFolder(siteItem.SiteId, folderPath); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } #endregion #region Secured Users public static WebUser[] GetUsers(int siteItemId) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return null; // get users WebServer web = GetWebServer(siteItem.ServiceId); return web.GetUsers(siteItem.SiteId); } public static WebUser GetUser(int siteItemId, string userName) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return null; // get user WebServer web = GetWebServer(siteItem.ServiceId); return web.GetUser(siteItem.SiteId, userName); } public static int UpdateUser(int siteItemId, WebUser user) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record TaskManager.StartTask("WEB_SITE", "UPDATE_SECURED_USER", siteItem.Name, siteItemId); TaskManager.WriteParameter("User", user.Name); try { // update user WebServer web = GetWebServer(siteItem.ServiceId); web.UpdateUser(siteItem.SiteId, user); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static int DeleteUser(int siteItemId, string userName) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record TaskManager.StartTask("WEB_SITE", "DELETE_SECURED_USER", siteItem.Name, siteItemId); TaskManager.WriteParameter("User", userName); try { // delete user WebServer web = GetWebServer(siteItem.ServiceId); web.DeleteUser(siteItem.SiteId, userName); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } #endregion #region Secured Groups public static WebGroup[] GetGroups(int siteItemId) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return null; // get groups WebServer web = GetWebServer(siteItem.ServiceId); return web.GetGroups(siteItem.SiteId); } public static WebGroup GetGroup(int siteItemId, string groupName) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return null; // get group WebServer web = GetWebServer(siteItem.ServiceId); return web.GetGroup(siteItem.SiteId, groupName); } public static int UpdateGroup(int siteItemId, WebGroup group) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record TaskManager.StartTask("WEB_SITE", "UPDATE_SECURED_GROUP", siteItem.Name, siteItemId); TaskManager.WriteParameter("Group", group.Name); try { // update group WebServer web = GetWebServer(siteItem.ServiceId); web.UpdateGroup(siteItem.SiteId, group); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static int DeleteGroup(int siteItemId, string groupName) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record TaskManager.StartTask("WEB_SITE", "DELETE_SECURED_GROUP", siteItem.Name, siteItemId); TaskManager.WriteParameter("Group", groupName); try { // delete group WebServer web = GetWebServer(siteItem.ServiceId); web.DeleteGroup(siteItem.SiteId, groupName); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } #endregion #region Shared SSL Folders public static List GetSharedSSLDomains(int packageId) { List domains = new List(); PackageSettings settings = PackageController.GetPackageSettings(packageId, PackageSettings.SHARED_SSL_SITES); if (settings != null && !String.IsNullOrEmpty(settings["SharedSslSites"])) domains.AddRange(settings["SharedSslSites"].Split(';')); return domains; } public static DataSet GetRawSSLFoldersPaged(int packageId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) { return PackageController.GetRawPackageItemsPaged(packageId, typeof(SharedSSLFolder), true, filterColumn, filterValue, sortColumn, startRow, maximumRows); } public static List GetSharedSSLFolders(int packageId, bool recursive) { List items = PackageController.GetPackageItemsByType( packageId, typeof(SharedSSLFolder), recursive); return items.ConvertAll( new Converter(ConvertItemToSharedSSLFolder)); } private static SharedSSLFolder ConvertItemToSharedSSLFolder(ServiceProviderItem item) { return (SharedSSLFolder)item; } public static SharedSSLFolder GetSharedSSLFolder(int itemId) { // load original item SharedSSLFolder vdirItem = (SharedSSLFolder)PackageController.GetPackageItem(itemId); if (vdirItem == null) return null; // load shared SSL site int idx = vdirItem.Name.LastIndexOf("/"); string domainName = vdirItem.Name.Substring(0, idx); string vdirName = vdirItem.Name.Substring(idx + 1); WebServer web = GetWebServer(vdirItem.ServiceId); string siteId = web.GetSiteId(domainName); if (siteId == null) return null; // get virtual directory WebVirtualDirectory vdir = web.GetVirtualDirectory(siteId, vdirName); if (vdir != null) { vdir.ContentPath = FilesController.GetVirtualPackagePath(vdirItem.PackageId, vdir.ContentPath); } vdir.Id = itemId; vdir.Name = vdirItem.Name; vdir.PackageId = vdirItem.PackageId; return ObjectUtils.ConvertObject(vdir); } public static int AddSharedSSLFolder(int packageId, string sslDomain, int webSiteId, string vdirName, string vdirPath) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // check package int packageCheck = SecurityContext.CheckPackage(packageId, DemandPackage.IsActive); if (packageCheck < 0) return packageCheck; // check quota QuotaValueInfo sitesQuota = PackageController.GetPackageQuota(packageId, Quotas.WEB_SHAREDSSL); if (sitesQuota.QuotaExhausted) return BusinessErrorCodes.ERROR_WEB_SHARED_SSL_QUOTA_LIMIT; //get site WebSite site = GetWebSite(webSiteId); bool updateRequired = (site != null) && (site.Name.Equals(sslDomain, StringComparison.InvariantCulture) != true); // place log record TaskManager.StartTask("WEB_SITE", "ADD_SSL_FOLDER", sslDomain); TaskManager.WriteParameter("Directory name", vdirName); TaskManager.WriteParameter("Path", vdirPath); try { // create virtual directory SharedSSLFolder dir = new SharedSSLFolder(); dir.Name = vdirName; dir.ContentPath = FilesController.GetFullPackagePath(packageId, vdirPath); dir.EnableAnonymousAccess = true; dir.EnableWindowsAuthentication = true; dir.EnableBasicAuthentication = false; //dir.InstalledDotNetFramework = aspNet; dir.DefaultDocs = null; // inherit from service dir.HttpRedirect = ""; dir.HttpErrors = null; dir.MimeMaps = null; // create directory int serviceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.Web); WebServer web = GetWebServer(serviceId); // get site id string siteId = web.GetSiteId(sslDomain); if (siteId == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // check if vdir exists if (web.VirtualDirectoryExists(siteId, vdirName)) return BusinessErrorCodes.ERROR_VDIR_ALREADY_EXISTS; if (updateRequired) { dir.ApplicationPool = site.ApplicationPool; dir.AnonymousUsername = site.AnonymousUsername; dir.AnonymousUserPassword = site.AnonymousUserPassword; dir.DedicatedApplicationPool = site.DedicatedApplicationPool; dir.AspInstalled = site.AspInstalled; dir.AspNetInstalled = site.AspNetInstalled; dir.CgiBinInstalled = site.CgiBinInstalled; } // create vdir WebVirtualDirectory virtDir = ObjectUtils.ConvertObject(dir); web.CreateVirtualDirectory(siteId, virtDir); //anonymous user and applcation pool if (updateRequired) { web.UpdateVirtualDirectory(siteId, virtDir); } // save item dir.Name = sslDomain + "/" + vdirName; dir.PackageId = packageId; dir.ServiceId = serviceId; int itemId = PackageController.AddPackageItem(dir); TaskManager.ItemId = itemId; return itemId; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static int UpdateSharedSSLFolder(SharedSSLFolder vdir) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load original item SharedSSLFolder origVdir = (SharedSSLFolder)PackageController.GetPackageItem(vdir.Id); if (origVdir == null) return 0; // place log record TaskManager.StartTask("WEB_SITE", "UPDATE_SSL_FOLDER", origVdir.Name, vdir.Id); try { int idx = origVdir.Name.LastIndexOf("/"); string domainName = origVdir.Name.Substring(0, idx); string vdirName = origVdir.Name.Substring(idx + 1); WebServer web = GetWebServer(origVdir.ServiceId); string siteId = web.GetSiteId(domainName); if (siteId == null) return 0; // normalize path vdir.ContentPath = FilesController.GetFullPackagePath(origVdir.PackageId, vdir.ContentPath); vdir.Name = vdirName; // copy object WebVirtualDirectory virtDir = ObjectUtils.ConvertObject(vdir); // update directory web.UpdateVirtualDirectory(siteId, virtDir); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static int DeleteSharedSSLFolder(int itemId) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load original item SharedSSLFolder origVdir = (SharedSSLFolder)PackageController.GetPackageItem(itemId); if (origVdir == null) return 0; // place log record TaskManager.StartTask("WEB_SITE", "DELETE_SSL_FOLDER", origVdir.Name, itemId); try { int idx = origVdir.Name.LastIndexOf("/"); string domainName = origVdir.Name.Substring(0, idx); string vdirName = origVdir.Name.Substring(idx + 1); WebServer web = GetWebServer(origVdir.ServiceId); string siteId = web.GetSiteId(domainName); if (siteId == null) return 0; // delete directory web.DeleteVirtualDirectory(siteId, vdirName); // delete item PackageController.DeletePackageItem(itemId); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } #endregion #region Web Deploy Publishing Access public static ResultObject SaveWebDeployPublishingProfile(int siteItemId, int[] serviceItemIds) { ResultObject result = new ResultObject { IsSuccess = true }; try { TaskManager.StartTask(LOG_SOURCE_WEB, "SaveWebDeployPublishingProfile"); TaskManager.WriteParameter("SiteItemId", siteItemId); // load site item var item = (WebSite)PackageController.GetPackageItem(siteItemId); // if (item == null) { TaskManager.WriteError("Web site not found"); // result.AddError("WEBSITE_NOT_FOUND", null); result.IsSuccess = false; return result; } // int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) { TaskManager.WriteWarning("Current user is either demo or inactive"); // result.AddError("DEMO_USER", null); result.IsSuccess = false; return result; } // check package int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); if (packageCheck < 0) { TaskManager.WriteWarning("Current user is either not allowed to access the package or the package inactive"); // result.AddError("NOT_ALLOWED", null); result.IsSuccess = false; return result; } // Ensure all service items specified are within the same hosting space // This is a logcally correct and secure statement than the other one // TO-DO: Uncomment this line before demo! //var profileIntegritySucceeded = false; var profileIntegritySucceeded = true; // foreach (int itemId in serviceItemIds) { try { // PackageController.GetPackageItem(itemId); // profileIntegritySucceeded = true; } catch (Exception ex) { TaskManager.WriteError(ex); // profileIntegritySucceeded = false; // Exit from the loop break; } } // if (profileIntegritySucceeded == true) { // Build service items list item.WebDeploySitePublishingProfile = String.Join(",", Array.ConvertAll(serviceItemIds, (int x) => { return x.ToString(); })); // Put changes in effect PackageController.UpdatePackageItem(item); } } catch (Exception ex) { TaskManager.WriteError(ex); // result.IsSuccess = false; } finally { TaskManager.CompleteTask(); } // return result; } public static ResultObject GrantWebDeployPublishingAccess(int siteItemId, string accountName, string accountPassword) { ResultObject result = new ResultObject { IsSuccess = true }; try { TaskManager.StartTask(LOG_SOURCE_WEB, "GrantWeDeployPublishingAccess"); TaskManager.WriteParameter("SiteItemId", siteItemId); // load site item var item = (WebSite)PackageController.GetPackageItem(siteItemId); // if (item == null) { TaskManager.WriteError("Web site not found"); // result.AddError("WEBSITE_NOT_FOUND", null); result.IsSuccess = false; return result; } // int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) { TaskManager.WriteWarning("Current user is either demo or inactive"); // result.AddError("DEMO_USER", null); result.IsSuccess = false; return result; } // check package int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); if (packageCheck < 0) { TaskManager.WriteWarning("Current user is either not allowed to access the package or the package inactive"); // result.AddError("NOT_ALLOWED", null); result.IsSuccess = false; return result; } // WebServer server = GetWebServer(item.ServiceId); StringDictionary webSettings = ServerController.GetServiceSettings(item.ServiceId); if (!String.IsNullOrEmpty(webSettings["WmSvc.NETBIOS"])) { accountName = webSettings["WmSvc.NETBIOS"].ToString() + "\\" + accountName; } // Most part of the functionality used to enable Web Deploy publishing correspond to those created for Web Management purposes, // so we can re-use the existing functionality to deliver seamless development experience. if (server.CheckWebManagementAccountExists(accountName)) { TaskManager.WriteWarning("Account name specified already exists"); // result.AddError("ACCOUNTNAME_PROHIBITED", null); result.IsSuccess = false; return result; } // Most part of the functionality used to enable Web Deploy publishing correspond to those created for Web Management purposes, // so we can re-use the existing functionality to deliver seamless development experience. ResultObject passwResult = server.CheckWebManagementPasswordComplexity(accountPassword); if (!passwResult.IsSuccess) { TaskManager.WriteWarning("Account password does not meet complexity requirements"); // result.ErrorCodes.AddRange(passwResult.ErrorCodes); result.IsSuccess = false; // return result; } // Execute a call to remote server to enable Web Deploy publishing access for the specified user account server.GrantWebDeployPublishingAccess(item.SiteId, accountName, accountPassword); // Enable Web Deploy flag for the web site item.WebDeploySitePublishingEnabled = true; // Remember Web Deploy publishing account item.WebDeployPublishingAccount = accountName; // Remember Web Deploy publishing password item.WebDeployPublishingPassword = CryptoUtils.Encrypt(accountPassword); // Put changes in effect PackageController.UpdatePackageItem(item); } catch (Exception ex) { TaskManager.WriteError(ex); // result.IsSuccess = false; } finally { TaskManager.CompleteTask(); } // return result; } public static void RevokeWebDeployPublishingAccess(int siteItemId) { try { TaskManager.StartTask(LOG_SOURCE_WEB, "RevokeWebDeployPublishingAccess"); TaskManager.WriteParameter("SiteItemId", siteItemId); // load site item var item = (WebSite)PackageController.GetPackageItem(siteItemId); // if (item == null) { TaskManager.WriteWarning("Web site not found"); return; } // int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) { TaskManager.WriteWarning("Current user is either demo or inactive"); return; } // check package int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); if (packageCheck < 0) { TaskManager.WriteWarning("Current user is either not allowed to access the package or the package inactive"); return; } // string accountName = item.WebDeployPublishingAccount; // if (String.IsNullOrEmpty(accountName)) { TaskManager.WriteWarning("Web Deploy Publishing Access account name is either not set or empty"); return; } // WebServer server = GetWebServer(item.ServiceId); // Revoke server.RevokeWebDeployPublishingAccess(item.SiteId, accountName); // Cleanup web site properties item.WebDeployPublishingAccount = String.Empty; item.WebDeploySitePublishingEnabled = false; item.WebDeploySitePublishingProfile = String.Empty; item.WebDeployPublishingPassword = String.Empty; // Put changes into effect PackageController.UpdatePackageItem(item); } catch (Exception ex) { TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static ResultObject ChangeWebDeployPublishingPassword(int siteItemId, string newAccountPassword) { ResultObject result = new ResultObject { IsSuccess = true }; try { TaskManager.StartTask(LOG_SOURCE_WEB, "ChangeWebDeployPublishingPassword"); TaskManager.WriteParameter("SiteItemId", siteItemId); // var item = (WebSite)PackageController.GetPackageItem(siteItemId); // if (item == null) { TaskManager.WriteWarning("Web site not found"); // result.AddError("WEBSITE_NOT_FOUND", null); result.IsSuccess = false; return result; } // int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) { TaskManager.WriteWarning("Current user is either demo or inactive"); result.AddError("DEMO_USER", null); result.IsSuccess = false; return result; } // check package int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); if (packageCheck < 0) { TaskManager.WriteWarning("Current user is either not allowed to access the package or the package inactive"); // result.AddError("NOT_ALLOWED", null); result.IsSuccess = false; return result; } // Revoke access first RevokeWebDeployPublishingAccess(siteItemId); // result = GrantWebDeployPublishingAccess(siteItemId, item.WebDeployPublishingAccount, newAccountPassword); } catch (Exception ex) { TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } // return result; } public static BytesResult GetWebDeployPublishingProfile(int siteItemId) { var result = new BytesResult(); try { TaskManager.StartTask(LOG_SOURCE_WEB, "GetWebDeployPublishingProfile"); TaskManager.WriteParameter("SiteItemId", siteItemId); // load site item WebSite item = (WebSite)PackageController.GetPackageItem(siteItemId); // var siteItem = GetWebSite(siteItemId); // if (item == null) { TaskManager.WriteWarning("Web site not found"); return result; } // int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) { TaskManager.WriteWarning("Current user is either demo or inactive"); return result; } // check package int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); if (packageCheck < 0) { TaskManager.WriteWarning("Current user is either not allowed to access the package or the package inactive"); return result; } // string accountName = item.WebDeployPublishingAccount; // if (String.IsNullOrEmpty(accountName)) { TaskManager.WriteWarning("Web Deploy Publishing Access account name is either not set or empty"); return result; } // var packageInfo = PackageController.GetPackage(item.PackageId); // var userInfo = UserController.GetUser(packageInfo.UserId); // var items = new Hashtable() { { "WebSite", siteItem }, { "User", userInfo }, }; // Retrieve service item ids from the profile var serviceItemIds = Array.ConvertAll( item.WebDeploySitePublishingProfile.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries), (string x) => { return Convert.ToInt32(x.Trim()); }); // foreach (var serviceItemId in serviceItemIds) { var packageItem = PackageController.GetPackageItem(serviceItemId); // Handle SQL databases if (packageItem is SqlDatabase) { var dbItemKey = packageItem.GroupName.StartsWith("MsSQL") ? "MsSqlDatabase" : "MySqlDatabase"; var dbServerKeyExt = packageItem.GroupName.StartsWith("MsSQL") ? "MsSqlServerExternalAddress" : "MySqlServerExternalAddress"; var dbServerKeyInt = packageItem.GroupName.StartsWith("MsSQL") ? "MsSqlServerInternalAddress" : "MySqlServerInternalAddress"; // items.Add(dbItemKey, DatabaseServerController.GetSqlDatabase(serviceItemId)); // Retrieve settings var sqlSettings = ServerController.GetServiceSettings(packageItem.ServiceId); items[dbServerKeyExt] = sqlSettings["ExternalAddress"]; items[dbServerKeyInt] = sqlSettings["InternalAddress"]; } else if (packageItem is SqlUser) { var itemKey = packageItem.GroupName.StartsWith("MsSQL") ? "MsSqlUser" : "MySqlUser"; // items.Add(itemKey, DatabaseServerController.GetSqlUser(serviceItemId)); } else if (packageItem is FtpAccount) { // items.Add("FtpAccount", FtpServerController.GetFtpAccount(serviceItemId)); // Get FTP DNS records List ftpRecords = ServerController.GetDnsRecordsByService(packageItem.ServiceId); if (ftpRecords.Count > 0) { GlobalDnsRecord ftpRecord = ftpRecords[0]; string ftpIp = ftpRecord.ExternalIP; if (String.IsNullOrEmpty(ftpIp)) ftpIp = ftpRecord.RecordData; // Assign FTP service address variable items["FtpServiceAddress"] = ftpIp; } } } // Decrypt publishing password & copy related settings siteItem.WebDeployPublishingPassword = CryptoUtils.Decrypt(item.WebDeployPublishingPassword); siteItem.WebDeployPublishingAccount = item.WebDeployPublishingAccount; siteItem.WebDeploySitePublishingEnabled = item.WebDeploySitePublishingEnabled; siteItem.WebDeploySitePublishingProfile = item.WebDeploySitePublishingProfile; // Retrieve publishing profile template from the Web Policy settings var webPolicy = UserController.GetUserSettings(packageInfo.UserId, UserSettings.WEB_POLICY); // Instantiate template, it's content and related items and then evaluate it var template = new Template(webPolicy["PublishingProfile"]); // Receive bytes for the evaluated template result.Value = Encoding.UTF8.GetBytes(template.Evaluate(items)); // result.IsSuccess = true; } catch (Exception ex) { TaskManager.WriteError(ex); // result.IsSuccess = false; } finally { TaskManager.CompleteTask(); } // return result; } #endregion #region Helicon Ape public static int EnableHeliconApe(int siteItemId) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record TaskManager.StartTask("WEB_SITE", "ENABLE_HELICON_APE", siteItem.Name, siteItemId); try { // install folders WebServer web = GetWebServer(siteItem.ServiceId); web.EnableHeliconApe(siteItem.SiteId); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static int DisableHeliconApe(int siteItemId) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return accountCheck; // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record TaskManager.StartTask("WEB_SITE", "DISABLE_HELICON_APE", siteItem.Name, siteItemId); try { // install folders WebServer web = GetWebServer(siteItem.ServiceId); web.DisableHeliconApe(siteItem.SiteId); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } /// /// Enables Helicon Ape on the server globally. Requires Administrator role to execute. /// /// /// public static int EnableHeliconApeGlobally(int ServiceId) { int accountCheck = SecurityContext.CheckAccount(DemandAccount.IsAdmin | DemandAccount.IsActive | DemandAccount.NotDemo); if (accountCheck < 0) { return accountCheck; } WebServer web = GetWebServer(ServiceId); web.EnableHeliconApe(""); return 0; } /// /// Disables Helicon Ape on the server globally. Requires Administrator role to execute. /// /// /// public static int DisableHeliconApeGlobally(int ServiceId) { int accountCheck = SecurityContext.CheckAccount(DemandAccount.IsAdmin | DemandAccount.IsActive | DemandAccount.NotDemo); // if (accountCheck < 0) { return accountCheck; } WebServer web = GetWebServer(ServiceId); web.DisableHeliconApe(""); return 0; } /// /// Retrieves Helicon Ape extension status from the server. Requires Administrator role to execute. /// /// /// public static HeliconApeStatus GetHeliconApeStatus(int ServiceId) { int accountCheck = SecurityContext.CheckAccount(DemandAccount.IsAdmin | DemandAccount.IsActive | DemandAccount.NotDemo); // if (accountCheck < 0) { return HeliconApeStatus.Empty; } WebServer web = GetWebServer(ServiceId); return web.GetHeliconApeStatus(""); } /// /// Installs Helicon Ape on the target server. Requires Administrator role to execute. /// /// /// public static int InstallHeliconApe(int ServiceId) { int accountCheck = SecurityContext.CheckAccount(DemandAccount.IsAdmin | DemandAccount.IsActive | DemandAccount.NotDemo); // if (accountCheck < 0) { return accountCheck; } // WebServer web = GetWebServer(ServiceId); // web.InstallHeliconApe(String.Empty); // return 0; } public static HtaccessFolder[] GetHeliconApeFolders(int siteItemId) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return null; // get folders WebServer web = GetWebServer(siteItem.ServiceId); return web.GetHeliconApeFolders(siteItem.SiteId); } public static HtaccessFolder GetHeliconApeHttpdFolder(int serviceId) { // get folder WebServer web = GetWebServer(serviceId); return web.GetHeliconApeHttpdFolder(); } public static HtaccessFolder GetHeliconApeFolder(int siteItemId, string folderPath) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return null; // get folder WebServer web = GetWebServer(siteItem.ServiceId); return web.GetHeliconApeFolder(siteItem.SiteId, folderPath); } public static int UpdateHeliconApeFolder(int siteItemId, HtaccessFolder folder) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; folder.Path = FilesController.CorrectRelativePath(folder.Path); // place log record TaskManager.StartTask("WEB_SITE", "UPDATE_HELICON_APE_FOLDER", siteItem.Name, siteItemId); TaskManager.WriteParameter("Folder", folder.Path); try { // update folder WebServer web = GetWebServer(siteItem.ServiceId); web.UpdateHeliconApeFolder(siteItem.SiteId, folder); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static int UpdateHeliconApeHttpdFolder(int serviceId, HtaccessFolder folder) { folder.Path = FilesController.CorrectRelativePath(folder.Path); // place log record TaskManager.StartTask("WEB_SITE", "UPDATE_HELICON_APE_HTTPD_FOLDER"); TaskManager.WriteParameter("Folder", folder.Path); try { // update folder WebServer web = GetWebServer(serviceId); web.UpdateHeliconApeHttpdFolder(folder); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static int DeleteHeliconApeFolder(int siteItemId, string folderPath) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record TaskManager.StartTask("WEB_SITE", "DELETE_HELICON_APE_FOLDER", siteItem.Name, siteItemId); TaskManager.WriteParameter("Folder", folderPath); try { // delete folder WebServer web = GetWebServer(siteItem.ServiceId); web.DeleteHeliconApeFolder(siteItem.SiteId, folderPath); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } #endregion #region Helicon Ape Users public static HtaccessUser[] GetHeliconApeUsers(int siteItemId) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return null; // get users WebServer web = GetWebServer(siteItem.ServiceId); return web.GetHeliconApeUsers(siteItem.SiteId); } public static HtaccessUser GetHeliconApeUser(int siteItemId, string userName) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return null; // get user WebServer web = GetWebServer(siteItem.ServiceId); return web.GetHeliconApeUser(siteItem.SiteId, userName); } public static int UpdateHeliconApeUser(int siteItemId, HtaccessUser user) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record TaskManager.StartTask("WEB_SITE", "UPDATE_HELICON_APE_USER", siteItem.Name, siteItemId); TaskManager.WriteParameter("User", user.Name); try { // update user WebServer web = GetWebServer(siteItem.ServiceId); web.UpdateHeliconApeUser(siteItem.SiteId, user); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static int DeleteHeliconApeUser(int siteItemId, string userName) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record TaskManager.StartTask("WEB_SITE", "DELETE_HELICON_APE_USER", siteItem.Name, siteItemId); TaskManager.WriteParameter("User", userName); try { // delete user WebServer web = GetWebServer(siteItem.ServiceId); web.DeleteHeliconApeUser(siteItem.SiteId, userName); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } #endregion #region Helicon Ape Groups public static WebGroup[] GetHeliconApeGroups(int siteItemId) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return null; // get groups WebServer web = GetWebServer(siteItem.ServiceId); return web.GetHeliconApeGroups(siteItem.SiteId); } public static WebGroup GetHeliconApeGroup(int siteItemId, string groupName) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return null; // get group WebServer web = GetWebServer(siteItem.ServiceId); return web.GetHeliconApeGroup(siteItem.SiteId, groupName); } public static int UpdateHeliconApeGroup(int siteItemId, WebGroup group) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record TaskManager.StartTask("WEB_SITE", "UPDATE_HELICON_APE_GROUP", siteItem.Name, siteItemId); TaskManager.WriteParameter("Group", group.Name); try { // update group WebServer web = GetWebServer(siteItem.ServiceId); web.UpdateHeliconApeGroup(siteItem.SiteId, group); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static int DeleteHeliconApeGroup(int siteItemId, string groupName) { // load site item WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteItemId); if (siteItem == null) return BusinessErrorCodes.ERROR_WEB_SITE_PACKAGE_ITEM_NOT_FOUND; // place log record TaskManager.StartTask("WEB_SITE", "DELETE_HELICON_APE_GROUP", siteItem.Name, siteItemId); TaskManager.WriteParameter("Group", groupName); try { // delete group WebServer web = GetWebServer(siteItem.ServiceId); web.DeleteHeliconApeGroup(siteItem.SiteId, groupName); return 0; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } #endregion #region WebManagement Access public static ResultObject GrantWebManagementAccess(int siteItemId, string accountName, string accountPassword) { ResultObject result = new ResultObject { IsSuccess = true }; try { TaskManager.StartTask(LOG_SOURCE_WEB, "GrantWebManagementAccess"); TaskManager.WriteParameter("SiteItemId", siteItemId); // WebSite item = GetWebSite(siteItemId); // if (item == null) { TaskManager.WriteError("Web site not found"); // result.AddError("WEBSITE_NOT_FOUND", null); result.IsSuccess = false; return result; } // int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) { TaskManager.WriteWarning("Current user is either demo or inactive"); // result.AddError("DEMO_USER", null); result.IsSuccess = false; return result; } // check package int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); if (packageCheck < 0) { TaskManager.WriteWarning("Current user is either not allowed to access the package or the package inactive"); // result.AddError("NOT_ALLOWED", null); result.IsSuccess = false; return result; } // WebServer server = GetWebServer(item.ServiceId); StringDictionary webSettings = ServerController.GetServiceSettings(item.ServiceId); if (!String.IsNullOrEmpty(webSettings["WmSvc.NETBIOS"])) { accountName = webSettings["WmSvc.NETBIOS"].ToString() + "\\" + accountName; } // if (server.CheckWebManagementAccountExists(accountName)) { TaskManager.WriteWarning("Account name specified already exists"); // result.AddError("ACCOUNTNAME_PROHIBITED", null); result.IsSuccess = false; return result; } // ResultObject passwResult = server.CheckWebManagementPasswordComplexity(accountPassword); if (!passwResult.IsSuccess) { TaskManager.WriteWarning("Account password does not meet complexity requirements"); // result.ErrorCodes.AddRange(passwResult.ErrorCodes); result.IsSuccess = false; // return result; } // server.GrantWebManagementAccess(item.SiteId, accountName, accountPassword); } catch (Exception ex) { TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } // return result; } public static void RevokeWebManagementAccess(int siteItemId) { try { TaskManager.StartTask(LOG_SOURCE_WEB, "RevokeWebManagementAccess"); TaskManager.WriteParameter("SiteItemId", siteItemId); // WebSite item = GetWebSite(siteItemId); // if (item == null) { TaskManager.WriteWarning("Web site not found"); return; } // int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) { TaskManager.WriteWarning("Current user is either demo or inactive"); return; } // check package int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); if (packageCheck < 0) { TaskManager.WriteWarning("Current user is either not allowed to access the package or the package inactive"); return; } // string accountName = item.GetValue(WebSite.WmSvcAccountName); // if (String.IsNullOrEmpty(accountName)) { TaskManager.WriteWarning("WebManagement Access account name is either not set or empty"); return; } // WebServer server = GetWebServer(item.ServiceId); // server.RevokeWebManagementAccess(item.SiteId, accountName); } catch (Exception ex) { TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } public static ResultObject ChangeWebManagementAccessPassword(int siteItemId, string accountPassword) { ResultObject result = new ResultObject { IsSuccess = true }; try { TaskManager.StartTask(LOG_SOURCE_WEB, "ChangeWebManagementAccessPassword"); TaskManager.WriteParameter("SiteItemId", siteItemId); // WebSite item = GetWebSite(siteItemId) as WebSite; // if (item == null) { TaskManager.WriteWarning("Web site not found"); // result.AddError("WEBSITE_NOT_FOUND", null); result.IsSuccess = false; return result; } // int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) { TaskManager.WriteWarning("Current user is either demo or inactive"); result.AddError("DEMO_USER", null); result.IsSuccess = false; return result; } // check package int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); if (packageCheck < 0) { TaskManager.WriteWarning("Current user is either not allowed to access the package or the package inactive"); // result.AddError("NOT_ALLOWED", null); result.IsSuccess = false; return result; } // string accountName = item.GetValue(WebSite.WmSvcAccountName); // if (String.IsNullOrEmpty(accountName)) { TaskManager.WriteWarning("WebManagement Access account name is either not set or empty"); result.AddError("EMPTY_WMSVC_ACCOUNT", null); result.IsSuccess = false; return result; } // WebServer server = GetWebServer(item.ServiceId); // ResultObject passwResult = server.CheckWebManagementPasswordComplexity(accountPassword); if (!passwResult.IsSuccess) { TaskManager.WriteWarning("Account password does not meet complexity requirements"); // result.ErrorCodes.AddRange(passwResult.ErrorCodes); result.IsSuccess = false; // return result; } // server.ChangeWebManagementAccessPassword(accountName, accountPassword); } catch (Exception ex) { TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } // return result; } #endregion #region IImportController Members public List GetImportableItems(int packageId, int itemTypeId, Type itemType, ResourceGroupInfo group) { List items = new List(); // get service id int serviceId = PackageController.GetPackageServiceId(packageId, group.GroupName); if (serviceId == 0) return items; WebServer web = GetWebServer(serviceId); if (itemType == typeof(WebSite)) items.AddRange(web.GetSites()); return items; } public void ImportItem(int packageId, int itemTypeId, Type itemType, ResourceGroupInfo group, string itemName) { // Controller supports web sites only if (itemType != typeof(WebSite)) return; // Get service id int serviceId = PackageController.GetPackageServiceId(packageId, group.GroupName); if (serviceId == 0) return; // WebServer web = GetWebServer(serviceId); // Obtaining web site unique id string siteId = web.GetSiteId(itemName); if (siteId == null) return; // Obtaining OperatingSystem service provider id within the context of package. int osServiceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.Os); if (osServiceId == 0) return; // OS.OperatingSystem os = new OS.OperatingSystem(); ServiceProviderProxy.Init(os, osServiceId); // get site info WebSite site = web.GetSite(siteId); PackageIPAddress ipMatch = default(PackageIPAddress); #region Resolving web site ip // Loading package context to evaluate IP Addresses quota PackageContext packageCtx = PackageController.GetPackageContext(packageId); // We are unable to step further because there are // no bindings on the web site to choose from if (site.Bindings == null || site.Bindings.Length == 0) { TaskManager.WriteError("Could not import the web site because it has no bindings assigned."); return; } // Loading service provider settings StringDictionary webSettings = ServerController.GetServiceSettings(serviceId); int sharedIpId = Utils.ParseInt(webSettings["SharedIP"], 0); IPAddressInfo sharedIp = ServerController.GetIPAddress(sharedIpId); // Trying to match site's bindings to against either // external or internal address of the shared ip bool sharedIpMatch = Array.Exists(site.Bindings, x => sharedIp != null && (x.IP.Equals(sharedIp.ExternalIP) || x.IP.Equals(sharedIp.InternalIP))); // Quering dedicated ips package quota allotted bool dedicatedIpsAllotted = Array.Exists(packageCtx.QuotasArray, x => x.QuotaName == Quotas.WEB_IP_ADDRESSES && x.QuotaAllocatedValue != 0); // By default we fallback to the service provider's shared ip, // so the web site being imported is "hooked up" to the proper ip, // even if current bindings match different ip for some reason if (!dedicatedIpsAllotted || sharedIpMatch) { site.SiteIPAddressId = sharedIpId; } // Trying to find a match in dedicated ips list if any. if (dedicatedIpsAllotted && !sharedIpMatch) { // Obtaining first binding with non-empty ip ServerBinding binding = Array.Find(site.Bindings, x => !String.IsNullOrEmpty(x.IP)); // No bindings were found - throw an exception if (binding == null) { TaskManager.WriteError(@"Could not import the web site because IP address field of all of its bindings is empty. Please ensure the web site has been assigned bindings in the appropriate format and then try to run import procedure once again."); return; } // ServiceInfo webService = ServerController.GetServiceInfo(serviceId); // Loading ip addresses from Web Sites address pool related to the package List ips = ServerController.GetPackageUnassignedIPAddresses(packageId, IPAddressPool.WebSites); // Looking for an entry matching by package and external/internal ip ipMatch = Array.Find(ips.ToArray(), x => x.ExternalIP == binding.IP || x.InternalIP == binding.IP); // No match has been found - we are in a fault state if (ipMatch == null) { TaskManager.WriteError(@"Could not import the web site because no dedicated IP address match in the target space has been found. Please ensure the space has been allocated {0} IP address as a dedicated one and it is free. Then try to run import procedure once again.", binding.IP); return; } // site.SiteIPAddressId = ipMatch.AddressID; } #endregion // folders UserInfo user = PackageController.GetPackageOwner(packageId); UserSettings webPolicy = UserController.GetUserSettings(user.UserId, UserSettings.WEB_POLICY); string packageHome = FilesController.GetHomeFolder(packageId); // add random string to the domain if specified string randDomainName = itemName; if (!String.IsNullOrEmpty(webPolicy["AddRandomDomainString"]) && Utils.ParseBool(webPolicy["AddRandomDomainString"], false)) randDomainName += "_" + Utils.GetRandomString(DOMAIN_RANDOM_LENGTH); // ROOT folder string contentPath = GetWebFolder(packageId, WEBSITE_ROOT_FOLDER_PATTERN, randDomainName); if (!String.IsNullOrEmpty(webPolicy["WebRootFolder"])) contentPath = GetWebFolder(packageId, webPolicy["WebRootFolder"], randDomainName); // LOGS folder string logsPath = GetWebFolder(packageId, WEBSITE_LOGS_FOLDER_PATTERN, randDomainName); if (!String.IsNullOrEmpty(webPolicy["WebLogsFolder"])) logsPath = GetWebFolder(packageId, webPolicy["WebLogsFolder"], randDomainName); // DATA folder string dataPath = GetWebFolder(packageId, WEBSITE_DATA_FOLDER_PATTERN, randDomainName); if (!String.IsNullOrEmpty(webPolicy["WebDataFolder"])) dataPath = GetWebFolder(packageId, webPolicy["WebDataFolder"], randDomainName); // copy site files try { os.CopyFile(site.ContentPath, contentPath); } catch (Exception ex) { TaskManager.WriteError(ex, "Can't copy web site files"); } // copy site logs try { string logFolder = (site.IIs7) ? site[WebSite.IIS7_SITE_ID] : "W3SVC" + siteId; string logsSrcFolder = Path.Combine(site.LogsPath, logFolder); if (os.DirectoryExists(logsSrcFolder)) os.CopyFile(logsSrcFolder, Path.Combine(logsPath, logFolder)); } catch (Exception ex) { TaskManager.WriteError(ex, "Can't copy web site log files"); } // set new folders site.ContentPath = contentPath; site.LogsPath = logsPath; site.DataPath = dataPath; // update web site web.UpdateSite(site); // process virtual directories WebVirtualDirectory[] virtDirs = web.GetVirtualDirectories(siteId); foreach (WebVirtualDirectory virtDirPointer in virtDirs) { try { // load virtual directory WebVirtualDirectory virtDir = web.GetVirtualDirectory(siteId, virtDirPointer.Name); // copy directory files string vdirPath = Path.Combine(contentPath, virtDir.Name); os.CopyFile(virtDir.ContentPath, vdirPath); virtDir.ContentPath = vdirPath; // update directory web.UpdateVirtualDirectory(siteId, virtDir); } catch (Exception ex) { TaskManager.WriteError(ex, String.Format("Error importing '{0}' virtual directory", virtDirPointer.Name)); continue; } } // import web site site.ServiceId = serviceId; site.PackageId = packageId; site.Name = itemName; site.SiteId = siteId; int webSiteId = PackageController.AddPackageItem(site); // Assign dedicated IP address to the web site from package context. if (ipMatch != null) { ServerController.AddItemIPAddress(webSiteId, ipMatch.PackageAddressID); } // restore/update domains RestoreDomainsByWebSite(site.Bindings, packageId, webSiteId, itemName); } private void RestoreDomainsByWebSite(ServerBinding[] bindings, int packageId, int webSiteId, string itemName) { // detect all web site related domains List domainNames = new List(); 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); } } } public static int ImporHostHeader(int userId, int packageId, int siteId) { WebSite siteItem = (WebSite)PackageController.GetPackageItem(siteId); if (siteItem == null) return -1; // load live site from service WebServer web = new WebServer(); ServiceProviderProxy.Init(web, siteItem.ServiceId); // Verify if already exists List domains = ServerController.GetDomains(packageId); // Get hostheader foreach (ServerBinding b in web.GetSiteBindings(siteItem.SiteId)) { if ((!DoesHeaderExistInDomains(b.Host.ToLower(), domains)) && (!string.IsNullOrEmpty(b.Host))) { // If not get domain info and add to domains int domainId = FindDomainForHeader(b.Host.ToLower(), domains); if (domainId > 0) { DomainInfo domain = ServerController.GetDomain(domainId); DomainInfo newDomain = new DomainInfo(); newDomain.DomainName = b.Host.ToLower(); newDomain.PackageId = domain.PackageId; newDomain.IsDomainPointer = true; int newDomainID = ServerController.AddDomain(newDomain, domain.IsInstantAlias, false); if (newDomainID > 0) { newDomain = ServerController.GetDomain(newDomainID); if (newDomain != null) { newDomain.WebSiteId = siteId; newDomain.ZoneItemId = domain.ZoneItemId; newDomain.DomainItemId = domain.DomainId; ServerController.UpdateDomain(newDomain); } } } } } return 0; } private static bool DoesHeaderExistInDomains(string header, List domains) { bool bExist = false; if (!string.IsNullOrEmpty(header)) { foreach (DomainInfo d in domains) { if ((header == d.DomainName.ToLower()) && (d.IsDomainPointer)) { bExist = true; break; } } } return bExist; } private static int FindDomainForHeader(string header, List domains) { int domainId = 0; int counter = 0; while ((header.IndexOf(".") != -1) & (counter < 2)) { foreach (DomainInfo d in domains) { if ((header == d.DomainName.ToLower()) && (!d.IsDomainPointer)) { return d.DomainId; } } header = header.Substring(header.IndexOf(".") + 1); counter++; } return domainId; } #endregion #region IBackupController Members public int BackupItem(string tempFolder, System.Xml.XmlWriter writer, ServiceProviderItem item, ResourceGroupInfo group) { if (item is WebSite) { WebServer web = GetWebServer(item.ServiceId); // read web site WebSite itemSite = item as WebSite; string siteId = itemSite.SiteId; WebSite site = web.GetSite(siteId); site.SiteId = itemSite.SiteId; site.SiteIPAddressId = itemSite.SiteIPAddressId; site.DataPath = itemSite.DataPath; site.FrontPageAccount = itemSite.FrontPageAccount; site.FrontPagePassword = itemSite.FrontPagePassword; // serialize web site XmlSerializer serializer = new XmlSerializer(typeof(WebSite)); serializer.Serialize(writer, site); // process virtual directories WebVirtualDirectory[] vdirs = web.GetVirtualDirectories(siteId); foreach (WebVirtualDirectory vdirShort in vdirs) { WebVirtualDirectory vdir = web.GetVirtualDirectory(siteId, vdirShort.Name); // serialize vdir serializer = new XmlSerializer(typeof(WebVirtualDirectory)); serializer.Serialize(writer, vdir); } } else if (item is SharedSSLFolder) { SharedSSLFolder sslFolder = GetSharedSSLFolder(item.Id); // convert content path to physical sslFolder.ContentPath = FilesController.GetFullPackagePath(item.PackageId, sslFolder.ContentPath); XmlSerializer serializer = new XmlSerializer(typeof(SharedSSLFolder)); serializer.Serialize(writer, sslFolder); } return 0; } public int RestoreItem(string tempFolder, System.Xml.XmlNode itemNode, int itemId, Type itemType, string itemName, int packageId, int serviceId, ResourceGroupInfo group) { if (itemType == typeof(WebSite)) { WebServer web = GetWebServer(serviceId); // restore web site XmlSerializer serializer = new XmlSerializer(typeof(WebSite)); WebSite site = (WebSite)serializer.Deserialize( new XmlNodeReader(itemNode.SelectSingleNode("WebSite"))); // create site if required if (!web.SiteExists(site.SiteId)) { web.CreateSite(site); // install FPSE if required if (site.FrontPageInstalled && !web.IsFrontPageInstalled(site.SiteId)) { web.InstallFrontPage(site.SiteId, site.FrontPageAccount, CryptoUtils.Decrypt(site.FrontPagePassword)); } } // restore virtual directories foreach (XmlNode vdirNode in itemNode.SelectNodes("WebVirtualDirectory")) { // deserialize vdir serializer = new XmlSerializer(typeof(WebVirtualDirectory)); WebVirtualDirectory vdir = (WebVirtualDirectory)serializer.Deserialize( new XmlNodeReader(vdirNode)); if (!web.VirtualDirectoryExists(site.SiteId, vdir.Name)) { web.CreateVirtualDirectory(site.SiteId, vdir); } } // add meta-item if required int webSiteId = 0; WebSite existItem = (WebSite)PackageController.GetPackageItemByName(packageId, itemName, typeof(WebSite)); if (existItem == null) { site.PackageId = packageId; site.ServiceId = serviceId; webSiteId = PackageController.AddPackageItem(site); } else { webSiteId = existItem.Id; } // restore/update domains RestoreDomainsByWebSite(site.Bindings, packageId, webSiteId, itemName); } else if (itemType == typeof(SharedSSLFolder)) { WebServer web = GetWebServer(serviceId); // extract meta item XmlSerializer serializer = new XmlSerializer(typeof(SharedSSLFolder)); SharedSSLFolder sslFolder = (SharedSSLFolder)serializer.Deserialize( new XmlNodeReader(itemNode.SelectSingleNode("SharedSSLFolder"))); // create vdir if required int idx = sslFolder.Name.LastIndexOf("/"); string domainName = sslFolder.Name.Substring(0, idx); string vdirName = sslFolder.Name.Substring(idx + 1); string siteId = web.GetSiteId(domainName); if (siteId == null) return -1; if (!web.VirtualDirectoryExists(siteId, vdirName)) { web.CreateVirtualDirectory(siteId, sslFolder); } // add meta-item if required if (PackageController.GetPackageItemByName(packageId, itemName, typeof(SharedSSLFolder)) == null) { sslFolder.PackageId = packageId; sslFolder.ServiceId = serviceId; PackageController.AddPackageItem(sslFolder); } } return 0; } #endregion #region SSL public static SSLCertificate CertificateRequest(SSLCertificate certificate, int siteItemId) { try { TaskManager.StartTask(LOG_SOURCE_WEB, "certificateRequest"); TaskManager.WriteParameter("SiteItemId", siteItemId); TaskManager.WriteParameter("Hostname", certificate.Hostname); WebSite item = GetWebSite(siteItemId) as WebSite; PackageInfo service = PackageController.GetPackage(item.PackageId); TaskManager.WriteParameter("WebSite.Name", item.Name); WebServer server = GetWebServer(item.ServiceId); TaskManager.WriteParameter("item.ServiceId", item.ServiceId); certificate.UserID = service.UserId; // We want to have a unique identifier for the FriendlyName to help us to identify it easily long ticks = DateTime.UtcNow.Ticks - DateTime.Parse("01/01/1970 00:00:00").Ticks; ticks /= 10000000; // Convert windows ticks to seconds //clean up bindings certificate.FriendlyName = String.Format("{0}_{1}", certificate.Hostname, ticks.ToString()); certificate = server.generateCSR(certificate); certificate.id = DataProvider.AddSSLRequest(SecurityContext.User.UserId, item.PackageId, certificate.SiteID, certificate.UserID, certificate.FriendlyName, certificate.Hostname, certificate.CSR, certificate.CSRLength, certificate.DistinguishedName, certificate.IsRenewal, certificate.PreviousId); } catch (Exception ex) { TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } return certificate; } public static ResultObject InstallCertificate(SSLCertificate certificate, int siteItemId) { ResultObject result = new ResultObject { IsSuccess = true }; try { TaskManager.StartTask(LOG_SOURCE_WEB, "installCertificate"); TaskManager.WriteParameter("SiteItemId", siteItemId); TaskManager.WriteParameter("Hostname", certificate.Hostname); WebSite item = GetWebSite(siteItemId) as WebSite; TaskManager.WriteParameter("WebSite.Name", item.Name); WebServer server = GetWebServer(item.ServiceId); TaskManager.WriteParameter("item.ServiceId", item.ServiceId); IPAddressInfo ip = ServerController.GetIPAddress(item.SiteIPAddressId); if (ip != null) item.SiteIPAddress = !String.IsNullOrEmpty(ip.InternalIP) ? ip.InternalIP : ip.ExternalIP; certificate = server.installCertificate(certificate, item); if (certificate.SerialNumber == null) { result.AddError("Error_Installing_certificate", null); result.IsSuccess = false; } DataProvider.CompleteSSLRequest(SecurityContext.User.UserId, item.PackageId, certificate.id, certificate.Certificate, certificate.DistinguishedName, certificate.SerialNumber, certificate.Hash, certificate.ValidFrom, certificate.ExpiryDate); if (certificate.IsRenewal) { DataProvider.DeleteCertificate(SecurityContext.User.UserId, item.PackageId, certificate.PreviousId); } } catch (Exception ex) { result.AddError("0", ex); TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } return result; } public static ResultObject InstallPfx(byte[] pfx, int siteItemId, string password) { ResultObject result = new ResultObject { IsSuccess = true }; try { TaskManager.StartTask(LOG_SOURCE_WEB, "installPFX"); TaskManager.WriteParameter("SiteItemId", siteItemId); WebSite item = GetWebSite(siteItemId) as WebSite; PackageInfo service = PackageController.GetPackage(item.PackageId); TaskManager.WriteParameter("WebSite.Name", item.Name); WebServer server = GetWebServer(item.ServiceId); TaskManager.WriteParameter("item.ServiceId", item.ServiceId); // remove all web site pointers List pointers = GetWebSitePointers(siteItemId); foreach (DomainInfo pointer in pointers) DeleteWebSitePointer(siteItemId, pointer.DomainId, true, true, true); SSLCertificate certificate = server.installPFX(pfx, password, item); if (certificate.SerialNumber == null) { result.AddError("Error_Installing_certificate", null); result.IsSuccess = false; } DataProvider.AddPFX(SecurityContext.User.UserId, item.PackageId, item.Id, service.UserId, certificate.Hostname, certificate.FriendlyName, certificate.DistinguishedName, certificate.CSRLength, certificate.SerialNumber, certificate.ValidFrom, certificate.ExpiryDate); } catch (Exception ex) { result.IsSuccess = false; result.AddError("Error_Installing_certificate", ex); TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } return result; } public static List GetPendingCertificates(int siteItemId) { WebSite item = GetWebSite(siteItemId) as WebSite; List certificates = new List(); return ObjectUtils.CreateListFromDataSet( DataProvider.GetPendingCertificates(SecurityContext.User.UserId, item.PackageId, item.Id, false)); } public static SSLCertificate GetSslCertificateById(int iD) { return ObjectUtils.FillObjectFromDataReader( DataProvider.GetSSLCertificateByID(SecurityContext.User.UserId, iD)); } public static int CheckSSL(int siteID, bool renewal) { return DataProvider.CheckSSL(siteID, renewal); } public static ResultObject CheckSSLForDomain(string domain, int siteID) { ResultObject result = new ResultObject { IsSuccess = true }; return result; } public static SSLCertificate GetSiteCert(int siteid) { return ObjectUtils.FillObjectFromDataReader( DataProvider.GetSiteCert(SecurityContext.User.UserId, siteid)); } public static List GetCertificatesForSite(int siteId) { WebSite item = GetWebSite(siteId) as WebSite; List certificates = new List(); return ObjectUtils.CreateListFromDataSet( DataProvider.GetCertificatesForSite(SecurityContext.User.UserId, item.PackageId, item.Id)); } public static byte[] ExportCertificate(int siteId, string serialNumber, string password) { WebSite item = GetWebSite(siteId) as WebSite; WebServer server = GetWebServer(item.ServiceId); return server.exportCertificate(serialNumber, password); } public static ResultObject DeleteCertificate(int siteId, SSLCertificate certificate) { ResultObject result = new ResultObject { IsSuccess = true }; try { TaskManager.StartTask(LOG_SOURCE_WEB, "DeleteCertificate"); WebSite item = GetWebSite(siteId) as WebSite; WebServer server = GetWebServer(item.ServiceId); result = server.DeleteCertificate(certificate, item); if (result.IsSuccess) { DataProvider.DeleteCertificate(SecurityContext.User.UserId, item.PackageId, certificate.id); } else { List exceptions = result.ErrorCodes; foreach (string s in exceptions) { TaskManager.WriteError(s.ToString()); } } } catch (Exception ex) { TaskManager.WriteError(ex); result.IsSuccess = false; } finally { TaskManager.CompleteTask(); } return result; } public static ResultObject ImportCertificate(int siteId) { ResultObject result = new ResultObject { IsSuccess = true }; try { TaskManager.StartTask(LOG_SOURCE_WEB, "ImportCertificate"); WebSite item = GetWebSite(siteId) as WebSite; WebServer server = GetWebServer(item.ServiceId); PackageInfo service = PackageController.GetPackage(item.PackageId); SSLCertificate certificate = server.ImportCertificate(item); if (!certificate.Success) { result.IsSuccess = false; TaskManager.WriteError(certificate.Certificate.ToString()); } else { DataProvider.AddPFX(SecurityContext.User.UserId, item.PackageId, item.Id, service.UserId, certificate.Hostname, certificate.FriendlyName, certificate.DistinguishedName, certificate.CSRLength, certificate.SerialNumber, certificate.ValidFrom, certificate.ExpiryDate); } } catch (Exception ex) { TaskManager.WriteError(ex); result.IsSuccess = false; } finally { TaskManager.CompleteTask(); } return result; } public static ResultObject CheckCertificate(int siteId) { ResultObject result = new ResultObject { IsSuccess = false }; bool serverResult = false; try { WebSite item = GetWebSite(siteId) as WebSite; WebServer server = GetWebServer(item.ServiceId); serverResult = server.CheckCertificate(item); if (serverResult && !DataProvider.CheckSSLExistsForWebsite(siteId)) { result.IsSuccess = true; } } catch (Exception ex) { result.IsSuccess = false; result.AddError("610", ex); } return result; } public static ResultObject DeleteCertificateRequest(int siteId, int csrID) { ResultObject result = new ResultObject { IsSuccess = true }; try { WebSite item = GetWebSite(siteId); PackageInfo service = PackageController.GetPackage(item.PackageId); DataProvider.DeleteCertificate(SecurityContext.User.UserId, service.PackageId, csrID); } catch (Exception ex) { result.IsSuccess = false; result.AddError("610", ex); } return result; } #endregion } }