package org.cagrid.dorian.service.ca;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.cagrid.core.common.FaultHelper;
import org.cagrid.dorian.model.exceptions.DorianInternalException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DefaultCertificateAuthorityManager implements CertificateAuthorityManager {
private final static Logger logger = LoggerFactory.getLogger(DefaultCertificateAuthorityManager.class);
private Map<String, CertificateAuthority> certificateAuthorities;
private String defaultCA;
public DefaultCertificateAuthorityManager(String defaultCADN, List<CertificateAuthority> caList) throws DorianInternalException {
this.defaultCA = defaultCADN;
this.certificateAuthorities = new HashMap<String, CertificateAuthority>();
if (caList != null) {
for (CertificateAuthority ca : caList) {
try {
X509Certificate cacert = ca.getCACertificate();
String dn = cacert.getSubjectDN().getName();
if (this.certificateAuthorities.containsKey(dn)) {
DorianInternalException fault = FaultHelper.createFaultException(DorianInternalException.class, "Duplicate certificate authorities were configured with the DN " + dn + ".");
throw fault;
} else {
this.certificateAuthorities.put(dn, ca);
}
} catch (NoCACredentialsException e) {
String msg = "Error initializing the certificate authority manager: " + e.getMessage() + ".";
logger.error(msg, e);
DorianInternalException fault = FaultHelper.createFaultException(DorianInternalException.class, msg);
throw fault;
} catch (CertificateAuthorityException e) {
String msg = "Error initializing the certificate authority manager: " + e.getMessage() + ".";
logger.error(msg, e);
DorianInternalException fault = FaultHelper.createFaultException(DorianInternalException.class, msg);
throw fault;
}
}
}
if (!this.certificateAuthorities.containsKey(this.defaultCA)) {
DorianInternalException fault = FaultHelper.createFaultException(DorianInternalException.class, "The default CA " + this.defaultCA
+ " was not specified in the list of configured certificate authorities.");
throw fault;
}
}
@Override
public String getDefaultCertificateAuthoritySubjectDN() {
return this.defaultCA;
}
@Override
public CertificateAuthority getCertificateAuthority(String dn) throws DorianInternalException {
if (this.certificateAuthorities.containsKey(dn)) {
return this.certificateAuthorities.get(dn);
} else {
DorianInternalException fault = FaultHelper.createFaultException(DorianInternalException.class, "The certificate authority " + dn + " does not exist.");
throw fault;
}
}
@Override
public CertificateAuthority getDefaultCertificateAuthority() throws DorianInternalException {
return getCertificateAuthority(this.defaultCA);
}
@Override
public List<CertificateAuthority> getCertificateAuthorities() {
List<CertificateAuthority> list = new ArrayList<CertificateAuthority>();
Iterator<CertificateAuthority> itr = this.certificateAuthorities.values().iterator();
while (itr.hasNext()) {
list.add(itr.next());
}
return list;
}
}