From f9427feaf5ee47b279119dd1db08e80ba046a51e Mon Sep 17 00:00:00 2001 From: mguessan Date: Wed, 1 Sep 2010 00:15:36 +0000 Subject: [PATCH] IMAP: implement shared mailbox access git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1402 3d1905a2-6b24-0410-a738-b14d5a86fcbd --- .../exchange/dav/DavExchangeSession.java | 2 +- src/java/davmail/imap/ImapConnection.java | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/java/davmail/exchange/dav/DavExchangeSession.java b/src/java/davmail/exchange/dav/DavExchangeSession.java index f52a5dd2..bc5e7fca 100644 --- a/src/java/davmail/exchange/dav/DavExchangeSession.java +++ b/src/java/davmail/exchange/dav/DavExchangeSession.java @@ -142,7 +142,7 @@ public class DavExchangeSession extends ExchangeSession { if (principalIndex >= 0) { principal = folderPath.substring(USERS.length(), principalIndex); localPath = folderPath.substring(USERS.length() + principal.length() + 1); - if (localPath.startsWith(LOWER_CASE_INBOX)) { + if (localPath.startsWith(LOWER_CASE_INBOX) || localPath.startsWith(INBOX)) { localPath = inboxName + localPath.substring(LOWER_CASE_INBOX.length()); } else if (localPath.startsWith(CALENDAR)) { localPath = calendarName + localPath.substring(CALENDAR.length()); diff --git a/src/java/davmail/imap/ImapConnection.java b/src/java/davmail/imap/ImapConnection.java index 2ae004cc..0696ff99 100644 --- a/src/java/davmail/imap/ImapConnection.java +++ b/src/java/davmail/imap/ImapConnection.java @@ -53,6 +53,7 @@ import java.util.*; public class ImapConnection extends AbstractConnection { private static final Logger LOGGER = Logger.getLogger(ImapConnection.class); + protected String baseMailboxPath; ExchangeSession.Folder currentFolder; /** @@ -102,6 +103,8 @@ public class ImapConnection extends AbstractConnection { sendClient(commandId + " OK CAPABILITY completed"); } else if ("login".equalsIgnoreCase(command)) { parseCredentials(tokens); + // detect shared mailbox access + splitUserName(); try { session = ExchangeSessionFactory.getInstance(userName, password); sendClient(commandId + " OK Authenticated"); @@ -119,6 +122,8 @@ public class ImapConnection extends AbstractConnection { sendClient("+ " + base64Encode("Username:")); state = State.LOGIN; userName = base64Decode(readClient()); + // detect shared mailbox access + splitUserName(); sendClient("+ " + base64Encode("Password:")); state = State.PASSWORD; password = base64Decode(readClient()); @@ -145,6 +150,9 @@ public class ImapConnection extends AbstractConnection { if ("lsub".equalsIgnoreCase(command) || "list".equalsIgnoreCase(command)) { if (tokens.hasMoreTokens()) { String folderContext = BASE64MailboxDecoder.decode(tokens.nextToken()); + if (baseMailboxPath != null) { + folderContext = baseMailboxPath + folderContext; + } if (tokens.hasMoreTokens()) { String folderQuery = folderContext + BASE64MailboxDecoder.decode(tokens.nextToken()); if (folderQuery.endsWith("%/%") && !"/%/%".equals(folderQuery)) { @@ -198,6 +206,9 @@ public class ImapConnection extends AbstractConnection { } else if ("select".equalsIgnoreCase(command) || "examine".equalsIgnoreCase(command)) { if (tokens.hasMoreTokens()) { String folderName = BASE64MailboxDecoder.decode(tokens.nextToken()); + if (baseMailboxPath != null && !folderName.startsWith("/")) { + folderName = baseMailboxPath + folderName; + } try { currentFolder = session.getFolder(folderName); currentFolder.loadMessages(); @@ -578,6 +589,24 @@ public class ImapConnection extends AbstractConnection { DavGatewayTray.resetIcon(); } + /** + * Detect shared mailbox access. + * see http://msexchangeteam.com/archive/2004/03/31/105275.aspx + */ + protected void splitUserName() { + String[] tokens = null; + if (userName.indexOf('/') >= 0) { + tokens = userName.split("/"); + } else if (userName.indexOf('\\') >= 0) { + tokens = userName.split("\\\\"); + } + + if (tokens != null && tokens.length == 3) { + userName = tokens[0] + '\\' + tokens[1]; + baseMailboxPath = "/users/" + tokens[2] + '/'; + } + } + /** * Send expunge untagged response for removed IMAP message uids. *