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(); 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("
", resultMessages)) : ValidationResult.Success; } return ValidationResult.Success; } public IEnumerable 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; } } } }