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/06/28 21:45:31 UTC

svn commit: r958692 - in /james/imap/trunk: api/src/main/java/org/apache/james/imap/api/ api/src/main/java/org/apache/james/imap/api/display/ api/src/main/java/org/apache/james/imap/api/process/ decode/src/main/java/org/apache/james/imap/decode/main/ m...

Author: norman
Date: Mon Jun 28 19:45:30 2010
New Revision: 958692

URL: http://svn.apache.org/viewvc?rev=958692&view=rev
Log:
Add support for STARTTLS (IMAP-169)

Added:
    james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/StartTLSRequest.java
    james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StartTLSProcessor.java
Modified:
    james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java
    james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapMessageFactory.java
    james/imap/trunk/api/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java
    james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/ImapSession.java
    james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/main/DefaultImapDecoder.java
    james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/CapabilityResponseEncoder.java
    james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/BaseImap4Rev1MessageFactory.java
    james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/FakeImapSession.java
    james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
    james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java
    james/imap/trunk/seda/src/main/java/org/apache/james/imap/main/ImapSessionImpl.java

Modified: james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java?rev=958692&r1=958691&r2=958692&view=diff
==============================================================================
--- james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java (original)
+++ james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java Mon Jun 28 19:45:30 2010
@@ -242,4 +242,6 @@ public interface ImapConstants {
     public static final String FETCH_BODY_STRUCTURE = "BODYSTRUCTURE";
 
     public static final String FETCH_BODY = "BODY";
+    
+    public static final String STARTTLS = "STARTTLS";
 }

Modified: james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapMessageFactory.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapMessageFactory.java?rev=958692&r1=958691&r2=958692&view=diff
==============================================================================
--- james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapMessageFactory.java (original)
+++ james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapMessageFactory.java Mon Jun 28 19:45:30 2010
@@ -128,4 +128,6 @@ public interface ImapMessageFactory {
             final String mailboxName, final String tag);
     
     public ImapMessage createNamespaceMessage(final ImapCommand command, final String tag);
+    
+    public ImapMessage createStartTLSMessage(final ImapCommand command, final String tag);
 }

