You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by se...@apache.org on 2007/04/09 11:53:23 UTC
svn commit: r526695 [2/2] - in
/directory/ldapstudio/trunk/ldapstudio-valueeditors: ./ META-INF/
resources/ resources/icons/ src/ src/main/ src/main/java/
src/main/java/org/ src/main/java/org/apache/
src/main/java/org/apache/directory/ src/main/java/or...
Added: directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/integer/IntegerValueEditor.java
URL: http://svn.apache.org/viewvc/directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/integer/IntegerValueEditor.java?view=auto&rev=526695
==============================================================================
--- directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/integer/IntegerValueEditor.java (added)
+++ directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/integer/IntegerValueEditor.java Mon Apr 9 02:53:20 2007
@@ -0,0 +1,67 @@
+/*
+ * 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.ldapstudio.valueeditors.integer;
+
+
+import org.apache.directory.ldapstudio.valueeditors.AbstractDialogStringValueEditor;
+import org.eclipse.swt.widgets.Shell;
+
+
+/**
+ * Implementation of IValueEditor for integer values.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class IntegerValueEditor extends AbstractDialogStringValueEditor
+{
+
+ /**
+ * {@inheritDoc}
+ *
+ * This implementation opens the IntegerDialog.
+ */
+ public boolean openDialog( Shell shell )
+ {
+ Object value = getValue();
+ if ( value != null && value instanceof String )
+ {
+ String stringValue = ( String ) value;
+ int intValue;
+ try
+ {
+ intValue = Integer.valueOf( stringValue );
+ }
+ catch ( NumberFormatException e )
+ {
+ intValue = 0;
+ }
+ IntegerDialog dialog = new IntegerDialog( shell, intValue );
+ if ( dialog.open() == IntegerDialog.OK && dialog.getInteger() != -1 )
+ {
+ setValue( Integer.toString( dialog.getInteger() ) );
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
Added: directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/objectclass/ObjectClassDialog.java
URL: http://svn.apache.org/viewvc/directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/objectclass/ObjectClassDialog.java?view=auto&rev=526695
==============================================================================
--- directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/objectclass/ObjectClassDialog.java (added)
+++ directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/objectclass/ObjectClassDialog.java Mon Apr 9 02:53:20 2007
@@ -0,0 +1,177 @@
+/*
+ * 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.ldapstudio.valueeditors.objectclass;
+
+
+import java.util.Arrays;
+
+import org.apache.directory.ldapstudio.browser.common.widgets.BaseWidgetUtils;
+import org.apache.directory.ldapstudio.browser.common.widgets.ListContentProposalProvider;
+import org.apache.directory.ldapstudio.browser.core.model.schema.Schema;
+import org.apache.directory.ldapstudio.valueeditors.ValueEditorsActivator;
+import org.apache.directory.ldapstudio.valueeditors.ValueEditorsConstants;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.fieldassist.ComboContentAdapter;
+import org.eclipse.jface.fieldassist.ContentProposalAdapter;
+import org.eclipse.jface.fieldassist.DecoratedField;
+import org.eclipse.jface.fieldassist.FieldDecoration;
+import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
+import org.eclipse.jface.fieldassist.IControlCreator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+
+/**
+ * This class provides a dialog to enter or select an object class.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class ObjectClassDialog extends Dialog
+{
+
+ /** The dialog title */
+ public static final String DIALOG_TITLE = "Object Class Editor";
+
+ /** The schema. */
+ private Schema schema;
+
+ /** The initial value. */
+ private String initialValue;
+
+ /** The object class combo field. */
+ private DecoratedField objectClassComboField;
+
+ /** The object class combo. */
+ private Combo objectClassCombo;
+
+ /** The object class content proposal adapter */
+ private ContentProposalAdapter objectClassCPA;
+
+ /** The return value. */
+ private String returnValue;
+
+
+ /**
+ * Creates a new instance of ObjectClassDialog.
+ *
+ * @param parentShell the parent shell
+ * @param schema the schema
+ * @param initialValue the initial value
+ */
+ public ObjectClassDialog( Shell parentShell, Schema schema, String initialValue )
+ {
+ super( parentShell );
+ super.setShellStyle( super.getShellStyle() | SWT.RESIZE );
+ this.initialValue = initialValue;
+ this.schema = schema;
+ this.returnValue = null;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void configureShell( Shell shell )
+ {
+ super.configureShell( shell );
+ shell.setText( DIALOG_TITLE );
+ shell.setImage( ValueEditorsActivator.getDefault().getImage( ValueEditorsConstants.IMG_OCDEDITOR ) );
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void createButtonsForButtonBar( Composite parent )
+ {
+ super.createButtonsForButtonBar( parent );
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void okPressed()
+ {
+ returnValue = objectClassCombo.getText();
+ super.okPressed();
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ protected Control createDialogArea( Composite parent )
+ {
+ // create composite
+ Composite composite = ( Composite ) super.createDialogArea( parent );
+ GridData gd = new GridData( GridData.FILL_BOTH );
+ gd.widthHint = convertHorizontalDLUsToPixels( IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH );
+ composite.setLayoutData( gd );
+
+ // combo widget
+ String[] allOcNames = schema.getObjectClassDescriptionNames();
+ Arrays.sort( allOcNames );
+
+ final FieldDecoration fieldDecoration = FieldDecorationRegistry.getDefault().getFieldDecoration(
+ FieldDecorationRegistry.DEC_CONTENT_PROPOSAL );
+ objectClassComboField = new DecoratedField( composite, SWT.NONE, new IControlCreator()
+ {
+ public Control createControl( Composite parent, int style )
+ {
+ Combo combo = BaseWidgetUtils.createCombo( parent, new String[0], -1, 1 );
+ combo.setVisibleItemCount( 20 );
+ return combo;
+ }
+ } );
+ objectClassComboField.addFieldDecoration( fieldDecoration, SWT.TOP | SWT.LEFT, true );
+ objectClassComboField.getLayoutControl().setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false ) );
+ objectClassCombo = ( Combo ) objectClassComboField.getControl();
+ objectClassCombo.setItems( allOcNames );
+ objectClassCombo.setText( initialValue );
+
+ // content proposal adapter
+ objectClassCPA = new ContentProposalAdapter( objectClassCombo, new ComboContentAdapter(),
+ new ListContentProposalProvider( objectClassCombo.getItems() ), null, null );
+ objectClassCPA.setFilterStyle( ContentProposalAdapter.FILTER_NONE );
+ objectClassCPA.setProposalAcceptanceStyle( ContentProposalAdapter.PROPOSAL_REPLACE );
+
+ applyDialogFont( composite );
+ return composite;
+ }
+
+
+ /**
+ * Gets the object class.
+ *
+ * @return the object class, null if canceled
+ */
+ public String getObjectClass()
+ {
+ return returnValue;
+ }
+}
Added: directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/objectclass/ObjectClassValueEditor.java
URL: http://svn.apache.org/viewvc/directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/objectclass/ObjectClassValueEditor.java?view=auto&rev=526695
==============================================================================
--- directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/objectclass/ObjectClassValueEditor.java (added)
+++ directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/objectclass/ObjectClassValueEditor.java Mon Apr 9 02:53:20 2007
@@ -0,0 +1,191 @@
+/*
+ * 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.ldapstudio.valueeditors.objectclass;
+
+
+import org.apache.directory.ldapstudio.browser.common.dialogs.TextDialog;
+import org.apache.directory.ldapstudio.browser.core.model.AttributeHierarchy;
+import org.apache.directory.ldapstudio.browser.core.model.IConnection;
+import org.apache.directory.ldapstudio.browser.core.model.IValue;
+import org.apache.directory.ldapstudio.browser.core.model.schema.ObjectClassDescription;
+import org.apache.directory.ldapstudio.browser.core.model.schema.Schema;
+import org.apache.directory.ldapstudio.valueeditors.AbstractDialogStringValueEditor;
+import org.eclipse.swt.widgets.Shell;
+
+
+/**
+ * Implementation of IValueEditor for attribute objectClass.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class ObjectClassValueEditor extends AbstractDialogStringValueEditor
+{
+
+ /**
+ * {@inheritDoc}
+ *
+ * This implementation opens the ObjectClassDialog.
+ */
+ public boolean openDialog( Shell shell )
+ {
+ Object value = getValue();
+ if ( value != null && value instanceof ObjectClassValueEditorRawValueWrapper )
+ {
+ ObjectClassValueEditorRawValueWrapper wrapper = ( ObjectClassValueEditorRawValueWrapper ) value;
+ ObjectClassDialog dialog = new ObjectClassDialog( shell, wrapper.schema, wrapper.objectClass );
+ if ( dialog.open() == TextDialog.OK && !"".equals( dialog.getObjectClass() ) )
+ {
+ setValue( dialog.getObjectClass() );
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ *
+ * This implementation appends the kind of object class,
+ * on of structural, abstract, auxiliary or obsolete.
+ */
+ public String getDisplayValue( IValue value )
+ {
+ if ( getRawValue( value ) == null )
+ {
+ return "NULL";
+ }
+
+ String displayValue = value.getStringValue();
+
+ if ( !showRawValues() && !"".equals( displayValue ) )
+ {
+ Schema schema = value.getAttribute().getEntry().getConnection().getSchema();
+ ObjectClassDescription ocd = schema.getObjectClassDescription( displayValue );
+ if ( ocd.isStructural() )
+ {
+ displayValue = displayValue + " (structural)";
+ }
+ else if ( ocd.isAbstract() )
+ {
+ displayValue = displayValue + " (abstract)";
+ }
+ else if ( ocd.isAuxiliary() )
+ {
+ displayValue = displayValue + " (auxiliary)";
+ }
+ else if ( ocd.isObsolete() )
+ {
+ displayValue = displayValue + " (obsolete)";
+ }
+ }
+
+ return displayValue;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ *
+ * Returns null.
+ * Modification in search result editor not supported.
+ */
+ public Object getRawValue( AttributeHierarchy attributeHierarchy )
+ {
+ return null;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ *
+ * Returns a ObjectClassValueEditorRawValueWrapper.
+ */
+ public Object getRawValue( IValue value )
+ {
+ if ( value == null || !value.isString() || !value.getAttribute().isObjectClassAttribute() )
+ {
+ return null;
+ }
+ else
+ {
+ return getRawValue( value.getAttribute().getEntry().getConnection(), value.getStringValue() );
+ }
+ }
+
+
+ /**
+ * {@inheritDoc}
+ *
+ * Returns a ObjectClassValueEditorRawValueWrapper.
+ */
+ public Object getRawValue( IConnection connection, Object value )
+ {
+ Schema schema = null;
+ if ( connection != null )
+ {
+ schema = connection.getSchema();
+ }
+ if ( schema == null || value == null || !( value instanceof String ) )
+ {
+ return null;
+ }
+
+ String ocValue = ( String ) value;
+ ObjectClassValueEditorRawValueWrapper wrapper = new ObjectClassValueEditorRawValueWrapper( schema, ocValue );
+ return wrapper;
+ }
+
+ /**
+ * The ObjectClassValueEditorRawValueWrapper is used to pass contextual
+ * information to the opened ObjectClassDialog.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+ private class ObjectClassValueEditorRawValueWrapper
+ {
+ /**
+ * The schema, used in ObjectClassDialog to build the list
+ * with possible object classes.
+ */
+ private Schema schema;
+
+ /** The object class, used as initial value in ObjectClassDialog. */
+ private String objectClass;
+
+
+ /**
+ * Creates a new instance of ObjectClassValueEditorRawValueWrapper.
+ *
+ * @param schema the schema
+ * @param objectClass the object class
+ */
+ private ObjectClassValueEditorRawValueWrapper( Schema schema, String objectClass )
+ {
+ super();
+ this.schema = schema;
+ this.objectClass = objectClass;
+ }
+ }
+
+}
Added: directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/password/PasswordDialog.java
URL: http://svn.apache.org/viewvc/directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/password/PasswordDialog.java?view=auto&rev=526695
==============================================================================
--- directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/password/PasswordDialog.java (added)
+++ directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/password/PasswordDialog.java Mon Apr 9 02:53:20 2007
@@ -0,0 +1,483 @@
+/*
+ * 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.ldapstudio.valueeditors.password;
+
+
+import java.util.Arrays;
+
+import org.apache.directory.ldapstudio.browser.common.jobs.RunnableContextJobAdapter;
+import org.apache.directory.ldapstudio.browser.common.widgets.BaseWidgetUtils;
+import org.apache.directory.ldapstudio.browser.core.jobs.CheckBindJob;
+import org.apache.directory.ldapstudio.browser.core.model.IConnection;
+import org.apache.directory.ldapstudio.browser.core.model.IEntry;
+import org.apache.directory.ldapstudio.browser.core.model.Password;
+import org.apache.directory.ldapstudio.browser.core.utils.Utils;
+import org.apache.directory.ldapstudio.valueeditors.ValueEditorsActivator;
+import org.apache.directory.ldapstudio.valueeditors.ValueEditorsConstants;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+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.Combo;
+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;
+
+
+public class PasswordDialog extends Dialog
+{
+
+ public static final String DIALOG_TITLE = "Password Editor";
+
+ public static final String[] HASH_METHODS =
+ { Password.HASH_METHOD_SHA, Password.HASH_METHOD_SSHA, Password.HASH_METHOD_MD5, Password.HASH_METHOD_SMD5,
+ Password.HASH_METHOD_CRYPT, Password.HASH_METHOD_NO };
+
+ public static final int CURRENT_TAB = 0;
+
+ public static final int NEW_TAB = 1;
+
+ public static final String SELECTED_TAB_DIALOGSETTINGS_KEY = PasswordDialog.class.getName() + ".tab";
+
+ public static final String SELECTED_HASH_METHOD_DIALOGSETTINGS_KEY = PasswordDialog.class.getName() + ".hashMethod";
+
+ private TabFolder tabFolder;
+
+ private TabItem currentTab;
+
+ private TabItem newTab;
+
+ private IEntry entry;
+
+ private Password currentPassword;
+
+ private Composite currentPasswordContainer;
+
+ private Text currentPasswordText;
+
+ private Text currentPasswordHashMethodText;
+
+ private Text currentPasswordValueHexText;
+
+ private Text currentPasswordSaltHexText;
+
+ private Text testPasswordText;
+
+ private Button verifyPasswordButton;
+
+ private Button bindPasswordButton;
+
+ private Password newPassword;
+
+ private Composite newPasswordContainer;
+
+ private Text newPasswordText;
+
+ private Combo newPasswordHashMethodCombo;
+
+ private Text newPasswordPreviewText;
+
+ private Text newPasswordPreviewValueHexText;
+
+ private Text newPasswordPreviewSaltHexText;
+
+ private Button newSaltButton;
+
+ private byte[] returnPassword;
+
+ private Button okButton;
+
+
+ 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;
+ }
+
+
+ protected void configureShell( Shell shell )
+ {
+ super.configureShell( shell );
+ shell.setText( DIALOG_TITLE );
+ shell.setImage( ValueEditorsActivator.getDefault().getImage( ValueEditorsConstants.IMG_PASSWORDEDITOR ) );
+ }
+
+
+ protected void okPressed()
+ {
+ // create password
+ if ( newPassword != null )
+ {
+ this.returnPassword = this.newPassword.toBytes();
+ }
+ else
+ {
+ this.returnPassword = null;
+ }
+
+ // save selected hash method to dialog settings, selected tab will be
+ // saved int close()
+ ValueEditorsActivator.getDefault().getDialogSettings().put( SELECTED_HASH_METHOD_DIALOGSETTINGS_KEY,
+ this.newPasswordHashMethodCombo.getText() );
+
+ super.okPressed();
+ }
+
+
+ public boolean close()
+ {
+ // save selected tab to dialog settings
+ ValueEditorsActivator.getDefault().getDialogSettings().put( SELECTED_TAB_DIALOGSETTINGS_KEY,
+ this.tabFolder.getSelectionIndex() );
+
+ return super.close();
+ }
+
+
+ protected void createButtonsForButtonBar( Composite parent )
+ {
+ okButton = createButton( parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, false );
+ createButton( parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false );
+
+ // load dialog settings
+ try
+ {
+ int tabIndex = ValueEditorsActivator.getDefault().getDialogSettings().getInt( SELECTED_TAB_DIALOGSETTINGS_KEY );
+ if ( this.currentPassword == null || this.currentPassword.toBytes().length == 0 )
+ {
+ tabIndex = NEW_TAB;
+ }
+ this.tabFolder.setSelection( tabIndex );
+ }
+ catch ( Exception e )
+ {
+ }
+ try
+ {
+ String hashMethod = ValueEditorsActivator.getDefault().getDialogSettings()
+ .get( SELECTED_HASH_METHOD_DIALOGSETTINGS_KEY );
+ if ( Arrays.asList( HASH_METHODS ).contains( hashMethod ) )
+ {
+ this.newPasswordHashMethodCombo.setText( hashMethod );
+ }
+ }
+ catch ( Exception e )
+ {
+ }
+
+ // update on load
+ updateTabFolder();
+ }
+
+
+ protected Control createDialogArea( Composite parent )
+ {
+
+ 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;
+ composite.setLayoutData( gd );
+
+ this.tabFolder = new TabFolder( composite, SWT.TOP );
+ GridLayout mainLayout = new GridLayout();
+ mainLayout.marginWidth = 0;
+ mainLayout.marginHeight = 0;
+ this.tabFolder.setLayout( mainLayout );
+ this.tabFolder.setLayoutData( new GridData( GridData.FILL_BOTH ) );
+ this.tabFolder.addSelectionListener( new SelectionAdapter()
+ {
+ public void widgetSelected( SelectionEvent e )
+ {
+ updateTabFolder();
+ }
+ } );
+
+ // current password
+ if ( this.currentPassword != null && this.currentPassword.toBytes().length > 0 )
+ {
+ currentPasswordContainer = new Composite( this.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 );
+ currentPasswordContainer.setLayout( currentLayout );
+
+ BaseWidgetUtils.createLabel( currentPasswordContainer, "Current Password:", 1 );
+ currentPasswordText = BaseWidgetUtils.createReadonlyText( currentPasswordContainer, "", 1 );
+
+ /* Label dummy = */new Label( currentPasswordContainer, SWT.NONE );
+ Composite currentPasswordDetailContainer = BaseWidgetUtils.createColumnContainer( currentPasswordContainer,
+ 2, 1 );
+ BaseWidgetUtils.createLabel( currentPasswordDetailContainer, "Hash Method:", 1 );
+ currentPasswordHashMethodText = BaseWidgetUtils.createLabeledText( currentPasswordDetailContainer, "", 1 );
+ BaseWidgetUtils.createLabel( currentPasswordDetailContainer, "Password (Hex):", 1 );
+ currentPasswordValueHexText = BaseWidgetUtils.createLabeledText( currentPasswordDetailContainer, "", 1 );
+ BaseWidgetUtils.createLabel( currentPasswordDetailContainer, "Salt (Hex):", 1 );
+ currentPasswordSaltHexText = BaseWidgetUtils.createLabeledText( currentPasswordDetailContainer, "", 1 );
+
+ BaseWidgetUtils.createLabel( currentPasswordContainer, "Verify Password:", 1 );
+ testPasswordText = BaseWidgetUtils.createPasswordText( currentPasswordContainer, "", 1 );
+ testPasswordText.addModifyListener( new ModifyListener()
+ {
+ public void modifyText( ModifyEvent e )
+ {
+ updateCurrentPasswordGroup();
+ }
+ } );
+
+ /* Label dummyLabel = */new Label( currentPasswordContainer, SWT.NONE );
+ Composite verifyPasswordButtonContainer = BaseWidgetUtils.createColumnContainer( currentPasswordContainer,
+ 2, 1 );
+ verifyPasswordButton = BaseWidgetUtils.createButton( verifyPasswordButtonContainer, "Verify", 1 );
+ verifyPasswordButton.setEnabled( false );
+ verifyPasswordButton.addSelectionListener( new SelectionAdapter()
+ {
+ public void widgetSelected( SelectionEvent event )
+ {
+ verifyCurrentPassword();
+ }
+ } );
+ bindPasswordButton = BaseWidgetUtils.createButton( verifyPasswordButtonContainer, "Bind", 1 );
+ bindPasswordButton.setEnabled( false );
+ bindPasswordButton.addSelectionListener( new SelectionAdapter()
+ {
+ public void widgetSelected( SelectionEvent event )
+ {
+ bindCurrentPassword();
+ }
+ } );
+
+ this.currentTab = new TabItem( this.tabFolder, SWT.NONE );
+ this.currentTab.setText( "Current Password" );
+ this.currentTab.setControl( currentPasswordContainer );
+ }
+
+ // new password
+ newPasswordContainer = new Composite( this.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 );
+ newPasswordContainer.setLayout( newLayout );
+
+ BaseWidgetUtils.createLabel( newPasswordContainer, "Enter New Password:", 1 );
+ newPasswordText = BaseWidgetUtils.createPasswordText( newPasswordContainer, "", 1 );
+ newPasswordText.addModifyListener( new ModifyListener()
+ {
+ public void modifyText( ModifyEvent e )
+ {
+ updateNewPasswordGroup();
+ }
+ } );
+
+ BaseWidgetUtils.createLabel( newPasswordContainer, "Select Hash Method:", 1 );
+ newPasswordHashMethodCombo = BaseWidgetUtils.createReadonlyCombo( newPasswordContainer, HASH_METHODS, 0, 1 );
+ newPasswordHashMethodCombo.addSelectionListener( new SelectionAdapter()
+ {
+ public void widgetSelected( SelectionEvent event )
+ {
+ updateNewPasswordGroup();
+ }
+ } );
+
+ BaseWidgetUtils.createLabel( newPasswordContainer, "Password Preview:", 1 );
+ newPasswordPreviewText = BaseWidgetUtils.createReadonlyText( newPasswordContainer, "", 1 );
+
+ newSaltButton = BaseWidgetUtils.createButton( newPasswordContainer, "New Salt", 1 );
+ newSaltButton.setEnabled( false );
+ newSaltButton.addSelectionListener( new SelectionAdapter()
+ {
+ public void widgetSelected( SelectionEvent event )
+ {
+ updateNewPasswordGroup();
+ }
+ } );
+ Composite newPasswordPreviewDetailContainer = BaseWidgetUtils
+ .createColumnContainer( newPasswordContainer, 2, 1 );
+ BaseWidgetUtils.createLabel( newPasswordPreviewDetailContainer, "Password (Hex):", 1 );
+ newPasswordPreviewValueHexText = BaseWidgetUtils.createLabeledText( newPasswordPreviewDetailContainer, ":", 1 );
+ BaseWidgetUtils.createLabel( newPasswordPreviewDetailContainer, "Salt (Hex):", 1 );
+ newPasswordPreviewSaltHexText = BaseWidgetUtils.createLabeledText( newPasswordPreviewDetailContainer, "", 1 );
+
+ this.newTab = new TabItem( this.tabFolder, SWT.NONE );
+ this.newTab.setText( "New Password" );
+ this.newTab.setControl( newPasswordContainer );
+
+ applyDialogFont( composite );
+ return composite;
+ }
+
+
+ private void updateCurrentPasswordGroup()
+ {
+ if ( this.currentPassword != null )
+ {
+ this.currentPasswordHashMethodText.setText( Utils.getNonNullString( this.currentPassword.getHashMethod() ) );
+ this.currentPasswordValueHexText.setText( Utils.getNonNullString( this.currentPassword
+ .getHashedPasswordAsHexString() ) );
+ this.currentPasswordSaltHexText
+ .setText( Utils.getNonNullString( this.currentPassword.getSaltAsHexString() ) );
+ this.currentPasswordText.setText( this.currentPassword.toString() );
+ }
+
+ this.testPasswordText.setEnabled( this.currentPassword != null
+ && this.currentPassword.getHashedPassword() != null && this.currentPassword.toBytes().length > 0 );
+ this.verifyPasswordButton.setEnabled( this.testPasswordText.isEnabled()
+ && !"".equals( this.testPasswordText.getText() ) );
+ this.bindPasswordButton.setEnabled( this.testPasswordText.isEnabled()
+ && !"".equals( this.testPasswordText.getText() ) && this.entry != null );
+
+ if ( this.verifyPasswordButton.isEnabled() )
+ getShell().setDefaultButton( this.verifyPasswordButton );
+ else
+ getShell().setDefaultButton( this.okButton );
+ // this.currentPasswordText.getParent().layout();
+ }
+
+
+ private void verifyCurrentPassword()
+ {
+ String testPassword = this.testPasswordText.getText();
+ if ( this.currentPassword != null )
+ {
+ if ( this.currentPassword.verify( testPassword ) )
+ {
+ MessageDialog dialog = new MessageDialog( getShell(), "Password Verification", getShell().getImage(),
+ "Password verified sucessfully", MessageDialog.INFORMATION, new String[]
+ { IDialogConstants.OK_LABEL }, 0 );
+ dialog.open();
+ }
+ else
+ {
+ MessageDialog dialog = new MessageDialog( getShell(), "Password Verification", getShell().getImage(),
+ "Password verification failed", MessageDialog.ERROR, new String[]
+ { IDialogConstants.OK_LABEL }, 0 );
+ dialog.open();
+ }
+ }
+ }
+
+
+ private void bindCurrentPassword()
+ {
+
+ if ( !"".equals( this.testPasswordText.getText() ) && this.entry != null )
+ {
+
+ IConnection connection = ( IConnection ) this.entry.getConnection().clone();;
+ connection.setName( null );
+ connection.setBindPrincipal( this.entry.getDn().toString() );
+ connection.setBindPassword( this.testPasswordText.getText() );
+ connection.setAuthMethod( IConnection.AUTH_SIMPLE );
+
+ CheckBindJob job = new CheckBindJob( connection );
+ RunnableContextJobAdapter.execute( job );
+ if ( job.getExternalResult().isOK() )
+ {
+ MessageDialog.openInformation( Display.getDefault().getActiveShell(), "Check Authentication",
+ "The authentication was successful." );
+ }
+
+ }
+ }
+
+
+ private void updateNewPasswordGroup()
+ {
+ this.newPassword = new Password( this.newPasswordHashMethodCombo.getText(), this.newPasswordText.getText() );
+ if ( !"".equals( this.newPasswordText.getText() ) || this.newPassword.getHashMethod() == null )
+ {
+ newPasswordPreviewValueHexText.setText( Utils.getNonNullString( this.newPassword
+ .getHashedPasswordAsHexString() ) );
+ newPasswordPreviewSaltHexText.setText( Utils.getNonNullString( this.newPassword.getSaltAsHexString() ) );
+ newPasswordPreviewText.setText( this.newPassword.toString() );
+ newSaltButton.setEnabled( this.newPassword.getSalt() != null );
+ this.okButton.setEnabled( true );
+ getShell().setDefaultButton( this.okButton );
+ }
+ else
+ {
+ this.newPassword = null;
+ newPasswordPreviewValueHexText.setText( Utils.getNonNullString( null ) );
+ newPasswordPreviewSaltHexText.setText( Utils.getNonNullString( null ) );
+ newPasswordPreviewText.setText( Utils.getNonNullString( null ) );
+ newSaltButton.setEnabled( false );
+ this.okButton.setEnabled( false );
+ }
+ }
+
+
+ private void updateTabFolder()
+ {
+ if ( testPasswordText != null && newPasswordText != null )
+ {
+ if ( tabFolder.getSelectionIndex() == CURRENT_TAB )
+ {
+ testPasswordText.setFocus();
+ }
+ else if ( tabFolder.getSelectionIndex() == NEW_TAB )
+ {
+ newPasswordText.setFocus();
+ }
+ updateCurrentPasswordGroup();
+ updateNewPasswordGroup();
+ }
+ }
+
+
+ /**
+ *
+ *
+ * @return Returns the password, either encypted by the selected
+ * algorithm or as plain text.
+ */
+ public byte[] getNewPassword()
+ {
+ return this.returnPassword;
+ }
+
+}
Added: directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/password/PasswordValueEditor.java
URL: http://svn.apache.org/viewvc/directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/password/PasswordValueEditor.java?view=auto&rev=526695
==============================================================================
--- directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/password/PasswordValueEditor.java (added)
+++ directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/password/PasswordValueEditor.java Mon Apr 9 02:53:20 2007
@@ -0,0 +1,181 @@
+/*
+ * 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.ldapstudio.valueeditors.password;
+
+
+import org.apache.directory.ldapstudio.browser.common.dialogs.TextDialog;
+import org.apache.directory.ldapstudio.browser.core.model.IAttribute;
+import org.apache.directory.ldapstudio.browser.core.model.IConnection;
+import org.apache.directory.ldapstudio.browser.core.model.IEntry;
+import org.apache.directory.ldapstudio.browser.core.model.IValue;
+import org.apache.directory.ldapstudio.valueeditors.AbstractDialogBinaryValueEditor;
+import org.eclipse.swt.widgets.Shell;
+
+
+/**
+ * Implementation of IValueEditor for attribute userPassword.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class PasswordValueEditor extends AbstractDialogBinaryValueEditor
+{
+
+ /**
+ * {@inheritDoc}
+ *
+ * This implementation opens the PasswordDialog.
+ */
+ protected boolean openDialog( Shell shell )
+ {
+ Object value = getValue();
+ if ( value != null && value instanceof PasswordValueEditorRawValueWrapper )
+ {
+ PasswordValueEditorRawValueWrapper wrapper = ( PasswordValueEditorRawValueWrapper ) value;
+ if ( wrapper.password != null && wrapper.password instanceof byte[] )
+ {
+ byte[] pw = ( byte[] ) wrapper.password;
+ PasswordDialog dialog = new PasswordDialog( shell, pw, wrapper.entry );
+ if ( dialog.open() == TextDialog.OK )
+ {
+ setValue( dialog.getNewPassword() );
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ *
+ * This implementation returns information about the
+ * used hash algorithm. The value stored in directory
+ * is only display when the showRawValues option is
+ * active.
+ */
+ public String getDisplayValue( IValue value )
+ {
+ if ( showRawValues() )
+ {
+ return getPrintableString( value );
+ }
+ else
+ {
+ if ( value == null )
+ {
+ return "NULL";
+ }
+
+ String password = value.getStringValue();;
+ if ( password == null )
+ {
+ return "NULL";
+ }
+ else
+ {
+ String text;
+ if ( "".equals( password ) )
+ {
+ text = "Empty password";
+ }
+ else if ( password.indexOf( '{' ) == 0 && password.indexOf( '}' ) > 0 )
+ {
+ String encryptionMethod = password.substring( password.indexOf( '{' ) + 1, password.indexOf( '}' ) );
+ text = encryptionMethod + " encrypted password";
+ }
+ else
+ {
+ text = "Plain text password";
+ }
+ return text;
+ }
+ }
+ }
+
+
+ /**
+ * {@inheritDoc}
+ *
+ * Returns a PasswordValueEditorRawValueWrapper with empty
+ * password.
+ */
+ protected Object getEmptyRawValue( IAttribute attribute )
+ {
+ return new PasswordValueEditorRawValueWrapper( new byte[0], attribute.getEntry() );
+ }
+
+
+ /**
+ * {@inheritDoc}
+ *
+ * Returns a PasswordValueEditorRawValueWrapper.
+ */
+ public Object getRawValue( IValue value )
+ {
+ Object password = super.getRawValue( value );
+ return new PasswordValueEditorRawValueWrapper( password, value.getAttribute().getEntry() );
+ }
+
+
+ /**
+ * {@inheritDoc}
+ *
+ * Returns a PasswordValueEditorRawValueWrapper with
+ * null entry.
+ */
+ public Object getRawValue( IConnection connection, Object value )
+ {
+ Object password = super.getRawValue( connection, value );
+ return new PasswordValueEditorRawValueWrapper( password, null );
+ }
+
+ /**
+ * The PasswordValueEditorRawValueWrapper is used to pass contextual
+ * information to the opened PasswordDialog.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+ private class PasswordValueEditorRawValueWrapper
+ {
+ /** The password, used as initial value in PasswordDialog */
+ private Object password;
+
+ /** The entry, used for the bind operation in PasswordDialog */
+ private IEntry entry;
+
+
+ /**
+ * Creates a new instance of PasswordValueEditorRawValueWrapper.
+ *
+ * @param password the password
+ * @param entry the entry
+ */
+ private PasswordValueEditorRawValueWrapper( Object password, IEntry entry )
+ {
+ this.password = password;
+ this.entry = entry;
+ }
+ }
+
+}
Added: directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/time/InPlaceGeneralizedTimeValueEditor.java
URL: http://svn.apache.org/viewvc/directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/time/InPlaceGeneralizedTimeValueEditor.java?view=auto&rev=526695
==============================================================================
--- directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/time/InPlaceGeneralizedTimeValueEditor.java (added)
+++ directory/ldapstudio/trunk/ldapstudio-valueeditors/src/main/java/org/apache/directory/ldapstudio/valueeditors/time/InPlaceGeneralizedTimeValueEditor.java Mon Apr 9 02:53:20 2007
@@ -0,0 +1,95 @@
+/*
+ * 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.ldapstudio.valueeditors.time;
+
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.apache.directory.ldapstudio.browser.core.model.IValue;
+import org.apache.directory.ldapstudio.valueeditors.AbstractInPlaceStringValueEditor;
+
+
+/**
+ * Implementation of IValueEditor for syntax 1.3.6.1.4.1.1466.115.121.1.24
+ * (Generalized Time).
+ *
+ * Currently only the getDisplayXXX() methods are implemented.
+ * For modification the raw string must be edited.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class InPlaceGeneralizedTimeValueEditor extends AbstractInPlaceStringValueEditor
+{
+
+ /**
+ * {@inheritDoc}
+ *
+ * Returns the proper formatted date and time, Timezone is
+ * convertet to the default locale.
+ *
+ * Can handle
+ * <ul>
+ * <li>default LDAP format: yyyyMMddHHmmssZ
+ * <li>Active Directory format: yyyyMMddHHmmss.SSSZ
+ * </ul>
+ */
+ public String getDisplayValue( IValue value )
+ {
+ String displayValue = super.getDisplayValue( value );
+
+ if ( !showRawValues() )
+ {
+ DateFormat ldapFormat = new SimpleDateFormat( "yyyyMMddHHmmssZ" );
+ DateFormat activeDirectoryFormat = new SimpleDateFormat( "yyyyMMddHHmmss'.'SSSZ" );
+ DateFormat targetFormat = DateFormat.getDateTimeInstance( DateFormat.MEDIUM, DateFormat.LONG );
+
+ String s = displayValue;
+ if ( s.matches( "[\\.0-9]+Z" ) )
+ {
+ s = s.replaceAll( "Z", "GMT" );
+ }
+
+ try
+ {
+ Date date = ldapFormat.parse( s );
+ displayValue = targetFormat.format( date ) + " (" + displayValue + ")";
+ }
+ catch ( ParseException e1 )
+ {
+ try
+ {
+ Date date = activeDirectoryFormat.parse( s );
+ displayValue = targetFormat.format( date ) + " (" + displayValue + ")";
+ }
+ catch ( ParseException e2 )
+ {
+ }
+ }
+ }
+
+ return displayValue;
+ }
+
+}