From 6cf171607a5e5b87c2de96f8b5bd3b4cb1aa03fa Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 29 Jul 2019 18:27:20 +0200 Subject: [PATCH] Fix group exclusion support in plain-group case Plus change version to 0.4. --- pom.xml | 2 +- .../grouper/rest/AbstractGroupProcessor.java | 36 ++++++++----- .../grouper/rest/AccountProcessor.java | 23 +------- .../grouper/rest/PlainGroupProcessor.java | 54 ++++++++++--------- .../connector/grouper/rest/Processor.java | 22 ++++++++ .../grouper/test/GrouperTestHelper.java | 3 +- 6 files changed, 77 insertions(+), 63 deletions(-) diff --git a/pom.xml b/pom.xml index afddb46..9916a84 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ connector-grouper-rest - 0.3 + 0.4 jar Grouper REST Connector diff --git a/src/main/java/com/evolveum/polygon/connector/grouper/rest/AbstractGroupProcessor.java b/src/main/java/com/evolveum/polygon/connector/grouper/rest/AbstractGroupProcessor.java index 410b235..52fd5d2 100644 --- a/src/main/java/com/evolveum/polygon/connector/grouper/rest/AbstractGroupProcessor.java +++ b/src/main/java/com/evolveum/polygon/connector/grouper/rest/AbstractGroupProcessor.java @@ -131,14 +131,18 @@ private boolean handleGroupJsonObject(Object group, ResultsHandler handler) { if (group instanceof JSONObject) { JSONObject gObject = (JSONObject) group; String name = processor.getStringOrNull(gObject, "name"); - String extension = processor.getStringOrNull(gObject, "extension"); - String uuid = processor.getStringOrNull(gObject, "uuid"); - ConnectorObjectBuilder builder = new ConnectorObjectBuilder(); - builder.setObjectClass(getObjectClass()); - builder.setUid(uuid); - builder.setName(name); - builder.addAttribute(ATTR_EXTENSION, extension); - return handler.handle(builder.build()); + if (processor.groupNameMatches(name)) { + String extension = processor.getStringOrNull(gObject, "extension"); + String uuid = processor.getStringOrNull(gObject, "uuid"); + ConnectorObjectBuilder builder = new ConnectorObjectBuilder(); + builder.setObjectClass(getObjectClass()); + builder.setUid(uuid); + builder.setName(name); + builder.addAttribute(ATTR_EXTENSION, extension); + return handler.handle(builder.build()); + } else { + return true; + } } else { throw new IllegalStateException("Expected group as JSONObject, got " + group); } @@ -153,12 +157,16 @@ private boolean handleGroupAsMemberJsonObject(Object group, ResultsHandler handl return true; } String name = processor.getStringOrNull(gObject, "name"); - String id = processor.getStringOrNull(gObject, "id"); - ConnectorObjectBuilder builder = new ConnectorObjectBuilder(); - builder.setObjectClass(getObjectClass()); - builder.setUid(id); - builder.setName(name); - return handler.handle(builder.build()); + if (processor.groupNameMatches(name)) { + String id = processor.getStringOrNull(gObject, "id"); + ConnectorObjectBuilder builder = new ConnectorObjectBuilder(); + builder.setObjectClass(getObjectClass()); + builder.setUid(id); + builder.setName(name); + return handler.handle(builder.build()); + } else { + return true; + } } else { throw new IllegalStateException("Expected group as JSONObject, got " + group); } diff --git a/src/main/java/com/evolveum/polygon/connector/grouper/rest/AccountProcessor.java b/src/main/java/com/evolveum/polygon/connector/grouper/rest/AccountProcessor.java index 4c6254f..fe87bb7 100644 --- a/src/main/java/com/evolveum/polygon/connector/grouper/rest/AccountProcessor.java +++ b/src/main/java/com/evolveum/polygon/connector/grouper/rest/AccountProcessor.java @@ -157,7 +157,7 @@ private List selectGroupNames(JSONArray groups) { if (group instanceof JSONObject) { JSONObject gObject = (JSONObject) group; String name = processor.getStringOrNull(gObject, "name"); - if (groupNameMatches(name)) { + if (processor.groupNameMatches(name)) { rv.add(name); } } else { @@ -167,27 +167,6 @@ private List selectGroupNames(JSONArray groups) { return rv; } - private boolean groupNameMatches(String name) { - if (name == null) { - return false; - } - return groupNameMatches(name, getConfiguration().getGroupIncludePattern()) && - !groupNameMatches(name, getConfiguration().getGroupExcludePattern()); - } - - private boolean groupNameMatches(String name, String[] patterns) { - if (patterns == null) { - return false; - } - for (String pattern : patterns) { - Pattern compiled = Pattern.compile(pattern); - if (compiled.matcher(name).matches()) { - return true; - } - } - return false; - } - private GrouperConfiguration getConfiguration() { return processor.configuration; } diff --git a/src/main/java/com/evolveum/polygon/connector/grouper/rest/PlainGroupProcessor.java b/src/main/java/com/evolveum/polygon/connector/grouper/rest/PlainGroupProcessor.java index e4d5d44..b9ebbf5 100644 --- a/src/main/java/com/evolveum/polygon/connector/grouper/rest/PlainGroupProcessor.java +++ b/src/main/java/com/evolveum/polygon/connector/grouper/rest/PlainGroupProcessor.java @@ -138,34 +138,38 @@ private boolean executeGetGroupWithMembersResponse(HttpPost request, JSONObject JSONObject gObject = (JSONObject) processor.get(response, WS_GET_MEMBERS_RESULTS, RESULTS, WS_GROUP); String name = processor.getStringOrNull(gObject, "name"); - String extension = processor.getStringOrNull(gObject, "extension"); - String uuid = processor.getStringOrNull(gObject, "uuid"); - ConnectorObjectBuilder builder = new ConnectorObjectBuilder(); - builder.setObjectClass(getObjectClass()); - builder.setUid(uuid); - builder.setName(name); - builder.addAttribute(ATTR_EXTENSION, extension); - - List subjects = new ArrayList<>(); - JSONArray members = processor.getArray(response, false, WS_GET_MEMBERS_RESULTS, RESULTS, WS_SUBJECTS); - if (members != null) { - for (Object memberObject : members) { - JSONObject member = (JSONObject) memberObject; - String sourceId = processor.getStringOrNull(member, "sourceId"); - if (sourceId == null || !sourceId.equals(getConfiguration().getSubjectSource())) { - LOG.info("Skipping non-person member (source={0})", sourceId); - continue; - } - String subjectId = processor.getStringOrNull(member, "id"); - if (subjectId != null) { - subjects.add(subjectId); - } else { - LOG.info("Skipping unnamed member (source={0})", member); + if (processor.groupNameMatches(name)) { + String extension = processor.getStringOrNull(gObject, "extension"); + String uuid = processor.getStringOrNull(gObject, "uuid"); + ConnectorObjectBuilder builder = new ConnectorObjectBuilder(); + builder.setObjectClass(getObjectClass()); + builder.setUid(uuid); + builder.setName(name); + builder.addAttribute(ATTR_EXTENSION, extension); + + List subjects = new ArrayList<>(); + JSONArray members = processor.getArray(response, false, WS_GET_MEMBERS_RESULTS, RESULTS, WS_SUBJECTS); + if (members != null) { + for (Object memberObject : members) { + JSONObject member = (JSONObject) memberObject; + String sourceId = processor.getStringOrNull(member, "sourceId"); + if (sourceId == null || !sourceId.equals(getConfiguration().getSubjectSource())) { + LOG.info("Skipping non-person member (source={0})", sourceId); + continue; + } + String subjectId = processor.getStringOrNull(member, "id"); + if (subjectId != null) { + subjects.add(subjectId); + } else { + LOG.info("Skipping unnamed member (source={0})", member); + } } + builder.addAttribute(ATTR_MEMBER, subjects); } - builder.addAttribute(ATTR_MEMBER, subjects); + return handler.handle(builder.build()); + } else { + return true; } - return handler.handle(builder.build()); } @Override diff --git a/src/main/java/com/evolveum/polygon/connector/grouper/rest/Processor.java b/src/main/java/com/evolveum/polygon/connector/grouper/rest/Processor.java index 49eabd2..9fa18b4 100644 --- a/src/main/java/com/evolveum/polygon/connector/grouper/rest/Processor.java +++ b/src/main/java/com/evolveum/polygon/connector/grouper/rest/Processor.java @@ -42,6 +42,7 @@ import java.util.Arrays; import java.util.List; import java.util.Set; +import java.util.regex.Pattern; /** * @author surmanek @@ -506,4 +507,25 @@ public String getStringOrNull(JSONObject object, String item) { public String getString(JSONObject object, String item) { return (String) get(object, item); // todo error handling } + + boolean groupNameMatches(String name) { + if (name == null) { + return false; + } + return groupNameMatches(name, configuration.getGroupIncludePattern()) && + !groupNameMatches(name, configuration.getGroupExcludePattern()); + } + + private boolean groupNameMatches(String name, String[] patterns) { + if (patterns == null) { + return false; + } + for (String pattern : patterns) { + Pattern compiled = Pattern.compile(pattern); + if (compiled.matcher(name).matches()) { + return true; + } + } + return false; + } } diff --git a/src/test/java/com/evolveum/polygon/connector/grouper/test/GrouperTestHelper.java b/src/test/java/com/evolveum/polygon/connector/grouper/test/GrouperTestHelper.java index 3695241..450090c 100644 --- a/src/test/java/com/evolveum/polygon/connector/grouper/test/GrouperTestHelper.java +++ b/src/test/java/com/evolveum/polygon/connector/grouper/test/GrouperTestHelper.java @@ -92,7 +92,8 @@ protected GrouperConfiguration getConfiguration() { config.setUsername(ADMIN_USERNAME); config.setPassword(new GuardedString(ADMIN_PASSWORD.toCharArray())); config.setSuperGroup(SUPER_GROUP); - config.setGroupIncludePattern(new String[] { SUPER_GROUP }); + config.setGroupIncludePattern(new String[] { ".*" }); + config.setGroupExcludePattern(new String[] { ".*_(includes|excludes|systemOfRecord|systemOfRecordAndIncludes)" }); config.setIgnoreSslValidation(true); config.setSubjectSource(SUBJECT_SOURCE); config.setExportStem("ref");