merge commit

This commit is contained in:
robvde 2014-11-27 09:19:02 +08:00
commit c29f565c0b
50 changed files with 1307 additions and 822 deletions

View file

@ -6074,15 +6074,84 @@ GO
-- wsp-10269: Changed php extension path in default properties for IIS70 and IIS80 provider -- wsp-10269: Changed php extension path in default properties for IIS70 and IIS80 provider
update ServiceDefaultProperties update ServiceDefaultProperties
set PhpPath='%PROGRAMFILES(x86)%\PHP\php-cgi.exe' set PropertyValue='%PROGRAMFILES(x86)%\PHP\php-cgi.exe'
where ProviderId in(101, 105) where PropertyName='PhpPath' and ProviderId in(101, 105)
update ServiceDefaultProperties update ServiceDefaultProperties
set Php4Path='%PROGRAMFILES(x86)%\PHP\ph.exe' set PropertyValue='%PROGRAMFILES(x86)%\PHP\php.exe'
where ProviderId in(101, 105) where PropertyName='Php4Path' and ProviderId in(101, 105)
GO GO
-- Exchange2013 Shared and resource mailboxes
-- Exchange2013 Shared and resource mailboxes Quotas
IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'Exchange2013.SharedMailboxes')
BEGIN
INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota])
VALUES (429, 12, 30, N'Exchange2013.SharedMailboxes', N'Shared Mailboxes per Organization', 2, 0, NULL, NULL)
END
GO
IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'Exchange2013.ResourceMailboxes')
BEGIN
INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota])
VALUES (428, 12, 31, N'Exchange2013.ResourceMailboxes', N'Resource Mailboxes per Organization', 2, 0, NULL, NULL)
END
GO
-- Exchange2013 Shared and resource mailboxes Organization statistics
ALTER PROCEDURE [dbo].[GetExchangeOrganizationStatistics]
(
@ItemID int
)
AS
DECLARE @ARCHIVESIZE INT
IF -1 in (SELECT B.ArchiveSizeMB FROM ExchangeAccounts AS A INNER JOIN ExchangeMailboxPlans AS B ON A.MailboxPlanId = B.MailboxPlanId WHERE A.ItemID=@ItemID)
BEGIN
SET @ARCHIVESIZE = -1
END
ELSE
BEGIN
SET @ARCHIVESIZE = (SELECT SUM(B.ArchiveSizeMB) FROM ExchangeAccounts AS A INNER JOIN ExchangeMailboxPlans AS B ON A.MailboxPlanId = B.MailboxPlanId WHERE A.ItemID=@ItemID)
END
IF -1 IN (SELECT B.MailboxSizeMB FROM ExchangeAccounts AS A INNER JOIN ExchangeMailboxPlans AS B ON A.MailboxPlanId = B.MailboxPlanId WHERE A.ItemID=@ItemID)
BEGIN
SELECT
(SELECT COUNT(*) FROM ExchangeAccounts WHERE (AccountType = 1 OR AccountType = 5 OR AccountType = 6) AND ItemID = @ItemID) AS CreatedMailboxes,
(SELECT COUNT(*) FROM ExchangeAccounts WHERE (AccountType = 10) AND ItemID = @ItemID) AS CreatedSharedMailboxes,
(SELECT COUNT(*) FROM ExchangeAccounts WHERE (AccountType = 11) AND ItemID = @ItemID) AS CreatedResourceMailboxes,
(SELECT COUNT(*) FROM ExchangeAccounts WHERE AccountType = 2 AND ItemID = @ItemID) AS CreatedContacts,
(SELECT COUNT(*) FROM ExchangeAccounts WHERE AccountType = 3 AND ItemID = @ItemID) AS CreatedDistributionLists,
(SELECT COUNT(*) FROM ExchangeAccounts WHERE AccountType = 4 AND ItemID = @ItemID) AS CreatedPublicFolders,
(SELECT COUNT(*) FROM ExchangeOrganizationDomains WHERE ItemID = @ItemID) AS CreatedDomains,
(SELECT MIN(B.MailboxSizeMB) FROM ExchangeAccounts AS A INNER JOIN ExchangeMailboxPlans AS B ON A.MailboxPlanId = B.MailboxPlanId WHERE A.ItemID=@ItemID) AS UsedDiskSpace,
(SELECT MIN(B.RecoverableItemsSpace) FROM ExchangeAccounts AS A INNER JOIN ExchangeMailboxPlans AS B ON A.MailboxPlanId = B.MailboxPlanId WHERE A.ItemID=@ItemID) AS UsedLitigationHoldSpace,
@ARCHIVESIZE AS UsedArchingStorage
END
ELSE
BEGIN
SELECT
(SELECT COUNT(*) FROM ExchangeAccounts WHERE (AccountType = 1 OR AccountType = 5 OR AccountType = 6) AND ItemID = @ItemID) AS CreatedMailboxes,
(SELECT COUNT(*) FROM ExchangeAccounts WHERE (AccountType = 10) AND ItemID = @ItemID) AS CreatedSharedMailboxes,
(SELECT COUNT(*) FROM ExchangeAccounts WHERE (AccountType = 11) AND ItemID = @ItemID) AS CreatedResourceMailboxes,
(SELECT COUNT(*) FROM ExchangeAccounts WHERE AccountType = 2 AND ItemID = @ItemID) AS CreatedContacts,
(SELECT COUNT(*) FROM ExchangeAccounts WHERE AccountType = 3 AND ItemID = @ItemID) AS CreatedDistributionLists,
(SELECT COUNT(*) FROM ExchangeAccounts WHERE AccountType = 4 AND ItemID = @ItemID) AS CreatedPublicFolders,
(SELECT COUNT(*) FROM ExchangeOrganizationDomains WHERE ItemID = @ItemID) AS CreatedDomains,
(SELECT SUM(B.MailboxSizeMB) FROM ExchangeAccounts AS A INNER JOIN ExchangeMailboxPlans AS B ON A.MailboxPlanId = B.MailboxPlanId WHERE A.ItemID=@ItemID) AS UsedDiskSpace,
(SELECT SUM(B.RecoverableItemsSpace) FROM ExchangeAccounts AS A INNER JOIN ExchangeMailboxPlans AS B ON A.MailboxPlanId = B.MailboxPlanId WHERE A.ItemID=@ItemID) AS UsedLitigationHoldSpace,
@ARCHIVESIZE AS UsedArchingStorage
END
RETURN
GO
-- Hyper-V 2012 R2 -- Hyper-V 2012 R2
IF NOT EXISTS (SELECT * FROM [dbo].[Providers] WHERE [ProviderName] = 'Microsoft Hyper-V 2012 R2') IF NOT EXISTS (SELECT * FROM [dbo].[Providers] WHERE [ProviderName] = 'Microsoft Hyper-V 2012 R2')
BEGIN BEGIN

View file

@ -123,6 +123,9 @@ order by rg.groupOrder
public const string EXCHANGE2013_ARCHIVINGSTORAGE = "Exchange2013.ArchivingStorage"; // Archiving public const string EXCHANGE2013_ARCHIVINGSTORAGE = "Exchange2013.ArchivingStorage"; // Archiving
public const string EXCHANGE2013_ARCHIVINGMAILBOXES = "Exchange2013.ArchivingMailboxes"; public const string EXCHANGE2013_ARCHIVINGMAILBOXES = "Exchange2013.ArchivingMailboxes";
public const string EXCHANGE2013_SHAREDMAILBOXES = "Exchange2013.SharedMailboxes"; // Shared and resource mailboxes
public const string EXCHANGE2013_RESOURCEMAILBOXES = "Exchange2013.ResourceMailboxes";
public const string MSSQL2000_DATABASES = "MsSQL2000.Databases"; // Databases public const string MSSQL2000_DATABASES = "MsSQL2000.Databases"; // Databases
public const string MSSQL2000_USERS = "MsSQL2000.Users"; // Users public const string MSSQL2000_USERS = "MsSQL2000.Users"; // Users
public const string MSSQL2000_MAXDATABASESIZE = "MsSQL2000.MaxDatabaseSize"; // Max Database Size public const string MSSQL2000_MAXDATABASESIZE = "MsSQL2000.MaxDatabaseSize"; // Max Database Size

View file