Modified: james/imap/trunk/api/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/api/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java?rev=958692&r1=958691&r2=958692&view=diff
==============================================================================
--- james/imap/trunk/api/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java (original)
+++ james/imap/trunk/api/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java Mon Jun 28 19:45:30 2010
@@ -28,6 +28,9 @@ import org.apache.james.imap.api.ImapCon
  */
 public class HumanReadableText {
 
+    public static final HumanReadableText STARTTLS = new HumanReadableText(
+            "org.apache.james.imap.STARTTLS", "OK Begin TLS negotiation now.");
+    
     public static final HumanReadableText SELECT = new HumanReadableText(
             "org.apache.james.imap.SELECT", "completed.");
 

Modified: james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/ImapSession.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/ImapSession.java?rev=958692&r1=958691&r2=958692&view=diff
==============================================================================
--- james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/ImapSession.java (original)
+++ james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/ImapSession.java Mon Jun 28 19:45:30 2010
@@ -106,4 +106,13 @@ public interface ImapSession {
      *            unvalued
      */
     public void setAttribute(String key, Object value);
+    
+    /**
+     * Start TLS encryption of the session
+     * 
+     * @return true if the encryption of the session was successfully
+     */
+    public boolean startTLS();
+    
+    
 }

Modified: james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/main/DefaultImapDecoder.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/main/DefaultImapDecoder.java?rev=958692&r1=958691&r2=958692&view=diff
==============================================================================
--- james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/main/DefaultImapDecoder.java (original)
+++ james/imap/trunk/decode/src/main/java/org/apache/james/imap/decode/main/DefaultImapDecoder.java Mon Jun 28 19:45:30 2010
@@ -31,6 +31,11 @@ import org.apache.james.imap.decode.Imap
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.base.AbstractImapCommandParser;
 
+/**
+ * {@link ImapDecoder} implementation which parse the data via lookup the right {@link ImapCommandParser} via an {@link ImapCommandParserFactory}. The 
+ * response will get generated via the {@link ImapMessageFactory}.
+ *
+ */
 public class DefaultImapDecoder implements ImapDecoder {
 
     private final ImapMessageFactory messageFactory;
@@ -43,6 +48,10 @@ public class DefaultImapDecoder implemen
         this.imapCommands = imapCommands;
     }
     
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.decode.ImapDecoder#decode(org.apache.james.imap.decode.ImapRequestLineReader, org.apache.james.imap.api.process.ImapSession)
+     */
     public ImapMessage decode(ImapRequestLineReader request, ImapSession session) {
         ImapMessage message;
         final Log logger = session.getLog();
@@ -62,6 +71,7 @@ public class DefaultImapDecoder implemen
         return message;
     }
 
+    
     private ImapMessage decodeCommandTagged(
             final ImapRequestLineReader request, final Log logger,
             final String tag, final ImapSession session) {

Modified: james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/CapabilityResponseEncoder.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/CapabilityResponseEncoder.java?rev=958692&r1=958691&r2=958692&view=diff
==============================================================================
--- james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/CapabilityResponseEncoder.java (original)
+++ james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/CapabilityResponseEncoder.java Mon Jun 28 19:45:30 2010
@@ -36,12 +36,20 @@ public class CapabilityResponseEncoder e
         super(next);
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.encode.base.AbstractChainedImapEncoder#doEncode(org.apache.james.imap.api.ImapMessage, org.apache.james.imap.encode.ImapResponseComposer, org.apache.james.imap.api.process.ImapSession)
+     */
     protected void doEncode(ImapMessage acceptableMessage,
             ImapResponseComposer composer, ImapSession session) throws IOException {
         final CapabilityResponse response = (CapabilityResponse) acceptableMessage;
         composer.capabilities(response.getCapabilities());
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.encode.base.AbstractChainedImapEncoder#isAcceptable(org.apache.james.imap.api.ImapMessage)
+     */
     protected boolean isAcceptable(ImapMessage message) {
         return (message instanceof CapabilityResponse);
     }

Modified: james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/BaseImap4Rev1MessageFactory.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/BaseImap4Rev1MessageFactory.java?rev=958692&r1=958691&r2=958692&view=diff
==============================================================================
--- james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/BaseImap4Rev1MessageFactory.java (original)
+++ james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/BaseImap4Rev1MessageFactory.java Mon Jun 28 19:45:30 2010
@@ -274,7 +274,15 @@ public class BaseImap4Rev1MessageFactory
      * (non-Javadoc)
      * @see org.apache.james.imap.api.ImapMessageFactory#createNamespaceMessage(org.apache.james.imap.api.ImapCommand, java.lang.String)
      */
-	public ImapMessage createNamespaceMessage(ImapCommand command, String tag) {
-		return new NamespaceRequest(command, tag);
-	}
+    public ImapMessage createNamespaceMessage(ImapCommand command, String tag) {
+        return new NamespaceRequest(command, tag);
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.api.ImapMessageFactory#createStartTLSMessage(org.apache.james.imap.api.ImapCommand, java.lang.String)
+     */
+    public ImapMessage createStartTLSMessage(ImapCommand command, String tag) {
+        return new StartTLSRequest(tag, command);
+    }
 }

Added: james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/StartTLSRequest.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/StartTLSRequest.java?rev=958692&view=auto
==============================================================================
--- james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/StartTLSRequest.java (added)
+++ james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/StartTLSRequest.java Mon Jun 28 19:45:30 2010
@@ -0,0 +1,33 @@
+/****************************************************************
+ * 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.imap.message.request;
+
+import org.apache.james.imap.api.ImapCommand;
+
+/**
+ * Request for STARTTLS
+ *
+ */
+public class StartTLSRequest extends AbstractImapRequest{
+
+    public StartTLSRequest(String tag, ImapCommand command) {
+        super(tag, command);
+    }
+
+}

Modified: james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/FakeImapSession.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/FakeImapSession.java?rev=958692&r1=958691&r2=958692&view=diff
==============================================================================
--- james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/FakeImapSession.java (original)
+++ james/imap/trunk/message/src/test/java/org/apache/james/imap/encode/FakeImapSession.java Mon Jun 28 19:45:30 2010
@@ -93,4 +93,9 @@ public class FakeImapSession implements 
         return LOG;
     }
 
+    
+    public boolean startTLS() {
+        return false;
+    }
+
 }

Modified: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java?rev=958692&r1=958691&r2=958692&view=diff
==============================================================================
--- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java (original)
+++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java Mon Jun 28 19:45:30 2010
@@ -38,6 +38,13 @@ public class DefaultProcessorChain {
             final ImapProcessor chainEndProcessor,
             final MailboxManager mailboxManager,
             final StatusResponseFactory statusResponseFactory) {
+        return createStartTLSSupportingChain(chainEndProcessor, mailboxManager, statusResponseFactory, false);
+    }
+    
+    public static final ImapProcessor createStartTLSSupportingChain(
+            final ImapProcessor chainEndProcessor,
+            final MailboxManager mailboxManager,
+            final StatusResponseFactory statusResponseFactory, final boolean supportStartTLS) {
         final SystemMessageProcessor systemProcessor = new SystemMessageProcessor(chainEndProcessor, mailboxManager);
         final LogoutProcessor logoutProcessor = new LogoutProcessor(
                 systemProcessor, mailboxManager, statusResponseFactory);
@@ -46,6 +53,9 @@ public class DefaultProcessorChain {
         capabilities.add(SUPPORTS_LITERAL_PLUS);
         capabilities.add(SUPPORTS_NAMESPACES);
         capabilities.add(SUPPORTS_RFC3348);
+        if (supportStartTLS) {
+            capabilities.add(STARTTLS);
+        }
         final CapabilityProcessor capabilityProcessor = new CapabilityProcessor(
                 logoutProcessor, mailboxManager, statusResponseFactory, capabilities);
         final CheckProcessor checkProcessor = new CheckProcessor(
@@ -93,8 +103,14 @@ public class DefaultProcessorChain {
                 searchProcessor, mailboxManager, statusResponseFactory);
         final NamespaceProcessor namespaceProcessor = new NamespaceProcessor(
                 selectProcessor, mailboxManager, statusResponseFactory);
-        final ImapProcessor result = new FetchProcessor(namespaceProcessor,
+        final ImapProcessor fetchProcessor = new FetchProcessor(namespaceProcessor,
                 mailboxManager, statusResponseFactory);
-        return result;
+        if (supportStartTLS) {
+            final ImapProcessor startTLSProcessor = new StartTLSProcessor(fetchProcessor, statusResponseFactory);
+            return startTLSProcessor;
+        } else {
+            return fetchProcessor;
+        }
+        
     }
 }

Added: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StartTLSProcessor.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StartTLSProcessor.java?rev=958692&view=auto
==============================================================================
--- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StartTLSProcessor.java (added)
+++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StartTLSProcessor.java Mon Jun 28 19:45:30 2010
@@ -0,0 +1,58 @@
+/****************************************************************
+ * 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.imap.processor;
+
+import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.display.HumanReadableText;
+import org.apache.james.imap.api.message.request.ImapRequest;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
+import org.apache.james.imap.api.process.ImapProcessor;
+import org.apache.james.imap.api.process.ImapSession;
+import org.apache.james.imap.message.request.StartTLSRequest;
+import org.apache.james.imap.processor.base.AbstractChainedProcessor;
+
+/**
+ *
+ * Processing STARTLS commands
+ *
+ */
+public class StartTLSProcessor extends AbstractChainedProcessor{
+
+    private StatusResponseFactory factory;
+
+    public StartTLSProcessor(final ImapProcessor next, final StatusResponseFactory factory) {
+        super(next);
+        this.factory = factory;
+    }
+
+    @Override
+    protected void doProcess(ImapMessage acceptableMessage,
+            Responder responder, ImapSession session) {
+        ImapRequest request = (ImapRequest) acceptableMessage;       
+        responder.respond(factory.taggedOk(request.getTag(), request.getCommand(), HumanReadableText.STARTTLS));
+        session.startTLS();
+
+    }
+
+    @Override
+    protected boolean isAcceptable(ImapMessage message) {
+        return message instanceof StartTLSRequest;
+    }
+
+}

Modified: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java?rev=958692&r1=958691&r2=958692&view=diff
==============================================================================
--- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java (original)
+++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java Mon Jun 28 19:45:30 2010
@@ -59,6 +59,10 @@ public class DefaultImapProcessorFactory
         this.mailboxManager = mailboxManager;
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.api.process.ImapProcessorFactory#buildImapProcessor()
+     */
     public ImapProcessor buildImapProcessor() {
         return createDefaultProcessor(mailboxManager);
     }

Modified: james/imap/trunk/seda/src/main/java/org/apache/james/imap/main/ImapSessionImpl.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/seda/src/main/java/org/apache/james/imap/main/ImapSessionImpl.java?rev=958692&r1=958691&r2=958692&view=diff
==============================================================================
--- james/imap/trunk/seda/src/main/java/org/apache/james/imap/main/ImapSessionImpl.java (original)
+++ james/imap/trunk/seda/src/main/java/org/apache/james/imap/main/ImapSessionImpl.java Mon Jun 28 19:45:30 2010
@@ -32,7 +32,7 @@ import org.apache.james.imap.api.process
 /**
  * Implements a session.
  */
-public final class ImapSessionImpl implements ImapSession, ImapConstants {
+public class ImapSessionImpl implements ImapSession, ImapConstants {
     private static final Log IMAP_LOG = LogFactory.getLog("org.apache.james.imap");
 
     private Log log = IMAP_LOG;
@@ -44,42 +44,73 @@ public final class ImapSessionImpl imple
     private final Map<String, Object> attributesByKey;
 
     public ImapSessionImpl() {
-        this.attributesByKey = new ConcurrentHashMap<String, Object>();
+        this.attributesByKey = new ConcurrentHashMap<String, Object>();    
     }
 
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.api.process.ImapSession#getLog()
+     */
     public Log getLog() {
         return log;
     }
     
+    /*
+     * 
+     */
     public void setLog(Log log) {
         this.log = log;
     }
     
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.api.process.ImapSession#logout()
+     */
     public void logout() {
         closeMailbox();
         state = ImapSessionState.LOGOUT;
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.api.process.ImapSession#authenticated()
+     */
     public void authenticated() {
         this.state = ImapSessionState.AUTHENTICATED;
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.api.process.ImapSession#deselect()
+     */
     public void deselect() {
         this.state = ImapSessionState.AUTHENTICATED;
         closeMailbox();
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.api.process.ImapSession#selected(org.apache.james.imap.api.process.SelectedMailbox)
+     */
     public void selected(SelectedMailbox mailbox) {
         this.state = ImapSessionState.SELECTED;
         closeMailbox();
         this.selectedMailbox = mailbox;
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.api.process.ImapSession#getSelected()
+     */
     public SelectedMailbox getSelected() {
         return this.selectedMailbox;
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.api.process.ImapSession#getState()
+     */
     public ImapSessionState getState() {
         return this.state;
     }
@@ -92,11 +123,19 @@ public final class ImapSessionImpl imple
 
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.api.process.ImapSession#getAttribute(java.lang.String)
+     */
     public Object getAttribute(String key) {
         final Object result = attributesByKey.get(key);
         return result;
     }
 
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.api.process.ImapSession#setAttribute(java.lang.String, java.lang.Object)
+     */
     public void setAttribute(String key, Object value) {
         if (value == null) {
             attributesByKey.remove(key);
@@ -104,4 +143,14 @@ public final class ImapSessionImpl imple
             attributesByKey.put(key, value);
         }
     }
+
+
+    /**
+     * StartTLS is not supported by this implementation
+     * 
+     * return false
+     */
+    public boolean startTLS() {
+        return false;
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org