This commit is contained in:
alexY 2015-04-29 15:57:26 +03:00
commit a8933e9597
144 changed files with 2103 additions and 1624 deletions

View file

@ -10031,6 +10031,37 @@ UPDATE [dbo].[UserSettings] SET [PropertyValue] = @UserPasswordResetLetterTextBo
GO GO
DECLARE @UserPasswordResetSMSBody nvarchar(2500)
Set @UserPasswordResetSMSBody = N'Password reset link:
#passwordResetLink#
'
IF NOT EXISTS (SELECT * FROM [dbo].[UserSettings] WHERE [UserID] = 1 AND [SettingsName]= N'UserPasswordResetLetter' AND [PropertyName]= N'PasswordResetLinkSmsBody' )
BEGIN
INSERT [dbo].[UserSettings] ([UserID], [SettingsName], [PropertyName], [PropertyValue]) VALUES (1, N'UserPasswordResetLetter', N'PasswordResetLinkSmsBody', @UserPasswordResetSMSBody)
END
ELSE
UPDATE [dbo].[UserSettings] SET [PropertyValue] = @UserPasswordResetSMSBody WHERE [UserID] = 1 AND [SettingsName]= N'UserPasswordResetLetter' AND [PropertyName]= N'PasswordResetLinkSmsBody'
GO
DECLARE @UserPasswordPincodeSMSBody nvarchar(2500)
Set @UserPasswordPincodeSMSBody = N'
Your password reset pincode:
#passwordResetPincode#'
IF NOT EXISTS (SELECT * FROM [dbo].[UserSettings] WHERE [UserID] = 1 AND [SettingsName]= N'UserPasswordResetLetter' AND [PropertyName]= N'PasswordResetPincodeSmsBody' )
BEGIN
INSERT [dbo].[UserSettings] ([UserID], [SettingsName], [PropertyName], [PropertyValue]) VALUES (1, N'UserPasswordResetLetter', N'PasswordResetPincodeSmsBody', @UserPasswordPincodeSMSBody)
END
ELSE
UPDATE [dbo].[UserSettings] SET [PropertyValue] = @UserPasswordPincodeSMSBody WHERE [UserID] = 1 AND [SettingsName]= N'UserPasswordResetLetter' AND [PropertyName]= N'PasswordResetPincodeSmsBody'
GO
-- Exchange setup EMAIL TEMPLATE -- Exchange setup EMAIL TEMPLATE
@ -10690,7 +10721,6 @@ GO
IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetSearchObject') IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetSearchObject')
DROP PROCEDURE GetSearchObject DROP PROCEDURE GetSearchObject
GO GO
CREATE PROCEDURE [dbo].[GetSearchObject] CREATE PROCEDURE [dbo].[GetSearchObject]
( (
@ActorID int, @ActorID int,

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<solution>
<add key="disableSourceControlIntegration" value="true" />
</solution>
</configuration>

Binary file not shown.

View file

@ -0,0 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">$(MSBuildProjectDirectory)\..\</SolutionDir>
<!-- Enable the restore command to run before builds -->
<RestorePackages Condition=" '$(RestorePackages)' == '' ">false</RestorePackages>
<!-- Property that enables building a package from a project -->
<BuildPackage Condition=" '$(BuildPackage)' == '' ">false</BuildPackage>
<!-- Determines if package restore consent is required to restore packages -->
<RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'false' ">true</RequireRestoreConsent>
<!-- Download NuGet.exe if it does not already exist -->
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>
</PropertyGroup>
<ItemGroup Condition=" '$(PackageSources)' == '' ">
<!-- Package sources used to restore packages. By default, registered sources under %APPDATA%\NuGet\NuGet.Config will be used -->
<!-- The official NuGet package source (https://www.nuget.org/api/v2/) will be excluded if package sources are specified and it does not appear in the list -->
<!--
<PackageSource Include="https://www.nuget.org/api/v2/" />
<PackageSource Include="https://my-nuget-source/nuget/" />
-->
</ItemGroup>
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
<!-- Windows specific commands -->
<NuGetToolsPath>$([System.IO.Path]::Combine($(SolutionDir), ".nuget"))</NuGetToolsPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(OS)' != 'Windows_NT'">
<!-- We need to launch nuget.exe with the mono command if we're not on windows -->
<NuGetToolsPath>$(SolutionDir).nuget</NuGetToolsPath>
</PropertyGroup>
<PropertyGroup>
<PackagesProjectConfig Condition=" '$(OS)' == 'Windows_NT'">$(MSBuildProjectDirectory)\packages.$(MSBuildProjectName.Replace(' ', '_')).config</PackagesProjectConfig>
<PackagesProjectConfig Condition=" '$(OS)' != 'Windows_NT'">$(MSBuildProjectDirectory)\packages.$(MSBuildProjectName).config</PackagesProjectConfig>
</PropertyGroup>
<PropertyGroup>
<PackagesConfig Condition="Exists('$(MSBuildProjectDirectory)\packages.config')">$(MSBuildProjectDirectory)\packages.config</PackagesConfig>
<PackagesConfig Condition="Exists('$(PackagesProjectConfig)')">$(PackagesProjectConfig)</PackagesConfig>
</PropertyGroup>
<PropertyGroup>
<!-- NuGet command -->
<NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(NuGetToolsPath)\NuGet.exe</NuGetExePath>
<PackageSources Condition=" $(PackageSources) == '' ">@(PackageSource)</PackageSources>
<NuGetCommand Condition=" '$(OS)' == 'Windows_NT'">"$(NuGetExePath)"</NuGetCommand>
<NuGetCommand Condition=" '$(OS)' != 'Windows_NT' ">mono --runtime=v4.0.30319 "$(NuGetExePath)"</NuGetCommand>
<PackageOutputDir Condition="$(PackageOutputDir) == ''">$(TargetDir.Trim('\\'))</PackageOutputDir>
<RequireConsentSwitch Condition=" $(RequireRestoreConsent) == 'true' ">-RequireConsent</RequireConsentSwitch>
<NonInteractiveSwitch Condition=" '$(VisualStudioVersion)' != '' AND '$(OS)' == 'Windows_NT' ">-NonInteractive</NonInteractiveSwitch>
<PaddedSolutionDir Condition=" '$(OS)' == 'Windows_NT'">"$(SolutionDir) "</PaddedSolutionDir>
<PaddedSolutionDir Condition=" '$(OS)' != 'Windows_NT' ">"$(SolutionDir)"</PaddedSolutionDir>
<!-- Commands -->
<RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir)</RestoreCommand>
<BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols</BuildCommand>
<!-- We need to ensure packages are restored prior to assembly resolve -->
<BuildDependsOn Condition="$(RestorePackages) == 'true'">
RestorePackages;
$(BuildDependsOn);
</BuildDependsOn>
<!-- Make the build depend on restore packages -->
<BuildDependsOn Condition="$(BuildPackage) == 'true'">
$(BuildDependsOn);
BuildPackage;
</BuildDependsOn>
</PropertyGroup>
<Target Name="CheckPrerequisites">
<!-- Raise an error if we're unable to locate nuget.exe -->
<Error Condition="'$(DownloadNuGetExe)' != 'true' AND !Exists('$(NuGetExePath)')" Text="Unable to locate '$(NuGetExePath)'" />
<!--
Take advantage of MsBuild's build dependency tracking to make sure that we only ever download nuget.exe once.
This effectively acts as a lock that makes sure that the download operation will only happen once and all
parallel builds will have to wait for it to complete.
-->
<MsBuild Targets="_DownloadNuGet" Projects="$(MSBuildThisFileFullPath)" Properties="Configuration=NOT_IMPORTANT;DownloadNuGetExe=$(DownloadNuGetExe)" />
</Target>
<Target Name="_DownloadNuGet">
<DownloadNuGet OutputFilename="$(NuGetExePath)" Condition=" '$(DownloadNuGetExe)' == 'true' AND !Exists('$(NuGetExePath)')" />
</Target>
<Target Name="RestorePackages" DependsOnTargets="CheckPrerequisites">
<Exec Command="$(RestoreCommand)"
Condition="'$(OS)' != 'Windows_NT' And Exists('$(PackagesConfig)')" />
<Exec Command="$(RestoreCommand)"
LogStandardErrorAsError="true"
Condition="'$(OS)' == 'Windows_NT' And Exists('$(PackagesConfig)')" />
</Target>
<Target Name="BuildPackage" DependsOnTargets="CheckPrerequisites">
<Exec Command="$(BuildCommand)"
Condition=" '$(OS)' != 'Windows_NT' " />
<Exec Command="$(BuildCommand)"
LogStandardErrorAsError="true"
Condition=" '$(OS)' == 'Windows_NT' " />
</Target>
<UsingTask TaskName="DownloadNuGet" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<OutputFilename ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
<Reference Include="System.Core" />
<Using Namespace="System" />
<Using Namespace="System.IO" />
<Using Namespace="System.Net" />
<Using Namespace="Microsoft.Build.Framework" />
<Using Namespace="Microsoft.Build.Utilities" />
<Code Type="Fragment" Language="cs">
<![CDATA[
try {
OutputFilename = Path.GetFullPath(OutputFilename);
Log.LogMessage("Downloading latest version of NuGet.exe...");
WebClient webClient = new WebClient();
webClient.DownloadFile("https://www.nuget.org/nuget.exe", OutputFilename);
return true;
}
catch (Exception ex) {
Log.LogErrorFromException(ex);
return false;
}
]]>
</Code>
</Task>
</UsingTask>
</Project>

View file

@ -47,6 +47,14 @@ namespace WebsitePanel.EnterpriseServer
public const string PACKAGE_DISPLAY_SETTINGS = "PackageDisplaySettings"; public const string PACKAGE_DISPLAY_SETTINGS = "PackageDisplaySettings";
public const string RDS_SETTINGS = "RdsSettings"; public const string RDS_SETTINGS = "RdsSettings";
public const string WEBDAV_PORTAL_SETTINGS = "WebdavPortalSettings"; public const string WEBDAV_PORTAL_SETTINGS = "WebdavPortalSettings";
public const string TWILIO_SETTINGS = "TwilioSettings";
//Keys
public const string TWILIO_ACCOUNTSID_KEY = "TwilioAccountSid";
public const string TWILIO_AUTHTOKEN_KEY = "TwilioAuthToken";
public const string TWILIO_PHONEFROM_KEY = "TwilioPhoneFrom";
public const string WEBDAV_PASSWORD_RESET_ENABLED_KEY = "WebdavPswResetEnabled"; public const string WEBDAV_PASSWORD_RESET_ENABLED_KEY = "WebdavPswResetEnabled";
// key to access to wpi main & custom feed in wpi settings // key to access to wpi main & custom feed in wpi settings

View file

@ -11,6 +11,12 @@
// //
// 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.Providers;
using WebsitePanel.Providers.Common;
using WebsitePanel.Providers.HostedSolution;
using WebsitePanel.Providers.ResultObjects;
namespace WebsitePanel.EnterpriseServer { namespace WebsitePanel.EnterpriseServer {
using System.Xml.Serialization; using System.Xml.Serialization;
using System.Web.Services; using System.Web.Services;
@ -19,10 +25,6 @@ namespace WebsitePanel.EnterpriseServer {
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.Data; using System.Data;
using WebsitePanel.Providers.HostedSolution;
using WebsitePanel.Providers.Common;
using WebsitePanel.Providers.ResultObjects;
using WebsitePanel.Providers;
/// <remarks/> /// <remarks/>
@ -4311,24 +4313,26 @@ namespace WebsitePanel.EnterpriseServer {
/// <remarks/> /// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetMailboxSetupInstructions", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetMailboxSetupInstructions", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public string GetMailboxSetupInstructions(int itemId, int accountId, bool pmm, bool emailMode, bool signup) { public string GetMailboxSetupInstructions(int itemId, int accountId, bool pmm, bool emailMode, bool signup, string passwordResetUrl) {
object[] results = this.Invoke("GetMailboxSetupInstructions", new object[] { object[] results = this.Invoke("GetMailboxSetupInstructions", new object[] {
itemId, itemId,
accountId, accountId,
pmm, pmm,
emailMode, emailMode,
signup}); signup,
passwordResetUrl});
return ((string)(results[0])); return ((string)(results[0]));
} }
/// <remarks/> /// <remarks/>
public System.IAsyncResult BeginGetMailboxSetupInstructions(int itemId, int accountId, bool pmm, bool emailMode, bool signup, System.AsyncCallback callback, object asyncState) { public System.IAsyncResult BeginGetMailboxSetupInstructions(int itemId, int accountId, bool pmm, bool emailMode, bool signup, string passwordResetUrl, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("GetMailboxSetupInstructions", new object[] { return this.BeginInvoke("GetMailboxSetupInstructions", new object[] {
itemId, itemId,
accountId, accountId,
pmm, pmm,
emailMode, emailMode,
signup}, callback, asyncState); signup,
passwordResetUrl}, callback, asyncState);
} }
/// <remarks/> /// <remarks/>
@ -4338,12 +4342,12 @@ namespace WebsitePanel.EnterpriseServer {
} }
/// <remarks/> /// <remarks/>
public void GetMailboxSetupInstructionsAsync(int itemId, int accountId, bool pmm, bool emailMode, bool signup) { public void GetMailboxSetupInstructionsAsync(int itemId, int accountId, bool pmm, bool emailMode, bool signup, string passwordResetUrl) {
this.GetMailboxSetupInstructionsAsync(itemId, accountId, pmm, emailMode, signup, null); this.GetMailboxSetupInstructionsAsync(itemId, accountId, pmm, emailMode, signup, passwordResetUrl, null);
} }
/// <remarks/> /// <remarks/>
public void GetMailboxSetupInstructionsAsync(int itemId, int accountId, bool pmm, bool emailMode, bool signup, object userState) { public void GetMailboxSetupInstructionsAsync(int itemId, int accountId, bool pmm, bool emailMode, bool signup, string passwordResetUrl, object userState) {
if ((this.GetMailboxSetupInstructionsOperationCompleted == null)) { if ((this.GetMailboxSetupInstructionsOperationCompleted == null)) {
this.GetMailboxSetupInstructionsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetMailboxSetupInstructionsOperationCompleted); this.GetMailboxSetupInstructionsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetMailboxSetupInstructionsOperationCompleted);
} }
@ -4352,7 +4356,8 @@ namespace WebsitePanel.EnterpriseServer {
accountId, accountId,
pmm, pmm,
emailMode, emailMode,
signup}, this.GetMailboxSetupInstructionsOperationCompleted, userState); signup,
passwordResetUrl}, this.GetMailboxSetupInstructionsOperationCompleted, userState);
} }
private void OnGetMailboxSetupInstructionsOperationCompleted(object arg) { private void OnGetMailboxSetupInstructionsOperationCompleted(object arg) {

View file

@ -80,6 +80,12 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
private System.Threading.SendOrPostCallback SetDefaultOrganizationOperationCompleted; private System.Threading.SendOrPostCallback SetDefaultOrganizationOperationCompleted;
private System.Threading.SendOrPostCallback GetUserGeneralSettingsWithExtraDataOperationCompleted;
private System.Threading.SendOrPostCallback SendResetUserPasswordLinkSmsOperationCompleted;
private System.Threading.SendOrPostCallback SendResetUserPasswordPincodeSmsOperationCompleted;
private System.Threading.SendOrPostCallback AddOrganizationDomainOperationCompleted; private System.Threading.SendOrPostCallback AddOrganizationDomainOperationCompleted;
private System.Threading.SendOrPostCallback ChangeOrganizationDomainTypeOperationCompleted; private System.Threading.SendOrPostCallback ChangeOrganizationDomainTypeOperationCompleted;
@ -229,6 +235,15 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
/// <remarks/> /// <remarks/>
public event SetDefaultOrganizationCompletedEventHandler SetDefaultOrganizationCompleted; public event SetDefaultOrganizationCompletedEventHandler SetDefaultOrganizationCompleted;
/// <remarks/>
public event GetUserGeneralSettingsWithExtraDataCompletedEventHandler GetUserGeneralSettingsWithExtraDataCompleted;
/// <remarks/>
public event SendResetUserPasswordLinkSmsCompletedEventHandler SendResetUserPasswordLinkSmsCompleted;
/// <remarks/>
public event SendResetUserPasswordPincodeSmsCompletedEventHandler SendResetUserPasswordPincodeSmsCompleted;
/// <remarks/> /// <remarks/>
public event AddOrganizationDomainCompletedEventHandler AddOrganizationDomainCompleted; public event AddOrganizationDomainCompletedEventHandler AddOrganizationDomainCompleted;
@ -1310,6 +1325,144 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
} }
} }
/// <remarks/>
[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]));
}
/// <remarks/>
public System.IAsyncResult BeginGetUserGeneralSettingsWithExtraData(int itemId, int accountId, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("GetUserGeneralSettingsWithExtraData", new object[] {
itemId,
accountId}, callback, asyncState);
}
/// <remarks/>
public OrganizationUser EndGetUserGeneralSettingsWithExtraData(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((OrganizationUser)(results[0]));
}
/// <remarks/>
public void GetUserGeneralSettingsWithExtraDataAsync(int itemId, int accountId) {
this.GetUserGeneralSettingsWithExtraDataAsync(itemId, accountId, null);
}
/// <remarks/>
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));
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendResetUserPasswordLinkSms", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public ResultObject SendResetUserPasswordLinkSms(int itemId, int accountId, string reason, string phoneTo) {
object[] results = this.Invoke("SendResetUserPasswordLinkSms", new object[] {
itemId,
accountId,
reason,
phoneTo});
return ((ResultObject)(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginSendResetUserPasswordLinkSms(int itemId, int accountId, string reason, string phoneTo, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("SendResetUserPasswordLinkSms", new object[] {
itemId,
accountId,
reason,
phoneTo}, callback, asyncState);
}
/// <remarks/>
public ResultObject EndSendResetUserPasswordLinkSms(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((ResultObject)(results[0]));
}
/// <remarks/>
public void SendResetUserPasswordLinkSmsAsync(int itemId, int accountId, string reason, string phoneTo) {
this.SendResetUserPasswordLinkSmsAsync(itemId, accountId, reason, phoneTo, null);
}
/// <remarks/>
public void SendResetUserPasswordLinkSmsAsync(int itemId, int accountId, string reason, string phoneTo, object userState) {
if ((this.SendResetUserPasswordLinkSmsOperationCompleted == null)) {
this.SendResetUserPasswordLinkSmsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSendResetUserPasswordLinkSmsOperationCompleted);
}
this.InvokeAsync("SendResetUserPasswordLinkSms", new object[] {
itemId,
accountId,
reason,
phoneTo}, this.SendResetUserPasswordLinkSmsOperationCompleted, userState);
}
private void OnSendResetUserPasswordLinkSmsOperationCompleted(object arg) {
if ((this.SendResetUserPasswordLinkSmsCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.SendResetUserPasswordLinkSmsCompleted(this, new SendResetUserPasswordLinkSmsCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendResetUserPasswordPincodeSms", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public ResultObject SendResetUserPasswordPincodeSms(System.Guid token, string phoneTo) {
object[] results = this.Invoke("SendResetUserPasswordPincodeSms", new object[] {
token,
phoneTo});
return ((ResultObject)(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginSendResetUserPasswordPincodeSms(System.Guid token, string phoneTo, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("SendResetUserPasswordPincodeSms", new object[] {
token,
phoneTo}, callback, asyncState);
}
/// <remarks/>
public ResultObject EndSendResetUserPasswordPincodeSms(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((ResultObject)(results[0]));
}
/// <remarks/>
public void SendResetUserPasswordPincodeSmsAsync(System.Guid token, string phoneTo) {
this.SendResetUserPasswordPincodeSmsAsync(token, phoneTo, null);
}
/// <remarks/>
public void SendResetUserPasswordPincodeSmsAsync(System.Guid token, string phoneTo, object userState) {
if ((this.SendResetUserPasswordPincodeSmsOperationCompleted == null)) {
this.SendResetUserPasswordPincodeSmsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSendResetUserPasswordPincodeSmsOperationCompleted);
}
this.InvokeAsync("SendResetUserPasswordPincodeSms", new object[] {
token,
phoneTo}, this.SendResetUserPasswordPincodeSmsOperationCompleted, userState);
}
private void OnSendResetUserPasswordPincodeSmsOperationCompleted(object arg) {
if ((this.SendResetUserPasswordPincodeSmsCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.SendResetUserPasswordPincodeSmsCompleted(this, new SendResetUserPasswordPincodeSmsCompletedEventArgs(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) {
@ -2495,21 +2648,23 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
/// <remarks/> /// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/SendResetUserPasswordEmail", 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/SendResetUserPasswordEmail", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public void SendResetUserPasswordEmail(int itemId, int accountId, string reason, string mailTo) { public void SendResetUserPasswordEmail(int itemId, int accountId, string reason, string mailTo, bool finalStep) {
this.Invoke("SendResetUserPasswordEmail", new object[] { this.Invoke("SendResetUserPasswordEmail", new object[] {
itemId, itemId,
accountId, accountId,
reason, reason,
mailTo}); mailTo,
finalStep});
} }
/// <remarks/> /// <remarks/>
public System.IAsyncResult BeginSendResetUserPasswordEmail(int itemId, int accountId, string reason, string mailTo, System.AsyncCallback callback, object asyncState) { public System.IAsyncResult BeginSendResetUserPasswordEmail(int itemId, int accountId, string reason, string mailTo, bool finalStep, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("SendResetUserPasswordEmail", new object[] { return this.BeginInvoke("SendResetUserPasswordEmail", new object[] {
itemId, itemId,
accountId, accountId,
reason, reason,
mailTo}, callback, asyncState); mailTo,
finalStep}, callback, asyncState);
} }
/// <remarks/> /// <remarks/>
@ -2518,12 +2673,12 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
} }
/// <remarks/> /// <remarks/>
public void SendResetUserPasswordEmailAsync(int itemId, int accountId, string reason, string mailTo) { public void SendResetUserPasswordEmailAsync(int itemId, int accountId, string reason, string mailTo, bool finalStep) {
this.SendResetUserPasswordEmailAsync(itemId, accountId, reason, mailTo, null); this.SendResetUserPasswordEmailAsync(itemId, accountId, reason, mailTo, finalStep, null);
} }
/// <remarks/> /// <remarks/>
public void SendResetUserPasswordEmailAsync(int itemId, int accountId, string reason, string mailTo, object userState) { public void SendResetUserPasswordEmailAsync(int itemId, int accountId, string reason, string mailTo, bool finalStep, object userState) {
if ((this.SendResetUserPasswordEmailOperationCompleted == null)) { if ((this.SendResetUserPasswordEmailOperationCompleted == null)) {
this.SendResetUserPasswordEmailOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSendResetUserPasswordEmailOperationCompleted); this.SendResetUserPasswordEmailOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSendResetUserPasswordEmailOperationCompleted);
} }
@ -2531,7 +2686,8 @@ namespace WebsitePanel.EnterpriseServer.HostedSolution {
itemId, itemId,
accountId, accountId,
reason, reason,
mailTo}, this.SendResetUserPasswordEmailOperationCompleted, userState); mailTo,
finalStep}, this.SendResetUserPasswordEmailOperationCompleted, userState);
} }
private void OnSendResetUserPasswordEmailOperationCompleted(object arg) { private void OnSendResetUserPasswordEmailOperationCompleted(object arg) {
@ -3816,6 +3972,84 @@ 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 SetDefaultOrganizationCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); public delegate void SetDefaultOrganizationCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void GetUserGeneralSettingsWithExtraDataCompletedEventHandler(object sender, GetUserGeneralSettingsWithExtraDataCompletedEventArgs e);
/// <remarks/>
[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;
}
/// <remarks/>
public OrganizationUser Result {
get {
this.RaiseExceptionIfNecessary();
return ((OrganizationUser)(this.results[0]));
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void SendResetUserPasswordLinkSmsCompletedEventHandler(object sender, SendResetUserPasswordLinkSmsCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class SendResetUserPasswordLinkSmsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal SendResetUserPasswordLinkSmsCompletedEventArgs(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/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void SendResetUserPasswordPincodeSmsCompletedEventHandler(object sender, SendResetUserPasswordPincodeSmsCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class SendResetUserPasswordPincodeSmsCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal SendResetUserPasswordPincodeSmsCompletedEventArgs(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);

View file

@ -2564,7 +2564,7 @@ namespace WebsitePanel.EnterpriseServer
} }
} }
public static string GetMailboxSetupInstructions(int itemId, int accountId, bool pmm, bool emailMode, bool signup) public static string GetMailboxSetupInstructions(int itemId, int accountId, bool pmm, bool emailMode, bool signup, string passwordResetUrl)
{ {
#region Demo Mode #region Demo Mode
if (IsDemoMode) if (IsDemoMode)
@ -2589,12 +2589,11 @@ namespace WebsitePanel.EnterpriseServer
if (String.IsNullOrEmpty(body)) if (String.IsNullOrEmpty(body))
return null; return null;
string result = EvaluateMailboxTemplate(itemId, accountId, pmm, false, false, body); string result = EvaluateMailboxTemplate(itemId, accountId, pmm, false, false, body, passwordResetUrl);
return user.HtmlMail ? result : result.Replace("\n", "<br/>"); return user.HtmlMail ? result : result.Replace("\n", "<br/>");
} }
private static string EvaluateMailboxTemplate(int itemId, int accountId, private static string EvaluateMailboxTemplate(int itemId, int accountId, bool pmm, bool emailMode, bool signup, string template, string passwordResetUrl)
bool pmm, bool emailMode, bool signup, string template)
{ {
Hashtable items = new Hashtable(); Hashtable items = new Hashtable();
@ -2616,7 +2615,10 @@ namespace WebsitePanel.EnterpriseServer
items["AccountDomain"] = account.PrimaryEmailAddress.Substring(account.PrimaryEmailAddress.IndexOf("@") + 1); items["AccountDomain"] = account.PrimaryEmailAddress.Substring(account.PrimaryEmailAddress.IndexOf("@") + 1);
items["DefaultDomain"] = org.DefaultDomain; items["DefaultDomain"] = org.DefaultDomain;
var passwordResetUrl = OrganizationController.GenerateUserPasswordResetLink(account.ItemId, account.AccountId); Guid token;
passwordResetUrl = OrganizationController.GenerateUserPasswordResetLink(account.ItemId, account.AccountId, out token, string.Empty, passwordResetUrl);
if (!string.IsNullOrEmpty(passwordResetUrl)) if (!string.IsNullOrEmpty(passwordResetUrl))
{ {
items["PswResetUrl"] = passwordResetUrl; items["PswResetUrl"] = passwordResetUrl;
@ -2694,8 +2696,8 @@ namespace WebsitePanel.EnterpriseServer
if (to == null) if (to == null)
to = user.Email; to = user.Email;
subject = EvaluateMailboxTemplate(itemId, accountId, false, true, signup, subject); subject = EvaluateMailboxTemplate(itemId, accountId, false, true, signup, subject, string.Empty);
body = EvaluateMailboxTemplate(itemId, accountId, false, true, signup, body); body = EvaluateMailboxTemplate(itemId, accountId, false, true, signup, body, string.Empty);
// send message // send message
return MailHelper.SendMessage(from, to, cc, subject, body, priority, isHtml); return MailHelper.SendMessage(from, to, cc, subject, body, priority, isHtml);

View file

@ -30,10 +30,13 @@ using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Configuration;
using System.Data; using System.Data;
using System.Globalization;
using System.Net.Mail; using System.Net.Mail;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Twilio;
using WebsitePanel.EnterpriseServer.Code.HostedSolution; using WebsitePanel.EnterpriseServer.Code.HostedSolution;
using WebsitePanel.EnterpriseServer.Code.SharePoint; using WebsitePanel.EnterpriseServer.Code.SharePoint;
using WebsitePanel.EnterpriseServer.Extensions; using WebsitePanel.EnterpriseServer.Extensions;
@ -1560,6 +1563,173 @@ namespace WebsitePanel.EnterpriseServer
return expiredUsersDb; return expiredUsersDb;
} }
public static ResultObject SendResetUserPasswordLinkSms(int itemId, int accountId, string reason,
string phoneTo = null)
{
var result = TaskManager.StartResultTask<ResultObject>("ORGANIZATION", "SEND_USER_PASSWORD_RESET_SMS",
itemId);
try
{
// load organization
Organization org = GetOrganization(itemId);
if (org == null)
{
throw new Exception(string.Format("Organization not found (ItemId = {0})", itemId));
}
UserInfo owner = PackageController.GetPackageOwner(org.PackageId);
OrganizationUser user = OrganizationController.GetUserGeneralSettingsWithExtraData(itemId, accountId);
user.ItemId = itemId;
if (string.IsNullOrEmpty(phoneTo))
{
phoneTo = user.MobilePhone;
}
UserSettings settings = UserController.GetUserSettings(owner.UserId,
UserSettings.USER_PASSWORD_RESET_LETTER);
string body = settings["PasswordResetLinkSmsBody"];
var pincode = GeneratePincode();
Guid token;
var items = new Hashtable();
items["passwordResetLink"] = GenerateUserPasswordResetLink(user.ItemId, user.AccountId, out token, pincode);
body = PackageController.EvaluateTemplate(body, items);
TaskManager.Write("Organization ID : " + user.ItemId);
TaskManager.Write("Account : " + user.DisplayName);
TaskManager.Write("Reason : " + reason);
TaskManager.Write("SmsTo : " + phoneTo);
// send Sms message
var response = SendSms(phoneTo, body);
if (response.RestException != null)
{
throw new Exception(response.RestException.Message);
}
SetAccessTokenResponse(token, pincode);
}
catch (Exception ex)
{
TaskManager.WriteError(ex);
TaskManager.CompleteResultTask(result);
result.AddError("", ex);
return result;
}
TaskManager.CompleteResultTask();
return result;
}
public static ResultObject SendResetUserPasswordPincodeSms(Guid token, string phoneTo = null)
{
var result = TaskManager.StartResultTask<ResultObject>("ORGANIZATION", "SEND_USER_PASSWORD_RESET_SMS_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(phoneTo))
{
phoneTo = user.MobilePhone;
}
UserSettings settings = UserController.GetUserSettings(owner.UserId, UserSettings.USER_PASSWORD_RESET_LETTER);
string body = settings["PasswordResetPincodeSmsBody"];
var items = new Hashtable();
var pincode = GeneratePincode();
items["passwordResetPincode"] = pincode;
body = PackageController.EvaluateTemplate(body, items);
TaskManager.Write("Organization ID : " + user.ItemId);
TaskManager.Write("Account : " + user.DisplayName);
TaskManager.Write("SmsTo : " + phoneTo);
// send Sms message
var response = SendSms(phoneTo, body);
if (response.RestException != null)
{
throw new Exception(response.RestException.Message);
}
SetAccessTokenResponse(token, pincode);
}
catch (Exception ex)
{
TaskManager.WriteError(ex);
TaskManager.CompleteResultTask(result);
result.AddError("", ex);
return result;
}
TaskManager.CompleteResultTask();
return result;
}
private static string GeneratePincode()
{
var random = new Random(Guid.NewGuid().GetHashCode());
return random.Next(10000, 99999).ToString(CultureInfo.InvariantCulture);
}
private static SMSMessage SendSms(string to, string body)
{
SystemSettings settings = SystemController.GetSystemSettingsInternal(SystemSettings.TWILIO_SETTINGS, false);
if (settings == null)
{
throw new Exception("Twilio settings are not set");
}
string accountSid = settings.GetValueOrDefault(SystemSettings.TWILIO_ACCOUNTSID_KEY, string.Empty);
string authToken = settings.GetValueOrDefault(SystemSettings.TWILIO_AUTHTOKEN_KEY, string.Empty);
string phoneFrom = settings.GetValueOrDefault(SystemSettings.TWILIO_PHONEFROM_KEY, string.Empty);
if (string.IsNullOrEmpty(accountSid) || string.IsNullOrEmpty(accountSid) || string.IsNullOrEmpty(accountSid))
{
throw new Exception("Twilio settings are not set (System settings)");
}
var client = new TwilioRestClient(accountSid, authToken);
return client.SendSmsMessage(phoneFrom, to, body);
}
/// <summary> /// <summary>
/// Send reset user password email /// Send reset user password email
/// </summary> /// </summary>
@ -1567,7 +1737,8 @@ namespace WebsitePanel.EnterpriseServer
/// <param name="accountId">User Id</param> /// <param name="accountId">User Id</param>
/// <param name="reason">Reason why reset email is sent.</param> /// <param name="reason">Reason why reset email is sent.</param>
/// <param name="mailTo">Optional, if null accountID user PrimaryEmailAddress will be used</param> /// <param name="mailTo">Optional, if null accountID user PrimaryEmailAddress will be used</param>
public static void SendResetUserPasswordEmail(int itemId, int accountId, string reason, string mailTo = null) /// <param name="finalStep">Url direction</param>
public static void SendResetUserPasswordEmail(int itemId, int accountId, string reason, string mailTo, bool finalStep)
{ {
// load organization // load organization
Organization org = GetOrganization(itemId); Organization org = GetOrganization(itemId);
@ -1581,11 +1752,9 @@ namespace WebsitePanel.EnterpriseServer
UserInfo owner = PackageController.GetPackageOwner(org.PackageId); UserInfo owner = PackageController.GetPackageOwner(org.PackageId);
OrganizationUser user = OrganizationController.GetAccount(itemId, accountId); OrganizationUser user = OrganizationController.GetUserGeneralSettingsWithExtraData(itemId, accountId);
OrganizationUser settings = orgProxy.GetUserGeneralSettings(user.AccountName, org.OrganizationId); user.ItemId = itemId;
user.PasswordExpirationDateTime = settings.PasswordExpirationDateTime;
if (string.IsNullOrEmpty(mailTo)) if (string.IsNullOrEmpty(mailTo))
{ {
@ -1596,16 +1765,16 @@ namespace WebsitePanel.EnterpriseServer
var logoUrl = generalSettings != null ? generalSettings.OrganizationLogoUrl : string.Empty; var logoUrl = generalSettings != null ? generalSettings.OrganizationLogoUrl : string.Empty;
SendUserPasswordEmail(owner, user, reason, mailTo, logoUrl, UserSettings.USER_PASSWORD_RESET_LETTER, "USER_PASSWORD_RESET_LETTER"); SendUserPasswordEmail(owner, user, reason, mailTo, logoUrl, UserSettings.USER_PASSWORD_RESET_LETTER, "USER_PASSWORD_RESET_LETTER", finalStep);
} }
public static void SendUserExpirationPasswordEmail(UserInfo owner, OrganizationUser user, string reason, public static void SendUserExpirationPasswordEmail(UserInfo owner, OrganizationUser user, string reason,
string mailTo, string logoUrl) string mailTo, string logoUrl)
{ {
SendUserPasswordEmail(owner, user, reason, user.PrimaryEmailAddress, logoUrl, UserSettings.USER_PASSWORD_EXPIRATION_LETTER, "USER_PASSWORD_EXPIRATION_LETTER"); SendUserPasswordEmail(owner, user, reason, user.PrimaryEmailAddress, logoUrl, UserSettings.USER_PASSWORD_EXPIRATION_LETTER, "USER_PASSWORD_EXPIRATION_LETTER", false);
} }
public static void SendUserPasswordEmail(UserInfo owner, OrganizationUser user, string reason, string mailTo, string logoUrl, string settingsName, string taskName) public static void SendUserPasswordEmail(UserInfo owner, OrganizationUser user, string reason, string mailTo, string logoUrl, string settingsName, string taskName, bool finalStep)
{ {
UserSettings settings = UserController.GetUserSettings(owner.UserId, UserSettings settings = UserController.GetUserSettings(owner.UserId,
settingsName); settingsName);
@ -1632,14 +1801,23 @@ namespace WebsitePanel.EnterpriseServer
priority = (MailPriority) Enum.Parse(typeof (MailPriority), settings["Priority"], true); priority = (MailPriority) Enum.Parse(typeof (MailPriority), settings["Priority"], true);
} }
Guid token;
string pincode = finalStep ? GeneratePincode() : null;
Hashtable items = new Hashtable(); Hashtable items = new Hashtable();
items["user"] = user; items["user"] = user;
items["logoUrl"] = logoUrl; items["logoUrl"] = logoUrl;
items["passwordResetLink"] = GenerateUserPasswordResetLink(user.ItemId, user.AccountId); items["passwordResetLink"] = GenerateUserPasswordResetLink(user.ItemId, user.AccountId, out token, pincode);
body = PackageController.EvaluateTemplate(body, items); body = PackageController.EvaluateTemplate(body, items);
if (finalStep)
{
SetAccessTokenResponse(token, pincode);
}
TaskManager.Write("Organization ID : " + user.ItemId); TaskManager.Write("Organization ID : " + user.ItemId);
TaskManager.Write("Account : " + user.DisplayName); TaskManager.Write("Account : " + user.DisplayName);
TaskManager.Write("Reason : " + reason); TaskManager.Write("Reason : " + reason);
@ -1658,6 +1836,8 @@ namespace WebsitePanel.EnterpriseServer
} }
} }
public static AccessToken GetAccessToken(Guid accessToken, AccessTokenTypes type) public static AccessToken GetAccessToken(Guid accessToken, AccessTokenTypes type)
{ {
return ObjectUtils.FillObjectFromDataReader<AccessToken>(DataProvider.GetAccessTokenByAccessToken(accessToken, type)); return ObjectUtils.FillObjectFromDataReader<AccessToken>(DataProvider.GetAccessTokenByAccessToken(accessToken, type));
@ -1678,23 +1858,38 @@ namespace WebsitePanel.EnterpriseServer
return SystemController.GetSystemSettingsInternal(SystemSettings.WEBDAV_PORTAL_SETTINGS, false); return SystemController.GetSystemSettingsInternal(SystemSettings.WEBDAV_PORTAL_SETTINGS, false);
} }
public static string GenerateUserPasswordResetLink(int itemId, int accountId) public static string GenerateUserPasswordResetLink(int itemId, int accountId, out Guid tokenGuid, string pincode = null, string resetUrl = null)
{ {
string passwordResetUrlFormat = "account/password-reset/step-2";
var settings = GetWebDavSystemSettings(); var settings = GetWebDavSystemSettings();
tokenGuid = new Guid();
if (settings == null || !settings.GetValueOrDefault(SystemSettings.WEBDAV_PASSWORD_RESET_ENABLED_KEY, false) ||!settings.Contains("WebdavPortalUrl")) if (settings == null || !settings.GetValueOrDefault(SystemSettings.WEBDAV_PASSWORD_RESET_ENABLED_KEY, false) || !settings.Contains("WebdavPortalUrl"))
{ {
return string.Empty; return string.Empty;
} }
if (string.IsNullOrEmpty(resetUrl) == false)
{
return resetUrl;
}
string passwordResetUrlFormat = string.IsNullOrEmpty(pincode) ? "account/password-reset/step-2" : "account/password-reset/step-final";
var webdavPortalUrl = new Uri(settings["WebdavPortalUrl"]); var webdavPortalUrl = new Uri(settings["WebdavPortalUrl"]);
var token = CreateAccessToken(itemId, accountId, AccessTokenTypes.PasswrodReset); var token = CreateAccessToken(itemId, accountId, AccessTokenTypes.PasswrodReset);
return webdavPortalUrl.Append(passwordResetUrlFormat) tokenGuid = token.AccessTokenGuid;
.Append(token.AccessTokenGuid.ToString("n")).ToString();
var resultUrl = webdavPortalUrl.Append(passwordResetUrlFormat)
.Append(token.AccessTokenGuid.ToString("n"));
if (string.IsNullOrEmpty(pincode) == false)
{
resultUrl = resultUrl.Append(pincode);
}
return resultUrl.ToString();
} }
private static AccessToken CreateAccessToken(int itemId, int accountId, AccessTokenTypes type) private static AccessToken CreateAccessToken(int itemId, int accountId, AccessTokenTypes type)
@ -1804,7 +1999,8 @@ namespace WebsitePanel.EnterpriseServer
AccountLockoutDuration = GetValueSafe(parts, 9, 0), AccountLockoutDuration = GetValueSafe(parts, 9, 0),
ResetAccountLockoutCounterAfter = GetValueSafe(parts, 10, 0), ResetAccountLockoutCounterAfter = GetValueSafe(parts, 10, 0),
LockoutSettingsEnabled = GetValueSafe(parts, 11, false), LockoutSettingsEnabled = GetValueSafe(parts, 11, false),
PasswordComplexityEnabled = GetValueSafe(parts, 11, true), PasswordComplexityEnabled = GetValueSafe(parts, 12, true),
MaxPasswordAge = GetValueSafe(parts, 13, 42),
}; };
@ -2668,6 +2864,50 @@ namespace WebsitePanel.EnterpriseServer
return (account); 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, public static int SetUserGeneralSettings(int itemId, int accountId, string displayName,
string password, bool hideAddressBook, bool disabled, bool locked, string firstName, string initials, string password, bool hideAddressBook, bool disabled, bool locked, string firstName, string initials,
string lastName, string address, string city, string state, string zip, string country, string lastName, string address, string city, string state, string zip, string country,

View file

@ -57,11 +57,6 @@ namespace WebsitePanel.EnterpriseServer
} }
} }
} }
// send mail message
// MailHelper.SendMessage(mailFrom, mailTo, mailSubject, mailBody, false);
} }
} }
} }

