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