Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ab2c1137 authored by Ricki Hirner's avatar Ricki Hirner
Browse files

Validate generated VEVENT/VTODOs

- debug builds: ValidationExceptions are hard errors
- release builds: ValidationExceptions are catched and logged as warning
parent cc4bcc61
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -229,6 +229,7 @@ class Event: ICalendar() {
            ical.components += tz
        }

        softValidate(ical)
        CalendarOutputter(false).output(ical, os)
    }

+23 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ import net.fortuna.ical4j.model.component.*
import net.fortuna.ical4j.model.property.DateProperty
import net.fortuna.ical4j.model.property.ProdId
import net.fortuna.ical4j.model.property.TzUrl
import net.fortuna.ical4j.validate.ValidationException
import java.io.Reader
import java.io.StringReader
import java.util.*
@@ -32,11 +33,15 @@ open class ICalendar {

        // static ical4j initialization
        init {
            // reduce verbosity of those two loggers
            // reduce verbosity of various ical4j loggers
            org.slf4j.LoggerFactory.getLogger(net.fortuna.ical4j.data.CalendarParserImpl::class.java)
            Logger.getLogger(net.fortuna.ical4j.data.CalendarParserImpl::class.java.name).level = Level.CONFIG

            org.slf4j.LoggerFactory.getLogger(net.fortuna.ical4j.model.Recur::class.java)
            Logger.getLogger(net.fortuna.ical4j.model.Recur::class.java.name).level = Level.CONFIG

            org.slf4j.LoggerFactory.getLogger(net.fortuna.ical4j.data.FoldingWriter::class.java)
            Logger.getLogger(net.fortuna.ical4j.data.FoldingWriter::class.java.name).level = Level.CONFIG
        }

        // known iCalendar properties
@@ -167,6 +172,23 @@ open class ICalendar {
            return null
        }

        /**
         * Validates an iCalendar resource and catches/logs a potential [ValidationException].
         *
         * @param ical iCalendar resource to be validated
         */
        fun softValidate(ical: Calendar) {
            try {
                ical.validate(true)
            } catch (e: ValidationException) {
                if (BuildConfig.DEBUG)
                    // debug build, re-throw ValidationException
                    throw e
                else
                    Constants.log.log(Level.WARNING, "iCalendar validation failed - This is only a warning!", e)
            }
        }


        // misc. iCalendar helpers

+1 −0
Original line number Diff line number Diff line
@@ -206,6 +206,7 @@ class Task: ICalendar() {

        ical.components.addAll(usedTimeZones.map { it.vTimeZone })

        softValidate(ical)
        CalendarOutputter(false).output(ical, os)
    }

+0 −1
Original line number Diff line number Diff line
@@ -2,5 +2,4 @@ net.fortuna.ical4j.timezone.cache.impl=net.fortuna.ical4j.util.MapTimeZoneCache
net.fortuna.ical4j.timezone.update.enabled=false
ical4j.parsing.relaxed=true
ical4j.unfolding.relaxed=true
ical4j.validation.relaxed=true
ical4j.compatibility.outlook=true
+5 −1
Original line number Diff line number Diff line
@@ -115,7 +115,10 @@ class TaskTest {
        val t = Task()
        t.uid = "SAMPLEUID"
        t.dtStart = DtStart("20190101T100000", TimeZoneRegistryFactory.getInstance().createRegistry().getTimeZone("Europe/Berlin"))
        t.alarms += VAlarm(Dur(0, -1, 0, 0))

        val alarm = VAlarm(Dur(0, -1, 0, 0))
        alarm.properties += Action.AUDIO
        t.alarms += alarm

        val os = ByteArrayOutputStream()
        t.write(os)
@@ -127,6 +130,7 @@ class TaskTest {
        assertTrue(raw.contains("DTSTART;TZID=Europe/Berlin:20190101T100000"))
        assertTrue(raw.contains("BEGIN:VALARM\r\n" +
                "TRIGGER:-PT1H\r\n" +
                "ACTION:AUDIO\r\n" +
                "END:VALARM\r\n"))
        assertTrue(raw.contains("BEGIN:VTIMEZONE"))
    }
Loading