View file

@ -12,6 +12,8 @@
<AssemblyName>WebsitePanel.EnterpriseServer.Code</AssemblyName> <AssemblyName>WebsitePanel.EnterpriseServer.Code</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
@ -42,6 +44,9 @@
<HintPath>..\..\Lib\Microsoft.Web.Services3.dll</HintPath> <HintPath>..\..\Lib\Microsoft.Web.Services3.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="RestSharp">
<HintPath>..\packages\RestSharp.105.0.1\lib\net4\RestSharp.dll</HintPath>
</Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Configuration" /> <Reference Include="System.Configuration" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
@ -55,6 +60,9 @@
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="Twilio.Api">
<HintPath>..\packages\Twilio.3.6.29\lib\3.5\Twilio.Api.dll</HintPath>
</Reference>
<Reference Include="WebsitePanel.EnterpriseServer.Base, Version=2.1.0.1, Culture=neutral, PublicKeyToken=da8782a6fc4d0081, processorArchitecture=MSIL"> <Reference Include="WebsitePanel.EnterpriseServer.Base, Version=2.1.0.1, Culture=neutral, PublicKeyToken=da8782a6fc4d0081, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Bin\WebsitePanel.EnterpriseServer.Base.dll</HintPath> <HintPath>..\..\Bin\WebsitePanel.EnterpriseServer.Base.dll</HintPath>
@ -202,8 +210,17 @@
<Name>WebsitePanel.Whois</Name> <Name>WebsitePanel.Whois</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup /> <ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="RestSharp" version="105.0.1" targetFramework="net40" />
<package id="Twilio" version="3.6.29" targetFramework="net40" />
</packages>

View file

@ -315,9 +315,9 @@ namespace WebsitePanel.EnterpriseServer
} }
[WebMethod] [WebMethod]
public string GetMailboxSetupInstructions(int itemId, int accountId, bool pmm, bool emailMode, bool signup) public string GetMailboxSetupInstructions(int itemId, int accountId, bool pmm, bool emailMode, bool signup, string passwordResetUrl)
{ {
return ExchangeServerController.GetMailboxSetupInstructions(itemId, accountId, pmm, emailMode, signup); return ExchangeServerController.GetMailboxSetupInstructions(itemId, accountId, pmm, emailMode, signup, passwordResetUrl);
} }
[WebMethod] [WebMethod]

View file

@ -93,7 +93,7 @@ namespace WebsitePanel.EnterpriseServer
[WebMethod] [WebMethod]
public SystemSettings GetWebDavSystemSettings() public SystemSettings GetWebDavSystemSettings()
{ {
return OrganizationController.GetWebDavSystemSettings(); return OrganizationController.GetWebDavSystemSettings();
} }
[WebMethod] [WebMethod]
@ -185,7 +185,27 @@ namespace WebsitePanel.EnterpriseServer
OrganizationController.SetDefaultOrganization(newDefaultOrganizationId, currentDefaultOrganizationId); OrganizationController.SetDefaultOrganization(newDefaultOrganizationId, currentDefaultOrganizationId);
} }
#endregion [WebMethod]
public OrganizationUser GetUserGeneralSettingsWithExtraData(int itemId, int accountId)
{
return OrganizationController.GetUserGeneralSettingsWithExtraData(itemId, accountId);
}
[WebMethod]
public ResultObject SendResetUserPasswordLinkSms(int itemId, int accountId, string reason, string phoneTo = null)
{
return OrganizationController.SendResetUserPasswordLinkSms(itemId, accountId, reason, phoneTo);
}
[WebMethod]
public ResultObject SendResetUserPasswordPincodeSms(Guid token, string phoneTo = null)
{
return OrganizationController.SendResetUserPasswordPincodeSms(token, phoneTo);
}
#endregion
#region Domains #region Domains
@ -336,9 +356,9 @@ namespace WebsitePanel.EnterpriseServer
} }
[WebMethod] [WebMethod]
public void SendResetUserPasswordEmail(int itemId, int accountId, string reason, string mailTo = null) public void SendResetUserPasswordEmail(int itemId, int accountId, string reason, string mailTo, bool finalStep)
{ {
OrganizationController.SendResetUserPasswordEmail(itemId, accountId, reason, mailTo); OrganizationController.SendResetUserPasswordEmail(itemId, accountId, reason, mailTo, finalStep);
} }
#endregion #endregion

View file

@ -102,5 +102,7 @@ namespace WebsitePanel.Providers.HostedSolution
void ApplyPasswordSettings(string organizationId, OrganizationPasswordSettings passwordSettings); void ApplyPasswordSettings(string organizationId, OrganizationPasswordSettings passwordSettings);
bool CheckPhoneNumberIsInUse(string phoneNumber, string userSamAccountName = null); bool CheckPhoneNumberIsInUse(string phoneNumber, string userSamAccountName = null);
OrganizationUser GetOrganizationUserWithExtraData(string loginName, string organizationId);
} }
} }

View file

@ -5,6 +5,7 @@
public int MinimumLength { get; set; } public int MinimumLength { get; set; }
public int MaximumLength { get; set; } public int MaximumLength { get; set; }
public int EnforcePasswordHistory { get; set; } public int EnforcePasswordHistory { get; set; }
public int MaxPasswordAge { get; set; }
public bool LockoutSettingsEnabled { get; set; } public bool LockoutSettingsEnabled { get; set; }
public int AccountLockoutDuration { get; set; } public int AccountLockoutDuration { get; set; }

View file

@ -740,7 +740,8 @@ namespace WebsitePanel.Providers.HostedSolution
cmd.Parameters.Add("MinPasswordLength", settings.MinimumLength); cmd.Parameters.Add("MinPasswordLength", settings.MinimumLength);
cmd.Parameters.Add("PasswordHistoryCount", settings.EnforcePasswordHistory); cmd.Parameters.Add("PasswordHistoryCount", settings.EnforcePasswordHistory);
cmd.Parameters.Add("ComplexityEnabled", false); cmd.Parameters.Add("ComplexityEnabled", false);
cmd.Parameters.Add("ReversibleEncryptionEnabled", false); cmd.Parameters.Add("ReversibleEncryptionEnabled", false);
cmd.Parameters.Add("MaxPasswordAge", new TimeSpan(settings.MaxPasswordAge * 24, 0, 0));
if (settings.LockoutSettingsEnabled) if (settings.LockoutSettingsEnabled)
{ {
@ -777,6 +778,7 @@ namespace WebsitePanel.Providers.HostedSolution
cmd.Parameters.Add("PasswordHistoryCount", settings.EnforcePasswordHistory); cmd.Parameters.Add("PasswordHistoryCount", settings.EnforcePasswordHistory);
cmd.Parameters.Add("ComplexityEnabled", false); cmd.Parameters.Add("ComplexityEnabled", false);
cmd.Parameters.Add("ReversibleEncryptionEnabled", false); cmd.Parameters.Add("ReversibleEncryptionEnabled", false);
cmd.Parameters.Add("MaxPasswordAge", new TimeSpan(settings.MaxPasswordAge*24, 0, 0));
if (settings.LockoutSettingsEnabled) if (settings.LockoutSettingsEnabled)
{ {
@ -1008,10 +1010,30 @@ namespace WebsitePanel.Providers.HostedSolution
retUser.UserPrincipalName = (string)entry.InvokeGet(ADAttributes.UserPrincipalName); retUser.UserPrincipalName = (string)entry.InvokeGet(ADAttributes.UserPrincipalName);
retUser.UserMustChangePassword = GetUserMustChangePassword(entry); 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); var psoName = FormOrganizationPSOName(organizationId);
string path = GetUserPath(organizationId, loginName);
OrganizationUser retUser = GetUser(organizationId, path);
DirectoryEntry entry = ActiveDirectoryUtils.GetADObject(path);
retUser.PasswordExpirationDateTime = GetPasswordExpirationDate(psoName, entry); retUser.PasswordExpirationDateTime = GetPasswordExpirationDate(psoName, entry);
HostedSolutionLog.LogEnd("GetOrganizationUserWithExtraData");
return retUser; return retUser;
} }

View file

@ -98,6 +98,8 @@ namespace WebsitePanel.Providers.HostedSolution {
private System.Threading.SendOrPostCallback CheckPhoneNumberIsInUseOperationCompleted; private System.Threading.SendOrPostCallback CheckPhoneNumberIsInUseOperationCompleted;
private System.Threading.SendOrPostCallback GetOrganizationUserWithExtraDataOperationCompleted;
/// <remarks/> /// <remarks/>
public Organizations() { public Organizations() {
this.Url = "http://localhost:9003/Organizations.asmx"; this.Url = "http://localhost:9003/Organizations.asmx";
@ -196,6 +198,9 @@ namespace WebsitePanel.Providers.HostedSolution {
/// <remarks/> /// <remarks/>
public event CheckPhoneNumberIsInUseCompletedEventHandler CheckPhoneNumberIsInUseCompleted; public event CheckPhoneNumberIsInUseCompletedEventHandler CheckPhoneNumberIsInUseCompleted;
/// <remarks/>
public event GetOrganizationUserWithExtraDataCompletedEventHandler GetOrganizationUserWithExtraDataCompleted;
/// <remarks/> /// <remarks/>
[System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] [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)] [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 {
} }
} }
/// <remarks/>
[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]));
}
/// <remarks/>
public System.IAsyncResult BeginGetOrganizationUserWithExtraData(string loginName, string organizationId, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("GetOrganizationUserWithExtraData", new object[] {
loginName,
organizationId}, callback, asyncState);
}
/// <remarks/>
public OrganizationUser EndGetOrganizationUserWithExtraData(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((OrganizationUser)(results[0]));
}
/// <remarks/>
public void GetOrganizationUserWithExtraDataAsync(string loginName, string organizationId) {
this.GetOrganizationUserWithExtraDataAsync(loginName, organizationId, null);
}
/// <remarks/>
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));
}
}
/// <remarks/> /// <remarks/>
public new void CancelAsync(object userState) { public new void CancelAsync(object userState) {
base.CancelAsync(userState); base.CancelAsync(userState);
@ -2188,4 +2238,30 @@ namespace WebsitePanel.Providers.HostedSolution {
} }
} }
} }
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
public delegate void GetOrganizationUserWithExtraDataCompletedEventHandler(object sender, GetOrganizationUserWithExtraDataCompletedEventArgs e);
/// <remarks/>
[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;
}
/// <remarks/>
public OrganizationUser Result {
get {
this.RaiseExceptionIfNecessary();
return ((OrganizationUser)(this.results[0]));
}
}
}
} }

View file

@ -273,5 +273,11 @@ namespace WebsitePanel.Server
{ {
return Organization.CheckPhoneNumberIsInUse(phoneNumber, userSamAccountName); return Organization.CheckPhoneNumberIsInUse(phoneNumber, userSamAccountName);
} }
[WebMethod, SoapHeader("settings")]
public OrganizationUser GetOrganizationUserWithExtraData(string loginName, string organizationId)
{
return Organization.GetOrganizationUserWithExtraData(loginName, organizationId);
}
} }
} }

View file

@ -236,18 +236,12 @@
<Content Include="bin\WebsitePanel.Providers.OS.Windows2012.pdb" /> <Content Include="bin\WebsitePanel.Providers.OS.Windows2012.pdb" />
<Content Include="bin\WebsitePanel.Providers.RemoteDesktopServices.Windows2012.dll" /> <Content Include="bin\WebsitePanel.Providers.RemoteDesktopServices.Windows2012.dll" />
<Content Include="bin\WebsitePanel.Providers.RemoteDesktopServices.Windows2012.pdb" /> <Content Include="bin\WebsitePanel.Providers.RemoteDesktopServices.Windows2012.pdb" />
<Content Include="bin\WebsitePanel.Providers.SharePoint.Sps20.dll" />
<Content Include="bin\WebsitePanel.Providers.SharePoint.Sps20.pdb" />
<Content Include="bin\WebsitePanel.Providers.SharePoint.Sps30.dll" />
<Content Include="bin\WebsitePanel.Providers.SharePoint.Sps30.pdb" />
<Content Include="bin\WebsitePanel.Providers.Statistics.AWStats.dll" /> <Content Include="bin\WebsitePanel.Providers.Statistics.AWStats.dll" />
<Content Include="bin\WebsitePanel.Providers.Statistics.AWStats.pdb" /> <Content Include="bin\WebsitePanel.Providers.Statistics.AWStats.pdb" />
<Content Include="bin\WebsitePanel.Providers.Statistics.SmarterStats.dll" /> <Content Include="bin\WebsitePanel.Providers.Statistics.SmarterStats.dll" />
<Content Include="bin\WebsitePanel.Providers.Statistics.SmarterStats.pdb" /> <Content Include="bin\WebsitePanel.Providers.Statistics.SmarterStats.pdb" />
<Content Include="bin\WebsitePanel.Providers.Virtualization.HyperV.dll" /> <Content Include="bin\WebsitePanel.Providers.Virtualization.HyperV.dll" />
<Content Include="bin\WebsitePanel.Providers.Virtualization.HyperV.pdb" /> <Content Include="bin\WebsitePanel.Providers.Virtualization.HyperV.pdb" />
<Content Include="bin\WebsitePanel.Providers.Virtualization.HyperV2012R2.dll" />
<Content Include="bin\WebsitePanel.Providers.Virtualization.HyperV2012R2.pdb" />
<Content Include="bin\WebsitePanel.Providers.VirtualizationForPC.HyperVForPC.dll" /> <Content Include="bin\WebsitePanel.Providers.VirtualizationForPC.HyperVForPC.dll" />
<Content Include="bin\WebsitePanel.Providers.VirtualizationForPC.HyperVForPC.pdb" /> <Content Include="bin\WebsitePanel.Providers.VirtualizationForPC.HyperVForPC.pdb" />
<Content Include="bin\WebsitePanel.Providers.Web.HeliconZoo.dll" /> <Content Include="bin\WebsitePanel.Providers.Web.HeliconZoo.dll" />
@ -260,8 +254,6 @@
<Content Include="bin\WebsitePanel.Providers.Web.IIs80.pdb" /> <Content Include="bin\WebsitePanel.Providers.Web.IIs80.pdb" />
<Content Include="bin\WebsitePanel.Providers.Web.WebDav.dll" /> <Content Include="bin\WebsitePanel.Providers.Web.WebDav.dll" />
<Content Include="bin\WebsitePanel.Providers.Web.WebDav.pdb" /> <Content Include="bin\WebsitePanel.Providers.Web.WebDav.pdb" />
<Content Include="bin\WebsitePanel.Server.Client.dll" />
<Content Include="bin\WebsitePanel.Server.Client.pdb" />
<Content Include="bin\WebsitePanel.Server.dll" /> <Content Include="bin\WebsitePanel.Server.dll" />
<Content Include="bin\WebsitePanel.Server.pdb" /> <Content Include="bin\WebsitePanel.Server.pdb" />
<Content Include="bin\WebsitePanel.Server.Utils.dll" /> <Content Include="bin\WebsitePanel.Server.Utils.dll" />
@ -434,10 +426,6 @@
<Project>{684C932A-6C75-46AC-A327-F3689D89EB42}</Project> <Project>{684C932A-6C75-46AC-A327-F3689D89EB42}</Project>
<Name>WebsitePanel.Providers.Base</Name> <Name>WebsitePanel.Providers.Base</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\WebsitePanel.Server.Client\WebsitePanel.Server.Client.csproj">
<Project>{990c4a2a-34a5-4be0-9546-e10abdfffd0e}</Project>
<Name>WebsitePanel.Server.Client</Name>
</ProjectReference>
<ProjectReference Include="..\WebsitePanel.Server.Utils\WebsitePanel.Server.Utils.csproj"> <ProjectReference Include="..\WebsitePanel.Server.Utils\WebsitePanel.Server.Utils.csproj">
<Project>{E91E52F3-9555-4D00-B577-2B1DBDD87CA7}</Project> <Project>{E91E52F3-9555-4D00-B577-2B1DBDD87CA7}</Project>
<Name>WebsitePanel.Server.Utils</Name> <Name>WebsitePanel.Server.Utils</Name>

View file

@ -70,7 +70,7 @@ namespace WebsitePanel.WebDav.Core.Config.Entities
get get
{ {
SessionKeysElement sessionKey = SessionKeysElement sessionKey =
_sessionKeys.FirstOrDefault(x => x.Key == SessionKeysElement.PassswordResetSmsKey); _sessionKeys.FirstOrDefault(x => x.Key == SessionKeysElement.PasswordResetSmsKey);
return sessionKey != null ? sessionKey.Value : null; return sessionKey != null ? sessionKey.Value : null;
} }
} }

View file

@ -12,7 +12,7 @@ namespace WebsitePanel.WebDav.Core.Config.WebConfigSections
public const string WebDavManagerKey = "WebDavManagerSessionKey"; public const string WebDavManagerKey = "WebDavManagerSessionKey";
public const string UserGroupsKey = "UserGroupsKey"; public const string UserGroupsKey = "UserGroupsKey";
public const string WebDavRootFolderPermissionsKey = "WebDavRootFolderPermissionsKey"; public const string WebDavRootFolderPermissionsKey = "WebDavRootFolderPermissionsKey";
public const string PassswordResetSmsKey = "PassswordResetSmsKey"; public const string PasswordResetSmsKey = "PasswordResetSmsKey";
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";

View file

