From ec9fcce3c64cc8d00afbbc68ada8e00ddb3730de Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 19 Aug 2010 13:48:53 +0000 Subject: [PATCH] Added migration script for Oracle Calendar. Updates the guides for the 1.3.1 release and the NEWS file. Monotone-Parent: 618ad1eb6b0c707afbfd6673022c7840209747e1 Monotone-Revision: b59f331214320317bf10c70f2db10187fcd5f29d Monotone-Author: ludovic@Sophos.ca Monotone-Date: 2010-08-19T13:48:53 --- Documentation/SOGo Installation Guide.odt | Bin 147210 -> 147256 bytes ...SOGo Mozilla Thunderbird Configuration.odt | Bin 21610 -> 21604 bytes Migration/Oracle/README | 28 + Migration/Oracle/oracleimport.pl | 887 ++++++++++++++++++ NEWS | 4 +- Tests/Integration/README | 4 +- UI/MainUI/Version | 10 + UI/WebServerResources/SOGoResizableTable.js | 9 +- UI/WebServerResources/UIxPreferences.js | 1 - 9 files changed, 938 insertions(+), 5 deletions(-) create mode 100644 Migration/Oracle/README create mode 100755 Migration/Oracle/oracleimport.pl diff --git a/Documentation/SOGo Installation Guide.odt b/Documentation/SOGo Installation Guide.odt index 0271fffd74f5f0ddaa3aa55a07ad5eae9ceb0da9..14ffcc6e357c734b071062e9b460012bd2be4558 100644 GIT binary patch delta 37743 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 UATwS9auEvTA%e@^yeQy*08RtM2(V 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 diff --git a/Documentation/SOGo Mozilla Thunderbird Configuration.odt b/Documentation/SOGo Mozilla Thunderbird Configuration.odt index 5b1f09394868192ea2fcdd179d745e349327a963..903ecc50c7c92bcb0624098752613e41dc619696 100644 GIT binary patch delta 16283 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 diff --git a/Migration/Oracle/README b/Migration/Oracle/README new file mode 100644 index 000000000..b57ed4a36 --- /dev/null +++ b/Migration/Oracle/README @@ -0,0 +1,28 @@ +Depending on your location, the timezone will have to be adjusted +in the oracleimport script. Search for "$timezone" and adjust it together +with the DTSTART/DTEND values. + +Also, if you do not want the script to send invitation requests / updates +for virtually every PUT operation, you MUST add the SCHEDULE-AGENT parameter +(with a value of NONE or CLIENT) to the ORGANIZER of the events you're about +to import. See http://tools.ietf.org/html/draft-desruisseaux-caldav-sched-08#section-10.1 +for all details. + +Then, you need to export the data from Oracle Calendar. To do this, use +the following tools based on the type of data you want to export. + +- Calendars - + +% uniical -export -host -n -start // -end // -u -f + +- Tasks - + +% unicpoutu -host -n -start -end -u + +- Rights - + +% uniaccessrights -ls -grantor -host -n -p XXXX -grantee "S=*" -designate + +Please look at http://download.oracle.com/docs/cd/B25553_01/calendar.1012/b25486/utilities.htm for +details on those tools. + diff --git a/Migration/Oracle/oracleimport.pl b/Migration/Oracle/oracleimport.pl new file mode 100755 index 000000000..e6945dd32 --- /dev/null +++ b/Migration/Oracle/oracleimport.pl @@ -0,0 +1,887 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use Time::Local; +use Time::localtime; +use Getopt::Long qw(:config bundling); +use HTTP::Request; +use LWP::UserAgent; +use Math::BigInt; +use Digest::MD5 qw(md5_hex); +use MIME::QuotedPrint; +use MIME::Base64; +use Net::LDAP; +use Time::HiRes qw (gettimeofday tv_interval); + +use constant { + QUOTED_PRINTABLE => 'auto', + # 0 : never decode data + # 1 : always decode data + # auto : try to guess from the file headers + + OWNER => undef, + # undef : use event organizer as the owner + # : force owner to be username + + DUPLICATES => 'update', + # create : create a new entry if the UID already exists + # ignore : don't create the event if the UID already exists + # update : update the entry with the same UID (if deleted, stays deleted) + # replace : if the entry exists and was deleted, resurect it + RECURRENT => 0, + # smart : group new events with same UID as one recurrent event + + LDAP_HOST => 'ldap://ldap.foobar.edu', + LDAP_BIND_DN => 'uid=sogo,ou=applications,dc=foobar,dc=edu', + LDAP_BIND_PW => 'PASSWORD', + LDAP_BASE => 'ou=people,dc=foobar,dc=edu', + LDAP_USERNAME => 'uid', + LDAP_EMAIL => 'mail', + LDAP_EMAIL_FILTER => '(|(mail=%s)(mailAlternateAddress=%s))', + + FORCE_USERNAME => undef, + FORCE_CLOSE => 0, + DRYRUN => 0, + DEBUG => 1 +}; + +$| = 1; + +# Global variables +my $file; +my ($username, $email); +my $url; +my ($host, $port, $authusername, $password); +my $ua; +my $ldap; +my %duplicatedUID = (); +my $pwdhash; + +my $timezone = <<_EOF; + +BEGIN:VTIMEZONE +TZID:/inverse.ca/20091015_1/America/New_York +X-LIC-LOCATION:America/New_York +BEGIN:DAYLIGHT +TZOFFSETFROM:-0500 +TZOFFSETTO:-0400 +TZNAME:EDT +DTSTART:19700308T020000 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:-0400 +TZOFFSETTO:-0500 +TZNAME:EST +DTSTART:19701101T020000 +RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU +END:STANDARD +END:VTIMEZONE +_EOF + +sub usage +{ + my $msg = shift; + + print "$msg\n" if ($msg); + print "Usage: $0 \n"; + print " must have the form http[s]://[superuser]:[password]\@hostname\n"; + print " The full URL will be build using the username.\n"; + print " must be 'events', 'tasks' or 'rights' to specify the type of data\n"; + print " must have the form .\n"; + print "\n"; +} + +sub getEmailByUsername +{ + my ($ldap, $username) = @_; + + my $results = $ldap->search(base => LDAP_BASE, + filter => '('.LDAP_USERNAME.'='.$username.')', + attrs => [(LDAP_EMAIL)]); + if ($results->count != 1) { + print "Unexpected number of LDAP entries (",$results->count,") for $username\n"; + return 0; + } + my $entry = $results->entry(0); + + return $entry->get_value(LDAP_EMAIL); +} + +my %emailToUserName; + +sub getUsernameByEmail +{ + my ($ldap, $email) = @_; + + if (!defined($emailToUserName{$email})) { + my $results = $ldap->search(base => LDAP_BASE, + filter => sprintf(LDAP_EMAIL_FILTER, $email, $email), + attrs => [(LDAP_USERNAME)]); + if ($results->count != 1) { + print "Unexpected number of entries return for $email\n"; + return 0; + } + my $entry = $results->entry(0); + $emailToUserName{$email} = $entry->get_value(LDAP_USERNAME); + } + + return $emailToUserName{$email}; +} + +sub calendarUrl +{ + my $username = $_[0]; + my $uid = $_[1] || ""; + + return "$url/SOGo/dav/$username/Calendar/personal/$uid"; +} + +sub httpRequest +{ + my ($request, $uid) = @_; + + my $result = 1; + my $i; + for ($i = 0; $i < 30; $i++) { + my $response = $ua->request($request); + if ($response->is_success) { + print $request->method, " $uid:\t", $response->status_line, "\n"; + last; + } + else { + print STDERR "ERR ", $request->method, " $uid:\t", $response->status_line, "\n"; + if ($response->code == 500) { + print STDERR "INFO sleeping 2 secs\n"; + sleep(2); + } + else { + $result = 0; + last; + } + } + } + + if ($i == 30) { + print STDERR "ERR ", $request->method, " $uid:\tCan't reach server for the past 60 secs - exiting.\n"; + exit(-4); + } + + return $result; +} + +sub userCalendarExists +{ + my ($username) = @_; + my $result = 0; + + my $propfind = ''; + my $request = HTTP::Request->new(); + $request->method('PROPFIND'); + $request->uri(&calendarUrl($username)); + $request->header('Content-Type' => 'text/xml; charset=utf8'); + $request->header('Content-Length' => length($propfind)); + $request->header('Depth' => 0); + $request->header('Authorization' => "Basic $pwdhash"); + $request->content($propfind); + + $result = &httpRequest($request, $username); + + return $result; +} + +sub searchByUid +{ + my ($username, $uid) = @_; + my $result = 0; + + my $request = HTTP::Request->new(); + $request->method('GET'); + $request->uri(&calendarUrl($username, $uid)); + + $result = &httpRequest($request, $uid); + + return $result; +} + +sub deleteEvent() +{ + my ($username, $uid) = @_; + my $result = 0; + + return $result if (DRYRUN); + + my $request = HTTP::Request->new(); + $request->method('DELETE'); + $request->uri(&calendarUrl($username, $uid)); + + $result = &httpRequest($request, $uid); + + return $result; +} + +sub putEvent(\%) +{ + my (%vevent) = %{(shift)}; + my $count = shift; + + my $uid = $vevent{'uid'}; + + # decode data + $vevent{'data'} =~ s/\r//g; + $vevent{'data'} =~ s/([^=])\n /$1/g; + if (QUOTED_PRINTABLE eq '1' || + (QUOTED_PRINTABLE eq 'auto' && $vevent{'encoding'} && $vevent{'encoding'} =~ m/quoted-printable/)) { + $vevent{'data'} = decode_qp($vevent{'data'}); + } + + # for "notes", we need to add one day to the DTEND + my $oracleEventType; + if ($vevent{'data'} =~ /X-ORACLE-EVENTTYPE:(.*)/) { + $oracleEventType = $1; + } else { + $oracleEventType = "unknown"; + } + if ($oracleEventType eq 'DAILY NOTE') { +# if ($vevent{'data'} =~ /DTEND;VALUE=DATE:(\d{4})(\d{2})(\d{2})/) { +# my ($mday,$mon,$year) = ($3, $2, $1); +# my $seconds = timelocal(0, 0, 0, $mday, $mon - 1, $year - 1900); +# $seconds += 86400; +# # we specify "CORE::" because we expect an array instead of a +# # magical hash +# my @newLocalTime = CORE::localtime($seconds); +# $mday = $newLocalTime[3]; +# $mon = $newLocalTime[4] + 1; +# $year = $newLocalTime[5] + 1900; +# my $newEndDate = sprintf("%.4d%.2d%.2d", $year, $mon, $mday); +# my $dtEndPrefix = "DTEND;VALUE=DATE:"; +# my $dtEndIndex = index $vevent{'data'}, $dtEndPrefix; +# if ($dtEndIndex > -1) { +# my $partLength = $dtEndIndex + length($dtEndPrefix); +# $vevent{'data'} = sprintf("%s%s%s", +# substr($vevent{'data'}, 0, $partLength), +# $newEndDate, +# substr($vevent{'data'}, $partLength + 8)); +# } +# } + + # we set a timezone for dates in all day events to ensure that SOGo + # does not put them in UTC + $vevent{'data'} =~ s@BEGIN:VEVENT@${timezone}BEGIN:VEVENT@; + $vevent{'data'} =~ s@DTSTART;VALUE=DATE:@DTSTART;VALUE=DATE;TZID=/inverse.ca/20091015_1/America/New_York:@; + $vevent{'data'} =~ s@DTEND;VALUE=DATE:@DTEND;VALUE=DATE;TZID=/inverse.ca/20091015_1/America/New_York:@; + } + + # parse attendees + my $hasAttendees = 0; + while ($vevent{'data'} =~ m/ATTENDEE;(.+)$/gm) { + my @parameters = split(';', $1); + $vevent{'attendees'} = [] unless ($vevent{'attendees'}); + my %attendee = (); + foreach (@parameters) { + #print $_,"\n"; + if (m/^(\S+)=(.+)$/) { + print "\t$1 => $2\n"; + $attendee{$1} = $2; + if ($1 eq 'CN' && $2 =~ m/mailto:(\S+)$/) { + $attendee{'CN'} = $1; + $attendee{'username'} = &getUsernameByEmail($ldap, $1); + $hasAttendees = 1 if ($1 ne $email); # Attendee is not the owner + } + } + } + push(@{$vevent{'attendees'}}, \%attendee); + } + + # handle duplicated UID within file + if ($duplicatedUID{$uid}) { + $uid .= $duplicatedUID{$uid}; + $duplicatedUID{$vevent{'uid'}}++; + } + else { + $duplicatedUID{$uid} = 1; + } + + unless (DUPLICATES eq 'update') { + if (&searchByUid($username, $uid)) { + print STDERR "Event with UID '$uid' already exists\n"; + return 0 if (DUPLICATES eq 'ignore'); + + if (DUPLICATES eq 'replace') { + &deleteEvent($username, $uid); + } +# elsif ($hasAttendees) { +# print STDERR "UID collision (",$uid,") for an event with attendee(s); ignoring it\n"; +# return 0; +# } + else { + # Make sure UID is unique (DUPLICATES eq 'create') + my $i = ($duplicatedUID{$vevent{'uid'}})?$duplicatedUID{$vevent{'uid'}}:1; + for ($uid .= $i; + &searchByUid($username, $uid) == 1; + print STDERR "Event with UID '$uid' already exists\n", + $uid = $vevent{'uid'} . $i, + $i++) + {}; + $duplicatedUID{$vevent{'uid'}} = $i + 1; + } + } + } + + # If UID already exists, change it in the VEVENT + if ($uid ne $vevent{'uid'}) { + $vevent{'data'} =~ s/^UID:\S+$/UID:$uid/m; + } + + if ($vevent{'data'} =~ m/^SUMMARY:[;\s]*$/m) { + $vevent{'data'} =~ s#^(BEGIN:VEVENT)#$1\nSUMMARY: (untitled event)#m; + } + + if ($vevent{'recurrent'}) { + $vevent{'data'} =~ s#^(BEGIN:VEVENT)#$1\nRRULE:FREQ=DAILY;COUNT=1;INTERVAL=1#m; + } + + $vevent{'data'} = + "BEGIN:VCALENDAR\n" . + "VERSION:2.0\n" . + "PRODID:Oracle/Oracle Calendar Server 10.1.2.3.3\n" . + $vevent{'data'} . + "END:VCALENDAR"; + + if (DEBUG) { + foreach my $key (keys %vevent) { + if (ref($vevent{$key}) eq 'ARRAY') { + print "$key =>\n"; + foreach (@{$vevent{$key}}) { + my %hash = %{$_}; + print " =>"; + foreach (keys %hash) { + print "\t$_ => $hash{$_}\n"; + } + } + } + else { + print "$key = \n\t", $vevent{$key},"\n";# unless ($key eq 'data'); + } + } + } + print "PUT ",&calendarUrl($username, $uid),"\n"; + + return 0 if (DRYRUN); + + my $request = HTTP::Request->new(); + + $request->method('PUT'); + $request->uri(&calendarUrl($username, $uid)); + + $request->header('Authorization' => "Basic $pwdhash"); + + #$request->header('Accept-Charset' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7'); + #$request->header('Accept-Language' => 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3'); + #$request->header('Content-Type' => 'text/plain; charset=utf-8'); + $request->header('Content-Type' => 'text/calendar; charset=utf-8'); + $request->header('Content-Length' => length($vevent{'data'})); + $request->header('x-sogo-mode' => 'M'); + #$request->header('Connection' => 'TE'); + if (FORCE_CLOSE && ($count % FORCE_CLOSE) == 0) { + print "Force connection close (no keepalive)\n"; + $request->header('Connection' => 'close'); + } + #$request->header('TE' => 'trailers'); + #$request->header('Depth' => 1); + #$request->header('Accept-Charset' => 'utf-8'); + #$request->header('Accept' => 'text/plain'); + $request->content($vevent{'data'}); + + + return &httpRequest($request, $uid); +# my $i; +# for ($i = 0; $i < 30; $i++) { +# my $response = $ua->request($request); +# if ($response->is_success) { +# print "PUT $uid:\t", $response->status_line, "\n"; +# last; +# } +# else { +# print STDERR "ERR PUT $uid:\t", $response->status_line, "\n"; +# sleep(2); +# } +# } +# +# if ($i == 30) { +# print STDERR "ERR PUT $uid:\tCan't reach server for the past 60 secs - exiting.\n"; +# exit(-4); +# } +} + +sub parseEventsFile +{ + my $file = shift; + + my %vevent = (); + my %last_vevent = (); +# data +# uid +# encoding +# organizer +# username +# recurrent + + my $count = 0; + my $count_created = 0; + my $bytes_count = 0; + my $elapsed_time = [gettimeofday]; + + while (my $line = ) { + $line =~ s/\r$//; # remove dos linebreaks + if ($line =~ m/^BEGIN:VEVENT$/) { + $vevent{'data'} = $line; + } + elsif ($line =~ m/^END:VEVENT$/) { + $vevent{'data'} .= $line; + #if ($vevent{'organizer'} eq $email) { + $count++; + $bytes_count += length($vevent{'data'}); + + if (RECURRENT eq 'smart') { + if (%last_vevent) { + if ($last_vevent{'uid'} eq $vevent{'uid'}) { + $last_vevent{'data'} .= $vevent{'data'}; + $last_vevent{'recurrent'} = 1; + if ($last_vevent{'username'} ne $vevent{'username'}) { + print "ERR: Matching UID with different organizers!\n"; + } + } + else { + $count_created += &putEvent(\%last_vevent, $count); + %last_vevent = %vevent; + } + } + else { + %last_vevent = %vevent; + } + } +# elsif ($vevent{'rdate'}) { +# # Ignore event with RDATE attributes -- they are not currently +# # supported in SOGo (web) +# $vevent{'rdate'} = undef; +# print "Event with RDATE -- ignored\n"; +# } + else { + $count_created += &putEvent(\%vevent, $count); + } + #$last_data = $vevent{'data'}; + #last; + #} + #else { + #print $vevent{'uid'},": $email ($username) NOT organizer ",$vevent{'organizer'}," (",$vevent{'username'},"); verify event\n"; + #} + $vevent{'data'} = undef; + #last; + } + elsif ($vevent{'data'}) { + if ($line !~ m/^$/ + && $line !~ m/^RECURRENCE-ID/ + && $line !~ m/^RDATE:/) { + if ($line =~ m/UID:\s*(\S+)$/) { + $vevent{'uid'} = $1; + $vevent{'uid'} =~ s/[#&\/]/-/g; + $vevent{'uid'} =~ s/\.//g; + $line =~ s/^(UID:).*$/$1$vevent{'uid'}/; + } + elsif ($line =~ m/^ORGANIZER:(?:mailto:)?(\S+)$/) { + $vevent{'organizer'} = $1; + $vevent{'username'} = &getUsernameByEmail($ldap, $1); + } +# elsif ($line =~ m/^RDATE:/) { +# $vevent{'rdate'} = 1; +# } + $vevent{'data'} .= $line unless (); + } + else { + print "ignored: '$line'\n"; + } + } + elsif ($line =~ m/Content-Transfer-Encoding: (\S+)$/) { + $vevent{'encoding'} = $1; + } + } + + if (%last_vevent) { + $count_created += &putEvent(\%last_vevent, $count); + } + + printf "\nParsed %i events, %i new: %.1f KB in %.1f seconds\n", + $count, $count_created, ($bytes_count/1024), tv_interval($elapsed_time); + + return 1; +} + +sub gmtTime { + my $time = localtime(shift); + #my ($second,$minute,$hour,$dayofmonth,$month,$year,$weekday,$dayofyear,$isdst) = localtime($time); + + #$year += 1900; + #$month++; + #$hour -= $isdst; + + return sprintf("%04d%02d%02dT%02d%02d%02dZ", + $time->year+1900, + $time->mon+1, + $time->mday, + $time->hour-$time->isdst, + $time->min, + $time->isdst); +} + +sub putTask(\%) { + my (%task) = %{(shift)}; + my $count = shift; + my $bytes_count_ref = shift; + + return 0 unless ($task{'summary'}); + + my $now = &gmtTime(time); + my $uid = md5_hex(%task); + my $data = <<'VCAL'; +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Inverse inc.//SOGo 0.9//EN +BEGIN:VTODO +UID:%s +SUMMARY:%s +LOCATION: +VCAL + + $data = sprintf($data, uc($uid), $task{'summary'}); + $data .= "PRIORITY:" . $task{'priority'} . "\n" if ($task{'priority'}); + $data .= "CREATED:$now\n"; + $data .= "DTSTAMP:$now\n"; + $data .= "LAST-MODIFIED:$now\n"; + $data .= "DTSTART:" . &gmtTime($task{'start'}) . "\n" if ($task{'start'}); + $data .= "DUE:" . &gmtTime($task{'end'}) . "\n" if ($task{'end'}); + if (defined($task{'completion'})) { + if (scalar($task{'completion'}) < 100) { + $data .= "STATUS:IN-PROCESS\n"; + } + else { + $data .= "STATUS:COMPLETED\n"; + } + $data .= "PERCENT-COMPLETE:" . $task{'completion'} . "\n"; + } + $data .= "DESCRIPTION:" . join("\\r\\n", @{$task{'description'}}) . "\n" if ($task{'description'}); + $data .= "END:VTODO\n"; + $data .= "END:VCALENDAR\n"; + + $$bytes_count_ref += length($data); + + print $data if (DEBUG); + print "PUT ",&calendarUrl($username, $uid),"\n"; + + return 0 if (DRYRUN); + + my $request = HTTP::Request->new(); + + $request->method('PUT'); + $request->uri(&calendarUrl($username, $uid)); + $request->header('Authorization' => "Basic $pwdhash"); + $request->header('Content-Type' => 'text/calendar; charset=utf-8'); + $request->header('Content-Length' => length($data)); + $request->header('x-sogo-mode' => 'M'); + if (FORCE_CLOSE && ($count % FORCE_CLOSE) == 0) { + print "Force connection close (no keepalive)\n"; + $request->header('Connection' => 'close'); + } + $request->content($data); + + return &httpRequest($request, $uid); +} + +sub parseTasksFile { +# S 9265740 +# D 9266220 +# T task august 13th +# R 1 +# L 100 +# M bar foo +# W bar foo +# C task august 13th 2008 +# C line 2 description +# C line 3 +# O + +# BEGIN:VCALENDAR +# VERSION:2.0 +# PRODID:-//Inverse inc.//SOGo 0.9//EN +# BEGIN:VTODO +# UID:26A-4979F880-1-B72F03D0 +# SUMMARY:this is a task +# LOCATION:there +# PRIORITY:1 +# STATUS:IN-PROCESS +# CREATED:20090123T170443Z +# DTSTAMP:20090123T170443Z +# LAST-MODIFIED:20090123T170443Z +# DTSTART:20090123T171500Z +# DUE:20090124T181500Z +# PERCENT-COMPLETE:40 +# DESCRIPTION:foo +# END:VTODO +# END:VCALENDAR + + #my $file = $_[0]; + my $count = 0; + my $count_created = 0; + my $bytes_count = 0; + my $elapsed_time = [gettimeofday]; + my %task = (); + # Start and due times are computed in minutes since since Jan 1 1991 + my $basetime = timelocal(0, 0, 0, 1, 0, 91); +# my $tm = localtime($basetime); +# printf("Base date: %04d/%02d/%02d %02d:%02d:%02d\n", +# $tm->year+1900, $tm->mon+1, $tm->mday, +# $tm->hour, $tm->min, $tm->sec); + +# open (my $tasksfile, $file) +# or die "Cannot open tasks file '$file'"; + +# while ($line = <$tasksfile>) { + while (my $line = ) { + #$line =~ s/\n$//; + chomp $line; + if ($line =~ m/^O/) { + if (%task) { + $count++; + $count_created += &putTask(\%task, $count, \$bytes_count); + %task = (); + } + } + elsif ($line =~ m/^T (.+)/) { + $task{'summary'} = $1; + } + elsif ($line =~ m/^S (\d+)/ && $1) { + $task{'start'} = $1*60 + $basetime; + } + elsif ($line =~ m/^D (\d+)/ && $1) { + # End time (number of minutes since Jan 1 1991) + $task{'end'} = $1*60 + $basetime; +# $tm = localtime($task{'end'}); +# printf("End date: %04d/%02d/%02d %02d:%02d:%02d\n", +# $tm->year+1900, $tm->mon+1, $tm->mday, +# $tm->hour, $tm->min, $tm->sec); + } + elsif ($line =~ m/^R (\w+)/) { + $task{'priority'} = $1; + } + elsif ($line =~ m/^L (\w+)/) { + $task{'completion'} = $1; + } + elsif ($line =~ m/^C (.+)/) { + $task{'description'} = () unless ($task{'description'}); + push(@{$task{'description'}}, $1); + } + } + + #close ($tasksfile); + close (CAL); + + printf "\nParsed %i tasks, %i new: %.1f KB in %.1f seconds\n", + $count, $count_created, ($bytes_count/1024), tv_interval($elapsed_time); + + return 1; +} + +sub parseRightsFile +{ + my $file = $_[0]; + + open (my $rightsfile, $file) + or die "Cannot open rights file '$file'"; + + my $line = <$rightsfile>; + $line =~ s/\n$//; +#line:---procuration, username, foo.bar@foo.edu + my $user; + if ($line =~ m@^\-\-\-procuration, ([^,]+),@) { + $user = $1; + print "rights for user's calendar: $user\n"; + } + else { + die "Could not parse procuration line: $line"; + } + + my $next = 0; # 0 = Grantee, 1 = Designate right + my $grantee; + my $rights; + + while ($line = <$rightsfile>) { + $line =~ s/\n$//; + if ($next == 0) { + if ($line =~ m@^Grantee:\ S=[^/]+/G=[^/]+/UID=([^/]+)/ID=[^/]+/NODE\-ID=[^/]+$@) { + $grantee = $1; + } + else { + die "Expected or mal-formed 'Grantee' line: $line"; + } + $next = 1; + } + elsif ($next == 1) { + if ($line =~ m@^Designate\ Right:\ (.*)$@) { + my $oracleRights = $1; + $rights = &convertOracleRights($oracleRights); + } + else { + die "Expected or mal-formed 'Designate Right' line: $line"; + } + &grantUserRights($grantee, $rights, $user); + $next = 0; + } + } + + close ($rightsfile); +} + +#line:Designate Right: CONFIDENTIALEVENT=NONE/CONFIDENTIALTASK=NONE/NORMALEVENT=MODIFY/NORMALTASK=MODIFY/PERSONALEVENT=VIEWTIME/PERSONALTASK=NONE/PUBLICEVENT=MODIFY/PUBLICTASK=MODIF +sub convertOracleRights() +{ + my $oracleRights = $_[0]; + my %keyMapping = ( 'CONFIDENTIAL' => 'Confidential', + 'NORMAL' => 'Public', + 'PUBLIC' => 'Public', + 'PERSONAL' => 'Private' ); + my %valueMapping = ( 'VIEW' => 'Viewer', # à confirmer + 'VIEWTIME' => 'DAndTViewer', + 'MODIFY' => 'Modifier', + 'REPLY' => 'Responder' ); + + my %rights = (); + + my @parsedRights = split('/', $oracleRights); + foreach my $parsedRight (@parsedRights) { + my ($key, $value) = split('=', $parsedRight); + if ($key =~ /(.*)EVENT$/ && $value ne 'NONE') { + $key = $1; + die "No mapping found for key '$key'" + unless defined $keyMapping{$key}; + die "No mapping found for value '$value'" + unless defined $valueMapping{$value}; + $rights{$keyMapping{$key}.$valueMapping{$value}} = 1; + } + } + + return [keys %rights]; +} + +sub grantUserRights() +{ + my ($grantee, $rights, $user) = @_; + + die "No grantee specified" + unless defined $grantee; + die "No rights specified" + unless defined $rights; + die "No user specified" + unless defined $user; + + my $xmlRights = ""; + + foreach my $right (@$rights) { + $xmlRights .= "<$right/>"; + } + my $content = ( '' . "\n" + . '' . $xmlRights . '' ); + + my $request = HTTP::Request->new(); + $request->method('POST'); + $request->uri(&calendarUrl($user)); + $request->header('Authorization' => "Basic $pwdhash"); + $request->header('Content-Type' => 'application/xml'); + $request->header('Content-Length' => length($content)); + $request->content($content); + + my $result = &httpRequest($request, $username); + + my $response = $ua->request($request); +} + +## +## MAIN +## + +if ($#ARGV < 3) { + &usage(); + exit(-1); +} + +$url = $ARGV[0]; +$username = $ARGV[1]; +my $type = $ARGV[2]; +$file = $ARGV[3]; + +if ($type ne 'events' && $type ne 'tasks' && $type ne 'rights') { + usage("The argument 'type' does not have a proper value: '$type'"); + exit(-1); +} + +# Prepare LDAP connection +$ldap = new Net::LDAP(LDAP_HOST) or die "Can't connect to LDAP server: $@.\n"; +my $msg = $ldap->bind(LDAP_BIND_DN, password => LDAP_BIND_PW); +if ($msg->is_error()) { + die "Can't bind to LDAP server: ".$msg->error()."\n"; +} + +# Verify file name format; extract username +#if ($file =~ m/^(?!.+?\W)?events\.(\d{8}|invite\d+)$/) { +#if ($file =~ m/^(?:.+\/)?(events|tasks|rights)\.(\d{8}|invite\d+|[a-z]+)(\.test\d?)?$/) { +# $username = $2; +$email = &getEmailByUsername($ldap, $username); +print "$username = $email\n"; + +if (FORCE_USERNAME) { + $username = FORCE_USERNAME; + print "Force username to $username\n"; +} + +# Open iCalendar file +open (CAL, $file) or die "Can't open file $file: $!\n"; + +# Prepare HTTP query +if ($url =~ m#^(https?://)(?:([^:]+):([^@]+)@)?([^/]+)#) { + ($authusername, $password, $host) = ($2, $3, $4); + $url = $1.$4; + if ($host =~ m/:(\d+)/) { + $port = $1; + } + elsif ($url =~ m/^https/) { + $port = '443'; + $host .= ":$port"; + } + else { + $port = '80'; + $host .= ":$port"; + } +# print "host = $host, auth = $authusername\n"; +} +else { + &usage("The URL doesn't have the proper format."); + exit(-3); +} + +$pwdhash = encode_base64($authusername . ':' . $password); + +$ua = LWP::UserAgent->new(); +$ua->agent('Mozilla/5.0'); +$ua->timeout(1800); + +# Verify is user personal calendar exists (or can be automatically created) +die "Can't access personal calendar of username $username\n" unless (&userCalendarExists($username)); + +my $parsers = { 'events' => \&parseEventsFile, + 'tasks' => \&parseTasksFile, + 'rights' => \&parseRightsFile }; +$parsers->{$type}($file); + +exit; diff --git a/NEWS b/NEWS index 0d7412b5b..389096e1a 100644 --- a/NEWS +++ b/NEWS @@ -1,10 +1,12 @@ -1.3-201008xx (1.3.1) +1.3-20100819 (1.3.1) -------------------- - added migration scripts for Horde (email signatures and address books) +- added migration script for Oracle Calendar (events, tasks and access rights) - added Polish translation - added crypt support to SQL sources - updated Ukrainian translation - added the caldav-auto-schedule capability +- improved support for IE8 1.3-20100721 (1.3.0) -------------------- diff --git a/Tests/Integration/README b/Tests/Integration/README index 5cab950d4..ca98c90c0 100644 --- a/Tests/Integration/README +++ b/Tests/Integration/README @@ -6,7 +6,9 @@ setup 1) copy config.py.in to config.py (make sure to never EVER add it to monotone) 2) edit config.py to suit your environment -3) run the test scripts +3) make sure that you use a fresh database, with no prior information in it +4) make sure that SOGoCalendarDefaultRoles and SOGoContactsDefaultRoles are empty or undefined +5) run the test scripts runnable scripts ---------------- diff --git a/UI/MainUI/Version b/UI/MainUI/Version index 4010e5dd4..458cc5adb 100644 --- a/UI/MainUI/Version +++ b/UI/MainUI/Version @@ -1,3 +1,13 @@ # Version file +<<<<<<< variant A SUBMINOR_VERSION:=1 + +# v0.9.1 requires Main v0.9.59 +>>>>>>> variant B +SUBMINOR_VERSION:=1 +####### Ancestor +SUBMINOR_VERSION:=0 + +# v0.9.1 requires Main v0.9.59 +======= end diff --git a/UI/WebServerResources/SOGoResizableTable.js b/UI/WebServerResources/SOGoResizableTable.js index 86becd48a..9bde09c52 100644 --- a/UI/WebServerResources/SOGoResizableTable.js +++ b/UI/WebServerResources/SOGoResizableTable.js @@ -24,11 +24,12 @@ var SOGoResizableTableInterface = { } SOGoResizableTable._resize(this, $(cell), i, null, cell.getWidth()); } + this.computeColumnsWidths(); Event.observe(window, "resize", this.resize.bind(this)); }, resize: function(e) { - // Only resize the columns after a certain delay, otherwise it slow + // Only resize the columns after a certain delay, otherwise it slows // down the interface. if (this.delayedResize) window.clearTimeout(this.delayedResize); this.delayedResize = this._resize.bind(this).delay(0.2); @@ -62,7 +63,7 @@ var SOGoResizableTableInterface = { this.ratios = relativeWidths; }, - saveColumnsState: function() { + computeColumnsWidths: function() { this.ratios = new Hash(); var tableWidth = 100/this.getWidth(); var cells = $(this).down('tr').childElements(); @@ -71,6 +72,10 @@ var SOGoResizableTableInterface = { if (cell.hasClassName('resizable')) this.ratios.set(cell.id, Math.round(cell.getWidth()*tableWidth)); } + }, + + saveColumnsState: function() { + this.computeColumnsWidths(); if (!$(document.body).hasClassName("popup")) { var url = ApplicationBaseURL + "saveColumnsState"; var data = this.ratios; diff --git a/UI/WebServerResources/UIxPreferences.js b/UI/WebServerResources/UIxPreferences.js index 77fed756f..51bca2fc0 100644 --- a/UI/WebServerResources/UIxPreferences.js +++ b/UI/WebServerResources/UIxPreferences.js @@ -251,7 +251,6 @@ function _editFilter(filterId) { } function onFilterAdd(event) { - log("onFilterAdd"); _editFilter("new"); event.stop(); }