This commit is contained in:
vfedosevich 2014-12-08 04:29:39 -08:00
commit 1fbacb828c
101 changed files with 2617 additions and 1781 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) AND ItemID = @ItemID) AS CreatedMailboxes,
(SELECT COUNT(*) FROM ExchangeAccounts WHERE (AccountType = 10) AND ItemID = @ItemID) AS CreatedSharedMailboxes,
(SELECT COUNT(*) FROM ExchangeAccounts WHERE (AccountType = 5 OR AccountType = 6) 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) AND ItemID = @ItemID) AS CreatedMailboxes,
(SELECT COUNT(*) FROM ExchangeAccounts WHERE (AccountType = 10) AND ItemID = @ItemID) AS CreatedSharedMailboxes,
(SELECT COUNT(*) FROM ExchangeAccounts WHERE (AccountType = 5 OR AccountType = 6) 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
-- Domain lookup tasks -- Domain lookup tasks
IF NOT EXISTS (SELECT * FROM [dbo].[ScheduleTasks] WHERE [TaskID] = N'SCHEDULE_TASK_DOMAIN_LOOKUP') IF NOT EXISTS (SELECT * FROM [dbo].[ScheduleTasks] WHERE [TaskID] = N'SCHEDULE_TASK_DOMAIN_LOOKUP')

View file

@ -46,7 +46,10 @@ namespace WebsitePanel.Import.CsvBulk
{ {
Mailbox, Mailbox,
Contact, Contact,
User User,
Room,
Equipment,
SharedMailbox
} }
/// <summary> /// <summary>
@ -487,9 +490,12 @@ namespace WebsitePanel.Import.CsvBulk
if (!StringEquals(typeName, "Mailbox") && if (!StringEquals(typeName, "Mailbox") &&
!StringEquals(typeName, "Contact") && !StringEquals(typeName, "Contact") &&
!StringEquals(typeName, "User")) !StringEquals(typeName, "User")&&
!StringEquals(typeName, "Room")&&
!StringEquals(typeName, "Equipment")&&
!StringEquals(typeName, "SharedMailbox"))
{ {
Log.WriteError(string.Format("Error at line {0}: field 'Type' is invalid. Should be 'Mailbox' or 'Contact' or 'User'", index + 1)); Log.WriteError(string.Format("Error at line {0}: field 'Type' is invalid. Should be 'Mailbox' or 'Contact' or 'User' or 'Room' or 'Equipment' or 'SharedMailbox'", index + 1));
return false; return false;
} }
@ -524,7 +530,7 @@ namespace WebsitePanel.Import.CsvBulk
if (type == AccountTypes.Mailbox) if (type == AccountTypes.Mailbox)
{ {
//create mailbox using web service //create mailbox using web service
if (!CreateMailbox(index, orgId, displayName, emailAddress, password, firstName, middleName, lastName, if (!CreateMailbox(ExchangeAccountType.Mailbox, index, orgId, displayName, emailAddress, password, firstName, middleName, lastName,
address, city, state, zip, country, jobTitle, company, department, office, address, city, state, zip, country, jobTitle, company, department, office,
businessPhone, fax, homePhone, mobilePhone, pager, webPage, notes, planId)) businessPhone, fax, homePhone, mobilePhone, pager, webPage, notes, planId))
{ {
@ -532,6 +538,42 @@ namespace WebsitePanel.Import.CsvBulk
} }
totalMailboxes++; totalMailboxes++;
} }
if (type == AccountTypes.Room)
{
//create mailbox using web service
if (!CreateMailbox(ExchangeAccountType.Room, index, orgId, displayName, emailAddress, password, firstName, middleName, lastName,
address, city, state, zip, country, jobTitle, company, department, office,
businessPhone, fax, homePhone, mobilePhone, pager, webPage, notes, planId))
{
return false;
}
totalMailboxes++;
}
if (type == AccountTypes.Equipment)
{
//create mailbox using web service
if (!CreateMailbox(ExchangeAccountType.Equipment, index, orgId, displayName, emailAddress, password, firstName, middleName, lastName,
address, city, state, zip, country, jobTitle, company, department, office,
businessPhone, fax, homePhone, mobilePhone, pager, webPage, notes, planId))
{
return false;
}
totalMailboxes++;
}
if (type == AccountTypes.SharedMailbox)
{
//create mailbox using web service
if (!CreateMailbox(ExchangeAccountType.SharedMailbox, index, orgId, displayName, emailAddress, password, firstName, middleName, lastName,
address, city, state, zip, country, jobTitle, company, department, office,
businessPhone, fax, homePhone, mobilePhone, pager, webPage, notes, planId))
{
return false;
}
totalMailboxes++;
}
else if (type == AccountTypes.Contact) else if (type == AccountTypes.Contact)
{ {
//create contact using web service //create contact using web service
@ -561,7 +603,7 @@ namespace WebsitePanel.Import.CsvBulk
/// <summary> /// <summary>
/// Creates mailbox /// Creates mailbox
/// </summary> /// </summary>
private bool CreateMailbox(int index, int orgId, string displayName, string emailAddress, string password, string firstName, string middleName, string lastName, private bool CreateMailbox(ExchangeAccountType exchangeAccountType, int index, int orgId, string displayName, string emailAddress, string password, string firstName, string middleName, string lastName,
string address, string city, string state, string zip, string country, string jobTitle, string company, string department, string office, string address, string city, string state, string zip, string country, string jobTitle, string company, string department, string office,
string businessPhone, string fax, string homePhone, string mobilePhone, string pager, string webPage, string notes, int planId) string businessPhone, string fax, string homePhone, string mobilePhone, string pager, string webPage, string notes, int planId)
{ {
@ -574,7 +616,7 @@ namespace WebsitePanel.Import.CsvBulk
//create mailbox //create mailbox
//ES.Services.ExchangeServer. //ES.Services.ExchangeServer.
string accountName = string.Empty; string accountName = string.Empty;
int accountId = ES.Services.ExchangeServer.CreateMailbox(orgId, 0, ExchangeAccountType.Mailbox, accountName, displayName, name, domain, password, false, string.Empty, planId, -1, string.Empty, false); int accountId = ES.Services.ExchangeServer.CreateMailbox(orgId, 0, exchangeAccountType, accountName, displayName, name, domain, password, false, string.Empty, planId, -1, string.Empty, false);
if (accountId < 0) if (accountId < 0)
{ {
string errorMessage = GetErrorMessage(accountId); string errorMessage = GetErrorMessage(accountId);

View file

@ -37,14 +37,16 @@ namespace WebsitePanel.Import.Enterprise
this.txtOU = new System.Windows.Forms.TextBox(); this.txtOU = new System.Windows.Forms.TextBox();
this.lblOU = new System.Windows.Forms.Label(); this.lblOU = new System.Windows.Forms.Label();
this.grpOrganization = new System.Windows.Forms.GroupBox(); this.grpOrganization = new System.Windows.Forms.GroupBox();
this.cbMailboxPlan = new System.Windows.Forms.ComboBox();
this.lblMailnoxPlan = new System.Windows.Forms.Label();
this.btnSelectAll = new System.Windows.Forms.Button(); this.btnSelectAll = new System.Windows.Forms.Button();
this.btnDeselectAll = new System.Windows.Forms.Button(); this.btnDeselectAll = new System.Windows.Forms.Button();
this.rbCreateAndImport = new System.Windows.Forms.RadioButton(); this.rbCreateAndImport = new System.Windows.Forms.RadioButton();
this.rbImport = new System.Windows.Forms.RadioButton(); this.rbImport = new System.Windows.Forms.RadioButton();
this.lvUsers = new System.Windows.Forms.ListView(); this.lvUsers = new System.Windows.Forms.ListView();
this.columnHeader1 = new System.Windows.Forms.ColumnHeader(); this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader2 = new System.Windows.Forms.ColumnHeader(); this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader3 = new System.Windows.Forms.ColumnHeader(); this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.images = new System.Windows.Forms.ImageList(this.components); this.images = new System.Windows.Forms.ImageList(this.components);
this.txtOrgName = new System.Windows.Forms.TextBox(); this.txtOrgName = new System.Windows.Forms.TextBox();
this.lblOrgName = new System.Windows.Forms.Label(); this.lblOrgName = new System.Windows.Forms.Label();
@ -71,14 +73,14 @@ namespace WebsitePanel.Import.Enterprise
this.txtSpace.Location = new System.Drawing.Point(146, 12); this.txtSpace.Location = new System.Drawing.Point(146, 12);
this.txtSpace.Name = "txtSpace"; this.txtSpace.Name = "txtSpace";
this.txtSpace.ReadOnly = true; this.txtSpace.ReadOnly = true;
this.txtSpace.Size = new System.Drawing.Size(429, 20); this.txtSpace.Size = new System.Drawing.Size(426, 20);
this.txtSpace.TabIndex = 1; this.txtSpace.TabIndex = 1;
this.txtSpace.TextChanged += new System.EventHandler(this.OnDataChanged); this.txtSpace.TextChanged += new System.EventHandler(this.OnDataChanged);
// //
// btnBrowseSpace // btnBrowseSpace
// //
this.btnBrowseSpace.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnBrowseSpace.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnBrowseSpace.Location = new System.Drawing.Point(581, 10); this.btnBrowseSpace.Location = new System.Drawing.Point(578, 10);
this.btnBrowseSpace.Name = "btnBrowseSpace"; this.btnBrowseSpace.Name = "btnBrowseSpace";
this.btnBrowseSpace.Size = new System.Drawing.Size(24, 22); this.btnBrowseSpace.Size = new System.Drawing.Size(24, 22);
this.btnBrowseSpace.TabIndex = 2; this.btnBrowseSpace.TabIndex = 2;
@ -89,7 +91,7 @@ namespace WebsitePanel.Import.Enterprise
// btnBrowseOU // btnBrowseOU
// //
this.btnBrowseOU.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnBrowseOU.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btnBrowseOU.Location = new System.Drawing.Point(581, 36); this.btnBrowseOU.Location = new System.Drawing.Point(578, 36);
this.btnBrowseOU.Name = "btnBrowseOU"; this.btnBrowseOU.Name = "btnBrowseOU";
this.btnBrowseOU.Size = new System.Drawing.Size(24, 22); this.btnBrowseOU.Size = new System.Drawing.Size(24, 22);
this.btnBrowseOU.TabIndex = 5; this.btnBrowseOU.TabIndex = 5;
@ -104,7 +106,7 @@ namespace WebsitePanel.Import.Enterprise
this.txtOU.Location = new System.Drawing.Point(146, 38); this.txtOU.Location = new System.Drawing.Point(146, 38);
this.txtOU.Name = "txtOU"; this.txtOU.Name = "txtOU";
this.txtOU.ReadOnly = true; this.txtOU.ReadOnly = true;
this.txtOU.Size = new System.Drawing.Size(429, 20); this.txtOU.Size = new System.Drawing.Size(426, 20);
this.txtOU.TabIndex = 4; this.txtOU.TabIndex = 4;
this.txtOU.TextChanged += new System.EventHandler(this.OnDataChanged); this.txtOU.TextChanged += new System.EventHandler(this.OnDataChanged);
// //
@ -121,6 +123,8 @@ namespace WebsitePanel.Import.Enterprise
this.grpOrganization.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) this.grpOrganization.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.grpOrganization.Controls.Add(this.cbMailboxPlan);
this.grpOrganization.Controls.Add(this.lblMailnoxPlan);
this.grpOrganization.Controls.Add(this.btnSelectAll); this.grpOrganization.Controls.Add(this.btnSelectAll);
this.grpOrganization.Controls.Add(this.btnDeselectAll); this.grpOrganization.Controls.Add(this.btnDeselectAll);
this.grpOrganization.Controls.Add(this.rbCreateAndImport); this.grpOrganization.Controls.Add(this.rbCreateAndImport);
@ -132,14 +136,33 @@ namespace WebsitePanel.Import.Enterprise
this.grpOrganization.Controls.Add(this.lblOrgId); this.grpOrganization.Controls.Add(this.lblOrgId);
this.grpOrganization.Location = new System.Drawing.Point(15, 67); this.grpOrganization.Location = new System.Drawing.Point(15, 67);
this.grpOrganization.Name = "grpOrganization"; this.grpOrganization.Name = "grpOrganization";
this.grpOrganization.Size = new System.Drawing.Size(590, 328); this.grpOrganization.Size = new System.Drawing.Size(587, 328);
this.grpOrganization.TabIndex = 6; this.grpOrganization.TabIndex = 6;
this.grpOrganization.TabStop = false; this.grpOrganization.TabStop = false;
// //
// cbMailboxPlan
//
this.cbMailboxPlan.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.cbMailboxPlan.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbMailboxPlan.FormattingEnabled = true;
this.cbMailboxPlan.Location = new System.Drawing.Point(155, 74);
this.cbMailboxPlan.Name = "cbMailboxPlan";
this.cbMailboxPlan.Size = new System.Drawing.Size(415, 21);
this.cbMailboxPlan.TabIndex = 10;
//
// lblMailnoxPlan
//
this.lblMailnoxPlan.Location = new System.Drawing.Point(19, 74);
this.lblMailnoxPlan.Name = "lblMailnoxPlan";
this.lblMailnoxPlan.Size = new System.Drawing.Size(130, 23);
this.lblMailnoxPlan.TabIndex = 9;
this.lblMailnoxPlan.Text = "Default mailbox plan :";
//
// btnSelectAll // btnSelectAll
// //
this.btnSelectAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnSelectAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnSelectAll.Location = new System.Drawing.Point(417, 282); this.btnSelectAll.Location = new System.Drawing.Point(414, 282);
this.btnSelectAll.Name = "btnSelectAll"; this.btnSelectAll.Name = "btnSelectAll";
this.btnSelectAll.Size = new System.Drawing.Size(75, 23); this.btnSelectAll.Size = new System.Drawing.Size(75, 23);
this.btnSelectAll.TabIndex = 7; this.btnSelectAll.TabIndex = 7;
@ -150,7 +173,7 @@ namespace WebsitePanel.Import.Enterprise
// btnDeselectAll // btnDeselectAll
// //
this.btnDeselectAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnDeselectAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnDeselectAll.Location = new System.Drawing.Point(498, 282); this.btnDeselectAll.Location = new System.Drawing.Point(495, 282);
this.btnDeselectAll.Name = "btnDeselectAll"; this.btnDeselectAll.Name = "btnDeselectAll";
this.btnDeselectAll.Size = new System.Drawing.Size(75, 23); this.btnDeselectAll.Size = new System.Drawing.Size(75, 23);
this.btnDeselectAll.TabIndex = 8; this.btnDeselectAll.TabIndex = 8;
@ -197,10 +220,10 @@ namespace WebsitePanel.Import.Enterprise
this.columnHeader3}); this.columnHeader3});
this.lvUsers.FullRowSelect = true; this.lvUsers.FullRowSelect = true;
this.lvUsers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; this.lvUsers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
this.lvUsers.Location = new System.Drawing.Point(19, 74); this.lvUsers.Location = new System.Drawing.Point(19, 108);
this.lvUsers.MultiSelect = false; this.lvUsers.MultiSelect = false;
this.lvUsers.Name = "lvUsers"; this.lvUsers.Name = "lvUsers";
this.lvUsers.Size = new System.Drawing.Size(554, 202); this.lvUsers.Size = new System.Drawing.Size(551, 167);
this.lvUsers.SmallImageList = this.images; this.lvUsers.SmallImageList = this.images;
this.lvUsers.TabIndex = 4; this.lvUsers.TabIndex = 4;
this.lvUsers.UseCompatibleStateImageBehavior = false; this.lvUsers.UseCompatibleStateImageBehavior = false;
@ -209,17 +232,17 @@ namespace WebsitePanel.Import.Enterprise
// columnHeader1 // columnHeader1
// //
this.columnHeader1.Text = "Name"; this.columnHeader1.Text = "Name";
this.columnHeader1.Width = 229; this.columnHeader1.Width = 238;
// //
// columnHeader2 // columnHeader2
// //
this.columnHeader2.Text = "Email"; this.columnHeader2.Text = "Email";
this.columnHeader2.Width = 163; this.columnHeader2.Width = 166;
// //
// columnHeader3 // columnHeader3
// //
this.columnHeader3.Text = "Type"; this.columnHeader3.Text = "Type";
this.columnHeader3.Width = 152; this.columnHeader3.Width = 124;
// //
// images // images
// //
@ -235,7 +258,7 @@ namespace WebsitePanel.Import.Enterprise
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.txtOrgName.Location = new System.Drawing.Point(155, 45); this.txtOrgName.Location = new System.Drawing.Point(155, 45);
this.txtOrgName.Name = "txtOrgName"; this.txtOrgName.Name = "txtOrgName";
this.txtOrgName.Size = new System.Drawing.Size(418, 20); this.txtOrgName.Size = new System.Drawing.Size(415, 20);
this.txtOrgName.TabIndex = 3; this.txtOrgName.TabIndex = 3;
// //
// lblOrgName // lblOrgName
@ -253,7 +276,7 @@ namespace WebsitePanel.Import.Enterprise
this.txtOrgId.Location = new System.Drawing.Point(155, 19); this.txtOrgId.Location = new System.Drawing.Point(155, 19);
this.txtOrgId.Name = "txtOrgId"; this.txtOrgId.Name = "txtOrgId";
this.txtOrgId.ReadOnly = true; this.txtOrgId.ReadOnly = true;
this.txtOrgId.Size = new System.Drawing.Size(418, 20); this.txtOrgId.Size = new System.Drawing.Size(415, 20);
this.txtOrgId.TabIndex = 1; this.txtOrgId.TabIndex = 1;
// //
// lblOrgId // lblOrgId
@ -267,7 +290,7 @@ namespace WebsitePanel.Import.Enterprise
// btnStart // btnStart
// //
this.btnStart.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnStart.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnStart.Location = new System.Drawing.Point(527, 461); this.btnStart.Location = new System.Drawing.Point(524, 461);
this.btnStart.Name = "btnStart"; this.btnStart.Name = "btnStart";
this.btnStart.Size = new System.Drawing.Size(75, 23); this.btnStart.Size = new System.Drawing.Size(75, 23);
this.btnStart.TabIndex = 9; this.btnStart.TabIndex = 9;
@ -281,7 +304,7 @@ namespace WebsitePanel.Import.Enterprise
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.progressBar.Location = new System.Drawing.Point(15, 427); this.progressBar.Location = new System.Drawing.Point(15, 427);
this.progressBar.Name = "progressBar"; this.progressBar.Name = "progressBar";
this.progressBar.Size = new System.Drawing.Size(587, 23); this.progressBar.Size = new System.Drawing.Size(584, 23);
this.progressBar.TabIndex = 8; this.progressBar.TabIndex = 8;
// //
// lblMessage // lblMessage
@ -290,14 +313,14 @@ namespace WebsitePanel.Import.Enterprise
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.lblMessage.Location = new System.Drawing.Point(12, 401); this.lblMessage.Location = new System.Drawing.Point(12, 401);
this.lblMessage.Name = "lblMessage"; this.lblMessage.Name = "lblMessage";
this.lblMessage.Size = new System.Drawing.Size(593, 23); this.lblMessage.Size = new System.Drawing.Size(590, 23);
this.lblMessage.TabIndex = 7; this.lblMessage.TabIndex = 7;
// //
// ApplicationForm // ApplicationForm
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(617, 496); this.ClientSize = new System.Drawing.Size(614, 496);
this.Controls.Add(this.lblMessage); this.Controls.Add(this.lblMessage);
this.Controls.Add(this.progressBar); this.Controls.Add(this.progressBar);
this.Controls.Add(this.btnStart); this.Controls.Add(this.btnStart);
@ -346,6 +369,8 @@ namespace WebsitePanel.Import.Enterprise
private System.Windows.Forms.RadioButton rbImport; private System.Windows.Forms.RadioButton rbImport;
internal System.Windows.Forms.Button btnSelectAll; internal System.Windows.Forms.Button btnSelectAll;
internal System.Windows.Forms.Button btnDeselectAll; internal System.Windows.Forms.Button btnDeselectAll;
private System.Windows.Forms.ComboBox cbMailboxPlan;
private System.Windows.Forms.Label lblMailnoxPlan;
} }
} }

