package org.apereo.cas.support.realm;
import org.apache.commons.lang3.StringUtils;
import org.apache.cxf.sts.RealmParser;
import org.apache.cxf.sts.token.realm.RealmProperties;
import org.apache.cxf.ws.security.sts.provider.STSException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
import java.util.StringTokenizer;
/**
* This is {@link UriRealmParser}.
*
* @author Misagh Moayyed
* @since 5.1.0
*/
public class UriRealmParser implements RealmParser {
private static final Logger LOGGER = LoggerFactory.getLogger(UriRealmParser.class);
private final Map<String, RealmProperties> realmMap;
public UriRealmParser(final Map<String, RealmProperties> realmMap) {
this.realmMap = realmMap;
}
@Override
public String parseRealm(final Map<String, Object> messageContext) throws STSException {
final String url = (String) messageContext.get("org.apache.cxf.request.url");
final StringTokenizer st = new StringTokenizer(url, "/");
String realm = null;
int count = st.countTokens();
if (count <= 1) {
return null;
}
count--;
for (int i = 0; i < count; i++) {
realm = st.nextToken();
}
realm = realm.toUpperCase();
if (StringUtils.isBlank(realm) || !realmMap.containsKey(realm)) {
LOGGER.warn("Unknown realm: [{}]", realm);
throw new STSException("Unknown realm: " + realm);
}
LOGGER.debug("URI realm parsed: [{}]", realm);
return realm.trim();
}
}