From 3292f7f60e2f42173b0b233e019ddc0df72d38fa Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Wed, 20 Mar 2024 15:56:01 -0400 Subject: [PATCH] ical_ctdl_is_overlap() is now symlinked 3 places. It's the same function used in Citadel Server, WebCit-Classic, and WebCit-NG. It isn't really suitable for use in libcitadel so we made symlinks instead. --- .../modules/calendar/ical_ctdl_is_overlap.c | 79 +++++++++++++++++++ .../server/modules/calendar/serv_calendar.c | 68 ---------------- webcit-ng/server/caldav_reports.c | 4 +- webcit-ng/server/ical_ctdl_is_overlap.c | 1 + webcit-ng/server/webcit.h | 5 +- webcit/.gitignore | 2 +- webcit/Makefile.in | 4 +- webcit/availability.c | 75 ------------------ webcit/ical_ctdl_is_overlap.c | 1 + 9 files changed, 90 insertions(+), 149 deletions(-) create mode 100644 citadel/server/modules/calendar/ical_ctdl_is_overlap.c create mode 120000 webcit-ng/server/ical_ctdl_is_overlap.c create mode 120000 webcit/ical_ctdl_is_overlap.c diff --git a/citadel/server/modules/calendar/ical_ctdl_is_overlap.c b/citadel/server/modules/calendar/ical_ctdl_is_overlap.c new file mode 100644 index 000000000..6902fd04d --- /dev/null +++ b/citadel/server/modules/calendar/ical_ctdl_is_overlap.c @@ -0,0 +1,79 @@ +// Check to see if two events overlap. +// +// This function is used in Citadel Server and in both generations of WebCit. Symlink it accordingly. +// +// Copyright (c) 1987-2024 by the citadel.org team +// +// This program is open source software. Use, duplication, or disclosure is subject to the GNU General Public License version 3. + +#include +#include + +// Check to see if two events overlap. Returns nonzero if they do. +int ical_ctdl_is_overlap( + struct icaltimetype t1start, + struct icaltimetype t1end, + struct icaltimetype t2start, + struct icaltimetype t2end +) { + if (icaltime_is_null_time(t1start)) return(0); + if (icaltime_is_null_time(t2start)) return(0); + + // if either event lacks end time, assume end = start + if (icaltime_is_null_time(t1end)) { + memcpy(&t1end, &t1start, sizeof(struct icaltimetype)); + } + else { + if (t1end.is_date && icaltime_compare(t1start, t1end)) { + + // The end date is non-inclusive so adjust it by one + // day because our test is inclusive, note that a day is + // not too much because we are talking about all day events. + // + // If start = end we assume that nevertheless the whole day is meant. + + icaltime_adjust(&t1end, -1, 0, 0, 0); + } + } + + if (icaltime_is_null_time(t2end)) { + memcpy(&t2end, &t2start, sizeof(struct icaltimetype)); + } + else { + if (t2end.is_date && icaltime_compare(t2start, t2end)) { + icaltime_adjust(&t2end, -1, 0, 0, 0); + } + } + + // First, check for all-day events + if (t1start.is_date || t2start.is_date) { + // If event 1 ends before event 2 starts, there is no match. + if (icaltime_compare_date_only(t1end, t2start) < 0) return(0); + + // If event 2 ends before event 1 starts, there is no match. + if (icaltime_compare_date_only(t2end, t1start) < 0) return(0); + + // Otherwise there is at least one day of overlap, so yes we have a match. + return(1); + } + +#ifdef DEBUG_ICAL_OVERLAP + syslog(LOG_DEBUG, "Comparing t1start %d:%d t1end %d:%d t2start %d:%d t2end %d:%d", + t1start.hour, t1start.minute, t1end.hour, t1end.minute, + t2start.hour, t2start.minute, t2end.hour, t2end.minute + ); +#endif + + // Now check for overlaps using date *and* time. + + // If event 1 ends before event 2 starts, there is no match. + if (icaltime_compare(t1end, t2start) <= 0) return(0); + // syslog(LOG_DEBUG, "calendar: first passed"); + + // If event 2 ends before event 1 starts, there is no match. + if (icaltime_compare(t2end, t1start) <= 0) return(0); + // syslog(LOG_DEBUG, "calendar: second passed"); + + // Otherwise, there is an overlap, so yes we have a match. + return(1); +} diff --git a/citadel/server/modules/calendar/serv_calendar.c b/citadel/server/modules/calendar/serv_calendar.c index a1016a410..17b80b0dd 100644 --- a/citadel/server/modules/calendar/serv_calendar.c +++ b/citadel/server/modules/calendar/serv_calendar.c @@ -718,74 +718,6 @@ icalproperty *ical_ctdl_get_subprop( } -// Check to see if two events overlap. Returns nonzero if they do. -// (This function is used in both Citadel and WebCit. If you change it in -// one place, change it in the other. Better yet, put it in a library.) -int ical_ctdl_is_overlap( - struct icaltimetype t1start, - struct icaltimetype t1end, - struct icaltimetype t2start, - struct icaltimetype t2end -) { - if (icaltime_is_null_time(t1start)) return(0); - if (icaltime_is_null_time(t2start)) return(0); - - // if either event lacks end time, assume end = start - if (icaltime_is_null_time(t1end)) { - memcpy(&t1end, &t1start, sizeof(struct icaltimetype)); - } - else { - if (t1end.is_date && icaltime_compare(t1start, t1end)) { - - // the end date is non-inclusive so adjust it by one - // day because our test is inclusive, note that a day is - // not too much because we are talking about all day - // events - // if start = end we assume that nevertheless the whole - // day is meant - - icaltime_adjust(&t1end, -1, 0, 0, 0); - } - } - - if (icaltime_is_null_time(t2end)) - memcpy(&t2end, &t2start, sizeof(struct icaltimetype)); - else { - if (t2end.is_date && icaltime_compare(t2start, t2end)) { - icaltime_adjust(&t2end, -1, 0, 0, 0); - } - } - - // First, check for all-day events - if (t1start.is_date || t2start.is_date) { - // If event 1 ends before event 2 starts, we're in the clear. - if (icaltime_compare_date_only(t1end, t2start) < 0) return(0); - - // If event 2 ends before event 1 starts, we're also ok. - if (icaltime_compare_date_only(t2end, t1start) < 0) return(0); - - return(1); - } - - // syslog(LOG_DEBUG, "Comparing t1start %d:%d t1end %d:%d t2start %d:%d t2end %d:%d", - // t1start.hour, t1start.minute, t1end.hour, t1end.minute, - // t2start.hour, t2start.minute, t2end.hour, t2end.minute); - - // Now check for overlaps using date *and* time. - - // If event 1 ends before event 2 starts, we're in the clear. - if (icaltime_compare(t1end, t2start) <= 0) return(0); - // syslog(LOG_DEBUG, "calendar: first passed"); - - // If event 2 ends before event 1 starts, we're also ok. - if (icaltime_compare(t2end, t1start) <= 0) return(0); - // syslog(LOG_DEBUG, "calendar: second passed"); - - // Otherwise, they overlap. - return(1); -} - - // Phase 6 of "hunt for conflicts" // called by ical_conflicts_phase5() // diff --git a/webcit-ng/server/caldav_reports.c b/webcit-ng/server/caldav_reports.c index 22c90fea6..758a4a2f1 100644 --- a/webcit-ng/server/caldav_reports.c +++ b/webcit-ng/server/caldav_reports.c @@ -283,8 +283,10 @@ int caldav_time_range_filter_matches(icalcomponent *supplied_cal, char *start_st icaltimetype dte = icalcomponent_get_dtend(cal); syslog(LOG_DEBUG, "component end: \033[36m%s\033[0m", icaltime_as_ical_string_r(dte)); + int result = ical_ctdl_is_overlap(dts, dte, start, end); // We have a convenience function for this. + icalcomponent_free(cal); - return(0); // FIXME reject everything for now + return(result); } diff --git a/webcit-ng/server/ical_ctdl_is_overlap.c b/webcit-ng/server/ical_ctdl_is_overlap.c new file mode 120000 index 000000000..7ee533db9 --- /dev/null +++ b/webcit-ng/server/ical_ctdl_is_overlap.c @@ -0,0 +1 @@ +../../citadel/server/modules/calendar/ical_ctdl_is_overlap.c \ No newline at end of file diff --git a/webcit-ng/server/webcit.h b/webcit-ng/server/webcit.h index e422849a4..916c4e1f0 100644 --- a/webcit-ng/server/webcit.h +++ b/webcit-ng/server/webcit.h @@ -146,7 +146,6 @@ enum { // Everything below here is generated with this command: // cproto -f2 *.c 2>/dev/null |sed 's/^\/\*/\n\/\//g' | sed 's/\ \*\/$//g' - // admin_functions.c void try_login(struct http_transaction *, struct ctdlsession *); void logout(struct http_transaction *, struct ctdlsession *); @@ -210,6 +209,9 @@ void perform_one_http_transaction(struct client_handle *); char *header_val(struct http_transaction *, char *); char *get_url_param(struct http_transaction *, char *); +// ical_ctdl_is_overlap.c +int ical_ctdl_is_overlap(struct icaltimetype, struct icaltimetype, struct icaltimetype, struct icaltimetype); + // ical_dezonify.c icaltimezone *get_default_icaltimezone(void); void ical_dezonify_backend(icalcomponent *, icalcomponent *, icalproperty *); @@ -304,4 +306,3 @@ void spawn_another_worker_thread(int *); void worker_entry(int *); int webserver(char *, int, int); - diff --git a/webcit/.gitignore b/webcit/.gitignore index 2be77a2f2..9188fff4f 100644 --- a/webcit/.gitignore +++ b/webcit/.gitignore @@ -17,7 +17,7 @@ po/Makefile setup sysdep.h sysdep.h.in -webcit +./webcit i18n_templatelist.c autom4te.cache gmon.out diff --git a/webcit/Makefile.in b/webcit/Makefile.in index 1e11235b4..cb6c8fe61 100644 --- a/webcit/Makefile.in +++ b/webcit/Makefile.in @@ -64,7 +64,7 @@ webcit: webserver.o context_loop.o ical_dezonify.o \ dav_delete.o dav_put.o http_datestring.o \ downloads.o addressbook_popup.o pushemail.o sysdep.o openid.o \ modules_init.o paramhandling.o utils.o \ - ical_maps.o ical_subst.o static.o feed_generator.o \ + ical_ctdl_is_overlap.o ical_maps.o ical_subst.o static.o feed_generator.o \ $(LIBOBJS) echo LD: webcit $(CC) $(LDFLAGS) -o webcit $(LIBOBJS) \ @@ -81,7 +81,7 @@ webcit: webserver.o context_loop.o ical_dezonify.o \ dav_options.o autocompletion.o tabs.o smtpqueue.o sieve.o sitemap.o \ dav_put.o http_datestring.o fmt_date.o modules_init.o \ gettext.o downloads.o addressbook_popup.o pushemail.o sysdep.o \ - paramhandling.o utils.o ical_maps.o ical_subst.o static.o feed_generator.o \ + ical_ctdl_is_overlap.o paramhandling.o utils.o ical_maps.o ical_subst.o static.o feed_generator.o \ $(LIBS) ical_maps.c: scripts/get_ical_data.sh diff --git a/webcit/availability.c b/webcit/availability.c index 44e9ecf12..a57e3f713 100644 --- a/webcit/availability.c +++ b/webcit/availability.c @@ -44,81 +44,6 @@ icalcomponent *get_freebusy_for_user(char *who) { } -/* - * Check to see if two events overlap. - * (This function is used in both Citadel and WebCit. If you change it in - * one place, change it in the other. We should seriously consider moving - * this function upstream into libical.) - * - * Returns nonzero if they do overlap. - */ -int ical_ctdl_is_overlap( - struct icaltimetype t1start, - struct icaltimetype t1end, - struct icaltimetype t2start, - struct icaltimetype t2end -) { - - if (icaltime_is_null_time(t1start)) return(0); - if (icaltime_is_null_time(t2start)) return(0); - - /* if either event lacks end time, assume end = start */ - if (icaltime_is_null_time(t1end)) - memcpy(&t1end, &t1start, sizeof(struct icaltimetype)); - else { - if (t1end.is_date && icaltime_compare(t1start, t1end)) { - /* - * the end date is non-inclusive so adjust it by one - * day because our test is inclusive, note that a day is - * not too much because we are talking about all day - * events - * if start = end we assume that nevertheless the whole - * day is meant - */ - icaltime_adjust(&t1end, -1, 0, 0, 0); - } - } - - if (icaltime_is_null_time(t2end)) - memcpy(&t2end, &t2start, sizeof(struct icaltimetype)); - else { - if (t2end.is_date && icaltime_compare(t2start, t2end)) { - icaltime_adjust(&t2end, -1, 0, 0, 0); - } - } - - /* First, check for all-day events */ - if (t1start.is_date || t2start.is_date) { - /* If event 1 ends before event 2 starts, we're in the clear. */ - if (icaltime_compare_date_only(t1end, t2start) < 0) return(0); - - /* If event 2 ends before event 1 starts, we're also ok. */ - if (icaltime_compare_date_only(t2end, t1start) < 0) return(0); - - return(1); - } - - /* syslog(LOG_DEBUG, "Comparing t1start %d:%d t1end %d:%d t2start %d:%d t2end %d:%d \n", - t1start.hour, t1start.minute, t1end.hour, t1end.minute, - t2start.hour, t2start.minute, t2end.hour, t2end.minute); - */ - - /* Now check for overlaps using date *and* time. */ - - /* If event 1 ends before event 2 starts, we're in the clear. */ - if (icaltime_compare(t1end, t2start) <= 0) return(0); - /* syslog(LOG_DEBUG, "first passed\n"); */ - - /* If event 2 ends before event 1 starts, we're also ok. */ - if (icaltime_compare(t2end, t1start) <= 0) return(0); - /* syslog(LOG_DEBUG, "second passed\n"); */ - - /* Otherwise, they overlap. */ - return(1); -} - - - /* * Back end function for check_attendee_availability() * This one checks an individual attendee against a supplied diff --git a/webcit/ical_ctdl_is_overlap.c b/webcit/ical_ctdl_is_overlap.c new file mode 120000 index 000000000..a6a6bc2af --- /dev/null +++ b/webcit/ical_ctdl_is_overlap.c @@ -0,0 +1 @@ +../citadel/server/modules/calendar/ical_ctdl_is_overlap.c \ No newline at end of file -- 2.30.2