Author: btellier
Date: Thu Dec 17 14:57:24 2015
New Revision: 1720579

URL: http://svn.apache.org/viewvc?rev=1720579&view=rev
Log:
JAMES-1618 Add STARTTLS capability advertising

Modified:
    
james/project/trunk/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/StartTlsTest.java
    
james/project/trunk/mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/capability.test
    
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Capability.java
    
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
    
james/project/trunk/protocols/managesieve/src/test/java/org/apache/james/managesieve/core/CoreProcessorTestCase.java
    
james/project/trunk/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveChannelUpstreamHandler.java
    
james/project/trunk/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServer.java
    
james/project/trunk/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServerFactory.java

Modified: 
james/project/trunk/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/StartTlsTest.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/StartTlsTest.java?rev=1720579&r1=1720578&r2=1720579&view=diff
==============================================================================
--- 
james/project/trunk/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/StartTlsTest.java
 (original)
+++ 
james/project/trunk/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/testsuite/StartTlsTest.java
 Thu Dec 17 14:57:24 2015
@@ -41,7 +41,7 @@ public class StartTlsTest extends Manage
     }
 
     @Test
-    public void noopShouldWork() throws Exception {
+    public void startTlsShouldWork() throws Exception {
         scriptTest("starttls", Locale.US);
     }
 }

Modified: 
james/project/trunk/mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/capability.test
URL: 
http://svn.apache.org/viewvc/james/project/trunk/mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/capability.test?rev=1720579&r1=1720578&r2=1720579&view=diff
==============================================================================
--- 
james/project/trunk/mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/capability.test
 (original)
+++ 
james/project/trunk/mpt/impl/managesieve/core/src/main/resources/org/apache/james/managesieve/scripts/capability.test
 Thu Dec 17 14:57:24 2015
@@ -20,6 +20,7 @@
 C: CAPABILITY
 S: "SASL" "PLAIN"
 S: "SIEVE" "log reject fileinto i;ascii-numeric envelope body"
+S: "STARTTLS"
 S: "IMPLEMENTATION" "Apache ManageSieve v1.0"
 S: "VERSION" "1.0"
 S: OK
@@ -33,6 +34,7 @@ C: CAPABILITY
 S: "OWNER" "user"
 S: "SASL" "PLAIN"
 S: "SIEVE" "log reject fileinto i;ascii-numeric envelope body"
+S: "STARTTLS"
 S: "IMPLEMENTATION" "Apache ManageSieve v1.0"
 S: "VERSION" "1.0"
 S: OK
\ No newline at end of file

Modified: 
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Capability.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Capability.java?rev=1720579&r1=1720578&r2=1720579&view=diff
==============================================================================
--- 
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Capability.java
 (original)
+++ 
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/api/commands/Capability.java
 Thu Dec 17 14:57:24 2015
@@ -41,8 +41,7 @@ public interface Capability {
         LANGUAGE,
         OWNER,
         VERSION,
-        UNAUTHENTICATE,
-        GETACTIVE
+        UNAUTHENTICATE
     }
 
 }

Modified: 
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java?rev=1720579&r1=1720578&r2=1720579&view=diff
==============================================================================
--- 
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
 (original)
+++ 
james/project/trunk/protocols/managesieve/src/main/java/org/apache/james/managesieve/core/CoreProcessor.java
 Thu Dec 17 14:57:24 2015
@@ -303,6 +303,7 @@ public class CoreProcessor implements Co
         capabilitiesBase.put(Capabilities.IMPLEMENTATION, 
IMPLEMENTATION_DESCRIPTION);
         capabilitiesBase.put(Capabilities.VERSION, MANAGE_SIEVE_VERSION);
         capabilitiesBase.put(Capabilities.SASL, 
constructSaslSupportedAuthenticationMechanisms());
+        capabilitiesBase.put(Capabilities.STARTTLS, null);
         if (!extensions.isEmpty()) {
             capabilitiesBase.put(Capabilities.SIEVE, extensions);
         }

Modified: 
james/project/trunk/protocols/managesieve/src/test/java/org/apache/james/managesieve/core/CoreProcessorTestCase.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/protocols/managesieve/src/test/java/org/apache/james/managesieve/core/CoreProcessorTestCase.java?rev=1720579&r1=1720578&r2=1720579&view=diff
==============================================================================
--- 
james/project/trunk/protocols/managesieve/src/test/java/org/apache/james/managesieve/core/CoreProcessorTestCase.java
 (original)
+++ 
james/project/trunk/protocols/managesieve/src/test/java/org/apache/james/managesieve/core/CoreProcessorTestCase.java
 Thu Dec 17 14:57:24 2015
