From e3e1b37f83759ec85d190ae2113991d1aae3c9cf Mon Sep 17 00:00:00 2001 From: Arnau Mora Date: Fri, 31 Mar 2023 17:23:05 +0200 Subject: [PATCH 1/5] Added handler for properties with null value when inserting Signed-off-by: Arnau Mora --- .../java/at/bitfire/ical4android/AndroidEvent.kt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/at/bitfire/ical4android/AndroidEvent.kt b/src/main/java/at/bitfire/ical4android/AndroidEvent.kt index b4823c13..239e9cdf 100644 --- a/src/main/java/at/bitfire/ical4android/AndroidEvent.kt +++ b/src/main/java/at/bitfire/ical4android/AndroidEvent.kt @@ -27,12 +27,6 @@ import at.bitfire.ical4android.util.TimeApiExtensions.toLocalDate import at.bitfire.ical4android.util.TimeApiExtensions.toLocalTime import at.bitfire.ical4android.util.TimeApiExtensions.toRfc5545Duration import at.bitfire.ical4android.util.TimeApiExtensions.toZonedDateTime -import net.fortuna.ical4j.model.* -import net.fortuna.ical4j.model.Date -import net.fortuna.ical4j.model.component.VAlarm -import net.fortuna.ical4j.model.parameter.* -import net.fortuna.ical4j.model.property.* -import net.fortuna.ical4j.util.TimeZones import java.io.FileNotFoundException import java.net.URI import java.net.URISyntaxException @@ -41,6 +35,12 @@ import java.time.Duration import java.time.Period import java.util.* import java.util.logging.Level +import net.fortuna.ical4j.model.* +import net.fortuna.ical4j.model.Date +import net.fortuna.ical4j.model.component.VAlarm +import net.fortuna.ical4j.model.parameter.* +import net.fortuna.ical4j.model.property.* +import net.fortuna.ical4j.util.TimeZones /** * Stores and retrieves VEVENT iCalendar objects (represented as [Event]s) to/from the @@ -990,6 +990,10 @@ abstract class AndroidEvent( } protected open fun insertUnknownProperty(batch: BatchOperation, idxEvent: Int?, property: Property) { + if (property.value == null) { + Ical4Android.log.warning("Ignoring unknown property with null value") + return + } if (property.value.length > UnknownProperty.MAX_UNKNOWN_PROPERTY_SIZE) { Ical4Android.log.warning("Ignoring unknown property with ${property.value.length} octets (too long)") return From 50a767a48813798b1af9f9385732df4adb07836f Mon Sep 17 00:00:00 2001 From: Arnau Mora Date: Fri, 31 Mar 2023 18:28:32 +0200 Subject: [PATCH 2/5] Added test for checking ignored attach with invalid encoding Signed-off-by: Arnau Mora --- .../at/bitfire/ical4android/ICalendarTest.kt | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/androidTest/java/at/bitfire/ical4android/ICalendarTest.kt b/src/androidTest/java/at/bitfire/ical4android/ICalendarTest.kt index a2bdff56..8f461f93 100644 --- a/src/androidTest/java/at/bitfire/ical4android/ICalendarTest.kt +++ b/src/androidTest/java/at/bitfire/ical4android/ICalendarTest.kt @@ -5,6 +5,9 @@ package at.bitfire.ical4android import at.bitfire.ical4android.util.DateUtils +import java.io.StringReader +import java.time.Duration +import java.time.Period import net.fortuna.ical4j.data.CalendarBuilder import net.fortuna.ical4j.model.Component import net.fortuna.ical4j.model.Date @@ -13,16 +16,16 @@ import net.fortuna.ical4j.model.Property import net.fortuna.ical4j.model.component.VAlarm import net.fortuna.ical4j.model.component.VTimeZone import net.fortuna.ical4j.model.parameter.Related +import net.fortuna.ical4j.model.property.Attach import net.fortuna.ical4j.model.property.Color import net.fortuna.ical4j.model.property.DtEnd import net.fortuna.ical4j.model.property.DtStart import net.fortuna.ical4j.model.property.Due import net.fortuna.ical4j.util.TimeZones -import org.junit.Assert.* +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull import org.junit.Test -import java.io.StringReader -import java.time.Duration -import java.time.Period class ICalendarTest { @@ -86,6 +89,23 @@ class ICalendarTest { "END:VCALENDAR" ) )) + + // When providing invalid encoding in an attachment, it should be ignored + val iCalendar = ICalendar.fromReader( + StringReader( + "BEGIN:VCALENDAR\n" + + "PRODID:something\n" + + "VERSION:2.0\n" + + "BEGIN:VEVENT\n" + + "UID:xxx@example.com\n" + + "SUMMARY:Example Event with invalid attachment encoding\n" + + "ATTACH;ENCODING=\"BASE64,BASE64\";ID=rfc2445.ics;VALUE=BINARY:\n" + + "END:VEVENT\n" + + "END:VCALENDAR" + ) + ) + // Make sure the attachment has been ignored + assertNull(iCalendar.getProperty(Property.ATTACH)?.value) } @Test From 785328e3043c9ebef942dea028ade24e353d33aa Mon Sep 17 00:00:00 2001 From: Arnau Mora Date: Mon, 3 Apr 2023 11:22:28 +0200 Subject: [PATCH 3/5] Removed test Signed-off-by: Arnau Mora --- .../at/bitfire/ical4android/ICalendarTest.kt | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/androidTest/java/at/bitfire/ical4android/ICalendarTest.kt b/src/androidTest/java/at/bitfire/ical4android/ICalendarTest.kt index 8f461f93..3211a9de 100644 --- a/src/androidTest/java/at/bitfire/ical4android/ICalendarTest.kt +++ b/src/androidTest/java/at/bitfire/ical4android/ICalendarTest.kt @@ -16,7 +16,6 @@ import net.fortuna.ical4j.model.Property import net.fortuna.ical4j.model.component.VAlarm import net.fortuna.ical4j.model.component.VTimeZone import net.fortuna.ical4j.model.parameter.Related -import net.fortuna.ical4j.model.property.Attach import net.fortuna.ical4j.model.property.Color import net.fortuna.ical4j.model.property.DtEnd import net.fortuna.ical4j.model.property.DtStart @@ -89,23 +88,6 @@ class ICalendarTest { "END:VCALENDAR" ) )) - - // When providing invalid encoding in an attachment, it should be ignored - val iCalendar = ICalendar.fromReader( - StringReader( - "BEGIN:VCALENDAR\n" + - "PRODID:something\n" + - "VERSION:2.0\n" + - "BEGIN:VEVENT\n" + - "UID:xxx@example.com\n" + - "SUMMARY:Example Event with invalid attachment encoding\n" + - "ATTACH;ENCODING=\"BASE64,BASE64\";ID=rfc2445.ics;VALUE=BINARY:\n" + - "END:VEVENT\n" + - "END:VCALENDAR" - ) - ) - // Make sure the attachment has been ignored - assertNull(iCalendar.getProperty(Property.ATTACH)?.value) } @Test From 2e566bbf925ffc9bb169740e91e5caf03efb5e99 Mon Sep 17 00:00:00 2001 From: Arnau Mora Date: Mon, 3 Apr 2023 11:27:58 +0200 Subject: [PATCH 4/5] Added test for unknown properties with null value Signed-off-by: Arnau Mora --- .../bitfire/ical4android/AndroidEventTest.kt | 56 ++++++++++++++++--- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/src/androidTest/java/at/bitfire/ical4android/AndroidEventTest.kt b/src/androidTest/java/at/bitfire/ical4android/AndroidEventTest.kt index cb094cac..215618c5 100644 --- a/src/androidTest/java/at/bitfire/ical4android/AndroidEventTest.kt +++ b/src/androidTest/java/at/bitfire/ical4android/AndroidEventTest.kt @@ -10,7 +10,13 @@ import android.content.ContentUris import android.content.ContentValues import android.database.DatabaseUtils import android.net.Uri -import android.provider.CalendarContract.* +import android.provider.CalendarContract.ACCOUNT_TYPE_LOCAL +import android.provider.CalendarContract.AUTHORITY +import android.provider.CalendarContract.Attendees +import android.provider.CalendarContract.Calendars +import android.provider.CalendarContract.Events +import android.provider.CalendarContract.ExtendedProperties +import android.provider.CalendarContract.Reminders import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation import androidx.test.rule.GrantPermissionRule import at.bitfire.ical4android.impl.TestCalendar @@ -19,17 +25,39 @@ import at.bitfire.ical4android.util.AndroidTimeUtils import at.bitfire.ical4android.util.DateUtils import at.bitfire.ical4android.util.MiscUtils.ContentProviderClientHelper.closeCompat import at.bitfire.ical4android.util.MiscUtils.UriHelper.asSyncAdapter -import net.fortuna.ical4j.model.* -import net.fortuna.ical4j.model.component.VAlarm -import net.fortuna.ical4j.model.parameter.* -import net.fortuna.ical4j.model.property.* -import net.fortuna.ical4j.util.TimeZones -import org.junit.* -import org.junit.Assert.* import java.net.URI import java.time.Duration import java.time.Period -import java.util.TimeZone +import net.fortuna.ical4j.model.Date +import net.fortuna.ical4j.model.DateList +import net.fortuna.ical4j.model.DateTime +import net.fortuna.ical4j.model.Parameter +import net.fortuna.ical4j.model.ParameterList +import net.fortuna.ical4j.model.Property +import net.fortuna.ical4j.model.component.VAlarm +import net.fortuna.ical4j.model.parameter.Cn +import net.fortuna.ical4j.model.parameter.CuType +import net.fortuna.ical4j.model.parameter.Email +import net.fortuna.ical4j.model.parameter.Language +import net.fortuna.ical4j.model.parameter.PartStat +import net.fortuna.ical4j.model.parameter.Related +import net.fortuna.ical4j.model.parameter.Role +import net.fortuna.ical4j.model.parameter.Rsvp +import net.fortuna.ical4j.model.parameter.Value +import net.fortuna.ical4j.model.property.* +import net.fortuna.ical4j.util.TimeZones +import org.junit.After +import org.junit.AfterClass +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotEquals +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.BeforeClass +import org.junit.ClassRule +import org.junit.Test class AndroidEventTest { @@ -1269,6 +1297,16 @@ class AndroidEventTest { } } + @Test + fun testBuildUnknownProperty_NoValue() { + buildEvent(true) { + unknownProperties += XProperty("ATTACH", ParameterList(), null) + }.let { result -> + // The property should not have been added, so the first unknown property should be null + assertNull(firstUnknownProperty(result)) + } + } + private fun firstException(values: ContentValues): ContentValues? { val id = values.getAsInteger(Events._ID) provider.query(Events.CONTENT_URI.asSyncAdapter(testAccount), null, From f622930c7fa9db08673761e977d9e40fed5878fb Mon Sep 17 00:00:00 2001 From: Ricki Hirner Date: Mon, 3 Apr 2023 15:35:25 +0200 Subject: [PATCH 5/5] Optimize imports --- .../bitfire/ical4android/AndroidEventTest.kt | 45 ++++--------------- .../ical4android/ICalPreprocessorTest.kt | 4 +- .../at/bitfire/ical4android/ICalendarTest.kt | 10 ++--- .../LocaleNonWesternDigitsTest.kt | 4 +- .../at/bitfire/ical4android/AndroidEvent.kt | 12 ++--- 5 files changed, 22 insertions(+), 53 deletions(-) diff --git a/src/androidTest/java/at/bitfire/ical4android/AndroidEventTest.kt b/src/androidTest/java/at/bitfire/ical4android/AndroidEventTest.kt index 215618c5..c6dbf3e1 100644 --- a/src/androidTest/java/at/bitfire/ical4android/AndroidEventTest.kt +++ b/src/androidTest/java/at/bitfire/ical4android/AndroidEventTest.kt @@ -10,13 +10,7 @@ import android.content.ContentUris import android.content.ContentValues import android.database.DatabaseUtils import android.net.Uri -import android.provider.CalendarContract.ACCOUNT_TYPE_LOCAL -import android.provider.CalendarContract.AUTHORITY -import android.provider.CalendarContract.Attendees -import android.provider.CalendarContract.Calendars -import android.provider.CalendarContract.Events -import android.provider.CalendarContract.ExtendedProperties -import android.provider.CalendarContract.Reminders +import android.provider.CalendarContract.* import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation import androidx.test.rule.GrantPermissionRule import at.bitfire.ical4android.impl.TestCalendar @@ -25,39 +19,16 @@ import at.bitfire.ical4android.util.AndroidTimeUtils import at.bitfire.ical4android.util.DateUtils import at.bitfire.ical4android.util.MiscUtils.ContentProviderClientHelper.closeCompat import at.bitfire.ical4android.util.MiscUtils.UriHelper.asSyncAdapter -import java.net.URI -import java.time.Duration -import java.time.Period -import net.fortuna.ical4j.model.Date -import net.fortuna.ical4j.model.DateList -import net.fortuna.ical4j.model.DateTime -import net.fortuna.ical4j.model.Parameter -import net.fortuna.ical4j.model.ParameterList -import net.fortuna.ical4j.model.Property +import net.fortuna.ical4j.model.* import net.fortuna.ical4j.model.component.VAlarm -import net.fortuna.ical4j.model.parameter.Cn -import net.fortuna.ical4j.model.parameter.CuType -import net.fortuna.ical4j.model.parameter.Email -import net.fortuna.ical4j.model.parameter.Language -import net.fortuna.ical4j.model.parameter.PartStat -import net.fortuna.ical4j.model.parameter.Related -import net.fortuna.ical4j.model.parameter.Role -import net.fortuna.ical4j.model.parameter.Rsvp -import net.fortuna.ical4j.model.parameter.Value +import net.fortuna.ical4j.model.parameter.* import net.fortuna.ical4j.model.property.* import net.fortuna.ical4j.util.TimeZones -import org.junit.After -import org.junit.AfterClass -import org.junit.Assert.assertEquals -import org.junit.Assert.assertFalse -import org.junit.Assert.assertNotEquals -import org.junit.Assert.assertNotNull -import org.junit.Assert.assertNull -import org.junit.Assert.assertTrue -import org.junit.Before -import org.junit.BeforeClass -import org.junit.ClassRule -import org.junit.Test +import org.junit.* +import org.junit.Assert.* +import java.net.URI +import java.time.Duration +import java.time.Period class AndroidEventTest { diff --git a/src/androidTest/java/at/bitfire/ical4android/ICalPreprocessorTest.kt b/src/androidTest/java/at/bitfire/ical4android/ICalPreprocessorTest.kt index aafb3e7a..96b8e246 100644 --- a/src/androidTest/java/at/bitfire/ical4android/ICalPreprocessorTest.kt +++ b/src/androidTest/java/at/bitfire/ical4android/ICalPreprocessorTest.kt @@ -9,13 +9,13 @@ import at.bitfire.ical4android.validation.FixInvalidUtcOffsetPreprocessor import at.bitfire.ical4android.validation.ICalPreprocessor import io.mockk.mockkObject import io.mockk.verify -import java.io.InputStreamReader -import java.io.StringReader import net.fortuna.ical4j.data.CalendarBuilder import net.fortuna.ical4j.model.Component import net.fortuna.ical4j.model.component.VEvent import org.junit.Assert.assertEquals import org.junit.Test +import java.io.InputStreamReader +import java.io.StringReader class ICalPreprocessorTest { diff --git a/src/androidTest/java/at/bitfire/ical4android/ICalendarTest.kt b/src/androidTest/java/at/bitfire/ical4android/ICalendarTest.kt index 3211a9de..a2bdff56 100644 --- a/src/androidTest/java/at/bitfire/ical4android/ICalendarTest.kt +++ b/src/androidTest/java/at/bitfire/ical4android/ICalendarTest.kt @@ -5,9 +5,6 @@ package at.bitfire.ical4android import at.bitfire.ical4android.util.DateUtils -import java.io.StringReader -import java.time.Duration -import java.time.Period import net.fortuna.ical4j.data.CalendarBuilder import net.fortuna.ical4j.model.Component import net.fortuna.ical4j.model.Date @@ -21,10 +18,11 @@ import net.fortuna.ical4j.model.property.DtEnd import net.fortuna.ical4j.model.property.DtStart import net.fortuna.ical4j.model.property.Due import net.fortuna.ical4j.util.TimeZones -import org.junit.Assert.assertEquals -import org.junit.Assert.assertNotNull -import org.junit.Assert.assertNull +import org.junit.Assert.* import org.junit.Test +import java.io.StringReader +import java.time.Duration +import java.time.Period class ICalendarTest { diff --git a/src/androidTest/java/at/bitfire/ical4android/LocaleNonWesternDigitsTest.kt b/src/androidTest/java/at/bitfire/ical4android/LocaleNonWesternDigitsTest.kt index 55b57a5a..2d2946f6 100644 --- a/src/androidTest/java/at/bitfire/ical4android/LocaleNonWesternDigitsTest.kt +++ b/src/androidTest/java/at/bitfire/ical4android/LocaleNonWesternDigitsTest.kt @@ -4,13 +4,13 @@ package at.bitfire.ical4android -import java.time.ZoneOffset -import java.util.Locale import net.fortuna.ical4j.model.property.TzOffsetFrom import org.junit.AfterClass import org.junit.Assert.assertEquals import org.junit.BeforeClass import org.junit.Test +import java.time.ZoneOffset +import java.util.* class LocaleNonWesternDigitsTest { diff --git a/src/main/java/at/bitfire/ical4android/AndroidEvent.kt b/src/main/java/at/bitfire/ical4android/AndroidEvent.kt index 239e9cdf..94a57a30 100644 --- a/src/main/java/at/bitfire/ical4android/AndroidEvent.kt +++ b/src/main/java/at/bitfire/ical4android/AndroidEvent.kt @@ -27,6 +27,12 @@ import at.bitfire.ical4android.util.TimeApiExtensions.toLocalDate import at.bitfire.ical4android.util.TimeApiExtensions.toLocalTime import at.bitfire.ical4android.util.TimeApiExtensions.toRfc5545Duration import at.bitfire.ical4android.util.TimeApiExtensions.toZonedDateTime +import net.fortuna.ical4j.model.* +import net.fortuna.ical4j.model.Date +import net.fortuna.ical4j.model.component.VAlarm +import net.fortuna.ical4j.model.parameter.* +import net.fortuna.ical4j.model.property.* +import net.fortuna.ical4j.util.TimeZones import java.io.FileNotFoundException import java.net.URI import java.net.URISyntaxException @@ -35,12 +41,6 @@ import java.time.Duration import java.time.Period import java.util.* import java.util.logging.Level -import net.fortuna.ical4j.model.* -import net.fortuna.ical4j.model.Date -import net.fortuna.ical4j.model.component.VAlarm -import net.fortuna.ical4j.model.parameter.* -import net.fortuna.ical4j.model.property.* -import net.fortuna.ical4j.util.TimeZones /** * Stores and retrieves VEVENT iCalendar objects (represented as [Event]s) to/from the