diff --git a/inc/WritableCollection.php b/inc/WritableCollection.php
index 6ddae80d..0b69bf48 100644
--- a/inc/WritableCollection.php
+++ b/inc/WritableCollection.php
@@ -180,11 +180,7 @@ class WritableCollection extends DAVResource {
$calitem_params[':dtstamp'] = $dtstamp;
$class = $first->GetPValue('CLASS');
- /*
- * It seems that some calendar clients don't set a class...
- * RFC2445, 4.8.1.3: Default is PUBLIC
- */
- if ( $this->IsPublicOnly() || !isset($class) || $class == '' ) {
+ if ( $this->IsPublicOnly() && isset($class)) {
$class = 'PUBLIC';
}
$calitem_params[':class'] = $class;
diff --git a/inc/caldav-PUT-functions.php b/inc/caldav-PUT-functions.php
index d7a3b051..5f547412 100644
--- a/inc/caldav-PUT-functions.php
+++ b/inc/caldav-PUT-functions.php
@@ -1170,9 +1170,8 @@ EOSQL;
if ( empty($dtstamp) ) $dtstamp = $last_modified;
$calitem_params[':dtstamp'] = $dtstamp;
- /** RFC2445, 4.8.1.3: Default is PUBLIC, or also if overridden by the collection settings */
- $class = ($collection->public_events_only == 't' ? 'PUBLIC' : $first->GetPValue('CLASS') );
- if ( !isset($class) || $class == '' ) $class = 'PUBLIC';
+ /** Allow overridding class by the collection settings */
+ $class = ($collection->public_events_only == 't' && isset($class) ? 'PUBLIC' : $first->GetPValue('CLASS') );
$calitem_params[':class'] = $class;
@@ -1534,18 +1533,10 @@ function write_resource( DAVResource $resource, $caldav_data, DAVResource $colle
$class = $first->GetPValue('CLASS');
/* Check and see if we should over ride the class. */
/** @todo is there some way we can move this out of this function? Or at least get rid of the need for the SQL query here. */
- if ( public_events_only($user_no, $path) ) {
+ if ( public_events_only($user_no, $path) && isset($class) ) {
$class = 'PUBLIC';
}
- /*
- * It seems that some calendar clients don't set a class...
- * RFC2445, 4.8.1.3:
- * Default is PUBLIC
- */
- if ( !isset($class) || $class == '' ) {
- $class = 'PUBLIC';
- }
$calitem_params[':class'] = $class;
/** Calculate what timezone to set, first, if possible */
diff --git a/inc/caldav-REPORT-calquery.php b/inc/caldav-REPORT-calquery.php
index 18177aae..d631e53e 100644
--- a/inc/caldav-REPORT-calquery.php
+++ b/inc/caldav-REPORT-calquery.php
@@ -125,6 +125,7 @@ function SqlFilterFragment( $filter, $components, $property = null, $parameter =
case 'priority':
case 'status':
+ case 'class':
if ($not_defined == "not ") {
// "not IS NOT NULL" is a syntax error in SQL.
$property_defined_match = "IS NULL";
diff --git a/testing/tests/regression-suite/2500-is-defined-Setup-PUT-collection.data b/testing/tests/regression-suite/2500-is-defined-Setup-PUT-collection.data
index ea8129f0..51c4ed93 100644
--- a/testing/tests/regression-suite/2500-is-defined-Setup-PUT-collection.data
+++ b/testing/tests/regression-suite/2500-is-defined-Setup-PUT-collection.data
@@ -18,8 +18,8 @@ UID:19920901T130000Z-123407@host.com
DTSTAMP:19920901T130000Z
DTSTART:19920415T133000Z
DUE:19920516T045959Z
-SUMMARY:Status is set to COMPLETED, empty URL
-CLASS:CONFIDENTIAL
+SUMMARY:Status is set to COMPLETED, empty URL, CLASS set
+CLASS:PUBLIC
CATEGORIES:FAMILY,FINANCE
STATUS:COMPLETED
URL:
@@ -30,10 +30,9 @@ BEGIN:VTODO
UID:19920901T130000Z-123408@host.com
DTSTAMP:19920901T130000Z
DTSTART:19920415T133000Z
-SUMMARY:Status is IN-PROCESS, URL is set
+SUMMARY:Status is IN-PROCESS, URL is set, CLASS isn't set
STATUS:IN-PROCESS
URL:https://www.davical.org
-CLASS:CONFIDENTIAL
CATEGORIES:FAMILY,FINANCE
PRIORITY:1
END:VTODO
diff --git a/testing/tests/regression-suite/2507-is-defined-REPORT-is-defined-CLASS.result b/testing/tests/regression-suite/2507-is-defined-REPORT-is-defined-CLASS.result
new file mode 100644
index 00000000..09318d02
--- /dev/null
+++ b/testing/tests/regression-suite/2507-is-defined-REPORT-is-defined-CLASS.result
@@ -0,0 +1,62 @@
+HTTP/1.1 207 Multi-Status
+Date: Dow, 01 Jan 2000 00:00:00 GMT
+DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule
+DAV: extended-mkcol, bind, addressbook, calendar-auto-schedule, calendar-proxy
+ETag: "c073b3f2dd8d609971aaafee83aa4002"
+Content-Length: 1321
+Content-Type: text/xml; charset="utf-8"
+
+
+
+
+ /caldav.php/user1/events/19970901T130000Z-123405host.com.ics
+
+
+ BEGIN:VCALENDAR
+PRODID:-//davical.org//NONSGML AWL Calendar//EN
+VERSION:2.0
+CALSCALE:GREGORIAN
+BEGIN:VTODO
+UID:19970901T130000Z-123405@host.com
+DTSTAMP:19970901T130000Z
+DTSTART:19970415T133000Z
+DUE:19970516T045959Z
+SUMMARY:Status is not set
+CLASS:CONFIDENTIAL
+CATEGORIES:FAMILY,FINANCE
+PRIORITY:1
+END:VTODO
+END:VCALENDAR
+
+
+ HTTP/1.1 200 OK
+
+
+
+ /caldav.php/user1/events/19920901T130000Z-123407host.com.ics
+
+
+ BEGIN:VCALENDAR
+PRODID:-//davical.org//NONSGML AWL Calendar//EN
+VERSION:2.0
+CALSCALE:GREGORIAN
+BEGIN:VTODO
+UID:19920901T130000Z-123407@host.com
+DTSTAMP:19920901T130000Z
+DTSTART:19920415T133000Z
+DUE:19920516T045959Z
+SUMMARY:Status is set to COMPLETED, empty URL, CLASS set
+CLASS:PUBLIC
+CATEGORIES:FAMILY,FINANCE
+STATUS:COMPLETED
+URL:
+COMPLETED:19940101T000000Z
+PRIORITY:1
+END:VTODO
+END:VCALENDAR
+
+
+ HTTP/1.1 200 OK
+
+
+
diff --git a/testing/tests/regression-suite/2507-is-defined-REPORT-is-defined-CLASS.test b/testing/tests/regression-suite/2507-is-defined-REPORT-is-defined-CLASS.test
new file mode 100644
index 00000000..9d01ff61
--- /dev/null
+++ b/testing/tests/regression-suite/2507-is-defined-REPORT-is-defined-CLASS.test
@@ -0,0 +1,33 @@
+#
+# is-defined REPORT
+#
+# Regression test for https://gitlab.com/davical-project/davical/-/issues/279
+#
+# Check that CLASS is defined.
+#
+TYPE=REPORT
+URL=http://regression.host/caldav.php/user1/events/
+HEADER=Content-Type: text/xml; charset="UTF-8"
+HEADER=Depth: 0
+HEAD
+
+
+BEGINDATA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ENDDATA
+
+
diff --git a/testing/tests/regression-suite/2508-is-defined-REPORT-is-not-defined-CLASS.result b/testing/tests/regression-suite/2508-is-defined-REPORT-is-not-defined-CLASS.result
new file mode 100644
index 00000000..e15e5d4f
--- /dev/null
+++ b/testing/tests/regression-suite/2508-is-defined-REPORT-is-not-defined-CLASS.result
@@ -0,0 +1,35 @@
+HTTP/1.1 207 Multi-Status
+Date: Dow, 01 Jan 2000 00:00:00 GMT
+DAV: 1, 2, 3, access-control, calendar-access, calendar-schedule
+DAV: extended-mkcol, bind, addressbook, calendar-auto-schedule, calendar-proxy
+ETag: "b9f1d001b8dd22ce62bf8e98c0bbca20"
+Content-Length: 721
+Content-Type: text/xml; charset="utf-8"
+
+
+
+
+ /caldav.php/user1/events/19920901T130000Z-123408host.com.ics
+
+
+ BEGIN:VCALENDAR
+PRODID:-//davical.org//NONSGML AWL Calendar//EN
+VERSION:2.0
+CALSCALE:GREGORIAN
+BEGIN:VTODO
+UID:19920901T130000Z-123408@host.com
+DTSTAMP:19920901T130000Z
+DTSTART:19920415T133000Z
+SUMMARY:Status is IN-PROCESS, URL is set, CLASS isn't set
+STATUS:IN-PROCESS
+URL:https://www.davical.org
+CATEGORIES:FAMILY,FINANCE
+PRIORITY:1
+END:VTODO
+END:VCALENDAR
+
+
+ HTTP/1.1 200 OK
+
+
+
diff --git a/testing/tests/regression-suite/2508-is-defined-REPORT-is-not-defined-CLASS.test b/testing/tests/regression-suite/2508-is-defined-REPORT-is-not-defined-CLASS.test
new file mode 100644
index 00000000..7dbca04a
--- /dev/null
+++ b/testing/tests/regression-suite/2508-is-defined-REPORT-is-not-defined-CLASS.test
@@ -0,0 +1,33 @@
+#
+# is-not-defined REPORT
+#
+# Regression test for https://gitlab.com/davical-project/davical/-/issues/279
+#
+# Check that CLASS is not defined.
+#
+TYPE=REPORT
+URL=http://regression.host/caldav.php/user1/events/
+HEADER=Content-Type: text/xml; charset="UTF-8"
+HEADER=Depth: 0
+HEAD
+
+
+BEGINDATA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ENDDATA
+
+