You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2010/04/09 17:44:47 UTC
svn commit: r932468 [2/3] - in /james/server/trunk: ./ common-util/
common-util/src/main/java/org/apache/james/util/stream/
mina-socket/src/main/java/org/apache/james/socket/
mina-socket/src/main/java/org/apache/james/socket/mina/ netty-socket/
netty-s...
Added: james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ResponseEncoder.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ResponseEncoder.java?rev=932468&view=auto
==============================================================================
--- james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ResponseEncoder.java (added)
+++ james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ResponseEncoder.java Fri Apr 9 15:44:46 2010
@@ -0,0 +1,55 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you 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.pop3server.netty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.james.pop3server.POP3Response;
+import org.apache.james.socket.netty.AbstractResponseEncoder;
+
+/**
+ * {@link AbstractResponseEncoder} implementation which handles {@link POP3Response} messages
+ *
+ */
+public class POP3ResponseEncoder extends AbstractResponseEncoder<POP3Response>{
+
+ public POP3ResponseEncoder() {
+ super(POP3Response.class, "US-ASCII");
+ }
+
+ @Override
+ protected List<String> getResponse(POP3Response response) {
+ List<String> responseList = new ArrayList<String>();
+ for (int k = 0; k < response.getLines().size(); k++) {
+ StringBuffer respBuff = new StringBuffer(256);
+ if (k == 0) {
+ respBuff.append(response.getRetCode());
+ respBuff.append(" ");
+ respBuff.append(response.getLines().get(k));
+
+ } else {
+ respBuff.append(response.getLines().get(k));
+ }
+ responseList.add(respBuff.toString());
+ }
+ return responseList;
+ }
+
+}
Copied: james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AbstractAsyncPOP3ServerTest.java (from r932257, james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java)
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AbstractAsyncPOP3ServerTest.java?p2=james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AbstractAsyncPOP3ServerTest.java&p1=james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java&r1=932257&r2=932468&rev=932468&view=diff
==============================================================================
--- james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java (original)
+++ james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AbstractAsyncPOP3ServerTest.java Fri Apr 9 15:44:46 2010
@@ -46,7 +46,6 @@ import org.apache.james.imap.mailbox.Mai
import org.apache.james.imap.mailbox.MailboxSession;
import org.apache.james.imap.store.Authenticator;
import org.apache.james.lifecycle.LifecycleUtil;
-import org.apache.james.pop3server.mina.AsyncPOP3Server;
import org.apache.james.services.MailServer;
import org.apache.james.socket.ProtocolHandlerChainImpl;
import org.apache.james.test.mock.james.MockFileSystem;
@@ -55,53 +54,44 @@ import org.apache.james.test.util.Util;
import org.apache.james.userrepository.MockUsersRepository;
import org.apache.james.util.POP3BeforeSMTPHelper;
-public class AsyncPOP3ServerTest extends TestCase {
+public abstract class AbstractAsyncPOP3ServerTest extends TestCase {
private int m_pop3ListenerPort = Util.getNonPrivilegedPort();
- private MockMailServer m_mailServer;
+ protected MockMailServer m_mailServer;
private POP3TestConfiguration m_testConfiguration;
private MockUsersRepository m_usersRepository = new MockUsersRepository();
private POP3Client m_pop3Protocol = null;
private FakeLoader serviceManager;
- private DNSService dnsservice;
- private MockFileSystem fSystem;
- private ProtocolHandlerChainImpl chain;
+ protected DNSService dnsservice;
+ protected MockFileSystem fSystem;
+ protected ProtocolHandlerChainImpl chain;
private InMemoryMailboxManager manager;
- public AsyncPOP3ServerTest() {
+ public AbstractAsyncPOP3ServerTest() {
super("AsyncPOP3ServerTest");
}
- private AsyncPOP3Server m_pop3Server;
-
protected void setUp() throws Exception {
setUpServiceManager();
chain = new ProtocolHandlerChainImpl();
chain.setInstanceFactory(serviceManager);
chain.setLog(new SimpleLog("ChainLog"));
-
- m_pop3Server = new AsyncPOP3Server();
- m_pop3Server.setDNSService(dnsservice);
- m_pop3Server.setFileSystem(fSystem);
- m_pop3Server.setProtocolHandlerChain(chain);
-
-
- SimpleLog log = new SimpleLog("Mock");
- log.setLevel(SimpleLog.LOG_LEVEL_DEBUG);
- m_pop3Server.setLog(log);
- m_pop3Server.setMailServer(m_mailServer);
+
+ setUpPOP3Server();
m_testConfiguration = new POP3TestConfiguration(m_pop3ListenerPort);
}
protected void finishSetUp(POP3TestConfiguration testConfiguration) throws Exception {
testConfiguration.init();
chain.configure(testConfiguration.configurationAt("handler.handlerchain"));
- m_pop3Server.configure(testConfiguration);
chain.init();
- m_pop3Server.init();
+ initPOP3Server(testConfiguration);
}
+ protected abstract void setUpPOP3Server() throws Exception;
+ protected abstract void initPOP3Server(POP3TestConfiguration testConfiguration) throws Exception;
+
protected void setUpServiceManager() throws Exception {
serviceManager = new FakeLoader();
Modified: james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java?rev=932468&r1=932467&r2=932468&view=diff
==============================================================================
--- james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java (original)
+++ james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AsyncPOP3ServerTest.java Fri Apr 9 15:44:46 2010
@@ -1,571 +1,50 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one *
- * or more contributor license agreements. See the NOTICE file *
- * distributed with this work for additional information *
- * regarding copyright ownership. The ASF licenses this file *
- * to you 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.pop3server;
-
-import java.io.ByteArrayInputStream;
-import java.io.Reader;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-
-import javax.mail.Flags;
-import javax.mail.MessagingException;
-
-import junit.framework.TestCase;
-
-import org.apache.commons.logging.impl.SimpleLog;
-import org.apache.commons.net.pop3.POP3Client;
-import org.apache.commons.net.pop3.POP3MessageInfo;
-import org.apache.commons.net.pop3.POP3Reply;
-import org.apache.james.api.dnsservice.AbstractDNSServer;
-import org.apache.james.api.dnsservice.DNSService;
-import org.apache.james.api.kernel.mock.FakeLoader;
-import org.apache.james.api.user.UsersRepository;
-import org.apache.james.imap.inmemory.InMemoryMailboxManager;
-import org.apache.james.imap.inmemory.InMemorySubscriptionManager;
-import org.apache.james.imap.mailbox.Mailbox;
-import org.apache.james.imap.mailbox.MailboxSession;
-import org.apache.james.imap.store.Authenticator;
-import org.apache.james.lifecycle.LifecycleUtil;
-import org.apache.james.pop3server.mina.AsyncPOP3Server;
-import org.apache.james.services.MailServer;
-import org.apache.james.socket.ProtocolHandlerChainImpl;
-import org.apache.james.test.mock.james.MockFileSystem;
-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.POP3BeforeSMTPHelper;
-
-public class AsyncPOP3ServerTest extends TestCase {
-
- private int m_pop3ListenerPort = Util.getNonPrivilegedPort();
- private MockMailServer m_mailServer;
- private POP3TestConfiguration m_testConfiguration;
- private MockUsersRepository m_usersRepository = new MockUsersRepository();
- private POP3Client m_pop3Protocol = null;
- private FakeLoader serviceManager;
- private DNSService dnsservice;
- private MockFileSystem fSystem;
- private ProtocolHandlerChainImpl chain;
- private InMemoryMailboxManager manager;
-
- public AsyncPOP3ServerTest() {
- super("AsyncPOP3ServerTest");
- }
-
- private AsyncPOP3Server m_pop3Server;
-
- protected void setUp() throws Exception {
- setUpServiceManager();
-
- chain = new ProtocolHandlerChainImpl();
- chain.setInstanceFactory(serviceManager);
- chain.setLog(new SimpleLog("ChainLog"));
-
- m_pop3Server = new AsyncPOP3Server();
- m_pop3Server.setDNSService(dnsservice);
- m_pop3Server.setFileSystem(fSystem);
- m_pop3Server.setProtocolHandlerChain(chain);
-
-
- SimpleLog log = new SimpleLog("Mock");
- log.setLevel(SimpleLog.LOG_LEVEL_DEBUG);
- m_pop3Server.setLog(log);
- m_pop3Server.setMailServer(m_mailServer);
- m_testConfiguration = new POP3TestConfiguration(m_pop3ListenerPort);
- }
-
- protected void finishSetUp(POP3TestConfiguration testConfiguration) throws Exception {
- testConfiguration.init();
- chain.configure(testConfiguration.configurationAt("handler.handlerchain"));
- m_pop3Server.configure(testConfiguration);
- chain.init();
- m_pop3Server.init();
- }
-
-
- protected void setUpServiceManager() throws Exception {
- serviceManager = new FakeLoader();
-
- m_mailServer = new MockMailServer(m_usersRepository);
- serviceManager.put(MailServer.ROLE, m_mailServer);
- serviceManager.put(UsersRepository.ROLE,
- m_usersRepository);
-
-
- manager = new InMemoryMailboxManager(new Authenticator() {
-
- public boolean isAuthentic(String userid, CharSequence passwd) {
- return m_usersRepository.test(userid, passwd.toString());
- }
- }, new InMemorySubscriptionManager());
-
- serviceManager.put("mailboxmanager", manager);
-
- dnsservice = setUpDNSServer();
- serviceManager.put(DNSService.ROLE, setUpDNSServer());
- fSystem = new MockFileSystem();
- serviceManager.put(MockFileSystem.ROLE,fSystem);
-
- }
-
- private DNSService setUpDNSServer() {
- DNSService dns = new AbstractDNSServer() {
- public String getHostName(InetAddress addr) {
- return "localhost";
- }
-
- public InetAddress getLocalHost() throws UnknownHostException {
- return InetAddress.getLocalHost();
- }
-
- };
- return dns;
- }
- protected void tearDown() throws Exception {
- if (m_pop3Protocol != null) {
- if ( m_pop3Protocol.isConnected()){
- m_pop3Protocol.sendCommand("quit");
- m_pop3Protocol.disconnect();
- }
- }
- LifecycleUtil.dispose(m_mailServer);
-
- manager.deleteEverything();
- //manager.deleteAll();
-
- super.tearDown();
- }
-
- public void testAuthenticationFail() throws Exception {
- finishSetUp(m_testConfiguration);
-
- m_pop3Protocol = new POP3Client();
- m_pop3Protocol.connect("127.0.0.1", m_pop3ListenerPort);
-
- m_usersRepository.addUser("known", "test2");
-
- m_pop3Protocol.login("known", "test");
- assertEquals(0, m_pop3Protocol.getState());
- assertTrue(m_pop3Protocol.getReplyString().startsWith("-ERR"));
- }
-
- public void testUnknownUser() throws Exception {
- finishSetUp(m_testConfiguration);
-
- m_pop3Protocol = new POP3Client();
- m_pop3Protocol.connect("127.0.0.1", m_pop3ListenerPort);
-
- m_pop3Protocol.login("unknown", "test");
- assertEquals(0, m_pop3Protocol.getState());
- assertTrue(m_pop3Protocol.getReplyString().startsWith("-ERR"));
- }
-
- public void testKnownUserEmptyInbox() throws Exception {
- finishSetUp(m_testConfiguration);
-
- m_pop3Protocol = new POP3Client();
- m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-
- m_usersRepository.addUser("foo", "bar");
-
- // not authenticated
- POP3MessageInfo[] entries = m_pop3Protocol.listMessages();
- assertNull(entries);
-
- m_pop3Protocol.login("foo", "bar");
- System.err.println(m_pop3Protocol.getState());
- assertEquals(1, m_pop3Protocol.getState());
-
- entries = m_pop3Protocol.listMessages();
- assertEquals(1, m_pop3Protocol.getState());
-
- assertNotNull(entries);
- assertEquals(entries.length, 0);
-
- POP3MessageInfo p3i = m_pop3Protocol.listMessage(1);
- assertEquals(1, m_pop3Protocol.getState());
- assertNull(p3i);
-
- }
-
- // TODO: This currently fails with Async implementation because
- // it use Charset US-ASCII to decode / Encode the protocol
- // from the RFC I'm currently not understand if NON-ASCII chars
- // are allowed at all. So this needs to be checked
- /*
- public void testNotAsciiCharsInPassword() throws Exception {
- finishSetUp(m_testConfiguration);
-
- m_pop3Protocol = new POP3Client();
- m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-
- String pass = "bar" + (new String(new char[] { 200, 210 })) + "foo";
- m_usersRepository.addUser("foo", pass);
- InMemorySpoolRepository mockMailRepository = new InMemorySpoolRepository();
- m_mailServer.setUserInbox("foo", mockMailRepository);
-
- m_pop3Protocol.login("foo", pass);
- assertEquals(1, m_pop3Protocol.getState());
- ContainerUtil.dispose(mockMailRepository);
- }
- */
-
-
- public void testUnknownCommand() throws Exception {
- finishSetUp(m_testConfiguration);
-
- m_pop3Protocol = new POP3Client();
- m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-
- m_pop3Protocol.sendCommand("unkn");
- assertEquals(0, m_pop3Protocol.getState());
- assertEquals("Expected -ERR as result for an unknown command", m_pop3Protocol.getReplyString().substring(0,4),"-ERR");
- }
-
- public void testUidlCommand() throws Exception {
- finishSetUp(m_testConfiguration);
-
- m_usersRepository.addUser("foo", "bar");
-
- m_pop3Protocol = new POP3Client();
- m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-
- m_pop3Protocol.sendCommand("uidl");
- assertEquals(0, m_pop3Protocol.getState());
-
- m_pop3Protocol.login("foo", "bar");
-
- POP3MessageInfo[] list = m_pop3Protocol.listUniqueIdentifiers();
- assertEquals("Found unexpected messages", 0, list.length);
-
- m_pop3Protocol.disconnect();
- String mailboxName = "#mail.foo.INBOX";
- MailboxSession session = manager.login("foo", "bar", new SimpleLog("Test"));
- if (manager.mailboxExists(mailboxName, session) == false) {
- manager.createMailbox(mailboxName, session);
- }
- setupTestMails(session,manager.getMailbox(mailboxName, session));
-
- m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
- m_pop3Protocol.login("foo", "bar");
-
- list = m_pop3Protocol.listUniqueIdentifiers();
- assertEquals("Expected 2 messages, found: "+list.length, 2, list.length);
-
- POP3MessageInfo p3i = m_pop3Protocol.listUniqueIdentifier(1);
- assertNotNull(p3i);
-
- manager.deleteMailbox("#mail.foo.INBOX", session);
-
-
- }
-
- public void testMiscCommandsWithWithoutAuth() throws Exception {
- finishSetUp(m_testConfiguration);
-
- m_usersRepository.addUser("foo", "bar");
-
- m_pop3Protocol = new POP3Client();
- m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-
- m_pop3Protocol.sendCommand("noop");
- assertEquals(0, m_pop3Protocol.getState());
- assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-
- m_pop3Protocol.sendCommand("stat");
- assertEquals(0, m_pop3Protocol.getState());
- assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-
- m_pop3Protocol.sendCommand("pass");
- assertEquals(0, m_pop3Protocol.getState());
- assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-
- m_pop3Protocol.sendCommand("auth");
- assertEquals(0, m_pop3Protocol.getState());
- assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-
- m_pop3Protocol.sendCommand("rset");
- assertEquals(0, m_pop3Protocol.getState());
- assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-
- m_pop3Protocol.login("foo", "bar");
-
- POP3MessageInfo[] list = m_pop3Protocol.listUniqueIdentifiers();
- assertEquals("Found unexpected messages", 0, list.length);
-
- m_pop3Protocol.sendCommand("noop");
- assertEquals(1, m_pop3Protocol.getState());
-
- m_pop3Protocol.sendCommand("pass");
- assertEquals(1, m_pop3Protocol.getState());
- assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-
- m_pop3Protocol.sendCommand("auth");
- assertEquals(1, m_pop3Protocol.getState());
- assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-
- m_pop3Protocol.sendCommand("user");
- assertEquals(1, m_pop3Protocol.getState());
- assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-
- m_pop3Protocol.sendCommand("rset");
- assertEquals(1, m_pop3Protocol.getState());
-
- }
-
- public void testKnownUserInboxWithMessages() throws Exception {
- finishSetUp(m_testConfiguration);
-
- m_pop3Protocol = new POP3Client();
- m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-
- m_usersRepository.addUser("foo2", "bar2");
-
- String mailboxName = "#mail.foo2.INBOX";
- MailboxSession session = manager.login("foo2", "bar2", new SimpleLog("Test"));
-
- if (manager.mailboxExists(mailboxName, session) == false) {
- manager.createMailbox(mailboxName, session);
- }
-
- setupTestMails(session,manager.getMailbox(mailboxName, session));
-
- m_pop3Protocol.sendCommand("retr","1");
- assertEquals(0, m_pop3Protocol.getState());
- assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-
- m_pop3Protocol.login("foo2", "bar2");
- assertEquals(1, m_pop3Protocol.getState());
-
- POP3MessageInfo[] entries = m_pop3Protocol.listMessages();
-
- assertNotNull(entries);
- assertEquals(2, entries.length);
- assertEquals(1, m_pop3Protocol.getState());
-
- Reader r = m_pop3Protocol.retrieveMessageTop(entries[0].number, 0);
-
- assertNotNull(r);
-
- r.close();
-
- Reader r2 = m_pop3Protocol.retrieveMessage(entries[0].number);
- assertNotNull(r2);
- r2.close();
-
- // existing message
- boolean deleted = m_pop3Protocol.deleteMessage(entries[0].number);
- assertTrue(deleted);
-
- // already deleted message
- deleted = m_pop3Protocol.deleteMessage(entries[0].number);
-
- // TODO: Understand why this fails...
- //assertFalse(deleted);
-
- // unexisting message
- deleted = m_pop3Protocol.deleteMessage(10);
- assertFalse(deleted);
-
- m_pop3Protocol.sendCommand("quit");
- m_pop3Protocol.disconnect();
-
- m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-
- m_pop3Protocol.login("foo2", "bar2");
- assertEquals(1, m_pop3Protocol.getState());
-
- entries = null;
-
- POP3MessageInfo stats = m_pop3Protocol.status();
- assertEquals(1, stats.number);
- assertEquals(5, stats.size);
-
- entries = m_pop3Protocol.listMessages();
-
- assertNotNull(entries);
- assertEquals(1, entries.length);
- assertEquals(1, m_pop3Protocol.getState());
-
- // top without arguments
- m_pop3Protocol.sendCommand("top");
- assertEquals("-ERR", m_pop3Protocol.getReplyString().substring(0,4));
-
- Reader r3 = m_pop3Protocol.retrieveMessageTop(entries[0].number, 0);
- assertNotNull(r3);
- r3.close();
- manager.deleteMailbox(mailboxName, session);
- }
-
- private void setupTestMails(MailboxSession session, Mailbox mailbox) throws MessagingException {
- byte[] content = ("Return-path: return@test.com\r\n"+
- "Content-Transfer-Encoding: plain\r\n"+
- "Subject: test\r\n\r\n"+
- "Body Text POP3ServerTest.setupTestMails\r\n").getBytes();
-
- mailbox.appendMessage(new ByteArrayInputStream(content), new Date(), session, true, new Flags());
- byte[] content2 = ("EMPTY").getBytes();
- mailbox.appendMessage(new ByteArrayInputStream(content2), new Date(), session, true, new Flags());
- }
-
- /*
- public void testTwoSimultaneousMails() throws Exception {
- finishSetUp(m_testConfiguration);
-
- // make two user/repositories, open both
- m_usersRepository.addUser("foo1", "bar1");
- InMemorySpoolRepository mailRep1 = new InMemorySpoolRepository();
- setupTestMails(mailRep1);
- m_mailServer.setUserInbox("foo1", mailRep1);
-
- m_usersRepository.addUser("foo2", "bar2");
- InMemorySpoolRepository mailRep2 = new InMemorySpoolRepository();
- //do not setupTestMails, this is done later
- m_mailServer.setUserInbox("foo2", mailRep2);
-
- POP3Client pop3Protocol2 = null;
- try {
- // open two connections
- m_pop3Protocol = new POP3Client();
- m_pop3Protocol.connect("127.0.0.1", m_pop3ListenerPort);
- pop3Protocol2 = new POP3Client();
- pop3Protocol2.connect("127.0.0.1", m_pop3ListenerPort);
-
- assertEquals("first connection taken", 0, m_pop3Protocol.getState());
- assertEquals("second connection taken", 0, pop3Protocol2.getState());
-
- // open two accounts
- m_pop3Protocol.login("foo1", "bar1");
-
- pop3Protocol2.login("foo2", "bar2");
-
- POP3MessageInfo[] entries = m_pop3Protocol.listMessages();
- assertEquals("foo1 has mails", 2, entries.length);
-
- entries = pop3Protocol2.listMessages();
- assertEquals("foo2 has no mails", 0, entries.length);
-
- } finally {
- // put both to rest, field var is handled by tearDown()
- if (pop3Protocol2 != null) {
- pop3Protocol2.sendCommand("quit");
- 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_pop3Protocol.login("foo", pass);
- assertEquals(1, m_pop3Protocol.getState());
- assertTrue(POP3BeforeSMTPHelper.isAuthorized("127.0.0.1"));
- }
-
- public void testCapa() 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);
-
- assertEquals(POP3Reply.OK, m_pop3Protocol.sendCommand("CAPA"));
-
- m_pop3Protocol.getAdditionalReply();
- m_pop3Protocol.getReplyString();
- List<String> replies = Arrays.asList(m_pop3Protocol.getReplyStrings());
-
- assertTrue("contains USER", replies.contains("USER"));
-
- m_pop3Protocol.login("foo", pass);
- assertEquals(POP3Reply.OK, m_pop3Protocol.sendCommand("CAPA"));
-
- m_pop3Protocol.getAdditionalReply();
- m_pop3Protocol.getReplyString();
- replies = Arrays.asList(m_pop3Protocol.getReplyStrings());
- assertTrue("contains USER", replies.contains("USER"));
- assertTrue("contains UIDL", replies.contains("UIDL"));
- assertTrue("contains TOP", replies.contains("TOP"));
-
- }
-
-
- /*
- * See JAMES-649
- * The same happens when using RETR
- *
- * Comment to not broke the builds!
- *
- public void testOOMTop() throws Exception {
- finishSetUp(m_testConfiguration);
-
- int messageCount = 30000;
- m_pop3Protocol = new POP3Client();
- m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort);
-
- m_usersRepository.addUser("foo", "bar");
- InMemorySpoolRepository mockMailRepository = new InMemorySpoolRepository();
-
- Mail m = new MailImpl();
- m.setMessage(Util.createMimeMessage("X-TEST", "test"));
- for (int i = 1; i < messageCount+1; i++ ) {
- m.setName("test" + i);
- mockMailRepository.store(m);
- }
-
- m_mailServer.setUserInbox("foo", mockMailRepository);
-
- // not authenticated
- POP3MessageInfo[] entries = m_pop3Protocol.listMessages();
- assertNull(entries);
-
- m_pop3Protocol.login("foo", "bar");
- System.err.println(m_pop3Protocol.getState());
- assertEquals(1, m_pop3Protocol.getState());
-
- entries = m_pop3Protocol.listMessages();
- assertEquals(1, m_pop3Protocol.getState());
-
- assertNotNull(entries);
- assertEquals(entries.length, messageCount);
-
- for (int i = 1; i < messageCount+1; i++ ) {
- Reader r = m_pop3Protocol.retrieveMessageTop(i, 100);
- assertNotNull(r);
- r.close();
- }
-
- ContainerUtil.dispose(mockMailRepository);
- }
- */
-
-}
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you 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.pop3server;
+
+import org.apache.commons.logging.impl.SimpleLog;
+import org.apache.james.pop3server.mina.AsyncPOP3Server;
+
+public class AsyncPOP3ServerTest extends AbstractAsyncPOP3ServerTest{
+
+ private AsyncPOP3Server m_pop3Server;
+
+ @Override
+ protected void initPOP3Server(POP3TestConfiguration testConfiguration) throws Exception {
+ m_pop3Server.configure(testConfiguration);
+ m_pop3Server.init();
+ }
+
+ @Override
+ protected void setUpPOP3Server() throws Exception {
+
+ m_pop3Server = new AsyncPOP3Server();
+ m_pop3Server.setDNSService(dnsservice);
+ m_pop3Server.setFileSystem(fSystem);
+ m_pop3Server.setProtocolHandlerChain(chain);
+
+
+ SimpleLog log = new SimpleLog("Mock");
+ log.setLevel(SimpleLog.LOG_LEVEL_DEBUG);
+ m_pop3Server.setLog(log);
+ m_pop3Server.setMailServer(m_mailServer);
+ }
+
+}
Added: james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/NioPOP3ServerTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/NioPOP3ServerTest.java?rev=932468&view=auto
==============================================================================
--- james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/NioPOP3ServerTest.java (added)
+++ james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/NioPOP3ServerTest.java Fri Apr 9 15:44:46 2010
@@ -0,0 +1,50 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you 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.pop3server;
+
+import org.apache.commons.logging.impl.SimpleLog;
+import org.apache.james.pop3server.netty.NioPOP3Server;
+
+public class NioPOP3ServerTest extends AbstractAsyncPOP3ServerTest{
+
+ private NioPOP3Server m_pop3Server;
+
+ @Override
+ protected void initPOP3Server(POP3TestConfiguration testConfiguration) throws Exception {
+ m_pop3Server.configure(testConfiguration);
+ m_pop3Server.init();
+ }
+
+ @Override
+ protected void setUpPOP3Server() throws Exception {
+
+ m_pop3Server = new NioPOP3Server();
+ m_pop3Server.setDNSService(dnsservice);
+ m_pop3Server.setFileSystem(fSystem);
+ m_pop3Server.setProtocolHandlerChain(chain);
+
+
+ SimpleLog log = new SimpleLog("Mock");
+ log.setLevel(SimpleLog.LOG_LEVEL_DEBUG);
+ m_pop3Server.setLog(log);
+ m_pop3Server.setMailServer(m_mailServer);
+ }
+
+}
Modified: james/server/trunk/smtpserver/pom.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/pom.xml?rev=932468&r1=932467&r2=932468&view=diff
==============================================================================
--- james/server/trunk/smtpserver/pom.xml (original)
+++ james/server/trunk/smtpserver/pom.xml Fri Apr 9 15:44:46 2010
@@ -80,6 +80,10 @@
<artifactId>james-server-mina-socket</artifactId>
</dependency>
<dependency>
+ <groupId>org.apache.james</groupId>
+ <artifactId>james-server-netty-socket</artifactId>
+ </dependency>
+ <dependency>
<groupId>${javax.activation.groupId}</groupId>
<artifactId>${javax.activation.artifactId}</artifactId>
</dependency>
Modified: james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/AsyncSMTPServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/AsyncSMTPServer.java?rev=932468&r1=932467&r2=932468&view=diff
==============================================================================
--- james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/AsyncSMTPServer.java (original)
+++ james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/mina/AsyncSMTPServer.java Fri Apr 9 15:44:46 2010
@@ -313,4 +313,5 @@ public class AsyncSMTPServer extends Abs
return new SMTPIoHandler(handlerChain, theConfigData,getLogger(),getSslContextFactory());
}
+
}
Added: james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/NioSMTPServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/NioSMTPServer.java?rev=932468&view=auto
==============================================================================
--- james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/NioSMTPServer.java (added)
+++ james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/NioSMTPServer.java Fri Apr 9 15:44:46 2010
@@ -0,0 +1,296 @@
+package org.apache.james.smtpserver.netty;
+
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.james.api.dnsservice.util.NetMatcher;
+import org.apache.james.protocols.api.ProtocolHandlerChain;
+import org.apache.james.protocols.smtp.SMTPConfiguration;
+import org.apache.james.protocols.smtp.SMTPServerMBean;
+import org.apache.james.socket.netty.AbstractAsyncServer;
+import org.apache.james.socket.netty.AbstractChannelPipelineFactory;
+import org.jboss.netty.channel.ChannelPipelineFactory;
+import org.jboss.netty.channel.ChannelUpstreamHandler;
+import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
+
+public class NioSMTPServer extends AbstractAsyncServer implements SMTPServerMBean{
+
+
+ /**
+ * The handler chain - SMTPhandlers can lookup handlerchain to obtain
+ * Command handlers , Message handlers and connection handlers
+ * Constructed during initialisation to allow dependency injection.
+ */
+ private ProtocolHandlerChain handlerChain;
+
+ /**
+ * Whether authentication is required to use
+ * this SMTP server.
+ */
+ private final static int AUTH_DISABLED = 0;
+ private final static int AUTH_REQUIRED = 1;
+ private final static int AUTH_ANNOUNCE = 2;
+ private int authRequired = AUTH_DISABLED;
+
+ /**
+ * Whether the server needs helo to be send first
+ */
+ private boolean heloEhloEnforcement = false;
+
+ /**
+ * SMTPGreeting to use
+ */
+ private String smtpGreeting = null;
+
+ /**
+ * This is a Network Matcher that should be configured to contain
+ * authorized networks that bypass SMTP AUTH requirements.
+ */
+ private NetMatcher authorizedNetworks = null;
+
+ /**
+ * The maximum message size allowed by this SMTP server. The default
+ * value, 0, means no limit.
+ */
+ private long maxMessageSize = 0;
+
+ /**
+ * The number of bytes to read before resetting
+ * the connection timeout timer. Defaults to
+ * 20 KB.
+ */
+ private int lengthReset = 20 * 1024;
+
+ /**
+ * The configuration data to be passed to the handler
+ */
+ private SMTPConfiguration theConfigData
+ = new SMTPHandlerConfigurationDataImpl();
+
+ private boolean addressBracketsEnforcement = true;
+
+
+
+ public void setProtocolHandlerChain(ProtocolHandlerChain handlerChain) {
+ this.handlerChain = handlerChain;
+ }
+
+
+ public void doConfigure(final HierarchicalConfiguration configuration) throws ConfigurationException {
+ if (isEnabled()) {
+ HierarchicalConfiguration handlerConfiguration = configuration.configurationAt("handler");
+ String authRequiredString = handlerConfiguration.getString("authRequired","false").trim().toLowerCase();
+ if (authRequiredString.equals("true")) authRequired = AUTH_REQUIRED;
+ else if (authRequiredString.equals("announce")) authRequired = AUTH_ANNOUNCE;
+ else authRequired = AUTH_DISABLED;
+ if (authRequired != AUTH_DISABLED) {
+ getLogger().info("This SMTP server requires authentication.");
+ } else {
+ getLogger().info("This SMTP server does not require authentication.");
+ }
+
+ String authorizedAddresses = handlerConfiguration.getString("authorizedAddresses",null);
+ if (authRequired == AUTH_DISABLED && authorizedAddresses == null) {
+ /* if SMTP AUTH is not requred then we will use
+ * authorizedAddresses to determine whether or not to
+ * relay e-mail. Therefore if SMTP AUTH is not
+ * required, we will not relay e-mail unless the
+ * sending IP address is authorized.
+ *
+ * Since this is a change in behavior for James v2,
+ * create a default authorizedAddresses network of
+ * 0.0.0.0/0, which matches all possible addresses, thus
+ * preserving the current behavior.
+ *
+ * James v3 should require the <authorizedAddresses>
+ * element.
+ */
+ authorizedAddresses = "0.0.0.0/0.0.0.0";
+ }
+
+ if (authorizedAddresses != null) {
+ java.util.StringTokenizer st = new java.util.StringTokenizer(authorizedAddresses, ", ", false);
+ java.util.Collection<String> networks = new java.util.ArrayList<String>();
+ while (st.hasMoreTokens()) {
+ String addr = st.nextToken();
+ networks.add(addr);
+ }
+ authorizedNetworks = new NetMatcher(networks, getDNSService());
+ }
+
+ if (authorizedNetworks != null) {
+ getLogger().info("Authorized addresses: " + authorizedNetworks.toString());
+ }
+
+ // get the message size limit from the conf file and multiply
+ // by 1024, to put it in bytes
+ maxMessageSize = handlerConfiguration.getLong( "maxmessagesize",maxMessageSize ) * 1024;
+ if (maxMessageSize > 0) {
+ getLogger().info("The maximum allowed message size is " + maxMessageSize + " bytes.");
+ } else {
+ getLogger().info("No maximum message size is enforced for this server.");
+ }
+ // How many bytes to read before updating the timer that data is being transfered
+ lengthReset = configuration.getInt("lengthReset", lengthReset);
+ if (lengthReset <= 0) {
+ throw new ConfigurationException("The configured value for the idle timeout reset, " + lengthReset + ", is not valid.");
+ }
+ if (getLogger().isInfoEnabled()) {
+ getLogger().info("The idle timeout will be reset every " + lengthReset + " bytes.");
+ }
+
+ heloEhloEnforcement = handlerConfiguration.getBoolean("heloEhloEnforcement",true);
+
+ if (authRequiredString.equals("true")) authRequired = AUTH_REQUIRED;
+
+ // get the smtpGreeting
+ smtpGreeting = handlerConfiguration.getString("smtpGreeting",null);
+
+ addressBracketsEnforcement = handlerConfiguration.getBoolean("addressBracketsEnforcement",true);
+ }
+ }
+
+ /**
+ * @see org.apache.james.socket.mina.AbstractAsyncServer#getDefaultPort()
+ */
+ protected int getDefaultPort() {
+ return 25;
+ }
+
+ /**
+ * @see org.apache.james.core.AbstractProtocolServer#getServiceType()
+ */
+ public String getServiceType() {
+ return "SMTP Service";
+ }
+
+
+ /**
+ * A class to provide SMTP handler configuration to the handlers
+ */
+ private class SMTPHandlerConfigurationDataImpl implements SMTPConfiguration {
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPConfiguration#getHelloName()
+ */
+ public String getHelloName() {
+ if (NioSMTPServer.this.getHelloName() == null) {
+ return NioSMTPServer.this.getMailServer().getHelloName();
+ } else {
+ return NioSMTPServer.this.getHelloName();
+ }
+ }
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPConfiguration#getResetLength()
+ */
+ public int getResetLength() {
+ return NioSMTPServer.this.lengthReset;
+ }
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPConfiguration#getMaxMessageSize()
+ */
+ public long getMaxMessageSize() {
+ return NioSMTPServer.this.maxMessageSize;
+ }
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPConfiguration#isAuthSupported(String)
+ */
+ public boolean isRelayingAllowed(String remoteIP) {
+ boolean relayingAllowed = false;
+ if (authorizedNetworks != null) {
+ relayingAllowed = NioSMTPServer.this.authorizedNetworks.matchInetNetwork(remoteIP);
+ }
+ return relayingAllowed;
+ }
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPConfiguration#useHeloEhloEnforcement()
+ */
+ public boolean useHeloEhloEnforcement() {
+ return NioSMTPServer.this.heloEhloEnforcement;
+ }
+
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPConfiguration#getSMTPGreeting()
+ */
+ public String getSMTPGreeting() {
+ return NioSMTPServer.this.smtpGreeting;
+ }
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPConfiguration#useAddressBracketsEnforcement()
+ */
+ public boolean useAddressBracketsEnforcement() {
+ return NioSMTPServer.this.addressBracketsEnforcement;
+ }
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPConfiguration#isAuthRequired(java.lang.String)
+ */
+ public boolean isAuthRequired(String remoteIP) {
+ if (NioSMTPServer.this.authRequired == AUTH_ANNOUNCE) return true;
+ boolean authRequired = NioSMTPServer.this.authRequired != AUTH_DISABLED;
+ if (authorizedNetworks != null) {
+ authRequired = authRequired && !NioSMTPServer.this.authorizedNetworks.matchInetNetwork(remoteIP);
+ }
+ return authRequired;
+ }
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPConfiguration#isStartTLSSupported()
+ */
+ public boolean isStartTLSSupported() {
+ return NioSMTPServer.this.isStartTLSSupported();
+ }
+
+ }
+
+ /**
+ * (non-Javadoc)
+ * @see org.apache.james.protocols.smtp.SMTPServerMBean#getNetworkInterface()
+ */
+ public String getNetworkInterface() {
+ return "unkown";
+ }
+
+ /**
+ * (non-Javadoc)
+ * @see org.apache.james.protocols.smtp.SMTPServerMBean#getSocketType()
+ */
+ public String getSocketType() {
+ return "plain";
+ }
+
+
+ @Override
+ protected ChannelPipelineFactory createPipelineFactory() {
+ return new AbstractChannelPipelineFactory() {
+
+ @Override
+ protected ChannelUpstreamHandler createHandler() {
+ return new SMTPChannelUpstreamHandler(NioSMTPServer.this.getProtocolHandlerChain(), getSMTPConfiguration(),getLogger());
+ }
+
+ @Override
+ protected OneToOneEncoder createEncoder() {
+ return new SMTPResponseEncoder();
+ }
+
+ @Override
+ protected int getTimeout() {
+ return NioSMTPServer.this.getTimeout();
+ }
+ };
+ }
+
+ protected final ProtocolHandlerChain getProtocolHandlerChain() {
+ return handlerChain;
+ }
+
+ protected final SMTPConfiguration getSMTPConfiguration() {
+ return theConfigData;
+ }
+}
Added: james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPChannelUpstreamHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPChannelUpstreamHandler.java?rev=932468&view=auto
==============================================================================
--- james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPChannelUpstreamHandler.java (added)
+++ james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPChannelUpstreamHandler.java Fri Apr 9 15:44:46 2010
@@ -0,0 +1,59 @@
+package org.apache.james.smtpserver.netty;
+
+import org.apache.commons.logging.Log;
+import org.apache.james.lifecycle.LifecycleUtil;
+import org.apache.james.protocols.api.ProtocolHandlerChain;
+import org.apache.james.protocols.api.ProtocolSession;
+import org.apache.james.protocols.smtp.SMTPConfiguration;
+import org.apache.james.protocols.smtp.SMTPResponse;
+import org.apache.james.protocols.smtp.SMTPRetCode;
+import org.apache.james.protocols.smtp.SMTPSession;
+import org.apache.james.smtpserver.SMTPConstants;
+import org.apache.james.socket.netty.AbstractChannelUpstreamHandler;
+import org.jboss.netty.channel.Channel;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.channel.ChannelStateEvent;
+import org.jboss.netty.channel.ExceptionEvent;
+
+public class SMTPChannelUpstreamHandler extends AbstractChannelUpstreamHandler{
+ private Log logger;
+ private SMTPConfiguration conf;
+
+ public SMTPChannelUpstreamHandler(ProtocolHandlerChain chain,
+ SMTPConfiguration conf, Log logger) {
+ super(chain);
+ this.conf = conf;
+ this.logger = logger;
+ }
+
+ @Override
+ protected ProtocolSession createSession(ChannelHandlerContext ctx) throws Exception {
+ SMTPSession smtpSession= new SMTPNettySession(conf, logger, ctx);
+
+ return smtpSession;
+ }
+
+ @Override
+ public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
+ logger.info("Dispose objects while closing channel " + ctx.getChannel().getId());
+ // Make sure we dispose everything on exit on session close
+ SMTPSession smtpSession = (SMTPSession) attributes.get(ctx.getChannel());
+
+ if (smtpSession != null) {
+ LifecycleUtil.dispose(smtpSession.getState().get(SMTPConstants.MAIL));
+ LifecycleUtil.dispose(smtpSession.getState().get(SMTPConstants.DATA_MIMEMESSAGE_STREAMSOURCE));
+ LifecycleUtil.dispose(smtpSession.getState().get(SMTPConstants.DATA_MIMEMESSAGE_OUTPUTSTREAM));
+ }
+ super.channelDisconnected(ctx, e);
+ }
+
+ @Override
+ public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
+ Channel channel = ctx.getChannel();
+ if (channel.isConnected()) {
+ ctx.getChannel().write(new SMTPResponse(SMTPRetCode.LOCAL_ERROR, "Unable to process smtp request"));
+ }
+ }
+
+
+}
Added: james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPNettySession.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPNettySession.java?rev=932468&view=auto
==============================================================================
--- james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPNettySession.java (added)
+++ james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPNettySession.java Fri Apr 9 15:44:46 2010
@@ -0,0 +1,207 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you 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.netty;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+import org.apache.commons.logging.Log;
+import org.apache.james.protocols.api.LineHandler;
+import org.apache.james.protocols.smtp.SMTPConfiguration;
+import org.apache.james.protocols.smtp.SMTPSession;
+import org.apache.james.socket.netty.AbstractNettySession;
+import org.apache.james.socket.netty.LineHandlerUpstreamHandler;
+import org.jboss.netty.channel.ChannelHandlerContext;
+
+public class SMTPNettySession extends AbstractNettySession implements SMTPSession{
+ public final static String SMTP_SESSION = "SMTP_SESSION";
+
+ private static Random random = new Random();
+
+ private boolean relayingAllowed;
+
+ private String smtpID;
+
+ private Map<String, Object> connectionState;
+
+ private SMTPConfiguration theConfigData;
+
+ private int lineHandlerCount = 0;
+
+ public SMTPNettySession(SMTPConfiguration theConfigData, Log logger, ChannelHandlerContext handlerContext) {
+ super(logger, handlerContext);
+ this.theConfigData = theConfigData;
+ connectionState = new HashMap<String, Object>();
+ smtpID = random.nextInt(1024) + "";
+
+ relayingAllowed = theConfigData.isRelayingAllowed(getRemoteIPAddress());
+ }
+
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPSession#getConnectionState()
+ */
+ public Map<String, Object> getConnectionState() {
+ return connectionState;
+ }
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPSession#getSessionID()
+ */
+ public String getSessionID() {
+ return smtpID;
+ }
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPSession#getState()
+ */
+ @SuppressWarnings("unchecked")
+ public Map<String, Object> getState() {
+ Map<String, Object> res = (Map<String, Object>) getConnectionState()
+ .get(SMTPSession.SESSION_STATE_MAP);
+ if (res == null) {
+ res = new HashMap<String, Object>();
+ getConnectionState().put(SMTPSession.SESSION_STATE_MAP, res);
+ }
+ return res;
+ }
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPSession#isRelayingAllowed()
+ */
+ public boolean isRelayingAllowed() {
+ return relayingAllowed;
+ }
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPSession#resetState()
+ */
+ public void resetState() {
+ // remember the ehlo mode between resets
+ Object currentHeloMode = getState().get(CURRENT_HELO_MODE);
+
+ getState().clear();
+
+ // start again with the old helo mode
+ if (currentHeloMode != null) {
+ getState().put(CURRENT_HELO_MODE, currentHeloMode);
+ }
+ }
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPSession#popLineHandler()
+ */
+ public void popLineHandler() {
+ getChannelHandlerContext().getPipeline()
+ .remove("lineHandler" + lineHandlerCount);
+ lineHandlerCount--;
+ }
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPSession#pushLineHandler(org.apache.james.smtpserver.protocol.LineHandler)
+ */
+ public void pushLineHandler(LineHandler<SMTPSession> overrideCommandHandler) {
+ lineHandlerCount++;
+ getChannelHandlerContext().getPipeline().addBefore("coreHandler",
+ "lineHandler" + lineHandlerCount,
+ new LineHandlerUpstreamHandler<SMTPSession>(overrideCommandHandler));
+ }
+
+
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPSession#getHelloName()
+ */
+ public String getHelloName() {
+ return theConfigData.getHelloName();
+ }
+
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPSession#getMaxMessageSize()
+ */
+ public long getMaxMessageSize() {
+ return theConfigData.getMaxMessageSize();
+ }
+
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPSession#getRcptCount()
+ */
+ @SuppressWarnings("unchecked")
+ public int getRcptCount() {
+ int count = 0;
+
+ // check if the key exists
+ if (getState().get(SMTPSession.RCPT_LIST) != null) {
+ count = ((Collection) getState().get(SMTPSession.RCPT_LIST)).size();
+ }
+
+ return count;
+ }
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPSession#getSMTPGreeting()
+ */
+ public String getSMTPGreeting() {
+ return theConfigData.getSMTPGreeting();
+ }
+
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPSession#isAuthSupported()
+ */
+ public boolean isAuthSupported() {
+ return theConfigData.isAuthRequired(socketAddress.getAddress().getHostAddress());
+ }
+
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPSession#setRelayingAllowed(boolean)
+ */
+ public void setRelayingAllowed(boolean relayingAllowed) {
+ this.relayingAllowed = relayingAllowed;
+ }
+
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPSession#sleep(long)
+ */
+ public void sleep(long ms) {
+ //session.getFilterChain().addAfter("connectionFilter", "tarpitFilter",new TarpitFilter(ms));
+ }
+
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPSession#useAddressBracketsEnforcement()
+ */
+ public boolean useAddressBracketsEnforcement() {
+ return theConfigData.useAddressBracketsEnforcement();
+ }
+
+ /**
+ * @see org.apache.james.protocols.smtp.SMTPSession#useHeloEhloEnforcement()
+ */
+ public boolean useHeloEhloEnforcement() {
+ return theConfigData.useHeloEhloEnforcement();
+ }
+
+}
Added: james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPResponseEncoder.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPResponseEncoder.java?rev=932468&view=auto
==============================================================================
--- james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPResponseEncoder.java (added)
+++ james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPResponseEncoder.java Fri Apr 9 15:44:46 2010
@@ -0,0 +1,37 @@
+package org.apache.james.smtpserver.netty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.james.protocols.smtp.SMTPResponse;
+import org.apache.james.socket.netty.AbstractResponseEncoder;
+
+public class SMTPResponseEncoder extends AbstractResponseEncoder<SMTPResponse>{
+
+ public SMTPResponseEncoder() {
+ super(SMTPResponse.class, "US-ASCII");
+ }
+
+ @Override
+ protected List<String> getResponse(SMTPResponse response) {
+ List<String> responseList = new ArrayList<String>();
+
+ for (int k = 0; k < response.getLines().size(); k++) {
+ StringBuffer respBuff = new StringBuffer(256);
+ respBuff.append(response.getRetCode());
+ if (k == response.getLines().size() - 1) {
+ respBuff.append(" ");
+ respBuff.append(response.getLines().get(k));
+
+ } else {
+ respBuff.append("-");
+ respBuff.append(response.getLines().get(k));
+
+ }
+ responseList.add(respBuff.toString());
+ }
+
+ return responseList;
+ }
+
+}
Copied: james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java (from r932257, james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java)
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java?p2=james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java&p1=james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java&r1=932257&r2=932468&rev=932468&view=diff
==============================================================================
--- james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AsyncSMTPServerTest.java (original)
+++ james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java Fri Apr 9 15:44:46 2010
@@ -48,7 +48,6 @@ import org.apache.james.api.vut.VirtualU
import org.apache.james.lifecycle.LifecycleUtil;
import org.apache.james.services.FileSystem;
import org.apache.james.services.MailServer;
-import org.apache.james.smtpserver.mina.AsyncSMTPServer;
import org.apache.james.socket.ProtocolHandlerChainImpl;
import org.apache.james.socket.mina.codec.CRLFTerminatedLineDecoder;
import org.apache.james.test.mock.DummyVirtualUserTableStore;
@@ -62,7 +61,7 @@ import org.apache.mailet.HostAddress;
import org.apache.mailet.Mail;
import org.apache.mailet.MailAddress;
-public class AsyncSMTPServerTest extends TestCase {
+public abstract class AbstractSMTPServerTest extends TestCase {
final class AlterableDNSServer implements DNSService {
@@ -144,7 +143,7 @@ public class AsyncSMTPServerTest extends
protected final int m_smtpListenerPort;
protected MockMailServer m_mailServer;
- private AsyncSMTPServer m_smtpServer;
+ //private SMTPServer m_smtpServer;
protected SMTPTestConfiguration m_testConfiguration;
protected MockUsersRepository m_usersRepository = new MockUsersRepository();
protected FakeLoader m_serviceManager;
@@ -152,9 +151,9 @@ public class AsyncSMTPServerTest extends
protected MockStore store;
protected MockFileSystem fileSystem;
protected SMTPServerDNSServiceAdapter dnsAdapter;
- private ProtocolHandlerChainImpl chain;
+ protected ProtocolHandlerChainImpl chain;
- public AsyncSMTPServerTest() {
+ public AbstractSMTPServerTest() {
super("AsyncSMTPServerTest");
m_smtpListenerPort = Util.getNonPrivilegedPort();
}
@@ -165,30 +164,27 @@ public class AsyncSMTPServerTest extends
log.setLevel(SimpleLog.LOG_LEVEL_ALL);
m_testConfiguration = new SMTPTestConfiguration(m_smtpListenerPort);
- m_smtpServer = new AsyncSMTPServer();
- m_smtpServer.setDNSService(m_dnsServer);
- m_smtpServer.setFileSystem(fileSystem);
chain = new ProtocolHandlerChainImpl();
chain.setInstanceFactory(m_serviceManager);
chain.setLog(log);
-
- m_smtpServer.setProtocolHandlerChain(chain);
-
- m_smtpServer.setLog(log);
- m_smtpServer.setMailServer(m_mailServer);
+ setUpSMTPServer();
}
+ protected abstract void setUpSMTPServer() throws Exception;
+ protected abstract void initSMTPServer(SMTPTestConfiguration testConfiguration) throws Exception;
+
protected void finishSetUp(SMTPTestConfiguration testConfiguration) throws Exception {
testConfiguration.init();
chain.configure(testConfiguration.configurationAt("handler.handlerchain"));
- m_smtpServer.configure(testConfiguration);
chain.init();
- m_smtpServer.init();
+ initSMTPServer(testConfiguration);
+
m_mailServer.setMaxMessageSizeBytes(m_testConfiguration.getMaxMessageSize() * 1024);
}
+
protected void tearDown() throws Exception {
LifecycleUtil.dispose(m_mailServer);
super.tearDown();
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org