diff --git a/connector-federation-manager/pom.xml b/connector-federation-manager/pom.xml new file mode 100644 index 0000000..be0ee68 --- /dev/null +++ b/connector-federation-manager/pom.xml @@ -0,0 +1,94 @@ + + + + 4.0.0 + + + polygon + com.evolveum.polygon + 1.5.0.0 + + + edu.unc.polygon + connector-federation-manager + .1-SNAPSHOT + jar + + Federation Manager Connector + + + edu.unc.polygon.connector.federationManager + FederationManagerConnector + + + + + evolveum-nexus-releases + Internal Releases + http://nexus.evolveum.com/nexus/content/repositories/releases/ + + + evolveum-nexus-snapshots + Internal Releases + http://nexus.evolveum.com/nexus/content/repositories/snapshots/ + + + apache-snapshots + Apache Snapshots + http://repository.apache.org/snapshots/ + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-resources-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + + + + + + connector-rest + com.evolveum.polygon + 1.4.2.14-SNAPSHOT + + + org.json + json + 20190722 + + + + + + diff --git a/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerConfiguration.java b/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerConfiguration.java new file mode 100644 index 0000000..d3d3395 --- /dev/null +++ b/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerConfiguration.java @@ -0,0 +1,30 @@ +package edu.unc.polygon.connector.federationManager; + +import com.evolveum.polygon.rest.AbstractRestConfiguration; +import org.identityconnectors.common.logging.Log; +import org.identityconnectors.framework.common.exceptions.ConfigurationException; +import org.identityconnectors.framework.common.objects.ObjectClass; +import org.identityconnectors.framework.spi.AbstractConfiguration; +import org.identityconnectors.framework.spi.ConfigurationProperty; + +import java.io.*; +import java.nio.charset.Charset; +import java.util.*; + + +/** + * @author ekromhout@gmail.com + * + */ +public class FederationManagerConfiguration extends AbstractRestConfiguration { + + private static final Log LOG = Log.getLog(FederationManagerConfiguration.class); + +@Override + public void validate() { + // TODO + } + +} + + diff --git a/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerConnector.java b/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerConnector.java new file mode 100644 index 0000000..083a02d --- /dev/null +++ b/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerConnector.java @@ -0,0 +1,248 @@ +package edu.unc.polygon.connector.federationManager; + +import java.net.URI; +import java.net.URISyntaxException; + +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.HttpEntity; +import org.apache.http.HttpRequest; +import org.apache.http.entity.ByteArrayEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpPatch; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; +import org.apache.http.entity.StringEntity; +import org.apache.http.auth.AuthenticationException; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.client.methods.*; +import org.apache.http.annotation.NotThreadSafe; +import org.json.JSONArray; +import org.json.JSONObject; +import org.json.JSONException; +import org.identityconnectors.common.Base64; +import org.identityconnectors.common.StringUtil; +import org.identityconnectors.framework.common.objects.ObjectClassInfoBuilder; +import org.identityconnectors.framework.common.objects.Schema; +import org.identityconnectors.framework.common.objects.SchemaBuilder; +import org.identityconnectors.framework.spi.Configuration; +import org.identityconnectors.framework.spi.Connector; +import org.identityconnectors.framework.spi.PoolableConnector; +import org.identityconnectors.framework.spi.ConnectorClass; +import org.identityconnectors.framework.spi.operations.*; +import org.identityconnectors.framework.common.exceptions.*; +import org.identityconnectors.framework.common.exceptions.ConfigurationException; +import org.identityconnectors.framework.common.exceptions.ConnectorException; +import org.identityconnectors.framework.common.objects.*; +import org.identityconnectors.common.logging.Log; +import org.identityconnectors.common.security.GuardedString; +import org.identityconnectors.framework.common.objects.filter.FilterTranslator; +import java.io.IOException; +import java.util.Iterator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.ArrayList; +import java.io.*; +import java.io.FileWriter; +import java.io.IOException; +import java.lang.Object; + + +import com.evolveum.polygon.rest.AbstractRestConnector; +/** + * @author ethan@unc.edu + * + */ +@ConnectorClass(displayNameKey = "connector.federation.manager.display", configurationClass = FederationManagerConfiguration.class) +public class FederationManagerConnector extends AbstractRestConnector implements TestOp, SchemaOp, PoolableConnector, SearchOp { + + private static final Log LOG = Log.getLog(FederationManagerConnector.class); + private static final String ATTR_ID = "id"; //__UID__ + private static final String ATTR_ORGANIZATION_ID = "organization_id"; + public static final String ATTR_MAIL = "email"; + public static final String ATTR_FAX_NUMBER = "faxnumber"; + public static final String ATTR_MOBILE_NUMBER = "mobilenumber"; + public static final String ATTR_PHONE_NUMBER = "phonenumber"; + //public static final String ATTR_ROLES = "roles"; + public static final String ATTR_FIRST_NAME = "firstname"; + public static final String ATTR_LAST_NAME = "lastname"; + public static final String ATTR_MIDDLE_NAME = "middlename"; + public static final String ATTR_INFORMAL_NAME = "informalname"; + public static final String ATTR_WEBSITE = "website"; + public static final String CONTENT_TYPE = "application/json"; + + + private FederationManagerConfiguration configuration; + + @Override + public void init(Configuration configuration) { + LOG.info(">>> Initializing connector"); + + if (!(configuration instanceof FederationManagerConfiguration)) { + throw new ConfigurationException("Configuration is not instance of " + FederationManagerConfiguration.class.getName()); + } + + FederationManagerConfiguration wordpressConfig = (FederationManagerConfiguration) configuration; + wordpressConfig.validate(); + this.configuration = wordpressConfig; + //super.init(configuration); + getConfiguration(); + LOG.info(">>> Connector initialization finished"); + } + @Override + public void dispose() { + configuration = null; + //handler = null; + } + @Override + public void test() { + + } + + @Override + public void checkAlive() { + test(); + } + + @Override + public Schema schema() { + SchemaBuilder schemaBuilder = new SchemaBuilder(FederationManagerConnector.class); + //Begin Account Objectclass + Set accountAttributes = new HashSet(); + AttributeInfoBuilder id = new AttributeInfoBuilder(); + id.setName("ATTR_ID"); + id.setCreateable(true); + id.setUpdateable(true); + id.setReadable(true); + id.setRequired(true); + id.setMultiValued(false); + accountAttributes.add(id.build()); + AttributeInfoBuilder email = new AttributeInfoBuilder(); + email.setName("ATTR_EMAIL"); + email.setCreateable(true); + email.setUpdateable(true); + email.setReadable(true); + email.setRequired(false); + email.setMultiValued(true); + accountAttributes.add(email.build()); + AttributeInfoBuilder faxnumber = new AttributeInfoBuilder(); + faxnumber.setName("ATTR_FAX_NUMBER"); + faxnumber.setCreateable(true); + faxnumber.setUpdateable(true); + faxnumber.setReadable(true); + faxnumber.setRequired(false); + faxnumber.setMultiValued(false); + accountAttributes.add(faxnumber.build()); + AttributeInfoBuilder firstname = new AttributeInfoBuilder(); + firstname.setName("ATTR_FIRST_NAME"); + firstname.setCreateable(true); + firstname.setUpdateable(true); + firstname.setReadable(true); + firstname.setRequired(false); + firstname.setMultiValued(false); + accountAttributes.add(firstname.build()); + AttributeInfoBuilder informalname = new AttributeInfoBuilder(); + informalname.setName("ATTR_INFORMAL_NAME"); + informalname.setCreateable(true); + informalname.setUpdateable(true); + informalname.setReadable(true); + informalname.setRequired(false); + informalname.setMultiValued(false); + accountAttributes.add(informalname.build()); + AttributeInfoBuilder lastname = new AttributeInfoBuilder(); + lastname.setName("ATTR_LAST_NAME"); + lastname.setCreateable(true); + lastname.setUpdateable(true); + lastname.setReadable(true); + lastname.setRequired(false); + lastname.setMultiValued(false); + accountAttributes.add(lastname.build()); + AttributeInfoBuilder middlename = new AttributeInfoBuilder(); + middlename.setName("ATTR_MIDDLE_NAME"); + middlename.setCreateable(true); + middlename.setUpdateable(true); + middlename.setReadable(true); + middlename.setRequired(false); + middlename.setMultiValued(false); + accountAttributes.add(middlename.build()); + AttributeInfoBuilder mobilenumber = new AttributeInfoBuilder(); + mobilenumber.setName("ATTR_MOBILE_NAME"); + mobilenumber.setCreateable(true); + mobilenumber.setUpdateable(true); + mobilenumber.setReadable(true); + mobilenumber.setRequired(false); + mobilenumber.setMultiValued(false); + accountAttributes.add(mobilenumber.build()); + AttributeInfoBuilder organization_id = new AttributeInfoBuilder(); + organization_id.setName("ATTR_ORGANIZATION_ID"); + organization_id.setCreateable(true); + organization_id.setUpdateable(true); + organization_id.setReadable(true); + organization_id.setRequired(false); + organization_id.setMultiValued(false); + accountAttributes.add(organization_id.build()); + AttributeInfoBuilder phonenumber = new AttributeInfoBuilder(); + phonenumber.setName("ATTR_PHONE_NUMBER"); + phonenumber.setCreateable(true); + phonenumber.setUpdateable(true); + phonenumber.setReadable(true); + phonenumber.setRequired(false); + phonenumber.setMultiValued(false); + accountAttributes.add(phonenumber.build()); + AttributeInfoBuilder website = new AttributeInfoBuilder(); + website.setName("ATTR_WEBSITE"); + website.setCreateable(true); + website.setUpdateable(true); + website.setReadable(true); + website.setRequired(false); + website.setMultiValued(false); + accountAttributes.add(website.build()); + accountAttributes.add(OperationalAttributeInfos.ENABLE); + schemaBuilder.defineObjectClass(ObjectClass.ACCOUNT.getDisplayNameKey(),accountAttributes); + //Finish Account Objectclass, add others before return if needed + LOG.info(">>> schema finished"); + return schemaBuilder.build(); + + + + } + + public FilterTranslator createFilterTranslator(ObjectClass oc, OperationOptions oo) { + LOG.info("inside createFilterTranslator"); + return new FederationManagerFilterTranslator(); + } + + @Override + public void executeQuery(ObjectClass oc, FederationManagerFilter filter, ResultsHandler handler, OperationOptions oo) { + if ( oc.is(ObjectClass.ACCOUNT_NAME)) { + if (filter != null && filter.byUid != null) { + //not sure if this use case exists yet + } + + else if (filter != null && filter.byName != null) { + //not sure if this use case exists yet + } + + else if (filter != null && filter.byEmailAddress != null) { + //not sure if this use case exists yet + } + + else { + //wide open search + } + + + + + } + + } +} diff --git a/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerFilter.java b/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerFilter.java new file mode 100644 index 0000000..d1028b6 --- /dev/null +++ b/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerFilter.java @@ -0,0 +1,19 @@ +package edu.unc.polygon.connector.federationManager; + +/** + * + */ +public class FederationManagerFilter { + public String byName; + public String byUid; + public String byEmailAddress; + + @Override + public String toString() { + return "FederationManagerFilter{" + + "byName='" + byName + '\'' + + ", byUid=" + byUid + + ", byEmailAddress='" + byEmailAddress + '\'' + + '}'; + } +} diff --git a/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerFilterTranslator.java b/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerFilterTranslator.java new file mode 100644 index 0000000..0f7b56b --- /dev/null +++ b/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerFilterTranslator.java @@ -0,0 +1,64 @@ +/* + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package edu.unc.polygon.connector.federationManager; + +import org.identityconnectors.common.logging.Log; +import org.identityconnectors.framework.common.objects.Attribute; +import org.identityconnectors.framework.common.objects.Name; +import org.identityconnectors.framework.common.objects.Uid; +import org.identityconnectors.framework.common.objects.filter.AbstractFilterTranslator; +import org.identityconnectors.framework.common.objects.filter.EqualsFilter; + +/** + */ +public class FederationManagerFilterTranslator extends AbstractFilterTranslator { + private static final Log LOG = Log.getLog(FederationManagerFilterTranslator.class); + + @Override + protected FederationManagerFilter createEqualsExpression(EqualsFilter filter, boolean not) { + LOG.ok("createEqualsExpression, filter: {0}, not: {1}", filter, not); + + if (not) { + return null; // not supported + } + + Attribute attr = filter.getAttribute(); + LOG.ok("attr.getName: {0}, attr.getValue: {1}, Uid.NAME: {2}, Name.NAME: {3}", attr.getName(), attr.getValue(), Uid.NAME, Name.NAME); + if (Uid.NAME.equals(attr.getName())) { + if (attr.getValue() != null && attr.getValue().get(0) != null) { + FederationManagerFilter lf = new FederationManagerFilter(); + lf.byUid = String.valueOf(attr.getValue().get(0)); + LOG.ok("lf.byUid: {0}, attr.getValue().get(0): {1}", lf.byUid, attr.getValue().get(0)); + return lf; + } + } + else if (Name.NAME.equals(attr.getName())) { + if (attr.getValue() != null && attr.getValue().get(0) != null) { + FederationManagerFilter lf = new FederationManagerFilter(); + lf.byName = String.valueOf(attr.getValue().get(0)); + return lf; + } + } + else if (FederationManagerConnector.ATTR_MAIL.equals(attr.getName())) { + if (attr.getValue() != null && attr.getValue().get(0) != null) { + FederationManagerFilter lf = new FederationManagerFilter(); + lf.byEmailAddress = String.valueOf(attr.getValue().get(0)); + return lf; + } + } + + return null; // not supported + } +} diff --git a/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerConfiguration.class b/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerConfiguration.class new file mode 100644 index 0000000..a193683 Binary files /dev/null and b/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerConfiguration.class differ diff --git a/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerConnector.class b/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerConnector.class new file mode 100644 index 0000000..dd91a0f Binary files /dev/null and b/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerConnector.class differ diff --git a/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerFilter.class b/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerFilter.class new file mode 100644 index 0000000..17e6f92 Binary files /dev/null and b/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerFilter.class differ diff --git a/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerFilterTranslator.class b/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerFilterTranslator.class new file mode 100644 index 0000000..b941882 Binary files /dev/null and b/connector-federation-manager/target/classes/edu/unc/polygon/connector/federationManager/FederationManagerFilterTranslator.class differ diff --git a/connector-federation-manager/target/connector-federation-manager-.1-SNAPSHOT.jar b/connector-federation-manager/target/connector-federation-manager-.1-SNAPSHOT.jar new file mode 100644 index 0000000..df201b9 Binary files /dev/null and b/connector-federation-manager/target/connector-federation-manager-.1-SNAPSHOT.jar differ diff --git a/connector-federation-manager/target/maven-archiver/pom.properties b/connector-federation-manager/target/maven-archiver/pom.properties new file mode 100644 index 0000000..0513a05 --- /dev/null +++ b/connector-federation-manager/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Fri Aug 30 09:32:14 EDT 2019 +version=.1-SNAPSHOT +groupId=edu.unc.polygon +artifactId=connector-federation-manager diff --git a/connector-federation-manager/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/connector-federation-manager/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..8bb0bd4 --- /dev/null +++ b/connector-federation-manager/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,4 @@ +edu/unc/polygon/connector/federationManager/FederationManagerFilterTranslator.class +edu/unc/polygon/connector/federationManager/FederationManagerConfiguration.class +edu/unc/polygon/connector/federationManager/FederationManagerFilter.class +edu/unc/polygon/connector/federationManager/FederationManagerConnector.class diff --git a/connector-federation-manager/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/connector-federation-manager/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..80c3b97 --- /dev/null +++ b/connector-federation-manager/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,4 @@ +/home/ekromhout/src/midpoint-connectors/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerFilterTranslator.java +/home/ekromhout/src/midpoint-connectors/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerConnector.java +/home/ekromhout/src/midpoint-connectors/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerFilter.java +/home/ekromhout/src/midpoint-connectors/connector-federation-manager/src/main/java/edu/unc/polygon/connector/federationManager/FederationManagerConfiguration.java