You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by pa...@apache.org on 2013/06/06 18:12:28 UTC
svn commit: r1490334 - in /directory/studio/trunk/plugins:
ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/
valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/
Author: pamarcelot
Date: Thu Jun 6 16:12:27 2013
New Revision: 1490334
URL: http://svn.apache.org/r1490334
Log:
Another fix for DIRSTUDIO-890 (Add support for SSHA2 in Password Editor).
Modified:
directory/studio/trunk/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/Password.java
directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/PasswordDialog.java
directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/PasswordValueEditor.java
directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/messages.properties
directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/messages_de.properties
directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/messages_fr.properties
Modified: directory/studio/trunk/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/Password.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/Password.java?rev=1490334&r1=1490333&r2=1490334&view=diff
==============================================================================
--- directory/studio/trunk/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/Password.java (original)
+++ directory/studio/trunk/plugins/ldapbrowser.core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/Password.java Thu Jun 6 16:12:27 2013
@@ -25,6 +25,7 @@ import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
+import org.apache.directory.api.ldap.model.constants.LdapSecurityConstants;
import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
import org.apache.directory.studio.ldapbrowser.core.utils.UnixCrypt;
import org.apache.directory.studio.ldifparser.LdifUtils;
@@ -40,6 +41,12 @@ import org.apache.directory.studio.ldifp
* <ul>
* <li>SHA</li>
* <li>SSHA</li>
+ * <li>SHA-256</li>
+ * <li>SSHA-256</li>
+ * <li>SHA-384</li>
+ * <li>SSHA-384</li>
+ * <li>SHA-512</li>
+ * <li>SSHA-512</li>
* <li>MD5</li>
* <li>SMD5</li>
* <li>CRYPT</li>
@@ -49,57 +56,19 @@ import org.apache.directory.studio.ldifp
*/
public class Password
{
- /** The constant used for the SHA hash, value <code>SHA</code> */
- public static final String HASH_METHOD_SHA = "SHA"; //$NON-NLS-1$
+ /** The hash method */
+ private LdapSecurityConstants hashMethod;
- /** The constant used for the salted SHA hash, value <code>SSHA</code> */
- public static final String HASH_METHOD_SSHA = "SSHA"; //$NON-NLS-1$
-
- /** The constant used for the SHA-256 hash, value <code>SHA-256</code> */
- public static final String HASH_METHOD_SHA_256 = "SHA-256"; //$NON-NLS-1$
-
- /** The constant used for the salted SHA-256 hash, value <code>SSHA-256</code> */
- public static final String HASH_METHOD_SSHA_256 = "SSHA-256"; //$NON-NLS-1$
-
- /** The constant used for the SHA-384 hash, value <code>SHA-384</code> */
- public static final String HASH_METHOD_SHA_384 = "SHA-384"; //$NON-NLS-1$
-
- /** The constant used for the salted SHA-384 hash, value <code>SSHA-384</code> */
- public static final String HASH_METHOD_SSHA_384 = "SSHA-384"; //$NON-NLS-1$
-
- /** The constant used for the SHA-512 hash, value <code>SHA-512</code> */
- public static final String HASH_METHOD_SHA_512 = "SHA-512"; //$NON-NLS-1$
-
- /** The constant used for the salted SHA-512 hash, value <code>SSHA-512</code> */
- public static final String HASH_METHOD_SSHA_512 = "SSHA-512"; //$NON-NLS-1$
-
- /** The constant used for the MD5 hash, value <code>MD5</code> */
- public static final String HASH_METHOD_MD5 = "MD5"; //$NON-NLS-1$
-
- /** The constant used for the salted MD5 hash, value <code>SMD5</code> */
- public static final String HASH_METHOD_SMD5 = "SMD5"; //$NON-NLS-1$
-
- /** The constant used for the crypt hash, value <code>CRYPT</code> */
- public static final String HASH_METHOD_CRYPT = "CRYPT"; //$NON-NLS-1$
-
- /** The constant used for plain text passwords */
- public static final String HASH_METHOD_NO = BrowserCoreMessages.model__no_hash;
-
- /** The constant used for unsupported hash methods */
- public static final String HASH_METHOD_UNSUPPORTED = BrowserCoreMessages.model__unsupported_hash;
-
- /** The constant used for invalid password hashes */
- public static final String HASH_METHOD_INVALID = BrowserCoreMessages.model__invalid_hash;
-
- /** The hash method. */
- private String hashMethod;
-
- /** The hashed password. */
+ /** The hashed password */
private byte[] hashedPassword;
- /** The salt. */
+ /** The salt */
private byte[] salt;
+ private boolean isUnsupportedHashMethod = false;
+
+ private boolean isInvalidHashValue = false;
+
/** The trash, used for unknown hash methods. */
private String trash;
@@ -126,54 +95,58 @@ public class Password
{
throw new IllegalArgumentException( BrowserCoreMessages.model__empty_password );
}
- else if ( password.indexOf( '{' ) == 0 && password.indexOf( '}' ) > 0 )
+ else if ( ( password.indexOf( '{' ) == 0 ) && ( password.indexOf( '}' ) > 0 ) )
{
try
{
- hashMethod = password.substring( password.indexOf( '{' ) + 1, password.indexOf( '}' ) );
- String rest = password.substring( hashMethod.length() + 2 );
-
- if ( HASH_METHOD_SHA.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SHA_256.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SHA_384.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SHA_512.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_MD5.equalsIgnoreCase( hashMethod ) )
+ // Getting the hash method
+ String hashMethodString = password.substring( password.indexOf( '{' ) + 1, password.indexOf( '}' ) );
+ hashMethod = LdapSecurityConstants.getAlgorithm( hashMethodString );
+
+ // Getting the rest of the hashed password
+ String rest = password.substring( hashMethodString.length() + 2 );
+
+ if ( ( LdapSecurityConstants.HASH_METHOD_SHA == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SHA256 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SHA384 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SHA512 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_MD5 == hashMethod ) )
{
hashedPassword = LdifUtils.base64decodeToByteArray( rest );
salt = null;
}
- else if ( HASH_METHOD_SSHA.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SSHA_256.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SSHA_384.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SSHA_512.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SMD5.equalsIgnoreCase( hashMethod ) )
+ else if ( ( LdapSecurityConstants.HASH_METHOD_SSHA == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SSHA256 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SSHA384 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SSHA512 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SMD5 == hashMethod ) )
{
- if ( HASH_METHOD_SSHA.equalsIgnoreCase( hashMethod ) )
- {
- hashedPassword = new byte[20];
- }
- else if ( HASH_METHOD_SSHA_256.equalsIgnoreCase( hashMethod ) )
- {
- hashedPassword = new byte[32];
- }
- else if ( HASH_METHOD_SSHA_384.equalsIgnoreCase( hashMethod ) )
+ switch ( hashMethod )
{
- hashedPassword = new byte[48];
- }
- else if ( HASH_METHOD_SSHA_512.equalsIgnoreCase( hashMethod ) )
- {
- hashedPassword = new byte[64];
- }
- else if ( HASH_METHOD_SMD5.equalsIgnoreCase( hashMethod ) )
- {
- hashedPassword = new byte[16];
+ case HASH_METHOD_SSHA:
+ hashedPassword = new byte[20];
+ break;
+ case HASH_METHOD_SSHA256:
+ hashedPassword = new byte[32];
+ break;
+ case HASH_METHOD_SSHA384:
+ hashedPassword = new byte[48];
+ break;
+ case HASH_METHOD_SSHA512:
+ hashedPassword = new byte[64];
+ break;
+ case HASH_METHOD_SMD5:
+ hashedPassword = new byte[16];
+ break;
+ default:
+ break;
}
byte[] hashedPasswordWithSalt = LdifUtils.base64decodeToByteArray( rest );
salt = new byte[hashedPasswordWithSalt.length - hashedPassword.length];
split( hashedPasswordWithSalt, hashedPassword, salt );
}
- else if ( HASH_METHOD_CRYPT.equalsIgnoreCase( hashMethod ) )
+ else if ( LdapSecurityConstants.HASH_METHOD_CRYPT == hashMethod )
{
byte[] saltWithPassword = LdifUtils.utf8encode( rest );
salt = new byte[2];
@@ -182,14 +155,14 @@ public class Password
}
else
{
- hashMethod = HASH_METHOD_UNSUPPORTED;
+ isUnsupportedHashMethod = true;
trash = password;
}
}
catch ( RuntimeException e )
{
// happens if 'rest' is not valid BASE64
- hashMethod = HASH_METHOD_INVALID;
+ isInvalidHashValue = true;
trash = password;
}
}
@@ -209,44 +182,30 @@ public class Password
* @param hashMethod the hash method to use
* @param passwordAsPlaintext the plain text password
*
- * @throws IllegalArgumentException if the given hash method is not
- * supported of if the given password is null
+ * @throws IllegalArgumentException if the given password is null
*/
- public Password( String hashMethod, String passwordAsPlaintext )
+ public Password( LdapSecurityConstants hashMethod, String passwordAsPlaintext )
{
- if ( !( hashMethod == null || HASH_METHOD_NO.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SHA.equalsIgnoreCase( hashMethod ) || HASH_METHOD_SSHA.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SHA_256.equalsIgnoreCase( hashMethod ) || HASH_METHOD_SSHA_256.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SHA_384.equalsIgnoreCase( hashMethod ) || HASH_METHOD_SSHA_384.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SHA_512.equalsIgnoreCase( hashMethod ) || HASH_METHOD_SSHA_512.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_MD5.equalsIgnoreCase( hashMethod ) || HASH_METHOD_SMD5.equalsIgnoreCase( hashMethod ) || HASH_METHOD_CRYPT
- .equalsIgnoreCase( hashMethod ) ) )
- {
- throw new IllegalArgumentException( BrowserCoreMessages.model__unsupported_hash );
- }
+ // Checking the password as plain text
if ( passwordAsPlaintext == null )
{
throw new IllegalArgumentException( BrowserCoreMessages.model__empty_password );
}
- // set hash method
- if ( HASH_METHOD_NO.equalsIgnoreCase( hashMethod ) )
- {
- hashMethod = null;
- }
+ // Setting the hash method
this.hashMethod = hashMethod;
- // set salt
- if ( HASH_METHOD_SSHA.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SSHA_256.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SSHA_384.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SSHA_512.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SMD5.equalsIgnoreCase( hashMethod ) )
+ // Setting the salt
+ if ( ( LdapSecurityConstants.HASH_METHOD_SSHA == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SSHA256 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SSHA384 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SSHA512 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SMD5 == hashMethod ) )
{
this.salt = new byte[8];
new SecureRandom().nextBytes( this.salt );
}
- else if ( HASH_METHOD_CRYPT.equalsIgnoreCase( hashMethod ) )
+ else if ( LdapSecurityConstants.HASH_METHOD_CRYPT == hashMethod )
{
this.salt = new byte[2];
SecureRandom sr = new SecureRandom();
@@ -260,40 +219,28 @@ public class Password
this.salt = null;
}
- // digest
- if ( HASH_METHOD_SHA.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SSHA.equalsIgnoreCase( hashMethod ) )
- {
- this.hashedPassword = digest( HASH_METHOD_SHA, passwordAsPlaintext, this.salt );
- }
- else if ( HASH_METHOD_SHA_256.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SSHA_256.equalsIgnoreCase( hashMethod ) )
- {
- this.hashedPassword = digest( HASH_METHOD_SHA_256, passwordAsPlaintext, this.salt );
- }
- else if ( HASH_METHOD_SHA_384.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SSHA_384.equalsIgnoreCase( hashMethod ) )
- {
- this.hashedPassword = digest( HASH_METHOD_SHA_384, passwordAsPlaintext, this.salt );
- }
- else if ( HASH_METHOD_SHA_512.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SSHA_512.equalsIgnoreCase( hashMethod ) )
+ // Setting the hashed password
+ if ( hashMethod == null )
{
- this.hashedPassword = digest( HASH_METHOD_SHA_512, passwordAsPlaintext, this.salt );
+ this.hashedPassword = LdifUtils.utf8encode( passwordAsPlaintext );
}
- else if ( HASH_METHOD_MD5.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SMD5.equalsIgnoreCase( hashMethod ) )
+ else if ( ( LdapSecurityConstants.HASH_METHOD_SHA == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SSHA == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SHA256 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SSHA256 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SHA384 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SSHA384 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SHA512 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SSHA512 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_MD5 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SMD5 == hashMethod ) )
{
- this.hashedPassword = digest( HASH_METHOD_MD5, passwordAsPlaintext, this.salt );
+ this.hashedPassword = digest( hashMethod, passwordAsPlaintext, this.salt );
}
- else if ( HASH_METHOD_CRYPT.equalsIgnoreCase( hashMethod ) )
+ else if ( LdapSecurityConstants.HASH_METHOD_CRYPT == hashMethod )
{
this.hashedPassword = crypt( passwordAsPlaintext, this.salt );
}
- else if ( hashMethod == null )
- {
- this.hashedPassword = LdifUtils.utf8encode( passwordAsPlaintext );
- }
}
@@ -312,41 +259,26 @@ public class Password
}
boolean verified = false;
+
if ( hashMethod == null )
{
verified = testPasswordAsPlaintext.equals( LdifUtils.utf8decode( hashedPassword ) );
}
- else if ( HASH_METHOD_SHA.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SSHA.equalsIgnoreCase( hashMethod ) )
+ else if ( ( LdapSecurityConstants.HASH_METHOD_SHA == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SSHA == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SHA256 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SSHA256 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SHA384 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SSHA384 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SHA512 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SSHA512 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_MD5 == hashMethod )
+ || ( LdapSecurityConstants.HASH_METHOD_SMD5 == hashMethod ) )
{
- byte[] hash = digest( HASH_METHOD_SHA, testPasswordAsPlaintext, salt );
+ byte[] hash = digest( hashMethod, testPasswordAsPlaintext, salt );
verified = equals( hash, hashedPassword );
}
- else if ( HASH_METHOD_SHA_256.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SSHA_256.equalsIgnoreCase( hashMethod ) )
- {
- byte[] hash = digest( HASH_METHOD_SHA_256, testPasswordAsPlaintext, salt );
- verified = equals( hash, hashedPassword );
- }
- else if ( HASH_METHOD_SHA_384.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SSHA_384.equalsIgnoreCase( hashMethod ) )
- {
- byte[] hash = digest( HASH_METHOD_SHA_384, testPasswordAsPlaintext, salt );
- verified = equals( hash, hashedPassword );
- }
- else if ( HASH_METHOD_SHA_512.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SSHA_512.equalsIgnoreCase( hashMethod ) )
- {
- byte[] hash = digest( HASH_METHOD_SHA_512, testPasswordAsPlaintext, salt );
- verified = equals( hash, hashedPassword );
- }
- else if ( HASH_METHOD_MD5.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_SMD5.equalsIgnoreCase( hashMethod ) )
- {
- byte[] hash = digest( HASH_METHOD_MD5, testPasswordAsPlaintext, salt );
- verified = equals( hash, hashedPassword );
- }
- else if ( HASH_METHOD_CRYPT.equalsIgnoreCase( hashMethod ) )
+ else if ( LdapSecurityConstants.HASH_METHOD_CRYPT == hashMethod )
{
byte[] crypted = crypt( testPasswordAsPlaintext, salt );
verified = equals( crypted, hashedPassword );
@@ -361,7 +293,7 @@ public class Password
*
* @return the hash method
*/
- public String getHashMethod()
+ public LdapSecurityConstants getHashMethod()
{
return hashMethod;
}
@@ -429,20 +361,19 @@ public class Password
{
StringBuffer sb = new StringBuffer();
- if ( HASH_METHOD_UNSUPPORTED.equalsIgnoreCase( hashMethod )
- || HASH_METHOD_INVALID.equalsIgnoreCase( hashMethod ) )
+ if ( isUnsupportedHashMethod || isInvalidHashValue )
{
sb.append( trash );
}
- else if ( HASH_METHOD_CRYPT.equalsIgnoreCase( hashMethod ) )
+ else if ( LdapSecurityConstants.HASH_METHOD_CRYPT == hashMethod )
{
- sb.append( '{' ).append( hashMethod ).append( '}' );
+ sb.append( '{' ).append( hashMethod.getPrefix() ).append( '}' );
sb.append( LdifUtils.utf8decode( salt ) );
sb.append( LdifUtils.utf8decode( hashedPassword ) );
}
else if ( hashMethod != null )
{
- sb.append( '{' ).append( hashMethod ).append( '}' );
+ sb.append( '{' ).append( hashMethod.getPrefix() ).append( '}' );
if ( salt != null )
{
byte[] hashedPasswordWithSaltBytes = new byte[hashedPassword.length + salt.length];
@@ -477,20 +408,30 @@ public class Password
}
+ /**
+ * Checks equality between two byte arrays.
+ *
+ * @param data1 the first byte array
+ * @param data2 the first byte array
+ * @return <code>true</code> if the two byte arrays are equal
+ */
private static boolean equals( byte[] data1, byte[] data2 )
{
if ( data1 == data2 )
{
return true;
}
+
if ( data1 == null || data2 == null )
{
return false;
}
+
if ( data1.length != data2.length )
{
return false;
}
+
for ( int i = 0; i < data1.length; i++ )
{
if ( data1[i] != data2[i] )
@@ -498,44 +439,59 @@ public class Password
return false;
}
}
+
return true;
}
- private static byte[] digest( String hashMethod, String password, byte[] salt )
+ /**
+ * Computes the hashed value of a password with the given hash method and optional salt.
+ *
+ * @param hashMethod the hash method
+ * @param password the password
+ * @param salt the optional salt (can be <code>null</code>)
+ * @return the hashed value of the password
+ */
+ private static byte[] digest( LdapSecurityConstants hashMethod, String password, byte[] salt )
{
-
+ // Converting password to byte array
byte[] passwordBytes = LdifUtils.utf8encode( password );
- MessageDigest digest;
+
+ // Getting the message digest associated with the hash method
try
{
- digest = MessageDigest.getInstance( hashMethod );
+ MessageDigest digest = MessageDigest.getInstance( hashMethod.getAlgorithm() );
+
+ // Computing the hashed password (salted or not)
+ if ( salt != null )
+ {
+ digest.update( passwordBytes );
+ digest.update( salt );
+ return digest.digest();
+ }
+ else
+ {
+ return digest.digest( passwordBytes );
+ }
}
catch ( NoSuchAlgorithmException e1 )
{
return null;
}
-
- if ( salt != null )
- {
- digest.update( passwordBytes );
- digest.update( salt );
- byte[] hashedPasswordBytes = digest.digest();
- return hashedPasswordBytes;
- }
- else
- {
- byte[] hashedPasswordBytes = digest.digest( passwordBytes );
- return hashedPasswordBytes;
- }
}
+ /**
+ * Computes the crypt value of a password (with salt).
+ *
+ * @param password the password
+ * @param salt the salt
+ * @return the crypt value of the password
+ */
private static byte[] crypt( String password, byte[] salt )
{
String saltWithCrypted = UnixCrypt.crypt( password, LdifUtils.utf8decode( salt ) );
String crypted = saltWithCrypted.substring( 2 );
return LdifUtils.utf8encode( crypted );
}
-
}
Modified: directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/PasswordDialog.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/PasswordDialog.java?rev=1490334&r1=1490333&r2=1490334&view=diff
==============================================================================
--- directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/PasswordDialog.java (original)
+++ directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/PasswordDialog.java Thu Jun 6 16:12:27 2013
@@ -21,13 +21,13 @@
package org.apache.directory.studio.valueeditors.password;
-import java.util.Arrays;
-
+import org.apache.directory.api.ldap.model.constants.LdapSecurityConstants;
import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils;
import org.apache.directory.studio.connection.core.Connection;
import org.apache.directory.studio.connection.core.ConnectionParameter.AuthenticationMethod;
import org.apache.directory.studio.connection.core.jobs.CheckBindRunnable;
import org.apache.directory.studio.connection.ui.RunnableContextRunner;
+import org.apache.directory.studio.ldapbrowser.core.BrowserCoreMessages;
import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
import org.apache.directory.studio.ldapbrowser.core.model.Password;
import org.apache.directory.studio.ldapbrowser.core.utils.Utils;
@@ -37,6 +37,12 @@ import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
@@ -45,7 +51,6 @@ import org.eclipse.swt.events.SelectionE
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
@@ -64,21 +69,24 @@ import org.eclipse.swt.widgets.Text;
*/
public class PasswordDialog extends Dialog
{
+ /** The constant for no hash method */
+ private static final String NO_HASH_METHOD = "NO-HASH-METHOD";
+
/** The supported hash methods */
- private static final String[] HASH_METHODS =
+ private static final Object[] HASH_METHODS =
{
- Password.HASH_METHOD_SHA,
- Password.HASH_METHOD_SHA_256,
- Password.HASH_METHOD_SHA_384,
- Password.HASH_METHOD_SHA_512,
- Password.HASH_METHOD_SSHA,
- Password.HASH_METHOD_SSHA_256,
- Password.HASH_METHOD_SSHA_384,
- Password.HASH_METHOD_SSHA_512,
- Password.HASH_METHOD_MD5,
- Password.HASH_METHOD_SMD5,
- Password.HASH_METHOD_CRYPT,
- Password.HASH_METHOD_NO };
+ LdapSecurityConstants.HASH_METHOD_SHA,
+ LdapSecurityConstants.HASH_METHOD_SHA256,
+ LdapSecurityConstants.HASH_METHOD_SHA384,
+ LdapSecurityConstants.HASH_METHOD_SHA512,
+ LdapSecurityConstants.HASH_METHOD_SSHA,
+ LdapSecurityConstants.HASH_METHOD_SSHA256,
+ LdapSecurityConstants.HASH_METHOD_SSHA384,
+ LdapSecurityConstants.HASH_METHOD_SSHA512,
+ LdapSecurityConstants.HASH_METHOD_MD5,
+ LdapSecurityConstants.HASH_METHOD_SMD5,
+ LdapSecurityConstants.HASH_METHOD_CRYPT,
+ NO_HASH_METHOD };
/** Constant for the Current Password tab */
private static final int CURRENT_TAB = 0;
@@ -126,7 +134,7 @@ public class PasswordDialog extends Dial
private TabItem newPasswordTab;
private Composite newPasswordComposite;
private Text newPasswordText;
- private Combo newPasswordHashMethodCombo;
+ private ComboViewer newPasswordHashMethodComboViewer;
private Text newPasswordPreviewText;
private Text newPasswordPreviewValueHexText;
private Text newPasswordPreviewSaltHexText;
@@ -187,9 +195,19 @@ public class PasswordDialog extends Dial
}
// save selected hash method to dialog settings, selected tab will be
- // saved int close()
- ValueEditorsActivator.getDefault().getDialogSettings().put( SELECTED_HASH_METHOD_DIALOGSETTINGS_KEY,
- newPasswordHashMethodCombo.getText() );
+ // saved on close()
+ LdapSecurityConstants selectedHashMethod = getSelectedNewPasswordHashMethod();
+
+ if ( selectedHashMethod == null )
+ {
+ ValueEditorsActivator.getDefault().getDialogSettings().put( SELECTED_HASH_METHOD_DIALOGSETTINGS_KEY,
+ NO_HASH_METHOD );
+ }
+ else
+ {
+ ValueEditorsActivator.getDefault().getDialogSettings().put( SELECTED_HASH_METHOD_DIALOGSETTINGS_KEY,
+ selectedHashMethod.getName() );
+ }
super.okPressed();
}
@@ -230,13 +248,21 @@ public class PasswordDialog extends Dial
catch ( Exception e )
{
}
+
try
{
- String hashMethod = ValueEditorsActivator.getDefault().getDialogSettings().get(
+ String hashMethodName = ValueEditorsActivator.getDefault().getDialogSettings().get(
SELECTED_HASH_METHOD_DIALOGSETTINGS_KEY );
- if ( Arrays.asList( HASH_METHODS ).contains( hashMethod ) )
+
+ LdapSecurityConstants hashMethod = LdapSecurityConstants.getAlgorithm( hashMethodName );
+
+ if ( ( hashMethod == null ) || NO_HASH_METHOD.equals( hashMethodName ) )
+ {
+ newPasswordHashMethodComboViewer.setSelection( new StructuredSelection( NO_HASH_METHOD ) );
+ }
+ else
{
- newPasswordHashMethodCombo.setText( hashMethod );
+ newPasswordHashMethodComboViewer.setSelection( new StructuredSelection( hashMethod ) );
}
}
catch ( Exception e )
@@ -338,7 +364,7 @@ public class PasswordDialog extends Dial
// Show current password details button
showCurrentPasswordDetailsButton = BaseWidgetUtils.createCheckbox( currentPasswordDetailsComposite, Messages
- .getString( "PasswordDialog.ShowCurrentPasswordDetails" ), 1 ); //$NON-NLS-1$
+ .getString( "PasswordDialog.ShowCurrentPasswordDetails" ), 2 ); //$NON-NLS-1$
// Verify password text
BaseWidgetUtils
@@ -400,7 +426,24 @@ public class PasswordDialog extends Dial
// New password hashing method combo
BaseWidgetUtils.createLabel( newPasswordComposite, Messages.getString( "PasswordDialog.SelectHashMethod" ), 1 ); //$NON-NLS-1$
- newPasswordHashMethodCombo = BaseWidgetUtils.createReadonlyCombo( newPasswordComposite, HASH_METHODS, 0, 1 );
+ newPasswordHashMethodComboViewer = new ComboViewer( newPasswordComposite );
+ newPasswordHashMethodComboViewer.setContentProvider( new ArrayContentProvider() );
+ newPasswordHashMethodComboViewer.setLabelProvider( new LabelProvider()
+ {
+ public String getText( Object element )
+ {
+ String hashMethod = getHashMethodName( element );
+
+ if ( !"".equals( hashMethod ) )
+ {
+ return hashMethod;
+ }
+
+ return super.getText( element );
+ }
+ } );
+ newPasswordHashMethodComboViewer.setInput( HASH_METHODS );
+ newPasswordHashMethodComboViewer.getControl().setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false ) );
// New password preview text
BaseWidgetUtils.createLabel( newPasswordComposite, Messages.getString( "PasswordDialog.PasswordPreview" ), 1 ); //$NON-NLS-1$
@@ -428,7 +471,7 @@ public class PasswordDialog extends Dial
// Show new password details button
showNewPasswordDetailsButton = BaseWidgetUtils.createCheckbox( newPasswordPreviewDetailsComposite, Messages
- .getString( "PasswordDialog.ShowNewPasswordDetails" ), 1 ); //$NON-NLS-1$
+ .getString( "PasswordDialog.ShowNewPasswordDetails" ), 2 ); //$NON-NLS-1$
// New password tab
newPasswordTab = new TabItem( tabFolder, SWT.NONE );
@@ -451,7 +494,7 @@ public class PasswordDialog extends Dial
updateCurrentPasswordGroup();
}
} );
-
+
testPasswordText.addModifyListener( new ModifyListener()
{
public void modifyText( ModifyEvent e )
@@ -459,7 +502,7 @@ public class PasswordDialog extends Dial
updateCurrentPasswordGroup();
}
} );
-
+
showTestPasswordDetailsButton.addSelectionListener( new SelectionAdapter()
{
public void widgetSelected( SelectionEvent arg0 )
@@ -493,9 +536,9 @@ public class PasswordDialog extends Dial
}
} );
- newPasswordHashMethodCombo.addSelectionListener( new SelectionAdapter()
+ newPasswordHashMethodComboViewer.addSelectionChangedListener( new ISelectionChangedListener()
{
- public void widgetSelected( SelectionEvent event )
+ public void selectionChanged( SelectionChangedEvent event )
{
updateNewPasswordGroup();
}
@@ -527,7 +570,7 @@ public class PasswordDialog extends Dial
// set current password to the UI widgets
if ( currentPassword != null )
{
- currentPasswordHashMethodText.setText( Utils.getNonNullString( currentPassword.getHashMethod() ) );
+ currentPasswordHashMethodText.setText( getCurrentPasswordHashMethodName() );
currentPasswordValueHexText.setText( Utils
.getNonNullString( currentPassword.getHashedPasswordAsHexString() ) );
currentPasswordSaltHexText.setText( Utils.getNonNullString( currentPassword.getSaltAsHexString() ) );
@@ -641,7 +684,7 @@ public class PasswordDialog extends Dial
private void updateNewPasswordGroup()
{
// set new password to the UI widgets
- newPassword = new Password( newPasswordHashMethodCombo.getText(), newPasswordText.getText() );
+ newPassword = new Password( getSelectedNewPasswordHashMethod(), newPasswordText.getText() );
if ( !"".equals( newPasswordText.getText() ) || newPassword.getHashMethod() == null ) //$NON-NLS-1$
{
newPasswordPreviewValueHexText
@@ -705,6 +748,72 @@ public class PasswordDialog extends Dial
/**
+ * Gets the selected new password hash method.
+ *
+ * @return the selected new password hash method
+ */
+ private LdapSecurityConstants getSelectedNewPasswordHashMethod()
+ {
+ StructuredSelection selection = ( StructuredSelection ) newPasswordHashMethodComboViewer.getSelection();
+
+ if ( !selection.isEmpty() )
+ {
+ Object selectedObject = selection.getFirstElement();
+
+ if ( selectedObject instanceof LdapSecurityConstants )
+ {
+ return ( LdapSecurityConstants ) selectedObject;
+ }
+ }
+
+ return null;
+ }
+
+
+ /**
+ * Gets the name of the hash method.
+ *
+ * @param o the hash method object
+ * @return the name of the hash method
+ */
+ private String getHashMethodName( Object o )
+ {
+ if ( o instanceof LdapSecurityConstants )
+ {
+ LdapSecurityConstants hashMethod = ( LdapSecurityConstants ) o;
+
+ return hashMethod.getName();
+ }
+ else if ( ( o instanceof String ) && NO_HASH_METHOD.equals( o ) )
+ {
+ return BrowserCoreMessages.model__no_hash;
+ }
+
+ return null;
+ }
+
+
+ /**
+ * Gets the current password hash method name.
+ *
+ * @return the current password hash method name
+ */
+ private String getCurrentPasswordHashMethodName()
+ {
+ LdapSecurityConstants hashMethod = currentPassword.getHashMethod();
+
+ if ( hashMethod != null )
+ {
+ return Utils.getNonNullString( getHashMethodName( hashMethod ) );
+ }
+ else
+ {
+ return Utils.getNonNullString( getHashMethodName( NO_HASH_METHOD ) );
+ }
+ }
+
+
+ /**
* Gets the new password.
*
* @return the password, either encypted by the selected
Modified: directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/PasswordValueEditor.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/PasswordValueEditor.java?rev=1490334&r1=1490333&r2=1490334&view=diff
==============================================================================
--- directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/PasswordValueEditor.java (original)
+++ directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/PasswordValueEditor.java Thu Jun 6 16:12:27 2013
@@ -21,11 +21,13 @@
package org.apache.directory.studio.valueeditors.password;
+import org.apache.directory.api.ldap.model.constants.LdapSecurityConstants;
import org.apache.directory.studio.ldapbrowser.common.dialogs.TextDialog;
import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
import org.apache.directory.studio.ldapbrowser.core.model.IValue;
import org.apache.directory.studio.valueeditors.AbstractDialogBinaryValueEditor;
+import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Shell;
@@ -99,7 +101,8 @@ public class PasswordValueEditor extends
else if ( password.indexOf( '{' ) == 0 && password.indexOf( '}' ) > 0 )
{
String hashMethod = password.substring( password.indexOf( '{' ) + 1, password.indexOf( '}' ) );
- text = hashMethod + Messages.getString( "PasswordValueEditor.HashedPassword" ); //$NON-NLS-1$
+ text = NLS.bind(
+ Messages.getString( "PasswordValueEditor.HashedPassword" ), getHashMethodName( hashMethod ) ); //$NON-NLS-1$
}
else
{
@@ -112,6 +115,25 @@ public class PasswordValueEditor extends
/**
+ * Gets the name of the hash method.
+ *
+ * @param s the hash method string
+ * @return the name of the associated hash method or the given string
+ */
+ private String getHashMethodName( String s )
+ {
+ LdapSecurityConstants hashMethod = LdapSecurityConstants.getAlgorithm( s );
+
+ if ( hashMethod != null )
+ {
+ return hashMethod.getName();
+ }
+
+ return s;
+ }
+
+
+ /**
* {@inheritDoc}
*
* Returns a PasswordValueEditorRawValueWrapper with empty
Modified: directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/messages.properties
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/messages.properties?rev=1490334&r1=1490333&r2=1490334&view=diff
==============================================================================
--- directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/messages.properties (original)
+++ directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/messages.properties Thu Jun 6 16:12:27 2013
@@ -38,5 +38,5 @@ PasswordDialog.ShowTestPasswordDetails=S
PasswordDialog.Verify=Verify
PasswordDialog.VerifyPassword=Verify Password:
PasswordValueEditor.EmptyPassword=Empty password
-PasswordValueEditor.HashedPassword=\ hashed password
+PasswordValueEditor.HashedPassword={0} hashed password
PasswordValueEditor.PlainTextPassword=Plain text password
Modified: directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/messages_de.properties
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/messages_de.properties?rev=1490334&r1=1490333&r2=1490334&view=diff
==============================================================================
--- directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/messages_de.properties (original)
+++ directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/messages_de.properties Thu Jun 6 16:12:27 2013
@@ -37,5 +37,5 @@ PasswordDialog.ShowTestPasswordDetails=Z
PasswordDialog.Verify=Verifiziere
PasswordDialog.VerifyPassword=Verifiziere Passwort\:
PasswordValueEditor.EmptyPassword=Leeres Passwort
-PasswordValueEditor.HashedPassword=\ gehashtes Passwort
+PasswordValueEditor.HashedPassword={0} gehashtes Passwort
PasswordValueEditor.PlainTextPassword=Klartext Passwort
Modified: directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/messages_fr.properties
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/messages_fr.properties?rev=1490334&r1=1490333&r2=1490334&view=diff
==============================================================================
--- directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/messages_fr.properties (original)
+++ directory/studio/trunk/plugins/valueeditors/src/main/java/org/apache/directory/studio/valueeditors/password/messages_fr.properties Thu Jun 6 16:12:27 2013
@@ -38,5 +38,5 @@ PasswordDialog.ShowTestPasswordDetails=A
PasswordDialog.Verify=V\u00E9rifier
PasswordDialog.VerifyPassword=V\u00E9rifier le mot de passe:
PasswordValueEditor.EmptyPassword=Mot de passe vide
-PasswordValueEditor.HashedPassword=\ mot de passe hach\u00E9
+PasswordValueEditor.HashedPassword=Mot de passe hach\u00E9 {0}
PasswordValueEditor.PlainTextPassword=Mot de passe sous forme de texte brut