propagate from branch 'ca.inverse.sogo.1_3_12' (head f5ba6db440f5a8ba817af65dea12b4a616fdfe71)

to branch 'ca.inverse.sogo' (head df5dd81d62db331ba5c8de9f2257f9430c586534)

Monotone-Parent: df5dd81d62db331ba5c8de9f2257f9430c586534
Monotone-Parent: f5ba6db440f5a8ba817af65dea12b4a616fdfe71
Monotone-Revision: 31373520d86c320c1658f22e3bde2eee178c2003

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2012-01-09T16:38:18
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Wolfgang Sourdeau 2012-01-09 16:38:18 +00:00
commit 5468b9b1a2
11 changed files with 141 additions and 68 deletions

View File

@ -1,3 +1,8 @@
2012-01-05 Francis Lachapelle <flachapelle@inverse.ca>
* SoObjects/SOGo/SOGoUserManager.m (-_registerSource:inDomain::):
log error when duplicated IDs are found.
2012-01-04 Wolfgang Sourdeau <wsourdeau@inverse.ca> 2012-01-04 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* UI/WebServerResources/ContactsUI.js * UI/WebServerResources/ContactsUI.js
@ -66,6 +71,20 @@
the identifier of the source that authenticated the specified user the identifier of the source that authenticated the specified user
as the "SOGoSource" entry of the returned dictionary. as the "SOGoSource" entry of the returned dictionary.
2012-01-03 Francis Lachapelle <flachapelle@inverse.ca>
* SoObjects/Appointments/SOGoAptMailNotification.m (-setupValues):
don't set the start/end times when dealing with an all-day event.
* SoObjects/Appointments/SOGoAptMailInvitation.m (-getBody): don't
display the start/end times when dealing with an all-day event.
* SoObjects/Appointments/SOGoAptMailReceipt.m (-_formattedUserDate:): idem.
* SoObjects/Appointments/SOGoAptMailUpdate.m (-getSubject): idem.
* SoObjects/Appointments/SOGoAptMailDeletion.m (-getBody): idem.
2012-01-02 Francis Lachapelle <flachapelle@inverse.ca> 2012-01-02 Francis Lachapelle <flachapelle@inverse.ca>
* UI/WebServerResources/UIxPreferences.js (getFilterFromEditor): * UI/WebServerResources/UIxPreferences.js (getFilterFromEditor):

View File

@ -1,3 +1,8 @@
2012-01-09 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* NSString+NGCards.m (-vCardSubvalues): fixed allocation of
parsing buffer to avoid a buffer overflow.
2011-12-30 Wolfgang Sourdeau <wsourdeau@inverse.ca> 2011-12-30 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* NGVCard.m (-initWithUid:): initialize "CLASS" and "PROFILE". * NGVCard.m (-initWithUid:): initialize "CLASS" and "PROFILE".

View File

@ -337,7 +337,7 @@
valuesKey = @""; valuesKey = @"";
max = [self length]; max = [self length];
stringBuffer = NSZoneMalloc (NULL, sizeof (unichar) * max + 1); stringBuffer = NSZoneMalloc (NULL, sizeof (unichar) * (max + 1));
[self getCharacters: stringBuffer]; [self getCharacters: stringBuffer];
stringBuffer[max] = 0; stringBuffer[max] = 0;

View File

@ -35,14 +35,19 @@ vtodo_class2 = "(Confidential task)";
/* Invitation */ /* Invitation */
"Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\""; "Event Invitation: \"%{Summary}\"" = "Event Invitation: \"%{Summary}\"";
"(sent by %{SentBy}) " = "(sent by %{SentBy}) "; "(sent by %{SentBy}) " = "(sent by %{SentBy}) ";
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}" = "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}";
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}";
/* Deletion */ /* Deletion */
"Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\""; "Event Cancelled: \"%{Summary}\"" = "Event Cancelled: \"%{Summary}\"";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}"
= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"
= "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"; = "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}";
/* Update */ /* Update */
"The appointment \"%{Summary}\" for the %{OldStartDate} has changed"
= "The appointment \"%{Summary}\" for the %{OldStartDate} has changed";
"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed" "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"
= "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed"; = "The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed";
"The following parameters have changed in the \"%{Summary}\" meeting:" "The following parameters have changed in the \"%{Summary}\" meeting:"

View File