@ -193,6 +193,9 @@ namespace WebsitePanel.EnterpriseServer
stats.UsedDiskSpace = tempStats.UsedDiskSpace; stats.UsedDiskSpace = tempStats.UsedDiskSpace;
stats.UsedLitigationHoldSpace = tempStats.UsedLitigationHoldSpace; stats.UsedLitigationHoldSpace = tempStats.UsedLitigationHoldSpace;
stats.UsedArchingStorage = tempStats.UsedArchingStorage; stats.UsedArchingStorage = tempStats.UsedArchingStorage;
stats.CreatedSharedMailboxes = tempStats.CreatedSharedMailboxes;
stats.CreatedResourceMailboxes = tempStats.CreatedResourceMailboxes;
} }
else else
{ {
@ -221,6 +224,9 @@ namespace WebsitePanel.EnterpriseServer
stats.UsedDiskSpace += tempStats.UsedDiskSpace; stats.UsedDiskSpace += tempStats.UsedDiskSpace;
stats.UsedLitigationHoldSpace += tempStats.UsedLitigationHoldSpace; stats.UsedLitigationHoldSpace += tempStats.UsedLitigationHoldSpace;
stats.UsedArchingStorage += tempStats.UsedArchingStorage; stats.UsedArchingStorage += tempStats.UsedArchingStorage;
stats.CreatedSharedMailboxes += tempStats.CreatedSharedMailboxes;
stats.CreatedResourceMailboxes += tempStats.CreatedResourceMailboxes;
} }
} }
} }
@ -241,6 +247,9 @@ namespace WebsitePanel.EnterpriseServer
stats.AllocatedLitigationHoldSpace = cntx.Quotas[Quotas.EXCHANGE2007_RECOVERABLEITEMSSPACE].QuotaAllocatedValue; stats.AllocatedLitigationHoldSpace = cntx.Quotas[Quotas.EXCHANGE2007_RECOVERABLEITEMSSPACE].QuotaAllocatedValue;
stats.AllocatedArchingStorage = cntx.Quotas[Quotas.EXCHANGE2013_ARCHIVINGSTORAGE].QuotaAllocatedValue; stats.AllocatedArchingStorage = cntx.Quotas[Quotas.EXCHANGE2013_ARCHIVINGSTORAGE].QuotaAllocatedValue;
stats.AllocatedSharedMailboxes = cntx.Quotas[Quotas.EXCHANGE2013_SHAREDMAILBOXES].QuotaAllocatedValue;
stats.AllocatedResourceMailboxes = cntx.Quotas[Quotas.EXCHANGE2013_RESOURCEMAILBOXES].QuotaAllocatedValue;
return stats; return stats;
} }
catch (Exception ex) catch (Exception ex)
@ -1665,8 +1674,21 @@ namespace WebsitePanel.EnterpriseServer
// check mailbox quota // check mailbox quota
OrganizationStatistics orgStats = GetOrganizationStatistics(itemId); OrganizationStatistics orgStats = GetOrganizationStatistics(itemId);
if ((orgStats.AllocatedMailboxes > -1) && (orgStats.CreatedMailboxes >= orgStats.AllocatedMailboxes)) if (accountType == ExchangeAccountType.SharedMailbox)
return BusinessErrorCodes.ERROR_EXCHANGE_MAILBOXES_QUOTA_LIMIT; {
if ((orgStats.AllocatedSharedMailboxes > -1) && (orgStats.CreatedSharedMailboxes >= orgStats.AllocatedSharedMailboxes))
return BusinessErrorCodes.ERROR_EXCHANGE_MAILBOXES_QUOTA_LIMIT;
}
else if (accountType == ExchangeAccountType.ResourceMailbox)
{
if ((orgStats.AllocatedResourceMailboxes > -1) && (orgStats.CreatedResourceMailboxes >= orgStats.AllocatedResourceMailboxes))
return BusinessErrorCodes.ERROR_EXCHANGE_MAILBOXES_QUOTA_LIMIT;
}
else
{
if ((orgStats.AllocatedMailboxes > -1) && (orgStats.CreatedMailboxes >= orgStats.AllocatedMailboxes))
return BusinessErrorCodes.ERROR_EXCHANGE_MAILBOXES_QUOTA_LIMIT;
}
// place log record // place log record

View file

@ -39,7 +39,8 @@ namespace WebsitePanel.Providers.HostedSolution
Equipment = 6, Equipment = 6,
User = 7, User = 7,
SecurityGroup = 8, SecurityGroup = 8,
DefaultSecurityGroup = 9 DefaultSecurityGroup = 9,
SharedMailbox = 10,
ResourceMailbox = 11
} }
} }

View file

@ -341,6 +341,36 @@ namespace WebsitePanel.Providers.HostedSolution
get { return usedArchingStorage; } get { return usedArchingStorage; }
set { usedArchingStorage = value; } set { usedArchingStorage = value; }
} }
int allocatedSharedMailboxes;
public int AllocatedSharedMailboxes
{
get { return allocatedSharedMailboxes; }
set { allocatedSharedMailboxes = value; }
}
int createdSharedMailboxes;
public int CreatedSharedMailboxes
{
get { return createdSharedMailboxes; }
set { createdSharedMailboxes = value; }
}
int allocatedResourceMailboxes;
public int AllocatedResourceMailboxes
{
get { return allocatedResourceMailboxes; }
set { allocatedResourceMailboxes = value; }
}
int createdResourceMailboxes;
public int CreatedResourceMailboxes
{
get { return createdResourceMailboxes; }
set { createdResourceMailboxes = value; }
}
} }
} }

View file

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WebsitePanel.Providers.RemoteDesktopServices
{
public enum RdsPolicyTypes
{
RdCap,
RdRap
}
}

View file

@ -125,6 +125,7 @@
<Compile Include="RemoteDesktopServices\IRemoteDesktopServices.cs" /> <Compile Include="RemoteDesktopServices\IRemoteDesktopServices.cs" />
<Compile Include="RemoteDesktopServices\RdsCollection.cs" /> <Compile Include="RemoteDesktopServices\RdsCollection.cs" />
<Compile Include="RemoteDesktopServices\RdsCollectionPaged.cs" /> <Compile Include="RemoteDesktopServices\RdsCollectionPaged.cs" />
<Compile Include="RemoteDesktopServices\RdsPolicyTypes.cs" />
<Compile Include="RemoteDesktopServices\RdsServer.cs" /> <Compile Include="RemoteDesktopServices\RdsServer.cs" />
<Compile Include="RemoteDesktopServices\RdsServersPaged.cs" /> <Compile Include="RemoteDesktopServices\RdsServersPaged.cs" />
<Compile Include="RemoteDesktopServices\RemoteApplication.cs" /> <Compile Include="RemoteDesktopServices\RemoteApplication.cs" />

View file