@ -1,5 +1,6 @@
using System; using System;
using System.Globalization; using System.Globalization;
using log4net;
using WebsitePanel.WebDav.Core.Config; using WebsitePanel.WebDav.Core.Config;
using WebsitePanel.WebDav.Core.Interfaces.Security; using WebsitePanel.WebDav.Core.Interfaces.Security;
using WebsitePanel.WebDav.Core.Interfaces.Services; using WebsitePanel.WebDav.Core.Interfaces.Services;
@ -9,10 +10,12 @@ namespace WebsitePanel.WebDav.Core.Security.Authentication
public class SmsAuthenticationService : ISmsAuthenticationService public class SmsAuthenticationService : ISmsAuthenticationService
{ {
private ISmsDistributionService _smsService; private ISmsDistributionService _smsService;
private readonly ILog Log;
public SmsAuthenticationService(ISmsDistributionService smsService) public SmsAuthenticationService(ISmsDistributionService smsService)
{ {
_smsService = smsService; _smsService = smsService;
Log = LogManager.GetLogger(this.GetType());
} }
public bool VerifyResponse( Guid token, string response) public bool VerifyResponse( Guid token, string response)

View file

@ -38,14 +38,20 @@ namespace WebsitePanel.WebDavPortal
routes.MapRoute( routes.MapRoute(
name: AccountRouteNames.PasswordResetSendSms, name: AccountRouteNames.PasswordResetSendSms,
url: "account/password-reset/step-final/{token}", url: "account/password-reset/send-new-sms/{token}",
defaults: new { controller = "Account", action = "PasswordResetSendSms" } defaults: new { controller = "Account", action = "PasswordResetSendSms" }
); );
routes.MapRoute( routes.MapRoute(
name: AccountRouteNames.PasswordResetFinalStep, name: AccountRouteNames.PasswordResetFinalStep,
url: "account/password-reset/send-new-sms/{token}", url: "account/password-reset/step-final/{token}/{pincode}",
defaults: new { controller = "Account", action = "PasswordResetFinalStep" } defaults: new { controller = "Account", action = "PasswordResetFinalStep", pincode = UrlParameter.Optional }
);
routes.MapRoute(
name: AccountRouteNames.PasswordResetSuccess,
url: "account/password-reset/success",
defaults: new { controller = "Account", action = "PasswordSuccessfullyChanged" }
); );
routes.MapRoute( routes.MapRoute(

View file

@ -16,6 +16,7 @@ namespace WebsitePanel.WebDavPortal.UI.Routes
public const string PasswordResetSms = "PasswordResetSmsRoute"; public const string PasswordResetSms = "PasswordResetSmsRoute";
public const string PasswordResetSendSms = "PasswordResetSendSmsRoute"; public const string PasswordResetSendSms = "PasswordResetSendSmsRoute";
public const string PasswordResetFinalStep = "PasswordResetFinalStepRoute"; public const string PasswordResetFinalStep = "PasswordResetFinalStepRoute";
public const string PasswordResetSuccess = "PasswordResetSuccess";
public const string PhoneNumberIsAvailible = "PhoneNumberIsAvailibleRoute"; public const string PhoneNumberIsAvailible = "PhoneNumberIsAvailibleRoute";
} }

View file

@ -4,6 +4,8 @@ using System.Net;
using System.Web.Mvc; using System.Web.Mvc;
using System.Web.Routing; using System.Web.Routing;
using AutoMapper; using AutoMapper;
using log4net;
using Microsoft.Web.Services3.Addressing;
using WebsitePanel.Providers.HostedSolution; using WebsitePanel.Providers.HostedSolution;
using WebsitePanel.WebDav.Core.Config; using WebsitePanel.WebDav.Core.Config;
using WebsitePanel.WebDav.Core.Security.Authentication; using WebsitePanel.WebDav.Core.Security.Authentication;
@ -27,12 +29,15 @@ namespace WebsitePanel.WebDavPortal.Controllers
private readonly ICryptography _cryptography; private readonly ICryptography _cryptography;
private readonly IAuthenticationService _authenticationService; private readonly IAuthenticationService _authenticationService;
private readonly ISmsAuthenticationService _smsAuthService; private readonly ISmsAuthenticationService _smsAuthService;
private readonly ILog Log;
public AccountController(ICryptography cryptography, IAuthenticationService authenticationService, ISmsAuthenticationService smsAuthService) public AccountController(ICryptography cryptography, IAuthenticationService authenticationService, ISmsAuthenticationService smsAuthService)
{ {
_cryptography = cryptography; _cryptography = cryptography;
_authenticationService = authenticationService; _authenticationService = authenticationService;
_smsAuthService = smsAuthService; _smsAuthService = smsAuthService;
Log = LogManager.GetLogger(this.GetType());
} }
[HttpGet] [HttpGet]
@ -182,7 +187,7 @@ namespace WebsitePanel.WebDavPortal.Controllers
return View(model); return View(model);
} }
WspContext.Services.Organizations.SendResetUserPasswordEmail(exchangeAccount.ItemId, exchangeAccount.AccountId, Resources.Messages.PasswordResetUserReason, exchangeAccount.PrimaryEmailAddress); WspContext.Services.Organizations.SendResetUserPasswordEmail(exchangeAccount.ItemId, exchangeAccount.AccountId, Resources.Messages.PasswordResetUserReason, exchangeAccount.PrimaryEmailAddress, false);
return View("PasswordResetEmailSent"); return View("PasswordResetEmailSent");
} }
@ -205,11 +210,15 @@ namespace WebsitePanel.WebDavPortal.Controllers
return View(model); return View(model);
} }
if (accessToken.IsSmsSent == false)
{
var user = WspContext.Services.Organizations.GetUserGeneralSettings(accessToken.ItemId, accessToken.AccountId);
if (SendPasswordResetSms(accessToken.AccessTokenGuid, user.MobilePhone)) if (accessToken != null && accessToken.IsSmsSent == false)
{
var user = WspContext.Services.Organizations.GetUserGeneralSettings(accessToken.ItemId,
accessToken.AccountId);
var result = WspContext.Services.Organizations.SendResetUserPasswordPincodeSms(token, user.MobilePhone);
if (result.IsSuccess)
{ {
AddMessage(MessageType.Success, Resources.Messages.SmsWasSent); AddMessage(MessageType.Success, Resources.Messages.SmsWasSent);
} }
@ -249,15 +258,16 @@ namespace WebsitePanel.WebDavPortal.Controllers
[HttpGet] [HttpGet]
[AllowAnonymous] [AllowAnonymous]
public ActionResult PasswordResetFinalStep(Guid token) public ActionResult PasswordResetFinalStep(Guid token, string pincode)
{ {
var smsResponse = Session[WebDavAppConfigManager.Instance.SessionKeys.PasswordResetSmsKey] as string; var result = VerifyPincode(token, pincode);
if (_smsAuthService.VerifyResponse(token, smsResponse) == false) if (result != null)
{ {
return RedirectToRoute(AccountRouteNames.PasswordResetSms); return result;
} }
var model = new PasswordEditor(); var model = new PasswordEditor();
return View(model); return View(model);
@ -265,20 +275,18 @@ namespace WebsitePanel.WebDavPortal.Controllers
[HttpPost] [HttpPost]
[AllowAnonymous] [AllowAnonymous]
public ActionResult PasswordResetFinalStep(Guid token, PasswordEditor model) public ActionResult PasswordResetFinalStep(Guid token, string pincode, PasswordEditor model)
{ {
if (!ModelState.IsValid) if (!ModelState.IsValid)
{ {
return View(model); return View(model);
} }
var smsResponse = Session[WebDavAppConfigManager.Instance.SessionKeys.PasswordResetSmsKey] as string; var result = VerifyPincode(token, pincode);
if (_smsAuthService.VerifyResponse(token, smsResponse) == false) if (result != null)
{ {
AddMessage(MessageType.Error, Resources.Messages.IncorrectSmsResponse); return result;
return RedirectToRoute(AccountRouteNames.PasswordResetSms);
} }
var tokenEntity = WspContext.Services.Organizations.GetPasswordresetAccessToken(token); var tokenEntity = WspContext.Services.Organizations.GetPasswordresetAccessToken(token);
@ -291,7 +299,14 @@ namespace WebsitePanel.WebDavPortal.Controllers
AddMessage(MessageType.Success, Resources.Messages.PasswordSuccessfullyChanged); AddMessage(MessageType.Success, Resources.Messages.PasswordSuccessfullyChanged);
return RedirectToRoute(AccountRouteNames.Login); return RedirectToRoute(AccountRouteNames.PasswordResetSuccess);
}
[HttpGet]
[AllowAnonymous]
public ActionResult PasswordSuccessfullyChanged()
{
return View();
} }
[HttpGet] [HttpGet]
@ -308,8 +323,10 @@ namespace WebsitePanel.WebDavPortal.Controllers
var user = WspContext.Services.Organizations.GetUserGeneralSettings(accessToken.ItemId, var user = WspContext.Services.Organizations.GetUserGeneralSettings(accessToken.ItemId,
accessToken.AccountId); accessToken.AccountId);
var result = WspContext.Services.Organizations.SendResetUserPasswordPincodeSms(accessToken.AccessTokenGuid,
user.MobilePhone);
if (SendPasswordResetSms(accessToken.AccessTokenGuid, user.MobilePhone)) if (result.IsSuccess)
{ {
AddMessage(MessageType.Success, Resources.Messages.SmsWasSent); AddMessage(MessageType.Success, Resources.Messages.SmsWasSent);
} }
@ -323,22 +340,37 @@ namespace WebsitePanel.WebDavPortal.Controllers
#region Helpers #region Helpers
private bool SendPasswordResetSms(Guid token, string mobilePhone) /// <summary>
/// Verify pincode, if it's absent - verifying pincode from session
/// </summary>
/// <param name="token">Password reset token</param>
/// <param name="pincode">Pincode to verify if session pincode is absent</param>
private ActionResult VerifyPincode(Guid token, string pincode)
{ {
var response = _smsAuthService.SendRequestMessage(mobilePhone); var smsResponse = Session[WebDavAppConfigManager.Instance.SessionKeys.PasswordResetSmsKey] as string;
if (string.IsNullOrEmpty(response)) if (string.IsNullOrEmpty(pincode) == false)
{ {
return false; smsResponse = pincode;
} }
WspContext.Services.Organizations.SetAccessTokenResponse(token, response);
return true; if (_smsAuthService.VerifyResponse(token, smsResponse) == false)
{
AddMessage(MessageType.Error, Resources.Messages.IncorrectSmsResponse);
return RedirectToRoute(AccountRouteNames.PasswordResetSms);
}
var tokenEntity = WspContext.Services.Organizations.GetPasswordresetAccessToken(token);
Session[WebDavAppConfigManager.Instance.SessionKeys.ItemId] = tokenEntity.ItemId;
return null;
} }
private UserProfile GetUserProfileModel(int itemId, int accountId) 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<OrganizationUser, UserProfile>(user); return Mapper.Map<OrganizationUser, UserProfile>(user);
} }

View file

@ -60,6 +60,15 @@ namespace WebsitePanel.WebDavPortal.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Account.
/// </summary>
public static string Account {
get {
return ResourceManager.GetString("Account", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Actions. /// Looks up a localized string similar to Actions.
/// </summary> /// </summary>
@ -123,6 +132,15 @@ namespace WebsitePanel.WebDavPortal.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to You can now access your {0}..
/// </summary>
public static string CanAccessYourFormat {
get {
return ResourceManager.GetString("CanAccessYourFormat", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Cancel. /// Looks up a localized string similar to Cancel.
/// </summary> /// </summary>
@ -537,6 +555,15 @@ namespace WebsitePanel.WebDavPortal.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Your new password has been set..
/// </summary>
public static string NewPasswordBeenSet {
get {
return ResourceManager.GetString("NewPasswordBeenSet", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Confirm password. /// Looks up a localized string similar to Confirm password.
/// </summary> /// </summary>
@ -627,6 +654,15 @@ namespace WebsitePanel.WebDavPortal.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Password never expires. If you want to change password then please click {0}..
/// </summary>
public static string PasswordNeverExpiresFormat {
get {
return ResourceManager.GetString("PasswordNeverExpiresFormat", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Password reset. /// Looks up a localized string similar to Password reset.
/// </summary> /// </summary>

View file

@ -393,4 +393,16 @@
<data name="Login" xml:space="preserve"> <data name="Login" xml:space="preserve">
<value>Login</value> <value>Login</value>
</data> </data>
<data name="PasswordNeverExpiresFormat" xml:space="preserve">
<value>Password never expires. If you want to change password then please click {0}.</value>
</data>
<data name="Account" xml:space="preserve">
<value>Account</value>
</data>
<data name="CanAccessYourFormat" xml:space="preserve">
<value>You can now access your {0}.</value>
</data>
<data name="NewPasswordBeenSet" xml:space="preserve">
<value>Your new password has been set.</value>
</data>
</root> </root>

View file

@ -0,0 +1,18 @@
@using WebsitePanel.WebDavPortal.Resources
@using WebsitePanel.WebDavPortal.UI.Routes
@{
string message = string.Format(UI.CanAccessYourFormat, Html.RouteLink(UI.Account,AccountRouteNames.Login));
}
<div class="container row">
<div class="form-group">
<h3>@Messages.PasswordSuccessfullyChanged</h3>
</div>
<div class="form-group">
<div>
@UI.NewPasswordBeenSet @Html.Raw(message)
</div>
</div>
</div>

View file

@ -5,8 +5,17 @@
@{ @{
Layout = "~/Views/Shared/_Layout.cshtml"; 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));
}
} }
<div class="container row"> <div class="container row">

View file

@ -53,7 +53,7 @@
<add key="ItemIdSessionKey" value="ItemId" /> <add key="ItemIdSessionKey" value="ItemId" />
<add key="UserGroupsKey" value="UserGroups" /> <add key="UserGroupsKey" value="UserGroups" />
<add key="OwaEditFoldersSession" value="OwaEditFolders" /> <add key="OwaEditFoldersSession" value="OwaEditFolders" />
<add key="PassswordResetSmsKey" value="PassswordResetSms" /> <add key="PasswordResetSmsKey" value="PasswordResetSms" />
</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" />
@ -101,7 +101,6 @@
<add extension=".txt" mimeType="text/plain" isTargetBlank="true" /> <add extension=".txt" mimeType="text/plain" isTargetBlank="true" />
<add extension=".pdf" mimeType="application/pdf" isTargetBlank="true" /> <add extension=".pdf" mimeType="application/pdf" isTargetBlank="true" />
</typeOpener> </typeOpener>
<twilio accountSid="s" authorizationToken="s" phoneFrom="s"/>
</webDavExplorerConfigurationSettings> </webDavExplorerConfigurationSettings>
<!-- <!--
For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367. For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.

View file

@ -489,6 +489,7 @@
<Content Include="Views\Account\PasswordResetEmailSent.cshtml" /> <Content Include="Views\Account\PasswordResetEmailSent.cshtml" />
<Content Include="Views\Account\PasswordResetSms.cshtml" /> <Content Include="Views\Account\PasswordResetSms.cshtml" />
<Content Include="Views\Account\PasswordResetFinalStep.cshtml" /> <Content Include="Views\Account\PasswordResetFinalStep.cshtml" />
<Content Include="Views\Account\PasswordSuccessfullyChanged.cshtml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Models\FileSystem\Enums\" /> <Folder Include="Models\FileSystem\Enums\" />

View file

@ -124,7 +124,7 @@
</Group> </Group>
<Group pageID="SpaceHome" titleresourcekey="VPS" disabled="True"> <Group pageID="SpaceHome" titleresourcekey="VPS" disabled="True">
<Icon pageID="SpaceVPS" resourceGroup="VPS" imageUrl="icons/vps_48.png" /> <Icon pageID="SpaceVPS" resourceGroup="VPS" imageUrl="icons/vps_48.png" />
<Icon pageID="SpaceVPS2012" resourceGroup="VPS2012" imageUrl="icons/vps_48.png" /> <Icon pageID="SpaceVPS2012" resourceGroup="VPS2012" imageUrl="icons/vps2012_48.png" />
<Icon pageID="SpaceVPSForPC" resourceGroup="VPSForPC" imageUrl="icons/vpsforpc_48.png" /> <Icon pageID="SpaceVPSForPC" resourceGroup="VPSForPC" imageUrl="icons/vpsforpc_48.png" />
</Group> </Group>
<!-- <!--

View file

@ -653,33 +653,33 @@
<ModuleDefinition id="VPS2012"> <ModuleDefinition id="VPS2012">
<Controls> <Controls>
<Control key="" src="WebsitePanel/VPS2012/VdcHome.ascx" title="VdcHome" type="View" /> <Control key="" src="WebsitePanel/VPS2012/VdcHome.ascx" title="VdcHome" type="View" icon="vps2012_48.png" />
<Control key="vdc_create_server" src="WebsitePanel/VPS2012/VdcCreateServer.ascx" title="VdcCreateServer" type="View" /> <Control key="vdc_create_server" src="WebsitePanel/VPS2012/VdcCreateServer.ascx" title="VdcCreateServer" type="View" icon="vps2012_48.png" />
<Control key="vdc_import_server" src="WebsitePanel/VPS2012/VdcImportServer.ascx" title="VdcImportServer" type="View" /> <Control key="vdc_import_server" src="WebsitePanel/VPS2012/VdcImportServer.ascx" title="VdcImportServer" type="View" icon="vps2012_48.png" />
<Control key="vdc_external_network" src="WebsitePanel/VPS2012/VdcExternalNetwork.ascx" title="VdcExternalNetwork" type="View" /> <Control key="vdc_external_network" src="WebsitePanel/VPS2012/VdcExternalNetwork.ascx" title="VdcExternalNetwork" type="View" icon="vps2012_48.png" />
<Control key="vdc_management_network" src="WebsitePanel/VPS2012/VdcManagementNetwork.ascx" title="VdcManagementNetwork" type="View" /> <Control key="vdc_management_network" src="WebsitePanel/VPS2012/VdcManagementNetwork.ascx" title="VdcManagementNetwork" type="View" icon="vps2012_48.png" />
<Control key="vdc_allocate_external_ip" src="WebsitePanel/VPS2012/VdcAddExternalAddress.ascx" title="VdcAddExternalAddress" type="View" /> <Control key="vdc_allocate_external_ip" src="WebsitePanel/VPS2012/VdcAddExternalAddress.ascx" title="VdcAddExternalAddress" type="View" icon="vps2012_48.png" />
<Control key="vdc_private_network" src="WebsitePanel/VPS2012/VdcPrivateNetwork.ascx" title="VdcPrivateNetwork" type="View" /> <Control key="vdc_private_network" src="WebsitePanel/VPS2012/VdcPrivateNetwork.ascx" title="VdcPrivateNetwork" type="View" icon="vps2012_48.png" />
<Control key="vdc_permissions" src="WebsitePanel/VPS2012/VdcPermissions.ascx" title="VdcPermissions" type="View" /> <Control key="vdc_permissions" src="WebsitePanel/VPS2012/VdcPermissions.ascx" title="VdcPermissions" type="View" icon="vps2012_48.png" />
<Control key="vdc_audit_log" src="WebsitePanel/VPS2012/VdcAuditLog.ascx" title="VdcAuditLog" type="View" /> <Control key="vdc_audit_log" src="WebsitePanel/VPS2012/VdcAuditLog.ascx" title="VdcAuditLog" type="View" icon="vps2012_48.png" />
<Control key="vps_general" src="WebsitePanel/VPS2012/VpsDetailsGeneral.ascx" title="VpsDetailsGeneral" type="View" /> <Control key="vps_general" src="WebsitePanel/VPS2012/VpsDetailsGeneral.ascx" title="VpsDetailsGeneral" type="View" icon="vps2012_48.png"/>
<Control key="vps_config" src="WebsitePanel/VPS2012/VpsDetailsConfiguration.ascx" title="VpsDetailsConfiguration" type="View" /> <Control key="vps_config" src="WebsitePanel/VPS2012/VpsDetailsConfiguration.ascx" title="VpsDetailsConfiguration" type="View" icon="vps2012_48.png" />
<Control key="vps_edit_config" src="WebsitePanel/VPS2012/VpsDetailsEditConfiguration.ascx" title="VpsDetailsEditConfiguration" type="View" /> <Control key="vps_edit_config" src="WebsitePanel/VPS2012/VpsDetailsEditConfiguration.ascx" title="VpsDetailsEditConfiguration" type="View" icon="vps2012_48.png" />
<Control key="vps_dvd" src="WebsitePanel/VPS2012/VpsDetailsDvd.ascx" title="VpsDetailsDvd" type="View" /> <Control key="vps_dvd" src="WebsitePanel/VPS2012/VpsDetailsDvd.ascx" title="VpsDetailsDvd" type="View" icon="vps2012_48.png" />
<Control key="vps_insert_dvd" src="WebsitePanel/VPS2012/VpsDetailsInsertDvd.ascx" title="VpsDetailsInsertDvd" type="View" /> <Control key="vps_insert_dvd" src="WebsitePanel/VPS2012/VpsDetailsInsertDvd.ascx" title="VpsDetailsInsertDvd" type="View" icon="vps2012_48.png" />
<Control key="vps_snapshots" src="WebsitePanel/VPS2012/VpsDetailsSnapshots.ascx" title="VpsDetailsSnapshots" type="View" /> <Control key="vps_snapshots" src="WebsitePanel/VPS2012/VpsDetailsSnapshots.ascx" title="VpsDetailsSnapshots" type="View" icon="vps2012_48.png" />
<Control key="vps_replication" src="WebsitePanel/VPS2012/VpsDetailsReplications.ascx" title="VpsDetailReplications" type="View" /> <Control key="vps_replication" src="WebsitePanel/VPS2012/VpsDetailsReplications.ascx" title="VpsDetailReplications" type="View" icon="vps2012_48.png" />
<Control key="vps_network" src="WebsitePanel/VPS2012/VpsDetailsNetwork.ascx" title="VpsDetailsNetwork" type="View" /> <Control key="vps_network" src="WebsitePanel/VPS2012/VpsDetailsNetwork.ascx" title="VpsDetailsNetwork" type="View" icon="vps2012_48.png" />
<Control key="vps_add_external_ip" src="WebsitePanel/VPS2012/VpsDetailsAddExternalAddress.ascx" title="VpsDetailsAddExternalAddress" type="View" /> <Control key="vps_add_external_ip" src="WebsitePanel/VPS2012/VpsDetailsAddExternalAddress.ascx" title="VpsDetailsAddExternalAddress" type="View" icon="vps2012_48.png" />
<Control key="vps_add_private_ip" src="WebsitePanel/VPS2012/VpsDetailsAddPrivateAddress.ascx" title="VpsDetailsAddPrivateAddress" type="View" /> <Control key="vps_add_private_ip" src="WebsitePanel/VPS2012/VpsDetailsAddPrivateAddress.ascx" title="VpsDetailsAddPrivateAddress" type="View" icon="vps2012_48.png" />
<Control key="vps_permissions" src="WebsitePanel/VPS2012/VpsDetailsPermissions.ascx" title="VpsDetailsNetworking" type="View" /> <Control key="vps_permissions" src="WebsitePanel/VPS2012/VpsDetailsPermissions.ascx" title="VpsDetailsNetworking" type="View" icon="vps2012_48.png" />
<Control key="vps_tools" src="WebsitePanel/VPS2012/VpsDetailsTools.ascx" title="VpsDetailsTools" type="View" /> <Control key="vps_tools" src="WebsitePanel/VPS2012/VpsDetailsTools.ascx" title="VpsDetailsTools" type="View" icon="vps2012_48.png" />
<Control key="vps_audit_log" src="WebsitePanel/VPS2012/VpsDetailsAuditLog.ascx" title="VpsDetailsAuditLog" type="View" /> <Control key="vps_audit_log" src="WebsitePanel/VPS2012/VpsDetailsAuditLog.ascx" title="VpsDetailsAuditLog" type="View" icon="vps2012_48.png" />
<Control key="vps_help" src="WebsitePanel/VPS2012/VpsDetailsHelp.ascx" title="VpsDetailsHelp" type="View" /> <Control key="vps_help" src="WebsitePanel/VPS2012/VpsDetailsHelp.ascx" title="VpsDetailsHelp" type="View" icon="vps2012_48.png" />
<Control key="vps_tools_delete" src="WebsitePanel/VPS2012/VpsToolsDeleteServer.ascx" title="VpsToolsDeleteServer" type="View" /> <Control key="vps_tools_delete" src="WebsitePanel/VPS2012/VpsToolsDeleteServer.ascx" title="VpsToolsDeleteServer" type="View" icon="vps2012_48.png" />
<Control key="vps_tools_move" src="WebsitePanel/VPS2012/VpsMoveServer.ascx" title="VpsMoveServer" type="View" /> <Control key="vps_tools_move" src="WebsitePanel/VPS2012/VpsMoveServer.ascx" title="VpsMoveServer" type="View" icon="vps2012_48.png" />
<Control key="vps_tools_reinstall" src="WebsitePanel/VPS2012/VpsToolsReinstallServer.ascx" title="VpsToolsReinstallServer" type="View" /> <Control key="vps_tools_reinstall" src="WebsitePanel/VPS2012/VpsToolsReinstallServer.ascx" title="VpsToolsReinstallServer" type="View" icon="vps2012_48.png" />
</Controls> </Controls>
</ModuleDefinition> </ModuleDefinition>
@ -736,4 +736,11 @@
<Control key="" src="WebsitePanel/OrganizationMenu.ascx" title="OrganizationMenu" type="View" /> <Control key="" src="WebsitePanel/OrganizationMenu.ascx" title="OrganizationMenu" type="View" />
</Controls> </Controls>
</ModuleDefinition> </ModuleDefinition>
<!-- Virtual Personal Servers -->
<ModuleDefinition id="VpsMenu">
<Controls>
<Control key="" src="WebsitePanel/VpsMenu.ascx" title="VpsMenu" type="View" />
</Controls>
</ModuleDefinition>
</ModuleDefinitions> </ModuleDefinitions>

View file

@ -660,7 +660,7 @@
</Content> </Content>
</Page> </Page>
<Page name="SpaceVPS2012" roles="Administrator,Reseller,PlatformCSR,ResellerCSR,PlatformHelpdesk,ResellerHelpdesk,User" hidden="True" skin="VPS.ascx" adminskin="VPS.ascx"> <Page name="SpaceVPS2012" roles="Administrator,Reseller,PlatformCSR,ResellerCSR,PlatformHelpdesk,ResellerHelpdesk,User" hidden="True">
<Content id="LeftPane"> <Content id="LeftPane">
<Module moduleDefinitionID="UserAccountMenu" title="UserMenu" container="Clear.ascx"> <Module moduleDefinitionID="UserAccountMenu" title="UserMenu" container="Clear.ascx">
<ModuleData ref="UserMenu"/> <ModuleData ref="UserMenu"/>
@ -668,9 +668,11 @@
<Module moduleDefinitionID="SpaceMenu" title="SpaceMenu" container="Clear.ascx"> <Module moduleDefinitionID="SpaceMenu" title="SpaceMenu" container="Clear.ascx">
<ModuleData ref="SpaceMenu"/> <ModuleData ref="SpaceMenu"/>
</Module> </Module>
<Module moduleDefinitionID="VpsMenu" title="VpsMenu" container="Clear.ascx">
</Module>
</Content> </Content>
<Content id="ContentPane"> <Content id="ContentPane">
<Module moduleDefinitionID="VPS2012" title="VirtualPrivateServers2012" icon="" container="VPS2012.ascx" admincontainer="VPS2012.ascx" readOnlyRoles="PlatformCSR,ResellerCSR"/> <Module moduleDefinitionID="VPS2012" title="VirtualPrivateServers2012" icon="vps2012_48.png" readOnlyRoles="PlatformCSR,ResellerCSR"/>
</Content> </Content>
</Page> </Page>

View file

@ -816,4 +816,83 @@
<data name="ModuleTitle.RDSServersEditServer" xml:space="preserve"> <data name="ModuleTitle.RDSServersEditServer" xml:space="preserve">
<value>Edit RDS Server</value> <value>Edit RDS Server</value>
</data> </data>
<data name="ModuleTitle.VirtualPrivateServers2012" xml:space="preserve">
<value>Virtual Private Servers</value>
</data>
<data name="ModuleTitle.VdcCreateServer" xml:space="preserve">
<value>Create New VPS</value>
</data>
<data name="ModuleTitle.VdcImportServer" xml:space="preserve">
<value>Import VPS</value>
</data>
<data name="ModuleTitle.VdcExternalNetwork" xml:space="preserve">
<value>External Network</value>
</data>
<data name="ModuleTitle.VdcManagementNetwork" xml:space="preserve">
<value>Management Network</value>
</data>
<data name="ModuleTitle.VdcAddExternalAddress" xml:space="preserve">
<value>Allocate IP Addresses</value>
</data>
<data name="ModuleTitle.VdcPrivateNetwork" xml:space="preserve">
<value>Private Network</value>
</data>
<data name="ModuleTitle.VdcPermissions" xml:space="preserve">
<value>User Permissions</value>
</data>
<data name="ModuleTitle.VdcAuditLog" xml:space="preserve">
<value>Audit Log</value>
</data>
<data name="ModuleTitle.VpsDetailsGeneral" xml:space="preserve">
<value>General</value>
</data>
<data name="ModuleTitle.VpsDetailsConfiguration" xml:space="preserve">
<value>Configuration</value>
</data>
<data name="ModuleTitle.VpsDetailsEditConfiguration" xml:space="preserve">
<value>Edit Configuration</value>
</data>
<data name="ModuleTitle.VpsDetailsDvd" xml:space="preserve">
<value>DVD</value>
</data>
<data name="ModuleTitle.VpsDetailsInsertDvd" xml:space="preserve">
<value>DVD</value>
</data>
<data name="ModuleTitle.VpsDetailsSnapshots" xml:space="preserve">
<value>Snapshots</value>
</data>
<data name="ModuleTitle.VpsDetailReplications" xml:space="preserve">
<value>Replication</value>
</data>
<data name="ModuleTitle.VpsDetailsNetwork" xml:space="preserve">
<value>Network</value>
</data>
<data name="ModuleTitle.VpsDetailsAddExternalAddress" xml:space="preserve">
<value>Network</value>
</data>
<data name="ModuleTitle.VpsDetailsAddPrivateAddress" xml:space="preserve">
<value>Network</value>
</data>
<data name="ModuleTitle.VpsDetailsNetworking" xml:space="preserve">
<value>Permissions</value>
</data>
<data name="ModuleTitle.VpsDetailsTools" xml:space="preserve">
<value>Tools</value>
</data>
<data name="ModuleTitle.VpsDetailsAuditLog" xml:space="preserve">
<value>Audit Log</value>
</data>
<data name="ModuleTitle.VpsDetailsHelp" xml:space="preserve">
<value>Help</value>
</data>
<data name="ModuleTitle.VpsToolsDeleteServer" xml:space="preserve">
<value>Delete Server</value>
</data>
<data name="ModuleTitle.VpsMoveServer" xml:space="preserve">
<value>Move VPS</value>
</data>
<data name="ModuleTitle.VpsToolsReinstallServer" xml:space="preserve">
<value>Re-install Server</value>
</data>
</root> </root>

View file

@ -5178,7 +5178,6 @@
<data name="Quota.VPSForPC.StartShutdownAllowed" xml:space="preserve"> <data name="Quota.VPSForPC.StartShutdownAllowed" xml:space="preserve">
<value>Allow user to Start, Turn off VPS</value> <value>Allow user to Start, Turn off VPS</value>
</data> </data>
<data name="ResourceGroup.VPS2012" xml:space="preserve"> <data name="ResourceGroup.VPS2012" xml:space="preserve">
<value>Virtual Private Servers 2012</value> <value>Virtual Private Servers 2012</value>
</data> </data>
@ -5245,7 +5244,6 @@
<data name="Quota.VPS2012.StartShutdownAllowed" xml:space="preserve"> <data name="Quota.VPS2012.StartShutdownAllowed" xml:space="preserve">
<value>Allow user to Start, Turn off VPS</value> <value>Allow user to Start, Turn off VPS</value>
</data> </data>
<data name="Error.CreateCheckPointError" xml:space="preserve"> <data name="Error.CreateCheckPointError" xml:space="preserve">
<value>Error creating CheckPoint</value> <value>Error creating CheckPoint</value>
</data> </data>
@ -5831,7 +5829,7 @@
<data name="ERROR.REMOTE_DESKTOP_SERVICES_VIEW_SESSION" xml:space="preserve"> <data name="ERROR.REMOTE_DESKTOP_SERVICES_VIEW_SESSION" xml:space="preserve">
<value>View session error</value> <value>View session error</value>
</data> </data>
<data name="ERROR.REMOTE_DESKTOP_SERVICES_CONTROL_SESSION" xml:space="preserve"> <data name="ERROR.REMOTE_DESKTOP_SERVICES_CONTROL_SESSION" xml:space="preserve">
<value>Control session error</value> <value>Control session error</value>
</data> </data>
<data name="ERROR.REMOTE_DESKTOP_SERVICES_USER_SESSIONS" xml:space="preserve"> <data name="ERROR.REMOTE_DESKTOP_SERVICES_USER_SESSIONS" xml:space="preserve">
@ -5852,4 +5850,7 @@
<data name="Error.UNABLETOLOADPASSWORDSETTINGS" xml:space="preserve"> <data name="Error.UNABLETOLOADPASSWORDSETTINGS" xml:space="preserve">
<value>Unable to load password settings</value> <value>Unable to load password settings</value>
</data> </data>
<data name="Error.SEND_USER_PASSWORD_RESET_SMS" xml:space="preserve">
<value>Sms was not sent.</value>
</data>
</root> </root>

View file

@ -41,4 +41,5 @@ Default skin template. The following skins are provided as examples only.
<asp:ImageButton SkinID="ApplySmall" runat="server" ImageUrl="Images/apply_16.png" ImageAlign="AbsMiddle" Width="16" Height="16"/> <asp:ImageButton SkinID="ApplySmall" runat="server" ImageUrl="Images/apply_16.png" ImageAlign="AbsMiddle" Width="16" Height="16"/>
<asp:ImageButton SkinID="VpsDelete" runat="server" ImageUrl="Images/VPS/delete.png" ImageAlign="AbsMiddle" Width="16" Height="16"/> <asp:ImageButton SkinID="VpsDelete" runat="server" ImageUrl="Images/VPS/delete.png" ImageAlign="AbsMiddle" Width="16" Height="16"/>
<asp:ImageButton SkinID="VpsDelete2012" runat="server" ImageUrl="Images/VPS2012/delete.png" ImageAlign="AbsMiddle" Width="16" Height="16"/>

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 B

View file

@ -44,6 +44,8 @@ Default skin template. The following skins are provided as examples only.
<asp:Image runat="server" SkinID="OptionEnabled" ImageUrl="images/Exchange/checkbox.png" ImageAlign="AbsMiddle" Width="16" Height="16" /> <asp:Image runat="server" SkinID="OptionEnabled" ImageUrl="images/Exchange/checkbox.png" ImageAlign="AbsMiddle" Width="16" Height="16" />
<asp:Image runat="server" SkinID="OptionDisabled" ImageUrl="images/VPS/delete.png" ImageAlign="AbsMiddle" Width="16" Height="16" /> <asp:Image runat="server" SkinID="OptionDisabled" ImageUrl="images/VPS/delete.png" ImageAlign="AbsMiddle" Width="16" Height="16" />
<asp:Image runat="server" SkinID="OptionDisabled2012" ImageUrl="images/VPS2012/delete.png" ImageAlign="AbsMiddle" Width="16" Height="16" />
<asp:Image runat="server" SkinID="Vps16" ImageUrl="images/VPS/server.png" ImageAlign="AbsMiddle" Width="16" Height="16" /> <asp:Image runat="server" SkinID="Vps16" ImageUrl="images/VPS/server.png" ImageAlign="AbsMiddle" Width="16" Height="16" />
<asp:Image runat="server" SkinID="Vps2012_16" ImageUrl="images/VPS2012/server.png" ImageAlign="AbsMiddle" Width="16" Height="16" />
<asp:Image runat="server" SkinID="Rdc16" ImageUrl="images/VPS/rdc16.png" ImageAlign="AbsMiddle" Width="16" Height="16" /> <asp:Image runat="server" SkinID="Rdc16" ImageUrl="images/VPS/rdc16.png" ImageAlign="AbsMiddle" Width="16" Height="16" />

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 800 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 741 B

View file

@ -293,6 +293,10 @@ UL.ActionButtons LI {margin-bottom: 12px;}
.ActionButtonRename {padding: 3px 2px 3px 20px; background: transparent url(../images/VPS/rename.gif) left center no-repeat;} .ActionButtonRename {padding: 3px 2px 3px 20px; background: transparent url(../images/VPS/rename.gif) left center no-repeat;}
.ActionButtonDeleteSnapshot {padding: 3px 2px 3px 20px; background: transparent url(../images/VPS/delete3.png) left center no-repeat;} .ActionButtonDeleteSnapshot {padding: 3px 2px 3px 20px; background: transparent url(../images/VPS/delete3.png) left center no-repeat;}
.ActionButtonDeleteSnapshotTree {padding: 3px 2px 3px 20px; background: transparent url(../images/VPS/delete4.png) left center no-repeat;} .ActionButtonDeleteSnapshotTree {padding: 3px 2px 3px 20px; background: transparent url(../images/VPS/delete4.png) left center no-repeat;}
.ActionButtonApplySnapshot2012 {padding: 3px 2px 3px 20px; background: transparent url(../images/VPS2012/apply.png) left center no-repeat;}
.ActionButtonRename2012 {padding: 3px 2px 3px 20px; background: transparent url(../images/VPS2012/rename.png) left center no-repeat;}
.ActionButtonDeleteSnapshot2012 {padding: 3px 2px 3px 20px; background: transparent url(../images/VPS2012/delete3.png) left center no-repeat;}
.ActionButtonDeleteSnapshotTree2012 {padding: 3px 2px 3px 20px; background: transparent url(../images/VPS2012/delete4.png) left center no-repeat;}
.CodeEditor {width: 100%; height: 360px; font-size: 13px; white-space: pre; line-height: 16px; font-family: Consolas, Monospace;} .CodeEditor {width: 100%; height: 360px; font-size: 13px; white-space: pre; line-height: 16px; font-family: Consolas, Monospace;}
.pnlControl {height:20px; margin:5px 5px; text-align:left;} .pnlControl {height:20px; margin:5px 5px; text-align:left;}
.pnlControl span {display:inline-block; width:100px;} .pnlControl span {display:inline-block; width:100px;}

View file

@ -141,6 +141,12 @@
<data name="lblNoChangesTextBody.Text" xml:space="preserve"> <data name="lblNoChangesTextBody.Text" xml:space="preserve">
<value>No Changes Text Body:</value> <value>No Changes Text Body:</value>
</data> </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"> <data name="lblPriority.Text" xml:space="preserve">
<value>Priority:</value> <value>Priority:</value>
</data> </data>

View file

@ -180,4 +180,16 @@
<data name="locEnablePasswordReset.Text" xml:space="preserve"> <data name="locEnablePasswordReset.Text" xml:space="preserve">
<value>Enable password reset:</value> <value>Enable password reset:</value>
</data> </data>
<data name="lblAccountSid.Text" xml:space="preserve">
<value>AccountSID</value>
</data>
<data name="lblAuthToken.Text" xml:space="preserve">
<value>AuthToken</value>
</data>
<data name="lblPhoneFrom.Text" xml:space="preserve">
<value>Phone From</value>
</data>
<data name="TwilioSettings.Text" xml:space="preserve">
<value>Twilio</value>
</data>
</root> </root>

View file

@ -0,0 +1,138 @@
<?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="locMenuTitle.Text" xml:space="preserve">
<value>VPS Menu</value>
</data>
<data name="Text.VPSHome" xml:space="preserve">
<value>Virtual Personal Servers</value>
</data>
<data name="Text.AuditLog" xml:space="preserve">
<value>Audit Log</value>
</data>
<data name="Text.ExternalNetwork" xml:space="preserve">
<value>External Network</value>
</data>
<data name="Text.ManagementNetwork" xml:space="preserve">
<value>Management Network</value>
</data>
<data name="Text.PrivateNetwork" xml:space="preserve">
<value>Private Network</value>
</data>
</root>

View file

@ -219,4 +219,13 @@
<data name="valResetAccountLockout.Text" xml:space="preserve"> <data name="valResetAccountLockout.Text" xml:space="preserve">
<value>*</value> <value>*</value>
</data> </data>
<data name="lblMaxPasswordAge.Text" xml:space="preserve">
<value>Max Password Age (days):</value>
</data>
<data name="valCorrectMaxPasswordAge.Text" xml:space="preserve">
<value>*</value>
</data>
<data name="valRequireMaxPasswordAge.Text" xml:space="preserve">
<value>*</value>
</data>
</root> </root>

View file

@ -123,10 +123,22 @@
<data name="locEmailAddress.Text" xml:space="preserve"> <data name="locEmailAddress.Text" xml:space="preserve">
<value>Email:</value> <value>Email:</value>
</data> </data>
<data name="locMobile.Text" xml:space="preserve">
<value>Mobile</value>
</data>
<data name="locReason.Text" xml:space="preserve"> <data name="locReason.Text" xml:space="preserve">
<value>Reason:</value> <value>Reason:</value>
</data> </data>
<data name="locSendTo.Text" xml:space="preserve">
<value>Send to:</value>
</data>
<data name="locTitle.Text" xml:space="preserve"> <data name="locTitle.Text" xml:space="preserve">
<value>Reset Password</value> <value>Reset Password</value>
</data> </data>
<data name="rbtnEmail.Text" xml:space="preserve">
<value>Email</value>
</data>
<data name="rbtnMobile.Text" xml:space="preserve">
<value>Mobile</value>
</data>
</root> </root>

View file

@ -51,7 +51,7 @@ namespace WebsitePanel.Portal.ExchangeServer
{ {
BindPasswordSettings(); BindPasswordSettings();
string instructions = ES.Services.ExchangeServer.GetMailboxSetupInstructions(PanelRequest.ItemID, PanelRequest.AccountID, false, false, false); string instructions = ES.Services.ExchangeServer.GetMailboxSetupInstructions(PanelRequest.ItemID, PanelRequest.AccountID, false, false, false, " ");
if (!string.IsNullOrEmpty(instructions)) if (!string.IsNullOrEmpty(instructions))
{ {
chkSendInstructions.Checked = chkSendInstructions.Visible = sendInstructionEmail.Visible = true; chkSendInstructions.Checked = chkSendInstructions.Visible = sendInstructionEmail.Visible = true;

View file

@ -47,7 +47,12 @@ namespace WebsitePanel.Portal.ExchangeServer
// load content // load content
litContent.Text = ES.Services.ExchangeServer.GetMailboxSetupInstructions( litContent.Text = ES.Services.ExchangeServer.GetMailboxSetupInstructions(
PanelRequest.ItemID, PanelRequest.AccountID, PanelRequest.ItemID, PanelRequest.AccountID,
false, false, false); false, false, false,
PortalUtils.EditUrl("ItemID", PanelRequest.ItemID.ToString(),
"user_reset_password",
"SpaceID=" + PanelSecurity.PackageId,
"Context=Mailbox",
"AccountID=" + PanelRequest.AccountID).Trim('~'));
// bind user details // bind user details
PackageInfo package = ES.Services.Packages.GetPackage(PanelSecurity.PackageId); PackageInfo package = ES.Services.Packages.GetPackage(PanelSecurity.PackageId);

View file

@ -7,35 +7,35 @@
<%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %> <%@ Register Src="../UserControls/EnableAsyncTasksSupport.ascx" TagName="EnableAsyncTasksSupport" TagPrefix="wsp" %>
<script type="text/javascript" src="/JavaScript/jquery.min.js?v=1.4.4"></script> <script type="text/javascript" src="/JavaScript/jquery.min.js?v=1.4.4"></script>
<wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/> <wsp:EnableAsyncTasksSupport ID="asyncTasks" runat="server" />
<div id="ExchangeContainer"> <div id="ExchangeContainer">
<div class="Module"> <div class="Module">
<div class="Left"> <div class="Left">
</div> </div>
<div class="Content"> <div class="Content">
<div class="Center"> <div class="Center">
<div class="Title"> <div class="Title">
<asp:Image ID="Image1" SkinID="ExchangeList48" runat="server" /> <asp:Image ID="Image1" SkinID="ExchangeList48" runat="server" />
<asp:Localize ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="Edit Settings"></asp:Localize> <asp:Localize ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="Edit Settings"></asp:Localize>
<asp:Literal ID="litOrganizationName" runat="server" Text="Organization" /> <asp:Literal ID="litOrganizationName" runat="server" Text="Organization" />
</div> </div>
<div class="FormBody"> <div class="FormBody">
<wsp:CollectionTabs id="tabs" runat="server" SelectedTab="organization_settings_password_settings" /> <wsp:CollectionTabs ID="tabs" runat="server" SelectedTab="organization_settings_password_settings" />
<wsp:SimpleMessageBox id="messageBox" runat="server" /> <wsp:SimpleMessageBox ID="messageBox" runat="server" />
<asp:UpdatePanel runat="server" ID="PasswordPolicyPanel" UpdateMode="Conditional" ChildrenAsTriggers="true"> <asp:UpdatePanel runat="server" ID="PasswordPolicyPanel" UpdateMode="Conditional" ChildrenAsTriggers="true">
<ContentTemplate> <ContentTemplate>
<wsp:CollapsiblePanel id="colPasswordSettings" runat="server" TargetControlID="panelPasswordSettings" meta:resourcekey="colPasswordSettings" Text="Password settings"> <wsp:CollapsiblePanel ID="colPasswordSettings" runat="server" TargetControlID="panelPasswordSettings" meta:ResourceKey="colPasswordSettings" Text="Password settings"></wsp:CollapsiblePanel>
</wsp:CollapsiblePanel>
<asp:Panel runat="server" ID="panelPasswordSettings">
<asp:Panel runat="server" ID="panelPasswordSettings"> <table id="PolicyTable" runat="server" cellpadding="2">
<table id="PolicyTable" runat="server" cellpadding="2">
<tr> <tr>
<td class="Normal" style="width:150px;"><asp:Label ID="lblMinimumLength" runat="server" <td class="Normal" style="width: 150px;">
meta:resourcekey="lblMinimumLength" Text="Minimum length:"></asp:Label></td> <asp:Label ID="lblMinimumLength" runat="server"
meta:resourcekey="lblMinimumLength" Text="Minimum length:"></asp:Label></td>
<td class="Normal"> <td class="Normal">
<asp:TextBox ID="txtMinimumLength" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox> <asp:TextBox ID="txtMinimumLength" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox>
<asp:RequiredFieldValidator ID="valRequireMinLength" runat="server" ControlToValidate="txtMinimumLength" meta:resourcekey="valRequireMinLength" <asp:RequiredFieldValidator ID="valRequireMinLength" runat="server" ControlToValidate="txtMinimumLength" meta:resourcekey="valRequireMinLength"
@ -44,19 +44,21 @@
Display="Dynamic" ErrorMessage="*" ValidationExpression="\d{1,3}" ValidationGroup="SettingsEditor"></asp:RegularExpressionValidator></td> Display="Dynamic" ErrorMessage="*" ValidationExpression="\d{1,3}" ValidationGroup="SettingsEditor"></asp:RegularExpressionValidator></td>
</tr> </tr>
<tr> <tr>
<td class="Normal"><asp:Label ID="lblMaximumLength" runat="server" <td class="Normal">
meta:resourcekey="lblMaximumLength" Text="Maximum length:"></asp:Label></td> <asp:Label ID="lblMaximumLength" runat="server"
meta:resourcekey="lblMaximumLength" Text="Maximum length:"></asp:Label></td>
<td class="Normal"> <td class="Normal">
<asp:TextBox ID="txtMaximumLength" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox> <asp:TextBox ID="txtMaximumLength" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox>
<asp:RequiredFieldValidator ID="valRequireMaxLength" runat="server" ControlToValidate="txtMaximumLength" meta:resourcekey="valRequireMaxLength" <asp:RequiredFieldValidator ID="valRequireMaxLength" runat="server" ControlToValidate="txtMaximumLength" meta:resourcekey="valRequireMaxLength"
ErrorMessage="*" ValidationGroup="SettingsEditor" Display="Dynamic"></asp:RequiredFieldValidator> ErrorMessage="*" ValidationGroup="SettingsEditor" Display="Dynamic"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="valCorrectMaxLength" runat="server" ControlToValidate="txtMaximumLength" meta:resourcekey="valCorrectMaxLength" <asp:RegularExpressionValidator ID="valCorrectMaxLength" runat="server" ControlToValidate="txtMaximumLength" meta:resourcekey="valCorrectMaxLength"
Display="Dynamic" ErrorMessage="*" ValidationExpression="\d{1,3}" ValidationGroup="SettingsEditor"></asp:RegularExpressionValidator> Display="Dynamic" ErrorMessage="*" ValidationExpression="\d{1,3}" ValidationGroup="SettingsEditor"></asp:RegularExpressionValidator>
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="Normal" style="width:150px;"><asp:Label ID="lblEnforcePasswordHistory" runat="server" <td class="Normal" style="width: 150px;">
meta:resourcekey="lblEnforcePasswordHistory" Text="Enforce Password History:"></asp:Label></td> <asp:Label ID="lblEnforcePasswordHistory" runat="server"
meta:resourcekey="lblEnforcePasswordHistory" Text="Enforce Password History:"></asp:Label></td>
<td class="Normal"> <td class="Normal">
<asp:TextBox ID="txtEnforcePasswordHistory" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox> <asp:TextBox ID="txtEnforcePasswordHistory" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox>
<asp:RequiredFieldValidator ID="valRequireEnforcePasswordHistory" runat="server" ControlToValidate="txtEnforcePasswordHistory" meta:resourcekey="valRequireEnforcePasswordHistory" <asp:RequiredFieldValidator ID="valRequireEnforcePasswordHistory" runat="server" ControlToValidate="txtEnforcePasswordHistory" meta:resourcekey="valRequireEnforcePasswordHistory"
@ -64,15 +66,27 @@
<asp:RegularExpressionValidator ID="valCorrectEnforcePasswordHistory" runat="server" ControlToValidate="txtEnforcePasswordHistory" meta:resourcekey="valCorrectEnforcePasswordHistory" <asp:RegularExpressionValidator ID="valCorrectEnforcePasswordHistory" runat="server" ControlToValidate="txtEnforcePasswordHistory" meta:resourcekey="valCorrectEnforcePasswordHistory"
Display="Dynamic" ErrorMessage="*" ValidationExpression="\d{1,3}" ValidationGroup="SettingsEditor"></asp:RegularExpressionValidator></td> Display="Dynamic" ErrorMessage="*" ValidationExpression="\d{1,3}" ValidationGroup="SettingsEditor"></asp:RegularExpressionValidator></td>
</tr> </tr>
<tr>
<td class="Normal" style="width: 150px;">
<asp:Label ID="lblMaxPasswordAge" runat="server"
meta:resourcekey="lblMaxPasswordAge" Text="Max Password Age (days):"></asp:Label></td>
<td class="Normal">
<asp:TextBox ID="txtMaxPasswordAge" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox>
<asp:RequiredFieldValidator ID="valRequireMaxPasswordAge" runat="server" ControlToValidate="txtMaxPasswordAge" meta:resourcekey="valRequireMaxPasswordAge"
ErrorMessage="*" ValidationGroup="SettingsEditor" Display="Dynamic"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="valCorrectMaxPasswordAge" runat="server" ControlToValidate="txtMaxPasswordAge" meta:resourcekey="valCorrectMaxPasswordAge"
Display="Dynamic" ErrorMessage="*" ValidationExpression="\d{1,3}" ValidationGroup="SettingsEditor"></asp:RegularExpressionValidator></td>
</tr>
<tr id="RowChkLockOutSettigns" runat="server"> <tr id="RowChkLockOutSettigns" runat="server">
<td colspan="2" class="NormalBold"> <td colspan="2" class="NormalBold">
<asp:CheckBox id="chkLockOutSettigns" runat="server" meta:resourcekey="chkLockOutSettigns" <asp:CheckBox ID="chkLockOutSettigns" runat="server" meta:resourcekey="chkLockOutSettigns"
Text="Enable Lockout Settings" CssClass="NormalBold" AutoPostBack="true" OnCheckedChanged="chkLockOutSettigns_CheckedChanged" /> Text="Enable Lockout Settings" CssClass="NormalBold" AutoPostBack="true" OnCheckedChanged="chkLockOutSettigns_CheckedChanged" />
</td> </td>
</tr> </tr>
<tr id="RowAccountLockoutDuration" runat="server"> <tr id="RowAccountLockoutDuration" runat="server">
<td class="Normal" style="width:150px;"><asp:Label ID="lblAccountLockoutDuration" runat="server" <td class="Normal" style="width: 150px;">
meta:resourcekey="lblAccountLockoutDuration" Text="Account Lockout Duration (minutes):"></asp:Label></td> <asp:Label ID="lblAccountLockoutDuration" runat="server"
meta:resourcekey="lblAccountLockoutDuration" Text="Account Lockout Duration (minutes):"></asp:Label></td>
<td class="Normal"> <td class="Normal">
<asp:TextBox ID="txtAccountLockoutDuration" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox> <asp:TextBox ID="txtAccountLockoutDuration" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox>
<asp:RequiredFieldValidator ID="valRequireAccountLockoutDuration" runat="server" ControlToValidate="txtAccountLockoutDuration" meta:resourcekey="valRequireAccountLockoutDuration" <asp:RequiredFieldValidator ID="valRequireAccountLockoutDuration" runat="server" ControlToValidate="txtAccountLockoutDuration" meta:resourcekey="valRequireAccountLockoutDuration"
@ -85,7 +99,8 @@
<asp:Label ID="lblLockedOut" runat="server" <asp:Label ID="lblLockedOut" runat="server"
meta:resourcekey="lblLockedOut" Text="Account Lockout threshold:"></asp:Label> meta:resourcekey="lblLockedOut" Text="Account Lockout threshold:"></asp:Label>
</td> </td>
<td class="Normal"><asp:TextBox ID="txtLockedOut" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox> <td class="Normal">
<asp:TextBox ID="txtLockedOut" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox>
<asp:RequiredFieldValidator ID="valRequiredLockedOut" runat="server" ControlToValidate="txtLockedOut" meta:resourcekey="valRequiredLockedOut" <asp:RequiredFieldValidator ID="valRequiredLockedOut" runat="server" ControlToValidate="txtLockedOut" meta:resourcekey="valRequiredLockedOut"
ErrorMessage="*" ValidationGroup="SettingsEditor" Display="Dynamic"></asp:RequiredFieldValidator> ErrorMessage="*" ValidationGroup="SettingsEditor" Display="Dynamic"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="valCorrectLockedOut" runat="server" ControlToValidate="txtLockedOut" meta:resourcekey="valCorrectLockedOut" <asp:RegularExpressionValidator ID="valCorrectLockedOut" runat="server" ControlToValidate="txtLockedOut" meta:resourcekey="valCorrectLockedOut"
@ -97,7 +112,8 @@
<asp:Label ID="lblResetAccountLockout" runat="server" <asp:Label ID="lblResetAccountLockout" runat="server"
meta:resourcekey="lblResetAccountLockout" Text="Reset account lockout counter after (minutes):"></asp:Label> meta:resourcekey="lblResetAccountLockout" Text="Reset account lockout counter after (minutes):"></asp:Label>
</td> </td>
<td class="Normal"><asp:TextBox ID="txtResetAccountLockout" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox> <td class="Normal">
<asp:TextBox ID="txtResetAccountLockout" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox>
<asp:RequiredFieldValidator ID="valRequireResetAccountLockout" runat="server" ControlToValidate="txtResetAccountLockout" meta:resourcekey="valRequireResetAccountLockout" <asp:RequiredFieldValidator ID="valRequireResetAccountLockout" runat="server" ControlToValidate="txtResetAccountLockout" meta:resourcekey="valRequireResetAccountLockout"
ErrorMessage="*" ValidationGroup="SettingsEditor" Display="Dynamic"></asp:RequiredFieldValidator> ErrorMessage="*" ValidationGroup="SettingsEditor" Display="Dynamic"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="valResetAccountLockout" runat="server" ControlToValidate="txtResetAccountLockout" meta:resourcekey="valResetAccountLockout" <asp:RegularExpressionValidator ID="valResetAccountLockout" runat="server" ControlToValidate="txtResetAccountLockout" meta:resourcekey="valResetAccountLockout"
@ -107,8 +123,8 @@
<tr> <tr>
<td colspan="2" class="NormalBold"> <td colspan="2" class="NormalBold">
<asp:CheckBox id="chkPasswordComplexity" runat="server" meta:resourcekey="chkPasswordComplexity" <asp:CheckBox ID="chkPasswordComplexity" runat="server" meta:resourcekey="chkPasswordComplexity"
Text="Enable Password Complexity" CssClass="NormalBold" AutoPostBack="true" OnCheckedChanged="chkPasswordComplexity_CheckedChanged" /> Text="Enable Password Complexity" CssClass="NormalBold" AutoPostBack="true" OnCheckedChanged="chkPasswordComplexity_CheckedChanged" />
</td> </td>
</tr> </tr>
<tr id="RowMinimumUppercase" runat="server"> <tr id="RowMinimumUppercase" runat="server">
@ -116,31 +132,34 @@
<asp:Label ID="lblMinimumUppercase" runat="server" <asp:Label ID="lblMinimumUppercase" runat="server"
meta:resourcekey="lblMinimumUppercase" Text="Uppercase letters:"></asp:Label> meta:resourcekey="lblMinimumUppercase" Text="Uppercase letters:"></asp:Label>
</td> </td>
<td class="Normal"><asp:TextBox ID="txtMinimumUppercase" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox> <td class="Normal">
<asp:TextBox ID="txtMinimumUppercase" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox>
<asp:RequiredFieldValidator ID="valRequireUppercase" runat="server" ControlToValidate="txtMinimumUppercase" meta:resourcekey="valRequireUppercase" <asp:RequiredFieldValidator ID="valRequireUppercase" runat="server" ControlToValidate="txtMinimumUppercase" meta:resourcekey="valRequireUppercase"
ErrorMessage="*" ValidationGroup="SettingsEditor" Display="Dynamic"></asp:RequiredFieldValidator> ErrorMessage="*" ValidationGroup="SettingsEditor" Display="Dynamic"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="valCorrectUppercase" runat="server" ControlToValidate="txtMinimumUppercase" meta:resourcekey="valCorrectUppercase" <asp:RegularExpressionValidator ID="valCorrectUppercase" runat="server" ControlToValidate="txtMinimumUppercase" meta:resourcekey="valCorrectUppercase"
Display="Dynamic" ErrorMessage="*" ValidationExpression="\d{1,3}" ValidationGroup="SettingsEditor"></asp:RegularExpressionValidator> Display="Dynamic" ErrorMessage="*" ValidationExpression="\d{1,3}" ValidationGroup="SettingsEditor"></asp:RegularExpressionValidator>
</td> </td>
</tr> </tr>
<tr id="RowMinimumNumbers" runat="server"> <tr id="RowMinimumNumbers" runat="server">
<td class="Normal"> <td class="Normal">
<asp:Label ID="lblMinimumNumbers" runat="server" <asp:Label ID="lblMinimumNumbers" runat="server"
meta:resourcekey="lblMinimumNumbers" Text="Numbers:"></asp:Label> meta:resourcekey="lblMinimumNumbers" Text="Numbers:"></asp:Label>
</td> </td>
<td class="Normal"><asp:TextBox ID="txtMinimumNumbers" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox> <td class="Normal">
<asp:TextBox ID="txtMinimumNumbers" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox>
<asp:RequiredFieldValidator ID="valRequireNumbers" runat="server" ControlToValidate="txtMinimumNumbers" meta:resourcekey="valRequireNumbers" <asp:RequiredFieldValidator ID="valRequireNumbers" runat="server" ControlToValidate="txtMinimumNumbers" meta:resourcekey="valRequireNumbers"
ErrorMessage="*" ValidationGroup="SettingsEditor" Display="Dynamic"></asp:RequiredFieldValidator> ErrorMessage="*" ValidationGroup="SettingsEditor" Display="Dynamic"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="valCorrectNumbers" runat="server" ControlToValidate="txtMinimumNumbers" meta:resourcekey="valCorrectNumbers" <asp:RegularExpressionValidator ID="valCorrectNumbers" runat="server" ControlToValidate="txtMinimumNumbers" meta:resourcekey="valCorrectNumbers"
Display="Dynamic" ErrorMessage="*" ValidationExpression="\d{1,3}" ValidationGroup="SettingsEditor"></asp:RegularExpressionValidator> Display="Dynamic" ErrorMessage="*" ValidationExpression="\d{1,3}" ValidationGroup="SettingsEditor"></asp:RegularExpressionValidator>
</td> </td>
</tr> </tr>
<tr id="RowMinimumSymbols" runat="server"> <tr id="RowMinimumSymbols" runat="server">
<td class="Normal"> <td class="Normal">
<asp:Label ID="lblMinimumSymbols" runat="server" <asp:Label ID="lblMinimumSymbols" runat="server"
meta:resourcekey="lblMinimumSymbols" Text="Non-alphanumeric symbols:"></asp:Label> meta:resourcekey="lblMinimumSymbols" Text="Non-alphanumeric symbols:"></asp:Label>
</td> </td>
<td class="Normal"><asp:TextBox ID="txtMinimumSymbols" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox> <td class="Normal">
<asp:TextBox ID="txtMinimumSymbols" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox>
<asp:RequiredFieldValidator ID="valRequireSymbols" runat="server" ControlToValidate="txtMinimumSymbols" meta:resourcekey="valRequireSymbols" <asp:RequiredFieldValidator ID="valRequireSymbols" runat="server" ControlToValidate="txtMinimumSymbols" meta:resourcekey="valRequireSymbols"
ErrorMessage="*" ValidationGroup="SettingsEditor" Display="Dynamic"></asp:RequiredFieldValidator> ErrorMessage="*" ValidationGroup="SettingsEditor" Display="Dynamic"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="valCorrectSymbols" runat="server" ControlToValidate="txtMinimumSymbols" meta:resourcekey="valCorrectSymbols" <asp:RegularExpressionValidator ID="valCorrectSymbols" runat="server" ControlToValidate="txtMinimumSymbols" meta:resourcekey="valCorrectSymbols"
@ -149,20 +168,20 @@
</tr> </tr>
<tr id="rowEqualUsername" runat="server" visible="false"> <tr id="rowEqualUsername" runat="server" visible="false">
<td class="Normal" colspan="2"> <td class="Normal" colspan="2">
<asp:CheckBox id="chkNotEqualUsername" runat="server" meta:resourcekey="chkNotEqualUsername" Text="Should not be equal to username" /> <asp:CheckBox ID="chkNotEqualUsername" runat="server" meta:resourcekey="chkNotEqualUsername" Text="Should not be equal to username" />
</td> </td>
</tr> </tr>
</table> </table>
</asp:Panel> </asp:Panel>
</ContentTemplate> </ContentTemplate>
</asp:UpdatePanel> </asp:UpdatePanel>
<div class="FormFooterClean"> <div class="FormFooterClean">
<wsp:ItemButtonPanel id="buttonPanel" runat="server" ValidationGroup="SettingsEditor" <wsp:ItemButtonPanel ID="buttonPanel" runat="server" ValidationGroup="SettingsEditor"
OnSaveClick="btnSave_Click" OnSaveExitClick="btnSaveExit_Click" /> OnSaveClick="btnSave_Click" OnSaveExitClick="btnSaveExit_Click" />
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using System.Linq; using System.Linq;
using System.Web; using System.Web;
using System.Web.UI; using System.Web.UI;
@ -59,6 +60,8 @@ namespace WebsitePanel.Portal.ExchangeServer
txtResetAccountLockout.Text = PasswordPolicyEditor.GetValueSafe(parts, 10, "0"); txtResetAccountLockout.Text = PasswordPolicyEditor.GetValueSafe(parts, 10, "0");
chkLockOutSettigns.Checked = PasswordPolicyEditor.GetValueSafe(parts, 11, false); chkLockOutSettigns.Checked = PasswordPolicyEditor.GetValueSafe(parts, 11, false);
chkPasswordComplexity.Checked = PasswordPolicyEditor.GetValueSafe(parts, 12, true); chkPasswordComplexity.Checked = PasswordPolicyEditor.GetValueSafe(parts, 12, true);
txtMaxPasswordAge.Text = PasswordPolicyEditor.GetValueSafe(parts, 13, "42");
} }
private void BindSettings(OrganizationPasswordSettings settings) private void BindSettings(OrganizationPasswordSettings settings)
@ -75,6 +78,8 @@ namespace WebsitePanel.Portal.ExchangeServer
txtResetAccountLockout.Text = settings.ResetAccountLockoutCounterAfter.ToString(); txtResetAccountLockout.Text = settings.ResetAccountLockoutCounterAfter.ToString();
chkLockOutSettigns.Checked = settings.LockoutSettingsEnabled; chkLockOutSettigns.Checked = settings.LockoutSettingsEnabled;
chkPasswordComplexity.Checked = settings.PasswordComplexityEnabled; chkPasswordComplexity.Checked = settings.PasswordComplexityEnabled;
txtMaxPasswordAge.Text = settings.MaxPasswordAge.ToString();
} }
private OrganizationPasswordSettings GetSettings() private OrganizationPasswordSettings GetSettings()
@ -94,6 +99,8 @@ namespace WebsitePanel.Portal.ExchangeServer
settings.LockoutSettingsEnabled = chkLockOutSettigns.Checked; settings.LockoutSettingsEnabled = chkLockOutSettigns.Checked;
settings.PasswordComplexityEnabled =chkPasswordComplexity.Checked; settings.PasswordComplexityEnabled =chkPasswordComplexity.Checked;
settings.MaxPasswordAge = Utils.ParseInt(txtMaxPasswordAge.Text, 42);
return settings; return settings;
} }

View file

@ -210,6 +210,42 @@ namespace WebsitePanel.Portal.ExchangeServer {
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.RegularExpressionValidator valCorrectEnforcePasswordHistory; protected global::System.Web.UI.WebControls.RegularExpressionValidator valCorrectEnforcePasswordHistory;
/// <summary>
/// lblMaxPasswordAge 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 lblMaxPasswordAge;
/// <summary>
/// txtMaxPasswordAge 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 txtMaxPasswordAge;
/// <summary>
/// valRequireMaxPasswordAge control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireMaxPasswordAge;
/// <summary>
/// valCorrectMaxPasswordAge 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.RegularExpressionValidator valCorrectMaxPasswordAge;
/// <summary> /// <summary>
/// RowChkLockOutSettigns control. /// RowChkLockOutSettigns control.
/// </summary> /// </summary>

View file

@ -4,42 +4,69 @@
<div id="ExchangeContainer"> <div id="ExchangeContainer">
<div class="Module"> <div class="Module">
<div class="Left"> <div class="Left">
</div> </div>
<div class="Content"> <div class="Content">
<div class="Center"> <div class="Center">
<div class="Title"> <div class="Title">
<asp:Image ID="Image1" SkinID="OrganizationUser48" runat="server" /> <asp:Image ID="Image1" SkinID="OrganizationUser48" runat="server" />
<asp:Localize ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="Reset Password"></asp:Localize> <asp:Localize ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="Reset Password"></asp:Localize>
- -
<asp:Literal ID="litDisplayName" runat="server" Text="John Smith" /> <asp:Literal ID="litDisplayName" runat="server" Text="John Smith" />
</div> </div>
<div class="FormBody"> <div class="FormBody">
<table> <asp:UpdatePanel ID="PasswrodResetUpdatePanel" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
<tr> <ContentTemplate>
<td class="FormLabel150" valign="top"><asp:Localize ID="locEmailAddress" runat="server" meta:resourcekey="locEmailAddress" ></asp:Localize></td>
<td> <table>
<asp:TextBox runat="server" ID="txtEmailAddress" CssClass="TextBox200"/> <tr>
<asp:RequiredFieldValidator ID="valEmailAddress" runat="server" ErrorMessage="*" ControlToValidate="txtEmailAddress" ValidationGroup="ResetUserPassword"></asp:RequiredFieldValidator> <td class="FormLabel150">
<asp:RegularExpressionValidator ID="regexEmailValid" runat="server" ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" ValidationGroup="ResetUserPassword" ControlToValidate="txtEmailAddress" ErrorMessage="Invalid Email Format"></asp:RegularExpressionValidator> <asp:Localize ID="locSendTo" runat="server" meta:resourcekey="locSendTo" Text="Send to:"></asp:Localize></td>
</td> <td class="FormRBtnL">
</tr> <asp:RadioButton ID="rbtnEmail" runat="server" meta:resourcekey="rbtnEmail" Text="Email" GroupName="SendToGroup" AutoPostBack="true" Checked="true" OnCheckedChanged="SendToGroupCheckedChanged" />
<tr> <asp:RadioButton ID="rbtnMobile" runat="server" meta:resourcekey="rbtnMobile" Text="Mobile" GroupName="SendToGroup" AutoPostBack="true" OnCheckedChanged="SendToGroupCheckedChanged" />
<td class="FormLabel150"><asp:Localize ID="locReason" runat="server" meta:resourcekey="locReason" Text="Reason:"></asp:Localize></td> <br />
<td> <br />
<asp:TextBox ID="txtReason" runat="server" CssClass="TextBox200" Rows="4" TextMode="MultiLine"></asp:TextBox> </td>
<asp:RequiredFieldValidator ID="valReason" runat="server" ErrorMessage="*" ControlToValidate="txtReason" ValidationGroup="ResetUserPassword"></asp:RequiredFieldValidator> </tr>
</td> <tr id="EmailRow" runat="server">
</tr> <td class="FormLabel150" valign="top">
</table> <asp:Localize ID="locEmailAddress" runat="server" meta:resourcekey="locEmailAddress"></asp:Localize></td>
<td>
<div class="FormFooterClean"> <asp:TextBox runat="server" ID="txtEmailAddress" CssClass="TextBox200" />
<asp:Button id="btnResetPassoword" runat="server" Text="Send Password Reset Email" CssClass="Button1" meta:resourcekey="btnResetPassoword" ValidationGroup="ResetUserPassword" OnClick="btnResetPassoword_Click"></asp:Button> <asp:RequiredFieldValidator ID="valEmailAddress" runat="server" ErrorMessage="*" ControlToValidate="txtEmailAddress" ValidationGroup="ResetUserPassword"></asp:RequiredFieldValidator>
</div> <asp:RegularExpressionValidator ID="regexEmailValid" runat="server" ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" ValidationGroup="ResetUserPassword" ControlToValidate="txtEmailAddress" ErrorMessage="Invalid Email Format"></asp:RegularExpressionValidator>
</div> </td>
</div> </tr>
</div> <tr id="MobileRow" runat="server" visible="False">
</div> <td class="FormLabel150" valign="top">
<asp:Localize ID="locMobile" runat="server" meta:resourcekey="locMobile"></asp:Localize></td>
<td>
<asp:TextBox runat="server" ID="txtMobile" CssClass="TextBox200" />
<asp:RequiredFieldValidator ID="valMobile" runat="server" ErrorMessage="*" ControlToValidate="txtMobile" ValidationGroup="ResetUserPassword"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="regexMobileValid" runat="server" ValidationExpression="^\+?\d+$" ValidationGroup="ResetUserPassword" ControlToValidate="txtMobile" ErrorMessage="Invalid Mobile Format"></asp:RegularExpressionValidator>
</td>
</tr>
<tr>
<td class="FormLabel150">
<asp:Localize ID="locReason" runat="server" meta:resourcekey="locReason" Text="Reason:"></asp:Localize></td>
<td>
<asp:TextBox ID="txtReason" runat="server" CssClass="TextBox200" Rows="4" TextMode="MultiLine"></asp:TextBox>
<asp:RequiredFieldValidator ID="valReason" runat="server" ErrorMessage="*" ControlToValidate="txtReason" ValidationGroup="ResetUserPassword"></asp:RequiredFieldValidator>
</td>
</tr>
</table>
</ContentTemplate>
</asp:UpdatePanel>
<div class="FormFooterClean">
<asp:Button ID="btnResetPassoword" runat="server" Text="Send Password Reset Email" CssClass="Button1" meta:resourcekey="btnResetPassoword" ValidationGroup="ResetUserPassword" OnClick="btnResetPassoword_Click"></asp:Button>
</div>
</div>
</div>
</div>
</div>
</div> </div>

View file

@ -26,6 +26,8 @@ namespace WebsitePanel.Portal.ExchangeServer
litDisplayName.Text = PortalAntiXSS.Encode(user.DisplayName); litDisplayName.Text = PortalAntiXSS.Encode(user.DisplayName);
txtEmailAddress.Text = user.PrimaryEmailAddress; txtEmailAddress.Text = user.PrimaryEmailAddress;
txtMobile.Text = user.MobilePhone;
} }
protected void btnResetPassoword_Click(object sender, EventArgs e) protected void btnResetPassoword_Click(object sender, EventArgs e)
@ -35,11 +37,31 @@ namespace WebsitePanel.Portal.ExchangeServer
return; return;
} }
ES.Services.Organizations.SendResetUserPasswordEmail(PanelRequest.ItemID,PanelRequest.AccountID, txtReason.Text, txtEmailAddress.Text); if (rbtnEmail.Checked)
{
ES.Services.Organizations.SendResetUserPasswordEmail(PanelRequest.ItemID,PanelRequest.AccountID, txtReason.Text, txtEmailAddress.Text, true);
}
else
{
var result = ES.Services.Organizations.SendResetUserPasswordLinkSms(PanelRequest.ItemID, PanelRequest.AccountID, txtReason.Text, txtMobile.Text);
if (!result.IsSuccess)
{
ShowErrorMessage("SEND_USER_PASSWORD_RESET_SMS");
return;
}
}
Response.Redirect(PortalUtils.EditUrl("ItemID", PanelRequest.ItemID.ToString(), Response.Redirect(PortalUtils.EditUrl("ItemID", PanelRequest.ItemID.ToString(),
(PanelRequest.Context == "Mailbox") ? "mailboxes" : "users", (PanelRequest.Context == "Mailbox") ? "mailboxes" : "users",
"SpaceID=" + PanelSecurity.PackageId)); "SpaceID=" + PanelSecurity.PackageId));
} }
protected void SendToGroupCheckedChanged(object sender, EventArgs e)
{
EmailRow.Visible = rbtnEmail.Checked;
MobileRow.Visible = !rbtnEmail.Checked;
}
} }
} }

