Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
master, 3.1.0
-
None
Description
Watching Kibana logs I got this recurring error:
Exception calling dlp.Dlp: NULL sender '<>' do not have domain part java.lang.IllegalStateException: NULL sender '<>' do not have domain part at org.apache.james.core.MailAddress$1.getDomain(MailAddress.java:87) at org.apache.james.transport.matchers.dlp.Dlp.matchingRule(Dlp.java:76) at org.apache.james.transport.matchers.dlp.Dlp.lambda$findFirstMatchingRule$0(Dlp.java:72) at java.util.Optional.flatMap(Optional.java:241) at org.apache.james.transport.matchers.dlp.Dlp.findFirstMatchingRule(Dlp.java:72) at org.apache.james.transport.matchers.dlp.Dlp.match(Dlp.java:55) at org.apache.james.mailetcontainer.impl.camel.MatcherSplitter.split(MatcherSplitter.java:109) at sun.reflect.GeneratedMethodAccessor70.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:481) at org.apache.camel.component.bean.MethodInfo$1.doProceed(MethodInfo.java:300) at org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:273) at org.apache.camel.component.bean.AbstractBeanProcessor.process(AbstractBeanProcessor.java:187) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109) at org.apache.camel.component.bean.AbstractBeanProcessor.process(AbstractBeanProcessor.java:70) at org.apache.camel.language.bean.BeanExpression.invokeBean(BeanExpression.java:200) at org.apache.camel.language.bean.BeanExpression.evaluate(BeanExpression.java:124) at org.apache.camel.language.bean.BeanExpression.evaluate(BeanExpression.java:135) at org.apache.camel.processor.Splitter.createProcessorExchangePairs(Splitter.java:127) at org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:241) at org.apache.camel.processor.Splitter.process(Splitter.java:122) at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548) at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) at org.apache.camel.processor.Pipeline.process(Pipeline.java:138) at org.apache.camel.processor.Pipeline.process(Pipeline.java:101) at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) at org.apache.camel.component.direct.DirectBlockingProducer.process(DirectBlockingProducer.java:53) at org.apache.camel.processor.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:186) at org.apache.camel.processor.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:86) at org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:541) at org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:506) at org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:369) at org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:506) at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:229) at org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:144) at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:161) at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:168) at org.apache.james.mailetcontainer.impl.camel.CamelMailetProcessor.service(CamelMailetProcessor.java:68) at org.apache.james.mailetcontainer.lib.AbstractStateCompositeProcessor.service(AbstractStateCompositeProcessor.java:84) at org.apache.james.mailetcontainer.impl.JamesMailSpooler.lambda$run$0(JamesMailSpooler.java:163) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
It cames from the Dlp part (Dlp.java):
private Optional<DLPConfigurationItem.Id> findFirstMatchingRule(Mail mail) { return Optional .ofNullable(mail.getSender()) .flatMap(sender -> matchingRule(sender, mail)); } private Optional<DLPConfigurationItem.Id> matchingRule(MailAddress address, Mail mail) { return rulesLoader.load(address.getDomain()).match(mail); }
Since `mail.getSender()` returns a `NULL_SENDER` and not a `null` value, `matchingRule` is executed, since it breaks the LSP, it breaks our code.
There are two solutions:
- Strengthening `MailAddress`
- Checking `MailAddress.isNullSender()`