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
}