/**
* Copyright (c) Istituto Nazionale di Fisica Nucleare (INFN). 2006-2016
*
* 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.glite.security.voms.admin.integration.orgdb;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import org.glite.security.voms.admin.configuration.VOMSConfiguration;
import org.glite.security.voms.admin.configuration.VOMSConfigurationConstants;
import org.glite.security.voms.admin.core.tasks.VOMSExecutorService;
import org.glite.security.voms.admin.core.validation.ValidationManager;
import org.glite.security.voms.admin.integration.AbstractPluginConfigurator;
import org.glite.security.voms.admin.integration.VOMSPluginConfigurationException;
import org.glite.security.voms.admin.integration.orgdb.dao.OrgDBDAOFactory;
import org.glite.security.voms.admin.integration.orgdb.dao.OrgDBVOMSPersonDAO;
import org.glite.security.voms.admin.integration.orgdb.database.OrgDBError;
import org.glite.security.voms.admin.integration.orgdb.database.OrgDBSessionFactory;
import org.glite.security.voms.admin.integration.orgdb.strategies.OrgDBEmailAddressValidationStrategy;
import org.hibernate.HibernateException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class OrgDBConfigurator extends AbstractPluginConfigurator {
public static final Logger log = LoggerFactory
.getLogger(OrgDBConfigurator.class);
public static final String DEFAULT_CONFIG_FILE_NAME = "orgdb.properties";
public static final String ORGDB_EXPERIMENT_NAME_PROPERTY = "experimentName";
public static final String ORGDB_MEMBERSHIP_CHECK_PERIOD_IN_SECONDS = "membership_check.period";
public static final String ORGDB_REGISTRATION_TYPE = "orgdb";
public static final String ORGDB_EMAIL_VALIDATOR_CONFIG_KEY = "orgdb.email.validator";
/**
* Default ORGDB membership check period in seconds. (6 hours)
*/
private static final Long ORGDB_DEFAULT_CHECK_PERIOD = 26100L;
private OrgDBEmailAddressValidationStrategy emailValidator;
/**
* Loads the OrgDB hibernate properties.
*
* @return the OrgDB hibernate properties
* @throws VOMSPluginConfigurationException
*/
Properties loadOrgDBDatabaseProperties()
throws VOMSPluginConfigurationException {
String defaultConfigFilePath = getVomsConfigurationDirectoryPath() + "/"
+ DEFAULT_CONFIG_FILE_NAME;
String configFilePath = getPluginProperty("configFile",
defaultConfigFilePath);
Properties orgDbProps = new Properties();
try {
orgDbProps.load(new FileInputStream(new File(configFilePath)));
} catch (FileNotFoundException e) {
String errorMessage = String.format(
"Configuration file '%s' for plugin '%s' does not exist!",
configFilePath, getPluginName());
throw new VOMSPluginConfigurationException(errorMessage, e);
} catch (IOException e) {
String errorMessage = String
.format(
"Error reading configuration file '%s' for plugin '%s' does not exist!",
configFilePath, getPluginName());
throw new VOMSPluginConfigurationException(errorMessage, e);
}
return orgDbProps;
}
public void checkOrgDBConnection() {
log.debug("Running OrgDB connection check.");
OrgDBVOMSPersonDAO personDAO = OrgDBDAOFactory.instance()
.getVOMSPersonDAO();
try {
personDAO.findPersonByEmail("andrea.ceccanti@cnaf.infn.it");
log.info("Connection to the OrgDB database is active.");
// Don't leave a transaction hanging
OrgDBSessionFactory.commitTransaction();
} catch (HibernateException e) {
log.warn("Error contacting the OrgDB database: {}", e.getMessage(), e);
}
}
public synchronized void configure() throws VOMSPluginConfigurationException {
log.debug("OrgDB voms configuration started.");
try {
OrgDBSessionFactory.initialize(loadOrgDBDatabaseProperties());
} catch (OrgDBError e) {
log.error("Error configuring OrgDB hibernate session factory!", e);
throw new VOMSPluginConfigurationException(
"Error initalizing OrgDB hibernate session factory!", e);
}
log.debug("OrgDB Database properties loaded succesfully.");
checkOrgDBConnection();
String uppercaseVOName = VOMSConfiguration.instance().getVOName()
.toUpperCase();
String experimentName = getPluginProperty(ORGDB_EXPERIMENT_NAME_PROPERTY,
uppercaseVOName);
log.info("Setting OrgDB experiment name: {}", experimentName);
emailValidator = new DefaultEmailValidationStrategy(experimentName);
OrgDBRequestValidator validator = new OrgDBRequestValidator(experimentName);
ValidationManager.instance().setRequestValidationContext(validator);
VOMSConfiguration.instance().setRegistrationType(ORGDB_REGISTRATION_TYPE);
VOMSConfiguration.instance().setProperty(
VOMSConfigurationConstants.VOMS_INTERNAL_RO_PERSONAL_INFORMATION,
Boolean.TRUE);
VOMSConfiguration.instance().setProperty(
VOMSConfigurationConstants.VOMS_INTERNAL_RO_MEMBERSHIP_EXPIRATION_DATE,
Boolean.TRUE);
log.info("OrgDB request validator registered SUCCESSFULLY.");
Long checkPeriod;
try {
checkPeriod = Long.parseLong(getPluginProperty(
OrgDBConfigurator.ORGDB_MEMBERSHIP_CHECK_PERIOD_IN_SECONDS,
ORGDB_DEFAULT_CHECK_PERIOD.toString()));
} catch (NumberFormatException e) {
log
.error(
"Error parsing OrgDB membership check validity period: {}. Please provide an appropriate number for the OrgDb membership_check.period property!",
e.getMessage());
log.error("The default value of {} seconds will be used instead.",
ORGDB_DEFAULT_CHECK_PERIOD);
checkPeriod = ORGDB_DEFAULT_CHECK_PERIOD;
}
OrgDBMembershipSynchronizationTask syncTask = new OrgDBMembershipSynchronizationTask(
experimentName, new SuspendInvalidMembersStrategy(),
new LogOnlyExpiredParticipationStrategy(), new DefaultSyncStrategy());
OrgDBSyncTaskContainer.INSTANCE.setTask(syncTask);
VOMSExecutorService.instance().startBackgroundTask(syncTask, null,
checkPeriod);
}
public OrgDBEmailAddressValidationStrategy getEmailValidator() {
return emailValidator;
}
}