Skip to content

Commit

Permalink
feat(config-api): user management search enhancement (#7761)
Browse files Browse the repository at this point in the history
* feat(config-api): user management search enhancement

Signed-off-by: pujavs <pujas.works@gmail.com>

* feat(config-api): user management search enhancement

Signed-off-by: pujavs <pujas.works@gmail.com>

---------

Signed-off-by: pujavs <pujas.works@gmail.com>
Signed-off-by: Mustafa Baser <mbaser@mail.com>
  • Loading branch information
pujavs authored and devrimyatar committed Feb 27, 2024
1 parent dbf7455 commit a67fa0f
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 15 deletions.
12 changes: 6 additions & 6 deletions jans-config-api/docs/jans-config-api-swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,19 +84,41 @@ public PagedResult<User> 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<Filter> 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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand All @@ -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());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}
}

0 comments on commit a67fa0f

Please sign in to comment.