package org.vpac.grisu.cxf;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.apache.log4j.Logger;
import org.globus.myproxy.MyProxy;
import org.ietf.jgss.GSSCredential;
import org.vpac.grisu.backend.model.ProxyCredential;
public class MyProxyAuthInterceptor extends AbstractSoapInterceptor {
static final Logger myLogger = Logger
.getLogger(MyProxyAuthInterceptor.class.getName());
public MyProxyAuthInterceptor() {
super(Phase.POST_PROTOCOL);
}
private ProxyCredential createProxyCredential(String username,
String password, String myProxyServer, int port, int lifetime) {
final MyProxy myproxy = new MyProxy(myProxyServer, port);
GSSCredential proxy = null;
try {
proxy = myproxy.get(username, password, lifetime);
final int remaining = proxy.getRemainingLifetime();
if (remaining <= 0) {
throw new RuntimeException("Proxy not valid anymore.");
}
return new ProxyCredential(proxy);
} catch (final Exception e) {
myLogger.error("Could not create myproxy credential: "
+ e.getLocalizedMessage());
return null;
}
}
public void handleMessage(SoapMessage message) throws Fault {
final Header header = message.getHeader(new QName("",
"myProxyCredentials"));
try {
MyProxyCredentials cred = null;
ProxyCredential proxyCredential = (ProxyCredential) message
.getExchange().getSession().get("credential");
System.out.println("the credential is " + proxyCredential);
if (proxyCredential == null || !proxyCredential.isValid()) {
myLogger.debug("creating new credential...");
cred = retrieveProxyFromHeader(header);
proxyCredential = createProxyCredential(cred.username,
cred.password, cred.myproxyServer,
Integer.parseInt(cred.myproxyPort), 99999);
message.getExchange().getSession()
.put("credential", proxyCredential);
}
if (proxyCredential == null || !proxyCredential.isValid()) {
throw new Fault(
new LoginException(cred.username, cred.password));
}
message.put("credential", proxyCredential);
} catch (final JAXBException ex) {
// should not happen...
throw new Fault(ex);
}
}
private MyProxyCredentials retrieveProxyFromHeader(Header h)
throws JAXBException {
final Unmarshaller u = JAXBContext
.newInstance(MyProxyCredentials.class).createUnmarshaller();
final Object o = u.unmarshal((org.w3c.dom.Node) (h.getObject()));
final MyProxyCredentials cred = (MyProxyCredentials) o;
return cred;
}
}