@ -1942,6 +1942,11 @@ namespace WebsitePanel.Providers.HostedSolution
cmd.Parameters.Add("Equipment"); cmd.Parameters.Add("Equipment");
else if (accountType == ExchangeAccountType.Room) else if (accountType == ExchangeAccountType.Room)
cmd.Parameters.Add("Room"); cmd.Parameters.Add("Room");
else if (accountType == ExchangeAccountType.SharedMailbox)
cmd.Parameters.Add("Shared");
else if (accountType == ExchangeAccountType.ResourceMailbox)
cmd.Parameters.Add("Equipment");
result = ExecuteShellCommand(runSpace, cmd); result = ExecuteShellCommand(runSpace, cmd);
@ -4790,6 +4795,10 @@ namespace WebsitePanel.Providers.HostedSolution
} }
CheckOrganizationRootPublicFolderPermission(runSpace, organizationId); CheckOrganizationRootPublicFolderPermission(runSpace, organizationId);
// exchange transport needs access to create new items in order to deliver email
AddPublicFolderClientPermission(runSpace, folder, "Anonymous", "CreateItems");
} }
finally finally
{ {

View file

@ -369,6 +369,10 @@ namespace WebsitePanel.Providers.HostedSolution
cmd.Parameters.Add("Equipment"); cmd.Parameters.Add("Equipment");
else if (accountType == ExchangeAccountType.Room) else if (accountType == ExchangeAccountType.Room)
cmd.Parameters.Add("Room"); cmd.Parameters.Add("Room");
else if (accountType == ExchangeAccountType.SharedMailbox)
cmd.Parameters.Add("Shared");
else if (accountType == ExchangeAccountType.ResourceMailbox)
cmd.Parameters.Add("Equipment");
result = ExecuteShellCommand(runSpace, cmd); result = ExecuteShellCommand(runSpace, cmd);

View file

@ -194,19 +194,22 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
ActiveDirectoryUtils.CreateGroup(orgPath, GetUsersGroupName(collection.Name)); ActiveDirectoryUtils.CreateGroup(orgPath, GetUsersGroupName(collection.Name));
} }
var capPolicyName = GetPolicyName(organizationId, collection.Name, RdsPolicyTypes.RdCap);
var rapPolicyName = GetPolicyName(organizationId, collection.Name, RdsPolicyTypes.RdRap);
foreach (var gateway in Gateways) foreach (var gateway in Gateways)
{ {
if (!CentralNps) if (!CentralNps)
{ {
CreateRdCapForce(runSpace, gateway, collection.Name, new List<string> { GetUsersGroupName(collection.Name) }); CreateRdCapForce(runSpace, gateway, capPolicyName, collection.Name, new List<string> { GetUsersGroupName(collection.Name) });
} }
CreateRdRapForce(runSpace, gateway, collection.Name, new List<string> { GetUsersGroupName(collection.Name) }); CreateRdRapForce(runSpace, gateway, rapPolicyName, collection.Name, new List<string> { GetUsersGroupName(collection.Name) });
} }
if (CentralNps) if (CentralNps)
{ {
CreateCentralNpsPolicy(runSpace, CentralNpsHost, collection.Name, organizationId); CreateCentralNpsPolicy(runSpace, CentralNpsHost, capPolicyName, collection.Name, organizationId);
} }
//add user group to collection //add user group to collection
@ -278,19 +281,22 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
ExecuteShellCommand(runSpace, cmd, false); ExecuteShellCommand(runSpace, cmd, false);
var capPolicyName = GetPolicyName(organizationId, collectionName, RdsPolicyTypes.RdCap);
var rapPolicyName = GetPolicyName(organizationId, collectionName, RdsPolicyTypes.RdRap);
foreach (var gateway in Gateways) foreach (var gateway in Gateways)
{ {
if (!CentralNps) if (!CentralNps)
{ {
RemoveRdCap(runSpace, gateway, collectionName); RemoveRdCap(runSpace, gateway, capPolicyName);
} }
RemoveRdRap(runSpace, gateway, collectionName); RemoveRdRap(runSpace, gateway, rapPolicyName);
} }
if (CentralNps) if (CentralNps)
{ {
RemoveNpsPolicy(runSpace, CentralNpsHost, collectionName); RemoveNpsPolicy(runSpace, CentralNpsHost, capPolicyName);
} }
//Remove security group //Remove security group
@ -537,7 +543,7 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
#region Gateaway (RD CAP | RD RAP) #region Gateaway (RD CAP | RD RAP)
internal void CreateCentralNpsPolicy(Runspace runSpace, string centralNpshost, string collectionName, string organizationId) internal void CreateCentralNpsPolicy(Runspace runSpace, string centralNpshost, string policyName, string collectionName, string organizationId)
{ {
var showCmd = new Command("netsh nps show np"); var showCmd = new Command("netsh nps show np");
@ -545,39 +551,39 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
var count = showResult.Count(x => Convert.ToString(x).Contains("policy conf")) + 1001; var count = showResult.Count(x => Convert.ToString(x).Contains("policy conf")) + 1001;
var groupAd = ActiveDirectoryUtils.GetADObject(GetUsersGroupPath(organizationId, collectionName)); var userGroupAd = ActiveDirectoryUtils.GetADObject(GetUsersGroupPath(organizationId, collectionName));
var sid = (byte[])ActiveDirectoryUtils.GetADObjectProperty(groupAd, "objectSid"); var userGroupSid = (byte[])ActiveDirectoryUtils.GetADObjectProperty(userGroupAd, "objectSid");
var addCmdString = string.Format(AddNpsString, collectionName.Replace(" ", "_"), count, ConvertByteToStringSid(sid)); var addCmdString = string.Format(AddNpsString, policyName.Replace(" ", "_"), count, ConvertByteToStringSid(userGroupSid));
Command addCmd = new Command(addCmdString); Command addCmd = new Command(addCmdString);
var result = ExecuteRemoteShellCommand(runSpace, centralNpshost, addCmd); var result = ExecuteRemoteShellCommand(runSpace, centralNpshost, addCmd);
} }
internal void RemoveNpsPolicy(Runspace runSpace, string centralNpshost, string collectionName) internal void RemoveNpsPolicy(Runspace runSpace, string centralNpshost, string policyName)
{ {
var removeCmd = new Command(string.Format("netsh nps delete np {0}", collectionName.Replace(" ", "_"))); var removeCmd = new Command(string.Format("netsh nps delete np {0}", policyName.Replace(" ", "_")));
var removeResult = ExecuteRemoteShellCommand(runSpace, centralNpshost, removeCmd); var removeResult = ExecuteRemoteShellCommand(runSpace, centralNpshost, removeCmd);
} }
internal void CreateRdCapForce(Runspace runSpace, string gatewayHost, string name, List<string> groups) internal void CreateRdCapForce(Runspace runSpace, string gatewayHost, string policyName, string collectionName, List<string> groups)
{ {
//New-Item -Path "RDS:\GatewayServer\CAP" -Name "Allow Admins" -UserGroups "Administrators@." -AuthMethod 1 //New-Item -Path "RDS:\GatewayServer\CAP" -Name "Allow Admins" -UserGroups "Administrators@." -AuthMethod 1
//Set-Item -Path "RDS:\GatewayServer\CAP\Allow Admins\SessionTimeout" -Value 480 -SessionTimeoutAction 0 //Set-Item -Path "RDS:\GatewayServer\CAP\Allow Admins\SessionTimeout" -Value 480 -SessionTimeoutAction 0
if (ItemExistsRemote(runSpace, gatewayHost, Path.Combine(CapPath, name))) if (ItemExistsRemote(runSpace, gatewayHost, Path.Combine(CapPath, policyName)))
{ {
RemoveRdCap(runSpace, gatewayHost, name); RemoveRdCap(runSpace, gatewayHost, policyName);
} }
var userGroupParametr = string.Format("@({0})",string.Join(",", groups.Select(x => string.Format("\"{0}@{1}\"", x, RootDomain)).ToArray())); var userGroupParametr = string.Format("@({0})",string.Join(",", groups.Select(x => string.Format("\"{0}@{1}\"", x, RootDomain)).ToArray()));
Command rdCapCommand = new Command("New-Item"); Command rdCapCommand = new Command("New-Item");
rdCapCommand.Parameters.Add("Path", string.Format("\"{0}\"", CapPath)); rdCapCommand.Parameters.Add("Path", string.Format("\"{0}\"", CapPath));
rdCapCommand.Parameters.Add("Name", string.Format("\"{0}\"", name)); rdCapCommand.Parameters.Add("Name", string.Format("\"{0}\"", policyName));
rdCapCommand.Parameters.Add("UserGroups", userGroupParametr); rdCapCommand.Parameters.Add("UserGroups", userGroupParametr);
rdCapCommand.Parameters.Add("AuthMethod", 1); rdCapCommand.Parameters.Add("AuthMethod", 1);
@ -589,22 +595,22 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
RemoveItemRemote(runSpace, gatewayHost, string.Format(@"{0}\{1}", CapPath, name), RdsModuleName); RemoveItemRemote(runSpace, gatewayHost, string.Format(@"{0}\{1}", CapPath, name), RdsModuleName);
} }
internal void CreateRdRapForce(Runspace runSpace, string gatewayHost, string name, List<string> groups) internal void CreateRdRapForce(Runspace runSpace, string gatewayHost, string policyName, string collectionName, List<string> groups)
{ {
//New-Item -Path "RDS:\GatewayServer\RAP" -Name "Allow Connections To Everywhere" -UserGroups "Administrators@." -ComputerGroupType 1 //New-Item -Path "RDS:\GatewayServer\RAP" -Name "Allow Connections To Everywhere" -UserGroups "Administrators@." -ComputerGroupType 1
//Set-Item -Path "RDS:\GatewayServer\RAP\Allow Connections To Everywhere\PortNumbers" -Value 3389,3390 //Set-Item -Path "RDS:\GatewayServer\RAP\Allow Connections To Everywhere\PortNumbers" -Value 3389,3390
if (ItemExistsRemote(runSpace, gatewayHost, Path.Combine(RapPath, name))) if (ItemExistsRemote(runSpace, gatewayHost, Path.Combine(RapPath, policyName)))
{ {
RemoveRdRap(runSpace, gatewayHost, name); RemoveRdRap(runSpace, gatewayHost, policyName);
} }
var userGroupParametr = string.Format("@({0})", string.Join(",", groups.Select(x => string.Format("\"{0}@{1}\"", x, RootDomain)).ToArray())); var userGroupParametr = string.Format("@({0})", string.Join(",", groups.Select(x => string.Format("\"{0}@{1}\"", x, RootDomain)).ToArray()));
var computerGroupParametr = string.Format("\"{0}@{1}\"", GetComputersGroupName(name), RootDomain); var computerGroupParametr = string.Format("\"{0}@{1}\"", GetComputersGroupName(collectionName), RootDomain);
Command rdRapCommand = new Command("New-Item"); Command rdRapCommand = new Command("New-Item");
rdRapCommand.Parameters.Add("Path", string.Format("\"{0}\"", RapPath)); rdRapCommand.Parameters.Add("Path", string.Format("\"{0}\"", RapPath));
rdRapCommand.Parameters.Add("Name", string.Format("\"{0}\"", name)); rdRapCommand.Parameters.Add("Name", string.Format("\"{0}\"", policyName));
rdRapCommand.Parameters.Add("UserGroups", userGroupParametr); rdRapCommand.Parameters.Add("UserGroups", userGroupParametr);
rdRapCommand.Parameters.Add("ComputerGroupType", 1); rdRapCommand.Parameters.Add("ComputerGroupType", 1);
rdRapCommand.Parameters.Add("ComputerGroup", computerGroupParametr); rdRapCommand.Parameters.Add("ComputerGroup", computerGroupParametr);
@ -629,6 +635,8 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
ExecuteShellCommand(runSpace, cmd, false); ExecuteShellCommand(runSpace, cmd, false);
} }
private bool ExistRdsServerInDeployment(Runspace runSpace, RdsServer server) private bool ExistRdsServerInDeployment(Runspace runSpace, RdsServer server)
{ {
Command cmd = new Command("Get-RDserver"); Command cmd = new Command("Get-RDserver");
@ -924,6 +932,27 @@ namespace WebsitePanel.Providers.RemoteDesktopServices
ExecuteRemoteShellCommand(runSpace, hostname, rdRapCommand, imports); ExecuteRemoteShellCommand(runSpace, hostname, rdRapCommand, imports);
} }
private string GetPolicyName(string organizationId, string collectionName, RdsPolicyTypes policyType)
{
string policyName = string.Format("{0}-{1}-", organizationId, collectionName);
switch (policyType)
{
case RdsPolicyTypes.RdCap:
{
policyName += "RDCAP";
break;
}
case RdsPolicyTypes.RdRap:
{
policyName += "RDRAP";
break;
}
}
return policyName;
}
private string GetComputersGroupName(string collectionName) private string GetComputersGroupName(string collectionName)
{ {
return string.Format(RdsGroupFormat, collectionName, Computers.ToLowerInvariant()); return string.Format(RdsGroupFormat, collectionName, Computers.ToLowerInvariant());

View file

@ -99,7 +99,7 @@ namespace WebsitePanel.Server
try try
{ {
Log.WriteStart("'{0}' RemoveCollection", ProviderSettings.ProviderName); Log.WriteStart("'{0}' RemoveCollection", ProviderSettings.ProviderName);
var result = RDSProvider.RemoveCollection(organizationId,collectionName); var result = RDSProvider.RemoveCollection(organizationId, collectionName);
Log.WriteEnd("'{0}' RemoveCollection", ProviderSettings.ProviderName); Log.WriteEnd("'{0}' RemoveCollection", ProviderSettings.ProviderName);
return result; return result;
} }

View file

@ -5593,4 +5593,16 @@
<data name="Error.RDS_CREATE_COLLECTION_RDSSERVER_REQUAIRED" xml:space="preserve"> <data name="Error.RDS_CREATE_COLLECTION_RDSSERVER_REQUAIRED" xml:space="preserve">
<value>Error creating rds collection. You need to add at least 1 rds server to collection</value> <value>Error creating rds collection. You need to add at least 1 rds server to collection</value>
</data> </data>
<data name="Quota.Exchange2013.ResourceMailboxes" xml:space="preserve">
<value>Resource Mailboxes per Organization</value>
</data>
<data name="Quota.Exchange2013.SharedMailboxes" xml:space="preserve">
<value>Shared Mailboxes per Organization</value>
</data>
<data name="ResourceMailbox.Text" xml:space="preserve">
<value> (resource mailbox)</value>
</data>
<data name="SharedMailbox.Text" xml:space="preserve">
<value> (shared mailbox)</value>
</data>
</root> </root>

View file

@ -237,6 +237,7 @@ A.Black {color: Black !important; text-decoration: none !important;}
.RedStatus {background-image: url(error_bkg.gif); background-repeat: repeat-x;font-size: 8pt; font-weight: bold; color: White; background-color: #ff3300; text-align: center; padding: 6px;} .RedStatus {background-image: url(error_bkg.gif); background-repeat: repeat-x;font-size: 8pt; font-weight: bold; color: White; background-color: #ff3300; text-align: center; padding: 6px;}
.MessageBox SPAN.description {font-weight: normal !important;} .MessageBox SPAN.description {font-weight: normal !important;}
.MessageBox .TechnicalDetails {padding-top: 4px; font-weight: normal !important;} .MessageBox .TechnicalDetails {padding-top: 4px; font-weight: normal !important;}
.TechnicalDetailsTable {background-color: #FFFFFF; color: #222; }
.MessageBoxSection {font-size: 8pt; font-weight: bold;} .MessageBoxSection {font-size: 8pt; font-weight: bold;}
.popupHint {border: 2px solid #C4D6BB;padding: 3px; background-color: #F1F1FF;} .popupHint {border: 2px solid #C4D6BB;padding: 3px; background-color: #F1F1FF;}
.popupComments {border: 2px solid #C4D6BB;font-size: 9px; padding: 3px; background-color: #F1F1FF;} .popupComments {border: 2px solid #C4D6BB;font-size: 9px; padding: 3px; background-color: #F1F1FF;}
@ -291,4 +292,5 @@ UL.ActionButtons LI {margin-bottom: 12px;}
.enabled {width:20px; height:20px; background: transparent url(../Icons/ok.png) left center no-repeat; border:medium none;} .enabled {width:20px; height:20px; background: transparent url(../Icons/ok.png) left center no-repeat; border:medium none;}
p.warningText {font-size:14px; color:Red; text-align:center;} p.warningText {font-size:14px; color:Red; text-align:center;}
.Hidden {display: none;} .Hidden {display: none;}
.LinkText {color:#428bca;} .LinkText {color:#428bca;}
.WrapText { white-space: normal;}

View file

@ -1,4 +1,4 @@
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DomainsSelectDomainControl.ascx.cs" Inherits="WebsitePanel.Portal.DomainsSelectDomainControl" %> <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DomainsSelectDomainControl.ascx.cs" Inherits="WebsitePanel.Portal.DomainsSelectDomainControl" %>
<asp:DropDownList id="ddlDomains" runat="server" CssClass="NormalTextBox" DataTextField="DomainName" DataValueField="DomainID" style="vertical-align:middle;"></asp:DropDownList> <asp:DropDownList id="ddlDomains" runat="server" CssClass="TextBox200" DataTextField="DomainName" DataValueField="DomainID" style="vertical-align:middle;"></asp:DropDownList>
<asp:RequiredFieldValidator id="valRequireDomain" runat="server" ErrorMessage="Select domain" <asp:RequiredFieldValidator id="valRequireDomain" runat="server" ErrorMessage="Select domain"
ControlToValidate="ddlDomains" Display="Dynamic" meta:resourcekey="valRequireDomain"></asp:RequiredFieldValidator> ControlToValidate="ddlDomains" Display="Dynamic" meta:resourcekey="valRequireDomain"></asp:RequiredFieldValidator>

View file

@ -1,10 +1,9 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by a tool. // This code was generated by a tool.
// Runtime Version:2.0.50727.3074
// //
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------

View file

@ -186,4 +186,10 @@
<data name="valRequireSubscriberNumber.Text" xml:space="preserve"> <data name="valRequireSubscriberNumber.Text" xml:space="preserve">
<value>*</value> <value>*</value>
</data> </data>
<data name="ResourceMailbox.Text" xml:space="preserve">
<value>Resource Mailbox</value>
</data>
<data name="SharedMailbox.Text" xml:space="preserve">
<value>Shared Mailbox</value>
</data>
</root> </root>

View file

@ -101,6 +101,20 @@ namespace WebsitePanel.Portal.ExchangeServer
} }
} }
if (cntx.Quotas.ContainsKey(Quotas.EXCHANGE2013_SHAREDMAILBOXES))
{
if (cntx.Quotas[Quotas.EXCHANGE2013_SHAREDMAILBOXES].QuotaAllocatedValue != 0)
rbMailboxType.Items.Add(new System.Web.UI.WebControls.ListItem(GetLocalizedString("SharedMailbox.Text"), "10"));
}
if (cntx.Quotas.ContainsKey(Quotas.EXCHANGE2013_RESOURCEMAILBOXES))
{
if (cntx.Quotas[Quotas.EXCHANGE2013_RESOURCEMAILBOXES].QuotaAllocatedValue != 0)
rbMailboxType.Items.Add(new System.Web.UI.WebControls.ListItem(GetLocalizedString("ResourceMailbox.Text"), "11"));
}
rowRetentionPolicy.Visible = Utils.CheckQouta(Quotas.EXCHANGE2013_ALLOWRETENTIONPOLICY, cntx); rowRetentionPolicy.Visible = Utils.CheckQouta(Quotas.EXCHANGE2013_ALLOWRETENTIONPOLICY, cntx);
} }

View file

@ -183,6 +183,12 @@ namespace WebsitePanel.Portal.ExchangeServer
} }
imgVipUser.Visible = account.IsVIP && Cntx.Groups.ContainsKey(ResourceGroups.ServiceLevels); imgVipUser.Visible = account.IsVIP && Cntx.Groups.ContainsKey(ResourceGroups.ServiceLevels);
if (account.AccountType == ExchangeAccountType.SharedMailbox)
litDisplayName.Text += GetSharedLocalizedString("SharedMailbox.Text");
if (account.AccountType == ExchangeAccountType.ResourceMailbox)
litDisplayName.Text += GetSharedLocalizedString("ResourceMailbox.Text");
} }
catch (Exception ex) catch (Exception ex)
{ {

View file

@ -67,6 +67,16 @@ namespace WebsitePanel.Portal.ExchangeServer
litDisplayName.Text = mailbox.DisplayName; litDisplayName.Text = mailbox.DisplayName;
sendAsPermission.SetAccounts(mailbox.SendAsAccounts); sendAsPermission.SetAccounts(mailbox.SendAsAccounts);
fullAccessPermission.SetAccounts(mailbox.FullAccessAccounts); fullAccessPermission.SetAccounts(mailbox.FullAccessAccounts);
// get account meta
ExchangeAccount account = ES.Services.ExchangeServer.GetAccount(PanelRequest.ItemID, PanelRequest.AccountID);
if (account.AccountType == ExchangeAccountType.SharedMailbox)
litDisplayName.Text += GetSharedLocalizedString("SharedMailbox.Text");
if (account.AccountType == ExchangeAccountType.ResourceMailbox)
litDisplayName.Text += GetSharedLocalizedString("ResourceMailbox.Text");
} }
catch (Exception ex) catch (Exception ex)
{ {

View file

@ -25,6 +25,9 @@
</div> </div>
<div class="FormButtonsBarCleanRight"> <div class="FormButtonsBarCleanRight">
<asp:Panel ID="SearchPanel" runat="server" DefaultButton="cmdSearch"> <asp:Panel ID="SearchPanel" runat="server" DefaultButton="cmdSearch">
<asp:CheckBox ID="chkMailboxes" runat="server" meta:resourcekey="chkMailboxes" Text="Mailboxes" AutoPostBack="true" OnCheckedChanged="chkMailboxes_CheckedChanged"/>
<asp:CheckBox ID="chkResourceMailboxes" runat="server" meta:resourcekey="chkResourceMailboxes" Text="Resource Mailboxes" AutoPostBack="true" OnCheckedChanged="chkMailboxes_CheckedChanged"/>
<asp:CheckBox ID="chkSharedMailboxes" runat="server" meta:resourcekey="chkSharedMailboxes" Text="Shared Mailboxes" AutoPostBack="true" OnCheckedChanged="chkMailboxes_CheckedChanged"/>
<asp:DropDownList ID="ddlPageSize" runat="server" AutoPostBack="True" <asp:DropDownList ID="ddlPageSize" runat="server" AutoPostBack="True"
onselectedindexchanged="ddlPageSize_SelectedIndexChanged"> onselectedindexchanged="ddlPageSize_SelectedIndexChanged">
<asp:ListItem>10</asp:ListItem> <asp:ListItem>10</asp:ListItem>
@ -105,7 +108,7 @@
OnSelected="odsAccountsPaged_Selected"> OnSelected="odsAccountsPaged_Selected">
<SelectParameters> <SelectParameters>
<asp:QueryStringParameter Name="itemId" QueryStringField="ItemID" DefaultValue="0" /> <asp:QueryStringParameter Name="itemId" QueryStringField="ItemID" DefaultValue="0" />
<asp:Parameter Name="accountTypes" DefaultValue="1,5,6" /> <asp:Parameter Name="accountTypes" DefaultValue="1,5,6,10,11" />
<asp:ControlParameter Name="filterColumn" ControlID="ddlSearchColumn" PropertyName="SelectedValue" /> <asp:ControlParameter Name="filterColumn" ControlID="ddlSearchColumn" PropertyName="SelectedValue" />
<asp:ControlParameter Name="filterValue" ControlID="txtSearchValue" PropertyName="Text" /> <asp:ControlParameter Name="filterValue" ControlID="txtSearchValue" PropertyName="Text" />
<asp:Parameter Name="archiving" Type="Boolean" /> <asp:Parameter Name="archiving" Type="Boolean" />

View file

@ -60,6 +60,10 @@ namespace WebsitePanel.Portal.ExchangeServer
if (!IsPostBack) if (!IsPostBack)
{ {
chkMailboxes.Checked = true;
chkResourceMailboxes.Checked = true;
chkSharedMailboxes.Checked = true;
BindStats(); BindStats();
} }
@ -246,5 +250,25 @@ namespace WebsitePanel.Portal.ExchangeServer
return serviceLevel; return serviceLevel;
} }
protected void chkMailboxes_CheckedChanged(object sender, EventArgs e)
{
List<string> accountTypes = new List<string>();
if ((!chkMailboxes.Checked)&&(!chkSharedMailboxes.Checked)&&(!chkResourceMailboxes.Checked))
chkMailboxes.Checked = true;
if (chkMailboxes.Checked)
accountTypes.AddRange(new string[] {"1","5","6"});
if (chkSharedMailboxes.Checked)
accountTypes.Add("10");
if (chkResourceMailboxes.Checked)
accountTypes.Add("11");
odsAccountsPaged.SelectParameters["accountTypes"].DefaultValue = string.Join(",", accountTypes);
}
} }
} }

