Author: norman
Date: Sun Jul 23 04:10:51 2006
New Revision: 424709

URL: http://svn.apache.org/viewvc?rev=424709&view=rev
Log:
Add support for RoaminUsers (pop before smtp). See JAMES-569

Added:
    
james/server/trunk/src/java/org/apache/james/smtpserver/core/RoaminUsersHandler.java
    james/server/trunk/src/java/org/apache/james/util/RoaminUsersHelper.java
Modified:
    james/server/trunk/src/conf/james-config.xml
    james/server/trunk/src/java/org/apache/james/pop3server/PassCmdHandler.java
    james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java
    james/server/trunk/src/java/org/apache/james/smtpserver/SMTPServer.java
    james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java
    james/server/trunk/src/test/org/apache/james/pop3server/POP3ServerTest.java
    
james/server/trunk/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java
    james/server/trunk/src/test/org/apache/james/smtpserver/SPFHandlerTest.java
    
james/server/trunk/src/test/org/apache/james/smtpserver/SetMimeHeaderHandlerTest.java

Modified: james/server/trunk/src/conf/james-config.xml
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/conf/james-config.xml?rev=424709&r1=424708&r2=424709&view=diff
==============================================================================
--- james/server/trunk/src/conf/james-config.xml (original)
+++ james/server/trunk/src/conf/james-config.xml Sun Jul 23 04:10:51 2006
@@ -922,11 +922,15 @@
             <!-- Load the core filter command handlers-->
             <handler 
class="org.apache.james.smtpserver.core.filter.CoreFilterCmdHandlerLoader"></handler>
        
 
+            <!-- This connect handler can be used to enable RoaminUsers 
support (pop-before-smtp) -->
+            <!--
+            <handler 
class="org.apache.james.smtpserver.core.RoaminUsersHandler"></handler>
+            -->
+            
             <!-- This command handler check against RBL-Lists -->
             <!-- If getDetail is set to true it try to retrieve information 
from TXT Record -->
             <!-- why the ip was blocked. Default to false -->            
             <!--
-            
             <handler 
class="org.apache.james.smtpserver.core.filter.fastfail.DNSRBLHandler" 
command="RCPT">
                <getDetail> false </getDetail>
                <rblservers>

Modified: 
james/server/trunk/src/java/org/apache/james/pop3server/PassCmdHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/pop3server/PassCmdHandler.java?rev=424709&r1=424708&r2=424709&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/pop3server/PassCmdHandler.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/pop3server/PassCmdHandler.java 
Sun Jul 23 04:10:51 2006
@@ -19,6 +19,7 @@
 
 import org.apache.avalon.framework.logger.AbstractLogEnabled;
 import org.apache.james.services.MailRepository;
+import org.apache.james.util.RoaminUsersHelper;
 
 /**
   * Handles PASS command
@@ -51,6 +52,10 @@
                     }
                     session.setUserInbox(inbox);
                     session.stat();
+                    
+                    // Store the ipAddress to use it later for pop before smtp 
+                    
RoaminUsersHelper.addIPAddress(session.getRemoteIPAddress());
+                    
                     StringBuffer responseBuffer =
                         new StringBuffer(64)
                                 .append(POP3Handler.OK_RESPONSE)

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java?rev=424709&r1=424708&r2=424709&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/SMTPHandler.java 
Sun Jul 23 04:10:51 2006
@@ -437,6 +437,13 @@
     public boolean isRelayingAllowed() {
         return relayingAllowed;
     }
+    
+    /**
+     * @see org.apache.james.smtpserver.SMTPSession#setRelayingAllowed(boolean 
relayingAllowed)
+     */
+    public void setRelayingAllowed(boolean relayingAllowed) {
+        this.relayingAllowed = relayingAllowed;
+    }
 
     /**
      * @see org.apache.james.smtpserver.SMTPSession#isAuthRequired()

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPServer.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/SMTPServer.java?rev=424709&r1=424708&r2=424709&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/SMTPServer.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/SMTPServer.java Sun 
Jul 23 04:10:51 2006
@@ -17,8 +17,6 @@
 
 package org.apache.james.smtpserver;
 
-import org.apache.avalon.cornerstone.services.connection.ConnectionHandler;
-import org.apache.avalon.excalibur.pool.ObjectFactory;
 import org.apache.avalon.framework.configuration.Configuration;
 import org.apache.avalon.framework.configuration.ConfigurationException;
 import org.apache.avalon.framework.container.ContainerUtil;

Modified: 
james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java?rev=424709&r1=424708&r2=424709&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java 
(original)
+++ james/server/trunk/src/java/org/apache/james/smtpserver/SMTPSession.java 
Sun Jul 23 04:10:51 2006
@@ -165,6 +165,13 @@
      * @return the relaying status
      */
     boolean isRelayingAllowed();
