Modified: james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/PassCmdHandler.java URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/PassCmdHandler.java?rev=927982&r1=927981&r2=927982&view=diff ============================================================================== --- james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/PassCmdHandler.java (original) +++ james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/PassCmdHandler.java Fri Mar 26 17:42:26 2010 @@ -27,13 +27,15 @@ import java.util.List; import javax.annotation.Resource; -import org.apache.james.api.user.UsersRepository; +import org.apache.james.imap.mailbox.BadCredentialsException; +import org.apache.james.imap.mailbox.Mailbox; +import org.apache.james.imap.mailbox.MailboxException; +import org.apache.james.imap.mailbox.MailboxManager; +import org.apache.james.imap.mailbox.MailboxSession; import org.apache.james.pop3server.POP3Response; import org.apache.james.pop3server.POP3Session; import org.apache.james.protocols.api.Request; import org.apache.james.protocols.api.Response; -import org.apache.james.services.MailRepository; -import org.apache.james.services.MailServer; import org.apache.james.util.POP3BeforeSMTPHelper; /** @@ -42,29 +44,14 @@ import org.apache.james.util.POP3BeforeS public class PassCmdHandler extends RsetCmdHandler { private final static String COMMAND_NAME ="PASS"; - private UsersRepository users; - private MailServer mailServer; + private MailboxManager mailboxManager; - /** - * Sets the users repository. - * @param users the users to set - */ - @Resource(name="localusersrepository") - public final void setUsers(UsersRepository users) { - this.users = users; - } + @Resource(name="mailboxmanager") + public void setMailboxManager(MailboxManager manager) { + this.mailboxManager = manager; + } - /** - * Sets the mail server. - * @param mailServer the mailServer to set - */ - @Resource(name="James") - public final void setMailServer(MailServer mailServer) { - this.mailServer = mailServer; - } - - /** * Handler method called upon receipt of a PASS command. * Reads in and validates the password. @@ -75,13 +62,24 @@ public class PassCmdHandler extends Rset POP3Response response = null; if (session.getHandlerState() == POP3Session.AUTHENTICATION_USERSET && parameters != null) { String passArg = parameters; - if (users.test(session.getUser(), passArg)) { try { - MailRepository inbox = mailServer.getUserInbox(session.getUser()); - if (inbox == null) { - throw new IllegalStateException("MailServer returned a null inbox for "+session.getUser()); + MailboxSession mSession = mailboxManager.login(session.getUser(), passArg, session.getLogger()); + StringBuffer sb = new StringBuffer(); + sb.append(mailboxManager.getUserNameSpacePrefix()); + sb.append(mailboxManager.getDelimiter()); + sb.append(session.getUser()); + sb.append(mailboxManager.getDelimiter()); + sb.append("INBOX");; + String mailboxName = sb.toString(); + + // check if mailbox exists.. if not just create it + if (mailboxManager.mailboxExists(mailboxName, mSession) == false) { + mailboxManager.createMailbox(mailboxName, mSession); } - session.setUserInbox(inbox); + Mailbox mailbox = mailboxManager.getMailbox(mailboxName, mSession); + + session.getState().put(POP3Session.MAILBOX_SESSION, mSession); + session.setUserMailbox(mailbox); stat(session); // Store the ipAddress to use it later for pop before smtp @@ -93,7 +91,11 @@ public class PassCmdHandler extends Rset .append(session.getUser()); response = new POP3Response(POP3Response.OK_RESPONSE,responseBuffer.toString()); session.setHandlerState(POP3Session.TRANSACTION); - } catch (RuntimeException e) { + } catch (BadCredentialsException e) { + + response = new POP3Response(POP3Response.ERR_RESPONSE, "Authentication failed."); + session.setHandlerState(POP3Session.AUTHENTICATION_READY); + } catch (MailboxException e) { session.getLogger().error("Unexpected error accessing mailbox for "+session.getUser(),e); response = new POP3Response(POP3Response.ERR_RESPONSE,"Unexpected error accessing mailbox"); session.setHandlerState(POP3Session.AUTHENTICATION_READY); @@ -103,9 +105,7 @@ public class PassCmdHandler extends Rset session.setHandlerState(POP3Session.AUTHENTICATION_READY); } - } else { - response = new POP3Response(POP3Response.ERR_RESPONSE); - } + return response; }
Modified: james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/QuitCmdHandler.java URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/QuitCmdHandler.java?rev=927982&r1=927981&r2=927982&view=diff ============================================================================== --- james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/QuitCmdHandler.java (original) +++ james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/QuitCmdHandler.java Fri Mar 26 17:42:26 2010 @@ -25,21 +25,32 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.apache.commons.collections.ListUtils; +import javax.annotation.Resource; +import javax.mail.Flags; + +import org.apache.james.imap.mailbox.Mailbox; +import org.apache.james.imap.mailbox.MailboxException; +import org.apache.james.imap.mailbox.MailboxManager; +import org.apache.james.imap.mailbox.MailboxSession; +import org.apache.james.imap.mailbox.MessageRange; import org.apache.james.pop3server.POP3Response; import org.apache.james.pop3server.POP3Session; import org.apache.james.protocols.api.CommandHandler; import org.apache.james.protocols.api.Request; import org.apache.james.protocols.api.Response; -import org.apache.mailet.Mail; /** * Handles QUIT command */ public class QuitCmdHandler implements CommandHandler<POP3Session> { private final static String COMMAND_NAME = "QUIT"; + protected MailboxManager mailboxManager; - + @Resource(name="mailboxmanager") + public void setMailboxManager(MailboxManager manager) { + this.mailboxManager = manager; + } + /** * Handler method called upon receipt of a QUIT command. * This method handles cleanup of the POP3Handler state. @@ -53,19 +64,29 @@ public class QuitCmdHandler implements C response.setEndSession(true); return response; } - List<Mail> toBeRemoved = ListUtils.subtract(session.getBackupUserMailbox(), session.getUserMailbox()); + MailboxSession mailboxSession = (MailboxSession) session.getState().get(POP3Session.MAILBOX_SESSION); + + List<Long> toBeRemoved = (List<Long>) session.getState().get(POP3Session.DELETED_UID_LIST); try { - session.getUserInbox().remove(toBeRemoved); - // for (Iterator it = toBeRemoved.iterator(); it.hasNext(); ) { - // Mail mc = (Mail) it.next(); - // userInbox.remove(mc.getName()); - //} + Mailbox mailbox = session.getUserMailbox(); + + for (int i = 0; i < toBeRemoved.size(); i++) { + MessageRange range = MessageRange.one(toBeRemoved.get(i)); + mailbox.setFlags(new Flags(Flags.Flag.DELETED), true, false, range, mailboxSession); + mailbox.expunge(range, mailboxSession); + } response = new POP3Response(POP3Response.OK_RESPONSE ,"Apache James POP3 Server signing off."); } catch (Exception ex) { response = new POP3Response(POP3Response.ERR_RESPONSE,"Some deleted messages were not removed"); - session.getLogger().error("Some deleted messages were not removed: " + ex.getMessage()); + session.getLogger().error("Some deleted messages were not removed",ex); } response.setEndSession(true); + try { + mailboxManager.logout(mailboxSession, false); + } catch (MailboxException e) { + // nothing todo on logout + } + return response; } Modified: james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RetrCmdHandler.java URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RetrCmdHandler.java?rev=927982&r1=927981&r2=927982&view=diff ============================================================================== --- james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RetrCmdHandler.java (original) +++ james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RetrCmdHandler.java Fri Mar 26 17:42:26 2010 @@ -21,6 +21,11 @@ package org.apache.james.pop3server.core; +import org.apache.james.imap.mailbox.MailboxSession; +import org.apache.james.imap.mailbox.MessageRange; +import org.apache.james.imap.mailbox.MessageResult; +import org.apache.james.imap.mailbox.MessageResult.FetchGroup; +import org.apache.james.imap.mailbox.util.FetchGroupImpl; import org.apache.james.pop3server.POP3Response; import org.apache.james.pop3server.POP3Session; import org.apache.james.protocols.api.CommandHandler; @@ -32,11 +37,13 @@ import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStreamReader; +import java.nio.channels.Channels; import java.util.ArrayList; import java.util.Collection; -import java.util.Enumeration; +import java.util.Iterator; import java.util.List; /** @@ -65,26 +72,26 @@ public class RetrCmdHandler implements C return response; } try { - Mail mc = session.getUserMailbox().get(num); - Mail dm = (Mail) session.getState().get(POP3Session.DELETED); + List<Long> uidList = (List<Long>) session.getState().get(POP3Session.UID_LIST); + List<Long> deletedUidList = (List<Long>) session.getState().get(POP3Session.DELETED_UID_LIST); + + MailboxSession mailboxSession = (MailboxSession) session.getState().get(POP3Session.MAILBOX_SESSION); + Long uid = uidList.get(num -1); + if (deletedUidList.contains(uid) == false) { + Iterator<MessageResult> results = session.getUserMailbox().getMessages(MessageRange.one(uid), new FetchGroupImpl(FetchGroup.FULL_CONTENT), mailboxSession); - if (mc != dm) { response = new POP3Response(POP3Response.OK_RESPONSE, "Message follows"); try { - for (Enumeration e = mc.getMessage().getAllHeaderLines(); e.hasMoreElements(); ) { - response.appendLine(e.nextElement().toString()); - } - // add empty line between headers and body - response.appendLine(""); - - // write the full mail to the client - writeMessageContentTo(mc, response, -1); - + MessageResult result = results.next(); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + result.getFullContent().writeTo(Channels.newChannel(out)); + + response.appendLine(new String(out.toByteArray())); } finally { response.appendLine("."); - } - return response; + + return response; } else { StringBuilder responseBuffer = @@ -111,56 +118,6 @@ public class RetrCmdHandler implements C } return response; } - - - /** - * Writes the content of the Mail to the client - * - * @param mail the Mail to write - * @param lines the number of lines to write to the client. If -1 is given it write every line of the given MimeMessage to the client - * @param session the POP3Session to use - * - * @throws MessagingException if the MimeMessage is not set for this Mail - * @throws IOException if an error occurs while reading or writing from the stream - */ - protected void writeMessageContentTo(Mail mail, - POP3Response response, int lines) - throws IOException, MessagingException { - String line; - BufferedReader br; - MimeMessage message = mail.getMessage(); - - if (message != null) { - br = new BufferedReader(new InputStreamReader(message - .getRawInputStream())); - try { - - while (lines == -1 || lines > 0) { - if ((line = br.readLine()) == null) { - break; - } - - // add extra dot if line starts with dot - if (line.startsWith(".")) { - line = "." + line; - } - response.appendLine(line); - - if (lines != -1) { - // only count down lines if we have so line limit here - lines--; - } - - } - - } finally { - br.close(); - } - } else { - throw new MessagingException("No message set for this Mail!"); - } - } - /* * (non-Javadoc) * @see org.apache.james.api.protocol.CommonCommandHandler#getImplCommands() Modified: james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RsetCmdHandler.java URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RsetCmdHandler.java?rev=927982&r1=927981&r2=927982&view=diff ============================================================================== --- james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RsetCmdHandler.java (original) +++ james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/RsetCmdHandler.java Fri Mar 26 17:42:26 2010 @@ -28,12 +28,16 @@ import java.util.List; import javax.mail.MessagingException; +import org.apache.james.imap.mailbox.MailboxSession; +import org.apache.james.imap.mailbox.MessageRange; +import org.apache.james.imap.mailbox.MessageResult; +import org.apache.james.imap.mailbox.MessageResult.FetchGroup; +import org.apache.james.imap.mailbox.util.FetchGroupImpl; import org.apache.james.pop3server.POP3Response; import org.apache.james.pop3server.POP3Session; import org.apache.james.protocols.api.CommandHandler; import org.apache.james.protocols.api.Request; import org.apache.james.protocols.api.Response; -import org.apache.mailet.Mail; /** @@ -41,7 +45,8 @@ import org.apache.mailet.Mail; */ public class RsetCmdHandler implements CommandHandler<POP3Session> { private final static String COMMAND_NAME = "RSET"; - + + /** * Handler method called upon receipt of a RSET command. * Calls stat() to reset the mailbox. @@ -69,31 +74,22 @@ public class RsetCmdHandler implements C * user inbox. * */ - @SuppressWarnings("unchecked") protected void stat(POP3Session session) { - ArrayList<Mail> userMailbox = new ArrayList<Mail>(); - Mail dm = (Mail) session.getState().get(POP3Session.DELETED); - - userMailbox.add(dm); try { - for (Iterator it = session.getUserInbox().list(); it.hasNext(); ) { - String key = (String) it.next(); - Mail mc = session.getUserInbox().retrieve(key); - // Retrieve can return null if the mail is no longer in the store. - // In this case we simply continue to the next key - if (mc == null) { - continue; - } - userMailbox.add(mc); + MailboxSession mailboxSession = (MailboxSession) session.getState().get(POP3Session.MAILBOX_SESSION); + + List<Long> uids = new ArrayList<Long>(); + Iterator<MessageResult> it = session.getUserMailbox().getMessages(MessageRange.all(), new FetchGroupImpl(FetchGroup.MINIMAL), mailboxSession); + while (it.hasNext()) { + uids.add(it.next().getUid()); } + session.getState().put(POP3Session.UID_LIST, uids); + session.getState().put(POP3Session.DELETED_UID_LIST, new ArrayList<Long>()); } catch(MessagingException e) { // In the event of an exception being thrown there may or may not be anything in userMailbox session.getLogger().error("Unable to STAT mail box ", e); } - finally { - session.setUserMailbox(userMailbox); - session.setBackupUserMailbox((List<Mail>) userMailbox.clone()); - } + } /** Modified: james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/StatCmdHandler.java URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/StatCmdHandler.java?rev=927982&r1=927981&r2=927982&view=diff ============================================================================== --- james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/StatCmdHandler.java (original) +++ james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/StatCmdHandler.java Fri Mar 26 17:42:26 2010 @@ -23,16 +23,21 @@ package org.apache.james.pop3server.core import java.util.ArrayList; import java.util.Collection; +import java.util.Iterator; import java.util.List; import javax.mail.MessagingException; +import org.apache.james.imap.mailbox.MailboxSession; +import org.apache.james.imap.mailbox.MessageRange; +import org.apache.james.imap.mailbox.MessageResult; +import org.apache.james.imap.mailbox.MessageResult.FetchGroup; +import org.apache.james.imap.mailbox.util.FetchGroupImpl; import org.apache.james.pop3server.POP3Response; import org.apache.james.pop3server.POP3Session; import org.apache.james.protocols.api.CommandHandler; import org.apache.james.protocols.api.Request; import org.apache.james.protocols.api.Response; -import org.apache.mailet.Mail; /** * Handles STAT command @@ -49,15 +54,23 @@ public class StatCmdHandler implements C public Response onCommand(POP3Session session, Request request) { POP3Response response = null; if (session.getHandlerState() == POP3Session.TRANSACTION) { - long size = 0; - int count = 0; + try { - Mail dm = (Mail) session.getState().get(POP3Session.DELETED); + List<Long> uidList = (List<Long>) session.getState().get(POP3Session.UID_LIST); + List<Long> deletedUidList = (List<Long>) session.getState().get(POP3Session.DELETED_UID_LIST); - for (Mail mc: session.getUserMailbox()) { - if (mc != dm) { - size += mc.getMessageSize(); + MailboxSession mailboxSession = (MailboxSession) session.getState().get(POP3Session.MAILBOX_SESSION); + Iterator<MessageResult> results = session.getUserMailbox().getMessages(MessageRange.range(uidList.get(0), uidList.get(uidList.size() -1)), new FetchGroupImpl(FetchGroup.MINIMAL), mailboxSession); + + long size = 0; + int count = 0; + List<MessageResult> validResults = new ArrayList<MessageResult>(); + while (results.hasNext()) { + MessageResult result = results.next(); + if (deletedUidList.contains(result.getUid()) == false) { + size += result.getSize(); count++; + validResults.add(result); } } StringBuilder responseBuffer = Modified: james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java?rev=927982&r1=927981&r2=927982&view=diff ============================================================================== --- james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java (original) +++ james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java Fri Mar 26 17:42:26 2010 @@ -21,19 +21,29 @@ package org.apache.james.pop3server.core; +import java.io.ByteArrayOutputStream; +import java.io.FilterOutputStream; import java.io.IOException; +import java.io.OutputStream; +import java.nio.channels.Channels; +import java.nio.channels.WritableByteChannel; import java.util.ArrayList; import java.util.Collection; -import java.util.Enumeration; +import java.util.Iterator; import java.util.List; import javax.mail.MessagingException; +import org.apache.james.imap.mailbox.MailboxSession; +import org.apache.james.imap.mailbox.MessageRange; +import org.apache.james.imap.mailbox.MessageResult; +import org.apache.james.imap.mailbox.MessageResult.FetchGroup; +import org.apache.james.imap.mailbox.MessageResult.Header; +import org.apache.james.imap.mailbox.util.FetchGroupImpl; import org.apache.james.pop3server.POP3Response; import org.apache.james.pop3server.POP3Session; import org.apache.james.protocols.api.Request; import org.apache.james.protocols.api.Response; -import org.apache.mailet.Mail; /** * Handles TOP command @@ -71,7 +81,7 @@ public class TopCmdHandler extends RetrC if (session.getHandlerState() == POP3Session.TRANSACTION) { int num = 0; - int lines = 0; + int lines = -1; try { num = Integer.parseInt(argument); lines = Integer.parseInt(argument1); @@ -80,20 +90,34 @@ public class TopCmdHandler extends RetrC return response; } try { - Mail mc = session.getUserMailbox().get(num); - Mail dm = (Mail) session.getState().get(POP3Session.DELETED); + List<Long> uidList = (List<Long>) session.getState().get(POP3Session.UID_LIST); + List<Long> deletedUidList = (List<Long>) session.getState().get(POP3Session.DELETED_UID_LIST); + + MailboxSession mailboxSession = (MailboxSession) session.getState().get(POP3Session.MAILBOX_SESSION); + Long uid = uidList.get(num -1); + if (deletedUidList.contains(uid) == false) { + FetchGroupImpl fetchGroup = new FetchGroupImpl(FetchGroup.BODY_CONTENT); + fetchGroup.or(FetchGroup.HEADERS); + Iterator<MessageResult> results = session.getUserMailbox().getMessages(MessageRange.one(uid), fetchGroup, mailboxSession); - if (mc != dm) { response = new POP3Response(POP3Response.OK_RESPONSE, "Message follows"); try { - for (Enumeration e = mc.getMessage().getAllHeaderLines(); e.hasMoreElements(); ) { - response.appendLine(e.nextElement().toString()); - } - // add empty line between headers and body - response.appendLine(""); - - writeMessageContentTo(mc, response, lines); - + MessageResult result = results.next(); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + WritableByteChannel outChannel = Channels.newChannel(out); + + // write headers + Iterator<Header> headers = result.headers(); + while (headers.hasNext()) { + headers.next().writeTo(outChannel); + } + // headers and body are seperated by a CRLF + out.write("\r\n".getBytes()); + + // write body + result.getBody().writeTo(Channels.newChannel(new CountingBodyOutputStream(out, lines))); + + response.appendLine(new String(out.toByteArray())); } finally { response.appendLine("."); } @@ -152,4 +176,60 @@ public class TopCmdHandler extends RetrC return commands; } + /** + * This OutputStream implementation can be used to limit the body lines which will be written + * to the wrapped OutputStream + * + * + * + */ + private final class CountingBodyOutputStream extends FilterOutputStream { + + private int count = 0; + private int limit = -1; + private char lastChar; + + /** + * + * @param out OutputStream to write to + * @param limit the lines to write to the outputstream. -1 is used for no limits + */ + public CountingBodyOutputStream(OutputStream out, int limit) { + super(out); + this.limit = limit; + } + + @Override + public void write(byte[] b, int off, int len) throws IOException { + for (int i = off ; i < len; i++) { + write(b[i]); + } + } + + @Override + public void write(byte[] b) throws IOException { + for (int i = 0 ; i < b.length; i++) { + write(b[i]); + } + } + @Override + public void write(int b) throws IOException { + + if (limit != -1) { + if (count <= limit) { + super.write(b); + } + } else { + super.write(b); + } + + + if (lastChar == '\r' && b == '\n') { + count++; + } + lastChar = (char) b; + + } + + } } Modified: james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java?rev=927982&r1=927981&r2=927982&view=diff ============================================================================== --- james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java (original) +++ james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/UidlCmdHandler.java Fri Mar 26 17:42:26 2010 @@ -30,7 +30,6 @@ import org.apache.james.pop3server.POP3S import org.apache.james.protocols.api.CommandHandler; import org.apache.james.protocols.api.Request; import org.apache.james.protocols.api.Response; -import org.apache.mailet.Mail; /** * Handles UIDL command @@ -47,34 +46,36 @@ public class UidlCmdHandler implements C POP3Response response = null; String parameters = request.getArgument(); if (session.getHandlerState() == POP3Session.TRANSACTION) { - Mail dm = (Mail) session.getState().get(POP3Session.DELETED); - + List<Long> uidList = (List<Long>) session.getState().get(POP3Session.UID_LIST); + List<Long> deletedUidList = (List<Long>) session.getState().get(POP3Session.DELETED_UID_LIST); + if (parameters == null) { response = new POP3Response(POP3Response.OK_RESPONSE,"unique-id listing follows"); - int count = 0; - for (Mail mc:session.getUserMailbox()) { - if (mc != dm) { + for (int i = 0; i < uidList.size(); i++) { + Long uid = uidList.get(i); + if (deletedUidList.contains(uid) == false) { StringBuilder responseBuffer = new StringBuilder(64) - .append(count) + .append(i + 1 ) .append(" ") - .append(mc.getName()); - response.appendLine(responseBuffer.toString()); + .append(uid); + response.appendLine(responseBuffer.toString()); } - count++; } + response.appendLine("."); } else { int num = 0; try { num = Integer.parseInt(parameters); - Mail mc = (Mail) session.getUserMailbox().get(num); - if (mc != dm) { + Long uid = uidList.get(num -1); + if (deletedUidList.contains(uid) == false) { + StringBuilder responseBuffer = new StringBuilder(64) .append(num) .append(" ") - .append(mc.getName()); + .append(uid.hashCode()); response = new POP3Response(POP3Response.OK_RESPONSE, responseBuffer.toString()); } else { Modified: james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/mina/POP3SessionImpl.java URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/mina/POP3SessionImpl.java?rev=927982&r1=927981&r2=927982&view=diff ============================================================================== --- james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/mina/POP3SessionImpl.java (original) +++ james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/mina/POP3SessionImpl.java Fri Mar 26 17:42:26 2010 @@ -26,6 +26,7 @@ import java.util.Map; import javax.net.ssl.SSLContext; import org.apache.commons.logging.Log; +import org.apache.james.imap.mailbox.Mailbox; import org.apache.james.pop3server.POP3HandlerConfigurationData; import org.apache.james.pop3server.POP3Session; import org.apache.james.services.MailRepository; @@ -41,13 +42,9 @@ public class POP3SessionImpl extends Abs private Map<String, Object> state = new HashMap<String, Object>(); - private List<Mail> userMailbox; - - private MailRepository userInbox; - private int handlerState; - private List<Mail> backupUserMailbox; + private Mailbox mailbox; public POP3SessionImpl(POP3HandlerConfigurationData configData, Log logger, IoSession session, SSLContext context) { super(logger, session, context); @@ -59,13 +56,6 @@ public class POP3SessionImpl extends Abs this(configData, logger, session, null); } - /* - * (non-Javadoc) - * @see org.apache.james.pop3server.POP3Session#getBackupUserMailbox() - */ - public List<Mail> getBackupUserMailbox() { - return backupUserMailbox; - } /* * (non-Javadoc) @@ -91,29 +81,6 @@ public class POP3SessionImpl extends Abs return state; } - /* - * (non-Javadoc) - * @see org.apache.james.pop3server.POP3Session#getUserInbox() - */ - public MailRepository getUserInbox() { - return userInbox; - } - - /* - * (non-Javadoc) - * @see org.apache.james.pop3server.POP3Session#getUserMailbox() - */ - public List<Mail> getUserMailbox() { - return userMailbox; - } - - /* - * (non-Javadoc) - * @see org.apache.james.pop3server.POP3Session#setBackupUserMailbox(java.util.List) - */ - public void setBackupUserMailbox(List<Mail> backupUserMailbox) { - this.backupUserMailbox = backupUserMailbox; - } /* * (non-Javadoc) @@ -125,23 +92,6 @@ public class POP3SessionImpl extends Abs /* * (non-Javadoc) - * @see org.apache.james.pop3server.POP3Session#setUserInbox(org.apache.james.services.MailRepository) - */ - public void setUserInbox(MailRepository userInbox) { - this.userInbox = userInbox; - } - - /* - * (non-Javadoc) - * @see org.apache.james.pop3server.POP3Session#setUserMailbox(java.util.List) - */ - public void setUserMailbox(List<Mail> userMailbox) { - this.userMailbox = userMailbox; - } - - - /* - * (non-Javadoc) * @see org.apache.james.api.protocol.TLSSupportedSession#resetState() */ public void resetState() { @@ -150,4 +100,12 @@ public class POP3SessionImpl extends Abs setHandlerState(AUTHENTICATION_READY); } + public Mailbox getUserMailbox() { + return mailbox; + } + + public void setUserMailbox(Mailbox mailbox) { + this.mailbox = mailbox; + } + } 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=927982&r1=927981&r2=927982&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 Mar 26 17:42:26 2010 @@ -19,16 +19,15 @@ package org.apache.james.pop3server; -import java.io.InputStream; import java.io.Reader; import java.net.InetAddress; import java.net.UnknownHostException; -import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.List; +import javax.mail.Flags; import javax.mail.MessagingException; -import javax.mail.util.SharedByteArrayInputStream; import junit.framework.TestCase; @@ -40,19 +39,20 @@ import org.apache.james.api.dnsservice.A 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.core.MailImpl; +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.MailRepository; import org.apache.james.services.MailServer; import org.apache.james.socket.ProtocolHandlerChainImpl; -import org.apache.james.test.mock.james.InMemorySpoolRepository; 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; -import org.apache.mailet.MailAddress; public class AsyncPOP3ServerTest extends TestCase { @@ -61,12 +61,11 @@ public class AsyncPOP3ServerTest extends private POP3TestConfiguration m_testConfiguration; private MockUsersRepository m_usersRepository = new MockUsersRepository(); private POP3Client m_pop3Protocol = null; - private MailImpl testMail1; - private MailImpl testMail2; private FakeLoader serviceManager; private DNSService dnsservice; private MockFileSystem fSystem; private ProtocolHandlerChainImpl chain; + private InMemoryMailboxManager manager; public AsyncPOP3ServerTest() { super("AsyncPOP3ServerTest"); @@ -110,7 +109,17 @@ public class AsyncPOP3ServerTest extends 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(); @@ -133,12 +142,16 @@ public class AsyncPOP3ServerTest extends } protected void tearDown() throws Exception { if (m_pop3Protocol != null) { - m_pop3Protocol.sendCommand("quit"); - m_pop3Protocol.disconnect(); + if ( m_pop3Protocol.isConnected()){ + m_pop3Protocol.sendCommand("quit"); + m_pop3Protocol.disconnect(); + } } LifecycleUtil.dispose(m_mailServer); - if (testMail1 != null) testMail1.dispose(); - if (testMail2 != null) testMail2.dispose(); + + manager.deleteEverything(); + //manager.deleteAll(); + super.tearDown(); } @@ -173,8 +186,6 @@ public class AsyncPOP3ServerTest extends m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort); m_usersRepository.addUser("foo", "bar"); - InMemorySpoolRepository mockMailRepository = new InMemorySpoolRepository(); - m_mailServer.setUserInbox("foo", mockMailRepository); // not authenticated POP3MessageInfo[] entries = m_pop3Protocol.listMessages(); @@ -194,7 +205,6 @@ public class AsyncPOP3ServerTest extends assertEquals(1, m_pop3Protocol.getState()); assertNull(p3i); - LifecycleUtil.dispose(mockMailRepository); } // TODO: This currently fails with Async implementation because @@ -235,8 +245,6 @@ public class AsyncPOP3ServerTest extends finishSetUp(m_testConfiguration); m_usersRepository.addUser("foo", "bar"); - InMemorySpoolRepository mockMailRepository = new InMemorySpoolRepository(); - m_mailServer.setUserInbox("foo", mockMailRepository); m_pop3Protocol = new POP3Client(); m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort); @@ -250,20 +258,24 @@ public class AsyncPOP3ServerTest extends assertEquals("Found unexpected messages", 0, list.length); m_pop3Protocol.disconnect(); - - setupTestMails(mockMailRepository); + 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); - assertEquals("name", list[0].identifier); - assertEquals("name2", list[1].identifier); POP3MessageInfo p3i = m_pop3Protocol.listUniqueIdentifier(1); assertNotNull(p3i); - assertEquals("name", p3i.identifier); + + manager.deleteMailbox("#mail.foo.INBOX", session); + } @@ -271,9 +283,7 @@ public class AsyncPOP3ServerTest extends finishSetUp(m_testConfiguration); m_usersRepository.addUser("foo", "bar"); - InMemorySpoolRepository mockMailRepository = new InMemorySpoolRepository(); - m_mailServer.setUserInbox("foo", mockMailRepository); - + m_pop3Protocol = new POP3Client(); m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort); @@ -329,11 +339,15 @@ public class AsyncPOP3ServerTest extends m_pop3Protocol.connect("127.0.0.1",m_pop3ListenerPort); m_usersRepository.addUser("foo2", "bar2"); - InMemorySpoolRepository mailRep = new InMemorySpoolRepository(); - - setupTestMails(mailRep); - - m_mailServer.setUserInbox("foo2", mailRep); + + 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()); @@ -399,25 +413,18 @@ public class AsyncPOP3ServerTest extends Reader r3 = m_pop3Protocol.retrieveMessageTop(entries[0].number, 0); assertNotNull(r3); r3.close(); - LifecycleUtil.dispose(mailRep); + manager.deleteMailbox(mailboxName, session); } - private void setupTestMails(MailRepository mailRep) throws MessagingException { - ArrayList<MailAddress> recipients = new ArrayList<MailAddress>(); - recipients.add(new MailAddress("[email protected]")); - InputStream mw = new SharedByteArrayInputStream( - ("Return-path: [email protected]\r\n"+ + private void setupTestMails(MailboxSession session, Mailbox mailbox) throws MessagingException { + byte[] content = ("Return-path: [email protected]\r\n"+ "Content-Transfer-Encoding: plain\r\n"+ "Subject: test\r\n\r\n"+ - "Body Text POP3ServerTest.setupTestMails\r\n").getBytes()); - testMail1 = new MailImpl("name", new MailAddress("[email protected]"), - recipients, mw); - mailRep.store(testMail1); - InputStream mw2 = new SharedByteArrayInputStream( - ("EMPTY").getBytes()); - testMail2 = new MailImpl("name2", new MailAddress("[email protected]"), - recipients, mw2); - mailRep.store(testMail2); + "Body Text POP3ServerTest.setupTestMails\r\n").getBytes(); + + mailbox.appendMessage(content, new Date(), session, true, new Flags()); + byte[] content2 = ("EMPTY").getBytes(); + mailbox.appendMessage(content2, new Date(), session, true, new Flags()); } /* @@ -466,6 +473,7 @@ public class AsyncPOP3ServerTest extends } } */ + public void testIpStored() throws Exception { finishSetUp(m_testConfiguration); @@ -474,13 +482,10 @@ public class AsyncPOP3ServerTest extends String pass = "password"; m_usersRepository.addUser("foo", pass); - InMemorySpoolRepository mockMailRepository = new InMemorySpoolRepository(); - m_mailServer.setUserInbox("foo", mockMailRepository); m_pop3Protocol.login("foo", pass); assertEquals(1, m_pop3Protocol.getState()); assertTrue(POP3BeforeSMTPHelper.isAuthorized("127.0.0.1")); - LifecycleUtil.dispose(mockMailRepository); } public void testCapa() throws Exception { @@ -491,8 +496,6 @@ public class AsyncPOP3ServerTest extends String pass = "password"; m_usersRepository.addUser("foo", pass); - InMemorySpoolRepository mockMailRepository = new InMemorySpoolRepository(); - m_mailServer.setUserInbox("foo", mockMailRepository); assertEquals(POP3Reply.OK, m_pop3Protocol.sendCommand("CAPA")); @@ -512,8 +515,6 @@ public class AsyncPOP3ServerTest extends assertTrue("contains UIDL", replies.contains("UIDL")); assertTrue("contains TOP", replies.contains("TOP")); - LifecycleUtil.dispose(mockMailRepository); - } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