View file

@ -66,6 +66,33 @@ namespace WebsitePanel.Portal.ExchangeServer {
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.Panel SearchPanel; protected global::System.Web.UI.WebControls.Panel SearchPanel;
/// <summary>
/// chkMailboxes 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.CheckBox chkMailboxes;
/// <summary>
/// chkResourceMailboxes 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.CheckBox chkResourceMailboxes;
/// <summary>
/// chkSharedMailboxes 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.CheckBox chkSharedMailboxes;
/// <summary> /// <summary>
/// ddlPageSize control. /// ddlPageSize control.
/// </summary> /// </summary>

View file

@ -89,6 +89,24 @@
<wsp:QuotaViewer ID="mailboxesStats" QuotaTypeId="2" runat="server" DisplayGauge="true" /> <wsp:QuotaViewer ID="mailboxesStats" QuotaTypeId="2" runat="server" DisplayGauge="true" />
</td> </td>
</tr> </tr>
<tr class="OrgStatsRow">
<td class="OrgStatsQuota" nowrap>
<asp:HyperLink ID="lnkSharedMailboxes" runat="server" meta:resourcekey="lnkSharedMailboxes" Text="Shared mailboxes" />
</td>
<td>
<wsp:QuotaViewer ID="mailboxesSharedStats" QuotaTypeId="2" runat="server" DisplayGauge="true" />
</td>
</tr>
<tr class="OrgStatsRow">
<td class="OrgStatsQuota" nowrap>
<asp:HyperLink ID="lnkResourceMailboxes" runat="server" meta:resourcekey="lnkResourceMailboxes" Text="Resource mailboxes" />
</td>
<td>
<wsp:QuotaViewer ID="mailboxesResourceStats" QuotaTypeId="2" runat="server" DisplayGauge="true" />
</td>
</tr>
<tr class="OrgStatsRow" id="rowContacts" runat="server"> <tr class="OrgStatsRow" id="rowContacts" runat="server">
<td class="OrgStatsQuota" nowrap> <td class="OrgStatsQuota" nowrap>
<asp:HyperLink ID="lnkContacts" runat="server" meta:resourcekey="lnkContacts"></asp:HyperLink> <asp:HyperLink ID="lnkContacts" runat="server" meta:resourcekey="lnkContacts"></asp:HyperLink>

View file

@ -54,6 +54,14 @@ namespace WebsitePanel.Portal.ExchangeServer
lnkMailboxes.NavigateUrl = EditUrl("ItemID", PanelRequest.ItemID.ToString(), "mailboxes", lnkMailboxes.NavigateUrl = EditUrl("ItemID", PanelRequest.ItemID.ToString(), "mailboxes",
"SpaceID=" + PanelSecurity.PackageId.ToString()); "SpaceID=" + PanelSecurity.PackageId.ToString());
lnkSharedMailboxes.NavigateUrl = EditUrl("ItemID", PanelRequest.ItemID.ToString(), "mailboxes",
"SpaceID=" + PanelSecurity.PackageId.ToString());
lnkResourceMailboxes.NavigateUrl = EditUrl("ItemID", PanelRequest.ItemID.ToString(), "mailboxes",
"SpaceID=" + PanelSecurity.PackageId.ToString());
lnkContacts.NavigateUrl = EditUrl("ItemID", PanelRequest.ItemID.ToString(), "contacts", lnkContacts.NavigateUrl = EditUrl("ItemID", PanelRequest.ItemID.ToString(), "contacts",
"SpaceID=" + PanelSecurity.PackageId.ToString()); "SpaceID=" + PanelSecurity.PackageId.ToString());
@ -77,6 +85,13 @@ namespace WebsitePanel.Portal.ExchangeServer
mailboxesStats.QuotaValue = exchangeOrgStats.AllocatedMailboxes; mailboxesStats.QuotaValue = exchangeOrgStats.AllocatedMailboxes;
if (exchangeOrgStats.AllocatedMailboxes != -1) mailboxesStats.QuotaAvailable = exchangeTenantStats.AllocatedMailboxes - exchangeTenantStats.CreatedMailboxes; if (exchangeOrgStats.AllocatedMailboxes != -1) mailboxesStats.QuotaAvailable = exchangeTenantStats.AllocatedMailboxes - exchangeTenantStats.CreatedMailboxes;
mailboxesSharedStats.QuotaUsedValue = exchangeOrgStats.CreatedSharedMailboxes;
mailboxesSharedStats.QuotaValue = exchangeOrgStats.AllocatedSharedMailboxes;
if (exchangeOrgStats.AllocatedSharedMailboxes != -1) mailboxesSharedStats.QuotaAvailable = exchangeTenantStats.AllocatedSharedMailboxes - exchangeTenantStats.CreatedSharedMailboxes;
mailboxesResourceStats.QuotaUsedValue = exchangeOrgStats.CreatedResourceMailboxes;
mailboxesResourceStats.QuotaValue = exchangeOrgStats.AllocatedResourceMailboxes;
if (exchangeOrgStats.AllocatedResourceMailboxes != -1) mailboxesResourceStats.QuotaAvailable = exchangeTenantStats.AllocatedResourceMailboxes - exchangeTenantStats.CreatedResourceMailboxes;
if (exchangeTenantStats.AllocatedContacts == 0) this.rowContacts.Style.Add("display", "none"); if (exchangeTenantStats.AllocatedContacts == 0) this.rowContacts.Style.Add("display", "none");
else else

View file

@ -201,6 +201,42 @@ namespace WebsitePanel.Portal.ExchangeServer {
/// </remarks> /// </remarks>
protected global::WebsitePanel.Portal.QuotaViewer mailboxesStats; protected global::WebsitePanel.Portal.QuotaViewer mailboxesStats;
/// <summary>
/// lnkSharedMailboxes 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.HyperLink lnkSharedMailboxes;
/// <summary>
/// mailboxesSharedStats control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.QuotaViewer mailboxesSharedStats;
/// <summary>
/// lnkResourceMailboxes 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.HyperLink lnkResourceMailboxes;
/// <summary>
/// mailboxesResourceStats control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.QuotaViewer mailboxesResourceStats;
/// <summary> /// <summary>
/// rowContacts control. /// rowContacts control.
/// </summary> /// </summary>

View file

@ -123,16 +123,31 @@
<data name="lblDomainTemplateNameResource1.ToolTip" xml:space="preserve"> <data name="lblDomainTemplateNameResource1.ToolTip" xml:space="preserve">
<value /> <value />
</data> </data>
<data name="lblMaxMessageSizeInMB.Text" xml:space="preserve">
<value>Global max message size:</value>
</data>
<data name="lblPublicIP.Text" xml:space="preserve">
<value>Public IP Address:</value>
</data>
<data name="lblPublicIPResource1.Text" xml:space="preserve"> <data name="lblPublicIPResource1.Text" xml:space="preserve">
<value>Public IP Address:</value> <value>Public IP Address:</value>
</data> </data>
<data name="lblPublicIPResource1.ToolTip" xml:space="preserve"> <data name="lblPublicIPResource1.ToolTip" xml:space="preserve">
<value /> <value />
</data> </data>
<data name="lblZeroIsUnlimited.Text" xml:space="preserve">
<value>0 means unlimited</value>
</data>
<data name="MaxMessageSizeInMB.Text" xml:space="preserve">
<value>Can be overridden on domain level if you check 'Override global limits'</value>
</data>
<data name="txtDomainTemplateNameResource1.Text" xml:space="preserve"> <data name="txtDomainTemplateNameResource1.Text" xml:space="preserve">
<value /> <value />
</data> </data>
<data name="txtDomainTemplateNameResource1.ToolTip" xml:space="preserve"> <data name="txtDomainTemplateNameResource1.ToolTip" xml:space="preserve">
<value /> <value />
</data> </data>
<data name="txtWarnSizeValidator.ErrorMessage" xml:space="preserve">
<value>Must be a value between 0 and 99, 0 means disabled</value>
</data>
</root> </root>

View file

@ -0,0 +1,129 @@
<?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="btnAdd.Text" xml:space="preserve">
<value>Add</value>
</data>
<data name="gvGWServers.EmptyDataText" xml:space="preserve">
<value>No gateway serves have been added yet.</value>
</data>
<data name="ServerNameColumn.HeaderText" xml:space="preserve">
<value>Server Name</value>
</data>
</root>

View file

@ -76,7 +76,7 @@
<asp:Label ID="lblRespondPeriodInDays" runat="server" meta:resourcekey="lblRespondPeriodInDays" Text="Respond period in days:"></asp:Label> <asp:Label ID="lblRespondPeriodInDays" runat="server" meta:resourcekey="lblRespondPeriodInDays" Text="Respond period in days:"></asp:Label>
</td> </td>
<td class="Normal"> <td class="Normal">
<asp:TextBox ID="txtRespondPeriodInDays" runat="server" CssClass="NormalTextBox"></asp:TextBox> <asp:TextBox ID="txtRespondPeriodInDays" runat="server" CssClass="NormalTextBox" Text="0"></asp:TextBox>
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtRespondPeriodInDays" ErrorMessage="*"></asp:RequiredFieldValidator> <asp:RequiredFieldValidator runat="server" ControlToValidate="txtRespondPeriodInDays" ErrorMessage="*"></asp:RequiredFieldValidator>
<asp:RangeValidator ID="RespondPeriodInDaysValidator" runat="server" ControlToValidate="txtRespondPeriodInDays" MinimumValue="0" MaximumValue="63" Type="Integer" ErrorMessage="Respond days must be between 0 and 63 days" meta:resourcekey="RespondPeriodInDaysValidator"></asp:RangeValidator> <asp:RangeValidator ID="RespondPeriodInDaysValidator" runat="server" ControlToValidate="txtRespondPeriodInDays" MinimumValue="0" MaximumValue="63" Type="Integer" ErrorMessage="Respond days must be between 0 and 63 days" meta:resourcekey="RespondPeriodInDaysValidator"></asp:RangeValidator>
</td> </td>

View file

@ -37,8 +37,11 @@ namespace WebsitePanel.Portal.ProviderControls
{ {
// Hide some form items when creating a new account // Hide some form items when creating a new account
passwordRow.Visible = (PanelRequest.ItemID > 0); passwordRow.Visible = (PanelRequest.ItemID > 0);
AutoresponderPanel.Visible = (PanelRequest.ItemID > 0);
secAutoresponder.Visible = (PanelRequest.ItemID > 0); secAutoresponder.Visible = (PanelRequest.ItemID > 0);
ForwardingPanel.Visible = (PanelRequest.ItemID > 0);
secForwarding.Visible = (PanelRequest.ItemID > 0); secForwarding.Visible = (PanelRequest.ItemID > 0);
OlderMailsPanel.Visible = (PanelRequest.ItemID > 0);
secOlderMails.Visible = (PanelRequest.ItemID > 0); secOlderMails.Visible = (PanelRequest.ItemID > 0);
} }
@ -109,10 +112,10 @@ namespace WebsitePanel.Portal.ProviderControls
item.IsDomainAdmin = cbDomainAdmin.Checked; item.IsDomainAdmin = cbDomainAdmin.Checked;
item.DeleteOlder = cbDeleteOlder.Checked; item.DeleteOlder = cbDeleteOlder.Checked;
item.DeleteOlderDays = Convert.ToInt32(txtDeleteOlderDays.Text); item.DeleteOlderDays = string.IsNullOrWhiteSpace(txtDeleteOlderDays.Text) ? 0 : Convert.ToInt32(txtDeleteOlderDays.Text);
item.ForwardOlder = cbForwardOlder.Checked; item.ForwardOlder = cbForwardOlder.Checked;
item.ForwardOlderDays = Convert.ToInt32(txtForwardOlderDays.Text); item.ForwardOlderDays = string.IsNullOrWhiteSpace(txtForwardOlderDays.Text) ? 0 : Convert.ToInt32(txtForwardOlderDays.Text);
item.ForwardOlderTo = txtForwardOlderTo.Text; item.ForwardOlderTo = txtForwardOlderTo.Text;
} }

