Skip to content

Commit 2516b97

Browse files
authored
Merge pull request #4725 from cyrusimap/defaultalarms_no_rewrite_header
defaultalarms: ignore user alerts if useDefaultAlerts=true
2 parents c0dc186 + 53b90a5 commit 2516b97

13 files changed

+397
-234
lines changed

Diff for: cassandane/Cassandane/Cyrus/Caldav.pm

+4-1
Original file line numberDiff line numberDiff line change
@@ -5954,7 +5954,10 @@ END:VCALENDAR
59545954
EOF
59555955
my $res = $caldav->Request('PUT',
59565956
"/dav/calendars/user/cassandane/Default/test.ics",
5957-
$ical, 'Content-Type' => 'text/calendar');
5957+
$ical,
5958+
'Content-Type' => 'text/calendar',
5959+
'X-Cyrus-rewrite-usedefaultalerts' => 'false',
5960+
);
59585961

59595962
xlog $self, "Set CalDAV default alarms with VALARM having no UID";
59605963
$imap->setmetadata("#calendars.Default",

Diff for: cassandane/data/icalendar/alerts.ics

-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ CREATED:20150928T125212Z
3030
SUMMARY:Yep
3131
DESCRIPTION:
3232
LAST-MODIFIED:20150928T132434Z
33-
X-JMAP-USEDEFAULTALERTS:TRUE
3433
BEGIN:VALARM
3534
X-WR-ALARMUID:0CF835D0-CFEB-44AE-904A-C26AB62B73BB-1
3635
UID:0CF835D0-CFEB-44AE-904A-C26AB62B73BB-1

Diff for: cassandane/tiny-tests/JMAPCalendars/admin-migrate39-defaultalerts

+16-4
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,10 @@ END:VCALENDAR
281281
EOF
282282
$self->{shareeCaldav}->Request('PUT',
283283
"cassandane.$state->{calendarA}{id}/$eventUidA1.ics",
284-
$ical, 'Content-Type' => 'text/calendar');
284+
$ical,
285+
'Content-Type' => 'text/calendar',
286+
'X-Cyrus-rewrite-usedefaultalerts' => 'false',
287+
);
285288

286289
xlog $self, "Create sharee per-user prop in calendar A";
287290
my $ical = <<EOF;
@@ -302,7 +305,10 @@ END:VCALENDAR
302305
EOF
303306
$self->{shareeCaldav}->Request('PUT',
304307
"cassandane.$state->{calendarA}{id}/$eventUidA2.ics",
305-
$ical, 'Content-Type' => 'text/calendar');
308+
$ical,
309+
'Content-Type' => 'text/calendar',
310+
'X-Cyrus-rewrite-usedefaultalerts' => 'false',
311+
);
306312

307313
xlog $self, "Create sharee useDefaultAlerts=true in calendar B";
308314
$ical = <<EOF;
@@ -323,7 +329,10 @@ END:VCALENDAR
323329
EOF
324330
$self->{shareeCaldav}->Request('PUT',
325331
"cassandane.$state->{calendarB}{id}/$eventUidB1.ics",
326-
$ical, 'Content-Type' => 'text/calendar');
332+
$ical,
333+
'Content-Type' => 'text/calendar',
334+
'X-Cyrus-rewrite-usedefaultalerts' => 'false',
335+
);
327336

328337
xlog $self, "Create sharee per-user prop in calendar B";
329338
$ical = <<EOF;
@@ -344,7 +353,10 @@ END:VCALENDAR
344353
EOF
345354
$self->{shareeCaldav}->Request('PUT',
346355
"cassandane.$state->{calendarB}{id}/$eventUidB2.ics",
347-
$ical, 'Content-Type' => 'text/calendar');
356+
$ical,
357+
'Content-Type' => 'text/calendar',
358+
'X-Cyrus-rewrite-usedefaultalerts' => 'false',
359+
);
348360
}
349361

