diff --git a/config/alfresco/subsystems/imap/default/imap-server-context.xml b/config/alfresco/subsystems/imap/default/imap-server-context.xml index 8272d4a439..1ab31a05b2 100644 --- a/config/alfresco/subsystems/imap/default/imap-server-context.xml +++ b/config/alfresco/subsystems/imap/default/imap-server-context.xml @@ -16,6 +16,12 @@ ${imap.server.port} + + ${imap.server.imaps.enabled} + + + ${imap.server.imaps.port} + ${imap.server.enabled} diff --git a/config/alfresco/subsystems/imap/default/imap-server.properties b/config/alfresco/subsystems/imap/default/imap-server.properties index 73f046d6a5..baaae4d1f5 100644 --- a/config/alfresco/subsystems/imap/default/imap-server.properties +++ b/config/alfresco/subsystems/imap/default/imap-server.properties @@ -1,5 +1,4 @@ imap.server.enabled=false -imap.server.port=143 imap.server.host=0.0.0.0 imap.server.folder.cache.size=10000 @@ -9,3 +8,14 @@ imap.mail.to.default=alfresco@demo.alfresco.org imap.config.home.store=${protocols.storeName} imap.config.home.rootPath=${protocols.rootPath} imap.config.home.folderPath=Imap Home + +# IMAP Port +imap.server.port=143 +imap.server.imap.enabled=true + +# IMAPS Port +# Keystore used for IMAPS is defined by the following Java system properties. +# javax.net.ssl.keyStore=mySrvKeystore +# javax.net.ssl.keyStorePassword=123456 +imap.server.imaps.enabled=false +imap.server.imaps.port=993 diff --git a/source/java/org/alfresco/email/server/EmailServer.java b/source/java/org/alfresco/email/server/EmailServer.java index de8abcc95c..009d8f7162 100644 --- a/source/java/org/alfresco/email/server/EmailServer.java +++ b/source/java/org/alfresco/email/server/EmailServer.java @@ -332,6 +332,12 @@ public abstract class EmailServer extends AbstractLifecycleBean System.err.println("\t configLocation - spring xml configs with EmailServer related beans (emailServer, emailServerConfiguration, emailService)"); } + /** + * authenticate with a user/password + * @param userName + * @param password + * @return true - authenticated + */ protected boolean authenticateUserNamePassword(String userName, char[] password) { try diff --git a/source/java/org/alfresco/repo/imap/AlfrescoImapServer.java b/source/java/org/alfresco/repo/imap/AlfrescoImapServer.java index b2bea3a49e..5ee136f2aa 100644 --- a/source/java/org/alfresco/repo/imap/AlfrescoImapServer.java +++ b/source/java/org/alfresco/repo/imap/AlfrescoImapServer.java @@ -18,8 +18,9 @@ */ package org.alfresco.repo.imap; -import org.alfresco.repo.security.authentication.AuthenticationUtil; -import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; +import java.io.IOException; +import java.net.ServerSocket; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.context.ApplicationEvent; @@ -28,21 +29,78 @@ import org.springframework.extensions.surf.util.AbstractLifecycleBean; import com.icegreen.greenmail.Managers; import com.icegreen.greenmail.imap.ImapHostManager; import com.icegreen.greenmail.imap.ImapServer; -import com.icegreen.greenmail.store.FolderException; import com.icegreen.greenmail.user.UserManager; import com.icegreen.greenmail.util.ServerSetup; +import javax.net.ssl.SSLServerSocketFactory; +import javax.net.ssl.SSLServerSocket; /** * @author Mike Shavnev */ public class AlfrescoImapServer extends AbstractLifecycleBean { + private class SecureImapServer extends ImapServer + { + + public SecureImapServer(ServerSetup setup, Managers managers) + { + super(setup, managers); + } + + /** + * @override + * Use Java's default SSL Server SocketFactory + * controlled via System Properties + * -Djavax.net.ssl.keyStore=mySrvKeystore + * -Djavax.net.ssl.keyStorePassword=123456 + */ + // MER - also consider using SSLContext + protected synchronized ServerSocket openServerSocket() throws IOException { + ServerSocket ret; + if (setup.isSecure()) + { + try + { + ret = (SSLServerSocket) SSLServerSocketFactory.getDefault().createServerSocket( + setup.getPort(), 0, bindTo); + } + catch (IOException e) + { + if(logger.isErrorEnabled()) + { + logger.error("Unable to open socket bindTo:" + bindTo + "port " + setup.getPort(), e); + } + throw e; + } + } + else + { + try + { + ret = new ServerSocket(setup.getPort(), 0, bindTo); + } + catch (IOException e) + { + if(logger.isErrorEnabled()) + { + logger.error("Unable to open socket bindTo:" + bindTo + "port " + setup.getPort(), e); + } + throw e; + } + } + return ret; + } + } private static Log logger = LogFactory.getLog(AlfrescoImapServer.class); private ImapServer serverImpl; + private ImapServer secureServerImpl; private int port = 143; + private int securePort = 993; + private boolean imapsEnabled = false; + private String host = "0.0.0.0"; private UserManager imapUserManager; @@ -75,6 +133,16 @@ public class AlfrescoImapServer extends AbstractLifecycleBean { return port; } + + public void setSecurePort(int securePort) + { + this.securePort = securePort; + } + + public int getSecurePort() + { + return securePort; + } public String getHost() { @@ -132,11 +200,21 @@ public class AlfrescoImapServer extends AbstractLifecycleBean serverImpl = new ImapServer(new ServerSetup(port, host, ServerSetup.PROTOCOL_IMAP), imapManagers); serverImpl.startService(null); - + if (logger.isInfoEnabled()) { - logger.info("IMAP service started on host:port " + host + ":" + this.port + "."); + logger.info("IMAP service started on host:port " + host + ":" + this.port); } + if(isImapsEnabled()) + { + secureServerImpl = new SecureImapServer(new ServerSetup(securePort, host, ServerSetup.PROTOCOL_IMAPS), imapManagers); + secureServerImpl.startService(null); + if (logger.isInfoEnabled()) + { + logger.info("IMAPS service started on host:port " + host + ":" + this.securePort ); + } + } + } else { @@ -157,6 +235,24 @@ public class AlfrescoImapServer extends AbstractLifecycleBean } serverImpl.stopService(null); } + + if (secureServerImpl != null) + { + if (logger.isDebugEnabled()) + { + logger.debug("IMAPS service stopping."); + } + secureServerImpl.stopService(null); + } } + public void setImapsEnabled(boolean imapsEnabled) + { + this.imapsEnabled = imapsEnabled; + } + + public boolean isImapsEnabled() + { + return imapsEnabled; + } }