password reset workflow changed

This commit is contained in:
vfedosevich 2015-04-30 04:24:15 -07:00
parent 2f1e740d5a
commit 410b15c2c4
36 changed files with 1229 additions and 255 deletions

View file

@ -10045,6 +10045,114 @@ ELSE
UPDATE [dbo].[UserSettings] SET [PropertyValue] = @UserPasswordResetSMSBody WHERE [UserID] = 1 AND [SettingsName]= N'UserPasswordResetLetter' AND [PropertyName]= N'PasswordResetLinkSmsBody' UPDATE [dbo].[UserSettings] SET [PropertyValue] = @UserPasswordResetSMSBody WHERE [UserID] = 1 AND [SettingsName]= N'UserPasswordResetLetter' AND [PropertyName]= N'PasswordResetLinkSmsBody'
GO GO
-- USER PASSWORD RESET EMAIL PINCODE TEMPLATE
IF NOT EXISTS (SELECT * FROM [dbo].[UserSettings] WHERE [UserID] = 1 AND [SettingsName]= N'UserPasswordResetPincodeLetter' AND [PropertyName]= N'From' )
BEGIN
INSERT [dbo].[UserSettings] ([UserID], [SettingsName], [PropertyName], [PropertyValue]) VALUES (1, N'UserPasswordResetPincodeLetter', N'From', N'support@HostingCompany.com')
END
GO
DECLARE @UserPasswordResetPincodeLetterHtmlBody nvarchar(2500)
Set @UserPasswordResetPincodeLetterHtmlBody = N'<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Password reset notification</title>
<style type="text/css">
.Summary { background-color: ##ffffff; padding: 5px; }
.Summary .Header { padding: 10px 0px 10px 10px; font-size: 16pt; background-color: ##E5F2FF; color: ##1F4978; border-bottom: solid 2px ##86B9F7; }
.Summary A { color: ##0153A4; }
.Summary { font-family: Tahoma; font-size: 9pt; }
.Summary H1 { font-size: 1.7em; color: ##1F4978; border-bottom: dotted 3px ##efefef; }
.Summary H2 { font-size: 1.3em; color: ##1F4978; }
.Summary TABLE { border: solid 1px ##e5e5e5; }
.Summary TH,
.Summary TD.Label { padding: 5px; font-size: 8pt; font-weight: bold; background-color: ##f5f5f5; }
.Summary TD { padding: 8px; font-size: 9pt; }
.Summary UL LI { font-size: 1.1em; font-weight: bold; }
.Summary UL UL LI { font-size: 0.9em; font-weight: normal; }
</style>
</head>
<body>
<div class="Summary">
<div class="Header">
<img src="#logoUrl#">
</div>
<h1>Password reset notification</h1>
<ad:if test="#user#">
<p>
Hello #user.FirstName#,
</p>
</ad:if>
<p>
We received a request to reset the password for your account. Your password reset pincode:
</p>
#passwordResetPincode#
<p>
If you have any questions regarding your hosting account, feel free to contact our support department at any time.
</p>
<p>
Best regards
</p>
</div>
</body>';
IF NOT EXISTS (SELECT * FROM [dbo].[UserSettings] WHERE [UserID] = 1 AND [SettingsName]= N'UserPasswordResetPincodeLetter' AND [PropertyName]= N'HtmlBody' )
BEGIN
INSERT [dbo].[UserSettings] ([UserID], [SettingsName], [PropertyName], [PropertyValue]) VALUES (1, N'UserPasswordResetPincodeLetter', N'HtmlBody', @UserPasswordResetPincodeLetterHtmlBody)
END
ELSE
UPDATE [dbo].[UserSettings] SET [PropertyValue] = @UserPasswordResetPincodeLetterHtmlBody WHERE [UserID] = 1 AND [SettingsName]= N'UserPasswordResetPincodeLetter' AND [PropertyName]= N'HtmlBody'
GO
IF NOT EXISTS (SELECT * FROM [dbo].[UserSettings] WHERE [UserID] = 1 AND [SettingsName]= N'UserPasswordResetPincodeLetter' AND [PropertyName]= N'Priority' )
BEGIN
INSERT [dbo].[UserSettings] ([UserID], [SettingsName], [PropertyName], [PropertyValue]) VALUES (1, N'UserPasswordResetPincodeLetter', N'Priority', N'Normal')
END
GO
IF NOT EXISTS (SELECT * FROM [dbo].[UserSettings] WHERE [UserID] = 1 AND [SettingsName]= N'UserPasswordResetPincodeLetter' AND [PropertyName]= N'Subject' )
BEGIN
INSERT [dbo].[UserSettings] ([UserID], [SettingsName], [PropertyName], [PropertyValue]) VALUES (1, N'UserPasswordResetPincodeLetter', N'Subject', N'Password reset notification')
END
GO
IF NOT EXISTS (SELECT * FROM [dbo].[UserSettings] WHERE [UserID] = 1 AND [SettingsName]= N'UserPasswordResetPincodeLetter' AND [PropertyName]= N'LogoUrl' )
BEGIN
INSERT [dbo].[UserSettings] ([UserID], [SettingsName], [PropertyName], [PropertyValue]) VALUES (1, N'UserPasswordResetPincodeLetter', N'LogoUrl', N'https://controlpanel.virtuworks.net/App_Themes/Default/Images/logo.png')
END
GO
DECLARE @UserPasswordResetPincodeLetterTextBody nvarchar(2500)
Set @UserPasswordResetPincodeLetterTextBody = N'=========================================
Password reset notification
=========================================
<ad:if test="#user#">
Hello #user.FirstName#,
</ad:if>
We received a request to reset the password for your account. Your password reset pincode:
#passwordResetPincode#
If you have any questions regarding your hosting account, feel free to contact our support department at any time.
Best regards'
IF NOT EXISTS (SELECT * FROM [dbo].[UserSettings] WHERE [UserID] = 1 AND [SettingsName]= N'UserPasswordResetPincodeLetter' AND [PropertyName]= N'TextBody' )
BEGIN
INSERT [dbo].[UserSettings] ([UserID], [SettingsName], [PropertyName], [PropertyValue]) VALUES (1, N'UserPasswordResetPincodeLetter', N'TextBody', @UserPasswordResetPincodeLetterTextBody)
END
ELSE
UPDATE [dbo].[UserSettings] SET [PropertyValue] = @UserPasswordResetPincodeLetterTextBody WHERE [UserID] = 1 AND [SettingsName]= N'UserPasswordResetPincodeLetter' AND [PropertyName]= N'TextBody'
GO
DECLARE @UserPasswordPincodeSMSBody nvarchar(2500) DECLARE @UserPasswordPincodeSMSBody nvarchar(2500)
@ -10052,12 +10160,12 @@ Set @UserPasswordPincodeSMSBody = N'
Your password reset pincode: Your password reset pincode:
#passwordResetPincode#' #passwordResetPincode#'
IF NOT EXISTS (SELECT * FROM [dbo].[UserSettings] WHERE [UserID] = 1 AND [SettingsName]= N'UserPasswordResetLetter' AND [PropertyName]= N'PasswordResetPincodeSmsBody' ) IF NOT EXISTS (SELECT * FROM [dbo].[UserSettings] WHERE [UserID] = 1 AND [SettingsName]= N'UserPasswordResetPincodeLetter' AND [PropertyName]= N'PasswordResetPincodeSmsBody' )
BEGIN BEGIN
INSERT [dbo].[UserSettings] ([UserID], [SettingsName], [PropertyName], [PropertyValue]) VALUES (1, N'UserPasswordResetLetter', N'PasswordResetPincodeSmsBody', @UserPasswordPincodeSMSBody) INSERT [dbo].[UserSettings] ([UserID], [SettingsName], [PropertyName], [PropertyValue]) VALUES (1, N'UserPasswordResetPincodeLetter', N'PasswordResetPincodeSmsBody', @UserPasswordPincodeSMSBody)
END END
ELSE ELSE
UPDATE [dbo].[UserSettings] SET [PropertyValue] = @UserPasswordPincodeSMSBody WHERE [UserID] = 1 AND [SettingsName]= N'UserPasswordResetLetter' AND [PropertyName]= N'PasswordResetPincodeSmsBody' UPDATE [dbo].[UserSettings] SET [PropertyValue] = @UserPasswordPincodeSMSBody WHERE [UserID] = 1 AND [SettingsName]= N'UserPasswordResetPincodeLetter' AND [PropertyName]= N'PasswordResetPincodeSmsBody'
GO GO
-- Exchange setup EMAIL TEMPLATE -- Exchange setup EMAIL TEMPLATE

View file

@ -67,6 +67,7 @@ namespace WebsitePanel.EnterpriseServer
public const string RDS_POLICY = "RdsPolicy"; public const string RDS_POLICY = "RdsPolicy";
public const string USER_PASSWORD_EXPIRATION_LETTER = "UserPasswordExpirationLetter"; public const string USER_PASSWORD_EXPIRATION_LETTER = "UserPasswordExpirationLetter";
public const string USER_PASSWORD_RESET_LETTER = "UserPasswordResetLetter"; public const string USER_PASSWORD_RESET_LETTER = "UserPasswordResetLetter";
public const string USER_PASSWORD_RESET_PINCODE_LETTER = "UserPasswordResetPincodeLetter";
public const string HOSTED_ORGANIZATION_PASSWORD_POLICY = "MailboxPasswordPolicy"; public const string HOSTED_ORGANIZATION_PASSWORD_POLICY = "MailboxPasswordPolicy";

View file

@ -12,6 +12,7 @@
// This source code was auto-generated by wsdl, Version=2.0.50727.3038. // This source code was auto-generated by wsdl, Version=2.0.50727.3038.
// //
using WebsitePanel.EnterpriseServer.Base.HostedSolution; using WebsitePanel.EnterpriseServer.Base.HostedSolution;
using WebsitePanel.Providers; using WebsitePanel.Providers;
using WebsitePanel.Providers.Common; using WebsitePanel.Providers.Common;
@ -36,6 +37,10 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ServiceProviderItem))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(ServiceProviderItem))]
public partial class esOrganizations : Microsoft.Web.Services3.WebServicesClientProtocol { public partial class esOrganizations : Microsoft.Web.Services3.WebServicesClientProtocol {
private System.Threading.SendOrPostCallback AddSupportServiceLevelOperationCompleted;
private System.Threading.SendOrPostCallback GetSupportServiceLevelOperationCompleted;
private System.Threading.SendOrPostCallback CheckPhoneNumberIsInUseOperationCompleted; private System.Threading.SendOrPostCallback CheckPhoneNumberIsInUseOperationCompleted;
private System.Threading.SendOrPostCallback DeletePasswordresetAccessTokenOperationCompleted; private System.Threading.SendOrPostCallback DeletePasswordresetAccessTokenOperationCompleted;
@ -86,6 +91,8 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
private System.Threading.SendOrPostCallback SendResetUserPasswordPincodeSmsOperationCompleted; private System.Threading.SendOrPostCallback SendResetUserPasswordPincodeSmsOperationCompleted;
private System.Threading.SendOrPostCallback SendResetUserPasswordPincodeEmailOperationCompleted;
private System.Threading.SendOrPostCallback AddOrganizationDomainOperationCompleted; private System.Threading.SendOrPostCallback AddOrganizationDomainOperationCompleted;
private System.Threading.SendOrPostCallback ChangeOrganizationDomainTypeOperationCompleted; private System.Threading.SendOrPostCallback ChangeOrganizationDomainTypeOperationCompleted;
@ -128,6 +135,8 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
private System.Threading.SendOrPostCallback SendResetUserPasswordEmailOperationCompleted; private System.Threading.SendOrPostCallback SendResetUserPasswordEmailOperationCompleted;
private System.Threading.SendOrPostCallback CreatePasswordResetAccessTokenOperationCompleted;
private System.Threading.SendOrPostCallback CreateSecurityGroupOperationCompleted; private System.Threading.SendOrPostCallback CreateSecurityGroupOperationCompleted;
private System.Threading.SendOrPostCallback GetSecurityGroupGeneralSettingsOperationCompleted; private System.Threading.SendOrPostCallback GetSecurityGroupGeneralSettingsOperationCompleted;
@ -160,15 +169,17 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
private System.Threading.SendOrPostCallback DeleteSupportServiceLevelOperationCompleted; private System.Threading.SendOrPostCallback DeleteSupportServiceLevelOperationCompleted;
private System.Threading.SendOrPostCallback AddSupportServiceLevelOperationCompleted;
private System.Threading.SendOrPostCallback GetSupportServiceLevelOperationCompleted;
/// <remarks/> /// <remarks/>
public esOrganizations() { public esOrganizations() {
this.Url = "http://localhost:9002/esOrganizations.asmx"; this.Url = "http://localhost:9002/esOrganizations.asmx";
} }
/// <remarks/>
public event AddSupportServiceLevelCompletedEventHandler AddSupportServiceLevelCompleted;
/// <remarks/>
public event GetSupportServiceLevelCompletedEventHandler GetSupportServiceLevelCompleted;
/// <remarks/> /// <remarks/>
public event CheckPhoneNumberIsInUseCompletedEventHandler CheckPhoneNumberIsInUseCompleted; public event CheckPhoneNumberIsInUseCompletedEventHandler CheckPhoneNumberIsInUseCompleted;
@ -244,6 +255,9 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
/// <remarks/> /// <remarks/>
public event SendResetUserPasswordPincodeSmsCompletedEventHandler SendResetUserPasswordPincodeSmsCompleted; public event SendResetUserPasswordPincodeSmsCompletedEventHandler SendResetUserPasswordPincodeSmsCompleted;
/// <remarks/>
public event SendResetUserPasswordPincodeEmailCompletedEventHandler SendResetUserPasswordPincodeEmailCompleted;
/// <remarks/> /// <remarks/>
public event AddOrganizationDomainCompletedEventHandler AddOrganizationDomainCompleted; public event AddOrganizationDomainCompletedEventHandler AddOrganizationDomainCompleted;
@ -307,6 +321,9 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
/// <remarks/> /// <remarks/>
public event SendResetUserPasswordEmailCompletedEventHandler SendResetUserPasswordEmailCompleted; public event SendResetUserPasswordEmailCompletedEventHandler SendResetUserPasswordEmailCompleted;
/// <remarks/>
public event CreatePasswordResetAccessTokenCompletedEventHandler CreatePasswordResetAccessTokenCompleted;
/// <remarks/> /// <remarks/>
public event CreateSecurityGroupCompletedEventHandler CreateSecurityGroupCompleted; public event CreateSecurityGroupCompletedEventHandler CreateSecurityGroupCompleted;
@ -356,10 +373,89 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
public event DeleteSupportServiceLevelCompletedEventHandler DeleteSupportServiceLevelCompleted; public event DeleteSupportServiceLevelCompletedEventHandler DeleteSupportServiceLevelCompleted;
/// <remarks/> /// <remarks/>
public event AddSupportServiceLevelCompletedEventHandler AddSupportServiceLevelCompleted; [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/AddSupportServiceLevel", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public int AddSupportServiceLevel(string levelName, string levelDescription) {
object[] results = this.Invoke("AddSupportServiceLevel", new object[] {
levelName,
levelDescription});
return ((int)(results[0]));
}
/// <remarks/> /// <remarks/>
public event GetSupportServiceLevelCompletedEventHandler GetSupportServiceLevelCompleted; public System.IAsyncResult BeginAddSupportServiceLevel(string levelName, string levelDescription, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("AddSupportServiceLevel", new object[] {
levelName,
levelDescription}, callback, asyncState);
}
/// <remarks/>
public int EndAddSupportServiceLevel(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((int)(results[0]));
}
/// <remarks/>
public void AddSupportServiceLevelAsync(string levelName, string levelDescription) {
this.AddSupportServiceLevelAsync(levelName, levelDescription, null);
}
/// <remarks/>
public void AddSupportServiceLevelAsync(string levelName, string levelDescription, object userState) {
if ((this.AddSupportServiceLevelOperationCompleted == null)) {
this.AddSupportServiceLevelOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddSupportServiceLevelOperationCompleted);
}
this.InvokeAsync("AddSupportServiceLevel", new object[] {
levelName,
levelDescription}, this.AddSupportServiceLevelOperationCompleted, userState);
}
private void OnAddSupportServiceLevelOperationCompleted(object arg) {
if ((this.AddSupportServiceLevelCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.AddSupportServiceLevelCompleted(this, new AddSupportServiceLevelCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetSupportServiceLevel", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public ServiceLevel GetSupportServiceLevel(int levelID) {
object[] results = this.Invoke("GetSupportServiceLevel", new object[] {
levelID});
return ((ServiceLevel)(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginGetSupportServiceLevel(int levelID, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("GetSupportServiceLevel", new object[] {
levelID}, callback, asyncState);
}
/// <remarks/>
public ServiceLevel EndGetSupportServiceLevel(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((ServiceLevel)(results[0]));
}
/// <remarks/>
public void GetSupportServiceLevelAsync(int levelID) {
this.GetSupportServiceLevelAsync(levelID, null);
}
/// <remarks/>
public void GetSupportServiceLevelAsync(int levelID, object userState) {
if ((this.GetSupportServiceLevelOperationCompleted == null)) {
this.GetSupportServiceLevelOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetSupportServiceLevelOperationCompleted);
}
this.InvokeAsync("GetSupportServiceLevel", new object[] {
levelID}, this.GetSupportServiceLevelOperationCompleted, userState);
}
private void OnGetSupportServiceLevelOperationCompleted(object arg) {
if ((this.GetSupportServiceLevelCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.GetSupportServiceLevelCompleted(this, new GetSupportServiceLevelCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/> /// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/CheckPhoneNumberIsInUse", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/CheckPhoneNumberIsInUse", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
@ -1463,6 +1559,50 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
} }
} }
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendResetUserPasswordPincodeEmail", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public ResultObject SendResetUserPasswordPincodeEmail(System.Guid token, string mailTo) {
object[] results = this.Invoke("SendResetUserPasswordPincodeEmail", new object[] {
token,
mailTo});
return ((ResultObject)(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginSendResetUserPasswordPincodeEmail(System.Guid token, string mailTo, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("SendResetUserPasswordPincodeEmail", new object[] {
token,
mailTo}, callback, asyncState);
}
/// <remarks/>
public ResultObject EndSendResetUserPasswordPincodeEmail(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((ResultObject)(results[0]));
}
/// <remarks/>
public void SendResetUserPasswordPincodeEmailAsync(System.Guid token, string mailTo) {
this.SendResetUserPasswordPincodeEmailAsync(token, mailTo, null);
}
/// <remarks/>
public void SendResetUserPasswordPincodeEmailAsync(System.Guid token, string mailTo, object userState) {
if ((this.SendResetUserPasswordPincodeEmailOperationCompleted == null)) {
this.SendResetUserPasswordPincodeEmailOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSendResetUserPasswordPincodeEmailOperationCompleted);
}
this.InvokeAsync("SendResetUserPasswordPincodeEmail", new object[] {
token,
mailTo}, this.SendResetUserPasswordPincodeEmailOperationCompleted, userState);
}
private void OnSendResetUserPasswordPincodeEmailOperationCompleted(object arg) {
if ((this.SendResetUserPasswordPincodeEmailCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.SendResetUserPasswordPincodeEmailCompleted(this, new SendResetUserPasswordPincodeEmailCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/> /// <remarks/>
[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)] [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) { public int AddOrganizationDomain(int itemId, string domainName) {
@ -2697,6 +2837,50 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
} }
} }
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/CreatePasswordResetAccessToken", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public AccessToken CreatePasswordResetAccessToken(int itemId, int accountId) {
object[] results = this.Invoke("CreatePasswordResetAccessToken", new object[] {
itemId,
accountId});
return ((AccessToken)(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginCreatePasswordResetAccessToken(int itemId, int accountId, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("CreatePasswordResetAccessToken", new object[] {
itemId,
accountId}, callback, asyncState);
}
/// <remarks/>
public AccessToken EndCreatePasswordResetAccessToken(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((AccessToken)(results[0]));
}
/// <remarks/>
public void CreatePasswordResetAccessTokenAsync(int itemId, int accountId) {
this.CreatePasswordResetAccessTokenAsync(itemId, accountId, null);
}
/// <remarks/>
public void CreatePasswordResetAccessTokenAsync(int itemId, int accountId, object userState) {
if ((this.CreatePasswordResetAccessTokenOperationCompleted == null)) {
this.CreatePasswordResetAccessTokenOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCreatePasswordResetAccessTokenOperationCompleted);
}
this.InvokeAsync("CreatePasswordResetAccessToken", new object[] {
itemId,
accountId}, this.CreatePasswordResetAccessTokenOperationCompleted, userState);
}
private void OnCreatePasswordResetAccessTokenOperationCompleted(object arg) {
if ((this.CreatePasswordResetAccessTokenCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.CreatePasswordResetAccessTokenCompleted(this, new CreatePasswordResetAccessTokenCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/> /// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/CreateSecurityGroup", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/CreateSecurityGroup", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public int CreateSecurityGroup(int itemId, string displayName) { public int CreateSecurityGroup(int itemId, string displayName) {
@ -3419,97 +3603,64 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
} }
} }
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/AddSupportServiceLevel", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public int AddSupportServiceLevel(string levelName, string levelDescription) {
object[] results = this.Invoke("AddSupportServiceLevel", new object[] {
levelName,
levelDescription});
return ((int)(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginAddSupportServiceLevel(string levelName, string levelDescription, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("AddSupportServiceLevel", new object[] {
levelName,
levelDescription}, callback, asyncState);
}
/// <remarks/>
public int EndAddSupportServiceLevel(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((int)(results[0]));
}
/// <remarks/>
public void AddSupportServiceLevelAsync(string levelName, string levelDescription) {
this.AddSupportServiceLevelAsync(levelName, levelDescription, null);
}
/// <remarks/>
public void AddSupportServiceLevelAsync(string levelName, string levelDescription, object userState) {
if ((this.AddSupportServiceLevelOperationCompleted == null)) {
this.AddSupportServiceLevelOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddSupportServiceLevelOperationCompleted);
}
this.InvokeAsync("AddSupportServiceLevel", new object[] {
levelName,
levelDescription}, this.AddSupportServiceLevelOperationCompleted, userState);
}
private void OnAddSupportServiceLevelOperationCompleted(object arg) {
if ((this.AddSupportServiceLevelCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.AddSupportServiceLevelCompleted(this, new AddSupportServiceLevelCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GetSupportServiceLevel", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public ServiceLevel GetSupportServiceLevel(int levelID) {
object[] results = this.Invoke("GetSupportServiceLevel", new object[] {
levelID});
return ((ServiceLevel)(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginGetSupportServiceLevel(int levelID, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("GetSupportServiceLevel", new object[] {
levelID}, callback, asyncState);
}
/// <remarks/>
public ServiceLevel EndGetSupportServiceLevel(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((ServiceLevel)(results[0]));
}
/// <remarks/>
public void GetSupportServiceLevelAsync(int levelID) {
this.GetSupportServiceLevelAsync(levelID, null);
}
/// <remarks/>
public void GetSupportServiceLevelAsync(int levelID, object userState) {
if ((this.GetSupportServiceLevelOperationCompleted == null)) {
this.GetSupportServiceLevelOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetSupportServiceLevelOperationCompleted);
}
this.InvokeAsync("GetSupportServiceLevel", new object[] {
levelID}, this.GetSupportServiceLevelOperationCompleted, userState);
}
private void OnGetSupportServiceLevelOperationCompleted(object arg) {
if ((this.GetSupportServiceLevelCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.GetSupportServiceLevelCompleted(this, new GetSupportServiceLevelCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/> /// <remarks/>
public new void CancelAsync(object userState) { public new void CancelAsync(object userState) {
base.CancelAsync(userState); base.CancelAsync(userState);
} }
} }
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void AddSupportServiceLevelCompletedEventHandler(object sender, AddSupportServiceLevelCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class AddSupportServiceLevelCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal AddSupportServiceLevelCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public int Result {
get {
this.RaiseExceptionIfNecessary();
return ((int)(this.results[0]));
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void GetSupportServiceLevelCompletedEventHandler(object sender, GetSupportServiceLevelCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class GetSupportServiceLevelCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal GetSupportServiceLevelCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public ServiceLevel Result {
get {
this.RaiseExceptionIfNecessary();
return ((ServiceLevel)(this.results[0]));
}
}
}
/// <remarks/> /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void CheckPhoneNumberIsInUseCompletedEventHandler(object sender, CheckPhoneNumberIsInUseCompletedEventArgs e); public delegate void CheckPhoneNumberIsInUseCompletedEventHandler(object sender, CheckPhoneNumberIsInUseCompletedEventArgs e);
@ -4050,6 +4201,32 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
} }
} }
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void SendResetUserPasswordPincodeEmailCompletedEventHandler(object sender, SendResetUserPasswordPincodeEmailCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class SendResetUserPasswordPincodeEmailCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal SendResetUserPasswordPincodeEmailCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public ResultObject Result {
get {
this.RaiseExceptionIfNecessary();
return ((ResultObject)(this.results[0]));
}
}
}
/// <remarks/> /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void AddOrganizationDomainCompletedEventHandler(object sender, AddOrganizationDomainCompletedEventArgs e); public delegate void AddOrganizationDomainCompletedEventHandler(object sender, AddOrganizationDomainCompletedEventArgs e);
@ -4574,6 +4751,32 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void SendResetUserPasswordEmailCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); public delegate void SendResetUserPasswordEmailCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void CreatePasswordResetAccessTokenCompletedEventHandler(object sender, CreatePasswordResetAccessTokenCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class CreatePasswordResetAccessTokenCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal CreatePasswordResetAccessTokenCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public AccessToken Result {
get {
this.RaiseExceptionIfNecessary();
return ((AccessToken)(this.results[0]));
}
}
}
/// <remarks/> /// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void CreateSecurityGroupCompletedEventHandler(object sender, CreateSecurityGroupCompletedEventArgs e); public delegate void CreateSecurityGroupCompletedEventHandler(object sender, CreateSecurityGroupCompletedEventArgs e);
@ -4923,56 +5126,4 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
} }
} }
} }
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void AddSupportServiceLevelCompletedEventHandler(object sender, AddSupportServiceLevelCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class AddSupportServiceLevelCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal AddSupportServiceLevelCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public int Result {
get {
this.RaiseExceptionIfNecessary();
return ((int)(this.results[0]));
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void GetSupportServiceLevelCompletedEventHandler(object sender, GetSupportServiceLevelCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class GetSupportServiceLevelCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal GetSupportServiceLevelCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public ServiceLevel Result {
get {
this.RaiseExceptionIfNecessary();
return ((ServiceLevel)(this.results[0]));
}
}
}
} }

View file

@ -1654,15 +1654,14 @@ namespace WebsitePanel.EnterpriseServer
} }
UserInfo owner = PackageController.GetPackageOwner(org.PackageId); UserInfo owner = PackageController.GetPackageOwner(org.PackageId);
OrganizationUser user = OrganizationController.GetUserGeneralSettingsWithExtraData(accessToken.ItemId, OrganizationUser user = OrganizationController.GetUserGeneralSettingsWithExtraData(accessToken.ItemId, accessToken.AccountId);
accessToken.AccountId);
if (string.IsNullOrEmpty(phoneTo)) if (string.IsNullOrEmpty(phoneTo))
{ {
phoneTo = user.MobilePhone; phoneTo = user.MobilePhone;
} }
UserSettings settings = UserController.GetUserSettings(owner.UserId, UserSettings.USER_PASSWORD_RESET_LETTER); UserSettings settings = UserController.GetUserSettings(owner.UserId, UserSettings.USER_PASSWORD_RESET_PINCODE_LETTER);
string body = settings["PasswordResetPincodeSmsBody"]; string body = settings["PasswordResetPincodeSmsBody"];
@ -1700,6 +1699,90 @@ namespace WebsitePanel.EnterpriseServer
return result; return result;
} }
public static ResultObject SendResetUserPasswordPincodeEmail(Guid token, string mailTo = null)
{
var result = TaskManager.StartResultTask<ResultObject>("ORGANIZATION", "SEND_USER_PASSWORD_RESET_EMAIL_PINCODE");
try
{
var accessToken = OrganizationController.GetAccessToken(token, AccessTokenTypes.PasswrodReset);
if (accessToken == null)
{
throw new Exception(string.Format("Access token not found"));
}
// load organization
Organization org = GetOrganization(accessToken.ItemId);
if (org == null)
{
throw new Exception(string.Format("Organization not found"));
}
UserInfo owner = PackageController.GetPackageOwner(org.PackageId);
OrganizationUser user = OrganizationController.GetUserGeneralSettingsWithExtraData(accessToken.ItemId, accessToken.AccountId);
if (string.IsNullOrEmpty(mailTo))
{
mailTo = user.PrimaryEmailAddress;
}
UserSettings settings = UserController.GetUserSettings(owner.UserId, UserSettings.USER_PASSWORD_RESET_PINCODE_LETTER);
var generalSettings = OrganizationController.GetOrganizationGeneralSettings(accessToken.ItemId);
var logoUrl = generalSettings != null ? generalSettings.OrganizationLogoUrl : string.Empty;
if (string.IsNullOrEmpty(logoUrl))
{
logoUrl = settings["LogoUrl"];
}
string from = settings["From"];
string subject = settings["Subject"];
string body = owner.HtmlMail ? settings["HtmlBody"] : settings["TextBody"];
bool isHtml = owner.HtmlMail;
MailPriority priority = MailPriority.Normal;
if (!String.IsNullOrEmpty(settings["Priority"]))
{
priority = (MailPriority)Enum.Parse(typeof(MailPriority), settings["Priority"], true);
}
string pincode = GeneratePincode() ;
Hashtable items = new Hashtable();
items["user"] = user;
items["logoUrl"] = logoUrl;
items["passwordResetPincode"] = pincode;
body = PackageController.EvaluateTemplate(body, items);
SetAccessTokenResponse(token, pincode);
TaskManager.Write("Organization ID : " + user.ItemId);
TaskManager.Write("Account : " + user.DisplayName);
TaskManager.Write("MailTo : " + mailTo);
// send mail message
MailHelper.SendMessage(from, mailTo, null, subject, body, priority, isHtml);
}
catch (Exception ex)
{
TaskManager.WriteError(ex);
TaskManager.CompleteResultTask(result);
result.AddError("", ex);
return result;
}
TaskManager.CompleteResultTask();
return result;
}
private static string GeneratePincode() private static string GeneratePincode()
{ {
var random = new Random(Guid.NewGuid().GetHashCode()); var random = new Random(Guid.NewGuid().GetHashCode());
@ -1894,6 +1977,20 @@ namespace WebsitePanel.EnterpriseServer
return resultUrl.ToString(); return resultUrl.ToString();
} }
public static AccessToken CreatePasswordResetAccessToken(int itemId, int accountId)
{
var settings = GetWebDavSystemSettings();
if (settings == null || !settings.GetValueOrDefault(SystemSettings.WEBDAV_PASSWORD_RESET_ENABLED_KEY, false))
{
return null;
}
var hours = settings.GetValueOrDefault(SystemSettings.WEBDAV_PASSWORD_RESET_LINK_LIFE_SPAN, 1);
return CreateAccessToken(itemId, accountId, AccessTokenTypes.PasswrodReset, hours);
}
private static AccessToken CreateAccessToken(int itemId, int accountId, AccessTokenTypes type, int hours) private static AccessToken CreateAccessToken(int itemId, int accountId, AccessTokenTypes type, int hours)
{ {
var token = new AccessToken var token = new AccessToken

View file

@ -204,6 +204,12 @@ namespace WebsitePanel.EnterpriseServer
return OrganizationController.SendResetUserPasswordPincodeSms(token, phoneTo); return OrganizationController.SendResetUserPasswordPincodeSms(token, phoneTo);
} }
[WebMethod]
public ResultObject SendResetUserPasswordPincodeEmail(Guid token, string mailTo = null)
{
return OrganizationController.SendResetUserPasswordPincodeEmail(token, mailTo);
}
#endregion #endregion
@ -361,6 +367,12 @@ namespace WebsitePanel.EnterpriseServer
OrganizationController.SendResetUserPasswordEmail(itemId, accountId, reason, mailTo, finalStep); OrganizationController.SendResetUserPasswordEmail(itemId, accountId, reason, mailTo, finalStep);
} }
[WebMethod]
public AccessToken CreatePasswordResetAccessToken(int itemId, int accountId)
{
return OrganizationController.CreatePasswordResetAccessToken(itemId, accountId);
}
#endregion #endregion
#region Security Groups #region Security Groups

View file

@ -75,6 +75,16 @@ namespace WebsitePanel.WebDav.Core.Config.Entities
} }
} }
public string AccountIdKey
{
get
{
SessionKeysElement sessionKey =
_sessionKeys.FirstOrDefault(x => x.Key == SessionKeysElement.AccountIdKey);
return sessionKey != null ? sessionKey.Value : null;
}
}
public string ResourseRenderCount public string ResourseRenderCount
{ {
get get

View file

@ -16,6 +16,7 @@ namespace WebsitePanel.WebDav.Core.Config.WebConfigSections
public const string ResourseRenderCountKey = "ResourseRenderCountSessionKey"; public const string ResourseRenderCountKey = "ResourseRenderCountSessionKey";
public const string ItemIdSessionKey = "ItemId"; public const string ItemIdSessionKey = "ItemId";
public const string OwaEditFoldersSessionKey = "OwaEditFoldersSession"; public const string OwaEditFoldersSessionKey = "OwaEditFoldersSession";
public const string AccountIdKey = "AccountIdKey";
[ConfigurationProperty(KeyKey, IsKey = true, IsRequired = true)] [ConfigurationProperty(KeyKey, IsKey = true, IsRequired = true)]
public string Key public string Key

View file

@ -8,5 +8,15 @@
string result = source.Remove(index, target.Length).Insert(index, newValue); string result = source.Remove(index, target.Length).Insert(index, newValue);
return result; return result;
} }
public static string Tail(this string source, int tailLength)
{
if (source == null || tailLength >= source.Length)
{
return source;
}
return source.Substring(source.Length - tailLength);
}
} }
} }

