diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index 8b609c0f..2329e177 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -6352,6 +6352,7 @@ Please, find below details of your domain expiration information. Domain + Registrar Customer Expiration Date @@ -6360,8 +6361,9 @@ Please, find below details of your domain expiration information. #Domain.DomainName# + #iif(isnull(Domain.Registrar), "", Domain.Registrar)# #Domain.Customer# - #Domain.ExpirationDate# + #iif(isnull(Domain.ExpirationDate), "", Domain.ExpirationDate)# @@ -6424,8 +6426,9 @@ Please, find below details of your domain expiration information. Domain: #Domain.DomainName# + Registrar: #iif(isnull(Domain.Registrar), "", Domain.Registrar)# Customer: #Domain.Customer# - Expiration Date: #Domain.ExpirationDate# + Expiration Date: #iif(isnull(Domain.ExpirationDate), "", Domain.ExpirationDate)# @@ -6470,6 +6473,7 @@ INSERT [dbo].[UserSettings] ([UserID], [SettingsName], [PropertyName], [Property .Summary { font-family: Tahoma; font-size: 9pt; } .Summary H1 { font-size: 1.7em; color: ##1F4978; border-bottom: dotted 3px ##efefef; } .Summary H2 { font-size: 1.3em; color: ##1F4978; } + .Summary H3 { font-size: 1em; color: ##1F4978; } .Summary TABLE { border: solid 1px ##e5e5e5; } .Summary TH, .Summary TD.Label { padding: 5px; font-size: 8pt; font-weight: bold; background-color: ##f5f5f5; } @@ -6498,6 +6502,7 @@ Please, find below details of MX and NS changes.

#Domain.DomainName# - #DomainUsers[Domain.PackageId].FirstName# #DomainUsers[Domain.PackageId].LastName#

+

#iif(isnull(Domain.Registrar), "", Domain.Registrar)# #iif(isnull(Domain.ExpirationDate), "", Domain.ExpirationDate)#

