From 4269e613e10a1f1d812410bbd75ec7429ef4071a Mon Sep 17 00:00:00 2001 From: "Bradley M. Kuhn" Date: Fri, 29 Nov 2013 13:41:52 -0500 Subject: [PATCH] First pass at adapting these functions for multi-ics-directory output. --- calendar-export.plx | 169 ++++++++++++++++++++++++++------------------ 1 file changed, 100 insertions(+), 69 deletions(-) diff --git a/calendar-export.plx b/calendar-export.plx index 5438ed5..3350023 100644 --- a/calendar-export.plx +++ b/calendar-export.plx @@ -23,7 +23,7 @@ # "GPLv3". If not, see . # The functions PrivatizeMergeAndTZIcalFile, BuildTZList, -# PrivacyFilterICalFile, and FilterEmacsToICal material copyrighted and +# PrivacyFilterICalFiles, and FilterEmacsToICal material copyrighted and # licensed as below: # Copyright © 2006 Software Freedom Law Center, Inc. @@ -152,75 +152,81 @@ ELISP_END unless unlink($icsPublicFile, $icsWillBePrivatizedFile, $icsFullFile) == 3; } ############################################################################### -sub PrivacyFilterICalFile ($$) { - my($inputFile, $outputFile) = @_; +sub PrivacyFilterICalFiles ($$) { + my($icsDirectory) = @_; - my $oldCalendar = Data::ICal->new(filename => $inputFile); - my $newCalendar = Data::ICal->new(data => <entries : []; - my $x =0; - foreach my $entry (@{$entries}) { - my @newSubEntries; - foreach my $subEntry (@{$entry->{entries}}) { - my $refVal = ref $subEntry; - if (defined $refVal and $refVal =~ /Alarm/i) { - # Don't put it in the list in the public version if is an alarm - } else { - push(@newSubEntries, $subEntry); - } - } - $entry->{entries} = \@newSubEntries; + chdir $icsDirectory or die "unable to change to $icsDirectory: $!"; - my $classes = $entry->property('class'); - my $class; - foreach my $classProp (@{$classes}) { - $class = $classProp->value; - last if defined $class and - $class =~ /^\s*(?:PUBLIC|PRIVATE|CONFIDENTIAL)\s*/i; - } - if (defined $class and $class =~ /CONFIDENTIAL/i) { - foreach my $prop (qw/location summary description/) { - my $propList = $entry->property($prop); - $entry->add_property($prop => "Private") - if (defined $propList and @{$propList} > 0); - } - } elsif (defined $class and $class =~ /PRIVATE/i){ - # do not put this event in the output at all - next; - } - $newCalendar->add_entry($entry); - } - open(SCRUBBED_CAL, ">$outputFile") or - DieLog("Unable to overwrite $outputFile: $!", $LOCK_CLEANUP_CODE); - print SCRUBBED_CAL $newCalendar->as_string; - close SCRUBBED_CAL; - DieLog("Error when writing $outputFile: $!", $LOCK_CLEANUP_CODE) - unless $? == 0; -} -###################################################################### -sub PrivatizeMergeAndTZIcalFile ($$$$$$) { - my($icsPrivate, $icsPublic, $icsFull, $tzList, $user, $errorUser) = @_; - - my %calendar; - $calendar{private} = Data::ICal->new(filename => $icsPrivate); - $calendar{public} = Data::ICal->new(filename => $icsPublic); - my $newCalendar = Data::ICal->new(data => <) { + my $newCalendar = Data::ICal->new(data => <new(filename => $file); + my $entries = (defined $oldCalendar) ? $oldCalendar->entries : []; + my $x =0; + foreach my $entry (@{$entries}) { + my @newSubEntries; + foreach my $subEntry (@{$entry->{entries}}) { + my $refVal = ref $subEntry; + if (defined $refVal and $refVal =~ /Alarm/i) { + # Don't put it in the list in the public version if is an alarm + } else { + push(@newSubEntries, $subEntry); + } + } + $entry->{entries} = \@newSubEntries; + + my $classes = $entry->property('class'); + my $class; + foreach my $classProp (@{$classes}) { + $class = $classProp->value; + last if defined $class and + $class =~ /^\s*(?:PUBLIC|PRIVATE|CONFIDENTIAL)\s*/i; + } + if (defined $class and $class =~ /CONFIDENTIAL/i) { + foreach my $prop (qw/location summary description/) { + my $propList = $entry->property($prop); + $entry->add_property($prop => "Private") + if (defined $propList and @{$propList} > 0); + } + } elsif (defined $class and $class =~ /PRIVATE/i){ + # do not put this event in the output at all + die "unable to scrub $file in $icsDirectory: $!" + unless unlink($file) == 1; + } + $newCalendar->add_entry($entry); + } + } + open(SCRUBBED_CAL, ">$file") or + DieLog("Unable to overwrite $file: $!", $LOCK_CLEANUP_CODE); + print SCRUBBED_CAL $newCalendar->as_string; + close SCRUBBED_CAL; + DieLog("Error when writing $file: $!", $LOCK_CLEANUP_CODE) + unless $? == 0; + undef $newCalendar; +} +###################################################################### +sub PrivatizeMergeAndTZIcalFile ($$$$$$) { + my($icsPrivate, $icsPublic, $icsOutputDir, $tzList, $user, $errorUser) = @_; + + my %calendar; + $calendar{private} = Data::ICal->new(filename => $icsPrivate); + $calendar{public} = Data::ICal->new(filename => $icsPublic); my $type = "public"; - while (1) { + foreach my $type (qw/public private/) { my $entries = (defined $calendar{$type}) ? $calendar{$type}->entries : []; foreach my $entry (@{$entries}) { + my $newCalendar = Data::ICal->new(data => <add_property(class => "CONFIDENTIAL") if ($type eq "private"); # Let's shift some timezones around. @@ -228,7 +234,7 @@ END_ICAL my $datePropList = $entry->property($dateType); next unless @$datePropList > 0; - WarnLog($errorUser, "Strange that the entry below for $icsFull had more " . + WarnLog($errorUser, "Strange that the entry below for $icsOutputDir had more " . "than one $dateType:\n" . Data::Dumper->Dumper($entry) ) unless @$datePropList == 1; @@ -257,10 +263,24 @@ END_ICAL } $newCalendar->add_entry($entry); + + # Now, write out each event into a single ics file in $icsOutputDir. + # This will overwrite existing events of the same name. + + my $uidList = $entry->property('UID'); + DieLog("This entry has multiple UIDs: @{$uidList}") unless @$uidList == 1; + my $uid = $uidList[0]; + my $outputFile = File::Spec->catpath("", $icsOutputDir, "${uid}.ics"); + open(SINGLE_EVENT_ICAL, ">", $outputFile) or + DieLog("Unable to overwrite $outputFile: $!", $LOCK_CLEANUP_CODE); + print SINGLE_EVENT_ICAL $newCalendar->as_string; + close SINGLE_EVENT_ICAL; + DieLog("Error ($?) while writing $outputFile ($?): $!", $LOCK_CLEANUP_CODE) unless $? == 0; + undef $newCalendar; } - last if ($type eq "private"); - $type = "private"; } + + # Create specialized "Time Zone change" events to indicate the user's travel. foreach my $tzEntry (@$tzList) { $tzEntry->{date}->set_time_zone("floating"); } for (my $ii = 0; $ii < @$tzList; $ii++) { my $tzEntry = $tzList->[$ii]; @@ -283,13 +303,24 @@ END_ICAL description => $tzEntry->{location}, dtstart => [ $startDate, { VALUE => 'DATE' } ], dtend => [ $nextDate,{ VALUE => 'DATE' } ], - uid => $uid; + uid => $uid); + my $newCalendar = Data::ICal->new(data => <add_entry($whereEvent); + + my $outputFile = File::Spec->catpath("", $icsOutputDir, "${uid}.ics"); + open(SINGLE_EVENT_ICAL, ">", $outputFile) or + DieLog("Unable to overwrite $outputFile: $!", $LOCK_CLEANUP_CODE); + print SINGLE_EVENT_ICAL $newCalendar->as_string; + close SINGLE_EVENT_ICAL; + DieLog("Error ($?) while writing $outputFile ($?): $!", $LOCK_CLEANUP_CODE) unless $? == 0; + undef $newCalendar; } - open(MERGED_CAL, ">$icsFull") or - DieLog("Unable to overwrite $icsFull: $!", $LOCK_CLEANUP_CODE); - print MERGED_CAL $newCalendar->as_string; - close MERGED_CAL; - DieLog("Error when writing $icsFull: $!", $LOCK_CLEANUP_CODE) - unless $? == 0; + return \%calendar; } +