blob: c58b941b716b4dcc58f274196929ad80fcf7776f [file] [log] [blame]
/****************************************************************************
* 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);
}
}
}