Benoit Tellier created JAMES-4112:
-------------------------------------
Summary: Invalid quoted body part causes processing failure
Key: JAMES-4112
URL: https://issues.apache.org/jira/browse/JAMES-4112
Project: James Server
Issue Type: Improvement
Components: MailStore & MailRepository
Affects Versions: master
Reporter: Benoit Tellier
Fix For: master
Given an email with the following header in a body part:
{code:java}
Content-Type: image/png;
x-unix-mode=0666;
name="Outlook-Icon
{code}
And the mail processor tries to modifies header (eg RSPAMD scoring)
Then the mail split duplicates the email. The header change causes a full on
disk update that fails on the invalid part.
{code:java}
jakarta.mail.internet.ParseException: Unbalanced quoted string
at
jakarta.mail.internet.HeaderTokenizer.collectString(HeaderTokenizer.java:390)
at
jakarta.mail.internet.HeaderTokenizer.getNext(HeaderTokenizer.java:322)
at jakarta.mail.internet.HeaderTokenizer.next(HeaderTokenizer.java:222)
at jakarta.mail.internet.HeaderTokenizer.next(HeaderTokenizer.java:183)
at jakarta.mail.internet.ParameterList.<init>(ParameterList.java:262)
at jakarta.mail.internet.ContentType.<init>(ContentType.java:90)
at
jakarta.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1497)
at
jakarta.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1156)
at
jakarta.mail.internet.MimeMultipart.updateHeaders(MimeMultipart.java:509)
at
jakarta.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1520)
at
jakarta.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1156)
at
jakarta.mail.internet.MimeMultipart.updateHeaders(MimeMultipart.java:509)
at
jakarta.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1520)
at
jakarta.mail.internet.MimeMessage.updateHeaders(MimeMessage.java:2270)
at jakarta.mail.internet.MimeMessage.saveChanges(MimeMessage.java:2230)
at
org.apache.james.server.core.MimeMessageWrapper.writeTo(MimeMessageWrapper.java:323)
at
org.apache.james.server.core.MimeMessageWrapper.writeTo(MimeMessageWrapper.java:301)
at
org.apache.james.server.core.MimeMessageWrapper.writeTo(MimeMessageWrapper.java:297)
at
org.apache.james.server.core.MimeMessageWrapper.writeTo(MimeMessageWrapper.java:281)
at
org.apache.james.server.core.MimeMessageWrapper.<init>(MimeMessageWrapper.java:163)
at org.apache.james.server.core.MailImpl.setMessage(MailImpl.java:505)
at
com.github.fge.lambdas.consumers.ConsumerChainer.lambda$sneakyThrow$9(ConsumerChainer.java:73)
at java.base/java.util.Optional.ifPresent(Unknown Source)
at
org.apache.james.server.core.MailImpl$Builder.build(MailImpl.java:279)
at org.apache.james.server.core.MailImpl.duplicate(MailImpl.java:99)
at
org.apache.james.mailetcontainer.impl.MatcherSplitter.split(MatcherSplitter.java:149)
at
org.apache.james.mailetcontainer.impl.MailetProcessorImpl.lambda$executeProcessingStep$3(MailetProcessorImpl.java:161)
at
com.github.fge.lambdas.functions.FunctionChainer.lambda$sneakyThrow$49(FunctionChainer.java:74)
at
java.base/java.util.stream.ReferencePipeline$7$1FlatMap.accept(Unknown Source)
at java.base/java.util.Collections$2.tryAdvance(Unknown Source)
at java.base/java.util.Collections$2.forEachRemaining(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown
Source)
at
java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)
at java.base/java.util.stream.ReferencePipeline.collect(Unknown Source)
at
org.apache.james.mailetcontainer.impl.MailetProcessorImpl.executeProcessingStep(MailetProcessorImpl.java:162)
at
org.apache.james.mailetcontainer.impl.MailetProcessorImpl.lambda$service$0(MailetProcessorImpl.java:133)
at java.base/java.util.stream.ReduceOps$1ReducingSink.accept(Unknown
Source)
at
java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Unknown
Source)
at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown
Source)
at
java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)
at java.base/java.util.stream.ReferencePipeline.reduce(Unknown Source)
at
org.apache.james.mailetcontainer.impl.MailetProcessorImpl.service(MailetProcessorImpl.java:131)
at
org.apache.james.mailetcontainer.lib.AbstractStateCompositeProcessor.handleWithProcessor(AbstractStateCompositeProcessor.java:98)
at
org.apache.james.mailetcontainer.lib.AbstractStateCompositeProcessor.service(AbstractStateCompositeProcessor.java:80)
at
org.apache.james.mailetcontainer.impl.JamesMailSpooler$Runner.performProcessMail(JamesMailSpooler.java:135)
at
org.apache.james.mailetcontainer.impl.JamesMailSpooler$Runner.lambda$processMail$4(JamesMailSpooler.java:127)
at reactor.core.publisher.MonoRunnable.subscribe(MonoRunnable.java:49)
at reactor.core.publisher.MonoUsing.subscribe(MonoUsing.java:109)
at reactor.core.publisher.Mono.subscribe(Mono.java:4568)
at
reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:202)
at
reactor.core.publisher.MonoFlatMap.subscribeOrReturn(MonoFlatMap.java:53)
at reactor.core.publisher.Mono.subscribe(Mono.java:4552)
at
reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.run(MonoSubscribeOn.java:126)
at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84)
at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37)
at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
at
java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown
Source)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown
Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown
Source)
at java.base/java.lang.Thread.run(Unknown Source)
{code}
I had a look: no way to make the parsing more lenient. And also sanitizing
things would be pretty bad (DKIM violation and very verbose)
To be fairly honest I do not understand why a header update would cause body
part changes. Header changes are already handled off-band so no on-disk update
seems mandated. By avoid updating content that did not change we would solve
this issue in addition of potentially nice performance benefits!
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]