[jira] [Closed] (JAMES-4112) Invalid quoted body part causes processing failure

"Benoit Tellier (Jira)" <[email protected]>
Newsgroups gmane.comp.jakarta.james.devel
Message-ID <[email protected]>
     [ 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 &amp; 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)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.