/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ package org.apache.directory.studio.valueeditors.password; 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.ConnectionUIPlugin; 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; import org.apache.directory.studio.valueeditors.ValueEditorsActivator; import org.apache.directory.studio.valueeditors.ValueEditorsConstants; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; 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; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.swt.widgets.Text; /** * The PasswordDialog is used from the password value editor to view the current password * and to enter a new password. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ 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 Object[] HASH_METHODS = { 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_PKCS5S2, LdapSecurityConstants.HASH_METHOD_CRYPT, LdapSecurityConstants.HASH_METHOD_CRYPT_MD5, LdapSecurityConstants.HASH_METHOD_CRYPT_SHA256, LdapSecurityConstants.HASH_METHOD_CRYPT_SHA512, NO_HASH_METHOD }; /** Constant for the Current Password tab */ private static final int CURRENT_TAB = 0; /** Constant for the New Password tab */ private static final int NEW_TAB = 1; /** Constant for the selected tab dialog settings key */ private static final String SELECTED_TAB_DIALOGSETTINGS_KEY = PasswordDialog.class.getName() + ".tab"; //$NON-NLS-1$ /** Constant for the selected hash method dialog settings key */ private static final String SELECTED_HASH_METHOD_DIALOGSETTINGS_KEY = PasswordDialog.class.getName() + ".hashMethod"; //$NON-NLS-1$ /** The display mode */ private DisplayMode displayMode; /** The associated entry for binding */ private IEntry entry; /** The current password */ private Password currentPassword; /** The new password */ private Password newPassword; /** The return password */ private byte[] returnPassword; // UI widgets private Button okButton; private TabFolder tabFolder; private TabItem currentPasswordTab; private Composite currentPasswordComposite; private Text currentPasswordText; private Text currentPasswordHashMethodText; private Text currentPasswordValueHexText; private Text currentPasswordSaltHexText; private Button showCurrentPasswordDetailsButton; private Text testPasswordText; private Text testBindDnText; private Button showTestPasswordDetailsButton; private Button verifyPasswordButton; private Button bindPasswordButton; private TabItem newPasswordTab; private Composite newPasswordComposite; private Text newPasswordText; private Text confirmNewPasswordText; private ComboViewer newPasswordHashMethodComboViewer; private Text newPasswordPreviewText; private Text newPasswordPreviewValueHexText; private Text newPasswordPreviewSaltHexText; private Button newSaltButton; private Button showNewPasswordDetailsButton; /** * Creates a new instance of PasswordDialog. * * @param parentShell the parent shell * @param currentPassword the current password, null if none * @param entry the entry used to bind */ public PasswordDialog( Shell parentShell, byte[] currentPassword, IEntry entry ) { super( parentShell ); super.setShellStyle( super.getShellStyle() | SWT.RESIZE ); try { this.currentPassword = currentPassword != null ? new Password( currentPassword ) : null; } catch ( IllegalArgumentException e ) { } this.entry = entry; this.returnPassword = null; } /** * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell) */ protected void configureShell( Shell shell ) { super.configureShell( shell ); shell.setText( Messages.getString( "PasswordDialog.PasswordEditor" ) ); //$NON-NLS-1$ shell.setImage( ValueEditorsActivator.getDefault().getImage( ValueEditorsConstants.IMG_PASSWORDEDITOR ) ); } /** * @see org.eclipse.jface.dialogs.Dialog#okPressed() */ protected void okPressed() { // create password if ( newPassword != null ) { returnPassword = newPassword.toBytes(); } else { returnPassword = null; } // save selected hash method to dialog settings, selected tab will be // 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(); } /** * @see org.eclipse.jface.dialogs.Dialog#close() */ public boolean close() { // save selected tab to dialog settings ValueEditorsActivator.getDefault().getDialogSettings().put( SELECTED_TAB_DIALOGSETTINGS_KEY, tabFolder.getSelectionIndex() ); return super.close(); } /** * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite) */ protected void createButtonsForButtonBar( Composite parent ) { okButton = createButton( parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true ); createButton( parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false ); // load dialog settings try { int tabIndex = ValueEditorsActivator.getDefault().getDialogSettings().getInt( SELECTED_TAB_DIALOGSETTINGS_KEY ); if ( currentPassword == null || currentPassword.toBytes().length == 0 ) { tabIndex = NEW_TAB; } tabFolder.setSelection( tabIndex ); } catch ( Exception e ) { } try { String hashMethodName = ValueEditorsActivator.getDefault().getDialogSettings().get( SELECTED_HASH_METHOD_DIALOGSETTINGS_KEY ); LdapSecurityConstants hashMethod = LdapSecurityConstants.getAlgorithm( hashMethodName ); if ( ( hashMethod == null ) || NO_HASH_METHOD.equals( hashMethodName ) ) { newPasswordHashMethodComboViewer.setSelection( new StructuredSelection( NO_HASH_METHOD ) ); } else { newPasswordHashMethodComboViewer.setSelection( new StructuredSelection( hashMethod ) ); } } catch ( Exception e ) { } // update on load updateTabFolder(); } /** * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) */ protected Control createDialogArea( Composite parent ) { // Composite Composite composite = ( Composite ) super.createDialogArea( parent ); GridData gd = new GridData( GridData.FILL_BOTH ); gd.widthHint = convertHorizontalDLUsToPixels( IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH ) * 3 / 2; gd.heightHint = convertVerticalDLUsToPixels( IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH ) * 2 / 3; composite.setLayoutData( gd ); // Tab folder tabFolder = new TabFolder( composite, SWT.TOP ); tabFolder.setLayoutData( new GridData( GridData.FILL_BOTH ) ); tabFolder.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { updateTabFolder(); } } ); // Checking the current password if ( currentPassword != null && currentPassword.toBytes().length > 0 ) { // Setting the display mode displayMode = DisplayMode.CURRENT_AND_NEW_PASSWORD; // Creating the current password tab createCurrentPasswordTab(); } else { // Setting the display mode displayMode = DisplayMode.NEW_PASSWORD_ONLY; } // Creating the new password tab createNewPasswordTab(); addListeners(); applyDialogFont( composite ); return composite; } /** * Creates the current password tab. */ private void createCurrentPasswordTab() { // Current password composite currentPasswordComposite = new Composite( tabFolder, SWT.NONE ); GridLayout currentLayout = new GridLayout( 2, false ); currentLayout.marginHeight = convertVerticalDLUsToPixels( IDialogConstants.VERTICAL_MARGIN ); currentLayout.marginWidth = convertHorizontalDLUsToPixels( IDialogConstants.HORIZONTAL_MARGIN ); currentLayout.verticalSpacing = convertVerticalDLUsToPixels( IDialogConstants.VERTICAL_SPACING ); currentLayout.horizontalSpacing = convertHorizontalDLUsToPixels( IDialogConstants.HORIZONTAL_SPACING ); currentPasswordComposite.setLayout( currentLayout ); currentPasswordComposite.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) ); // Current password text BaseWidgetUtils.createLabel( currentPasswordComposite, Messages .getString( "PasswordDialog.CurrentPassword" ) + ":", 1 ); //$NON-NLS-1$//$NON-NLS-2$ currentPasswordText = BaseWidgetUtils.createReadonlyText( currentPasswordComposite, "", 1 ); //$NON-NLS-1$ // Current password details composite new Label( currentPasswordComposite, SWT.NONE ); Composite currentPasswordDetailsComposite = BaseWidgetUtils.createColumnContainer( currentPasswordComposite, 2, 1 ); // Current password hash method label BaseWidgetUtils.createLabel( currentPasswordDetailsComposite, Messages.getString( "PasswordDialog.HashMethod" ), 1 ); //$NON-NLS-1$ currentPasswordHashMethodText = BaseWidgetUtils.createLabeledText( currentPasswordDetailsComposite, "", 1 ); //$NON-NLS-1$ // Current password hex label BaseWidgetUtils.createLabel( currentPasswordDetailsComposite, Messages .getString( "PasswordDialog.PasswordHex" ), 1 ); //$NON-NLS-1$ currentPasswordValueHexText = BaseWidgetUtils.createLabeledText( currentPasswordDetailsComposite, "", 1 ); //$NON-NLS-1$ // Current password salt hex label BaseWidgetUtils.createLabel( currentPasswordDetailsComposite, Messages.getString( "PasswordDialog.SaltHex" ), 1 ); //$NON-NLS-1$ currentPasswordSaltHexText = BaseWidgetUtils.createLabeledText( currentPasswordDetailsComposite, "", 1 ); //$NON-NLS-1$ // Show current password details button showCurrentPasswordDetailsButton = BaseWidgetUtils.createCheckbox( currentPasswordDetailsComposite, Messages .getString( "PasswordDialog.ShowCurrentPasswordDetails" ), 2 ); //$NON-NLS-1$ // Verify password text BaseWidgetUtils .createLabel( currentPasswordComposite, Messages.getString( "PasswordDialog.VerifyPassword" ), 1 ); //$NON-NLS-1$ testPasswordText = BaseWidgetUtils.createText( currentPasswordComposite, "", 1 ); //$NON-NLS-1$ // Verify password details composite new Label( currentPasswordComposite, SWT.NONE ); Composite testPasswordDetailsComposite = BaseWidgetUtils.createColumnContainer( currentPasswordComposite, 2, 1 ); // Bind DN label BaseWidgetUtils.createLabel( testPasswordDetailsComposite, Messages.getString( "PasswordDialog.BindDn" ), 1 ); //$NON-NLS-1$ testBindDnText = BaseWidgetUtils.createLabeledText( testPasswordDetailsComposite, "", 1 ); //$NON-NLS-1$ // Show verify password details button showTestPasswordDetailsButton = BaseWidgetUtils.createCheckbox( testPasswordDetailsComposite, Messages .getString( "PasswordDialog.ShowTestPasswordDetails" ), 2 ); //$NON-NLS-1$ // Verify password buttons composite new Label( currentPasswordComposite, SWT.NONE ); Composite verifyPasswordButtonsComposite = BaseWidgetUtils.createColumnContainer( currentPasswordComposite, 2, 1 ); // Verify button verifyPasswordButton = BaseWidgetUtils.createButton( verifyPasswordButtonsComposite, Messages .getString( "PasswordDialog.Verify" ), 1 ); //$NON-NLS-1$ verifyPasswordButton.setEnabled( false ); // Bind button bindPasswordButton = BaseWidgetUtils.createButton( verifyPasswordButtonsComposite, Messages .getString( "PasswordDialog.Bind" ), 1 ); //$NON-NLS-1$ bindPasswordButton.setEnabled( false ); // Current password tab currentPasswordTab = new TabItem( tabFolder, SWT.NONE ); currentPasswordTab.setText( Messages.getString( "PasswordDialog.CurrentPassword" ) ); //$NON-NLS-1$ currentPasswordTab.setControl( currentPasswordComposite ); } /** * Creates the new password tab. */ private void createNewPasswordTab() { // New password composite newPasswordComposite = new Composite( tabFolder, SWT.NONE ); GridLayout newLayout = new GridLayout( 2, false ); newLayout.marginHeight = convertVerticalDLUsToPixels( IDialogConstants.VERTICAL_MARGIN ); newLayout.marginWidth = convertHorizontalDLUsToPixels( IDialogConstants.HORIZONTAL_MARGIN ); newLayout.verticalSpacing = convertVerticalDLUsToPixels( IDialogConstants.VERTICAL_SPACING ); newLayout.horizontalSpacing = convertHorizontalDLUsToPixels( IDialogConstants.HORIZONTAL_SPACING ); newPasswordComposite.setLayout( newLayout ); // New password text BaseWidgetUtils.createLabel( newPasswordComposite, Messages.getString( "PasswordDialog.EnterNewPassword" ), 1 ); //$NON-NLS-1$ newPasswordText = BaseWidgetUtils.createText( newPasswordComposite, "", 1 ); //$NON-NLS-1$ // Confirm new password text BaseWidgetUtils .createLabel( newPasswordComposite, Messages.getString( "PasswordDialog.ConfirmNewPassword" ), 1 ); //$NON-NLS-1$ confirmNewPasswordText = BaseWidgetUtils.createText( newPasswordComposite, "", 1 ); //$NON-NLS-1$ // New password hashing method combo BaseWidgetUtils.createLabel( newPasswordComposite, Messages.getString( "PasswordDialog.SelectHashMethod" ), 1 ); //$NON-NLS-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$ newPasswordPreviewText = BaseWidgetUtils.createReadonlyText( newPasswordComposite, "", 1 ); //$NON-NLS-1$ // New salt button newSaltButton = BaseWidgetUtils.createButton( newPasswordComposite, Messages .getString( "PasswordDialog.NewSalt" ), 1 ); //$NON-NLS-1$ newSaltButton.setLayoutData( new GridData() ); newSaltButton.setEnabled( false ); // New password preview details composite Composite newPasswordPreviewDetailsComposite = BaseWidgetUtils.createColumnContainer( newPasswordComposite, 2, 1 ); // New password preview hex label BaseWidgetUtils.createLabel( newPasswordPreviewDetailsComposite, Messages.getString( "PasswordDialog.PasswordHex" ), 1 ); //$NON-NLS-1$ newPasswordPreviewValueHexText = BaseWidgetUtils.createLabeledText( newPasswordPreviewDetailsComposite, ":", 1 ); //$NON-NLS-1$ // New password preview salt hex label BaseWidgetUtils.createLabel( newPasswordPreviewDetailsComposite, Messages.getString( "PasswordDialog.SaltHex" ), 1 ); //$NON-NLS-1$ newPasswordPreviewSaltHexText = BaseWidgetUtils.createLabeledText( newPasswordPreviewDetailsComposite, "", 1 ); //$NON-NLS-1$ // Show new password details button showNewPasswordDetailsButton = BaseWidgetUtils.createCheckbox( newPasswordPreviewDetailsComposite, Messages .getString( "PasswordDialog.ShowNewPasswordDetails" ), 2 ); //$NON-NLS-1$ // New password tab newPasswordTab = new TabItem( tabFolder, SWT.NONE ); newPasswordTab.setText( Messages.getString( "PasswordDialog.NewPassword" ) ); //$NON-NLS-1$ newPasswordTab.setControl( newPasswordComposite ); } /** * Adds the listeners. */ private void addListeners() { if ( displayMode == DisplayMode.CURRENT_AND_NEW_PASSWORD ) { showCurrentPasswordDetailsButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent arg0 ) { updateCurrentPasswordGroup(); } } ); testPasswordText.addModifyListener( new ModifyListener() { public void modifyText( ModifyEvent e ) { updateCurrentPasswordGroup(); } } ); showTestPasswordDetailsButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent arg0 ) { updateCurrentPasswordGroup(); } } ); verifyPasswordButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent event ) { verifyCurrentPassword(); } } ); bindPasswordButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent event ) { bindCurrentPassword(); } } ); } newPasswordText.addModifyListener( new ModifyListener() { public void modifyText( ModifyEvent e ) { updateNewPasswordGroup(); } } ); confirmNewPasswordText.addModifyListener( new ModifyListener() { public void modifyText( ModifyEvent e ) { updateNewPasswordGroup(); } } ); newPasswordHashMethodComboViewer.addSelectionChangedListener( new ISelectionChangedListener() { public void selectionChanged( SelectionChangedEvent event ) { updateNewPasswordGroup(); } } ); newSaltButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent event ) { updateNewPasswordGroup(); } } ); showNewPasswordDetailsButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent arg0 ) { updateNewPasswordGroup(); } } ); } /** * Updates the current password tab. */ private void updateCurrentPasswordGroup() { // set current password to the UI widgets if ( currentPassword != null ) { currentPasswordHashMethodText.setText( getCurrentPasswordHashMethodName() ); currentPasswordValueHexText.setText( Utils .getNonNullString( currentPassword.getHashedPasswordAsHexString() ) ); currentPasswordSaltHexText.setText( Utils.getNonNullString( currentPassword.getSaltAsHexString() ) ); currentPasswordText.setText( currentPassword.toString() ); } // show password details? if ( showCurrentPasswordDetailsButton.getSelection() ) { currentPasswordText.setEchoChar( '\0' ); currentPasswordValueHexText.setEchoChar( '\0' ); currentPasswordSaltHexText.setEchoChar( '\0' ); } else { currentPasswordText.setEchoChar( '\u2022' ); currentPasswordValueHexText.setEchoChar( '\u2022' ); currentPasswordSaltHexText.setEchoChar( currentPasswordSaltHexText.getText().equals( Utils.getNonNullString( null ) ) ? '\0' : '\u2022' ); } // enable/disable test field and buttons testPasswordText.setEnabled( currentPassword != null && currentPassword.getHashedPassword() != null && currentPassword.toBytes().length > 0 ); testBindDnText.setText( entry != null ? entry.getDn().getName() : Utils.getNonNullString( null ) ); if ( showTestPasswordDetailsButton.getSelection() ) { testPasswordText.setEchoChar( '\0' ); } else { testPasswordText.setEchoChar( '\u2022' ); } verifyPasswordButton.setEnabled( testPasswordText.isEnabled() && !"".equals( testPasswordText.getText() ) ); //$NON-NLS-1$ bindPasswordButton.setEnabled( testPasswordText.isEnabled() && !"".equals( testPasswordText.getText() ) //$NON-NLS-1$ && entry != null && entry.getBrowserConnection().getConnection() != null ); // default dialog button if ( verifyPasswordButton.isEnabled() ) { getShell().setDefaultButton( verifyPasswordButton ); } else { getShell().setDefaultButton( okButton ); } okButton.setEnabled( false ); } /** * Verifies the current password. */ private void verifyCurrentPassword() { String testPassword = testPasswordText.getText(); if ( currentPassword != null ) { if ( currentPassword.verify( testPassword ) ) { MessageDialog dialog = new MessageDialog( getShell(), Messages.getString( "PasswordDialog.PasswordVerification" ), getShell().getImage(), //$NON-NLS-1$ Messages.getString( "PasswordDialog.PasswordVerifiedSuccessfully" ), MessageDialog.INFORMATION, new String[] //$NON-NLS-1$ { IDialogConstants.OK_LABEL }, 0 ); dialog.open(); } else { IStatus status = new Status( IStatus.ERROR, ValueEditorsConstants.PLUGIN_ID, 1, Messages.getString( "PasswordDialog.PasswordVerificationFailed" ), null ); //$NON-NLS-1$ ConnectionUIPlugin.getDefault().getExceptionHandler().handleException( status ); } } } /** * Binds to the directory using the test password. */ private void bindCurrentPassword() { if ( !"".equals( testPasswordText.getText() ) && entry != null //$NON-NLS-1$ && entry.getBrowserConnection().getConnection() != null ) { Connection connection = ( Connection ) entry.getBrowserConnection().getConnection().clone(); connection.getConnectionParameter().setName( null ); connection.getConnectionParameter().setBindPrincipal( entry.getDn().getName() ); connection.getConnectionParameter().setBindPassword( testPasswordText.getText() ); connection.getConnectionParameter().setAuthMethod( AuthenticationMethod.SIMPLE ); CheckBindRunnable runnable = new CheckBindRunnable( connection ); IStatus status = RunnableContextRunner.execute( runnable, null, true ); if ( status.isOK() ) { MessageDialog.openInformation( Display.getDefault().getActiveShell(), Messages .getString( "PasswordDialog.CheckAuthentication" ), //$NON-NLS-1$ Messages.getString( "PasswordDialog.AuthenticationSuccessful" ) ); //$NON-NLS-1$ } } } /** * Updates the new password tab. */ private void updateNewPasswordGroup() { // set new password to the UI widgets newPassword = new Password( getSelectedNewPasswordHashMethod(), newPasswordText.getText() ); if ( !"".equals( newPasswordText.getText() ) //$NON-NLS-1$ && newPasswordText.getText().equals( confirmNewPasswordText.getText() ) ) { newPasswordPreviewValueHexText .setText( Utils.getNonNullString( newPassword.getHashedPasswordAsHexString() ) ); newPasswordPreviewSaltHexText.setText( Utils.getNonNullString( newPassword.getSaltAsHexString() ) ); newPasswordPreviewText.setText( newPassword.toString() ); newSaltButton.setEnabled( newPassword.getSalt() != null ); okButton.setEnabled( true ); getShell().setDefaultButton( okButton ); } else { newPassword = null; newPasswordPreviewValueHexText.setText( Utils.getNonNullString( null ) ); newPasswordPreviewSaltHexText.setText( Utils.getNonNullString( null ) ); newPasswordPreviewText.setText( Utils.getNonNullString( null ) ); newSaltButton.setEnabled( false ); okButton.setEnabled( false ); } // show password details? if ( showNewPasswordDetailsButton.getSelection() ) { newPasswordText.setEchoChar( '\0' ); confirmNewPasswordText.setEchoChar( '\0' ); newPasswordPreviewText.setEchoChar( '\0' ); newPasswordPreviewValueHexText.setEchoChar( '\0' ); newPasswordPreviewSaltHexText.setEchoChar( '\0' ); } else { newPasswordText.setEchoChar( '\u2022' ); confirmNewPasswordText.setEchoChar( '\u2022' ); newPasswordPreviewText.setEchoChar( newPasswordPreviewText.getText() .equals( Utils.getNonNullString( null ) ) ? '\0' : '\u2022' ); newPasswordPreviewValueHexText.setEchoChar( newPasswordPreviewValueHexText.getText().equals( Utils.getNonNullString( null ) ) ? '\0' : '\u2022' ); newPasswordPreviewSaltHexText.setEchoChar( newPasswordPreviewSaltHexText.getText().equals( Utils.getNonNullString( null ) ) ? '\0' : '\u2022' ); } } /** * Updates the tab folder and the tabs. */ private void updateTabFolder() { if ( testPasswordText != null && newPasswordText != null ) { if ( tabFolder.getSelectionIndex() == CURRENT_TAB ) { updateCurrentPasswordGroup(); testPasswordText.setFocus(); } else if ( tabFolder.getSelectionIndex() == NEW_TAB ) { updateNewPasswordGroup(); newPasswordText.setFocus(); } } } /** * 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 * algorithm or as plain text. */ public byte[] getNewPassword() { return returnPassword; } /** * This enum contains the display modes for the dialog. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ private enum DisplayMode { CURRENT_AND_NEW_PASSWORD, NEW_PASSWORD_ONLY } }