View file

@ -39,6 +39,51 @@ namespace WebsitePanel.Portal.ExchangeServer {
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.Literal litDisplayName; protected global::System.Web.UI.WebControls.Literal litDisplayName;
/// <summary>
/// PasswrodResetUpdatePanel control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.UpdatePanel PasswrodResetUpdatePanel;
/// <summary>
/// locSendTo control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locSendTo;
/// <summary>
/// rbtnEmail control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RadioButton rbtnEmail;
/// <summary>
/// rbtnMobile control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RadioButton rbtnMobile;
/// <summary>
/// EmailRow control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlTableRow EmailRow;
/// <summary> /// <summary>
/// locEmailAddress control. /// locEmailAddress control.
/// </summary> /// </summary>
@ -75,6 +120,51 @@ namespace WebsitePanel.Portal.ExchangeServer {
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.RegularExpressionValidator regexEmailValid; protected global::System.Web.UI.WebControls.RegularExpressionValidator regexEmailValid;
/// <summary>
/// MobileRow control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlTableRow MobileRow;
/// <summary>
/// locMobile control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locMobile;
/// <summary>
/// txtMobile 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 txtMobile;
/// <summary>
/// valMobile control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator valMobile;
/// <summary>
/// regexMobileValid 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.RegularExpressionValidator regexMobileValid;
/// <summary> /// <summary>
/// locReason control. /// locReason control.
/// </summary> /// </summary>

View file

@ -70,7 +70,7 @@ namespace WebsitePanel.Portal.ExchangeServer.UserControls
if (!hideItems) tabsList.Add(CreateTab("mailbox_mailflow", "Tab.Mailflow")); if (!hideItems) tabsList.Add(CreateTab("mailbox_mailflow", "Tab.Mailflow"));
if (!hideItems) tabsList.Add(CreateTab("mailbox_permissions", "Tab.Permissions")); if (!hideItems) tabsList.Add(CreateTab("mailbox_permissions", "Tab.Permissions"));
string instructions = ES.Services.ExchangeServer.GetMailboxSetupInstructions(PanelRequest.ItemID, PanelRequest.AccountID, false, false, false); string instructions = ES.Services.ExchangeServer.GetMailboxSetupInstructions(PanelRequest.ItemID, PanelRequest.AccountID, false, false, false, " ");
if (!string.IsNullOrEmpty(instructions)) if (!string.IsNullOrEmpty(instructions))
tabsList.Add(CreateTab("mailbox_setup", "Tab.Setup")); tabsList.Add(CreateTab("mailbox_setup", "Tab.Setup"));

View file

@ -41,5 +41,20 @@
<td class="Normal" colspan="2"> <td class="Normal" colspan="2">
<asp:TextBox ID="txtTextBody" runat="server" Rows="15" TextMode="MultiLine" Width="680px" CssClass="NormalTextBox" Wrap="false"></asp:TextBox></td> <asp:TextBox ID="txtTextBody" 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="lblPasswordResetLinkSmsBody" runat="server" meta:resourcekey="lblPasswordResetLinkSmsBody" Text="Password Reset Link Sms Body:"></asp:Label></td>
</tr>
<tr>
<td class="Normal" colspan="2">
<asp:TextBox ID="txtBodyPasswordResetLinkSmsBody" 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> </table>

View file

@ -18,6 +18,9 @@ namespace WebsitePanel.Portal
txtHtmlBody.Text = settings["HtmlBody"]; txtHtmlBody.Text = settings["HtmlBody"];
txtTextBody.Text = settings["TextBody"]; txtTextBody.Text = settings["TextBody"];
txtLogoUrl.Text = settings["LogoUrl"]; txtLogoUrl.Text = settings["LogoUrl"];
txtBodyPasswordResetLinkSmsBody.Text = settings["PasswordResetLinkSmsBody"];
txtPasswordResetPincodeSmsBody.Text = settings["PasswordResetPincodeSmsBody"];
} }
public void SaveSettings(UserSettings settings) public void SaveSettings(UserSettings settings)
@ -28,6 +31,9 @@ namespace WebsitePanel.Portal
settings["HtmlBody"] = txtHtmlBody.Text; settings["HtmlBody"] = txtHtmlBody.Text;
settings["TextBody"] = txtTextBody.Text; settings["TextBody"] = txtTextBody.Text;
settings["LogoUrl"] = txtLogoUrl.Text; settings["LogoUrl"] = txtLogoUrl.Text;
settings["PasswordResetLinkSmsBody"]= txtBodyPasswordResetLinkSmsBody.Text;
settings["PasswordResetPincodeSmsBody"] =txtPasswordResetPincodeSmsBody.Text;
} }
} }
} }

