using System; using System.Text; using System.Text.RegularExpressions; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using CMS.CMSHelper; using CMS.FormControls; using CMS.GlobalHelper; using CMS.SettingsProvider; public partial class CMSModules_Membership_FormControls_Passwords_PasswordStrength : FormEngineUserControl { #region "Variables" private string mSiteName = null; private int mPreferedLength = 12; private int mPreferedNonAlphaNumChars = 2; private string mClassPrefix = "PasswordStrength"; private bool mAllowEmpty = false; private bool mShowValidationOnNewLine = false; private string mValidationGroup = string.Empty; private string mTextBoxClass = "TextBoxField"; private bool mUseStylesForStrenghtIndicator = true; private bool mShowStrengthIndicator = true; #endregion #region "Private properties" /// /// Returns current site name. /// private string SiteName { get { if (mSiteName == null) { mSiteName = CMSContext.CurrentSiteName; } return mSiteName; } } /// /// Returns whether password policy is used. /// private bool UsePasswordPolicy { get { return SettingsKeyProvider.GetBoolValue(SiteName + ".CMSUsePasswordPolicy"); } } /// /// Returns password minimal length. /// private int MinLength { get { return SettingsKeyProvider.GetIntValue(SiteName + ".CMSPolicyMinimalLength"); } } /// /// Returns number of non alpha numeric characters /// private int MinNonAlphaNumChars { get { return SettingsKeyProvider.GetIntValue(SiteName + ".CMSPolicyNumberOfNonAlphaNumChars"); } } /// /// Returns password gegular expression. /// private string RegularExpression { get { return SettingsKeyProvider.GetStringValue(SiteName + ".CMSPolicyRegularExpression"); } } #endregion #region "Public properties" /// /// Gets or sets the value that indicates whether inline styles should be used for strenght indicator /// public bool UseStylesForStrenghtIndicator { get { return mUseStylesForStrenghtIndicator; } set { mUseStylesForStrenghtIndicator = value; } } /// /// Gets or sets value of from control. /// public override object Value { get { return txtPassword.Text; } set { txtPassword.Text = ValidationHelper.GetString(value, string.Empty); } } /// /// Returns textbox client ID. /// public override string ValueElementID { get { return txtPassword.ClientID; } } /// /// Gets or sets prefered length. /// public int PreferedLength { get { return mPreferedLength; } set { mPreferedLength = value; } } /// /// Gets or sets prefered number of non alpha numeric characters. /// public int PreferedNonAlphaNumChars { get { return mPreferedNonAlphaNumChars; } set { mPreferedNonAlphaNumChars = value; } } /// /// Class prefix for labels. /// public string ClassPrefix { get { return mClassPrefix; } set { mClassPrefix = value; } } /// /// Gets or sets value of from control in string type. /// public override string Text { get { return txtPassword.Text; } set { txtPassword.Text = value; } } /// /// Gets or sets whether password could be empty. /// public bool AllowEmpty { get { return mAllowEmpty; } set { mAllowEmpty = value; } } /// /// Gets or sets whether validation control is shown under the control. /// public bool ShowValidationOnNewLine { get { return mShowValidationOnNewLine; } set { mShowValidationOnNewLine = value; } } /// /// Gets or sets validation group. /// public string ValidationGroup { get { return mValidationGroup; } set { mValidationGroup = value; } } /// /// Gets or sets class of textbox. /// public string TextBoxClass { get { return mTextBoxClass; } set { mTextBoxClass = value; } } /// /// Returns textbox attributes. /// public AttributeCollection TextBoxAttributes { get { return txtPassword.Attributes; } } /// /// Gets or sets maximal length of password. /// public int MaxLength { get { return txtPassword.MaxLength; } set { txtPassword.MaxLength = value; } } /// /// Gets or sets HTML that is displayed next to password input and indicates password as required field. /// public string RequiredFieldMark { get { return lblRequiredFieldMark.Text; } set { lblRequiredFieldMark.Text = value; } } /// /// Gets or sets whether strength indicator is shown. /// public bool ShowStrengthIndicator { get { return mShowStrengthIndicator; } set { mShowStrengthIndicator = value; } } #endregion #region "Page events" protected void Page_Load(object sender, EventArgs e) { // Set class txtPassword.CssClass = TextBoxClass; if (ShowStrengthIndicator) { string tooltipMessage = string.Empty; StringBuilder sb = new StringBuilder(); if (UsePasswordPolicy) { sb.Append(GetString("passwordstrength.notacceptable"), ";", GetString("passwordstrength.weak")); tooltipMessage = string.Format(GetString("passwordstrength.hint"), MinLength, MinNonAlphaNumChars, PreferedLength, PreferedNonAlphaNumChars); } else { sb.Append(GetString("passwordstrength.weak"), ";", GetString("passwordstrength.weak")); tooltipMessage = string.Format(GetString("passwordstrength.recommend"), PreferedLength, PreferedNonAlphaNumChars); } // Register jQuery and registration of script which shows password strength ScriptHelper.RegisterJQuery(Page); ScriptHelper.RegisterScriptFile(Page, "~/CMSScripts/membership.js"); sb.Append(";", GetString("passwordstrength.acceptable"), ";", GetString("passwordstrength.average"), ";", GetString("passwordstrength.strong"), ";", GetString("passwordstrength.excellent")); string regex = "''"; if (!string.IsNullOrEmpty(RegularExpression)) { regex = "/" + RegularExpression + "/"; } // Javascript for calling js function on keyup of textbox string txtVar = "txtSearch_" + txtPassword.ClientID; string script = txtVar + " = $j('#" + txtPassword.ClientID + @"'); if (" + txtVar + @" ) { " + txtVar + @".keyup(function(event){ ShowStrength('" + txtPassword.ClientID + "', '" + MinLength + "', '" + PreferedLength + "', '" + MinNonAlphaNumChars + "', '" + PreferedNonAlphaNumChars + "', " + regex + ", '" + lblEvaluation.ClientID + "', '" + sb.ToString() + "', '" + ClassPrefix + "', '" + UsePasswordPolicy + "', '" + pnlPasswIndicator.ClientID + "', '" + UseStylesForStrenghtIndicator + @"'); }); }"; ScriptHelper.RegisterStartupScript(this, typeof(string), "PasswordStrength_" + txtPassword.ClientID, ScriptHelper.GetScript(script)); if (UseStylesForStrenghtIndicator) { pnlPasswStrengthIndicator.Style.Add("height", "5px"); pnlPasswStrengthIndicator.Style.Add("background-color", "#dddddd"); pnlPasswIndicator.Style.Add("height", "5px"); } ScriptHelper.RegisterTooltip(Page); ScriptHelper.AppendTooltip(lblPasswStregth, tooltipMessage, "help"); } else { pnlPasswStrengthIndicator.Visible = false; lblEvaluation.Visible = false; lblPasswStregth.Visible = false; } // Set up required field validator if (AllowEmpty) { rfvPassword.Enabled = false; } else { rfvPassword.Text = GetString("general.requirespassword"); rfvPassword.ValidationGroup = ValidationGroup; if (ShowValidationOnNewLine) { rfvPassword.Text += "
"; } } } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); lblRequiredFieldMark.Visible = !String.IsNullOrEmpty(lblRequiredFieldMark.Text); } #endregion #region "Methods" /// /// Returns whether /// public override bool IsValid() { ValidationError = GetString("passwordpolicy.notaccetable"); return SecurityHelper.CheckPasswordPolicy(txtPassword.Text, SiteName); } /// /// Returns hint for user to set password which met password policy /// public string GetPasswordPolicyHint() { if (UsePasswordPolicy) { return string.Format(GetString("passwordstrength.hint"), MinLength, MinNonAlphaNumChars, PreferedLength, PreferedNonAlphaNumChars); } return string.Empty; } #endregion }