+    
+    /**
+     * Set if reallying is allowed
+     * 
+     * @param relayingAllowed
+     */
+    void setRelayingAllowed(boolean relayingAllowed);
 
     /**
      * Returns whether Authentication is required or not

Added: 
james/server/trunk/src/java/org/apache/james/smtpserver/core/RoaminUsersHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/smtpserver/core/RoaminUsersHandler.java?rev=424709&view=auto
==============================================================================
--- 
james/server/trunk/src/java/org/apache/james/smtpserver/core/RoaminUsersHandler.java
 (added)
+++ 
james/server/trunk/src/java/org/apache/james/smtpserver/core/RoaminUsersHandler.java
 Sun Jul 23 04:10:51 2006
@@ -0,0 +1,72 @@
+/***********************************************************************
+ * Copyright (c) 2000-2006 The Apache Software Foundation.             *
+ * All rights reserved.                                                *
+ * ------------------------------------------------------------------- *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you *
+ * may not use this file except in compliance with the License. You    *
+ * may obtain a copy of the License at:                                *
+ *                                                                     *
+ *     http://www.apache.org/licenses/LICENSE-2.0                      *
+ *                                                                     *
+ * Unless required by applicable law or agreed to in writing, software *
+ * distributed under the License is distributed on an "AS IS" BASIS,   *
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or     *
+ * implied.  See the License for the specific language governing       *
+ * permissions and limitations under the License.                      *
+ ***********************************************************************/
+package org.apache.james.smtpserver.core;
+
+import org.apache.avalon.framework.configuration.Configurable;
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.james.smtpserver.ConnectHandler;
+import org.apache.james.smtpserver.SMTPSession;
+import org.apache.james.util.RoaminUsersHelper;
+
+/**
+ * This ConnectHandler can be used to activate pop-before-smtp
+ */
+public class RoaminUsersHandler implements ConnectHandler, Configurable {
+
+    /**
+     * The time after which ipAddresses should be handled as expired
+     */
+    private long expireTime;
+
+    /**
+     * @see 
org.apache.avalon.framework.configuration.Configurable#configure(Configuration)
+     */
+    public void configure(Configuration arg0) throws ConfigurationException {
+        Configuration config = arg0.getChild("expireTime", false);
+
+        if (config != null) {
+            
setExpireTime(config.getValueAsLong(RoaminUsersHelper.EXPIRE_TIME));
+        }
+    }
+
+    /**
+     * Set the time after which an ipAddresses should be handled as expired
+     * 
+     * @param expireTime The time in ms
+     */
+    public void setExpireTime(long expireTime) {
+        this.expireTime = expireTime;
+    }
+
+    /**
+     * @see org.apache.james.smtpserver.ConnectHandler#onConnect(SMTPSession)
+     */
+    public void onConnect(SMTPSession session) {
+
+        // some kind of random cleanup process
+        if (Math.random() > 0.5) {
+            RoaminUsersHelper.removeExpiredIP(expireTime);
+        }
+
+        // Check if the ip is allowed to relay
+        if (RoaminUsersHelper.isAuthorized(session.getRemoteIPAddress())) {
+            session.setRelayingAllowed(true);
+        }
+    }
+
+}