View file

@ -1,4 +1,4 @@
// Copyright (c) 2011, Outercurve Foundation. // Copyright (c) 2014, Outercurve Foundation.
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without modification, // Redistribution and use in source and binary forms, with or without modification,
@ -129,6 +129,30 @@ namespace WebsitePanel.Import.Enterprise
} }
} }
private void BindMailboxPlans(string orgId)
{
cbMailboxPlan.Items.Clear();
cbMailboxPlan.Items.Add("<not set>");
cbMailboxPlan.SelectedIndex = 0;
Organization org = OrganizationController.GetOrganizationById(orgId);
if (org == null)
{
List<Organization> orgs = ExchangeServerController.GetExchangeOrganizations(1, false);
if (orgs.Count > 0)
org = orgs[0];
}
if (org != null)
{
int itemId = org.Id;
List<ExchangeMailboxPlan> plans = ExchangeServerController.GetExchangeMailboxPlans(itemId, false);
cbMailboxPlan.Items.AddRange(plans.ToArray());
}
}
private void LoadOrganizationData(DirectoryEntry parent) private void LoadOrganizationData(DirectoryEntry parent)
{ {
string orgId = (string)parent.Properties["name"].Value; string orgId = (string)parent.Properties["name"].Value;
@ -147,6 +171,9 @@ namespace WebsitePanel.Import.Enterprise
rbImport.Checked = false; rbImport.Checked = false;
txtOrgName.Text = orgId; txtOrgName.Text = orgId;
} }
BindMailboxPlans(orgId);
LoadOrganizationAccounts(parent); LoadOrganizationAccounts(parent);
} }
@ -164,13 +191,38 @@ namespace WebsitePanel.Import.Enterprise
type = null; type = null;
email = null; email = null;
name = (string)child.Properties["name"].Value; name = (string)child.Properties["name"].Value;
//account type //account type
typeProp = child.Properties["msExchRecipientDisplayType"]; typeProp = child.Properties["msExchRecipientDisplayType"];
int typeDetails = 0;
PropertyValueCollection typeDetailsProp = child.Properties["msExchRecipientTypeDetails"];
if (typeDetailsProp != null)
{
if (typeDetailsProp.Value != null)
{
try
{
object adsLargeInteger = typeDetailsProp.Value;
typeDetails = (Int32)adsLargeInteger.GetType().InvokeMember("LowPart", System.Reflection.BindingFlags.GetProperty, null, adsLargeInteger, null);
}
catch { } // just skip
}
}
switch (child.SchemaClassName) switch (child.SchemaClassName)
{ {
case "user": case "user":
email = (string)child.Properties["userPrincipalName"].Value; email = (string)child.Properties["userPrincipalName"].Value;
if (typeDetails == 4)
{
type = "Shared Mailbox";
}
else
{
if (typeProp == null || typeProp.Value == null) if (typeProp == null || typeProp.Value == null)
{ {
type = "User"; type = "User";
@ -191,6 +243,7 @@ namespace WebsitePanel.Import.Enterprise
type = "Equipment Mailbox"; type = "Equipment Mailbox";
break; break;
} }
}
} }
if (!string.IsNullOrEmpty(type)) if (!string.IsNullOrEmpty(type))
{ {
@ -300,6 +353,16 @@ namespace WebsitePanel.Import.Enterprise
Global.OrganizationName = txtOrgName.Text; Global.OrganizationName = txtOrgName.Text;
Global.ImportAccountsOnly = rbImport.Checked; Global.ImportAccountsOnly = rbImport.Checked;
Global.HasErrors = false; Global.HasErrors = false;
Global.defaultMailboxPlanId = 0;
if (cbMailboxPlan.SelectedItem!=null)
{
ExchangeMailboxPlan plan = cbMailboxPlan.SelectedItem as ExchangeMailboxPlan;
if (plan != null)
Global.defaultMailboxPlanId = plan.MailboxPlanId;
}
importer.Initialize(this.username, this); importer.Initialize(this.username, this);
importer.Start(); importer.Start();

View file

@ -112,79 +112,79 @@
<value>2.0</value> <value>2.0</value>
</resheader> </resheader>
<resheader name="reader"> <resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.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>
<metadata name="images.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="images.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value> <value>17, 17</value>
</metadata> </metadata>
<data name="images.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64"> <data name="images.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value> <value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABM ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABI
DQAAAk1TRnQBSQFMAgEBAwEAAQwBAAEMAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA DQAAAk1TRnQBSQFMAgEBAwEAAVwBAAFcAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABEAMAAQEBAAEgBgABEGIAAa0BsgG1Af8BrQGuAa0B/wGtAa4BrQH/AaUBpgGlAf8BnAGeAaUB/wGc AwABEAMAAQEBAAEgBgABEGIAAa0BsgG1Af8BrQGuAa0B/wGtAa4BrQH/AaUBpgGlAf8BnAGeAaUB/wGc
AZoBnAH/AZQBlgGUAf8BjAGOAZQB/wGMAYoBjAH/IAABrQGyAbUB/wGtAa4BrQH/Aa0BrgGtAf8BpQGm AZoBnAH/AZQBlgGUAf8BjAGOAZQB/wGMAYoBjAH/IAABrQGyAbUB/wGtAa4BrQH/Aa0BrgGtAf8BpQGm
AaUB/wGcAZ4BpQH/AZwBmgGcAf8BlAGWAZQB/wGMAY4BlAH/AYwBigGMAf8BjAFtAWcB/1AAAxgBIQNN AaUB/wGcAZ4BpQH/AZwBmgGcAf8BlAGWAZQB/wGMAY4BlAH/AYwBigGMAf8BjAFjAV0B/1AAAxgBIQNN
AZEDWAHBA2EB5gFqAWMBVwH8A2EB5gNYAcEDTAGQAygBPSAAAa0BsgG1Hf8BlAGWAZQB/yAAAa0BsgG1 AZEDWAHBA2EB5gFgAVkBRQH8A2EB5gNYAcEDTAGQAygBPSAAAa0BsgG1Hf8BlAGWAZQB/yAAAa0BsgG1
Hf8BlAGWAZQB/wG1AZIBZwH/AYQBaQFfAf9IAAMDAQQDXAHNAagBkwFHAf0B5gHLAbQB/wHeAbcBkAH/ Hf8BlAGWAZQB/wG1AZIBXQH/AYQBXwFVAf9IAAMDAQQDXAHNAagBkwFAAf0B5gHLAbQB/wHeAbcBkAH/
AeMBuwGUAf8B4AG6AZQB/wHOAasBiAH/AbgBmQFcAf8DWgHFIAABrQGyAbUF/wHvAesB5wH/Ac4BywHO AeMBuwGUAf8B4AG6AZQB/wHOAasBiAH/AbgBmQFSAf8DWgHFIAABrQGyAbUF/wHvAesB5wH/Ac4BywHO
Af8BvQG6Ab0B/wG1AbIBtQn/AZQBkgGUAf8gAAGtAbIBtQX/Ae8B6wHnAf8BzgHLAc4B/wG9AboBvQH/ Af8BvQG6Ab0B/wG1AbIBtQn/AZQBkgGUAf8gAAGtAbIBtQX/Ae8B6wHnAf8BzgHLAc4B/wG9AboBvQH/
AbUBsgG1Cf8BlAGSAZQB/wHGAZ4BbwH/AYwBbQFfAf9IAAMEAQUDWQG+AcYBpQGFAf8B5gHQAb0B/wHi AbUBsgG1Cf8BlAGSAZQB/wHGAZ4BZQH/AYwBYwFVAf9IAAMEAQUDWQG+AcYBpQGFAf8B5gHQAb0B/wHi
Ab0BnAH/AeYBvwGXAf8B6AHDAZ8B/wHbAboBmAH/AcABnwFfAf8DXAHMEAABvQHDAbUB/wE8ATsBPAH/ Ab0BnAH/AeYBvwGXAf8B6AHDAZ8B/wHbAboBmAH/AcABnwFVAf8DXAHMEAABvQHDAbUB/wEyATEBMgH/
ATwBOwE8Af8BPAE7ATwB/wGtAbIBtRX/ATwBOwH3Af8BIwEmAdYB/wGUAZIBlAH/ATwBOwE8Af8BPAE7 ATIBMQEyAf8BMgExATIB/wGtAbIBtRX/ATIBMQH3Af8BGQEcAdYB/wGUAZIBlAH/ATIBMQEyAf8BMgEx
ATwB/wE8ATsBPAH/CAABVwGOAW8B/wFGAYoBZwH/AU4BigFnAf8BrQGyAbUV/wE+AT0B9wH/ASUBKAHW ATIB/wEyATEBMgH/CAABTQGOAWUB/wE8AYoBXQH/AUQBigFdAf8BrQGyAbUV/wE0ATMB9wH/ARsBHgHW
Af8BlAGSAZQB/wHeAbIBhAH/AZwBkgGEAf9LAAEBA1MBqgHZAbEBkAH/AeYB1AHBAf8B8wHSAbMB/wHq Af8BlAGSAZQB/wHeAbIBhAH/AZwBkgGEAf9LAAEBA1MBqgHZAbEBkAH/AeYB1AHBAf8B8wHSAbMB/wHq
AcEBmAH/Ae0BzAGqAf8B4AHCAaQB/wHDAaMBggH/A14B3RAAAb0BwwG1C/8B9wH/Aa0BugG1Ff8BpQGi AcEBmAH/Ae0BzAGqAf8B4AHCAaQB/wHDAaMBggH/A14B3RAAAb0BwwG1C/8B9wH/Aa0BugG1Ff8BpQGi
AfcB/wGMAY4B3gH/AZQBkgGUAf8B7wHjAdYC/wH3Ae8B/wGcAZ4BlAH/BAABVwG6AYwB/wFfAcsBnAH/ AfcB/wGMAY4B3gH/AZQBkgGUAf8B7wHjAdYC/wH3Ae8B/wGcAZ4BlAH/BAABTQG6AYwB/wFVAcsBnAH/
AU4BugGMAf8BhAHHAaUB/wGtAboBtRX/AaUBogH3Af8BjAGOAd4B/wGUAZIBlAH/Ac4BpgFvAf9MAAMB AUQBugGMAf8BhAHHAaUB/wGtAboBtRX/AaUBogH3Af8BjAGOAd4B/wGUAZIBlAH/Ac4BpgFlAf9MAAMB
AQIDAQECA2UB5QHQAcMBsgH/AcgBwwG7Af8B1wG3AZcB/wHrAcQBnQH/AeEBvgGbAf8BzgGmAV8B/wNN AQIDAQECA2UB5QHQAcMBsgH/AcgBwwG7Af8B1wG3AZcB/wHrAcQBnQH/AeEBvgGbAf8BzgGmAVUB/wNN
AZEQAAG9AcMBtQX/AfcB7wHnAf8B9wHvAecB/wGtAboBtQH/Aa0BsgG1Af8BrQGyAa0B/wGlAa4BrQH/ AZEQAAG9AcMBtQX/AfcB7wHnAf8B9wHvAecB/wGtAboBtQH/Aa0BsgG1Af8BrQGyAa0B/wGlAa4BrQH/
AaUBpgGlAf8BnAGiAZwB/wGcAZ4BlAH/AZwBlgGUAf8BlAGWAZQB/wH3Ae8B5wH/AfcB7wHnAf8BnAGe AaUBpgGlAf8BnAGiAZwB/wGcAZ4BlAH/AZwBlgGUAf8BlAGWAZQB/wH3Ae8B5wH/AfcB7wHnAf8BnAGe
AZQB/wQAAW8BwwGlAf8BZwG6AZQB/wFGAa4BhAH/AcYB4wHOAf8BrQG6AbUB/wGtAbIBtQH/Aa0BsgGt AZQB/wQAAWUBwwGlAf8BXQG6AZQB/wE8Aa4BhAH/AcYB4wHOAf8BrQG6AbUB/wGtAbIBtQH/Aa0BsgGt
Af8BpQGuAa0B/wGlAaYBpQH/AZwBogGcAf8BnAGeAZwB/wGcAZYBlAH/AZQBkgGUAf9XAAEBAx8BLQNc Af8BpQGuAa0B/wGlAaYBpQH/AZwBogGcAf8BnAGeAZwB/wGcAZYBlAH/AZQBkgGUAf9XAAEBAx8BLQNc
AckBAAErAVwB/wEvAUkBgwH/AcYBpgGHAf8DYQHuA04BmAMHAQoQAAG9AcMBtQX/Ae8B3wHWAf8B1gG+ AckBAAEhAVIB/wElAT8BgwH/AcYBpgGHAf8DYQHuA04BmAMHAQoQAAG9AcMBtQX/Ae8B3wHWAf8B1gG+
Aa0B/wHGAbIBpQH/AcYBsgGlAf8BzgG6AaUB/wHnAd8B1gH/AfcB7wHnAf8B9wHvAecB/wH3Ae8B5wH/ Aa0B/wHGAbIBpQH/AcYBsgGlAf8BzgG6AaUB/wHnAd8B1gH/AfcB7wHnAf8B9wHvAecB/wH3Ae8B5wH/
AfcB7wHnAf8B9wHvAecB/wH3Ae8B5wH/AfcB7wHnAf8BnAGeAZQB/wQAAYQBwwGlAf8BbwHPAaUB/wFX AfcB7wHnAf8B9wHvAecB/wH3Ae8B5wH/AfcB7wHnAf8BnAGeAZQB/wQAAYQBwwGlAf8BZQHPAaUB/wFN
AboBjAH/Ab0B1wHOAf8BpQHDAbUB/wFOAaYBbwH/ASUBhgFGAf8BVwGGAYQB/wE2AVEBhAH/AQABMAFn AboBjAH/Ab0B1wHOAf8BpQHDAbUB/wFEAaYBZQH/ARsBhgE8Af8BTQGGAYQB/wEsAUcBhAH/AQABJgFd
Af8BDAE9AW8B/wG9AaoBlAH/VwABAQMAAQEDEAEWA1ABmgEQATUBXAH/AQcBMQFcAf8DVQG1Az8BbAQA Af8BAgEzAWUB/wG9AaoBlAH/VwABAQMAAQEDEAEWA1ABmgEGASsBUgH/AQABJwFSAf8DVQG1Az8BbAQA
AwIBAxAAAb0BwwG1Bf8BxgGuAZwR/wHWAb4BrQH/AfcB7wHnAf8B9wHvAecB/wH3Ae8B5wH/AfcB7wHn AwIBAxAAAb0BwwG1Bf8BxgGuAZwR/wHWAb4BrQH/AfcB7wHnAf8B9wHvAecB/wH3Ae8B5wH/AfcB7wHn
Af8B9wHvAecB/wH3Ae8B5wH/AfcB7wHnAf8BnAGeAZQB/wgAAYwB2wGlAf8BVwGqAZQB/wFXAYIBvQH/ Af8B9wHvAecB/wH3Ae8B5wH/AfcB7wHnAf8BnAGeAZQB/wgAAYwB2wGlAf8BTQGqAZQB/wFNAYIBvQH/
AT4BXQFvAf8BVwGWAV8B/wGMAbYBpQH/ATYBYQGcAf8BLQFZAZQB/wE2AV0BjAH/AR0BRQFvAf9YAAMD ATQBUwFlAf8BTQGWAVUB/wGMAbYBpQH/ASwBVwGcAf8BIwFPAZQB/wEsAVMBjAH/ARMBOwFlAf9YAAMD
AQQDAgEDAyEBMAFYAl8B4wEsAVMBmwH/AScBTAGTAf8BFQE7AYEB/wMkATYYAAG9AcMBtQL/AvcB/wHG AQQDAgEDAyEBMAFYAl8B4wEiAUkBmwH/AR0BQgGTAf8BCwExAYEB/wMkATYYAAG9AcMBtQL/AvcB/wHG
Aa4BnBH/Ad4BwwG9Af8B9wHvAecB/wHGAbIBpQH/AcYBsgGlAf8BxgGyAaUB/wHGAbIBpQH/AcYBsgGl Aa4BnBH/Ad4BwwG9Af8B9wHvAecB/wHGAbIBpQH/AcYBsgGlAf8BxgGyAaUB/wHGAbIBpQH/AcYBsgGl
Af8B9wHvAecB/wGcAZ4BlAH/DAABNgFpAW8B/wFXAYIBvQH/AT4BXQFvAf8D9wH/A/cB/wFvAZ4BxgH/ Af8B9wHvAecB/wGcAZ4BlAH/DAABLAFfAWUB/wFNAYIBvQH/ATQBUwFlAf8D9wH/A/cB/wFlAZ4BxgH/
AVcBigG1Af8BRgFxAaUB/wE2AV0BjAH/WAADBAEGBAADRwGCA2IB9gFKAZABtgH/ATsBgQGnAf8BIQFJ AU0BigG1Af8BPAFnAaUB/wEsAVMBjAH/WAADBAEGBAADRwGCA2IB9gFAAZABtgH/ATEBgQGnAf8BFwE/
AZAB/wNSAaEDBQEHFAABvQHDAbUC/wL3Af8BzgG6AaUR/wHeAcMBvQH/AfcB7wHnAf8B1gHDAbUB/wHW AZAB/wNSAaEDBQEHFAABvQHDAbUC/wL3Af8BzgG6AaUR/wHeAcMBvQH/AfcB7wHnAf8B1gHDAbUB/wHW
AccBvQH/AdYBxwG9Af8B1gHHAb0B/wHWAcMBtQH/AfcB7wHnAf8BnAGeAZQB/wgAAWcBhgGUAf8BPgFt AccBvQH/AdYBxwG9Af8B1gHHAb0B/wHWAcMBtQH/AfcB7wHnAf8BnAGeAZQB/wgAAV0BhgGUAf8BNAFj
AZwB/wGMAbIB3gH/AYQBqgHWAf8BVwFlAYQB/wGMAZYBpQH/AZQBugHeAf8BhAGuAdYB/wFXAZIBvQH/ AZwB/wGMAbIB3gH/AYQBqgHWAf8BTQFbAYQB/wGMAZYBpQH/AZQBugHeAf8BhAGuAdYB/wFNAZIBvQH/
AS0BWQGMAf8BXwFlAWcB/1QAAwQBBgMAAQEDPwFsAVwBbwF2AfgBggGoAc4B/wFKAZEBuAH/ASwBTgGS ASMBTwGMAf8BVQFbAV0B/1QAAwQBBgMAAQEDPwFsAVwBXQFrAfgBggGoAc4B/wFAAZEBuAH/ASIBRAGS
Af8BEQEhATEB/wMkATUUAAG9AcMBtQP/AfcB/wHOAcMBtRH/AdYBxwG9Af8B9wHvAecB/wHWAcMBtQH/ Af8BBwEXAScB/wMkATUUAAG9AcMBtQP/AfcB/wHOAcMBtRH/AdYBxwG9Af8B9wHvAecB/wHWAcMBtQH/
AdYBwwG1Af8B1gHDAbUB/wHWAccBvQH/AdYBwwG1Av8B9wHvAf8BnAGeAZQB/wgAAU4BjgGlAf8BlAG2 AdYBwwG1Af8B1gHDAbUB/wHWAccBvQH/AdYBwwG1Av8B9wHvAf8BnAGeAZQB/wgAAUQBjgGlAf8BlAG2
Ad4B/wG1AdsC/wGlAc8C/wFXAXEBnAH/AaUBtgHGAf8BvQHbAv8BnAHHAe8B/wFfAZ4BzgH/AS0BOQFG Ad4B/wG1AdsC/wGlAc8C/wFNAWcBnAH/AaUBtgHGAf8BvQHbAv8BnAHHAe8B/wFVAZ4BzgH/ASMBLwE8
Af8BLQEsASUB/1QAAwEBAgMAAQEBwwHQAdoB/wFqAXoBhAH5AZsBvwHlAf8BUwGdAccB/wErAT8BVAH/ Af8BIwEiARsB/1QAAwEBAgMAAQEBwwHQAdoB/wJqAXEB+QGbAb8B5QH/AUkBnQHHAf8BIQE1AUoB/wEJ
ARMBDwEMAf8DMgFQFAABvQHDAbUF/wHvAd8B1gH/AcYBsgGlAf8BxgGyAaUB/wHGAbIBpQH/AcYBrgGc AQUBAgH/AzIBUBQAAb0BwwG1Bf8B7wHfAdYB/wHGAbIBpQH/AcYBsgGlAf8BxgGyAaUB/wHGAa4BnAH/
Af8B7wHfAdYB/wH3Ae8B5wH/AcYBsgGlAf8BxgGyAaUB/wHGAbIBpQH/AcYBsgGlAf8BxgGyAaUC/wH3 Ae8B3wHWAf8B9wHvAecB/wHGAbIBpQH/AcYBsgGlAf8BxgGyAaUB/wHGAbIBpQH/AcYBsgGlAv8B9wHv
Ae8B/wGcAZYBlAH/CAABXwGeAb0B/wGtAc8B5wH/Ad4B+wL/AaUBywH3Af8BXwGeAc4B/wHeAecB7wH/ Af8BnAGWAZQB/wgAAVUBngG9Af8BrQHPAecB/wHeAfsC/wGlAcsB9wH/AVUBngHOAf8B3gHnAe8B/wGt
Aa0BvgHWAf8BhAGeAb0B/wFXAYIBnAH/AS0BLAEtAf8BRgFBAT4B/1cAAQEIAAJZAVwB9QFfAZIBpgH/ Ab4B1gH/AYQBngG9Af8BTQGCAZwB/wEjASIBIwH/ATwBNwE0Af9XAAEBCAADWQH1AVUBkgGmAf8BPwFS
AUkBXAGOAf8BLwEyATYB/wEZARgBFwH/AyQBNRQAAb0BwwG1Bf8B9wHvAecC/wHvAecB/wH3Ae8B5wL/ AY4B/wElASgBLAH/AQ8BDgENAf8DJAE1FAABvQHDAbUF/wH3Ae8B5wL/Ae8B5wH/AfcB7wHnAv8B9wHv
AfcB7wH/AfcB7wHnAf8B9wHvAecH/wH3Av8C9wH/A/cB/wH3AfMB7wH/AfcB7wHnA/8B9wH/AZwBngGU Af8B9wHvAecB/wH3Ae8B5wf/AfcC/wL3Af8D9wH/AfcB8wHvAf8B9wHvAecD/wH3Af8BnAGeAZQB/wgA
Af8IAAFvAaoBvQH/AWcBrgHGAf8BnAHDAc4B/wGUAbYB3gH/AUYBaQGcAf8EAAHGAb4BvQH/AYQBcQFv AWUBqgG9Af8BXQGuAcYB/wGcAcMBzgH/AZQBtgHeAf8BPAFfAZwB/wQAAcYBvgG9Af8BhAFnAWUB/wFN
Af8BVwFVAU4B/wFXAVEBTgH/XwABAQQAA0wBkgNiAekBQwE/ATwB/ANZAfIDUQGcAwQBBRQAAb0BwwG1 AUsBRAH/AU0BRwFEAf9fAAEBBAADTAGSA2IB6QE3ATUBMgH8A1kB8gNRAZwDBAEFFAABvQHDAbUd/wGc
Hf8BnAGeAZQB/wG9Ab4BtQH/Ab0BvgG1Af8BvQHDAbUB/wG9Ab4BtQH/Ab0BvgG1Af8BvQG+AbUB/wG9 AZ4BlAH/Ab0BvgG1Af8BvQG+AbUB/wG9AcMBtQH/Ab0BvgG1Af8BvQG+AbUB/wG9Ab4BtQH/Ab0BvgG1
Ab4BtQH/CAABrQHDAcYB/wGEAccB1gH/AVcBngG1Af8BTgGWAbUB/wEtAV0BbwH/bAADCgENBAADCgEN Af8IAAGtAcMBxgH/AYQBxwHWAf8BTQGeAbUB/wFEAZYBtQH/ASMBUwFlAf9sAAMKAQ0EAAMKAQ0EAAMV
BAADFQEdAygBPAMeASscAAG9AcMBtQH/Ab0BwwG1Af8BvQHDAbUB/wG9AcMBtQH/Ab0BwwG1Af8BvQHD AR0DKAE8Ax4BKxwAAb0BwwG1Af8BvQHDAbUB/wG9AcMBtQH/Ab0BwwG1Af8BvQHDAbUB/wG9AcMBtQH/
AbUB/wG9AcMBtQH/Ab0BwwG1Af8BvQHDAbUB/ygAAc4C7wH/AaUB4wH3Af8BhAHLAdYB/wFvAbIBvQH/ Ab0BwwG1Af8BvQHDAbUB/wG9AcMBtQH/KAABzgLvAf8BpQHjAfcB/wGEAcsB1gH/AWUBsgG9Af//AGUA
/wBlAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEBAQABAQUAAYAXAAP/AQAC/wHwAQcB+AEBAgAB4AEP AUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEBBQABgBcAA/8BAAL/AfABBwH4AQECAAHgAQ8B8AEH
AfABBwH4AwABwAEPAfABBwH4AwABwAEPAgABwAMAAcABDwIAAYABAQIAAcABDwIAAYABAwIAAeABDwIA AfgDAAHAAQ8B8AEHAfgDAAHAAQ8CAAHAAwABwAEPAgABgAEBAgABwAEPAgABgAEDAgAB4AEPAgABgAEH
AYABBwIAAcABLwIAAcABDwIAAcABPwIAAeABDwIAAdABHwIAAcABBwIAAcABHwIAAcABBwIAAcABHwIA AgABwAEvAgABwAEPAgABwAE/AgAB4AEPAgAB0AEfAgABwAEHAgABwAEfAgABwAEHAgABwAEfAgABwAEH
AcABBwIAAdgBHwIAAcEBDwIAAegBHwIAAcEB/wIAAdQBfwEAAX8B4QH/AgAG/wIACw== AgAB2AEfAgABwQEPAgAB6AEfAgABwQH/AgAB1AF/AQABfwHhAf8CAAb/AgAL
</value> </value>
</data> </data>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
AAABAAoAAAAAAAEACADKTwAApgAAADAwAAABAAgAqA4AAHBQAAAgIAAAAQAIAKgIAAAYXwAAGBgAAAEA AAABAAoAAAAAAAEACADKTwAApgAAADAwAAABAAgAqA4AAHBQAAAgIAAAAQAIAKgIAAAYXwAAGBgAAAEA

View file

@ -81,6 +81,7 @@ namespace WebsitePanel.Import.Enterprise
public static string ErrorMessage; public static string ErrorMessage;
public static bool ImportAccountsOnly; public static bool ImportAccountsOnly;
public static bool HasErrors; public static bool HasErrors;
public static int defaultMailboxPlanId;
} }
} }

