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