blob: 0fa16a11a747c8f2e39b25f62ef7d66142ba12f2 [file] [log] [blame]
package com.google.enterprise.adaptor.ad;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
import com.google.common.collect.ImmutableMap;
public class AdMembership {
private static final Logger LOGGER =
Logger.getLogger(AdMembership.class.getName());
String memberDn;
Long memberId;
AdMembership(String memberDn) {
this.memberDn = memberDn;
}
public Map<String, Object> getSqlParams() {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put(AdConstants.DB_MEMBERDN, memberDn);
map.put(AdConstants.DB_ENTITYID, memberId);
return map;
}
public Map<String, Object> parseForeignSecurityPrincipal() {
if (!memberDn.toLowerCase().contains("cn=foreignsecurityprincipals,dc=")) {
return null;
}
int start = memberDn.indexOf('=');
int end = memberDn.indexOf(',');
String sid = memberDn.substring(start + 1, end);
// check for mangled or malformed security principal format
if (!sid.matches("^S-1-5-21(-[0-9]+)+$")) {
LOGGER.fine("Invalid foreign security principal [" + memberDn + "].");
return null;
}
int ridStart = sid.lastIndexOf('-');
long rid = -1L;
try {
rid = Long.parseLong(sid.substring(ridStart + 1, sid.length()));
} catch (NumberFormatException e) {
LOGGER.fine("Invalid rid in foreign security principal ["
+ memberDn + "].");
}
if (rid < 0 || rid > 1L << 32) {
LOGGER.fine("Invalid rid in foreign security principal ["
+ memberDn + "].");
return null;
}
return ImmutableMap.<String, Object>of(
AdConstants.DB_DOMAINSID, sid.substring(0, ridStart),
AdConstants.DB_RID, rid);
}
}