@ -1,5 +1,5 @@
/* /*
Copyright (C) 2010 Inverse Copyright (C) 2010-2012 Inverse
This file is part of SOGo This file is part of SOGo
@ -49,12 +49,20 @@
if (!values) if (!values)
[self setupValues]; [self setupValues];
if ([values objectForKey: @"StartTime"] && [values objectForKey: @"EndTime"])
bodyFormat = [self labelForKey: (@"%{Organizer} %{SentByText}has cancelled" bodyFormat = [self labelForKey: (@"%{Organizer} %{SentByText}has cancelled"
@" this event: %{Summary}.\n\n" @" this event: %{Summary}.\n\n"
@"Start: %{StartDate} at %{StartTime}\n" @"Start: %{StartDate} at %{StartTime}\n"
@"End: %{EndDate} at %{EndTime}\n" @"End: %{EndDate} at %{EndTime}\n"
@"Description: %{Description}") @"Description: %{Description}")
inContext: context]; inContext: context];
else
bodyFormat = [self labelForKey: (@"%{Organizer} %{SentByText}has cancelled"
@" this event: %{Summary}.\n\n"
@"Start: %{StartDate}\n"
@"End: %{EndDate}\n"
@"Description: %{Description}")
inContext: context];
return [values keysWithFormat: bodyFormat]; return [values keysWithFormat: bodyFormat];
} }

View File

@ -1,5 +1,5 @@
/* /*
Copyright (C) 2010 Inverse Copyright (C) 2010-2012 Inverse
This file is part of SOGo This file is part of SOGo
@ -54,7 +54,19 @@
if (!values) if (!values)
[self setupValues]; [self setupValues];
bodyFormat = [self labelForKey: @"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" if ([values objectForKey: @"StartTime"] && [values objectForKey: @"EndTime"])
bodyFormat = [self labelForKey: (@"%{Organizer} %{SentByText}has invited you"
@" to %{Summary}.\n\n"
@"Start: %{StartDate} at %{StartTime}\n"
@"End: %{EndDate} at %{EndTime}\n"
@"Description: %{Description}")
inContext: context];
else
bodyFormat = [self labelForKey: (@"%{Organizer} %{SentByText}has invited you"
@" to %{Summary}.\n\n"
@"Start: %{StartDate}\n"
@"End: %{EndDate}\n"
@"Description: %{Description}")
inContext: context]; inContext: context];
return [values keysWithFormat: bodyFormat]; return [values keysWithFormat: bodyFormat];

View File

@ -1,5 +1,5 @@
/* /*
Copyright (C) 2006-2010 Inverse inc. Copyright (C) 2006-2012 Inverse inc.
Copyright (C) 2000-2005 SKYRIX Software AG Copyright (C) 2000-2005 SKYRIX Software AG
This file is part of SOGo. This file is part of SOGo.
@ -209,12 +209,14 @@
date = [self newStartDate]; date = [self newStartDate];
[values setObject: [dateFormatter shortFormattedDate: date] [values setObject: [dateFormatter shortFormattedDate: date]
forKey: @"StartDate"]; forKey: @"StartDate"];
if (![apt isAllDay])
[values setObject: [dateFormatter formattedTime: date] [values setObject: [dateFormatter formattedTime: date]
forKey: @"StartTime"]; forKey: @"StartTime"];
date = [self newEndDate]; date = [self newEndDate];
[values setObject: [dateFormatter shortFormattedDate: date] [values setObject: [dateFormatter shortFormattedDate: date]
forKey: @"EndDate"]; forKey: @"EndDate"];
if (![apt isAllDay])
[values setObject: [dateFormatter formattedTime: date] [values setObject: [dateFormatter formattedTime: date]
forKey: @"EndTime"]; forKey: @"EndTime"];

View File

@ -1,6 +1,6 @@
/* SOGoAptMailReceipt.m - this file is part of SOGo /* SOGoAptMailReceipt.m - this file is part of SOGo
* *
* Copyright (C) 2009 Inverse inc. * Copyright (C) 2009-2012 Inverse inc.
* *
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca> * Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
* *
@ -146,6 +146,9 @@ static NSCharacterSet *wsSet = nil;
formatter = [currentUser dateFormatterInContext: context]; formatter = [currentUser dateFormatterInContext: context];
if ([apt isAllDay])
return [formatter formattedDate: tzDate];
else
return [NSString stringWithFormat: @"%@ - %@", return [NSString stringWithFormat: @"%@ - %@",
[formatter formattedDate: tzDate], [formatter formattedDate: tzDate],
[formatter formattedTime: tzDate]]; [formatter formattedTime: tzDate]];

View File

@ -1,5 +1,5 @@
/* /*
Copyright (C) 2010 Inverse Copyright (C) 2010-2012 Inverse
This file is part of SOGo This file is part of SOGo
@ -131,6 +131,8 @@
date = [self oldStartDate]; date = [self oldStartDate];
[values setObject: [dateFormatter shortFormattedDate: date] [values setObject: [dateFormatter shortFormattedDate: date]
forKey: @"OldStartDate"]; forKey: @"OldStartDate"];
if (![apt isAllDay])
[values setObject: [dateFormatter formattedTime: date] [values setObject: [dateFormatter formattedTime: date]
forKey: @"OldStartTime"]; forKey: @"OldStartTime"];
@ -144,9 +146,15 @@
if (!values) if (!values)
[self setupValues]; [self setupValues];
subjectFormat = [self labelForKey: @"The appointment \"%{Summary}\" for the" if ([values objectForKey: @"OldStartTime"])
subjectFormat = [self labelForKey: (@"The appointment \"%{Summary}\" for the"
@" %{OldStartDate} at" @" %{OldStartDate} at"
@" %{OldStartTime} has changed" @" %{OldStartTime} has changed")
inContext: context];
else
subjectFormat = [self labelForKey: (@"The appointment \"%{Summary}\" for the"
@" %{OldStartDate}"
@" has changed")
inContext: context]; inContext: context];
return [values keysWithFormat: subjectFormat]; return [values keysWithFormat: subjectFormat];

View File

@ -102,6 +102,11 @@
sourceID = [udSource objectForKey: @"id"]; sourceID = [udSource objectForKey: @"id"];
if ([sourceID length] > 0) if ([sourceID length] > 0)
{
if ([_sourcesMetadata objectForKey: sourceID])
[self errorWithFormat: @"attempted to register a contact/user source"
@" with duplicated id (%@)", sourceID];
else
{ {
type = [[udSource objectForKey: @"type"] lowercaseString]; type = [[udSource objectForKey: @"type"] lowercaseString];
c = NSClassFromString([_registry sourceClassForType: type]); c = NSClassFromString([_registry sourceClassForType: type]);
@ -140,8 +145,10 @@
value = [udSource objectForKey: @"SearchFieldNames"]; value = [udSource objectForKey: @"SearchFieldNames"];
if (value) if (value)
[metadata setObject: value forKey: @"SearchFieldNames"]; [metadata setObject: value forKey: @"SearchFieldNames"];
[_sourcesMetadata setObject: metadata forKey: sourceID]; [_sourcesMetadata setObject: metadata forKey: sourceID];
} }
}
else else
[self errorWithFormat: @"attempted to register a contact/user source" [self errorWithFormat: @"attempted to register a contact/user source"
@" without id (skipped)"]; @" without id (skipped)"];

View File

@ -457,7 +457,7 @@
{ {
WOResponse *result; WOResponse *result;
NSDictionary *data; NSDictionary *data;
NSCalendarDate *eventDate; NSCalendarDate *eventStartDate, *eventEndDate;
NSTimeZone *timeZone; NSTimeZone *timeZone;
SOGoUserDefaults *ud; SOGoUserDefaults *ud;
SOGoCalendarComponent *co; SOGoCalendarComponent *co;
@ -469,8 +469,10 @@
result = [self responseWithStatus: 200]; result = [self responseWithStatus: 200];
ud = [[context activeUser] userDefaults]; ud = [[context activeUser] userDefaults];
timeZone = [ud timeZone]; timeZone = [ud timeZone];
eventDate = [event startDate]; eventStartDate = [event startDate];
[eventDate setTimeZone: timeZone]; eventEndDate = [event endDate];
[eventStartDate setTimeZone: timeZone];
[eventEndDate setTimeZone: timeZone];
co = [self clientObject]; co = [self clientObject];
if (!componentCalendar) if (!componentCalendar)
@ -507,8 +509,10 @@
data = [NSDictionary dictionaryWithObjectsAndKeys: data = [NSDictionary dictionaryWithObjectsAndKeys:
[componentCalendar displayName], @"calendar", [componentCalendar displayName], @"calendar",
[event tag], @"component", [event tag], @"component",
[dateFormatter formattedDate: eventDate], @"startDate", [dateFormatter formattedDate: eventStartDate], @"startDate",
[dateFormatter formattedTime: eventDate], @"startTime", [dateFormatter formattedTime: eventStartDate], @"startTime",
[dateFormatter formattedDate: eventEndDate], @"endDate",
[dateFormatter formattedTime: eventEndDate], @"endTime",
([event hasRecurrenceRules] ? @"1": @"0"), @"isRecurring", ([event hasRecurrenceRules] ? @"1": @"0"), @"isRecurring",
([event isAllDay] ? @"1": @"0"), @"isAllDay", ([event isAllDay] ? @"1": @"0"), @"isAllDay",
[event summary], @"summary", [event summary], @"summary",