blob: 7395cdc31d3129b4503910f9253a377432d742ee [file] [log] [blame]
package org.bouncycastle.cert.dane;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.bouncycastle.operator.DigestCalculator;
/**
* A single shot fetcher for a certificate which will only request the specific DNS record if the
* DANEEntryFetcher used on construction supports it.
*/
public class DANECertificateFetcher
{
private final DANEEntryFetcherFactory fetcherFactory;
private final DANEEntrySelectorFactory selectorFactory;
/**
* Base constructor.
*
* @param fetcherFactory the fetcher to use for resolving requests.
* @param digestCalculator the digest calculator to use for calculating sub-domains.
*/
public DANECertificateFetcher(DANEEntryFetcherFactory fetcherFactory, DigestCalculator digestCalculator)
{
this.fetcherFactory = fetcherFactory;
this.selectorFactory= new DANEEntrySelectorFactory(digestCalculator);
}
/**
* Fetch the certificates associated with the passed in email address if any exists.
*
* @param emailAddress the email address of interest.
* @return a list of X509CertificateHolder objects, or an empty list if none present.
* @throws DANEException in case of an underlying DNS or record parsing problem.
*/
public List fetch(String emailAddress)
throws DANEException
{
DANEEntrySelector daneSelector = selectorFactory.createSelector(emailAddress);
List matches = fetcherFactory.build(daneSelector.getDomainName()).getEntries();
List certs = new ArrayList(matches.size());
for (Iterator it = matches.iterator(); it.hasNext();)
{
DANEEntry next = (DANEEntry)it.next();
if (daneSelector.match(next))
{
certs.add(next.getCertificate());
}
}
return Collections.unmodifiableList(certs);
}
}