View file

@ -1,6 +1,6 @@
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="IceWarp_Settings.ascx.cs" Inherits="WebsitePanel.Portal.ProviderControls.IceWarp_Settings" %> <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="IceWarp_Settings.ascx.cs" Inherits="WebsitePanel.Portal.ProviderControls.IceWarp_Settings" %>
<%@ Register Src="../UserControls/SelectIPAddress.ascx" TagName="SelectIPAddress" TagPrefix="uc1" %> <%@ Register Src="../UserControls/SelectIPAddress.ascx" TagName="SelectIPAddress" TagPrefix="uc1" %>
<table cellpadding="7" cellspacing="0" width="100%"> <table width="100%">
<tr> <tr>
<td class="SubHead" width="150"> <td class="SubHead" width="150">
<asp:Label ID="lblPublicIP" runat="server" Text="Public IP Address:" meta:resourcekey="lblPublicIP"></asp:Label> <asp:Label ID="lblPublicIP" runat="server" Text="Public IP Address:" meta:resourcekey="lblPublicIP"></asp:Label>
@ -14,9 +14,14 @@
<asp:Label runat="server" ID="lblMaxMessageSizeInMB" Text="Global max message size:"></asp:Label> <asp:Label runat="server" ID="lblMaxMessageSizeInMB" Text="Global max message size:"></asp:Label>
</td> </td>
<td class="Normal"> <td class="Normal">
<asp:TextBox runat="server" ID="txtMaxMessageSizeInMB" Text="0"></asp:TextBox> <asp:TextBox runat="server" ID="txtMaxMessageSizeInMB" Text="0" CssClass="NormalTextBox"></asp:TextBox>
<asp:Label ID="Label1" runat="server" meta:resourcekey="MaxMessageSizeInMB" Text="Can be overridden on domain level if you check 'Override global limits'"></asp:Label> <asp:RequiredFieldValidator ID="txtMaxMessageSizeInMBRequired" runat="server" Text="*" ControlToValidate="txtMaxMessageSizeInMB"></asp:RequiredFieldValidator>
<asp:Label runat="server" meta:resourcekey="lblZeroIsUnlimited" />
</td> </td>
</tr>
<tr>
<td></td>
<td><asp:Label ID="MaxMessageSizeInMB" runat="server" meta:resourcekey="MaxMessageSizeInMB" Text="Can be overridden on domain level if you check 'Override global limits'"></asp:Label></td>
</tr> </tr>
<tr> <tr>
<td colspan="2"> <td colspan="2">
@ -43,9 +48,9 @@
<asp:Label runat="server" ID="lblWarnDomainSize" Text="Warn domain administrator when domain size exceeds quota (%)"></asp:Label> <asp:Label runat="server" ID="lblWarnDomainSize" Text="Warn domain administrator when domain size exceeds quota (%)"></asp:Label>
</td> </td>
<td class="Normal"> <td class="Normal">
<asp:TextBox runat="server" ID="txtWarnDomainSize" Text="0"></asp:TextBox> <asp:TextBox runat="server" ID="txtWarnDomainSize" Text="0" CssClass="NormalTextBox"></asp:TextBox>
<asp:RequiredFieldValidator runat="server" Text="*" ControlToValidate="txtWarnDomainSize"></asp:RequiredFieldValidator> <asp:RequiredFieldValidator runat="server" Text="*" ControlToValidate="txtWarnDomainSize"></asp:RequiredFieldValidator>
<asp:RangeValidator ErrorMessage="Must be a value between 0 and 99" MinimumValue="0" MaximumValue="99" Type="Integer" meta:resourcekey="txtWarnDomainSizeValidator" ControlToValidate="txtWarnDomainSize" runat="server" /> <asp:RangeValidator ErrorMessage="Must be a value between 0 and 99, 0 means disabled" MinimumValue="0" MaximumValue="99" Type="Integer" meta:resourcekey="txtWarnSizeValidator" ControlToValidate="txtWarnDomainSize" runat="server" />
</td> </td>
</tr> </tr>
<tr> <tr>
@ -53,9 +58,9 @@
<asp:Label runat="server" ID="lblWarnMailboxUsage" Text="Warn user when mailbox size exceeds quota (%)"></asp:Label> <asp:Label runat="server" ID="lblWarnMailboxUsage" Text="Warn user when mailbox size exceeds quota (%)"></asp:Label>
</td> </td>
<td class="Normal"> <td class="Normal">
<asp:TextBox runat="server" ID="txtWarnMailboxUsage" Text="0"></asp:TextBox> <asp:TextBox runat="server" ID="txtWarnMailboxUsage" Text="0" CssClass="NormalTextBox"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" Text="*" ControlToValidate="txtWarnMailboxUsage"></asp:RequiredFieldValidator> <asp:RequiredFieldValidator ID="txtWarnMailboxUsageRequired" runat="server" Text="*" ControlToValidate="txtWarnMailboxUsage"></asp:RequiredFieldValidator>
<asp:RangeValidator ErrorMessage="Must be a value between 0 and 99" MinimumValue="0" MaximumValue="99" Type="Integer" meta:resourcekey="txtWarnMailboxUsageValidator" ControlToValidate="txtWarnMailboxUsage" runat="server" /> <asp:RangeValidator ErrorMessage="Must be a value between 0 and 99, 0 means disabled" MinimumValue="0" MaximumValue="99" Type="Integer" meta:resourcekey="txtWarnSizeValidator" ControlToValidate="txtWarnMailboxUsage" runat="server" />
</td> </td>
</tr> </tr>
</table> </table>