View file

@ -51,7 +51,6 @@ namespace WebsitePanel.Import.Enterprise
private ProgressBar progressBar; private ProgressBar progressBar;
private ApplicationForm appForm; private ApplicationForm appForm;
private Button btnImport; private Button btnImport;
private Thread thread; private Thread thread;
@ -780,7 +779,32 @@ namespace WebsitePanel.Import.Enterprise
return userId; return userId;
} }
int mailboxType = (int)type.Value; int mailboxType = (int)type.Value;
int mailboxTypeDetails = 0;
PropertyValueCollection typeDetails = entry.Properties["msExchRecipientTypeDetails"];
if (typeDetails!=null)
{
if (typeDetails.Value != null)
{
try
{
object adsLargeInteger = typeDetails.Value;
mailboxTypeDetails = (Int32)adsLargeInteger.GetType().InvokeMember("LowPart", System.Reflection.BindingFlags.GetProperty, null, adsLargeInteger, null);
}
catch { } // just skip
}
}
ExchangeAccountType accountType = ExchangeAccountType.Undefined; ExchangeAccountType accountType = ExchangeAccountType.Undefined;
if (mailboxTypeDetails == 4)
{
Log.WriteInfo("Account type : shared mailbox");
accountType = ExchangeAccountType.SharedMailbox;
}
else
{
switch (mailboxType) switch (mailboxType)
{ {
case 1073741824: case 1073741824:
@ -798,9 +822,10 @@ namespace WebsitePanel.Import.Enterprise
default: default:
Log.WriteInfo("Account type : unknown"); Log.WriteInfo("Account type : unknown");
return userId; return userId;
}
} }
UpdateExchangeAccount(userId, accountName, accountType, displayName, email, false, string.Empty, samName, string.Empty); UpdateExchangeAccount(userId, accountName, accountType, displayName, email, false, string.Empty, samName, string.Empty, Global.defaultMailboxPlanId);
string defaultEmail = (string)entry.Properties["extensionAttribute3"].Value; string defaultEmail = (string)entry.Properties["extensionAttribute3"].Value;
@ -813,12 +838,11 @@ namespace WebsitePanel.Import.Enterprise
if (emailAddress.ToLower().StartsWith("smtp:")) if (emailAddress.ToLower().StartsWith("smtp:"))
emailAddress = emailAddress.Substring(5); emailAddress = emailAddress.Substring(5);
if (!emailAddress.Equals(defaultEmail, StringComparison.InvariantCultureIgnoreCase))
{
if (EmailAddressExists(emailAddress)) if (EmailAddressExists(emailAddress))
{ {
if ((!emailAddress.Equals(defaultEmail, StringComparison.InvariantCultureIgnoreCase)) && (!emailAddress.Equals(email, StringComparison.InvariantCultureIgnoreCase)))
Log.WriteInfo(string.Format("Email address {0} already exists. Skipped", emailAddress)); Log.WriteInfo(string.Format("Email address {0} already exists. Skipped", emailAddress));
continue; continue;
} }
// register email address // register email address
@ -826,7 +850,6 @@ namespace WebsitePanel.Import.Enterprise
AddAccountEmailAddress(userId, emailAddress); AddAccountEmailAddress(userId, emailAddress);
} }
} }
}
Log.WriteEnd("User imported"); Log.WriteEnd("User imported");
return userId; return userId;
@ -963,7 +986,7 @@ namespace WebsitePanel.Import.Enterprise
private static void UpdateExchangeAccount(int accountId, string accountName, ExchangeAccountType accountType, private static void UpdateExchangeAccount(int accountId, string accountName, ExchangeAccountType accountType,
string displayName, string primaryEmailAddress, bool mailEnabledPublicFolder, string displayName, string primaryEmailAddress, bool mailEnabledPublicFolder,
string mailboxManagerActions, string samAccountName, string accountPassword) string mailboxManagerActions, string samAccountName, string accountPassword, int mailboxPlanId)
{ {
DataProvider.UpdateExchangeAccount(accountId, DataProvider.UpdateExchangeAccount(accountId,
accountName, accountName,
@ -973,7 +996,7 @@ namespace WebsitePanel.Import.Enterprise
mailEnabledPublicFolder, mailEnabledPublicFolder,
mailboxManagerActions, mailboxManagerActions,
samAccountName, samAccountName,
CryptoUtils.Encrypt(accountPassword), 0, -1, string.Empty, false); CryptoUtils.Encrypt(accountPassword), mailboxPlanId , -1, string.Empty, false);
} }
} }
} }

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 (accountType == ExchangeAccountType.SharedMailbox)
{
if ((orgStats.AllocatedSharedMailboxes > -1) && (orgStats.CreatedSharedMailboxes >= orgStats.AllocatedSharedMailboxes))
return BusinessErrorCodes.ERROR_EXCHANGE_MAILBOXES_QUOTA_LIMIT;
}
else if ((accountType == ExchangeAccountType.Room) || (accountType == ExchangeAccountType.Equipment))
{
if ((orgStats.AllocatedResourceMailboxes > -1) && (orgStats.CreatedResourceMailboxes >= orgStats.AllocatedResourceMailboxes))
return BusinessErrorCodes.ERROR_EXCHANGE_MAILBOXES_QUOTA_LIMIT;
}
else
{
if ((orgStats.AllocatedMailboxes > -1) && (orgStats.CreatedMailboxes >= orgStats.AllocatedMailboxes)) if ((orgStats.AllocatedMailboxes > -1) && (orgStats.CreatedMailboxes >= orgStats.AllocatedMailboxes))
return BusinessErrorCodes.ERROR_EXCHANGE_MAILBOXES_QUOTA_LIMIT; return BusinessErrorCodes.ERROR_EXCHANGE_MAILBOXES_QUOTA_LIMIT;
}
// place log record // place log record

View file

@ -5,11 +5,11 @@
</configSections> </configSections>
<!-- Connection strings --> <!-- Connection strings -->
<connectionStrings> <connectionStrings>
<add name="EnterpriseServer" connectionString="Server=(local)\SQLExpress;Database=WebsitePanel;uid=sa;pwd=Password12" providerName="System.Data.SqlClient"/> <add name="EnterpriseServer" connectionString="server=dev-sql;database=WebsitePanel;uid=WebsitePanel;pwd=sbbk40q85dc7jzj8b5kn;" providerName="System.Data.SqlClient" />
</connectionStrings> </connectionStrings>
<appSettings> <appSettings>
<!-- Encryption util settings --> <!-- Encryption util settings -->
<add key="WebsitePanel.CryptoKey" value="1234567890"/> <add key="WebsitePanel.CryptoKey" value="jj2n22t2kje035cg4l77" />
<!-- A1D4KDHUE83NKHddF --> <!-- A1D4KDHUE83NKHddF -->
<add key="WebsitePanel.EncryptionEnabled" value="true"/> <add key="WebsitePanel.EncryptionEnabled" value="true"/>
<!-- Web Applications --> <!-- Web Applications -->

View file

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

View file

