diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index df041e71..cc8efa0f 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -1637,4 +1637,12 @@ IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE ([QuotaName] = N'Exchange2007. BEGIN INSERT [dbo].[Quotas] ([QuotaID], [GroupID], [QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (422, 12, 26, N'Exchange2007.DisclaimersAllowed', N'Disclaimers Allowed', 1, 0, NULL, NULL) END +GO + + +--add SecurityGroupManagement Quota +IF NOT EXISTS (SELECT * FROM [dbo].[Quotas] WHERE [QuotaName] = 'HostedSolution.SecurityGroupManagement') +BEGIN +INSERT [dbo].[Quotas] ([QuotaID], [GroupID],[QuotaOrder], [QuotaName], [QuotaDescription], [QuotaTypeID], [ServiceQuota], [ItemTypeID], [HideQuota]) VALUES (423, 13, 5, N'HostedSolution.SecurityGroupManagement', N'Allow Security Group Management', 1, 0, NULL, NULL) +END GO diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs index 58a410ac..c415b5a8 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Packages/Quotas.cs @@ -155,6 +155,7 @@ order by rg.groupOrder public const string ORGANIZATION_USERS = "HostedSolution.Users"; public const string ORGANIZATION_DOMAINS = "HostedSolution.Domains"; public const string ORGANIZATION_ALLOWCHANGEUPN = "HostedSolution.AllowChangeUPN"; + public const string ORGANIZATION_SECURITYGROUPMANAGEMENT = "HostedSolution.SecurityGroupManagement"; public const string CRM_USERS = "HostedCRM.Users"; public const string CRM_ORGANIZATION = "HostedCRM.Organization"; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs index 088e33d6..edc457e7 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs @@ -114,6 +114,8 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { private System.Threading.SendOrPostCallback DeleteUserOperationCompleted; private System.Threading.SendOrPostCallback GetPasswordPolicyOperationCompleted; + + private System.Threading.SendOrPostCallback GetSecurityGroupGeneralSettingsOperationCompleted; /// public esOrganizations() { @@ -198,6 +200,9 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { /// public event GetPasswordPolicyCompletedEventHandler GetPasswordPolicyCompleted; + /// + public event GetSecurityGroupGeneralSettingsCompletedEventHandler GetSecurityGroupGeneralSettingsCompleted; + /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/CheckOrgIdExists", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] public bool CheckOrgIdExists(string orgId) @@ -1635,7 +1640,59 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { this.GetPasswordPolicyCompleted(this, new GetPasswordPolicyCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetSecurityGroupGeneralSettings", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public OrganizationSecurityGroup GetSecurityGroupGeneralSettings(int itemId, int accountId) + { + object[] results = this.Invoke("GetSecurityGroupGeneralSettings", new object[] { + itemId, + accountId}); + return ((OrganizationSecurityGroup)(results[0])); + } + + /// + public System.IAsyncResult BeginGetSecurityGroupGeneralSettings(int itemId, int accountId, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("GetSecurityGroupGeneralSettings", new object[] { + itemId, + accountId}, callback, asyncState); + } + + /// + public OrganizationSecurityGroup EndGetSecurityGroupGeneralSettings(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((OrganizationSecurityGroup)(results[0])); + } + + /// + public void GetSecurityGroupGeneralSettingsAsync(int itemId, int accountId) + { + this.GetSecurityGroupGeneralSettingsAsync(itemId, accountId, null); + } + + /// + public void GetSecurityGroupGeneralSettingsAsync(int itemId, int accountId, object userState) + { + if ((this.GetSecurityGroupGeneralSettingsOperationCompleted == null)) + { + this.GetSecurityGroupGeneralSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetSecurityGroupGeneralSettingsOperationCompleted); + } + this.InvokeAsync("GetSecurityGroupGeneralSettings", new object[] { + itemId, + accountId}, this.GetSecurityGroupGeneralSettingsOperationCompleted, userState); + } + + private void OnGetSecurityGroupGeneralSettingsOperationCompleted(object arg) + { + if ((this.GetSecurityGroupGeneralSettingsCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetSecurityGroupGeneralSettingsCompleted(this, new GetSecurityGroupGeneralSettingsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + /// public new void CancelAsync(object userState) { base.CancelAsync(userState); @@ -2321,4 +2378,35 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { } } } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void GetSecurityGroupGeneralSettingsCompletedEventHandler(object sender, GetSecurityGroupGeneralSettingsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetSecurityGroupGeneralSettingsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal GetSecurityGroupGeneralSettingsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public OrganizationSecurityGroup Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((OrganizationSecurityGroup)(this.results[0])); + } + } + } + } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs index 95d5da6f..d4a3f09e 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs @@ -1640,6 +1640,20 @@ namespace WebsitePanel.EnterpriseServer return account; } + /*public static OrganizationUser GetAccount(int itemId, string samAccountName) + { + OrganizationUser account = ObjectUtils.FillObjectFromDataReader( + DataProvider.GetExchangeAccount(itemId, userId)); + + if (account == null) + return null; + + // decrypt password + account.AccountPassword = CryptoUtils.Decrypt(account.AccountPassword); + + return account; + }*/ + public static OrganizationUser GetAccountByAccountName(int itemId, string AccountName) { OrganizationUser account = ObjectUtils.FillObjectFromDataReader( @@ -1717,7 +1731,62 @@ namespace WebsitePanel.EnterpriseServer return (account); } - + + + private static OrganizationSecurityGroup GetDemoSecurityGroupGeneralSettings() + { + OrganizationSecurityGroup c = new OrganizationSecurityGroup(); + c.DisplayName = "Fabrikam Sales"; + c.AccountName = "sales_fabrikam"; + + return c; + } + + public static OrganizationSecurityGroup GetSecurityGroupGeneralSettings(int itemId, int accountId) + { + #region Demo Mode + if (IsDemoMode) + { + return GetDemoSecurityGroupGeneralSettings(); + } + #endregion + + // place log record + TaskManager.StartTask("ORGANIZATION", "GET_SECURITY_GROUP_GENERAL", itemId); + + try + { + // load organization + Organization org = GetOrganization(itemId); + if (org == null) + return null; + + OrganizationUser account = GetAccount(itemId, accountId); + + // get mailbox settings + Organizations orgProxy = GetOrganizationProxy(org.ServiceId); + + OrganizationSecurityGroup securityGroup = orgProxy.GetSecurityGroupGeneralSettings("test2.com"/*account.AccountName*/, org.OrganizationId); + + return securityGroup; + + /*foreach (OrganizationUser user in securityGroup.MembersAccounts) + { + OrganizationUser userAccount = GetAccount(itemId, user.SamAccountName); + + user.AccountId = user + }*/ + } + catch (Exception ex) + { + throw TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + } + public static int SetUserGeneralSettings(int itemId, int accountId, string displayName, string password, bool hideAddressBook, bool disabled, bool locked, string firstName, string initials, string lastName, string address, string city, string state, string zip, string country, @@ -2196,6 +2265,100 @@ namespace WebsitePanel.EnterpriseServer return ocs; } + public static int CreateSecurityGroup(int itemId, string displayName, string managedBy) + { + if (string.IsNullOrEmpty(displayName)) + throw new ArgumentNullException("displayName"); + + // check account + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); + if (accountCheck < 0) return accountCheck; + + + // place log record + TaskManager.StartTask("ORGANIZATION", "CREATE_SECURITY_GROUP", itemId); + + TaskManager.Write("Organization ID :" + itemId); + TaskManager.Write("display name :" + displayName); + + int userId = -1; + + try + { + /*displayName = displayName.Trim(); + name = name.Trim(); + domain = domain.Trim(); + + // e-mail + string email = name + "@" + domain; + + if (EmailAddressExists(email)) + return BusinessErrorCodes.ERROR_EXCHANGE_EMAIL_EXISTS; + + // load organization + Organization org = GetOrganization(itemId); + + if (org == null) + { + return -1; + } + + StringDictionary serviceSettings = ServerController.GetServiceSettings(org.ServiceId); + + if (serviceSettings == null) + { + return -1; + } + + // check package + int packageCheck = SecurityContext.CheckPackage(org.PackageId, DemandPackage.IsActive); + if (packageCheck < 0) return packageCheck; + + int errorCode; + if (!CheckUserQuota(org.Id, out errorCode)) + return errorCode; + + + Organizations orgProxy = GetOrganizationProxy(org.ServiceId); + + string upn = string.Format("{0}@{1}", name, domain); + string sAMAccountName = AppendOrgId(serviceSettings) ? BuildAccountNameWithOrgId(org.OrganizationId, name, org.ServiceId) : BuildAccountName(org.OrganizationId, name, org.ServiceId); + + TaskManager.Write("accountName :" + sAMAccountName); + TaskManager.Write("upn :" + upn); + + if (orgProxy.CreateUser(org.OrganizationId, sAMAccountName, displayName, upn, password, enabled) == 0) + { + accountName = sAMAccountName; + OrganizationUser retUser = orgProxy.GetUserGeneralSettings(sAMAccountName, org.OrganizationId); + TaskManager.Write("sAMAccountName :" + retUser.DomainUserName); + + userId = AddOrganizationUser(itemId, sAMAccountName, displayName, email, retUser.DomainUserName, password, subscriberNumber); + + // register email address + AddAccountEmailAddress(userId, email); + + if (sendNotification) + { + SendSummaryLetter(org.Id, userId, true, to, ""); + } + } + else + { + TaskManager.WriteError("Failed to create user"); + }*/ + } + catch (Exception ex) + { + TaskManager.WriteError(ex); + } + finally + { + TaskManager.CompleteTask(); + } + + return userId; + } } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs index ac5a1e38..57477486 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs @@ -242,5 +242,15 @@ namespace WebsitePanel.EnterpriseServer #endregion + #region Security Groups + + [WebMethod] + public OrganizationSecurityGroup GetSecurityGroupGeneralSettings(int itemId, int accountId) + { + return OrganizationController.GetSecurityGroupGeneralSettings(itemId, accountId); + } + + #endregion + } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ActiveDirectoryUtils.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ActiveDirectoryUtils.cs index 99703719..daf73dde 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ActiveDirectoryUtils.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/ActiveDirectoryUtils.cs @@ -44,6 +44,35 @@ namespace WebsitePanel.Providers.HostedSolution return de; } + public static string[] GetUsersGroup(string group) + { + List rets = new List(); + + DirectorySearcher deSearch = new DirectorySearcher + { + Filter = + ("(&(objectClass=user))") + }; + + SearchResultCollection srcUsers = deSearch.FindAll(); + + foreach (SearchResult srcUser in srcUsers) + { + DirectoryEntry de = srcUser.GetDirectoryEntry(); + PropertyValueCollection props = de.Properties["memberOf"]; + + foreach (string str in props) + { + if (str.IndexOf(group) != -1) + { + rets.Add(de.Path); + } + } + } + + return rets.ToArray(); + } + public static bool IsUserInGroup(string samAccountName, string group) { bool res = false; diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IOrganization.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IOrganization.cs index 6da1e71a..3d705576 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IOrganization.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IOrganization.cs @@ -42,6 +42,8 @@ namespace WebsitePanel.Providers.HostedSolution OrganizationUser GetUserGeneralSettings(string loginName, string organizationId); + OrganizationSecurityGroup GetSecurityGroupGeneralSettings(string groupName, string organizationId); + void SetUserGeneralSettings(string organizationId, string accountName, string displayName, string password, bool hideFromAddressBook, bool disabled, bool locked, string firstName, string initials, string lastName, diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/OrganizationSecurityGroup.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/OrganizationSecurityGroup.cs new file mode 100644 index 00000000..5e52f13f --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/OrganizationSecurityGroup.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace WebsitePanel.Providers.HostedSolution +{ + public class OrganizationSecurityGroup + { + public string DisplayName + { + get; + set; + } + + public string AccountName + { + get; + set; + } + + public OrganizationUser[] MembersAccounts + { + get; + set; + } + + public OrganizationUser ManagerAccount + { + get; + set; + } + + public string Notes + { + get; + set; + } + + public string SAMAccountName + { + get; + set; + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj b/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj index 5d78b301..338a6d63 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj @@ -101,6 +101,7 @@ + diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs index 53689f1d..2e03725b 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs @@ -27,10 +27,10 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using System; +using System.Collections.Generic; using System.DirectoryServices; using System.Globalization; using System.Text; - using WebsitePanel.Providers.Common; using WebsitePanel.Providers.ResultObjects; @@ -498,10 +498,19 @@ namespace WebsitePanel.Providers.HostedSolution throw new ArgumentNullException("loginName"); string path = GetUserPath(organizationId, loginName); - DirectoryEntry entry = ActiveDirectoryUtils.GetADObject(path); + OrganizationUser retUser = GetUser(path); + + HostedSolutionLog.LogEnd("GetUserGeneralSettingsInternal"); + return retUser; + } + + private OrganizationUser GetUser(string path) + { OrganizationUser retUser = new OrganizationUser(); + DirectoryEntry entry = ActiveDirectoryUtils.GetADObject(path); + retUser.FirstName = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.FirstName); retUser.LastName = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.LastName); retUser.DisplayName = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.DisplayName); @@ -529,9 +538,8 @@ namespace WebsitePanel.Providers.HostedSolution retUser.DomainUserName = GetDomainName(ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.SAMAccountName)); retUser.DistinguishedName = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.DistinguishedName); retUser.Locked = (bool)entry.InvokeGet(ADAttributes.AccountLocked); - retUser.UserPrincipalName= (string)entry.InvokeGet(ADAttributes.UserPrincipalName); + retUser.UserPrincipalName = (string)entry.InvokeGet(ADAttributes.UserPrincipalName); - HostedSolutionLog.LogEnd("GetUserGeneralSettingsInternal"); return retUser; } @@ -800,6 +808,108 @@ namespace WebsitePanel.Providers.HostedSolution } #endregion + #region Security Groups + + public int CreateSecurityGroup(string organizationId, string displayName, string managedBy) + { + return CreateSecurityGroupInternal(organizationId, displayName, managedBy); + } + + internal int CreateSecurityGroupInternal(string organizationId, string displayName, string managedBy) + { + HostedSolutionLog.LogStart("CreateSecurityGroupInternal"); + HostedSolutionLog.DebugInfo("organizationId : {0}", organizationId); + HostedSolutionLog.DebugInfo("displayName : {0}", displayName); + + if (string.IsNullOrEmpty(organizationId)) + throw new ArgumentNullException("organizationId"); + + bool groupCreated = false; + string groupPath = null; + try + { + string path = GetOrganizationPath(organizationId); + groupPath = GetUserPath(organizationId, displayName); + + if (!ActiveDirectoryUtils.AdObjectExists(groupPath)) + { + ActiveDirectoryUtils.CreateGroup(path, displayName); + + DirectoryEntry entry = new DirectoryEntry(groupPath); + ActiveDirectoryUtils.SetADObjectProperty(entry, ADAttributes.Manager, managedBy); + entry.CommitChanges(); + + groupCreated = true; + HostedSolutionLog.DebugInfo("Security Group created: {0}", displayName); + } + else + { + HostedSolutionLog.DebugInfo("AD_OBJECT_ALREADY_EXISTS: {0}", groupPath); + HostedSolutionLog.LogEnd("CreateSecurityGroupInternal"); + return Errors.AD_OBJECT_ALREADY_EXISTS; + } + } + catch (Exception e) + { + HostedSolutionLog.LogError(e); + try + { + if (groupCreated) + ActiveDirectoryUtils.DeleteADObject(groupPath); + } + catch (Exception ex) + { + HostedSolutionLog.LogError(ex); + } + + return Errors.AD_OBJECT_ALREADY_EXISTS; + } + + HostedSolutionLog.LogEnd("CreateSecurityGroupInternal"); + return Errors.OK; + } + + public OrganizationSecurityGroup GetSecurityGroupGeneralSettings(string groupName, string organizationId) + { + return GetSecurityGroupGeneralSettingsInternal(groupName, organizationId); + } + + internal OrganizationSecurityGroup GetSecurityGroupGeneralSettingsInternal(string groupName, string organizationId) + { + HostedSolutionLog.LogStart("GetSecurityGroupGeneralSettingsInternal"); + HostedSolutionLog.DebugInfo("groupName : {0}", groupName); + HostedSolutionLog.DebugInfo("organizationId : {0}", organizationId); + + if (string.IsNullOrEmpty(groupName)) + throw new ArgumentNullException("groupName"); + + string path = GetUserPath(organizationId, groupName); + + DirectoryEntry entry = ActiveDirectoryUtils.GetADObject(path); + + OrganizationSecurityGroup securityGroup = new OrganizationSecurityGroup(); + + securityGroup.DisplayName = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.DisplayName); + securityGroup.ManagerAccount = GetManager(entry); + securityGroup.Notes = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.Notes); + securityGroup.SAMAccountName = ActiveDirectoryUtils.GetADObjectStringProperty(entry, ADAttributes.SAMAccountName); + + List members = new List(); + + foreach (string userPath in ActiveDirectoryUtils.GetUsersGroup(groupName)) + { + members.Add(GetUser(userPath)); + } + + securityGroup.MembersAccounts = members.ToArray(); + + HostedSolutionLog.LogEnd("GetSecurityGroupGeneralSettingsInternal"); + + return securityGroup; + } + + #endregion + public override bool IsInstalled() { return Environment.UserDomainName != Environment.MachineName; diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Client/OrganizationProxy.cs b/WebsitePanel/Sources/WebsitePanel.Server.Client/OrganizationProxy.cs index eb607e66..a89300cf 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server.Client/OrganizationProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server.Client/OrganizationProxy.cs @@ -77,6 +77,8 @@ namespace WebsitePanel.Providers.HostedSolution private System.Threading.SendOrPostCallback GetUserGeneralSettingsOperationCompleted; + private System.Threading.SendOrPostCallback GetSecurityGroupGeneralSettingsOperationCompleted; + private System.Threading.SendOrPostCallback SetUserGeneralSettingsOperationCompleted; private System.Threading.SendOrPostCallback SetUserPasswordOperationCompleted; @@ -117,6 +119,9 @@ namespace WebsitePanel.Providers.HostedSolution /// public event GetUserGeneralSettingsCompletedEventHandler GetUserGeneralSettingsCompleted; + /// + public event GetSecurityGroupGeneralSettingsCompletedEventHandler GetSecurityGroupGeneralSettingsCompleted; + /// public event SetUserGeneralSettingsCompletedEventHandler SetUserGeneralSettingsCompleted; @@ -458,6 +463,59 @@ namespace WebsitePanel.Providers.HostedSolution } } + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetSecurityGroupGeneralSettings", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public OrganizationSecurityGroup GetSecurityGroupGeneralSettings(string groupName, string organizationId) + { + object[] results = this.Invoke("GetSecurityGroupGeneralSettings", new object[] { + groupName, + organizationId}); + return ((OrganizationSecurityGroup)(results[0])); + } + + /// + public System.IAsyncResult BeginGetSecurityGroupGeneralSettings(string groupName, string organizationId, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("GetSecurityGroupGeneralSettings", new object[] { + groupName, + organizationId}, callback, asyncState); + } + + /// + public OrganizationSecurityGroup EndGetSecurityGroupGeneralSettings(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((OrganizationSecurityGroup)(results[0])); + } + + /// + public void GetSecurityGroupGeneralSettingsAsync(string groupName, string organizationId) + { + this.GetSecurityGroupGeneralSettingsAsync(groupName, organizationId, null); + } + + /// + public void GetSecurityGroupGeneralSettingsAsync(string groupName, string organizationId, object userState) + { + if ((this.GetSecurityGroupGeneralSettingsOperationCompleted == null)) + { + this.GetSecurityGroupGeneralSettingsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetSecurityGroupGeneralSettingsOperationCompleted); + } + this.InvokeAsync("GetSecurityGroupGeneralSettings", new object[] { + groupName, + organizationId}, this.GetSecurityGroupGeneralSettingsOperationCompleted, userState); + } + + private void OnGetSecurityGroupGeneralSettingsOperationCompleted(object arg) + { + if ((this.GetSecurityGroupGeneralSettingsCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetSecurityGroupGeneralSettingsCompleted(this, new GetSecurityGroupGeneralSettingsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SetUserGeneralSettings", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] @@ -1197,6 +1255,36 @@ namespace WebsitePanel.Providers.HostedSolution } } + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void GetSecurityGroupGeneralSettingsCompletedEventHandler(object sender, GetSecurityGroupGeneralSettingsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetSecurityGroupGeneralSettingsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal GetSecurityGroupGeneralSettingsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public OrganizationSecurityGroup Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((OrganizationSecurityGroup)(this.results[0])); + } + } + } + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] public delegate void SetUserGeneralSettingsCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); diff --git a/WebsitePanel/Sources/WebsitePanel.Server/Organizations.asmx.cs b/WebsitePanel/Sources/WebsitePanel.Server/Organizations.asmx.cs index 1e814394..8a0c2c05 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server/Organizations.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server/Organizations.asmx.cs @@ -110,6 +110,12 @@ namespace WebsitePanel.Server return Organization.GetUserGeneralSettings(loginName, organizationId); } + [WebMethod, SoapHeader("settings")] + public OrganizationSecurityGroup GetSecurityGroupGeneralSettings(string groupName, string organizationId) + { + return Organization.GetSecurityGroupGeneralSettings(groupName, organizationId); + } + [WebMethod, SoapHeader("settings")] public void SetUserGeneralSettings(string organizationId, string accountName, string displayName, string password, bool hideFromAddressBook, bool disabled, bool locked, string firstName, string initials, string lastName, diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config index 63db8671..2e061dfb 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Data/WebsitePanel_Modules.config @@ -529,6 +529,10 @@ + + + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx index 6ce646b8..598a7466 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_GlobalResources/WebsitePanel_SharedResources.ascx.resx @@ -3302,6 +3302,9 @@ Domains per Organization + + Allow Security Group Management + Hosted SharePoint diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationCreateSecurityGroup.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationCreateSecurityGroup.ascx.resx new file mode 100644 index 00000000..1b640863 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationCreateSecurityGroup.ascx.resx @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ShowProgressDialog('Creating security group ...'); + + + Create Security Group + + + + + + E-mail Address: * + + + Display Name: * + + + Managed by: * + + + Create New Security Group + + + Security Groups + + + Please specify a manager + + + Enter Display Name + + + * + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationSecurityGroupGeneralSettings.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationSecurityGroupGeneralSettings.ascx.resx new file mode 100644 index 00000000..ab196e38 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationSecurityGroupGeneralSettings.ascx.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ShowProgressDialog('Updating security group settings...'); + + + Save Changes + + + Hide from Address Book + + + + + + Managed By: * + + + Members: + + + Notes: + + + Edit Security Group + + + Security Group + + + Please specify a manager + + + Enter Display Name + + + * + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationSecurityGroups.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationSecurityGroups.ascx.resx new file mode 100644 index 00000000..970456a1 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/OrganizationSecurityGroups.ascx.resx @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Create New Security Group + + + if(!confirm('Are you sure you want to delete this security group?')) return false; else ShowProgressDialog('Deleting security group...'); + + + Delete + + + Delete Security Group + + + Search + + + Display Name + + + E-mail Address + + + + + + No security groups have been created. To create a new security group click "Create New Security Group" button. + + + Display Name + + + E-mail Address + + + Total Security Groups Created: + + + Security Groups + + + Security Groups + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateSecurityGroup.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateSecurityGroup.ascx new file mode 100644 index 00000000..2f4d76aa --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateSecurityGroup.ascx @@ -0,0 +1,56 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="OrganizationCreateSecurityGroup.ascx.cs" Inherits="WebsitePanel.Portal.ExchangeServer.OrganizationCreateSecurityGroup" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/EmailAddress.ascx" TagName="EmailAddress" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + +<%@ Register src="UserControls/UserSelector.ascx" tagname="UserSelector" tagprefix="wsp" %> + + + +
+
+
+ +
+
+ +
+
+
+
+ + +
+
+ + + + + + + + + + + +
+ + +
+ + +
+
+ + +
+
+
+
+
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateSecurityGroup.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateSecurityGroup.ascx.cs new file mode 100644 index 00000000..1d38154f --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateSecurityGroup.ascx.cs @@ -0,0 +1,96 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; +using WebsitePanel.EnterpriseServer; + +namespace WebsitePanel.Portal.ExchangeServer +{ + public partial class OrganizationCreateSecurityGroup : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + + } + + protected void btnCreate_Click(object sender, EventArgs e) + { + CreateSecurityGroup(); + } + + private void CreateSecurityGroup() + { + /*if (!Page.IsValid) + return;*/ + + + + try + { + + //int accountId = ES.Services.ExchangeServer.CreateDistributionList(PanelRequest.ItemID, + // txtDisplayName.Text.Trim(), + // email.AccountName, + // email.DomainName, + // manager.GetAccountId()); + + + //if (accountId < 0) + //{ + // messageBox.ShowResultMessage(accountId); + // return; + //} + + //Response.Redirect(EditUrl("AccountID", accountId.ToString(), "dlist_settings", + // "SpaceID=" + PanelSecurity.PackageId.ToString(), + // "ItemID=" + PanelRequest.ItemID.ToString())); + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("EXCHANGE_CREATE_DISTRIBUTION_LIST", ex); + } + } + + protected void valManager_ServerValidate(object source, ServerValidateEventArgs args) + { + args.IsValid = manager.GetAccountId() != 0; + + } + + + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateSecurityGroup.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateSecurityGroup.ascx.designer.cs new file mode 100644 index 00000000..13281f4f --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationCreateSecurityGroup.ascx.designer.cs @@ -0,0 +1,141 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.ExchangeServer { + + + public partial class OrganizationCreateSecurityGroup { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; + + /// + /// Image1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image Image1; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// locDisplayName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locDisplayName; + + /// + /// txtDisplayName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtDisplayName; + + /// + /// valRequireDisplayName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireDisplayName; + + /// + /// Localize1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize Localize1; + + /// + /// manager control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.UserSelector manager; + + /// + /// valManager control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CustomValidator valManager; + + /// + /// btnCreate control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCreate; + + /// + /// ValidationSummary1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ValidationSummary ValidationSummary1; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroupGeneralSettings.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroupGeneralSettings.ascx new file mode 100644 index 00000000..884eeded --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroupGeneralSettings.ascx @@ -0,0 +1,83 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="OrganizationSecurityGroupGeneralSettings.ascx.cs" Inherits="WebsitePanel.Portal.ExchangeServer.OrganizationSecurityGroupGeneralSettings" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%--<%@ Register Src="UserControls/AccountsList.ascx" TagName="AccountsList" TagPrefix="wsp" %>--%> +<%@ Register Src="UserControls/UsersList.ascx" TagName="UsersList" TagPrefix="wsp"%> +<%@ Register Src="UserControls/UserSelector.ascx" TagName="UserSelector" TagPrefix="wsp" %> +<%@ Register Src="UserControls/SecurityGroupTabs.ascx" TagName="SecurityGroupTabs" TagPrefix="wsp"%> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register TagPrefix="wsp" TagName="CollapsiblePanel" Src="../UserControls/CollapsiblePanel.ascx" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
+
+
+ +
+
+ +
+
+
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + + +
 
+ +
 
+ +
+ +
+ + +
+
+
+
+
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroupGeneralSettings.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroupGeneralSettings.ascx.cs new file mode 100644 index 00000000..7f3e9074 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroupGeneralSettings.ascx.cs @@ -0,0 +1,125 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; + +using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.EnterpriseServer; + +namespace WebsitePanel.Portal.ExchangeServer +{ + public partial class OrganizationSecurityGroupGeneralSettings : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindSettings(); + } + } + + private void BindSettings() + { + try + { + // get settings + OrganizationSecurityGroup securityGroup = ES.Services.Organizations.GetSecurityGroupGeneralSettings( + PanelRequest.ItemID, PanelRequest.AccountID); + + litDisplayName.Text = PortalAntiXSS.Encode(securityGroup.DisplayName); + + // bind form + txtDisplayName.Text = securityGroup.DisplayName; + + manager.SetAccount(securityGroup.ManagerAccount); + + members.SetAccounts(securityGroup.MembersAccounts); + + txtNotes.Text = securityGroup.Notes; + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("EXCHANGE_GET_DLIST_SETTINGS", ex); + } + } + + private void SaveSettings() + { + if (!Page.IsValid) + return; + + try + { + int result = ES.Services.ExchangeServer.SetDistributionListGeneralSettings( + PanelRequest.ItemID, PanelRequest.AccountID, + txtDisplayName.Text, + false, + + manager.GetAccount(), + + members.GetAccounts(), + + txtNotes.Text); + + if (result < 0) + { + messageBox.ShowResultMessage(result); + return; + } + + litDisplayName.Text = PortalAntiXSS.Encode(txtDisplayName.Text); + + messageBox.ShowSuccessMessage("EXCHANGE_UPDATE_DLIST_SETTINGS"); + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("EXCHANGE_UPDATE_DLIST_SETTINGS", ex); + } + } + + protected void btnSave_Click(object sender, EventArgs e) + { + SaveSettings(); + } + + protected void valManager_ServerValidate(object source, ServerValidateEventArgs args) + { + args.IsValid = manager.GetAccount() != null; + + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroupGeneralSettings.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroupGeneralSettings.ascx.designer.cs new file mode 100644 index 00000000..15f2c099 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroupGeneralSettings.ascx.designer.cs @@ -0,0 +1,195 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.ExchangeServer { + + + public partial class OrganizationSecurityGroupGeneralSettings { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; + + /// + /// Image1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image Image1; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// litDisplayName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Literal litDisplayName; + + /// + /// tabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.SecurityGroupTabs tabs; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// locDisplayName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locDisplayName; + + /// + /// txtDisplayName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtDisplayName; + + /// + /// valRequireDisplayName control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireDisplayName; + + /// + /// locManager control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locManager; + + /// + /// manager control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.UserSelector manager; + + /// + /// valManager control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CustomValidator valManager; + + /// + /// locMembers control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locMembers; + + /// + /// members control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.UsersList members; + + /// + /// locNotes control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locNotes; + + /// + /// txtNotes control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtNotes; + + /// + /// btnSave control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnSave; + + /// + /// ValidationSummary1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ValidationSummary ValidationSummary1; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroups.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroups.ascx new file mode 100644 index 00000000..95b44dcd --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroups.ascx @@ -0,0 +1,99 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="OrganizationSecurityGroups.ascx.cs" Inherits="WebsitePanel.Portal.ExchangeServer.OrganizationSecurityGroups" %> +<%@ Register Src="../UserControls/SimpleMessageBox.ascx" TagName="SimpleMessageBox" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> +<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/QuotaViewer.ascx" TagName="QuotaViewer" TagPrefix="wsp" %> +<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> + + + +
+
+
+ +
+
+ +
+
+
+
+ + +
+ +
+ +
+
+ +
+
+ + + + 10 + 20 + 50 + 100 + + + + DisplayName + Email + + +
+
+ + + + + + + + <%# Eval("DisplayName") %> + + + + + + + + + + + + + + + + + + + +
+ +     + + + +
+
+
+
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroups.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroups.ascx.cs new file mode 100644 index 00000000..d7fadd39 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroups.ascx.cs @@ -0,0 +1,130 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Data; +using System.Configuration; +using System.Collections; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Web.UI.WebControls.WebParts; +using System.Web.UI.HtmlControls; + +using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.EnterpriseServer; + +namespace WebsitePanel.Portal.ExchangeServer +{ + public partial class OrganizationSecurityGroups : WebsitePanelModuleBase + { + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + BindStats(); + } + + + } + + private void BindStats() + { + // quota values + OrganizationStatistics stats = ES.Services.ExchangeServer.GetOrganizationStatisticsByOrganization(PanelRequest.ItemID); + OrganizationStatistics tenantStats = ES.Services.ExchangeServer.GetOrganizationStatistics(PanelRequest.ItemID); + listsQuota.QuotaUsedValue = stats.CreatedDistributionLists; + listsQuota.QuotaValue = stats.AllocatedDistributionLists; + if (stats.AllocatedDistributionLists != -1) listsQuota.QuotaAvailable = tenantStats.AllocatedDistributionLists - tenantStats.CreatedDistributionLists; + } + + protected void btnCreateList_Click(object sender, EventArgs e) + { + Response.Redirect(EditUrl("ItemID", PanelRequest.ItemID.ToString(), "create_secur_group", + "SpaceID=" + PanelSecurity.PackageId.ToString())); + } + + public string GetListEditUrl(string accountId) + { + return EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "secur_group_settings", + "AccountID=" + accountId, + "ItemID=" + PanelRequest.ItemID.ToString()); + } + + protected void odsAccountsPaged_Selected(object sender, ObjectDataSourceStatusEventArgs e) + { + if (e.Exception != null) + { + messageBox.ShowErrorMessage("EXCHANGE_GET_LISTS", e.Exception); + e.ExceptionHandled = true; + } + } + + protected void gvLists_RowCommand(object sender, GridViewCommandEventArgs e) + { + if (e.CommandName == "DeleteItem") + { + // delete distribution list + int accountId = Utils.ParseInt(e.CommandArgument.ToString(), 0); + + try + { + int result = ES.Services.ExchangeServer.DeleteDistributionList(PanelRequest.ItemID, accountId); + if (result < 0) + { + messageBox.ShowResultMessage(result); + return; + } + + // rebind grid + gvLists.DataBind(); + + BindStats(); + } + catch (Exception ex) + { + messageBox.ShowErrorMessage("EXCHANGE_DELETE_DISTRIBUTION_LIST", ex); + } + } + } + + protected void ddlPageSize_SelectedIndexChanged(object sender, EventArgs e) + { + gvLists.PageSize = Convert.ToInt16(ddlPageSize.SelectedValue); + + // rebind grid + gvLists.DataBind(); + + // bind stats + BindStats(); + + } + + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroups.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroups.ascx.designer.cs new file mode 100644 index 00000000..33a03516 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/OrganizationSecurityGroups.ascx.designer.cs @@ -0,0 +1,168 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.ExchangeServer { + + + public partial class OrganizationSecurityGroups { + + /// + /// asyncTasks control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; + + /// + /// breadcrumb control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Breadcrumb breadcrumb; + + /// + /// menu control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.ExchangeServer.UserControls.Menu menu; + + /// + /// Image1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Image Image1; + + /// + /// locTitle control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locTitle; + + /// + /// messageBox control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox; + + /// + /// btnCreateList control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCreateList; + + /// + /// SearchPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel SearchPanel; + + /// + /// locSearch control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locSearch; + + /// + /// ddlPageSize control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList ddlPageSize; + + /// + /// ddlSearchColumn control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList ddlSearchColumn; + + /// + /// txtSearchValue control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtSearchValue; + + /// + /// cmdSearch control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ImageButton cmdSearch; + + /// + /// gvLists control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvLists; + + /// + /// odsAccountsPaged control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ObjectDataSource odsAccountsPaged; + + /// + /// locQuota control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locQuota; + + /// + /// listsQuota control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::WebsitePanel.Portal.QuotaViewer listsQuota; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/Menu.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/Menu.ascx.resx index 88b4cd31..6f7f310c 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/Menu.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/Menu.ascx.resx @@ -201,4 +201,7 @@ Lync Federation Domains + + Security Groups + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/SecurityGroupTabs.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/SecurityGroupTabs.ascx.resx new file mode 100644 index 00000000..54222974 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/SecurityGroupTabs.ascx.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + E-mail Addresses + + + Mail Flow Settings + + + General + + + Permissions + + + Member Of + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/UsersList.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/UsersList.ascx.resx new file mode 100644 index 00000000..54fc0f61 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/App_LocalResources/UsersList.ascx.resx @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Add... + + + Add Accounts + + + Cancel + + + Delete + + + Contacts + + + Equipment + + + Distribution Lists + + + Mailboxes + + + Rooms + + + Display Name + + + E-mail Address + + + The list of accounts is empty. Click "Add..." button to add accounts. + + + Display Name + + + E-mail Address + + + No accounts found. + + + Organization Users + + + Include in search: + + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/Menu.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/Menu.ascx.cs index 3792ae03..639a8fed 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/Menu.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/Menu.ascx.cs @@ -178,6 +178,9 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls if (Utils.CheckQouta(Quotas.ORGANIZATION_USERS, cntx)) organizationGroup.MenuItems.Add(CreateMenuItem("Users", "users")); + if (Utils.CheckQouta(Quotas.ORGANIZATION_SECURITYGROUPMANAGEMENT, cntx)) + organizationGroup.MenuItems.Add(CreateMenuItem("SecurityGroups", "secur_groups")); + if (organizationGroup.MenuItems.Count > 0) groups.Add(organizationGroup); } diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/SecurityGroupTabs.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/SecurityGroupTabs.ascx new file mode 100644 index 00000000..9a1082e8 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/SecurityGroupTabs.ascx @@ -0,0 +1,24 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SecurityGroupTabs.ascx.cs" Inherits="WebsitePanel.Portal.ExchangeServer.UserControls.SecurityGroupTabs" %> + + + + +
+    + + + + + <%# Eval("Name") %> + + + + + + <%# Eval("Name") %> + + + +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/SecurityGroupTabs.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/SecurityGroupTabs.ascx.cs new file mode 100644 index 00000000..e99be105 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/SecurityGroupTabs.ascx.cs @@ -0,0 +1,81 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Collections.Generic; +using WebsitePanel.Portal.Code.UserControls; +using WebsitePanel.WebPortal; +using WebsitePanel.EnterpriseServer; + + +namespace WebsitePanel.Portal.ExchangeServer.UserControls +{ + public partial class SecurityGroupTabs : WebsitePanelControlBase + { + private string selectedTab; + public string SelectedTab + { + get { return selectedTab; } + set { selectedTab = value; } + } + + protected void Page_Load(object sender, EventArgs e) + { + BindTabs(); + } + + private void BindTabs() + { + List tabsList = new List(); + tabsList.Add(CreateTab("secur_group_settings", "Tab.Settings")); + + PackageContext cntx = PackagesHelper.GetCachedPackageContext(PanelSecurity.PackageId); + + // find selected menu item + int idx = 0; + foreach (Tab tab in tabsList) + { + if (String.Compare(tab.Id, SelectedTab, true) == 0) + break; + idx++; + } + dlTabs.SelectedIndex = idx; + + dlTabs.DataSource = tabsList; + dlTabs.DataBind(); + } + + private Tab CreateTab(string id, string text) + { + return new Tab(id, GetLocalizedString(text), + HostModule.EditUrl("AccountID", PanelRequest.AccountID.ToString(), id, + "SpaceID=" + PanelSecurity.PackageId.ToString(), + "ItemID=" + PanelRequest.ItemID.ToString())); + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/SecurityGroupTabs.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/SecurityGroupTabs.ascx.designer.cs new file mode 100644 index 00000000..90b558b3 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/SecurityGroupTabs.ascx.designer.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.ExchangeServer.UserControls { + + + public partial class SecurityGroupTabs { + + /// + /// dlTabs control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DataList dlTabs; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UsersList.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UsersList.ascx new file mode 100644 index 00000000..3ba117e9 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UsersList.ascx @@ -0,0 +1,120 @@ +<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UsersList.ascx.cs" Inherits="WebsitePanel.Portal.ExchangeServer.UserControls.UsersList" %> +<%@ Register Src="../../UserControls/PopupHeader.ascx" TagName="PopupHeader" TagPrefix="wsp" %> + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
\ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UsersList.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UsersList.ascx.cs new file mode 100644 index 00000000..081f0341 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UsersList.ascx.cs @@ -0,0 +1,342 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// - Neither the name of the Outercurve Foundation nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +using System; +using System.Collections.Generic; +using System.Web.UI; +using System.Web.UI.WebControls; +using WebsitePanel.Providers.HostedSolution; + +namespace WebsitePanel.Portal.ExchangeServer.UserControls +{ + public partial class UsersList : WebsitePanelControlBase + { + public const string DirectionString = "DirectionString"; + + private enum SelectedState + { + All, + Selected, + Unselected + } + + public bool IncludeMailboxes + { + get + { + object ret = ViewState["IncludeMailboxes"]; + return (ret != null) ? (bool)ret : false; + } + set + { + ViewState["IncludeMailboxes"] = value; + } + } + + public bool IncludeMailboxesOnly + { + get + { + object ret = ViewState["IncludeMailboxesOnly"]; + return (ret != null) ? (bool)ret : false; + } + set + { + ViewState["IncludeMailboxesOnly"] = value; + } + } + + + public bool ExcludeOCSUsers + { + get + { + object ret = ViewState["ExcludeOCSUsers"]; + return (ret != null) ? (bool)ret : false; + } + set + { + ViewState["ExcludeOCSUsers"] = value; + } + } + + public bool ExcludeLyncUsers + { + get + { + object ret = ViewState["ExcludeLyncUsers"]; + return (ret != null) ? (bool)ret : false; + } + set + { + ViewState["ExcludeLyncUsers"] = value; + } + } + + + public bool ExcludeBESUsers + { + get + { + object ret = ViewState["ExcludeBESUsers"]; + return (ret != null) ? (bool)ret : false; + } + set + { + ViewState["ExcludeBESUsers"] = value; + } + } + + public int ExcludeAccountId + { + get { return PanelRequest.AccountID; } + } + + public void SetAccounts(OrganizationUser[] accounts) + { + BindAccounts(accounts, false); + } + + public string[] GetAccounts() + { + // get selected accounts + List selectedAccounts = GetGridViewAccounts(gvAccounts, SelectedState.All); + + List accountNames = new List(); + foreach (OrganizationUser account in selectedAccounts) + accountNames.Add(account.AccountName); + + return accountNames.ToArray(); + } + + protected void Page_Load(object sender, EventArgs e) + { + // register javascript + if (!Page.ClientScript.IsClientScriptBlockRegistered("SelectAllCheckboxes")) + { + string script = @" function SelectAllCheckboxes(box) + { + var state = box.checked; + var elm = box.parentElement.parentElement.parentElement.parentElement.getElementsByTagName(""INPUT""); + for(i = 0; i < elm.length; i++) + if(elm[i].type == ""checkbox"" && elm[i].id != box.id && elm[i].checked != state && !elm[i].disabled) + elm[i].checked = state; + }"; + Page.ClientScript.RegisterClientScriptBlock(typeof(AccountsList), "SelectAllCheckboxes", + script, true); + } + } + + protected void btnAdd_Click(object sender, EventArgs e) + { + // bind all accounts + BindPopupAccounts(); + + // show modal + AddAccountsModal.Show(); + } + + protected void btnDelete_Click(object sender, EventArgs e) + { + // get selected accounts + List selectedAccounts = GetGridViewAccounts(gvAccounts, SelectedState.Unselected); + + // add to the main list + BindAccounts(selectedAccounts.ToArray(), false); + } + + protected void btnAddSelected_Click(object sender, EventArgs e) + { + // get selected accounts + List selectedAccounts = GetGridViewAccounts(gvPopupAccounts, SelectedState.Selected); + + // add to the main list + BindAccounts(selectedAccounts.ToArray(), true); + } + + public string GetAccountImage(int accountTypeId) + { + string imgName = string.Empty; + + ExchangeAccountType accountType = (ExchangeAccountType)accountTypeId; + switch (accountType) + { + case ExchangeAccountType.Room: + imgName = "room_16.gif"; + break; + case ExchangeAccountType.Equipment: + imgName = "equipment_16.gif"; + break; + default: + imgName = "admin_16.png"; + break; + } + + return GetThemedImage("Exchange/" + imgName); + } + + private void BindPopupAccounts() + { + OrganizationUser[] accounts = ES.Services.Organizations.SearchAccounts(PanelRequest.ItemID, + ddlSearchColumn.SelectedValue, txtSearchValue.Text + "%", "", IncludeMailboxes); + + if (ExcludeAccountId > 0) + { + List updatedAccounts = new List(); + foreach (OrganizationUser account in accounts) + if (account.AccountId != ExcludeAccountId) + updatedAccounts.Add(account); + + accounts = updatedAccounts.ToArray(); + } + + if (IncludeMailboxesOnly) + { + + List updatedAccounts = new List(); + foreach (OrganizationUser account in accounts) + { + bool addUser = false; + if (account.ExternalEmail != string.Empty) addUser = true; + if ((account.IsBlackBerryUser) & (ExcludeBESUsers)) addUser = false; + if ((account.IsLyncUser) & (ExcludeLyncUsers)) addUser = false; + + if (addUser) updatedAccounts.Add(account); + } + + accounts = updatedAccounts.ToArray(); + } + else + if ((ExcludeOCSUsers) | (ExcludeBESUsers) | (ExcludeLyncUsers)) + { + + List updatedAccounts = new List(); + foreach (OrganizationUser account in accounts) + { + bool addUser = true; + if ((account.IsOCSUser) & (ExcludeOCSUsers)) addUser = false; + if ((account.IsLyncUser) & (ExcludeLyncUsers)) addUser = false; + if ((account.IsBlackBerryUser) & (ExcludeBESUsers)) addUser = false; + + if (addUser) updatedAccounts.Add(account); + } + + accounts = updatedAccounts.ToArray(); + } + + + Array.Sort(accounts, CompareAccount); + if (Direction == SortDirection.Ascending) + { + Array.Reverse(accounts); + Direction = SortDirection.Descending; + } + else + Direction = SortDirection.Ascending; + + gvPopupAccounts.DataSource = accounts; + gvPopupAccounts.DataBind(); + } + + private void BindAccounts(OrganizationUser[] newAccounts, bool preserveExisting) + { + // get binded addresses + List accounts = new List(); + if(preserveExisting) + accounts.AddRange(GetGridViewAccounts(gvAccounts, SelectedState.All)); + + // add new accounts + if (newAccounts != null) + { + foreach (OrganizationUser newAccount in newAccounts) + { + // check if exists + bool exists = false; + foreach (OrganizationUser account in accounts) + { + if (String.Compare(newAccount.SamAccountName, account.SamAccountName, true) == 0) + { + exists = true; + break; + } + } + + if (exists) + continue; + + accounts.Add(newAccount); + } + } + + gvAccounts.DataSource = accounts; + gvAccounts.DataBind(); + + btnDelete.Visible = gvAccounts.Rows.Count > 0; + } + + private List GetGridViewAccounts(GridView gv, SelectedState state) + { + List accounts = new List(); + for (int i = 0; i < gv.Rows.Count; i++) + { + GridViewRow row = gv.Rows[i]; + CheckBox chkSelect = (CheckBox)row.FindControl("chkSelect"); + if (chkSelect == null) + continue; + + OrganizationUser account = new OrganizationUser(); + account.AccountType = (ExchangeAccountType)Enum.Parse(typeof(ExchangeAccountType), ((Literal)row.FindControl("litAccountType")).Text); + account.AccountName = (string)gv.DataKeys[i][0]; + account.DisplayName = ((Literal)row.FindControl("litDisplayName")).Text; + account.PrimaryEmailAddress = ((Literal)row.FindControl("litPrimaryEmailAddress")).Text; + + if(state == SelectedState.All || + (state == SelectedState.Selected && chkSelect.Checked) || + (state == SelectedState.Unselected && !chkSelect.Checked)) + accounts.Add(account); + } + return accounts; + } + + protected void cmdSearch_Click(object sender, ImageClickEventArgs e) + { + BindPopupAccounts(); + } + + private SortDirection Direction + { + get { return ViewState[DirectionString] == null ? SortDirection.Descending : (SortDirection)ViewState[DirectionString]; } + set { ViewState[DirectionString] = value; } + } + + private static int CompareAccount(OrganizationUser user1, OrganizationUser user2) + { + return string.Compare(user1.DisplayName, user2.DisplayName); + } + } +} \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UsersList.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UsersList.ascx.designer.cs new file mode 100644 index 00000000..d78039bf --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/UserControls/UsersList.ascx.designer.cs @@ -0,0 +1,159 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace WebsitePanel.Portal.ExchangeServer.UserControls { + + + public partial class UsersList { + + /// + /// AccountsUpdatePanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.UpdatePanel AccountsUpdatePanel; + + /// + /// btnAdd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnAdd; + + /// + /// btnDelete control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnDelete; + + /// + /// gvAccounts control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvAccounts; + + /// + /// AddAccountsPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel AddAccountsPanel; + + /// + /// headerAddAccounts control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize headerAddAccounts; + + /// + /// AddAccountsUpdatePanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.UpdatePanel AddAccountsUpdatePanel; + + /// + /// SearchPanel control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Panel SearchPanel; + + /// + /// ddlSearchColumn control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.DropDownList ddlSearchColumn; + + /// + /// txtSearchValue control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtSearchValue; + + /// + /// cmdSearch control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ImageButton cmdSearch; + + /// + /// gvPopupAccounts control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.GridView gvPopupAccounts; + + /// + /// btnAddSelected control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnAddSelected; + + /// + /// btnCancelAdd control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnCancelAdd; + + /// + /// btnAddAccountsFake control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Button btnAddAccountsFake; + + /// + /// AddAccountsModal control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::AjaxControlToolkit.ModalPopupExtender AddAccountsModal; + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj index 0596b4b6..7e36f64f 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/WebsitePanel.Portal.Modules.csproj @@ -230,6 +230,13 @@ OrganizationAddDomainName.ascx + + ASPXCodeBehind + OrganizationCreateSecurityGroup.ascx + + + OrganizationCreateSecurityGroup.ascx + OrganizationDomainNames.ascx ASPXCodeBehind @@ -251,6 +258,20 @@ ExchangeMailboxPlans.ascx + + ASPXCodeBehind + OrganizationSecurityGroupGeneralSettings.ascx + + + OrganizationSecurityGroupGeneralSettings.ascx + + + ASPXCodeBehind + OrganizationSecurityGroups.ascx + + + OrganizationSecurityGroups.ascx + OrganizationUserMemberOf.ascx ASPXCodeBehind @@ -269,6 +290,19 @@ MailboxPlanSelector.ascx + + SecurityGroupTabs.ascx + ASPXCodeBehind + + + SecurityGroupTabs.ascx + + + ASPXCodeBehind + + + UsersList.ascx.cs + UserTabs.ascx ASPXCodeBehind @@ -3885,11 +3919,15 @@ + + + + @@ -5072,6 +5110,12 @@ + + + + + + Designer