diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs index 87b2169c..088e33d6 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs @@ -62,6 +62,8 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { [System.Xml.Serialization.XmlIncludeAttribute(typeof(ResultObject))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(ServiceProviderItem))] public partial class esOrganizations : Microsoft.Web.Services3.WebServicesClientProtocol { + + private System.Threading.SendOrPostCallback CheckOrgIdExistsOperationCompleted; private System.Threading.SendOrPostCallback CreateOrganizationOperationCompleted; @@ -117,6 +119,9 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { public esOrganizations() { this.Url = "http://localhost:9002/esOrganizations.asmx"; } + + /// + public event CheckOrgIdExistsCompletedEventHandler CheckOrgIdExistsCompleted; /// public event CreateOrganizationCompletedEventHandler CreateOrganizationCompleted; @@ -192,6 +197,55 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { /// public event GetPasswordPolicyCompletedEventHandler GetPasswordPolicyCompleted; + + /// + [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) + { + object[] results = this.Invoke("CheckOrgIdExists", new object[] { + orgId}); + return ((bool)(results[0])); + } + + /// + public System.IAsyncResult BeginCheckOrgIdExists(string orgId, System.AsyncCallback callback, object asyncState) + { + return this.BeginInvoke("CheckOrgIdExists", new object[] { + orgId}, callback, asyncState); + } + + /// + public bool EndCheckOrgIdExists(System.IAsyncResult asyncResult) + { + object[] results = this.EndInvoke(asyncResult); + return ((bool)(results[0])); + } + + /// + public void CheckOrgIdExistsAsync(string orgId) + { + this.CheckOrgIdExistsAsync(orgId, null); + } + + /// + public void CheckOrgIdExistsAsync(string orgId, object userState) + { + if ((this.CheckOrgIdExistsOperationCompleted == null)) + { + this.CheckOrgIdExistsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCheckOrgIdExistsOperationCompleted); + } + this.InvokeAsync("CheckOrgIdExists", new object[] { + orgId}, this.CheckOrgIdExistsOperationCompleted, userState); + } + + private void OnCheckOrgIdExistsOperationCompleted(object arg) + { + if ((this.CheckOrgIdExistsCompleted != null)) + { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.CheckOrgIdExistsCompleted(this, new CheckOrgIdExistsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/CreateOrganization", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] @@ -204,6 +258,8 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { return ((int)(results[0])); } + + /// public System.IAsyncResult BeginCreateOrganization(int packageId, string organizationID, string organizationName, string domainName, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("CreateOrganization", new object[] { @@ -1585,6 +1641,36 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { base.CancelAsync(userState); } } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")] + public delegate void CheckOrgIdExistsCompletedEventHandler(object sender, CheckOrgIdExistsCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class CheckOrgIdExistsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs + { + + private object[] results; + + internal CheckOrgIdExistsCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public bool Result + { + get + { + this.RaiseExceptionIfNecessary(); + return ((bool)(this.results[0])); + } + } + } /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs index 41f27079..b9c816cf 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/HostedSolution/OrganizationController.cs @@ -265,7 +265,7 @@ namespace WebsitePanel.EnterpriseServer return itemId; } - private static bool OrganizationIdentifierExists(string organizationId) + public static bool OrganizationIdentifierExists(string organizationId) { return DataProvider.ExchangeOrganizationExists(organizationId); } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs index cc4a6b85..ac5a1e38 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs @@ -45,6 +45,12 @@ namespace WebsitePanel.EnterpriseServer { #region Organizations + [WebMethod] + public bool CheckOrgIdExists(string orgId) + { + return OrganizationController.OrganizationIdentifierExists(orgId); + } + [WebMethod] public int CreateOrganization(int packageId, string organizationID, string organizationName, string domainName) { diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserCreateSpace.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserCreateSpace.ascx.cs index 5e92633c..41241784 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserCreateSpace.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/UserCreateSpace.ascx.cs @@ -27,8 +27,11 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using System; +using System.Collections.Generic; +using System.Linq; using System.Web.UI.WebControls; using WebsitePanel.EnterpriseServer; +using WebsitePanel.Providers.HostedSolution; namespace WebsitePanel.Portal { @@ -173,11 +176,18 @@ namespace WebsitePanel.Portal UserInfo user = UsersHelper.GetUser(PanelSecurity.SelectedUserId); if (user != null) - { + { if (user.Role != UserRole.Reseller) { + UserSettings settings = ES.Services.Users.GetUserSettings(user.UserId, UserSettings.EXCHANGE_POLICY); + string orgId = domainName.ToLower(); - ES.Services.Organizations.CreateOrganization(result.Result, domainName.ToLower(), domainName.ToLower(), domainName.ToLower()); + if (settings != null && settings["OrgIdPolicy"] != null) + { + orgId = GetOrgId(settings["OrgIdPolicy"], domainName, result.Result); + } + + ES.Services.Organizations.CreateOrganization(result.Result, orgId, domainName.ToLower(), domainName.ToLower()); if (result.Result < 0) { @@ -199,6 +209,39 @@ namespace WebsitePanel.Portal Response.Redirect(PortalUtils.GetSpaceHomePageUrl(result.Result)); } + private string GetOrgId(string orgIdPolicy, string domainName, int packageId) + { + string[] values = orgIdPolicy.Split(';'); + + if (values.Length > 1 && Convert.ToBoolean(values[0])) + { + try + { + int maxLength = Convert.ToInt32(values[1]); + + if (domainName.Length > maxLength) + { + domainName = domainName.Substring(0, maxLength); + string orgId = domainName; + int counter = 0; + + while (ES.Services.Organizations.CheckOrgIdExists(orgId)) + { + counter++; + orgId = maxLength > 3 ? string.Format("{0}{1}", orgId.Substring(0, orgId.Length - 3), counter.ToString("d3")) : counter.ToString("d3"); + } + + return orgId; + } + } + catch (Exception) + { + } + } + + return domainName; + } + protected void ddlPlans_SelectedIndexChanged(object sender, EventArgs e) { BindHostingPlan();