/* * oxAuth is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text. * * Copyright (c) 2014, Gluu */ package org.xdi.oxauth.idgen.ws.rs; import java.util.List; import javax.ejb.Stateless; import javax.inject.Inject; import javax.inject.Named; import org.apache.commons.lang.StringUtils; import org.gluu.site.ldap.persistence.LdapEntryManager; import org.slf4j.Logger; import org.xdi.ldap.model.LdapDummyEntry; import org.xdi.oxauth.model.common.IdType; import org.xdi.oxauth.model.config.BaseDnConfiguration; import org.xdi.oxauth.model.config.StaticConfiguration; import org.xdi.util.INumGenerator; import com.unboundid.ldap.sdk.DN; import com.unboundid.ldap.sdk.Filter; import com.unboundid.ldap.sdk.LDAPException; import com.unboundid.ldap.sdk.RDN; /** * Inum ID generator. Generates inum: e.g. @!1111!0001!1234. * * @author Yuriy Zabrovarnyy * @version 0.9, 26/06/2013 */ @Stateless @Named("inumGenerator") public class InumGenerator implements IdGenerator { public static final String SEPARATOR = "!"; private static final int MAX = 100; @Inject private Logger log; @Inject private LdapEntryManager ldapEntryManager; @Inject private StaticConfiguration staticConfiguration; @Override public String generateId(String p_idType, String p_idPrefix) { final IdType idType = IdType.fromString(p_idType); if (idType != null) { return generateId(idType, p_idPrefix); } else { log.error("Unable to identify id type: {}", p_idType); } return ""; } public String generateId(IdType p_idType, String p_idPrefix) { String inum; int counter = 0; try { while (true) { final StringBuilder sb = new StringBuilder(); sb.append(p_idPrefix). append(InumGenerator.SEPARATOR). append(p_idType.getInum()). append(InumGenerator.SEPARATOR); if ((IdType.CLIENTS == p_idType) || (IdType.PEOPLE == p_idType)) { sb.append(INumGenerator.generate(4)); } else { sb.append(INumGenerator.generate(2)); } inum = sb.toString(); if (StringUtils.isBlank(inum)) { log.error("Unable to generate inum: {}", inum); break; } if (!contains(inum, p_idType)) { break; } /* Just to make sure it doesn't get into an infinite loop */ if (counter > MAX) { log.error("Infinite loop problem while generating new inum"); return ""; } counter++; } } catch (Exception e) { log.error(e.getMessage(), e); inum = e.getMessage(); } log.trace("Generated inum: {}", inum); return inum; } public boolean contains(String inum, IdType type) { final String baseDn = baseDn(type); try { final Filter filter = Filter.create(String.format("inum=%s", inum)); final List<LdapDummyEntry> entries = ldapEntryManager.findEntries(baseDn, LdapDummyEntry.class, filter); return entries != null && !entries.isEmpty(); } catch (LDAPException e) { log.error(e.getMessage(), e); } return false; } public String baseDn(IdType p_type) { final BaseDnConfiguration baseDn = staticConfiguration.getBaseDn(); switch (p_type) { case CLIENTS: return baseDn.getClients(); case APPLIANCE: return baseDn.getAppliance(); case ATTRIBUTE: return baseDn.getAttributes(); case PEOPLE: return baseDn.getPeople(); } // if not able to identify baseDn by type then return organization baseDn, e.g. o=gluu try { final DN dnObj = new DN(baseDn.getClients()); // baseDn.getClients(), e.g. ou=clients,o=@!1111,o=gluu final RDN[] rdns = dnObj.getRDNs(); final RDN rdn = rdns[rdns.length - 1]; return rdn.toNormalizedString(); } catch (LDAPException e) { log.error(e.getMessage(), e); } log.error("Use fallback DN: o=gluu, for ID generator, please check oxAuth configuration, clientDn must be valid DN"); return "o=gluu"; } }