diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs index 2976bfe4..9ab83269 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/OrganizationProxy.cs @@ -80,6 +80,8 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { private System.Threading.SendOrPostCallback SetDefaultOrganizationOperationCompleted; + private System.Threading.SendOrPostCallback GetUserGeneralSettingsWithExtraDataOperationCompleted; + private System.Threading.SendOrPostCallback AddOrganizationDomainOperationCompleted; private System.Threading.SendOrPostCallback ChangeOrganizationDomainTypeOperationCompleted; @@ -229,6 +231,9 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { /// public event SetDefaultOrganizationCompletedEventHandler SetDefaultOrganizationCompleted; + /// + public event GetUserGeneralSettingsWithExtraDataCompletedEventHandler GetUserGeneralSettingsWithExtraDataCompleted; + /// public event AddOrganizationDomainCompletedEventHandler AddOrganizationDomainCompleted; @@ -1310,6 +1315,50 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { } } + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetUserGeneralSettingsWithExtraData", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public OrganizationUser GetUserGeneralSettingsWithExtraData(int itemId, int accountId) { + object[] results = this.Invoke("GetUserGeneralSettingsWithExtraData", new object[] { + itemId, + accountId}); + return ((OrganizationUser)(results[0])); + } + + /// + public System.IAsyncResult BeginGetUserGeneralSettingsWithExtraData(int itemId, int accountId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetUserGeneralSettingsWithExtraData", new object[] { + itemId, + accountId}, callback, asyncState); + } + + /// + public OrganizationUser EndGetUserGeneralSettingsWithExtraData(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((OrganizationUser)(results[0])); + } + + /// + public void GetUserGeneralSettingsWithExtraDataAsync(int itemId, int accountId) { + this.GetUserGeneralSettingsWithExtraDataAsync(itemId, accountId, null); + } + + /// + public void GetUserGeneralSettingsWithExtraDataAsync(int itemId, int accountId, object userState) { + if ((this.GetUserGeneralSettingsWithExtraDataOperationCompleted == null)) { + this.GetUserGeneralSettingsWithExtraDataOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetUserGeneralSettingsWithExtraDataOperationCompleted); + } + this.InvokeAsync("GetUserGeneralSettingsWithExtraData", new object[] { + itemId, + accountId}, this.GetUserGeneralSettingsWithExtraDataOperationCompleted, userState); + } + + private void OnGetUserGeneralSettingsWithExtraDataOperationCompleted(object arg) { + if ((this.GetUserGeneralSettingsWithExtraDataCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetUserGeneralSettingsWithExtraDataCompleted(this, new GetUserGeneralSettingsWithExtraDataCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/AddOrganizationDomain", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] public int AddOrganizationDomain(int itemId, string domainName) { @@ -3816,6 +3865,32 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution { [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] public delegate void SetDefaultOrganizationCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void GetUserGeneralSettingsWithExtraDataCompletedEventHandler(object sender, GetUserGeneralSettingsWithExtraDataCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetUserGeneralSettingsWithExtraDataCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetUserGeneralSettingsWithExtraDataCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public OrganizationUser Result { + get { + this.RaiseExceptionIfNecessary(); + return ((OrganizationUser)(this.results[0])); + } + } + } + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] public delegate void AddOrganizationDomainCompletedEventHandler(object sender, AddOrganizationDomainCompletedEventArgs e); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs index 2622e03f..d22a81c2 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs @@ -1581,11 +1581,7 @@ namespace WebsitePanel.EnterpriseServer UserInfo owner = PackageController.GetPackageOwner(org.PackageId); - OrganizationUser user = OrganizationController.GetAccount(itemId, accountId); - - OrganizationUser settings = orgProxy.GetUserGeneralSettings(user.AccountName, org.OrganizationId); - - user.PasswordExpirationDateTime = settings.PasswordExpirationDateTime; + OrganizationUser user = OrganizationController.GetUserGeneralSettingsWithExtraData(itemId, accountId); if (string.IsNullOrEmpty(mailTo)) { @@ -1658,6 +1654,8 @@ namespace WebsitePanel.EnterpriseServer } } + + public static AccessToken GetAccessToken(Guid accessToken, AccessTokenTypes type) { return ObjectUtils.FillObjectFromDataReader(DataProvider.GetAccessTokenByAccessToken(accessToken, type)); @@ -2668,6 +2666,50 @@ namespace WebsitePanel.EnterpriseServer return (account); } + public static OrganizationUser GetUserGeneralSettingsWithExtraData(int itemId, int accountId) + { + OrganizationUser account = null; + Organization org = null; + + try + { + // load organization + org = GetOrganization(itemId); + if (org == null) + return null; + + // load account + account = GetAccount(itemId, accountId); + } + catch (Exception) { } + + try + { + // get mailbox settings + Organizations orgProxy = GetOrganizationProxy(org.ServiceId); + string accountName = GetAccountName(account.AccountName); + + + OrganizationUser retUser = orgProxy.GetOrganizationUserWithExtraData(accountName, org.OrganizationId); + retUser.AccountId = accountId; + retUser.AccountName = account.AccountName; + retUser.PrimaryEmailAddress = account.PrimaryEmailAddress; + retUser.AccountType = account.AccountType; + retUser.CrmUserId = CRMController.GetCrmUserId(accountId); + retUser.IsOCSUser = DataProvider.CheckOCSUserExists(accountId); + retUser.IsLyncUser = DataProvider.CheckLyncUserExists(accountId); + retUser.IsBlackBerryUser = BlackBerryController.CheckBlackBerryUserExists(accountId); + retUser.SubscriberNumber = account.SubscriberNumber; + retUser.LevelId = account.LevelId; + retUser.IsVIP = account.IsVIP; + + return retUser; + } + catch { } + + return (account); + } + 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, diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/UserPasswordExpirationNotificationTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/UserPasswordExpirationNotificationTask.cs index bda161b1..db1b324a 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/UserPasswordExpirationNotificationTask.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/SchedulerTasks/UserPasswordExpirationNotificationTask.cs @@ -57,11 +57,6 @@ namespace WebsitePanel.EnterpriseServer } } } - - // send mail message - // MailHelper.SendMessage(mailFrom, mailTo, mailSubject, mailBody, false); } - - } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs index b261da3f..a9157367 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esOrganizations.asmx.cs @@ -93,7 +93,7 @@ namespace WebsitePanel.EnterpriseServer [WebMethod] public SystemSettings GetWebDavSystemSettings() { - return OrganizationController.GetWebDavSystemSettings(); + return OrganizationController.GetWebDavSystemSettings(); } [WebMethod] @@ -185,7 +185,13 @@ namespace WebsitePanel.EnterpriseServer OrganizationController.SetDefaultOrganization(newDefaultOrganizationId, currentDefaultOrganizationId); } - #endregion + [WebMethod] + public OrganizationUser GetUserGeneralSettingsWithExtraData(int itemId, int accountId) + { + return OrganizationController.GetUserGeneralSettingsWithExtraData(itemId, accountId); + } + + #endregion #region Domains diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IOrganization.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IOrganization.cs index a14161a8..07dea1ce 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IOrganization.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/HostedSolution/IOrganization.cs @@ -102,5 +102,7 @@ namespace WebsitePanel.Providers.HostedSolution void ApplyPasswordSettings(string organizationId, OrganizationPasswordSettings passwordSettings); bool CheckPhoneNumberIsInUse(string phoneNumber, string userSamAccountName = null); + + OrganizationUser GetOrganizationUserWithExtraData(string loginName, string organizationId); } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs index f6f5015f..e3b17f58 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.HostedSolution/OrganizationProvider.cs @@ -1008,10 +1008,30 @@ namespace WebsitePanel.Providers.HostedSolution retUser.UserPrincipalName = (string)entry.InvokeGet(ADAttributes.UserPrincipalName); retUser.UserMustChangePassword = GetUserMustChangePassword(entry); + return retUser; + } + + public OrganizationUser GetOrganizationUserWithExtraData(string loginName, string organizationId) + { + HostedSolutionLog.LogStart("GetOrganizationUserWithExtraData"); + HostedSolutionLog.DebugInfo("loginName : {0}", loginName); + HostedSolutionLog.DebugInfo("organizationId : {0}", organizationId); + + if (string.IsNullOrEmpty(loginName)) + throw new ArgumentNullException("loginName"); + var psoName = FormOrganizationPSOName(organizationId); + string path = GetUserPath(organizationId, loginName); + + OrganizationUser retUser = GetUser(organizationId, path); + + DirectoryEntry entry = ActiveDirectoryUtils.GetADObject(path); + retUser.PasswordExpirationDateTime = GetPasswordExpirationDate(psoName, entry); + HostedSolutionLog.LogEnd("GetOrganizationUserWithExtraData"); + return retUser; } diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Client/OrganizationProxy.cs b/WebsitePanel/Sources/WebsitePanel.Server.Client/OrganizationProxy.cs index 95bdfa84..c79483f2 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server.Client/OrganizationProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server.Client/OrganizationProxy.cs @@ -98,6 +98,8 @@ namespace WebsitePanel.Providers.HostedSolution { private System.Threading.SendOrPostCallback CheckPhoneNumberIsInUseOperationCompleted; + private System.Threading.SendOrPostCallback GetOrganizationUserWithExtraDataOperationCompleted; + /// public Organizations() { this.Url = "http://localhost:9003/Organizations.asmx"; @@ -196,6 +198,9 @@ namespace WebsitePanel.Providers.HostedSolution { /// public event CheckPhoneNumberIsInUseCompletedEventHandler CheckPhoneNumberIsInUseCompleted; + /// + public event GetOrganizationUserWithExtraDataCompletedEventHandler GetOrganizationUserWithExtraDataCompleted; + /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/OrganizationExists", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] @@ -1773,6 +1778,51 @@ namespace WebsitePanel.Providers.HostedSolution { } } + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetOrganizationUserWithExtraData", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public OrganizationUser GetOrganizationUserWithExtraData(string loginName, string organizationId) { + object[] results = this.Invoke("GetOrganizationUserWithExtraData", new object[] { + loginName, + organizationId}); + return ((OrganizationUser)(results[0])); + } + + /// + public System.IAsyncResult BeginGetOrganizationUserWithExtraData(string loginName, string organizationId, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetOrganizationUserWithExtraData", new object[] { + loginName, + organizationId}, callback, asyncState); + } + + /// + public OrganizationUser EndGetOrganizationUserWithExtraData(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((OrganizationUser)(results[0])); + } + + /// + public void GetOrganizationUserWithExtraDataAsync(string loginName, string organizationId) { + this.GetOrganizationUserWithExtraDataAsync(loginName, organizationId, null); + } + + /// + public void GetOrganizationUserWithExtraDataAsync(string loginName, string organizationId, object userState) { + if ((this.GetOrganizationUserWithExtraDataOperationCompleted == null)) { + this.GetOrganizationUserWithExtraDataOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetOrganizationUserWithExtraDataOperationCompleted); + } + this.InvokeAsync("GetOrganizationUserWithExtraData", new object[] { + loginName, + organizationId}, this.GetOrganizationUserWithExtraDataOperationCompleted, userState); + } + + private void OnGetOrganizationUserWithExtraDataOperationCompleted(object arg) { + if ((this.GetOrganizationUserWithExtraDataCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetOrganizationUserWithExtraDataCompleted(this, new GetOrganizationUserWithExtraDataCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + /// public new void CancelAsync(object userState) { base.CancelAsync(userState); @@ -2188,4 +2238,30 @@ namespace WebsitePanel.Providers.HostedSolution { } } } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void GetOrganizationUserWithExtraDataCompletedEventHandler(object sender, GetOrganizationUserWithExtraDataCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetOrganizationUserWithExtraDataCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetOrganizationUserWithExtraDataCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public OrganizationUser Result { + get { + this.RaiseExceptionIfNecessary(); + return ((OrganizationUser)(this.results[0])); + } + } + } } diff --git a/WebsitePanel/Sources/WebsitePanel.Server/Organizations.asmx.cs b/WebsitePanel/Sources/WebsitePanel.Server/Organizations.asmx.cs index 66be5114..977d890d 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server/Organizations.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server/Organizations.asmx.cs @@ -273,5 +273,11 @@ namespace WebsitePanel.Server { return Organization.CheckPhoneNumberIsInUse(phoneNumber, userSamAccountName); } + + [WebMethod, SoapHeader("settings")] + public OrganizationUser GetOrganizationUserWithExtraData(string loginName, string organizationId) + { + return Organization.GetOrganizationUserWithExtraData(loginName, organizationId); + } } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/AccountController.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/AccountController.cs index 84e1a34f..65bdef13 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/AccountController.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/AccountController.cs @@ -338,7 +338,7 @@ namespace WebsitePanel.WebDavPortal.Controllers private UserProfile GetUserProfileModel(int itemId, int accountId) { - var user = WspContext.Services.Organizations.GetUserGeneralSettings(itemId, accountId); + var user = WspContext.Services.Organizations.GetUserGeneralSettingsWithExtraData(itemId, accountId); return Mapper.Map(user); } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.Designer.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.Designer.cs index 2be5ffa9..deaab032 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.Designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.Designer.cs @@ -627,6 +627,15 @@ namespace WebsitePanel.WebDavPortal.Resources { } } + /// + /// Looks up a localized string similar to Password never expires. If you want to change password then please click {0}.. + /// + public static string PasswordNeverExpiresFormat { + get { + return ResourceManager.GetString("PasswordNeverExpiresFormat", resourceCulture); + } + } + /// /// Looks up a localized string similar to Password reset. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.resx b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.resx index 4a6fca4c..232393d4 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.resx @@ -393,4 +393,7 @@ Login + + Password never expires. If you want to change password then please click {0}. + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/Account/UserProfile.cshtml b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/Account/UserProfile.cshtml index e1c27a7c..401acd3c 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/Account/UserProfile.cshtml +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/Account/UserProfile.cshtml @@ -5,8 +5,17 @@ @{ Layout = "~/Views/Shared/_Layout.cshtml"; + + var passwordExpriationText = string.Empty; - var passwordExpriationText = string.Format(UI.PasswordExpirationFormat, Model.PasswordExpirationDateTime.ToString(Formats.DateFormatWithTime), Html.RouteLink(UI.Here.ToLowerInvariant(), AccountRouteNames.PasswordChange)); + if (Model.PasswordExpirationDateTime == DateTime.MaxValue) + { + passwordExpriationText = string.Format(UI.PasswordNeverExpiresFormat, Html.RouteLink(UI.Here.ToLowerInvariant(), AccountRouteNames.PasswordChange)); + } + else + { + passwordExpriationText = string.Format(UI.PasswordExpirationFormat, Model.PasswordExpirationDateTime.ToString(Formats.DateFormatWithTime), Html.RouteLink(UI.Here.ToLowerInvariant(), AccountRouteNames.PasswordChange)); + } }