001 /* 002 * Cumulus4j - Securing your data in the cloud - http://cumulus4j.org 003 * Copyright (C) 2011 NightLabs Consulting GmbH 004 * 005 * This program is free software: you can redistribute it and/or modify 006 * it under the terms of the GNU Affero General Public License as 007 * published by the Free Software Foundation, either version 3 of the 008 * License, or (at your option) any later version. 009 * 010 * This program is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 013 * GNU Affero General Public License for more details. 014 * 015 * You should have received a copy of the GNU Affero General Public License 016 * along with this program. If not, see <http://www.gnu.org/licenses/>. 017 */ 018 package org.cumulus4j.keymanager.front.webapp; 019 020 import java.util.Collections; 021 import java.util.HashSet; 022 import java.util.Set; 023 024 import javax.ws.rs.ApplicationPath; 025 import javax.ws.rs.core.Application; 026 027 import org.slf4j.Logger; 028 import org.slf4j.LoggerFactory; 029 030 /** 031 * <p> 032 * REST application for the key-server. 033 * <p></p> 034 * This class is the entry point for Jersey where all REST services and their environment is declared. 035 * </p> 036 * 037 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de 038 */ 039 @ApplicationPath("/") 040 public class KeyManagerFrontWebApp 041 extends Application 042 { 043 private static final Logger logger = LoggerFactory.getLogger(KeyManagerFrontWebApp.class); 044 045 // /** 046 // * <p> 047 // * System property to control which key file is to be used. If not specified, 048 // * the file "${user.home}/.cumulus4j/cumulus4j.keystore" will be used. 049 // * </p> 050 // * <p> 051 // * You can use system properties in this system-property's value. For example 052 // * passing "-Dorg.cumulus4j.keymanager.front.webapp.App.keyStoreFile=${java.io.tmpdir}/test.keystore" 053 // * to the java command will be resolved to "/tmp/test.keystore" on GNU+Linux. 054 // * </p> 055 // * @deprecated to be removed due to introduction of keyStoreID 056 // */ 057 // @Deprecated 058 // public static final String SYSTEM_PROPERTY_KEY_STORE_FILE = "cumulus4j.KeyManagerFrontWebApp.keyStoreFile"; 059 060 // /** 061 // * <p> 062 // * System property to control whether to delete the key-store-file on startup. 063 // * Possible values are "true" and "false". 064 // * </p> 065 // * <p> 066 // * <b>Important:</b> This feature is for debugging and test reasons only! Never use it 067 // * on a productive system or you will loose all your keys (and thus your complete database)!!! 068 // * </p> 069 // * @deprecated TODO rename this after introduction of keyStoreID as they are not deleted on startup anymore but when first accessed. 070 // */ 071 // @Deprecated 072 // public static final String SYSTEM_PROPERTY_DELETE_KEY_STORE_FILE_ON_STARTUP = "cumulus4j.KeyManagerFrontWebApp.deleteKeyStoreFileOnStartup"; 073 074 private static final Class<?>[] serviceClassesArray = { 075 AppServerService.class, 076 DateDependentKeyStrategyService.class, 077 CryptoSessionService.class, 078 UserService.class 079 }; 080 081 private static final Set<Class<?>> serviceClassesSet; 082 static { 083 Set<Class<?>> s = new HashSet<Class<?>>(serviceClassesArray.length); 084 for (Class<?> c : serviceClassesArray) 085 s.add(c); 086 087 serviceClassesSet = Collections.unmodifiableSet(s); 088 089 if (logger.isDebugEnabled()) { 090 logger.debug("<init>: Service classes:"); 091 for (Class<?> c : serviceClassesSet) 092 logger.debug("<init>: {}", c == null ? null : c.getName()); 093 } 094 } 095 096 @Override 097 public Set<Class<?>> getClasses() { 098 return serviceClassesSet; 099 } 100 101 private Set<Object> singletons; 102 103 // private File keyStoreFile; 104 // private KeyStore keyStore; 105 106 // private void initKeyStoreFile() 107 // { 108 // String keyStoreFileSysPropVal = System.getProperty(SYSTEM_PROPERTY_KEY_STORE_FILE); 109 // if (keyStoreFileSysPropVal == null || keyStoreFileSysPropVal.trim().isEmpty()) { 110 // keyStoreFile = new File(new File(getUserHome(), ".cumulus4j"), "cumulus4j.keystore"); 111 // logger.info( 112 // "getSingletons: System property '{}' is empty or not specified. Using default keyStoreFile '{}'.", 113 // SYSTEM_PROPERTY_KEY_STORE_FILE, keyStoreFile.getAbsolutePath() 114 // ); 115 // } 116 // else { 117 // String keyStoreFileSysPropValResolved = SystemPropertyUtil.resolveSystemProperties(keyStoreFileSysPropVal); 118 // keyStoreFile = new File(keyStoreFileSysPropValResolved); 119 // logger.info( 120 // "getSingletons: System property '{}' was set to '{}'. Using keyStoreFile '{}'.", 121 // new Object[] { SYSTEM_PROPERTY_KEY_STORE_FILE, keyStoreFileSysPropVal, keyStoreFile.getAbsolutePath() } 122 // ); 123 // } 124 // } 125 // 126 // private void deleteKeyStoreIfSysPropRequested() throws IOException { 127 // String deleteKS = System.getProperty(SYSTEM_PROPERTY_DELETE_KEY_STORE_FILE_ON_STARTUP); 128 // if (Boolean.TRUE.toString().equalsIgnoreCase(deleteKS)) { 129 // if (keyStoreFile.exists()) { 130 // logger.warn( 131 // "getSingletons: System property '{}' was set to 'true'. DELETING keyStoreFile '{}'!!!", 132 // SYSTEM_PROPERTY_DELETE_KEY_STORE_FILE_ON_STARTUP, keyStoreFile.getAbsolutePath() 133 // ); 134 // if (!keyStoreFile.delete()) 135 // throw new IOException("Could not delete keyStoreFile '" + keyStoreFile.getAbsolutePath() + "'!"); 136 // } 137 // else { 138 // logger.warn( 139 // "getSingletons: System property '{}' was set to 'true', but keyStoreFile '{}' does NOT exist, hence not deleting it!", 140 // SYSTEM_PROPERTY_DELETE_KEY_STORE_FILE_ON_STARTUP, keyStoreFile.getAbsolutePath() 141 // ); 142 // } 143 // } 144 // } 145 146 // private void checkForDeprecatedSystemProperties() 147 // { 148 // checkForDeprecatedSystemProperty(SYSTEM_PROPERTY_KEY_STORE_FILE); 149 // checkForDeprecatedSystemProperty(SYSTEM_PROPERTY_DELETE_KEY_STORE_FILE_ON_STARTUP); 150 // } 151 // 152 // private void checkForDeprecatedSystemProperty(String sysPropName) 153 // { 154 // if (System.getProperty(sysPropName) != null) { 155 // logger.error("**************************************************************************"); 156 // logger.error("**************************************************************************"); 157 // logger.error("**************************************************************************"); 158 // 159 // logger.error("*** deprecated system property present (and ignored): " + sysPropName); 160 // 161 // logger.error("**************************************************************************"); 162 // logger.error("**************************************************************************"); 163 // logger.error("**************************************************************************"); 164 // } 165 // } 166 167 @Override 168 public Set<Object> getSingletons() 169 { 170 if (singletons == null) { 171 // checkForDeprecatedSystemProperties(); 172 // initKeyStoreFile(); 173 // 174 // try { 175 // deleteKeyStoreIfSysPropRequested(); 176 // 177 // if (!keyStoreFile.getParentFile().isDirectory()) { 178 // keyStoreFile.getParentFile().mkdirs(); 179 // if (!keyStoreFile.getParentFile().isDirectory()) 180 // throw new IOException("Directory does not exist and could not be created: " + keyStoreFile.getParentFile().getAbsolutePath()); 181 // } 182 // 183 // logger.info("Opening keyStoreFile: {}", keyStoreFile.getAbsolutePath()); 184 // keyStore = new KeyStore(keyStoreFile); 185 // } catch (IOException x) { 186 // throw new RuntimeException(x); 187 // } 188 189 Set<Object> s = new HashSet<Object>(); 190 // s.add(new KeyStoreProvider(keyStore)); 191 // s.add(new AppServerManagerProvider(new AppServerManager(keyStore))); 192 s.add(new KeyStoreManagerProvider(new KeyStoreManager())); 193 singletons = Collections.unmodifiableSet(s); 194 } 195 196 return singletons; 197 } 198 }