Added: james/server/trunk/src/java/org/apache/james/util/RoaminUsersHelper.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/util/RoaminUsersHelper.java?rev=424709&view=auto
==============================================================================
--- james/server/trunk/src/java/org/apache/james/util/RoaminUsersHelper.java 
(added)
+++ james/server/trunk/src/java/org/apache/james/util/RoaminUsersHelper.java 
Sun Jul 23 04:10:51 2006
@@ -0,0 +1,103 @@
+/***********************************************************************
+ * Copyright (c) 2000-2006 The Apache Software Foundation.             *
+ * All rights reserved.                                                *
+ * ------------------------------------------------------------------- *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you *
+ * may not use this file except in compliance with the License. You    *
+ * may obtain a copy of the License at:                                *
+ *                                                                     *
+ *     http://www.apache.org/licenses/LICENSE-2.0                      *
+ *                                                                     *
+ * Unless required by applicable law or agreed to in writing, software *
+ * distributed under the License is distributed on an "AS IS" BASIS,   *
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or     *
+ * implied.  See the License for the specific language governing       *
+ * permissions and limitations under the License.                      *
+ ***********************************************************************/
+package org.apache.james.util;
+
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * Helper class which is used to store ipAddresses and timestamps for pop 
before
+ * smtp support.
+ */
+public class RoaminUsersHelper {
+
+    private RoaminUsersHelper() {
+    }
+
+    /**
+     * The map in which the ipAddresses and timestamp stored
+     */
+    public static HashMap ipMap = new HashMap();
+
+    /**
+     * Default expire time in ms (1 hour)
+     */
+    public static final long EXPIRE_TIME = 216000000;
+
+    /**
+     * Return true if the ip is authorized to relay
+     * 
+     * @param ipAddress
+     *            The ipAddress
+     * @return true if authorized. Else false
+     */
+    public static synchronized boolean isAuthorized(String ipAddress) {
+
+        if (ipMap.containsKey(ipAddress)) {
+            return true;
+
+        }
+        return false;
+    }
+
+    /**
+     * Add the ipAddress to the authorized ipAddresses
+     * 
+     * @param ipAddress
+     *            The ipAddress
+     */
+    public static synchronized void addIPAddress(String ipAddress) {
+        ipMap.put(ipAddress, Long.toString(System.currentTimeMillis()));
+    }
+
+    /**
+     * @see #removeExpiredIP(String, long)
+     */
+    public static synchronized void removeExpiredIP() {
+        removeExpiredIP(EXPIRE_TIME);
+    }
+
+    /**
+     * Remove all ipAddress from the authorized map which are older then the
+     * given time
+     * 
+     * @param clearTime
+     *            The time in milliseconds after which an ipAddress should be
+     *            handled as expired
+     */
+    public static synchronized void removeExpiredIP(long clearTime) {
+        Iterator storedIP = ipMap.keySet().iterator();
+        long currTime = System.currentTimeMillis();
+
+        while (storedIP.hasNext()) {
+            String key = storedIP.next().toString();
+            long storedTime = Long.parseLong((String) ipMap.get(key));
+
+            // remove the ip from the map when it is expired
+            if ((currTime - clearTime) > storedTime) {
+                ipMap.remove(key);
+            }
+        }
+    }
+
+    /**
+     * Remove all ipAddresses from the authorized map
+     */
+    public static synchronized void clearIP() {
+        ipMap.clear();
+    }
+}

Modified: 
james/server/trunk/src/test/org/apache/james/pop3server/POP3ServerTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/test/org/apache/james/pop3server/POP3ServerTest.java?rev=424709&r1=424708&r2=424709&view=diff
==============================================================================
--- james/server/trunk/src/test/org/apache/james/pop3server/POP3ServerTest.java 
(original)
+++ james/server/trunk/src/test/org/apache/james/pop3server/POP3ServerTest.java 
Sun Jul 23 04:10:51 2006
@@ -35,6 +35,7 @@
 import org.apache.james.test.mock.james.MockMailServer;
 import org.apache.james.test.util.Util;
 import org.apache.james.userrepository.MockUsersRepository;
