Author: norman
Date: Fri Dec 24 12:27:16 2010
New Revision: 1052497

URL: http://svn.apache.org/viewvc?rev=1052497&view=rev
Log:
Make sure the domain is not local before skip valid rcpt checks for sessions 
which are allowed to relay. See PROTOCOLS-17

Modified:
    
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/AbstractValidRcptHandler.java

Modified: 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/AbstractValidRcptHandler.java
URL: 
http://svn.apache.org/viewvc/james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/AbstractValidRcptHandler.java?rev=1052497&r1=1052496&r2=1052497&view=diff
==============================================================================
--- 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/AbstractValidRcptHandler.java
 (original)
+++ 
james/protocols/trunk/smtp/src/main/java/org/apache/james/protocols/smtp/core/fastfail/AbstractValidRcptHandler.java
 Fri Dec 24 12:27:16 2010
@@ -42,17 +42,33 @@ public abstract class AbstractValidRcptH
      * @see 
org.apache.james.protocols.smtp.hook.RcptHook#doRcpt(org.apache.james.protocols.smtp.SMTPSession,
 org.apache.mailet.MailAddress, org.apache.mailet.MailAddress)
      */
     public HookResult doRcpt(SMTPSession session, MailAddress sender, 
MailAddress rcpt) {
+        boolean reject = false;
         
-        if (!session.isRelayingAllowed()) {
-            if (isValidRecipient(session, rcpt) == false) {
-                //user not exist
-                session.getLogger().info("Rejected message. Unknown user: " + 
rcpt.toString());
-                return new 
HookResult(HookReturnCode.DENY,SMTPRetCode.MAILBOX_PERM_UNAVAILABLE, 
DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.ADDRESS_MAILBOX) + " Unknown 
user: " + rcpt.toString());
+        if (session.isRelayingAllowed()) {
+            // check if the domain is local, if so we still want to check if 
the recipient is valid or not as we want to fail fast in such cases
+            if (isLocalDomain(session, rcpt.getDomain())) {
+                if (isValidRecipient(session, rcpt) == false) {
+                    reject = true;
+                }
             }
         } else {
-            session.getLogger().debug("Sender allowed");
+            if (isLocalDomain(session, rcpt.getDomain()) == false) {
+                session.getLogger().debug("Unknown domain " + rcpt.getDomain() 
+ " so reject it");
+
+            } else {
+                if (isValidRecipient(session, rcpt) == false) {
+                    reject= true;
+                }
+            }
+        }
+       
+        if (reject) {
+          //user not exist
+            session.getLogger().info("Rejected message. Unknown user: " + 
rcpt.toString());
+            return new 
HookResult(HookReturnCode.DENY,SMTPRetCode.MAILBOX_PERM_UNAVAILABLE, 
DSNStatus.getStatus(DSNStatus.PERMANENT,DSNStatus.ADDRESS_MAILBOX) + " Unknown 
user: " + rcpt.toString());
+        } else {
+            return new HookResult(HookReturnCode.DECLINED);
         }
-        return new HookResult(HookReturnCode.DECLINED);
     }
     
   
@@ -63,4 +79,13 @@ public abstract class AbstractValidRcptH
      * @return isValid
      */
     protected abstract boolean isValidRecipient(SMTPSession session, 
MailAddress recipient);
+    
+    /**
+     * Return true if the domain is local
+     * 
+     * @param session
+     * @param domain
+     * @return local
+     */
+    protected abstract boolean isLocalDomain(SMTPSession session, String 
domain);
 }



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

Reply via email to