package org.apereo.cas.authentication.principal.resolvers; import org.apereo.cas.configuration.CasConfigurationProperties; import org.apereo.cas.util.CollectionUtils; import org.apereo.cas.util.ScriptingUtils; import org.apereo.services.persondir.support.BaseGroovyScriptDaoImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * This is {@link InternalGroovyScriptDao}. * * @author Misagh Moayyed * @since 5.1.0 */ public class InternalGroovyScriptDao extends BaseGroovyScriptDaoImpl { private static final Logger LOGGER = LoggerFactory.getLogger(InternalGroovyScriptDao.class); private final ApplicationContext applicationContext; private final CasConfigurationProperties casProperties; /** * Instantiates a new Internal groovy script dao. * * @param applicationContext the application context * @param casProperties the cas properties */ public InternalGroovyScriptDao(final ApplicationContext applicationContext, final CasConfigurationProperties casProperties) { this.applicationContext = applicationContext; this.casProperties = casProperties; } @Override public Map<String, List<Object>> getPersonAttributesFromMultivaluedAttributes(final Map<String, List<Object>> attributes) { if (attributes.containsKey("username")) { final List<Object> username = attributes.get("username"); if (!username.isEmpty()) { final Map<String, List<Object>> results = new HashMap<>(); final Map<String, Object> attrs = getAttributesForUser(username.get(0).toString()); LOGGER.debug("Groovy-based attributes found are [{}]", attrs); attrs.forEach((k, v) -> { final List<Object> values = new ArrayList<>(CollectionUtils.toCollection(v)); LOGGER.debug("Adding Groovy-based attribute [{}] with value(s) [{}]", k, values); results.put(k, values); }); return results; } } return new HashMap<>(); } @Override public Map<String, Object> getAttributesForUser(final String uid) { final Map<String, Object> finalAttributes = new HashMap<>(); casProperties.getAuthn().getAttributeRepository().getGroovy().forEach(groovy -> { final Object[] args = {uid, LOGGER, casProperties, applicationContext}; final Map<String, Object> personAttributesMap = ScriptingUtils.executeGroovyScript(groovy.getConfig().getLocation(), args, Map.class); finalAttributes.putAll(personAttributesMap); }); return finalAttributes; } }