View file

@ -49,13 +49,22 @@ namespace WebsitePanel.Portal.ProviderControls {
protected global::System.Web.UI.WebControls.TextBox txtMaxMessageSizeInMB; protected global::System.Web.UI.WebControls.TextBox txtMaxMessageSizeInMB;
/// <summary> /// <summary>
/// Label1 control. /// txtMaxMessageSizeInMBRequired control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.Label Label1; protected global::System.Web.UI.WebControls.RequiredFieldValidator txtMaxMessageSizeInMBRequired;
/// <summary>
/// MaxMessageSizeInMB 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 MaxMessageSizeInMB;
/// <summary> /// <summary>
/// cbUseDomainDiskQuota control. /// cbUseDomainDiskQuota control.
@ -130,12 +139,12 @@ namespace WebsitePanel.Portal.ProviderControls {
protected global::System.Web.UI.WebControls.TextBox txtWarnMailboxUsage; protected global::System.Web.UI.WebControls.TextBox txtWarnMailboxUsage;
/// <summary> /// <summary>
/// RequiredFieldValidator1 control. /// txtWarnMailboxUsageRequired control.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Auto-generated field. /// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator1; protected global::System.Web.UI.WebControls.RequiredFieldValidator txtWarnMailboxUsageRequired;
} }
} }

View file

@ -121,7 +121,14 @@ namespace WebsitePanel.Portal.ProviderControls
ddlSite.Items.Add(item); ddlSite.Items.Add(item);
} }
ddlSite_SelectedIndexChanged(this, null); if (ddlSite.Items.Count == 0)
{
ddlSite.Items.Add(new ListItem("Default FTP Site (not yet created)", "Default FTP Site"));
}
else
{
ddlSite_SelectedIndexChanged(this, null);
}
} }
protected void ddlSite_SelectedIndexChanged(object sender, EventArgs e) protected void ddlSite_SelectedIndexChanged(object sender, EventArgs e)

View file

@ -9,15 +9,6 @@
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="txtConnectionBroker" Display="Dynamic" ErrorMessage="*" /> <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="txtConnectionBroker" Display="Dynamic" ErrorMessage="*" />
</td> </td>
</tr> </tr>
<tr>
<td class="SubHead" width="200" nowrap>
<asp:Label runat="server" ID="lblGateway" meta:resourcekey="lblGateway" Text="Gateway Servers:"/>
</td>
<td>
<asp:TextBox runat="server" ID="txtGateway" MaxLength="1000" Width="200px" />
<asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ControlToValidate="txtGateway" Display="Dynamic" ErrorMessage="*" />
</td>
</tr>
<tr> <tr>
<td class="SubHead" width="200" nowrap> <td class="SubHead" width="200" nowrap>
<asp:Label runat="server" ID="lblRootOU" meta:resourcekey="lblRootOU" Text="Root OU:"/> <asp:Label runat="server" ID="lblRootOU" meta:resourcekey="lblRootOU" Text="Root OU:"/>
@ -52,4 +43,33 @@
<asp:TextBox runat="server" ID="txtCentralNPS" Width="200px"/> <asp:TextBox runat="server" ID="txtCentralNPS" Width="200px"/>
</td> </td>
</tr> </tr>
<tr>
<td class="SubHead" width="200" nowrap valign="top">
<asp:Localize ID="locGWServers" runat="server" meta:resourcekey="locGWServers"
Text="Gateway Servers:"></asp:Localize>
</td>
<td>
<asp:TextBox runat="server" ID="txtAddGWServer" MaxLength="1000" Width="200px" />
<asp:Button runat="server" ID="btnAddGWServer" OnClick="btnAddGWServer_Click" meta:resourcekey="btnAdd"
CssClass="Button1" /><br />
<asp:GridView ID="gvGWServers" runat="server" AutoGenerateColumns="False" EmptyDataText="gvRecords"
CssSelectorClass="NormalGridView" OnRowCommand="gvGWServers_RowCommand" meta:resourcekey="gvGWServers">
<Columns>
<asp:TemplateField meta:resourcekey="ServerNameColumn" ItemStyle-Width="100%" >
<ItemTemplate>
<asp:Label runat="server" ID="lblServerName" Text='<%#Eval("ServerName")%>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:ImageButton ID="cmdDelete" runat="server" SkinID="DeleteSmall" CommandName="RemoveServer"
CommandArgument='<%#Eval("ServerName") %>' meta:resourcekey="cmdDelete" AlternateText="Delete"
OnClientClick="return confirm('Delete?');"></asp:ImageButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</td>
</tr>
</table> </table>

