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

org.connid.bundles.ad.util.DirSyncUtils Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (C) 2011 ConnId ([email protected])
 *
 * 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 org.connid.bundles.ad.util;

import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.SearchControls;
import javax.naming.ldap.LdapContext;
import org.connid.bundles.ad.ADConfiguration;
import org.connid.bundles.ad.ADConnector;
import org.connid.bundles.ldap.search.LdapInternalSearch;
import org.identityconnectors.common.StringUtil;
import org.identityconnectors.common.logging.Log;
import org.identityconnectors.framework.spi.AbstractConfiguration;

public class DirSyncUtils {

    private static final Log LOG = Log.getLog(DirSyncUtils.class);

    public static String createDirSyncUFilter(final ADConfiguration conf, final ADUtilities utils) {

        final String isDeleted = String.valueOf(conf.isRetrieveDeletedUser()).toUpperCase();

        final StringBuilder filter = new StringBuilder();
        final StringBuilder mfilter = new StringBuilder();
        final StringBuilder ufilter = new StringBuilder();

        mfilter.append("(objectClass=group)");

        ufilter.append(utils.getMembershipSearchFilter(conf));

        ufilter.insert(0, "(&(objectClass=user)").append(")");

        filter.append("(|").append(ufilter).append(mfilter).
                append("(&(isDeleted=").append(isDeleted).append(")(objectClass=user)))");

        return filter.toString();
    }

    public static String createDirSyncGFilter(final ADConfiguration conf) {

        final StringBuilder filter = new StringBuilder();

        if (conf.isRetrieveDeletedGroup()) {
            filter.append("(objectClass=group)");
        } else {
            filter.append("(&(objectClass=group)(! (isDeleted=TRUE)))");
        }

        return filter.toString();
    }

    public static String createLdapUFilter(final ADConfiguration conf) {

        final String[] memberships = conf.getMemberships();

        final String isDeleted = String.valueOf(conf.isRetrieveDeletedUser()).toUpperCase();

        final StringBuilder filter = new StringBuilder();
        final StringBuilder mfilter = new StringBuilder();
        final StringBuilder ufilter = new StringBuilder();

        if (memberships != null && memberships.length > 0) {
            mfilter.append("(&(objectClass=group)(|");
            ufilter.append(conf.isMembershipsInOr() ? "(|" : "(&");

            for (String group : memberships) {
                mfilter.append("(distinguishedName=").append(group).append(")");
                ufilter.append("(").append(ADConnector.MEMBEROF).append("=").append(group).append(")");
            }

            ufilter.append(")");
            mfilter.append("))");
        }

        ufilter.insert(0, "(&(objectClass=user)").append(")");

        filter.append("(|").append(ufilter).append(mfilter).
                append("(&(isDeleted=").append(isDeleted).append(")(objectClass=user)))");

        return filter.toString();
    }

    private static String AddLeadingZero(int k) {
        return (k <= 0xF)
                ? "0" + Integer.toHexString(k) : Integer.toHexString(k);
    }

    public static String getGuidAsString(byte[] GUID) {
        String strGUID = "";
        String byteGUID = "";

        for (int c = 0; c < GUID.length; c++) {
            byteGUID = byteGUID + "\\" + AddLeadingZero((int) GUID[c] & 0xFF);
        }

        //convert the GUID into string format
        strGUID = strGUID + AddLeadingZero((int) GUID[3] & 0xFF);
        strGUID = strGUID + AddLeadingZero((int) GUID[2] & 0xFF);
        strGUID = strGUID + AddLeadingZero((int) GUID[1] & 0xFF);
        strGUID = strGUID + AddLeadingZero((int) GUID[0] & 0xFF);
        strGUID = strGUID + "-";
        strGUID = strGUID + AddLeadingZero((int) GUID[5] & 0xFF);
        strGUID = strGUID + AddLeadingZero((int) GUID[4] & 0xFF);
        strGUID = strGUID + "-";
        strGUID = strGUID + AddLeadingZero((int) GUID[7] & 0xFF);
        strGUID = strGUID + AddLeadingZero((int) GUID[6] & 0xFF);
        strGUID = strGUID + "-";
        strGUID = strGUID + AddLeadingZero((int) GUID[8] & 0xFF);
        strGUID = strGUID + AddLeadingZero((int) GUID[9] & 0xFF);
        strGUID = strGUID + "-";
        strGUID = strGUID + AddLeadingZero((int) GUID[10] & 0xFF);
        strGUID = strGUID + AddLeadingZero((int) GUID[11] & 0xFF);
        strGUID = strGUID + AddLeadingZero((int) GUID[12] & 0xFF);
        strGUID = strGUID + AddLeadingZero((int) GUID[13] & 0xFF);
        strGUID = strGUID + AddLeadingZero((int) GUID[14] & 0xFF);
        strGUID = strGUID + AddLeadingZero((int) GUID[15] & 0xFF);

        return strGUID;
    }

    /**
     * Verify custom filter (used to validate any retrieved user).
     *
     * @param ctx ldap context.
     * @param dn user distinguished name.
     * @param conf connector configuration.
     * @return TRUE if verified; FALSE otherwise.
     */
    public static boolean verifyCustomFilter(
            final LdapContext ctx,
            final String dn,
            final ADConfiguration conf) {
        return verifyFilter(ctx, dn, getFilter(conf));
    }

    /**
     * Verify complete filter including the custom one. This method is used to validate users 'IN' group.
     *
     * @param conf connector configuration.
     * @return TRUE if verified; FALSE otherwise.
     */
    public static String getUserFilter(final ADConfiguration conf) {

        final StringBuilder filter = new StringBuilder();
        filter.append("(&(").append(createLdapUFilter(conf)).append(")");

        filter.append(getFilter(conf) != null ? getFilter(conf) : "").append(")");

        return filter.toString();
    }

    public static boolean verifyFilter(
            final LdapContext ctx,
            final String dn,
            final String filter) {
        final SearchControls searchCtls = LdapInternalSearch.createDefaultSearchControls();

        searchCtls.setSearchScope(SearchControls.OBJECT_SCOPE);
        searchCtls.setReturningAttributes(new String[] {});

        boolean found = true;

        if (StringUtil.isNotBlank(filter)) {
            try {

                final NamingEnumeration res = ctx.search(dn, filter, searchCtls);
                found = res != null && res.hasMoreElements();

            } catch (NamingException ex) {
                LOG.warn(ex, "Error searching for {0}", filter);
                found = false;
            }
        }

        return found;
    }

    private static String getFilter(final AbstractConfiguration conf) {
        return ((ADConfiguration) conf).getAccountSearchFilter();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy