View Javadoc

1   package org.eparapher.core.crypto.tools;
2   
3   import java.util.regex.Pattern;
4   
5   import org.eparapher.core.EParapherManager;
6   
7   /**
8    * Password Policy Manager.
9    * Very Simple for the moment
10   * Can evolve to a scoring system such as : 
11   * http://www.geekwisdom.com/js/passwordmeter.js
12   * @author arnault
13   *
14   */
15  public class PasswordPolicyManager {
16  
17  	private static PasswordPolicyManager instance = null;
18  
19  	private final Pattern password_8chars_regexp = Pattern.compile("[A-Za-z0-9\\W]{8,}");
20  	private final Pattern one_upper_regexp       = Pattern.compile(".*[A-Z].*");
21  	private final Pattern one_lower_regexp       = Pattern.compile(".*[a-z].*");
22  	private final Pattern one_number_regexp      = Pattern.compile(".*[0-9].*");
23  	private final Pattern one_special_char       = Pattern.compile(".*\\W.*");
24  	
25  	private Pattern min_char_length_regexp;
26  	private Pattern min_upper_regexp;
27  	private Pattern min_lower_regexp;
28  	private Pattern min_number_regexp;
29  	private Pattern min_special_char;
30  	
31  	public static PasswordPolicyManager getIstance() {
32  		if (instance==null)
33  			instance = new PasswordPolicyManager();
34  		return instance;
35  	}
36  	
37  	private PasswordPolicyManager() {
38  		compileregexp();
39  	}
40  	
41  	public void compileregexp() {
42  		min_char_length_regexp = Pattern.compile("[A-Za-z0-9\\W]{"+EParapherManager.getInstance().getSettings().getSecPolMinCharLength()+",}");
43  
44  		min_upper_regexp  = Pattern.compile( regexpbuilder(".*[A-Z]",EParapherManager.getInstance().getSettings().getSecPolMinUpperChar())  );
45  		min_lower_regexp  = Pattern.compile( regexpbuilder(".*[a-z]",EParapherManager.getInstance().getSettings().getSecPolMinLowerChar())  );
46  		min_number_regexp = Pattern.compile( regexpbuilder(".*[0-9]",EParapherManager.getInstance().getSettings().getSecPolMinNumberChar()) );
47  		min_special_char  = Pattern.compile( regexpbuilder(".*\\W",  EParapherManager.getInstance().getSettings().getSecPolMinSpecialChar()));
48  	}
49  
50  	private String regexpbuilder(String singleregexp, int max) {
51  		String temp_regexp = "";
52  		for (int i = 0; i < max; i++)
53  			temp_regexp += singleregexp;
54  		return temp_regexp;
55  	}
56  
57  	public boolean isMinCharsCheck(String secret) {
58  		return min_char_length_regexp.matcher(secret).find();
59  	}
60  	public boolean isMinUpperCheck(String secret) {
61  		return min_upper_regexp.matcher(secret).find();
62  	}
63  	public boolean isMinLowerCheck(String secret) {
64  		return min_lower_regexp.matcher(secret).find();
65  	}
66  	public boolean isMinNumberCheck(String secret) {
67  		return min_number_regexp.matcher(secret).find();
68  	}
69  	public boolean isMinSpecialCheck(String secret) {
70  		return min_special_char.matcher(secret).find();
71  	}
72  	
73  	public boolean isSecPolicyValidated(String secret) {
74  		boolean returnvalue = true;
75  		if (EParapherManager.getInstance().getSettings().isSecPolCheckCharLength())
76  			if ( !isMinCharsCheck(secret) )
77  				returnvalue = false;
78  
79  		if (EParapherManager.getInstance().getSettings().isSecPolCheckUpperChar())
80  			if ( !isMinUpperCheck(secret) )
81  				returnvalue = false;
82  
83  		if (EParapherManager.getInstance().getSettings().isSecPolCheckLowerChar())
84  			if ( !isMinLowerCheck(secret) )
85  				returnvalue = false;
86  
87  		if (EParapherManager.getInstance().getSettings().isSecPolCheckNumberChar())
88  			if ( !isMinNumberCheck(secret) )
89  				returnvalue = false;
90  
91  		if (EParapherManager.getInstance().getSettings().isSecPolCheckSpecialChar())
92  			if ( !isMinSpecialCheck(secret) )
93  				returnvalue = false;
94  		return returnvalue;
95  	}
96  
97  	public int getPasswordStrength(String secret) {
98  		int i=0;
99  		if (password_8chars_regexp.matcher(secret).find())
100 			i++;
101 		if (one_upper_regexp.matcher(secret).find())
102 			i++;
103 		if (one_lower_regexp.matcher(secret).find())
104 			i++;
105 		if (one_number_regexp.matcher(secret).find())
106 			i++;
107 		if (one_special_char.matcher(secret).find())
108 			i++;
109 		return i;
110 	}
111 }