blob: 5b2520e08e3dc62337b3763ff74bc86e13f92797 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.felix.framework.security.util;
import java.io.File;
import java.io.InputStream;
import java.io.PrintStream;
import java.security.KeyStore;
import java.security.cert.CertificateFactory;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.StringTokenizer;
import org.apache.felix.framework.util.SecureAction;
/*
* TODO: the certificate stores as well as the CRLs might change over time
* (added/removed certificates). We need a way to detect that and act on it.
* The problem is to find a good balance between re-checking and caching...
*/
public final class TrustManager
{
private final SecureAction m_action;
private final String m_crlList;
private final String m_typeList;
private final String m_passwdList;
private final String m_storeList;
private Collection m_caCerts = null;
private Collection m_crls = null;
public TrustManager(String crlList, String typeList, String passwdList,
String storeList, SecureAction action)
{
m_crlList = crlList;
m_typeList = typeList;
m_passwdList = passwdList;
m_storeList = storeList;
m_action = action;
}
private synchronized void init()
{
if (m_caCerts == null)
{
try
{
initCRLs();
initCaCerts();
}
catch (Exception ex)
{
m_caCerts = new ArrayList();
m_crls = new ArrayList();
// TODO: log this
ex.printStackTrace();
}
}
}
private void initCRLs() throws Exception
{
final Collection result = new ArrayList();
if (m_crlList.trim().length() != 0)
{
CertificateFactory fac = CertificateFactory.getInstance("X509");
for (StringTokenizer tok = new StringTokenizer(m_crlList, "|"); tok
.hasMoreElements();)
{
InputStream input = null;
try
{
input = m_action.getURLConnectionInputStream(m_action
.createURL(null, tok.nextToken(), null)
.openConnection());
result.addAll(fac.generateCRLs(input));
}
catch (Exception ex)
{
// TODO: log this or something
ex.printStackTrace();
}
finally
{
if (input != null)
{
try
{
input.close();
}
catch (Exception ex)
{
// TODO: log this or something
ex.printStackTrace();
}
}
}
}
}
m_crls = result;
}
private void initCaCerts() throws Exception
{
final Collection result = new ArrayList();
if (m_storeList.trim().length() != 0)
{
StringTokenizer storeTok = new StringTokenizer(m_storeList, "|");
StringTokenizer passwdTok = new StringTokenizer(m_passwdList, "|");
StringTokenizer typeTok = new StringTokenizer(m_typeList, "|");
while (storeTok.hasMoreTokens())
{
KeyStore ks = KeyStore.getInstance(typeTok.nextToken().trim());
InputStream input = null;
try
{
input = m_action.getURLConnectionInputStream(m_action
.createURL(null, storeTok.nextToken().trim(), null)
.openConnection());
String pass = passwdTok.nextToken().trim();
ks.load(input, (pass.length() > 0) ? pass.toCharArray()
: null);
for (Enumeration e = ks.aliases(); e.hasMoreElements();)
{
String alias = (String) e.nextElement();
result.add(ks.getCertificate(alias));
}
}
catch (Exception ex)
{
// TODO: log this or something
ex.printStackTrace();
}
finally
{
if (input != null)
{
try
{
input.close();
}
catch (Exception ex)
{
// TODO: log this or something
ex.printStackTrace();
}
}
}
}
}
m_caCerts = result;
}
public Collection getCRLs()
{
init();
return m_crls;
}
public Collection getCaCerts()
{
init();
return m_caCerts;
}
}