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]