+import org.apache.james.util.RoaminUsersHelper;
 import org.apache.james.util.connection.SimpleConnectionManager;
 import org.apache.mailet.MailAddress;
 
@@ -288,6 +289,21 @@
                 pop3Protocol2.disconnect();
             }
         }
+    }
+    
+    public void testIpStored() throws Exception {
+        finishSetUp(m_testConfiguration);
+
+        m_pop3Protocol = new POP3Client();
+        m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
+
+        String pass = "password";
+        m_usersRepository.addUser("foo", pass);
+        m_mailServer.setUserInbox("foo", new MockMailRepository());
+
+        m_pop3Protocol.login("foo", pass);
+        assertEquals(1, m_pop3Protocol.getState());
+        assertTrue(RoaminUsersHelper.isAuthorized("127.0.0.1"));
     }
 
 }

Modified: 
james/server/trunk/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java?rev=424709&r1=424708&r2=424709&view=diff
==============================================================================
--- 
james/server/trunk/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java 
(original)
+++ 
james/server/trunk/src/test/org/apache/james/smtpserver/DNSRBLHandlerTest.java 
Sun Jul 23 04:10:51 2006
@@ -246,7 +246,6 @@
             }
 
             public int getRcptCount() {
-                // TODO Auto-generated method stub
                 return 0;
             }
 
@@ -264,6 +263,11 @@
 
             public void resetConnectionState() {
                 connectionState.clear();
+            }
+
+            public void setRelayingAllowed(boolean relayingAllowed) {
+                throw new UnsupportedOperationException(
+                "Unimplemented mock service");
             }
 
         };

Modified: 
james/server/trunk/src/test/org/apache/james/smtpserver/SPFHandlerTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/test/org/apache/james/smtpserver/SPFHandlerTest.java?rev=424709&r1=424708&r2=424709&view=diff
==============================================================================
--- james/server/trunk/src/test/org/apache/james/smtpserver/SPFHandlerTest.java 
(original)
+++ james/server/trunk/src/test/org/apache/james/smtpserver/SPFHandlerTest.java 
Sun Jul 23 04:10:51 2006
@@ -294,6 +294,11 @@
                 connectionState.clear();
             }
 
+            public void setRelayingAllowed(boolean relayingAllowed) {
+                throw new UnsupportedOperationException(
+                "Unimplemented mock service");
+            }
+
         };
     }
 

Modified: 
james/server/trunk/src/test/org/apache/james/smtpserver/SetMimeHeaderHandlerTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/src/test/org/apache/james/smtpserver/SetMimeHeaderHandlerTest.java?rev=424709&r1=424708&r2=424709&view=diff
==============================================================================
--- 
james/server/trunk/src/test/org/apache/james/smtpserver/SetMimeHeaderHandlerTest.java
 (original)
+++ 
james/server/trunk/src/test/org/apache/james/smtpserver/SetMimeHeaderHandlerTest.java
 Sun Jul 23 04:10:51 2006
@@ -151,26 +151,6 @@
                         "Unimplemented mock service");
             }
 
-            public void setBlockListed(boolean blocklisted) {
-                throw new UnsupportedOperationException(
-                        "Unimplemented mock service");
-            }
-
-            public boolean isBlockListed() {
-                throw new UnsupportedOperationException(
-                        "Unimplemented mock service");
-            }
-
-            public void setBlockListedDetail(String detail) {
-                throw new UnsupportedOperationException(
-                        "Unimplemented mock service");
-            }
-
-            public String getBlockListedDetail() {
-                throw new UnsupportedOperationException(
-                        "Unimplemented mock service");
-            }
-
             public boolean isRelayingAllowed() {
                 throw new UnsupportedOperationException(
                         "Unimplemented mock service");
@@ -227,6 +207,11 @@
             }
 
             public void resetConnectionState() {
+                throw new UnsupportedOperationException(
+                "Unimplemented mock service");
+            }
+
+            public void setRelayingAllowed(boolean relayingAllowed) {
                 throw new UnsupportedOperationException(
                 "Unimplemented mock service");
             }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to