From 35890817b037196f677ddf358f70aa89116211d3 Mon Sep 17 00:00:00 2001 From: Ethan Kromhout Date: Thu, 21 May 2020 15:20:37 -0400 Subject: [PATCH] Added sync capability to connector --- connector-scim2/pom.xml | 2 +- .../connector/scim2/Scim2Connector.java | 143 +++++++++++++++++- 2 files changed, 142 insertions(+), 3 deletions(-) diff --git a/connector-scim2/pom.xml b/connector-scim2/pom.xml index 8b7c46f..b924a7e 100644 --- a/connector-scim2/pom.xml +++ b/connector-scim2/pom.xml @@ -27,7 +27,7 @@ edu.unc.polygon connector-scim2 - .1-SNAPSHOT + .2-SNAPSHOT jar Scim2 Connector diff --git a/connector-scim2/src/main/java/edu/unc/polygon/connector/scim2/Scim2Connector.java b/connector-scim2/src/main/java/edu/unc/polygon/connector/scim2/Scim2Connector.java index 73f4615..3f2312d 100644 --- a/connector-scim2/src/main/java/edu/unc/polygon/connector/scim2/Scim2Connector.java +++ b/connector-scim2/src/main/java/edu/unc/polygon/connector/scim2/Scim2Connector.java @@ -57,6 +57,7 @@ import java.io.IOException; import java.lang.Object; import java.util.Base64; +import java.time.LocalDateTime; import com.evolveum.polygon.rest.AbstractRestConnector; @@ -65,7 +66,7 @@ * */ @ConnectorClass(displayNameKey = "connector.federation.manager.display", configurationClass = Scim2Configuration.class) -public class Scim2Connector extends AbstractRestConnector implements TestOp, SchemaOp, Connector, SearchOp { +public class Scim2Connector extends AbstractRestConnector implements TestOp, SchemaOp, Connector, SearchOp, SyncOp { private static final Log LOG = Log.getLog(Scim2Connector.class); private static final String ATTR_ID = "id"; //__UID__ @@ -198,6 +199,144 @@ public FilterTranslator createFilterTranslator(ObjectClass oc, Oper return new Scim2FilterTranslator(); } + @Override + public SyncToken getLatestSyncToken(ObjectClass objectClass) { + return new SyncToken(LocalDateTime.now().toString() + "Z"); + } + + @Override + public void sync(ObjectClass oc, SyncToken fromToken, SyncResultsHandler handler, OperationOptions oo) { + if (fromToken == null) { + fromToken = getLatestSyncToken(oc); + } + LOG.info("starting sync"); + LOG.info("ObjectClass.ACCOUNT_NAME is " + ObjectClass.ACCOUNT_NAME); + LOG.info("sync ObjectClass is " + oc.getObjectClassValue() + "--"); + LOG.info("fromToken value is " + fromToken); + String Scim2Attributes = ""; + String Scim2ExcludedAttributes = ""; + String Scim2Filter = ""; + String Scim2SortBy = ""; + String Scim2SortOrder = ""; + String Scim2StartIndex = "0"; + String Scim2Count = "2000"; + /* if (configuration.getScim2Attributes() != null && !StringUtil.isEmpty(configuration.getScim2Attributes())) { + Scim2Attributes = "attributes=" + configuration.getScim2Attributes(); + } + if (configuration.getScim2ExcludedAttributes() != null && !StringUtil.isEmpty(configuration.getScim2ExcludedAttributes())) { + Scim2ExcludedAttributes = "excludedAttributes=" + configuration.getScim2ExcludedAttributes(); + } + if (configuration.getScim2Filter() != null && !StringUtil.isEmpty(configuration.getScim2Filter())) { + Scim2Filter = "filter=" + configuration.getScim2Filter(); + } + if (configuration.getScim2SortBy() != null && !StringUtil.isEmpty(configuration.getScim2SortBy())) { + Scim2SortBy = "sortBy=" + configuration.getScim2SortBy(); + } + if (configuration.getScim2SortOrder() != null && !StringUtil.isEmpty(configuration.getScim2SortOrder())) { + Scim2SortOrder = "sortOrder=" + configuration.getScim2SortOrder(); + }*/ + if (configuration.getScim2StartIndex() != null && !StringUtil.isEmpty(configuration.getScim2StartIndex())) { + Scim2StartIndex = "startIndex=" + configuration.getScim2StartIndex(); + } + if (configuration.getScim2Count() != null && !StringUtil.isEmpty(configuration.getScim2Count())) { + Scim2Count = "count=" + configuration.getScim2Count(); + } + //Integer pagedResultsOffset = oo.getPagedResultsOffset(); + Integer startIndex = new Integer(Scim2StartIndex); + String parameters = ""; + if (!StringUtil.isEmpty(configuration.getScim2Attributes())) { + parameters = "&attributes=" + configuration.getScim2Attributes(); + } + if (!StringUtil.isEmpty(configuration.getScim2ExcludedAttributes())) { + parameters = parameters + "&excludedAttributes=" + configuration.getScim2ExcludedAttributes(); + } + if (!StringUtil.isEmpty(configuration.getScim2Filter())) { + parameters = parameters + "&filter=" + configuration.getScim2Filter() + "and (meta.created gt %22" + fromToken + "%22 or onyen.expirationDate gt %22" + fromToken + "%22)"; + } + else { + parameters = parameters + "&filter=" + "meta.created gt %22" + fromToken + "%22 or onyen.expirationDate gt %22" + fromToken + "%22"; + } + if (!StringUtil.isEmpty(configuration.getScim2SortBy())) { + parameters = parameters + "&sortBy=" + configuration.getScim2SortBy(); + } + if (!StringUtil.isEmpty(configuration.getScim2SortOrder())) { + parameters = parameters + "&sortOrder=" + configuration.getScim2SortOrder(); + } + LOG.info("Parameters for sync searcch are " + parameters); + boolean morePages = true; + while ( morePages ) { + try { + CloseableHttpClient client = HttpClients.createDefault(); + HttpRequestBase restGet; + restGet = new HttpGet(configuration.getServiceAddress() + "/scim/v2/onyen/Users/?startIndex=" + Scim2StartIndex + "&count=" + Scim2Count + parameters ); + authHeader(restGet); + //CloseableHttpResponse getResponse = client.execute(restGet); + //processResponseErrors(getResponse); + JSONObject searchResponseJson = new JSONObject(); + searchResponseJson = callRequest(restGet); + FileWriter file9 = new FileWriter("/tmp/file9.txt"); + file9.write(searchResponseJson.toString()); + System.out.println("Successfully Copied JSON Object to File..."); + System.out.println("\nJSON Object: " + searchResponseJson); + file9.flush(); + file9.close(); + JSONArray peopleArray = new JSONArray(); + if ( searchResponseJson.has("Resources") && searchResponseJson.get("Resources") != null ) { + peopleArray = searchResponseJson.getJSONArray("Resources"); + Integer Scim2CountInteger = new Integer(Scim2Count); + if ( peopleArray.length() < Scim2CountInteger ) { + morePages = false; + } + else { + startIndex = startIndex + Scim2CountInteger; + Scim2StartIndex = startIndex.toString(); + } + for ( int i = 0; i < peopleArray.length(); i++ ) { + JSONObject personJson = peopleArray.getJSONObject(i); + LOG.info(">>> processing ID " + i); + //handleUserId( handler, personJson ); + SyncDeltaBuilder builder = new SyncDeltaBuilder(); + builder.setDeltaType(SyncDeltaType.CREATE_OR_UPDATE); + builder.setObjectClass(ObjectClass.ACCOUNT); + builder.setToken(fromToken); + LOG.info("Building sync connector object for " + String.valueOf(personJson.getString(ATTR_ID))); + ConnectorObjectBuilder objectBuild = new ConnectorObjectBuilder(); + objectBuild.setUid(new Uid(String.valueOf(personJson.getString(ATTR_ID)))); + String [] potentialAttributes = { ATTR_ID, ATTR_EXTERNAL_ID, ATTR_USER_NAME, ATTR_ACTIVE}; + for ( String potentialAttribute: potentialAttributes ) { + LOG.info(">>> checking for attribute " + potentialAttribute ); + if ( personJson.has(potentialAttribute) && personJson.get(potentialAttribute) != null && !JSONObject.NULL.equals(personJson.get(potentialAttribute)) ) { + LOG.info(">>> found attribute " + potentialAttribute ); + if ( potentialAttribute.equals(ATTR_USER_NAME) ) { + //builder.setName(attributes.getString(potentialAttribute)); + objectBuild.setName(personJson.getString(ATTR_USER_NAME)); + } + if ( potentialAttribute.equals(ATTR_ID) ) { + objectBuild.setUid(personJson.getString(ATTR_ID)); + } + if ( potentialAttribute.equals(ATTR_ACTIVE) ) { + addAttr(objectBuild, potentialAttribute, personJson.getBoolean(potentialAttribute)); + } + else { + addAttr(objectBuild, potentialAttribute, personJson.getString(potentialAttribute)); + } + } + } + ConnectorObject connectorObject = objectBuild.build(); + builder.setObject(connectorObject); + handler.handle(builder.build()); + } + } + else { + LOG.info("No data object found in response"); + } + + } catch (IOException IOE) { + throw new ConnectorIOException(IOE.getMessage(), IOE); + } + } + } + @Override public void executeQuery(ObjectClass oc, Scim2Filter filter, ResultsHandler handler, OperationOptions oo) { LOG.info("starting executeQuery"); @@ -209,7 +348,7 @@ public void executeQuery(ObjectClass oc, Scim2Filter filter, ResultsHandler hand String Scim2SortBy = ""; String Scim2SortOrder = ""; String Scim2StartIndex = "0"; - String Scim2Count = "200"; + String Scim2Count = "2000"; if (configuration.getScim2Attributes() != null && !StringUtil.isEmpty(configuration.getScim2Attributes())) { Scim2Attributes = "attributes=" + configuration.getScim2Attributes(); }