[ 
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]

Reply via email to