@@ -103,7 +103,8 @@ public class CoreProcessorTestCase {
             .containsEntry(Capabilities.VERSION, 
CoreProcessor.MANAGE_SIEVE_VERSION)
             .containsEntry(Capabilities.SIEVE, "a b c")
             .containsEntry(Capabilities.OWNER, USER)
-            .containsEntry(Capabilities.SASL, 
Authenticate.SupportedMechanism.PLAIN.toString());
+            .containsEntry(Capabilities.SASL, 
Authenticate.SupportedMechanism.PLAIN.toString())
+            .containsKey(Capabilities.STARTTLS);
     }
 
     @Test(expected = AuthenticationRequiredException.class)

Modified: 
james/project/trunk/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveChannelUpstreamHandler.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveChannelUpstreamHandler.java?rev=1720579&r1=1720578&r2=1720579&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveChannelUpstreamHandler.java
 (original)
+++ 
james/project/trunk/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveChannelUpstreamHandler.java
 Thu Dec 17 14:57:24 2015
@@ -51,13 +51,16 @@ public class ManageSieveChannelUpstreamH
     private final ManageSieveProcessor manageSieveProcessor;
     private final SSLContext sslContext;
     private final String[] enabledCipherSuites;
+    private final boolean sslServer;
 
-    public ManageSieveChannelUpstreamHandler(ManageSieveProcessor 
manageSieveProcessor, SSLContext sslContext, String[] enabledCipherSuites, 
Logger logger) {
+    public ManageSieveChannelUpstreamHandler(ManageSieveProcessor 
manageSieveProcessor, SSLContext sslContext,
+                                             String[] enabledCipherSuites, 
boolean sslServer, Logger logger) {
         this.logger = logger;
         this.attributes = new ChannelLocal<Session>();
         this.manageSieveProcessor = manageSieveProcessor;
         this.sslContext = sslContext;
         this.enabledCipherSuites = enabledCipherSuites;
+        this.sslServer = sslServer;
     }
 
     @Override
@@ -66,12 +69,17 @@ public class ManageSieveChannelUpstreamH
         Session manageSieveSession = attributes.get(ctx.getChannel());
         String responseString = 
manageSieveProcessor.handleRequest(manageSieveSession, request);
         
((ChannelManageSieveResponseWriter)ctx.getAttachment()).write(responseString);
+        if (manageSieveSession.getState() == Session.State.SSL_NEGOCIATION) {
+            turnSSLon(ctx.getChannel());
+            manageSieveSession.setSslEnabled(true);
+            manageSieveSession.setState(Session.State.UNAUTHENTICATED);
+        }
     }
 
     @Override
     public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) 
