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(); }
@Test public void doRcptShouldRejectNotExistingLocalUsersWhenNoRelay() { SMTPSession session = setupMockedSMTPSession(!RELAYING_ALLOWED); HookReturnCode rCode = handler.doRcpt(session, SENDER, invalidUserEmail).getResult(); assertThat(rCode).isEqualTo(HookReturnCode.deny()); }
@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) { if (check(session,rcpt)) { return HookResult.builder() .hookReturnCode(HookReturnCode.deny()) .smtpReturnCode(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS) .smtpDescription(DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.DELIVERY_INVALID_ARG) + " Provided EHLO/HELO " + session.getAttachment(SMTPSession.CURRENT_HELO_NAME, State.Connection) + " can not resolved.") .build(); } else { return HookResult.DECLINED; } }
@Test public void testRejectInvalidHelo() throws Exception { MailAddress mailAddress = new MailAddress("test@localhost"); SMTPSession session = setupMockSession(INVALID_HOST,false,false,null,mailAddress); ResolvableEhloHeloHandler handler = createHandler(); handler.doHelo(session, INVALID_HOST); assertThat(session.getAttachment(BAD_EHLO_HELO, Transaction)).withFailMessage("Invalid HELO").isNotNull(); HookReturnCode result = handler.doRcpt(session,null, mailAddress).getResult(); assertThat(HookReturnCode.deny()).describedAs("Reject").isEqualTo(result); }
@Test public void testRejectInvalidHeloAuthUser() throws Exception { MailAddress mailAddress = new MailAddress("test@localhost"); SMTPSession session = setupMockSession(INVALID_HOST,false,true,"valid@user",mailAddress); ResolvableEhloHeloHandler handler = createHandler(); handler.doHelo(session, INVALID_HOST); assertThat(session.getAttachment(BAD_EHLO_HELO, Transaction)).withFailMessage("Value stored").isNotNull(); HookReturnCode result = handler.doRcpt(session, MaybeSender.nullSender(), mailAddress).getResult(); assertThat(HookReturnCode.deny()).describedAs("Reject").isEqualTo(result); }
@Test public void testRejectInvalidHelo() throws Exception { MailAddress mailAddress = new MailAddress("test@localhost"); SMTPSession session = setupMockSession(INVALID_HOST,false,false,null,mailAddress); ResolvableEhloHeloHandler handler = createHandler(); handler.doHelo(session, INVALID_HOST); assertThat(session.getAttachment(BAD_EHLO_HELO, Transaction)).withFailMessage("Invalid HELO").isNotNull(); HookReturnCode result = handler.doRcpt(session, MaybeSender.nullSender(), mailAddress).getResult(); assertThat(HookReturnCode.deny()).describedAs("Reject").isEqualTo(result); }
@Test public void testRejectRelay() throws Exception { MailAddress mailAddress = new MailAddress("test@localhost"); SMTPSession session = setupMockSession(INVALID_HOST,true,false,null,mailAddress); ResolvableEhloHeloHandler handler = createHandler(); handler.doHelo(session, INVALID_HOST); assertThat(session.getAttachment(BAD_EHLO_HELO, Transaction)).withFailMessage("Value stored").isNotNull(); HookReturnCode result = handler.doRcpt(session,null, mailAddress).getResult(); assertThat(HookReturnCode.deny()).describedAs("Reject").isEqualTo(result); } }
@Test public void testRejectInvalidHeloAuthUser() throws Exception { MailAddress mailAddress = new MailAddress("test@localhost"); SMTPSession session = setupMockSession(INVALID_HOST,false,true,"valid@user",mailAddress); ResolvableEhloHeloHandler handler = createHandler(); handler.doHelo(session, INVALID_HOST); assertThat(session.getAttachment(BAD_EHLO_HELO, Transaction)).withFailMessage("Value stored").isNotNull(); HookReturnCode result = handler.doRcpt(session,null, mailAddress).getResult(); assertThat(HookReturnCode.deny()).describedAs("Reject").isEqualTo(result); }
@Test public void testRejectRelay() throws Exception { MailAddress mailAddress = new MailAddress("test@localhost"); SMTPSession session = setupMockSession(INVALID_HOST,true,false,null,mailAddress); ResolvableEhloHeloHandler handler = createHandler(); handler.doHelo(session, INVALID_HOST); assertThat(session.getAttachment(BAD_EHLO_HELO, Transaction)).withFailMessage("Value stored").isNotNull(); HookReturnCode result = handler.doRcpt(session, MaybeSender.nullSender(), mailAddress).getResult(); assertThat(HookReturnCode.deny()).describedAs("Reject").isEqualTo(result); } }
@Test public void testBlocked() throws IOException, MessagingException { ArrayList<String> servers = new ArrayList<>(); servers.add(URISERVER); SMTPSession session = setupMockedSMTPSession(setupMockedMail(setupMockedMimeMessage( "http://" + BAD_DOMAIN1 + "/"))); URIRBLHandler handler = new URIRBLHandler(); handler.setDNSService(setupMockedDnsServer()); handler.setUriRblServer(servers); HookResult response = handler.onMessage(session, mockedMail); assertThat(HookReturnCode.deny()).describedAs("Email was rejected").isEqualTo(response.getResult()); }
@Test public void testBlockedMultiPart() throws IOException, MessagingException { ArrayList<String> servers = new ArrayList<>(); servers.add(URISERVER); SMTPSession session = setupMockedSMTPSession(setupMockedMail(setupMockedMimeMessageMP( "http://" + BAD_DOMAIN1 + "/" + " " + "http://" + GOOD_DOMAIN + "/"))); URIRBLHandler handler = new URIRBLHandler(); handler.setDNSService(setupMockedDnsServer()); handler.setUriRblServer(servers); HookResult response = handler.onMessage(session, mockedMail); assertThat(HookReturnCode.deny()).describedAs("Email was rejected").isEqualTo(response.getResult()); }
@Test public void testInvalidSenderDomainReject() throws Exception { ValidSenderDomainHandler handler = createHandler(); SMTPSession session = setupMockedSession(new MailAddress("invalid@invalid")); MaybeSender sender = (MaybeSender) session.getAttachment(SMTPSession.SENDER, State.Transaction); HookReturnCode response = handler.doMail(session, sender).getResult(); assertThat(HookReturnCode.deny()).describedAs("Blocked cause we use reject action").isEqualTo(response); } }
@Test public void testInvalidSenderDomainReject() throws Exception { ValidSenderDomainHandler handler = createHandler(); SMTPSession session = setupMockedSession(new MailAddress("invalid@invalid")); HookReturnCode response = handler.doMail(session,(MailAddress) session.getAttachment(SMTPSession.SENDER, State.Transaction)).getResult(); assertThat(HookReturnCode.deny()).describedAs("Blocked cause we use reject action").isEqualTo(response); } }
@Test public void testRejectMaxRcpt() throws Exception { SMTPSession session = setupMockedSession(3); MaxRcptHandler handler = new MaxRcptHandler(); handler.setMaxRcpt(2); HookReturnCode resp = handler.doRcpt(session,null,new MailAddress("test@test")).getResult(); assertThat(HookReturnCode.deny()).describedAs("Rejected.. To many recipients").isEqualTo(resp); }
@Test public void testRejectMaxRcpt() throws Exception { SMTPSession session = setupMockedSession(3); MaxRcptHandler handler = new MaxRcptHandler(); handler.setMaxRcpt(2); HookReturnCode resp = handler.doRcpt(session, MaybeSender.nullSender(), new MailAddress("test@test")).getResult(); assertThat(HookReturnCode.deny()).describedAs("Rejected.. To many recipients").isEqualTo(resp); }
@Override public HookResult doMail(SMTPSession session, MaybeSender sender) { if (!sender.isNullSender() && !hasMXRecord(session,sender.get().getDomain().name())) { return HookResult.builder() .hookReturnCode(HookReturnCode.deny()) .smtpReturnCode(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS) .smtpDescription(DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.ADDRESS_SYNTAX_SENDER) + " sender " + sender + " contains a domain with no valid MX records") .build(); } else { return HookResult.DECLINED; } }
@Test public void testSPFfail() throws Exception { MailAddress sender = new MailAddress("test@spf2.james.apache.org"); MailAddress rcpt = new MailAddress("test@localhost"); setupMockedSMTPSession("192.168.100.1", "spf2.james.apache.org"); SPFHandler spf = new SPFHandler(); spf.setDNSService(mockedDnsService); assertThat(spf.doMail(mockedSMTPSession, sender).getResult()).describedAs("declined").isEqualTo(HookReturnCode.declined()); assertThat(spf.doRcpt(mockedSMTPSession, sender, rcpt).getResult()).describedAs("fail").isEqualTo(HookReturnCode.deny()); }
@Test public void testSPFsoftFailRejectEnabled() throws Exception { MailAddress sender = new MailAddress("test@spf3.james.apache.org"); MailAddress rcpt = new MailAddress("test@localhost"); setupMockedSMTPSession("192.168.100.1", "spf3.james.apache.org"); SPFHandler spf = new SPFHandler(); spf.setDNSService(mockedDnsService); spf.setBlockSoftFail(true); assertThat(spf.doMail(mockedSMTPSession, sender).getResult()).describedAs("declined").isEqualTo(HookReturnCode.declined()); assertThat(spf.doRcpt(mockedSMTPSession, sender, rcpt).getResult()).describedAs("softfail reject").isEqualTo(HookReturnCode.deny()); }
@Test public void testSPFpermError() throws Exception { MailAddress sender = new MailAddress("test@spf4.james.apache.org"); MailAddress rcpt = new MailAddress("test@localhost"); setupMockedSMTPSession("192.168.100.1", "spf4.james.apache.org"); SPFHandler spf = new SPFHandler(); spf.setDNSService(mockedDnsService); spf.setBlockSoftFail(true); assertThat(spf.doMail(mockedSMTPSession, sender).getResult()).describedAs("declined").isEqualTo(HookReturnCode.declined()); assertThat(spf.doRcpt(mockedSMTPSession, sender, rcpt).getResult()).describedAs("permerror reject").isEqualTo(HookReturnCode.deny()); }