package auth.impl.callbacks;
import java.util.ArrayList;
import java.util.HashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import play.libs.F.Function;
import play.libs.WS;
import play.mvc.Http;
import play.mvc.Http.Cookie;
public class OpenAMAttributesCallback extends HeadlessCallback {
private static Logger logger = LoggerFactory.getLogger(OpenAMAttributesCallback.class);
private ArrayList<String> lst;
private String openAMUrl;
private HashMap<String,String> attrs = new HashMap<String,String>();
/**
* @param req2
* @param lst
*/
public OpenAMAttributesCallback(String openAmUrl, ArrayList<String> lst) {
this.lst = lst;
this.openAMUrl = openAmUrl;
}
@Override
public void process() {
if (openAMUrl == null) {
logger.trace("OpenAM URL not configured!");
}
Http.Request req = getOriginalRequest();
Cookie c = req.cookies().get("iPlanetDirectoryPro");
if (c == null) {
logger.trace("Not Authenticated!!!");
return;
}
String token = c.value();
//logger.debug(openAMUrl + "/identity/attributes");
String result = WS.url(openAMUrl + "/identity/attributes")
.setQueryParameter("subjectid", java.net.URLEncoder.encode(token))
.get().map(new Function<WS.Response, String>() {
@Override
public String apply(WS.Response response) {
return response.getBody();
}
}).get();
//logger.debug(result);
String nm = "userdetails.attribute.name=";
String val = "userdetails.attribute.value=";
int nmlength = nm.length();
int vallength = val.length();
for (String attr : lst) {
int idx = result.indexOf(nm + attr);
if (idx < 0) continue;
int startidx = idx + nmlength + attr.length() + vallength + 1;
int endidx = result.indexOf(nm, startidx) - 1; // subtract 1 for CR
String value = result.substring(startidx, endidx);
attrs.put(attr, value);
//logger.debug("found - " + attr + "='" + value + "'");
}
logger.debug("OpenAM attributes: " + attrs);
}
public String getValue(String attr) {
return attrs.get(attr);
}
}