package org.josso.applet.agent.jaas;
import netscape.javascript.JSObject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.josso.gateway.Constants;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import java.applet.Applet;
import java.io.IOException;
import java.util.Properties;
public class AppletAssertionExtractionCallbackHandler implements CallbackHandler {
private static final Log logger = LogFactory.getLog(AppletAssertionExtractionCallbackHandler.class);
private Applet applet;
private String requester;
public AppletAssertionExtractionCallbackHandler(Applet applet, String requester) {
this.applet = applet;
this.requester = requester;
}
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof NameCallback) {
NameCallback nc = (NameCallback) callbacks[i];
if (nc.getPrompt().equals("appID"))
nc.setName(requester);
else if (nc.getPrompt().equals("endpoint"))
nc.setName(getEndpoint());
else
nc.setName(getCookie(Constants.JOSSO_SINGLE_SIGN_ON_COOKIE));
} else {
throw new UnsupportedCallbackException(callbacks[i]);
}
}
}
protected String getCookie(String name) {
JSObject myBrowser = JSObject.getWindow(applet);
JSObject myDocument = (JSObject) myBrowser.getMember("document");
String myCookie = (String) myDocument.getMember("cookie");
String search = name + "=";
if (myCookie.length() > 0) {
int offset = myCookie.indexOf(search);
if (offset != -1) {
offset += search.length();
int end = myCookie.indexOf(";", offset);
if (end == -1) end = myCookie.length();
return myCookie.substring(offset,end);
} else {
return null;
}
}
return null;
}
protected String getEndpoint() {
String endpoint = null;
Properties agentProperties = new Properties();
try {
agentProperties.load(this.getClass().getResource("/META-INF/josso/agent.properties").openStream());
endpoint = agentProperties.getProperty("ws.locator.endpoint");
} catch (IOException e) {
logger.error("WS endpoint isn't configured.", e);
}
return endpoint;
}
}