blob: f087a332b326e89f8ac2577a3b9908939b79142b [file] [log] [blame]
/*
* Copyright (c) 2008, 2009, 2011-2013, 2015, 2019 Eike Stepper (Loehne, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eike Stepper - initial API and implementation
* Christian W. Damus (CEA LIST) - bug 399306
*/
package org.eclipse.net4j.util.ui.security;
import org.eclipse.net4j.util.internal.ui.bundle.OM;
import org.eclipse.net4j.util.internal.ui.messages.Messages;
import org.eclipse.net4j.util.security.IPasswordCredentials;
import org.eclipse.net4j.util.security.PasswordCredentials;
import org.eclipse.net4j.util.security.SecurityUtil;
import org.eclipse.net4j.util.ui.UIUtil;
import org.eclipse.net4j.util.ui.widgets.BaseDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @author Eike Stepper
* @since 2.0
*/
public class CredentialsDialog extends BaseDialog<Viewer>
{
private static final String TITLE = Messages.getString("CredentialsDialog_0"); //$NON-NLS-1$
private static final String MESSAGE = Messages.getString("CredentialsDialog_1"); //$NON-NLS-1$
private static final int WIDTH = 400;
private static final int HEIGHT = 225;
private final String realm;
private List<String> users;
private Control userIDControl;
private Text passwordControl;
private IPasswordCredentials credentials;
public CredentialsDialog(Shell shell)
{
this(shell, null);
}
/**
* @since 3.3
*/
public CredentialsDialog(Shell shell, String realm)
{
this(shell, realm, TITLE, MESSAGE);
}
/**
* @since 3.4
*/
public CredentialsDialog(Shell shell, String realm, String title, String message)
{
super(shell, DEFAULT_SHELL_STYLE | SWT.APPLICATION_MODAL, title, message, OM.Activator.INSTANCE.getDialogSettings(),
OM.getImageDescriptor("icons/credentials_wiz.gif")); //$NON-NLS-1$
this.realm = realm;
}
/**
* @since 3.3
*/
public final String getRealm()
{
return realm;
}
public IPasswordCredentials getCredentials()
{
return credentials;
}
@Override
protected void configureShell(Shell newShell)
{
super.configureShell(newShell);
configureShell(newShell, WIDTH, HEIGHT);
}
/**
* @since 3.4
*/
protected void configureShell(Shell newShell, int width, int height)
{
Composite parent = newShell.getParent();
if (parent != null)
{
Rectangle bounds = parent.getBounds();
int x = bounds.x + (bounds.width >> 1) - (width >> 1);
int y = bounds.y + (bounds.height >> 1) - (height >> 1);
newShell.setBounds(x, y, width, height);
}
else
{
newShell.setSize(width, height);
}
}
@Override
protected Control createButtonBar(Composite parent)
{
Control buttonBar = super.createButtonBar(parent);
updateOkButton();
return buttonBar;
}
@Override
protected void createUI(Composite parent)
{
users = loadUsers();
createCredentialsArea(parent);
}
/**
* @since 3.4
*/
protected Composite createCredentialsArea(Composite parent)
{
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayoutData(UIUtil.createGridData());
composite.setLayout(new GridLayout(2, false));
new Label(composite, SWT.NONE).setText(Messages.getString("CredentialsDialog_2")); //$NON-NLS-1$
userIDControl = createUserIDControl(composite);
userIDControl.setLayoutData(UIUtil.createGridData(true, false));
new Label(composite, SWT.NONE).setText(Messages.getString("CredentialsDialog_3")); //$NON-NLS-1$
passwordControl = new Text(composite, SWT.BORDER | SWT.PASSWORD);
passwordControl.setLayoutData(UIUtil.createGridData(true, false));
if (userIDControl instanceof Combo)
{
passwordControl.setFocus();
}
return composite;
}
/**
* @since 3.4
*/
protected Control createUserIDControl(Composite composite)
{
if (users.isEmpty())
{
Text text = new Text(composite, SWT.BORDER);
text.addModifyListener(e -> updateOkButton());
return text;
}
Combo combo = new Combo(composite, SWT.BORDER);
combo.setItems(users.toArray(new String[users.size()]));
combo.setText(getInitialUserID());
combo.addModifyListener(e -> updateOkButton());
return combo;
}
@Override
protected void okPressed()
{
String userID = getUserID();
String password = passwordControl.getText();
credentials = createCredentials(userID, SecurityUtil.toCharArray(password));
users.remove(userID);
users.add(0, userID);
saveUsers(users);
super.okPressed();
}
/**
* @since 3.4
*/
protected IPasswordCredentials createCredentials(String userID, char[] password)
{
return new PasswordCredentials(userID, password);
}
/**
* @since 3.4
*/
protected List<String> loadUsers()
{
List<String> result = new ArrayList<>();
IDialogSettings settings = getUsersSection();
String key = getRealmKey();
String[] users = settings.getArray(key);
if (users != null && users.length != 0)
{
result.addAll(Arrays.asList(users));
}
return result;
}
/**
* @since 3.4
*/
protected void saveUsers(List<String> users)
{
IDialogSettings settings = getUsersSection();
String key = getRealmKey();
settings.put(key, users.toArray(new String[users.size()]));
}
/**
* @since 3.10
*/
protected String getInitialUserID()
{
return users.get(0);
}
private String getUserID()
{
if (userIDControl instanceof Combo)
{
return ((Combo)userIDControl).getText();
}
return ((Text)userIDControl).getText();
}
private String getRealmKey()
{
String key = "realm";
if (realm != null)
{
key += realm;
}
return key;
}
private IDialogSettings getUsersSection()
{
return getDialogSettings("users");
}
private void updateOkButton()
{
getButton(IDialogConstants.OK_ID).setEnabled(getUserID().length() != 0);
}
}