Merge
This commit is contained in:
commit
4de74dcea7
47 changed files with 1148 additions and 396 deletions
|
@ -82,7 +82,9 @@
|
|||
</Dialog>
|
||||
<Dialog Id="InstallLocationDlg" Width="370" Height="270" Title="[ProductName] Setup">
|
||||
<Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="Next">
|
||||
<Publish Event="NewDialog" Value="DatabaseConnectionDlg" Order="3">1</Publish>
|
||||
<Publish Event="DoAction" Value="PreInstallationAction">1</Publish>
|
||||
<Publish Event="NewDialog" Value="DatabaseConnectionDlg" Order="3">SKIPCONNECTIONSTRINGSTEP = "0"</Publish>
|
||||
<Publish Event="NewDialog" Value="VerifyReadyDlg" Order="3">SKIPCONNECTIONSTRINGSTEP = "1"</Publish>
|
||||
</Control>
|
||||
<Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="Back">
|
||||
<Publish Event="NewDialog" Value="LicenseAgreementDlg" Order="3">1</Publish>
|
||||
|
@ -101,13 +103,15 @@
|
|||
<Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="InstallLocationDlg" Order="3">
|
||||
LicenseAccepted = "1"
|
||||
</Publish>
|
||||
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="DatabaseConnectionDlg">1</Publish>
|
||||
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="DatabaseConnectionDlg">SKIPCONNECTIONSTRINGSTEP = "0"</Publish>
|
||||
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="InstallLocationDlg">SKIPCONNECTIONSTRINGSTEP = "1"</Publish>
|
||||
<TextStyle Id="DlgTitleFont" FaceName="Tahoma" Size="8" Bold="yes" />
|
||||
</UI>
|
||||
<InstallExecuteSequence>
|
||||
<Custom Action="PropertyFinalizeInstall" After='InstallValidate'/>
|
||||
<Custom Action="FinalizeUnInstall" After="InstallValidate">(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
|
||||
<RemoveExistingProducts After="InstallValidate" />
|
||||
<Custom Action='FinalizeInstall' After='InstallFinalize'>NOT Installed or REINSTALL</Custom>
|
||||
<Custom Action='FinalizeInstall' After='InstallFiles' >NOT Installed or REINSTALL</Custom>
|
||||
</InstallExecuteSequence>
|
||||
</Product>
|
||||
<Fragment>
|
||||
|
@ -115,9 +119,16 @@
|
|||
<Binary Id="CheckConnection.CA" SourceFile="bin\WebsitePanel.SchedulerServiceInstaller.CA.dll" />
|
||||
</Fragment>
|
||||
<Fragment>
|
||||
<CustomAction Id="FinalizeInstall" BinaryKey="CheckConnection.CA" DllEntry="FinalizeInstall" />
|
||||
<!-- immediate CA -->
|
||||
<CustomAction Id='PropertyFinalizeInstall' Property='FinalizeInstall' Value='ConnectionString=[CONNECTIONSTRING];PreviousConnectionString=[PREVIOUSCONNECTIONSTRING];ServiceFolder=[SERVICEFOLDER];PreviousCryptoKey=[PREVIOUSCRYPTOKEY]' Return="check"/>
|
||||
|
||||
<!-- deferred CA -->
|
||||
<CustomAction Id='FinalizeInstall' BinaryKey ='CheckConnection.CA' DllEntry='FinalizeInstall' Impersonate='no' Execute='deferred' Return='check' HideTarget='yes'/>
|
||||
|
||||
<!--<CustomAction Id="FinalizeInstall" BinaryKey="CheckConnection.CA" DllEntry="FinalizeInstall" />-->
|
||||
</Fragment>
|
||||
<Fragment>
|
||||
<CustomAction Id="PreInstallationAction" BinaryKey="CheckConnection.CA" DllEntry="PreInstallationAction" />
|
||||
<CustomAction Id="FinalizeUnInstall" BinaryKey="CheckConnection.CA" DllEntry="FinalizeUnInstall" />
|
||||
<CustomAction Id='AlreadyUpdated' Error='Product has already been updated to $(var.VERSION) or newer.' />
|
||||
<CustomAction Id='NoDowngrade' Error='A later version of [ProductName] is already installed.' />
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Configuration.Install;
|
||||
using System.Data;
|
||||
using System.Data.SqlClient;
|
||||
|
@ -35,6 +36,9 @@ using System.Linq;
|
|||
using System.ServiceProcess;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
using System.Windows.Forms.VisualStyles;
|
||||
using System.Xml;
|
||||
using Microsoft.Deployment.WindowsInstaller;
|
||||
using WebsitePanel.Setup;
|
||||
|
||||
|
@ -42,6 +46,8 @@ namespace WebsitePanel.SchedulerServiceInstaller
|
|||
{
|
||||
public class CustomActions
|
||||
{
|
||||
public const string CustomDataDelimiter = "-=del=-";
|
||||
|
||||
[CustomAction]
|
||||
public static ActionResult CheckConnection(Session session)
|
||||
{
|
||||
|
@ -63,9 +69,23 @@ namespace WebsitePanel.SchedulerServiceInstaller
|
|||
[CustomAction]
|
||||
public static ActionResult FinalizeInstall(Session session)
|
||||
{
|
||||
ChangeConfigString("installer.connectionstring", session["CONNECTIONSTRING"], session["INSTALLFOLDER"]);
|
||||
ChangeCryptoKey(session["INSTALLFOLDER"]);
|
||||
InstallService(session["INSTALLFOLDER"]);
|
||||
var connectionString = GetCustomActionProperty(session, "ConnectionString").Replace(CustomDataDelimiter, ";");
|
||||
var serviceFolder = GetCustomActionProperty(session, "ServiceFolder");
|
||||
var previousConnectionString = GetCustomActionProperty(session, "PreviousConnectionString").Replace(CustomDataDelimiter, ";");
|
||||
var previousCryptoKey = GetCustomActionProperty(session, "PreviousCryptoKey");
|
||||
|
||||
if (string.IsNullOrEmpty(serviceFolder))
|
||||
{
|
||||
return ActionResult.Success;
|
||||
}
|
||||
|
||||
connectionString = string.IsNullOrEmpty(previousConnectionString)
|
||||
? connectionString
|
||||
: previousConnectionString;
|
||||
|
||||
ChangeConfigString("/configuration/connectionStrings/add[@name='EnterpriseServer']", "connectionString", connectionString, serviceFolder);
|
||||
ChangeConfigString("/configuration/appSettings/add[@key='WebsitePanel.CryptoKey']", "value", previousCryptoKey, serviceFolder);
|
||||
InstallService(serviceFolder);
|
||||
|
||||
return ActionResult.Success;
|
||||
}
|
||||
|
@ -78,6 +98,46 @@ namespace WebsitePanel.SchedulerServiceInstaller
|
|||
return ActionResult.Success;
|
||||
}
|
||||
|
||||
[CustomAction]
|
||||
public static ActionResult PreInstallationAction(Session session)
|
||||
{
|
||||
session["SKIPCONNECTIONSTRINGSTEP"] = "0";
|
||||
|
||||
session["SERVICEFOLDER"] = session["INSTALLFOLDER"];
|
||||
|
||||
var servicePath = SecurityUtils.GetServicePath("WebsitePanel Scheduler");
|
||||
|
||||
if (!string.IsNullOrEmpty(servicePath))
|
||||
{
|
||||
string path = Path.Combine(servicePath, "WebsitePanel.SchedulerService.exe.config");
|
||||
|
||||
if (File.Exists(path))
|
||||
{
|
||||
using (var reader = new StreamReader(path))
|
||||
{
|
||||
string content = reader.ReadToEnd();
|
||||
var pattern = new Regex(@"(?<=<add key=""WebsitePanel.CryptoKey"" .*?value\s*=\s*"")[^""]+(?="".*?>)");
|
||||
Match match = pattern.Match(content);
|
||||
session["PREVIOUSCRYPTOKEY"] = match.Value;
|
||||
|
||||
var connectionStringPattern = new Regex(@"(?<=<add name=""EnterpriseServer"" .*?connectionString\s*=\s*"")[^""]+(?="".*?>)");
|
||||
match = connectionStringPattern.Match(content);
|
||||
session["PREVIOUSCONNECTIONSTRING"] = match.Value.Replace(";", CustomDataDelimiter);
|
||||
}
|
||||
|
||||
session["SKIPCONNECTIONSTRINGSTEP"] = "1";
|
||||
|
||||
if (string.IsNullOrEmpty(session["SERVICEFOLDER"]))
|
||||
{
|
||||
session["SERVICEFOLDER"] = servicePath;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return ActionResult.Success;
|
||||
}
|
||||
|
||||
private static void InstallService(string installFolder)
|
||||
{
|
||||
try
|
||||
|
@ -122,44 +182,29 @@ namespace WebsitePanel.SchedulerServiceInstaller
|
|||
}
|
||||
}
|
||||
|
||||
private static void ChangeCryptoKey(string installFolder)
|
||||
private static void ChangeConfigString(string nodePath, string attrToChange, string value, string installFolder)
|
||||
{
|
||||
string path = Path.Combine(installFolder.Replace("SchedulerService", "Enterprise Server"), "web.config");
|
||||
string cryptoKey = "0123456789";
|
||||
|
||||
if (File.Exists(path))
|
||||
{
|
||||
using (var reader = new StreamReader(path))
|
||||
{
|
||||
string content = reader.ReadToEnd();
|
||||
var pattern = new Regex(@"(?<=<add key=""WebsitePanel.CryptoKey"" .*?value\s*=\s*"")[^""]+(?="".*?>)");
|
||||
Match match = pattern.Match(content);
|
||||
cryptoKey = match.Value;
|
||||
}
|
||||
}
|
||||
|
||||
ChangeConfigString("installer.cryptokey", cryptoKey, installFolder);
|
||||
}
|
||||
|
||||
private static void ChangeConfigString(string searchString, string replaceValue, string installFolder)
|
||||
{
|
||||
string content;
|
||||
string path = Path.Combine(installFolder, "WebsitePanel.SchedulerService.exe.config");
|
||||
|
||||
using (var reader = new StreamReader(path))
|
||||
if (!File.Exists(path))
|
||||
{
|
||||
content = reader.ReadToEnd();
|
||||
return;
|
||||
}
|
||||
|
||||
var re = new Regex("\\$\\{" + searchString + "\\}+", RegexOptions.IgnoreCase);
|
||||
content = re.Replace(content, replaceValue);
|
||||
XmlDocument xmldoc = new XmlDocument();
|
||||
xmldoc.Load(path);
|
||||
|
||||
using (var writer = new StreamWriter(path))
|
||||
XmlElement node = xmldoc.SelectSingleNode(nodePath) as XmlElement;
|
||||
|
||||
if (node != null)
|
||||
{
|
||||
writer.Write(content);
|
||||
node.SetAttribute(attrToChange, value);
|
||||
|
||||
xmldoc.Save(path);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static void StopService(string serviceName)
|
||||
{
|
||||
var sc = new ServiceController(serviceName);
|
||||
|
@ -184,12 +229,12 @@ namespace WebsitePanel.SchedulerServiceInstaller
|
|||
|
||||
private static string GetConnectionString(string serverName, string databaseName)
|
||||
{
|
||||
return string.Format("Server={0};database={1};Trusted_Connection=true;", serverName, databaseName);
|
||||
return string.Format("Server={0};database={1};Trusted_Connection=true;", serverName, databaseName).Replace(";", CustomDataDelimiter);
|
||||
}
|
||||
|
||||
private static string GetConnectionString(string serverName, string databaseName, string login, string password)
|
||||
{
|
||||
return string.Format("Server={0};database={1};uid={2};password={3};", serverName, databaseName, login, password);
|
||||
return string.Format("Server={0};database={1};uid={2};password={3};", serverName, databaseName, login, password).Replace(";", CustomDataDelimiter);
|
||||
}
|
||||
|
||||
private static bool CheckConnection(string connectionString)
|
||||
|
@ -215,5 +260,15 @@ namespace WebsitePanel.SchedulerServiceInstaller
|
|||
|
||||
return result;
|
||||
}
|
||||
|
||||
private static string GetCustomActionProperty(Session session, string key)
|
||||
{
|
||||
if (session.CustomActionData.ContainsKey(key))
|
||||
{
|
||||
return session.CustomActionData[key].Replace("-=-", ";");
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1110,6 +1110,25 @@ namespace WebsitePanel.Setup
|
|||
wmiService.Delete();
|
||||
}
|
||||
|
||||
public static string GetServicePath(string serviceName)
|
||||
{
|
||||
var mc = new ManagementClass("Win32_Service");
|
||||
|
||||
foreach (var mo in mc.GetInstances())
|
||||
{
|
||||
if (mo.GetPropertyValue("Name").ToString() == serviceName)
|
||||
{
|
||||
var path = mo.GetPropertyValue("PathName").ToString().Trim('"');
|
||||
|
||||
var directory = Path.GetDirectoryName(path);
|
||||
|
||||
return directory;
|
||||
}
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
|
|
|
@ -21064,6 +21064,7 @@ SET @sql = @sql + ' SELECT COUNT(DomainID) FROM @Domains;SELECT
|
|||
WS.ItemName AS WebSiteName,
|
||||
ISNULL(MD.ItemID, 0) AS MailDomainID,
|
||||
MD.ItemName AS MailDomainName,
|
||||
Z.ItemName AS ZoneName,
|
||||
D.IsSubDomain,
|
||||
D.IsInstantAlias,
|
||||
D.IsDomainPointer,
|
||||
|
|
|
@ -6057,6 +6057,112 @@ END
|
|||
RETURN
|
||||
GO
|
||||
|
||||
-- wsp-10053: IDN, return ZoneName also from GetDomainsPaged (already exists in other GetDomain-sps)
|
||||
ALTER 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(4000)
|
||||
|
||||
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,
|
||||
Z.ItemName AS ZoneName,
|
||||
D.IsSubDomain,
|
||||
D.IsInstantAlias,
|
||||
D.IsDomainPointer,
|
||||
|
||||
-- packages
|
||||
P.PackageName,
|
||||
|
||||
-- server
|
||||
ISNULL(SRV.ServerID, 0) AS ServerID,
|
||||
ISNULL(SRV.ServerName, '''') AS ServerName,
|
||||
ISNULL(SRV.Comments, '''') AS ServerComments,
|
||||
ISNULL(SRV.VirtualServer, 0) AS VirtualServer,
|
||||
|
||||
-- user
|
||||
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
|
||||
|
||||
|
||||
-- Domain lookup tasks
|
||||
|
||||
IF NOT EXISTS (SELECT * FROM [dbo].[ScheduleTasks] WHERE [TaskID] = N'SCHEDULE_TASK_DOMAIN_LOOKUP')
|
||||
|
@ -6089,6 +6195,12 @@ INSERT [dbo].[ScheduleTaskParameters] ([TaskID], [ParameterID], [DataTypeID], [D
|
|||
END
|
||||
GO
|
||||
|
||||
IF NOT EXISTS (SELECT * FROM [dbo].[ScheduleTaskParameters] WHERE [TaskID] = N'SCHEDULE_TASK_DOMAIN_LOOKUP' AND [ParameterID]= N'PAUSE_BETWEEN_QUERIES' )
|
||||
BEGIN
|
||||
INSERT [dbo].[ScheduleTaskParameters] ([TaskID], [ParameterID], [DataTypeID], [DefaultValue], [ParameterOrder]) VALUES (N'SCHEDULE_TASK_DOMAIN_LOOKUP', N'PAUSE_BETWEEN_QUERIES', N'String', N'100', 4)
|
||||
END
|
||||
GO
|
||||
|
||||
IF EXISTS (SELECT * FROM [dbo].[ScheduleTaskParameters] WHERE [TaskID] = N'SCHEDULE_TASK_DOMAIN_LOOKUP' AND [ParameterID]= N'SERVER_NAME' )
|
||||
BEGIN
|
||||
UPDATE [dbo].[ScheduleTaskParameters] SET [DefaultValue] = N'' WHERE [TaskID] = N'SCHEDULE_TASK_DOMAIN_LOOKUP' AND [ParameterID]= N'SERVER_NAME'
|
||||
|
@ -6385,7 +6497,7 @@ Please, find below details of MX and NS changes.
|
|||
</p>
|
||||
|
||||
<ad:foreach collection="#Domains#" var="Domain" index="i">
|
||||
<h2>#Domain.DomainName#</h2>
|
||||
<h2>#Domain.DomainName# - #DomainUsers[Domain.PackageId].FirstName# #DomainUsers[Domain.PackageId].LastName#</h2>
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
|
@ -6393,7 +6505,8 @@ Please, find below details of MX and NS changes.
|
|||
<th>DNS</th>
|
||||
<th>Type</th>
|
||||
<th>Status</th>
|
||||
<th>Value</th>
|
||||
<th>Old Value</th>
|
||||
<th>New Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
@ -6402,7 +6515,8 @@ Please, find below details of MX and NS changes.
|
|||
<td>#DnsChange.DnsServer#</td>
|
||||
<td>#DnsChange.Type#</td>
|
||||
<td>#DnsChange.Status#</td>
|
||||
<td>#DnsChange.Record.Value#</td>
|
||||
<td>#DnsChange.OldRecord.Value#</td>
|
||||
<td>#DnsChange.NewRecord.Value#</td>
|
||||
</tr>
|
||||
</ad:foreach>
|
||||
</tbody>
|
||||
|
@ -6438,19 +6552,19 @@ INSERT [dbo].[UserSettings] ([UserID], [SettingsName], [PropertyName], [Property
|
|||
Hello #user.FirstName#,
|
||||
</ad:if>
|
||||
|
||||
Please, find below MX and NS Changes Information.
|
||||
|
||||
Please, find below details of MX and NS changes.
|
||||
|
||||
|
||||
<ad:foreach collection="#Domains#" var="Domain" index="i">
|
||||
|
||||
#Domain.DomainName#
|
||||
#Domain.DomainName# - #DomainUsers[Domain.PackageId].FirstName# #DomainUsers[Domain.PackageId].LastName#
|
||||
|
||||
<ad:foreach collection="#Domain.DnsChanges#" var="DnsChange" index="j">
|
||||
DNS: #DnsChange.DnsServer#
|
||||
Type: #DnsChange.Type#
|
||||
Status: #DnsChange.Status#
|
||||
Value: #DnsChange.Record.Value#
|
||||
Old Value: #DnsChange.OldRecord.Value#
|
||||
New Value: #DnsChange.NewRecord.Value#
|
||||
|
||||
</ad:foreach>
|
||||
</ad:foreach>
|
||||
|
@ -6498,7 +6612,7 @@ Hello #user.FirstName#,
|
|||
</ad:if>
|
||||
|
||||
<p>
|
||||
No MX and NS changes have been founded.
|
||||
No MX and NS changes have been found.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
|
|
|
@ -29,6 +29,8 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
using WebsitePanel.Providers;
|
||||
|
@ -38,6 +40,13 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
public class DnsServerController : IImportController, IBackupController
|
||||
{
|
||||
private static string GetAsciiZoneName(string zoneName)
|
||||
{
|
||||
if (string.IsNullOrEmpty(zoneName)) return zoneName;
|
||||
var idn = new IdnMapping();
|
||||
return idn.GetAscii(zoneName);
|
||||
}
|
||||
|
||||
private static DNSServer GetDNSServer(int serviceId)
|
||||
{
|
||||
DNSServer dns = new DNSServer();
|
||||
|
@ -55,6 +64,9 @@ namespace WebsitePanel.EnterpriseServer
|
|||
// get DNS provider
|
||||
DNSServer dns = GetDNSServer(serviceId);
|
||||
|
||||
// Ensure zoneName is in ascii before saving to database
|
||||
zoneName = GetAsciiZoneName(zoneName);
|
||||
|
||||
// check if zone already exists
|
||||
if (dns.ZoneExists(zoneName))
|
||||
return BusinessErrorCodes.ERROR_DNS_ZONE_EXISTS;
|
||||
|
@ -199,7 +211,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
// zone item
|
||||
DnsZone zone = primaryZone ? new DnsZone() : new SecondaryDnsZone();
|
||||
zone.Name = zoneName;
|
||||
zone.Name = GetAsciiZoneName(zoneName);
|
||||
zone.PackageId = spaceId;
|
||||
zone.ServiceId = serviceId;
|
||||
int zoneItemId = PackageController.AddPackageItem(zone);
|
||||
|
@ -280,6 +292,8 @@ namespace WebsitePanel.EnterpriseServer
|
|||
|
||||
foreach (GlobalDnsRecord record in records)
|
||||
{
|
||||
domainName = GetAsciiZoneName(domainName);
|
||||
|
||||
DnsRecord rr = new DnsRecord();
|
||||
rr.RecordType = (DnsRecordType)Enum.Parse(typeof(DnsRecordType), record.RecordType, true);
|
||||
rr.RecordName = Utils.ReplaceStringVariable(record.RecordName, "host_name", hostName, true);
|
||||
|
@ -359,8 +373,11 @@ namespace WebsitePanel.EnterpriseServer
|
|||
DNSServer dns = new DNSServer();
|
||||
ServiceProviderProxy.Init(dns, serviceId);
|
||||
|
||||
// IDN: The list of importable names is populated with unicode names, to make it easier for the user
|
||||
var idn = new IdnMapping();
|
||||
|
||||
if (itemType == typeof(DnsZone))
|
||||
items.AddRange(dns.GetZones());
|
||||
items.AddRange(dns.GetZones().Select(z => idn.GetUnicode(z)));
|
||||
|
||||
return items;
|
||||
}
|
||||
|
@ -377,7 +394,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
// add DNS zone
|
||||
DnsZone zone = new DnsZone();
|
||||
zone.Name = itemName;
|
||||
zone.Name = GetAsciiZoneName(itemName);
|
||||
zone.ServiceId = serviceId;
|
||||
zone.PackageId = packageId;
|
||||
int zoneId = PackageController.AddPackageItem(zone);
|
||||
|
|
|
@ -279,10 +279,15 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
|
||||
private static void PopulateOrganizationData(Organization org, EnterpriseSolutionStatisticsReport report, string topReseller)
|
||||
{
|
||||
TaskManager.Write("Stat populate organization data "+org.Name);
|
||||
|
||||
if (report.ExchangeReport != null)
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
TaskManager.Write("Populate exchange report items");
|
||||
|
||||
PopulateExchangeReportItems(org, report, topReseller);
|
||||
}
|
||||
catch(Exception ex)
|
||||
|
@ -295,6 +300,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
{
|
||||
try
|
||||
{
|
||||
TaskManager.Write("Populate populate CRM report items");
|
||||
|
||||
PopulateCRMReportItems(org, report, topReseller);
|
||||
}
|
||||
catch(Exception ex)
|
||||
|
@ -307,6 +314,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
{
|
||||
try
|
||||
{
|
||||
TaskManager.Write("Populate SharePoint item ");
|
||||
|
||||
PopulateSharePointItem(org, report, topReseller);
|
||||
}
|
||||
catch(Exception ex)
|
||||
|
@ -319,6 +328,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
{
|
||||
try
|
||||
{
|
||||
TaskManager.Write("Populate Lync report items");
|
||||
|
||||
PopulateLyncReportItems(org, report, topReseller);
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
@ -331,6 +342,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
{
|
||||
try
|
||||
{
|
||||
TaskManager.Write("Populate Organization statistics report");
|
||||
|
||||
PopulateOrganizationStatisticsReport(org, report, topReseller);
|
||||
}
|
||||
catch(Exception ex)
|
||||
|
@ -339,7 +352,7 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
TaskManager.Write("End populate organization data " + org.Name);
|
||||
}
|
||||
|
||||
private static int GetExchangeServiceID(int packageId)
|
||||
|
@ -408,6 +421,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
|
||||
private static void PopulateExchangeReportItems(Organization org, EnterpriseSolutionStatisticsReport report, string topReseller)
|
||||
{
|
||||
TaskManager.Write("Exchange Report Items " + org.Name);
|
||||
|
||||
//Check if exchange organization
|
||||
if (string.IsNullOrEmpty(org.GlobalAddressList))
|
||||
return;
|
||||
|
@ -420,10 +435,14 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
throw new ApplicationException(
|
||||
string.Format("Could not get mailboxes for current organization {0}", org.Id), ex);
|
||||
}
|
||||
|
||||
TaskManager.WriteParameter("mailboxes.Count", mailboxes.Count);
|
||||
|
||||
try
|
||||
{
|
||||
int exchangeServiceId = GetExchangeServiceID(org.PackageId);
|
||||
|
@ -431,6 +450,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
throw new ApplicationException(
|
||||
string.Format("Could not get exchange server. PackageId: {0}", org.PackageId), ex);
|
||||
}
|
||||
|
@ -440,6 +461,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
{
|
||||
try
|
||||
{
|
||||
TaskManager.WriteParameter("mailbox", mailbox.UserPrincipalName);
|
||||
|
||||
stats = null;
|
||||
try
|
||||
{
|
||||
|
@ -448,6 +471,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
TaskManager.WriteError(ex, "Could not get mailbox statistics. AccountName: {0}",
|
||||
mailbox.UserPrincipalName);
|
||||
}
|
||||
|
@ -466,6 +491,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
|
||||
stats.BlackberryEnabled = BlackBerryController.CheckBlackBerryUserExists(mailbox.AccountId);
|
||||
report.ExchangeReport.Items.Add(stats);
|
||||
|
||||
TaskManager.Write("Items.Add");
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
|
@ -474,6 +501,7 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
}
|
||||
}
|
||||
|
||||
TaskManager.Write("End Populate Exchange Report Items " + org.Name);
|
||||
}
|
||||
|
||||
|
||||
|
@ -547,6 +575,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
|
||||
private static void PopulateSpaceData(int packageId, EnterpriseSolutionStatisticsReport report, string topReseller)
|
||||
{
|
||||
TaskManager.Write("Populate SpaceData " + packageId);
|
||||
|
||||
List<Organization> organizations;
|
||||
|
||||
try
|
||||
|
@ -570,10 +600,14 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
TaskManager.Write("End Populate SpaceData " + packageId);
|
||||
}
|
||||
|
||||
private static void PopulateUserData(UserInfo user, EnterpriseSolutionStatisticsReport report, string topReseller)
|
||||
{
|
||||
TaskManager.Write("Populate UserData " + user.Username);
|
||||
|
||||
DataSet ds;
|
||||
try
|
||||
{
|
||||
|
@ -597,10 +631,13 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
}
|
||||
}
|
||||
|
||||
TaskManager.Write("End Populate UserData " + user.Username);
|
||||
}
|
||||
|
||||
private static void GetUsersData(EnterpriseSolutionStatisticsReport report, int userId, bool generateExchangeReport, bool generateSharePointReport, bool generateCRMReport, bool generateOrganizationReport, bool generateLyncReport, string topReseller)
|
||||
{
|
||||
TaskManager.Write("Get UsersData " + userId);
|
||||
|
||||
List<UserInfo> users;
|
||||
try
|
||||
{
|
||||
|
@ -611,9 +648,12 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
throw new ApplicationException("Cannot get users for report", ex);
|
||||
}
|
||||
|
||||
TaskManager.WriteParameter("users.Count", users.Count);
|
||||
|
||||
foreach (UserInfo user in users)
|
||||
{
|
||||
TaskManager.WriteParameter("User", user.Username);
|
||||
|
||||
try
|
||||
{
|
||||
PopulateUserData(user, report, topReseller);
|
||||
|
@ -632,10 +672,15 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
TaskManager.Write("End get UsersData " + userId);
|
||||
|
||||
}
|
||||
|
||||
public static EnterpriseSolutionStatisticsReport GetEnterpriseSolutionStatisticsReport(int userId, bool generateExchangeReport, bool generateSharePointReport, bool generateCRMReport, bool generateOrganizationReport, bool generateLyncReport)
|
||||
{
|
||||
TaskManager.Write("Get enterprise solution statistics report " + userId);
|
||||
|
||||
EnterpriseSolutionStatisticsReport report = new EnterpriseSolutionStatisticsReport();
|
||||
|
||||
if (generateExchangeReport || generateOrganizationReport)
|
||||
|
@ -647,7 +692,6 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
if (generateLyncReport || generateOrganizationReport)
|
||||
report.LyncReport = new LyncStatisticsReport();
|
||||
|
||||
|
||||
if (generateCRMReport || generateOrganizationReport)
|
||||
report.CRMReport = new CRMStatisticsReport();
|
||||
|
||||
|
@ -664,6 +708,8 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
|||
TaskManager.WriteError(ex, "Cannot get enterprise solution statistics report");
|
||||
}
|
||||
|
||||
TaskManager.Write("End get enterprise solution statistics report " + userId);
|
||||
|
||||
return report;
|
||||
}
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
var checkedDomains = new List<int>();
|
||||
var expiredDomains = new List<DomainInfo>();
|
||||
var nonExistenDomains = new List<DomainInfo>();
|
||||
var subDomains = new List<DomainInfo>();
|
||||
var allDomains = new List<DomainInfo>();
|
||||
var allTopLevelDomains = new List<DomainInfo>();
|
||||
|
||||
// get input parameters
|
||||
|
@ -58,13 +58,11 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
var domains = ServerController.GetDomains(package.PackageId);
|
||||
|
||||
subDomains.AddRange(domains.Where(x => x.IsSubDomain));
|
||||
allDomains.AddRange(domains);
|
||||
|
||||
var topLevelDomains = domains = domains.Where(x => !x.IsSubDomain && !x.IsDomainPointer).ToList(); //Selecting top-level domains
|
||||
domains = domains.Where(x => !x.IsSubDomain && !x.IsDomainPointer).ToList(); //Selecting top-level domains
|
||||
|
||||
allTopLevelDomains.AddRange(topLevelDomains);
|
||||
|
||||
domains = topLevelDomains.Where(x => x.CreationDate == null || x.ExpirationDate == null ? true : CheckDomainExpiration(x.ExpirationDate, daysBeforeNotify)).ToList(); // selecting expired or with empty expire date domains
|
||||
allTopLevelDomains.AddRange(domains);
|
||||
|
||||
var domainUser = UserController.GetUser(package.UserId);
|
||||
|
||||
|
@ -98,17 +96,24 @@ namespace WebsitePanel.EnterpriseServer
|
|||
}
|
||||
}
|
||||
|
||||
subDomains = subDomains.GroupBy(p => p.DomainId).Select(g => g.First()).ToList();
|
||||
var subDomains = allDomains.Where(x => x.ExpirationDate == null || CheckDomainExpiration(x.ExpirationDate, daysBeforeNotify)).GroupBy(p => p.DomainId).Select(g => g.First()).ToList();
|
||||
allTopLevelDomains = allTopLevelDomains.GroupBy(p => p.DomainId).Select(g => g.First()).ToList();
|
||||
|
||||
foreach (var subDomain in subDomains)
|
||||
{
|
||||
var mainDomain = allTopLevelDomains.Where(x => subDomain.DomainName.ToLowerInvariant().Contains(x.DomainName.ToLowerInvariant())).OrderByDescending(s => s.DomainName.Length).FirstOrDefault(); ;
|
||||
var mainDomain = allTopLevelDomains.Where(x => subDomain.DomainId != x.DomainId && subDomain.DomainName.ToLowerInvariant().Contains(x.DomainName.ToLowerInvariant())).OrderByDescending(s => s.DomainName.Length).FirstOrDefault(); ;
|
||||
|
||||
if (mainDomain != null)
|
||||
{
|
||||
ServerController.UpdateDomainRegistrationData(subDomain, mainDomain.CreationDate, mainDomain.ExpirationDate);
|
||||
|
||||
var nonExistenDomain = nonExistenDomains.FirstOrDefault(x => subDomain.DomainId == x.DomainId);
|
||||
|
||||
if (nonExistenDomain != null)
|
||||
{
|
||||
nonExistenDomains.Remove(nonExistenDomain);
|
||||
}
|
||||
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
}
|
||||
|
@ -176,9 +181,11 @@ namespace WebsitePanel.EnterpriseServer
|
|||
Hashtable items = new Hashtable();
|
||||
|
||||
items["user"] = user;
|
||||
|
||||
items["Domains"] = domains.Select(x => new { DomainName = x.DomainName,
|
||||
ExpirationDate = x.ExpirationDate,
|
||||
Customer = string.Format("{0} {1}", domainUsers[x.PackageId].FirstName, domainUsers[x.PackageId].LastName) });
|
||||
Customer = string.Format("{0} {1}", domainUsers[x.PackageId].FirstName, domainUsers[x.PackageId].LastName) })
|
||||
.OrderBy(x => x.ExpirationDate).ThenBy(x => x.Customer).ThenBy(x => x.DomainName);
|
||||
|
||||
items["IncludeNonExistenDomains"] = includeNonExistenDomains;
|
||||
|
||||
|
@ -186,7 +193,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
DomainName = x.DomainName,
|
||||
Customer = string.Format("{0} {1}", domainUsers[x.PackageId].FirstName, domainUsers[x.PackageId].LastName)
|
||||
});
|
||||
}).OrderBy(x => x.Customer).ThenBy(x => x.DomainName);
|
||||
|
||||
|
||||
body = PackageController.EvaluateTemplate(body, items);
|
||||
|
|
|
@ -23,20 +23,26 @@ namespace WebsitePanel.EnterpriseServer
|
|||
private static readonly string MailBodyTemplateParameter = "MAIL_BODY";
|
||||
private static readonly string MailBodyDomainRecordTemplateParameter = "MAIL_DOMAIN_RECORD";
|
||||
private static readonly string ServerNameParameter = "SERVER_NAME";
|
||||
private static readonly string PauseBetweenQueriesParameter = "PAUSE_BETWEEN_QUERIES";
|
||||
|
||||
private const string MxRecordPattern = @"mail exchanger = (.+)";
|
||||
private const string NsRecordPattern = @"nameserver = (.+)";
|
||||
private const string DnsTimeOutMessage = @"dns request timed out";
|
||||
private const int DnsTimeOutRetryCount = 3;
|
||||
|
||||
public override void DoWork()
|
||||
{
|
||||
BackgroundTask topTask = TaskManager.TopTask;
|
||||
|
||||
List<DomainDnsChanges> domainsChanges = new List<DomainDnsChanges>();
|
||||
var domainUsers = new Dictionary<int, UserInfo>();
|
||||
|
||||
// get input parameters
|
||||
string dnsServersString = (string)topTask.GetParamValue(DnsServersParameter);
|
||||
string serverName = (string)topTask.GetParamValue(ServerNameParameter);
|
||||
|
||||
int pause;
|
||||
|
||||
// check input parameters
|
||||
if (String.IsNullOrEmpty(dnsServersString))
|
||||
{
|
||||
|
@ -50,6 +56,13 @@ namespace WebsitePanel.EnterpriseServer
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
if (!int.TryParse((string)topTask.GetParamValue(PauseBetweenQueriesParameter), out pause))
|
||||
{
|
||||
TaskManager.WriteWarning("The 'pause between queries' parameter is not valid.");
|
||||
return;
|
||||
}
|
||||
|
||||
// find server by name
|
||||
ServerInfo server = ServerController.GetServerByName(serverName);
|
||||
if (server == null)
|
||||
|
@ -83,22 +96,32 @@ namespace WebsitePanel.EnterpriseServer
|
|||
continue;
|
||||
}
|
||||
|
||||
if (!domainUsers.ContainsKey(domain.PackageId))
|
||||
{
|
||||
var domainUser = UserController.GetUser(packages.First(x=>x.PackageId == domain.PackageId).UserId);
|
||||
|
||||
domainUsers.Add(domain.PackageId, domainUser);
|
||||
}
|
||||
|
||||
DomainDnsChanges domainChanges = new DomainDnsChanges();
|
||||
domainChanges.DomainName = domain.DomainName;
|
||||
domainChanges.PackageId = domain.PackageId;
|
||||
|
||||
var dbDnsRecords = ObjectUtils.CreateListFromDataReader<DnsRecordInfo>(DataProvider.GetDomainAllDnsRecords(domain.DomainId));
|
||||
|
||||
//execute server
|
||||
foreach (var dnsServer in dnsServers)
|
||||
{
|
||||
var dnsMxRecords = GetDomainDnsRecords(winServer, domain.DomainName, dnsServer, DnsRecordType.MX);
|
||||
var dnsNsRecords = GetDomainDnsRecords(winServer, domain.DomainName, dnsServer, DnsRecordType.NS);
|
||||
var dnsMxRecords = GetDomainDnsRecords(winServer, domain.DomainName, dnsServer, DnsRecordType.MX, pause) ?? dbDnsRecords.Where(x => x.RecordType == DnsRecordType.MX).ToList();
|
||||
var dnsNsRecords = GetDomainDnsRecords(winServer, domain.DomainName, dnsServer, DnsRecordType.NS, pause) ?? dbDnsRecords.Where(x => x.RecordType == DnsRecordType.NS).ToList();
|
||||
|
||||
FillRecordData(dnsMxRecords, domain, dnsServer);
|
||||
FillRecordData(dnsNsRecords, domain, dnsServer);
|
||||
|
||||
domainChanges.DnsChanges.AddRange(ApplyDomainRecordsChanges(dbDnsRecords.Where(x => x.RecordType == DnsRecordType.MX), dnsMxRecords, dnsServer));
|
||||
domainChanges.DnsChanges.AddRange(ApplyDomainRecordsChanges(dbDnsRecords.Where(x => x.RecordType == DnsRecordType.NS), dnsNsRecords, dnsServer));
|
||||
|
||||
domainChanges.DnsChanges = CombineDnsRecordChanges(domainChanges.DnsChanges, dnsServer).ToList();
|
||||
}
|
||||
|
||||
domainsChanges.Add(domainChanges);
|
||||
|
@ -107,7 +130,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
|
||||
var changedDomains = FindDomainsWithChangedRecords(domainsChanges);
|
||||
|
||||
SendMailMessage(user, changedDomains);
|
||||
SendMailMessage(user, changedDomains, domainUsers);
|
||||
}
|
||||
|
||||
|
||||
|
@ -150,13 +173,13 @@ namespace WebsitePanel.EnterpriseServer
|
|||
|
||||
if (dnsRecord != null)
|
||||
{
|
||||
dnsRecordChanges.Add(new DnsRecordInfoChange { Record = record, Type = record.RecordType, Status = DomainDnsRecordStatuses.NotChanged, DnsServer = dnsServer });
|
||||
dnsRecordChanges.Add(new DnsRecordInfoChange { OldRecord = record, NewRecord = dnsRecord, Type = record.RecordType, Status = DomainDnsRecordStatuses.NotChanged, DnsServer = dnsServer });
|
||||
|
||||
dnsRecords.Remove(dnsRecord);
|
||||
}
|
||||
else
|
||||
{
|
||||
dnsRecordChanges.Add(new DnsRecordInfoChange { Record = record, Type = record.RecordType, Status = DomainDnsRecordStatuses.Removed, DnsServer = dnsServer });
|
||||
dnsRecordChanges.Add(new DnsRecordInfoChange { OldRecord = record, NewRecord = new DnsRecordInfo { Value = string.Empty}, Type = record.RecordType, Status = DomainDnsRecordStatuses.Removed, DnsServer = dnsServer });
|
||||
|
||||
RemoveRecord(record);
|
||||
}
|
||||
|
@ -164,7 +187,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
|
||||
foreach (var record in dnsRecords)
|
||||
{
|
||||
dnsRecordChanges.Add(new DnsRecordInfoChange { Record = record, Type = record.RecordType, Status = DomainDnsRecordStatuses.Added, DnsServer= dnsServer});
|
||||
dnsRecordChanges.Add(new DnsRecordInfoChange { OldRecord = new DnsRecordInfo { Value = string.Empty }, NewRecord = record, Type = record.RecordType, Status = DomainDnsRecordStatuses.Added, DnsServer = dnsServer });
|
||||
|
||||
AddRecord(record);
|
||||
}
|
||||
|
@ -172,6 +195,39 @@ namespace WebsitePanel.EnterpriseServer
|
|||
return dnsRecordChanges;
|
||||
}
|
||||
|
||||
private IEnumerable<DnsRecordInfoChange> CombineDnsRecordChanges(IEnumerable<DnsRecordInfoChange> records, string dnsServer)
|
||||
{
|
||||
var resultRecords = records.Where(x => x.DnsServer == dnsServer).ToList();
|
||||
|
||||
var recordsToRemove = new List<DnsRecordInfoChange>();
|
||||
|
||||
var removedRecords = records.Where(x => x.Status == DomainDnsRecordStatuses.Removed);
|
||||
var addedRecords = records.Where(x => x.Status == DomainDnsRecordStatuses.Added);
|
||||
|
||||
foreach (DnsRecordType type in (DnsRecordType[])Enum.GetValues(typeof(DnsRecordType)))
|
||||
{
|
||||
foreach (var removedRecord in removedRecords.Where(x => x.Type == type))
|
||||
{
|
||||
var addedRecord = addedRecords.FirstOrDefault(x => x.Type == type && !recordsToRemove.Contains(x));
|
||||
|
||||
if (addedRecord != null)
|
||||
{
|
||||
recordsToRemove.Add(addedRecord);
|
||||
|
||||
removedRecord.NewRecord = addedRecord.NewRecord;
|
||||
removedRecord.Status = DomainDnsRecordStatuses.Updated;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var record in recordsToRemove)
|
||||
{
|
||||
resultRecords.Remove(record);
|
||||
}
|
||||
|
||||
return resultRecords;
|
||||
}
|
||||
|
||||
private void FillRecordData(IEnumerable<DnsRecordInfo> records, DomainInfo domain, string dnsServer)
|
||||
{
|
||||
foreach (var record in records)
|
||||
|
@ -217,7 +273,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
Thread.Sleep(100);
|
||||
}
|
||||
|
||||
private void SendMailMessage(UserInfo user, IEnumerable<DomainDnsChanges> domainsChanges)
|
||||
private void SendMailMessage(UserInfo user, IEnumerable<DomainDnsChanges> domainsChanges, Dictionary<int, UserInfo> domainUsers)
|
||||
{
|
||||
BackgroundTask topTask = TaskManager.TopTask;
|
||||
|
||||
|
@ -251,6 +307,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
Hashtable items = new Hashtable();
|
||||
|
||||
items["user"] = user;
|
||||
items["DomainUsers"] = domainUsers;
|
||||
items["Domains"] = domainsChanges;
|
||||
|
||||
body = PackageController.EvaluateTemplate(body, items);
|
||||
|
@ -259,14 +316,29 @@ namespace WebsitePanel.EnterpriseServer
|
|||
MailHelper.SendMessage(from, mailTo, bcc, subject, body, priority, isHtml);
|
||||
}
|
||||
|
||||
public List<DnsRecordInfo> GetDomainDnsRecords(WindowsServer winServer, string domain, string dnsServer, DnsRecordType recordType)
|
||||
public List<DnsRecordInfo> GetDomainDnsRecords(WindowsServer winServer, string domain, string dnsServer, DnsRecordType recordType, int pause)
|
||||
{
|
||||
Thread.Sleep(pause);
|
||||
|
||||
//nslookup -type=mx google.com 195.46.39.39
|
||||
var command = "nslookup";
|
||||
var args = string.Format("-type={0} {1} {2}", recordType, domain, dnsServer);
|
||||
|
||||
// execute system command
|
||||
var raw = winServer.ExecuteSystemCommand(command, args);
|
||||
var raw = string.Empty;
|
||||
int triesCount = 0;
|
||||
|
||||
do
|
||||
{
|
||||
raw = winServer.ExecuteSystemCommand(command, args);
|
||||
}
|
||||
while (raw.ToLowerInvariant().Contains(DnsTimeOutMessage) && ++triesCount < DnsTimeOutRetryCount);
|
||||
|
||||
//timeout check
|
||||
if (raw.ToLowerInvariant().Contains(DnsTimeOutMessage))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var records = ParseNsLookupResult(raw, dnsServer, recordType);
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@ using System.IO;
|
|||
using System.Net.Mail;
|
||||
using System.Net.Mime;
|
||||
using System.Text;
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
using WebsitePanel.EnterpriseServer.Code.HostedSolution;
|
||||
using WebsitePanel.Providers.HostedSolution;
|
||||
|
||||
|
@ -51,6 +52,8 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
try
|
||||
{
|
||||
TaskManager.Write("Start HostedSolutionReportTask");
|
||||
|
||||
BackgroundTask topTask = TaskManager.TopTask;
|
||||
|
||||
bool isExchange = Utils.ParseBool(topTask.GetParamValue(EXCHANGE_REPORT), false);
|
||||
|
@ -61,23 +64,41 @@ namespace WebsitePanel.EnterpriseServer
|
|||
|
||||
string email = topTask.GetParamValue(EMAIL).ToString();
|
||||
|
||||
TaskManager.WriteParameter("isExchange",isExchange);
|
||||
TaskManager.WriteParameter("isSharePoint",isSharePoint);
|
||||
TaskManager.WriteParameter("isLync", isLync);
|
||||
TaskManager.WriteParameter("isCRM", isCRM);
|
||||
TaskManager.WriteParameter("isOrganization", isOrganization);
|
||||
TaskManager.WriteParameter("email", email);
|
||||
|
||||
UserInfo user = PackageController.GetPackageOwner(topTask.PackageId);
|
||||
|
||||
TaskManager.WriteParameter("user", user.Username);
|
||||
|
||||
EnterpriseSolutionStatisticsReport report =
|
||||
ReportController.GetEnterpriseSolutionStatisticsReport(user.UserId, isExchange, isSharePoint, isCRM,
|
||||
isOrganization, isLync);
|
||||
|
||||
TaskManager.WriteParameter("report.ExchangeReport.Items.Count", report.ExchangeReport.Items.Count);
|
||||
TaskManager.WriteParameter("report.SharePointReport.Items.Count", report.SharePointReport.Items.Count);
|
||||
TaskManager.WriteParameter("report.CRMReport.Items.Count", report.CRMReport.Items.Count);
|
||||
TaskManager.WriteParameter("report.OrganizationReport.Items.Count", report.OrganizationReport.Items.Count);
|
||||
TaskManager.WriteParameter("report.LyncReport.Items.Count", report.LyncReport.Items.Count);
|
||||
|
||||
SendMessage(user, email, isExchange && report.ExchangeReport != null ? report.ExchangeReport.ToCSV() : string.Empty,
|
||||
isSharePoint && report.SharePointReport != null ? report.SharePointReport.ToCSV() : string.Empty,
|
||||
isCRM && report.CRMReport != null ? report.CRMReport.ToCSV() : string.Empty,
|
||||
isOrganization && report.OrganizationReport != null ? report.OrganizationReport.ToCSV() : string.Empty,
|
||||
isLync && report.LyncReport != null ? report.LyncReport.ToCSV() : string.Empty);
|
||||
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
|
||||
TaskManager.Write("End HostedSolutionReportTask");
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -97,6 +118,8 @@ namespace WebsitePanel.EnterpriseServer
|
|||
|
||||
private void SendMessage(UserInfo user,string email, string exchange_csv, string sharepoint_csv, string crm_csv, string organization_csv, string lync_csv)
|
||||
{
|
||||
TaskManager.Write("SendMessage");
|
||||
|
||||
List<Attachment> attacments = new List<Attachment>();
|
||||
PrepareAttament("exchange.csv", exchange_csv, attacments);
|
||||
PrepareAttament("sharepoint.csv", sharepoint_csv, attacments);
|
||||
|
@ -104,9 +127,6 @@ namespace WebsitePanel.EnterpriseServer
|
|||
PrepareAttament("crm.csv", crm_csv, attacments);
|
||||
PrepareAttament("organization.csv", organization_csv, attacments);
|
||||
|
||||
|
||||
|
||||
|
||||
// get letter settings
|
||||
UserSettings settings = UserController.GetUserSettings(user.UserId, UserSettings.HOSTED_SOLUTION_REPORT);
|
||||
|
||||
|
@ -118,7 +138,27 @@ namespace WebsitePanel.EnterpriseServer
|
|||
|
||||
MailPriority priority = MailPriority.Normal;
|
||||
|
||||
MailHelper.SendMessage(from, email, cc, subject, body, priority, isHtml, attacments.ToArray());
|
||||
TaskManager.WriteParameter("from", from);
|
||||
TaskManager.WriteParameter("email", email);
|
||||
TaskManager.WriteParameter("subject", subject);
|
||||
TaskManager.WriteParameter("body", body);
|
||||
|
||||
|
||||
int res = MailHelper.SendMessage(from, email, cc, subject, body, priority, isHtml, attacments.ToArray());
|
||||
|
||||
if (res==0)
|
||||
{
|
||||
TaskManager.Write("SendMessage OK");
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskManager.WriteError("SendMessage error ", "error code", res.ToString());
|
||||
}
|
||||
|
||||
TaskManager.WriteParameter("", res);
|
||||
|
||||
TaskManager.Write("End SendMessage");
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@ using System;
|
|||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Xml;
|
||||
using WebsitePanel.Providers;
|
||||
|
@ -42,6 +43,8 @@ using WebsitePanel.Providers.HostedSolution;
|
|||
using Whois.NET;
|
||||
using System.Text.RegularExpressions;
|
||||
using WebsitePanel.Providers.DomainLookup;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
|
@ -72,6 +75,9 @@ namespace WebsitePanel.EnterpriseServer
|
|||
@"expires:(.+)" //.fi
|
||||
};
|
||||
|
||||
private static List<string> _datePatterns = new List<string> { @"ddd MMM dd HH:mm:ss G\MT yyyy"
|
||||
};
|
||||
|
||||
#region Servers
|
||||
public static List<ServerInfo> GetAllServers()
|
||||
{
|
||||
|
@ -1641,11 +1647,16 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
var result = new List<DnsRecordInfo>();
|
||||
|
||||
var mxRecords = ObjectUtils.CreateListFromDataReader<DnsRecordInfo>(DataProvider.GetDomainDnsRecords(domainId, DnsRecordType.MX));
|
||||
var nsRecords = ObjectUtils.CreateListFromDataReader<DnsRecordInfo>(DataProvider.GetDomainDnsRecords(domainId, DnsRecordType.NS));
|
||||
var records = ObjectUtils.CreateListFromDataReader<DnsRecordInfo>(DataProvider.GetDomainAllDnsRecords(domainId));
|
||||
|
||||
result.AddRange(mxRecords);
|
||||
result.AddRange(nsRecords);
|
||||
var activeDomain = records.OrderByDescending(x => x.Date).FirstOrDefault();
|
||||
|
||||
if (activeDomain != null)
|
||||
{
|
||||
records = records.Where(x => x.DnsServer == activeDomain.DnsServer).ToList();
|
||||
}
|
||||
|
||||
result.AddRange(records);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -2178,11 +2189,13 @@ namespace WebsitePanel.EnterpriseServer
|
|||
}
|
||||
}
|
||||
|
||||
// Find and delete all zone items for this domain
|
||||
var zoneItems = PackageController.GetPackageItemsByType(domain.PackageId, ResourceGroups.Dns, typeof (DnsZone));
|
||||
zoneItems.AddRange(PackageController.GetPackageItemsByType(domain.PackageId, ResourceGroups.Dns, typeof(SecondaryDnsZone)));
|
||||
|
||||
// remove DNS zone meta-item if required
|
||||
if (domain.ZoneItemId > 0)
|
||||
foreach (var zoneItem in zoneItems.Where(z => z.Name == domain.ZoneName))
|
||||
{
|
||||
PackageController.DeletePackageItem(domain.ZoneItemId);
|
||||
PackageController.DeletePackageItem(zoneItem.Id);
|
||||
}
|
||||
|
||||
// delete domain
|
||||
|
@ -2723,7 +2736,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
{
|
||||
if (match.Success && match.Groups.Count == 2)
|
||||
{
|
||||
return DateTime.Parse(match.Groups[1].ToString().Trim());
|
||||
return ParseDate(match.Groups[1].ToString().Trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2731,6 +2744,21 @@ namespace WebsitePanel.EnterpriseServer
|
|||
return null;
|
||||
}
|
||||
|
||||
private static DateTime? ParseDate(string dateString)
|
||||
{
|
||||
var result = DateTime.MinValue;
|
||||
|
||||
foreach (var datePattern in _datePatterns)
|
||||
{
|
||||
if (DateTime.TryParseExact(dateString, datePattern, CultureInfo.InvariantCulture, DateTimeStyles.None, out result))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return DateTime.Parse(dateString);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region DNS Zones
|
||||
|
@ -2748,7 +2776,7 @@ namespace WebsitePanel.EnterpriseServer
|
|||
DNSServer dns = new DNSServer();
|
||||
ServiceProviderProxy.Init(dns, zoneItem.ServiceId);
|
||||
|
||||
return dns.GetZoneRecords(domain.DomainName);
|
||||
return dns.GetZoneRecords(zoneItem.Name);
|
||||
}
|
||||
|
||||
return new DnsRecord[] { };
|
||||
|
|
|
@ -9,7 +9,8 @@ namespace WebsitePanel.Providers.DomainLookup
|
|||
public class DnsRecordInfoChange
|
||||
{
|
||||
public string DnsServer { get; set; }
|
||||
public DnsRecordInfo Record { get; set; }
|
||||
public DnsRecordInfo OldRecord { get; set; }
|
||||
public DnsRecordInfo NewRecord { get; set; }
|
||||
public DomainDnsRecordStatuses Status { get; set; }
|
||||
public DnsRecordType Type { get; set; }
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ namespace WebsitePanel.Providers.DomainLookup
|
|||
public class DomainDnsChanges
|
||||
{
|
||||
public string DomainName { get; set; }
|
||||
public int PackageId { get; set; }
|
||||
|
||||
public List<DnsRecordInfoChange> DnsChanges { get; set; }
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ namespace WebsitePanel.Providers.DomainLookup
|
|||
{
|
||||
NotChanged,
|
||||
Removed,
|
||||
Added
|
||||
Added,
|
||||
Updated
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,15 +35,16 @@ namespace WebsitePanel.SchedulerService
|
|||
public partial class SchedulerService : ServiceBase
|
||||
{
|
||||
private Timer _Timer;
|
||||
private static bool _isRuninng;
|
||||
private static object _isRuninng;
|
||||
#region Construcor
|
||||
|
||||
public SchedulerService()
|
||||
{
|
||||
_isRuninng = new object();
|
||||
|
||||
InitializeComponent();
|
||||
|
||||
_Timer = new Timer(Process, null, 5000, 5000);
|
||||
_isRuninng = false;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@ -57,12 +58,18 @@ namespace WebsitePanel.SchedulerService
|
|||
protected static void Process(object callback)
|
||||
{
|
||||
//check running service
|
||||
if (_isRuninng)
|
||||
if (!Monitor.TryEnter(_isRuninng))
|
||||
return;
|
||||
|
||||
_isRuninng = true;
|
||||
try
|
||||
{
|
||||
Scheduler.Start();
|
||||
_isRuninng = false;
|
||||
}
|
||||
finally
|
||||
{
|
||||
Monitor.Exit(_isRuninng);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Globalization;
|
||||
using System.Web.Services;
|
||||
using System.Web.Services.Protocols;
|
||||
using WebsitePanel.Providers;
|
||||
|
@ -51,6 +52,13 @@ namespace WebsitePanel.Server
|
|||
get { return (IDnsServer)Provider; }
|
||||
}
|
||||
|
||||
private string GetAsciiZoneName(string zoneName)
|
||||
{
|
||||
if (string.IsNullOrEmpty(zoneName)) return zoneName;
|
||||
var idn = new IdnMapping();
|
||||
return idn.GetAscii(zoneName);
|
||||
}
|
||||
|
||||
#region Zones
|
||||
[WebMethod, SoapHeader("settings")]
|
||||
public bool ZoneExists(string zoneName)
|
||||
|
@ -58,7 +66,7 @@ namespace WebsitePanel.Server
|
|||
try
|
||||
{
|
||||
Log.WriteStart("'{0}' ZoneExists", ProviderSettings.ProviderName);
|
||||
bool result = DnsProvider.ZoneExists(zoneName);
|
||||
bool result = DnsProvider.ZoneExists(GetAsciiZoneName(zoneName));
|
||||
Log.WriteEnd("'{0}' ZoneExists", ProviderSettings.ProviderName);
|
||||
return result;
|
||||
}
|
||||
|
@ -92,7 +100,7 @@ namespace WebsitePanel.Server
|
|||
try
|
||||
{
|
||||
Log.WriteStart("'{0}' AddPrimaryZone", ProviderSettings.ProviderName);
|
||||
DnsProvider.AddPrimaryZone(zoneName, secondaryServers);
|
||||
DnsProvider.AddPrimaryZone(GetAsciiZoneName(zoneName), secondaryServers);
|
||||
Log.WriteEnd("'{0}' AddPrimaryZone", ProviderSettings.ProviderName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
@ -108,7 +116,7 @@ namespace WebsitePanel.Server
|
|||
try
|
||||
{
|
||||
Log.WriteStart("'{0}' AddSecondaryZone", ProviderSettings.ProviderName);
|
||||
DnsProvider.AddSecondaryZone(zoneName, masterServers);
|
||||
DnsProvider.AddSecondaryZone(GetAsciiZoneName(zoneName), masterServers);
|
||||
Log.WriteEnd("'{0}' AddSecondaryZone", ProviderSettings.ProviderName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
@ -124,7 +132,7 @@ namespace WebsitePanel.Server
|
|||
try
|
||||
{
|
||||
Log.WriteStart("'{0}' DeleteZone", ProviderSettings.ProviderName);
|
||||
DnsProvider.DeleteZone(zoneName);
|
||||
DnsProvider.DeleteZone(GetAsciiZoneName(zoneName));
|
||||
Log.WriteEnd("'{0}' DeleteZone", ProviderSettings.ProviderName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
@ -140,7 +148,7 @@ namespace WebsitePanel.Server
|
|||
try
|
||||
{
|
||||
Log.WriteStart("'{0}' UpdateSoaRecord", ProviderSettings.ProviderName);
|
||||
DnsProvider.UpdateSoaRecord(zoneName, host, primaryNsServer, primaryPerson);
|
||||
DnsProvider.UpdateSoaRecord(GetAsciiZoneName(zoneName), host, primaryNsServer, primaryPerson);
|
||||
Log.WriteEnd("'{0}' UpdateSoaRecord", ProviderSettings.ProviderName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
@ -158,7 +166,7 @@ namespace WebsitePanel.Server
|
|||
try
|
||||
{
|
||||
Log.WriteStart("'{0}' GetZoneRecords", ProviderSettings.ProviderName);
|
||||
DnsRecord[] result = DnsProvider.GetZoneRecords(zoneName);
|
||||
DnsRecord[] result = DnsProvider.GetZoneRecords(GetAsciiZoneName(zoneName));
|
||||
Log.WriteEnd("'{0}' GetZoneRecords", ProviderSettings.ProviderName);
|
||||
return result;
|
||||
}
|
||||
|
@ -175,7 +183,7 @@ namespace WebsitePanel.Server
|
|||
try
|
||||
{
|
||||
Log.WriteStart("'{0}' AddZoneRecord", ProviderSettings.ProviderName);
|
||||
DnsProvider.AddZoneRecord(zoneName, record);
|
||||
DnsProvider.AddZoneRecord(GetAsciiZoneName(zoneName), record);
|
||||
Log.WriteEnd("'{0}' AddZoneRecord", ProviderSettings.ProviderName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
@ -191,7 +199,7 @@ namespace WebsitePanel.Server
|
|||
try
|
||||
{
|
||||
Log.WriteStart("'{0}' DeleteZoneRecord", ProviderSettings.ProviderName);
|
||||
DnsProvider.DeleteZoneRecord(zoneName, record);
|
||||
DnsProvider.DeleteZoneRecord(GetAsciiZoneName(zoneName), record);
|
||||
Log.WriteEnd("'{0}' DeleteZoneRecord", ProviderSettings.ProviderName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
@ -207,7 +215,7 @@ namespace WebsitePanel.Server
|
|||
try
|
||||
{
|
||||
Log.WriteStart("'{0}' AddZoneRecords", ProviderSettings.ProviderName);
|
||||
DnsProvider.AddZoneRecords(zoneName, records);
|
||||
DnsProvider.AddZoneRecords(GetAsciiZoneName(zoneName), records);
|
||||
Log.WriteEnd("'{0}' AddZoneRecords", ProviderSettings.ProviderName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
@ -223,7 +231,7 @@ namespace WebsitePanel.Server
|
|||
try
|
||||
{
|
||||
Log.WriteStart("'{0}' DeleteZoneRecords", ProviderSettings.ProviderName);
|
||||
DnsProvider.DeleteZoneRecords(zoneName, records);
|
||||
DnsProvider.DeleteZoneRecords(GetAsciiZoneName(zoneName), records);
|
||||
Log.WriteEnd("'{0}' DeleteZoneRecords", ProviderSettings.ProviderName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
|
|
@ -213,4 +213,7 @@
|
|||
<data name="DomainExpirationDate.NotExist" xml:space="preserve">
|
||||
<value>Non-Existent</value>
|
||||
</data>
|
||||
<data name="DomainLookup.TooltipHeader" xml:space="preserve">
|
||||
<value>Current Real DNS Values</value>
|
||||
</data>
|
||||
</root>
|
|
@ -144,18 +144,6 @@
|
|||
<data name="DescribeEnableDns.Text" xml:space="preserve">
|
||||
<value>Tick this checkbox if DNS zone for this domain will be located on name servers of your hosting provider. Make sure you changed name servers in the domain registrar control panel.</value>
|
||||
</data>
|
||||
<data name="DomainFormatValidator.ErrorMessage" xml:space="preserve">
|
||||
<value>Please, enter correct domain name, for example "mydomain.com" or "sub.mydomain.com".</value>
|
||||
</data>
|
||||
<data name="DomainFormatValidator.Text" xml:space="preserve">
|
||||
<value>*</value>
|
||||
</data>
|
||||
<data name="DomainRequiredValidator.ErrorMessage" xml:space="preserve">
|
||||
<value>Please enter domain name</value>
|
||||
</data>
|
||||
<data name="DomainRequiredValidator.Text" xml:space="preserve">
|
||||
<value>*</value>
|
||||
</data>
|
||||
<data name="EnableDns.Text" xml:space="preserve">
|
||||
<value>Enable DNS</value>
|
||||
</data>
|
||||
|
@ -168,18 +156,6 @@
|
|||
<data name="PointWebSite.Text" xml:space="preserve">
|
||||
<value>Assign to existing Web Site</value>
|
||||
</data>
|
||||
<data name="SubDomainFormatValidator.ErrorMessage" xml:space="preserve">
|
||||
<value>Please, enter correct sub-domain name, for example "subdomain" or "sub.subdomain".</value>
|
||||
</data>
|
||||
<data name="SubDomainFormatValidator.Text" xml:space="preserve">
|
||||
<value>*</value>
|
||||
</data>
|
||||
<data name="SubDomainRequiredValidator.ErrorMessage" xml:space="preserve">
|
||||
<value>Please enter sub-domain name</value>
|
||||
</data>
|
||||
<data name="SubDomainRequiredValidator.Text" xml:space="preserve">
|
||||
<value>*</value>
|
||||
</data>
|
||||
<data name="lblHostName.Text" xml:space="preserve">
|
||||
<value>Hostname:</value>
|
||||
</data>
|
||||
|
|
|
@ -306,5 +306,26 @@ namespace WebsitePanel.Portal
|
|||
(cntx.Quotas[key].QuotaTypeId != 1 && (cntx.Quotas[key].QuotaAllocatedValue > 0 || cntx.Quotas[key].QuotaAllocatedValue == -1)));
|
||||
}
|
||||
|
||||
public static bool IsIdnDomain(string domainName)
|
||||
{
|
||||
if (string.IsNullOrEmpty(domainName))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var idn = new IdnMapping();
|
||||
return idn.GetAscii(domainName) != domainName;
|
||||
}
|
||||
|
||||
public static string UnicodeToAscii(string domainName)
|
||||
{
|
||||
if (string.IsNullOrEmpty(domainName))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
var idn = new IdnMapping();
|
||||
return idn.GetAscii(domainName);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -30,6 +30,7 @@ using System;
|
|||
using System.Data;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Globalization;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
|
@ -57,6 +58,10 @@ namespace WebsitePanel.Portal
|
|||
// domain name
|
||||
DomainInfo domain = ES.Services.Servers.GetDomain(PanelRequest.DomainID);
|
||||
litDomainName.Text = domain.DomainName;
|
||||
if (Utils.IsIdnDomain(domain.DomainName))
|
||||
{
|
||||
litDomainName.Text = string.Format("{0} ({1})", Utils.UnicodeToAscii(domain.DomainName), domain.DomainName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@ using System.Web.UI.HtmlControls;
|
|||
using System.Linq;
|
||||
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace WebsitePanel.Portal
|
||||
{
|
||||
|
@ -160,7 +161,15 @@ namespace WebsitePanel.Portal
|
|||
return "No Dns Records";
|
||||
}
|
||||
|
||||
return string.Join("\r\n", records.Select(x=>string.Format("{0}: {1}", x.RecordType, x.Value)));
|
||||
var header = GetLocalizedString("DomainLookup.TooltipHeader");
|
||||
|
||||
var tooltipLines = new List<string>();
|
||||
|
||||
tooltipLines.Add(header);
|
||||
tooltipLines.Add(" ");
|
||||
tooltipLines.AddRange( records.Select(x=>string.Format("{0}: {1}", x.RecordType, x.Value)));
|
||||
|
||||
return string.Join("\r\n", tooltipLines);
|
||||
}
|
||||
|
||||
protected void odsDomainsPaged_Selected(object sender, ObjectDataSourceStatusEventArgs e)
|
||||
|
|
|
@ -1,33 +1,21 @@
|
|||
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DomainsAddDomain.ascx.cs" Inherits="WebsitePanel.Portal.DomainsAddDomain" %>
|
||||
<%@ Register Src="UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %>
|
||||
<%@ Register Src="DomainsSelectDomainControl.ascx" TagName="DomainsSelectDomainControl" TagPrefix="uc1" %>
|
||||
<%@ Register Src="UserControls/DomainControl.ascx" TagName="DomainControl" TagPrefix="wsp" %>
|
||||
<%@ Register Src="UserControls/CollapsiblePanel.ascx" TagPrefix="wsp" TagName="CollapsiblePanel" %>
|
||||
|
||||
<wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server" />
|
||||
|
||||
<asp:ValidationSummary ID="summary" runat="server" ShowMessageBox="true" ShowSummary="false" ValidationGroup="Domain" />
|
||||
<asp:ValidationSummary ID="summary" runat="server" ShowMessageBox="true" ShowSummary="true" ValidationGroup="Domain" />
|
||||
|
||||
<div class="FormBody">
|
||||
|
||||
<p id="DomainPanel" runat="server" style="padding: 15px 0 15px 5px;" visible="false">
|
||||
<asp:TextBox ID="DomainName" runat="server" Width="300" CssClass="HugeTextBox"></asp:TextBox>
|
||||
<asp:RequiredFieldValidator id="DomainRequiredValidator" runat="server" meta:resourcekey="DomainRequiredValidator"
|
||||
ControlToValidate="DomainName" Display="Dynamic" ValidationGroup="Domain" SetFocusOnError="true"></asp:RequiredFieldValidator>
|
||||
<asp:RegularExpressionValidator id="DomainFormatValidator" runat="server" meta:resourcekey="DomainFormatValidator"
|
||||
ControlToValidate="DomainName" Display="Dynamic" ValidationGroup="Domain" SetFocusOnError="true"
|
||||
ValidationExpression="^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.){1,10}[a-zA-Z]{2,15}$"></asp:RegularExpressionValidator>
|
||||
<p id="DomainPanel" runat="server" style="padding: 15px 0 15px 5px;">
|
||||
<wsp:DomainControl ID="DomainName" runat="server" RequiredEnabled="True" ValidationGroup="Domain" AutoPostBack="True" OnTextChanged="DomainName_TextChanged"></wsp:DomainControl>
|
||||
</p>
|
||||
|
||||
<%--
|
||||
<p id="SubDomainPanel" runat="server" style="padding: 15px 0 15px 5px;" visible="false">
|
||||
<asp:TextBox ID="SubDomainName" runat="server" Width="150" CssClass="TextBox100"></asp:TextBox>
|
||||
.
|
||||
<asp:DropDownList ID="DomainsList" Runat="server" CssClass="NormalTextBox" DataTextField="DomainName" DataValueField="DomainName"></asp:DropDownList>
|
||||
<asp:RequiredFieldValidator id="SubDomainRequiredValidator" runat="server" meta:resourcekey="SubDomainRequiredValidator"
|
||||
ControlToValidate="SubDomainName" Display="Dynamic" ValidationGroup="Domain" SetFocusOnError="true"></asp:RequiredFieldValidator>
|
||||
<asp:RegularExpressionValidator id="SubDomainFormatValidator" runat="server" meta:resourcekey="SubDomainFormatValidator"
|
||||
ControlToValidate="SubDomainName" Display="Dynamic" ValidationGroup="Domain" SetFocusOnError="true"
|
||||
ValidationExpression="^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?)(\.[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?){0,9}$"></asp:RegularExpressionValidator>
|
||||
</p>
|
||||
<wsp:DomainControl ID="SubDomainName" runat="server" RequiredEnabled="True" IsSubDomain="True" ValidationGroup="Domain"></wsp:DomainControl>
|
||||
</p>--%>
|
||||
|
||||
<wsp:CollapsiblePanel id="OptionsPanelHeader" runat="server"
|
||||
TargetControlID="OptionsPanel" resourcekey="OptionsPanelHeader" Text="Provisioning options">
|
||||
|
|
|
@ -30,6 +30,7 @@ using System;
|
|||
using System.Web;
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
using System.Collections.Generic;
|
||||
using WebsitePanel.Portal.UserControls;
|
||||
|
||||
namespace WebsitePanel.Portal
|
||||
{
|
||||
|
@ -82,12 +83,12 @@ namespace WebsitePanel.Portal
|
|||
if (type == DomainType.Domain || type == DomainType.DomainPointer)
|
||||
{
|
||||
// domains
|
||||
DomainPanel.Visible = true;
|
||||
DomainName.IsSubDomain = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// sub-domains
|
||||
SubDomainPanel.Visible = true;
|
||||
DomainName.IsSubDomain = true;
|
||||
|
||||
// fill sub-domains
|
||||
if (!IsPostBack)
|
||||
|
@ -178,14 +179,14 @@ namespace WebsitePanel.Portal
|
|||
if (!domain.IsDomainPointer && !domain.IsSubDomain && !domain.IsInstantAlias)
|
||||
domains.Add(domain);
|
||||
|
||||
DomainsList.DataSource = domains;
|
||||
DomainsList.DataBind();
|
||||
DomainName.DataSource = domains;
|
||||
DomainName.DataBind();
|
||||
}
|
||||
|
||||
private void BindResellerDomains()
|
||||
{
|
||||
DomainsList.DataSource = ES.Services.Servers.GetResellerDomains(PanelSecurity.PackageId);
|
||||
DomainsList.DataBind();
|
||||
DomainName.DataSource = ES.Services.Servers.GetResellerDomains(PanelSecurity.PackageId);
|
||||
DomainName.DataBind();
|
||||
}
|
||||
|
||||
private void AddDomain()
|
||||
|
@ -197,9 +198,7 @@ namespace WebsitePanel.Portal
|
|||
DomainType type = GetDomainType(Request["DomainType"]);
|
||||
|
||||
// get domain name
|
||||
string domainName = DomainName.Text.Trim();
|
||||
if (type == DomainType.SubDomain || type == DomainType.ProviderSubDomain)
|
||||
domainName = SubDomainName.Text.Trim() + "." + DomainsList.SelectedValue;
|
||||
var domainName = DomainName.Text;
|
||||
|
||||
int pointWebSiteId = 0;
|
||||
int pointMailDomainId = 0;
|
||||
|
@ -263,5 +262,13 @@ namespace WebsitePanel.Portal
|
|||
{
|
||||
AddDomain();
|
||||
}
|
||||
|
||||
protected void DomainName_TextChanged(object sender, DomainControl.DomainNameEventArgs e)
|
||||
{
|
||||
// If the choosen domain is a idn domain, don't allow to create mail
|
||||
var isIdn = Utils.IsIdnDomain(e.DomainName);
|
||||
PointMailDomainPanel.Enabled = !isIdn;
|
||||
PointMailDomain.Checked = !isIdn;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,31 +1,3 @@
|
|||
// Copyright (c) 2014, 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.
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
|
@ -74,70 +46,7 @@ namespace WebsitePanel.Portal {
|
|||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.TextBox DomainName;
|
||||
|
||||
/// <summary>
|
||||
/// DomainRequiredValidator control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.RequiredFieldValidator DomainRequiredValidator;
|
||||
|
||||
/// <summary>
|
||||
/// DomainFormatValidator control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.RegularExpressionValidator DomainFormatValidator;
|
||||
|
||||
/// <summary>
|
||||
/// SubDomainPanel control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.HtmlControls.HtmlGenericControl SubDomainPanel;
|
||||
|
||||
/// <summary>
|
||||
/// SubDomainName control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.TextBox SubDomainName;
|
||||
|
||||
/// <summary>
|
||||
/// DomainsList control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.DropDownList DomainsList;
|
||||
|
||||
/// <summary>
|
||||
/// SubDomainRequiredValidator control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.RequiredFieldValidator SubDomainRequiredValidator;
|
||||
|
||||
/// <summary>
|
||||
/// SubDomainFormatValidator control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.RegularExpressionValidator SubDomainFormatValidator;
|
||||
protected global::WebsitePanel.Portal.UserControls.DomainControl DomainName;
|
||||
|
||||
/// <summary>
|
||||
/// OptionsPanelHeader control.
|
||||
|
|
|
@ -30,6 +30,7 @@ using System;
|
|||
using System.Data;
|
||||
using System.Configuration;
|
||||
using System.Collections;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
|
@ -44,6 +45,12 @@ namespace WebsitePanel.Portal
|
|||
{
|
||||
public partial class DomainsSelectDomainControl : WebsitePanelControlBase
|
||||
{
|
||||
public bool HideIdnDomains
|
||||
{
|
||||
get { return (ViewState["HideIdnDomains"] != null) && (bool)ViewState["HideIdnDomains"]; }
|
||||
set { ViewState["HideIdnDomains"] = value; }
|
||||
}
|
||||
|
||||
public bool HideWebSites
|
||||
{
|
||||
get { return (ViewState["HideWebSites"] != null) ? (bool)ViewState["HideWebSites"] : false; }
|
||||
|
@ -116,6 +123,11 @@ namespace WebsitePanel.Portal
|
|||
{
|
||||
DomainInfo[] domains = ES.Services.Servers.GetMyDomains(PackageId);
|
||||
|
||||
if (HideIdnDomains)
|
||||
{
|
||||
domains = domains.Where(d => !Utils.IsIdnDomain(d.DomainName)).ToArray();
|
||||
}
|
||||
|
||||
WebSite[] sites = null;
|
||||
Hashtable htSites = new Hashtable();
|
||||
Hashtable htMailDomainPointers = new Hashtable();
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
using System;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Collections.Generic;
|
||||
|
||||
|
@ -40,7 +41,7 @@ namespace WebsitePanel.Portal.ExchangeServer
|
|||
{
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
DomainInfo[] domains = ES.Services.Servers.GetMyDomains(PanelSecurity.PackageId);
|
||||
DomainInfo[] domains = ES.Services.Servers.GetMyDomains(PanelSecurity.PackageId).Where(d => !Utils.IsIdnDomain(d.DomainName)).ToArray();
|
||||
|
||||
Organization[] orgs = ES.Services.Organizations.GetOrganizations(PanelSecurity.PackageId, false);
|
||||
|
||||
|
|
|
@ -59,7 +59,7 @@
|
|||
<asp:TemplateField>
|
||||
<ItemTemplate>
|
||||
<asp:ImageButton ID="imgDelDomain" runat="server" Text="Delete" SkinID="ExchangeDelete"
|
||||
CommandName="DeleteItem" CommandArgument='<%# Eval("DomainId") %>' Visible='<%# !((bool)Eval("IsHost") || (bool)Eval("IsDefault")) %>'
|
||||
CommandName="DeleteItem" CommandArgument='<%# Eval("DomainId") %>' Visible='<%# !((bool)Eval("IsDefault")) %>'
|
||||
meta:resourcekey="cmdDelete" OnClientClick="return confirm('Are you sure you want to delete selected domain?')"></asp:ImageButton>
|
||||
</ItemTemplate>
|
||||
</asp:TemplateField>
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
using System;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Collections.Generic;
|
||||
|
||||
|
@ -40,7 +41,7 @@ namespace WebsitePanel.Portal.ExchangeServer
|
|||
{
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
DomainInfo[] domains = ES.Services.Servers.GetMyDomains(PanelSecurity.PackageId);
|
||||
DomainInfo[] domains = ES.Services.Servers.GetMyDomains(PanelSecurity.PackageId).Where(d => !Utils.IsIdnDomain(d.DomainName)).ToArray();
|
||||
|
||||
Organization[] orgs = ES.Services.Organizations.GetOrganizations(PanelSecurity.PackageId, false);
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
using WebsitePanel.Providers.HostedSolution;
|
||||
|
||||
|
@ -37,7 +38,7 @@ namespace WebsitePanel.Portal.ExchangeServer
|
|||
{
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
DomainInfo[] domains = ES.Services.Servers.GetMyDomains(PanelSecurity.PackageId);
|
||||
DomainInfo[] domains = ES.Services.Servers.GetMyDomains(PanelSecurity.PackageId).Where(d => !Utils.IsIdnDomain(d.DomainName)).ToArray();
|
||||
Organization[] orgs = ES.Services.Organizations.GetOrganizations(PanelSecurity.PackageId, false);
|
||||
var list = new List<OrganizationDomainName>();
|
||||
SetPolicy(PanelSecurity.PackageId, UserSettings.EXCHANGE_POLICY, "OrgIdPolicy");
|
||||
|
|
|
@ -45,7 +45,7 @@
|
|||
<asp:TemplateField>
|
||||
<ItemTemplate>
|
||||
<asp:ImageButton ID="imgDelDomain" runat="server" Text="Delete" SkinID="ExchangeDelete"
|
||||
CommandName="DeleteItem" CommandArgument='<%# Eval("DomainId") %>' Visible='<%# !((bool)Eval("IsHost") || (bool)Eval("IsDefault")) %>'
|
||||
CommandName="DeleteItem" CommandArgument='<%# Eval("DomainId") %>' Visible='<%# !((bool)Eval("IsDefault")) %>'
|
||||
meta:resourcekey="cmdDelete" OnClientClick="return confirm('Are you sure you want to delete selected domain?')"></asp:ImageButton>
|
||||
</ItemTemplate>
|
||||
</asp:TemplateField>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<td class="SubHead" width="200" nowrap><asp:Label ID="lblDomainName" runat="server" meta:resourcekey="lblDomainName" Text="Domain name:"></asp:Label></td>
|
||||
<td width="100%">
|
||||
<uc1:DomainsSelectDomainControl ID="domainsSelectDomainControl" runat="server"
|
||||
HideMailDomains="true" HideDomainsSubDomains="false" HideInstantAlias="false" HideDomainPointers="true"/>
|
||||
HideMailDomains="true" HideDomainsSubDomains="false" HideInstantAlias="false" HideDomainPointers="true" HideIdnDomains="True"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<td id="EditEmailPanel" runat="server">
|
||||
<uc2:UsernameControl ID="txtName" runat="server" width="120px" />
|
||||
@
|
||||
<dnc:SelectDomain id="domainsSelectDomainControl" runat="server" HideDomainPointers="true" HideInstantAlias="false" HideMailDomainPointers="true"></dnc:SelectDomain>
|
||||
<dnc:SelectDomain id="domainsSelectDomainControl" runat="server" HideDomainPointers="true" HideInstantAlias="false" HideMailDomainPointers="true" HideIdnDomains="True"></dnc:SelectDomain>
|
||||
</td>
|
||||
<td id="DisplayEmailPanel" runat="server">
|
||||
<asp:Label ID="litName" Runat="server" Visible="False" CssClass="Huge"></asp:Label>
|
||||
|
|
|
@ -79,6 +79,15 @@ namespace WebsitePanel.Portal.ScheduleTaskControls.App_LocalResources {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Pause between queries (ms):.
|
||||
/// </summary>
|
||||
internal static string lblPause {
|
||||
get {
|
||||
return ResourceManager.GetString("lblPause", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Server Name:.
|
||||
/// </summary>
|
||||
|
|
|
@ -123,6 +123,9 @@
|
|||
<data name="lblDnsServersHint" xml:space="preserve">
|
||||
<value>Please enter dns servers to check.</value>
|
||||
</data>
|
||||
<data name="lblPause" xml:space="preserve">
|
||||
<value>Pause between queries (ms):</value>
|
||||
</data>
|
||||
<data name="lblServerName" xml:space="preserve">
|
||||
<value>Server Name:</value>
|
||||
</data>
|
||||
|
|
|
@ -25,4 +25,12 @@
|
|||
<asp:TextBox ID="txtMailTo" runat="server" Width="95%" CssClass="NormalTextBox" MaxLength="1000"></asp:TextBox>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="SubHead" nowrap>
|
||||
<asp:Label ID="lblPause" runat="server" meta:resourcekey="lblPause" Text="Pause between queries (ms):"></asp:Label>
|
||||
</td>
|
||||
<td class="Normal" width="100%">
|
||||
<asp:TextBox ID="txtPause" runat="server" Width="95%" CssClass="NormalTextBox" MaxLength="1000"></asp:TextBox>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -14,6 +14,7 @@ namespace WebsitePanel.Portal.ScheduleTaskControls
|
|||
private static readonly string DnsServersParameter = "DNS_SERVERS";
|
||||
private static readonly string MailToParameter = "MAIL_TO";
|
||||
private static readonly string ServerNameParameter = "SERVER_NAME";
|
||||
private static readonly string PauseBetweenQueriesParameter = "PAUSE_BETWEEN_QUERIES";
|
||||
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
|
@ -30,6 +31,7 @@ namespace WebsitePanel.Portal.ScheduleTaskControls
|
|||
|
||||
this.SetParameter(this.txtDnsServers, DnsServersParameter);
|
||||
this.SetParameter(this.txtMailTo, MailToParameter);
|
||||
this.SetParameter(this.txtPause, PauseBetweenQueriesParameter);
|
||||
this.SetParameter(this.ddlServers, ServerNameParameter);
|
||||
|
||||
var servers = ES.Services.Servers.GetAllServers();
|
||||
|
@ -68,8 +70,9 @@ namespace WebsitePanel.Portal.ScheduleTaskControls
|
|||
ScheduleTaskParameterInfo dnsServers = this.GetParameter(this.txtDnsServers, DnsServersParameter);
|
||||
ScheduleTaskParameterInfo mailTo = this.GetParameter(this.txtMailTo, MailToParameter);
|
||||
ScheduleTaskParameterInfo serverName = this.GetParameter(this.ddlServers, ServerNameParameter);
|
||||
ScheduleTaskParameterInfo pause = this.GetParameter(this.txtPause, PauseBetweenQueriesParameter);
|
||||
|
||||
return new ScheduleTaskParameterInfo[3] { dnsServers, mailTo, serverName };
|
||||
return new ScheduleTaskParameterInfo[4] { dnsServers, mailTo, serverName, pause };
|
||||
}
|
||||
}
|
||||
}
|
|
@ -65,5 +65,23 @@ namespace WebsitePanel.Portal.ScheduleTaskControls {
|
|||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.TextBox txtMailTo;
|
||||
|
||||
/// <summary>
|
||||
/// lblPause control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.Label lblPause;
|
||||
|
||||
/// <summary>
|
||||
/// txtPause control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.TextBox txtPause;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,138 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="DomainFormatValidator.ErrorMessage" xml:space="preserve">
|
||||
<value>Please, enter correct domain name, for example "mydomain.com" or "sub.mydomain.com".</value>
|
||||
</data>
|
||||
<data name="DomainFormatValidator.Text" xml:space="preserve">
|
||||
<value>*</value>
|
||||
</data>
|
||||
<data name="DomainRequiredValidator.ErrorMessage" xml:space="preserve">
|
||||
<value>Please enter domain name</value>
|
||||
</data>
|
||||
<data name="DomainRequiredValidator.Text" xml:space="preserve">
|
||||
<value>*</value>
|
||||
</data>
|
||||
<data name="SubDomainRequiredValidator.ErrorMessage" xml:space="preserve">
|
||||
<value>Please enter sub-domain name</value>
|
||||
</data>
|
||||
<data name="SubDomainRequiredValidator.Text" xml:space="preserve">
|
||||
<value>*</value>
|
||||
</data>
|
||||
</root>
|
|
@ -0,0 +1,10 @@
|
|||
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DomainControl.ascx.cs" Inherits="WebsitePanel.Portal.UserControls.DomainControl" %>
|
||||
|
||||
<asp:TextBox ID="txtDomainName" runat="server" Width="300" CssClass="HugeTextBox" OnTextChanged="txtDomainName_TextChanged"></asp:TextBox>
|
||||
<asp:Literal runat="server" ID="SubDomainSeparator" Visible="False">.</asp:Literal>
|
||||
<asp:DropDownList ID="DomainsList" Runat="server" CssClass="NormalTextBox" DataTextField="DomainName" DataValueField="DomainName" Visible="False"></asp:DropDownList>
|
||||
<asp:RequiredFieldValidator id="DomainRequiredValidator" runat="server" meta:resourcekey="DomainRequiredValidator"
|
||||
ControlToValidate="txtDomainName" Display="Dynamic" SetFocusOnError="true"></asp:RequiredFieldValidator>
|
||||
<asp:CustomValidator id="DomainFormatValidator" runat="server" meta:resourcekey="DomainFormatValidator" EnableClientScript="False" ValidateEmptyText="False"
|
||||
ControlToValidate="txtDomainName" Display="Dynamic" SetFocusOnError="true" OnServerValidate="DomainFormatValidator_ServerValidate"></asp:CustomValidator>
|
||||
|
|
@ -0,0 +1,134 @@
|
|||
// Copyright (c) 2014, 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.Text.RegularExpressions;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Globalization;
|
||||
|
||||
namespace WebsitePanel.Portal.UserControls
|
||||
{
|
||||
public partial class DomainControl : WebsitePanelControlBase
|
||||
{
|
||||
public class DomainNameEventArgs : EventArgs
|
||||
{
|
||||
public string DomainName { get; set; }
|
||||
}
|
||||
|
||||
public event EventHandler<DomainNameEventArgs> TextChanged;
|
||||
|
||||
public virtual void OnTextChanged()
|
||||
{
|
||||
var handler = TextChanged;
|
||||
if (handler != null) handler(this, new DomainNameEventArgs {DomainName = Text});
|
||||
}
|
||||
|
||||
public object DataSource
|
||||
{
|
||||
set { DomainsList.DataSource = value; }
|
||||
}
|
||||
|
||||
public bool AutoPostBack
|
||||
{
|
||||
get { return txtDomainName.AutoPostBack; }
|
||||
set { txtDomainName.AutoPostBack = value; }
|
||||
}
|
||||
|
||||
public Unit Width
|
||||
{
|
||||
get { return txtDomainName.Width; }
|
||||
set { txtDomainName.Width = value; }
|
||||
}
|
||||
|
||||
public bool RequiredEnabled
|
||||
{
|
||||
get { return DomainRequiredValidator.Enabled; }
|
||||
set { DomainRequiredValidator.Enabled = value; }
|
||||
}
|
||||
|
||||
public string Text
|
||||
{
|
||||
get
|
||||
{
|
||||
var domainName = txtDomainName.Text.Trim();
|
||||
if (IsSubDomain)
|
||||
{
|
||||
domainName += "." + DomainsList.SelectedValue;
|
||||
}
|
||||
return domainName;
|
||||
}
|
||||
set { txtDomainName.Text = value; }
|
||||
}
|
||||
|
||||
public string ValidationGroup
|
||||
{
|
||||
get { return DomainRequiredValidator.ValidationGroup; }
|
||||
set { DomainRequiredValidator.ValidationGroup = value; DomainFormatValidator.ValidationGroup = value; }
|
||||
}
|
||||
|
||||
public bool IsSubDomain {
|
||||
get { return SubDomainSeparator.Visible; }
|
||||
set
|
||||
{
|
||||
SubDomainSeparator.Visible = value;
|
||||
DomainsList.Visible = value;
|
||||
DomainRequiredValidator.Enabled = !value;
|
||||
}
|
||||
}
|
||||
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
}
|
||||
|
||||
protected new void DataBind()
|
||||
{
|
||||
DomainsList.DataBind();
|
||||
}
|
||||
|
||||
protected void DomainFormatValidator_ServerValidate(object source, ServerValidateEventArgs args)
|
||||
{
|
||||
var idn = new IdnMapping();
|
||||
try
|
||||
{
|
||||
var ascii = idn.GetAscii(Text);
|
||||
var regex = new Regex(@"^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.){1,10}[a-zA-Z]{2,15}$");
|
||||
args.IsValid = regex.IsMatch(ascii);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
args.IsValid = false;
|
||||
}
|
||||
}
|
||||
|
||||
protected void txtDomainName_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
OnTextChanged();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace WebsitePanel.Portal.UserControls {
|
||||
|
||||
|
||||
public partial class DomainControl {
|
||||
|
||||
/// <summary>
|
||||
/// txtDomainName control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.TextBox txtDomainName;
|
||||
|
||||
/// <summary>
|
||||
/// SubDomainSeparator control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.Literal SubDomainSeparator;
|
||||
|
||||
/// <summary>
|
||||
/// DomainsList control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.DropDownList DomainsList;
|
||||
|
||||
/// <summary>
|
||||
/// DomainRequiredValidator control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.RequiredFieldValidator DomainRequiredValidator;
|
||||
|
||||
/// <summary>
|
||||
/// DomainFormatValidator control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.CustomValidator DomainFormatValidator;
|
||||
}
|
||||
}
|
|
@ -1,12 +1,11 @@
|
|||
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UserCreateSpace.ascx.cs" Inherits="WebsitePanel.Portal.UserCreateSpace" %>
|
||||
<%@ Register TagPrefix="wsp" TagName="CollapsiblePanel" Src="UserControls/CollapsiblePanel.ascx" %>
|
||||
<%@ Register Src="UserControls/UsernameControl.ascx" TagName="UsernameControl" TagPrefix="uc4" %>
|
||||
<%@ Register Src="DomainsSelectDomainControl.ascx" TagName="DomainsSelectDomainControl" TagPrefix="uc1" %>
|
||||
<%@ Register Src="UserControls/DomainControl.ascx" TagName="DomainControl" TagPrefix="wsp" %>
|
||||
<%@ Register Src="UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %>
|
||||
|
||||
<wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/>
|
||||
|
||||
<asp:ValidationSummary ID="summary" runat="server" ShowMessageBox="true" ShowSummary="false" ValidationGroup="CreateSpace" />
|
||||
<asp:ValidationSummary ID="summary" runat="server" ShowMessageBox="true" ShowSummary="true" ValidationGroup="CreateSpace" />
|
||||
|
||||
<asp:UpdatePanel runat="server" ID="updatePanelSpace" UpdateMode="Conditional" ChildrenAsTriggers="true">
|
||||
<ContentTemplate>
|
||||
|
@ -74,12 +73,7 @@
|
|||
<asp:Localize ID="locDomainName" runat="server" meta:resourcekey="locDomainName" Text="Domain name:"></asp:Localize>
|
||||
</td>
|
||||
<td class="Normal" width="100%">
|
||||
<asp:TextBox ID="txtDomainName" runat="server" CssClass="NormalTextBox" Width="250px"></asp:TextBox>
|
||||
<asp:RequiredFieldValidator id="DomainRequiredValidator" runat="server" meta:resourcekey="DomainRequiredValidator"
|
||||
ControlToValidate="txtDomainName" Display="Dynamic" ValidationGroup="CreateSpace" SetFocusOnError="true"></asp:RequiredFieldValidator>
|
||||
<asp:RegularExpressionValidator id="DomainFormatValidator" runat="server" meta:resourcekey="DomainFormatValidator"
|
||||
ControlToValidate="txtDomainName" Display="Dynamic" ValidationGroup="CreateSpace" SetFocusOnError="true"
|
||||
ValidationExpression="^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.){1,10}[a-zA-Z]{2,15}$"></asp:RegularExpressionValidator>
|
||||
<wsp:DomainControl ID="txtDomainName" runat="server" RequiredEnabled="True" ValidationGroup="CreateSpace" AutoPostBack="True" OnTextChanged="txtDomainName_OnTextChanged"></wsp:DomainControl>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -31,6 +31,7 @@ using System.Collections.Generic;
|
|||
using System.Linq;
|
||||
using System.Web.UI.WebControls;
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
using WebsitePanel.Portal.UserControls;
|
||||
using WebsitePanel.Providers.HostedSolution;
|
||||
|
||||
namespace WebsitePanel.Portal
|
||||
|
@ -266,5 +267,20 @@ namespace WebsitePanel.Portal
|
|||
{
|
||||
BindHostingPlan();
|
||||
}
|
||||
|
||||
protected void txtDomainName_OnTextChanged(object sender, DomainControl.DomainNameEventArgs e)
|
||||
{
|
||||
if (Utils.IsIdnDomain(txtDomainName.Text))
|
||||
{
|
||||
fsMail.Disabled = true;
|
||||
chkIntegratedOUProvisioning.Checked = false;
|
||||
chkIntegratedOUProvisioning.Enabled = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
fsMail.Disabled = false;
|
||||
BindHostingPlan();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -163,25 +163,7 @@ namespace WebsitePanel.Portal {
|
|||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.TextBox txtDomainName;
|
||||
|
||||
/// <summary>
|
||||
/// DomainRequiredValidator control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.RequiredFieldValidator DomainRequiredValidator;
|
||||
|
||||
/// <summary>
|
||||
/// DomainFormatValidator control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.RegularExpressionValidator DomainFormatValidator;
|
||||
protected global::WebsitePanel.Portal.UserControls.DomainControl txtDomainName;
|
||||
|
||||
/// <summary>
|
||||
/// fsWeb control.
|
||||
|
|
|
@ -185,6 +185,9 @@ namespace WebsitePanel.Portal
|
|||
|
||||
private void BindControls()
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
// hide database server parameters
|
||||
DeploymentParameterWellKnownTag hiddenTags =
|
||||
DeploymentParameterWellKnownTag.IisApp |
|
||||
|
@ -238,21 +241,22 @@ namespace WebsitePanel.Portal
|
|||
{
|
||||
// Text value
|
||||
TextControl.Visible = true;
|
||||
textValue.Text = DefaultValue;
|
||||
valPrefix.Text = ValuePrefix;
|
||||
valSuffix.Text = ValueSuffix;
|
||||
textValue.Text = DefaultValue == null ? "" : DefaultValue;
|
||||
valPrefix.Text = ValuePrefix == null ? "" : ValuePrefix;
|
||||
valSuffix.Text = ValueSuffix == null ? "" : ValueSuffix;
|
||||
|
||||
if (
|
||||
(WellKnownTags & DeploymentParameterWellKnownTag.MySql) == DeploymentParameterWellKnownTag.MySql
|
||||
(ValuePrefix != null) && (ValueSuffix != null)
|
||||
&&
|
||||
(WellKnownTags & DeploymentParameterWellKnownTag.DBUserName) == DeploymentParameterWellKnownTag.DBUserName
|
||||
((WellKnownTags & DeploymentParameterWellKnownTag.MySql) == DeploymentParameterWellKnownTag.MySql)
|
||||
&&
|
||||
((WellKnownTags & DeploymentParameterWellKnownTag.DBUserName) == DeploymentParameterWellKnownTag.DBUserName)
|
||||
)
|
||||
{
|
||||
MysqlUsernameLengthValidator.Enabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// enforce validation for database parameters if they are allowed empty by app pack developers
|
||||
bool isDatabaseParameter = (WellKnownTags & (
|
||||
DeploymentParameterWellKnownTag.DBName |
|
||||
|
@ -284,6 +288,9 @@ namespace WebsitePanel.Portal
|
|||
String.Format(GetLocalizedString("RegexpValidator.Text"), FriendlyName, ValidationString);
|
||||
|
||||
|
||||
}
|
||||
catch { } // just skip
|
||||
|
||||
}
|
||||
|
||||
protected void mysqlUsernameLen_OnServerValidate(object source, ServerValidateEventArgs args)
|
||||
|
|
|
@ -773,6 +773,13 @@
|
|||
<Compile Include="SkinControls\SpaceOrganizationsSelector.ascx.designer.cs">
|
||||
<DependentUpon>SpaceOrganizationsSelector.ascx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="UserControls\DomainControl.ascx.cs">
|
||||
<DependentUpon>DomainControl.ascx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="UserControls\DomainControl.ascx.designer.cs">
|
||||
<DependentUpon>DomainControl.ascx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="UserControls\DomainListControlBase.cs">
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
|
@ -4379,6 +4386,7 @@
|
|||
<Content Include="SettingsLyncUserPlansPolicy.ascx" />
|
||||
<Content Include="SkinControls\SpaceOrganizationsSelector.ascx" />
|
||||
<Content Include="SettingsExchangeRetentionPolicyTag.ascx" />
|
||||
<Content Include="UserControls\DomainControl.ascx" />
|
||||
<Content Include="UserControls\EditFeedsList.ascx" />
|
||||
<Content Include="UserControls\OrgIdPolicyEditor.ascx" />
|
||||
<Content Include="UserControls\OrgPolicyEditor.ascx" />
|
||||
|
@ -5626,6 +5634,7 @@
|
|||
<Content Include="RDS\UserControls\App_LocalResources\RDSCollectionServers.ascx.resx" />
|
||||
<Content Include="RDS\UserControls\App_LocalResources\RDSCollectionApps.ascx.resx" />
|
||||
<Content Include="ProviderControls\App_LocalResources\RDS_Settings.ascx.resx" />
|
||||
<Content Include="UserControls\App_LocalResources\DomainControl.ascx.resx" />
|
||||
<EmbeddedResource Include="UserControls\App_LocalResources\EditDomainsList.ascx.resx">
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue