webdav portal password change page added

This commit is contained in:
vfedosevich 2015-04-10 02:07:19 -07:00
parent dd15673752
commit 4bae47e17f
35 changed files with 2010 additions and 93 deletions

View file

@ -33,6 +33,7 @@ using System.Collections.Specialized;
using System.Data;
using System.Net.Mail;
using System.Text;
using System.Threading.Tasks;
using WebsitePanel.EnterpriseServer.Code.HostedSolution;
using WebsitePanel.EnterpriseServer.Code.SharePoint;
using WebsitePanel.EnterpriseServer.Extensions;
@ -1699,7 +1700,62 @@ namespace WebsitePanel.EnterpriseServer
public static OrganizationPasswordSettings GetOrganizationPasswordSettings(int itemId)
{
return GetOrganizationSettings<OrganizationPasswordSettings>(itemId, OrganizationSettings.PasswordSettings);
var passwordSettings = GetOrganizationSettings<OrganizationPasswordSettings>(itemId, OrganizationSettings.PasswordSettings);
if (passwordSettings == null)
{
Organization org = GetOrganization(itemId);
if (org == null)
{
throw new Exception(string.Format("Organization not found (ItemId = {0})", itemId));
}
var package = PackageController.GetPackage(org.PackageId);
UserSettings userSettings = UserController.GetUserSettings(package.UserId, UserSettings.EXCHANGE_POLICY);
if (userSettings != null)
{
string policyValue = userSettings["MailboxPasswordPolicy"];
if (policyValue != null)
{
string[] parts = policyValue.Split(';');
passwordSettings = new OrganizationPasswordSettings
{
MinimumLength = Utils.ParseInt(parts[1], 0),
MaximumLength = Utils.ParseInt(parts[2], 0),
UppercaseLettersCount = Utils.ParseInt(parts[3], 0),
NumbersCount = Utils.ParseInt(parts[4], 0),
SymbolsCount = Utils.ParseInt(parts[5], 0),
AccountLockoutThreshold = Utils.ParseInt(parts[7], 0),
EnforcePasswordHistory = Utils.ParseInt(parts[8], 0),
AccountLockoutDuration = Utils.ParseInt(parts[9], 0),
ResetAccountLockoutCounterAfter = Utils.ParseInt(parts[10], 0),
LockoutSettingsEnabled = Utils.ParseBool(parts[11], false),
PasswordComplexityEnabled = Utils.ParseBool(parts[12], true),
};
PasswordPolicyResult passwordPolicy = GetPasswordPolicy(itemId);
if (passwordPolicy.IsSuccess)
{
passwordSettings.MinimumLength = passwordPolicy.Value.MinLength;
if (passwordPolicy.Value.IsComplexityEnable)
{
passwordSettings.NumbersCount = 1;
passwordSettings.SymbolsCount = 1;
passwordSettings.UppercaseLettersCount = 1;
}
}
}
}
}
return passwordSettings;
}
public static void UpdateOrganizationGeneralSettings(int itemId, OrganizationGeneralSettings settings)
@ -2740,6 +2796,9 @@ namespace WebsitePanel.EnterpriseServer
// place log record
TaskManager.StartTask("ORGANIZATION", "SET_USER_PASSWORD", itemId);
TaskManager.Write("ItemId: {0}", itemId.ToString());
TaskManager.Write("AccountId: {0}", accountId.ToString());
try
{
// load organization

View file

@ -14,5 +14,6 @@ namespace WebsitePanel.WebDav.Core.Interfaces.Security
WspPrincipal LogIn(string login, string password);
void CreateAuthenticationTicket(WspPrincipal principal);
void LogOut();
bool ValidateAuthenticationData(string login, string password);
}
}

View file

@ -26,14 +26,7 @@ namespace WebsitePanel.WebDav.Core.Security.Authentication
public WspPrincipal LogIn(string login, string password)
{
if (string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password))
{
return null;
}
var user = UserPrincipal.FindByIdentity(_principalContext, IdentityType.UserPrincipalName, login);
if (user == null || _principalContext.ValidateCredentials(login, password) == false)
if (ValidateAuthenticationData(login, password) == false)
{
return null;
}
@ -83,5 +76,22 @@ namespace WebsitePanel.WebDav.Core.Security.Authentication
{
FormsAuthentication.SignOut();
}
public bool ValidateAuthenticationData(string login, string password)
{
if (string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password))
{
return false;
}
var user = UserPrincipal.FindByIdentity(_principalContext, IdentityType.UserPrincipalName, login);
if (user == null || _principalContext.ValidateCredentials(login, password) == false)
{
return false;
}
return true;
}
}
}

View file

@ -17,7 +17,8 @@ namespace WebsitePanel.WebDavPortal
bundles.Add(jQueryBundle);
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
"~/Scripts/jquery.validate*"));
"~/Scripts/jquery.validate*",
"~/Scripts/appScripts/validation/passwordeditor.unobtrusive.js"));
// Use the development version of Modernizr to develop with and learn from. Then, when you're
// ready for production, use the build tool at http://modernizr.com to pick only the tests you need.

View file

@ -12,6 +12,18 @@ namespace WebsitePanel.WebDavPortal
#region Account
routes.MapRoute(
name: AccountRouteNames.UserProfile,
url: "account/profile",
defaults: new { controller = "Account", action = "UserProfile" }
);
routes.MapRoute(
name: AccountRouteNames.PasswordChange,
url: "account/profile/password-change",
defaults: new { controller = "Account", action = "PasswordChange" }
);
routes.MapRoute(
name: AccountRouteNames.Logout,
url: "account/logout",

View file

@ -9,5 +9,8 @@ namespace WebsitePanel.WebDavPortal.UI.Routes
{
public const string Logout = "AccountLogout";
public const string Login = "AccountLogin";
public const string UserProfile = "UserProfileRoute";
public const string PasswordChange = "PasswordChangeRoute";
}
}

View file

@ -1,6 +1,6 @@
namespace WebsitePanel.WebDavPortal.Constants
{
public class Formtas
public class Formats
{
public const string DateFormatWithTime = "MM/dd/yyyy hh:mm tt";
}

View file

@ -231,6 +231,23 @@ tr.selected-file {
}
.navbar-fixed-top #user-profile {
font-size: 18px;
text-decoration: none;
}
.navbar-fixed-top #user-profile:hover {
text-decoration: none;
}
.user-profile .password-information {
padding-top: 7px;
}
.user-profile .login-name {
padding-top: 7px;
}
.web-dav-folder-progress {
margin-bottom: 0px;
}

View file

@ -2,11 +2,16 @@
using System.Net;
using System.Web.Mvc;
using System.Web.Routing;
using AutoMapper;
using WebsitePanel.Providers.HostedSolution;
using WebsitePanel.WebDav.Core.Config;
using WebsitePanel.WebDav.Core.Security.Authentication;
using WebsitePanel.WebDav.Core.Security.Cryptography;
using WebsitePanel.WebDavPortal.CustomAttributes;
using WebsitePanel.WebDavPortal.Models;
using WebsitePanel.WebDavPortal.Models.Account;
using WebsitePanel.WebDavPortal.Models.Common;
using WebsitePanel.WebDavPortal.Models.Common.EditorTemplates;
using WebsitePanel.WebDavPortal.Models.Common.Enums;
using WebsitePanel.WebDavPortal.UI.Routes;
using WebsitePanel.WebDav.Core.Interfaces.Security;
@ -14,7 +19,7 @@ using WebsitePanel.WebDav.Core;
namespace WebsitePanel.WebDavPortal.Controllers
{
[AllowAnonymous]
[LdapAuthorization]
public class AccountController : Controller
{
private readonly ICryptography _cryptography;
@ -27,6 +32,8 @@ namespace WebsitePanel.WebDavPortal.Controllers
}
[HttpGet]
[AllowAnonymous]
public ActionResult Login()
{
if (WspContext.User != null && WspContext.User.Identity.IsAuthenticated)
@ -38,6 +45,7 @@ namespace WebsitePanel.WebDavPortal.Controllers
}
[HttpPost]
[AllowAnonymous]
public ActionResult Login(AccountModel model)
{
var user = _authenticationService.LogIn(model.Login, model.Password);
@ -63,5 +71,114 @@ namespace WebsitePanel.WebDavPortal.Controllers
return RedirectToRoute(AccountRouteNames.Login);
}
[HttpGet]
public ActionResult UserProfile()
{
var model = GetUserProfileModel(WspContext.User.ItemId, WspContext.User.AccountId);
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UserProfile(UserProfile model)
{
if (!ModelState.IsValid)
{
return View(model);
}
int result = UpdateUserProfile(WspContext.User.ItemId, WspContext.User.AccountId, model);
model.AddMessage(MessageType.Success, Resources.UI.UserProfileSuccessfullyUpdated);
return View(model);
}
[HttpGet]
public ActionResult PasswordChange()
{
var model = new PasswordChangeModel();
model.PasswordEditor.Settings = WspContext.Services.Organizations.GetOrganizationPasswordSettings(WspContext.User.ItemId);
return View(model);
}
[HttpPost]
public ActionResult PasswordChange(PasswordChangeModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
if (_authenticationService.ValidateAuthenticationData(WspContext.User.Login, model.OldPassword) == false)
{
model.AddMessage(MessageType.Error, Resources.Messages.OldPasswordIsNotCorrect);
return View(model);
}
WspContext.Services.Organizations.SetUserPassword(
WspContext.User.ItemId, WspContext.User.AccountId,
model.PasswordEditor.NewPassword);
return RedirectToRoute(AccountRouteNames.UserProfile);
}
#region Helpers
private UserProfile GetUserProfileModel(int itemId, int accountId)
{
var user = WspContext.Services.Organizations.GetUserGeneralSettings(itemId, accountId);
return Mapper.Map<OrganizationUser, UserProfile>(user);
}
private int UpdateUserProfile(int itemId, int accountId, UserProfile model)
{
var user = WspContext.Services.Organizations.GetUserGeneralSettings(itemId, accountId);
return WspContext.Services.Organizations.SetUserGeneralSettings(
itemId, accountId,
model.DisplayName,
string.Empty,
false,
user.Disabled,
user.Locked,
model.FirstName,
model.Initials,
model.LastName,
model.Address,
model.City,
model.State,
model.Zip,
model.Country,
user.JobTitle,
user.Company,
user.Department,
user.Office,
user.Manager == null ? null : user.Manager.AccountName,
model.BusinessPhone,
model.Fax,
model.HomePhone,
model.MobilePhone,
model.Pager,
model.WebPage,
model.Notes,
model.ExternalEmail,
user.SubscriberNumber,
user.LevelId,
user.IsVIP,
user.UserMustChangePassword);
}
#endregion
}
}

