mirror of
https://github.com/moparisthebest/davmail
synced 2024-12-13 11:12:22 -05:00
EWS: fix Caldav inbox handling over EWS
git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1583 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
parent
5dbd82753b
commit
1615f4991b
@ -40,6 +40,8 @@ import org.htmlcleaner.TagNode;
|
|||||||
import javax.mail.MessagingException;
|
import javax.mail.MessagingException;
|
||||||
import javax.mail.internet.InternetAddress;
|
import javax.mail.internet.InternetAddress;
|
||||||
import javax.mail.internet.MimeMessage;
|
import javax.mail.internet.MimeMessage;
|
||||||
|
import javax.mail.internet.MimeMultipart;
|
||||||
|
import javax.mail.internet.MimePart;
|
||||||
import javax.mail.util.SharedByteArrayInputStream;
|
import javax.mail.util.SharedByteArrayInputStream;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.NoRouteToHostException;
|
import java.net.NoRouteToHostException;
|
||||||
@ -2107,6 +2109,66 @@ public abstract class ExchangeSession {
|
|||||||
*/
|
*/
|
||||||
public abstract byte[] getEventContent() throws IOException;
|
public abstract byte[] getEventContent() throws IOException;
|
||||||
|
|
||||||
|
protected static final String TEXT_CALENDAR = "text/calendar";
|
||||||
|
protected static final String APPLICATION_ICS = "application/ics";
|
||||||
|
|
||||||
|
protected boolean isCalendarContentType(String contentType) {
|
||||||
|
return TEXT_CALENDAR.regionMatches(true, 0, contentType, 0, TEXT_CALENDAR.length()) ||
|
||||||
|
APPLICATION_ICS.regionMatches(true, 0, contentType, 0, APPLICATION_ICS.length());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected MimePart getCalendarMimePart(MimeMultipart multiPart) throws IOException, MessagingException {
|
||||||
|
MimePart bodyPart = null;
|
||||||
|
for (int i = 0; i < multiPart.getCount(); i++) {
|
||||||
|
String contentType = multiPart.getBodyPart(i).getContentType();
|
||||||
|
if (isCalendarContentType(contentType)) {
|
||||||
|
bodyPart = (MimePart) multiPart.getBodyPart(i);
|
||||||
|
break;
|
||||||
|
} else if (contentType.startsWith("multipart")) {
|
||||||
|
Object content = multiPart.getBodyPart(i).getContent();
|
||||||
|
if (content instanceof MimeMultipart) {
|
||||||
|
bodyPart = getCalendarMimePart((MimeMultipart) content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return bodyPart;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load ICS content from MIME message input stream
|
||||||
|
*
|
||||||
|
* @param mimeInputStream mime message input stream
|
||||||
|
* @return mime message ics attachment body
|
||||||
|
* @throws IOException on error
|
||||||
|
* @throws MessagingException on error
|
||||||
|
*/
|
||||||
|
protected byte[] getICS(InputStream mimeInputStream) throws IOException, MessagingException {
|
||||||
|
byte[] result;
|
||||||
|
MimeMessage mimeMessage = new MimeMessage(null, mimeInputStream);
|
||||||
|
Object mimeBody = mimeMessage.getContent();
|
||||||
|
MimePart bodyPart = null;
|
||||||
|
if (mimeBody instanceof MimeMultipart) {
|
||||||
|
bodyPart = getCalendarMimePart((MimeMultipart) mimeBody);
|
||||||
|
} else if (isCalendarContentType(mimeMessage.getContentType())) {
|
||||||
|
// no multipart, single body
|
||||||
|
bodyPart = mimeMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bodyPart != null) {
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
bodyPart.getDataHandler().writeTo(baos);
|
||||||
|
baos.close();
|
||||||
|
result = baos.toByteArray();
|
||||||
|
} else {
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
mimeMessage.writeTo(baos);
|
||||||
|
baos.close();
|
||||||
|
throw new DavMailException("EXCEPTION_INVALID_MESSAGE_CONTENT", new String(baos.toByteArray(), "UTF-8"));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
protected void fixICS(byte[] icsContent, boolean fromServer) throws IOException {
|
protected void fixICS(byte[] icsContent, boolean fromServer) throws IOException {
|
||||||
if (LOGGER.isDebugEnabled() && fromServer) {
|
if (LOGGER.isDebugEnabled() && fromServer) {
|
||||||
dumpIndex++;
|
dumpIndex++;
|
||||||
|
@ -1197,66 +1197,6 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
super(folderPath, itemName, contentClass, itemBody, etag, noneMatch);
|
super(folderPath, itemName, contentClass, itemBody, etag, noneMatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static final String TEXT_CALENDAR = "text/calendar";
|
|
||||||
protected static final String APPLICATION_ICS = "application/ics";
|
|
||||||
|
|
||||||
protected boolean isCalendarContentType(String contentType) {
|
|
||||||
return TEXT_CALENDAR.regionMatches(true, 0, contentType, 0, TEXT_CALENDAR.length()) ||
|
|
||||||
APPLICATION_ICS.regionMatches(true, 0, contentType, 0, APPLICATION_ICS.length());
|
|
||||||
}
|
|
||||||
|
|
||||||
protected MimePart getCalendarMimePart(MimeMultipart multiPart) throws IOException, MessagingException {
|
|
||||||
MimePart bodyPart = null;
|
|
||||||
for (int i = 0; i < multiPart.getCount(); i++) {
|
|
||||||
String contentType = multiPart.getBodyPart(i).getContentType();
|
|
||||||
if (isCalendarContentType(contentType)) {
|
|
||||||
bodyPart = (MimePart) multiPart.getBodyPart(i);
|
|
||||||
break;
|
|
||||||
} else if (contentType.startsWith("multipart")) {
|
|
||||||
Object content = multiPart.getBodyPart(i).getContent();
|
|
||||||
if (content instanceof MimeMultipart) {
|
|
||||||
bodyPart = getCalendarMimePart((MimeMultipart) content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return bodyPart;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Load ICS content from MIME message input stream
|
|
||||||
*
|
|
||||||
* @param mimeInputStream mime message input stream
|
|
||||||
* @return mime message ics attachment body
|
|
||||||
* @throws IOException on error
|
|
||||||
* @throws MessagingException on error
|
|
||||||
*/
|
|
||||||
protected byte[] getICS(InputStream mimeInputStream) throws IOException, MessagingException {
|
|
||||||
byte[] result;
|
|
||||||
MimeMessage mimeMessage = new MimeMessage(null, mimeInputStream);
|
|
||||||
Object mimeBody = mimeMessage.getContent();
|
|
||||||
MimePart bodyPart = null;
|
|
||||||
if (mimeBody instanceof MimeMultipart) {
|
|
||||||
bodyPart = getCalendarMimePart((MimeMultipart) mimeBody);
|
|
||||||
} else if (isCalendarContentType(mimeMessage.getContentType())) {
|
|
||||||
// no multipart, single body
|
|
||||||
bodyPart = mimeMessage;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bodyPart != null) {
|
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
|
||||||
bodyPart.getDataHandler().writeTo(baos);
|
|
||||||
baos.close();
|
|
||||||
result = baos.toByteArray();
|
|
||||||
} else {
|
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
|
||||||
mimeMessage.writeTo(baos);
|
|
||||||
baos.close();
|
|
||||||
throw new DavMailException("EXCEPTION_INVALID_MESSAGE_CONTENT", new String(baos.toByteArray(), "UTF-8"));
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected byte[] getICSFromInternetContentProperty() throws IOException, DavException, MessagingException {
|
protected byte[] getICSFromInternetContentProperty() throws IOException, DavException, MessagingException {
|
||||||
byte[] result = null;
|
byte[] result = null;
|
||||||
// PropFind PR_INTERNET_CONTENT
|
// PropFind PR_INTERNET_CONTENT
|
||||||
|
@ -35,6 +35,7 @@ import org.apache.commons.httpclient.methods.PostMethod;
|
|||||||
|
|
||||||
import javax.mail.MessagingException;
|
import javax.mail.MessagingException;
|
||||||
import javax.mail.internet.MimeMessage;
|
import javax.mail.internet.MimeMessage;
|
||||||
|
import javax.mail.util.SharedByteArrayInputStream;
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -1273,6 +1274,9 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
|
|
||||||
executeMethod(getItemMethod);
|
executeMethod(getItemMethod);
|
||||||
content = getItemMethod.getMimeContent();
|
content = getItemMethod.getMimeContent();
|
||||||
|
if (!"CalendarItem".equals(type)) {
|
||||||
|
content = getICS(new SharedByteArrayInputStream(content));
|
||||||
|
}
|
||||||
VCalendar localVCalendar = new VCalendar(content, email, getVTimezone());
|
VCalendar localVCalendar = new VCalendar(content, email, getVTimezone());
|
||||||
// remove additional reminder
|
// remove additional reminder
|
||||||
if (!"true".equals(getItemMethod.getResponseItem().get(Field.get("reminderset").getResponseName()))) {
|
if (!"true".equals(getItemMethod.getResponseItem().get(Field.get("reminderset").getResponseName()))) {
|
||||||
@ -1301,6 +1305,8 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw buildHttpException(e);
|
throw buildHttpException(e);
|
||||||
|
} catch (MessagingException e) {
|
||||||
|
throw buildHttpException(e);
|
||||||
}
|
}
|
||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
|
@ -129,6 +129,12 @@ public class TestCaldav extends AbstractDavMailTestCase {
|
|||||||
assertEquals(HttpStatus.SC_OK, method.getStatusCode());
|
assertEquals(HttpStatus.SC_OK, method.getStatusCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testGetInbox() throws IOException {
|
||||||
|
GetMethod method = new GetMethod("/users/" + session.getEmail() + "/inbox/");
|
||||||
|
httpClient.executeMethod(method);
|
||||||
|
assertEquals(HttpStatus.SC_OK, method.getStatusCode());
|
||||||
|
}
|
||||||
|
|
||||||
public void testGetOtherUserCalendar() throws IOException {
|
public void testGetOtherUserCalendar() throws IOException {
|
||||||
Settings.setLoggingLevel("httpclient.wire", Level.DEBUG);
|
Settings.setLoggingLevel("httpclient.wire", Level.DEBUG);
|
||||||
PropFindMethod method = new PropFindMethod("/principals/users/" + Settings.getProperty("davmail.to") + "/calendar/");
|
PropFindMethod method = new PropFindMethod("/principals/users/" + Settings.getProperty("davmail.to") + "/calendar/");
|
||||||
@ -176,6 +182,31 @@ public class TestCaldav extends AbstractDavMailTestCase {
|
|||||||
assertEquals(events.size(), responses.length);
|
assertEquals(events.size(), responses.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testReportInbox() throws IOException, DavException {
|
||||||
|
|
||||||
|
StringBuilder buffer = new StringBuilder();
|
||||||
|
buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
|
||||||
|
buffer.append("<C:calendar-query xmlns:C=\"urn:ietf:params:xml:ns:caldav\" xmlns:D=\"DAV:\">");
|
||||||
|
buffer.append("<D:prop>");
|
||||||
|
buffer.append("<C:calendar-data/>");
|
||||||
|
buffer.append("</D:prop>");
|
||||||
|
buffer.append("<C:filter>");
|
||||||
|
buffer.append("</C:filter>");
|
||||||
|
buffer.append("</C:calendar-query>");
|
||||||
|
SearchReportMethod method = new SearchReportMethod("/users/" + session.getEmail() + "/inbox/", buffer.toString());
|
||||||
|
httpClient.executeMethod(method);
|
||||||
|
assertEquals(HttpStatus.SC_MULTI_STATUS, method.getStatusCode());
|
||||||
|
MultiStatus multiStatus = method.getResponseBodyAsMultiStatus();
|
||||||
|
MultiStatusResponse[] responses = multiStatus.getResponses();
|
||||||
|
/*List<ExchangeSession.Event> events = session.searchEvents("/users/" + session.getEmail() + "/calendar/",
|
||||||
|
session.or(session.isEqualTo("instancetype", 1),
|
||||||
|
session.and(session.isEqualTo("instancetype", 0), dateCondition))
|
||||||
|
|
||||||
|
);*/
|
||||||
|
|
||||||
|
//assertEquals(events.size(), responses.length);
|
||||||
|
}
|
||||||
|
|
||||||
public void testReportTasks() throws IOException, DavException {
|
public void testReportTasks() throws IOException, DavException {
|
||||||
StringBuilder buffer = new StringBuilder();
|
StringBuilder buffer = new StringBuilder();
|
||||||
buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
|
buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
|
||||||
|
Loading…
Reference in New Issue
Block a user