@Override public HookResult onHookResult(SMTPSession session, HookResult result, long executionTime, Hook hook) { String hookName = hook.getClass().getName(); HookStats stats = hookStats.get(hookName); if (stats != null) { stats.increment(result.getResult()); } return result; }
@Override @SuppressWarnings("unchecked") public HookResult doRcpt(SMTPSession session, MaybeSender sender, MailAddress rcpt) { Collection<MailAddress> rcptList = (Collection<MailAddress>) session.getAttachment(SMTPSession.RCPT_LIST, State.Transaction); // Check if the recipient is already in the rcpt list if (rcptList != null && rcptList.contains(rcpt)) { StringBuilder responseBuffer = new StringBuilder(); responseBuffer.append(DSNStatus.getStatus(DSNStatus.SUCCESS, DSNStatus.ADDRESS_VALID)) .append(" Recipient <") .append(rcpt.toString()) .append("> OK"); LOGGER.debug("Duplicate recipient not add to recipient list: {}", rcpt); return HookResult.builder() .hookReturnCode(HookReturnCode.ok()) .smtpReturnCode(SMTPRetCode.MAIL_OK) .smtpDescription(responseBuffer.toString()) .build(); } return HookResult.DECLINED; } }
public HookResult build() { Preconditions.checkNotNull(result); return new HookResult(result, smtpReturnCode.orElse(null), smtpDescription.orElse(null)); } }
/** * Convert the HookResult to SMTPResponse using default values. Should be override for using own values * * @param result HookResult * @return SMTPResponse */ public static SMTPResponse calcDefaultSMTPResponse(HookResult result) { if (result != null) { HookReturnCode returnCode = result.getResult(); String smtpReturnCode = OptionalUtils.or( Optional.ofNullable(result.getSmtpRetCode()), retrieveDefaultSmtpReturnCode(returnCode)) .orElse(null); String smtpDescription = OptionalUtils.or( Optional.ofNullable(result.getSmtpDescription()), retrieveDefaultSmtpDescription(returnCode)) .orElse(null); if (canBeConvertedToSmtpAnswer(returnCode)) { SMTPResponse response = new SMTPResponse(smtpReturnCode, smtpDescription); if (returnCode.isDisconnected()) { response.setEndSession(true); } return response; } } return null; }
HookReturnCode returnCode = result.getResult(); Optional.ofNullable(result.getSmtpRetCode()), retrieveDefaultSmtpReturnCode(returnCode)) .orElse(null); Optional.ofNullable(result.getSmtpDescription()), retrieveDefaultSmtpDescription(returnCode)) .orElse(null);
public HookResult onHookResult(SMTPSession session, HookResult result, Object hook) { String hookName = hook.getClass().getName(); try { HookStats stats; synchronized (hookStats) { stats = hookStats.get(hookName); if (stats == null) { stats = new HookStats(hookName); hookStats.put(hookName, stats); } } stats.increment(result.getResult()); } catch (Exception e) { session.getLogger().error( "Unable to register HookStats for hook " + hookName, e); } return result; }
public HookResult reject(MailAddress rcpt) { LOGGER.info("Rejected message. Unknown user: {}", rcpt); return HookResult.builder() .hookReturnCode(HookReturnCode.deny()) .smtpReturnCode(SMTPRetCode.MAILBOX_PERM_UNAVAILABLE) .smtpDescription(DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.ADDRESS_MAILBOX) + " Unknown user: " + rcpt.asString()) .build(); }
/** * @see org.apache.james.protocols.smtp.hook.MailHook#doMail(org.apache.james.protocols.smtp.SMTPSession, org.apache.mailet.MailAddress) */ public HookResult doMail(SMTPSession session, MailAddress sender) { doSPFCheck(session,sender); return new HookResult(HookReturnCode.DECLINED); }
@Override public HookResult onHookResult(SMTPSession session, HookResult hResult, long executionTime, Hook hook) { HookReturnCode result = hResult.getResult(); boolean requiresInfoLogging = result.getAction() == HookReturnCode.Action.DENY || result.getAction() == HookReturnCode.Action.DENYSOFT || result.isDisconnected(); if (requiresInfoLogging) { LOGGER.info("{}: result= ({} {})", hook.getClass().getName(), result.getAction(), result.getConnectionStatus()); } else { LOGGER.debug("{}: result= ({} {})", hook.getClass().getName(), result.getAction(), result.getConnectionStatus()); } return hResult; }
/** * Adds header to the message * */ @Override public HookResult onMessage(SMTPSession session, Mail mail) { LOGGER.debug("sending mail"); try { queue.enQueue(mail); LOGGER.info("Successfully spooled mail {} from {} on {} for {}", mail.getName(), mail.getMaybeSender(), session.getRemoteAddress().getAddress(), mail.getRecipients()); } catch (MessagingException me) { LOGGER.error("Unknown error occurred while processing DATA.", me); return HookResult.builder() .hookReturnCode(HookReturnCode.denySoft()) .smtpDescription(DSNStatus.getStatus(DSNStatus.TRANSIENT, DSNStatus.UNDEFINED_STATUS) + " Error processing message.") .build(); } return HookResult.builder() .hookReturnCode(HookReturnCode.ok()) .smtpDescription(DSNStatus.getStatus(DSNStatus.SUCCESS, DSNStatus.CONTENT_OTHER) + " Message received") .build(); }
/** * @see org.apache.james.protocols.smtp.hook.AuthHook#doAuth(org.apache.james.protocols.smtp.SMTPSession, java.lang.String, java.lang.String) */ public HookResult doAuth(SMTPSession session, String username, String password) { if (users.test(username, password)) { session.setUser(username); session.setRelayingAllowed(true); return new HookResult(HookReturnCode.OK, "Authentication Successful"); } return new HookResult(HookReturnCode.DECLINED); } }
@Override public HookResult doAuth(SMTPSession session, String username, String password) { try { if (users.test(username, password)) { session.setUser(username); session.setRelayingAllowed(true); return HookResult.builder() .hookReturnCode(HookReturnCode.ok()) .smtpDescription("Authentication Successful") .build(); } } catch (UsersRepositoryException e) { LOGGER.info("Unable to access UsersRepository", e); } return HookResult.DECLINED; }
/** * @see org.apache.james.protocols.smtp.hook.RcptHook#doRcpt(org.apache.james.protocols.smtp.SMTPSession, org.apache.mailet.MailAddress, org.apache.mailet.MailAddress) */ public HookResult doRcpt(SMTPSession session, MailAddress sender, MailAddress rcpt) { if (!session.isRelayingAllowed()) { // Check if session is blocklisted if (session.getState().get(SPF_BLOCKLISTED)!= null) { return new HookResult(HookReturnCode.DENY,DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.SECURITY_AUTH) + " " + session.getState().get(SPF_TEMPBLOCKLISTED)); } else if (session.getState().get(SPF_TEMPBLOCKLISTED) != null) { return new HookResult(HookReturnCode.DENYSOFT, SMTPRetCode.LOCAL_ERROR,DSNStatus.getStatus(DSNStatus.TRANSIENT, DSNStatus.NETWORK_DIR_SERVER) + " " + "Temporarily rejected: Problem on SPF lookup"); } } return new HookResult(HookReturnCode.DECLINED); }
@Test public void doRcptShouldDeclineValidUsersWhenRelay() throws Exception { SMTPSession session = setupMockedSMTPSession(RELAYING_ALLOWED); HookReturnCode rCode = handler.doRcpt(session, SENDER, validUserEmail).getResult(); assertThat(rCode).isEqualTo(HookReturnCode.declined()); }
return HookResult.builder() .hookReturnCode(HookReturnCode.deny()) .smtpDescription(DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.SECURITY_OTHER)
@Override public HookResult doRcpt(SMTPSession session, MailAddress sender, MailAddress rcpt) { SMTPNettySession nSession =(SMTPNettySession) session; if (nSession.verifyIdentity()) { return super.doRcpt(session, sender, rcpt); } else { return new HookResult(HookReturnCode.DECLINED); } }
@Test public void doRcptShouldDenyNotExistingLocalUsersWhenRelay() { SMTPSession session = setupMockedSMTPSession(RELAYING_ALLOWED); HookReturnCode rCode = handler.doRcpt(session, SENDER, invalidUserEmail).getResult(); assertThat(rCode).isEqualTo(HookReturnCode.deny()); }
@Override public HookResult doRcpt(SMTPSession session, MaybeSender sender, MailAddress rcpt) { checkDNSRBL(session, session.getRemoteAddress().getAddress().getHostAddress()); if (!session.isRelayingAllowed()) { String blocklisted = (String) session.getAttachment(RBL_BLOCKLISTED_MAIL_ATTRIBUTE_NAME, State.Connection); if (blocklisted != null) { // was found in the RBL if (blocklistedDetail == null) { return HookResult.builder() .hookReturnCode(HookReturnCode.deny()) .smtpDescription(DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.SECURITY_AUTH) + " Rejected: unauthenticated e-mail from " + session.getRemoteAddress().getAddress() + " is restricted. Contact the postmaster for details.") .build(); } else { return HookResult.builder() .hookReturnCode(HookReturnCode.deny()) .smtpDescription(DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.SECURITY_AUTH) + " " + blocklistedDetail) .build(); } } } return HookResult.DECLINED; }
@SuppressWarnings("unchecked") public HookResult onMessage(SMTPSession session, Mail mail) { Iterator<MailAddress> rcpts = mail.getRecipients().iterator(); Integer p = null; while(rcpts.hasNext()) { String domain = rcpts.next().getDomain(); Integer prio = null; if (domain != null) { prio = prioMap.get(domain); if (prio != null) { if (p == null || prio > p) { p = prio; } // already the highest priority if (p == MailPrioritySupport.HIGH_PRIORITY) break; } } } // set the priority if one was found if (p != null) mail.setAttribute(MailPrioritySupport.MAIL_PRIORITY, p); return new HookResult(HookReturnCode.DECLINED); }