@ -38,6 +38,15 @@ namespace WebsitePanel.Providers.HostedSolution
int itemId; int itemId;
int mailboxPlanId; int mailboxPlanId;
string mailboxPlan; string mailboxPlan;
public override string ToString()
{
if (mailboxPlan != null)
return mailboxPlan;
return base.ToString();
}
int mailboxSizeMB; int mailboxSizeMB;
int maxRecipients; int maxRecipients;
int maxSendMessageSizeKB; int maxSendMessageSizeKB;
@ -63,7 +72,6 @@ namespace WebsitePanel.Providers.HostedSolution
string litigationHoldUrl; string litigationHoldUrl;
string litigationHoldMsg; string litigationHoldMsg;
public int ItemId public int ItemId
{ {
get { return this.itemId; } get { return this.itemId; }

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

@ -131,6 +131,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,9 @@ 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");
result = ExecuteShellCommand(runSpace, cmd); result = ExecuteShellCommand(runSpace, cmd);
@ -4790,6 +4793,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,8 @@ 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");
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

@ -49,14 +49,6 @@ namespace WebsitePanel.Providers.Web.Iis
// We need to move it into "WebHosting" store // We need to move it into "WebHosting" store
// Get certificate // Get certificate
var servercert = GetServerCertificates(StoreName.My.ToString()).Single(c => c.FriendlyName == cert.FriendlyName); var servercert = GetServerCertificates(StoreName.My.ToString()).Single(c => c.FriendlyName == cert.FriendlyName);
if (UseCCS)
{
// Delete existing certificate, if any. This is needed to install a new binding
if (CheckCertificate(website))
{
DeleteCertificate(GetCurrentSiteCertificate(website), website);
}
}
// Get certificate data - the one we just added to "Personal" store // Get certificate data - the one we just added to "Personal" store
var storeMy = new X509Store(StoreName.My, StoreLocation.LocalMachine); var storeMy = new X509Store(StoreName.My, StoreLocation.LocalMachine);
@ -64,6 +56,7 @@ namespace WebsitePanel.Providers.Web.Iis
X509CertificateCollection existCerts2 = storeMy.Certificates.Find(X509FindType.FindBySerialNumber, servercert.SerialNumber, false); X509CertificateCollection existCerts2 = storeMy.Certificates.Find(X509FindType.FindBySerialNumber, servercert.SerialNumber, false);
var certData = existCerts2[0].Export(X509ContentType.Pfx); var certData = existCerts2[0].Export(X509ContentType.Pfx);
storeMy.Close(); storeMy.Close();
var x509Cert = new X509Certificate2(certData);
if (UseCCS) if (UseCCS)
{ {
@ -74,7 +67,6 @@ namespace WebsitePanel.Providers.Web.Iis
{ {
// Add new certificate to "WebHosting" store // Add new certificate to "WebHosting" store
var store = new X509Store(CertificateStoreName, StoreLocation.LocalMachine); var store = new X509Store(CertificateStoreName, StoreLocation.LocalMachine);
var x509Cert = new X509Certificate2(certData);
store.Open(OpenFlags.ReadWrite); store.Open(OpenFlags.ReadWrite);
store.Add(x509Cert); store.Add(x509Cert);
store.Close(); store.Close();
@ -85,6 +77,7 @@ namespace WebsitePanel.Providers.Web.Iis
X509CertificateCollection existCerts = storeMy.Certificates.Find(X509FindType.FindBySerialNumber, servercert.SerialNumber, false); X509CertificateCollection existCerts = storeMy.Certificates.Find(X509FindType.FindBySerialNumber, servercert.SerialNumber, false);
storeMy.Remove((X509Certificate2)existCerts[0]); storeMy.Remove((X509Certificate2)existCerts[0]);
storeMy.Close(); storeMy.Close();
// Fill object with certificate data // Fill object with certificate data
cert.SerialNumber = servercert.SerialNumber; cert.SerialNumber = servercert.SerialNumber;
cert.ValidFrom = servercert.ValidFrom; cert.ValidFrom = servercert.ValidFrom;
@ -99,7 +92,7 @@ namespace WebsitePanel.Providers.Web.Iis
DeleteCertificate(GetCurrentSiteCertificate(website), website); DeleteCertificate(GetCurrentSiteCertificate(website), website);
} }
AddBinding(cert, website); AddBinding(x509Cert, website);
} }
} }
catch (Exception ex) catch (Exception ex)
@ -113,8 +106,10 @@ namespace WebsitePanel.Providers.Web.Iis
public new List<SSLCertificate> GetServerCertificates() public new List<SSLCertificate> GetServerCertificates()
{ {
// Use Web Hosting store - new for IIS 8.0 // Get certificates from both WebHosting and My (Personal) store
return GetServerCertificates(CertificateStoreName); var certificates = GetServerCertificates(CertificateStoreName);
certificates.AddRange(GetServerCertificates(StoreName.My.ToString()));
return certificates;
} }
public new SSLCertificate ImportCertificate(WebSite website) public new SSLCertificate ImportCertificate(WebSite website)
@ -134,12 +129,12 @@ namespace WebsitePanel.Providers.Web.Iis
}; };
} }
return certificate; return certificate ?? (new SSLCertificate {Success = false, Certificate = "No certificate in binding on server, please remove or edit binding"});
} }
public new SSLCertificate InstallPfx(byte[] certificate, string password, WebSite website) public new SSLCertificate InstallPfx(byte[] certificate, string password, WebSite website)
{ {
SSLCertificate newcert, oldcert = null; SSLCertificate newcert = null, oldcert = null;
// Ensure we perform operations safely and preserve the original state during all manipulations, save the oldcert if one is used // Ensure we perform operations safely and preserve the original state during all manipulations, save the oldcert if one is used
if (CheckCertificate(website)) if (CheckCertificate(website))
@ -170,7 +165,7 @@ namespace WebsitePanel.Providers.Web.Iis
writer.Write(certData); writer.Write(certData);
writer.Flush(); writer.Flush();
writer.Close(); writer.Close();
// Certificated saved // Certificate saved
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -189,7 +184,6 @@ namespace WebsitePanel.Providers.Web.Iis
try try
{ {
store.Open(OpenFlags.ReadWrite); store.Open(OpenFlags.ReadWrite);
store.Add(x509Cert); store.Add(x509Cert);
} }
catch (Exception ex) catch (Exception ex)
@ -207,79 +201,35 @@ namespace WebsitePanel.Providers.Web.Iis
// Step 2: Instantiate a copy of new X.509 certificate // Step 2: Instantiate a copy of new X.509 certificate
try try
{ {
store.Open(OpenFlags.ReadWrite);
newcert = GetSSLCertificateFromX509Certificate2(x509Cert); newcert = GetSSLCertificateFromX509Certificate2(x509Cert);
} }
catch (Exception ex) catch (Exception ex)
{ {
if (!UseCCS) HandleExceptionAndRollbackCertificate(store, x509Cert, null, website, "SSLModuleService could not instantiate a copy of new X.509 certificate.", ex);
{
// Rollback X.509 store changes
store.Remove(x509Cert);
}
// Log error
Log.WriteError("SSLModuleService could not instantiate a copy of new X.509 certificate. All previous changes have been rolled back.", ex);
// Re-throw
throw;
}
finally
{
store.Close();
} }
if (!UseCCS)
{
// Step 3: Remove old certificate from the web site if any // Step 3: Remove old certificate from the web site if any
try try
{ {
store.Open(OpenFlags.ReadWrite);
// Check if certificate already exists, remove it. // Check if certificate already exists, remove it.
if (oldcert != null) if (oldcert != null)
{
DeleteCertificate(oldcert, website); DeleteCertificate(oldcert, website);
} }
}
catch (Exception ex) catch (Exception ex)
{ {
// Rollback X.509 store changes HandleExceptionAndRollbackCertificate(store, x509Cert, null, website, string.Format("SSLModuleService could not remove existing certificate from '{0}' web site.", website.Name), ex);
store.Remove(x509Cert);
// Log the error
Log.WriteError(
String.Format("SSLModuleService could not remove existing certificate from '{0}' web site. All changes have been rolled back.", website.Name), ex);
// Re-throw
throw;
}
finally
{
store.Close();
}
} }
// Step 4: Register new certificate with HTTPS binding on the web site // Step 4: Register new certificate with HTTPS binding on the web site
try try
{ {
//if (!UseCCS) AddBinding(x509Cert, website);
//{
// store.Open(OpenFlags.ReadWrite);
//}
AddBinding(newcert, website);
} }
catch (Exception ex) catch (Exception ex)
{ {
if (!UseCCS) HandleExceptionAndRollbackCertificate(store, x509Cert, oldcert, website, String.Format("SSLModuleService could not add new X.509 certificate to '{0}' web site.", website.Name), ex);
{
// Install old certificate back if any
store.Open(OpenFlags.ReadWrite);
if (oldcert != null)
InstallCertificate(oldcert, website);
// Rollback X.509 store changes
store.Remove(x509Cert);
store.Close();
}
// Log the error
Log.WriteError(
String.Format("SSLModuleService could not add new X.509 certificate to '{0}' web site. All changes have been rolled back.", website.Name), ex);
// Re-throw
throw;
} }
return newcert; return newcert;
@ -319,23 +269,39 @@ namespace WebsitePanel.Providers.Web.Iis
} }
public new void AddBinding(SSLCertificate certificate, WebSite website) public void AddBinding(X509Certificate2 certificate, WebSite website)
{ {
using (var srvman = GetServerManager()) using (var srvman = GetServerManager())
{ {
var store = new X509Store(CertificateStoreName, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
// Look for dedicated ip // Look for dedicated ip
var dedicatedIp = SiteHasBindingWithDedicatedIp(srvman, website); var dedicatedIp = SiteHasBindingWithDedicatedIp(srvman, website);
var bindingInformation = string.Format("{0}:443:{1}", website.SiteIPAddress, dedicatedIp ? "" : certificate.Hostname); // Look for all the hostnames this certificate is valid for if we are using SNI
var hostNames = new List<string>();
if (!dedicatedIp)
{
hostNames.AddRange(certificate.Extensions.Cast<X509Extension>()
.Where(e => e.Oid.Value == "2.5.29.17") // Subject Alternative Names
.SelectMany(e => e.Format(true).Split(new[] {"\r\n", "\n", "\n"}, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Split('=')[1])));
}
var simpleName = certificate.GetNameInfo(X509NameType.SimpleName, false);
if (hostNames.All(h => h != simpleName))
{
hostNames.Add(simpleName);
}
// For every hostname (only one if using old school dedicated IP binding)
foreach (var hostName in hostNames)
{
var bindingInformation = string.Format("{0}:443:{1}", website.SiteIPAddress ?? "*", dedicatedIp ? "" : hostName);
Binding siteBinding = UseCCS ? Binding siteBinding = UseCCS ?
srvman.Sites[website.SiteId].Bindings.Add(bindingInformation, "https") : srvman.Sites[website.SiteId].Bindings.Add(bindingInformation, "https") :
srvman.Sites[website.SiteId].Bindings.Add(bindingInformation, certificate.Hash, store.Name); srvman.Sites[website.SiteId].Bindings.Add(bindingInformation, certificate.GetCertHash(), CertificateStoreName);
if (UseSNI) if (UseSNI && !dedicatedIp)
{ {
siteBinding.SslFlags |= SslFlags.Sni; siteBinding.SslFlags |= SslFlags.Sni;
} }
@ -343,8 +309,7 @@ namespace WebsitePanel.Providers.Web.Iis
{ {
siteBinding.SslFlags |= SslFlags.CentralCertStore; siteBinding.SslFlags |= SslFlags.CentralCertStore;
} }
}
store.Close();
srvman.CommitChanges(); srvman.CommitChanges();
} }
@ -352,7 +317,9 @@ namespace WebsitePanel.Providers.Web.Iis
public new ResultObject DeleteCertificate(SSLCertificate certificate, WebSite website) public new ResultObject DeleteCertificate(SSLCertificate certificate, WebSite website)
{ {
var result = new ResultObject() { IsSuccess = true }; // This method removes all https bindings and all certificates associated with them.
// Old implementation (IIS70) removed a single binding (there could not be more than one) and the first certificate that matched via serial number
var result = new ResultObject { IsSuccess = true };
if (certificate == null) if (certificate == null)
{ {
@ -361,9 +328,19 @@ namespace WebsitePanel.Providers.Web.Iis
try try
{ {
// Regardless of the CCS setting on the server, we try to find and remove the certificate from both CCS and WebHosting Store. var certificatesAndStoreNames = new List<Tuple<string, byte[]>>();
// This is because we don't know how this was set when the certificate was added
// User servermanager to get aLL SSL-bindings on this website and try to remove the certificates used
using (var srvman = GetServerManager())
{
var site = srvman.Sites[website.Name];
var bindings = site.Bindings.Where(b => b.Protocol == "https");
foreach (Binding binding in bindings.ToList())
{
if (binding.SslFlags.HasFlag(SslFlags.CentralCertStore))
{
if (!string.IsNullOrWhiteSpace(CCSUncPath) && Directory.Exists(CCSUncPath)) if (!string.IsNullOrWhiteSpace(CCSUncPath) && Directory.Exists(CCSUncPath))
{ {
// This is where it will be if CCS is used // This is where it will be if CCS is used
@ -372,24 +349,49 @@ namespace WebsitePanel.Providers.Web.Iis
{ {
File.Delete(path); File.Delete(path);
} }
// If binding with hostname, also try to delete with the hostname in the binding
// This is because if SNI is used, several bindings are created for every valid name in the cerificate, but only one name exists in the SSLCertificate
if (!string.IsNullOrEmpty(binding.Host))
{
path = GetCCSPath(binding.Host);
if (File.Exists(path))
{
File.Delete(path);
}
}
}
}
else
{
var certificateAndStoreName = new Tuple<string, byte[]>(binding.CertificateStoreName, binding.CertificateHash);
if (!string.IsNullOrEmpty(binding.CertificateStoreName) && !certificatesAndStoreNames.Contains(certificateAndStoreName))
{
certificatesAndStoreNames.Add(certificateAndStoreName);
}
} }
// Now delete all certs with the same serialnumber in WebHosting Store // Remove binding from site
var store = new X509Store(CertificateStoreName, StoreLocation.LocalMachine); site.Bindings.Remove(binding);
}
srvman.CommitChanges();
foreach (var certificateAndStoreName in certificatesAndStoreNames)
{
// Delete all certs with the same serialnumber in Store
var store = new X509Store(certificateAndStoreName.Item1, StoreLocation.LocalMachine);
store.Open(OpenFlags.MaxAllowed); store.Open(OpenFlags.MaxAllowed);
var certs = store.Certificates.Find(X509FindType.FindBySerialNumber, certificate.SerialNumber, false); var certs = store.Certificates.Find(X509FindType.FindByThumbprint, BitConverter.ToString(certificateAndStoreName.Item2).Replace("-", ""), false);
foreach (var cert in certs) foreach (var cert in certs)
{ {
store.Remove(cert); store.Remove(cert);
} }
store.Close(); store.Close();
}
// Remove binding from site
if (CheckCertificate(website))
{
RemoveBinding(certificate, website);
} }
} }
catch (Exception ex) catch (Exception ex)
@ -409,8 +411,6 @@ namespace WebsitePanel.Providers.Web.Iis
var site = srvman.Sites[website.SiteId]; var site = srvman.Sites[website.SiteId];
var sslBinding = site.Bindings.First(b => b.Protocol == "https"); var sslBinding = site.Bindings.First(b => b.Protocol == "https");
X509Certificate2 cert = null;
// If the certificate is in the central store // If the certificate is in the central store
if (((SslFlags)Enum.Parse(typeof(SslFlags), sslBinding["sslFlags"].ToString())).HasFlag(SslFlags.CentralCertStore)) if (((SslFlags)Enum.Parse(typeof(SslFlags), sslBinding["sslFlags"].ToString())).HasFlag(SslFlags.CentralCertStore))
{ {
@ -423,23 +423,19 @@ namespace WebsitePanel.Providers.Web.Iis
// Read certificate data from file // Read certificate data from file
var certData = new byte[fileStream.Length]; var certData = new byte[fileStream.Length];
fileStream.Read(certData, 0, (int) fileStream.Length); fileStream.Read(certData, 0, (int) fileStream.Length);
cert = new X509Certificate2(certData, CCSCommonPassword); var cert = new X509Certificate2(certData, CCSCommonPassword);
fileStream.Close(); fileStream.Close();
return GetSSLCertificateFromX509Certificate2(cert);
} }
} }
else else
{ {
var currentHash = sslBinding.CertificateHash; var currentHash = Convert.ToBase64String(sslBinding.CertificateHash);
var store = new X509Store(CertificateStoreName, StoreLocation.LocalMachine); return GetServerCertificates().FirstOrDefault(c => Convert.ToBase64String(c.Hash) == currentHash);
store.Open(OpenFlags.ReadOnly); }
cert = store.Certificates.Cast<X509Certificate2>().Single(c => Convert.ToBase64String(c.GetCertHash()) == Convert.ToBase64String(currentHash));
store.Close();
} }
return GetSSLCertificateFromX509Certificate2(cert); return null;
}
} }
private static List<SSLCertificate> GetServerCertificates(string certificateStoreName) private static List<SSLCertificate> GetServerCertificates(string certificateStoreName)
@ -504,5 +500,33 @@ namespace WebsitePanel.Providers.Web.Iis
return false; return false;
} }
} }
private void HandleExceptionAndRollbackCertificate(X509Store store, X509Certificate2 x509Cert, SSLCertificate oldCert, WebSite webSite, string errorMessage, Exception ex)
{
if (!UseCCS)
{
try
{
// Rollback X.509 store changes
store.Open(OpenFlags.ReadWrite);
store.Remove(x509Cert);
store.Close();
}
catch (Exception)
{
Log.WriteError("SSLModuleService could not rollback and remove certificate from store", ex);
}
// Install old certificate back if any
if (oldCert != null)
InstallCertificate(oldCert, webSite);
}
// Log the error
Log.WriteError(errorMessage + " All changes have been rolled back.", ex);
// Re-throw
throw ex;
}
} }
} }

View file

@ -1,14 +1,14 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<configuration> <configuration>
<connectionStrings> <connectionStrings>
<add name="EnterpriseServer" connectionString="Server=VITALIK-VAIO\SQL2008R2;Database=WebsitePanel;Trusted_Connection=Yes;" providerName="System.Data.SqlClient"/> <add name="EnterpriseServer" connectionString="server=dev-sql;database=WebsitePanel;uid=WebsitePanel;pwd=sbbk40q85dc7jzj8b5kn;" providerName="System.Data.SqlClient"/>
</connectionStrings> </connectionStrings>
<startup> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup> </startup>
<appSettings> <appSettings>
<!-- Encryption util settings --> <!-- Encryption util settings -->
<add key="WebsitePanel.CryptoKey" value="0123456789"/> <add key="WebsitePanel.CryptoKey" value="jj2n22t2kje035cg4l77"/>
<!-- A1D4KDHUE83NKHddF --> <!-- A1D4KDHUE83NKHddF -->
<add key="WebsitePanel.EncryptionEnabled" value="true" /> <add key="WebsitePanel.EncryptionEnabled" value="true" />
</appSettings> </appSettings>

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

@ -50,7 +50,7 @@
<!-- Perform security check --> <!-- Perform security check -->
<enabled value="true" /> <enabled value="true" />
<!-- Server password --> <!-- Server password -->
<password value="+uxnDOdf55yuH6iZYXgYAxsfIBw=" /> <password value="TaIF+82DBVpZ/Ix216bG/o02fUE=" />
</security> </security>
</websitepanel.server> </websitepanel.server>
<system.web> <system.web>

View file

