Reputation: 63
I'm using passwordchanged property in passwordbox:
PasswordChanged="NewPWBox_PasswordChanged"
For detecting "real-time" change in password and update my other control which shows how much complex password is. It works just fine.
Only problem is when i mark whole text and delete it with backspace it dont detect change in string and my others control wont update.
I'm really not an frontend guy and couldn't find solution anywhere for this problem.
My function to show complexity of pasword:
private void NewPWBox_PasswordChanged(object sender, RoutedEventArgs e)
{
string NewPass = NewPWBox.Password;
PasswordScore passwordStrengthScore = PasswordAdvisor.CheckStrength(NewPass);
switch (passwordStrengthScore)
{
case PasswordScore.VeryWeak:
if(passwordStrengthScore == PasswordScore.VeryWeak)
{
VW_Grid.Visibility = Visibility.Visible;
VW_Label.Visibility = Visibility.Visible;
}
//hide others
Weak_Grid.Visibility = Visibility.Hidden;
Weak_Label.Visibility = Visibility.Hidden;
Medium_Grid.Visibility = Visibility.Hidden;
Medium_Label.Visibility = Visibility.Hidden;
Strong_Grid.Visibility = Visibility.Hidden;
Strong_Label.Visibility = Visibility.Hidden;
VS_Grid.Visibility = Visibility.Hidden;
VS_Label.Visibility = Visibility.Hidden;
break;
case PasswordScore.Weak:
if(passwordStrengthScore == PasswordScore.Weak)
{
VW_Grid.Visibility = Visibility.Visible;
VW_Label.Visibility = Visibility.Visible;
Weak_Grid.Visibility = Visibility.Visible;
Weak_Label.Visibility = Visibility.Visible;
}
//hide others
Medium_Grid.Visibility = Visibility.Hidden;
Medium_Label.Visibility = Visibility.Hidden;
Strong_Grid.Visibility = Visibility.Hidden;
Strong_Label.Visibility = Visibility.Hidden;
VS_Grid.Visibility = Visibility.Hidden;
VS_Label.Visibility = Visibility.Hidden;
break;
case PasswordScore.Medium:
if(passwordStrengthScore == PasswordScore.Medium)
{
VW_Grid.Visibility = Visibility.Visible;
VW_Label.Visibility = Visibility.Visible;
Weak_Grid.Visibility = Visibility.Visible;
Weak_Label.Visibility = Visibility.Visible;
Medium_Grid.Visibility = Visibility.Visible;
Medium_Label.Visibility = Visibility.Visible;
}
//hide others
Strong_Grid.Visibility = Visibility.Hidden;
Strong_Label.Visibility = Visibility.Hidden;
VS_Grid.Visibility = Visibility.Hidden;
VS_Label.Visibility = Visibility.Hidden;
break;
case PasswordScore.Strong:
if(passwordStrengthScore == PasswordScore.Strong)
{
VW_Grid.Visibility = Visibility.Visible;
VW_Label.Visibility = Visibility.Visible;
Weak_Grid.Visibility = Visibility.Visible;
Weak_Label.Visibility = Visibility.Visible;
Medium_Grid.Visibility = Visibility.Visible;
Medium_Label.Visibility = Visibility.Visible;
Strong_Grid.Visibility = Visibility.Visible;
Strong_Label.Visibility = Visibility.Visible;
}
//hide others
VS_Grid.Visibility = Visibility.Hidden;
VS_Label.Visibility = Visibility.Hidden;
break;
case PasswordScore.VeryStrong:
if(passwordStrengthScore == PasswordScore.VeryStrong)
{
VW_Grid.Visibility = Visibility.Visible;
VW_Label.Visibility = Visibility.Visible;
Weak_Grid.Visibility = Visibility.Visible;
Weak_Label.Visibility = Visibility.Visible;
Medium_Grid.Visibility = Visibility.Visible;
Medium_Label.Visibility = Visibility.Visible;
Strong_Grid.Visibility = Visibility.Visible;
Strong_Label.Visibility = Visibility.Visible;
VS_Grid.Visibility = Visibility.Visible;
VS_Label.Visibility = Visibility.Visible;
}
break;
}
}
Here how it counts complexity:
public enum PasswordScore
{
Blank = 0,
VeryWeak = 1,
Weak = 2,
Medium = 3,
Strong = 4,
VeryStrong = 5
}
public class PasswordAdvisor
{
public static PasswordScore CheckStrength(string password)
{
int score = 1;
if (password.Length < 1)
return PasswordScore.Blank;
if (password.Length < 4)
return PasswordScore.VeryWeak;
if (password.Length >= 8)
score++;
if (password.Length >= 12)
score++;
if (Regex.IsMatch(password, @"[0-9]+(\.[0-9][0-9]?)?", RegexOptions.ECMAScript)) //number only //"^\d+$" if you need to match more than one digit.
score++;
if (Regex.IsMatch(password, @"^(?=.*[a-z])(?=.*[A-Z]).+$", RegexOptions.ECMAScript)) //both, lower and upper case
score++;
if (Regex.IsMatch(password, @"[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]", RegexOptions.ECMAScript)) //^[A-Z]+$
score++;
return (PasswordScore)score;
}
I dont think you need it but just to be sure if i didnt miss anything.
Any ideas guys?
Thanks and best regards,
John
Upvotes: 0
Views: 158
Reputation: 949
After all chatty comments: Put a default case in your switch and hide controls in that case.
Edit: It will be nice if you cut the number of controls to one rectangle and one label and change the color (and the size if you want, or gradientbrush...) and the text of the label... And hide if empty password box.
It's so easy, clean, future proof and more decoupled with binding and validations...
Upvotes: 1