View file

@ -119,5 +119,41 @@ 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 txtTextBody; protected global::System.Web.UI.WebControls.TextBox txtTextBody;
/// <summary>
/// lblPasswordResetLinkSmsBody 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 lblPasswordResetLinkSmsBody;
/// <summary>
/// txtBodyPasswordResetLinkSmsBody 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 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

@ -98,6 +98,24 @@
</tr> </tr>
</table> </table>
</asp:Panel> </asp:Panel>
<wsp:CollapsiblePanel ID="TwilioSettings" runat="server" TargetControlID="PanelTwilioSettings" meta:resourcekey="TwilioSettings" Text="Webdav Portal" />
<asp:Panel ID="PanelTwilioSettings" runat="server" Height="0" style="overflow:hidden;">
<table>
<tr>
<td class="SubHead" style="width:200px;"><asp:Localize ID="lblAccountSid" runat="server" meta:resourcekey="lblAccountSid" />
<td><asp:TextBox runat="server" ID="txtAccountSid" Width="450px" /></td>
</tr>
<tr>
<td class="SubHead" style="width:200px;"><asp:Localize ID="lblAuthToken" runat="server" meta:resourcekey="lblAuthToken" />
<td><asp:TextBox runat="server" ID="txtAuthToken" Width="450px" /></td>
</tr>
<tr>
<td class="SubHead" style="width:200px;"><asp:Localize ID="lblPhoneFrom" runat="server" meta:resourcekey="lblPhoneFrom" />
<td><asp:TextBox runat="server" ID="txtPhoneFrom" Width="450px" /></td>
</tr>
</table>
</asp:Panel>
</div> </div>
<div class="FormFooter"> <div class="FormFooter">
<asp:Button runat="server" ID="btnSaveSettings" meta:resourcekey="btnSaveSettings" <asp:Button runat="server" ID="btnSaveSettings" meta:resourcekey="btnSaveSettings"