@ -5593,10 +5593,32 @@
<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="RoomMailbox.Text" xml:space="preserve">
<value> (room mailbox)</value>
</data>
<data name="SharedMailbox.Text" xml:space="preserve">
<value> (shared mailbox)</value>
</data>
<data name="EquipmentMailbox.Text" xml:space="preserve">
<value> (equipment mailbox)</value>
</data>
<data name="Success.DOMAIN_UPDATE_DOMAIN" xml:space="preserve">
<value>Domain information has been successfully updated.</value>
</data>
<data name="Success.WEB_UPDATE_SITE" xml:space="preserve">
<value>Web site has been successfully updated.</value>
</data>
<data name="SchedulerTask.SCHEDULE_TASK_DOMAIN_LOOKUP" xml:space="preserve"> <data name="SchedulerTask.SCHEDULE_TASK_DOMAIN_LOOKUP" xml:space="preserve">
<value>Check MX and NS on DNS servers</value> <value>Check MX and NS on DNS servers</value>
</data> </data>
<data name="SchedulerTask.SCHEDULE_TASK_DOMAIN_EXPIRATION" xml:space="preserve"> <data name="SchedulerTask.SCHEDULE_TASK_DOMAIN_EXPIRATION" xml:space="preserve">
<value>Check domain expiration date</value> <value>Check domain expiration date</value>
</data> </data>
</root> </root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 B

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;}
@ -292,3 +293,4 @@ UL.ActionButtons LI {margin-bottom: 12px;}
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

@ -112,24 +112,18 @@
<value>2.0</value> <value>2.0</value>
</resheader> </resheader>
<resheader name="reader"> <resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.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="btnSave.Text" xml:space="preserve">
<value>Save</value>
</data>
<data name="btnCancel.Text" xml:space="preserve">
<value>Cancel</value>
</data>
<data name="btnDelete.Text" xml:space="preserve"> <data name="btnDelete.Text" xml:space="preserve">
<value>Delete</value> <value>Delete</value>
</data> </data>
<data name="btnDelete.OnClientClick" xml:space="preserve"> <data name="btnDelete.OnClientClick" xml:space="preserve">
<value>if(!confirm('Do you really want to delete this domain?')) return false;ShowProgressDialog('Deleting domain...');</value> <value>if(!confirm('Do you really want to delete this domain?')) return false;ShowProgressDialog('Deleting domain...');</value>
</data> </data>
<data name="btnSave.OnClientClick" xml:space="preserve"> <data name="buttonPanel.OnSaveClientClick" xml:space="preserve">
<value>ShowProgressDialog('Updating Domain...');</value> <value>ShowProgressDialog('Updating Domain...');</value>
</data> </data>
<data name="AllowSubDomains.Text" xml:space="preserve"> <data name="AllowSubDomains.Text" xml:space="preserve">

View file

@ -132,9 +132,6 @@
<data name="btnAddVirtualDirectory.Text" xml:space="preserve"> <data name="btnAddVirtualDirectory.Text" xml:space="preserve">
<value>Create Directory</value> <value>Create Directory</value>
</data> </data>
<data name="btnCancel.Text" xml:space="preserve">
<value>Cancel</value>
</data>
<data name="btnChangeFrontPagePassword.Text" xml:space="preserve"> <data name="btnChangeFrontPagePassword.Text" xml:space="preserve">
<value>Change Password</value> <value>Change Password</value>
</data> </data>
@ -150,12 +147,9 @@
<data name="btnUninstallFrontPage.Text" xml:space="preserve"> <data name="btnUninstallFrontPage.Text" xml:space="preserve">
<value>Uninstall</value> <value>Uninstall</value>
</data> </data>
<data name="btnUpdate.OnClientClick" xml:space="preserve"> <data name="buttonPanel.OnSaveClientClick" xml:space="preserve">
<value>ShowProgressDialog('Updating web site...');</value> <value>ShowProgressDialog('Updating web site...');</value>
</data> </data>
<data name="btnUpdate.Text" xml:space="preserve">
<value>Update</value>
</data>
<data name="cmdContinue.AlternateText" xml:space="preserve"> <data name="cmdContinue.AlternateText" xml:space="preserve">
<value>Continue Web Site</value> <value>Continue Web Site</value>
</data> </data>

View file

@ -1,6 +1,7 @@
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DomainsEditDomain.ascx.cs" Inherits="WebsitePanel.Portal.DomainsEditDomain" %> <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DomainsEditDomain.ascx.cs" Inherits="WebsitePanel.Portal.DomainsEditDomain" %>
<%@ Register Src="UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> <%@ Register Src="UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %>
<%@ Register Src="UserControls/CollapsiblePanel.ascx" TagPrefix="wsp" TagName="CollapsiblePanel" %> <%@ Register Src="UserControls/CollapsiblePanel.ascx" TagPrefix="wsp" TagName="CollapsiblePanel" %>
<%@ Register Src="UserControls/ItemButtonPanel.ascx" TagName="ItemButtonPanel" TagPrefix="wsp" %>
<wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server" /> <wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server" />
@ -119,9 +120,8 @@
</fieldset> </fieldset>
</div> </div>
<div class="FormFooter"> <div class="FormFooter">
<asp:Button ID="btnSave" runat="server" meta:resourcekey="btnSave" CssClass="Button1" Text="Save" OnClick="btnSave_Click" OnClientClick = "ShowProgressDialog('Updating Domain...');"/> <wsp:ItemButtonPanel id="buttonPanel" runat="server" ValidationGroup="EditMailbox"
<asp:Button ID="btnCancel" runat="server" meta:resourcekey="btnCancel" CssClass="Button1" CausesValidation="false" OnSaveClick="btnSave_Click" OnSaveExitClick="btnSaveExit_Click" OnSaveClientClick="ShowProgressDialog('Updating Domain...');" />
Text="Cancel" OnClick="btnCancel_Click" />
<asp:Button ID="btnDelete" runat="server" meta:resourcekey="btnDelete" CssClass="Button1" CausesValidation="false" <asp:Button ID="btnDelete" runat="server" meta:resourcekey="btnDelete" CssClass="Button1" CausesValidation="false"
Text="Delete" OnClick="btnDelete_Click" /> Text="Delete" OnClick="btnDelete_Click" />
</div> </div>

View file

@ -48,6 +48,9 @@ namespace WebsitePanel.Portal
if (!IsPostBack) if (!IsPostBack)
{ {
BindDomain(); BindDomain();
if (GetLocalizedString("buttonPanel.OnSaveClientClick") != null)
buttonPanel.OnSaveClientClick = GetLocalizedString("buttonPanel.OnSaveClientClick");
} }
} }
@ -194,15 +197,13 @@ namespace WebsitePanel.Portal
ShowResultMessage(result); ShowResultMessage(result);
return; return;
} }
ShowSuccessMessage("DOMAIN_UPDATE_DOMAIN");
} }
catch (Exception ex) catch (Exception ex)
{ {
ShowErrorMessage("DOMAIN_UPDATE_DOMAIN", ex); ShowErrorMessage("DOMAIN_UPDATE_DOMAIN", ex);
return; return;
} }
// return
RedirectSpaceHomePage();
} }
private void DeleteDomain() private void DeleteDomain()
@ -232,8 +233,10 @@ namespace WebsitePanel.Portal
SaveDomain(); SaveDomain();
} }
protected void btnCancel_Click(object sender, EventArgs e) protected void btnSaveExit_Click(object sender, EventArgs e)
{ {
SaveDomain();
// return // return
RedirectSpaceHomePage(); RedirectSpaceHomePage();
} }

View file

@ -1,7 +1,6 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <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.
@ -428,22 +427,13 @@ namespace WebsitePanel.Portal {
protected global::System.Web.UI.WebControls.Localize DescribeAllowSubDomains; protected global::System.Web.UI.WebControls.Localize DescribeAllowSubDomains;
/// <summary> /// <summary>
/// btnSave control. /// buttonPanel 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.Button btnSave; protected global::WebsitePanel.Portal.ItemButtonPanel buttonPanel;
/// <summary>
/// btnCancel 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 btnCancel;
/// <summary> /// <summary>
/// btnDelete control. /// btnDelete control.

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,7 +1,6 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <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.

View file

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

View file

@ -117,12 +117,9 @@
<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="btnSave.OnClientClick" xml:space="preserve"> <data name="buttonPanel.OnSaveClientClick" xml:space="preserve">
<value>ShowProgressDialog('Updating mailbox settings...');</value> <value>ShowProgressDialog('Updating mailbox settings...');</value>
</data> </data>
<data name="btnSave.Text" xml:space="preserve">
<value>Save Changes</value>
</data>
<data name="chkDisable.Text" xml:space="preserve"> <data name="chkDisable.Text" xml:space="preserve">
<value>Disable Mailbox</value> <value>Disable Mailbox</value>
</data> </data>

View file

@ -117,12 +117,9 @@
<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="btnSave.OnClientClick" xml:space="preserve"> <data name="buttonPanel.OnSaveClientClick" xml:space="preserve">
<value>ShowProgressDialog('Updating mailbox settings...');</value> <value>ShowProgressDialog('Updating mailbox settings...');</value>
</data> </data>
<data name="btnSave.Text" xml:space="preserve">
<value>Save Changes</value>
</data>
<data name="chkDoNotDeleteOnForward.Text" xml:space="preserve"> <data name="chkDoNotDeleteOnForward.Text" xml:space="preserve">
<value>Deliver messages to both forwarding address and mailbox</value> <value>Deliver messages to both forwarding address and mailbox</value>
</data> </data>

View file

@ -117,12 +117,6 @@
<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="btnSave.OnClientClick" xml:space="preserve">
<value>ShowProgressDialog('Updating...');</value>
</data>
<data name="btnSave.Text" xml:space="preserve">
<value>Save Changes</value>
</data>
<data name="locTitle.Text" xml:space="preserve"> <data name="locTitle.Text" xml:space="preserve">
<value>Edit Mailbox</value> <value>Edit Mailbox</value>
</data> </data>

View file

@ -117,12 +117,9 @@
<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="btnSave.OnClientClick" xml:space="preserve"> <data name="buttonPanel.OnSaveClientClick" xml:space="preserve">
<value>ShowProgressDialog('Updating mailbox permissions...');</value> <value>ShowProgressDialog('Updating mailbox permissions...');</value>
</data> </data>
<data name="btnSave.Text" xml:space="preserve">
<value>Save Changes</value>
</data>
<data name="FormComments.Text" xml:space="preserve"> <data name="FormComments.Text" xml:space="preserve">
<value /> <value />
</data> </data>

View file

@ -117,12 +117,9 @@
<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="btnSave.OnClientClick" xml:space="preserve"> <data name="buttonPanel.OnSaveClientClick" xml:space="preserve">
<value>ShowProgressDialog('Updating user settings...');</value> <value>ShowProgressDialog('Updating user settings...');</value>
</data> </data>
<data name="btnSave.Text" xml:space="preserve">
<value>Save Changes</value>
</data>
<data name="chkDisable.Text" xml:space="preserve"> <data name="chkDisable.Text" xml:space="preserve">
<value>Disable User</value> <value>Disable User</value>
</data> </data>

View file

@ -117,12 +117,6 @@
<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="btnSave.OnClientClick" xml:space="preserve">
<value>ShowProgressDialog('Updating...');</value>
</data>
<data name="btnSave.Text" xml:space="preserve">
<value>Save Changes</value>
</data>
<data name="locTitle.Text" xml:space="preserve"> <data name="locTitle.Text" xml:space="preserve">
<value>Edit User </value> <value>Edit User </value>
</data> </data>

View file

@ -91,16 +91,37 @@ namespace WebsitePanel.Portal.ExchangeServer
if (plans.Length == 0) if (plans.Length == 0)
btnCreate.Enabled = false; btnCreate.Enabled = false;
bool allowResourceMailbox = false;
if (cntx.Quotas.ContainsKey(Quotas.EXCHANGE2007_ISCONSUMER)) if (cntx.Quotas.ContainsKey(Quotas.EXCHANGE2007_ISCONSUMER))
{ {
if (cntx.Quotas[Quotas.EXCHANGE2007_ISCONSUMER].QuotaAllocatedValue != 1) if (cntx.Quotas[Quotas.EXCHANGE2007_ISCONSUMER].QuotaAllocatedValue != 1)
{ {
locSubscriberNumber.Visible = txtSubscriberNumber.Visible = valRequireSubscriberNumber.Enabled = false; locSubscriberNumber.Visible = txtSubscriberNumber.Visible = valRequireSubscriberNumber.Enabled = false;
allowResourceMailbox = true;
}
}
if (cntx.Quotas.ContainsKey(Quotas.EXCHANGE2013_RESOURCEMAILBOXES))
{
if (cntx.Quotas[Quotas.EXCHANGE2013_RESOURCEMAILBOXES].QuotaAllocatedValue != 0)
allowResourceMailbox = true;
}
if (allowResourceMailbox)
{
rbMailboxType.Items.Add(new System.Web.UI.WebControls.ListItem(GetLocalizedString("RoomMailbox.Text"), "5")); rbMailboxType.Items.Add(new System.Web.UI.WebControls.ListItem(GetLocalizedString("RoomMailbox.Text"), "5"));
rbMailboxType.Items.Add(new System.Web.UI.WebControls.ListItem(GetLocalizedString("EquipmentMailbox.Text"), "6")); rbMailboxType.Items.Add(new System.Web.UI.WebControls.ListItem(GetLocalizedString("EquipmentMailbox.Text"), "6"));
} }
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"));
} }
rowRetentionPolicy.Visible = Utils.CheckQouta(Quotas.EXCHANGE2013_ALLOWRETENTIONPOLICY, cntx); rowRetentionPolicy.Visible = Utils.CheckQouta(Quotas.EXCHANGE2013_ALLOWRETENTIONPOLICY, cntx);
} }

View file

@ -7,8 +7,9 @@
<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> <%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %>
<%@ Register Src="UserControls/MailboxPlanSelector.ascx" TagName="MailboxPlanSelector" TagPrefix="wsp" %> <%@ Register Src="UserControls/MailboxPlanSelector.ascx" TagName="MailboxPlanSelector" TagPrefix="wsp" %>
<%@ Register Src="../UserControls/QuotaViewer.ascx" TagName="QuotaViewer" TagPrefix="wsp" %> <%@ Register Src="../UserControls/QuotaViewer.ascx" TagName="QuotaViewer" TagPrefix="wsp" %>
<%@ Register Src="../UserControls/ItemButtonPanel.ascx" TagName="ItemButtonPanel" TagPrefix="wsp" %>
<%-- < wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/> --%> <wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/>
<div id="ExchangeContainer"> <div id="ExchangeContainer">
<div class="Module"> <div class="Module">
@ -157,10 +158,8 @@
</asp:Panel> </asp:Panel>
<div class="FormFooterClean"> <div class="FormFooterClean">
<asp:Button id="btnSave" runat="server" Text="Save Changes" CssClass="Button1" <wsp:ItemButtonPanel id="buttonPanel" runat="server" ValidationGroup="EditMailbox"
meta:resourcekey="btnSave" ValidationGroup="EditMailbox" OnClick="btnSave_Click"></asp:Button> OnSaveClick="btnSave_Click" OnSaveExitClick="btnSaveExit_Click" />
<asp:Button id="btnSaveExit" runat="server" Text="Save Changes and Exit" CssClass="Button1"
meta:resourcekey="btnSaveExit" ValidationGroup="EditMailbox" OnClick="btnSaveExit_Click"></asp:Button>
<asp:ValidationSummary ID="ValidationSummary1" runat="server" ShowMessageBox="True" ShowSummary="False" ValidationGroup="EditMailbox" /> <asp:ValidationSummary ID="ValidationSummary1" runat="server" ShowMessageBox="True" ShowSummary="False" ValidationGroup="EditMailbox" />
</div> </div>
</div> </div>

View file

