This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git


The following commit(s) were added to refs/heads/master by this push:
     new cc48c303f3 JAMES-4018 SMTP RCPT TO should parse parameters once
cc48c303f3 is described below

commit cc48c303f320d7ee9b2ebc0d9b3ef6c3e12ddc85
Author: Benoit TELLIER <[email protected]>
AuthorDate: Sun Mar 10 22:46:26 2024 +0100

    JAMES-4018 SMTP RCPT TO should parse parameters once
---
 .../apache/james/protocols/smtp/core/RcptCmdHandler.java | 16 ++++++----------
 1 file changed, 6 insertions(+), 10 deletions(-)

diff --git 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/RcptCmdHandler.java
 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/RcptCmdHandler.java
index 77c9d9cccd..479f04599d 100644
--- 
a/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/RcptCmdHandler.java
+++ 
b/protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/RcptCmdHandler.java
@@ -45,7 +45,6 @@ import org.apache.james.protocols.smtp.hook.RcptHook;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Splitter;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 
@@ -56,6 +55,7 @@ public class RcptCmdHandler extends 
AbstractHookableCmdHandler<RcptHook> impleme
         CommandHandler<SMTPSession> {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(RcptCmdHandler.class);
     public static final ProtocolSession.AttachmentKey<MailAddress> 
CURRENT_RECIPIENT = ProtocolSession.AttachmentKey.of("CURRENT_RECIPIENT", 
MailAddress.class);
+    public static final ProtocolSession.AttachmentKey<Map> 
CURRENT_RECIPIENT_PARAMETERS = 
ProtocolSession.AttachmentKey.of("CURRENT_RECIPIENT_PARAMETERS", Map.class);
     private static final Collection<String> COMMANDS = ImmutableSet.of("RCPT");
     private static final Response MAIL_NEEDED = new 
SMTPResponse(SMTPRetCode.BAD_SEQUENCE, DSNStatus.getStatus(DSNStatus.PERMANENT, 
DSNStatus.DELIVERY_OTHER) + " Need MAIL before RCPT").immutable();
     private static final Response SYNTAX_ERROR_ARGS = new 
SMTPResponse(SMTPRetCode.SYNTAX_ERROR_ARGUMENTS, 
DSNStatus.getStatus(DSNStatus.PERMANENT, DSNStatus.DELIVERY_SYNTAX) + " Usage: 
RCPT TO:<recipient>").immutable();
@@ -161,6 +161,8 @@ public class RcptCmdHandler extends 
AbstractHookableCmdHandler<RcptHook> impleme
             return SYNTAX_ERROR_ADDRESS;
         }
 
+
+        ImmutableMap.Builder<String, String> parameters = 
ImmutableMap.builder();
         if (rcptOptionString != null) {
 
             StringTokenizer optionTokenizer = new StringTokenizer(
@@ -179,9 +181,11 @@ public class RcptCmdHandler extends 
AbstractHookableCmdHandler<RcptHook> impleme
                         "Unrecognized or unsupported option: "
                             + parameter.getKey());
                 }
+                parameters.put(parameter.getKey(), parameter.getValue());
             }
             optionTokenizer = null;
         }
+        session.setAttachment(CURRENT_RECIPIENT_PARAMETERS, 
parameters.build(), State.Transaction);
 
         session.setAttachment(CURRENT_RECIPIENT, recipientAddress, 
State.Transaction);
 
@@ -216,20 +220,12 @@ public class RcptCmdHandler extends 
AbstractHookableCmdHandler<RcptHook> impleme
     @Override
     protected HookResult callHook(RcptHook rawHook, SMTPSession session, 
String parametersString) {
         MaybeSender sender = session.getAttachment(SMTPSession.SENDER, 
State.Transaction).orElse(MaybeSender.nullSender());
-        Map<String, String> parameters = parseParameters(parametersString);
         MailAddress rcpt = session.getAttachment(CURRENT_RECIPIENT, 
State.Transaction).orElse(MailAddress.nullSender());
+        Map<String, String> parameters = 
session.getAttachment(CURRENT_RECIPIENT_PARAMETERS, 
State.Transaction).orElseGet(ImmutableMap::of);
 
         return rawHook.doRcpt(session, sender, rcpt, parameters);
     }
 
-    private Map<String, String> parseParameters(String rcptOptions) {
-        ImmutableMap.Builder<String, String> result = ImmutableMap.builder();
-        for (String option: Splitter.on(' ').split(rcptOptions)) {
-            result.put(parseParameter(option));
-        }
-        return result.build();
-    }
-
     private Pair<String, String> parseParameter(String rcptOption) {
         int equalIndex = rcptOption.indexOf('=');
         if (equalIndex > 0) {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to