[
https://issues.apache.org/jira/browse/JAMES-4112?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Benoit Tellier closed JAMES-4112.
---------------------------------
Resolution: Fixed
> 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
> Priority: Major
> Fix For: master
>
> Time Spent: 40m
> Remaining Estimate: 0h
>
> 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]