@ -81,6 +81,9 @@ namespace WebsitePanel.Portal.ExchangeServer
} }
secRetentionPolicy.Visible = Utils.CheckQouta(Quotas.EXCHANGE2013_ALLOWRETENTIONPOLICY, Cntx); secRetentionPolicy.Visible = Utils.CheckQouta(Quotas.EXCHANGE2013_ALLOWRETENTIONPOLICY, Cntx);
if (GetLocalizedString("buttonPanel.OnSaveClientClick") != null)
buttonPanel.OnSaveClientClick = GetLocalizedString("buttonPanel.OnSaveClientClick");
} }
int planId = -1; int planId = -1;
@ -183,6 +186,15 @@ 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.Room)
litDisplayName.Text += GetSharedLocalizedString("RoomMailbox.Text");
if (account.AccountType == ExchangeAccountType.Equipment)
litDisplayName.Text += GetSharedLocalizedString("EquipmentMailbox.Text");
} }
catch (Exception ex) catch (Exception ex)
{ {

View file

@ -12,6 +12,15 @@ namespace WebsitePanel.Portal.ExchangeServer {
public partial class ExchangeMailboxGeneralSettings { public partial class ExchangeMailboxGeneralSettings {
/// <summary>
/// asyncTasks control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks;
/// <summary> /// <summary>
/// Image1 control. /// Image1 control.
/// </summary> /// </summary>
@ -382,22 +391,13 @@ namespace WebsitePanel.Portal.ExchangeServer {
protected global::System.Web.UI.WebControls.Label lblExchangeGuid; protected global::System.Web.UI.WebControls.Label lblExchangeGuid;
/// <summary> /// <summary>
/// btnSave control. /// buttonPanel 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.Button btnSave; protected global::WebsitePanel.Portal.ItemButtonPanel buttonPanel;
/// <summary>
/// btnSaveExit 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 btnSaveExit;
/// <summary> /// <summary>
/// ValidationSummary1 control. /// ValidationSummary1 control.

View file

@ -8,6 +8,7 @@
<%@ Register Src="UserControls/AccountsList.ascx" TagName="AccountsList" TagPrefix="wsp" %> <%@ Register Src="UserControls/AccountsList.ascx" TagName="AccountsList" TagPrefix="wsp" %>
<%@ Register TagPrefix="wsp" TagName="CollapsiblePanel" Src="../UserControls/CollapsiblePanel.ascx" %> <%@ Register TagPrefix="wsp" TagName="CollapsiblePanel" Src="../UserControls/CollapsiblePanel.ascx" %>
<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> <%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %>
<%@ Register Src="../UserControls/ItemButtonPanel.ascx" TagName="ItemButtonPanel" TagPrefix="wsp" %>
<wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/> <wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/>
@ -110,9 +111,8 @@
</table> </table>
<div class="FormFooterClean"> <div class="FormFooterClean">
<asp:Button id="btnSave" runat="server" Text="Save Changes" CssClass="Button1" meta:resourcekey="btnSave" ValidationGroup="EditMailbox" OnClick="btnSave_Click"></asp:Button> <wsp:ItemButtonPanel id="buttonPanel" runat="server" ValidationGroup="EditMailbox"
<asp:Button id="btnSaveExit" runat="server" Text="Save Changes and Exit" CssClass="Button1" OnSaveClick="btnSave_Click" OnSaveExitClick="btnSaveExit_Click" />
meta:resourcekey="btnSaveExit" ValidationGroup="EditMailbox" OnClick="btnSaveExit_Click"></asp:Button>
<asp:ValidationSummary ID="ValidationSummary1" runat="server" ShowMessageBox="True" ShowSummary="False" ValidationGroup="EditMailbox" /> <asp:ValidationSummary ID="ValidationSummary1" runat="server" ShowMessageBox="True" ShowSummary="False" ValidationGroup="EditMailbox" />
</div> </div>
</div> </div>

View file

@ -49,6 +49,9 @@ namespace WebsitePanel.Portal.ExchangeServer
if (!IsPostBack) if (!IsPostBack)
{ {
BindSettings(); BindSettings();
if (GetLocalizedString("buttonPanel.OnSaveClientClick") != null)
buttonPanel.OnSaveClientClick = GetLocalizedString("buttonPanel.OnSaveClientClick");
} }
} }

View file

@ -247,22 +247,13 @@ namespace WebsitePanel.Portal.ExchangeServer {
protected global::System.Web.UI.WebControls.CheckBox chkPmmAllowed; protected global::System.Web.UI.WebControls.CheckBox chkPmmAllowed;
/// <summary> /// <summary>
/// btnSave control. /// buttonPanel 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.Button btnSave; protected global::WebsitePanel.Portal.ItemButtonPanel buttonPanel;
/// <summary>
/// btnSaveExit 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 btnSaveExit;
/// <summary> /// <summary>
/// ValidationSummary1 control. /// ValidationSummary1 control.

View file

@ -7,6 +7,7 @@
<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> <%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %>
<%@ Register Src="UserControls/MailboxPlanSelector.ascx" TagName="MailboxPlanSelector" TagPrefix="wsp" %> <%@ Register Src="UserControls/MailboxPlanSelector.ascx" TagName="MailboxPlanSelector" TagPrefix="wsp" %>
<%@ Register Src="../UserControls/QuotaViewer.ascx" TagName="QuotaViewer" TagPrefix="wsp" %> <%@ Register Src="../UserControls/QuotaViewer.ascx" TagName="QuotaViewer" TagPrefix="wsp" %>
<%@ Register Src="../UserControls/ItemButtonPanel.ascx" TagName="ItemButtonPanel" TagPrefix="wsp" %>
<wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/> <wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/>
@ -43,10 +44,8 @@
</asp:Panel> </asp:Panel>
<div class="FormFooterClean"> <div class="FormFooterClean">
<asp:Button id="btnSave" runat="server" Text="Save Changes" CssClass="Button1" <wsp:ItemButtonPanel id="buttonPanel" runat="server" ValidationGroup="EditMailbox"
meta:resourcekey="btnSave" ValidationGroup="EditMailbox" OnClick="btnSave_Click"></asp:Button> OnSaveClick="btnSave_Click" OnSaveExitClick="btnSaveExit_Click" />
<asp:Button id="btnSaveExit" runat="server" Text="Save Changes and Exit" CssClass="Button1"
meta:resourcekey="btnSaveExit" ValidationGroup="EditMailbox" OnClick="btnSaveExit_Click"></asp:Button>
<asp:ValidationSummary ID="ValidationSummary1" runat="server" ShowMessageBox="True" ShowSummary="False" ValidationGroup="EditMailbox" /> <asp:ValidationSummary ID="ValidationSummary1" runat="server" ShowMessageBox="True" ShowSummary="False" ValidationGroup="EditMailbox" />
</div> </div>

View file

@ -103,22 +103,13 @@ namespace WebsitePanel.Portal.ExchangeServer {
protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList groups; protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList groups;
/// <summary> /// <summary>
/// btnSave control. /// buttonPanel 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.Button btnSave; protected global::WebsitePanel.Portal.ItemButtonPanel buttonPanel;
/// <summary>
/// btnSaveExit 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 btnSaveExit;
/// <summary> /// <summary>
/// ValidationSummary1 control. /// ValidationSummary1 control.

View file

@ -6,6 +6,7 @@
<%@ Register Src="UserControls/MailboxTabs.ascx" TagName="MailboxTabs" TagPrefix="wsp" %> <%@ Register Src="UserControls/MailboxTabs.ascx" TagName="MailboxTabs" TagPrefix="wsp" %>
<%@ Register TagPrefix="wsp" TagName="CollapsiblePanel" Src="../UserControls/CollapsiblePanel.ascx" %> <%@ Register TagPrefix="wsp" TagName="CollapsiblePanel" Src="../UserControls/CollapsiblePanel.ascx" %>
<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> <%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %>
<%@ Register Src="../UserControls/ItemButtonPanel.ascx" TagName="ItemButtonPanel" TagPrefix="wsp" %>
<wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/> <wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/>
@ -44,9 +45,8 @@
</uc2:AccountsList> </uc2:AccountsList>
</asp:Panel> </asp:Panel>
<div class="FormFooterClean"> <div class="FormFooterClean">
<asp:Button id="btnSave" runat="server" Text="Save Changes" CssClass="Button1" meta:resourcekey="btnSave" ValidationGroup="EditMailbox" OnClick="btnSave_Click" ></asp:Button> <wsp:ItemButtonPanel id="buttonPanel" runat="server" ValidationGroup="EditMailbox"
<asp:Button id="btnSaveExit" runat="server" Text="Save Changes and Exit" CssClass="Button1" OnSaveClick="btnSave_Click" OnSaveExitClick="btnSaveExit_Click" />
meta:resourcekey="btnSaveExit" ValidationGroup="EditMailbox" OnClick="btnSaveExit_Click"></asp:Button>
</div> </div>
</div> </div>
</div> </div>

View file

@ -37,8 +37,13 @@ namespace WebsitePanel.Portal.ExchangeServer
protected void Page_Load(object sender, EventArgs e) protected void Page_Load(object sender, EventArgs e)
{ {
if (!IsPostBack) if (!IsPostBack)
{
BindPermissions(); BindPermissions();
if (GetLocalizedString("buttonPanel.OnSaveClientClick") != null)
buttonPanel.OnSaveClientClick = GetLocalizedString("buttonPanel.OnSaveClientClick");
}
} }
@ -67,6 +72,19 @@ 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.Room)
litDisplayName.Text += GetSharedLocalizedString("RoomMailbox.Text");
if (account.AccountType == ExchangeAccountType.Equipment)
litDisplayName.Text += GetSharedLocalizedString("EquipmentMailbox.Text");
} }
catch (Exception ex) catch (Exception ex)
{ {

View file

@ -139,21 +139,12 @@ namespace WebsitePanel.Portal.ExchangeServer {
protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList fullAccessPermission; protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList fullAccessPermission;
/// <summary> /// <summary>
/// btnSave control. /// buttonPanel 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.Button btnSave; protected global::WebsitePanel.Portal.ItemButtonPanel buttonPanel;
/// <summary>
/// btnSaveExit 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 btnSaveExit;
} }
} }

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" />
<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();
} }
@ -147,6 +151,7 @@ namespace WebsitePanel.Portal.ExchangeServer
{ {
ExchangeAccountType accountType = (ExchangeAccountType)accountTypeId; ExchangeAccountType accountType = (ExchangeAccountType)accountTypeId;
string imgName = "mailbox_16.gif"; string imgName = "mailbox_16.gif";
if (accountType == ExchangeAccountType.Contact) if (accountType == ExchangeAccountType.Contact)
imgName = "contact_16.gif"; imgName = "contact_16.gif";
else if (accountType == ExchangeAccountType.DistributionList) else if (accountType == ExchangeAccountType.DistributionList)
@ -155,6 +160,8 @@ namespace WebsitePanel.Portal.ExchangeServer
imgName = "room_16.gif"; imgName = "room_16.gif";
else if (accountType == ExchangeAccountType.Equipment) else if (accountType == ExchangeAccountType.Equipment)
imgName = "equipment_16.gif"; imgName = "equipment_16.gif";
else if (accountType == ExchangeAccountType.SharedMailbox)
imgName = "shared_16.gif";
if (vip && cntx.Groups.ContainsKey(ResourceGroups.ServiceLevels)) imgName = "vip_user_16.png"; if (vip && cntx.Groups.ContainsKey(ResourceGroups.ServiceLevels)) imgName = "vip_user_16.png";
@ -246,5 +253,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.Add("1");
if (chkSharedMailboxes.Checked)
accountTypes.Add("10");
if (chkResourceMailboxes.Checked)
accountTypes.AddRange(new string[] {"5","6"});
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

@ -13,6 +13,7 @@
<%@ Register src="UserControls/UserTabs.ascx" tagname="UserTabs" tagprefix="uc1" %> <%@ Register src="UserControls/UserTabs.ascx" tagname="UserTabs" tagprefix="uc1" %>
<%@ Register src="UserControls/MailboxTabs.ascx" tagname="MailboxTabs" tagprefix="uc1" %> <%@ Register src="UserControls/MailboxTabs.ascx" tagname="MailboxTabs" tagprefix="uc1" %>
<%@ Register Src="../UserControls/ItemButtonPanel.ascx" TagName="ItemButtonPanel" TagPrefix="wsp" %>
<wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/> <wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/>
@ -283,10 +284,8 @@
<div class="FormFooterClean"> <div class="FormFooterClean">
<asp:Button id="btnSave" runat="server" Text="Save Changes" CssClass="Button1" <wsp:ItemButtonPanel id="buttonPanel" runat="server" ValidationGroup="EditMailbox"
meta:resourcekey="btnSave" ValidationGroup="EditMailbox" OnClick="btnSave_Click"></asp:Button> OnSaveClick="btnSave_Click" OnSaveExitClick="btnSaveExit_Click" />
<asp:Button id="btnSaveExit" runat="server" Text="Save Changes and Exit" CssClass="Button1"
meta:resourcekey="btnSaveExit" ValidationGroup="EditMailbox" OnClick="btnSaveExit_Click"></asp:Button>
<asp:ValidationSummary ID="ValidationSummary1" runat="server" ShowMessageBox="True" ShowSummary="False" ValidationGroup="EditMailbox" /> <asp:ValidationSummary ID="ValidationSummary1" runat="server" ShowMessageBox="True" ShowSummary="False" ValidationGroup="EditMailbox" />
</div> </div>
</div> </div>

View file

@ -49,6 +49,9 @@ namespace WebsitePanel.Portal.HostedSolution
MailboxTabsId.Visible = (PanelRequest.Context == "Mailbox"); MailboxTabsId.Visible = (PanelRequest.Context == "Mailbox");
UserTabsId.Visible = (PanelRequest.Context == "User"); UserTabsId.Visible = (PanelRequest.Context == "User");
if (GetLocalizedString("buttonPanel.OnSaveClientClick") != null)
buttonPanel.OnSaveClientClick = GetLocalizedString("buttonPanel.OnSaveClientClick");
} }
} }

View file

@ -769,22 +769,13 @@ namespace WebsitePanel.Portal.HostedSolution {
protected global::System.Web.UI.WebControls.Label lblUserDomainName; protected global::System.Web.UI.WebControls.Label lblUserDomainName;
/// <summary> /// <summary>
/// btnSave control. /// buttonPanel 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.Button btnSave; protected global::WebsitePanel.Portal.ItemButtonPanel buttonPanel;
/// <summary>
/// btnSaveExit 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 btnSaveExit;
/// <summary> /// <summary>
/// ValidationSummary1 control. /// ValidationSummary1 control.

View file

@ -15,6 +15,7 @@
<%@ Register src="UserControls/UserTabs.ascx" tagname="UserTabs" tagprefix="uc1" %> <%@ Register src="UserControls/UserTabs.ascx" tagname="UserTabs" tagprefix="uc1" %>
<%@ Register src="UserControls/MailboxTabs.ascx" tagname="MailboxTabs" tagprefix="uc1" %> <%@ Register src="UserControls/MailboxTabs.ascx" tagname="MailboxTabs" tagprefix="uc1" %>
<%@ Register Src="../UserControls/ItemButtonPanel.ascx" TagName="ItemButtonPanel" TagPrefix="wsp" %>
<wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/> <wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/>
@ -54,10 +55,8 @@
</asp:Panel> </asp:Panel>
<div class="FormFooterClean"> <div class="FormFooterClean">
<asp:Button id="btnSave" runat="server" Text="Save Changes" CssClass="Button1" <wsp:ItemButtonPanel id="buttonPanel" runat="server" ValidationGroup="EditMailbox"
meta:resourcekey="btnSave" ValidationGroup="EditMailbox" OnClick="btnSave_Click"></asp:Button> OnSaveClick="btnSave_Click" OnSaveExitClick="btnSaveExit_Click" />
<asp:Button id="btnSaveExit" runat="server" Text="Save Changes and Exit" CssClass="Button1"
meta:resourcekey="btnSaveExit" ValidationGroup="EditMailbox" OnClick="btnSaveExit_Click"></asp:Button>
<asp:ValidationSummary ID="ValidationSummary1" runat="server" ShowMessageBox="True" ShowSummary="False" ValidationGroup="EditMailbox" /> <asp:ValidationSummary ID="ValidationSummary1" runat="server" ShowMessageBox="True" ShowSummary="False" ValidationGroup="EditMailbox" />
</div> </div>
</div> </div>

View file

@ -112,22 +112,13 @@ namespace WebsitePanel.Portal.HostedSolution {
protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList groups; protected global::WebsitePanel.Portal.ExchangeServer.UserControls.AccountsList groups;
/// <summary> /// <summary>
/// btnSave control. /// buttonPanel 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.Button btnSave; protected global::WebsitePanel.Portal.ItemButtonPanel buttonPanel;
/// <summary>
/// btnSaveExit 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 btnSaveExit;
/// <summary> /// <summary>
/// ValidationSummary1 control. /// ValidationSummary1 control.

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,8 +121,15 @@ namespace WebsitePanel.Portal.ProviderControls
ddlSite.Items.Add(item); ddlSite.Items.Add(item);
} }
if (ddlSite.Items.Count == 0)
{
ddlSite.Items.Add(new ListItem("Default FTP Site (not yet created)", "Default FTP Site"));
}
else
{
ddlSite_SelectedIndexChanged(this, null); 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)
@ -76,5 +95,60 @@ namespace WebsitePanel.Portal.ProviderControls
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

@ -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

@ -17,7 +17,16 @@
EmptyDataText="gvPackages" CssSelectorClass="NormalGridView" EmptyDataText="gvPackages" CssSelectorClass="NormalGridView"
AllowSorting="True" DataSourceID="odsItemsPaged" AllowPaging="True"> AllowSorting="True" DataSourceID="odsItemsPaged" AllowPaging="True">
<Columns> <Columns>
<asp:BoundField SortExpression="ItemName" DataField="ItemName" HeaderText="gvPackagesItemName" ></asp:BoundField> <asp:TemplateField SortExpression="ItemName" HeaderText="gvPackagesItemName">
<ItemTemplate>
<asp:hyperlink ID="lnkItem" runat="server" NavigateUrl='<%# GetItemPageUrl((int)Eval("ItemID"), (int)Eval("PackageID")) %>' Visible="<%# AllowItemLink() %>">
<%# Eval("ItemName") %>
</asp:hyperlink>
<asp:Label ID="itemName" runat="server" Visible="<%# !AllowItemLink() %>">
<%# Eval("ItemName") %>
</asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField SortExpression="PackageName" HeaderText="gvPackagesName"> <asp:TemplateField SortExpression="PackageName" HeaderText="gvPackagesName">
<ItemTemplate> <ItemTemplate>
<asp:hyperlink id=lnkSpace runat="server" NavigateUrl='<%# GetSpaceHomePageUrl((int)Eval("PackageID")) %>'> <asp:hyperlink id=lnkSpace runat="server" NavigateUrl='<%# GetSpaceHomePageUrl((int)Eval("PackageID")) %>'>

View file

