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: [email protected]
For additional commands, e-mail: [email protected]