throws Exception {
-        getLogger(ctx.getChannel()).warn("Error while processing imap request: 
" + e.getCause().getClass().getName() + " - " + e.getCause().getMessage());
-        getLogger(ctx.getChannel()).debug("Error while processing imap 
request", e.getCause());
+        getLogger(ctx.getChannel()).warn("Error while processing ManageSieve 
request: " + e.getCause().getClass().getName() + " - " + 
e.getCause().getMessage());
+        getLogger(ctx.getChannel()).debug("Error while processing ManageSieve 
request", e.getCause());
 
         if (e.getCause() instanceof TooLongFrameException) {
             // Max line length exceeded
@@ -80,8 +88,6 @@ public class ManageSieveChannelUpstreamH
         } else if (e.getCause() instanceof SessionTerminatedException) {
             ((ChannelManageSieveResponseWriter)ctx.getAttachment()).write("OK 
channel is closing");
             logout(ctx);
-        } else {
-            logout(ctx);
         }
     }
 
@@ -97,7 +103,14 @@ public class ManageSieveChannelUpstreamH
 
     @Override
     public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent 
e) throws Exception {
-        attributes.set(ctx.getChannel(), new SettableSession());
+        InetSocketAddress address = (InetSocketAddress) 
ctx.getChannel().getRemoteAddress();
+        getLogger(ctx.getChannel()).info("Connection established from " + 
address.getAddress().getHostAddress());
+
+        Session session = new SettableSession();
+        if (sslServer) {
+            session.setSslEnabled(true);
+        }
+        attributes.set(ctx.getChannel(), session);
         ctx.setAttachment(new 
ChannelManageSieveResponseWriter(ctx.getChannel()));
         super.channelBound(ctx, e);
     }
@@ -106,6 +119,7 @@ public class ManageSieveChannelUpstreamH
     public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) 
throws Exception {
         InetSocketAddress address = (InetSocketAddress) 
ctx.getChannel().getRemoteAddress();
         getLogger(ctx.getChannel()).info("Connection closed for " + 
address.getAddress().getHostAddress());
+
         attributes.remove(ctx.getChannel());
         super.channelClosed(ctx, e);
     }
@@ -115,15 +129,15 @@ public class ManageSieveChannelUpstreamH
     }
 
     private void turnSSLon(Channel channel) {
-        channel.setReadable(false);
-
-        SslHandler filter = new SslHandler(sslContext.createSSLEngine(), 
false);
-        filter.getEngine().setUseClientMode(false);
-        if (enabledCipherSuites != null && enabledCipherSuites.length > 0) {
-            filter.getEngine().setEnabledCipherSuites(enabledCipherSuites);
+        if (sslContext != null) {
+            channel.setReadable(false);
+            SslHandler filter = new SslHandler(sslContext.createSSLEngine(), 
false);
+            filter.getEngine().setUseClientMode(false);
+            if (enabledCipherSuites != null && enabledCipherSuites.length > 0) 
{
+                filter.getEngine().setEnabledCipherSuites(enabledCipherSuites);
+            }
+            channel.getPipeline().addFirst(SSL_HANDLER, filter);
+            channel.setReadable(true);
         }
-        channel.getPipeline().addFirst(SSL_HANDLER, filter);
-
-        channel.setReadable(true);
     }
 }

Modified: 
james/project/trunk/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServer.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServer.java?rev=1720579&r1=1720578&r2=1720579&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServer.java
 (original)
+++ 
james/project/trunk/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServer.java
 Thu Dec 17 14:57:24 2015
@@ -58,7 +58,6 @@ public class ManageSieveServer extends A
     final static String CHUNK_WRITE_HANDLER = "chunkWriteHandler";
     final static String EXECUTION_HANDLER = "executionHandler";
 
-
     private int maxLineLength;
     private ManageSieveProcessor manageSieveProcessor;
 
@@ -79,7 +78,16 @@ public class ManageSieveServer extends A
 
     @Override
     protected ChannelUpstreamHandler createCoreHandler() {
-        return new ManageSieveChannelUpstreamHandler(manageSieveProcessor, 
getEncryption().getContext(), getEnabledCipherSuites(), LOGGER);
+        return new ManageSieveChannelUpstreamHandler(manageSieveProcessor,
+            getEncryption() == null ? null : getEncryption().getContext(),
+            getEnabledCipherSuites(),
+            isSSL(),
+            LOGGER);
+    }
+
+    private boolean isSSL() {
+        return getEncryption() != null
+            && !getEncryption().isStartTLS();
     }
 
     @Override

Modified: 
james/project/trunk/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServerFactory.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServerFactory.java?rev=1720579&r1=1720578&r2=1720579&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServerFactory.java
 (original)
+++ 
james/project/trunk/server/protocols/protocols-managesieve/src/main/java/org/apache/james/managesieveserver/netty/ManageSieveServerFactory.java
 Thu Dec 17 14:57:24 2015
@@ -21,6 +21,9 @@ package org.apache.james.managesieveserv
 
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.james.filesystem.api.FileSystem;
+import org.apache.james.managesieve.core.CoreProcessor;
+import org.apache.james.managesieve.jsieve.Parser;
+import org.apache.james.managesieve.transcode.ArgumentParser;
 import org.apache.james.managesieve.transcode.ManageSieveProcessor;
 import org.apache.james.protocols.lib.netty.AbstractConfigurableAsyncServer;
 import org.apache.james.protocols.lib.netty.AbstractServerFactory;
@@ -34,23 +37,12 @@ import java.util.List;
 
 public class ManageSieveServerFactory extends AbstractServerFactory {
 
-    private SieveRepository sieveRepository;
-    private UsersRepository usersRepository;
     private FileSystem fileSystem;
     private ManageSieveProcessor manageSieveProcessor;
 
-    public ManageSieveServerFactory() {
-        this.manageSieveProcessor = new ManageSieveProcessor();
-    }
-
-    @Inject
-    public void setSieveRepository(SieveRepository sieveRepository) {
-        this.sieveRepository = sieveRepository;
-    }
-
     @Inject
-    public void setUsersRepository(UsersRepository usersRepository) {
-        this.usersRepository = usersRepository;
+    public void setManageSieveProcessor(ManageSieveProcessor 
manageSieveProcessor) {
+        this.manageSieveProcessor = manageSieveProcessor;
     }
 
     @Inject



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

Reply via email to