@ -30,6 +30,7 @@ using System;
using System.Data; using System.Data;
using System.Configuration; using System.Configuration;
using System.Collections; using System.Collections;
using System.Collections.Generic;
using System.Web; using System.Web;
using System.Web.Security; using System.Web.Security;
using System.Web.UI; using System.Web.UI;
@ -37,10 +38,26 @@ using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts; using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls; using System.Web.UI.HtmlControls;
using WebsitePanel.WebPortal;
using WebsitePanel.Portal.UserControls;
namespace WebsitePanel.Portal namespace WebsitePanel.Portal
{ {
public partial class SearchSpaces : WebsitePanelModuleBase public partial class SearchSpaces : WebsitePanelModuleBase
{ {
string ItemTypeName;
const string type_WebSite = "WebSite";
const string type_Domain = "Domain";
const string type_Organization = "Organization";
List<string> linkTypes = new List<string>(new string[] {type_WebSite, type_Domain, type_Organization});
const string PID_SPACE_WEBSITES = "SpaceWebSites";
const string PID_SPACE_DIMAINS = "SpaceDomains";
const string PID_SPACE_EXCHANGESERVER = "SpaceExchangeServer";
protected void Page_Load(object sender, EventArgs e) protected void Page_Load(object sender, EventArgs e)
{ {
if (!IsPostBack) if (!IsPostBack)
@ -48,10 +65,16 @@ namespace WebsitePanel.Portal
// bind item types // bind item types
DataTable dtItemTypes = ES.Services.Packages.GetSearchableServiceItemTypes().Tables[0]; DataTable dtItemTypes = ES.Services.Packages.GetSearchableServiceItemTypes().Tables[0];
foreach (DataRow dr in dtItemTypes.Rows) foreach (DataRow dr in dtItemTypes.Rows)
{
string displayName = dr["DisplayName"].ToString();
ddlItemType.Items.Add(new ListItem( ddlItemType.Items.Add(new ListItem(
GetSharedLocalizedString("ServiceItemType." + dr["DisplayName"].ToString()), GetSharedLocalizedString("ServiceItemType." + displayName),
dr["ItemTypeID"].ToString())); dr["ItemTypeID"].ToString()));
if (Request["ItemTypeID"] == dr["ItemTypeID"].ToString())
ItemTypeName = displayName;
}
// bind filter // bind filter
Utils.SelectListItem(ddlItemType, Request["ItemTypeID"]); Utils.SelectListItem(ddlItemType, Request["ItemTypeID"]);
txtFilterValue.Text = Request["Query"]; txtFilterValue.Text = Request["Query"];
@ -68,6 +91,32 @@ namespace WebsitePanel.Portal
return PortalUtils.GetSpaceHomePageUrl(spaceId); return PortalUtils.GetSpaceHomePageUrl(spaceId);
} }
public string GetItemPageUrl(int itemId, int spaceId)
{
string res = "";
switch(ItemTypeName)
{
case type_WebSite:
res = PortalUtils.NavigatePageURL(PID_SPACE_WEBSITES, "ItemID", itemId.ToString(),
PortalUtils.SPACE_ID_PARAM + "=" + spaceId, DefaultPage.CONTROL_ID_PARAM + "=" + "edit_item",
"moduleDefId=websites");
break;
case type_Domain:
res = PortalUtils.NavigatePageURL(PID_SPACE_DIMAINS, "DomainID", itemId.ToString(),
PortalUtils.SPACE_ID_PARAM + "=" + spaceId, DefaultPage.CONTROL_ID_PARAM + "=" + "edit_item",
"moduleDefId=domains");
break;
case type_Organization:
res = PortalUtils.NavigatePageURL(PID_SPACE_EXCHANGESERVER, "ItemID", itemId.ToString(),
PortalUtils.SPACE_ID_PARAM + "=" + spaceId, DefaultPage.CONTROL_ID_PARAM + "=" + "organization_home",
"moduleDefId=ExchangeServer");
break;
}
return res;
}
protected void cmdSearch_Click(object sender, ImageClickEventArgs e) protected void cmdSearch_Click(object sender, ImageClickEventArgs e)
{ {
string query = txtFilterValue.Text.Trim().Replace("%", ""); string query = txtFilterValue.Text.Trim().Replace("%", "");
@ -86,5 +135,12 @@ namespace WebsitePanel.Portal
e.ExceptionHandled = true; e.ExceptionHandled = true;
} }
} }
public bool AllowItemLink()
{
bool res = linkTypes.Exists(x => x == ItemTypeName);
return res;
}
} }
} }

View file

@ -1,7 +1,6 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <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.

View file

@ -0,0 +1,126 @@
<?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="btnSave.Text" xml:space="preserve">
<value>Save Changes</value>
</data>
<data name="btnSaveExit.Text" xml:space="preserve">
<value>Save Changes and Exit</value>
</data>
</root>

View file

@ -0,0 +1,5 @@
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ItemButtonPanel.ascx.cs" Inherits="WebsitePanel.Portal.ItemButtonPanel" %>
<asp:Button id="btnSave" runat="server" Text="Save Changes" CssClass="Button1" meta:resourcekey="btnSave"
OnClick="btnSave_Click" OnClientClick="ShowProgressDialog('Updating ...');"></asp:Button>
<asp:Button id="btnSaveExit" runat="server" Text="Save Changes and Exit" CssClass="Button1" meta:resourcekey="btnSaveExit"
OnClick="btnSaveExit_Click" OnClientClick="ShowProgressDialog('Updating ...');"></asp:Button>

View file

@ -0,0 +1,85 @@
// 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;
namespace WebsitePanel.Portal
{
public partial class ItemButtonPanel : WebsitePanelControlBase
{
public bool ButtonSaveVisible
{
set { btnSave.Visible = value; }
get { return btnSave.Visible; }
}
public bool ButtonSaveExitVisible
{
set { btnSaveExit.Visible = value; }
get { return btnSaveExit.Visible; }
}
public string ValidationGroup
{
set {
btnSave.ValidationGroup = value;
btnSaveExit.ValidationGroup = value;
}
get { return btnSave.ValidationGroup; }
}
public string OnSaveClientClick
{
set
{
btnSave.OnClientClick = value;
btnSaveExit.OnClientClick = value;
}
}
public event EventHandler SaveClick = null;
protected void btnSave_Click(object sender, EventArgs e)
{
if (SaveClick!=null)
{
SaveClick(this, e);
}
}
public event EventHandler SaveExitClick = null;
protected void btnSaveExit_Click(object sender, EventArgs e)
{
if (SaveExitClick!=null)
{
SaveExitClick(this, e);
}
}
}
}

View file

@ -0,0 +1,33 @@
//------------------------------------------------------------------------------
// <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 {
public partial class ItemButtonPanel {
/// <summary>
/// btnSave 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 btnSave;
/// <summary>
/// btnSaveExit 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 btnSaveExit;
}
}

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,7 +1,35 @@
// 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.

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,7 +1,6 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <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.
@ -10,7 +9,16 @@
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