View file

@ -27,6 +27,8 @@
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
using System; using System;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using WebsitePanel.EnterpriseServer; using WebsitePanel.EnterpriseServer;
using WebsitePanel.Providers.Common; using WebsitePanel.Providers.Common;
@ -39,10 +41,26 @@ namespace WebsitePanel.Portal.ProviderControls
} }
public string GWServers
{
get
{
return ViewState["GWServers"] != null ? ViewState["GWServers"].ToString() : string.Empty;
}
set
{
ViewState["GWServers"] = value;
}
}
public void BindSettings(System.Collections.Specialized.StringDictionary settings) public void BindSettings(System.Collections.Specialized.StringDictionary settings)
{ {
txtConnectionBroker.Text = settings["ConnectionBroker"]; txtConnectionBroker.Text = settings["ConnectionBroker"];
txtGateway.Text = settings["GWServrsList"];
GWServers = settings["GWServrsList"];
UpdateLyncServersGrid();
txtRootOU.Text = settings["RootOU"]; txtRootOU.Text = settings["RootOU"];
txtPrimaryDomainController.Text = settings["PrimaryDomainController"]; txtPrimaryDomainController.Text = settings["PrimaryDomainController"];
@ -63,11 +81,12 @@ namespace WebsitePanel.Portal.ProviderControls
public void SaveSettings(System.Collections.Specialized.StringDictionary settings) public void SaveSettings(System.Collections.Specialized.StringDictionary settings)
{ {
settings["ConnectionBroker"] = txtConnectionBroker.Text; settings["ConnectionBroker"] = txtConnectionBroker.Text;
settings["GWServrsList"] = txtGateway.Text;
settings["RootOU"] = txtRootOU.Text; settings["RootOU"] = txtRootOU.Text;
settings["PrimaryDomainController"] = txtPrimaryDomainController.Text; settings["PrimaryDomainController"] = txtPrimaryDomainController.Text;
settings["UseCentralNPS"] = chkUseCentralNPS.Checked.ToString(); settings["UseCentralNPS"] = chkUseCentralNPS.Checked.ToString();
settings["CentralNPS"] = chkUseCentralNPS.Checked ? txtCentralNPS.Text : string.Empty; settings["CentralNPS"] = chkUseCentralNPS.Checked ? txtCentralNPS.Text : string.Empty;
settings["GWServrsList"] = GWServers;
} }
protected void chkUseCentralNPS_CheckedChanged(object sender, EventArgs e) protected void chkUseCentralNPS_CheckedChanged(object sender, EventArgs e)
@ -75,6 +94,61 @@ namespace WebsitePanel.Portal.ProviderControls
txtCentralNPS.Enabled = chkUseCentralNPS.Checked; txtCentralNPS.Enabled = chkUseCentralNPS.Checked;
txtCentralNPS.Text = chkUseCentralNPS.Checked ? txtCentralNPS.Text : string.Empty; txtCentralNPS.Text = chkUseCentralNPS.Checked ? txtCentralNPS.Text : string.Empty;
} }
protected void btnAddGWServer_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(GWServers))
GWServers += ";";
GWServers += txtAddGWServer.Text;
txtAddGWServer.Text = string.Empty;
UpdateLyncServersGrid();
}
public List<GWServer> GetServices(string data)
{
if (string.IsNullOrEmpty(data))
return null;
List<GWServer> list = new List<GWServer>();
string[] serversNames = data.Split(';');
foreach (string current in serversNames)
{
list.Add(new GWServer { ServerName = current });
}
return list;
}
private void UpdateLyncServersGrid()
{
gvGWServers.DataSource = GetServices(GWServers);
gvGWServers.DataBind();
}
protected void gvGWServers_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "RemoveServer")
{
string str = string.Empty;
List<GWServer> servers = GetServices(GWServers);
foreach (GWServer current in servers)
{
if (current.ServerName == e.CommandArgument.ToString())
continue;
str += current.ServerName + ";";
}
GWServers = str.TrimEnd(';');
UpdateLyncServersGrid();
}
}
}
public class GWServer
{
public string ServerName { get; set; }
} }
} }

View file

@ -39,33 +39,6 @@ namespace WebsitePanel.Portal.ProviderControls {
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator2; protected global::System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidator2;
/// <summary>
/// lblGateway 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 lblGateway;
/// <summary>
/// txtGateway 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 txtGateway;
/// <summary>
/// RequiredFieldValidator3 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 RequiredFieldValidator3;
/// <summary> /// <summary>
/// lblRootOU control. /// lblRootOU control.
/// </summary> /// </summary>
@ -155,5 +128,41 @@ namespace WebsitePanel.Portal.ProviderControls {
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtCentralNPS; protected global::System.Web.UI.WebControls.TextBox txtCentralNPS;
/// <summary>
/// locGWServers 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.Localize locGWServers;
/// <summary>
/// txtAddGWServer 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 txtAddGWServer;
/// <summary>
/// btnAddGWServer 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.Button btnAddGWServer;
/// <summary>
/// gvGWServers 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.GridView gvGWServers;
} }
} }

View file

@ -55,9 +55,10 @@
</asp:TemplateField> </asp:TemplateField>
<asp:TemplateField> <asp:TemplateField>
<ItemTemplate> <ItemTemplate>
<asp:LinkButton ID="imgRemove1" runat="server" Text="Remove" <asp:LinkButton ID="imgRemove1" runat="server" Text="Remove" Visible='<%# Eval("RdsCollectionId") == null %>'
CommandName="DeleteItem" CommandArgument='<%# Eval("Id") %>' CommandName="DeleteItem" CommandArgument='<%# Eval("Id") %>'
meta:resourcekey="cmdDelete" OnClientClick="return confirm('Are you sure you want to remove selected server?')"></asp:LinkButton> meta:resourcekey="cmdDelete" OnClientClick="return confirm('Are you sure you want to remove selected server?')"></asp:LinkButton>
<asp:Label ID="lbRemove" Text="Remove" runat="server" Visible='<%# Eval("RdsCollectionId") != null %>'></asp:Label>
</ItemTemplate> </ItemTemplate>
</asp:TemplateField> </asp:TemplateField>
</Columns> </Columns>

View file

