/*
* 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.openldap.config.editor.databases;
import java.util.ArrayList;
import java.util.List;
import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
import org.apache.directory.api.ldap.model.name.Dn;
import org.apache.directory.api.util.Strings;
import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
import org.eclipse.jface.viewers.ArrayContentProvider;
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.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
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.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.apache.directory.studio.openldap.common.ui.dialogs.AttributeDialog;
import org.apache.directory.studio.openldap.common.ui.widgets.EntryWidget;
import org.apache.directory.studio.openldap.config.OpenLdapConfigurationPlugin;
import org.apache.directory.studio.openldap.config.OpenLdapConfigurationPluginConstants;
import org.apache.directory.studio.openldap.config.model.AuxiliaryObjectClass;
import org.apache.directory.studio.openldap.config.model.OlcFrontendConfig;
import org.apache.directory.studio.openldap.config.model.database.OlcDatabaseConfig;
/**
* This interface represents a block for Frontend Specific Details.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class FrontendDatabaseSpecificDetailsBlock extends AbstractDatabaseSpecificDetailsBlock<OlcDatabaseConfig>
{
private static final String SHA = "{SHA}";
private static final String SSHA = "{SSHA}";
private static final String CRYPT = "{CRYPT}";
private static final String MD5 = "{MD5}";
private static final String SMD5 = "{SMD5}";
private static final String CLEARTEXT = "{CLEARTEXT}";
/** The list of sorted attributes values */
private List<String> sortedValuesAttributesList = new ArrayList<String>();
// UI Fields
private EntryWidget defaultSearchBaseEntryWidget;
private Button shaCheckbox;
private Button sshaCheckbox;
private Button cryptCheckbox;
private Button md5Checkbox;
private Button smd5Checkbox;
private Button cleartextCheckbox;
private Table sortedValuesTable;
private TableViewer sortedValuesTableViewer;
private Button addSortedValueButton;
private Button deleteSortedValueButton;
// Listeners
private ISelectionChangedListener sortedValuesTableViewerSelectionChangedListener = new ISelectionChangedListener()
{
public void selectionChanged( SelectionChangedEvent event )
{
deleteSortedValueButton.setEnabled( !sortedValuesTableViewer.getSelection().isEmpty() );
}
};
private SelectionListener addSortedValueButtonSelectionListener = new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
AttributeDialog dialog = new AttributeDialog( addSortedValueButton.getShell(), browserConnection );
if ( dialog.open() == AttributeDialog.OK )
{
String attribute = dialog.getAttribute();
if ( !sortedValuesAttributesList.contains( attribute ) )
{
sortedValuesAttributesList.add( attribute );
sortedValuesTableViewer.refresh();
sortedValuesTableViewer.setSelection( new StructuredSelection( attribute ) );
detailsPage.setEditorDirty();
}
}
}
};
private SelectionListener deleteSortedValueButtonSelectionListener = new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
StructuredSelection selection = ( StructuredSelection ) sortedValuesTableViewer.getSelection();
if ( !selection.isEmpty() )
{
String selectedAttribute = ( String ) selection.getFirstElement();
sortedValuesAttributesList.remove( selectedAttribute );
sortedValuesTableViewer.refresh();
detailsPage.setEditorDirty();
}
}
};
/**
* Creates a new instance of FrontendDatabaseSpecificDetailsBlock.
*
* @param detailsPage the details page
* @param database the database
* @param browserConnection the connection
*/
public FrontendDatabaseSpecificDetailsBlock( DatabasesDetailsPage detailsPage, OlcDatabaseConfig database,
IBrowserConnection browserConnection )
{
super( detailsPage, database, browserConnection );
}
/**
* {@inheritDoc}
*/
public Composite createBlockContent( Composite parent, FormToolkit toolkit )
{
// Composite
Composite composite = toolkit.createComposite( parent );
composite.setLayout( new GridLayout( 2, false ) );
composite.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// Default Search Base Text
toolkit.createLabel( composite, "Default Search Base:" );
defaultSearchBaseEntryWidget = new EntryWidget( browserConnection, null, true );
defaultSearchBaseEntryWidget.createWidget( composite, toolkit );
defaultSearchBaseEntryWidget.getControl().setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// Password Hash
createPasswordHashContent( composite, toolkit );
// Sorted Values Attributes
createSortedValuesAttributesContent( composite, toolkit );
return composite;
}
/**
* Creates the content for the password hash.
*
* @param parent the parent composite
* @param toolkit the toolkit
*/
private void createPasswordHashContent( Composite parent, FormToolkit toolkit )
{
// Label
Label passwordHashLabel = toolkit.createLabel( parent, "Password Hash:" );
passwordHashLabel.setLayoutData( new GridData( SWT.NONE, SWT.TOP, false, false ) );
// Composite
Composite passwordHashComposite = toolkit.createComposite( parent );
GridLayout passwordHashCompositeGridLayout = new GridLayout( 3, true );
passwordHashCompositeGridLayout.marginHeight = passwordHashCompositeGridLayout.marginWidth = 0;
passwordHashComposite.setLayout( passwordHashCompositeGridLayout );
passwordHashComposite.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// SHA Checkbox
shaCheckbox = toolkit.createButton( passwordHashComposite, "SHA", SWT.CHECK );
// SSHA Checkbox
sshaCheckbox = toolkit.createButton( passwordHashComposite, "SSHA", SWT.CHECK );
// CRYPT Checkbox
cryptCheckbox = toolkit.createButton( passwordHashComposite, "CRYPT", SWT.CHECK );
// MD5 Checkbox
md5Checkbox = toolkit.createButton( passwordHashComposite, "MD5", SWT.CHECK );
// SMD5 Checkbox
smd5Checkbox = toolkit.createButton( passwordHashComposite, "SMD5", SWT.CHECK );
// CLEARTEXT Checkbox
cleartextCheckbox = toolkit.createButton( passwordHashComposite, "CLEARTEXT", SWT.CHECK );
}
/**
* Creates the content for the sorted values attributes.
*
* @param parent the parent composite
* @param toolkit the toolkit
*/
private void createSortedValuesAttributesContent( Composite parent, FormToolkit toolkit )
{
// Label
Label sortedValuesLabel = toolkit.createLabel( parent, "Maintain sorted values for these attributes:" );
sortedValuesLabel.setLayoutData( new GridData( SWT.NONE, SWT.NONE, false, false, 2, 1 ) );
// Composite
Composite sortedValuesComposite = toolkit.createComposite( parent );
GridLayout attributesCompositeGridLayout = new GridLayout( 2, false );
attributesCompositeGridLayout.marginHeight = attributesCompositeGridLayout.marginWidth = 0;
// attributesCompositeGridLayout.verticalSpacing = attributesCompositeGridLayout.horizontalSpacing = 0;
sortedValuesComposite.setLayout( attributesCompositeGridLayout );
sortedValuesComposite.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false, 2, 1 ) );
// Table and Table Viewer
sortedValuesTable = toolkit.createTable( sortedValuesComposite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER );
GridData gd = new GridData( SWT.FILL, SWT.FILL, true, true, 1, 3 );
gd.heightHint = 20;
gd.widthHint = 100;
sortedValuesTable.setLayoutData( gd );
sortedValuesTableViewer = new TableViewer( sortedValuesTable );
sortedValuesTableViewer.setContentProvider( new ArrayContentProvider() );
sortedValuesTableViewer.setLabelProvider( new LabelProvider()
{
public Image getImage( Object element )
{
return OpenLdapConfigurationPlugin.getDefault().getImage(
OpenLdapConfigurationPluginConstants.IMG_ATTRIBUTE );
}
} );
sortedValuesTableViewer.setInput( sortedValuesAttributesList );
// Add Button
addSortedValueButton = toolkit.createButton( sortedValuesComposite, "Add...", SWT.PUSH );
addSortedValueButton.setLayoutData( new GridData( SWT.FILL, SWT.BEGINNING, false, false ) );
// Delete Button
deleteSortedValueButton = toolkit.createButton( sortedValuesComposite, "Delete", SWT.PUSH );
deleteSortedValueButton.setEnabled( false );
deleteSortedValueButton.setLayoutData( new GridData( SWT.FILL, SWT.BEGINNING, false, false ) );
}
/**
* {@inheritDoc}
*/
public void refresh()
{
removeListeners();
if ( database != null )
{
OlcFrontendConfig frontendConfig = getFrontendConfig();
if ( frontendConfig == null )
{
// Default Search Base
defaultSearchBaseEntryWidget.setInput( null );
// Password Hash
shaCheckbox.setSelection( false );
sshaCheckbox.setSelection( false );
cryptCheckbox.setSelection( false );
md5Checkbox.setSelection( false );
smd5Checkbox.setSelection( false );
cleartextCheckbox.setSelection( false );
// Sorted Values Attributes
sortedValuesAttributesList.clear();
sortedValuesTableViewer.refresh();
}
else
{
// Default Search Base
String defaultSearchBase = frontendConfig.getOlcDefaultSearchBase();
if ( Strings.isEmpty( defaultSearchBase ) )
{
defaultSearchBaseEntryWidget.setInput( null );
}
else
{
try
{
defaultSearchBaseEntryWidget.setInput( new Dn( defaultSearchBase ) );
}
catch ( LdapInvalidDnException e )
{
// Nothing to do.
}
}
// Password Hash
List<String> passwordHashList = frontendConfig.getOlcPasswordHash();
if ( ( passwordHashList != null ) && ( passwordHashList.size() > 0 ) )
{
shaCheckbox.setSelection( passwordHashList.contains( SHA ) );
sshaCheckbox.setSelection( passwordHashList.contains( SSHA ) );
cryptCheckbox.setSelection( passwordHashList.contains( CRYPT ) );
md5Checkbox.setSelection( passwordHashList.contains( MD5 ) );
smd5Checkbox.setSelection( passwordHashList.contains( SMD5 ) );
cleartextCheckbox.setSelection( passwordHashList.contains( CLEARTEXT ) );
}
// Sorted Values Attributes
sortedValuesAttributesList.clear();
List<String> sortVals = frontendConfig.getOlcSortVals();
for ( String attribute : sortVals )
{
sortedValuesAttributesList.add( attribute );
}
sortedValuesTableViewer.refresh();
}
}
addListeners();
}
/**
* Adds the listeners.
*/
private void addListeners()
{
defaultSearchBaseEntryWidget.addWidgetModifyListener( dirtyWidgetModifyListener );
sortedValuesTableViewer.addSelectionChangedListener( sortedValuesTableViewerSelectionChangedListener );
addSortedValueButton.addSelectionListener( addSortedValueButtonSelectionListener );
deleteSortedValueButton.addSelectionListener( deleteSortedValueButtonSelectionListener );
shaCheckbox.addSelectionListener( dirtySelectionListener );
sshaCheckbox.addSelectionListener( dirtySelectionListener );
cryptCheckbox.addSelectionListener( dirtySelectionListener );
md5Checkbox.addSelectionListener( dirtySelectionListener );
smd5Checkbox.addSelectionListener( dirtySelectionListener );
cleartextCheckbox.addSelectionListener( dirtySelectionListener );
}
/**
* Removes the listeners
*/
private void removeListeners()
{
defaultSearchBaseEntryWidget.removeWidgetModifyListener( dirtyWidgetModifyListener );
sortedValuesTableViewer.removeSelectionChangedListener( sortedValuesTableViewerSelectionChangedListener );
addSortedValueButton.removeSelectionListener( addSortedValueButtonSelectionListener );
deleteSortedValueButton.removeSelectionListener( deleteSortedValueButtonSelectionListener );
shaCheckbox.removeSelectionListener( dirtySelectionListener );
sshaCheckbox.removeSelectionListener( dirtySelectionListener );
cryptCheckbox.removeSelectionListener( dirtySelectionListener );
md5Checkbox.removeSelectionListener( dirtySelectionListener );
smd5Checkbox.removeSelectionListener( dirtySelectionListener );
cleartextCheckbox.removeSelectionListener( dirtySelectionListener );
}
/**
* Gets the frontend config.
*
* @return the frontend config
*/
private OlcFrontendConfig getFrontendConfig()
{
if ( database != null )
{
List<AuxiliaryObjectClass> auxiliaryObjectClassesList = database.getAuxiliaryObjectClasses();
if ( ( auxiliaryObjectClassesList != null ) && ( auxiliaryObjectClassesList.size() > 0 ) )
{
for ( AuxiliaryObjectClass auxiliaryObjectClass : auxiliaryObjectClassesList )
{
if ( auxiliaryObjectClass instanceof OlcFrontendConfig )
{
return ( OlcFrontendConfig ) auxiliaryObjectClass;
}
}
}
}
return null;
}
/**
* {@inheritDoc}
*/
public void commit( boolean onSave )
{
OlcFrontendConfig frontendConfig = getOrCreateFrontendConfig();
if ( frontendConfig != null )
{
// Default Search Base
Dn defaultSearchBase = defaultSearchBaseEntryWidget.getDn();
if ( defaultSearchBase == null )
{
frontendConfig.setOlcDefaultSearchBase( null );
}
else
{
frontendConfig.setOlcDefaultSearchBase( defaultSearchBase.toString() );
}
// Password Hash
frontendConfig.clearOlcPasswordHash();
if ( shaCheckbox.getSelection() )
{
frontendConfig.addOlcPasswordHash( SHA );
}
if ( sshaCheckbox.getSelection() )
{
frontendConfig.addOlcPasswordHash( SSHA );
}
if ( cryptCheckbox.getSelection() )
{
frontendConfig.addOlcPasswordHash( CRYPT );
}
if ( md5Checkbox.getSelection() )
{
frontendConfig.addOlcPasswordHash( MD5 );
}
if ( smd5Checkbox.getSelection() )
{
frontendConfig.addOlcPasswordHash( SMD5 );
}
if ( cleartextCheckbox.getSelection() )
{
frontendConfig.addOlcPasswordHash( CLEARTEXT );
}
// Sorted Values Attributes
frontendConfig.clearOlcSortVals();
for ( String attribute : sortedValuesAttributesList )
{
frontendConfig.addOlcSortVals( attribute );
}
}
}
/**
* Gets the frontend config or creates one if it's not available.
*
* @return the frontend config
*/
private OlcFrontendConfig getOrCreateFrontendConfig()
{
OlcFrontendConfig frontendConfig = getFrontendConfig();
if ( ( frontendConfig == null ) && ( database != null ) )
{
frontendConfig = new OlcFrontendConfig();
database.addAuxiliaryObjectClasses( frontendConfig );
}
return frontendConfig;
}
}