/*
* Copyright (c) 2011-2012 ICM Uniwersytet Warszawski All rights reserved.
* See LICENCE.txt file for licensing information.
*/
package eu.emi.security.authn.x509.helpers.pkipath;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.WildcardFileFilter;
import org.bouncycastle.util.encoders.Base64;
import eu.emi.security.authn.x509.impl.CertificateUtils;
/**
* Class for CA or CRL stores with utility methods for handling list
* of locations as wildcards or URLs.
* @author K. Benedyczak
*/
public class PlainStoreUtils
{
private String diskPath;
private String suffix;
private final List<String> srcLocations;
private final List<String> wildcardLocations;
private final List<URL> urlLocations;
private List<URL> resolvedWildcardLocations;
public PlainStoreUtils(String diskPath, String suffix, List<String> locations)
{
this.diskPath = diskPath;
this.suffix = suffix;
wildcardLocations = new ArrayList<String>();
urlLocations = new ArrayList<URL>();
resolvedWildcardLocations = new ArrayList<URL>();
srcLocations = locations;
for (String s: srcLocations)
{
try
{
URL u = new URL(s);
urlLocations.add(u);
} catch (MalformedURLException e)
{
wildcardLocations.add(s);
}
}
}
public File getCacheFile(URL url)
throws URISyntaxException
{
File dir = new File(diskPath);
byte[] src = url.toURI().toASCIIString().getBytes();
byte[] encoded = Base64.encode(src);
String filename = new String(encoded,CertificateUtils.ASCII) +
suffix + ".der";
return new File(dir, filename);
}
public void saveCacheFile(byte[] what, URL url)
throws URISyntaxException, IOException
{
if (diskPath == null)
return;
File output = getCacheFile(url);
OutputStream os = new BufferedOutputStream(
new FileOutputStream(output));
os.write(what);
os.close();
}
/**
* resolves one wildcard and add results to the resolvedWildcardLocations list
* @param wildcard
*/
private void establishWildcardLocations(String wildcard)
{
File f = new File(wildcard);
File base = f.getParentFile();
Collection<File> files = FileUtils.listFiles(base,
new WildcardFileFilter(f.getName()), null);
for (File file: files)
try
{
resolvedWildcardLocations.add(file.toURI().toURL());
} catch (MalformedURLException e)
{
throw new RuntimeException("Can't convert File to URL?", e);
}
}
/**
* resolves all wildcards
*/
public void establishWildcardsLocations()
{
resolvedWildcardLocations.clear();
for (String loc: wildcardLocations)
{
establishWildcardLocations(loc);
}
}
public boolean isPresent(URL u)
{
return urlLocations.contains(u) || resolvedWildcardLocations.contains(u);
}
public List<URL> getResolvedWildcards()
{
return resolvedWildcardLocations;
}
public List<URL> getURLLocations()
{
return urlLocations;
}
public List<String> getLocations()
{
List<String> ret = new ArrayList<String>(srcLocations.size());
ret.addAll(srcLocations);
return ret;
}
}