/******************************************************************************* * Copyright 2014 Federal Chancellery Austria * MOA-ID 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.id.configuration.struts.action; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.Enumeration; import java.util.List; import java.util.Properties; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import org.apache.log4j.Logger; import org.springframework.beans.BeansException; import at.gv.egiz.components.configuration.api.Configuration; import at.gv.egiz.eaaf.core.impl.utils.Random; import at.gv.egovernment.moa.id.commons.config.ConfigurationUtil; import at.gv.egovernment.moa.id.commons.db.dao.config.deprecated.MOAIDConfiguration; import at.gv.egovernment.moa.id.commons.db.ex.MOADatabaseException; import at.gv.egovernment.moa.id.config.webgui.exception.ConfigurationException; import at.gv.egovernment.moa.id.configuration.Constants; import at.gv.egovernment.moa.id.configuration.config.ConfigurationProvider; import at.gv.egovernment.moa.id.configuration.exception.BasicActionException; import at.gv.egovernment.moa.id.configuration.helper.LanguageHelper; import at.gv.egovernment.moa.util.MiscUtil; public class ImportExportAction extends BasicAction { private static final Logger log = Logger.getLogger(ImportExportAction.class); private static final long serialVersionUID = 1L; private String formID; private File fileUpload = null; private String fileUploadContentType = null; private String fileUploadFileName = null; private InputStream fileInputStream; public String init() { try { populateBasicInformations(); } catch (BasicActionException e) { return Constants.STRUTS_ERROR; } if (authUser.isAdmin()) { formID = Random.nextRandom(); session.setAttribute(Constants.SESSION_FORMID, formID); return Constants.STRUTS_SUCCESS; } else { log.info("No access to Import/Export for User with ID" + authUser.getUserID()); addActionError(LanguageHelper.getErrorString("errors.notallowed", request)); return Constants.STRUTS_NOTALLOWED; } } public String importLegacyConfig() throws ConfigurationException { try { populateBasicInformations(); } catch (BasicActionException e) { return Constants.STRUTS_ERROR; } Object formidobj = session.getAttribute(Constants.SESSION_FORMID); if (formidobj != null && formidobj instanceof String) { String formid = (String) formidobj; if (!formid.equals(formID)) { log.warn("FormIDs does not match. Some suspect Form is received from user " + authUser.getFamilyName() + authUser.getGivenName() + authUser.getUserID()); return Constants.STRUTS_ERROR; } } else { log.warn("FormIDs does not match. Some suspect Form is received from user " + authUser.getFamilyName() + authUser.getGivenName() + authUser.getUserID()); return Constants.STRUTS_ERROR; } session.setAttribute(Constants.SESSION_FORMID, null); if (authUser.isAdmin()) { //load legacy config if it is configured if (fileUpload == null) { addActionError(LanguageHelper.getErrorString("errors.importexport.nofile", request)); formID = Random.nextRandom(); session.setAttribute(Constants.SESSION_FORMID, formID); return Constants.STRUTS_ERROR_VALIDATION; } Properties result = null; try { log.warn("WARNING! The legacy import deletes the hole old config"); InputStream inStream = new FileInputStream(fileUpload); // get config from xml file JAXBContext jc = JAXBContext.newInstance("at.gv.egovernment.moa.id.commons.db.dao.config.deprecated"); Unmarshaller m = jc.createUnmarshaller(); MOAIDConfiguration config = (MOAIDConfiguration) m.unmarshal(inStream); // serialize config to JSON properties result = ConfigurationUtil.moaIdConfigToJsonProperties(config); if (result == null || result.isEmpty()) { log.info("Legacy configuration has is empty"); addActionError(LanguageHelper.getErrorString("errors.importexport.legacyimport", new Object[] {"Empty Configuratiobn"}, request)); formID = Random.nextRandom(); session.setAttribute(Constants.SESSION_FORMID, formID); return Constants.STRUTS_ERROR_VALIDATION; } } catch (JAXBException | FileNotFoundException e) { log.info("Legacy configuration has an Import Error", e); addActionError(LanguageHelper.getErrorString("errors.importexport.legacyimport", new Object[] {e.getMessage()}, request)); formID = Random.nextRandom(); session.setAttribute(Constants.SESSION_FORMID, formID); return Constants.STRUTS_ERROR_VALIDATION; } try { //check if XML config should be use log.warn("WARNING! MOA-ID 2.0 is started with XML configuration. This setup overstrike the actual configuration in the Database!"); Configuration dbConfiguration = (Configuration) ConfigurationProvider.getInstance().getContext().getBean("moaidconfig"); if (dbConfiguration == null) { log.warn("Open Database connection FAILED."); addActionError("Open Database connection FAILED."); formID = Random.nextRandom(); session.setAttribute(Constants.SESSION_FORMID, formID); return Constants.STRUTS_ERROR_VALIDATION; } boolean isOverwriteData = true; List keys = Arrays.asList(dbConfiguration.getConfigurationIds()); if (keys == null) { log.info("Configuration is not readable."); throw new MOADatabaseException("Configuration is not readable."); } if (isOverwriteData) { // remove existing entries for (String key : keys) { dbConfiguration.deleteIds(key); } } Enumeration propertyNames = result.propertyNames(); while (propertyNames.hasMoreElements()) { String key = (String) propertyNames.nextElement(); String json = result.getProperty(key); dbConfiguration.setStringValue(key, json); } } catch (ConfigurationException | MOADatabaseException | at.gv.egiz.components.configuration.api.ConfigurationException e1) { log.warn("General MOA-ID config can not be stored in Database", e1); addActionError(e1.getMessage()); formID = Random.nextRandom(); session.setAttribute(Constants.SESSION_FORMID, formID); return Constants.STRUTS_ERROR_VALIDATION; } finally { } //set new formID formID = Random.nextRandom(); session.setAttribute(Constants.SESSION_FORMID, formID); log.info("Legacy Configuration load is completed."); addActionMessage(LanguageHelper.getGUIString("webpages.inportexport.success", request)); return Constants.STRUTS_SUCCESS; } else { log.info("No access to Import/Export for User with ID" + authUser.getUserID()); addActionError(LanguageHelper.getErrorString("errors.notallowed", request)); return Constants.STRUTS_NOTALLOWED; } } public String downloadXMLConfig() { try { populateBasicInformations(); } catch (BasicActionException e) { return Constants.STRUTS_ERROR; } Object formidobj = session.getAttribute(Constants.SESSION_FORMID); if (formidobj != null && formidobj instanceof String) { String formid = (String) formidobj; if (!formid.equals(formID)) { log.warn("FormIDs does not match. Some suspect Form is received from user " + authUser.getFamilyName() + authUser.getGivenName() + authUser.getUserID()); return Constants.STRUTS_ERROR; } } else { log.warn("FormIDs does not match. Some suspect Form is received from user " + authUser.getFamilyName() + authUser.getGivenName() + authUser.getUserID()); return Constants.STRUTS_ERROR; } session.setAttribute(Constants.SESSION_FORMID, null); if (authUser.isAdmin()) { log.info("Write MOA-ID 3.x config"); try { Configuration dbConfiguration = (Configuration) ConfigurationProvider.getInstance().getContext().getBean("moaidconfig"); if (dbConfiguration == null) { log.warn("Open Database connection FAILED."); addActionError("Open Database connection FAILED."); formID = Random.nextRandom(); session.setAttribute(Constants.SESSION_FORMID, formID); return Constants.STRUTS_ERROR_VALIDATION; } Properties result = new Properties(); String[] allConfigIDs = dbConfiguration.getConfigurationIds(); for (String key : allConfigIDs) { String value = dbConfiguration.getStringValue(key); if (MiscUtil.isNotEmpty(value)) { result.put(key, value); log.debug("Put key: " + key + " with value: " + value + " to property file."); } else log.info("Leave key: " + key + " Reason: Value is null or empty"); } if (result.isEmpty()) { log.info("No MOA-ID 3.x configruation available"); addActionError(LanguageHelper.getErrorString("errors.importexport.export.noconfig", request)); formID = Random.nextRandom(); session.setAttribute(Constants.SESSION_FORMID, formID); return Constants.STRUTS_ERROR_VALIDATION; } ByteArrayOutputStream output = new ByteArrayOutputStream(); result.store(output, null); fileInputStream = new ByteArrayInputStream(output.toByteArray()); } catch (IOException | at.gv.egiz.components.configuration.api.ConfigurationException e) { log.info("MOA-ID 3.x configruation could not be exported into file.", e); addActionError(LanguageHelper.getErrorString("errors.importexport.export", new Object[]{e.getMessage()}, request)); formID = Random.nextRandom(); session.setAttribute(Constants.SESSION_FORMID, formID); return Constants.STRUTS_ERROR_VALIDATION; } catch (ConfigurationException | BeansException e) { log.warn("Open Database connection FAILED."); addActionError("Open Database connection FAILED."); formID = Random.nextRandom(); session.setAttribute(Constants.SESSION_FORMID, formID); return Constants.STRUTS_ERROR_VALIDATION; } finally { } //set new formID formID = Random.nextRandom(); session.setAttribute(Constants.SESSION_FORMID, formID); return Constants.STRUTS_SUCCESS; } else { log.info("No access to Import/Export for User with ID" + authUser.getUserID()); addActionError(LanguageHelper.getErrorString("errors.notallowed", request)); return Constants.STRUTS_NOTALLOWED; } } public String importXMLConfig() { try { populateBasicInformations(); } catch (BasicActionException e) { return Constants.STRUTS_ERROR; } Object formidobj = session.getAttribute(Constants.SESSION_FORMID); if (formidobj != null && formidobj instanceof String) { String formid = (String) formidobj; if (!formid.equals(formID)) { log.warn("FormIDs does not match. Some suspect Form is received from user " + authUser.getFamilyName() + authUser.getGivenName() + authUser.getUserID()); return Constants.STRUTS_ERROR; } } else { log.warn("FormIDs does not match. Some suspect Form is received from user " + authUser.getFamilyName() + authUser.getGivenName() + authUser.getUserID()); return Constants.STRUTS_ERROR; } session.setAttribute(Constants.SESSION_FORMID, null); if (authUser.isAdmin()) { if (fileUpload == null) { addActionError(LanguageHelper.getErrorString("errors.importexport.nofile", request)); formID = Random.nextRandom(); session.setAttribute(Constants.SESSION_FORMID, formID); return Constants.STRUTS_ERROR_VALIDATION; } log.info("Load configuration from MOA-ID 3.x XML configuration"); try { Properties inProperties = new Properties(); inProperties.load(new FileInputStream(fileUpload)); //check if XML config should be use log.warn("WARNING! MOA-ID 2.0 is started with XML configuration. This setup overstrike the actual configuration in the Database!"); Configuration dbConfiguration = (Configuration) ConfigurationProvider.getInstance().getContext().getBean("moaidconfig"); if (dbConfiguration == null) { log.warn("Open Database connection FAILED."); addActionError("Open Database connection FAILED."); formID = Random.nextRandom(); session.setAttribute(Constants.SESSION_FORMID, formID); return Constants.STRUTS_ERROR_VALIDATION; } boolean isOverwriteData = true; List keys = Arrays.asList(dbConfiguration.getConfigurationIds()); if (keys == null) { log.info("Configuration is not readable."); throw new MOADatabaseException("Configuration is not readable."); } if (isOverwriteData) { // remove existing entries for (String key : keys) { dbConfiguration.deleteIds(key); } } Enumeration propertyNames = inProperties.propertyNames(); while (propertyNames.hasMoreElements()) { String key = (String) propertyNames.nextElement(); String json = inProperties.getProperty(key); dbConfiguration.setStringValue(key, json); } } catch (Exception e) { log.warn("MOA-ID XML configuration can not be loaded from File.", e); addActionError(LanguageHelper.getErrorString("errors.importexport.import", new Object[]{e.getMessage()}, request)); formID = Random.nextRandom(); session.setAttribute(Constants.SESSION_FORMID, formID); return Constants.STRUTS_ERROR_VALIDATION; } finally { } //set new formID formID = Random.nextRandom(); session.setAttribute(Constants.SESSION_FORMID, formID); log.info("XML Configuration load is completed."); addActionMessage(LanguageHelper.getGUIString("webpages.inportexport.success", request)); return Constants.STRUTS_SUCCESS; } else { log.info("No access to Import/Export for User with ID" + authUser.getUserID()); addActionError(LanguageHelper.getErrorString("errors.notallowed", request)); return Constants.STRUTS_NOTALLOWED; } } /** * @return the fileUpload */ public File getFileUpload() { return fileUpload; } /** * @param fileUpload the fileUpload to set */ public void setFileUpload(File fileUpload) { this.fileUpload = fileUpload; } /** * @return the fileUploadContentType */ public String getFileUploadContentType() { return fileUploadContentType; } /** * @param fileUploadContentType the fileUploadContentType to set */ public void setFileUploadContentType(String fileUploadContentType) { this.fileUploadContentType = fileUploadContentType; } /** * @return the fileUploadFileName */ public String getFileUploadFileName() { return fileUploadFileName; } /** * @param fileUploadFileName the fileUploadFileName to set */ public void setFileUploadFileName(String fileUploadFileName) { this.fileUploadFileName = fileUploadFileName; } public InputStream getFileInputStream() { return fileInputStream; } /** * @return the formID */ public String getFormID() { return formID; } /** * @param formID the formID to set */ public void setFormID(String formID) { this.formID = formID; } }