350362
my $res = $self->{shareeJmap}->CallMethods([

Diff for: cassandane/tiny-tests/JMAPCalendars/calendarevent-defaultalerts-calalarmd

+131-36
Original file line numberDiff line numberDiff line change
@@ -8,45 +8,39 @@ sub test_calendarevent_defaultalerts_calalarmd
88

99
my $jmap = $self->{jmap};
1010
my $caldav = $self->{caldav};
11+
my $now = DateTime->now();
12+
$now->set_time_zone('Australia/Sydney');
1113

12-
my $calendarId = $caldav->NewCalendar({name => 'foo'});
13-
$self->assert_not_null($calendarId);
14-
14+
xlog $self, "Create calendar without default alarms";
1515
my $res = $jmap->CallMethods([
1616
['Calendar/set', {
1717
create => {
1818
1 => {
1919
name => 'test',
20-
defaultAlertsWithTime => {
21-
alert1 => {
22-
'@type' => 'Alert',
23-
trigger => {
24-
'@type' => 'OffsetTrigger',
25-
relativeTo => 'start',
26-
offset => 'PT0S',
27-
},
28-
action => 'display',
29-
},
30-
}
3120
},
3221
}
3322
}, 'R1'],
3423
]);
3524
my $calendarId = $res->[0][1]{created}{1}{id};
3625
$self->assert_not_null($calendarId);
3726

38-
my $now = DateTime->now();
39-
$now->set_time_zone('Australia/Sydney');
27+
xlog $self, "Remove any default alarms";
28+
$res = $jmap->CallMethods([
29+
['Calendar/set', {
30+
update => {
31+
$calendarId => {
32+
defaultAlertsWithTime => undef,
33+
},
34+
},
35+
}, 'R1'],
36+
]);
37+
$self->assert(exists $res->[0][1]{updated}{$calendarId});
4038

41-
# define the event to start in a few seconds
39+
xlog $self, "Create event that starts in an hour, ocurring daily";
4240
my $startdt = $now->clone();
43-
$startdt->add(DateTime::Duration->new(seconds => 2));
41+
$startdt->add(DateTime::Duration->new(hours => 1));
4442
my $start = $startdt->strftime('%Y%m%dT%H%M%S');
4543

46-
my $enddt = $startdt->clone();
47-
$enddt->add(DateTime::Duration->new(seconds => 15));
48-
my $end = $enddt->strftime('%Y%m%dT%H%M%S');
49-
5044
my $uuid = "574E2CD0-2D2A-4554-8B63-C7504481D3A9";
5145
my $href = "$calendarId/$uuid.ics";
5246
my $card = <<EOF;
@@ -72,35 +66,95 @@ END:VTIMEZONE
7266
BEGIN:VEVENT
7367
CREATED:20150806T234327Z
7468
UID:574E2CD0-2D2A-4554-8B63-C7504481D3A9
75-
DTEND;TZID=Australia/Sydney:$end
7669
TRANSP:OPAQUE
7770
SUMMARY:Simple
7871
DTSTART;TZID=Australia/Sydney:$start
72+
DURATION:PT15S
73+
RRULE:FREQ=DAILY
7974
DTSTAMP:20150806T234327Z
8075
SEQUENCE:0
8176
X-JMAP-USEDEFAULTALERTS;VALUE=BOOLEAN:TRUE
77+
BEGIN:VALARM
78+
UID:e01ddb42-f2f1-4e39-9d94-17fcc5aa320c
79+
TRIGGER:-PT30M
80+
ACTION:DISPLAY
81+
SUMMARY:Hello
82+
END:VALARM
8283
END:VEVENT
8384
END:VCALENDAR
8485
EOF
8586

8687
$caldav->Request('PUT', $href, $card, 'Content-Type' => 'text/calendar');
8788

89+
xlog $self, "Assert that useDefaultAlerts got rewritten to false";
90+
$res = $jmap->CallMethods([
91+
['CalendarEvent/get', {
92+
properties => ['useDefaultAlerts'],
93+
}, 'R1'],
94+
]);
95+
$self->assert_equals(JSON::false, $res->[0][1]{list}[0]{useDefaultAlerts});
96+
my $eventId = $res->[0][1]{list}[0]{id};
97+
8898
# clean notification cache
8999
$self->{instance}->getnotify();
90100

91-
xlog "No alarm triggered before the event";
92-
$self->{instance}->run_command({ cyrus => 1 }, 'calalarmd', '-t' => $now->epoch() - 60 );
93-
$self->assert_alarms();
94-
95-
xlog "Alarm triggered in the first minute after the event";
96-
$self->{instance}->run_command({ cyrus => 1 }, 'calalarmd', '-t' => $now->epoch() + 60 );
101+
xlog "Custom alarm triggers half an hour before event";
102+
$self->{instance}->run_command({ cyrus => 1 }, 'calalarmd', '-t' => $startdt->epoch - 1800);
97103
$self->assert_alarms({summary => 'Simple', start => $start});
98104

99-
xlog "No further alarm triggered for the event";
100-
$self->{instance}->run_command({ cyrus => 1 }, 'calalarmd', '-t' => $now->epoch() + 120 );
105+
xlog $self, "Set default alarms to trigger at start of event";
106+
$res = $jmap->CallMethods([
107+
['Calendar/set', {
108+
update => {
109+
$calendarId => {
110+
defaultAlertsWithTime => {
111+
alert1 => {
112+
'@type' => 'Alert',
113+
trigger => {
114+
'@type' => 'OffsetTrigger',
115+
relativeTo => 'start',
116+
offset => 'PT0S',
117+
},
118+
action => 'display',
119+
},
120+
}
121+
},
122+
}
123+
}, 'R1'],
124+
]);
125+
$self->assert(exists $res->[0][1]{updated}{$calendarId});
126+
127+
xlog $self, "Set useDefaultAlerts=true for event";
128+
$res = $jmap->CallMethods([
129+
['CalendarEvent/set', {
130+
update => {
131+
$eventId => {
132+
useDefaultAlerts => JSON::true,
133+
}
134+
},
135+
}, 'R1'],
136+
]);
137+
$self->assert(exists $res->[0][1]{updated}{$eventId});
138+
139+
xlog $self, "Forward clock by one day";
140+
$now->add(DateTime::Duration->new(days => 1));
141+
$startdt->add(DateTime::Duration->new(days => 1));
142+
$start = $startdt->strftime('%Y%m%dT%H%M%S');
143+
$start = $startdt->strftime('%Y%m%dT%H%M%S');
144+
145+
# clean notification cache
146+
$self->{instance}->getnotify();
147+
148+
xlog "Custom alarm does not trigger half an hour before event";
149+
$self->{instance}->run_command({ cyrus => 1 }, 'calalarmd', '-t' => $startdt->epoch - 1800);
101150
$self->assert_alarms();
102151

103-
my $res = $jmap->CallMethods([
152+
xlog "Default alarm triggers at start of event";
153+
$self->{instance}->run_command({ cyrus => 1 }, 'calalarmd', '-t' => $startdt->epoch);
154+
$self->assert_alarms({summary => 'Simple', start => $start});
155+
156+
xlog $self, "Update default alarms to trigger half an hour after event";
157+
$res = $jmap->CallMethods([
104158
['Calendar/set', {
105159
update => {
106160
$calendarId => {
@@ -110,7 +164,7 @@ EOF
110164
trigger => {
111165
'@type' => 'OffsetTrigger',
112166
relativeTo => 'start',
113-
offset => 'PT1M',
167+
offset => 'PT30M',
114168
},
115169
action => 'display',
116170
},
@@ -121,11 +175,52 @@ EOF
121175
]);
122176
$self->assert(exists $res->[0][1]{updated}{$calendarId});
123177

124-
xlog "Assert alarm gets triggered two minutes after the event";
125-
$self->{instance}->run_command({ cyrus => 1 }, 'calalarmd', '-t' => $now->epoch() + 120 );
178+
xlog $self, "Forward clock by one day";
179+
$now->add(DateTime::Duration->new(days => 1));
180+
$startdt->add(DateTime::Duration->new(days => 1));
181+
$start = $startdt->strftime('%Y%m%dT%H%M%S');
182+
183+
xlog "Custom alarm does not trigger half an hour before event";
184+
$self->{instance}->run_command({ cyrus => 1 }, 'calalarmd', '-t' => $startdt->epoch - 1800);
185+
$self->assert_alarms();
186+
187+
xlog "Former default alarm does not trigger at start of event";
188+
$self->{instance}->run_command({ cyrus => 1 }, 'calalarmd', '-t' => $startdt->epoch);
189+
$self->assert_alarms();
190+
191+
xlog "Current default alarm gets triggered half an hour after the event";
192+
$self->{instance}->run_command({ cyrus => 1 }, 'calalarmd', '-t' => $startdt->epoch + 1800 );
126193
$self->assert_alarms({summary => 'Simple', start => $start});
127-
}
128194

195+
xlog $self, "Forward clock by one day";
196+
$now->add(DateTime::Duration->new(days => 1));
197+
$startdt->add(DateTime::Duration->new(days => 1));
198+
$start = $startdt->strftime('%Y%m%dT%H%M%S');
199+
200+
xlog $self, "Remove default alarms again";
201+
$res = $jmap->CallMethods([
202+
['Calendar/set', {
203+
update => {
204+
$calendarId => {
205+
defaultAlertsWithTime => undef,
206+
},
207+
},
208+
}, 'R1'],
209+
]);
210+
$self->assert(exists $res->[0][1]{updated}{$calendarId});
211+
212+
xlog "Custom alarm does not trigger half an hour before event";
213+
$self->{instance}->run_command({ cyrus => 1 }, 'calalarmd', '-t' => $startdt->epoch - 1800);
214+
$self->assert_alarms();
215+
216+
xlog "Former default alarm does not trigger at start of event";
217+
$self->{instance}->run_command({ cyrus => 1 }, 'calalarmd', '-t' => $startdt->epoch);
218+
$self->assert_alarms();
219+
220+
xlog "Former default alarm does not trigger half an hour after the event";
221+
$self->{instance}->run_command({ cyrus => 1 }, 'calalarmd', '-t' => $startdt->epoch + 1800 );
222+
$self->assert_alarms();
223+
}
129224

130225
sub _can_match {
131226
my $event = shift;

0 commit comments

Comments
 (0)