@ -32,6 +32,7 @@ using WebsitePanel.EnterpriseServer;
using WebsitePanel.Providers.Common; using WebsitePanel.Providers.Common;
using WebsitePanel.Providers.HostedSolution; using WebsitePanel.Providers.HostedSolution;
using WebsitePanel.Providers.OS; using WebsitePanel.Providers.OS;
using WebsitePanel.Providers.RemoteDesktopServices;
using WebsitePanel.WebPortal; using WebsitePanel.WebPortal;
namespace WebsitePanel.Portal.RDS namespace WebsitePanel.Portal.RDS
@ -67,6 +68,13 @@ namespace WebsitePanel.Portal.RDS
try try
{ {
RdsServer rdsServer = ES.Services.RDS.GetRdsServer(rdsServerId);
if (rdsServer.RdsCollectionId != null)
{
messageBox.ShowErrorMessage("RDS_UNASSIGN_SERVER_FROM_ORG_SERVER_IS_IN_COLLECTION");
return;
}
ResultObject result = ES.Services.RDS.RemoveRdsServerFromOrganization(rdsServerId); ResultObject result = ES.Services.RDS.RemoveRdsServerFromOrganization(rdsServerId);
if (!result.IsSuccess) if (!result.IsSuccess)
{ {

View file

@ -24,7 +24,7 @@
<td class="FormLabel150" style="width: 100px;"><asp:Localize ID="locCollectionName" runat="server" meta:resourcekey="locCollectionName" Text="Collection Name"></asp:Localize></td> <td class="FormLabel150" style="width: 100px;"><asp:Localize ID="locCollectionName" runat="server" meta:resourcekey="locCollectionName" Text="Collection Name"></asp:Localize></td>
<td> <td>
<asp:TextBox ID="txtCollectionName" runat="server" CssClass="NormalTextBox" /> <asp:TextBox ID="txtCollectionName" runat="server" CssClass="NormalTextBox" />
<asp:RequiredFieldValidator ID="valCollectionName" runat="server" ErrorMessage="*" ControlToValidate="txtCollectionName"></asp:RequiredFieldValidator> <asp:RequiredFieldValidator ID="valCollectionName" runat="server" ErrorMessage="*" ControlToValidate="txtCollectionName" ValidationGroup="SaveRDSCollection"></asp:RequiredFieldValidator>
</td> </td>
</tr> </tr>
</table> </table>
@ -37,7 +37,7 @@
</fieldset> </fieldset>
<div class="FormFooter"> <div class="FormFooter">
<asp:Button id="btnSave" runat="server" Text="Save" CssClass="Button1" meta:resourcekey="btnSave" OnClick="btnSave_Click"></asp:Button> <asp:Button id="btnSave" runat="server" Text="Save" CssClass="Button1" meta:resourcekey="btnSave" OnClick="btnSave_Click" ValidationGroup="SaveRDSCollection"></asp:Button>
</div> </div>
</div> </div>
</div> </div>

View file

@ -117,12 +117,21 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="btnAdd.OnClientClick" xml:space="preserve">
<value>ShowProgressDialog('Getting Remote Apps ...');</value>
</data>
<data name="btnAdd.Text" xml:space="preserve"> <data name="btnAdd.Text" xml:space="preserve">
<value>Add...</value> <value>Add...</value>
</data> </data>
<data name="btnAddSelected.OnClientClick" xml:space="preserve">
<value>CloseProgressDialog();</value>
</data>
<data name="btnAddSelected.Text" xml:space="preserve"> <data name="btnAddSelected.Text" xml:space="preserve">
<value>Add Apps</value> <value>Add Apps</value>
</data> </data>
<data name="btnCancel.OnClientClick" xml:space="preserve">
<value>CloseProgressDialog();</value>
</data>
<data name="btnCancel.Text" xml:space="preserve"> <data name="btnCancel.Text" xml:space="preserve">
<value>Cancel</value> <value>Cancel</value>
</data> </data>

View file

@ -117,12 +117,21 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="btnAdd.OnClientClick" xml:space="preserve">
<value>ShowProgressDialog('Getting RDS Servers ...');</value>
</data>
<data name="btnAdd.Text" xml:space="preserve"> <data name="btnAdd.Text" xml:space="preserve">
<value>Add...</value> <value>Add...</value>
</data> </data>
<data name="btnAddSelected.OnClientClick" xml:space="preserve">
<value>CloseProgressDialog();</value>
</data>
<data name="btnAddSelected.Text" xml:space="preserve"> <data name="btnAddSelected.Text" xml:space="preserve">
<value>Add Servers</value> <value>Add Servers</value>
</data> </data>
<data name="btnCancel.OnClientClick" xml:space="preserve">
<value>CloseProgressDialog();</value>
</data>
<data name="btnCancel.Text" xml:space="preserve"> <data name="btnCancel.Text" xml:space="preserve">
<value>Cancel</value> <value>Cancel</value>
</data> </data>

View file

@ -94,7 +94,7 @@
<asp:Button ID="btnAddServersFake" runat="server" style="display:none;" /> <asp:Button ID="btnAddServersFake" runat="server" style="display:none;" />
<ajaxToolkit:ModalPopupExtender ID="AddServersModal" runat="server" <ajaxToolkit:ModalPopupExtender ID="AddServersModal" runat="server"
TargetControlID="btnAddServersFake" PopupControlID="AddServersPanel" TargetControlID="btnAddServersFake" PopupControlID="AddServersPanel"
BackgroundCssClass="modalBackground" DropShadow="false" CancelControlID="btnCancelAdd" /> BackgroundCssClass="modalBackground" DropShadow="false" CancelControlID="btnCancelAdd"/>
</ContentTemplate> </ContentTemplate>
</asp:UpdatePanel> </asp:UpdatePanel>

View file

@ -85,8 +85,8 @@ namespace WebsitePanel.Portal.RDS.UserControls
protected void btnAdd_Click(object sender, EventArgs e) protected void btnAdd_Click(object sender, EventArgs e)
{ {
// bind all servers // bind all servers
BindPopupServers(); BindPopupServers();
// show modal // show modal
AddServersModal.Show(); AddServersModal.Show();
} }
@ -103,7 +103,6 @@ namespace WebsitePanel.Portal.RDS.UserControls
List<RdsServer> selectedServers = GetPopUpGridViewServers(); List<RdsServer> selectedServers = GetPopUpGridViewServers();
BindServers(selectedServers.ToArray(), true); BindServers(selectedServers.ToArray(), true);
} }
protected void BindPopupServers() protected void BindPopupServers()
@ -132,6 +131,7 @@ namespace WebsitePanel.Portal.RDS.UserControls
servers.AddRange(GetGridViewServers(SelectedState.All)); servers.AddRange(GetGridViewServers(SelectedState.All));
// add new servers // add new servers
if (newServers != null) if (newServers != null)
{ {
foreach (RdsServer newServer in newServers) foreach (RdsServer newServer in newServers)

View file

@ -43,7 +43,7 @@ function PadNumber(num)
function EnableProgressDialog() { function EnableProgressDialog() {
_showProgressDialog = true; _showProgressDialog = true;
window.setInterval(DisableProgressDialog, 10); // disable dialog with some delay //window.setInterval(DisableProgressDialog, 10); // disable dialog with some delay
} }
function DisableProgressDialog() { function DisableProgressDialog() {
@ -57,6 +57,12 @@ function ShowProgressDialog(title, popupBehavior)
EnableProgressDialog(); EnableProgressDialog();
} }
function CloseProgressDialog()
{
DisableProgressDialog();
$find('ModalPopupProperties').hide();
}
function ShowProgressDialogWithCallback(title) function ShowProgressDialogWithCallback(title)
{ {
_dialogTitle = title; _dialogTitle = title;

View file

@ -11,7 +11,7 @@
TargetControlID="TechnicalDetailsPanel" resourcekey="secTechnicalDetails" Text="Technical Details"> TargetControlID="TechnicalDetailsPanel" resourcekey="secTechnicalDetails" Text="Technical Details">
</wsp:CollapsiblePanel> </wsp:CollapsiblePanel>
<asp:Panel ID="TechnicalDetailsPanel" runat="server" Height="0" style="overflow:hidden;"> <asp:Panel ID="TechnicalDetailsPanel" runat="server" Height="0" style="overflow:hidden;">
<table id="tblTechnicalDetails" runat="server" style="background-color: #FFFFFF;" cellpadding="0" cellspacing="0"> <table id="tblTechnicalDetails" runat="server" class="TechnicalDetailsTable" cellpadding="0" cellspacing="0">
<tr> <tr>
<td> <td>
<table cellspacing="0" cellpadding="3"> <table cellspacing="0" cellpadding="3">
@ -51,7 +51,7 @@
<td class="NormalBold" valign="top"> <td class="NormalBold" valign="top">
<asp:Label ID="lblStackTrace" runat="server" meta:resourcekey="lblStackTrace" Text="Stack Trace:"></asp:Label> <asp:Label ID="lblStackTrace" runat="server" meta:resourcekey="lblStackTrace" Text="Stack Trace:"></asp:Label>
</td> </td>
<td class="Normal" valign="top"> <td class="WrapText" valign="top">
<asp:Literal ID="litStackTrace" runat="server"></asp:Literal> <asp:Literal ID="litStackTrace" runat="server"></asp:Literal>
</td> </td>
</tr> </tr>
@ -103,7 +103,7 @@
<asp:Label ID="lblComments" runat="server" meta:resourcekey="lblComments" Text="Personal Comments:"></asp:Label> <asp:Label ID="lblComments" runat="server" meta:resourcekey="lblComments" Text="Personal Comments:"></asp:Label>
</td> </td>
<td class="Normal" valign="top"> <td class="Normal" valign="top">
<asp:TextBox ID="txtSendComments" runat="server" CssClass="LogArea" Rows="5" TextMode="MultiLine" <asp:TextBox ID="txtSendComments" runat="server" CssClass="LogArea TechnicalDetailsTable" Rows="5" TextMode="MultiLine"
Width="400px"></asp:TextBox></td> Width="400px"></asp:TextBox></td>
</tr> </tr>
<tr> <tr>

View file

@ -1,10 +1,38 @@
// 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> // <auto-generated>
// This code was generated by a tool. // This code was generated by a tool.
// Runtime Version:2.0.50727.3074
// //
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------

View file

@ -1,3 +1,3 @@
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SelectIPAddress.ascx.cs" Inherits="WebsitePanel.Portal.SelectIPAddress" %> <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SelectIPAddress.ascx.cs" Inherits="WebsitePanel.Portal.SelectIPAddress" %>
<asp:DropDownList ID="ddlIPAddresses" runat="server" CssClass="NormalTextBox"> <asp:DropDownList ID="ddlIPAddresses" runat="server" CssClass="TextBox200">
</asp:DropDownList> </asp:DropDownList>

View file

@ -1,16 +1,24 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by a tool. // This code was generated by a tool.
// Runtime Version:2.0.50727.42
// //
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
namespace WebsitePanel.Portal { namespace WebsitePanel.Portal {
public partial class SelectIPAddress { public partial class SelectIPAddress {
protected System.Web.UI.WebControls.DropDownList ddlIPAddresses;
/// <summary>
/// ddlIPAddresses 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 ddlIPAddresses;
} }
} }

View file

@ -28,7 +28,7 @@
</tr> </tr>
<tr> <tr>
<td class="Normal"> <td class="Normal">
<div class="Small" style="padding-top: 10px;"> <div class="Small WrapText" style="padding-top: 10px;">
<asp:Label ID="lblIgnoreGlobalDNSRecords" runat="server" meta:resourcekey="lblIPHelp2" Text="If you need your site..."></asp:Label> <asp:Label ID="lblIgnoreGlobalDNSRecords" runat="server" meta:resourcekey="lblIPHelp2" Text="If you need your site..."></asp:Label>
</div> </div>
</td> </td>

View file

@ -5536,6 +5536,7 @@
<Content Include="RDS\UserControls\App_LocalResources\RDSCollectionUsers.ascx.resx" /> <Content Include="RDS\UserControls\App_LocalResources\RDSCollectionUsers.ascx.resx" />
<Content Include="RDS\UserControls\App_LocalResources\RDSCollectionServers.ascx.resx" /> <Content Include="RDS\UserControls\App_LocalResources\RDSCollectionServers.ascx.resx" />
<Content Include="RDS\UserControls\App_LocalResources\RDSCollectionApps.ascx.resx" /> <Content Include="RDS\UserControls\App_LocalResources\RDSCollectionApps.ascx.resx" />
<Content Include="ProviderControls\App_LocalResources\RDS_Settings.ascx.resx" />
<EmbeddedResource Include="UserControls\App_LocalResources\EditDomainsList.ascx.resx"> <EmbeddedResource Include="UserControls\App_LocalResources\EditDomainsList.ascx.resx">
<SubType>Designer</SubType> <SubType>Designer</SubType>
</EmbeddedResource> </EmbeddedResource>