All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.connid.bundles.openam.methods.OpenAMExecuteQuery Maven / Gradle / Ivy

The newest version!
/*
 * ====================
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2011 Tirasa. All rights reserved.
 *
 * The contents of this file are subject to the terms of the Common Development
 * and Distribution License("CDDL") (the "License").  You may not use this file
 * except in compliance with the License.
 *
 * You can obtain a copy of the License at
 * http://IdentityConnectors.dev.java.net/legal/license.txt
 * See the License for the specific language governing
 * permissions and limitations under the License.
 *
 * When distributing the Covered Code, include this
 * CDDL Header Notice in each file
 * and include the License file at identityconnectors/legal/license.txt.
 * If applicable, add the following below this CDDL Header, with the fields
 * enclosed by brackets [] replaced by your own identifying information:
 * "Portions Copyrighted [year] [name of copyright owner]"
 * ====================
 */
package org.connid.bundles.openam.methods;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.connid.bundles.openam.OpenAMConfiguration;
import org.connid.bundles.openam.OpenAMConnection;
import org.connid.bundles.openam.utilities.AdminToken;
import org.connid.bundles.openam.utilities.constants.InetUserStatus;
import org.connid.bundles.openam.utilities.constants.OpenAMQueryStringParameters;
import org.identityconnectors.framework.common.exceptions.ConnectorException;
import org.identityconnectors.framework.common.objects.*;

public class OpenAMExecuteQuery extends CommonMethods {

    private OpenAMConnection connection = null;

    private String ldapFilter = null;

    private ResultsHandler handler = null;

    private AdminToken adminToken = null;

    public OpenAMExecuteQuery(final OpenAMConfiguration configuration, final String ldapFilter, final ResultsHandler rh)
            throws UnsupportedEncodingException {

        super(configuration);

        connection = OpenAMConnection.openConnection(configuration);
        this.ldapFilter = ldapFilter;
        handler = rh;
        adminToken = new AdminToken(configuration);
    }

    public final void executeQuery() {
        try {
            doExecuteQuery();
            adminToken.destroyToken();
        } catch (Exception e) {
            LOG.error(e, "error during execute query operation");
            throw new ConnectorException(e);
        }
    }

    private void doExecuteQuery()
            throws IOException {
        String[] uidResults = connection.search(searchParameters(cleanLdapFilter())).split("string=");
        LOG.ok("Search committed");

        if (uidResults == null || uidResults.length == 1) {
            LOG.error("User " + ldapFilter + " not exists");
            return;
        }

        final List usersList = new ArrayList();

        for (int i = 1; i < uidResults.length; i++) {
            if (!uidResults[i].startsWith("anonymous") && !uidResults[i].startsWith("amAdmin")) {
                usersList.add(connection.read(readParameters(uidResults[i])).split("identitydetails."));
            }
        }

        List attributesList = new ArrayList();
        ConnectorObjectBuilder bld = new ConnectorObjectBuilder();
        String name = "";
        for (Iterator it = usersList.iterator(); it.hasNext();) {
            String[] userDetails = it.next();
            for (int i = 0; i < userDetails.length; i++) {
                if (userDetails[i].contains("name=")) {
                    attributesList.clear();
                    String[] names = userDetails[i].split("=");
                    name = names[1];
                    for (int j = i + 1; j < userDetails.length && !userDetails[j].contains("name="); j++) {
                        if (userDetails[j].contains("value=")) {
                            String[] value = userDetails[j].split("=");
                            attributesList.add(value[1].trim());
                        }
                    }
                }
                if (name != null
                        && name.toLowerCase().contains(configuration.getOpenamUidAttribute().toLowerCase())) {
                    bld.setUid(attributesList.get(0));
                    bld.setName(attributesList.get(0));
                }
                if (name != null
                        && name.toLowerCase().contains(configuration.getOpenamStatusAttribute().toLowerCase())) {
                    bld.addAttribute(AttributeBuilder.buildEnabled(
                            InetUserStatus.ACTIVE.equalsIgnoreCase(attributesList.get(0))));
                }

                if (name != null && name.contains("objectclass")) {
                    for (int j = 0; j < attributesList.size(); j++) {
                        bld.setObjectClass(new ObjectClass(attributesList.get(j)));
                    }
                }

                if (name != null && !name.isEmpty()) {
                    bld.addAttribute(name, attributesList);
                }
            }
            handler.handle(bld.build());
        }
    }

    private boolean cleanLdapFilter() {
        boolean searchForUid = false;
        if (ldapFilter.contains(Uid.NAME)) {
            ldapFilter = ldapFilter.split("=")[1];
            ldapFilter = ldapFilter.substring(0, ldapFilter.length() - 1);
            searchForUid = true;
        } else if (ldapFilter.contains("&")) {
            ldapFilter = ldapFilter.replace("&", "%26");
        } else if (ldapFilter.contains("|")) {
            ldapFilter = ldapFilter.replace("|", "%7C");
        }
        return searchForUid;
    }

    private String searchParameters(final boolean searchForUid)
            throws UnsupportedEncodingException {
        StringBuilder parameters = new StringBuilder();
        if (searchForUid) {
            parameters.append(OpenAMQueryStringParameters.FILTER).
                    append(ldapFilter);
        } else {
            parameters.append(OpenAMQueryStringParameters.FILTER + "*");
            if (ldapFilter != null && !ldapFilter.isEmpty()) {
                parameters.append(")").append(ldapFilter);
            }
        }
        parameters.append(
                OpenAMQueryStringParameters.A_NAMES
                + "realm" + OpenAMQueryStringParameters.A_VALUES + "_realm=").
                append(configuration.getOpenamRealm()).append(
                OpenAMQueryStringParameters.ADMIN).append(
                adminToken.getToken());
        return parameters.toString();
    }

    private String readParameters(final String name)
            throws UnsupportedEncodingException {
        StringBuilder readParameters = new StringBuilder();
        readParameters.append(OpenAMQueryStringParameters.NAME).
                append(name).append(OpenAMQueryStringParameters.A_NAMES
                + "realm" + OpenAMQueryStringParameters.A_VALUES + "_realm=").
                append(configuration.getOpenamRealm()).append(
                OpenAMQueryStringParameters.ADMIN).append(
                adminToken.getToken());
        return readParameters.toString();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy