AttributeType t =
DirectoryServer.getAttributeType(ATTR_CRYPTO_KEY_ID, true);
AttributeValue v = entryDN.getRDN().getAttributeValue(t);
if (v == null)
{
Message message = ERR_TRUSTSTORE_DN_DOES_NOT_SPECIFY_CERTIFICATE.get(
String.valueOf(entryDN));
throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message,
baseDN, null);
}
String certAlias = v.getValue().toString();
try
{
if (certificateManager.aliasInUse(certAlias))
{
Message message = ERR_TRUSTSTORE_ALIAS_IN_USE.get(
String.valueOf(entryDN));
throw new DirectoryException(ResultCode.ENTRY_ALREADY_EXISTS,
message);
}
ObjectClass ocSelfSignedCertRequest =
DirectoryServer.getObjectClass(OC_SELF_SIGNED_CERT_REQUEST, true);
if (entry.hasObjectClass(ocSelfSignedCertRequest))
{
try
{
certificateManager.generateSelfSignedCertificate(
certAlias,
getADSCertificateSubjectDN(),
getADSCertificateValidity());
}
catch (Exception e)
{
Message message = ERR_TRUSTSTORE_CANNOT_GENERATE_CERT.get(
certAlias, trustStoreFile, getExceptionMessage(e));
throw new DirectoryException(
DirectoryServer.getServerErrorResultCode(), message, e);
}
}
else
{
List<Attribute> certAttrs = entry.getAttribute(
ATTR_CRYPTO_PUBLIC_KEY_CERTIFICATE);
if (certAttrs == null)
{
Message message =
ERR_TRUSTSTORE_ENTRY_MISSING_CERT_ATTR.get(
String.valueOf(entryDN),
ATTR_CRYPTO_PUBLIC_KEY_CERTIFICATE);
throw new DirectoryException(
DirectoryServer.getServerErrorResultCode(), message);
}
if (certAttrs.size() != 1)
{
Message message =
ERR_TRUSTSTORE_ENTRY_HAS_MULTIPLE_CERT_ATTRS.get(
String.valueOf(entryDN),
ATTR_CRYPTO_PUBLIC_KEY_CERTIFICATE);
throw new DirectoryException(
DirectoryServer.getServerErrorResultCode(), message);
}
Attribute certAttr = certAttrs.get(0);
Iterator<AttributeValue> i = certAttr.iterator();
if (!i.hasNext())
{
Message message =
ERR_TRUSTSTORE_ENTRY_MISSING_CERT_VALUE.get(
String.valueOf(entryDN),
ATTR_CRYPTO_PUBLIC_KEY_CERTIFICATE);
throw new DirectoryException(
DirectoryServer.getServerErrorResultCode(), message);
}
ByteString certBytes = i.next().getValue();
if (i.hasNext())
{
Message message =
ERR_TRUSTSTORE_ENTRY_HAS_MULTIPLE_CERT_VALUES.get(
String.valueOf(entryDN),
ATTR_CRYPTO_PUBLIC_KEY_CERTIFICATE);
throw new DirectoryException(
DirectoryServer.getServerErrorResultCode(), message);
}
try
{
File tempDir = getFileForPath("config");
File tempFile = File.createTempFile(configuration.getBackendId(),
certAlias, tempDir);
try
{
FileOutputStream outputStream =
new FileOutputStream(tempFile.getPath(), false);
try
{
certBytes.copyTo(outputStream);
}
finally
{
outputStream.close();
}
certificateManager.addCertificate(certAlias, tempFile);
}
finally
{
tempFile.delete();
}
}
catch (IOException e)
{
Message message = ERR_TRUSTSTORE_CANNOT_WRITE_CERT.get(
certAlias, getExceptionMessage(e));
throw new DirectoryException(
DirectoryServer.getServerErrorResultCode(), message, e);
}
}
}
catch (Exception e)
{
Message message = ERR_TRUSTSTORE_CANNOT_ADD_CERT.get(
certAlias, trustStoreFile, getExceptionMessage(e));
throw new DirectoryException(
DirectoryServer.getServerErrorResultCode(), message, e);
}