From 7bc7362299ed5194f6cda5589048117f277360de Mon Sep 17 00:00:00 2001 From: Matthew Jones Date: Tue, 1 Apr 2014 11:22:27 -0400 Subject: [PATCH] Complete rrule validation --- awx/api/serializers.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 7cf971d093..cc6646ef28 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -1360,21 +1360,37 @@ class ScheduleSerializer(BaseSerializer): # - DTSTART is not include # - INTERVAL is not included # - TZID is used - # - multiple BYDAY (except WEEKLY), BYMONTHDAY, BYMONTH + # - multiple BYDAY (except WEEKLY and YEARLY (see below)), BYMONTHDAY, BYMONTH + # - multiple BYDAY yearly unless it lists all weekdays OR weekend days # - BYDAY prefixed with a number (MO is good but not 20MO) # - BYYEARDAY # - BYWEEKNO def validate_rrule(self, attrs, source): rrule_value = attrs[source] + multi_by_day = ".*?BYDAY[\:\=][a-zA-Z]{2},[a-zA-Z]{2}" + multi_by_month_day = ".*?BYMONTHDAY[\:\=][0-9]+,-*[0-9]+" + multi_by_month = ".*?BYMONTH[\:\=][0-9]+,[0-9]+" + by_day_with_numeric_prefix = ".*?BYDAY[\:\=][0-9]+[a-zA-Z]{2}" if not re.match("DTSTART[\:\=][0-9]+T[0-9]+Z", rrule_value): raise serializers.ValidationError('DTSTART required in rrule, value should match: DTSTART:YYYYMMDDTHHMMSSZ') if not 'interval' in rrule_value.lower(): raise serializers.ValidationError('INTERVAL required in rrule') if 'tzid' in rrule_value.lower(): raise serializers.ValidationError('TZID is not supported') - if 'secondly' in rrule_value.lower(): raise serializers.ValidationError('SECONDLY is not supported') + if re.match(multi_by_month_day, rrule_value): + raise serializers.ValidationError('Multiple BYMONTHDAYs not supported') + if re.match(multi_by_month, rrule_value): + raise serializers.ValidationError('Multiple BYMONTHs not supported') + if re.match(by_day_with_numeric_prefix, rrule_value): + raise serializers.ValidationError("BYDAY with numeric prefix not supported") + if 'byyearday' in rrule_value.lower(): + raise serializers.ValidationError("BYYEARDAY not supported") + if 'byweekno' in rrule_value.lower(): + raise serializers.ValidationError("BYWEEKNO not supported") + if re.match(multi_by_day, rrule_value) and not re.match(".*?FREQ[\:\=](WEEKLY|YEARLY)", rrule_value): + raise serializers.ValidationError("Multiple BYDAY elements only supported with WEEKLY and YEARLY frequency") try: sched_rule = rrule.rrulestr(rrule_value) except Exception, e: