From e242ec6c2d5edf86cc773d467fc4cd848e4bce13 Mon Sep 17 00:00:00 2001 From: Puja Sharma Date: Tue, 12 Apr 2022 22:11:07 +0530 Subject: [PATCH] feat(jans-config-api): user management mandatory field chk changes --- .../configuration/ApiAppConfiguration.java | 24 +++++++- .../io/jans/configapi/util/ApiConstants.java | 2 +- .../rest/resource/auth/UserResource.java | 23 ++++++-- .../configapi/service/auth/UserService.java | 57 +++++++++++++++---- .../java/io/jans/configapi/util/AuthUtil.java | 13 +++++ 5 files changed, 103 insertions(+), 16 deletions(-) diff --git a/jans-config-api/common/src/main/java/io/jans/configapi/model/configuration/ApiAppConfiguration.java b/jans-config-api/common/src/main/java/io/jans/configapi/model/configuration/ApiAppConfiguration.java index 46aaabd3c96..dc1c412028f 100644 --- a/jans-config-api/common/src/main/java/io/jans/configapi/model/configuration/ApiAppConfiguration.java +++ b/jans-config-api/common/src/main/java/io/jans/configapi/model/configuration/ApiAppConfiguration.java @@ -32,6 +32,9 @@ public class ApiAppConfiguration implements Configuration { private String externalLoggerConfiguration; private Boolean disableJdkLogger = true; private int maxCount; + + private List userExclusionAttributes; + private List userMandatoryAttributes; public boolean isConfigOauthEnabled() { return configOauthEnabled; @@ -203,6 +206,22 @@ public void setMaxCount(int maxCount) { this.maxCount = maxCount; } + public List getUserExclusionAttributes() { + return userExclusionAttributes; + } + + public void setUserExclusionAttributes(List userExclusionAttributes) { + this.userExclusionAttributes = userExclusionAttributes; + } + + public List getUserMandatoryAttributes() { + return userMandatoryAttributes; + } + + public void setUserMandatoryAttributes(List userMandatoryAttributes) { + this.userMandatoryAttributes = userMandatoryAttributes; + } + @Override public String toString() { return "ApiAppConfiguration [" + " apiApprovedIssuer=" + apiApprovedIssuer + ", apiProtectionType=" @@ -214,7 +233,10 @@ public String toString() { + ", corsConfigurationFilters=" + corsConfigurationFilters + ", exclusiveAuthScopes=" + exclusiveAuthScopes + ", loggingLevel=" + loggingLevel + " , loggingLayout=" + loggingLayout + " , externalLoggerConfiguration=" + externalLoggerConfiguration + " , disableJdkLogger=" - + disableJdkLogger + " , maxCount =" + maxCount + "]"; + + disableJdkLogger + " , maxCount =" + maxCount + + " , userExclusionAttributes="+ userExclusionAttributes + + " , userMandatoryAttributes="+ userMandatoryAttributes + + "]"; } } diff --git a/jans-config-api/common/src/main/java/io/jans/configapi/util/ApiConstants.java b/jans-config-api/common/src/main/java/io/jans/configapi/util/ApiConstants.java index ece98768e03..4e41c629aa5 100644 --- a/jans-config-api/common/src/main/java/io/jans/configapi/util/ApiConstants.java +++ b/jans-config-api/common/src/main/java/io/jans/configapi/util/ApiConstants.java @@ -114,6 +114,6 @@ private ApiConstants() {} public static final String SORT_ORDER = "sortOrder"; //commaSeparatedString of attributes to be excluded in User fetch request - public static final String USER_EXCLUDED_ATTRIBUTES = "userPassword,"; + //public static final String USER_EXCLUDED_ATTRIBUTES = "userPassword,"; } \ No newline at end of file diff --git a/jans-config-api/server/src/main/java/io/jans/configapi/rest/resource/auth/UserResource.java b/jans-config-api/server/src/main/java/io/jans/configapi/rest/resource/auth/UserResource.java index 8c58be96fa9..bd463e2fc22 100644 --- a/jans-config-api/server/src/main/java/io/jans/configapi/rest/resource/auth/UserResource.java +++ b/jans-config-api/server/src/main/java/io/jans/configapi/rest/resource/auth/UserResource.java @@ -15,7 +15,9 @@ import io.jans.configapi.service.auth.UserService; import io.jans.configapi.util.ApiAccessConstants; import io.jans.configapi.util.ApiConstants; +import io.jans.configapi.util.AttributeNames; import io.jans.orm.model.PagedResult; +import io.jans.util.StringHelper; import java.io.IOException; import java.lang.reflect.InvocationTargetException; @@ -44,7 +46,7 @@ public class UserResource extends BaseResource { @Inject UserService userSrv; - + @GET @ProtectedApi(scopes = { ApiAccessConstants.USER_READ_ACCESS }) public Response getUsers(@DefaultValue(DEFAULT_LIST_SIZE) @QueryParam(value = ApiConstants.LIMIT) int limit, @@ -59,7 +61,7 @@ public Response getUsers(@DefaultValue(DEFAULT_LIST_SIZE) @QueryParam(value = Ap escapeLog(sortOrder)); } SearchRequest searchReq = createSearchRequest(userSrv.getPeopleBaseDn(), pattern, sortBy, sortOrder, startIndex, - limit, null, ApiConstants.USER_EXCLUDED_ATTRIBUTES); + limit, null, userSrv.getUserExclusionAttributesAsString()); List users = this.doSearch(searchReq); logger.debug("User search result:{}", users); @@ -94,6 +96,8 @@ public Response createUser(@Valid User user) throws IllegalAccessException, Invo user = userSrv.addUser(user, true); logger.debug("User created {}", user); + + // excludedAttributes user = excludeUserAttributes(user); @@ -176,7 +180,18 @@ private List doSearch(SearchRequest searchReq) throws IllegalAccessExcepti } private User excludeUserAttributes(User user) throws IllegalAccessException, InvocationTargetException { - return userSrv.excludeAttributes(user, ApiConstants.USER_EXCLUDED_ATTRIBUTES); + return userSrv.excludeAttributes(user, userSrv.getUserExclusionAttributesAsString()); } - + + + private void checkMissingAttributes(User user) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + String missingAttributes = userSrv.checkMandatoryFields(user); + + if(StringHelper.isEmpty(missingAttributes)) { + return; + } + + checkNotNull(missingAttributes, "Mandatory User Attributes"); + } + } diff --git a/jans-config-api/server/src/main/java/io/jans/configapi/service/auth/UserService.java b/jans-config-api/server/src/main/java/io/jans/configapi/service/auth/UserService.java index 8505692cdc9..58263e9be61 100644 --- a/jans-config-api/server/src/main/java/io/jans/configapi/service/auth/UserService.java +++ b/jans-config-api/server/src/main/java/io/jans/configapi/service/auth/UserService.java @@ -124,7 +124,7 @@ public User patchUser(String inum, UserPatchRequest userPatchRequest) throws Jso return user; } - + public User getUserBasedOnInum(String inum) { User result = null; try { @@ -189,25 +189,23 @@ public User excludeAttributes(User user, String commaSeparatedString) logger.debug("Attributes List:{} to be excluded ", excludedAttributes); List allFields = authUtil.getAllFields(user.getClass()); - logger.debug("All user fields :{} ",allFields); - - + logger.debug("All user fields :{} ", allFields); + HashMap map = new HashMap<>(); for (String attribute : excludedAttributes) { logger.debug("User class allFields:{} conatins attribute:{} ? :{} ", allFields, attribute, authUtil.containsField(allFields, attribute)); if (authUtil.containsField(allFields, attribute)) { - logger.debug("User class contains attribute:{} ! ",attribute); + logger.debug("User class contains attribute:{} ! ", attribute); map.put(attribute, null); - } - else { + } else { logger.debug("Removing custom attribute:{} from user:{} ", attribute, user); user.removeAttribute(attribute); } } - + logger.debug("Attributes map:{} to be excluded ", map); - if(!map.isEmpty()) { + if (!map.isEmpty()) { logger.debug("Removing simple attributes:{} from user object ", map); BeanUtilsBean.getInstance().getConvertUtils().register(false, false, 0); BeanUtils.populate(user, map); @@ -216,5 +214,44 @@ public User excludeAttributes(User user, String commaSeparatedString) return user; } - + public String getUserExclusionAttributesAsString() { + return authUtil.getUserExclusionAttributesAsString(); + } + + public String checkMandatoryFields(User user) + throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + List mandatoryAttributes = authUtil.getUserMandatoryAttributes(); + logger.error("mandatoryAttributess :{} ", mandatoryAttributes); + + StringBuilder missingAttributes = new StringBuilder(); + + if (mandatoryAttributes == null || mandatoryAttributes.isEmpty()) { + return missingAttributes.toString(); + } + + List allFields = authUtil.getAllFields(user.getClass()); + logger.error("All user fields :{} ", allFields); + + Object attributeValue = null; + for (String attribute : mandatoryAttributes) { + logger.error("User class allFields:{} conatins attribute:{} ? :{} ", allFields, attribute, + authUtil.containsField(allFields, attribute)); + if (authUtil.containsField(allFields, attribute)) { + logger.error("Checking if attribute:{} is simple attribute", attribute); + attributeValue = BeanUtils.getProperty(user, attribute); + logger.error("User basic attribute:{} - attributeValue:{} ", attribute, attributeValue); + } else { + logger.error("Checking if attribute:{} is custom attribute", attribute); + attributeValue = user.getAttribute(attribute); + logger.error("User custom attribute:{} - attributeValue:{} ", attribute, attributeValue); + } + + if(attributeValue == null) { + missingAttributes.append(attribute).append(","); + } + } + logger.error("Checking mandatory missingAttributes:{} ", missingAttributes); + return missingAttributes.toString(); + } + } diff --git a/jans-config-api/server/src/main/java/io/jans/configapi/util/AuthUtil.java b/jans-config-api/server/src/main/java/io/jans/configapi/util/AuthUtil.java index b0d6d59bce4..38e5b913fcb 100644 --- a/jans-config-api/server/src/main/java/io/jans/configapi/util/AuthUtil.java +++ b/jans-config-api/server/src/main/java/io/jans/configapi/util/AuthUtil.java @@ -75,6 +75,19 @@ public String getServiceUrl(String url) { public String getClientId() { return this.configurationFactory.getApiClientId(); } + + public List getUserExclusionAttributes() { + return this.configurationFactory.getApiAppConfiguration().getUserExclusionAttributes(); + } + + public String getUserExclusionAttributesAsString() { + List excludedAttributes = getUserExclusionAttributes(); + return excludedAttributes == null ? null : excludedAttributes.stream().collect(Collectors.joining(",")); + } + + public List getUserMandatoryAttributes() { + return this.configurationFactory.getApiAppConfiguration().getUserMandatoryAttributes(); + } public String getTokenUrl() { return this.configurationService.find().getTokenEndpoint();