@ -16,6 +16,8 @@
<%@ Register Src="UserControls/PopupHeader.ascx" TagName="PopupHeader" TagPrefix="wsp" %> <%@ Register Src="UserControls/PopupHeader.ascx" TagName="PopupHeader" TagPrefix="wsp" %>
<%@ Register TagPrefix="wsp" Namespace="WebsitePanel.Portal" %> <%@ Register TagPrefix="wsp" Namespace="WebsitePanel.Portal" %>
<%@ Register Src="WebsitesSSL.ascx" TagName="WebsitesSSL" TagPrefix="uc2" %> <%@ Register Src="WebsitesSSL.ascx" TagName="WebsitesSSL" TagPrefix="uc2" %>
<%@ Register Src="UserControls/ItemButtonPanel.ascx" TagName="ItemButtonPanel" TagPrefix="wsp" %>
<style type="text/css"> <style type="text/css">
.style1 .style1
{ {
@ -523,10 +525,8 @@
</table> </table>
</div> </div>
<div class="FormFooter"> <div class="FormFooter">
<asp:Button ID="btnUpdate" runat="server" meta:resourcekey="btnUpdate" Text="Update" <wsp:ItemButtonPanel id="buttonPanel" runat="server" ValidationGroup="EditMailbox"
CssClass="Button1" OnClick="btnUpdate_Click" OnClientClick="ShowProgressDialog('Updating web site...');" /> OnSaveClick="btnSave_Click" OnSaveExitClick="btnSaveExit_Click" />
<asp:Button ID="btnCancel" runat="server" meta:resourcekey="btnCancel" Text="Cancel"
CssClass="Button1" CausesValidation="false" OnClick="btnCancel_Click" />
</div> </div>
<div class="FormFooter"> <div class="FormFooter">
<asp:Button ID="btnDelete" runat="server" meta:resourcekey="btnDelete" Text="Delete" <asp:Button ID="btnDelete" runat="server" meta:resourcekey="btnDelete" Text="Delete"

View file

@ -102,6 +102,9 @@ namespace WebsitePanel.Portal
if (!IsPostBack) if (!IsPostBack)
{ {
BindWebSite(); BindWebSite();
if (GetLocalizedString("buttonPanel.OnSaveClientClick")!=null)
buttonPanel.OnSaveClientClick = GetLocalizedString("buttonPanel.OnSaveClientClick");
} }
} }
@ -109,7 +112,7 @@ namespace WebsitePanel.Portal
{ {
var filteredTabs = TabsList.FilterTabsByHostingPlanQuotas(PackageId).ToList(); var filteredTabs = TabsList.FilterTabsByHostingPlanQuotas(PackageId).ToList();
// remove "SSL" tab for a site with dynamic IP // remove "SSL" tab for a site with dynamic IP and not SNI enabled
var sslTab = filteredTabs.SingleOrDefault(t => t.Id == "SSL"); var sslTab = filteredTabs.SingleOrDefault(t => t.Id == "SSL");
if (!AllowSsl && sslTab != null) if (!AllowSsl && sslTab != null)
filteredTabs.Remove(sslTab); filteredTabs.Remove(sslTab);
@ -908,14 +911,14 @@ namespace WebsitePanel.Portal
ShowResultMessage(result); ShowResultMessage(result);
return; return;
} }
ShowSuccessMessage("WEB_UPDATE_SITE");
} }
catch (Exception ex) catch (Exception ex)
{ {
ShowErrorMessage("WEB_UPDATE_SITE", ex); ShowErrorMessage("WEB_UPDATE_SITE", ex);
return; return;
} }
RedirectSpaceHomePage();
} }
private void DeleteWebSite() private void DeleteWebSite()
@ -938,13 +941,14 @@ namespace WebsitePanel.Portal
RedirectSpaceHomePage(); RedirectSpaceHomePage();
} }
protected void btnUpdate_Click(object sender, EventArgs e) protected void btnSave_Click(object sender, EventArgs e)
{ {
SaveWebSite(); SaveWebSite();
} }
protected void btnCancel_Click(object sender, EventArgs e) protected void btnSaveExit_Click(object sender, EventArgs e)
{ {
SaveWebSite();
RedirectSpaceHomePage(); RedirectSpaceHomePage();
} }
@ -1071,6 +1075,7 @@ namespace WebsitePanel.Portal
sharedIP.Visible = false; sharedIP.Visible = false;
switchToDedicatedIP.Visible = true; switchToDedicatedIP.Visible = true;
WebsitesSSLControl.InstalledCert = null;
} }
protected void cmdSwitchToSharedIP_Click(object sender, EventArgs e) protected void cmdSwitchToSharedIP_Click(object sender, EventArgs e)
@ -1090,6 +1095,7 @@ namespace WebsitePanel.Portal
dlTabs.SelectedIndex = 0; dlTabs.SelectedIndex = 0;
WebsitesSSLControl.InstalledCert = null;
} }
catch (Exception ex) catch (Exception ex)
{ {

View file

@ -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> // <auto-generated>
// This code was generated by a tool. // This code was generated by a tool.
@ -1157,22 +1129,13 @@ namespace WebsitePanel.Portal {
protected global::WebsitePanel.Portal.WebsitesSSL WebsitesSSLControl; protected global::WebsitePanel.Portal.WebsitesSSL WebsitesSSLControl;
/// <summary> /// <summary>
/// btnUpdate control. /// buttonPanel 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.Button btnUpdate; protected global::WebsitePanel.Portal.ItemButtonPanel buttonPanel;
/// <summary>
/// btnCancel 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 btnCancel;
/// <summary> /// <summary>
/// btnDelete control. /// btnDelete control.

View file

@ -779,6 +779,13 @@
<Compile Include="Lync\UserControls\AllocatePackagePhoneNumbers.ascx.designer.cs"> <Compile Include="Lync\UserControls\AllocatePackagePhoneNumbers.ascx.designer.cs">
<DependentUpon>AllocatePackagePhoneNumbers.ascx</DependentUpon> <DependentUpon>AllocatePackagePhoneNumbers.ascx</DependentUpon>
</Compile> </Compile>
<Compile Include="UserControls\ItemButtonPanel.ascx.cs">
<DependentUpon>ItemButtonPanel.ascx</DependentUpon>
<SubType>ASPXCodeBehind</SubType>
</Compile>
<Compile Include="UserControls\ItemButtonPanel.ascx.designer.cs">
<DependentUpon>ItemButtonPanel.ascx</DependentUpon>
</Compile>
<Compile Include="UserOrganization.ascx.cs"> <Compile Include="UserOrganization.ascx.cs">
<DependentUpon>UserOrganization.ascx</DependentUpon> <DependentUpon>UserOrganization.ascx</DependentUpon>
<SubType>ASPXCodeBehind</SubType> <SubType>ASPXCodeBehind</SubType>
@ -4328,6 +4335,7 @@
<Content Include="UserControls\OrgPolicyEditor.ascx" /> <Content Include="UserControls\OrgPolicyEditor.ascx" />
<Content Include="UserControls\PackagePhoneNumbers.ascx" /> <Content Include="UserControls\PackagePhoneNumbers.ascx" />
<Content Include="Lync\UserControls\AllocatePackagePhoneNumbers.ascx" /> <Content Include="Lync\UserControls\AllocatePackagePhoneNumbers.ascx" />
<Content Include="UserControls\ItemButtonPanel.ascx" />
<Content Include="UserOrganization.ascx" /> <Content Include="UserOrganization.ascx" />
<Content Include="VPSForPC\MonitoringPage.aspx" /> <Content Include="VPSForPC\MonitoringPage.aspx" />
<Content Include="VPSForPC\VdcAccountVLanAdd.ascx" /> <Content Include="VPSForPC\VdcAccountVLanAdd.ascx" />
@ -5483,6 +5491,9 @@
<Content Include="Lync\UserControls\App_LocalResources\AllocatePackagePhoneNumbers.ascx.resx"> <Content Include="Lync\UserControls\App_LocalResources\AllocatePackagePhoneNumbers.ascx.resx">
<SubType>Designer</SubType> <SubType>Designer</SubType>
</Content> </Content>
<Content Include="UserControls\App_LocalResources\ItemButtonPanel.ascx.resx">
<SubType>Designer</SubType>
</Content>
<None Include="Resources\Windows2008_Settings.ascx.resx" /> <None Include="Resources\Windows2008_Settings.ascx.resx" />
<Content Include="App_LocalResources\WebSitesHeliconZooControl.ascx.resx" /> <Content Include="App_LocalResources\WebSitesHeliconZooControl.ascx.resx" />
<Content Include="ExchangeServer\App_LocalResources\ExchangeDisclaimers.ascx.resx"> <Content Include="ExchangeServer\App_LocalResources\ExchangeDisclaimers.ascx.resx">
@ -5561,6 +5572,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>

View file

@ -141,6 +141,8 @@
<p class="Normal"> <p class="Normal">
<asp:Localize ID="SSLImportDescription" runat="server" meta:resourcekey="SSLImportDescription" /></p> <asp:Localize ID="SSLImportDescription" runat="server" meta:resourcekey="SSLImportDescription" /></p>
<asp:Button ID="btnImport" meta:resourcekey="btnImport" CssClass="Button1" runat="server" OnClick="btnImport_click" /> <asp:Button ID="btnImport" meta:resourcekey="btnImport" CssClass="Button1" runat="server" OnClick="btnImport_click" />
<asp:Button ID="btnDeleteAll" runat="server" Text="Delete" meta:resourcekey="btnDelete"
CssClass="Button1" OnClick="btnDeleteAll_Click" />
</div> </div>
</asp:Panel> </asp:Panel>
@ -151,13 +153,7 @@
<tr> <tr>
<td class="SubHead"> <td class="SubHead">
<asp:Localize ID="SelectCertType" runat="server" meta:resourcekey="SelectCertType" /></td> <asp:Localize ID="SelectCertType" runat="server" meta:resourcekey="SelectCertType" /></td>
<td class="NormalBold" ><asp:radiobutton id="rbSiteCertificate" GroupName="Content" Runat="server" Checked="True"></asp:radiobutton></td> <td class="NormalBold" ><asp:DropDownList id="ddlbSiteCertificate" GroupName="Content" Runat="server" Checked="True"></asp:DropDownList></td>
</tr>
<tr>
<td></td>
<td class="NormalBold" ><asp:radiobutton id="rbDomainCertificate" GroupName="Content" Runat="server" ></asp:radiobutton></td>
</tr>
<tr> <tr>
<td class="SubHead"> <td class="SubHead">
<asp:Localize ID="sslBitLength" runat="server" meta:resourcekey="sslBitLength" /></td> <asp:Localize ID="sslBitLength" runat="server" meta:resourcekey="sslBitLength" /></td>
@ -173,7 +169,7 @@
<asp:Localize ID="sslOrganization" runat="server" meta:resourcekey="sslOrganization" /></td> <asp:Localize ID="sslOrganization" runat="server" meta:resourcekey="sslOrganization" /></td>
<td class="Normal"> <td class="Normal">
<asp:TextBox ID="txtCompany" runat="server" /><asp:RequiredFieldValidator ID="SSLCompanyReq" Display="Dynamic" ValidationGroup="SSL" runat="server" <asp:TextBox ID="txtCompany" runat="server" /><asp:RequiredFieldValidator ID="SSLCompanyReq" Display="Dynamic" ValidationGroup="SSL" runat="server"
ControlToValidate="txtCompany" ErrorMessage="RequiredFieldValidator" /></td> ControlToValidate="txtCompany" ErrorMessage="*" /></td>
</tr> </tr>
<tr> <tr>
<td class="SubHead"> <td class="SubHead">
@ -196,7 +192,7 @@
<asp:DropDownList ID="ddlStates" Runat="server" DataTextField="Text" DataValueField="Value" CssClass="NormalTextBox" <asp:DropDownList ID="ddlStates" Runat="server" DataTextField="Text" DataValueField="Value" CssClass="NormalTextBox"
Width="200px" Visible="false" /> Width="200px" Visible="false" />
<asp:RequiredFieldValidator ID="SSLSSLStateReq" ValidationGroup="SSL" runat="server" <asp:RequiredFieldValidator ID="SSLSSLStateReq" ValidationGroup="SSL" runat="server"
ControlToValidate="txtState" Display="Dynamic" /></td> ControlToValidate="txtState" Display="Dynamic" ErrorMessage="*" /></td>
</tr> </tr>
<tr> <tr>
<td class="SubHead"> <td class="SubHead">
@ -204,7 +200,7 @@
<td class="Normal"> <td class="Normal">
<asp:TextBox ID="txtCity" runat="server" /> <asp:TextBox ID="txtCity" runat="server" />
<asp:RequiredFieldValidator ID="SSLCityReq" ValidationGroup="SSL" runat="server" <asp:RequiredFieldValidator ID="SSLCityReq" ValidationGroup="SSL" runat="server"
ControlToValidate="txtCity" ErrorMessage="RequiredFieldValidator" /></td> ControlToValidate="txtCity" ErrorMessage="*" /></td>
</tr> </tr>
</table> </table>
<br /> <br />
@ -254,6 +250,8 @@
<br /> <br />
<asp:Button ID="btnInstallCertificate" meta:resourcekey="btnInstallCertificate" runat="server" <asp:Button ID="btnInstallCertificate" meta:resourcekey="btnInstallCertificate" runat="server"
CssClass="Button1" Text="Install" OnClick="btnInstallCertificate_Click" /> CssClass="Button1" Text="Install" OnClick="btnInstallCertificate_Click" />
<asp:Button ID="btnCancelRequest" runat="server" OnClientClick="return confirm('Are you Sure? This will delete the current request.');"
CssClass="Button1" Text="Cancel request" OnClick="btnCancelRequest_Click" />
</div> </div>
</asp:Panel> </asp:Panel>
</ContentTemplate> </ContentTemplate>

View file

@ -135,10 +135,18 @@ namespace WebsitePanel.Portal
} }
} }
private void BindListOfAvailableSslDomains(string websiteName, string domainName) private void BindListOfAvailableSslDomains(string defaultBindingName)
{ {
rbSiteCertificate.Text = websiteName; var domains = ES.Services.WebServers.GetWebSitePointers(SiteId).ToList();
rbDomainCertificate.Text = "*." + domainName;
// If no pointers at all, add website default domain
if (domains.All(d => d.DomainName != defaultBindingName))
{
domains.Add(new DomainInfo() { DomainName = defaultBindingName, IsDomainPointer = false});
}
ddlbSiteCertificate.Items.AddRange(domains.Select(d => new ListItem(d.DomainName)).ToArray());
ddlbSiteCertificate.Items.AddRange(domains.Where(d => !d.IsDomainPointer).Select(d => new ListItem("*." + d.DomainName)).ToArray());
} }
public void BindWebItem(WebVirtualDirectory item) public void BindWebItem(WebVirtualDirectory item)
@ -148,106 +156,10 @@ namespace WebsitePanel.Portal
// Skip processing virtual directories, otherwise we will likely run into a trouble // Skip processing virtual directories, otherwise we will likely run into a trouble
if (webSite == null) if (webSite == null)
return; return;
//
bool hasactive = false;
bool haspending = false;
SiteId = item.Id; SiteId = item.Id;
//
try
{
SSLCertificate[] certificates = ES.Services.WebServers.GetCertificatesForSite(item.Id);
SSLNotInstalled.Visible = true; RefreshControlLayout();
DomainInfo[] domains = ES.Services.Servers.GetDomains(PanelSecurity.PackageId);
string zoneName = string.Empty;
foreach (DomainInfo d in domains)
{
if (d.WebSiteId == SiteId)
{
zoneName = d.ZoneName;
break;
}
}
//
BindListOfAvailableSslDomains(webSite.Name, zoneName);
if (certificates.Length > 0)
{
foreach (SSLCertificate cert in certificates)
{
if (cert.Installed)
{
hasactive = true;
}
else
{
haspending = true;
}
}
}
// Web site has active certificate
if (hasactive)
{
tabInstalled.Visible = true;
tabInstalled.Enabled = true;
tabInstalled.HeaderText = GetLocalizedString("tabInstalled.Text");
InstalledCert = (from c in certificates
where c.Installed == true
select c).SingleOrDefault();
//
BindCertificateFields();
// Attention please, the certificate is about to expire!
TimeSpan daystoexp = DateTime.Now - InstalledCert.ExpiryDate;
if (daystoexp.Days < 30)
{
lblInstalledExpiration.ForeColor = System.Drawing.Color.Red;
}
// Put some data to the ViewState
ViewState["SSLID"] = InstalledCert.id;
ViewState["SSLSerial"] = InstalledCert.SerialNumber;
//
if (!haspending)
{
btnShowpnlCSR.Attributes.Add("OnClientClick", "return confirm('" + GetLocalizedString("btnInstallConfirm.Text") + "');");
btnShowUpload.Attributes.Add("OnClientClick", "return confirm('" + GetLocalizedString("btnInstallConfirm.Text") + "');");
SSLNotInstalledHeading.Text = GetLocalizedString("SSLInstalledNewHeading.Text");
SSLNotInstalledDescription.Text = GetLocalizedString("SSLInstalledNewDescription.Text");
}
}
// Web site has pending certificate
if (haspending)
{
tabCSR.HeaderText = GetLocalizedString("tabPendingCertificate.HeaderText");//"Pending Certificate";
SSLNotInstalled.Visible = false;
pnlInstallCertificate.Visible = true;
SSLCertificate pending = (from c in certificates
where c.Installed == false
select c).Single();
ViewState["CSRID"] = pending.id;
txtCSR.Text = pending.CSR;
txtCSR.Attributes.Add("onfocus", "this.select();");
if (InstalledCert != null)
{
btnInstallCertificate.Attributes.Add("OnClientClick", "return confirm('" + GetLocalizedString("btnInstallConfirm.Text") + "');");
}
}
if (!hasactive && ES.Services.WebServers.CheckCertificate(item.Id).IsSuccess)
{
SSLNotInstalled.Visible = false;
SSLImport.Visible = true;
}
}
catch (Exception ex)
{
messageBox.ShowErrorMessage("WEB_GET_SSL", ex);
}
} }
protected void btnShowpnlCSR_click(object sender, EventArgs e) protected void btnShowpnlCSR_click(object sender, EventArgs e)
@ -271,7 +183,8 @@ namespace WebsitePanel.Portal
L={3}, L={3},
S={4}, S={4},
C={5}", C={5}",
rbSiteCertificate.Checked ? rbSiteCertificate.Text : rbDomainCertificate.Text, //rbSiteCertificate.Checked ? rbSiteCertificate.Text : rbDomainCertificate.Text,
ddlbSiteCertificate.SelectedValue,
txtCompany.Text, txtCompany.Text,
txtOU.Text, txtOU.Text,
txtCity.Text, txtCity.Text,
@ -279,7 +192,7 @@ namespace WebsitePanel.Portal
lstCountries.SelectedValue); lstCountries.SelectedValue);
SSLCertificate certificate = new SSLCertificate(); SSLCertificate certificate = new SSLCertificate();
certificate.Hostname = rbSiteCertificate.Checked ? rbSiteCertificate.Text : rbDomainCertificate.Text; certificate.Hostname = ddlbSiteCertificate.SelectedValue; //rbSiteCertificate.Checked ? rbSiteCertificate.Text : rbDomainCertificate.Text;
certificate.DistinguishedName = distinguishedName; certificate.DistinguishedName = distinguishedName;
certificate.CSRLength = Convert.ToInt32(lstBits.SelectedValue); certificate.CSRLength = Convert.ToInt32(lstBits.SelectedValue);
certificate.Organisation = txtCompany.Text; certificate.Organisation = txtCompany.Text;
@ -336,7 +249,7 @@ namespace WebsitePanel.Portal
OU={2}, OU={2},
L={3}, L={3},
S={4}, S={4},
C={5}", rbSiteCertificate.Checked ? rbSiteCertificate.Text : rbDomainCertificate.Text, C={5}", ddlbSiteCertificate.SelectedValue, //rbSiteCertificate.Checked ? rbSiteCertificate.Text : rbDomainCertificate.Text,
txtCompany.Text, txtCompany.Text,
txtOU.Text, txtOU.Text,
txtCity.Text, txtCity.Text,
@ -344,7 +257,7 @@ namespace WebsitePanel.Portal
lstCountries.SelectedValue); lstCountries.SelectedValue);
SSLCertificate certificate = new SSLCertificate(); SSLCertificate certificate = new SSLCertificate();
certificate.Hostname = rbSiteCertificate.Checked ? rbSiteCertificate.Text : rbDomainCertificate.Text; certificate.Hostname = ddlbSiteCertificate.SelectedValue; //rbSiteCertificate.Checked ? rbSiteCertificate.Text : rbDomainCertificate.Text;
certificate.DistinguishedName = distinguishedName; certificate.DistinguishedName = distinguishedName;
certificate.CSRLength = Convert.ToInt32(lstBits.SelectedValue); certificate.CSRLength = Convert.ToInt32(lstBits.SelectedValue);
certificate.Organisation = txtCompany.Text; certificate.Organisation = txtCompany.Text;
@ -369,7 +282,7 @@ namespace WebsitePanel.Portal
pnlCSR.Visible = false; pnlCSR.Visible = false;
ViewState["CSRID"] = certificate.id; ViewState["CSRID"] = certificate.id;
txtCSR.Attributes.Add("onfocus", "this.select();"); txtCSR.Attributes.Add("onfocus", "this.select();");
RefreshControlLayout(PanelRequest.ItemID); RefreshControlLayout();
TabContainer1.ActiveTab = TabContainer1.Tabs[0]; TabContainer1.ActiveTab = TabContainer1.Tabs[0];
messageBox.ShowSuccessMessage(WEB_GEN_CSR); messageBox.ShowSuccessMessage(WEB_GEN_CSR);
} }
@ -402,7 +315,7 @@ namespace WebsitePanel.Portal
// //
TabContainer1.ActiveTab = tabInstalled; TabContainer1.ActiveTab = tabInstalled;
RefreshControlLayout(webSiteId); RefreshControlLayout();
} }
protected void btnInstallPFX_Click(object sender, EventArgs e) protected void btnInstallPFX_Click(object sender, EventArgs e)
@ -428,13 +341,14 @@ namespace WebsitePanel.Portal
if (result.IsSuccess.Equals(false)) if (result.IsSuccess.Equals(false))
{ {
messageBox.ShowErrorMessage("WEB_INSTALL_CSR"); messageBox.ShowErrorMessage("WEB_INSTALL_CSR");
RefreshControlLayout();
return; return;
} }
// //
messageBox.ShowSuccessMessage("WEB_INSTALL_CSR"); messageBox.ShowSuccessMessage("WEB_INSTALL_CSR");
SSLNotInstalled.Visible = false; SSLNotInstalled.Visible = false;
tabInstalled.Visible = true; tabInstalled.Visible = true;
RefreshControlLayout(SiteId); RefreshControlLayout();
} }
protected void BindCertificateFields() protected void BindCertificateFields()
@ -560,43 +474,43 @@ namespace WebsitePanel.Portal
if (!result.IsSuccess) if (!result.IsSuccess)
{ {
messageBox.ShowErrorMessage("WEB_INSTALL_CSR"); messageBox.ShowErrorMessage("WEB_INSTALL_CSR");
RefreshControlLayout();
return; return;
} }
// Show success message and display appropriate controls // Show success message and display appropriate controls
messageBox.ShowSuccessMessage("WEB_INSTALL_CSR"); messageBox.ShowSuccessMessage("WEB_INSTALL_CSR");
SSLNotInstalled.Visible = false;
tabInstalled.Visible = true; RefreshControlLayout();
//
RefreshControlLayout(webSiteId);
} }
protected void RefreshControlLayout(int webSiteId) public void RefreshControlLayout()
{ {
bool hasActiveCert = false;
bool hasPendingCert = false;
// //
bool hasactive = false;
bool haspending = false;
try try
{ {
SSLCertificate[] certificates = ES.Services.WebServers.GetCertificatesForSite(webSiteId); var webSite = ES.Services.WebServers.GetWebSite(SiteId);
WebSite item = ES.Services.WebServers.GetWebSite(webSiteId); // Get all certificate infos stored in database
SSLCertificate[] certificates = ES.Services.WebServers.GetCertificatesForSite(SiteId);
// Set some default visible values, states and texts
tabInstalled.Visible = false;
tabInstalled.Enabled = false;
SSLNotInstalled.Visible = true; SSLNotInstalled.Visible = true;
// SSLImport.Visible = false;
pnlCSR.Visible = false;
pnlShowUpload.Visible = false;
pnlInstallCertificate.Visible = false;
DomainInfo[] domains = ES.Services.Servers.GetDomains(PanelSecurity.PackageId); btnShowpnlCSR.Attributes.Remove("OnClientClick");
string zoneName = string.Empty; btnShowUpload.Attributes.Remove("OnClientClick");
foreach (DomainInfo d in domains) SSLNotInstalledHeading.Text = GetLocalizedString("SSLNotInstalledHeading.Text");
{ SSLNotInstalledDescription.Text = GetLocalizedString("SSLNotInstalledDescription.Text");
if (d.WebSiteId == item.Id)
{
zoneName = d.ZoneName;
break;
}
}
// BindListOfAvailableSslDomains(webSite.Name);
BindListOfAvailableSslDomains(item.Name, zoneName);
if (certificates.Length > 0) if (certificates.Length > 0)
{ {
@ -604,16 +518,17 @@ namespace WebsitePanel.Portal
{ {
if (cert.Installed) if (cert.Installed)
{ {
hasActiveCert = true; hasactive = true;
} }
else else
{ {
hasPendingCert = true; haspending = true;
} }
} }
} }
if (hasActiveCert) // Web site has active certificate
if (hasactive)
{ {
tabInstalled.Visible = true; tabInstalled.Visible = true;
tabInstalled.Enabled = true; tabInstalled.Enabled = true;
@ -622,18 +537,19 @@ namespace WebsitePanel.Portal
InstalledCert = (from c in certificates InstalledCert = (from c in certificates
where c.Installed == true where c.Installed == true
select c).SingleOrDefault(); select c).SingleOrDefault();
TimeSpan daystoexp = DateTime.Now - InstalledCert.ExpiryDate;
BindCertificateFields();
// //
bool certAbout2Exp = daystoexp.Days < 30 BindCertificateFields();
? lblInstalledExpiration.ForeColor == System.Drawing.Color.Red // Attention please, the certificate is about to expire!
: lblInstalledExpiration.ForeColor == System.Drawing.Color.Black; TimeSpan daystoexp = InstalledCert.ExpiryDate - DateTime.Now;
if (daystoexp.Days < 30)
{
lblInstalledExpiration.ForeColor = System.Drawing.Color.Red;
}
// Put some data to the ViewState
ViewState["SSLID"] = InstalledCert.id; ViewState["SSLID"] = InstalledCert.id;
ViewState["SSLSerial"] = InstalledCert.SerialNumber; ViewState["SSLSerial"] = InstalledCert.SerialNumber;
//
if (!hasPendingCert) if (!haspending)
{ {
btnShowpnlCSR.Attributes.Add("OnClientClick", "return confirm('" + GetLocalizedString("btnInstallConfirm.Text") + "');"); btnShowpnlCSR.Attributes.Add("OnClientClick", "return confirm('" + GetLocalizedString("btnInstallConfirm.Text") + "');");
btnShowUpload.Attributes.Add("OnClientClick", "return confirm('" + GetLocalizedString("btnInstallConfirm.Text") + "');"); btnShowUpload.Attributes.Add("OnClientClick", "return confirm('" + GetLocalizedString("btnInstallConfirm.Text") + "');");
@ -642,9 +558,10 @@ namespace WebsitePanel.Portal
} }
} }
if (hasPendingCert) // Web site has pending certificate
if (haspending)
{ {
tabCSR.HeaderText = GetLocalizedString("tabPendingCertificate.HeaderText"); tabCSR.HeaderText = GetLocalizedString("tabPendingCertificate.HeaderText");//"Pending Certificate";
SSLNotInstalled.Visible = false; SSLNotInstalled.Visible = false;
pnlInstallCertificate.Visible = true; pnlInstallCertificate.Visible = true;
SSLCertificate pending = (from c in certificates SSLCertificate pending = (from c in certificates
@ -653,12 +570,17 @@ namespace WebsitePanel.Portal
ViewState["CSRID"] = pending.id; ViewState["CSRID"] = pending.id;
txtCSR.Text = pending.CSR; txtCSR.Text = pending.CSR;
txtCSR.Attributes.Add("onfocus", "this.select();"); txtCSR.Attributes.Add("onfocus", "this.select();");
if (InstalledCert != null) if (InstalledCert != null)
{ {
btnInstallCertificate.Attributes.Add("OnClientClick", "return confirm('" + GetLocalizedString("btnInstallConfirm.Text") + "');"); btnInstallCertificate.Attributes.Add("OnClientClick", "return confirm('" + GetLocalizedString("btnInstallConfirm.Text") + "');");
} }
} }
if (!hasactive && ES.Services.WebServers.CheckCertificate(SiteId).IsSuccess)
{
SSLNotInstalled.Visible = false;
SSLImport.Visible = true;
}
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -668,7 +590,10 @@ namespace WebsitePanel.Portal
protected void SetCertHostnameSelection(string hostname) protected void SetCertHostnameSelection(string hostname)
{ {
rbSiteCertificate.Checked = (rbSiteCertificate.Text == hostname); if (ddlbSiteCertificate.Items.Contains(new ListItem(hostname)))
{
ddlbSiteCertificate.SelectedValue = hostname;
}
} }
protected void SetCertCountrySelection(string country) protected void SetCertCountrySelection(string country)
@ -701,5 +626,33 @@ namespace WebsitePanel.Portal
listCtl.ClearSelection(); listCtl.ClearSelection();
li.Selected = true; li.Selected = true;
} }
protected void btnCancelRequest_Click(object sender, EventArgs e)
{
ResultObject result = null;
try
{
result = ES.Services.WebServers.DeleteCertificateRequest(SiteId, (int)ViewState["CSRID"]);
}
catch (Exception ex)
{
messageBox.ShowErrorMessage(WEB_SSL_DELETE, ex);
}
//
if (!result.IsSuccess)
{
messageBox.ShowErrorMessage(WEB_SSL_DELETE);
return;
}
//
SSLNotInstalled.Visible = true;
pnlCSR.Visible = false;
pnlInstallCertificate.Visible = false;
}
protected void btnDeleteAll_Click(object sender, EventArgs e)
{
DeleteCertificate(SiteId, new SSLCertificate());
}
} }
} }

View file

@ -1,32 +1,4 @@
// 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.
// //
@ -355,6 +327,15 @@ namespace WebsitePanel.Portal {
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.Button btnImport; protected global::System.Web.UI.WebControls.Button btnImport;
/// <summary>
/// btnDeleteAll 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 btnDeleteAll;
/// <summary> /// <summary>
/// pnlCSR control. /// pnlCSR control.
/// </summary> /// </summary>
@ -374,22 +355,13 @@ namespace WebsitePanel.Portal {
protected global::System.Web.UI.WebControls.Localize SelectCertType; protected global::System.Web.UI.WebControls.Localize SelectCertType;
/// <summary> /// <summary>
/// rbSiteCertificate control. /// ddlbSiteCertificate 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.RadioButton rbSiteCertificate; protected global::System.Web.UI.WebControls.DropDownList ddlbSiteCertificate;
/// <summary>
/// rbDomainCertificate 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.RadioButton rbDomainCertificate;
/// <summary> /// <summary>
/// sslBitLength control. /// sslBitLength control.
@ -678,5 +650,14 @@ namespace WebsitePanel.Portal {
/// 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.Button btnInstallCertificate; protected global::System.Web.UI.WebControls.Button btnInstallCertificate;
/// <summary>
/// btnCancelRequest 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 btnCancelRequest;
} }
} }

Some files were not shown because too many files have changed in this diff Show more