View file

@ -0,0 +1,124 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc;
using WebsitePanel.Providers.HostedSolution;
using WebsitePanel.WebDav.Core;
namespace WebsitePanel.WebDavPortal.CustomAttributes
{
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class OrganizationPasswordPolicyAttribute : ValidationAttribute, IClientValidatable
{
public OrganizationPasswordSettings Settings { get; private set; }
public OrganizationPasswordPolicyAttribute()
{
Settings = WspContext.Services.Organizations.GetOrganizationPasswordSettings(WspContext.User.ItemId);
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value != null && WspContext.User != null)
{
var resultMessages = new List<string>();
if (Settings != null)
{
var valueString = value.ToString();
if (valueString.Length < Settings.MinimumLength)
{
resultMessages.Add(string.Format(Resources.Messages.PasswordMinLengthFormat,
Settings.MinimumLength));
}
if (valueString.Length > Settings.MaximumLength)
{
resultMessages.Add(string.Format(Resources.Messages.PasswordMaxLengthFormat,
Settings.MaximumLength));
}
if (Settings.PasswordComplexityEnabled)
{
var symbolsCount = valueString.Count(Char.IsSymbol);
var numbersCount = valueString.Count(Char.IsDigit);
var upperLetterCount = valueString.Count(Char.IsUpper);
if (upperLetterCount < Settings.UppercaseLettersCount)
{
resultMessages.Add(string.Format(Resources.Messages.PasswordUppercaseCountFormat,
Settings.UppercaseLettersCount));
}
if (numbersCount < Settings.NumbersCount)
{
resultMessages.Add(string.Format(Resources.Messages.PasswordNumbersCountFormat,
Settings.NumbersCount));
}
if (symbolsCount < Settings.SymbolsCount)
{
resultMessages.Add(string.Format(Resources.Messages.PasswordSymbolsCountFormat,
Settings.SymbolsCount));
}
}
}
return resultMessages.Any()? new ValidationResult(string.Join("<br>", resultMessages)) : ValidationResult.Success;
}
return ValidationResult.Success;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule();
rule.ErrorMessage = string.Format(Resources.Messages.PasswordMinLengthFormat, Settings.MinimumLength);
rule.ValidationParameters.Add("count", Settings.MinimumLength);
rule.ValidationType = "minimumlength";
yield return rule;
rule = new ModelClientValidationRule();
rule.ErrorMessage = string.Format(Resources.Messages.PasswordMaxLengthFormat, Settings.MaximumLength);
rule.ValidationParameters.Add("count", Settings.MaximumLength);
rule.ValidationType = "maximumlength";
yield return rule;
if (Settings.PasswordComplexityEnabled)
{
rule = new ModelClientValidationRule();
rule.ErrorMessage = string.Format(Resources.Messages.PasswordUppercaseCountFormat, Settings.UppercaseLettersCount);
rule.ValidationParameters.Add("count", Settings.UppercaseLettersCount);
rule.ValidationType = "uppercasecount";
yield return rule;
rule = new ModelClientValidationRule();
rule.ErrorMessage = string.Format(Resources.Messages.PasswordNumbersCountFormat, Settings.NumbersCount);
rule.ValidationParameters.Add("count", Settings.NumbersCount);
rule.ValidationType = "numberscount";
yield return rule;
rule = new ModelClientValidationRule();
rule.ErrorMessage = string.Format(Resources.Messages.PasswordSymbolsCountFormat, Settings.SymbolsCount);
rule.ValidationParameters.Add("count", Settings.SymbolsCount);
rule.ValidationType = "symbolscount";
yield return rule;
}
}
}
}

View file

@ -0,0 +1,21 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
namespace WebsitePanel.WebDavPortal.CustomAttributes
{
public class PhoneNumberAttribute : RegularExpressionAttribute, IClientValidatable
{
public const string PhonePattern = @"^\+?(\d[\d-. ]+)?(\([\d-. ]+\))?[\d-. ]+\d$";
public PhoneNumberAttribute()
: base(PhonePattern)
{
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRegexRule(FormatErrorMessage(metadata.GetDisplayName()), Pattern);
}
}
}

View file

@ -15,6 +15,7 @@ using WebsitePanel.WebDav.Core.Security.Authentication.Principals;
using WebsitePanel.WebDav.Core.Security.Cryptography;
using WebsitePanel.WebDavPortal.App_Start;
using WebsitePanel.WebDavPortal.Controllers;
using WebsitePanel.WebDavPortal.CustomAttributes;
using WebsitePanel.WebDavPortal.DependencyInjection;
using WebsitePanel.WebDavPortal.HttpHandlers;
using WebsitePanel.WebDavPortal.Mapping;
@ -39,6 +40,10 @@ namespace WebsitePanel.WebDavPortal
Mapper.AssertConfigurationIsValid();
log4net.Config.XmlConfigurator.Configure();
DataAnnotationsModelValidatorProvider.RegisterAdapter(
typeof(PhoneNumberAttribute),
typeof(RegularExpressionAttributeAdapter));
}
protected void Application_Error(object sender, EventArgs e)

View file

@ -1,4 +1,5 @@
using AutoMapper;
using WebsitePanel.WebDavPortal.Mapping.Profiles.Account;
using WebsitePanel.WebDavPortal.Mapping.Profiles.Webdav;
namespace WebsitePanel.WebDavPortal.Mapping
@ -10,6 +11,7 @@ namespace WebsitePanel.WebDavPortal.Mapping
Mapper.Initialize(
config =>
{
config.AddProfile<UserProfileProfile>();
config.AddProfile<ResourceTableItemProfile>();
});
}

View file

@ -0,0 +1,67 @@
using System;
using System.IO;
using AutoMapper;
using WebsitePanel.Providers.HostedSolution;
using WebsitePanel.WebDav.Core.Client;
using WebsitePanel.WebDav.Core.Config;
using WebsitePanel.WebDav.Core.Extensions;
using WebsitePanel.WebDavPortal.Constants;
using WebsitePanel.WebDavPortal.FileOperations;
using WebsitePanel.WebDavPortal.Models.Account;
using WebsitePanel.WebDavPortal.Models.FileSystem;
namespace WebsitePanel.WebDavPortal.Mapping.Profiles.Account
{
public class UserProfileProfile : Profile
{
/// <summary>
/// Gets the name of the profile.
/// </summary>
/// <value>
/// The name of the profile.
/// </value>
public override string ProfileName
{
get
{
return this.GetType().Name;
}
}
/// <summary>
/// Override this method in a derived class and call the CreateMap method to associate that map with this profile.
/// Avoid calling the <see cref="T:AutoMapper.Mapper" /> class from this method.
/// </summary>
protected override void Configure()
{
Mapper.CreateMap<OrganizationUser, UserProfile>()
.ForMember(ti => ti.PrimaryEmailAddress, x => x.MapFrom(hi => hi.PrimaryEmailAddress))
.ForMember(ti => ti.DisplayName, x => x.MapFrom(hi => hi.DisplayName))
.ForMember(ti => ti.DisplayName, x => x.MapFrom(hi => hi.DisplayName))
.ForMember(ti => ti.AccountName, x => x.MapFrom(hi => hi.AccountName))
.ForMember(ti => ti.FirstName, x => x.MapFrom(hi => hi.FirstName))
.ForMember(ti => ti.Initials, x => x.MapFrom(hi => hi.Initials))
.ForMember(ti => ti.LastName, x => x.MapFrom(hi => hi.LastName))
.ForMember(ti => ti.JobTitle, x => x.MapFrom(hi => hi.JobTitle))
.ForMember(ti => ti.Company, x => x.MapFrom(hi => hi.Company))
.ForMember(ti => ti.Department, x => x.MapFrom(hi => hi.Department))
.ForMember(ti => ti.Office, x => x.MapFrom(hi => hi.Office))
.ForMember(ti => ti.BusinessPhone, x => x.MapFrom(hi => hi.BusinessPhone))
.ForMember(ti => ti.Fax, x => x.MapFrom(hi => hi.Fax))
.ForMember(ti => ti.HomePhone, x => x.MapFrom(hi => hi.HomePhone))
.ForMember(ti => ti.MobilePhone, x => x.MapFrom(hi => hi.MobilePhone))
.ForMember(ti => ti.Pager, x => x.MapFrom(hi => hi.Pager))
.ForMember(ti => ti.WebPage, x => x.MapFrom(hi => hi.WebPage))
.ForMember(ti => ti.Address, x => x.MapFrom(hi => hi.Address))
.ForMember(ti => ti.City, x => x.MapFrom(hi => hi.City))
.ForMember(ti => ti.State, x => x.MapFrom(hi => hi.State))
.ForMember(ti => ti.Zip, x => x.MapFrom(hi => hi.Zip))
.ForMember(ti => ti.Country, x => x.MapFrom(hi => hi.Country))
.ForMember(ti => ti.Notes, x => x.MapFrom(hi => hi.Notes))
.ForMember(ti => ti.PasswordExpirationDateTime, x => x.MapFrom(hi => hi.PasswordExpirationDateTime))
.ForMember(ti => ti.ExternalEmail, x => x.MapFrom(hi => hi.ExternalEmail))
.ForMember(ti => ti.Messages, x => x.Ignore());
}
}
}

View file

@ -44,12 +44,16 @@ namespace WebsitePanel.WebDavPortal.Mapping.Profiles.Webdav
.ForMember(ti => ti.IconHref, x => x.MapFrom(hi => hi.ItemType == ItemType.Folder ? WebDavAppConfigManager.Instance.FileIcons.FolderPath.Trim('~') : WebDavAppConfigManager.Instance.FileIcons[Path.GetExtension(hi.DisplayName.Trim('/'))].Trim('~')))
.ForMember(ti => ti.IsTargetBlank, x => x.MapFrom(hi => openerManager.GetIsTargetBlank(hi)))
.ForMember(ti => ti.LastModified, x => x.MapFrom(hi => hi.LastModified))
.ForMember(ti => ti.LastModifiedFormated, x => x.MapFrom(hi => hi.LastModified == DateTime.MinValue ? "--" : (new WebDavResource(null, hi)).LastModified.ToString(Formtas.DateFormatWithTime)))
.ForMember(ti => ti.LastModifiedFormated, x => x.MapFrom(hi => hi.LastModified == DateTime.MinValue ? "--" : (new WebDavResource(null, hi)).LastModified.ToString(Formats.DateFormatWithTime)))
.ForMember(ti => ti.Summary, x => x.MapFrom(hi => hi.Summary))
.ForMember(ti => ti.IsRoot, x => x.MapFrom(hi => hi.IsRootItem))
.ForMember(ti => ti.Size, x => x.MapFrom(hi => hi.ContentLength))
.ForMember(ti => ti.Quota, x => x.MapFrom(hi => hi.AllocatedSpace))
.ForMember(ti => ti.Url, x => x.Ignore())
.ForMember(ti => ti.FolderUrlAbsoluteString, x => x.Ignore())
.ForMember(ti => ti.FolderUrlLocalString, x => x.Ignore())
.ForMember(ti => ti.FolderName, x => x.Ignore())
.ForMember(ti => ti.IsFolder, x => x.MapFrom(hi => hi.ItemType == ItemType.Folder));
}
}

View file

@ -0,0 +1,23 @@
using System.ComponentModel.DataAnnotations;
using WebsitePanel.Providers.HostedSolution;
using WebsitePanel.WebDavPortal.Models.Common;
using WebsitePanel.WebDavPortal.Models.Common.EditorTemplates;
namespace WebsitePanel.WebDavPortal.Models.Account
{
public class PasswordChangeModel : BaseModel
{
[Display(ResourceType = typeof (Resources.UI), Name = "OldPassword")]
[Required(ErrorMessageResourceType = typeof (Resources.Messages), ErrorMessageResourceName = "Required")]
public string OldPassword { get; set; }
[UIHint("PasswordEditor")]
public PasswordEditor PasswordEditor { get; set; }
public PasswordChangeModel()
{
PasswordEditor = new PasswordEditor();
}
}
}

View file

@ -0,0 +1,62 @@
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Security.AccessControl;
using WebsitePanel.WebDavPortal.CustomAttributes;
using WebsitePanel.WebDavPortal.Models.Common;
namespace WebsitePanel.WebDavPortal.Models.Account
{
public class UserProfile : BaseModel
{
[Display(ResourceType = typeof(Resources.UI), Name = "PrimaryEmail")]
[Required(ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "Required")]
[EmailAddress(ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "EmailInvalid", ErrorMessage = null)]
public string PrimaryEmailAddress { get; set; }
[Display(ResourceType = typeof(Resources.UI), Name = "DisplayName")]
[Required(ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "Required")]
public string DisplayName { get; set; }
public string AccountName { get; set; }
public string FirstName { get; set; }
public string Initials { get; set; }
public string LastName { get; set; }
public string JobTitle { get; set; }
public string Company { get; set; }
public string Department { get; set; }
public string Office { get; set; }
[PhoneNumber(ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "PhoneNumberInvalid")]
public string BusinessPhone { get; set; }
[PhoneNumber(ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "PhoneNumberInvalid")]
public string Fax { get; set; }
[PhoneNumber(ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "PhoneNumberInvalid")]
public string HomePhone { get; set; }
[Display(ResourceType = typeof(Resources.UI), Name = "MobilePhone")]
[Required(ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "Required")]
[PhoneNumber(ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "PhoneNumberInvalid")]
public string MobilePhone { get; set; }
[PhoneNumber(ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "PhoneNumberInvalid")]
public string Pager { get; set; }
[Url(ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "UrlInvalid", ErrorMessage = null)]
public string WebPage { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
[EmailAddress(ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "EmailInvalid", ErrorMessage = null)]
public string ExternalEmail { get; set; }
[UIHint("CountrySelector")]
public string Country { get; set; }
public string Notes { get; set; }
public DateTime PasswordExpirationDateTime { get; set; }
}
}

View file

@ -17,7 +17,7 @@ namespace WebsitePanel.WebDavPortal.Models.Common
{
Messages.Add(new Message
{
Type =type,
Type = type,
Value = value
});
}

View file

@ -0,0 +1,22 @@
using System.ComponentModel.DataAnnotations;
using WebsitePanel.Providers.HostedSolution;
using WebsitePanel.WebDavPortal.CustomAttributes;
namespace WebsitePanel.WebDavPortal.Models.Common.EditorTemplates
{
public class PasswordEditor
{
[Display(ResourceType = typeof(Resources.UI), Name = "NewPassword")]
[Required(ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "Required")]
[OrganizationPasswordPolicy]
public string NewPassword { get; set; }
[Display(ResourceType = typeof(Resources.UI), Name = "NewPasswordConfirmation")]
[Required(ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "Required")]
[Compare("NewPassword", ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "PasswordDoesntMatch")]
public string NewPasswordConfirmation { get; set; }
public OrganizationPasswordSettings Settings { get; set; }
}
}

View file

@ -0,0 +1,162 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.33440
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace WebsitePanel.WebDavPortal.Resources {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
public class Messages {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Messages() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WebsitePanel.WebDavPortal.Resources.Messages", typeof(Messages).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to Email is invalid.
/// </summary>
public static string EmailInvalid {
get {
return ResourceManager.GetString("EmailInvalid", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Old password is not correct.
/// </summary>
public static string OldPasswordIsNotCorrect {
get {
return ResourceManager.GetString("OldPasswordIsNotCorrect", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The password and confirmation password do not match..
/// </summary>
public static string PasswordDoesntMatch {
get {
return ResourceManager.GetString("PasswordDoesntMatch", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Password should be maximum {0} characters.
/// </summary>
public static string PasswordMaxLengthFormat {
get {
return ResourceManager.GetString("PasswordMaxLengthFormat", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Password should be at least {0} characters.
/// </summary>
public static string PasswordMinLengthFormat {
get {
return ResourceManager.GetString("PasswordMinLengthFormat", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Password should contain at least {0} numbers.
/// </summary>
public static string PasswordNumbersCountFormat {
get {
return ResourceManager.GetString("PasswordNumbersCountFormat", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Password should contain at least {0} non-alphanumeric symbols.
/// </summary>
public static string PasswordSymbolsCountFormat {
get {
return ResourceManager.GetString("PasswordSymbolsCountFormat", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Password should contain at least {0} UPPERCASE characters.
/// </summary>
public static string PasswordUppercaseCountFormat {
get {
return ResourceManager.GetString("PasswordUppercaseCountFormat", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Phone number is invalid.
/// </summary>
public static string PhoneNumberInvalid {
get {
return ResourceManager.GetString("PhoneNumberInvalid", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to {0} field is required.
/// </summary>
public static string Required {
get {
return ResourceManager.GetString("Required", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Url is invalid.
/// </summary>
public static string UrlInvalid {
get {
return ResourceManager.GetString("UrlInvalid", resourceCulture);
}
}
}
}

View file

@ -0,0 +1,153 @@
<?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="EmailInvalid" xml:space="preserve">
<value>Email is invalid</value>
</data>
<data name="OldPasswordIsNotCorrect" xml:space="preserve">
<value>Old password is not correct</value>
</data>
<data name="PasswordDoesntMatch" xml:space="preserve">
<value>The password and confirmation password do not match.</value>
</data>
<data name="PasswordMaxLengthFormat" xml:space="preserve">
<value>Password should be maximum {0} characters</value>
</data>
<data name="PasswordMinLengthFormat" xml:space="preserve">
<value>Password should be at least {0} characters</value>
</data>
<data name="PasswordNumbersCountFormat" xml:space="preserve">
<value>Password should contain at least {0} numbers</value>
</data>
<data name="PasswordSymbolsCountFormat" xml:space="preserve">
<value>Password should contain at least {0} non-alphanumeric symbols</value>
</data>
<data name="PasswordUppercaseCountFormat" xml:space="preserve">
<value>Password should contain at least {0} UPPERCASE characters</value>
</data>
<data name="PhoneNumberInvalid" xml:space="preserve">
<value>Phone number is invalid</value>
</data>
<data name="Required" xml:space="preserve">
<value>{0} field is required</value>
</data>
<data name="UrlInvalid" xml:space="preserve">
<value>Url is invalid</value>
</data>
</root>

View file

@ -69,6 +69,42 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Address.
/// </summary>
public static string Address {
get {
return ResourceManager.GetString("Address", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Address Inforamtion.
/// </summary>
public static string AddressInforamtion {
get {
return ResourceManager.GetString("AddressInforamtion", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Back.
/// </summary>
public static string Back {
get {
return ResourceManager.GetString("Back", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Business Phone.
/// </summary>
public static string BusinessPhone {
get {
return ResourceManager.GetString("BusinessPhone", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Byte.
/// </summary>
@ -105,6 +141,24 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Change password.
/// </summary>
public static string ChangePassword {
get {
return ResourceManager.GetString("ChangePassword", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to City.
/// </summary>
public static string City {
get {
return ResourceManager.GetString("City", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Close.
/// </summary>
@ -114,6 +168,15 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Company Information.
/// </summary>
public static string CompanyInformation {
get {
return ResourceManager.GetString("CompanyInformation", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Confirm.
/// </summary>
@ -123,6 +186,24 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Contact Information.
/// </summary>
public static string ContactInformation {
get {
return ResourceManager.GetString("ContactInformation", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Country/Region.
/// </summary>
public static string Country {
get {
return ResourceManager.GetString("Country", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Create.
/// </summary>
@ -168,6 +249,24 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Display Name.
/// </summary>
public static string DisplayName {
get {
return ResourceManager.GetString("DisplayName", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Email.
/// </summary>
public static string Email {
get {
return ResourceManager.GetString("Email", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Please enter file name.
/// </summary>
@ -204,6 +303,24 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to External Email.
/// </summary>
public static string ExternalEmail {
get {
return ResourceManager.GetString("ExternalEmail", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Fax.
/// </summary>
public static string Fax {
get {
return ResourceManager.GetString("Fax", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to File.
/// </summary>
@ -231,6 +348,24 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to First Name.
/// </summary>
public static string FirstName {
get {
return ResourceManager.GetString("FirstName", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to General Information.
/// </summary>
public static string GeneralInformation {
get {
return ResourceManager.GetString("GeneralInformation", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Gb.
/// </summary>
@ -240,6 +375,24 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Here.
/// </summary>
public static string Here {
get {
return ResourceManager.GetString("Here", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Home Phone.
/// </summary>
public static string HomePhone {
get {
return ResourceManager.GetString("HomePhone", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Info.
/// </summary>
@ -249,6 +402,15 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Initials.
/// </summary>
public static string Initials {
get {
return ResourceManager.GetString("Initials", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to File already exist.
/// </summary>
@ -267,6 +429,15 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Job Title.
/// </summary>
public static string JobTitle {
get {
return ResourceManager.GetString("JobTitle", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to KB.
/// </summary>
@ -276,6 +447,33 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Last Name.
/// </summary>
public static string LastName {
get {
return ResourceManager.GetString("LastName", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Login name.
/// </summary>
public static string LoginName {
get {
return ResourceManager.GetString("LoginName", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Log out.
/// </summary>
public static string LogOut {
get {
return ResourceManager.GetString("LogOut", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to MB.
/// </summary>
@ -285,6 +483,15 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Mobile Phone.
/// </summary>
public static string MobilePhone {
get {
return ResourceManager.GetString("MobilePhone", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Modified.
/// </summary>
@ -303,6 +510,24 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to New password.
/// </summary>
public static string NewPassword {
get {
return ResourceManager.GetString("NewPassword", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Confirm password.
/// </summary>
public static string NewPasswordConfirmation {
get {
return ResourceManager.GetString("NewPasswordConfirmation", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to No files are selected..
/// </summary>
@ -321,6 +546,24 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Notes.
/// </summary>
public static string Notes {
get {
return ResourceManager.GetString("Notes", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Old password.
/// </summary>
public static string OldPassword {
get {
return ResourceManager.GetString("OldPassword", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to or drag and drop files here..
/// </summary>
@ -330,6 +573,33 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Pager.
/// </summary>
public static string Pager {
get {
return ResourceManager.GetString("Pager", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Password.
/// </summary>
public static string Password {
get {
return ResourceManager.GetString("Password", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Will expire on {0}. If you want to change password then please click {1}..
/// </summary>
public static string PasswordExpirationFormat {
get {
return ResourceManager.GetString("PasswordExpirationFormat", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to PB.
/// </summary>
@ -357,6 +627,15 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Primary Email.
/// </summary>
public static string PrimaryEmail {
get {
return ResourceManager.GetString("PrimaryEmail", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Processing.
/// </summary>
@ -375,6 +654,24 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Profile.
/// </summary>
public static string Profile {
get {
return ResourceManager.GetString("Profile", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Save Changes.
/// </summary>
public static string SaveChanges {
get {
return ResourceManager.GetString("SaveChanges", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Search.
/// </summary>
@ -402,6 +699,15 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Select.
/// </summary>
public static string Select {
get {
return ResourceManager.GetString("Select", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Select files to upload.
/// </summary>
@ -420,6 +726,15 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to State/Province.
/// </summary>
public static string State {
get {
return ResourceManager.GetString("State", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Table.
/// </summary>
@ -456,6 +771,24 @@ namespace WebsitePanel.WebDavPortal.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to User profile successfully updated.
/// </summary>
public static string UserProfileSuccessfullyUpdated {
get {
return ResourceManager.GetString("UserProfileSuccessfullyUpdated", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Web Page.
/// </summary>
public static string WebPage {
get {
return ResourceManager.GetString("WebPage", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Word document.
/// </summary>
@ -473,5 +806,14 @@ namespace WebsitePanel.WebDavPortal.Resources {
return ResourceManager.GetString("Yes", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Zip/Postal Code.
/// </summary>
public static string Zip {
get {
return ResourceManager.GetString("Zip", resourceCulture);
}
}
}
}

View file

@ -120,6 +120,18 @@
<data name="Actions" xml:space="preserve">
<value>Actions</value>
</data>
<data name="Address" xml:space="preserve">
<value>Address</value>
</data>
<data name="AddressInforamtion" xml:space="preserve">
<value>Address Inforamtion</value>
</data>
<data name="Back" xml:space="preserve">
<value>Back</value>
</data>
<data name="BusinessPhone" xml:space="preserve">
<value>Business Phone</value>
</data>
<data name="Byte" xml:space="preserve">
<value>Byte</value>
</data>
@ -132,12 +144,27 @@
<data name="CancelAll" xml:space="preserve">
<value>Cancel All</value>
</data>
<data name="ChangePassword" xml:space="preserve">
<value>Change password</value>
</data>
<data name="City" xml:space="preserve">
<value>City</value>
</data>
<data name="Close" xml:space="preserve">
<value>Close</value>
</data>
<data name="CompanyInformation" xml:space="preserve">
<value>Company Information</value>
</data>
<data name="Confirm" xml:space="preserve">
<value>Confirm</value>
</data>
<data name="ContactInformation" xml:space="preserve">
<value>Contact Information</value>
</data>
<data name="Country" xml:space="preserve">
<value>Country/Region</value>
</data>
<data name="Create" xml:space="preserve">
<value>Create</value>
</data>
@ -153,6 +180,12 @@
<data name="DialogsContentConfrimFileDeletion" xml:space="preserve">
<value>Are you sure you want to delete {0} item(s)?</value>
</data>
<data name="DisplayName" xml:space="preserve">
<value>Display Name</value>
</data>
<data name="Email" xml:space="preserve">
<value>Email</value>
</data>
<data name="EnterFileName" xml:space="preserve">
<value>Please enter file name</value>
</data>
@ -165,6 +198,12 @@
<data name="ExcelWorkbook" xml:space="preserve">
<value>Excel workbook</value>
</data>
<data name="ExternalEmail" xml:space="preserve">
<value>External Email</value>
</data>
<data name="Fax" xml:space="preserve">
<value>Fax</value>
</data>
<data name="File" xml:space="preserve">
<value>File</value>
</data>
@ -174,39 +213,90 @@
<data name="FileUpload" xml:space="preserve">
<value>File Upload</value>
</data>
<data name="FirstName" xml:space="preserve">
<value>First Name</value>
</data>
<data name="GeneralInformation" xml:space="preserve">
<value>General Information</value>
</data>
<data name="GigabyteShort" xml:space="preserve">
<value>Gb</value>
</data>
<data name="Here" xml:space="preserve">
<value>Here</value>
</data>
<data name="HomePhone" xml:space="preserve">
<value>Home Phone</value>
</data>
<data name="Info" xml:space="preserve">
<value>Info</value>
</data>
<data name="Initials" xml:space="preserve">
<value>Initials</value>
</data>
<data name="ItemExist" xml:space="preserve">
<value>File already exist</value>
</data>
<data name="ItemsWasRemovedFormat" xml:space="preserve">
<value>{0} items was removed.</value>
</data>
<data name="JobTitle" xml:space="preserve">
<value>Job Title</value>
</data>
<data name="KilobyteShort" xml:space="preserve">
<value>KB</value>
</data>
<data name="LastName" xml:space="preserve">
<value>Last Name</value>
</data>
<data name="LoginName" xml:space="preserve">
<value>Login name</value>
</data>
<data name="LogOut" xml:space="preserve">
<value>Log out</value>
</data>
<data name="MegabyteShort" xml:space="preserve">
<value>MB</value>
</data>
<data name="MobilePhone" xml:space="preserve">
<value>Mobile Phone</value>
</data>
<data name="Modified" xml:space="preserve">
<value>Modified</value>
</data>
<data name="Name" xml:space="preserve">
<value>Name</value>
</data>
<data name="NewPassword" xml:space="preserve">
<value>New password</value>
</data>
<data name="NewPasswordConfirmation" xml:space="preserve">
<value>Confirm password</value>
</data>
<data name="NoFilesAreSelected" xml:space="preserve">
<value>No files are selected.</value>
</data>
<data name="NotAFile" xml:space="preserve">
<value>Not a file.</value>
</data>
<data name="Notes" xml:space="preserve">
<value>Notes</value>
</data>
<data name="OldPassword" xml:space="preserve">
<value>Old password</value>
</data>
<data name="OrDragAndDropFilesHere" xml:space="preserve">
<value>or drag and drop files here.</value>
</data>
<data name="Pager" xml:space="preserve">
<value>Pager</value>
</data>
<data name="Password" xml:space="preserve">
<value>Password</value>
</data>
<data name="PasswordExpirationFormat" xml:space="preserve">
<value>Will expire on {0}. If you want to change password then please click {1}.</value>
</data>
<data name="PetabyteShort" xml:space="preserve">
<value>PB</value>
</data>
@ -216,12 +306,21 @@
<data name="PowerPointPresentation" xml:space="preserve">
<value>Powerpoint presentation</value>
</data>
<data name="PrimaryEmail" xml:space="preserve">
<value>Primary Email</value>
</data>
<data name="Processing" xml:space="preserve">
<value>Processing</value>
</data>
<data name="ProcessingWithDots" xml:space="preserve">
<value>Processing...</value>
</data>
<data name="Profile" xml:space="preserve">
<value>Profile</value>
</data>
<data name="SaveChanges" xml:space="preserve">
<value>Save Changes</value>
</data>
<data name="Search" xml:space="preserve">
<value>Search</value>
</data>
@ -231,12 +330,18 @@
<data name="SearchResults" xml:space="preserve">
<value>Search Results</value>
</data>
<data name="Select" xml:space="preserve">
<value>Select</value>
</data>
<data name="SelectFilesToUpload" xml:space="preserve">
<value>Select files to upload</value>
</data>
<data name="Size" xml:space="preserve">
<value>Size</value>
</data>
<data name="State" xml:space="preserve">
<value>State/Province</value>
</data>
<data name="Table" xml:space="preserve">
<value>Table</value>
</data>
@ -249,10 +354,19 @@
<data name="Upload" xml:space="preserve">
<value>Upload</value>
</data>
<data name="UserProfileSuccessfullyUpdated" xml:space="preserve">
<value>User profile successfully updated</value>
</data>
<data name="WebPage" xml:space="preserve">
<value>Web Page</value>
</data>
<data name="WordDocument" xml:space="preserve">
<value>Word document</value>
</data>
<data name="Yes" xml:space="preserve">
<value>Yes</value>
</data>
<data name="Zip" xml:space="preserve">
<value>Zip/Postal Code</value>
</data>
</root>

View file

@ -0,0 +1,54 @@
/// <reference path="jquery.validate.js" />
/// <reference path="jquery.validate.unobtrusive.js" />
$.validator.unobtrusive.adapters.addSingleVal("minimumlength", "count");
$.validator.addMethod("minimumlength", function (value, element, count) {
if (value.length < count) {
return false;
}
return true;
});
$.validator.unobtrusive.adapters.addSingleVal("maximumlength", "count");
$.validator.addMethod("maximumlength", function (value, element, count) {
if (value.length > count) {
return false;
}
return true;
});
$.validator.unobtrusive.adapters.addSingleVal("uppercasecount", "count");
$.validator.addMethod("uppercasecount", function (value, element, count) {
if (value.replace(/[^A-Z]/g, "").length < count) {
return false;
}
return true;
});
$.validator.unobtrusive.adapters.addSingleVal("numberscount", "count");
$.validator.addMethod("numberscount", function (value, element, count) {
if (value.replace(/[^0-9]/g, "").length < count) {
return false;
}
return true;
});
$.validator.unobtrusive.adapters.addSingleVal("symbolscount", "count");
$.validator.addMethod("symbolscount", function (value, element, count) {
if (value.replace(/[a-zA-Z0-9_]/g, "").length < count) {
return false;
}
return true;
});

View file

@ -10,25 +10,11 @@ $(document).on('click', '.processing-dialog', function (e) {
});
$(document).ready(function() {
$(document).ready(function () {
//bootstrap jquery validate styles fix
$.validator.setDefaults({
highlight: function(element) {
$(element).closest('.form-group').addClass('has-error');
},
unhighlight: function(element) {
$(element).closest('.form-group').removeClass('has-error');
},
errorElement: 'span',
errorClass: 'help-block',
errorPlacement: function(error, element) {
if (element.parent('.input-group').length) {
error.insertAfter(element.parent());
} else {
error.insertAfter(element);
}
}
});
BindBootstrapValidationStyles();
$.validator.addMethod("synchronousRemote", function(value, element, param) {
if (this.optional(element)) {
@ -86,6 +72,60 @@ $(document).ready(function() {
}, "Please fix this field.");
});
function BindBootstrapValidationStyles() {
$.validator.setDefaults({
highlight: function (element) {
$(element).closest('.form-group').addClass('has-error');
},
unhighlight: function (element) {
$(element).closest('.form-group').removeClass('has-error');
},
errorElement: 'span',
errorClass: 'help-block',
errorPlacement: function (error, element) {
if (element.parent('.input-group').length) {
error.insertAfter(element.parent());
} else {
error.insertAfter(element);
}
}
});
$('.bs-val-styles').each(function () {
var form = $(this);
var formData = $.data(form[0]);
if (formData && formData.validator) {
var settings = formData.validator.settings;
// Store existing event handlers in local variables
var oldErrorPlacement = settings.errorPlacement;
var oldSuccess = settings.success;
settings.errorPlacement = function (label, element) {
oldErrorPlacement(label, element);
element.closest('.form-group').addClass('has-error');
label.addClass('text-danger');
};
settings.success = function (label, element) {
$(element).closest('.form-group').removeClass('has-error');
oldSuccess(label);
}
}
});
$('.input-validation-error').each(function () {
$(this).closest('.form-group').addClass('has-error');
});
$('.field-validation-error').each(function () {
$(this).addClass('text-danger');
});
}
$.fn.clearValidation = function () { var v = $(this).validate(); $('[name]', this).each(function () { v.successList.push(this); v.showErrors(); }); v.resetForm(); v.reset(); $(this).find('.form-group').removeClass('has-error'); };

View file

@ -0,0 +1,31 @@
@using WebsitePanel.WebDavPortal.Resources
@using WebsitePanel.WebDavPortal.UI.Routes
@model WebsitePanel.WebDavPortal.Models.Account.PasswordChangeModel
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div class="container row">
@using (Html.BeginRouteForm(AccountRouteNames.PasswordChange, FormMethod.Post, new { @class = "form-horizontal user-password-change bs-val-styles col-lg-10 col-lg-offset-3", id = "user-password-change" }))
{
<div class="form-group">
<h3>@UI.ChangePassword</h3>
</div>
<div class="form-group">
<label for="@Html.IdFor(x => x.OldPassword)" class="col-sm-2 control-label">@UI.OldPassword</label>
<div class="col-sm-10">
@Html.PasswordFor(x => x.OldPassword, new { @class = "form-control", placeholder = UI.OldPassword })
@Html.ValidationMessageFor(x => x.OldPassword)
</div>
</div>
@Html.EditorFor(x=>x.PasswordEditor)
<div class="form-group">
<div class="col-sm-offset-4 col-sm-10">
<button type="submit" class="btn btn-default">@UI.ChangePassword</button>
</div>
</div>
}
</div>

View file

@ -0,0 +1,212 @@
@using WebsitePanel.WebDavPortal.Constants
@using WebsitePanel.WebDavPortal.Resources
@using WebsitePanel.WebDavPortal.UI.Routes
@model WebsitePanel.WebDavPortal.Models.Account.UserProfile
@{
Layout = "~/Views/Shared/_Layout.cshtml";
var passwordExpriationText = string.Format(UI.PasswordExpirationFormat, Model.PasswordExpirationDateTime.ToString(Formats.DateFormatWithTime), Html.RouteLink(UI.Here.ToLowerInvariant(), AccountRouteNames.PasswordChange));
}
<div class="container row">
@using (Html.BeginRouteForm(AccountRouteNames.UserProfile, FormMethod.Post, new { @class = "form-horizontal user-profile bs-val-styles", id = "user-profile-form" }))
{
@Html.HiddenFor(x => x.PasswordExpirationDateTime)
@Html.HiddenFor(x => x.PrimaryEmailAddress)
@Html.AntiForgeryToken()
<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="heading-general-information">
<h4 class="panel-title">
<a data-toggle="collapse" href="#general-information" aria-expanded="true" aria-controls="general-information">
@UI.GeneralInformation
</a>
</h4>
</div>
<div id="general-information" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="heading-general-information">
<div class="panel-body">
<div class="form-group">
<label for="@Html.IdFor(x=>x.PrimaryEmailAddress)" class="col-sm-2 control-label">@UI.LoginName</label>
<div class="col-sm-10 login-name">
<label>@Html.Raw(Model.PrimaryEmailAddress)</label>
</div>
</div>
<div class="form-group">
<label for="@Html.IdFor(x=>x.DisplayName)" class="col-sm-2 control-label">@UI.DisplayName</label>
<div class="col-sm-10">
@Html.TextBoxFor(x => x.DisplayName, new { @class = "form-control", placeholder = UI.DisplayName })
</div>
</div>
<div class="form-group">
<label for="@Html.IdFor(x=>x.FirstName)" class="col-sm-2 control-label">@UI.FirstName</label>
<div class="col-sm-10">
@Html.TextBoxFor(x => x.FirstName, new { @class = "form-control", placeholder = UI.FirstName })
</div>
</div>
<div class="form-group">
<label for="@Html.IdFor(x => x.Initials)" class="col-sm-2 control-label">@UI.Initials</label>
<div class="col-sm-10">
@Html.TextBoxFor(x => x.Initials, new { @class = "form-control", placeholder = UI.Initials })
</div>
</div>
<div class="form-group">
<label for="@Html.IdFor(x => x.LastName)" class="col-sm-2 control-label">@UI.LastName</label>
<div class="col-sm-10">
@Html.TextBoxFor(x => x.LastName, new { @class = "form-control", placeholder = UI.LastName })
</div>
</div>
<div class="form-group">
<label for="@Html.IdFor(x => x.Notes)" class="col-sm-2 control-label">@UI.Notes</label>
<div class="col-sm-10">
@Html.TextAreaFor(x => x.Notes, new { @class = "form-control", placeholder = UI.Notes })
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">@UI.Password</label>
<div class="col-sm-10 password-information">
<label>@Html.Raw(passwordExpriationText)</label>
</div>
</div>
<div class="form-group">
<label for="@Html.IdFor(x=>x.ExternalEmail)" class="col-sm-2 control-label">@UI.ExternalEmail</label>
<div class="col-sm-10">
@Html.TextBoxFor(x => x.ExternalEmail, new { @class = "form-control", placeholder = UI.ExternalEmail })
</div>
</div>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="heading-contact-information">
<h4 class="panel-title">
<a class="collapsed" data-toggle="collapse" href="#contact-information" aria-expanded="false" aria-controls="contact-information">
@UI.ContactInformation
</a>
</h4>
</div>
<div id="contact-information" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading-contact-information">
<div class="panel-body">
<div class="form-group">
<label for="@Html.IdFor(x => x.BusinessPhone)" class="col-sm-2 control-label">@UI.BusinessPhone</label>
<div class="col-sm-10">
@Html.TextBoxFor(x => x.BusinessPhone, new { @class = "form-control", placeholder = UI.BusinessPhone })
</div>
</div>
<div class="form-group">
<label for="@Html.IdFor(x => x.Fax)" class="col-sm-2 control-label">@UI.Fax</label>
<div class="col-sm-10">
@Html.TextBoxFor(x => x.Fax, new { @class = "form-control", placeholder = UI.Fax })
</div>
</div>
<div class="form-group">
<label for="@Html.IdFor(x => x.HomePhone)" class="col-sm-2 control-label">@UI.HomePhone</label>
<div class="col-sm-10">
@Html.TextBoxFor(x => x.HomePhone, new { @class = "form-control", placeholder = UI.HomePhone })
</div>
</div>
<div class="form-group">
<label for="@Html.IdFor(x => x.MobilePhone)" class="col-sm-2 control-label">@UI.MobilePhone</label>
<div class="col-sm-10">
@Html.TextBoxFor(x => x.MobilePhone, new { @class = "form-control", placeholder = UI.MobilePhone })
</div>
</div>
<div class="form-group">
<label for="@Html.IdFor(x => x.Pager)" class="col-sm-2 control-label">@UI.Pager</label>
<div class="col-sm-10">
@Html.TextBoxFor(x => x.Pager, new { @class = "form-control", placeholder = UI.Pager })
</div>
</div>
<div class="form-group">
<label for="@Html.IdFor(x => x.WebPage)" class="col-sm-2 control-label">@UI.WebPage</label>
<div class="col-sm-10">
@Html.TextBoxFor(x => x.WebPage, new { @class = "form-control", placeholder = UI.WebPage })
</div>
</div>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="heading-address-information">
<h4 class="panel-title">
<a class="collapsed" data-toggle="collapse" href="#address-information" aria-expanded="false" aria-controls="address-information">
@UI.AddressInforamtion
</a>
</h4>
</div>
<div id="address-information" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading-address-information">
<div class="panel-body">
<div class="form-group">
<label for="@Html.IdFor(x => x.Address)" class="col-sm-2 control-label">@UI.Address</label>
<div class="col-sm-10">
@Html.TextBoxFor(x => x.Address, new { @class = "form-control", placeholder = UI.Address })
</div>
</div>
<div class="form-group">
<label for="@Html.IdFor(x => x.City)" class="col-sm-2 control-label">@UI.City</label>
<div class="col-sm-10">
@Html.TextBoxFor(x => x.City, new { @class = "form-control", placeholder = UI.City })
</div>
</div>
<div class="form-group">
<label for="@Html.IdFor(x => x.State)" class="col-sm-2 control-label">@UI.State</label>
<div class="col-sm-10">
@Html.TextBoxFor(x => x.State, new { @class = "form-control", placeholder = UI.State })
</div>
</div>
<div class="form-group">
<label for="@Html.IdFor(x => x.Zip)" class="col-sm-2 control-label">@UI.Zip</label>
<div class="col-sm-10">
@Html.TextBoxFor(x => x.Zip, new { @class = "form-control", placeholder = UI.Zip })
</div>
</div>
<div class="form-group">
<label for="@Html.IdFor(x => x.Country)" class="col-sm-2 control-label">@UI.Country</label>
<div class="col-sm-10">
@Html.EditorFor(x => x.Country)
</div>
</div>
</div>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-12">
<button type="submit" class="btn btn-default pull-right">@UI.SaveChanges</button>
</div>
</div>
}
</div>
@section scripts{
<script>
$(document).ready(function () {
var validator = $("#user-profile-form").data('validator');
validator.settings.ignore = "";
});
</script>
}

View file

@ -0,0 +1,264 @@
@using WebsitePanel.WebDavPortal.Resources
@model string
@{
List<SelectListItem> listItems = new List<SelectListItem>
{
new SelectListItem {Text = "Afghanistan", Value = "AF"},
new SelectListItem {Text = "Aland Islands", Value = "AX"},
new SelectListItem {Text = "Algeria", Value = "DZ"},
new SelectListItem {Text = "American Samoa", Value = "AS"},
new SelectListItem {Text = "Andorra", Value = "AD"},
new SelectListItem {Text = "Angola", Value = "AO"},
new SelectListItem {Text = "Anguilla", Value = "AI"},
new SelectListItem {Text = "Antarctica", Value = "AQ"},
new SelectListItem {Text = "Antigua and Barbuda", Value = "AG"},
new SelectListItem {Text = "Argentina", Value = "AR"},
new SelectListItem {Text = "Armenia", Value = "AM"},
new SelectListItem {Text = "Aruba", Value = "AW"},
new SelectListItem {Text = "Australia", Value = "AU"},
};
var selectedItem = listItems.FirstOrDefault(x => x.Value == Model);
if (selectedItem != null)
{
selectedItem.Selected = true;
}
@*<asp:listitem value="AT">Austria</asp:listitem>
<asp:listitem value="AZ">Azerbaijan</asp:listitem>
<asp:listitem value="BS">Bahamas</asp:listitem>
<asp:listitem value="BH">Bahrain</asp:listitem>
<asp:listitem value="BD">Bangladesh</asp:listitem>
<asp:listitem value="BB">Barbados</asp:listitem>
<asp:listitem value="BY">Belarus</asp:listitem>
<asp:listitem value="BE">Belgium</asp:listitem>
<asp:listitem value="BZ">Belize</asp:listitem>
<asp:listitem value="BJ">Benin</asp:listitem>
<asp:listitem value="BM">Bermuda</asp:listitem>
<asp:listitem value="BT">Bhutan</asp:listitem>
<asp:listitem value="BO">Bolivia, Plurinational State of</asp:listitem>
<asp:listitem value="BA">Bosnia and Herzegovina</asp:listitem>
<asp:listitem value="BW">Botswana</asp:listitem>
<asp:listitem value="BV">Bouvet Island</asp:listitem>
<asp:listitem value="BR">Brazil</asp:listitem>
<asp:listitem value="IO">British Indian Ocean Territory</asp:listitem>
<asp:listitem value="BN">Brunei Darussalam</asp:listitem>
<asp:listitem value="BG">Bulgaria</asp:listitem>
<asp:listitem value="BF">Burkina Faso</asp:listitem>
<asp:listitem value="BI">Burundi</asp:listitem>
<asp:listitem value="KH">Cambodia</asp:listitem>
<asp:listitem value="CM">Cameroon</asp:listitem>
<asp:listitem value="CA">Canada</asp:listitem>
<asp:listitem value="CV">Cape Verde</asp:listitem>
<asp:listitem value="KY">Cayman Islands</asp:listitem>
<asp:listitem value="CF">Central African Republic</asp:listitem>
<asp:listitem value="TD">Chad</asp:listitem>
<asp:listitem value="CL">Chile</asp:listitem>
<asp:listitem value="CN">China</asp:listitem>
<asp:listitem value="CX">Christmas Island</asp:listitem>
<asp:listitem value="CC">Cocos (Keeling) Islands</asp:listitem>
<asp:listitem value="CO">Colombia</asp:listitem>
<asp:listitem value="KM">Comoros</asp:listitem>
<asp:listitem value="CG">Congo</asp:listitem>
<asp:listitem value="CD">Congo, the Democratic Republic of the</asp:listitem>
<asp:listitem value="CK">Cook Islands</asp:listitem>
<asp:listitem value="CR">Costa Rica</asp:listitem>
<asp:listitem value="CI">Cote D'Ivoire</asp:listitem>
<asp:listitem value="HR">Croatia</asp:listitem>
<asp:listitem value="CU">Cuba</asp:listitem>
<asp:listitem value="CY">Cyprus</asp:listitem>
<asp:listitem value="CZ">Czech Republic</asp:listitem>
<asp:listitem value="DK">Denmark</asp:listitem>
<asp:listitem value="DJ">Djibouti</asp:listitem>
<asp:listitem value="DM">Dominica</asp:listitem>
<asp:listitem value="DO">Dominican Republic</asp:listitem>
<asp:listitem value="EC">Ecuador</asp:listitem>
<asp:listitem value="EG">Egypt</asp:listitem>
<asp:listitem value="SV">El Salvador</asp:listitem>
<asp:listitem value="GQ">Equatorial Guinea</asp:listitem>
<asp:listitem value="ER">Eritrea</asp:listitem>
<asp:listitem value="EE">Estonia</asp:listitem>
<asp:listitem value="ET">Ethiopia</asp:listitem>
<asp:listitem value="FK">Falkland Islands (Malvinas)</asp:listitem>
<asp:listitem value="FO">Faroe Islands</asp:listitem>
<asp:listitem value="FJ">Fiji</asp:listitem>
<asp:listitem value="FI">Finland</asp:listitem>
<asp:listitem value="FR">France</asp:listitem>
<asp:listitem value="GF">French Guiana</asp:listitem>
<asp:listitem value="PF">French Polynesia</asp:listitem>
<asp:listitem value="TF">French Southern Territories</asp:listitem>
<asp:listitem value="GA">Gabon</asp:listitem>
<asp:listitem value="GM">Gambia</asp:listitem>
<asp:listitem value="GE">Georgia</asp:listitem>
<asp:listitem value="DE">Germany</asp:listitem>
<asp:listitem value="GH">Ghana</asp:listitem>
<asp:listitem value="GI">Gibraltar</asp:listitem>
<asp:listitem value="GR">Greece</asp:listitem>
<asp:listitem value="GL">Greenland</asp:listitem>
<asp:listitem value="GD">Grenada</asp:listitem>
<asp:listitem value="GP">Guadeloupe</asp:listitem>
<asp:listitem value="GU">Guam</asp:listitem>
<asp:listitem value="GT">Guatemala</asp:listitem>
<asp:listitem value="GG">Guernsey</asp:listitem>
<asp:listitem value="GN">Guinea</asp:listitem>
<asp:listitem value="GW">Guinea-Bissau</asp:listitem>
<asp:listitem value="GY">Guyana</asp:listitem>
<asp:listitem value="HT">Haiti</asp:listitem>
<asp:listitem value="HM">Heard Island and Mcdonald Islands</asp:listitem>
<asp:listitem value="VA">Holy See (Vatican City State)</asp:listitem>
<asp:listitem value="HN">Honduras</asp:listitem>
<asp:listitem value="HK">Hong Kong</asp:listitem>
<asp:listitem value="HU">Hungary</asp:listitem>
<asp:listitem value="IS">Iceland</asp:listitem>
<asp:listitem value="IN">India</asp:listitem>
<asp:listitem value="ID">Indonesia</asp:listitem>
<asp:listitem value="IR">Iran, Islamic Republic of</asp:listitem>
<asp:listitem value="IQ">Iraq</asp:listitem>
<asp:listitem value="IE">Ireland</asp:listitem>
<asp:listitem value="IM">Isle of Man</asp:listitem>
<asp:listitem value="IL">Israel</asp:listitem>
<asp:listitem value="IT">Italy</asp:listitem>
<asp:listitem value="JM">Jamaica</asp:listitem>
<asp:listitem value="JP">Japan</asp:listitem>
<asp:listitem value="JE">Jersey</asp:listitem>
<asp:listitem value="JO">Jordan</asp:listitem>
<asp:listitem value="KZ">Kazakhstan</asp:listitem>
<asp:listitem value="KE">Kenya</asp:listitem>
<asp:listitem value="KI">Kiribati</asp:listitem>
<asp:listitem value="KP">Korea, Democratic People's Republic of</asp:listitem>
<asp:listitem value="KR">Korea, Republic of</asp:listitem>
<asp:listitem value="KW">Kuwait</asp:listitem>
<asp:listitem value="KG">Kyrgyzstan</asp:listitem>
<asp:listitem value="LA">Lao People's Democratic Republic</asp:listitem>
<asp:listitem value="LV">Latvia</asp:listitem>
<asp:listitem value="LB">Lebanon</asp:listitem>
<asp:listitem value="LS">Lesotho</asp:listitem>
<asp:listitem value="LR">Liberia</asp:listitem>
<asp:listitem value="LY">Libyan Arab Jamahiriya</asp:listitem>
<asp:listitem value="LI">Liechtenstein</asp:listitem>
<asp:listitem value="LT">Lithuania</asp:listitem>
<asp:listitem value="LU">Luxembourg</asp:listitem>
<asp:listitem value="MO">Macao</asp:listitem>
<asp:listitem value="MK">Macedonia, the Former Yugoslav Republic of</asp:listitem>
<asp:listitem value="MG">Madagascar</asp:listitem>
<asp:listitem value="MW">Malawi</asp:listitem>
<asp:listitem value="MY">Malaysia</asp:listitem>
<asp:listitem value="MV">Maldives</asp:listitem>
<asp:listitem value="ML">Mali</asp:listitem>
<asp:listitem value="MT">Malta</asp:listitem>
<asp:listitem value="MH">Marshall Islands</asp:listitem>
<asp:listitem value="MQ">Martinique</asp:listitem>
<asp:listitem value="MR">Mauritania</asp:listitem>
<asp:listitem value="MU">Mauritius</asp:listitem>
<asp:listitem value="YT">Mayotte</asp:listitem>
<asp:listitem value="MX">Mexico</asp:listitem>
<asp:listitem value="FM">Micronesia, Federated States of</asp:listitem>
<asp:listitem value="MD">Moldova, Republic of</asp:listitem>
<asp:listitem value="MC">Monaco</asp:listitem>
<asp:listitem value="MN">Mongolia</asp:listitem>
<asp:listitem value="ME">Montenegro</asp:listitem>
<asp:listitem value="MS">Montserrat</asp:listitem>
<asp:listitem value="MA">Morocco</asp:listitem>
<asp:listitem value="MZ">Mozambique</asp:listitem>
<asp:listitem value="MM">Myanmar</asp:listitem>
<asp:listitem value="NA">Namibia</asp:listitem>
<asp:listitem value="NR">Nauru</asp:listitem>
<asp:listitem value="NP">Nepal</asp:listitem>
<asp:listitem value="NL">Netherlands</asp:listitem>
<asp:listitem value="AN">Netherlands Antilles</asp:listitem>
<asp:listitem value="NC">New Caledonia</asp:listitem>
<asp:listitem value="NZ">New Zealand</asp:listitem>
<asp:listitem value="NI">Nicaragua</asp:listitem>
<asp:listitem value="NE">Niger</asp:listitem>
<asp:listitem value="NG">Nigeria</asp:listitem>
<asp:listitem value="NU">Niue</asp:listitem>
<asp:listitem value="NF">Norfolk Island</asp:listitem>
<asp:listitem value="MP">Northern Mariana Islands</asp:listitem>
<asp:listitem value="NO">Norway</asp:listitem>
<asp:listitem value="OM">Oman</asp:listitem>
<asp:listitem value="PK">Pakistan</asp:listitem>
<asp:listitem value="PW">Palau</asp:listitem>
<asp:listitem value="PS">Palestinian Territory, Occupied</asp:listitem>
<asp:listitem value="PA">Panama</asp:listitem>
<asp:listitem value="PG">Papua New Guinea</asp:listitem>
<asp:listitem value="PY">Paraguay</asp:listitem>
<asp:listitem value="PE">Peru</asp:listitem>
<asp:listitem value="PH">Philippines</asp:listitem>
<asp:listitem value="PN">Pitcairn</asp:listitem>
<asp:listitem value="PL">Poland</asp:listitem>
<asp:listitem value="PT">Portugal</asp:listitem>
<asp:listitem value="PR">Puerto Rico</asp:listitem>
<asp:listitem value="QA">Qatar</asp:listitem>
<asp:listitem value="RE">Reunion</asp:listitem>
<asp:listitem value="RO">Romania</asp:listitem>
<asp:listitem value="RU">Russian Federation</asp:listitem>
<asp:listitem value="RW">Rwanda</asp:listitem>
<asp:listitem value="BL">Saint Barthelemy</asp:listitem>
<asp:listitem value="SH">Saint Helena</asp:listitem>
<asp:listitem value="KN">Saint Kitts and Nevis</asp:listitem>
<asp:listitem value="LC">Saint Lucia</asp:listitem>
<asp:listitem value="MF">Saint Martin</asp:listitem>
<asp:listitem value="PM">Saint Pierre and Miquelon</asp:listitem>
<asp:listitem value="VC">Saint Vincent and the Grenadines</asp:listitem>
<asp:listitem value="WS">Samoa</asp:listitem>
<asp:listitem value="SM">San Marino</asp:listitem>
<asp:listitem value="ST">Sao Tome and Principe</asp:listitem>
<asp:listitem value="SA">Saudi Arabia</asp:listitem>
<asp:listitem value="SN">Senegal</asp:listitem>
<asp:listitem value="RS">Serbia</asp:listitem>
<asp:listitem value="SC">Seychelles</asp:listitem>
<asp:listitem value="SL">Sierra Leone</asp:listitem>
<asp:listitem value="SG">Singapore</asp:listitem>
<asp:listitem value="SK">Slovakia</asp:listitem>
<asp:listitem value="SI">Slovenia</asp:listitem>
<asp:listitem value="SB">Solomon Islands</asp:listitem>
<asp:listitem value="SO">Somalia</asp:listitem>
<asp:listitem value="ZA">South Africa</asp:listitem>
<asp:listitem value="GS">South Georgia and the South Sandwich Islands</asp:listitem>
<asp:listitem value="ES">Spain</asp:listitem>
<asp:listitem value="LK">Sri Lanka</asp:listitem>
<asp:listitem value="SD">Sudan</asp:listitem>
<asp:listitem value="SR">Suriname</asp:listitem>
<asp:listitem value="SJ">Svalbard and Jan Mayen</asp:listitem>
<asp:listitem value="SZ">Swaziland</asp:listitem>
<asp:listitem value="SE">Sweden</asp:listitem>
<asp:listitem value="CH">Switzerland</asp:listitem>
<asp:listitem value="SY">Syrian Arab Republic</asp:listitem>
<asp:listitem value="TW">Taiwan, Province of China</asp:listitem>
<asp:listitem value="TJ">Tajikistan</asp:listitem>
<asp:listitem value="TZ">Tanzania, United Republic of</asp:listitem>
<asp:listitem value="TH">Thailand</asp:listitem>
<asp:listitem value="TL">Timor-Leste</asp:listitem>
<asp:listitem value="TG">Togo</asp:listitem>
<asp:listitem value="TK">Tokelau</asp:listitem>
<asp:listitem value="TO">Tonga</asp:listitem>
<asp:listitem value="TT">Trinidad and Tobago</asp:listitem>
<asp:listitem value="TN">Tunisia</asp:listitem>
<asp:listitem value="TR">Turkey</asp:listitem>
<asp:listitem value="TM">Turkmenistan</asp:listitem>
<asp:listitem value="TC">Turks and Caicos Islands</asp:listitem>
<asp:listitem value="TV">Tuvalu</asp:listitem>
<asp:listitem value="UG">Uganda</asp:listitem>
<asp:listitem value="UA">Ukraine</asp:listitem>
<asp:listitem value="AE">United Arab Emirates</asp:listitem>
<asp:listitem value="GB">United Kingdom</asp:listitem>
<asp:listitem value="US">United States</asp:listitem>
<asp:listitem value="UM">United States Minor Outlying Islands</asp:listitem>
<asp:listitem value="UY">Uruguay</asp:listitem>
<asp:listitem value="UZ">Uzbekistan</asp:listitem>
<asp:listitem value="VU">Vanuatu</asp:listitem>
<asp:listitem value="VE">Venezuela, Bolivarian Republic of</asp:listitem>
<asp:listitem value="VN">Viet Nam</asp:listitem>
<asp:listitem value="VG">Virgin Islands, British</asp:listitem>
<asp:listitem value="VI">Virgin Islands, U.S.</asp:listitem>
<asp:listitem value="WF">Wallis and Futuna</asp:listitem>
<asp:listitem value="EH">Western Sahara</asp:listitem>
<asp:listitem value="YE">Yemen</asp:listitem>
<asp:listitem value="ZM">Zambia</asp:listitem>
<asp:listitem value="ZW">Zimbabwe</asp:listitem>*@
}
@Html.DropDownListFor(model => model, listItems, @UI.Select, new { @class = "form-control" })

View file

@ -0,0 +1,22 @@
@using WebsitePanel.WebDavPortal.Resources
@model WebsitePanel.WebDavPortal.Models.Common.EditorTemplates.PasswordEditor
@{
var settings = Model.Settings;
var maxlength = settings != null ? settings.MaximumLength : 20;
}
<div class="form-group">
<label for="@Html.IdFor(x => x.NewPassword)" class="col-sm-2 control-label">@UI.NewPassword</label>
<div class="col-sm-10">
@Html.PasswordFor(x => x.NewPassword, new { @class = "form-control", placeholder = UI.NewPassword, maxlength })
@Html.Raw(HttpUtility.HtmlDecode(Html.ValidationMessageFor(m => m.NewPassword).ToHtmlString()))
</div>
</div>
<div class="form-group">
<label for="@Html.IdFor(x => x.NewPasswordConfirmation)" class="col-sm-2 control-label">@UI.NewPasswordConfirmation</label>
<div class="col-sm-10">
@Html.PasswordFor(x => x.NewPasswordConfirmation, new { @class = "form-control", placeholder = UI.NewPasswordConfirmation, maxlength })
@Html.ValidationMessageFor(x => x.NewPasswordConfirmation)
</div>
</div>

View file

@ -4,6 +4,7 @@
@using WebsitePanel.WebDav.Core.Config
@using WebsitePanel.WebDavPortal.DependencyInjection
@using WebsitePanel.WebDavPortal.Models
@using WebsitePanel.WebDavPortal.Resources
@using WebsitePanel.WebDavPortal.UI.Routes;
@model WebsitePanel.WebDavPortal.Models.Common.BaseModel
@ -26,7 +27,7 @@
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="@Url.RouteUrl(FileSystemRouteNames.ShowContentPath, new { pathPart = string.Empty })">
<a href="/">
<img class="header-logo processing-dialog" src="@Url.Content("~/Content/Images/logo.png")" />
</a>
</div>
@ -34,8 +35,8 @@
@{
if (WspContext.User != null)
{
<a id="logout" class="nav navbar-text navbar-right" href="@Url.RouteUrl(AccountRouteNames.Logout)" title="Log out"><i class="glyphicon glyphicon-log-out"></i></a>
<h4 id="username" class="nav navbar-text navbar-right">@WspContext.User.Login</h4>
<a id="logout" class="nav navbar-text navbar-right" href="@Url.RouteUrl(AccountRouteNames.Logout)" title="@UI.LogOut"><i class="glyphicon glyphicon-log-out"></i></a>
<a id="user-profile" class="nav navbar-text navbar-right" href="@Url.RouteUrl(AccountRouteNames.UserProfile)" title="@UI.Profile">@WspContext.User.Login</a>
}
}
</div>

View file

@ -165,13 +165,15 @@
<Compile Include="Configurations\ActionSelectors\OwaActionSelector.cs" />
<Compile Include="Configurations\Constraints\OrganizationRouteConstraint.cs" />
<Compile Include="Configurations\ControllerConfigurations\OwaControllerConfiguration.cs" />
<Compile Include="Constants\Formtas.cs" />
<Compile Include="Constants\Formats.cs" />
<Compile Include="Controllers\AccountController.cs" />
<Compile Include="Controllers\ErrorController.cs" />
<Compile Include="Controllers\FileSystemController.cs" />
<Compile Include="Controllers\Api\OwaController.cs" />
<Compile Include="CustomAttributes\FormValueRequiredAttribute.cs" />
<Compile Include="CustomAttributes\LdapAuthorizationAttribute.cs" />
<Compile Include="CustomAttributes\PhoneNumberAttribute.cs" />
<Compile Include="CustomAttributes\OrganizationPasswordPolicyAttribute.cs" />
<Compile Include="DependencyInjection\NinjectDependecyResolver.cs" />
<Compile Include="DependencyInjection\PortalDependencies.cs" />
<Compile Include="DependencyInjection\Providers\HttpSessionStateProvider.cs" />
@ -188,9 +190,12 @@
<Compile Include="HttpHandlers\AccessTokenHandler.cs" />
<Compile Include="HttpHandlers\FileTransferRequestHandler.cs" />
<Compile Include="Mapping\AutoMapperPortalConfiguration.cs" />
<Compile Include="Mapping\Profiles\Account\UserProfileProfile.cs" />
<Compile Include="Mapping\Profiles\Webdav\ResourceTableItemProfile.cs" />
<Compile Include="ModelBinders\DataTables\JqueryDataTableModelBinder.cs" />
<Compile Include="Models\AccountModel.cs" />
<Compile Include="Models\Account\PasswordChangeModel.cs" />
<Compile Include="Models\Account\UserProfile.cs" />
<Compile Include="Models\Common\BaseModel.cs" />
<Compile Include="Models\Common\DataTable\JqueryDataTableBaseEntity.cs" />
<Compile Include="Models\Common\DataTable\JqueryDataTablesResponse.cs" />
@ -198,6 +203,7 @@
<Compile Include="Models\Common\DataTable\JqueryDataTableOrder.cs" />
<Compile Include="Models\Common\DataTable\JqueryDataTableRequest.cs" />
<Compile Include="Models\Common\DataTable\JqueryDataTableSearch.cs" />
<Compile Include="Models\Common\EditorTemplates\PasswordEditor.cs" />
<Compile Include="Models\Common\Enums\MessageType.cs" />
<Compile Include="Models\Common\Message.cs" />
<Compile Include="Models\DirectoryIdentity.cs" />
@ -208,6 +214,11 @@
<Compile Include="Models\ModelForWebDav.cs" />
<Compile Include="Models\OfficeOnlineModel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Resources\Messages.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Messages.resx</DependentUpon>
</Compile>
<Compile Include="Resources\UI.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
@ -380,6 +391,7 @@
<Content Include="Scripts\appScripts\messages.js" />
<Content Include="Scripts\appScripts\recalculateResourseHeight.js" />
<Content Include="Scripts\appScripts\uploadingData2.js" />
<Content Include="Scripts\appScripts\validation\passwordeditor.unobtrusive.js" />
<Content Include="Scripts\appScripts\wsp-webdav.js" />
<Content Include="Scripts\appScripts\wsp.js" />
<Content Include="Scripts\bootstrap.js" />
@ -465,6 +477,10 @@
<Content Include="Views\FileSystem\_ShowContentBigIcons.cshtml" />
<Content Include="Views\FileSystem\UploadFiles.cshtml" />
<Content Include="Views\FileSystem\ShowContentSearchResultTable.cshtml" />
<Content Include="Views\Account\UserProfile.cshtml" />
<Content Include="Views\Shared\EditorTemplates\CountrySelector.cshtml" />
<Content Include="Views\Account\PasswordChange.cshtml" />
<Content Include="Views\Shared\EditorTemplates\PasswordEditor.cshtml" />
</ItemGroup>
<ItemGroup>
<Folder Include="Models\FileSystem\Enums\" />
@ -481,6 +497,10 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\Messages.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Messages.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Include="Resources\UI.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>UI.Designer.cs</LastGenOutput>

View file

@ -5716,4 +5716,7 @@
<data name="ERROR.ORANIZATIONSETTINGS_NOT_UPDATED" xml:space="preserve">
<value>Error during updating settings.</value>
</data>
<data name="Error.UNABLETOLOADPASSWORDSETTINGS" xml:space="preserve">
<value>Unable to load password settings</value>
</data>
</root>

View file

@ -129,24 +129,7 @@ namespace WebsitePanel.Portal.ExchangeServer
}
else
{
password.SetPackagePolicy(PanelSecurity.PackageId, UserSettings.EXCHANGE_POLICY, "MailboxPasswordPolicy");
PasswordPolicyResult passwordPolicy = ES.Services.Organizations.GetPasswordPolicy(PanelRequest.ItemID);
if (passwordPolicy.IsSuccess)
{
password.MinimumLength = passwordPolicy.Value.MinLength;
if (passwordPolicy.Value.IsComplexityEnable)
{
password.MinimumNumbers = 1;
password.MinimumSymbols = 1;
password.MinimumUppercase = 1;
}
}
else
{
messageBox.ShowMessage(passwordPolicy, "CREATE_ORGANIZATION_USER", "HostedOrganization");
}
messageBox.ShowErrorMessage("UNABLETOLOADPASSWORDSETTINGS");
}
}

View file

@ -82,24 +82,7 @@ namespace WebsitePanel.Portal.HostedSolution
}
else
{
password.SetPackagePolicy(PanelSecurity.PackageId, UserSettings.EXCHANGE_POLICY, "MailboxPasswordPolicy");
PasswordPolicyResult passwordPolicy = ES.Services.Organizations.GetPasswordPolicy(PanelRequest.ItemID);
if (passwordPolicy.IsSuccess)
{
password.MinimumLength = passwordPolicy.Value.MinLength;
if (passwordPolicy.Value.IsComplexityEnable)
{
password.MinimumNumbers = 1;
password.MinimumSymbols = 1;
password.MinimumUppercase = 1;
}
}
else
{
messageBox.ShowMessage(passwordPolicy, "CREATE_ORGANIZATION_USER", "HostedOrganization");
}
messageBox.ShowErrorMessage("UNABLETOLOADPASSWORDSETTINGS");
}
}

View file

@ -272,24 +272,7 @@ namespace WebsitePanel.Portal.HostedSolution
}
else
{
password.SetPackagePolicy(PanelSecurity.PackageId, UserSettings.EXCHANGE_POLICY, "MailboxPasswordPolicy");
PasswordPolicyResult passwordPolicy = ES.Services.Organizations.GetPasswordPolicy(PanelRequest.ItemID);
if (passwordPolicy.IsSuccess)
{
password.MinimumLength = passwordPolicy.Value.MinLength;
if (passwordPolicy.Value.IsComplexityEnable)
{
password.MinimumNumbers = 1;
password.MinimumSymbols = 1;
password.MinimumUppercase = 1;
}
}
else
{
messageBox.ShowMessage(passwordPolicy, "CREATE_ORGANIZATION_USER", "HostedOrganization");
}
messageBox.ShowErrorMessage("UNABLETOLOADPASSWORDSETTINGS");
}
}