linagora / james-project

Mirror of Apache James Project
Apache License 2.0
70 stars 63 forks source link

RCPT java.lang.IllegalArgumentException: Multiple entries with same key: ,= and ,= #5119

Closed chibenwa closed 4 months ago

chibenwa commented 4 months ago
java.lang.IllegalArgumentException: Multiple entries with same key: ,= and ,=
    at com.google.common.collect.ImmutableMap.conflictException(ImmutableMap.java:378)
    at com.google.common.collect.ImmutableMap.checkNoConflict(ImmutableMap.java:372)
    at com.google.common.collect.RegularImmutableMap.checkNoConflictInKeyBucket(RegularImmutableMap.java:246)
    at com.google.common.collect.RegularImmutableMap.fromEntryArrayCheckingBucketOverflow(RegularImmutableMap.java:133)
    at com.google.common.collect.RegularImmutableMap.fromEntryArray(RegularImmutableMap.java:95)
    at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:572)
    at com.google.common.collect.ImmutableMap$Builder.buildOrThrow(ImmutableMap.java:600)
    at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:587)
    at org.apache.james.protocols.smtp.core.RcptCmdHandler.parseParameters(RcptCmdHandler.java:230)
    at org.apache.james.protocols.smtp.core.RcptCmdHandler.callHook(RcptCmdHandler.java:219)
    at org.apache.james.protocols.smtp.core.RcptCmdHandler.callHook(RcptCmdHandler.java:55)
    at org.apache.james.protocols.smtp.core.AbstractHookableCmdHandler.processHooks(AbstractHookableCmdHandler.java:117)
    at org.apache.james.protocols.smtp.core.AbstractHookableCmdHandler.onCommand(AbstractHookableCmdHandler.java:75)
    at org.apache.james.protocols.smtp.core.AbstractHookableCmdHandler.onCommand(AbstractHookableCmdHandler.java:50)
    at org.apache.james.protocols.api.handler.CommandDispatcher.dispatchCommandHandlers(CommandDispatcher.java:165)
    at org.apache.james.protocols.api.handler.CommandDispatcher.onLine(CommandDispatcher.java:142)
    at org.apache.james.protocols.netty.BasicChannelInboundHandler.channelRead(BasicChannelInboundHandler.java:185)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:93)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
    at io.netty.channel.AbstractChannelHandlerContext.access$600(AbstractChannelHandlerContext.java:61)
    at io.netty.channel.AbstractChannelHandlerContext$7.run(AbstractChannelHandlerContext.java:425)
    at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at java.base/java.lang.Thread.run(Unknown Source)

No idea what the line looks like, looks like syntactically invalid. Better investigate a bit?

chibenwa commented 4 months ago

A regular RCPT line with parameters:

RCPT TO:<rcpt@localhost> NOTIFY=SUCCESS,FAILURE,DELAY ORCPT=rfc822;orcpt@localhost

I was able to reproduce this with the following RCPT line:

RCPT TO: <"any> ,= ,= "@ccc.fr> which did yield:

java.lang.IllegalArgumentException: Multiple entries with same key: ,= and ,=
    at com.google.common.collect.ImmutableMap.conflictException(ImmutableMap.java:378)
    at com.google.common.collect.ImmutableMap.checkNoConflict(ImmutableMap.java:372)
    at com.google.common.collect.RegularImmutableMap.checkNoConflictInKeyBucket(RegularImmutableMap.java:246)
    at com.google.common.collect.RegularImmutableMap.fromEntryArrayCheckingBucketOverflow(RegularImmutableMap.java:133)
    at com.google.common.collect.RegularImmutableMap.fromEntryArray(RegularImmutableMap.java:95)
    at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:572)
    at com.google.common.collect.ImmutableMap$Builder.buildOrThrow(ImmutableMap.java:600)
    at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:587)
    at org.apache.james.protocols.smtp.core.RcptCmdHandler.parseParameters(RcptCmdHandler.java:230)
    at org.apache.james.protocols.smtp.core.RcptCmdHandler.callHook(RcptCmdHandler.java:219)
    at org.apache.james.protocols.smtp.core.RcptCmdHandler.callHook(RcptCmdHandler.java:55)
    at org.apache.james.protocols.smtp.core.AbstractHookableCmdHandler.processHooks(AbstractHookableCmdHandler.java:117)
    at org.apache.james.protocols.smtp.core.AbstractHookableCmdHandler.onCommand(AbstractHookableCmdHandler.java:75)
    at org.apache.james.protocols.smtp.core.AbstractHookableCmdHandler.onCommand(AbstractHookableCmdHandler.java:50)
    at org.apache.james.protocols.api.handler.CommandDispatcher.dispatchCommandHandlers(CommandDispatcher.java:165)

As it turns out, there is a parser differential between RcptCmdHandler::doFilterChecks and RcptCmdHandler::callHook which interprets things in the mail address as parameters (obviously wrong).

Double parsing BTW looks useless in addition of being dangerous and can likely be avoided.

chibenwa commented 4 months ago

(And yes, investigating a bit was definitively worth it!)

chibenwa commented 4 months ago

CF https://github.com/apache/james-project/pull/2100