/**************************************************************************** * 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); } } }