// 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.Web; using System.Data; using System.Reflection; using System.Collections; using System.Collections.Specialized; using System.Collections.Generic; using System.Xml; using System.Net.Mail; using WebsitePanel.Providers; using WebsitePanel.Providers.Web; using WebsitePanel.Providers.FTP; using WebsitePanel.Providers.Mail; using WebsitePanel.Providers.OS; using OS = WebsitePanel.Providers.OS; using Reports = WebsitePanel.EnterpriseServer.Base.Reports; using System.Diagnostics; using WebsitePanel.Templates; namespace WebsitePanel.EnterpriseServer { /// /// Summary description for Packages. /// public class PackageController { #region Hosting Plans public static DataSet GetHostingPlans(int userId) { return DataProvider.GetHostingPlans(SecurityContext.User.UserId, userId); } public static DataSet GetHostingAddons(int userId) { return DataProvider.GetHostingAddons(SecurityContext.User.UserId, userId); } public static HostingPlanInfo GetHostingPlan(int planId) { return ObjectUtils.FillObjectFromDataReader( DataProvider.GetHostingPlan(SecurityContext.User.UserId, planId)); } public static DataSet GetHostingPlanQuotas(int packageId, int planId, int serverId) { return DataProvider.GetHostingPlanQuotas(SecurityContext.User.UserId, packageId, planId, serverId); } public static HostingPlanContext GetHostingPlanContext(int planId) { HostingPlanContext context = new HostingPlanContext(); // load hosting plan context.HostingPlan = GetHostingPlan(planId); if (context.HostingPlan == null) return null; // load groups and quotas DataSet ds = GetHostingPlanQuotas(0, planId, 0); List groups = new List(); foreach (DataRow dr in ds.Tables[0].Rows) { HostingPlanGroupInfo group = new HostingPlanGroupInfo(); group.GroupId = (int)dr["GroupID"]; group.GroupName = (string)dr["GroupName"]; bool enabled = (bool)dr["Enabled"]; group.Enabled = enabled; group.CalculateBandwidth = (bool)dr["CalculateBandwidth"]; group.CalculateDiskSpace = (bool)dr["CalculateDiskSpace"]; if (enabled) { groups.Add(group); context.Groups.Add(group.GroupName, group); } } List quotas = new List(); foreach (DataRow dr in ds.Tables[1].Rows) { QuotaValueInfo quota = new QuotaValueInfo(); quota.QuotaId = (int)dr["QuotaId"]; quota.GroupId = (int)dr["GroupId"]; quota.QuotaName = (string)dr["QuotaName"]; quota.QuotaTypeId = (int)dr["QuotaTypeId"]; quota.QuotaAllocatedValue = (int)dr["QuotaValue"]; quotas.Add(quota); context.Quotas.Add(quota.QuotaName, quota); } context.GroupsArray = groups.ToArray(); context.QuotasArray = quotas.ToArray(); return context; } private static string BuildPlanQuotasXml(HostingPlanGroupInfo[] groups, HostingPlanQuotaInfo[] quotas) { // build xml /* XML Format: */ if (groups == null || quotas == null) return null; XmlDocument doc = new XmlDocument(); XmlElement nodePlan = doc.CreateElement("plan"); XmlElement nodeGroups = doc.CreateElement("groups"); nodePlan.AppendChild(nodeGroups); XmlElement nodeQuotas = doc.CreateElement("quotas"); nodePlan.AppendChild(nodeQuotas); // groups if (groups != null) { foreach (HostingPlanGroupInfo group in groups) { XmlElement nodeGroup = doc.CreateElement("group"); nodeGroups.AppendChild(nodeGroup); nodeGroup.SetAttribute("id", group.GroupId.ToString()); nodeGroup.SetAttribute("enabled", group.Enabled ? "1" : "0"); nodeGroup.SetAttribute("calculateDiskSpace", group.CalculateDiskSpace ? "1" : "0"); nodeGroup.SetAttribute("calculateBandwidth", group.CalculateBandwidth ? "1" : "0"); } } // quotas if (quotas != null) { foreach (HostingPlanQuotaInfo quota in quotas) { XmlElement nodeQuota = doc.CreateElement("quota"); nodeQuotas.AppendChild(nodeQuota); nodeQuota.SetAttribute("id", quota.QuotaId.ToString()); nodeQuota.SetAttribute("value", quota.QuotaValue.ToString()); } } return nodePlan.OuterXml; } public static List GetUserAvailableHostingPlans(int userId) { return ObjectUtils.CreateListFromDataSet( DataProvider.GetUserAvailableHostingPlans(SecurityContext.User.UserId, userId)); } public static List GetUserAvailableHostingAddons(int userId) { return ObjectUtils.CreateListFromDataSet( DataProvider.GetUserAvailableHostingAddons(SecurityContext.User.UserId, userId)); } public static int AddHostingPlan(HostingPlanInfo plan) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsReseller); if (accountCheck < 0) return accountCheck; string quotasXml = BuildPlanQuotasXml(plan.Groups, plan.Quotas); return DataProvider.AddHostingPlan(SecurityContext.User.UserId, plan.UserId, plan.PackageId, plan.PlanName, plan.PlanDescription, plan.Available, plan.ServerId, plan.SetupPrice, plan.RecurringPrice, plan.RecurrenceUnit, plan.RecurrenceLength, plan.IsAddon, quotasXml); } public static PackageResult UpdateHostingPlan(HostingPlanInfo plan) { PackageResult result = new PackageResult(); // check account result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsReseller); if (result.Result < 0) return result; string quotasXml = BuildPlanQuotasXml(plan.Groups, plan.Quotas); result.ExceedingQuotas = DataProvider.UpdateHostingPlan(SecurityContext.User.UserId, plan.PlanId, plan.PackageId, plan.ServerId, plan.PlanName, plan.PlanDescription, plan.Available, plan.SetupPrice, plan.RecurringPrice, plan.RecurrenceUnit, plan.RecurrenceLength, quotasXml); if (result.ExceedingQuotas.Tables[0].Rows.Count > 0) result.Result = BusinessErrorCodes.ERROR_PACKAGE_QUOTA_EXCEED; return result; } public static int DeleteHostingPlan(int planId) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsReseller); if (accountCheck < 0) return accountCheck; int result = DataProvider.DeleteHostingPlan(SecurityContext.User.UserId, planId); if (result == -1) return BusinessErrorCodes.ERROR_HOSTING_PLAN_USED_IN_PACKAGE; else if (result == -2) return BusinessErrorCodes.ERROR_HOSTING_ADDON_USED_IN_PACKAGE; return 0; } #endregion #region Packages public static List GetMyPackages(int userId) { List packages = new List(); ObjectUtils.FillCollectionFromDataSet(packages, GetRawMyPackages(userId)); return packages; } public static List GetPackages(int userId) { List packages = new List(); ObjectUtils.FillCollectionFromDataSet( packages, GetRawPackages(userId)); return packages; } public static DataSet GetNestedPackagesSummary(int packageId) { return DataProvider.GetNestedPackagesSummary(SecurityContext.User.UserId, packageId); } public static List GetPackagePackages(int packageId, bool recursive) { List packages = new List(); ObjectUtils.FillCollectionFromDataSet( packages, GetRawPackagePackages(packageId, recursive)); return packages; } public static DataSet GetRawMyPackages(int userId) { return DataProvider.GetMyPackages(SecurityContext.User.UserId, userId); } public static DataSet GetRawPackages(int userId) { return DataProvider.GetPackages(SecurityContext.User.UserId, userId); } public static DataSet GetRawPackagePackages(int packageId, bool recursive) { return DataProvider.GetPackagePackages(SecurityContext.User.UserId, packageId, recursive); } public static DataSet GetPackagesPaged(int userId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) { return DataProvider.GetPackagesPaged(SecurityContext.User.UserId, userId, filterColumn, filterValue, sortColumn, startRow, maximumRows); } public static DataSet GetNestedPackagesPaged(int packageId, string filterColumn, string filterValue, int statusId, int planId, int serverId, string sortColumn, int startRow, int maximumRows) { return DataProvider.GetNestedPackagesPaged(SecurityContext.User.UserId, packageId, filterColumn, filterValue, statusId, planId, serverId, sortColumn, startRow, maximumRows); } public static DataSet SearchServiceItemsPaged(int userId, int itemTypeId, string filterValue, string sortColumn, int startRow, int maximumRows) { return DataProvider.SearchServiceItemsPaged(SecurityContext.User.UserId, userId, itemTypeId, filterValue, sortColumn, startRow, maximumRows); } public static DataSet GetPackageQuotas(int packageId) { return DataProvider.GetPackageQuotas(SecurityContext.User.UserId, packageId); } public static DataSet GetPackageQuotasForEdit(int packageId) { return DataProvider.GetPackageQuotasForEdit(SecurityContext.User.UserId, packageId); } public static PackageInfo GetPackage(int packageId) { return ObjectUtils.FillObjectFromDataReader( DataProvider.GetPackage(SecurityContext.User.UserId, packageId)); } public static PackageContext GetPackageContext(int packageId) { PackageContext context = new PackageContext(); // load package context.Package = GetPackage(packageId); if (context.Package == null) return null; // load groups and quotas DataSet ds = GetPackageQuotas(packageId); List groups = new List(); foreach (DataRow dr in ds.Tables[0].Rows) { HostingPlanGroupInfo group = new HostingPlanGroupInfo(); group.GroupId = (int)dr["GroupID"]; group.GroupName = (string)dr["GroupName"]; group.Enabled = true; group.CalculateBandwidth = (bool)dr["CalculateBandwidth"]; group.CalculateDiskSpace = (bool)dr["CalculateDiskSpace"]; groups.Add(group); context.Groups.Add(group.GroupName, group); } List quotas = new List(); foreach (DataRow dr in ds.Tables[1].Rows) { QuotaValueInfo quota = new QuotaValueInfo(); quota.QuotaId = (int)dr["QuotaId"]; quota.GroupId = (int)dr["GroupId"]; quota.QuotaName = (string)dr["QuotaName"]; quota.QuotaTypeId = (int)dr["QuotaTypeId"]; quota.QuotaAllocatedValue = (int)dr["QuotaValue"]; quota.QuotaUsedValue = (int)dr["QuotaUsedValue"]; quota.QuotaExhausted = (packageId < 2) || (quota.QuotaAllocatedValue != -1 && quota.QuotaUsedValue >= quota.QuotaAllocatedValue); quotas.Add(quota); context.Quotas.Add(quota.QuotaName, quota); } context.GroupsArray = groups.ToArray(); context.QuotasArray = quotas.ToArray(); return context; } public static UserInfo GetPackageOwner(int packageId) { PackageInfo package = GetPackage(packageId); if (package == null) return null; return UserController.GetUser(package.UserId); } public static PackageResult AddPackageWithResources(int userId, int planId, string spaceName, int statusId, bool sendLetter, bool createResources, string domainName, bool createInstantAlias, bool createWebSite, bool createFtpAccount, string ftpAccountName, bool createMailAccount, string hostName) { try { TaskManager.StartTask("HOSTING_SPACE_WR", "ADD", spaceName); PackageResult result = new PackageResult(); // check account result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsResellerCSR); if (result.Result < 0) return result; // check if domain exists result.Result = ServerController.CheckDomain(domainName); if (result.Result < 0) return result; // load user info UserInfo user = UserController.GetUser(userId); if (createFtpAccount) { // check if FTP account exists if (String.IsNullOrEmpty(ftpAccountName)) ftpAccountName = user.Username; if (FtpServerController.FtpAccountExists(ftpAccountName)) { result.Result = BusinessErrorCodes.ERROR_ACCOUNT_WIZARD_FTP_ACCOUNT_EXISTS; return result; } } // load hosting plan HostingPlanInfo plan = PackageController.GetHostingPlan(planId); string packageName = spaceName; if (String.IsNullOrEmpty(packageName) || packageName.Trim() == "") packageName = plan.PlanName; // create package int packageId = -1; try { result = PackageController.AddPackage( userId, planId, packageName, "", statusId, DateTime.Now, false); } catch (Exception ex) { // error while adding package throw ex; } if (result.Result < 0) return result; packageId = result.Result; // create domain if (createResources) { int domainId = 0; if (!String.IsNullOrEmpty(domainName)) { try { DomainInfo domain = new DomainInfo(); domain.PackageId = packageId; domain.DomainName = domainName; domain.HostingAllowed = false; domainId = ServerController.AddDomain(domain, false, true); if (domainId < 0) { result.Result = domainId; DeletePackage(packageId); return result; } domain = ServerController.GetDomain(domainId); if (domain != null) { if (domain.ZoneItemId != 0) { ServerController.AddServiceDNSRecords(packageId, ResourceGroups.Os, domain, ""); ServerController.AddServiceDNSRecords(packageId, ResourceGroups.Dns, domain, ""); ServerController.AddServiceDNSRecords(packageId, ResourceGroups.Ftp, domain, ""); ServerController.AddServiceDNSRecords(packageId, ResourceGroups.MsSql2000, domain, ""); ServerController.AddServiceDNSRecords(packageId, ResourceGroups.MsSql2005, domain, ""); ServerController.AddServiceDNSRecords(packageId, ResourceGroups.MsSql2008, domain, ""); ServerController.AddServiceDNSRecords(packageId, ResourceGroups.MsSql2012, domain, ""); ServerController.AddServiceDNSRecords(packageId, ResourceGroups.MySql4, domain, ""); ServerController.AddServiceDNSRecords(packageId, ResourceGroups.MySql5, domain, ""); ServerController.AddServiceDNSRecords(packageId, ResourceGroups.Statistics, domain, ""); ServerController.AddServiceDNSRecords(packageId, ResourceGroups.VPS, domain, ""); ServerController.AddServiceDNSRecords(packageId, ResourceGroups.VPSForPC, domain, ""); } } if (createInstantAlias) ServerController.CreateDomainInstantAlias("", domainId); } catch (Exception ex) { // error while adding domain DeletePackage(packageId); throw new Exception("Could not add domain", ex); } } if (createWebSite && !String.IsNullOrEmpty(domainName)) { // create web site try { int webSiteId = WebServerController.AddWebSite(packageId, hostName, domainId, 0, createInstantAlias, false); if (webSiteId < 0) { result.Result = webSiteId; DeletePackage(packageId); return result; } } catch (Exception ex) { // error while creating web site DeletePackage(packageId); throw new Exception("Could not create web site", ex); } } // create FTP account if (createFtpAccount) { try { FtpAccount ftpAccount = new FtpAccount(); ftpAccount.PackageId = packageId; ftpAccount.Name = ftpAccountName; ftpAccount.Password = user.Password; ftpAccount.Folder = "\\"; ftpAccount.CanRead = true; ftpAccount.CanWrite = true; int ftpAccountId = FtpServerController.AddFtpAccount(ftpAccount); if (ftpAccountId < 0) { result.Result = ftpAccountId; DeletePackage(packageId); return result; } } catch (Exception ex) { // error while creating ftp account DeletePackage(packageId); throw new Exception("Could not create FTP account", ex); } } if (createMailAccount && !String.IsNullOrEmpty(domainName)) { // create default mailbox try { // load mail policy UserSettings settings = UserController.GetUserSettings(userId, UserSettings.MAIL_POLICY); string catchAllName = !String.IsNullOrEmpty(settings["CatchAllName"]) ? settings["CatchAllName"] : "mail"; MailAccount mailbox = new MailAccount(); mailbox.Name = catchAllName + "@" + domainName; mailbox.PackageId = packageId; // gather information from the form mailbox.Enabled = true; mailbox.ResponderEnabled = false; mailbox.ReplyTo = ""; mailbox.ResponderSubject = ""; mailbox.ResponderMessage = ""; // password mailbox.Password = user.Password; // redirection mailbox.ForwardingAddresses = new string[] { }; mailbox.DeleteOnForward = false; mailbox.MaxMailboxSize = 0; int mailAccountId = MailServerController.AddMailAccount(mailbox); if (mailAccountId < 0) { result.Result = mailAccountId; DeletePackage(packageId); return result; } // set catch-all account MailDomain mailDomain = MailServerController.GetMailDomain(packageId, domainName); mailDomain.CatchAllAccount = catchAllName; mailDomain.PostmasterAccount = "mail"; mailDomain.AbuseAccount = "mail"; MailServerController.UpdateMailDomain(mailDomain); int mailDomainId = mailDomain.Id; // set mail domain pointer // load domain instant alias string instantAlias = ServerController.GetDomainAlias(packageId, domainName); DomainInfo instantDomain = ServerController.GetDomain(instantAlias); if (instantDomain == null || instantDomain.MailDomainId > 0) instantAlias = ""; if (!String.IsNullOrEmpty(instantAlias)) MailServerController.AddMailDomainPointer(mailDomainId, instantDomain.DomainId); } catch (Exception ex) { // error while creating mail account DeletePackage(packageId); throw new Exception("Could not create mail account", ex); } } } BackgroundTask topTask = TaskController.GetTopTask(); topTask.ItemId = userId; topTask.UpdateParamValue("SendLetter", sendLetter); TaskController.UpdateTask(topTask); return result; } catch (Exception ex) { throw TaskManager.WriteError(ex); } finally { TaskManager.CompleteTask(); } } /// /// Adds hosting package(space) to the user. /// /// Added as a part of #1084 item fix. /// User id /// Hosting plan id /// Hosting package(space) name /// Hosting package(space) comments /// Hosting package(space) initial status /// Date purchased /// Inidicates whether to send e-mail notification or not /// Hosting package(space) creation result public static PackageResult AddPackage(int userId, int planId, string packageName, string packageComments, int statusId, DateTime purchaseDate, bool sendLetter) { return AddPackage(userId, planId, packageName, packageComments, statusId, purchaseDate, sendLetter, false); } /// /// Adds hosting package(space) to the user. /// /// Modified as a fix for #1084 item. /// User id /// Hosting plan id /// Hosting package(space) name /// Hosting package(space) comments /// Hosting package(space) initial status /// Date purchased /// Inidicates whether to send e-mail notification or not /// Used for external clients to set #Signup# variable in e-mail notification template /// Hosting package(space) creation result public static PackageResult AddPackage(int userId, int planId, string packageName, string packageComments, int statusId, DateTime purchaseDate, bool sendLetter, bool signup) { TaskManager.StartTask("HOSTING_SPACE", "ADD", packageName); PackageResult result = new PackageResult(); try { // check account result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsResellerCSR); if (result.Result < 0) return result; int packageId = -1; result.ExceedingQuotas = DataProvider.AddPackage(SecurityContext.User.UserId, out packageId, userId, planId, packageName, packageComments, statusId, purchaseDate); if (result.ExceedingQuotas.Tables[0].Rows.Count > 0) { result.Result = BusinessErrorCodes.ERROR_PACKAGE_QUOTA_EXCEED; return result; } result.Result = packageId; // allocate "Web Sites" IP addresses int webServiceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.Web); StringDictionary webSettings = ServerController.GetServiceSettings(webServiceId); if (Utils.ParseBool(webSettings["AutoAssignDedicatedIP"], true)) ServerController.AllocateMaximumPackageIPAddresses(packageId, ResourceGroups.Web, IPAddressPool.WebSites); // allocate "VPS" IP addresses int vpsServiceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.VPS); StringDictionary vpsSettings = ServerController.GetServiceSettings(vpsServiceId); if (Utils.ParseBool(vpsSettings["AutoAssignExternalIP"], true)) ServerController.AllocateMaximumPackageIPAddresses(packageId, ResourceGroups.VPS, IPAddressPool.VpsExternalNetwork); // allocate "VPSForPC" IP addresses int vpsfcpServiceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.VPSForPC); StringDictionary vpfcpsSettings = ServerController.GetServiceSettings(vpsfcpServiceId); if (Utils.ParseBool(vpfcpsSettings["AutoAssignExternalIP"], true)) ServerController.AllocateMaximumPackageIPAddresses(packageId, ResourceGroups.VPSForPC, IPAddressPool.VpsExternalNetwork); // load hosting plan HostingPlanInfo plan = GetHostingPlan(planId); // create home folder int homeId = CreatePackageHome(plan.PackageId, packageId, userId); if (homeId < 0) result.Result = homeId; BackgroundTask topTask = TaskController.GetTopTask(); topTask.ItemId = userId; topTask.UpdateParamValue("Signup", signup); topTask.UpdateParamValue("UserId", userId); topTask.UpdateParamValue("SendLetter", sendLetter); TaskController.UpdateTask(topTask); } finally { TaskManager.CompleteTask(); } return result; } public static PackageResult UpdatePackage(PackageInfo package) { TaskManager.StartTask("HOSTING_SPACE", "UPDATE", package.PackageName); PackageResult result = new PackageResult(); try { // check account result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsReseller); if (result.Result < 0) result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsPlatformCSR); if (result.Result < 0) result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsResellerCSR); if (result.Result < 0) return result; // load package PackageInfo originalPackage = GetPackage(package.PackageId); if (originalPackage == null) { result.Result = BusinessErrorCodes.ERROR_PACKAGE_NOT_FOUND; return result; } string quotasXml = BuildPlanQuotasXml(package.Groups, package.Quotas); // update package result.ExceedingQuotas = DataProvider.UpdatePackage(SecurityContext.User.UserId, package.PackageId, package.PlanId, package.PackageName, package.PackageComments, package.StatusId, package.PurchaseDate, package.OverrideQuotas, quotasXml); if (result.ExceedingQuotas.Tables[0].Rows.Count > 0) result.Result = BusinessErrorCodes.ERROR_PACKAGE_QUOTA_EXCEED; // Update the Hard quota on home folder in case it was enabled and in case there was a change in disk space UpdatePackageHardQuota(package.PackageId); } finally { TaskManager.CompleteTask(); } return result; } public static int UpdatePackageName(int packageId, string packageName, string packageComments) { int result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (result < 0) return result; DataProvider.UpdatePackageName(SecurityContext.User.UserId, packageId, packageName, packageComments); return 0; } public static int DeletePackage(int packageId) { return DeletePackage(null, packageId); } public static int DeletePackage(string taskId, int packageId) { TaskManager.StartTask(taskId, "HOSTING_SPACE", "DELETE", packageId); try { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsReseller); if (accountCheck < 0) return accountCheck; // check if package has child packages if (GetPackagePackages(packageId, true).Count > 0) return BusinessErrorCodes.ERROR_PACKAGE_HAS_PACKAGES; // load "root" package PackageInfo package = GetPackage(packageId); if (package == null) return BusinessErrorCodes.ERROR_PACKAGE_NOT_FOUND; // add "root" package List packages = new List(); packages.Add(package); // delete packages DeletePackages(packages); } finally { TaskManager.CompleteTask(); } return 0; } public static int DeletePackages(List packages) { // delete packages asynchronously PackageAsyncWorker packageWorker = new PackageAsyncWorker(); packageWorker.UserId = SecurityContext.User.UserId; packageWorker.Packages = packages; // invoke worker packageWorker.DeletePackagesServiceItemsAsync(); return 0; } public static int ChangePackageStatus(int packageId, PackageStatus status, bool async) { return ChangePackageStatus(null, packageId, status, async); } public static int ChangePackageStatus(string taskId, int packageId, PackageStatus status, bool async) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsResellerCSR); if (accountCheck < 0) return accountCheck; List packages = new List(); // load package PackageInfo package = GetPackage(packageId); if (package == null) return -1; // add "root" package packages.Add(package); // add "child" packages packages.AddRange(GetPackagePackages(packageId, true)); // change packages status ChangePackagesStatus(packages, status, async); return 0; } public static int ChangePackagesStatus(List packages, PackageStatus status, bool async) { int statusId = (int)status; List changedPackages = new List(); foreach (PackageInfo p in packages) { // get package details PackageInfo package = GetPackage(p.PackageId); if (package != null && package.StatusId != statusId) { bool currEnabled = (package.StatusId == (int)PackageStatus.Active); bool enabled = (statusId == (int)PackageStatus.Active); // change package status package.StatusId = statusId; // save package UpdatePackage(package); // add to the list of affected packages if (currEnabled != enabled) changedPackages.Add(package); } } // change service items state asynchronously PackageAsyncWorker packageWorker = new PackageAsyncWorker(); packageWorker.UserId = SecurityContext.User.UserId; packageWorker.Packages = changedPackages; packageWorker.ItemsStatus = status; // invoke worker if (async) packageWorker.ChangePackagesServiceItemsStateAsync(); else packageWorker.ChangePackagesServiceItemsState(); return 0; } private static int CreatePackageHome(int resellerPackageId, int packageId, int userId) { // request OS service int osId = GetPackageServiceId(packageId, ResourceGroups.Os); if (osId == 0) return 0; //return BusinessErrorCodes.ERROR_OS_RESOURCE_UNAVAILABLE; // load user details UserInfo user = UserController.GetUser(userId); // load package string initialPath = null; // load package settings PackageSettings packageSettings = PackageController.GetPackageSettings(packageId, PackageSettings.SPACES_FOLDER); if (!String.IsNullOrEmpty(packageSettings["ChildSpacesFolder"])) { initialPath = Path.Combine( FilesController.GetFullPackagePath(resellerPackageId, packageSettings["ChildSpacesFolder"]), user.Username); } else { // load service settings StringDictionary osSesstings = ServerController.GetServiceSettings(osId); // build initial path string usersHome = osSesstings["UsersHome"]; if (!usersHome.EndsWith("\\")) usersHome += '\\'; initialPath = Path.Combine(usersHome, user.Username); } OS.OperatingSystem os = new OS.OperatingSystem(); ServiceProviderProxy.Init(os, osId); string path = os.CreatePackageFolder(initialPath); // store home folder info HomeFolder homeFolder = new HomeFolder(); homeFolder.ServiceId = osId; homeFolder.PackageId = packageId; homeFolder.Name = path; // Added By Haya UpdatePackageHardQuota(packageId); // save package item return AddPackageItem(homeFolder); } public static DateTime GetPackageBandwidthUpdate(int packageId) { return DataProvider.GetPackageBandwidthUpdate(packageId); } public static void UpdatePackageBandwidthUpdate(int packageId, DateTime updateDate) { DataProvider.UpdatePackageBandwidthUpdate(packageId, updateDate); } // This gets the system quota and updates the home folder with the value public static void UpdatePackageHardQuota(int packageId) { // request OS service int osId = GetPackageServiceId(packageId, ResourceGroups.Os); if (osId == 0) return; OS.OperatingSystem os = new OS.OperatingSystem(); ServiceProviderProxy.Init(os, osId); //Get operating system settings StringDictionary osSesstings = ServerController.GetServiceSettings(osId); bool diskQuotaEnabled = (osSesstings["EnableHardQuota"] != null) ? bool.Parse(osSesstings["EnableHardQuota"]) : false; string driveName = osSesstings["LocationDrive"]; if (!diskQuotaEnabled) return; string homeFolder = FilesController.GetHomeFolder(packageId); FilesController.SetFolderQuota(packageId, homeFolder, driveName); } #endregion #region Package Add-ons public static DataSet GetPackageAddons(int packageId) { return DataProvider.GetPackageAddons(SecurityContext.User.UserId, packageId); } public static PackageAddonInfo GetPackageAddon(int packageAddonId) { return ObjectUtils.FillObjectFromDataReader( DataProvider.GetPackageAddon(SecurityContext.User.UserId, packageAddonId)); } public static PackageResult AddPackageAddonById(int packageId, int addonPlanId, int quantity) { PackageAddonInfo addon = new PackageAddonInfo(); addon.PackageId = packageId; addon.PlanId = addonPlanId; addon.Quantity = quantity; addon.PurchaseDate = DateTime.Now; addon.StatusId = 1; // active addon.Comments = ""; return AddPackageAddon(addon); } public static PackageResult AddPackageAddon(PackageAddonInfo addon) { PackageResult result = new PackageResult(); // check account result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsReseller); if (result.Result < 0) result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsPlatformCSR); if (result.Result < 0) result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsResellerCSR); if (result.Result < 0) return result; int addonId = 0; result.ExceedingQuotas = DataProvider.AddPackageAddon(SecurityContext.User.UserId, out addonId, addon.PackageId, addon.PlanId, addon.Quantity, addon.StatusId, addon.PurchaseDate, addon.Comments); if (result.ExceedingQuotas.Tables[0].Rows.Count > 0) { result.Result = BusinessErrorCodes.ERROR_PACKAGE_QUOTA_EXCEED; return result; } result.Result = addonId; // Update the Hard quota on home folder in case it was enabled and in case there was a change in disk space UpdatePackageHardQuota(addon.PackageId); return result; } public static PackageResult UpdatePackageAddon(PackageAddonInfo addon) { PackageResult result = new PackageResult(); // check account result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsReseller); if (result.Result < 0) result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsPlatformCSR); if (result.Result < 0) result.Result = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsResellerCSR); if (result.Result < 0) return result; result.ExceedingQuotas = DataProvider.UpdatePackageAddon(SecurityContext.User.UserId, addon.PackageAddonId, addon.PlanId, addon.Quantity, addon.StatusId, addon.PurchaseDate, addon.Comments); if (result.ExceedingQuotas.Tables[0].Rows.Count > 0) result.Result = BusinessErrorCodes.ERROR_PACKAGE_QUOTA_EXCEED; // Update the Hard quota on home folder in case it was enabled and in case there was a change in disk space UpdatePackageHardQuota(addon.PackageId); return result; } public static int DeletePackageAddon(int packageAddonId) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsReseller); if (accountCheck < 0) return accountCheck; // Update the Hard quota on home folder in case it was enabled and in case there was a change in disk space UpdatePackageHardQuota(GetPackageAddon(packageAddonId).PackageId); DataProvider.DeletePackageAddon(SecurityContext.User.UserId, packageAddonId); return 0; } #endregion #region Package Items public static DataSet GetSearchableServiceItemTypes() { return DataProvider.GetSearchableServiceItemTypes(); } public static int GetPackageServiceId(int packageId, string groupName) { return DataProvider.GetPackageServiceId(SecurityContext.User.UserId, packageId, groupName); } public static List GetPackageItemsByName(int packageId, string itemName) { DataSet dsItems = DataProvider.GetServiceItemsByName( SecurityContext.User.UserId, packageId, itemName); return CreateServiceItemsList(dsItems, 0); } public static List GetPackageItemsByType(int packageId, string groupName, Type itemType) { return GetPackageItemsByType(packageId, groupName, itemType, false); } public static List GetPackageItemsByType(int packageId, Type itemType) { return GetPackageItemsByType(packageId, null, itemType, false); } public static List GetPackageItemsByType(int packageId, Type itemType, bool recursive) { return GetPackageItemsByType(packageId, null, itemType, recursive); } public static List GetPackageItemsByType(int packageId, string groupName, Type itemType, bool recursive) { string typeName = ObjectUtils.GetTypeFullName(itemType); DataSet dsItems = DataProvider.GetServiceItems(SecurityContext.User.UserId, packageId, groupName, typeName, recursive); return CreateServiceItemsList(dsItems, 0); } public static List GetPackageItemsByTypeInternal(int packageId, string groupName, Type itemType, bool recursive) { string typeName = ObjectUtils.GetTypeFullName(itemType); DataSet dsItems = DataProvider.GetServiceItems(-1, packageId, groupName, typeName, recursive); return CreateServiceItemsList(dsItems, 0); } public static DataSet GetRawPackageItemsByType(int packageId, Type itemType, bool recursive) { return GetRawPackageItemsByType(packageId, null, itemType, recursive); } public static DataSet GetRawPackageItemsByType(int packageId, string groupName, Type itemType, bool recursive) { string typeName = ObjectUtils.GetTypeFullName(itemType); DataSet dsItems = DataProvider.GetServiceItems(SecurityContext.User.UserId, packageId, groupName, typeName, recursive); FlatternItemsTable(dsItems, 0, itemType); return dsItems; } public static ServiceItemsPaged GetPackageItemsPaged(int packageId, Type itemType, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) { return GetPackageItemsPaged(packageId, null, itemType, false, filterColumn, filterValue, sortColumn, startRow, maximumRows); } public static ServiceItemsPaged GetPackageItemsPaged(int packageId, Type itemType, bool recursive, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) { return GetPackageItemsPaged(packageId, null, itemType, recursive, filterColumn, filterValue, sortColumn, startRow, maximumRows); } public static DataSet GetRawPackageItemsPaged(int packageId, Type itemType, bool recursive, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) { return GetRawPackageItemsPaged(packageId, null, itemType, recursive, filterColumn, filterValue, sortColumn, startRow, maximumRows); } public static ServiceItemsPaged GetPackageItemsPaged(int packageId, string groupName, Type itemType, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) { return GetPackageItemsPaged(packageId, groupName, itemType, false, filterColumn, filterValue, sortColumn, startRow, maximumRows); } public static ServiceItemsPaged GetPackageItemsPaged(int packageId, string groupName, Type itemType, bool recursive, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) { string typeName = ObjectUtils.GetTypeFullName(itemType); DataSet dsItems = DataProvider.GetServiceItemsPaged( SecurityContext.User.UserId, packageId, groupName, typeName, 0, recursive, filterColumn, filterValue, sortColumn, startRow, maximumRows); ServiceItemsPaged result = new ServiceItemsPaged(); result.RecordsCount = (int)dsItems.Tables[0].Rows[0][0]; result.PageItems = CreateServiceItemsList(dsItems, 1).ToArray(); return result; } public static DataSet GetRawPackageItemsPaged(int packageId, string groupName, Type itemType, bool recursive, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) { return GetRawPackageItemsPaged(packageId, groupName, itemType, 0, recursive, filterColumn, filterValue, sortColumn, startRow, maximumRows); } public static DataSet GetRawPackageItemsPaged(int packageId, string groupName, Type itemType, int serverId, bool recursive, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows) { string typeName = ObjectUtils.GetTypeFullName(itemType); DataSet dsItems = DataProvider.GetServiceItemsPaged( SecurityContext.User.UserId, packageId, groupName, typeName, serverId, recursive, filterColumn, filterValue, sortColumn, startRow, maximumRows); FlatternItemsTable(dsItems, 1, itemType); return dsItems; } public static int GetServiceItemsCount(Type itemType, string groupName) { return GetServiceItemsCount(itemType, groupName, 0); } public static int GetServiceItemsCount(Type itemType, string groupName, int serviceId) { string typeName = ObjectUtils.GetTypeFullName(itemType); return DataProvider.GetServiceItemsCount(typeName, groupName, serviceId); } public static DataSet GetPackageItemsDataSet(int packageId) { return DataProvider.GetServiceItemsByPackage(SecurityContext.User.UserId, packageId); } public static List GetPackageItems(int packageId) { DataSet dsItems = GetPackageItemsDataSet(packageId); return CreateServiceItemsList(dsItems, 0); } public static DataSet GetRawPackageItems(int packageId) { return DataProvider.GetServiceItemsByPackage(SecurityContext.User.UserId, packageId); } public static DataSet GetServiceItemsDataSet(int serviceId) { return DataProvider.GetServiceItemsByService(SecurityContext.User.UserId, serviceId); } public static List GetServiceItems(int serviceId) { DataSet dsItems = GetServiceItemsDataSet(serviceId); return CreateServiceItemsList(dsItems, 0); } public static List GetServiceItemTypes() { return ObjectUtils.CreateListFromDataReader( DataProvider.GetServiceItemTypes()); } public static ServiceProviderItemType GetServiceItemType(int itemTypeId) { return ObjectUtils.FillObjectFromDataReader( DataProvider.GetServiceItemType(itemTypeId)); } public static List GetServiceItemsForStatistics(int serviceId, int packageId, bool calculateDiskspace, bool calculateBandwidth, bool suspendable, bool disposable) { DataSet dsItems = DataProvider.GetServiceItemsForStatistics(SecurityContext.User.UserId, serviceId, packageId, calculateDiskspace, calculateBandwidth, suspendable, disposable); return CreateServiceItemsList(dsItems, 0); } public static ServiceProviderItem GetPackageItem(int itemId) { DataSet dsItem = DataProvider.GetServiceItem(SecurityContext.User.UserId, itemId); DataView dvItem = dsItem.Tables[0].DefaultView; if (dvItem.Count == 0) return null; return CreateServiceItem(dvItem[0], dsItem.Tables[1].DefaultView); } public static ServiceProviderItem GetPackageItemByName(int packageId, string itemName, Type itemType) { return GetPackageItemByName(packageId, null, itemName, itemType); } public static ServiceProviderItem GetPackageItemByName(int packageId, string groupName, string itemName, Type itemType) { string itemTypeName = ObjectUtils.GetTypeFullName(itemType); DataSet dsItem = DataProvider.GetServiceItemByName(SecurityContext.User.UserId, packageId, groupName, itemName, itemTypeName); DataView dvItem = dsItem.Tables[0].DefaultView; if (dvItem.Count == 0) return null; return CreateServiceItem(dvItem[0], dsItem.Tables[1].DefaultView); } public static bool CheckServiceItemExists(string itemName, Type itemType) { return CheckServiceItemExists(itemName, null, itemType); } public static bool CheckServiceItemExists(string itemName, string groupName, Type itemType) { string itemTypeName = ObjectUtils.GetTypeFullName(itemType); return DataProvider.CheckServiceItemExists(itemName, groupName, itemTypeName); } public static bool CheckServiceItemExists(int serviceId, string itemName, Type itemType) { string itemTypeName = ObjectUtils.GetTypeFullName(itemType); return DataProvider.CheckServiceItemExists(serviceId, itemName, itemTypeName); } public static int AddPackageItem(ServiceProviderItem item) { // check parameters if (item.PackageId < 0) throw new ArgumentException("item.PackageId property value should be specified!"); if (item.ServiceId < 0) throw new ArgumentException("item.ServiceId property value should be specified!"); string itemTypeName = ObjectUtils.GetTypeFullName(item.GetType()); // build properties xml string xml = BuildPropertiesXml(ObjectUtils.GetObjectProperties(item, true)); // add item itself int itemId = DataProvider.AddServiceItem(SecurityContext.User.UserId, item.ServiceId, item.PackageId, item.Name, itemTypeName, xml); return itemId; } public static int UpdatePackageItem(ServiceProviderItem item) { // build properties xml string xml = BuildPropertiesXml(ObjectUtils.GetObjectProperties(item, true)); // update item DataProvider.UpdateServiceItem(SecurityContext.User.UserId, item.Id, item.Name, xml); return 0; } private static string BuildPropertiesXml(Hashtable props) { XmlDocument doc = new XmlDocument(); XmlElement nodeProps = doc.CreateElement("properties"); foreach (string propertyName in props.Keys) { XmlElement nodeProp = doc.CreateElement("property"); nodeProp.SetAttribute("name", propertyName); nodeProp.SetAttribute("value", props[propertyName].ToString()); nodeProps.AppendChild(nodeProp); } return nodeProps.OuterXml; } public static int DetachPackageItem(int itemId) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsAdmin); if (accountCheck < 0) return accountCheck; // HACK: Mail accounts detach is hard coded. MailDomain mailDomain = GetPackageItem(itemId) as MailDomain; if (mailDomain != null) { // Load accounts and detach them as well. List accounts = GetPackageItemsByName(mailDomain.PackageId, "%@" + mailDomain.Name); foreach (ServiceProviderItem account in accounts) { DetachPackageItem(account.Id); } } DeletePackageItem(itemId); return 0; } public static int MovePackageItem(int itemId, int destinationServiceId) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive | DemandAccount.IsAdmin); if (accountCheck < 0) return accountCheck; // move item DataProvider.MoveServiceItem(SecurityContext.User.UserId, itemId, destinationServiceId); return 0; } public static int DeletePackageItem(int itemId) { // delete item DataProvider.DeleteServiceItem(SecurityContext.User.UserId, itemId); return 0; } public static int UpdatePackageBandwidth(int packageId, string xml) { DataProvider.UpdatePackageBandwidth(packageId, xml); return 0; } public static int UpdatePackageDiskSpace(int packageId, string xml) { DataProvider.UpdatePackageDiskSpace(packageId, xml); return 0; } public static List CreateServiceItemsList(DataSet dsItems, int itemsTablePosition) { List items = new List(); DataView dvItems = dsItems.Tables[itemsTablePosition].DefaultView; foreach (DataRowView drItem in dvItems) { DataView dvProps = new DataView(dsItems.Tables[itemsTablePosition + 1], "ItemID=" + drItem["ItemID"].ToString(), "", DataViewRowState.CurrentRows); items.Add(CreateServiceItem(drItem, dvProps)); } return items; } private static ServiceProviderItem CreateServiceItem(DataRowView drItem, DataView dvProps) { // create item instance string itemTypeName = (string)drItem["TypeName"]; Type itemType = Type.GetType(itemTypeName); if (itemType == null) itemType = typeof(ServiceProviderItem); // create generic item // create item instance and fill other properties ServiceProviderItem item = (ServiceProviderItem)ObjectUtils.CreateObjectFromDataview( Type.GetType(itemTypeName), dvProps, "PropertyName", "PropertyValue", true); // fill item key properties item.Id = (int)drItem["ItemID"]; item.TypeId = (int)drItem["ItemTypeID"]; item.Name = (string)drItem["ItemName"]; item.PackageId = (int)drItem["PackageID"]; item.ServiceId = (int)drItem["ServiceID"]; item.GroupName = (string)drItem["GroupName"]; item.CreatedDate = Utils.ParseDate(drItem["CreatedDate"]); return item; } private static void FlatternItemsTable(DataSet dsItems, int itemsTablePosition, Type itemType) { DataTable dtItems = dsItems.Tables[itemsTablePosition]; DataTable dtProps = dsItems.Tables[itemsTablePosition + 1]; // add columns to the table PropertyInfo[] props = itemType.GetProperties(BindingFlags.Instance | BindingFlags.Public); foreach (PropertyInfo prop in props) { if (!dtItems.Columns.Contains(prop.Name) && !prop.PropertyType.IsArray) dtItems.Columns.Add(prop.Name, prop.PropertyType); } foreach (DataRow drItem in dtItems.Rows) { DataView dvProps = new DataView(dtProps, "ItemID=" + drItem["ItemID"].ToString(), "", DataViewRowState.CurrentRows); foreach (DataRowView drProp in dvProps) { object propValue = ""; string sVal = (drProp["PropertyValue"] != DBNull.Value) ? drProp["PropertyValue"].ToString() : ""; string columnName = drProp["PropertyName"].ToString(); if (!dtItems.Columns.Contains(columnName)) continue; Type columnType = dtItems.Columns[columnName].DataType; if (columnType == typeof(string)) propValue = sVal; if (columnType == typeof(int)) propValue = (sVal != "") ? Int32.Parse(sVal) : 0; if (columnType == typeof(long)) propValue = (sVal != "") ? Int64.Parse(sVal) : 0; if (columnType == typeof(bool)) propValue = (sVal != "") ? Boolean.Parse(sVal) : false; if (columnType == typeof(Guid)) propValue = (!string.IsNullOrEmpty(sVal)) ? new Guid(sVal) : Guid.Empty; drItem[columnName] = propValue; } } } #endregion #region Package Settings public static PackageSettings GetPackageSettings(int packageId, string settingsName) { IDataReader reader = DataProvider.GetPackageSettings( SecurityContext.User.UserId, packageId, settingsName); PackageSettings settings = new PackageSettings(); settings.PackageId = packageId; settings.SettingsName = settingsName; while (reader.Read()) { settings.PackageId = (int)reader["PackageID"]; settings[(string)reader["PropertyName"]] = (string)reader["PropertyValue"]; } reader.Close(); // set root settings if required if (settings.PackageId < 2) { // instant alias if (String.Compare(PackageSettings.INSTANT_ALIAS, settingsName, true) == 0) { // load package info PackageInfo package = GetPackage(packageId); // load package server ServerInfo srv = ServerController.GetServerByIdInternal(package.ServerId); if (srv != null) settings["InstantAlias"] = srv.InstantDomainAlias; } // name servers else if (String.Compare(PackageSettings.NAME_SERVERS, settingsName, true) == 0) { // load DNS service settings int dnsServiceId = GetPackageServiceId(packageId, ResourceGroups.Dns); if (dnsServiceId > 0) { StringDictionary dnsSettings = ServerController.GetServiceSettings(dnsServiceId); settings["NameServers"] = dnsSettings["NameServers"]; } } // shared SSL sites else if (String.Compare(PackageSettings.SHARED_SSL_SITES, settingsName, true) == 0) { // load WEB service settings int webServiceId = GetPackageServiceId(packageId, ResourceGroups.Web); if (webServiceId > 0) { StringDictionary webSettings = ServerController.GetServiceSettings(webServiceId); settings["SharedSslSites"] = webSettings["SharedSslSites"]; } } // child spaces location else if (String.Compare(PackageSettings.SPACES_FOLDER, settingsName, true) == 0) { settings["ChildSpacesFolder"] = ""; } // Exchange Server else if (String.Compare(PackageSettings.EXCHANGE_SERVER, settingsName, true) == 0) { // load Exchange service settings int exchServiceId = GetPackageServiceId(packageId, ResourceGroups.Exchange); if (exchServiceId > 0) { StringDictionary exchSettings = ServerController.GetServiceSettings(exchServiceId); settings["TempDomain"] = exchSettings["TempDomain"]; } } // VPS else if (String.Compare(PackageSettings.VIRTUAL_PRIVATE_SERVERS, settingsName, true) == 0) { // load Exchange service settings int vpsServiceId = GetPackageServiceId(packageId, ResourceGroups.VPS); if (vpsServiceId > 0) { StringDictionary vpsSettings = ServerController.GetServiceSettings(vpsServiceId); settings["HostnamePattern"] = vpsSettings["HostnamePattern"]; } } //vpforCP else if (String.Compare(PackageSettings.VIRTUAL_PRIVATE_SERVERS_FOR_PRIVATE_CLOUD, settingsName, true) == 0) { int vpsServiceId = GetPackageServiceId(packageId, ResourceGroups.VPSForPC); if (vpsServiceId > 0) { StringDictionary vpsSettings = ServerController.GetServiceSettings(vpsServiceId); settings["HostnamePattern"] = vpsSettings["HostnamePattern"]; } } } return settings; } public static int UpdatePackageSettings(PackageSettings settings) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo); if (accountCheck < 0) return accountCheck; //// get user details //UserInfo user = GetUserInternally(settings.UserId); //// place log record //LogRecord record = new LogRecord(); //record.RecordType = LogRecordType.Information; //record.PackageId = 0; //record.ItemId = settings.UserId; //record.Source = LogSource.USERS; //record.Action = "USERS_UPDATE_USER_SETTINGS"; //record.ActionParameters.Add(user.Username).Add(settings.SettingsName); try { // build xml XmlDocument doc = new XmlDocument(); XmlElement nodeProps = doc.CreateElement("properties"); if (settings.SettingsArray != null) { foreach (string[] pair in settings.SettingsArray) { XmlElement nodeProp = doc.CreateElement("property"); nodeProp.SetAttribute("name", pair[0]); nodeProp.SetAttribute("value", pair[1]); nodeProps.AppendChild(nodeProp); } } string xml = nodeProps.OuterXml; // update settings DataProvider.UpdatePackageSettings(SecurityContext.User.UserId, settings.PackageId, settings.SettingsName, xml); return 0; } catch (Exception ex) { //record.RecordType = LogRecordType.Error; //record.Description["Error"] = ex.ToString(); throw new Exception("Could not update package settings", ex); } //finally //{ // AuditLog.AddRecord(record); //} } #endregion #region Quotas public static QuotaValueInfo GetPackageQuota(int packageId, string quotaName) { QuotaValueInfo quota = ObjectUtils.FillObjectFromDataReader( DataProvider.GetPackageQuota(SecurityContext.User.UserId, packageId, quotaName)); // set exhausted flag quota.QuotaExhausted = (quota.QuotaAllocatedValue != -1 && quota.QuotaUsedValue >= quota.QuotaAllocatedValue); return quota; } #endregion #region Fix for item #1547 by Pavel Tsurbeleu public static string BuildMessageBccField(params string[] bccAddresses) { List mailAddresses = new List(); // foreach (string bccItem in bccAddresses) { if (!String.IsNullOrEmpty(bccItem)) { string bccAddress = bccItem.Trim(); // check if value is semicolon-delimited and convert it to the standard format if (bccAddress.Contains(";")) bccAddress = bccAddress.Replace(';', ','); // mailAddresses.Add(bccAddress); } } // return String.Join(",", mailAddresses.ToArray()); } #endregion #region Templates public static int SendAccountSummaryLetter(int userId, string to, string bcc, bool signup) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo); if (accountCheck < 0) return accountCheck; // load user details UserInfo user = UserController.GetUser(userId); if (user == null) return BusinessErrorCodes.ERROR_USER_NOT_FOUND; UserSettings settings = UserController.GetUserSettings(userId, UserSettings.ACCOUNT_SUMMARY_LETTER); string from = settings["From"]; #region Fix for item #1547 by Pavel Tsurbeleu // Build BCC field bcc = BuildMessageBccField(bcc, settings["CC"], user.SecondaryEmail); #endregion string subject = settings["Subject"]; string body = user.HtmlMail ? settings["HtmlBody"] : settings["TextBody"]; bool isHtml = user.HtmlMail; MailPriority priority = MailPriority.Normal; if (!String.IsNullOrEmpty(settings["Priority"])) priority = (MailPriority)Enum.Parse(typeof(MailPriority), settings["Priority"], true); if (String.IsNullOrEmpty(body)) return 0;// BusinessErrorCodes.ERROR_SETTINGS_ACCOUNT_LETTER_EMPTY_BODY; // load user info if (to == null) to = user.Email; subject = EvaluateAccountTempate(userId, subject, signup, true); body = EvaluateAccountTempate(userId, body, signup, true); // send message return MailHelper.SendMessage(from, to, bcc, subject, body, priority, isHtml); } public static int SendPackageSummaryLetter(int packageId, string to, string bcc, bool signup) { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo); if (accountCheck < 0) return accountCheck; // load package PackageInfo package = GetPackage(packageId); if (package == null) return BusinessErrorCodes.ERROR_PACKAGE_NOT_FOUND; // load user details UserInfo user = UserController.GetUser(package.UserId); if (user == null) return BusinessErrorCodes.ERROR_USER_NOT_FOUND; UserSettings settings = UserController.GetUserSettings(package.UserId, UserSettings.PACKAGE_SUMMARY_LETTER); string from = settings["From"]; #region Fix for item #1547 by Pavel Tsurbeleu // Build BCC field bcc = BuildMessageBccField(bcc, settings["CC"], user.SecondaryEmail); #endregion string subject = settings["Subject"]; string body = user.HtmlMail ? settings["HtmlBody"] : settings["TextBody"]; bool isHtml = user.HtmlMail; MailPriority priority = MailPriority.Normal; if (!String.IsNullOrEmpty(settings["Priority"])) priority = (MailPriority)Enum.Parse(typeof(MailPriority), settings["Priority"], true); if (String.IsNullOrEmpty(body)) return 0;// BusinessErrorCodes.ERROR_SETTINGS_ACCOUNT_LETTER_EMPTY_BODY; // load user info if (to == null) to = user.Email; subject = EvaluatePackageTempate(packageId, subject, signup, true); body = EvaluatePackageTempate(packageId, body, signup, true); // send message return MailHelper.SendMessage(from, to, bcc, subject, body, priority, isHtml); } public static string GetEvaluatedPackageTemplateBody(int packageId, bool signup) { // load user info UserInfo user = GetPackageOwner(packageId); string settingName = user.HtmlMail ? "HtmlBody" : "TextBody"; // get space letter settings UserSettings settings = UserController.GetUserSettings(user.UserId, UserSettings.PACKAGE_SUMMARY_LETTER); string body = settings[settingName]; if (String.IsNullOrEmpty(body)) return null; string result = EvaluatePackageTempate(packageId, body, signup, false); return user.HtmlMail ? result : result.Replace("\n", "
"); } public static string GetEvaluatedAccountTemplateBody(int userId, bool signup) { // load user info UserInfo user = UserController.GetUser(userId); string settingName = user.HtmlMail ? "HtmlBody" : "TextBody"; // get account letter settings UserSettings settings = UserController.GetUserSettings(user.UserId, UserSettings.ACCOUNT_SUMMARY_LETTER); string body = settings[settingName]; if (String.IsNullOrEmpty(body)) return null; string result = EvaluateAccountTempate(userId, body, signup, false); return user.HtmlMail ? result : result.Replace("\n", "
"); } public static string EvaluateUserPackageTempate(int userId, int packageId, string template) { // package context if (packageId > -1) { return EvaluatePackageTempate(packageId, template, false, false); } else { return EvaluateAccountTempate(userId, template, false, false); } } public static string EvaluatePackageTempate(int packageId, string template, bool signup, bool email) { Hashtable items = new Hashtable(); items["Signup"] = signup; items["Email"] = email; // load package PackageInfo package = GetPackage(packageId); if (package == null) return null; // add package context PackageContext cntx = GetPackageContext(packageId); items["space"] = cntx; // get hosting plan HostingPlanInfo plan = GetHostingPlan(package.PlanId); if (plan != null) items["plan"] = plan; // name servers PackageSettings packageSettings = PackageController.GetPackageSettings(packageId, PackageSettings.NAME_SERVERS); string[] nameServers = new string[] { }; if (!String.IsNullOrEmpty(packageSettings["NameServers"])) nameServers = packageSettings["NameServers"].Split(';'); items["NameServers"] = nameServers; // instant alias string instantAlias = null; packageSettings = PackageController.GetPackageSettings(packageId, PackageSettings.INSTANT_ALIAS); if (!String.IsNullOrEmpty(packageSettings["InstantAlias"])) instantAlias = packageSettings["InstantAlias"]; items["InstantAlias"] = instantAlias; // web sites List webSites = WebServerController.GetWebSites(packageId, false); items["WebSites"] = webSites; // domains List domains = ServerController.GetDomains(packageId, false); items["Domains"] = domains; // FTP Server int ftpServiceId = GetPackageServiceId(packageId, ResourceGroups.Ftp); if (ftpServiceId > 0) { // get FTP DNS records List ftpRecords = ServerController.GetDnsRecordsByService(ftpServiceId); if (ftpRecords.Count > 0) { GlobalDnsRecord ftpRecord = ftpRecords[0]; string ftpIp = ftpRecord.ExternalIP; if (String.IsNullOrEmpty(ftpIp)) ftpIp = ftpRecord.RecordData; items["FtpIP"] = ftpIp; } } // FTP accounts List ftpAccounts = FtpServerController.GetFtpAccounts(packageId, false); items["FtpAccounts"] = ftpAccounts; // Mail Accounts List mailAccounts = MailServerController.GetMailAccounts(packageId, false); items["MailAccounts"] = mailAccounts; // mail server IP List mailRecords = new List(); int mailServiceId = GetPackageServiceId(packageId, ResourceGroups.Mail); if (mailServiceId > 0) { StringDictionary mailSettings = ServerController.GetServiceSettings(mailServiceId); if (mailSettings != null) items["MailIP"] = ServerController.GetExternalIPAddress(Utils.ParseInt(mailSettings["ServerIPAddress"], 0)); mailRecords = ServerController.GetDnsRecordsByService(mailServiceId); } items["MailRecords"] = mailRecords; SetSqlServerExternalAddress(packageId, items, ResourceGroups.MsSql2000); SetSqlServerExternalAddress(packageId, items, ResourceGroups.MsSql2005); SetSqlServerExternalAddress(packageId, items, ResourceGroups.MsSql2008); SetSqlServerExternalAddress(packageId, items, ResourceGroups.MsSql2012); SetSqlServerExternalAddress(packageId, items, ResourceGroups.MySql4); SetSqlServerExternalAddress(packageId, items, ResourceGroups.MySql5); // Exchange organizations items["ExchangeOrganizations"] = ExchangeServerController.GetExchangeOrganizations(packageId, false); // Exchange service settings int exchangeServiceId = GetPackageServiceId(packageId, ResourceGroups.Exchange); StringDictionary exchangeSettings = ServerController.GetServiceSettings(exchangeServiceId); if (exchangeSettings != null) { items["TempDomain"] = exchangeSettings["TempDomain"]; items["AutodiscoverIP"] = exchangeSettings["AutodiscoverIP"]; items["AutodiscoverDomain"] = exchangeSettings["AutodiscoverDomain"]; items["OwaUrl"] = exchangeSettings["OwaUrl"]; items["ActiveSyncServer"] = exchangeSettings["ActiveSyncServer"]; items["SmtpServers"] = Utils.ParseDelimitedString(exchangeSettings["SmtpServers"], '\n'); } // package root folder items["PackageRootFolder"] = FilesController.GetHomeFolder(packageId); // get user details UserInfo user = UserController.GetUser(package.UserId); if (user == null) return null; items["user"] = user; // get reseller details UserInfo reseller = UserController.GetUser(user.OwnerId); if (reseller != null) { reseller.Password = ""; items["reseller"] = reseller; } return EvaluateTemplate(template, items); } private static void SetSqlServerExternalAddress(int packageId, Hashtable items, string groupName) { int serviceId = GetPackageServiceId(packageId, groupName); if (serviceId > 0) { StringDictionary sqlSettings = ServerController.GetServiceSettings(serviceId); items[groupName + "Address"] = sqlSettings["ExternalAddress"]; // left for compatibility with existing templates items[groupName + "ExternalAddress"] = sqlSettings["ExternalAddress"]; items[groupName + "InternalAddress"] = sqlSettings["InternalAddress"]; } } public static string EvaluateAccountTempate(int userId, string template, bool signup, bool email) { Hashtable items = new Hashtable(); items["Signup"] = signup; items["Email"] = email; // get user details UserInfo user = UserController.GetUser(userId); if (user == null) return null; items["user"] = user; // get reseller details UserInfo reseller = UserController.GetUser(user.OwnerId); if (reseller != null) { reseller.Password = ""; items["reseller"] = reseller; } // get all purchased packages List packages = GetMyPackages(userId); items["Spaces"] = packages; // hosting plans Hashtable plans = new Hashtable(); foreach (PackageInfo package in packages) { HostingPlanInfo plan = GetHostingPlan(package.PlanId); if (plan != null && !plans.ContainsKey(plan.PlanId)) plans.Add(plan.PlanId, plan); } items["Plans"] = plans; //Add ons Hashtable addOns = new Hashtable(); int i = 0; foreach (PackageInfo package in packages) { List lstAddOns = ObjectUtils.CreateListFromDataSet(GetPackageAddons(package.PackageId)); foreach (PackageAddonInfo addOn in lstAddOns) { addOns.Add(i, addOn); i++; } } items["Addons"] = addOns; // package contexts Hashtable cntxs = new Hashtable(); foreach (PackageInfo package in packages) { PackageContext cntx = GetPackageContext(package.PackageId); cntxs.Add(package.PackageId, cntx); } items["SpaceContexts"] = cntxs; return EvaluateTemplate(template, items); } public static string EvaluateTemplate(string template, Hashtable items) { StringWriter writer = new StringWriter(); try { Template tmp = new Template(template); if (items != null) { foreach (string key in items.Keys) tmp[key] = items[key]; } tmp.Evaluate(writer); } catch (ParserException ex) { return String.Format("Error in template (Line {0}, Column {1}): {2}", ex.Line, ex.Column, ex.Message); } return writer.ToString(); } #endregion #region Reports public static DataSet GetPackagesBandwidthPaged(int userId, int packageId, DateTime startDate, DateTime endDate, string sortColumn, int startRow, int maximumRows) { return DataProvider.GetPackagesBandwidthPaged( SecurityContext.User.UserId, userId, packageId, startDate, endDate, sortColumn, startRow, maximumRows); } public static DataSet GetPackagesDiskspacePaged(int userId, int packageId, string sortColumn, int startRow, int maximumRows) { return DataProvider.GetPackagesDiskspacePaged( SecurityContext.User.UserId, userId, packageId, sortColumn, startRow, maximumRows); } public static DataSet GetPackageBandwidth(int packageId, DateTime startDate, DateTime endDate) { return DataProvider.GetPackageBandwidth( SecurityContext.User.UserId, packageId, startDate, endDate); } public static DataSet GetPackageDiskspace(int packageId) { return DataProvider.GetPackageDiskspace( SecurityContext.User.UserId, packageId); } #endregion #region Overusage Report public static Reports.OverusageReport GetOverusageSummaryReport(int userId, int packageId, DateTime startDate, DateTime endDate) { Reports.OverusageReport report = new Reports.OverusageReport(); report = GetDiskspaceReport(report, userId, packageId, String.Empty); report = GetBandwidthReport(report, userId, packageId, String.Empty, startDate, endDate); return report; } public static Reports.OverusageReport GetDiskspaceOverusageDetailsReport(int userId, int packageId) { Reports.OverusageReport report = new Reports.OverusageReport(); report = GetDiskspaceInformationAboutPackage(report, packageId); report = GetDiskspaceDetails(report); return report; } public static Reports.OverusageReport GetBandwidthDetailsReport(int userId, int packageId, DateTime startDate, DateTime endDate) { Reports.OverusageReport report = new Reports.OverusageReport(); report = GetBandwidthInformationAboutPackage(report, packageId, startDate, endDate); report = GetBandwidthDetails(report, startDate, endDate); return report; } private static Reports.OverusageReport GetDiskspaceInformationAboutPackage(Reports.OverusageReport report, int packageId) { PackageInfo packageInfo = GetPackage(packageId); packageInfo.DiskSpaceQuota = GetPackageQuota(packageId, "OS.Diskspace").QuotaAllocatedValue; packageInfo.DiskSpaceQuota = packageInfo.DiskSpaceQuota < 1 ? 0 : packageInfo.DiskSpaceQuota; // 1. Add HostingSpace row report.HostingSpace.AddHostingSpaceRow( Reports.OverusageReport.HostingSpaceRow .CreateFromPackageInfo( report , packageInfo , UserController.GetUser(packageInfo.UserId) , ServerController.GetServerByIdInternal(packageInfo.ServerId) , packageInfo.DiskSpace > packageInfo.DiskSpaceQuota , packageInfo.BandWidth > packageInfo.BandWidthQuota , String.Empty ) ); report.DiskspaceOverusage.AddDiskspaceOverusageRow( Reports.OverusageReport.DiskspaceOverusageRow .CreateFromPackageInfo( report , packageInfo ) ); return report; } private static Reports.OverusageReport GetBandwidthInformationAboutPackage(Reports.OverusageReport report, int packageId, DateTime startDate, DateTime endDate) { PackageInfo packageInfo = GetPackage(packageId); packageInfo.BandWidthQuota = GetPackageQuota(packageId, "OS.Bandwidth").QuotaAllocatedValue; packageInfo.BandWidthQuota = packageInfo.BandWidthQuota < 1 ? 0 : packageInfo.BandWidthQuota; // 1. Add HostingSpace row report.HostingSpace.AddHostingSpaceRow( Reports.OverusageReport.HostingSpaceRow .CreateFromPackageInfo( report , packageInfo , UserController.GetUser(packageInfo.UserId) , ServerController.GetServerByIdInternal(packageInfo.ServerId) , packageInfo.DiskSpace > packageInfo.DiskSpaceQuota , packageInfo.BandWidth > packageInfo.BandWidthQuota , String.Empty ) ); // 2. Add BandwidthOverusage row report.BandwidthOverusage.AddBandwidthOverusageRow( Reports.OverusageReport.BandwidthOverusageRow .CreateFromPackageInfo( report , packageInfo ) ); return report; } private static Reports.OverusageReport GetBandwidthDetails(Reports.OverusageReport report, DateTime startDate, DateTime endDate) { foreach (Reports.OverusageReport.HostingSpaceRow hsRow in report.HostingSpace.Rows) { DataSet ds = GetPackageBandwidth((int)hsRow.HostingSpaceId, startDate, endDate); foreach (DataRow bwRow in ds.Tables[0].Rows) { report.OverusageDetails.AddOverusageDetailsRow( Reports.OverusageReport.OverusageDetailsRow .CreateFromBandwidthRow(report, bwRow, hsRow.HostingSpaceId, "Bandwidth") ); } } return report; } private static Reports.OverusageReport GetDiskspaceDetails(Reports.OverusageReport report) { foreach (Reports.OverusageReport.HostingSpaceRow hsRow in report.HostingSpace.Rows) { DataSet ds = GetPackageDiskspace((int)hsRow.HostingSpaceId); foreach (DataRow dsRow in ds.Tables[0].Rows) { report.OverusageDetails.AddOverusageDetailsRow( Reports.OverusageReport.OverusageDetailsRow .CreateFromPackageDiskspaceRow(report, dsRow, hsRow.HostingSpaceId, "Diskspace") ); } } return report; } private static Reports.OverusageReport GetBandwidthReport(Reports.OverusageReport report, int userId, long packageId, string rootHostingSpacePath, DateTime startDate, DateTime endDate) { DataTable bwTable = GetPackagesBandwidthPaged(userId, (int)packageId, startDate, endDate); Reports.OverusageReport.HostingSpaceRow hsRow = null; // 1. foreach (DataRow bwRow in bwTable.Rows) { if (Reports.OverusageReport.HostingSpaceRow .VerifyIfBandwidthOverused(bwRow)) { hsRow = report.HostingSpace.FindByHostingSpaceId( Reports.OverusageReport.HostingSpaceRow.GetPackageId(bwRow) ); if (hsRow != null) { hsRow.IsBandwidthOverused = true; } else { report.HostingSpace.AddHostingSpaceRow( CreateHostingSpacesRow(bwRow, report, false, true, rootHostingSpacePath) ); } report.BandwidthOverusage.AddBandwidthOverusageRow( Reports.OverusageReport.BandwidthOverusageRow .CreateFromHostingSpaceDataRow(report, bwRow) ); } } // 2. foreach (DataRow bwRow in bwTable.Rows) { if (Reports.OverusageReport.HostingSpaceRow .IsContainChildSpaces(bwRow)) { report = GetBandwidthReport( report , userId , Reports.OverusageReport.HostingSpaceRow.GetPackageId(bwRow) , String.Format( "{0} \\ {1}" , rootHostingSpacePath , Reports.OverusageReportUtils.GetStringOrDefault(bwRow, "PackageName", String.Empty) ) , startDate , endDate ); } } return report; } /// /// Gathers summary information about disksapce usage. /// /// /// /// /// private static Reports.OverusageReport GetDiskspaceReport(Reports.OverusageReport report, int userId, long packageId, string rootHostingSpacePath) { DataTable dsTable = GetPackagesDiskspacePaged(userId, (int)packageId); Reports.OverusageReport.HostingSpaceRow hsRow = null; //1. generate basic list of reports foreach (DataRow dsRow in dsTable.Rows) { if (Reports.OverusageReport.HostingSpaceRow .VerifyIfDiskspaceOverused(dsRow)) { //determine whether this row already exists in the table hsRow = report.HostingSpace.FindByHostingSpaceId( Reports.OverusageReport.HostingSpaceRow.GetPackageId(dsRow) ); if (hsRow != null) { //if so, just update it's Diskspace overusage status hsRow.IsDiskspaceOverused = true; } else { //othrewise, create a new one report.HostingSpace.AddHostingSpaceRow( CreateHostingSpacesRow(dsRow, report, true, false, rootHostingSpacePath) ); } report.DiskspaceOverusage.AddDiskspaceOverusageRow( Reports.OverusageReport.DiskspaceOverusageRow .CreateFromHostingSpacesRow(report, dsRow) ); } } //2. analyze children foreach (DataRow dsRow in dsTable.Rows) { if (Reports.OverusageReport.HostingSpaceRow.IsContainChildSpaces(dsRow)) { report = GetDiskspaceReport( report , userId , Reports.OverusageReport.HostingSpaceRow.GetPackageId(dsRow) , String.Format( "{0} \\ {1}" , rootHostingSpacePath , Reports.OverusageReportUtils.GetStringOrDefault(dsRow, "PackageName", String.Empty) ) ); } } return report; } /// /// Retrieves child Hosting Spaces (packages) by parent Hosting Space Id /// with information about bandwidth usage per Hosting Space /// /// /// private static DataTable GetPackagesDiskspacePaged(int userId, int packageId) { return GetPackagesDiskspacePaged( userId , packageId , String.Empty , 0 , int.MaxValue ).Tables[1]; } /// /// Retrieves child Hosting Spaces (packages) using parent Hosting Space Id /// with information about bandwidth usage per Hosting Space /// /// /// /// /// private static DataTable GetPackagesBandwidthPaged(int userId, int packageId, DateTime startDate, DateTime endDate) { return GetPackagesBandwidthPaged( userId , packageId , startDate , endDate , String.Empty , 0 , int.MaxValue ).Tables[1]; } /// /// Creates HostingSpacesRow class instance. /// /// Hosting Space information data row /// The report to update. /// Shows whether diskspace is overused. /// Shows whether bandwidth is overused. /// Hosting spaces tree. /// HostingSpacesRow class instance. private static Reports.OverusageReport.HostingSpaceRow CreateHostingSpacesRow(DataRow hsRow, Reports.OverusageReport currentOverusageReport, bool isDiskspaceOverused, bool isBandwidthOverused, string packageFullTree) { Reports.OverusageReport.HostingSpaceRow row = Reports.OverusageReport.HostingSpaceRow.CreateFromHostingSpacesRow(currentOverusageReport, hsRow, isDiskspaceOverused, isBandwidthOverused, packageFullTree); //TODO: Optimiza it in some way :) PackageInfo packageInfo = GetPackage((int)row.HostingSpaceId); row.Location = ServerController.GetServerShortDetails(packageInfo.ServerId).ServerName; row.HostingSpaceCreationDate = packageInfo.PurchaseDate; return row; } #endregion #region Helper Methods public static Dictionary> OrderServiceItemsByServices( List items) { // order items by service id Dictionary> orderedItems = new Dictionary>(); foreach (ServiceProviderItem item in items) { int serviceId = item.ServiceId; List serviceItems = null; if (orderedItems.ContainsKey(serviceId)) serviceItems = orderedItems[serviceId]; else { serviceItems = new List(); orderedItems.Add(serviceId, serviceItems); } // add item to the appropriate list serviceItems.Add(item); } return orderedItems; } #endregion } }