From a67fa0f94aca45c07994b74853c0f673663d2b47 Mon Sep 17 00:00:00 2001 From: pujavs <43700552+pujavs@users.noreply.github.com> Date: Mon, 19 Feb 2024 12:19:20 +0530 Subject: [PATCH] feat(config-api): user management search enhancement (#7761) * feat(config-api): user management search enhancement Signed-off-by: pujavs * feat(config-api): user management search enhancement Signed-off-by: pujavs --------- Signed-off-by: pujavs Signed-off-by: Mustafa Baser --- .../docs/jans-config-api-swagger.yaml | 12 +++--- .../plugin/mgt/service/UserMgmtService.java | 40 ++++++++++++++----- .../resource/auth/AttributesResource.java | 18 +++++++++ .../service/auth/AttributeService.java | 28 +++++++++++++ .../service/auth/ConfigurationService.java | 3 ++ 5 files changed, 86 insertions(+), 15 deletions(-) diff --git a/jans-config-api/docs/jans-config-api-swagger.yaml b/jans-config-api/docs/jans-config-api-swagger.yaml index 7905ffa42d7..f95731d352c 100644 --- a/jans-config-api/docs/jans-config-api-swagger.yaml +++ b/jans-config-api/docs/jans-config-api-swagger.yaml @@ -7890,19 +7890,19 @@ components: type: string selected: type: boolean - adminCanView: + whitePagesCanView: type: boolean - userCanAccess: + adminCanEdit: type: boolean userCanView: type: boolean - adminCanEdit: + userCanEdit: type: boolean - adminCanAccess: + adminCanView: type: boolean - userCanEdit: + adminCanAccess: type: boolean - whitePagesCanView: + userCanAccess: type: boolean baseDn: type: string diff --git a/jans-config-api/plugins/user-mgt-plugin/src/main/java/io/jans/configapi/plugin/mgt/service/UserMgmtService.java b/jans-config-api/plugins/user-mgt-plugin/src/main/java/io/jans/configapi/plugin/mgt/service/UserMgmtService.java index 3a10e04cfc1..2b1e85907c3 100644 --- a/jans-config-api/plugins/user-mgt-plugin/src/main/java/io/jans/configapi/plugin/mgt/service/UserMgmtService.java +++ b/jans-config-api/plugins/user-mgt-plugin/src/main/java/io/jans/configapi/plugin/mgt/service/UserMgmtService.java @@ -84,19 +84,41 @@ public PagedResult searchUsers(SearchRequest searchRequest) { logger.info("Search Users with searchRequest:{}, getPeopleBaseDn():{}", escapeLog(searchRequest), getPeopleBaseDn()); } - Filter searchFilter = null; + + boolean useLowercaseFilter = configurationService.isLowercaseFilter(userService.getPeopleBaseDn()); + logger.info("For searching user user useLowercaseFilter?:{}", useLowercaseFilter); + + Filter displayNameFilter, descriptionFilter, mailFilter, uidFilter, inumFilter, searchFilter = null; List filters = new ArrayList<>(); if (searchRequest.getFilterAssertionValue() != null && !searchRequest.getFilterAssertionValue().isEmpty()) { for (String assertionValue : searchRequest.getFilterAssertionValue()) { - String[] targetArray = new String[] { assertionValue }; - Filter displayNameFilter = Filter.createSubstringFilter(AttributeConstants.DISPLAY_NAME, null, - targetArray, null); - Filter descriptionFilter = Filter.createSubstringFilter(AttributeConstants.DESCRIPTION, null, - targetArray, null); - Filter uidFilter = Filter.createSubstringFilter("uid", null, targetArray, null); - Filter inumFilter = Filter.createSubstringFilter(AttributeConstants.INUM, null, targetArray, null); - filters.add(Filter.createORFilter(displayNameFilter, descriptionFilter, uidFilter, inumFilter)); + logger.info("For searching user - assertionValue:{}", assertionValue); + assertionValue = StringHelper.toLowerCase(assertionValue); + String[] targetArray = new String[] { assertionValue }; + logger.info("For searching user - targetArray?:{}", targetArray); + + if (useLowercaseFilter) { + displayNameFilter = Filter.createSubstringFilter( + Filter.createLowercaseFilter(AttributeConstants.DISPLAY_NAME), null, targetArray, null); + descriptionFilter = Filter.createSubstringFilter( + Filter.createLowercaseFilter(AttributeConstants.DESCRIPTION), null, targetArray, null); + mailFilter = Filter.createSubstringFilter(Filter.createLowercaseFilter(AttributeConstants.MAIL), + null, targetArray, null); + uidFilter = Filter.createSubstringFilter(Filter.createLowercaseFilter("uid"), null, targetArray, + null); + } else { + displayNameFilter = Filter.createSubstringFilter(AttributeConstants.DISPLAY_NAME, null, targetArray, + null); + descriptionFilter = Filter.createSubstringFilter(AttributeConstants.DESCRIPTION, null, targetArray, + null); + mailFilter = Filter.createSubstringFilter(AttributeConstants.MAIL, null, targetArray, null); + uidFilter = Filter.createSubstringFilter("uid", null, targetArray, null); + } + + inumFilter = Filter.createSubstringFilter(AttributeConstants.INUM, null, targetArray, null); + filters.add( + Filter.createORFilter(displayNameFilter, descriptionFilter, mailFilter, uidFilter, inumFilter)); } searchFilter = Filter.createORFilter(filters); } diff --git a/jans-config-api/server/src/main/java/io/jans/configapi/rest/resource/auth/AttributesResource.java b/jans-config-api/server/src/main/java/io/jans/configapi/rest/resource/auth/AttributesResource.java index ce3122d80dc..c16a78b7e63 100644 --- a/jans-config-api/server/src/main/java/io/jans/configapi/rest/resource/auth/AttributesResource.java +++ b/jans-config-api/server/src/main/java/io/jans/configapi/rest/resource/auth/AttributesResource.java @@ -126,6 +126,15 @@ public Response createAttribute(@Valid JansAttribute attribute) { checkNotNull(attribute.getName(), AttributeNames.NAME); checkNotNull(attribute.getDisplayName(), AttributeNames.DISPLAY_NAME); checkResourceNotNull(attribute.getDataType(), AttributeNames.DATA_TYPE); + + // check if attribute exists in schema + boolean attributeValidation = attributeService.validateAttributeDefinition(attribute.getName()); + log.debug("Validate attribute while creation - attribute.getName():{}, attributeValidation:{}", attribute.getName(), attributeValidation); + if (!attributeValidation) { + throw new WebApplicationException(getNotAcceptableException("The attribute type '" + attribute.getName() + "' not defined in DB schema")); + } + + String inum = attributeService.generateInumForNewAttribute(); attribute.setInum(inum); attribute.setDn(attributeService.getDnForAttribute(inum)); @@ -152,6 +161,15 @@ public Response updateAttribute(@Valid JansAttribute attribute) { checkNotNull(attribute.getName(), AttributeNames.NAME); checkNotNull(attribute.getDisplayName(), AttributeNames.DISPLAY_NAME); checkResourceNotNull(attribute.getDataType(), AttributeNames.DATA_TYPE); + + // check if attribute exists in schema + boolean attributeValidation = attributeService.validateAttributeDefinition(attribute.getName()); + log.debug("Validate attribute - attribute.getName():{}, attributeValidation:{}", attribute.getName(), attributeValidation); + if (!attributeValidation) { + throw new WebApplicationException(getNotAcceptableException( + "The attribute type '" + attribute.getName() + "' not defined in DB schema")); + } + JansAttribute existingAttribute = attributeService.getAttributeByInum(inum); checkResourceNotNull(existingAttribute, JANS_ATTRIBUTE); attribute.setInum(existingAttribute.getInum()); diff --git a/jans-config-api/server/src/main/java/io/jans/configapi/service/auth/AttributeService.java b/jans-config-api/server/src/main/java/io/jans/configapi/service/auth/AttributeService.java index f2a7657fb43..1cb200bd703 100644 --- a/jans-config-api/server/src/main/java/io/jans/configapi/service/auth/AttributeService.java +++ b/jans-config-api/server/src/main/java/io/jans/configapi/service/auth/AttributeService.java @@ -2,7 +2,9 @@ package io.jans.configapi.service.auth; import static io.jans.as.model.util.Util.escapeLog; +import io.jans.as.common.model.common.SimpleUser; import io.jans.as.common.util.AttributeConstants; +import io.jans.orm.model.AttributeType; import io.jans.configapi.util.ApiConstants; import io.jans.model.JansAttribute; import io.jans.model.SearchRequest; @@ -11,6 +13,7 @@ import io.jans.orm.search.filter.Filter; import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -23,6 +26,9 @@ public class AttributeService extends io.jans.as.common.service.AttributeService private static final long serialVersionUID = -820393743995746612L; + @Inject + transient ConfigurationService configurationService; + @Override protected boolean isUseLocalCache() { return false; @@ -103,5 +109,27 @@ public JansAttribute getAttributeUsingName(String claimName) { } return jansAttribute; } + + public boolean validateAttributeDefinition(String attributeName) { + log.info(" Validate attributeName:{}, getPersistenceType():{}", attributeName, getPersistenceType()); + boolean isValidAttribute = false; + try { + AttributeType attributeType = persistenceEntryManager.getAttributeType("ou=people,o=jans", SimpleUser.class, + "uid"); + log.info(" attributeName:{}, attributeType():{}", attributeName, attributeType); + + if (attributeType != null) { + isValidAttribute = true; + } + } catch (Exception ex) { + log.error("Exception by ORM while validating attribute is:{}", ex); + isValidAttribute = true; + } + return isValidAttribute; + } + + private String getPersistenceType() { + return configurationService.getPersistenceType(); + } } \ No newline at end of file diff --git a/jans-config-api/server/src/main/java/io/jans/configapi/service/auth/ConfigurationService.java b/jans-config-api/server/src/main/java/io/jans/configapi/service/auth/ConfigurationService.java index 53aa0c49a0d..4088be33070 100644 --- a/jans-config-api/server/src/main/java/io/jans/configapi/service/auth/ConfigurationService.java +++ b/jans-config-api/server/src/main/java/io/jans/configapi/service/auth/ConfigurationService.java @@ -73,4 +73,7 @@ public void setStatsData(StatsData statsData) { this.statsData = statsData; } + public boolean isLowercaseFilter(String baseDn) { + return !PersistenceEntryManager.PERSITENCE_TYPES.ldap.name().equals(persistenceManager.getPersistenceType(baseDn)); + } }