@@ -6558,6 +6563,8 @@ Please, find below details of MX and NS changes. #Domain.DomainName# - #DomainUsers[Domain.PackageId].FirstName# #DomainUsers[Domain.PackageId].LastName# + Registrar: #iif(isnull(Domain.Registrar), "", Domain.Registrar)# + ExpirationDate: #iif(isnull(Domain.ExpirationDate), "", Domain.ExpirationDate)# DNS: #DnsChange.DnsServer# @@ -6965,7 +6972,6 @@ exec sp_executesql @sql, N'@StartRow int, @MaximumRows int, @PackageID int, @Fil RETURN - GO @@ -7095,3 +7101,178 @@ AS RETURN @Result GO + + +-- Domain Expiration scheduled tasks fixes + +IF NOT EXISTS(SELECT * FROM sys.columns + WHERE [name] = N'RegistrarName' AND [object_id] = OBJECT_ID(N'Domains')) +BEGIN + ALTER TABLE [dbo].[Domains] ADD RegistrarName nvarchar(max); +END +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'UpdateWhoisDomainInfo') +DROP PROCEDURE UpdateWhoisDomainInfo +GO +CREATE PROCEDURE [dbo].UpdateWhoisDomainInfo +( + @DomainId INT, + @DomainCreationDate DateTime, + @DomainExpirationDate DateTime, + @DomainLastUpdateDate DateTime, + @DomainRegistrarName nvarchar(max) +) +AS +UPDATE [dbo].[Domains] SET [CreationDate] = @DomainCreationDate, [ExpirationDate] = @DomainExpirationDate, [LastUpdateDate] = @DomainLastUpdateDate, [RegistrarName] = @DomainRegistrarName WHERE [DomainID] = @DomainId +GO + + + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetDomainsPaged') +DROP PROCEDURE GetDomainsPaged +GO +CREATE PROCEDURE [dbo].[GetDomainsPaged] +( + @ActorID int, + @PackageID int, + @ServerID int, + @Recursive bit, + @FilterColumn nvarchar(50) = '', + @FilterValue nvarchar(50) = '', + @SortColumn nvarchar(50), + @StartRow int, + @MaximumRows int +) +AS +SET NOCOUNT ON + +-- check rights +IF dbo.CheckActorPackageRights(@ActorID, @PackageID) = 0 +RAISERROR('You are not allowed to access this package', 16, 1) + +-- build query and run it to the temporary table +DECLARE @sql nvarchar(2500) + +IF @SortColumn = '' OR @SortColumn IS NULL +SET @SortColumn = 'DomainName' + +SET @sql = ' +DECLARE @Domains TABLE +( + ItemPosition int IDENTITY(1,1), + DomainID int +) +INSERT INTO @Domains (DomainID) +SELECT + D.DomainID +FROM Domains AS D +INNER JOIN Packages AS P ON D.PackageID = P.PackageID +INNER JOIN UsersDetailed AS U ON P.UserID = U.UserID +LEFT OUTER JOIN ServiceItems AS Z ON D.ZoneItemID = Z.ItemID +LEFT OUTER JOIN Services AS S ON Z.ServiceID = S.ServiceID +LEFT OUTER JOIN Servers AS SRV ON S.ServerID = SRV.ServerID +WHERE (D.IsInstantAlias = 0 AND D.IsDomainPointer = 0) AND + ((@Recursive = 0 AND D.PackageID = @PackageID) + OR (@Recursive = 1 AND dbo.CheckPackageParent(@PackageID, D.PackageID) = 1)) +AND (@ServerID = 0 OR (@ServerID > 0 AND S.ServerID = @ServerID)) +' + +IF @FilterColumn <> '' AND @FilterValue <> '' +SET @sql = @sql + ' AND ' + @FilterColumn + ' LIKE @FilterValue ' + +IF @SortColumn <> '' AND @SortColumn IS NOT NULL +SET @sql = @sql + ' ORDER BY ' + @SortColumn + ' ' + +SET @sql = @sql + ' SELECT COUNT(DomainID) FROM @Domains;SELECT + D.DomainID, + D.PackageID, + D.ZoneItemID, + D.DomainItemID, + D.DomainName, + D.HostingAllowed, + ISNULL(WS.ItemID, 0) AS WebSiteID, + WS.ItemName AS WebSiteName, + ISNULL(MD.ItemID, 0) AS MailDomainID, + MD.ItemName AS MailDomainName, + D.IsSubDomain, + D.IsInstantAlias, + D.IsDomainPointer, + D.ExpirationDate, + D.LastUpdateDate, + D.RegistrarName, + P.PackageName, + ISNULL(SRV.ServerID, 0) AS ServerID, + ISNULL(SRV.ServerName, '''') AS ServerName, + ISNULL(SRV.Comments, '''') AS ServerComments, + ISNULL(SRV.VirtualServer, 0) AS VirtualServer, + P.UserID, + U.Username, + U.FirstName, + U.LastName, + U.FullName, + U.RoleID, + U.Email +FROM @Domains AS SD +INNER JOIN Domains AS D ON SD.DomainID = D.DomainID +INNER JOIN Packages AS P ON D.PackageID = P.PackageID +INNER JOIN UsersDetailed AS U ON P.UserID = U.UserID +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 +LEFT OUTER JOIN Services AS S ON Z.ServiceID = S.ServiceID +LEFT OUTER JOIN Servers AS SRV ON S.ServerID = SRV.ServerID +WHERE SD.ItemPosition BETWEEN @StartRow + 1 AND @StartRow + @MaximumRows' + +exec sp_executesql @sql, N'@StartRow int, @MaximumRows int, @PackageID int, @FilterValue nvarchar(50), @ServerID int, @Recursive bit', +@StartRow, @MaximumRows, @PackageID, @FilterValue, @ServerID, @Recursive + + +RETURN +GO + + + + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetDomains') +DROP PROCEDURE GetDomains +GO +CREATE PROCEDURE [dbo].[GetDomains] +( + @ActorID int, + @PackageID int, + @Recursive bit = 1 +) +AS + +-- check rights +IF dbo.CheckActorPackageRights(@ActorID, @PackageID) = 0 +RAISERROR('You are not allowed to access this package', 16, 1) + +SELECT + D.DomainID, + D.PackageID, + D.ZoneItemID, + D.DomainItemID, + D.DomainName, + D.HostingAllowed, + ISNULL(WS.ItemID, 0) AS WebSiteID, + WS.ItemName AS WebSiteName, + ISNULL(MD.ItemID, 0) AS MailDomainID, + MD.ItemName AS MailDomainName, + Z.ItemName AS ZoneName, + D.IsSubDomain, + D.IsInstantAlias, + D.CreationDate, + D.ExpirationDate, + D.LastUpdateDate, + D.IsDomainPointer, + D.RegistrarName +FROM Domains AS D +INNER JOIN PackagesTree(@PackageID, @Recursive) AS PT ON D.PackageID = PT.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 +RETURN + +GO \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Servers/DomainInfo.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Servers/DomainInfo.cs index 1fbca5da..f0f240e7 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Servers/DomainInfo.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Servers/DomainInfo.cs @@ -151,5 +151,6 @@ namespace WebsitePanel.EnterpriseServer public DateTime? CreationDate { get; set; } public DateTime? ExpirationDate { get; set; } public DateTime? LastUpdateDate { get; set; } + public string RegistrarName { get; set; } } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs index bab3c724..0de87b44 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs @@ -4827,6 +4827,20 @@ namespace WebsitePanel.EnterpriseServer ); } + public static void UpdateWhoisDomainInfo(int domainId, DateTime? domainCreationDate, DateTime? domainExpirationDate, DateTime? domainLastUpdateDate, string registrarName) + { + SqlHelper.ExecuteNonQuery( + ConnectionString, + CommandType.StoredProcedure, + "UpdateWhoisDomainInfo", + new SqlParameter("@DomainId", domainId), + new SqlParameter("@DomainCreationDate", domainCreationDate), + new SqlParameter("@DomainExpirationDate", domainExpirationDate), + new SqlParameter("@DomainLastUpdateDate", domainLastUpdateDate), + new SqlParameter("@DomainRegistrarName", registrarName) + ); + } + #endregion } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/DomainExpirationTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/DomainExpirationTask.cs index 4e8b079d..5d2d615b 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/DomainExpirationTask.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/DomainExpirationTask.cs @@ -80,7 +80,7 @@ namespace WebsitePanel.EnterpriseServer checkedDomains.Add(domain.DomainId); - ServerController.UpdateDomainRegistrationData(domain); + ServerController.UpdateDomainWhoisData(domain); if (CheckDomainExpiration(domain.ExpirationDate, daysBeforeNotify)) { @@ -105,7 +105,7 @@ namespace WebsitePanel.EnterpriseServer if (mainDomain != null) { - ServerController.UpdateDomainRegistrationData(subDomain, mainDomain.CreationDate, mainDomain.ExpirationDate); + ServerController.UpdateDomainWhoisData(subDomain, mainDomain.CreationDate, mainDomain.ExpirationDate, mainDomain.RegistrarName); var nonExistenDomain = nonExistenDomains.FirstOrDefault(x => subDomain.DomainId == x.DomainId); @@ -185,6 +185,7 @@ namespace WebsitePanel.EnterpriseServer items["Domains"] = domains.Select(x => new { DomainName = x.DomainName, ExpirationDate = x.ExpirationDate < DateTime.Now ? "Expired" : x.ExpirationDate.ToString(), ExpirationDateOrdering = x.ExpirationDate, + Registrar = x.RegistrarName, Customer = string.Format("{0} {1}", domainUsers[x.PackageId].FirstName, domainUsers[x.PackageId].LastName) }) .OrderBy(x => x.ExpirationDateOrdering).ThenBy(x => x.Customer).ThenBy(x => x.DomainName); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/DomainLookupViewTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/DomainLookupViewTask.cs index b6a7b26d..92bb35a4 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/DomainLookupViewTask.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/DomainLookupViewTask.cs @@ -106,6 +106,8 @@ namespace WebsitePanel.EnterpriseServer DomainDnsChanges domainChanges = new DomainDnsChanges(); domainChanges.DomainName = domain.DomainName; domainChanges.PackageId = domain.PackageId; + domainChanges.Registrar = domain.RegistrarName; + domainChanges.ExpirationDate = domain.ExpirationDate; var dbDnsRecords = ObjectUtils.CreateListFromDataReader(DataProvider.GetDomainAllDnsRecords(domain.DomainId)); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Servers/ServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Servers/ServerController.cs index 220ee79d..34a851ef 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Servers/ServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Servers/ServerController.cs @@ -75,6 +75,12 @@ namespace WebsitePanel.EnterpriseServer @"expires:(.+)" //.fi }; + private static List _registrarNamePatterns = new List { + @"Created by Registrar:(.+)", + @"Registrar:(.+)", + @"Registrant Name:(.+)" + }; + private static List _datePatterns = new List { @"ddd MMM dd HH:mm:ss G\MT yyyy" }; @@ -1837,7 +1843,7 @@ namespace WebsitePanel.EnterpriseServer ServerController.AddServiceDNSRecords(packageId, ResourceGroups.VPSForPC, domain, ""); } - UpdateDomainRegistrationData(domain); + UpdateDomainWhoisData(domain); } // add instant alias @@ -2691,22 +2697,20 @@ namespace WebsitePanel.EnterpriseServer } } - public static DomainInfo UpdateDomainRegistrationData(DomainInfo domain) + public static DomainInfo UpdateDomainWhoisData(DomainInfo domain) { - DateTime? createdDate = null; - DateTime? expiredDate = null; - try { var whoisResult = WhoisClient.Query(domain.DomainName.ToLowerInvariant()); - createdDate = GetDomainInfoDate(whoisResult.Raw, _createdDatePatterns); - expiredDate = GetDomainInfoDate(whoisResult.Raw, _expiredDatePatterns); + string creationDateString = ParseWhoisDomainInfo(whoisResult.Raw, _createdDatePatterns); + string expirationDateString = ParseWhoisDomainInfo(whoisResult.Raw, _expiredDatePatterns); - domain.CreationDate = createdDate; - domain.ExpirationDate = expiredDate; + domain.CreationDate = ParseDate(creationDateString); + domain.ExpirationDate = ParseDate(expirationDateString); + domain.RegistrarName = ParseWhoisDomainInfo(whoisResult.Raw, _registrarNamePatterns); - DataProvider.UpdateDomainDates(domain.DomainId, createdDate, expiredDate, DateTime.Now); + DataProvider.UpdateWhoisDomainInfo(domain.DomainId, domain.CreationDate, domain.ExpirationDate, DateTime.Now, domain.RegistrarName); } catch (Exception e) { @@ -2716,17 +2720,18 @@ namespace WebsitePanel.EnterpriseServer return domain; } - public static DomainInfo UpdateDomainRegistrationData(DomainInfo domain, DateTime? creationDate, DateTime? expirationDate) + public static DomainInfo UpdateDomainWhoisData(DomainInfo domain, DateTime? creationDate, DateTime? expirationDate, string registrarName) { - DataProvider.UpdateDomainDates(domain.DomainId, creationDate, expirationDate, DateTime.Now); + DataProvider.UpdateWhoisDomainInfo(domain.DomainId, creationDate, expirationDate, DateTime.Now, registrarName); domain.CreationDate = creationDate; domain.ExpirationDate = expirationDate; + domain.RegistrarName = registrarName; return domain; } - private static DateTime? GetDomainInfoDate(string raw, IEnumerable patterns) + private static string ParseWhoisDomainInfo(string raw, IEnumerable patterns) { foreach (var createdRegex in patterns) { @@ -2736,7 +2741,7 @@ namespace WebsitePanel.EnterpriseServer { if (match.Success && match.Groups.Count == 2) { - return ParseDate(match.Groups[1].ToString().Trim()); + return match.Groups[1].ToString().Trim(); } } } @@ -2746,6 +2751,11 @@ namespace WebsitePanel.EnterpriseServer private static DateTime? ParseDate(string dateString) { + if (string.IsNullOrEmpty(dateString)) + { + return null; + } + var result = DateTime.MinValue; foreach (var datePattern in _datePatterns) diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/DomainLookup/DomainDnsChanges.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/DomainLookup/DomainDnsChanges.cs index 3f19ef39..d2c8cd10 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/DomainLookup/DomainDnsChanges.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/DomainLookup/DomainDnsChanges.cs @@ -8,6 +8,8 @@ namespace WebsitePanel.Providers.DomainLookup public class DomainDnsChanges { public string DomainName { get; set; } + public string Registrar { get; set; } + public DateTime? ExpirationDate { get; set; } public int PackageId { get; set; } public List DnsChanges { get; set; } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/Domains.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/Domains.ascx.resx index 8ba7b6a4..e6e8c79a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/Domains.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/App_LocalResources/Domains.ascx.resx @@ -216,4 +216,7 @@ Current Real DNS Values + + Registrar: + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Domains.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Domains.ascx index c1ac1fcd..fd5adb81 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Domains.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Domains.ascx @@ -38,12 +38,16 @@ - + <%# GetDomainExpirationDate(Eval("ExpirationDate"), Eval("LastUpdateDate"))%> - -
- "> + + + + + +
+ ">
diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Domains.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Domains.ascx.cs index db114e6d..20e6ace4 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Domains.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Domains.ascx.cs @@ -55,10 +55,10 @@ namespace WebsitePanel.Portal // visibility chkRecursive.Visible = (PanelSecurity.SelectedUser.Role != UserRole.User); - gvDomains.Columns[3].Visible = gvDomains.Columns[3].Visible = + gvDomains.Columns[4].Visible = gvDomains.Columns[5].Visible = (PanelSecurity.SelectedUser.Role != UserRole.User) && chkRecursive.Checked; - gvDomains.Columns[5].Visible = (PanelSecurity.SelectedUser.Role == UserRole.Administrator); - gvDomains.Columns[6].Visible = (PanelSecurity.EffectiveUser.Role == UserRole.Administrator); + gvDomains.Columns[6].Visible = (PanelSecurity.SelectedUser.Role == UserRole.Administrator); + gvDomains.Columns[7].Visible = (PanelSecurity.EffectiveUser.Role == UserRole.Administrator); if (!IsPostBack) { @@ -185,6 +185,22 @@ namespace WebsitePanel.Portal return dnsRecords[domainId]; } + public string GetDomainTooltip(int domainId, string registrar) + { + var dnsString = GetDomainDnsRecords(domainId); + + var tooltipLines = new List(); + + if (!string.IsNullOrEmpty(registrar)) + { + var header = GetLocalizedString("DomainLookup.TooltipHeader.Registrar"); + tooltipLines.Add(header + " " + registrar); + tooltipLines.Add("\r\n"); + } + + return string.Join("\r\n", tooltipLines) + dnsString; + } + protected void odsDomainsPaged_Selected(object sender, ObjectDataSourceStatusEventArgs e) { if (e.Exception != null)