View file

@ -167,6 +167,17 @@ namespace WebsitePanel.Portal
chkEnablePasswordReset.Checked = Utils.ParseBool(settings[WSP.SystemSettings.WEBDAV_PASSWORD_RESET_ENABLED_KEY], false); chkEnablePasswordReset.Checked = Utils.ParseBool(settings[WSP.SystemSettings.WEBDAV_PASSWORD_RESET_ENABLED_KEY], false);
txtWebdavPortalUrl.Text = settings[WEBDAV_PORTAL_URL]; txtWebdavPortalUrl.Text = settings[WEBDAV_PORTAL_URL];
} }
// Twilio portal
settings = ES.Services.System.GetSystemSettings(WSP.SystemSettings.TWILIO_SETTINGS);
if (settings != null)
{
txtAccountSid.Text = settings.GetValueOrDefault(WSP.SystemSettings.TWILIO_ACCOUNTSID_KEY, string.Empty);
txtAuthToken.Text = settings.GetValueOrDefault(WSP.SystemSettings.TWILIO_AUTHTOKEN_KEY, string.Empty);
txtPhoneFrom.Text = settings.GetValueOrDefault(WSP.SystemSettings.TWILIO_PHONEFROM_KEY, string.Empty);
}
} }
private void SaveSettings() private void SaveSettings()
@ -253,6 +264,19 @@ namespace WebsitePanel.Portal
settings[WSP.SystemSettings.WEBDAV_PASSWORD_RESET_ENABLED_KEY] = chkEnablePasswordReset.Checked.ToString(); settings[WSP.SystemSettings.WEBDAV_PASSWORD_RESET_ENABLED_KEY] = chkEnablePasswordReset.Checked.ToString();
result = ES.Services.System.SetSystemSettings(WSP.SystemSettings.WEBDAV_PORTAL_SETTINGS, settings); result = ES.Services.System.SetSystemSettings(WSP.SystemSettings.WEBDAV_PORTAL_SETTINGS, settings);
if (result < 0)
{
ShowResultMessage(result);
return;
}
// Twilio portal
settings = new WSP.SystemSettings();
settings[WSP.SystemSettings.TWILIO_ACCOUNTSID_KEY] = txtAccountSid.Text;
settings[WSP.SystemSettings.TWILIO_AUTHTOKEN_KEY] = txtAuthToken.Text;
settings[WSP.SystemSettings.TWILIO_PHONEFROM_KEY] = txtPhoneFrom.Text;
result = ES.Services.System.SetSystemSettings(WSP.SystemSettings.TWILIO_SETTINGS, settings);
if (result < 0) if (result < 0)
{ {
ShowResultMessage(result); ShowResultMessage(result);

View file

@ -282,6 +282,78 @@ namespace WebsitePanel.Portal {
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtWebdavPortalUrl; protected global::System.Web.UI.WebControls.TextBox txtWebdavPortalUrl;
/// <summary>
/// TwilioSettings control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.CollapsiblePanel TwilioSettings;
/// <summary>
/// PanelTwilioSettings 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.Panel PanelTwilioSettings;
/// <summary>
/// lblAccountSid control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize lblAccountSid;
/// <summary>
/// txtAccountSid 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 txtAccountSid;
/// <summary>
/// lblAuthToken control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize lblAuthToken;
/// <summary>
/// txtAuthToken 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 txtAuthToken;
/// <summary>
/// lblPhoneFrom control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize lblPhoneFrom;
/// <summary>
/// txtPhoneFrom 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 txtPhoneFrom;
/// <summary> /// <summary>
/// btnSaveSettings control. /// btnSaveSettings control.
/// </summary> /// </summary>

View file

@ -210,4 +210,13 @@
<data name="valResetAccountLockout.Text" xml:space="preserve"> <data name="valResetAccountLockout.Text" xml:space="preserve">
<value>*</value> <value>*</value>
</data> </data>
<data name="lblMaxPasswordAge.Text" xml:space="preserve">
<value>Max Password Age (days):</value>
</data>
<data name="valCorrectMaxPasswordAge.Text" xml:space="preserve">
<value>*</value>
</data>
<data name="valRequireMaxPasswordAge.Text" xml:space="preserve">
<value>*</value>
</data>
</root> </root>

View file

@ -37,6 +37,16 @@
<asp:RegularExpressionValidator ID="valCorrectEnforcePasswordHistory" runat="server" ControlToValidate="txtEnforcePasswordHistory" meta:resourcekey="valCorrectEnforcePasswordHistory" <asp:RegularExpressionValidator ID="valCorrectEnforcePasswordHistory" runat="server" ControlToValidate="txtEnforcePasswordHistory" meta:resourcekey="valCorrectEnforcePasswordHistory"
Display="Dynamic" ErrorMessage="*" ValidationExpression="\d{1,3}" ValidationGroup="SettingsEditor"></asp:RegularExpressionValidator></td> Display="Dynamic" ErrorMessage="*" ValidationExpression="\d{1,3}" ValidationGroup="SettingsEditor"></asp:RegularExpressionValidator></td>
</tr> </tr>
<tr>
<td class="Normal" style="width:150px;"><asp:Label ID="lblMaxPasswordAge" runat="server"
meta:resourcekey="lblMaxPasswordAge" Text="Max Password Age (days):"></asp:Label></td>
<td class="Normal">
<asp:TextBox ID="txtMaxPasswordAge" runat="server" CssClass="NormalTextBox" Width="40px"></asp:TextBox>
<asp:RequiredFieldValidator ID="valRequireMaxPasswordAge" runat="server" ControlToValidate="txtMaxPasswordAge" meta:resourcekey="valRequireMaxPasswordAge"
ErrorMessage="*" ValidationGroup="SettingsEditor" Display="Dynamic"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="valCorrectMaxPasswordAge" runat="server" ControlToValidate="txtMaxPasswordAge" meta:resourcekey="valCorrectMaxPasswordAge"
Display="Dynamic" ErrorMessage="*" ValidationExpression="\d{1,3}" ValidationGroup="SettingsEditor"></asp:RegularExpressionValidator></td>
</tr>
<tr id="RowChkLockOutSettigns" runat="server"> <tr id="RowChkLockOutSettigns" runat="server">
<td colspan="2" class="NormalBold"> <td colspan="2" class="NormalBold">
<asp:CheckBox id="chkLockOutSettigns" runat="server" meta:resourcekey="chkLockOutSettigns" <asp:CheckBox id="chkLockOutSettigns" runat="server" meta:resourcekey="chkLockOutSettigns"

View file

@ -64,6 +64,8 @@ namespace WebsitePanel.Portal
sb.Append(chkLockOutSettigns.Checked.ToString()).Append(";"); sb.Append(chkLockOutSettigns.Checked.ToString()).Append(";");
sb.Append(chkPasswordComplexity.Checked.ToString()).Append(";"); sb.Append(chkPasswordComplexity.Checked.ToString()).Append(";");
sb.Append(txtMaxPasswordAge.Text).Append(";");
return sb.ToString(); return sb.ToString();
} }
set set
@ -79,6 +81,7 @@ namespace WebsitePanel.Portal
txtMinimumSymbols.Text = "0"; txtMinimumSymbols.Text = "0";
txtLockedOut.Text = "3"; txtLockedOut.Text = "3";
chkPasswordComplexity.Checked = true; chkPasswordComplexity.Checked = true;
txtMaxPasswordAge.Text = "42";
} }
else else
{ {
@ -100,6 +103,8 @@ namespace WebsitePanel.Portal
txtResetAccountLockout.Text = GetValueSafe(parts, 10, "0"); txtResetAccountLockout.Text = GetValueSafe(parts, 10, "0");
chkLockOutSettigns.Checked = GetValueSafe(parts, 11, false) && ShowLockoutSettings; chkLockOutSettigns.Checked = GetValueSafe(parts, 11, false) && ShowLockoutSettings;
chkPasswordComplexity.Checked = GetValueSafe(parts, 12, true); chkPasswordComplexity.Checked = GetValueSafe(parts, 12, true);
txtMaxPasswordAge.Text = GetValueSafe(parts, 13, "42");
} }
catch catch
{ {
@ -155,15 +160,19 @@ namespace WebsitePanel.Portal
public static T GetValueSafe<T>(string[] array, int index, T defaultValue) public static T GetValueSafe<T>(string[] array, int index, T defaultValue)
{ {
if (array.Length > index) try
{ {
if (string.IsNullOrEmpty(array[index])) if (array.Length > index)
{ {
return defaultValue; if (string.IsNullOrEmpty(array[index]))
} {
return defaultValue;
}
return (T)Convert.ChangeType(array[index], typeof(T)); return (T)Convert.ChangeType(array[index], typeof(T));
}
} }
catch{}
return defaultValue; return defaultValue;
} }

View file

@ -147,6 +147,42 @@ namespace WebsitePanel.Portal {
/// </remarks> /// </remarks>
protected global::System.Web.UI.WebControls.RegularExpressionValidator valCorrectEnforcePasswordHistory; protected global::System.Web.UI.WebControls.RegularExpressionValidator valCorrectEnforcePasswordHistory;
/// <summary>
/// lblMaxPasswordAge 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 lblMaxPasswordAge;
/// <summary>
/// txtMaxPasswordAge 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 txtMaxPasswordAge;
/// <summary>
/// valRequireMaxPasswordAge control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireMaxPasswordAge;
/// <summary>
/// valCorrectMaxPasswordAge 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.RegularExpressionValidator valCorrectMaxPasswordAge;
/// <summary> /// <summary>
/// RowChkLockOutSettigns control. /// RowChkLockOutSettigns control.
/// </summary> /// </summary>

View file

@ -6,23 +6,8 @@
<wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/> <wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/>
<div id="VpsContainer">
<div class="Module">
<div class="Header">
<wsp:Breadcrumb id="breadcrumb" runat="server" />
</div>
<div class="Left">
<wsp:Menu id="menu" runat="server" SelectedItem="vdc_external_network" />
</div>
<div class="Content"> <div class="Content">
<div class="Center"> <div class="Center">
<div class="Title">
<asp:Image ID="imgIcon" SkinID="Network48" runat="server" />
<asp:Localize ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="Allocate IP Addresses"></asp:Localize>
</div>
<div class="FormBody"> <div class="FormBody">
<wsp:AllocatePackageIPAddresses id="allocateAddresses" runat="server" <wsp:AllocatePackageIPAddresses id="allocateAddresses" runat="server"
@ -33,7 +18,3 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</div>

View file

@ -21,42 +21,6 @@ namespace WebsitePanel.Portal.VPS2012 {
/// </remarks> /// </remarks>
protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks;
/// <summary>
/// breadcrumb control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb;
/// <summary>
/// menu control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu;
/// <summary>
/// imgIcon 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.Image imgIcon;
/// <summary>
/// locTitle control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locTitle;
/// <summary> /// <summary>
/// allocateAddresses control. /// allocateAddresses control.
/// </summary> /// </summary>

View file

@ -5,23 +5,8 @@
<%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %> <%@ Register Src="UserControls/Menu.ascx" TagName="Menu" TagPrefix="wsp" %>
<%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %> <%@ Register Src="UserControls/Breadcrumb.ascx" TagName="Breadcrumb" TagPrefix="wsp" %>
<div id="VpsContainer">
<div class="Module">
<div class="Header">
<wsp:Breadcrumb id="breadcrumb" runat="server" />
</div>
<div class="Left">
<wsp:Menu id="menu" runat="server" SelectedItem="vdc_audit_log" />
</div>
<div class="Content"> <div class="Content">
<div class="Center"> <div class="Center">
<div class="Title">
<asp:Image ID="imgIcon" SkinID="AuditLog48" runat="server" />
<asp:Localize ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="Audit Log"></asp:Localize>
</div>
<div class="FormBody"> <div class="FormBody">
<wsp:AuditLogControl id="auditLog" runat="server" LogSource="VPS2012" /> <wsp:AuditLogControl id="auditLog" runat="server" LogSource="VPS2012" />
@ -29,6 +14,3 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</div>

View file

@ -12,42 +12,6 @@ namespace WebsitePanel.Portal.VPS2012 {
public partial class VdcAuditLog { public partial class VdcAuditLog {
/// <summary>
/// breadcrumb control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb;
/// <summary>
/// menu control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu;
/// <summary>
/// imgIcon 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.Image imgIcon;
/// <summary>
/// locTitle control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locTitle;
/// <summary> /// <summary>
/// auditLog control. /// auditLog control.
/// </summary> /// </summary>

View file

@ -11,23 +11,8 @@
<wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/> <wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/>
<div id="VpsContainer">
<div class="Module">
<div class="Header">
<wsp:Breadcrumb id="breadcrumb" runat="server" />
</div>
<div class="Left">
<wsp:Menu id="menu" runat="server" SelectedItem="" />
</div>
<div class="Content"> <div class="Content">
<div class="Center"> <div class="Center">
<div class="Title">
<asp:Image ID="imgIcon" SkinID="AddServer48" runat="server" />
<asp:Localize ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="Create New VPS"></asp:Localize>
</div>
<div class="FormBody"> <div class="FormBody">
<wsp:SimpleMessageBox id="messageBox" runat="server" /> <wsp:SimpleMessageBox id="messageBox" runat="server" />
@ -576,5 +561,3 @@
</div> </div>
</div> </div>
</div>
</div>

View file

@ -21,42 +21,6 @@ namespace WebsitePanel.Portal.VPS2012 {
/// </remarks> /// </remarks>
protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks;
/// <summary>
/// breadcrumb control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb;
/// <summary>
/// menu control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu;
/// <summary>
/// imgIcon 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.Image imgIcon;
/// <summary>
/// locTitle control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locTitle;
/// <summary> /// <summary>
/// messageBox control. /// messageBox control.
/// </summary> /// </summary>

View file

@ -6,23 +6,8 @@
<%@ Register Src="../UserControls/PackageIPAddresses.ascx" TagName="PackageIPAddresses" TagPrefix="wsp" %> <%@ Register Src="../UserControls/PackageIPAddresses.ascx" TagName="PackageIPAddresses" TagPrefix="wsp" %>
<div id="VpsContainer">
<div class="Module">
<div class="Header">
<wsp:Breadcrumb id="breadcrumb" runat="server" />
</div>
<div class="Left">
<wsp:Menu id="menu" runat="server" SelectedItem="vdc_external_network" />
</div>
<div class="Content"> <div class="Content">
<div class="Center"> <div class="Center">
<div class="Title">
<asp:Image ID="Image1" SkinID="Network48" runat="server" />
<asp:Localize ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="External Network"></asp:Localize>
</div>
<div class="FormBody"> <div class="FormBody">
@ -56,6 +41,3 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</div>

View file

@ -12,42 +12,6 @@ namespace WebsitePanel.Portal.VPS2012 {
public partial class VdcExternalNetwork { public partial class VdcExternalNetwork {
/// <summary>
/// breadcrumb control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb;
/// <summary>
/// menu control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu;
/// <summary>
/// Image1 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.Image Image1;
/// <summary>
/// locTitle control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locTitle;
/// <summary> /// <summary>
/// packageAddresses control. /// packageAddresses control.
/// </summary> /// </summary>

View file

@ -6,29 +6,15 @@
<%@ Register Src="../UserControls/CollapsiblePanel.ascx" TagName="CollapsiblePanel" TagPrefix="wsp" %> <%@ Register Src="../UserControls/CollapsiblePanel.ascx" TagName="CollapsiblePanel" TagPrefix="wsp" %>
<%@ Register Src="../UserControls/SearchBox.ascx" TagName="SearchBox" TagPrefix="wsp" %> <%@ Register Src="../UserControls/SearchBox.ascx" TagName="SearchBox" TagPrefix="wsp" %>
<div id="VpsContainer">
<div class="Module">
<div class="Header">
<wsp:Breadcrumb id="breadcrumb" runat="server" />
</div>
<div class="Left">
<wsp:Menu id="menu" runat="server" SelectedItem="" />
</div>
<div class="Content"> <div class="Content">
<div class="Center"> <div class="Center">
<div class="Title">
<asp:Image ID="imgIcon" SkinID="Servers48" runat="server" />
<asp:Localize ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="Virtual Private Servers"></asp:Localize>
</div>
<div class="FormBody"> <div class="FormBody">
<wsp:SimpleMessageBox id="messageBox" runat="server" /> <wsp:SimpleMessageBox id="messageBox" runat="server" />
<div class="FormButtonsBarClean"> <div class="FormButtonsBar">
<div class="FormButtonsBarCleanLeft"> <div class="Left">
<asp:Button ID="btnCreate" runat="server" meta:resourcekey="btnCreate" <asp:Button ID="btnCreate" runat="server" meta:resourcekey="btnCreate"
Text="Create VPS" CssClass="Button1" CausesValidation="False" Text="Create VPS" CssClass="Button1" CausesValidation="False"
onclick="btnCreate_Click" /> onclick="btnCreate_Click" />
@ -36,7 +22,7 @@
Text="Import VPS" CssClass="Button1" CausesValidation="False" Text="Import VPS" CssClass="Button1" CausesValidation="False"
onclick="btnImport_Click" /> onclick="btnImport_Click" />
</div> </div>
<div class="FormButtonsBarCleanRight"> <div class="Right">
<wsp:SearchBox ID="searchBox" runat="server" /> <wsp:SearchBox ID="searchBox" runat="server" />
</div> </div>
</div> </div>
@ -49,7 +35,7 @@
<asp:TemplateField HeaderText="gvServersName" SortExpression="ItemName" meta:resourcekey="gvServersName"> <asp:TemplateField HeaderText="gvServersName" SortExpression="ItemName" meta:resourcekey="gvServersName">
<ItemStyle></ItemStyle> <ItemStyle></ItemStyle>
<ItemTemplate> <ItemTemplate>
<asp:Image runat="server" SkinID="Vps16" /> <asp:Image runat="server" SkinID="Vps2012_16" />
<asp:hyperlink id="lnk1" runat="server" <asp:hyperlink id="lnk1" runat="server"
NavigateUrl='<%# GetServerEditUrl(Eval("ItemID").ToString()) %>'> NavigateUrl='<%# GetServerEditUrl(Eval("ItemID").ToString()) %>'>
<%# Eval("ItemName") %> <%# Eval("ItemName") %>
@ -81,7 +67,7 @@
</asp:TemplateField> </asp:TemplateField>
<asp:TemplateField> <asp:TemplateField>
<ItemTemplate> <ItemTemplate>
<asp:ImageButton ID="cmdDelete" runat="server" Text="Delete" SkinID="VpsDelete" <asp:ImageButton ID="cmdDelete" runat="server" Text="Delete" SkinID="VpsDelete2012"
CommandName="DeleteItem" CommandArgument='<%# Eval("ItemID") %>' CommandName="DeleteItem" CommandArgument='<%# Eval("ItemID") %>'
meta:resourcekey="cmdDelete"></asp:ImageButton> meta:resourcekey="cmdDelete"></asp:ImageButton>
</ItemTemplate> </ItemTemplate>
@ -140,5 +126,3 @@
</div> </div>
</div> </div>
</div>
</div>

View file

@ -12,42 +12,6 @@ namespace WebsitePanel.Portal.VPS2012 {
public partial class VdcHome { public partial class VdcHome {
/// <summary>
/// breadcrumb control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb;
/// <summary>
/// menu control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu;
/// <summary>
/// imgIcon 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.Image imgIcon;
/// <summary>
/// locTitle control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locTitle;
/// <summary> /// <summary>
/// messageBox control. /// messageBox control.
/// </summary> /// </summary>

View file

@ -11,23 +11,8 @@
<wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/> <wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/>
<div id="VpsContainer">
<div class="Module">
<div class="Header">
<wsp:Breadcrumb id="breadcrumb" runat="server" />
</div>
<div class="Left">
<wsp:Menu id="menu" runat="server" SelectedItem="" />
</div>
<div class="Content"> <div class="Content">
<div class="Center"> <div class="Center">
<div class="Title">
<asp:Image ID="imgIcon" SkinID="AddServer48" runat="server" />
<asp:Localize ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="Import VPS"></asp:Localize>
</div>
<div class="FormBody"> <div class="FormBody">
<wsp:SimpleMessageBox id="messageBox" runat="server" /> <wsp:SimpleMessageBox id="messageBox" runat="server" />
@ -284,5 +269,3 @@
</div> </div>
</div> </div>
</div>
</div>

View file

@ -21,42 +21,6 @@ namespace WebsitePanel.Portal.VPS2012 {
/// </remarks> /// </remarks>
protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks;
/// <summary>
/// breadcrumb control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb;
/// <summary>
/// menu control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu;
/// <summary>
/// imgIcon 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.Image imgIcon;
/// <summary>
/// locTitle control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locTitle;
/// <summary> /// <summary>
/// messageBox control. /// messageBox control.
/// </summary> /// </summary>

View file

@ -4,36 +4,15 @@
<%@ Register Src="../UserControls/PackageIPAddresses.ascx" TagName="PackageIPAddresses" TagPrefix="wsp" %> <%@ Register Src="../UserControls/PackageIPAddresses.ascx" TagName="PackageIPAddresses" TagPrefix="wsp" %>
<div id="VpsContainer">
<div class="Module">
<div class="Header">
<wsp:Breadcrumb id="breadcrumb" runat="server" />
</div>
<div class="Left">
<wsp:Menu id="menu" runat="server" SelectedItem="vdc_management_network" />
</div>
<div class="Content"> <div class="Content">
<div class="Center"> <div class="Center">
<div class="Title">
<asp:Image ID="imgIcon" SkinID="Network48" runat="server" />
<asp:Localize ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="Management Network"></asp:Localize>
</div>
<div class="FormBody"> <div class="FormBody">
<wsp:PackageIPAddresses id="packageAddresses" runat="server" <wsp:PackageIPAddresses id="packageAddresses" runat="server"
Pool="VpsManagementNetwork" Pool="VpsManagementNetwork"
EditItemControl="vps_general" EditItemControl="vps_general"
SpaceHomeControl="vdc_management_network" SpaceHomeControl="vdc_management_network"
AllocateAddressesControl="" AllocateAddressesControl=""
ManageAllowed="true" /> ManageAllowed="true" />
</div> </div>
</div> </div>
</div> </div>
</div>
</div>

View file

@ -12,42 +12,6 @@ namespace WebsitePanel.Portal.VPS2012 {
public partial class VdcManagementNetwork { public partial class VdcManagementNetwork {
/// <summary>
/// breadcrumb control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb;
/// <summary>
/// menu control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu;
/// <summary>
/// imgIcon 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.Image imgIcon;
/// <summary>
/// locTitle control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locTitle;
/// <summary> /// <summary>
/// packageAddresses control. /// packageAddresses control.
/// </summary> /// </summary>

View file

@ -7,23 +7,8 @@
<wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/> <wsp:EnableAsyncTasksSupport id="asyncTasks" runat="server"/>
<div id="VpsContainer">
<div class="Module">
<div class="Header">
<wsp:Breadcrumb id="breadcrumb" runat="server" />
</div>
<div class="Left">
<wsp:Menu id="menu" runat="server" SelectedItem="vdc_permissions" />
</div>
<div class="Content"> <div class="Content">
<div class="Center"> <div class="Center">
<div class="Title">
<asp:Image ID="imgIcon" SkinID="Server48" runat="server" />
<asp:Localize ID="locTitle" runat="server" meta:resourcekey="locTitle" Text="User Permissions"></asp:Localize>
</div>
<div class="FormBody"> <div class="FormBody">
<wsp:SimpleMessageBox id="messageBox" runat="server" /> <wsp:SimpleMessageBox id="messageBox" runat="server" />
@ -116,6 +101,3 @@
</div> </div>
</div> </div>
</div> </div>
</div>
</div>

View file

@ -21,42 +21,6 @@ namespace WebsitePanel.Portal.VPS2012 {
/// </remarks> /// </remarks>
protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks; protected global::WebsitePanel.Portal.EnableAsyncTasksSupport asyncTasks;
/// <summary>
/// breadcrumb control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.VPS2012.UserControls.Breadcrumb breadcrumb;
/// <summary>
/// menu control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::WebsitePanel.Portal.VPS2012.UserControls.Menu menu;
/// <summary>
/// imgIcon 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.Image imgIcon;
/// <summary>
/// locTitle control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locTitle;
/// <summary> /// <summary>
/// messageBox control. /// messageBox control.
/// </summary> /// </summary>

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