| /**************************************************************************** |
| * Copyright (c) 2007 Remy Suen, Composent Inc., 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: |
| * Remy Suen <remy.suen@gmail.com> - initial API and implementation |
| *****************************************************************************/ |
| package org.eclipse.ecf.internal.provider.xmpp.ui.wizards; |
| |
| import java.io.IOException; |
| import javax.security.auth.callback.Callback; |
| import javax.security.auth.callback.UnsupportedCallbackException; |
| import org.eclipse.ecf.core.*; |
| import org.eclipse.ecf.core.security.*; |
| import org.eclipse.ecf.internal.provider.xmpp.ui.Messages; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.ui.IWorkbench; |
| |
| public final class XMPPSConnectWizard extends XMPPConnectWizard { |
| |
| public XMPPSConnectWizard() { |
| super(); |
| } |
| |
| public XMPPSConnectWizard(String uri) { |
| super(uri); |
| } |
| |
| public void addPages() { |
| page = new XMPPSConnectWizardPage(usernameAtHost); |
| addPage(page); |
| } |
| |
| public void init(IWorkbench workbench, IContainer container) { |
| super.init(workbench, container); |
| |
| setWindowTitle(Messages.XMPPSConnectWizard_WIZARD_TITLE); |
| } |
| |
| public void init(IWorkbench workbench, IStructuredSelection selection) { |
| super.init(workbench, selection); |
| try { |
| this.container = ContainerFactory.getDefault().createContainer( |
| "ecf.xmpps.smack"); |
| } catch (ContainerCreateException e) { |
| // None |
| } |
| |
| setWindowTitle(Messages.XMPPSConnectWizard_WIZARD_TITLE); |
| } |
| |
| protected IConnectContext createConnectContext() { |
| // Extract passwords from page prior to widget disposal: |
| final String password = page.getPassword(); |
| final String keystorePassword = ((XMPPSConnectWizardPage) page) |
| .getKeystorePassword(); |
| |
| // Use a context capable of both ECF and javax.security Callback: |
| return new IConnectContext() { |
| public CallbackHandler getCallbackHandler() { |
| return new DualCallbackHandler(password, keystorePassword); |
| } |
| }; |
| } |
| |
| /** |
| * <p> |
| * Wrapper class for handling both ECF and javax.security Callback needs. |
| * Will delegate ECF Callback to a handler created by |
| * {@link ConnectContextFactory}. |
| * </p> |
| * <p> |
| * Currently only handles |
| * {@link javax.security.auth.callback.PasswordCallback} for javax.security |
| * Callback for XMPPConnection class from org.jivesoftware.smack. |
| * </p> |
| * |
| * @author T. Yueh |
| */ |
| class DualCallbackHandler implements CallbackHandler, |
| javax.security.auth.callback.CallbackHandler { |
| /** |
| * Handler for all ECF Callback. |
| */ |
| CallbackHandler delegate; |
| |
| /** |
| * User input for keystore password. Since keystore impl (PKI vs JKS vs |
| * etc) is hidden via interface, all that is necessary is a password. |
| */ |
| String keystorePassword; |
| |
| public DualCallbackHandler(String password, String keystorePassword) { |
| delegate = ConnectContextFactory.createPasswordConnectContext( |
| password).getCallbackHandler(); |
| this.keystorePassword = keystorePassword; |
| } |
| |
| public void handle(Callback[] acallback) throws IOException, |
| UnsupportedCallbackException { |
| for (int i = 0; i < acallback.length; i++) |
| if (acallback[i] instanceof PasswordCallback) |
| ((javax.security.auth.callback.PasswordCallback) acallback[i]) |
| .setPassword(keystorePassword.toCharArray()); |
| |
| } |
| |
| public void handle(org.eclipse.ecf.core.security.Callback[] callbacks) |
| throws IOException, |
| org.eclipse.ecf.core.security.UnsupportedCallbackException { |
| delegate.handle(callbacks); |
| } |
| } |
| } |