001 package org.apache.fulcrum.crypto;
002
003 /*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements. See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership. The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License. You may obtain a copy of the License at
011 *
012 * http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied. See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022 import java.security.NoSuchAlgorithmException;
023 import java.util.Hashtable;
024
025 import org.apache.avalon.framework.activity.Initializable;
026 import org.apache.avalon.framework.configuration.Configurable;
027 import org.apache.avalon.framework.configuration.Configuration;
028 import org.apache.avalon.framework.configuration.ConfigurationException;
029 import org.apache.avalon.framework.logger.AbstractLogEnabled;
030 import org.apache.avalon.framework.thread.ThreadSafe;
031
032 /**
033 * An implementation of CryptoService that uses either supplied crypto
034 * Algorithms (provided in the component config xml file) or tries to get them via
035 * the normal java mechanisms if this fails.
036 *
037 * @author <a href="mailto:epugh@upstate.com">Eric Pugh</a>
038 * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
039 * @version $Id: DefaultCryptoService.java 581797 2007-10-04 08:26:18Z sgoeschl $
040 *
041 * @avalon.component name="crypto" lifestyle="singleton"
042 * @avalon.service type="org.apache.fulcrum.crypto.CryptoService"
043 */
044 public class DefaultCryptoService
045 extends AbstractLogEnabled
046 implements CryptoService, Configurable, Initializable, ThreadSafe
047 {
048 //
049 // SJM: removed Component and Contextualizable, Startable
050 //
051
052 /** Key Prefix for our algorithms */
053 private static final String ALGORITHM = "algorithm";
054 /** Default Key */
055 private static final String DEFAULT_KEY = "default";
056 /** Default Encryption Class */
057 private static final String DEFAULT_CLASS =
058 "org.apache.fulcrum.crypto.provider.JavaCrypt";
059 /** Names of the registered algorithms and the wanted classes */
060 private Hashtable algos = null;
061
062 /**
063 * Returns a CryptoAlgorithm Object which represents the requested
064 * crypto algorithm.
065 *
066 * @param algo Name of the requested algorithm
067 *
068 * @return An Object representing the algorithm
069 *
070 * @throws NoSuchAlgorithmException Requested algorithm is not available
071 *
072 */
073 public CryptoAlgorithm getCryptoAlgorithm( String algo )
074 throws NoSuchAlgorithmException
075 {
076 String cryptoClass = (String) algos.get(algo);
077 CryptoAlgorithm ca = null;
078 if (cryptoClass == null)
079 {
080 cryptoClass = (String) algos.get(DEFAULT_KEY);
081 }
082 if (cryptoClass == null || cryptoClass.equalsIgnoreCase("none"))
083 {
084 throw new NoSuchAlgorithmException(
085 "TurbineCryptoService: No Algorithm for " + algo + " found");
086 }
087 try
088 {
089 //@todo should be created via factory service.
090 //Just trying to get something to work.
091 //ca = (CryptoAlgorithm) factoryService.getInstance(cryptoClass);
092 ca = (CryptoAlgorithm) Class.forName(cryptoClass).newInstance();
093 }
094 catch (Exception e)
095 {
096 throw new NoSuchAlgorithmException(
097 "TurbineCryptoService: Error instantiating "
098 + cryptoClass + " for " + algo);
099 }
100 ca.setCipher(algo);
101 return ca;
102 }
103
104 // ---------------- Avalon Lifecycle Methods ---------------------
105
106 /**
107 * Avalon component lifecycle method
108 */
109 public void configure(Configuration conf) throws ConfigurationException
110 {
111 this.algos = new Hashtable();
112 // Set up default (Can be overridden by default key
113 // from the properties
114 algos.put(DEFAULT_KEY, DEFAULT_CLASS);
115 final Configuration algorithms = conf.getChild(ALGORITHM, false);
116 if (algorithms != null)
117 {
118 Configuration[] nameVal = algorithms.getChildren();
119 for (int i = 0; i < nameVal.length; i++)
120 {
121 String key = nameVal[i].getName();
122 String val = nameVal[i].getValue();
123 // getLogger.debug("Registered " + val
124 // + " for Crypto Algorithm " + key);
125 algos.put(key, val);
126 }
127 }
128 }
129
130 /**
131 * @see org.apache.avalon.framework.activity.Initializable#initialize()
132 */
133 public void initialize()
134 throws Exception
135 {
136 getLogger().debug("initialize()");
137 }
138
139 /**
140 * Avalon component lifecycle method
141 */
142 public void dispose()
143 {
144 algos = null;
145 }
146
147 }