use of org.nhindirect.stagent.AgentException in project nhin-d by DirectProject.
the class DefaultSmtpAgent method processMessage.
/**
* Processes an message from an SMTP stack. The bridge component between the SMTP stack and the SMTP agent is responsible for
* extracting the message, the recipient list, and the sender. In some cases, the routing headers may have different information than
* what is populated in the SMTP MAIL FROM and RCTP TO headers. In these cases, the SMTP headers should be favored over the routing
* headers in the message and passed as the recipient collection and sender to this method.
* @param message The message in the SMTP envelope.
* @param recipients The recipients of the message. The RCTP TO headers should be used over the message routing headers.
* @param sender The send of the message. The MAIL FROM header should be used over the From: routing header in the message.
*/
public MessageProcessResult processMessage(MimeMessage message, NHINDAddressCollection recipients, NHINDAddress sender) {
GatewayState.getInstance().lockForProcessing();
try {
LOGGER.trace("Entering processMessage(MimeMessage, NHINDAddressCollection, NHINDAddress");
MessageProcessResult retVal = null;
verifyInitialized();
preProcessMessage(message, sender);
Collection<NHINDAddress> originalRecipList = new ArrayList<NHINDAddress>(recipients);
DefaultMessageEnvelope envelopeToProcess = null;
try {
envelopeToProcess = new DefaultMessageEnvelope(new Message(message), recipients, sender);
envelopeToProcess.setAgent(agent);
// should always result in either a non null object or an exception
MessageEnvelope processEvn = processEnvelope(envelopeToProcess);
retVal = new MessageProcessResult(processEvn, null);
if (retVal.getProcessedMessage() != null)
postProcessMessage(retVal);
} catch (SmtpAgentException e) {
// rethrow
LOGGER.trace("Exiting processMessage(MimeMessage, NHINDAddressCollection, NHINDAddress", e);
throw e;
} catch (Exception e) {
// audit the message rejection
if (envelopeToProcess != null) {
Collection<AuditContext> contexts = createContextCollectionFromMessage(envelopeToProcess, Arrays.asList(AuditEvents.DEFAULT_HEADER_CONTEXT));
if (e instanceof NHINDException) {
NHINDException exception = (NHINDException) e;
if (exception.getError() != null) {
contexts.add(new DefaultAuditContext(AuditEvents.REJECTED_MESSAGE_REASON_CONTEXT, exception.getError().toString()));
if (exception.getError() != null && exception.getError() instanceof AgentException && ((AgentException) exception.getError()).getError() == AgentError.NoTrustedRecipients) {
StringBuilder rejectedRecips = new StringBuilder();
int cnt = 0;
for (NHINDAddress address : originalRecipList) {
rejectedRecips.append(address.getAddress());
if (++cnt < originalRecipList.size())
rejectedRecips.append(", ");
}
contexts.add(new DefaultAuditContext(AuditEvents.REJECTED_RECIPIENTS_CONTEXT, rejectedRecips.toString()));
}
}
}
auditor.audit(PRINICPAL, new AuditEvent(AuditEvents.REJECTED_MESSAGE_NAME, AuditEvents.EVENT_TYPE), contexts);
}
LOGGER.trace("Exiting processMessage(MimeMessage, NHINDAddressCollection, NHINDAddress", e);
throw new SmtpAgentException(SmtpAgentError.Unknown, e);
}
LOGGER.trace("Exiting processMessage(MimeMessage, NHINDAddressCollection, NHINDAddress");
return retVal;
} finally {
GatewayState.getInstance().unlockFromProcessing();
}
}
use of org.nhindirect.stagent.AgentException in project nhin-d by DirectProject.
the class TrustModel_isCertPolicyCompliantTest method testIsCertPolicyCompliant_policyExpressionError_assertExecption.
public void testIsCertPolicyCompliant_policyExpressionError_assertExecption() throws Exception {
final TrustModel model = new TrustModel();
final PolicyFilter filter = mock(PolicyFilter.class);
doThrow(new PolicyProcessException("Just Passing Through")).when(filter).isCompliant((X509Certificate) any(), (PolicyExpression) any());
final PolicyResolver resolver = mock(PolicyResolver.class);
final PolicyExpression expression = mock(PolicyExpression.class);
when(resolver.getIncomingPolicy((InternetAddress) any())).thenReturn(Arrays.asList(expression));
model.setTrustPolicyResolver(resolver);
model.setPolicyFilter(filter);
final X509Certificate cert = mock(X509Certificate.class);
boolean exceptionOccured = false;
try {
model.isCertPolicyCompliant(new InternetAddress("me@test.com"), cert);
} catch (AgentException e) {
exceptionOccured = true;
}
assertTrue(exceptionOccured);
}
use of org.nhindirect.stagent.AgentException in project nhin-d by DirectProject.
the class TrustModel method enforce.
/**
* Enforces the trust policy an incoming message. Each domain recipient's trust status is set according the models trust policy.
*/
public void enforce(IncomingMessage message) {
if (message == null)
throw new IllegalArgumentException();
if (!message.hasSignatures())
throw new AgentException(AgentError.UntrustedMessage);
findSenderSignatures(message);
if (!message.hasSenderSignatures())
throw new AgentException(AgentError.MissingSenderSignature);
//
// For each domain recipient, find at least one valid sender signature that the recipient trusts
// the default value of the trust status is false, so only change the status if a trusted
// certificate is found
//
NHINDAddressCollection recipients = message.getDomainRecipients();
for (NHINDAddress recipient : recipients) {
recipient.setStatus(TrustEnforcementStatus.Failed);
// be a bogus recipient
if (recipient.getCertificates() != null) {
// Find a trusted signature
DefaultMessageSignatureImpl trustedSignature = findTrustedSignature(message, recipient, recipient.getTrustAnchors());
// verify the signature
if (trustedSignature != null) {
recipient.setStatus(trustedSignature.isThumbprintVerified() ? TrustEnforcementStatus.Success : TrustEnforcementStatus.Success_ThumbprintMismatch);
} else {
LOGGER.warn("enforce(IncomingMessage message) - could not find a trusted certificate for recipient " + recipient.getAddress());
}
} else {
LOGGER.warn("enforce(IncomingMessage message) - recipient " + recipient.getAddress() + " does not have a bound certificate");
}
}
}
Aggregations