/* * Copyright 2003 Federal Chancellery Austria * MOA-SPSS has been developed in a cooperation between BRZ, the Federal * Chancellery Austria - ICT staff unit, and Graz University of Technology. * * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by * the European Commission - subsequent versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * http://www.osor.eu/eupl/ * * Unless required by applicable law or agreed to in writing, software * distributed under the Licence is distributed on an "AS IS" basis, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the Licence for the specific language governing permissions and * limitations under the Licence. * * This product combines work with different licenses. See the "NOTICE" text * file for details on the various modules and licenses. * The "NOTICE" text file is part of the distribution. Any derivative works * that you distribute must include a readable copy of the "NOTICE" text file. */ package at.gv.egovernment.moa.spss.server.init; import java.io.IOException; import java.util.Calendar; import java.util.Date; import java.util.Iterator; import java.util.ServiceLoader; import java.util.Timer; import org.slf4j.LoggerFactory; import at.gv.egovernment.moa.sig.tsl.config.TslConfigurationImpl; import at.gv.egovernment.moa.spss.MOAException; import at.gv.egovernment.moa.spss.api.common.TSLConfiguration; import at.gv.egovernment.moa.spss.server.config.ConfigurationProvider; import at.gv.egovernment.moa.spss.server.iaik.config.IaikConfigurator; import at.gv.egovernment.moa.spss.server.service.RevocationArchiveCleaner; import at.gv.egovernment.moa.spss.tsl.TSLServiceFactory; import at.gv.egovernment.moa.spss.tsl.timer.TSLUpdaterTimerTask; import at.gv.egovernment.moa.spss.util.MessageProvider; import at.gv.egovernment.moaspss.logging.LogMsg; import at.gv.egovernment.moaspss.logging.Logger; import at.gv.egovernment.moaspss.logging.LoggingContext; import at.gv.egovernment.moaspss.logging.LoggingContextManager; import at.gv.egovernment.moaspss.util.Constants; import at.gv.egovernment.moaspss.util.DOMUtils; import iaik.asn1.ObjectID; import iaik.pkcs.pkcs12.PKCS12KeyStore; import iaik.server.ConfigurationData; import iaik.utils.RFC2253NameParser; /** * MOA SP/SS web service initialization. * * @author Patrick Peck * @version $Id$ */ public class SystemInitializer { private static final org.slf4j.Logger logger = LoggerFactory.getLogger(SystemInitializer.class); /** * 15 min TSL reload scheduler interval. */ private static final long TSL_SCHEDULE_INTERVAL = 5*60*1000; /** Interval between archive cleanups in seconds */ private static final long ARCHIVE_CLEANUP_INTERVAL = 60 * 60; // 1h /** Whether XML schema grammars have been initialized. */ private static boolean grammarsInitialized = false; private static ServiceLoader initializerServices = ServiceLoader.load(ExternalInitializer.class); private static ConfigurationData iaikConfiguration; private static ConfigurationProvider config; private static void runInitializer(ConfigurationProvider configurationProvider) { final Iterator initializerIterator = initializerServices.iterator(); logger.info("Running external initializers"); while (initializerIterator.hasNext()) { final ExternalInitializer externalInitializer = initializerIterator.next(); externalInitializer.initialize(configurationProvider); } } /** * Initialize the MOA SP/SS webservice. * * @return */ public static StartupConfigurationHolder init() { logger.info("##############################################################################"); logger.info("##############################################################################"); logger.info("### ###"); logger.info("### LOADING MOA-SPSS ###"); logger.info("### ================ ###"); logger.info("### ###"); logger.info("##############################################################################"); logger.info("##############################################################################"); // set up a logging context for logging the startup LoggingContextManager.getInstance().setLoggingContext( new LoggingContext("startup")); // initialize preparsed Xerces grammar pool for faster XML loadXsdSchemaIntoXmlParser(); Logger.info("Register additional RFC2253 Object identifier"); RFC2253NameParser.register( "organizationIdentifier", new ObjectID("2.5.4.97", "organizationIdentifier", (String) null, false)); // initialize configuration initializeMoaSigConfiguraion(); // start the archive cleanup thread Thread archiveCleaner = new Thread(new RevocationArchiveCleaner(ARCHIVE_CLEANUP_INTERVAL)); archiveCleaner.setName("RevocationArchiveCleaner"); archiveCleaner.setDaemon(true); archiveCleaner.setPriority(Thread.MIN_PRIORITY); archiveCleaner.start(); // unset the startup logging context LoggingContextManager.getInstance().setLoggingContext(null); logger.info("=============================================================================="); logger.info("=== CONFIGURATION DONE ==="); logger.info("=============================================================================="); return new StartupConfigurationHolder(config, iaikConfiguration); } /** * Get configuration object from IAIK modules. * * @return Configuration or null of it was not configurated yet */ public static ConfigurationData getIaikConfiguration() { return iaikConfiguration; } private static void initializeMoaSigConfiguraion() { final MessageProvider msg = MessageProvider.getInstance(); try { Logger.info("Initialize MOA-SP/SS configuration ... "); config = ConfigurationProvider.getInstance(); // initialize TSL module final TSLConfiguration moaSPTslConfig = config.getTSLConfiguration(); if (moaSPTslConfig != null) { Logger.debug("Starting TSL-Service initialization ... "); final TslConfigurationImpl tslConfig = new TslConfigurationImpl(); tslConfig.setEuTslURL(moaSPTslConfig.getEuTSLUrl()); tslConfig.setTslWorkingDirectory(moaSPTslConfig.getWorkingDirectory()); tslConfig.setNetworkReadTimeout(config.getReadTimeout() / 1000); Logger.info(new LogMsg(msg.getMessage("config.41", null))); TSLServiceFactory.initialize(tslConfig); Logger.info("TSL-Service client initialization finished"); // initialize TSL Update Task initTSLUpdateTask(moaSPTslConfig); } Logger.info("Building IAIK-MOA configuration ... "); iaikConfiguration = IaikConfigurator.configure(config); runInitializer(config); // set Fallback mode in IAIK KeyStore implementation to 'true' to fix problems default behavior of JVM PKCS12KeyStore.setUseJKSFallBack(true); Logger.info("Set fallback mode in: " + PKCS12KeyStore.class.getSimpleName() + " to :" + PKCS12KeyStore.getUseJKSFallBack()); Logger.info(new LogMsg(msg.getMessage("init.01", null))); } catch (final MOAException e) { Logger.fatal(new LogMsg(msg.getMessage("init.00", null)), e); throw new RuntimeException(e); } catch (final Throwable e) { Logger.fatal(new LogMsg(msg.getMessage("init.00", null)), e); throw new RuntimeException(e); } } private static void loadXsdSchemaIntoXmlParser() { // parsing/validating try { if (!grammarsInitialized) { final Class clazz = SystemInitializer.class; // preparse XML schema DOMUtils.addSchemaToPool( clazz.getResourceAsStream(Constants.XML_SCHEMA_LOCATION), Constants.XML_NS_URI); // preparse XMLDsig Filter2 schema DOMUtils.addSchemaToPool( clazz.getResourceAsStream(Constants.DSIG_FILTER2_SCHEMA_LOCATION), Constants.DSIG_FILTER2_NS_URI); // preparse XMLDsig schema DOMUtils.addSchemaToPool( clazz.getResourceAsStream(Constants.DSIG_SCHEMA_LOCATION), Constants.DSIG_NS_URI); // preparse MOA schema DOMUtils.addSchemaToPool( clazz.getResourceAsStream(Constants.MOA_SCHEMA_LOCATION), Constants.MOA_NS_URI); grammarsInitialized = true; } } catch (final IOException e) { Logger.warn(new LogMsg(MessageProvider.getInstance().getMessage("init.04", null)), e); } } private static void initTSLUpdateTask(TSLConfiguration tslconfig) { final MessageProvider msg = MessageProvider.getInstance(); if (tslconfig != null) { // get start time and period from config final long period = tslconfig.getUpdateSchedulePeriod(); final Date startConfig = tslconfig.getUpdateScheduleStartTime(); // get hh:mm:ss from config date final Calendar calendar = Calendar.getInstance(); // creates a new calendar instance calendar.setTime(startConfig); // assigns calendar to given date final int hour = calendar.get(Calendar.HOUR_OF_DAY); final int min = calendar.get(Calendar.MINUTE); final int sec = calendar.get(Calendar.SECOND); // create date with today and time from config final Calendar cal = Calendar.getInstance(); final Date now = cal.getTime(); cal.set(Calendar.HOUR_OF_DAY, hour); cal.set(Calendar.MINUTE, min); cal.set(Calendar.SECOND, sec); // proposed start time Date start = cal.getTime(); // if start time has already passed today - add one day (86400000 milliseconds = // 1 day) if (start.before(now)) { start = new Date(start.getTime() + 86400000); } Logger.debug(new LogMsg(msg.getMessage("config.46", new String[] { start.toString(), "" + period }))); // start TSL updater task final Timer timer = new Timer("TSL_DB_Updater"); timer.schedule(new TSLUpdaterTimerTask(start, period), new Date(now.getTime() + TSL_SCHEDULE_INTERVAL), TSL_SCHEDULE_INTERVAL); } } }