View file

@ -25,21 +25,21 @@ namespace WebsitePanel.WebDavPortal
); );
routes.MapRoute( routes.MapRoute(
name: AccountRouteNames.PasswordResetEmail, name: AccountRouteNames.PasswordResetLogin,
url: "account/password-reset/step-1", url: "account/password-reset/step-1",
defaults: new { controller = "Account", action = "PasswordResetEmail" } defaults: new { controller = "Account", action = "PasswordResetLogin" }
); );
routes.MapRoute( routes.MapRoute(
name: AccountRouteNames.PasswordResetSms, name: AccountRouteNames.PasswordResetPincodeSendOptions,
url: "account/password-reset/step-2/{token}", url: "account/password-reset/step-2/{token}",
defaults: new { controller = "Account", action = "PasswordResetSms" } defaults: new { controller = "Account", action = "PasswordResetPincodeSendOptions" }
); );
routes.MapRoute( routes.MapRoute(
name: AccountRouteNames.PasswordResetSendSms, name: AccountRouteNames.PasswordResetPincode,
url: "account/password-reset/send-new-sms/{token}", url: "account/password-reset/step-3/{token}",
defaults: new { controller = "Account", action = "PasswordResetSendSms" } defaults: new { controller = "Account", action = "PasswordResetPincode" }
); );
routes.MapRoute( routes.MapRoute(

View file

@ -12,9 +12,9 @@ namespace WebsitePanel.WebDavPortal.UI.Routes
public const string UserProfile = "UserProfileRoute"; public const string UserProfile = "UserProfileRoute";
public const string PasswordChange = "PasswordChangeRoute"; public const string PasswordChange = "PasswordChangeRoute";
public const string PasswordResetEmail = "PasswordResetEmailRoute"; public const string PasswordResetLogin = "PasswordResetLoginRoute";
public const string PasswordResetSms = "PasswordResetSmsRoute"; public const string PasswordResetPincodeSendOptions = "PasswordResetPincodeSendOptionsRoute";
public const string PasswordResetSendSms = "PasswordResetSendSmsRoute"; public const string PasswordResetPincode = "PasswordResetPincodeRoute";
public const string PasswordResetFinalStep = "PasswordResetFinalStepRoute"; public const string PasswordResetFinalStep = "PasswordResetFinalStepRoute";
public const string PasswordResetSuccess = "PasswordResetSuccess"; public const string PasswordResetSuccess = "PasswordResetSuccess";

View file

@ -14,6 +14,7 @@ using WebsitePanel.WebDav.Core.Wsp.Framework;
using WebsitePanel.WebDavPortal.CustomAttributes; using WebsitePanel.WebDavPortal.CustomAttributes;
using WebsitePanel.WebDavPortal.Models; using WebsitePanel.WebDavPortal.Models;
using WebsitePanel.WebDavPortal.Models.Account; using WebsitePanel.WebDavPortal.Models.Account;
using WebsitePanel.WebDavPortal.Models.Account.Enums;
using WebsitePanel.WebDavPortal.Models.Common; using WebsitePanel.WebDavPortal.Models.Common;
using WebsitePanel.WebDavPortal.Models.Common.EditorTemplates; using WebsitePanel.WebDavPortal.Models.Common.EditorTemplates;
using WebsitePanel.WebDavPortal.Models.Common.Enums; using WebsitePanel.WebDavPortal.Models.Common.Enums;
@ -162,16 +163,16 @@ namespace WebsitePanel.WebDavPortal.Controllers
[HttpGet] [HttpGet]
[AllowAnonymous] [AllowAnonymous]
public ActionResult PasswordResetEmail() public ActionResult PasswordResetLogin()
{ {
var model = new PasswordResetEmailModel(); var model = new PasswordResetLoginModel();
return View(model); return View(model);
} }
[HttpPost] [HttpPost]
[AllowAnonymous] [AllowAnonymous]
public ActionResult PasswordResetEmail(PasswordResetEmailModel model) public ActionResult PasswordResetLogin(PasswordResetLoginModel model)
{ {
if (!ModelState.IsValid) if (!ModelState.IsValid)
{ {
@ -187,17 +188,117 @@ namespace WebsitePanel.WebDavPortal.Controllers
return View(model); return View(model);
} }
WspContext.Services.Organizations.SendResetUserPasswordEmail(exchangeAccount.ItemId, exchangeAccount.AccountId, Resources.Messages.PasswordResetUserReason, exchangeAccount.PrimaryEmailAddress, false); var tokenEntity = WspContext.Services.Organizations.CreatePasswordResetAccessToken(exchangeAccount.ItemId, exchangeAccount.AccountId);
return View("PasswordResetEmailSent"); return RedirectToRoute(AccountRouteNames.PasswordResetPincodeSendOptions, new {token = tokenEntity.AccessTokenGuid.ToString("N")});
} }
[HttpGet] [HttpGet]
[AllowAnonymous] [AllowAnonymous]
public ActionResult PasswordResetSms(Guid token) public ActionResult PasswordResetPincodeSendOptions(Guid token)
{ {
var model = new PasswordResetSmsModel(); var accessToken = WspContext.Services.Organizations.GetPasswordresetAccessToken(token);
if (accessToken == null)
{
AddMessage(MessageType.Error, Resources.Messages.IncorrectPasswordResetUrl);
return RedirectToRoute(AccountRouteNames.PasswordResetLogin);
}
var user = WspContext.Services.Organizations.GetUserGeneralSettings(accessToken.ItemId, accessToken.AccountId);
if (string.IsNullOrEmpty(user.MobilePhone))
{
var result = WspContext.Services.Organizations.SendResetUserPasswordPincodeEmail(accessToken.AccessTokenGuid, user.PrimaryEmailAddress);
if (result.IsSuccess)
{
AddMessage(MessageType.Success, Resources.Messages.PincodeEmailWasSent);
}
else
{
AddMessage(MessageType.Error, Resources.Messages.PincodeEmailWasNotSent);
}
return RedirectToRoute(AccountRouteNames.PasswordResetPincode);
}
var model = new PasswordResetPincodeSendOptionsModel();
model.MobileNumber = user.MobilePhone;
model.Email = user.PrimaryEmailAddress;
return View(model);
}
[HttpPost]
[AllowAnonymous]
public ActionResult PasswordResetPincodeSendOptions(Guid token, PasswordResetPincodeSendOptionsModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
var accessToken = WspContext.Services.Organizations.GetPasswordresetAccessToken(token);
if (accessToken == null)
{
AddMessage(MessageType.Error, Resources.Messages.IncorrectPasswordResetUrl);
return RedirectToRoute(AccountRouteNames.PasswordResetLogin);
}
var user = WspContext.Services.Organizations.GetUserGeneralSettings(accessToken.ItemId, accessToken.AccountId);
switch (model.Method)
{
case PincodeSendMethod.Mobile:
{
var result = WspContext.Services.Organizations.SendResetUserPasswordPincodeSms(accessToken.AccessTokenGuid, user.MobilePhone);
if (result.IsSuccess)
{
AddMessage(MessageType.Success, Resources.Messages.SmsWasSent);
}
else
{
AddMessage(MessageType.Error, Resources.Messages.SmsWasNotSent);
return RedirectToRoute(AccountRouteNames.PasswordResetPincodeSendOptions);
}
break;
}
case PincodeSendMethod.Email:
{
var result = WspContext.Services.Organizations.SendResetUserPasswordPincodeEmail(accessToken.AccessTokenGuid, user.PrimaryEmailAddress);
if (result.IsSuccess)
{
AddMessage(MessageType.Success, Resources.Messages.PincodeEmailWasSent);
}
else
{
AddMessage(MessageType.Error, Resources.Messages.PincodeEmailWasNotSent);
return RedirectToRoute(AccountRouteNames.PasswordResetPincodeSendOptions);
}
break;
}
}
return RedirectToRoute(AccountRouteNames.PasswordResetPincode);
}
[HttpGet]
[AllowAnonymous]
public ActionResult PasswordResetPincode(Guid token)
{
var model = new PasswordResetPincodeModel();
var accessToken = WspContext.Services.Organizations.GetPasswordresetAccessToken(token); var accessToken = WspContext.Services.Organizations.GetPasswordresetAccessToken(token);
@ -207,25 +308,13 @@ namespace WebsitePanel.WebDavPortal.Controllers
{ {
AddMessage(MessageType.Error, Resources.Messages.IncorrectPasswordResetUrl); AddMessage(MessageType.Error, Resources.Messages.IncorrectPasswordResetUrl);
return View(model); return RedirectToRoute(AccountRouteNames.PasswordResetLogin);
} }
if (accessToken != null && accessToken.IsSmsSent == false) if (accessToken != null && accessToken.IsSmsSent == false)
{ {
var user = WspContext.Services.Organizations.GetUserGeneralSettings(accessToken.ItemId, return RedirectToRoute(AccountRouteNames.PasswordResetPincodeSendOptions);
accessToken.AccountId);
var result = WspContext.Services.Organizations.SendResetUserPasswordPincodeSms(token, user.MobilePhone);
if (result.IsSuccess)
{
AddMessage(MessageType.Success, Resources.Messages.SmsWasSent);
}
else
{
AddMessage(MessageType.Error, Resources.Messages.SmsWasNotSent);
}
} }
return View(model); return View(model);
@ -233,7 +322,7 @@ namespace WebsitePanel.WebDavPortal.Controllers
[HttpPost] [HttpPost]
[AllowAnonymous] [AllowAnonymous]
public ActionResult PasswordResetSms(Guid token, PasswordResetSmsModel model) public ActionResult PasswordResetPincode(Guid token, PasswordResetPincodeModel model)
{ {
if (!ModelState.IsValid) if (!ModelState.IsValid)
{ {
@ -313,35 +402,6 @@ namespace WebsitePanel.WebDavPortal.Controllers
return View(); return View();
} }
[HttpGet]
[AllowAnonymous]
public ActionResult PasswordResetSendSms(Guid token)
{
var accessToken = WspContext.Services.Organizations.GetPasswordresetAccessToken(token);
if (accessToken == null)
{
return RedirectToRoute(AccountRouteNames.PasswordResetSms);
}
var user = WspContext.Services.Organizations.GetUserGeneralSettings(accessToken.ItemId,
accessToken.AccountId);
var result = WspContext.Services.Organizations.SendResetUserPasswordPincodeSms(accessToken.AccessTokenGuid,
user.MobilePhone);
if (result.IsSuccess)
{
AddMessage(MessageType.Success, Resources.Messages.SmsWasSent);
}
else
{
AddMessage(MessageType.Error, Resources.Messages.SmsWasNotSent);
}
return RedirectToRoute(AccountRouteNames.PasswordResetSms);
}
#region Helpers #region Helpers
/// <summary> /// <summary>
@ -362,7 +422,7 @@ namespace WebsitePanel.WebDavPortal.Controllers
{ {
AddMessage(MessageType.Error, Resources.Messages.IncorrectSmsResponse); AddMessage(MessageType.Error, Resources.Messages.IncorrectSmsResponse);
return RedirectToRoute(AccountRouteNames.PasswordResetSms); return RedirectToRoute(AccountRouteNames.PasswordResetPincode); //todo
} }
var tokenEntity = WspContext.Services.Organizations.GetPasswordresetAccessToken(token); var tokenEntity = WspContext.Services.Organizations.GetPasswordresetAccessToken(token);

View file

@ -0,0 +1,8 @@
namespace WebsitePanel.WebDavPortal.Models.Account.Enums
{
public enum PincodeSendMethod
{
Mobile,
Email
}
}

View file

@ -4,7 +4,7 @@ using WebsitePanel.WebDavPortal.Resources;
namespace WebsitePanel.WebDavPortal.Models.Account namespace WebsitePanel.WebDavPortal.Models.Account
{ {
public class PasswordResetEmailModel public class PasswordResetLoginModel
{ {
[Required] [Required]
[Display(ResourceType = typeof(Resources.UI), Name = "Email")] [Display(ResourceType = typeof(Resources.UI), Name = "Email")]

View file

@ -3,7 +3,7 @@ using WebsitePanel.WebDavPortal.Models.Common;
namespace WebsitePanel.WebDavPortal.Models.Account namespace WebsitePanel.WebDavPortal.Models.Account
{ {
public class PasswordResetSmsModel public class PasswordResetPincodeModel
{ {
[Required] [Required]
public string Sms { get; set; } public string Sms { get; set; }

View file

@ -0,0 +1,11 @@
using WebsitePanel.WebDavPortal.Models.Account.Enums;
namespace WebsitePanel.WebDavPortal.Models.Account
{
public class PasswordResetPincodeSendOptionsModel
{
public PincodeSendMethod Method { get; set; }
public string MobileNumber { get; set; }
public string Email { get; set; }
}
}

View file

@ -160,7 +160,7 @@ namespace WebsitePanel.WebDavPortal.Resources {
} }
/// <summary> /// <summary>
/// Looks up a localized string similar to Please enter the verification code we sent to your phone. If you didn&apos;t receive a code, you can {0}.. /// Looks up a localized string similar to Please enter the verification code we sent to you. If you didn&apos;t receive a code, you can {0}..
/// </summary> /// </summary>
public static string PasswordResetSmsHintFormat { public static string PasswordResetSmsHintFormat {
get { get {
@ -213,6 +213,24 @@ namespace WebsitePanel.WebDavPortal.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Pincode was not sent to your email address..
/// </summary>
public static string PincodeEmailWasNotSent {
get {
return ResourceManager.GetString("PincodeEmailWasNotSent", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Pincode was sent to your email address..
/// </summary>
public static string PincodeEmailWasSent {
get {
return ResourceManager.GetString("PincodeEmailWasSent", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to {0} field is required. /// Looks up a localized string similar to {0} field is required.
/// </summary> /// </summary>

View file

@ -151,7 +151,7 @@
<value>A message was sent to your email address. Please check your email for further instructions.</value> <value>A message was sent to your email address. Please check your email for further instructions.</value>
</data> </data>
<data name="PasswordResetSmsHintFormat" xml:space="preserve"> <data name="PasswordResetSmsHintFormat" xml:space="preserve">
<value>Please enter the verification code we sent to your phone. If you didn't receive a code, you can {0}.</value> <value>Please enter the verification code we sent to you. If you didn't receive a code, you can {0}.</value>
</data> </data>
<data name="PasswordResetUserReason" xml:space="preserve"> <data name="PasswordResetUserReason" xml:space="preserve">
<value>Webdav portal user request.</value> <value>Webdav portal user request.</value>
@ -168,6 +168,12 @@
<data name="PhoneNumberInvalid" xml:space="preserve"> <data name="PhoneNumberInvalid" xml:space="preserve">
<value>Phone number is invalid</value> <value>Phone number is invalid</value>
</data> </data>
<data name="PincodeEmailWasNotSent" xml:space="preserve">
<value>Pincode was not sent to your email address.</value>
</data>
<data name="PincodeEmailWasSent" xml:space="preserve">
<value>Pincode was sent to your email address.</value>
</data>
<data name="Required" xml:space="preserve"> <data name="Required" xml:space="preserve">
<value>{0} field is required</value> <value>{0} field is required</value>
</data> </data>

View file

@ -699,6 +699,15 @@ namespace WebsitePanel.WebDavPortal.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Pincode.
/// </summary>
public static string Pincode {
get {
return ResourceManager.GetString("Pincode", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Please wait.... /// Looks up a localized string similar to Please wait....
/// </summary> /// </summary>
@ -807,6 +816,15 @@ namespace WebsitePanel.WebDavPortal.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Send.
/// </summary>
public static string Send {
get {
return ResourceManager.GetString("Send", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Send email. /// Looks up a localized string similar to Send email.
/// </summary> /// </summary>
@ -816,6 +834,15 @@ namespace WebsitePanel.WebDavPortal.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to When you click the send button below, a Password Reset PIN will be sent to your Cell Phone or Email Address..
/// </summary>
public static string SendPincodeTo {
get {
return ResourceManager.GetString("SendPincodeTo", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Size. /// Looks up a localized string similar to Size.
/// </summary> /// </summary>

View file

@ -411,4 +411,13 @@
<data name="YouRChangingPswForFormat" xml:space="preserve"> <data name="YouRChangingPswForFormat" xml:space="preserve">
<value>You are changing password for '{0}' account.</value> <value>You are changing password for '{0}' account.</value>
</data> </data>
<data name="Pincode" xml:space="preserve">
<value>Pincode</value>
</data>
<data name="Send" xml:space="preserve">
<value>Send</value>
</data>
<data name="SendPincodeTo" xml:space="preserve">
<value>When you click the send button below, a Password Reset PIN will be sent to your Cell Phone or Email Address.</value>
</data>
</root> </root>

View file

@ -36,7 +36,7 @@
<button type="submit" class="btn btn-default">Sign in</button> <button type="submit" class="btn btn-default">Sign in</button>
@if (Model.PasswordResetEnabled) @if (Model.PasswordResetEnabled)
{ {
<a href="@Url.RouteUrl(AccountRouteNames.PasswordResetEmail)" class="forgot-your-password-link">@UI.ForgotYourPassword</a> <a href="@Url.RouteUrl(AccountRouteNames.PasswordResetLogin)" class="forgot-your-password-link">@UI.ForgotYourPassword</a>
} }
</div> </div>
</div> </div>

View file

@ -1,6 +1,6 @@
@using WebsitePanel.WebDavPortal.Resources @using WebsitePanel.WebDavPortal.Resources
@using WebsitePanel.WebDavPortal.UI.Routes @using WebsitePanel.WebDavPortal.UI.Routes
@model WebsitePanel.WebDavPortal.Models.Account.PasswordResetEmailModel @model WebsitePanel.WebDavPortal.Models.Account.PasswordResetLoginModel
@{ @{
Layout = "~/Views/Shared/_Layout.cshtml"; Layout = "~/Views/Shared/_Layout.cshtml";
@ -8,7 +8,7 @@
<div class="container row"> <div class="container row">
@using (Html.BeginRouteForm(AccountRouteNames.PasswordResetEmail, FormMethod.Post, new { @class = "user-password-reset-email bs-val-styles col-lg-10 col-lg-offset-3", id = "user-password-reset" })) @using (Html.BeginRouteForm(AccountRouteNames.PasswordResetLogin, FormMethod.Post, new { @class = "user-password-reset-email bs-val-styles col-lg-10 col-lg-offset-3", id = "user-password-reset" }))
{ {
<div class="form-group"> <div class="form-group">
<h3>@UI.PasswordReset</h3> <h3>@UI.PasswordReset</h3>
@ -18,6 +18,6 @@
@Html.TextBoxFor(x => x.Email, new { @class = "form-control", placeholder = UI.Login }) @Html.TextBoxFor(x => x.Email, new { @class = "form-control", placeholder = UI.Login })
@Html.ValidationMessageFor(x => x.Email) @Html.ValidationMessageFor(x => x.Email)
</div> </div>
<button type="submit" class="btn btn-default">@UI.SendEmail</button> <button type="submit" class="btn btn-default">@UI.Next</button>
} }
</div> </div>

View file

@ -1,6 +1,6 @@
@using WebsitePanel.WebDavPortal.Resources @using WebsitePanel.WebDavPortal.Resources
@using WebsitePanel.WebDavPortal.UI.Routes @using WebsitePanel.WebDavPortal.UI.Routes
@model WebsitePanel.WebDavPortal.Models.Account.PasswordResetSmsModel @model WebsitePanel.WebDavPortal.Models.Account.PasswordResetPincodeModel
@{ @{
Layout = "~/Views/Shared/_Layout.cshtml"; Layout = "~/Views/Shared/_Layout.cshtml";
@ -9,7 +9,7 @@
@if (Model.IsTokenExist) @if (Model.IsTokenExist)
{ {
<div class="container row"> <div class="container row">
@using (Html.BeginRouteForm(AccountRouteNames.PasswordResetSms, FormMethod.Post, new {@class = "user-password-reset-sms bs-val-styles col-lg-9 col-lg-offset-3", id = "user-password-reset"})) @using (Html.BeginRouteForm(AccountRouteNames.PasswordResetPincode, FormMethod.Post, new {@class = "user-password-reset-sms bs-val-styles col-lg-9 col-lg-offset-3", id = "user-password-reset"}))
{ {
@Html.HiddenFor(x=>x.IsTokenExist) @Html.HiddenFor(x=>x.IsTokenExist)
@ -17,9 +17,9 @@
<h3>@UI.PasswordReset</h3> <h3>@UI.PasswordReset</h3>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="@Html.IdFor(x => x.Sms)" class="control-label">@Html.Raw(string.Format(Messages.PasswordResetSmsHintFormat, Html.RouteLink(UI.TryAgain.ToLowerInvariant(), AccountRouteNames.PasswordResetSendSms)))</label> <label for="@Html.IdFor(x => x.Sms)" class="control-label">@Html.Raw(string.Format(Messages.PasswordResetSmsHintFormat, Html.RouteLink(UI.TryAgain.ToLowerInvariant(), AccountRouteNames.PasswordResetPincodeSendOptions)))</label>
<div > <div >
@Html.TextBoxFor(x => x.Sms, new {@class = "form-control", placeholder = UI.Sms}) @Html.TextBoxFor(x => x.Sms, new {@class = "form-control", placeholder = UI.Pincode})
@Html.ValidationMessageFor(x => x.Sms) @Html.ValidationMessageFor(x => x.Sms)
</div> </div>
</div> </div>

View file

@ -0,0 +1,51 @@
@using WebsitePanel.WebDav.Core.Extensions
@using WebsitePanel.WebDavPortal.Models.Account.Enums
@using WebsitePanel.WebDavPortal.Resources
@using WebsitePanel.WebDavPortal.UI.Routes
@model WebsitePanel.WebDavPortal.Models.Account.PasswordResetPincodeSendOptionsModel
@{
var indexOf = Model.Email.IndexOf('@');
var maskedEmail = string.Empty;
for (int i = 0; i < indexOf - 1; i++)
{
maskedEmail += '*';
}
maskedEmail += Model.Email.Substring(indexOf - 1);
var maskedPhone = string.Empty;
for (int i = 0; i < Model.MobileNumber.Count() - 5; i++)
{
maskedPhone += '*';
}
maskedPhone += Model.MobileNumber.Tail(4);
}
<div class="container row">
@using (Html.BeginRouteForm(AccountRouteNames.PasswordResetPincodeSendOptions, FormMethod.Post, new { @class = "user-password-pincode-send-options bs-val-styles col-lg-10 col-lg-offset-3", id = "user-password-reset" }))
{
<div class="form-group">
<h3>@UI.PasswordReset</h3>
</div>
<div class="form-group">
<div class="input-group">
<label class="control-label">@UI.SendPincodeTo </label>
</div>
<div class="input-group">
@Html.RadioButtonFor(x => x.Method, PincodeSendMethod.Mobile)
@maskedPhone (@UI.MobilePhone)
</div>
<div class="input-group">
@Html.RadioButtonFor(x => x.Method, PincodeSendMethod.Email)
@maskedEmail (@UI.Email)
</div>
</div>
<button type="submit" class="btn btn-default">@UI.Send</button>
}
</div>

View file

@ -54,6 +54,7 @@
<add key="UserGroupsKey" value="UserGroups" /> <add key="UserGroupsKey" value="UserGroups" />
<add key="OwaEditFoldersSession" value="OwaEditFolders" /> <add key="OwaEditFoldersSession" value="OwaEditFolders" />
<add key="PasswordResetSmsKey" value="PasswordResetSms" /> <add key="PasswordResetSmsKey" value="PasswordResetSms" />
<add key="AccountIdKey" value="AccountId" />
</sessionKeys> </sessionKeys>
<fileIcons defaultPath="~/Content/Images/other-icon.png" folderPath="~/Content/Images/folder_100x100.png"> <fileIcons defaultPath="~/Content/Images/other-icon.png" folderPath="~/Content/Images/folder_100x100.png">
<add extension=".txt" path="~/Content/Images/txt-icon.png" /> <add extension=".txt" path="~/Content/Images/txt-icon.png" />

View file

@ -196,10 +196,12 @@
<Compile Include="Mapping\Profiles\Webdav\ResourceTableItemProfile.cs" /> <Compile Include="Mapping\Profiles\Webdav\ResourceTableItemProfile.cs" />
<Compile Include="ModelBinders\DataTables\JqueryDataTableModelBinder.cs" /> <Compile Include="ModelBinders\DataTables\JqueryDataTableModelBinder.cs" />
<Compile Include="Models\AccountModel.cs" /> <Compile Include="Models\AccountModel.cs" />
<Compile Include="Models\Account\Enums\PincodeSendMethod.cs" />
<Compile Include="Models\Account\PasswordChangeModel.cs" /> <Compile Include="Models\Account\PasswordChangeModel.cs" />
<Compile Include="Models\Account\PasswordResetEmailModel.cs" /> <Compile Include="Models\Account\PasswordResetLoginModel.cs" />
<Compile Include="Models\Account\PasswordResetFinalStepModel.cs" /> <Compile Include="Models\Account\PasswordResetFinalStepModel.cs" />
<Compile Include="Models\Account\PasswordResetSmsModel.cs" /> <Compile Include="Models\Account\PasswordResetPincodeSendOptionsModel.cs" />
<Compile Include="Models\Account\PasswordResetPincodeModel.cs" />
<Compile Include="Models\Account\UserProfile.cs" /> <Compile Include="Models\Account\UserProfile.cs" />
<Compile Include="Models\Common\AjaxModel.cs" /> <Compile Include="Models\Common\AjaxModel.cs" />
<Compile Include="Models\Common\DataTable\JqueryDataTableBaseEntity.cs" /> <Compile Include="Models\Common\DataTable\JqueryDataTableBaseEntity.cs" />
@ -486,11 +488,12 @@
<Content Include="Views\Shared\EditorTemplates\CountrySelector.cshtml" /> <Content Include="Views\Shared\EditorTemplates\CountrySelector.cshtml" />
<Content Include="Views\Account\PasswordChange.cshtml" /> <Content Include="Views\Account\PasswordChange.cshtml" />
<Content Include="Views\Shared\EditorTemplates\PasswordEditor.cshtml" /> <Content Include="Views\Shared\EditorTemplates\PasswordEditor.cshtml" />
<Content Include="Views\Account\PasswordResetEmail.cshtml" /> <Content Include="Views\Account\PasswordResetLogin.cshtml" />
<Content Include="Views\Account\PasswordResetEmailSent.cshtml" /> <Content Include="Views\Account\PasswordResetEmailSent.cshtml" />
<Content Include="Views\Account\PasswordResetSms.cshtml" /> <Content Include="Views\Account\PasswordResetPincode.cshtml" />
<Content Include="Views\Account\PasswordResetFinalStep.cshtml" /> <Content Include="Views\Account\PasswordResetFinalStep.cshtml" />
<Content Include="Views\Account\PasswordSuccessfullyChanged.cshtml" /> <Content Include="Views\Account\PasswordSuccessfullyChanged.cshtml" />
<Content Include="Views\Account\PasswordResetPincodeSendOptions.cshtml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Models\FileSystem\Enums\" /> <Folder Include="Models\FileSystem\Enums\" />

View file

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ddlPriorityItem.High" xml:space="preserve">
<value>High</value>
</data>
<data name="ddlPriorityItem.Low" xml:space="preserve">
<value>Low</value>
</data>
<data name="ddlPriorityItem.Normal" xml:space="preserve">
<value>Normal</value>
</data>
<data name="lblFrom.Text" xml:space="preserve">
<value>From:</value>
</data>
<data name="lblHtmlBody.Text" xml:space="preserve">
<value>HTML Body:</value>
</data>
<data name="lblLogoUrl.Text" xml:space="preserve">
<value>Logo Url:</value>
</data>
<data name="lblNoChangesHtmlBody" xml:space="preserve">
<value>No Changes HTML Body:</value>
</data>
<data name="lblNoChangesTextBody.Text" xml:space="preserve">
<value>No Changes Text Body:</value>
</data>
<data name="lblPasswordResetLinkSmsBody.Text" xml:space="preserve">
<value>Password Reset Link Sms Body:</value>
</data>
<data name="lblPasswordResetPincodeSmsBody.Text" xml:space="preserve">
<value>Password Reset Link Pincode Body:</value>
</data>
<data name="lblPriority.Text" xml:space="preserve">
<value>Priority:</value>
</data>
<data name="lblSubject.Text" xml:space="preserve">
<value>Subject:</value>
</data>
<data name="lblTextBody.Text" xml:space="preserve">
<value>Text Body:</value>
</data>
</root>

View file

@ -156,4 +156,7 @@
<data name="lnkOrganizationUserPasswordResetLetter.Text" xml:space="preserve"> <data name="lnkOrganizationUserPasswordResetLetter.Text" xml:space="preserve">
<value>Organization User Password Reset Letter</value> <value>Organization User Password Reset Letter</value>
</data> </data>
<data name="lnkOrganizationUserPasswordResetPincodeLetter.Text" xml:space="preserve">
<value>Organization User Password Reset Pincode Letter</value>
</data>
</root> </root>

View file

@ -49,12 +49,5 @@
<td class="Normal" colspan="2"> <td class="Normal" colspan="2">
<asp:TextBox ID="txtBodyPasswordResetLinkSmsBody" runat="server" Rows="15" TextMode="MultiLine" Width="680px" CssClass="NormalTextBox" Wrap="false"></asp:TextBox></td> <asp:TextBox ID="txtBodyPasswordResetLinkSmsBody" runat="server" Rows="15" TextMode="MultiLine" Width="680px" CssClass="NormalTextBox" Wrap="false"></asp:TextBox></td>
</tr> </tr>
tr>
<td class="SubHead" colspan="2"><br /><br /><asp:Label ID="lblPasswordResetPincodeSmsBody" runat="server" meta:resourcekey="lblPasswordResetPincodeSmsBody" Text="Password Reset Link Pincode Body:"></asp:Label></td>
</tr>
<tr>
<td class="Normal" colspan="2">
<asp:TextBox ID="txtPasswordResetPincodeSmsBody" runat="server" Rows="15" TextMode="MultiLine" Width="680px" CssClass="NormalTextBox" Wrap="false"></asp:TextBox></td>
</tr>
</table> </table>

View file

@ -20,7 +20,6 @@ namespace WebsitePanel.Portal
txtLogoUrl.Text = settings["LogoUrl"]; txtLogoUrl.Text = settings["LogoUrl"];
txtBodyPasswordResetLinkSmsBody.Text = settings["PasswordResetLinkSmsBody"]; txtBodyPasswordResetLinkSmsBody.Text = settings["PasswordResetLinkSmsBody"];
txtPasswordResetPincodeSmsBody.Text = settings["PasswordResetPincodeSmsBody"];
} }
public void SaveSettings(UserSettings settings) public void SaveSettings(UserSettings settings)
@ -33,7 +32,6 @@ namespace WebsitePanel.Portal
settings["LogoUrl"] = txtLogoUrl.Text; settings["LogoUrl"] = txtLogoUrl.Text;
settings["PasswordResetLinkSmsBody"]= txtBodyPasswordResetLinkSmsBody.Text; settings["PasswordResetLinkSmsBody"]= txtBodyPasswordResetLinkSmsBody.Text;
settings["PasswordResetPincodeSmsBody"] =txtPasswordResetPincodeSmsBody.Text;
} }
} }
} }

View file

@ -137,23 +137,5 @@ namespace WebsitePanel.Portal {
/// To modify move field declaration from designer file to code-behind file. /// To modify move field declaration from designer file to code-behind file.
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtBodyPasswordResetLinkSmsBody; protected global::System.Web.UI.WebControls.TextBox txtBodyPasswordResetLinkSmsBody;
/// <summary>
/// lblPasswordResetPincodeSmsBody control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label lblPasswordResetPincodeSmsBody;
/// <summary>
/// txtPasswordResetPincodeSmsBody control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtPasswordResetPincodeSmsBody;
} }
} }

View file

@ -0,0 +1,55 @@
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SettingsUserPasswordResetPincodeLetter.ascx.cs" Inherits="WebsitePanel.Portal.SettingsUserPasswordResetPincodeLetter" %>
<table>
<tr>
<td class="SubHead" width="150" nowrap><asp:Label ID="lblFrom" runat="server" meta:resourcekey="lblFrom" Text="From:"></asp:Label></td>
<td class="Normal" width="100%">
<asp:TextBox ID="txtFrom" runat="server" Width="500px" CssClass="NormalTextBox"></asp:TextBox></td>
</tr>
<tr>
<td class="SubHead"><asp:Label ID="lblSubject" runat="server" meta:resourcekey="lblSubject" Text="Subject:"></asp:Label></td>
<td class="Normal">
<asp:TextBox ID="txtSubject" runat="server" Width="500px" CssClass="NormalTextBox"></asp:TextBox></td>
</tr>
<tr>
<td class="SubHead"><asp:Label ID="lblPriority" runat="server" meta:resourcekey="lblPriority" Text="Priority"></asp:Label></td>
<td class="Normal">
<asp:DropDownList ID="ddlPriority" runat="server" CssClass="NormalTextBox" resourcekey="ddlPriority">
<asp:ListItem Value="High">High</asp:ListItem>
<asp:ListItem Value="Normal">Normal</asp:ListItem>
<asp:ListItem Value="Low">Low</asp:ListItem>
</asp:DropDownList>
</td>
</tr>
<tr>
<td class="SubHead"><asp:Label ID="lblLogoUrl" runat="server" meta:resourcekey="lblLogoUrl" Text="Logo Url:"></asp:Label></td>
<td class="Normal">
<asp:TextBox ID="txtLogoUrl" runat="server" Width="500px" CssClass="NormalTextBox"></asp:TextBox></td>
</tr>
<tr>
<td class="SubHead" colspan="2"><br /><br /><asp:Label ID="lblHtmlBody" runat="server" meta:resourcekey="lblHtmlBody" Text="HTML Body:"></asp:Label></td>
</tr>
<tr>
<td class="Normal" colspan="2">
<asp:TextBox ID="txtHtmlBody" runat="server" Rows="15" TextMode="MultiLine" Width="680px" CssClass="NormalTextBox" Wrap="false"></asp:TextBox></td>
</tr>
<tr>
<td class="SubHead" colspan="2"><br /><br /><asp:Label ID="lblTextBody" runat="server" meta:resourcekey="lblTextBody" Text="Text Body:"></asp:Label></td>
</tr>
<tr>
<td class="Normal" colspan="2">
<asp:TextBox ID="txtTextBody" runat="server" Rows="15" TextMode="MultiLine" Width="680px" CssClass="NormalTextBox" Wrap="false"></asp:TextBox></td>
</tr>
<tr>
<td class="SubHead" colspan="2"><br /><br /><asp:Label ID="lblPasswordResetPincodeSmsBody" runat="server" meta:resourcekey="lblPasswordResetPincodeSmsBody" Text="Password Reset Link Pincode Body:"></asp:Label></td>
</tr>
<tr>
<td class="Normal" colspan="2">
<asp:TextBox ID="txtPasswordResetPincodeSmsBody" runat="server" Rows="15" TextMode="MultiLine" Width="680px" CssClass="NormalTextBox" Wrap="false"></asp:TextBox></td>
</tr>
</table>

View file

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WebsitePanel.EnterpriseServer;
namespace WebsitePanel.Portal
{
public partial class SettingsUserPasswordResetPincodeLetter : WebsitePanelControlBase, IUserSettingsEditorControl
{
public void BindSettings(UserSettings settings)
{
txtFrom.Text = settings["From"];
txtSubject.Text = settings["Subject"];
Utils.SelectListItem(ddlPriority, settings["Priority"]);
txtHtmlBody.Text = settings["HtmlBody"];
txtTextBody.Text = settings["TextBody"];
txtLogoUrl.Text = settings["LogoUrl"];
txtPasswordResetPincodeSmsBody.Text = settings["PasswordResetPincodeSmsBody"];
}
public void SaveSettings(UserSettings settings)
{
settings["From"] = txtFrom.Text;
settings["Subject"] = txtSubject.Text;
settings["Priority"] = ddlPriority.SelectedValue;
settings["HtmlBody"] = txtHtmlBody.Text;
settings["TextBody"] = txtTextBody.Text;
settings["LogoUrl"] = txtLogoUrl.Text;
settings["PasswordResetPincodeSmsBody"] = txtPasswordResetPincodeSmsBody.Text;
}
}
}

View file

@ -0,0 +1,141 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace WebsitePanel.Portal {
public partial class SettingsUserPasswordResetPincodeLetter {
/// <summary>
/// lblFrom control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label lblFrom;
/// <summary>
/// txtFrom control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtFrom;
/// <summary>
/// lblSubject control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label lblSubject;
/// <summary>
/// txtSubject control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtSubject;
/// <summary>
/// lblPriority control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label lblPriority;
/// <summary>
/// ddlPriority control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.DropDownList ddlPriority;
/// <summary>
/// lblLogoUrl control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label lblLogoUrl;
/// <summary>
/// txtLogoUrl control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtLogoUrl;
/// <summary>
/// lblHtmlBody control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label lblHtmlBody;
/// <summary>
/// txtHtmlBody control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtHtmlBody;
/// <summary>
/// lblTextBody control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label lblTextBody;
/// <summary>
/// txtTextBody control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtTextBody;
/// <summary>
/// lblPasswordResetPincodeSmsBody control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label lblPasswordResetPincodeSmsBody;
/// <summary>
/// txtPasswordResetPincodeSmsBody control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtPasswordResetPincodeSmsBody;
}
}

View file

@ -50,6 +50,10 @@
<asp:HyperLink ID="lnkOrganizationUserPasswordResetLetter" runat="server" meta:resourcekey="lnkOrganizationUserPasswordResetLetter" <asp:HyperLink ID="lnkOrganizationUserPasswordResetLetter" runat="server" meta:resourcekey="lnkOrganizationUserPasswordResetLetter"
Text="User Password Reset Letter" NavigateUrl='<%# GetSettingsLink("UserPasswordResetLetter", "SettingsUserPasswordResetLetter") %>'></asp:HyperLink> Text="User Password Reset Letter" NavigateUrl='<%# GetSettingsLink("UserPasswordResetLetter", "SettingsUserPasswordResetLetter") %>'></asp:HyperLink>
</li> </li>
<li>
<asp:HyperLink ID="lnkOrganizationUserPasswordResetPincodeLetter" runat="server" meta:resourcekey="lnkOrganizationUserPasswordResetPincodeLetter"
Text="User Password Reset Pincode Letter" NavigateUrl='<%# GetSettingsLink("UserPasswordResetPincodeLetter", "SettingsUserPasswordResetPincodeLetter") %>'></asp:HyperLink>
</li>
</ul> </ul>
</div> </div>
<div class="FormFooter"> <div class="FormFooter">

View file

@ -120,6 +120,15 @@ namespace WebsitePanel.Portal {
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.HyperLink lnkOrganizationUserPasswordResetLetter; protected global::System.Web.UI.WebControls.HyperLink lnkOrganizationUserPasswordResetLetter;
/// <summary>
/// lnkOrganizationUserPasswordResetPincodeLetter control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.HyperLink lnkOrganizationUserPasswordResetPincodeLetter;
/// <summary> /// <summary>
/// btnCancel control. /// btnCancel control.
/// </summary> /// </summary>

View file

@ -342,6 +342,13 @@
<DependentUpon>UserPasswordExpirationNotificationView.ascx</DependentUpon> <DependentUpon>UserPasswordExpirationNotificationView.ascx</DependentUpon>
<SubType>ASPXCodeBehind</SubType> <SubType>ASPXCodeBehind</SubType>
</Compile> </Compile>
<Compile Include="SettingsUserPasswordResetPincodeLetter.ascx.cs">
<DependentUpon>SettingsUserPasswordResetPincodeLetter.ascx</DependentUpon>
<SubType>ASPXCodeBehind</SubType>
</Compile>
<Compile Include="SettingsUserPasswordResetPincodeLetter.ascx.designer.cs">
<DependentUpon>SettingsUserPasswordResetPincodeLetter.ascx</DependentUpon>
</Compile>
<Compile Include="VPS2012\RemoteDesktop\Connect.aspx.cs"> <Compile Include="VPS2012\RemoteDesktop\Connect.aspx.cs">
<DependentUpon>Connect.aspx</DependentUpon> <DependentUpon>Connect.aspx</DependentUpon>
<SubType>ASPXCodeBehind</SubType> <SubType>ASPXCodeBehind</SubType>
@ -4876,6 +4883,7 @@
<Content Include="ScheduleTaskControls\UserPasswordExpirationNotificationView.ascx" /> <Content Include="ScheduleTaskControls\UserPasswordExpirationNotificationView.ascx" />
<Content Include="SettingsUserPasswordExpirationLetter.ascx" /> <Content Include="SettingsUserPasswordExpirationLetter.ascx" />
<Content Include="SettingsUserPasswordResetLetter.ascx" /> <Content Include="SettingsUserPasswordResetLetter.ascx" />
<Content Include="SettingsUserPasswordResetPincodeLetter.ascx" />
<Content Include="VPS2012\RemoteDesktop\Connect.aspx" /> <Content Include="VPS2012\RemoteDesktop\Connect.aspx" />
<Content Include="VPS2012\RemoteDesktop\msrdp.cab" /> <Content Include="VPS2012\RemoteDesktop\msrdp.cab" />
<Content Include="VPS2012\TestVirtualMachineTemplate.aspx" /> <Content Include="VPS2012\TestVirtualMachineTemplate.aspx" />
@ -4989,6 +4997,7 @@
</Content> </Content>
<Content Include="ExchangeServer\App_LocalResources\OrganizationSettingsGeneralSettings.ascx.resx" /> <Content Include="ExchangeServer\App_LocalResources\OrganizationSettingsGeneralSettings.ascx.resx" />
<Content Include="App_LocalResources\SettingsUserPasswordResetLetter.ascx.resx" /> <Content Include="App_LocalResources\SettingsUserPasswordResetLetter.ascx.resx" />
<Content Include="App_LocalResources\SettingsUserPasswordResetPincodeLetter.ascx.resx" />
<EmbeddedResource Include="RDS\App_LocalResources\RDSEditCollectionSettings.ascx.resx" /> <EmbeddedResource Include="RDS\App_LocalResources\RDSEditCollectionSettings.ascx.resx" />
<Content Include="RDSServersEditServer.ascx" /> <Content Include="RDSServersEditServer.ascx" />
<Content Include="RDS\AssignedRDSServers.ascx" /> <Content Include="RDS\AssignedRDSServers.ascx" />