From 41966209672df12d0de6bcf5ec38628170f6c82a Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Thu, 21 Mar 2024 14:49:36 -0700 Subject: [PATCH] Defined 19010101T010101Z-99991231T235959Z consts. These are now known as "the_beginning_of_time" and "the_end_of_time" and closely track the time boundaries within which libical can safely operate. Supplied these as default values when filling variables to call the time range compare function, allowing us to remove the check-for-null code in that function. --- webcit-ng/Makefile | 2 +- webcit-ng/server/caldav_reports.c | 60 ++++++++++++++----------------- 2 files changed, 28 insertions(+), 34 deletions(-) diff --git a/webcit-ng/Makefile b/webcit-ng/Makefile index 9e00b7f8d..291a9a888 100644 --- a/webcit-ng/Makefile +++ b/webcit-ng/Makefile @@ -3,7 +3,7 @@ # This program is open source software. Use, duplication, or # disclosure are subject to the GNU General Public License v3. -CFLAGS := $(CFLAGS) -ggdb -Wno-format-truncation -DDEBUG_ICAL_OVERLAP +CFLAGS := $(CFLAGS) -ggdb -Wno-format-truncation LDFLAGS := $(LDFLAGS) SRC := server diff --git a/webcit-ng/server/caldav_reports.c b/webcit-ng/server/caldav_reports.c index 481d118d1..1a6b931f6 100644 --- a/webcit-ng/server/caldav_reports.c +++ b/webcit-ng/server/caldav_reports.c @@ -4,8 +4,11 @@ #include "webcit.h" -#define CAL "urn:ietf:params:xml:ns:caldav:" // Shorthand for the XML namespace of CalDAV -#define CALLEN sizeof(CAL)-1 // And the length of that string +#define CALDAV "urn:ietf:params:xml:ns:caldav:" // Shorthand for the XML namespace of CalDAV +#define CALDAVLEN sizeof(CALDAV)-1 // And the length of that string + +const char *the_beginning_of_time = "19010101T010101Z"; +const char *the_end_of_time = "99991231T235959Z"; // A CalDAV REPORT can only be one type. This is stored in the report_type member. enum cr_type { @@ -14,7 +17,6 @@ enum cr_type { cr_freebusy_query }; - // Data type for CalDAV Report Parameters. // As we slog our way through the XML we learn what the client is asking for // and build up the contents of this data type. @@ -42,45 +44,45 @@ void caldav_xml_start(void *data, const char *el, const char **attr) { #endif // RFC4791 7.8 "calendar-query" REPORT - Client will send a lot of search criteria. - if (!strcasecmp(el, CAL"calendar-query")) { + if (!strcasecmp(el, CALDAV"calendar-query")) { crp->report_type = cr_calendar_query; } // RFC4791 7.9 "calendar-multiget" REPORT - Client will supply a list of specific hrefs. - else if (!strcasecmp(el, CAL"calendar-multiget")) { + else if (!strcasecmp(el, CALDAV"calendar-multiget")) { crp->report_type = cr_calendar_multiget; } // RFC4791 7.10 "free-busy-query" REPORT - else if (!strcasecmp(el, CAL"free-busy-query")) { + else if (!strcasecmp(el, CALDAV"free-busy-query")) { crp->report_type = cr_freebusy_query; } // RFC4791 9.7 create a filter array if this query contains a "filter" stanza - else if (!strcasecmp(el, CAL"filter")) { + else if (!strcasecmp(el, CALDAV"filter")) { crp->filters = array_new(SIZ); crp->filter_nest = crp->comp_filter_nesting_level; } // Handle the filters defined in RFC4791 9.7.1 through 9.7.5 - else if ( ( (!strcasecmp(el, CAL"comp-filter")) - || (!strcasecmp(el, CAL"prop-filter")) - || (!strcasecmp(el, CAL"param-filter")) - || (!strcasecmp(el, CAL"is-not-defined")) - || (!strcasecmp(el, CAL"text-match")) - || (!strcasecmp(el, CAL"time-range")) + else if ( ( (!strcasecmp(el, CALDAV"comp-filter")) + || (!strcasecmp(el, CALDAV"prop-filter")) + || (!strcasecmp(el, CALDAV"param-filter")) + || (!strcasecmp(el, CALDAV"is-not-defined")) + || (!strcasecmp(el, CALDAV"text-match")) + || (!strcasecmp(el, CALDAV"time-range")) ) && (crp->filters) // Make sure we actually allocated an array ) { - if (!strcasecmp(el, CAL"comp-filter")) { + if (!strcasecmp(el, CALDAV"comp-filter")) { ++crp->comp_filter_nesting_level; } char newfilter[SIZ]; int a = 0; int len = snprintf(newfilter, SIZ, "%d|", crp->comp_filter_nesting_level - crp->filter_nest - 1); - len += snprintf(&newfilter[len], SIZ-len, "%s", &el[CALLEN]); // filter name without the namespace + len += snprintf(&newfilter[len], SIZ-len, "%s", &el[CALDAVLEN]); // filter name without the namespace while (attr[a]) { len += snprintf(&newfilter[len], SIZ-len, "|%s", attr[a++]); // now save the attributes } @@ -101,7 +103,7 @@ void caldav_xml_end(void *data, const char *el) { // end logging #endif - if (!strcasecmp(el, CAL"comp-filter")) { + if (!strcasecmp(el, CALDAV"comp-filter")) { --crp->comp_filter_nesting_level; } @@ -261,19 +263,11 @@ void caldav_report_one_item(struct http_transaction *h, struct ctdlsession *c, S // Returns nonzero if the supplied icalcomponent occurs within the specified time range int caldav_time_range_filter_matches(icalcomponent *cal, char *start_str, char *end_str) { - struct icaltimetype start = ( - (!IsEmptyStr(start_str)) - ? icaltime_from_string(start_str) - : icaltime_from_string("19010101T010101Z") - ); - syslog(LOG_DEBUG, " search start: %16s --> \033[36m%s\033[0m", start_str, icaltime_as_ical_string_r(start)); + struct icaltimetype start = icaltime_from_string(start_str); + syslog(LOG_DEBUG, " search start: \033[36m%16s\033[0m (%s)", icaltime_as_ical_string_r(start), icaltime_get_tzid(start)); - struct icaltimetype end = ( - (!IsEmptyStr(end_str)) - ? icaltime_from_string(end_str) - : icaltime_from_string("99991231T235959Z") // ISO8601 is not Y10K compliant - ); - syslog(LOG_DEBUG, " search end: %16s --> \033[36m%s\033[0m", end_str, icaltime_as_ical_string_r(end)); + struct icaltimetype end = icaltime_from_string(end_str); + syslog(LOG_DEBUG, " search end: \033[36m%16s\033[0m (%s)", icaltime_as_ical_string_r(end), icaltime_get_tzid(end)); // IMPLEMENTATION NOTE: // ical_ctdl_is_overlap() works because icaltime_compare() is really smart. @@ -283,10 +277,10 @@ int caldav_time_range_filter_matches(icalcomponent *cal, char *start_str, char * // from having to convert everything to UTC before comparing. Nice! icaltimetype dts = icalcomponent_get_dtstart(cal); - syslog(LOG_DEBUG, "component start: \033[36m%s\033[0m", icaltime_as_ical_string_r(dts)); + syslog(LOG_DEBUG, "component start: \033[36m%16s\033[0m (%s)", icaltime_as_ical_string_r(dts), icaltime_get_tzid(dts)); icaltimetype dte = icalcomponent_get_dtend(cal); - syslog(LOG_DEBUG, "component end: \033[36m%s\033[0m", icaltime_as_ical_string_r(dte)); + syslog(LOG_DEBUG, "component end: \033[36m%16s\033[0m (%s)", icaltime_as_ical_string_r(dte), icaltime_get_tzid(dte)); return(ical_ctdl_is_overlap(dts, dte, start, end)); // We have a convenience function for this. } @@ -407,10 +401,10 @@ int caldav_apply_filters(void *cal, Array *filters, int apply_at_level) { } else if (!strcasecmp(t[1], "time-range")) { // RFC4791 9.9 - syslog(LOG_DEBUG, "time range filter at level %d FIXME not implemented yet", this_rule_level); + syslog(LOG_DEBUG, "time range filter at level %d FIXME add recur", this_rule_level); for (int i=2; (i+1)