Defined 19010101T010101Z-99991231T235959Z consts.
authorArt Cancro <ajc@citadel.org>
Thu, 21 Mar 2024 21:49:36 +0000 (14:49 -0700)
committerArt Cancro <ajc@citadel.org>
Thu, 21 Mar 2024 21:49:36 +0000 (14:49 -0700)
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
webcit-ng/server/caldav_reports.c

index 9e00b7f8d26bce18eb0cf8f8491c67d3f5ffd950..291a9a888ccd43db01693337241b92cc72bb2266 100644 (file)
@@ -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
index 481d118d1c894cd6a9f27b59f596a628664c937d..1a6b931f6c689fd88c26798c669ab0c786104002 100644 (file)
@@ -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)<num_tokens; i+=2) {
-                               char *tr_start = NULL;
-                               char *tr_end = NULL;
+                               char *tr_start  = (char *)the_beginning_of_time;        // default if not specified
+                               char *tr_end    = (char *)the_end_of_time;              // default if not specified
                                if (!strcasecmp(t[i], "start")) {
                                        tr_start = t[i+1];
                                }