blob: 4f728d9de250eade4c555d52202fa983f3acce62 [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2007-2008 The University of Manchester
*
* Modifications to the initial code base are copyright of their
* respective authors, or their employers as appropriate.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
******************************************************************************/
package net.sf.taverna.t2.activities.wsdl.views;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.net.URI;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.SwingConstants;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.basic.BasicComboBoxRenderer;
import net.sf.taverna.t2.activities.wsdl.security.SecurityProfiles;
import net.sf.taverna.t2.lang.ui.DialogTextArea;
import net.sf.taverna.t2.security.credentialmanager.CredentialManager;
import net.sf.taverna.t2.workbench.ui.credentialmanager.CredentialManagerUI;
import net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ActivityConfigurationPanel;
import uk.org.taverna.scufl2.api.activity.Activity;
/**
* Configuration dialog for WSDL activity.
*
* @author Alex Nenadic
*/
@SuppressWarnings("serial")
public class WSDLActivityConfigurationView extends ActivityConfigurationPanel implements ItemListener {
private CredentialManager credentialManager;
private CredentialManagerUI credManagerUI;
private ButtonGroup buttonGroup;
private JRadioButton noSecurityRadioButton;
private JLabel noSecurityLabel;
private JRadioButton httpSecurityAuthNRadioButton;
private JLabel httpSecurityAuthNLabel;
private JRadioButton wsSecurityAuthNRadioButton;
private JLabel wsSecurityAuthNLabel;
// Password types
private final String PLAINTEXT_PASSWORD = "Plaintext password";
private final String DIGEST_PASSWORD = "Digest password";
private String[] passwordTypes = new String[] { PLAINTEXT_PASSWORD, DIGEST_PASSWORD };
private String[] tooltips = new String[] {
"Password will be sent in plaintext (which is OK if service is using HTTPS)",
"Password will be digested (cryptographically hashed) before sending" };
private JComboBox<String> passwordTypeComboBox;
private JCheckBox addTimestampCheckBox;
private JButton setHttpUsernamePasswordButton;
private JButton setWsdlUsernamePasswordButton;
// private Logger logger = Logger.getLogger(WSDLActivityConfigurationView.class);
public WSDLActivityConfigurationView(Activity activity, CredentialManager credentialManager) {
super(activity);
this.credentialManager = credentialManager;
initialise();
}
@Override
protected void initialise() {
super.initialise();
int gridy = 0;
// title panel
JPanel titlePanel = new JPanel(new BorderLayout());
titlePanel.setBackground(Color.WHITE);
JLabel titleLabel = new JLabel("Security configuration");
titleLabel.setFont(titleLabel.getFont().deriveFont(Font.BOLD, 13.5f));
titleLabel.setBorder(new EmptyBorder(10, 10, 0, 10));
DialogTextArea titleMessage = new DialogTextArea(
"Select a security profile for the service");
titleMessage.setMargin(new Insets(5, 20, 10, 10));
titleMessage.setFont(titleMessage.getFont().deriveFont(11f));
titleMessage.setEditable(false);
titleMessage.setFocusable(false);
titlePanel.setBorder(new EmptyBorder(10, 10, 0, 10));
titlePanel.add(titleLabel, BorderLayout.NORTH);
titlePanel.add(titleMessage, BorderLayout.CENTER);
addDivider(titlePanel, SwingConstants.BOTTOM, true);
// Main panel
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new GridBagLayout());
mainPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
// Create the radio buttons
noSecurityRadioButton = new JRadioButton("None");
noSecurityRadioButton.addItemListener(this);
wsSecurityAuthNRadioButton = new JRadioButton(
"WS-Security username and password authentication");
wsSecurityAuthNRadioButton.addItemListener(this);
httpSecurityAuthNRadioButton = new JRadioButton("HTTP username and password authentication");
httpSecurityAuthNRadioButton.addItemListener(this);
// Group the radio buttons
buttonGroup = new ButtonGroup();
buttonGroup.add(noSecurityRadioButton);
buttonGroup.add(wsSecurityAuthNRadioButton);
buttonGroup.add(httpSecurityAuthNRadioButton);
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1.0;
gbc.weighty = 0.0;
gbc.gridx = 0;
gbc.gridy = gridy++;
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(5, 10, 0, 0);
mainPanel.add(noSecurityRadioButton, gbc);
noSecurityLabel = new JLabel("Service requires no security");
noSecurityLabel.setFont(noSecurityLabel.getFont().deriveFont(11f));
// addDivider(noSecurityLabel, SwingConstants.BOTTOM, false);
gbc.gridx = 0;
gbc.gridy = gridy++;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(0, 40, 10, 10);
mainPanel.add(noSecurityLabel, gbc);
gbc.gridx = 0;
gbc.gridy = gridy++;
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(5, 10, 0, 0);
mainPanel.add(httpSecurityAuthNRadioButton, gbc);
ActionListener usernamePasswordListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Get Credential Manager UI to get the username and password for the service
if (credManagerUI == null) {
credManagerUI = new CredentialManagerUI(credentialManager);
}
credManagerUI.newPasswordForService(URI.create(getJson().get("operation")
.get("wsdl").textValue()));
}
};
httpSecurityAuthNLabel = new JLabel(
"Service requires HTTP username and password in order to authenticate the user");
httpSecurityAuthNLabel.setFont(httpSecurityAuthNLabel.getFont().deriveFont(11f));
gbc.gridx = 0;
gbc.gridy = gridy++;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(0, 40, 10, 10);
mainPanel.add(httpSecurityAuthNLabel, gbc);
// Set username and password button;
setHttpUsernamePasswordButton = new JButton("Set username and password");
gbc.gridx = 0;
gbc.gridy = gridy++;
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.EAST;
gbc.insets = new Insets(0, 40, 10, 10);
gbc.weightx = 1.0;
gbc.weighty = 1.0; // add any vertical space to this component
mainPanel.add(setHttpUsernamePasswordButton, gbc);
setHttpUsernamePasswordButton.addActionListener(usernamePasswordListener);
gbc.gridx = 0;
gbc.gridy = gridy++;
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(5, 10, 0, 0);
mainPanel.add(wsSecurityAuthNRadioButton, gbc);
wsSecurityAuthNLabel = new JLabel(
"Service requires WS-Security username and password in order to authenticate the user");
wsSecurityAuthNLabel.setFont(wsSecurityAuthNLabel.getFont().deriveFont(11f));
gbc.gridx = 0;
gbc.gridy = gridy++;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(0, 40, 0, 0);
mainPanel.add(wsSecurityAuthNLabel, gbc);
// Password type list
passwordTypeComboBox = new JComboBox<>(passwordTypes);
passwordTypeComboBox.setRenderer(new ComboBoxTooltipRenderer());
gbc.gridx = 0;
gbc.gridy = gridy++;
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(10, 40, 0, 0);
mainPanel.add(passwordTypeComboBox, gbc);
// 'Add timestamp' checkbox
addTimestampCheckBox = new JCheckBox("Add a timestamp to SOAP message");
gbc.gridx = 0;
gbc.gridy = gridy++;
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(5, 40, 10, 10);
mainPanel.add(addTimestampCheckBox, gbc);
// Set username and password button;
setWsdlUsernamePasswordButton = new JButton("Set username and password");
gbc.gridx = 0;
gbc.gridy = gridy++;
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.EAST;
gbc.insets = new Insets(0, 40, 10, 10);
gbc.weightx = 1.0;
gbc.weighty = 1.0; // add any vertical space to this component
mainPanel.add(setWsdlUsernamePasswordButton, gbc);
setWsdlUsernamePasswordButton.addActionListener(usernamePasswordListener);
addDivider(mainPanel, SwingConstants.BOTTOM, true);
// Enable/disable controls based on what is the current security profiles
if (!getJson().has("securityProfile")) {
noSecurityRadioButton.setSelected(true);
} else {
URI securityProfile = URI.create(getJson().get("securityProfile").textValue());
if (securityProfile.equals(SecurityProfiles.WSSECURITY_USERNAMETOKEN_PLAINTEXTPASSWORD)
|| securityProfile
.equals(SecurityProfiles.WSSECURITY_USERNAMETOKEN_DIGESTPASSWORD)
|| securityProfile
.equals(SecurityProfiles.WSSECURITY_TIMESTAMP_USERNAMETOKEN_PLAINTEXTPASSWORD)
|| securityProfile
.equals(SecurityProfiles.WSSECURITY_TIMESTAMP_USERNAMETOKEN_DIGESTPASSWORD)) {
wsSecurityAuthNRadioButton.setSelected(true);
}
if (securityProfile.equals(SecurityProfiles.HTTP_BASIC_AUTHN)
|| securityProfile.equals(SecurityProfiles.HTTP_DIGEST_AUTHN)) {
httpSecurityAuthNRadioButton.setSelected(true);
}
if (securityProfile.equals(SecurityProfiles.WSSECURITY_USERNAMETOKEN_PLAINTEXTPASSWORD)
|| securityProfile
.equals(SecurityProfiles.WSSECURITY_TIMESTAMP_USERNAMETOKEN_PLAINTEXTPASSWORD)) {
passwordTypeComboBox.setSelectedItem(PLAINTEXT_PASSWORD);
} else if (securityProfile
.equals(SecurityProfiles.WSSECURITY_USERNAMETOKEN_DIGESTPASSWORD)
|| securityProfile
.equals(SecurityProfiles.WSSECURITY_TIMESTAMP_USERNAMETOKEN_DIGESTPASSWORD)) {
passwordTypeComboBox.setSelectedItem(DIGEST_PASSWORD);
}
if (securityProfile
.equals(SecurityProfiles.WSSECURITY_TIMESTAMP_USERNAMETOKEN_DIGESTPASSWORD)
|| securityProfile
.equals(SecurityProfiles.WSSECURITY_TIMESTAMP_USERNAMETOKEN_PLAINTEXTPASSWORD)) {
addTimestampCheckBox.setSelected(true);
} else {
addTimestampCheckBox.setSelected(false);
}
}
// Put everything together
JPanel layoutPanel = new JPanel(new BorderLayout());
layoutPanel.add(titlePanel, BorderLayout.NORTH);
layoutPanel.add(mainPanel, BorderLayout.CENTER);
layoutPanel.setPreferredSize(new Dimension(550, 400));
add(layoutPanel);
}
@Override
public boolean checkValues() {
return true;
}
@Override
public void noteConfiguration() {
if (noSecurityRadioButton.isSelected()) {
getJson().remove("securityProfile"); // no security required
} else if (httpSecurityAuthNRadioButton.isSelected()) {
getJson().put("securityProfile", SecurityProfiles.HTTP_BASIC_AUTHN.toString());
} else if (wsSecurityAuthNRadioButton.isSelected()) { // plaintext password
if (passwordTypeComboBox.getSelectedItem().equals(PLAINTEXT_PASSWORD)) {
if (addTimestampCheckBox.isSelected()) {
getJson().put(
"securityProfile",
SecurityProfiles.WSSECURITY_TIMESTAMP_USERNAMETOKEN_PLAINTEXTPASSWORD
.toString());
} else {
getJson().put("securityProfile",
SecurityProfiles.WSSECURITY_USERNAMETOKEN_PLAINTEXTPASSWORD.toString());
}
} else { // digest password
if (addTimestampCheckBox.isSelected()) {
getJson().put(
"securityProfile",
SecurityProfiles.WSSECURITY_TIMESTAMP_USERNAMETOKEN_DIGESTPASSWORD
.toString());
} else {
getJson().put("securityProfile",
SecurityProfiles.WSSECURITY_USERNAMETOKEN_DIGESTPASSWORD.toString());
}
}
}
}
/**
* Disable/enable items on the panel based on this radio button
* has been selected.
*/
public void itemStateChanged(ItemEvent e) {
Object source = e.getItemSelectable();
if (source == noSecurityRadioButton) {
httpSecurityAuthNLabel.setEnabled(false);
wsSecurityAuthNLabel.setEnabled(false);
passwordTypeComboBox.setEnabled(false);
setHttpUsernamePasswordButton.setEnabled(false);
setWsdlUsernamePasswordButton.setEnabled(false);
addTimestampCheckBox.setEnabled(false);
noSecurityLabel.setEnabled(true);
} else if (source == httpSecurityAuthNRadioButton) {
noSecurityLabel.setEnabled(false);
httpSecurityAuthNLabel.setEnabled(true);
wsSecurityAuthNLabel.setEnabled(false);
passwordTypeComboBox.setEnabled(false);
setHttpUsernamePasswordButton.setEnabled(true);
setWsdlUsernamePasswordButton.setEnabled(false);
addTimestampCheckBox.setEnabled(false);
} else if (source == wsSecurityAuthNRadioButton) {
noSecurityLabel.setEnabled(false);
httpSecurityAuthNLabel.setEnabled(false);
wsSecurityAuthNLabel.setEnabled(true);
passwordTypeComboBox.setEnabled(true);
setHttpUsernamePasswordButton.setEnabled(false);
setWsdlUsernamePasswordButton.setEnabled(true);
addTimestampCheckBox.setEnabled(true);
}
}
/**
* A renderer for JComboBox that will display a tooltip for
* the selected item.
*/
class ComboBoxTooltipRenderer extends BasicComboBoxRenderer {
public Component getListCellRendererComponent(JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
if (-1 < index) {
list.setToolTipText(tooltips[index]);
}
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
setFont(list.getFont());
setText((value == null) ? "" : value.toString());
return this;
}
}
/**
* Adds a light gray or etched border to the top or bottom of a JComponent.
*
* @author David Withers
* @param component
*/
protected void addDivider(JComponent component, final int position, final boolean etched) {
component.setBorder(new Border() {
private final Color borderColor = new Color(.6f, .6f, .6f);
public Insets getBorderInsets(Component c) {
if (position == SwingConstants.TOP) {
return new Insets(5, 0, 0, 0);
} else {
return new Insets(0, 0, 5, 0);
}
}
public boolean isBorderOpaque() {
return false;
}
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
if (position == SwingConstants.TOP) {
if (etched) {
g.setColor(borderColor);
g.drawLine(x, y, x + width, y);
g.setColor(Color.WHITE);
g.drawLine(x, y + 1, x + width, y + 1);
} else {
g.setColor(Color.LIGHT_GRAY);
g.drawLine(x, y, x + width, y);
}
} else {
if (etched) {
g.setColor(borderColor);
g.drawLine(x, y + height - 2, x + width, y + height - 2);
g.setColor(Color.WHITE);
g.drawLine(x, y + height - 1, x + width, y + height - 1);
} else {
g.setColor(Color.LIGHT_GRAY);
g.drawLine(x, y + height - 1, x + width, y + height - 1);
}
}
}
});
}
}