/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portal.security.ldap.internal.configuration; import com.liferay.portal.configuration.metatype.bnd.util.ConfigurableUtil; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.model.CompanyConstants; import com.liferay.portal.kernel.util.HashMapDictionary; import com.liferay.portal.kernel.util.MapUtil; import com.liferay.portal.kernel.util.ObjectValuePair; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.security.ldap.configuration.BaseConfigurationProvider; import com.liferay.portal.security.ldap.configuration.ConfigurationProvider; import com.liferay.portal.security.ldap.configuration.LDAPServerConfiguration; import com.liferay.portal.security.ldap.constants.LDAPConstants; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Dictionary; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** * @author Michael C. Han */ @Component( immediate = true, property = { "factoryPid=com.liferay.portal.security.ldap.configuration.LDAPServerConfiguration" }, service = ConfigurationProvider.class ) public class LDAPServerConfigurationProviderImpl extends BaseConfigurationProvider<LDAPServerConfiguration> implements ConfigurationProvider<LDAPServerConfiguration> { @Override public boolean delete(long companyId) { Map<Long, ObjectValuePair<Configuration, LDAPServerConfiguration>> objectValuePairs = _configurations.remove(companyId); if (MapUtil.isEmpty(objectValuePairs)) { return false; } for (ObjectValuePair<Configuration, LDAPServerConfiguration> objectValuePair : objectValuePairs.values()) { Configuration configuration = objectValuePair.getKey(); try { configuration.delete(); } catch (IOException ioe) { throw new SystemException(ioe); } } return true; } @Override public boolean delete(long companyId, long ldapServerId) { Map<Long, ObjectValuePair<Configuration, LDAPServerConfiguration>> objectValuePairs = _configurations.get(companyId); if (MapUtil.isEmpty(objectValuePairs)) { return false; } ObjectValuePair<Configuration, LDAPServerConfiguration> objectValuePair = objectValuePairs.remove(ldapServerId); if (objectValuePair == null) { return false; } Configuration configuration = objectValuePair.getKey(); try { configuration.delete(); } catch (IOException ioe) { throw new SystemException(ioe); } return true; } @Override public LDAPServerConfiguration getConfiguration(long companyId) { List<LDAPServerConfiguration> ldapServerConfigurations = getConfigurations(companyId); LDAPServerConfiguration ldapServerConfiguration = null; if (!ldapServerConfigurations.isEmpty()) { ldapServerConfiguration = ldapServerConfigurations.get(0); } else { ldapServerConfiguration = ConfigurableUtil.createConfigurable( getMetatype(), new HashMapDictionary<>()); } return ldapServerConfiguration; } @Override public LDAPServerConfiguration getConfiguration( long companyId, long ldapServerId) { Map<Long, ObjectValuePair<Configuration, LDAPServerConfiguration>> objectValuePairs = _configurations.get(companyId); Map<Long, ObjectValuePair<Configuration, LDAPServerConfiguration>> defaultObjectValuePairs = _configurations.get( CompanyConstants.SYSTEM); if (MapUtil.isEmpty(objectValuePairs) && MapUtil.isEmpty(defaultObjectValuePairs)) { return _defaultLDAPServerConfiguration; } else if (MapUtil.isEmpty(objectValuePairs)) { objectValuePairs = defaultObjectValuePairs; } ObjectValuePair<Configuration, LDAPServerConfiguration> objectValuePair = objectValuePairs.get(ldapServerId); if ((objectValuePair == null) && !MapUtil.isEmpty(defaultObjectValuePairs)) { objectValuePair = defaultObjectValuePairs.get( LDAPServerConfiguration.LDAP_SERVER_ID_DEFAULT); } if (objectValuePair == null) { return _defaultLDAPServerConfiguration; } return objectValuePair.getValue(); } @Override public Dictionary<String, Object> getConfigurationProperties( long companyId) { List<Dictionary<String, Object>> configurationsProperties = getConfigurationsProperties(companyId); if (configurationsProperties.isEmpty()) { return new HashMapDictionary<>(); } return configurationsProperties.get(0); } @Override public Dictionary<String, Object> getConfigurationProperties( long companyId, long ldapServerId) { Map<Long, ObjectValuePair<Configuration, LDAPServerConfiguration>> objectValuePairs = _configurations.get(companyId); Map<Long, ObjectValuePair<Configuration, LDAPServerConfiguration>> defaultObjectValuePairs = _configurations.get( CompanyConstants.SYSTEM); if (MapUtil.isEmpty(objectValuePairs) && MapUtil.isEmpty(defaultObjectValuePairs)) { return new HashMapDictionary<>(); } else if (MapUtil.isEmpty(objectValuePairs)) { objectValuePairs = defaultObjectValuePairs; } ObjectValuePair<Configuration, LDAPServerConfiguration> objectValuePair = objectValuePairs.get(ldapServerId); if ((objectValuePair == null) && !MapUtil.isEmpty(defaultObjectValuePairs)) { objectValuePair = defaultObjectValuePairs.get( LDAPServerConfiguration.LDAP_SERVER_ID_DEFAULT); } if (objectValuePair == null) { return new HashMapDictionary<>(); } Configuration configuration = objectValuePair.getKey(); return configuration.getProperties(); } @Override public List<LDAPServerConfiguration> getConfigurations(long companyId) { return getConfigurations(companyId, true); } @Override public List<LDAPServerConfiguration> getConfigurations( long companyId, boolean useDefault) { Map<Long, ObjectValuePair<Configuration, LDAPServerConfiguration>> objectValuePairs = _configurations.get(companyId); if (MapUtil.isEmpty(objectValuePairs) && useDefault) { objectValuePairs = _configurations.get(CompanyConstants.SYSTEM); } List<LDAPServerConfiguration> ldapServerConfigurations = new ArrayList<>(); if (MapUtil.isEmpty(objectValuePairs) && useDefault) { ldapServerConfigurations.add(_defaultLDAPServerConfiguration); } else if (!MapUtil.isEmpty(objectValuePairs)) { for (ObjectValuePair<Configuration, LDAPServerConfiguration> objectValuePair : objectValuePairs.values()) { ldapServerConfigurations.add(objectValuePair.getValue()); } } return ldapServerConfigurations; } @Override public List<Dictionary<String, Object>> getConfigurationsProperties( long companyId) { return getConfigurationsProperties(companyId, true); } @Override public List<Dictionary<String, Object>> getConfigurationsProperties( long companyId, boolean useDefault) { Map<Long, ObjectValuePair<Configuration, LDAPServerConfiguration>> objectValuePairs = _configurations.get(companyId); if (MapUtil.isEmpty(objectValuePairs) && useDefault) { objectValuePairs = _configurations.get(CompanyConstants.SYSTEM); } List<Dictionary<String, Object>> configurationsProperties = new ArrayList<>(); if (MapUtil.isEmpty(objectValuePairs) && useDefault) { configurationsProperties.add( new HashMapDictionary<String, Object>()); } else if (!MapUtil.isEmpty(objectValuePairs)) { for (ObjectValuePair<Configuration, LDAPServerConfiguration> objectValuePair : objectValuePairs.values()) { Configuration configuration = objectValuePair.getKey(); Dictionary<String, Object> properties = configuration.getProperties(); configurationsProperties.add(properties); } } return configurationsProperties; } @Override public Class<LDAPServerConfiguration> getMetatype() { return LDAPServerConfiguration.class; } @Override public void registerConfiguration(Configuration configuration) { Dictionary<String, Object> properties = configuration.getProperties(); if (properties == null) { properties = new HashMapDictionary<>(); } LDAPServerConfiguration ldapServerConfiguration = ConfigurableUtil.createConfigurable(getMetatype(), properties); synchronized (_configurations) { Map<Long, ObjectValuePair<Configuration, LDAPServerConfiguration>> ldapServerConfigurations = _configurations.get( ldapServerConfiguration.companyId()); if (ldapServerConfigurations == null) { ldapServerConfigurations = new TreeMap<>(); _configurations.put( ldapServerConfiguration.companyId(), ldapServerConfigurations); } ldapServerConfigurations.put( ldapServerConfiguration.ldapServerId(), new ObjectValuePair<>(configuration, ldapServerConfiguration)); } } @Override public void unregisterConfiguration(Configuration configuration) { Dictionary<String, Object> properties = configuration.getProperties(); if (properties == null) { properties = new HashMapDictionary<>(); } LDAPServerConfiguration ldapServerConfiguration = ConfigurableUtil.createConfigurable(getMetatype(), properties); Map<Long, ObjectValuePair<Configuration, LDAPServerConfiguration>> objectValuePairs = _configurations.get( ldapServerConfiguration.companyId()); synchronized (_configurations) { if (!MapUtil.isEmpty(objectValuePairs)) { objectValuePairs.remove(ldapServerConfiguration.ldapServerId()); if (objectValuePairs.isEmpty()) { _configurations.remove(ldapServerConfiguration.companyId()); } } } } @Override public void updateProperties( long companyId, Dictionary<String, Object> properties) { updateProperties(companyId, 0L, properties); } @Override public void updateProperties( long companyId, long ldapServerId, Dictionary<String, Object> properties) { if (properties == null) { properties = new HashMapDictionary<>(); } properties.put(LDAPConstants.COMPANY_ID, companyId); properties.put(LDAPConstants.LDAP_SERVER_ID, ldapServerId); Map<Long, ObjectValuePair<Configuration, LDAPServerConfiguration>> objectValuePairs = _configurations.get(companyId); if (objectValuePairs == null) { objectValuePairs = new HashMap<>(); _configurations.put(companyId, objectValuePairs); } try { ObjectValuePair<Configuration, LDAPServerConfiguration> objectValuePair = objectValuePairs.get(ldapServerId); Configuration configuration = null; if (objectValuePair == null) { configuration = configurationAdmin.createFactoryConfiguration( getMetatypeId(), StringPool.QUESTION); } else { configuration = objectValuePair.getKey(); } configuration.update(properties); } catch (IOException ioe) { throw new SystemException("Unable to update configuration", ioe); } } @Override @Reference(unbind = "-") protected void setConfigurationAdmin( ConfigurationAdmin configurationAdmin) { super.configurationAdmin = configurationAdmin; } private final Map<Long, Map<Long, ObjectValuePair<Configuration, LDAPServerConfiguration>>> _configurations = new ConcurrentHashMap<>(); private final LDAPServerConfiguration _defaultLDAPServerConfiguration = ConfigurableUtil.createConfigurable( LDAPServerConfiguration.class, Collections.emptyMap()); }