diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index b512dc5b..3587eb0e 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -5703,6 +5703,40 @@ DROP TABLE #TempCRMUsers GO +IF NOT EXISTS (SELECT * FROM sys.objects WHERE type_desc = N'SQL_STORED_PROCEDURE' AND name = N'GetDomainsByZoneID]') +BEGIN +EXEC sp_executesql N'CREATE PROCEDURE [dbo].[GetDomainsByZoneID] +( + @ActorID int, + @ZoneID int +) +AS + +SELECT + D.DomainID, + D.PackageID, + D.ZoneItemID, + D.DomainName, + D.HostingAllowed, + ISNULL(D.WebSiteID, 0) AS WebSiteID, + WS.ItemName AS WebSiteName, + ISNULL(D.MailDomainID, 0) AS MailDomainID, + MD.ItemName AS MailDomainName, + Z.ItemName AS ZoneName, + D.IsSubDomain, + D.IsInstantAlias, + D.IsDomainPointer +FROM Domains AS D +INNER JOIN Packages AS P ON D.PackageID = P.PackageID +LEFT OUTER JOIN ServiceItems AS WS ON D.WebSiteID = WS.ItemID +LEFT OUTER JOIN ServiceItems AS MD ON D.MailDomainID = MD.ItemID +LEFT OUTER JOIN ServiceItems AS Z ON D.ZoneItemID = Z.ItemID +WHERE + D.ZoneItemID = @ZoneID + AND dbo.CheckActorPackageRights(@ActorID, P.PackageID) = 1 +RETURN' +END +GO diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Data/DataProvider.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Data/DataProvider.cs index 75d832da..26cbbcd8 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Data/DataProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Data/DataProvider.cs @@ -793,6 +793,15 @@ namespace WebsitePanel.EnterpriseServer new SqlParameter("@domainName", domainName)); } + public static DataSet GetDomainsByZoneId(int actorId, int zoneId) + { + return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetDomainsByZoneID", + new SqlParameter("@ActorId", actorId), + new SqlParameter("@ZoneID", zoneId)); + } + + public static int CheckDomain(int packageId, string domainName, bool isDomainPointer) { SqlParameter prmId = new SqlParameter("@Result", SqlDbType.Int); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Servers/ServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Servers/ServerController.cs index e01e1ccd..1bb91bf7 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Servers/ServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Servers/ServerController.cs @@ -1602,6 +1602,13 @@ namespace WebsitePanel.EnterpriseServer DataProvider.GetDomains(SecurityContext.User.UserId, packageId, true)); } + + public static List GetDomainsByZoneId(int zoneId) + { + return ObjectUtils.CreateListFromDataSet( + DataProvider.GetDomainsByZoneId(SecurityContext.User.UserId, zoneId)); + } + public static List GetMyDomains(int packageId) { return ObjectUtils.CreateListFromDataSet( @@ -1913,6 +1920,8 @@ namespace WebsitePanel.EnterpriseServer // load domain DomainInfo domain = GetDomain(domainId); + if (domain == null) + return 0; // place log record TaskManager.StartTask("DOMAIN", "DETACH", domain.DomainName); @@ -1939,6 +1948,17 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_ORGANIZATION_DOMAIN_IS_IN_USE; } + List domains = GetDomainsByZoneId(domain.ZoneItemId); + foreach (DomainInfo d in domains) + { + if (d.WebSiteId > 0) + { + TaskManager.WriteError("Domain points to the existing web site"); + return BusinessErrorCodes.ERROR_DOMAIN_POINTS_TO_WEB_SITE; + } + } + + // remove DNS zone meta-item if required if (domain.ZoneItemId > 0) { @@ -1968,6 +1988,8 @@ namespace WebsitePanel.EnterpriseServer // load domain DomainInfo domain = GetDomain(domainId); + if (domain == null) + return 0; // place log record TaskManager.StartTask("DOMAIN", "DELETE", domain.DomainName); @@ -1994,6 +2016,17 @@ namespace WebsitePanel.EnterpriseServer return BusinessErrorCodes.ERROR_ORGANIZATION_DOMAIN_IS_IN_USE; } + List domains = GetDomainsByZoneId(domain.ZoneItemId); + foreach (DomainInfo d in domains) + { + if (d.WebSiteId > 0) + { + TaskManager.WriteError("Domain points to the existing web site"); + return BusinessErrorCodes.ERROR_DOMAIN_POINTS_TO_WEB_SITE; + } + } + + // delete instant alias if (domain.InstantAliasId > 0) { @@ -2210,6 +2243,8 @@ namespace WebsitePanel.EnterpriseServer // load domain DomainInfo domain = GetDomain(domainId); + if (domain == null) + return 0; // place log record TaskManager.StartTask("DOMAIN", "DELETE_INSTANT_ALIAS", domain.DomainName); @@ -2229,15 +2264,27 @@ namespace WebsitePanel.EnterpriseServer if (webRes < 0) return webRes; } - /* - // remove from mail domain pointers - if (instantAlias.MailDomainId > 0) - { - int mailRes = MailServerController.DeleteMailDomainPointer(instantAlias.MailDomainId, instantAlias.DomainId); - if (mailRes < 0) - return mailRes; - } - */ + + + List domains = GetDomainsByZoneId(domain.ZoneItemId); + foreach (DomainInfo d in domains) + { + if (d.WebSiteId > 0) + { + int webRes = WebServerController.DeleteWebSitePointer(d.WebSiteId, d.DomainId); + if (webRes < 0) + return webRes; + } + } + + + // remove from mail domain pointers + if (instantAlias.MailDomainId > 0) + { + int mailRes = MailServerController.DeleteMailDomainPointer(instantAlias.MailDomainId, instantAlias.DomainId); + if (mailRes < 0) + return mailRes; + } // delete instant alias int res = DeleteDomain(instantAlias.DomainId); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/WebServers/WebServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/WebServers/WebServerController.cs index 9f4ceb34..f1fbb0b1 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/WebServers/WebServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/WebServers/WebServerController.cs @@ -735,7 +735,7 @@ namespace WebsitePanel.EnterpriseServer DomainInfo ZoneInfo = ServerController.GetDomain(domain.ZoneName); if (ZoneInfo == null) - throw new Exception("failed to retrieve parent zone"); + throw new Exception("Parent zone not found"); // remove all web site pointers