mirror of
https://github.com/moparisthebest/davmail
synced 2025-02-28 17:31:52 -05:00
fix Caldav : return 404 if recipient unknown on freebusy and handle busy at interval end
git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@256 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
parent
d0ebab2d7f
commit
a3191fbde2
@ -360,32 +360,37 @@ public class CaldavConnection extends AbstractConnection {
|
||||
keyMap.put(key, fullkey);
|
||||
}
|
||||
}
|
||||
String response = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" +
|
||||
" <C:schedule-response xmlns:D=\"DAV:\"\n" +
|
||||
" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n" +
|
||||
" <C:response>\n" +
|
||||
" <C:recipient>\n" +
|
||||
" <D:href>" + valueMap.get("ATTENDEE") + "</D:href>\n" +
|
||||
" </C:recipient>\n" +
|
||||
" <C:request-status>2.0;Success</C:request-status>\n" +
|
||||
" <C:calendar-data>BEGIN:VCALENDAR\n" +
|
||||
"VERSION:2.0\n" +
|
||||
"PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\n" +
|
||||
"METHOD:REPLY\n" +
|
||||
"BEGIN:VFREEBUSY\n" +
|
||||
"DTSTAMP:" + valueMap.get("DTSTAMP") + "\n" +
|
||||
"ORGANIZER:" + valueMap.get("ORGANIZER") + "\n" +
|
||||
"DTSTART:" + valueMap.get("DTSTART") + "\n" +
|
||||
"DTEND:" + valueMap.get("DTEND") + "\n" +
|
||||
"UID:" + valueMap.get("UID") + "\n" +
|
||||
keyMap.get("ATTENDEE") + ";" + valueMap.get("ATTENDEE") + "\n" +
|
||||
"FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:" + session.getFreebusy(valueMap) + "\n" +
|
||||
"END:VFREEBUSY\n" +
|
||||
"END:VCALENDAR" +
|
||||
"</C:calendar-data>\n" +
|
||||
" </C:response>\n" +
|
||||
" </C:schedule-response>";
|
||||
sendHttpResponse(HttpStatus.SC_OK, null, "text/xml;charset=UTF-8", response, true);
|
||||
String freeBusy = session.getFreebusy(valueMap);
|
||||
if (freeBusy != null) {
|
||||
String response = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" +
|
||||
" <C:schedule-response xmlns:D=\"DAV:\"\n" +
|
||||
" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n" +
|
||||
" <C:response>\n" +
|
||||
" <C:recipient>\n" +
|
||||
" <D:href>" + valueMap.get("ATTENDEE") + "</D:href>\n" +
|
||||
" </C:recipient>\n" +
|
||||
" <C:request-status>2.0;Success</C:request-status>\n" +
|
||||
" <C:calendar-data>BEGIN:VCALENDAR\n" +
|
||||
"VERSION:2.0\n" +
|
||||
"PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\n" +
|
||||
"METHOD:REPLY\n" +
|
||||
"BEGIN:VFREEBUSY\n" +
|
||||
"DTSTAMP:" + valueMap.get("DTSTAMP") + "\n" +
|
||||
"ORGANIZER:" + valueMap.get("ORGANIZER") + "\n" +
|
||||
"DTSTART:" + valueMap.get("DTSTART") + "\n" +
|
||||
"DTEND:" + valueMap.get("DTEND") + "\n" +
|
||||
"UID:" + valueMap.get("UID") + "\n" +
|
||||
keyMap.get("ATTENDEE") + ";" + valueMap.get("ATTENDEE") + "\n" +
|
||||
"FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:" + freeBusy + "\n" +
|
||||
"END:VFREEBUSY\n" +
|
||||
"END:VCALENDAR" +
|
||||
"</C:calendar-data>\n" +
|
||||
" </C:response>\n" +
|
||||
" </C:schedule-response>";
|
||||
sendHttpResponse(HttpStatus.SC_OK, null, "text/xml;charset=UTF-8", response, true);
|
||||
} else {
|
||||
sendHttpResponse(HttpStatus.SC_NOT_FOUND, null, "text/plain", "Unknown recipient: " + valueMap.get("ATTENDEE"), true);
|
||||
}
|
||||
|
||||
} else if ("DELETE".equals(command) && path.startsWith("/calendar/")) {
|
||||
int status = session.deleteEvent(path.substring("/calendar/".length()));
|
||||
@ -401,7 +406,7 @@ public class CaldavConnection extends AbstractConnection {
|
||||
int size = events.size();
|
||||
int count = 0;
|
||||
for (ExchangeSession.Event event : events) {
|
||||
DavGatewayTray.debug("Retrieving event "+(++count)+"/"+size);
|
||||
DavGatewayTray.debug("Retrieving event " + (++count) + "/" + size);
|
||||
appendEventResponse(buffer, request, event);
|
||||
}
|
||||
}
|
||||
@ -483,7 +488,7 @@ public class CaldavConnection extends AbstractConnection {
|
||||
sendClient("");
|
||||
if (content != null && content.length() > 0) {
|
||||
// full debug trace
|
||||
DavGatewayTray.debug("> "+content);
|
||||
DavGatewayTray.debug("> " + content);
|
||||
sendClient(content.getBytes("UTF-8"));
|
||||
}
|
||||
}
|
||||
|
@ -1259,32 +1259,37 @@ public class ExchangeSession {
|
||||
currentCal.setTime(startDate);
|
||||
|
||||
StringBuilder busyBuffer = new StringBuilder();
|
||||
boolean isBusy = fbdata.charAt(0) != '0';
|
||||
boolean isBusy = fbdata.charAt(0) != '0' && fbdata.charAt(0) != '4';
|
||||
if (isBusy) {
|
||||
busyBuffer.append(icalParser.format(currentCal.getTime()));
|
||||
}
|
||||
boolean knownAttendee = fbdata.charAt(0) != '4';
|
||||
for (int i = 1; i < fbdata.length(); i++) {
|
||||
knownAttendee = knownAttendee || fbdata.charAt(i) != '4';
|
||||
currentCal.add(Calendar.MINUTE, interval);
|
||||
if (isBusy && fbdata.charAt(i) == '0') {
|
||||
// busy -> non busy
|
||||
busyBuffer.append('/').append(icalParser.format(currentCal.getTime()));
|
||||
} else if (!isBusy && fbdata.charAt(i) != '0') {
|
||||
} else if (!isBusy && (fbdata.charAt(i) != '0') && fbdata.charAt(0) != '4') {
|
||||
// non busy -> busy
|
||||
if (busyBuffer.length() > 0) {
|
||||
busyBuffer.append(',');
|
||||
}
|
||||
busyBuffer.append(icalParser.format(currentCal.getTime()));
|
||||
}
|
||||
isBusy = fbdata.charAt(i) != '0';
|
||||
isBusy = fbdata.charAt(i) != '0' && fbdata.charAt(0) != '4';
|
||||
}
|
||||
// still busy at end
|
||||
if (isBusy) {
|
||||
busyBuffer.append('/').append(icalParser.format(currentCal.getTime()));
|
||||
}
|
||||
if (knownAttendee) {
|
||||
result = busyBuffer.toString();
|
||||
}
|
||||
result = busyBuffer.toString();
|
||||
}
|
||||
} finally {
|
||||
getMethod.releaseConnection();
|
||||
}
|
||||
if (result == null) {
|
||||
throw new IOException("Unable to get user free-busy data from: " + getMethod.getPath());
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user