package grith.jgrith.view.swing.proxyInit; import grisu.jcommons.commonInterfaces.HttpProxyInfoHolder; import grisu.jcommons.commonInterfaces.ProxyCreatorHolder; import grisu.jcommons.commonInterfaces.ProxyCreatorPanel; import grisu.jcommons.exceptions.CredentialException; import grisu.jcommons.interfaces.IdpListener; import grisu.jcommons.interfaces.SlcsListener; import grith.gsindl.SLCS; import grith.jgrith.plainProxy.PlainProxy; import grith.jgrith.utils.CredentialHelpers; import grith.sibboleth.ShibListener; import grith.sibboleth.ShibLoginPanel; import java.awt.Cursor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.security.PrivateKey; import java.security.cert.X509Certificate; import java.util.HashMap; import java.util.Map; import java.util.SortedSet; import javax.swing.JButton; import javax.swing.JPanel; import org.ietf.jgss.GSSCredential; import org.python.core.PyInstance; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.jgoodies.forms.layout.ColumnSpec; import com.jgoodies.forms.layout.FormLayout; import com.jgoodies.forms.layout.FormSpecs; import com.jgoodies.forms.layout.RowSpec; public class SlcsPanel extends JPanel implements SlcsListener, ProxyCreatorPanel, ShibListener, IdpListener { private static final Logger myLogger = LoggerFactory.getLogger(SlcsPanel.class .getName()); private ShibLoginPanel shibLoginPanel; private JButton button; private ProxyCreatorHolder holder = null; private final SLCS slcs; private String url; private static final String DEFAULT_URL = "https://slcs1.arcs.org.au/SLCS/login"; /** * Create the panel. */ public SlcsPanel(String url) { if ((url == null) || "".equals(url)) { this.url = DEFAULT_URL; } else { this.url = url; } setLayout(new FormLayout(new ColumnSpec[] { FormSpecs.RELATED_GAP_COLSPEC, ColumnSpec.decode("default:grow"), FormSpecs.RELATED_GAP_COLSPEC, }, new RowSpec[] { FormSpecs.RELATED_GAP_ROWSPEC, RowSpec.decode("default:grow"), FormSpecs.RELATED_GAP_ROWSPEC, FormSpecs.DEFAULT_ROWSPEC, FormSpecs.RELATED_GAP_ROWSPEC, })); add(getShibLoginPanel(), "2, 2, fill, fill"); add(getLoginButton(), "2, 4, right, default"); slcs = new SLCS(getShibLoginPanel()); slcs.addSlcsListener(this); enablePanel(false); getShibLoginPanel().refreshIdpList(); } public void addSlcsListener(SlcsListener l) { slcs.addSlcsListener(l); } private void enablePanel(boolean enable) { if (enable) { setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } else { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); } getLoginButton().setEnabled(enable); } public Map<String, String> getCurrentSettings() { return new HashMap<String, String>(); } private JButton getLoginButton() { if (button == null) { button = new JButton("Authenticate"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { getShibLoginPanel().login(); } }); } return button; } public JPanel getPanel() { return this; } private ShibLoginPanel getShibLoginPanel() { if (shibLoginPanel == null) { shibLoginPanel = new ShibLoginPanel(url, true); shibLoginPanel.addIdpListener(this); shibLoginPanel.addShibListener(this); } return shibLoginPanel; } public void idpListLoaded(SortedSet<String> idpList) { enablePanel(true); } public void setHttpProxyInfoHolder(HttpProxyInfoHolder holder) { // TODO Auto-generated method stub } public void setProxyCreatorHolder(ProxyCreatorHolder holder) { this.holder = holder; } public void shibLoginComplete(PyInstance response) { } public void shibLoginFailed(Exception e) { enablePanel(true); } public void shibLoginStarted() { enablePanel(false); } public void slcsLoginComplete(X509Certificate cert, PrivateKey privateKey) { try { enablePanel(true); if (holder != null) { GSSCredential proxy = PlainProxy.init(slcs.getCertificate(), slcs.getPrivateKey(), 24 * 10); holder.proxyCreated(CredentialHelpers .unwrapGlobusCredential(proxy)); } } catch (CredentialException e) { if (holder != null) { holder.proxyCreationFailed(e.getLocalizedMessage()); } myLogger.error("SLCS login could not be completed.", e); } } public void slcsLoginFailed(String message, Exception optionalException) { myLogger.error("SLCS login failed.", optionalException); enablePanel(true); if (holder != null) { holder.proxyCreationFailed(message); } } }