Package org.wso2.carbon.ldap.server.tenant

Source Code of org.wso2.carbon.ldap.server.tenant.LDAPTenantManagerService

/*
*  Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
*  WSO2 Inc. licenses this file to you 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.wso2.carbon.ldap.server.tenant;

import org.apache.log4j.Logger;
import org.wso2.carbon.apacheds.AdminInfo;
import org.wso2.carbon.apacheds.PartitionInfo;
import org.wso2.carbon.apacheds.PartitionManager;
import org.wso2.carbon.apacheds.exception.DirectoryServerException;
import org.wso2.carbon.ldap.server.util.EmbeddingLDAPException;
import org.wso2.carbon.ldap.server.configuration.LDAPConfigurationBuilder;
import org.wso2.carbon.user.core.UserStoreException;
import org.wso2.carbon.user.core.tenant.LDAPTenantManager;
import org.wso2.carbon.user.core.tenant.Tenant;


public class LDAPTenantManagerService implements LDAPTenantManager {

    private final Logger logger = Logger.getLogger(LDAPTenantManagerService.class);
    private PartitionManager ldapPartitionManager = null;
    private LDAPConfigurationBuilder ldapConfigurationBuilder = null;

    public LDAPTenantManagerService(PartitionManager partitionManager) {
        this.ldapPartitionManager = partitionManager;

    }

    /**
     * This constructor is used to pass both partition manager and tenant manager references at the
     * creation of LDAPTenantManagerService.
     *
     * @param partitionManager
     * @param ldapConfiguration
     */
    public LDAPTenantManagerService(PartitionManager partitionManager, LDAPConfigurationBuilder
            ldapConfiguration) {
        this.ldapPartitionManager = partitionManager;
        this.ldapConfigurationBuilder = ldapConfiguration;

    }

    /**
     * Add a new partition for a tenant when a new tenant is created.
     *
     * @param tenant object
     * @return tenant id
     * @throws UserStoreException
     */
    public int addTenant(Tenant tenant) throws UserStoreException {

        try {

            this.ldapPartitionManager.addPartition(getPartitionInfo(tenant));

        } catch (DirectoryServerException e) {
            //exception can be caught if addPartition method fails.
            String errorMessage = "Could not create a new partition for tenant id - " +
                                  tenant.getId() + "and for tenant domain - " + tenant.getDomain();
            logger.error(errorMessage, e);
            throw new UserStoreException(errorMessage, e);
        } catch (EmbeddingLDAPException e) {
            //exception can be caught if getPartitionInfo method fails.
            String errorMessage = "Could not create a new partition for tenant id - " +
                                  tenant.getId() + "and for tenant domain - " + tenant.getDomain();
            logger.error(errorMessage, e);
            throw new UserStoreException(errorMessage, e);

        }

        return tenant.getId();
    }

    public void updateTenant(Tenant tenant) throws UserStoreException {

        /*try {
            this.ldapPartitionManager.updatePartition(String.valueOf(tenant.getId()), tenant.getAdminName(),
                                                      getTenantSuffix(tenant.getDomain()), getAdminInfo(tenant));

        } catch (DirectoryServerException e) {
            throw new UserStoreException(
                "Can not update the LDAP partition for tenant id  - " + tenant.getId() + " tenant domain " +
                    tenant.getDomain(), e);
        }*/
    }

    public void deleteTenant(int i) throws UserStoreException {

        try {
            this.ldapPartitionManager.removePartition(String.valueOf(i));
        } catch (Exception e) {
            throw new UserStoreException("Could not remove partition for tenant id " + i, e);
        }
    }

    /**
     * When initializing HybridLDAPTenantManager, the existing partitions for tenants are
     * initialized. This method adds existing partition to each tenant.
     *
     * @param tenant object
     * @throws UserStoreException
     */
    public void addPartitionToTenant(Tenant tenant) throws UserStoreException {
        try {
            ldapPartitionManager.initializeExistingPartition(getPartitionInfo(tenant));

        } catch (Exception e) {
            throw new UserStoreException("Can not add the new partition ", e);
        }
    }

    /**
     * This returns rootDN from the domain. if domain=wso2.com, returns dc=wso2,dc=com
     *
     * @param domain name of the tenant
     * @return rootDN for the tenant
     */
    private String getTenantSuffix(String domain) {
        // here we use a simple algorithm by splitting the domain with .
        String[] domainParts = domain.split("\\.");
        StringBuffer suffixName = new StringBuffer();
        for (String domainPart : domainParts) {
            suffixName.append(",dc=").append(domainPart);
        }

        return suffixName.toString().replaceFirst(",", "");
    }

    /**
     * This constructs AdminInfo which is needed to create partition; from the tenant info
     *
     * @param tenant object
     * @return Admin Info created out of tenant info
     */
    private AdminInfo getAdminInfo(Tenant tenant) throws EmbeddingLDAPException {

        AdminInfo tenantAdminInfo = new AdminInfo();
        /*Set the object class to be used in admin entry by reading it from configuration.*/
        try {
            tenantAdminInfo.addObjectClass(
                    ldapConfigurationBuilder.getLdapConfiguration().getAdminEntryObjectClass());
        } catch (EmbeddingLDAPException e) {
            String errorMessage = "Error in obtaining LDAP Configuration.";
            logger.error(errorMessage, e);
            throw new EmbeddingLDAPException(errorMessage, e);
        }
        /*Following details of tenant admin is captured from the user through ui.*/
        //set admin's user name
        if (tenant.getAdminName() != null) {
            tenantAdminInfo.setAdminUID(tenant.getAdminName());
        }

        if (tenant.getAdminFirstName() != null) {
            tenantAdminInfo.setAdminCommonName(tenant.getAdminFirstName());
        }
        if (tenant.getAdminLastName() != null) {
            tenantAdminInfo.setAdminLastName(tenant.getAdminLastName());
        }

        if (tenant.getEmail() != null) {
            tenantAdminInfo.setAdminEmail(tenant.getEmail());
        }

        if (tenant.getAdminPassword() != null) {
            tenantAdminInfo.setAdminPassword(tenant.getAdminPassword());
        }
        return tenantAdminInfo;
    }

    /**
     * This constructs PartitionInfo which is needed to create partition; from the tenant info
     *
     * @param tenant object
     * @return partition info created out of tenant info
     */
    private PartitionInfo getPartitionInfo(Tenant tenant) throws EmbeddingLDAPException {

        String partitionID = String.valueOf(tenant.getId());
        //String partitionID = tenant.getDomain();
        String realm = tenant.getDomain();
        String rootDN = getTenantSuffix(tenant.getDomain());
        AdminInfo tenantAdminInfo = getAdminInfo(tenant);

        return new PartitionInfo(partitionID, realm, rootDN, tenantAdminInfo);
    }

}
TOP

Related Classes of org.wso2.carbon.ldap.server.tenant.LDAPTenantManagerService

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.