From 776b17ff202c45ff63bfc5144dd0ccc37a2f3e58 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 3 Feb 2015 12:06:28 -0500 Subject: [PATCH 01/60] Fix mail editor when not called from mail module Fixes #3088 --- UI/WebServerResources/UIxMailEditor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/WebServerResources/UIxMailEditor.js b/UI/WebServerResources/UIxMailEditor.js index 10c232fd7..60e10dfa9 100644 --- a/UI/WebServerResources/UIxMailEditor.js +++ b/UI/WebServerResources/UIxMailEditor.js @@ -14,7 +14,7 @@ var MailEditor = { var autoSaveTimer; function refreshDraftsFolder() { - if (window.opener && window.opener.open && !window.opener.closed) { + if (window.opener && window.opener.getUnseenCountForFolder) { var nodes = window.opener.$("mailboxTree").select("DIV[datatype=draft]"); window.opener.getUnseenCountForFolder(nodes[0].readAttribute("dataname")); } From 0b44fa81f4c1ec9c5b812d799bf76399ce240b5b Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 3 Feb 2015 13:20:57 -0500 Subject: [PATCH 02/60] Update NEWS file --- NEWS | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/NEWS b/NEWS index 8177e4989..9c5ebdbd9 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,9 @@ +2.2.16 (2015-02-DD) +------------------- + +Bug fixes + - (regression) fixed sending a message when mail module is not active (#3088) + 2.2.15 (2015-01-30) ------------------- From 923bcf8ae291f574feb611d80c8b5a861dcb663a Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 5 Feb 2015 09:29:29 -0500 Subject: [PATCH 03/60] Applied patch for #3092 --- SOPE/GDLContentStore/GCSChannelManager.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SOPE/GDLContentStore/GCSChannelManager.m b/SOPE/GDLContentStore/GCSChannelManager.m index b21b230a6..d04d70446 100644 --- a/SOPE/GDLContentStore/GCSChannelManager.m +++ b/SOPE/GDLContentStore/GCSChannelManager.m @@ -240,7 +240,7 @@ static NSTimeInterval ChannelCollectionTimer = 5 * 60; handle = currentHandle; else if (debugPools) [self logWithFormat: @"DBPOOL: cannot use handle (%@ vs %@) ", - [_url absoluteString], [handle->url absoluteString]]; + [_url absoluteString], [currentHandle->url absoluteString]]; return handle; } From eca22caefc921fa713c2b83e24831f52b397eca7 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 5 Feb 2015 11:14:53 -0500 Subject: [PATCH 04/60] Fix for bug #3078 --- NEWS | 1 + UI/MailerUI/UIxMailFolderActions.m | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 9c5ebdbd9..6ddb317a6 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ Bug fixes - (regression) fixed sending a message when mail module is not active (#3088) + - mail lables with blanks are not handled correctly (#3078) 2.2.15 (2015-01-30) ------------------- diff --git a/UI/MailerUI/UIxMailFolderActions.m b/UI/MailerUI/UIxMailFolderActions.m index e04bf50bc..4515eac4f 100644 --- a/UI/MailerUI/UIxMailFolderActions.m +++ b/UI/MailerUI/UIxMailFolderActions.m @@ -712,19 +712,26 @@ WORequest *request; SOGoMailFolder *co; NSException *error; - NSArray *msgUIDs, *flags; + NSArray *msgUIDs; + NSMutableArray *flags; NSString *operation; NSDictionary *content, *result; BOOL addOrRemove; NGImap4Client *client; + int i; + request = [context request]; content = [[request contentAsString] objectFromJSONString]; - flags = [NSArray arrayWithObject:[content objectForKey:@"flags"]]; + flags = [NSMutableArray arrayWithObject:[content objectForKey:@"flags"]]; msgUIDs = [NSArray arrayWithArray:[content objectForKey:@"msgUIDs"]]; operation = [content objectForKey:@"operation"]; addOrRemove = ([operation isEqualToString:@"add"]? YES: NO); + // We unescape our flags + for (i = [flags count]-1; i >= 0; i--) + [flags replaceObjectAtIndex: i withObject: [[flags objectAtIndex: i] fromCSSIdentifier]]; + co = [self clientObject]; client = [[co imap4Connection] client]; [[co imap4Connection] selectFolder: [co imap4URL]]; From 3731819e1565a6198237218dff078047628b1316 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 5 Feb 2015 16:21:27 -0500 Subject: [PATCH 05/60] Added patch from tfu for #2995 --- ActiveSync/SOGoMailObject+ActiveSync.m | 85 ++++++++++++++++++++ Documentation/SOGoInstallationGuide.asciidoc | 4 + NEWS | 3 + 3 files changed, 92 insertions(+) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index 6cc06e3d0..e7797dfeb 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -47,6 +47,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import #import #import +#import #import #import @@ -57,6 +58,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import #import +#import + +#import + #include "iCalTimeZone+ActiveSync.h" #include "NSData+ActiveSync.h" #include "NSDate+ActiveSync.h" @@ -774,6 +779,27 @@ struct GlobalObjectId { [s appendString: @""]; [s appendFormat: @"%d", ([self flagged] ? 2 : 0)]; [s appendString: @""]; + + + // Categroies/Labels + NSEnumerator *categories; + categories = [[[self fetchCoreInfos] objectForKey: @"flags"] objectEnumerator]; + + if (categories) + { + NSString *currentFlag; + NSDictionary *v; + + v = [[[context activeUser] userDefaults] mailLabelsColors]; + + [s appendFormat: @""]; + while ((currentFlag = [categories nextObject])) + { + if ([[v objectForKey: currentFlag] objectAtIndex:0]) + [s appendFormat: @"%@", [[[v objectForKey: currentFlag] objectAtIndex:0] activeSyncRepresentationInContext: context]]; + } + [s appendFormat: @""]; + } // FIXME - support these in the future //[s appendString: @"foobar"]; @@ -836,6 +862,65 @@ struct GlobalObjectId { else [self removeFlags: @"seen"];; } + + if ((o = [theValues objectForKey: @"Categories"])) + { + NSEnumerator *categories; + NSString *currentFlag; + NSDictionary *v; + + v = [[[context activeUser] userDefaults] mailLabelsColors]; + + // add categories/labels sent from client + if ([o isKindOfClass: [NSArray class]]) + { + NSEnumerator *enumerator; + NSMutableArray *labels; + NSEnumerator *flags; + id key; + + labels = [NSMutableArray array]; + + enumerator = [v keyEnumerator]; + flags = [o objectEnumerator]; + + while ((currentFlag = [flags nextObject])) + { + while ((key = [enumerator nextObject])) + { + if (([currentFlag isEqualToString:[[v objectForKey:key] objectAtIndex:0]])) + { + [labels addObject: key]; + break; + } + } + } + + [self addFlags: [labels componentsJoinedByString: @" "]]; + } + + categories = [[[self fetchCoreInfos] objectForKey: @"flags"] objectEnumerator]; + + // remove all categories/labels from server which were not it the list sent from client + if (categories) + { + while ((currentFlag = [categories nextObject])) + { + // only deal with lables and don't touch flags like seen and flagged + if (([v objectForKey: currentFlag])) + { + if (![o isKindOfClass: [NSArray class]]) + { + [self removeFlags: currentFlag]; + } + else if (([o indexOfObject: [[v objectForKey:currentFlag] objectAtIndex:0]] == NSNotFound)) + { + [self removeFlags: currentFlag]; + } + } + } + } + } } @end diff --git a/Documentation/SOGoInstallationGuide.asciidoc b/Documentation/SOGoInstallationGuide.asciidoc index e88affe42..b07eedfa2 100644 --- a/Documentation/SOGoInstallationGuide.asciidoc +++ b/Documentation/SOGoInstallationGuide.asciidoc @@ -2421,6 +2421,10 @@ Please be aware of the following limitations: solution is to configure Outlook to use a LDAP server (over SSL) with authentication. Outlook 2013 also does not seem to support multiple address books over ActiveSync. +* To successfully synchronize Outlook email categories, a corresponding +mail label (Preferences->Mail Options) has to be created manually in SOGo +for each label defined in Outlook. The name in SOGo and in Outlook must be +identical. * Make sure you do not use a self-signed certificate. While this will work, Outlook will work intermittently as it will raise popups for certificate validation, sometimes in background, preventing the user to diff --git a/NEWS b/NEWS index 6ddb317a6..1fc92edbf 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,9 @@ 2.2.16 (2015-02-DD) ------------------- +Enhancements + - added support for email categories using EAS (#2995) + Bug fixes - (regression) fixed sending a message when mail module is not active (#3088) - mail lables with blanks are not handled correctly (#3078) From 98e4c8ca55b0424111bd7c98060f689316008572 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 9 Feb 2015 09:10:55 -0500 Subject: [PATCH 06/60] Fixed doc regarder domain vs. system settings --- Documentation/SOGoInstallationGuide.asciidoc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Documentation/SOGoInstallationGuide.asciidoc b/Documentation/SOGoInstallationGuide.asciidoc index b07eedfa2..32961a09e 100644 --- a/Documentation/SOGoInstallationGuide.asciidoc +++ b/Documentation/SOGoInstallationGuide.asciidoc @@ -1329,27 +1329,27 @@ The following table describes the parameters that were set: [cols="3,47,50a"] |======================================================================= -|D |SOGoProfileURL +|S |SOGoProfileURL |Parameter used to set the database URL so that SOGo can retrieve user profiles. For MySQL, set the database URL to something like: `mysql://sogo:sogo@localhost:3306/sogo/sogo_user_profile`. -|D |OCSFolderInfoURL +|S |OCSFolderInfoURL |Parameter used to set the database URL so that SOGo can retrieve the location of user folders (address books and calendars). For Oracle, set the database URL to something like: `oracle://sogo:sogo@localhost:1526/sogo/sogo_folder_info`. -|D |OCSSessionsFolderURL +|S |OCSSessionsFolderURL |Parameter used to set the database URL so that SOGo can store and retrieve secured user sessions information. For PostgreSQL, the database URL could be set to something like: `postgresql://sogo:sogo@localhost:5432/sogo/sogo_sessions_folder`. -|D |OCSEMailAlarmsFolderURL +|S |OCSEMailAlarmsFolderURL |Parameter used to set the database URL for email-based alarms (that can be set on events and tasks). This parameter is relevant only if _SOGoEnableEMailAlarms_ is set to `YES`. For PostgreSQL, the database From 6c9b1a494fa1f0a44b118f6c4a399e958796704d Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 9 Feb 2015 16:12:59 -0500 Subject: [PATCH 07/60] Fix for bug #2332 --- NEWS | 1 + SoObjects/SOGo/SOGoSieveManager.m | 31 +++++++++++++------ .../English.lproj/Localizable.strings | 1 + UI/PreferencesUI/UIxPreferences.m | 24 ++++++++++++++ UI/Templates/PreferencesUI/UIxPreferences.wox | 12 +++++-- 5 files changed, 57 insertions(+), 12 deletions(-) diff --git a/NEWS b/NEWS index 1fc92edbf..a3492a07f 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ Enhancements - added support for email categories using EAS (#2995) + - now possible to always send vacation messages (#2332) Bug fixes - (regression) fixed sending a message when mail module is not active (#3088) diff --git a/SoObjects/SOGo/SOGoSieveManager.m b/SoObjects/SOGo/SOGoSieveManager.m index 2f949ad20..f2f5a7b41 100644 --- a/SoObjects/SOGo/SOGoSieveManager.m +++ b/SoObjects/SOGo/SOGoSieveManager.m @@ -835,13 +835,16 @@ static NSString *sieveScriptName = @"sogo"; if (values && [[values objectForKey: @"enabled"] boolValue]) { + NSMutableString *vacation_script; NSArray *addresses; NSString *text; - BOOL ignore; + + BOOL ignore, alwaysSend; int days, i; - + days = [[values objectForKey: @"daysBetweenResponse"] intValue]; addresses = [values objectForKey: @"autoReplyEmailAddresses"]; + alwaysSend = [[values objectForKey: @"alwaysSend"] boolValue]; ignore = [[values objectForKey: @"ignoreLists"] boolValue]; text = [values objectForKey: @"autoReplyText"]; b = YES; @@ -849,28 +852,38 @@ static NSString *sieveScriptName = @"sogo"; if (days == 0) days = 7; + vacation_script = [NSMutableString string]; + [req addObjectUniquely: @"vacation"]; // Skip mailing lists if (ignore) - [script appendString: @"if allof ( not exists [\"list-help\", \"list-unsubscribe\", \"list-subscribe\", \"list-owner\", \"list-post\", \"list-archive\", \"list-id\", \"Mailing-List\"], not header :comparator \"i;ascii-casemap\" :is \"Precedence\" [\"list\", \"bulk\", \"junk\"], not header :comparator \"i;ascii-casemap\" :matches \"To\" \"Multiple recipients of*\" ) {"]; + [vacation_script appendString: @"if allof ( not exists [\"list-help\", \"list-unsubscribe\", \"list-subscribe\", \"list-owner\", \"list-post\", \"list-archive\", \"list-id\", \"Mailing-List\"], not header :comparator \"i;ascii-casemap\" :is \"Precedence\" [\"list\", \"bulk\", \"junk\"], not header :comparator \"i;ascii-casemap\" :matches \"To\" \"Multiple recipients of*\" ) {"]; - [script appendFormat: @"vacation :days %d :addresses [", days]; + [vacation_script appendFormat: @"vacation :days %d :addresses [", days]; for (i = 0; i < [addresses count]; i++) { - [script appendFormat: @"\"%@\"", [addresses objectAtIndex: i]]; + [vacation_script appendFormat: @"\"%@\"", [addresses objectAtIndex: i]]; if (i == [addresses count]-1) - [script appendString: @"] "]; + [vacation_script appendString: @"] "]; else - [script appendString: @", "]; + [vacation_script appendString: @", "]; } - [script appendFormat: @"text:\r\n%@\r\n.\r\n;\r\n", text]; + [vacation_script appendFormat: @"text:\r\n%@\r\n.\r\n;\r\n", text]; if (ignore) - [script appendString: @"}\r\n"]; + [vacation_script appendString: @"}\r\n"]; + + // + // See http://sogo.nu/bugs/view.php?id=2332 for details + // + if (alwaysSend) + [script insertString: vacation_script atIndex: 0]; + else + [script appendString: vacation_script]; } diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index 538bd3d9b..e318a2f5b 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Days between responses :" = "Days between responses:"; "Do not send responses to mailing lists" = "Do not send responses to mailing lists"; "Disable auto reply on" = "Disable auto reply on"; +"Always send vacation message response" = "Always send vacation message response"; "Please specify your message and your email addresses for which you want to enable auto reply." = "Please specify your message and your email addresses for which you want to enable auto reply."; "Your vacation message must not end with a single dot on a line." = "Your vacation message must not end with a single dot on a line."; diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index a43a8e744..49d5ab350 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -1127,6 +1127,30 @@ static NSArray *reminderValues = nil; return ignore; } +// +// See http://sogo.nu/bugs/view.php?id=2332 for details +// +- (void) setAlwaysSend: (BOOL) ignoreLists +{ + [vacationOptions setObject: [NSNumber numberWithBool: ignoreLists] + forKey: @"alwaysSend"]; +} + +- (BOOL) alwaysSend +{ + NSNumber *obj; + BOOL ignore; + + obj = [vacationOptions objectForKey: @"alwaysSend"]; + + if (obj == nil) + ignore = NO; // defaults to NO + else + ignore = [obj boolValue]; + + return ignore; +} + - (BOOL) enableVacationEndDate { return [[vacationOptions objectForKey: @"endDateEnabled"] boolValue]; diff --git a/UI/Templates/PreferencesUI/UIxPreferences.wox b/UI/Templates/PreferencesUI/UIxPreferences.wox index a89c8a204..efafdabef 100644 --- a/UI/Templates/PreferencesUI/UIxPreferences.wox +++ b/UI/Templates/PreferencesUI/UIxPreferences.wox @@ -600,7 +600,7 @@
- +
+ + diff --git a/UI/WebServerResources/UIxPreferences.js b/UI/WebServerResources/UIxPreferences.js index 7c2d12652..071ba6da8 100644 --- a/UI/WebServerResources/UIxPreferences.js +++ b/UI/WebServerResources/UIxPreferences.js @@ -70,11 +70,42 @@ function savePreferences(sender) { if ($("enableForward") && $("enableForward").checked) { var addresses = $("forwardAddress").value.split(","); + + // We check if all addresses are valid for (var i = 0; i < addresses.length && sendForm; i++) if (!emailRE.test(addresses[i].strip())) { showAlertDialog(_("Please specify an address to which you want to forward your messages.")); sendForm = false; } + + // We check if we can only to internal/external addresses. + var constraints = parseInt($("forwardConstraints").value); + + if (constraints > 0) { + // We first extract the list of 'known domains' to SOGo + var defaultAddresses = $("defaultEmailAddresses").value.split(/, */); + var domains = new Array(); + + defaultAddresses.each(function(adr) { + var domain = adr.split("@")[1]; + if (domain) { + domains.push(domain.toLowerCase()); + } + }); + + // We check if we're allowed or not to forward based on the domain defaults + for (var i = 0; i < addresses.length && sendForm; i++) { + var domain = addresses[i].split("@")[1].toLowerCase(); + if (domains.indexOf(domain) < 0 && constraints == 1) { + showAlertDialog(_("You are not allowed to forward your messages to an external email address.")); + sendForm = false; + } + else if (domains.indexOf(domain) >= 0 && constraints == 2) { + showAlertDialog(_("You are not allowed to forward your messages to an internal email address.")); + sendForm = false; + } + } + } } if (typeof sieveCapabilities != "undefined") { From 9447437d6fd9da2701312363ae92427d2404749a Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 11 Feb 2015 14:33:32 -0500 Subject: [PATCH 13/60] Added missing strings from previous commit --- UI/PreferencesUI/English.lproj/Localizable.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index e318a2f5b..c0885ec35 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -41,6 +41,9 @@ "Keep a copy" = "Keep a copy"; "Please specify an address to which you want to forward your messages." = "Please specify an address to which you want to forward your messages."; +"You are not allowed to forward your messages to an external email address." = "You are not allowed to forward your messages to an external email address."; +"You are not allowed to forward your messages to an internal email address." = "You are not allowed to forward your messages to an internal email address."; + /* d & t */ "Current Time Zone :" = "Current Time Zone:"; From b4ea4d7e9fd90520675452bdcbf70155d6b87eef Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 11 Feb 2015 14:39:57 -0500 Subject: [PATCH 14/60] Improvement over previous commit --- UI/Templates/PreferencesUI/UIxPreferences.wox | 9 ++++----- UI/WebServerResources/UIxPreferences.js | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/UI/Templates/PreferencesUI/UIxPreferences.wox b/UI/Templates/PreferencesUI/UIxPreferences.wox index 4d08baaa8..6459c874d 100644 --- a/UI/Templates/PreferencesUI/UIxPreferences.wox +++ b/UI/Templates/PreferencesUI/UIxPreferences.wox @@ -653,11 +653,10 @@ const:name="forwardKeepCopy" const:id="forwardKeepCopy" var:checked="forwardKeepCopy" /> -
- - +
+ diff --git a/UI/WebServerResources/UIxPreferences.js b/UI/WebServerResources/UIxPreferences.js index 071ba6da8..8b1f59f9d 100644 --- a/UI/WebServerResources/UIxPreferences.js +++ b/UI/WebServerResources/UIxPreferences.js @@ -79,7 +79,7 @@ function savePreferences(sender) { } // We check if we can only to internal/external addresses. - var constraints = parseInt($("forwardConstraints").value); + var constraints = parseInt(forwardConstraints); if (constraints > 0) { // We first extract the list of 'known domains' to SOGo From f3325b8b0d59a730716090b8f5e1319ce3edfd70 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 11 Feb 2015 18:13:36 -0500 Subject: [PATCH 15/60] Updated NEWS file wrt fixes --- NEWS | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 083535106..d4399048e 100644 --- a/NEWS +++ b/NEWS @@ -13,7 +13,8 @@ Enhancements Bug fixes - (regression) fixed sending a message when mail module is not active (#3088) - mail lables with blanks are not handled correctly (#3078) - - fix BlackBerry issues sending multiple mails over EAS (#3095) + - fixed BlackBerry issues sending multiple mails over EAS (#3095) + - fixed plain/text mails showing on one line on Android/EAS (#3055) 2.2.15 (2015-01-30) ------------------- From d7c283f7511c7753f2cf0fc5af0e2eaea826b66f Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 12 Feb 2015 08:49:17 -0500 Subject: [PATCH 16/60] improved fetching of text parts over EAS --- ActiveSync/SOGoMailObject+ActiveSync.m | 24 ++++++++++++++++++++---- NEWS | 1 + 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index a1b8c8434..9950975d5 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -209,6 +209,7 @@ struct GlobalObjectId { // // - (NSData *) _preferredBodyDataInMultipartUsingType: (int) theType + nativeTypeFound: (int *) theNativeTypeFound { NSString *encoding, *key, *plainKey, *htmlKey, *type, *subtype; NSDictionary *textParts, *part; @@ -238,11 +239,22 @@ struct GlobalObjectId { } key = nil; + *theNativeTypeFound = 1; - if (theType == 2) - key = htmlKey; - else if (theType == 1) + if (theType == 2 && htmlKey) + { + key = htmlKey; + *theNativeTypeFound = 2; + } + else if (theType == 1 && plainKey) key = plainKey; + else if (theType == 2 && plainKey) + key = plainKey; + else if (theType == 1 && htmlKey) + { + key = htmlKey; + *theNativeTypeFound = 2; + } if (key) { @@ -263,6 +275,10 @@ struct GlobalObjectId { charset = @"us-ascii"; s = [NSString stringWithData: d usingEncodingNamed: charset]; + + if (theType == 1 && *theNativeTypeFound == 2) + s = [s htmlToText]; + d = [s dataUsingEncoding: NSUTF8StringEncoding]; } @@ -448,7 +464,7 @@ struct GlobalObjectId { } else if ([type isEqualToString: @"multipart"]) { - d = [self _preferredBodyDataInMultipartUsingType: theType]; + d = [self _preferredBodyDataInMultipartUsingType: theType nativeTypeFound: theNativeType]; } } else if (theType == 4) diff --git a/NEWS b/NEWS index d4399048e..c26b663b1 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,7 @@ Enhancements - added support for email categories using EAS (#2995) - now possible to always send vacation messages (#2332) - added EAS best practices to the documentation + - improved fetching of text parts over EAS Bug fixes - (regression) fixed sending a message when mail module is not active (#3088) From 601a9ca5598490f839938884f20d0a366388ed4b Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Thu, 12 Feb 2015 09:09:18 -0500 Subject: [PATCH 17/60] Update translations --- NEWS | 1 + UI/PreferencesUI/Czech.lproj/Localizable.strings | 4 ++++ UI/PreferencesUI/Finnish.lproj/Localizable.strings | 4 ++++ UI/PreferencesUI/French.lproj/Localizable.strings | 4 ++++ UI/PreferencesUI/German.lproj/Localizable.strings | 4 ++++ UI/PreferencesUI/Hungarian.lproj/Localizable.strings | 4 ++++ 6 files changed, 21 insertions(+) diff --git a/NEWS b/NEWS index c26b663b1..faa64df66 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,7 @@ Enhancements - now possible to always send vacation messages (#2332) - added EAS best practices to the documentation - improved fetching of text parts over EAS + - updated Czech, Finnish, French, German and Hungarian translations Bug fixes - (regression) fixed sending a message when mail module is not active (#3088) diff --git a/UI/PreferencesUI/Czech.lproj/Localizable.strings b/UI/PreferencesUI/Czech.lproj/Localizable.strings index 891be5277..8d362aef4 100644 --- a/UI/PreferencesUI/Czech.lproj/Localizable.strings +++ b/UI/PreferencesUI/Czech.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Days between responses :" = "Počet dnů mezi odpověďmi :"; "Do not send responses to mailing lists" = "Neposílat odpovědi do konferencí"; "Disable auto reply on" = "Automatické odpovědi vypnout dne"; +"Always send vacation message response" = "Vždy posílat zprávu v nepřítomnosti"; "Please specify your message and your email addresses for which you want to enable auto reply." = "Prosím zadejte text zprávy a své emailové adresy, pro které chcete zasílání v nepřítomnosti použít."; "Your vacation message must not end with a single dot on a line." = "Vaše zpráva v nepřítomnosti nesmí končit samotnou tečkou na řádce."; @@ -40,6 +41,9 @@ "Keep a copy" = "Ponechat kopii"; "Please specify an address to which you want to forward your messages." = "Prosím zadejte adresu, na kterou chcete své zprávy přeposílat."; +"You are not allowed to forward your messages to an external email address." = "Nemáte povoleno přeposílání Vašich zpráv na externí emailovou adresu."; +"You are not allowed to forward your messages to an internal email address." = "Nemáte povoleno přeposílání Vašich zpráv na interní emailovou adresu."; + /* d & t */ "Current Time Zone :" = "Současné časové pásmo :"; diff --git a/UI/PreferencesUI/Finnish.lproj/Localizable.strings b/UI/PreferencesUI/Finnish.lproj/Localizable.strings index 3df3e7718..912e0b11b 100644 --- a/UI/PreferencesUI/Finnish.lproj/Localizable.strings +++ b/UI/PreferencesUI/Finnish.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Days between responses :" = "Päivät vastausten välillä:"; "Do not send responses to mailing lists" = "Älä lähetä vastauksia postituslistoille"; "Disable auto reply on" = "Poista automaattivastaus käytöstä"; +"Always send vacation message response" = "Lähetä lomaviestivastaus aina"; "Please specify your message and your email addresses for which you want to enable auto reply." = "Ole hyvä ja määritä viesti sekä sähköpostiosoitteet joille haluat aktivoida automaattivastauksen."; "Your vacation message must not end with a single dot on a line." = "Lomaviestisi ei saa päättyä yksittäiseen pisteeseen viimeisellä rivillä."; @@ -40,6 +41,9 @@ "Keep a copy" = "Pidä kopio"; "Please specify an address to which you want to forward your messages." = "Ole hyvä ja määritä sähköpostiosoite johon haluat edelleenlähettää viestisi."; +"You are not allowed to forward your messages to an external email address." = "Sinulla ei ole lupaa välittää viestejä ulkoiseen sähköpostiosoitteeseen."; +"You are not allowed to forward your messages to an internal email address." = "Sinulla ei ole lupaa välittää viestejä sisäiseen sähköpostiosoitteeseen."; + /* d & t */ "Current Time Zone :" = "Nykyinen aikavyöhyke:"; diff --git a/UI/PreferencesUI/French.lproj/Localizable.strings b/UI/PreferencesUI/French.lproj/Localizable.strings index 4caec8c78..56f72a0ad 100644 --- a/UI/PreferencesUI/French.lproj/Localizable.strings +++ b/UI/PreferencesUI/French.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Days between responses :" = "Nombre de jours entre réponses :"; "Do not send responses to mailing lists" = "Ne pas envoyer les réponses aux listes de diffusion"; "Disable auto reply on" = "Désactiver la réponse automatique le"; +"Always send vacation message response" = "Toujours envoyer le message de vacances prolongées"; "Please specify your message and your email addresses for which you want to enable auto reply." = "Veuillez définir un message et vos adresses pour lesquelles pour désirez activer une réponse automatique."; "Your vacation message must not end with a single dot on a line." = "Le message de vacances ne doit pas se terminer par une ligne ne contenant qu'un point."; @@ -40,6 +41,9 @@ "Keep a copy" = "Garder une copie"; "Please specify an address to which you want to forward your messages." = "Veuillez définir une adresse à laquelle vous désirez transférer automatiquement vos nouveaux messages."; +"You are not allowed to forward your messages to an external email address." = "Il est interdit de renvoyer vos messages vers une adresse externe."; +"You are not allowed to forward your messages to an internal email address." = "Il est interdit de renvoyer vos messages vers une adresse interne."; + /* d & t */ "Current Time Zone :" = "Fuseau horaire en cours :"; diff --git a/UI/PreferencesUI/German.lproj/Localizable.strings b/UI/PreferencesUI/German.lproj/Localizable.strings index 9b66de389..473fa7706 100644 --- a/UI/PreferencesUI/German.lproj/Localizable.strings +++ b/UI/PreferencesUI/German.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Days between responses :" = "Tage zwischen automatischen Abwesenheitsnachrichten:"; "Do not send responses to mailing lists" = "Keine automatischen Abwesenheitsnachrichten an Mailinglisten senden"; "Disable auto reply on" = "Automatische Abwesenheitsnachricht abschalten am"; +"Always send vacation message response" = "Immer Abwesenheitsmeldung senden"; "Please specify your message and your email addresses for which you want to enable auto reply." = "Bitte ihren Nachrichtentext und ihre E-Mail-Adressen angeben, für die automatische Abwesenheitsnachrichten aktiviert werden sollen."; "Your vacation message must not end with a single dot on a line." = "Ihre Abwesenheitsnachricht darf nicht mit einem alleinstehenden Punkt in einer Zeile enden."; @@ -40,6 +41,9 @@ "Keep a copy" = "Eine Kopie behalten"; "Please specify an address to which you want to forward your messages." = "Bitte Adresse angeben, an die Ihre Nachrichten weitergeleitet werden sollen."; +"You are not allowed to forward your messages to an external email address." = "Es ist Ihnen nicht erlaubt, Ihre Nachrichten an externe E-Mail-Adressen weiterzuleiten."; +"You are not allowed to forward your messages to an internal email address." = "Es ist Ihnen nicht erlaubt, Ihre Nachrichten an interne E-Mail-Adressen weiterzuleiten."; + /* d & t */ "Current Time Zone :" = "Aktuelle Zeitzone:"; diff --git a/UI/PreferencesUI/Hungarian.lproj/Localizable.strings b/UI/PreferencesUI/Hungarian.lproj/Localizable.strings index 9532bf3b3..b90ff2297 100644 --- a/UI/PreferencesUI/Hungarian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Hungarian.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Days between responses :" = "Válaszok közötti napok száma:"; "Do not send responses to mailing lists" = "Levelező listákra válasz mellőzése"; "Disable auto reply on" = "Automatikus válasz tiltása"; +"Always send vacation message response" = "Mindig küldjön távollét üzenet választ"; "Please specify your message and your email addresses for which you want to enable auto reply." = "Kérem adja meg az üzenetét valamint a címeket, amelyekre engedélyezi az automatikus válasz küldését."; "Your vacation message must not end with a single dot on a line." = "A távollét üzenet utolsó sora nem tartalmazhat egy egyedülálló . karatert."; @@ -40,6 +41,9 @@ "Keep a copy" = "Másolat megtartása"; "Please specify an address to which you want to forward your messages." = "Kérem adjon meg egy címet, amelyre a leveleit továbbítani kívánja."; +"You are not allowed to forward your messages to an external email address." = "Ön számára nem endélyezett az üzenetek továbbítása külső email címre."; +"You are not allowed to forward your messages to an internal email address." = "Ön számára nem endélyezett az üzenetek továbbítása belső email címre."; + /* d & t */ "Current Time Zone :" = "Időzóna :"; From c20ca0e33dd3e25ba41f7b2a2cd70a1c39d1e125 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Thu, 12 Feb 2015 09:29:40 -0500 Subject: [PATCH 18/60] Fix exception in set operation of sogo-tool --- NEWS | 3 ++- Tools/SOGoToolUserPreferences.m | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index faa64df66..1d4781387 100644 --- a/NEWS +++ b/NEWS @@ -16,7 +16,8 @@ Bug fixes - (regression) fixed sending a message when mail module is not active (#3088) - mail lables with blanks are not handled correctly (#3078) - fixed BlackBerry issues sending multiple mails over EAS (#3095) - - fixed plain/text mails showing on one line on Android/EAS (#3055) + - fixed plain/text mails showing on one line on Android/EAS (#3055) + - fixed exception in sogo-tool when parsing arguments of a set operation 2.2.15 (2015-01-30) ------------------- diff --git a/Tools/SOGoToolUserPreferences.m b/Tools/SOGoToolUserPreferences.m index a6255d6f0..4f981cb4f 100644 --- a/Tools/SOGoToolUserPreferences.m +++ b/Tools/SOGoToolUserPreferences.m @@ -254,7 +254,7 @@ typedef enum // // to achieve what we want. // - if (o && [o count] == 1) + if (o && [o isKindOfClass: [NSDictionary class]] && [o count] == 1) { [source setObject: [[o allValues] lastObject] forKey: key]; } From aae76dc4e6ce1909a1aeaee9500ec65e8e67aec8 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 12 Feb 2015 09:57:10 -0500 Subject: [PATCH 19/60] Limit curl request for webcalendars to 60 seconds --- SoObjects/Appointments/SOGoWebAppointmentFolder.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SoObjects/Appointments/SOGoWebAppointmentFolder.m b/SoObjects/Appointments/SOGoWebAppointmentFolder.m index 3bd6c4206..cb4c7543c 100644 --- a/SoObjects/Appointments/SOGoWebAppointmentFolder.m +++ b/SoObjects/Appointments/SOGoWebAppointmentFolder.m @@ -1,6 +1,6 @@ /* SOGoWebAppointmentFolder.m - this file is part of SOGo * - * Copyright (C) 2009-2014 Inverse inc. + * Copyright (C) 2009-2015 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -137,6 +137,7 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer) curl_easy_setopt (curl, CURLOPT_URL, [location UTF8String]); curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 0L); + curl_easy_setopt (curl, CURLOPT_TIMEOUT, 60L); authInfos = [self _loadAuthData]; if (authInfos) From a80d75d09cd0b6f310455e33847ae62433e258ca Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 12 Feb 2015 10:27:10 -0500 Subject: [PATCH 20/60] Preparation for the release --- Documentation/docinfo.xml | 6 +++--- Documentation/includes/global-attributes.asciidoc | 2 +- NEWS | 2 +- Version | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Documentation/docinfo.xml b/Documentation/docinfo.xml index 00fc54948..8340a32fa 100644 --- a/Documentation/docinfo.xml +++ b/Documentation/docinfo.xml @@ -1,7 +1,7 @@ -Version 2.2.15 - January 2015 -for version 2.2.15 -2015-01-30 +Version 2.2.16 - February 2015 +for version 2.2.16 +2015-02-12 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". diff --git a/Documentation/includes/global-attributes.asciidoc b/Documentation/includes/global-attributes.asciidoc index 0cbd771ae..6ca1caa2f 100644 --- a/Documentation/includes/global-attributes.asciidoc +++ b/Documentation/includes/global-attributes.asciidoc @@ -13,6 +13,6 @@ // TODO have the build system take care of this -:release_version: 2.2.15 +:release_version: 2.2.16 // vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab: diff --git a/NEWS b/NEWS index 1d4781387..693d0f250 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,4 @@ -2.2.16 (2015-02-DD) +2.2.16 (2015-02-12) ------------------- New features diff --git a/Version b/Version index 13e56d03b..135790138 100644 --- a/Version +++ b/Version @@ -4,4 +4,4 @@ MAJOR_VERSION=2 MINOR_VERSION=2 -SUBMINOR_VERSION=15 +SUBMINOR_VERSION=16 From 72b210cd2ebccc8e9cdc13c23abb76b7f455b780 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 12 Feb 2015 10:29:46 -0500 Subject: [PATCH 21/60] Fixed typo --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 693d0f250..c10c2facc 100644 --- a/NEWS +++ b/NEWS @@ -14,7 +14,7 @@ Enhancements Bug fixes - (regression) fixed sending a message when mail module is not active (#3088) - - mail lables with blanks are not handled correctly (#3078) + - mail labels with blanks are not handled correctly (#3078) - fixed BlackBerry issues sending multiple mails over EAS (#3095) - fixed plain/text mails showing on one line on Android/EAS (#3055) - fixed exception in sogo-tool when parsing arguments of a set operation From b26ea30b1b794e983ea272b5de713b0205fda0d8 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 12 Feb 2015 11:06:57 -0500 Subject: [PATCH 22/60] Update ChangeLog --- ChangeLog | 218 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 218 insertions(+) diff --git a/ChangeLog b/ChangeLog index ab90551ac..2402f9b7e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,221 @@ +commit 72b210cd2ebccc8e9cdc13c23abb76b7f455b780 +Author: Ludovic Marcotte +Date: Thu Feb 12 10:29:46 2015 -0500 + + Fixed typo + +M NEWS + +commit a80d75d09cd0b6f310455e33847ae62433e258ca +Author: Ludovic Marcotte +Date: Thu Feb 12 10:27:10 2015 -0500 + + Preparation for the release + +M Documentation/docinfo.xml +M Documentation/includes/global-attributes.asciidoc +M NEWS +M Version + +commit aae76dc4e6ce1909a1aeaee9500ec65e8e67aec8 +Author: Ludovic Marcotte +Date: Thu Feb 12 09:57:10 2015 -0500 + + Limit curl request for webcalendars to 60 seconds + +M SoObjects/Appointments/SOGoWebAppointmentFolder.m + +commit c20ca0e33dd3e25ba41f7b2a2cd70a1c39d1e125 +Author: Francis Lachapelle +Date: Thu Feb 12 09:29:40 2015 -0500 + + Fix exception in set operation of sogo-tool + +M NEWS +M Tools/SOGoToolUserPreferences.m + +commit 601a9ca5598490f839938884f20d0a366388ed4b +Author: Francis Lachapelle +Date: Thu Feb 12 09:09:18 2015 -0500 + + Update translations + +M NEWS +M UI/PreferencesUI/Czech.lproj/Localizable.strings +M UI/PreferencesUI/Finnish.lproj/Localizable.strings +M UI/PreferencesUI/French.lproj/Localizable.strings +M UI/PreferencesUI/German.lproj/Localizable.strings +M UI/PreferencesUI/Hungarian.lproj/Localizable.strings + +commit d7c283f7511c7753f2cf0fc5af0e2eaea826b66f +Author: Ludovic Marcotte +Date: Thu Feb 12 08:49:17 2015 -0500 + + improved fetching of text parts over EAS + +M ActiveSync/SOGoMailObject+ActiveSync.m +M NEWS + +commit f3325b8b0d59a730716090b8f5e1319ce3edfd70 +Author: Ludovic Marcotte +Date: Wed Feb 11 18:13:36 2015 -0500 + + Updated NEWS file wrt fixes + +M NEWS + +commit b4ea4d7e9fd90520675452bdcbf70155d6b87eef +Author: Ludovic Marcotte +Date: Wed Feb 11 14:39:57 2015 -0500 + + Improvement over previous commit + +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/UIxPreferences.js + +commit 9447437d6fd9da2701312363ae92427d2404749a +Author: Ludovic Marcotte +Date: Wed Feb 11 14:33:32 2015 -0500 + + Added missing strings from previous commit + +M UI/PreferencesUI/English.lproj/Localizable.strings + +commit 322f72626a3253f9d290cfb6d83ff8f5fac2a4e4 +Author: Ludovic Marcotte +Date: Wed Feb 11 14:30:40 2015 -0500 + + now possible to limit automatic forwards to internal/external domains + +M Documentation/SOGoInstallationGuide.asciidoc +M NEWS +M SoObjects/SOGo/SOGoDomainDefaults.h +M SoObjects/SOGo/SOGoDomainDefaults.m +M UI/PreferencesUI/UIxPreferences.m +M UI/Templates/PreferencesUI/UIxPreferences.wox +M UI/WebServerResources/UIxPreferences.js + +commit 55ae4cb8c0390f2007ea08896e1adcb722e72c10 +Author: Ludovic Marcotte +Date: Wed Feb 11 12:59:04 2015 -0500 + + First pass at EAS' best practices for SOGo + +M Documentation/SOGoInstallationGuide.asciidoc +M NEWS + +commit e5d01428ad074d45ed8719b3aaac5d09537faba4 +Author: Ludovic Marcotte +Date: Wed Feb 11 11:31:35 2015 -0500 + + now possible for SOGo to change the sambaNTPassword/sambaLMPassword + +M Documentation/SOGoInstallationGuide.asciidoc +M NEWS +M SoObjects/SOGo/GNUmakefile +M SoObjects/SOGo/LDAPSource.h +M SoObjects/SOGo/LDAPSource.m +M SoObjects/SOGo/NSData+Crypto.h +M SoObjects/SOGo/NSData+Crypto.m +M SoObjects/SOGo/NSString+Crypto.h +M SoObjects/SOGo/NSString+Crypto.m +A SoObjects/SOGo/lmhash.c +A SoObjects/SOGo/lmhash.h +M Tools/SOGoTool.h +M Tools/SOGoTool.m + +commit 82178fd6ceb5c4cb9acb10a4be06c022c895de7a +Author: Ludovic Marcotte +Date: Wed Feb 11 08:31:32 2015 -0500 + + Initial patch from tfu for bug #3055 + +M ActiveSync/SOGoMailObject+ActiveSync.m + +commit 6cf1ec998e33990e77725b9c84bb3ba7ec34dcbc +Author: Ludovic Marcotte +Date: Tue Feb 10 07:09:31 2015 -0500 + + Updated NEWS file for the #3095 bug fix in SOPE + +M NEWS + +commit 6c9b1a494fa1f0a44b118f6c4a399e958796704d +Author: Ludovic Marcotte +Date: Mon Feb 9 16:12:59 2015 -0500 + + Fix for bug #2332 + +M NEWS +M SoObjects/SOGo/SOGoSieveManager.m +M UI/PreferencesUI/English.lproj/Localizable.strings +M UI/PreferencesUI/UIxPreferences.m +M UI/Templates/PreferencesUI/UIxPreferences.wox + +commit 98e4c8ca55b0424111bd7c98060f689316008572 +Author: Ludovic Marcotte +Date: Mon Feb 9 09:10:55 2015 -0500 + + Fixed doc regarder domain vs. system settings + +M Documentation/SOGoInstallationGuide.asciidoc + +commit 3731819e1565a6198237218dff078047628b1316 +Author: Ludovic Marcotte +Date: Thu Feb 5 16:21:27 2015 -0500 + + Added patch from tfu for #2995 + +M ActiveSync/SOGoMailObject+ActiveSync.m +M Documentation/SOGoInstallationGuide.asciidoc +M NEWS + +commit eca22caefc921fa713c2b83e24831f52b397eca7 +Author: Ludovic Marcotte +Date: Thu Feb 5 11:14:53 2015 -0500 + + Fix for bug #3078 + +M NEWS +M UI/MailerUI/UIxMailFolderActions.m + +commit 923bcf8ae291f574feb611d80c8b5a861dcb663a +Author: Ludovic Marcotte +Date: Thu Feb 5 09:29:29 2015 -0500 + + Applied patch for #3092 + +M SOPE/GDLContentStore/GCSChannelManager.m + +commit 0b44fa81f4c1ec9c5b812d799bf76399ce240b5b +Author: Francis Lachapelle +Date: Tue Feb 3 13:20:57 2015 -0500 + + Update NEWS file + +M NEWS + +commit 776b17ff202c45ff63bfc5144dd0ccc37a2f3e58 +Author: Francis Lachapelle +Date: Tue Feb 3 12:06:28 2015 -0500 + + Fix mail editor when not called from mail module + + Fixes #3088 + +M UI/WebServerResources/UIxMailEditor.js + +commit 2aa528dacca6c61d194bd2603cf0ba0d5a436647 +Author: Ludovic Marcotte +Date: Fri Jan 30 11:08:43 2015 -0500 + + Preparation for the release + +M ChangeLog +M Documentation/docinfo.xml +M Documentation/includes/global-attributes.asciidoc +M Version + commit d1d398091961f5d497b67313e098a8a5624089f4 Author: Francis Lachapelle Date: Fri Jan 30 11:03:38 2015 -0500 From 8d21bc3e36014d63db0e37bf7121d81c8200b5e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Wed, 25 Feb 2015 12:01:31 +0100 Subject: [PATCH 23/60] Fix change password with DomainBasedUID When users use full domain to login (SOGoEnableDomainBasedUID) the user attributes in the cache were not being properly updated because in this case the key is `uid@domain` instead of just `uid`. --- SoObjects/SOGo/SOGoUserManager.m | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/SoObjects/SOGo/SOGoUserManager.m b/SoObjects/SOGo/SOGoUserManager.m index d8e09ba6c..4d6a5b911 100644 --- a/SoObjects/SOGo/SOGoUserManager.m +++ b/SoObjects/SOGo/SOGoUserManager.m @@ -595,10 +595,11 @@ static Class NSNullK; newPassword: (NSString *) newPassword perr: (SOGoPasswordPolicyError *) perr { - NSString *jsonUser; + NSString *jsonUser, *userLogin; NSMutableDictionary *currentUser; BOOL didChange; - + SOGoSystemDefaults *sd; + jsonUser = [[SOGoCache sharedCache] userAttributesForLogin: login]; currentUser = [jsonUser objectFromJSONString]; @@ -611,9 +612,7 @@ static Class NSNullK; didChange = YES; if (!currentUser) - { - currentUser = [NSMutableDictionary dictionary]; - } + currentUser = [NSMutableDictionary dictionary]; // It's important to cache the password here as we might have cached the // user's entry in -contactInfosForUserWithUIDorEmail: and if we don't @@ -621,9 +620,13 @@ static Class NSNullK; // cached for the user unless its entry expires from memcached's // internal cache. [currentUser setObject: [newPassword asSHA1String] forKey: @"password"]; - [[SOGoCache sharedCache] - setUserAttributes: [currentUser jsonRepresentation] - forLogin: login]; + sd = [SOGoSystemDefaults sharedSystemDefaults]; + if ([sd enableDomainBasedUID]) + userLogin = [NSString stringWithFormat: @"%@@%@", login, domain]; + else + userLogin = login; + [[SOGoCache sharedCache] setUserAttributes: [currentUser jsonRepresentation] + forLogin: userLogin]; } else didChange = NO; From b97002565e3d21b417f99b704641abee1052642c Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 25 Feb 2015 08:42:18 -0500 Subject: [PATCH 24/60] Updated NEWS file regarding previous commit --- NEWS | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/NEWS b/NEWS index c10c2facc..64d1f8f30 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,9 @@ +2.2.17 (2015-02-xx) +------------------- + +Bug fixes + - fixed login issue after password change (#2601) + 2.2.16 (2015-02-12) ------------------- From 5ceddc213ec08ccb5b44b07aae47921a19b36fd8 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 26 Feb 2015 16:00:03 -0500 Subject: [PATCH 25/60] Fix for bug #3116 --- ActiveSync/SOGoMailObject+ActiveSync.m | 5 +++-- NEWS | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index 9950975d5..43b55c376 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -469,9 +469,10 @@ struct GlobalObjectId { } else if (theType == 4) { - // We sanitize the content *ONLY* for Outlook clients. Outlook has strange issues + // We sanitize the content *ONLY* for Outlook clients and if the content-transfer-encoding is 8bit. Outlook has strange issues // with quoted-printable/base64 encoded text parts. It just doesn't decode them. - if ([[context objectForKey: @"DeviceType"] isEqualToString: @"WindowsOutlook15"]) + encoding = [[self lookupInfoForBodyPart: @""] objectForKey: @"encoding"]; + if ([[context objectForKey: @"DeviceType"] isEqualToString: @"WindowsOutlook15"] || ([encoding caseInsensitiveCompare: @"8bit"] == NSOrderedSame)) d = [self _sanitizedMIMEMessage]; else d = [self content]; diff --git a/NEWS b/NEWS index 64d1f8f30..4102452cb 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ Bug fixes - fixed login issue after password change (#2601) + - fixed potential encoding issue using EAS and 8-bit mails (#3116) 2.2.16 (2015-02-12) ------------------- From 9160e34134c1c24f5f51cd6c9081723f0963e7c5 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 26 Feb 2015 17:46:34 -0500 Subject: [PATCH 26/60] multiple collections support for GetItemEstimate - patch from tfu --- ActiveSync/SOGoActiveSyncDispatcher.m | 134 +++++++++++++++----------- NEWS | 1 + 2 files changed, 78 insertions(+), 57 deletions(-) diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index ff9321f92..fb9b535ef 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -1127,6 +1127,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. id currentCollection; NSMutableString *s; NSData *d; + NSArray *allCollections; + int j; SOGoMicrosoftActiveSyncFolderType folderType; int status, count; @@ -1135,66 +1137,83 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. status = 1; count = 0; - collectionId = [[(id)[theDocumentElement getElementsByTagName: @"CollectionId"] lastObject] textValue]; - realCollectionId = [collectionId realCollectionIdWithFolderType: &folderType]; - - if (folderType == ActiveSyncMailFolder) - nameInCache = [NSString stringWithFormat: @"folder%@", realCollectionId]; - else - nameInCache = collectionId; - - realCollectionId = [self globallyUniqueIDToIMAPFolderName: realCollectionId type: folderType]; - - currentCollection = [self collectionFromId: realCollectionId type: folderType]; - - // - // For IMAP, we simply build a request like this: - // - // . UID SORT (SUBJECT) UTF-8 SINCE 1-Jan-2014 NOT DELETED - // * SORT 124576 124577 124579 124578 - // . OK Completed (4 msgs in 0.000 secs) - // - if (folderType == ActiveSyncMailFolder) - { - EOQualifier *notDeletedQualifier, *sinceDateQualifier; - EOAndQualifier *qualifier; - NSCalendarDate *filter; - NSArray *uids; - - filter = [NSCalendarDate dateFromFilterType: [[(id)[theDocumentElement getElementsByTagName: @"FilterType"] lastObject] textValue]]; - - notDeletedQualifier = [EOQualifier qualifierWithQualifierFormat: - @"(not (flags = %@))", - @"deleted"]; - sinceDateQualifier = [EOQualifier qualifierWithQualifierFormat: - @"(DATE >= %@)", filter]; - - qualifier = [[EOAndQualifier alloc] initWithQualifiers: notDeletedQualifier, sinceDateQualifier, - nil]; - AUTORELEASE(qualifier); - - uids = [currentCollection fetchUIDsMatchingQualifier: qualifier - sortOrdering: @"REVERSE ARRIVAL" - threaded: NO]; - count = [uids count]; - - // Add the number of UIDs expected to "soft delete" - count += [self _softDeleteCountWithFilter: filter collectionId: nameInCache]; - - } - else - { - count = [[currentCollection toOneRelationshipKeys] count]; - } - [s appendString: @""]; [s appendString: @""]; - [s appendFormat: @"%d", status]; + [s appendString: @""]; + + allCollections = (id)[theDocumentElement getElementsByTagName: @"Collection"]; + + for (j = 0; j < [allCollections count]; j++) + { + collectionId = [[(id)[[allCollections objectAtIndex: j] getElementsByTagName: @"CollectionId"] lastObject] textValue]; + realCollectionId = [collectionId realCollectionIdWithFolderType: &folderType]; + + if (folderType == ActiveSyncMailFolder) + nameInCache = [NSString stringWithFormat: @"folder%@", realCollectionId]; + else + nameInCache = collectionId; + + realCollectionId = [self globallyUniqueIDToIMAPFolderName: realCollectionId type: folderType]; + + currentCollection = [self collectionFromId: realCollectionId type: folderType]; - [s appendFormat: @"%@", collectionId]; - [s appendFormat: @"%d", count]; + // + // For IMAP, we simply build a request like this: + // + // . UID SORT (SUBJECT) UTF-8 SINCE 1-Jan-2014 NOT DELETED + // * SORT 124576 124577 124579 124578 + // . OK Completed (4 msgs in 0.000 secs) + // + if (folderType == ActiveSyncMailFolder) + { + EOQualifier *notDeletedQualifier, *sinceDateQualifier; + EOAndQualifier *qualifier; + NSCalendarDate *filter; + NSArray *uids; + + filter = [NSCalendarDate dateFromFilterType: [[(id)[[allCollections objectAtIndex: j] getElementsByTagName: @"FilterType"] lastObject] textValue]]; + + notDeletedQualifier = [EOQualifier qualifierWithQualifierFormat: + @"(not (flags = %@))", + @"deleted"]; + sinceDateQualifier = [EOQualifier qualifierWithQualifierFormat: + @"(DATE >= %@)", filter]; + + qualifier = [[EOAndQualifier alloc] initWithQualifiers: notDeletedQualifier, sinceDateQualifier, + nil]; + AUTORELEASE(qualifier); + + uids = [currentCollection fetchUIDsMatchingQualifier: qualifier + sortOrdering: @"REVERSE ARRIVAL" + threaded: NO]; + count = [uids count]; + + // Add the number of UIDs expected to "soft delete" + count += [self _softDeleteCountWithFilter: filter collectionId: nameInCache]; + } + else + { + count = [[currentCollection toOneRelationshipKeys] count]; + } + + + [s appendString: @""]; + [s appendFormat: @"%d", status]; + + if (folderType == ActiveSyncMailFolder) + [s appendString: @"Email"]; + else if (folderType == ActiveSyncContactFolder) + [s appendString: @"Contacts"]; + else if (folderType == ActiveSyncEventFolder) + [s appendString: @"Calendar"]; + else if (folderType == ActiveSyncTaskFolder) + [s appendString: @"Tasks"]; + + [s appendFormat: @"%@",collectionId]; + [s appendFormat: @"%d", count]; + } - [s appendString: @""]; + [s appendString: @""]; d = [[s dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml]; @@ -2543,7 +2562,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // If the MS-ASProtocolVersion header is set to "12.1", the body of the SendMail request is // is a "message/rfc822" payload - otherwise, it's a WBXML blob. // - if ([cmdName caseInsensitiveCompare: @"SendMail"] == NSOrderedSame && + if ([cmdName caseInsensitiveCompare: @"SendMail"] == NSOrderedSame || [[theRequest headerForKey: @"content-type"] caseInsensitiveCompare: @"message/rfc822"] == NSOrderedSame) { NSString *s, *xml; @@ -2562,6 +2581,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } xml = [NSString stringWithFormat: @"%@", [s stringByEncodingBase64]]; + d = [xml dataUsingEncoding: NSASCIIStringEncoding]; } diff --git a/NEWS b/NEWS index 4102452cb..54e2f7639 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,7 @@ Bug fixes - fixed login issue after password change (#2601) - fixed potential encoding issue using EAS and 8-bit mails (#3116) + - multiple collections support for GetItemEstimate using EAS 2.2.16 (2015-02-12) ------------------- From 33c485d2f6d58443c0c67297b87d8cc3d67d1398 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 26 Feb 2015 17:48:06 -0500 Subject: [PATCH 27/60] fixed empty sync responses for EAS 2.5 and 12.0 clients - patch from tfu --- ActiveSync/SOGoActiveSyncDispatcher+Sync.m | 5 +++-- NEWS | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m index 2c353f736..29cc0d1a0 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m +++ b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m @@ -1431,8 +1431,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } } - // Only send a response if there are changes otherwise send an empty response. - if (changeDetected) + + // Only send a response if there are changes or MS-ASProtocolVersion is either 2.5 or 12.0 oterwise send an empty response. + if (changeDetected || [[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"] || [[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"12.0"]) { // We always return the last generated response. // If we only return , diff --git a/NEWS b/NEWS index 54e2f7639..d3fd5c1df 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ Bug fixes - fixed login issue after password change (#2601) - fixed potential encoding issue using EAS and 8-bit mails (#3116) - multiple collections support for GetItemEstimate using EAS + - fixed empty sync responses for EAS 2.5 and 12.0 clients 2.2.16 (2015-02-12) ------------------- From 22888ba5ac2cdc8d52d4c8eba9a94936376b7520 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 26 Feb 2015 17:49:26 -0500 Subject: [PATCH 28/60] use the correct mail body element for EAS 2.5 clients - patch from tfu --- ActiveSync/SOGoMailObject+ActiveSync.m | 38 ++++++++++++++++---------- NEWS | 1 + 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index 43b55c376..c2993ca7f 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -754,23 +754,31 @@ struct GlobalObjectId { len = [content length]; - [s appendString: @""]; - - // Set the correct type if client requested text/html but we got text/plain - if (preferredBodyType == 2 && nativeBodyType == 1) - [s appendString: @"1"]; - else - [s appendFormat: @"%d", preferredBodyType]; - - [s appendFormat: @"%d", truncated]; - [s appendFormat: @""]; - - if (!truncated) + if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"]) { - [s appendFormat: @"%@", content]; - [s appendFormat: @"%d", len]; + [s appendFormat: @"%@", content]; + [s appendFormat: @"%d", truncated]; } - [s appendString: @""]; + else + { + [s appendString: @""]; + + // Set the correct type if client requested text/html but we got text/plain + if (preferredBodyType == 2 && nativeBodyType == 1) + [s appendString: @"1"]; + else + [s appendFormat: @"%d", preferredBodyType]; + + [s appendFormat: @"%d", truncated]; + [s appendFormat: @""]; + + if (!truncated) + { + [s appendFormat: @"%@", content]; + [s appendFormat: @"%d", len]; + } + [s appendString: @""]; + } } // Attachments -namespace 16 diff --git a/NEWS b/NEWS index d3fd5c1df..ae2da50c5 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,7 @@ Bug fixes - fixed potential encoding issue using EAS and 8-bit mails (#3116) - multiple collections support for GetItemEstimate using EAS - fixed empty sync responses for EAS 2.5 and 12.0 clients + - use the correct mail body element for EAS 2.5 clients 2.2.16 (2015-02-12) ------------------- From 733e334726824be7ab3a41ca7d4b885550a18f9a Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 26 Feb 2015 17:51:02 -0500 Subject: [PATCH 29/60] fixed tasks disappearing issue with RoadSync - patch from tfu --- ActiveSync/iCalToDo+ActiveSync.m | 57 ++++++++++++++++++++++++++------ NEWS | 1 + 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/ActiveSync/iCalToDo+ActiveSync.m b/ActiveSync/iCalToDo+ActiveSync.m index 5f237a31b..e9417752c 100644 --- a/ActiveSync/iCalToDo+ActiveSync.m +++ b/ActiveSync/iCalToDo+ActiveSync.m @@ -38,6 +38,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import #import #import +#import #import #import @@ -49,6 +50,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "NSDate+ActiveSync.h" #include "NSString+ActiveSync.h" + @implementation iCalToDo (ActiveSync) - (NSString *) activeSyncRepresentationInContext: (WOContext *) context @@ -62,11 +64,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. s = [NSMutableString string]; // Complete - o = [self completed]; - [s appendFormat: @"%d", (o ? 1 : 0)]; + [s appendFormat: @"%d", [[self status] isEqualToString: @"COMPLETED"] ? 1 : 0]; // DateCompleted - if (o) + if ((o = [self completed])) [s appendFormat: @"%@", [o activeSyncRepresentationInContext: context]]; // Start date @@ -97,6 +98,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Reminder - FIXME [s appendFormat: @"%d", 0]; + // Sensitivity if ([[self accessClass] isEqualToString: @"PRIVATE"]) v = 2; else if ([[self accessClass] isEqualToString: @"CONFIDENTIAL"]) @@ -104,6 +106,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. else v = 0; + [s appendFormat: @"%d", v]; + categories = [self categories]; if ([categories count]) @@ -126,11 +130,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // It is very important here to NOT set 0 in the response, // otherwise it'll prevent WP8 phones from sync'ing. See #3028 for details. o = [o activeSyncRepresentationInContext: context]; - [s appendString: @""]; - [s appendFormat: @"%d", 1]; - [s appendFormat: @"%d", [o length]]; - [s appendFormat: @"%@", o]; - [s appendString: @""]; + + if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"]) + { + [s appendFormat: @"%@", o]; + [s appendString: @"0"]; + } + else + { + [s appendString: @""]; + [s appendFormat: @"%d", 1]; + [s appendFormat: @"%d", [o length]]; + [s appendFormat: @"%@", o]; + [s appendString: @""]; + } } return s; @@ -152,9 +165,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [self setSummary: o]; // FIXME: merge with iCalEvent - if ((o = [[theValues objectForKey: @"Body"] objectForKey: @"Data"])) - [self setComment: o]; - + if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"]) + { + if ((o = [theValues objectForKey: @"Body"])) + [self setComment: o]; + } + else + { + if ((o = [[theValues objectForKey: @"Body"] objectForKey: @"Data"])) + [self setComment: o]; + } if ([[theValues objectForKey: @"Complete"] intValue] && ((o = [theValues objectForKey: @"DateCompleted"])) ) @@ -166,6 +186,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [completed setDate: o]; [self setStatus: @"COMPLETED"]; } + else + { + [self setStatus: @"IN-PROCESS"]; + [self setCompleted: nil]; + } if ((o = [theValues objectForKey: @"DueDate"])) { @@ -177,6 +202,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [due setDateTime: o]; } + if ((o = [theValues objectForKey: @"StartDate"])) + { + iCalDateTime *due; + + o = [o calendarDate]; + due = (iCalDateTime *) [self uniqueChildWithTag: @"dtstart"]; + [due setTimeZone: tz]; + [due setDateTime: o]; + } + // 2 == high, 1 == normal, 0 == low if ((o = [theValues objectForKey: @"Importance"])) { diff --git a/NEWS b/NEWS index ae2da50c5..71955f765 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,7 @@ Bug fixes - multiple collections support for GetItemEstimate using EAS - fixed empty sync responses for EAS 2.5 and 12.0 clients - use the correct mail body element for EAS 2.5 clients + - fixed tasks disappearing issue with RoadSync 2.2.16 (2015-02-12) ------------------- From 38d61f720f0c9352619fa2cb214e81734ed05868 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 26 Feb 2015 17:52:37 -0500 Subject: [PATCH 30/60] use the correct body element for events for EAS 2.5 clients - patch from tfu --- ActiveSync/iCalEvent+ActiveSync.m | 34 +++++++++++++++++++++++-------- NEWS | 1 + 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/ActiveSync/iCalEvent+ActiveSync.m b/ActiveSync/iCalEvent+ActiveSync.m index d1a4b6f8a..586bf5798 100644 --- a/ActiveSync/iCalEvent+ActiveSync.m +++ b/ActiveSync/iCalEvent+ActiveSync.m @@ -40,6 +40,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import #import #import +#import #import #import @@ -274,11 +275,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // It is very important here to NOT set 0 in the response, // otherwise it'll prevent WP8 phones from sync'ing. See #3028 for details. o = [o activeSyncRepresentationInContext: context]; - [s appendString: @""]; - [s appendFormat: @"%d", 1]; - [s appendFormat: @"%d", [o length]]; - [s appendFormat: @"%@", o]; - [s appendString: @""]; + + if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"]) + { + [s appendFormat: @"%@", o]; + [s appendString: @"0"]; + } + else + { + [s appendString: @""]; + [s appendFormat: @"%d", 1]; + [s appendFormat: @"%d", [o length]]; + [s appendFormat: @"%@", o]; + [s appendString: @""]; + } } [s appendFormat: @"%d", 1]; @@ -394,9 +404,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } // FIXME: merge with iCalToDo - if ((o = [[theValues objectForKey: @"Body"] objectForKey: @"Data"])) - [self setComment: o]; - + if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"]) + { + if ((o = [theValues objectForKey: @"Body"])) + [self setComment: o]; + } + else + { + if ((o = [[theValues objectForKey: @"Body"] objectForKey: @"Data"])) + [self setComment: o]; + } + if ((o = [theValues objectForKey: @"Location"])) [self setLocation: o]; diff --git a/NEWS b/NEWS index 71955f765..a20444205 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,7 @@ Bug fixes - fixed empty sync responses for EAS 2.5 and 12.0 clients - use the correct mail body element for EAS 2.5 clients - fixed tasks disappearing issue with RoadSync + - use the correct body element for events for EAS 2.5 clients 2.2.16 (2015-02-12) ------------------- From b593ddc6436e0d4aff2ef24e6ff9b3cda0c0c396 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 26 Feb 2015 17:53:58 -0500 Subject: [PATCH 31/60] SmartReply improvements for missing body attributes - patch from tfu --- ActiveSync/NSString+ActiveSync.h | 2 ++ ActiveSync/NSString+ActiveSync.m | 25 +++++++++++++++++++++++++ ActiveSync/SOGoActiveSyncDispatcher.m | 21 +++++++++++++++++++-- NEWS | 1 + 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/ActiveSync/NSString+ActiveSync.h b/ActiveSync/NSString+ActiveSync.h index 172d71eb1..4aad558a2 100644 --- a/ActiveSync/NSString+ActiveSync.h +++ b/ActiveSync/NSString+ActiveSync.h @@ -49,6 +49,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (NSString *) deviceType; - (NSString *) attachmentName; - (NSString *) command; +- (NSString *) collectionid; +- (NSString *) itemid; - (NSData *) convertHexStringToBytes; @end diff --git a/ActiveSync/NSString+ActiveSync.m b/ActiveSync/NSString+ActiveSync.m index 01f593352..6aa054d10 100644 --- a/ActiveSync/NSString+ActiveSync.m +++ b/ActiveSync/NSString+ActiveSync.m @@ -298,6 +298,31 @@ static NSArray *easCommandParameters = nil; return s; } +- (NSString *) itemid +{ + NSString *s; + + s = [self _valueForParameter: @"ITEMID="]; + + if (!s) + s = @"Unknown"; + + return s; +} + +- (NSString *) collectionid +{ + NSString *s; + + s = [self _valueForParameter: @"COLLECTIONID="]; + + if (!s) + s = @"Unknown"; + + return s; +} + + // // FIXME: combine with our OpenChange code. // diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index fb9b535ef..0b481132a 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -2364,7 +2364,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. id value; folderId = [[(id)[theDocumentElement getElementsByTagName: @"FolderId"] lastObject] textValue]; + + // if folderId is not there try to get it from URL + if (!folderId) + { + folderId = [[[context request] uri] collectionid]; + } + itemId = [[(id)[theDocumentElement getElementsByTagName: @"ItemId"] lastObject] textValue]; + + // if itemId is not there try to get it from URL + if (!itemId) + { + itemId = [[[context request] uri] itemid]; + } + realCollectionId = [folderId realCollectionIdWithFolderType: &folderType]; realCollectionId = [self globallyUniqueIDToIMAPFolderName: realCollectionId type: folderType]; @@ -2562,7 +2576,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // If the MS-ASProtocolVersion header is set to "12.1", the body of the SendMail request is // is a "message/rfc822" payload - otherwise, it's a WBXML blob. // - if ([cmdName caseInsensitiveCompare: @"SendMail"] == NSOrderedSame || + if (([cmdName caseInsensitiveCompare: @"SendMail"] == NSOrderedSame || + [cmdName caseInsensitiveCompare: @"SmartReply"] == NSOrderedSame || + [cmdName caseInsensitiveCompare: @"SmartForward"] == NSOrderedSame) && [[theRequest headerForKey: @"content-type"] caseInsensitiveCompare: @"message/rfc822"] == NSOrderedSame) { NSString *s, *xml; @@ -2580,7 +2596,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. s = [theRequest contentAsString]; } - xml = [NSString stringWithFormat: @"%@", [s stringByEncodingBase64]]; + xml = [NSString stringWithFormat: @"<%@ xmlns=\"ComposeMail:\">%@", cmdName, [s stringByEncodingBase64], cmdName]; + d = [xml dataUsingEncoding: NSASCIIStringEncoding]; diff --git a/NEWS b/NEWS index a20444205..87c1e1c18 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,7 @@ Bug fixes - use the correct mail body element for EAS 2.5 clients - fixed tasks disappearing issue with RoadSync - use the correct body element for events for EAS 2.5 clients + - SmartReply improvements for missing body attributes 2.2.16 (2015-02-12) ------------------- From a5672fda5210e6149bd893683c7ee4338f0c3cf9 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 26 Feb 2015 17:55:36 -0500 Subject: [PATCH 32/60] do not use syncKey from cache when davCollectionTag = -1 - patch from tfu --- ActiveSync/SOGoActiveSyncDispatcher+Sync.m | 2 +- NEWS | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m index 29cc0d1a0..47aed901f 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m +++ b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m @@ -1211,7 +1211,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { // Make sure that client is updated with the right syncKey. - This keeps vtodo's and vevent's syncKey in sync. syncKeyInCache = [folderMetadata objectForKey: @"SyncKey"]; - if (syncKeyInCache && !([davCollectionTag isEqualToString:syncKeyInCache])) + if (syncKeyInCache && !([davCollectionTag isEqualToString:syncKeyInCache]) && ![davCollectionTag isEqualToString: @"-1"]) { davCollectionTag = syncKeyInCache; *changeDetected = YES; diff --git a/NEWS b/NEWS index 87c1e1c18..eac001565 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,7 @@ Bug fixes - fixed tasks disappearing issue with RoadSync - use the correct body element for events for EAS 2.5 clients - SmartReply improvements for missing body attributes + - do not use syncKey from cache when davCollectionTag = -1 2.2.16 (2015-02-12) ------------------- From df59b73a221467523c18c56493c13c86003d7271 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 26 Feb 2015 17:56:42 -0500 Subject: [PATCH 33/60] use correct mail attachment elements for EAS 2.5 clients - patch from tfu --- ActiveSync/SOGoMailObject+ActiveSync.m | 31 +++++++++++++++++++------- NEWS | 1 + 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index c2993ca7f..7386bc182 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -786,24 +786,39 @@ struct GlobalObjectId { if ([attachmentKeys count]) { int i; - - [s appendString: @""]; - + + if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"]) + [s appendString: @""]; + else + [s appendString: @""]; + for (i = 0; i < [attachmentKeys count]; i++) { value = [attachmentKeys objectAtIndex: i]; [s appendString: @""]; - [s appendFormat: @"%@", [[value objectForKey: @"filename"] activeSyncRepresentationInContext: context]]; + if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"]) + [s appendFormat: @"%@", [[value objectForKey: @"filename"] activeSyncRepresentationInContext: context]]; // FileReference must be a unique identifier across the whole store. We use the following structure: // mail// // mail/INBOX/2 - [s appendFormat: @"mail/%@/%@/%@", [[[self container] relativeImap4Name] stringByEscapingURL], [self nameInContainer], [value objectForKey: @"path"]]; + if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"]) + [s appendFormat: @"mail/%@/%@/%@", [[[self container] relativeImap4Name] stringByEscapingURL], [self nameInContainer], [value objectForKey: @"path"]]; + else + [s appendFormat: @"mail/%@/%@/%@", [[[self container] relativeImap4Name] stringByEscapingURL], [self nameInContainer], [value objectForKey: @"path"]]; - [s appendFormat: @"%d", 1]; // See: http://msdn.microsoft.com/en-us/library/ee160322(v=exchg.80).aspx - [s appendFormat: @"%d", [[value objectForKey: @"size"] intValue]]; - //[s appendFormat: @"%d", 1]; + if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"]) + { + [s appendFormat: @"%d", 1]; + [s appendFormat: @"%d", [[value objectForKey: @"size"] intValue]]; + } + else + { + [s appendFormat: @"%d", 1]; // See: http://msdn.microsoft.com/en-us/library/ee160322(v=exchg.80).aspx + [s appendFormat: @"%d", [[value objectForKey: @"size"] intValue]]; + //[s appendFormat: @"%d", 1]; + } [s appendString: @""]; } diff --git a/NEWS b/NEWS index eac001565..fd7da7661 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,7 @@ Bug fixes - use the correct body element for events for EAS 2.5 clients - SmartReply improvements for missing body attributes - do not use syncKey from cache when davCollectionTag = -1 + - use correct mail attachment elements for EAS 2.5 clients 2.2.16 (2015-02-12) ------------------- From 61923225136db72ceb89294d504b65a7f62e7a7f Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 3 Mar 2015 20:59:32 -0500 Subject: [PATCH 34/60] Fix some gcc warnings --- SoObjects/SOGo/SOGoCASSession.m | 1 - SoObjects/SOGo/SOGoUser.m | 1 + SoObjects/SOGo/SOGoUserManager.m | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/SoObjects/SOGo/SOGoCASSession.m b/SoObjects/SOGo/SOGoCASSession.m index 8c77df29b..6eac8b2c5 100644 --- a/SoObjects/SOGo/SOGoCASSession.m +++ b/SoObjects/SOGo/SOGoCASSession.m @@ -113,7 +113,6 @@ + (void) handleLogoutRequest: (NSString *) logoutRequest { CASLogoutRequest *rq; - SOGoCache *cache; NSBundle *bundle; NSString *mapFile, *sessionIndex; diff --git a/SoObjects/SOGo/SOGoUser.m b/SoObjects/SOGo/SOGoUser.m index da0ed8c6c..5465d64ea 100644 --- a/SoObjects/SOGo/SOGoUser.m +++ b/SoObjects/SOGo/SOGoUser.m @@ -37,6 +37,7 @@ #import #import +#import #import "NSArray+Utilities.h" #import "SOGoCache.h" diff --git a/SoObjects/SOGo/SOGoUserManager.m b/SoObjects/SOGo/SOGoUserManager.m index 4d6a5b911..de7c7296c 100644 --- a/SoObjects/SOGo/SOGoUserManager.m +++ b/SoObjects/SOGo/SOGoUserManager.m @@ -18,6 +18,7 @@ * Boston, MA 02111-1307, USA. */ #import +#import #import #import #import From 8e0849029ea93bfc9e1f9e2cb4ff2e0e5b6a4308 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 3 Mar 2015 21:18:46 -0500 Subject: [PATCH 35/60] Fix contacts lookup by UID When looking for a specific contact UID, we no longer match a pattern that could return multiple results. We search for the exact UID only. --- NEWS | 1 + SoObjects/Appointments/SOGoFreeBusyObject.m | 13 ++++-------- SoObjects/SOGo/SOGoUserManager.h | 3 +++ SoObjects/SOGo/SOGoUserManager.m | 22 +++++++++++++++++++++ 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/NEWS b/NEWS index fd7da7661..7a596a0c7 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,7 @@ Bug fixes - SmartReply improvements for missing body attributes - do not use syncKey from cache when davCollectionTag = -1 - use correct mail attachment elements for EAS 2.5 clients + - fixed contacts lookup by UID in freebusy 2.2.16 (2015-02-12) ------------------- diff --git a/SoObjects/Appointments/SOGoFreeBusyObject.m b/SoObjects/Appointments/SOGoFreeBusyObject.m index 6624a2cfe..ff8ee6263 100644 --- a/SoObjects/Appointments/SOGoFreeBusyObject.m +++ b/SoObjects/Appointments/SOGoFreeBusyObject.m @@ -62,17 +62,14 @@ SOGoUserManager *um; NSString *domain; NSDictionary *contactInfos; - NSArray *contacts; um = [SOGoUserManager sharedUserManager]; contactInfos = [um contactInfosForUserWithUIDorEmail: uid]; if (contactInfos == nil) { + // Search among global addressbooks domain = [[context activeUser] domain]; - [um fetchContactsMatching: uid inDomain: domain]; - contacts = [um fetchContactsMatching: uid inDomain: domain]; - if ([contacts count] == 1) - contactInfos = [contacts lastObject]; + contactInfos = [um fetchContactWithUID: uid inDomain: domain]; } /* iCal.app compatibility: @@ -279,7 +276,6 @@ if ([uid length]) { SOGoUserManager *um; - NSArray *contacts; NSString *domain, *email; NSDictionary *contact; MSExchangeFreeBusy *exchangeFreeBusy; @@ -287,10 +283,9 @@ um = [SOGoUserManager sharedUserManager]; domain = [[context activeUser] domain]; - contacts = [um fetchContactsMatching: uid inDomain: domain]; - if ([contacts count] == 1) + contact = [um fetchContactWithUID: uid inDomain: domain]; + if (contact) { - contact = [contacts lastObject]; email = [contact valueForKey: @"c_email"]; source = [contact objectForKey: @"source"]; if ([email length] diff --git a/SoObjects/SOGo/SOGoUserManager.h b/SoObjects/SOGo/SOGoUserManager.h index 237347053..d30821108 100644 --- a/SoObjects/SOGo/SOGoUserManager.h +++ b/SoObjects/SOGo/SOGoUserManager.h @@ -65,10 +65,13 @@ - (NSDictionary *) contactInfosForUserWithUIDorEmail: (NSString *) uid; - (NSDictionary *) contactInfosForUserWithUIDorEmail: (NSString *) uid inDomain: (NSString *) domain; +- (NSDictionary *) fetchContactWithUID: (NSString *) uid + inDomain: (NSString *) domain; - (NSArray *) fetchContactsMatching: (NSString *) match inDomain: (NSString *) domain; - (NSArray *) fetchUsersMatching: (NSString *) filter inDomain: (NSString *) domain; +- (NSArray *) _compactAndCompleteContacts: (NSEnumerator *) contacts; - (NSString *) getCNForUID: (NSString *) uid; - (NSString *) getEmailForUID: (NSString *) uid; diff --git a/SoObjects/SOGo/SOGoUserManager.m b/SoObjects/SOGo/SOGoUserManager.m index de7c7296c..0c6280112 100644 --- a/SoObjects/SOGo/SOGoUserManager.m +++ b/SoObjects/SOGo/SOGoUserManager.m @@ -915,6 +915,28 @@ static Class NSNullK; return currentUser; } +/** + * Fetch the contact information identified by the specified UID in the global addressbooks. + */ +- (NSDictionary *) fetchContactWithUID: (NSString *) uid + inDomain: (NSString *) domain +{ + NSMutableArray *contacts; + NSEnumerator *sources; + NSString *sourceID; + id currentSource; + + contacts = [NSMutableArray array]; + sources = [[self addressBookSourceIDsInDomain: domain] objectEnumerator]; + while ((sourceID = [sources nextObject])) + { + currentSource = [_sources objectForKey: sourceID]; + [contacts addObject: [currentSource lookupContactEntry: uid]]; + } + + return [[self _compactAndCompleteContacts: [contacts objectEnumerator]] lastObject]; +} + - (NSArray *) _compactAndCompleteContacts: (NSEnumerator *) contacts { NSMutableDictionary *compactContacts, *returnContact; From cbba0719bb58229d9be8d3bb5af5fba23da3ae14 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Wed, 4 Mar 2015 10:05:12 -0500 Subject: [PATCH 36/60] Fix exception in SOGoUserManager --- SoObjects/SOGo/SOGoUserManager.m | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/SoObjects/SOGo/SOGoUserManager.m b/SoObjects/SOGo/SOGoUserManager.m index 0c6280112..99e9995b2 100644 --- a/SoObjects/SOGo/SOGoUserManager.m +++ b/SoObjects/SOGo/SOGoUserManager.m @@ -921,20 +921,29 @@ static Class NSNullK; - (NSDictionary *) fetchContactWithUID: (NSString *) uid inDomain: (NSString *) domain { + NSDictionary *contact; NSMutableArray *contacts; NSEnumerator *sources; NSString *sourceID; id currentSource; contacts = [NSMutableArray array]; + contact = nil; sources = [[self addressBookSourceIDsInDomain: domain] objectEnumerator]; while ((sourceID = [sources nextObject])) { currentSource = [_sources objectForKey: sourceID]; - [contacts addObject: [currentSource lookupContactEntry: uid]]; + contact = [currentSource lookupContactEntry: uid]; + if (contact) + [contacts addObject: contact]; } - return [[self _compactAndCompleteContacts: [contacts objectEnumerator]] lastObject]; + if ([contacts count]) + contact = [[self _compactAndCompleteContacts: [contacts objectEnumerator]] lastObject]; + else + contact = nil; + + return contact; } - (NSArray *) _compactAndCompleteContacts: (NSEnumerator *) contacts From 517f4b0f49e2545f930408b922dabc1a4a9006eb Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Mon, 9 Mar 2015 14:04:21 -0400 Subject: [PATCH 37/60] Fix possible JS exception in Contacts module --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index 7a596a0c7..65260d954 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,7 @@ Bug fixes - do not use syncKey from cache when davCollectionTag = -1 - use correct mail attachment elements for EAS 2.5 clients - fixed contacts lookup by UID in freebusy + - reduced telephone number to a single value in JSON response of contacts list 2.2.16 (2015-02-12) ------------------- From f1fda8bd0617d5e6b924bb1ae57fb7840bbcc13f Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 10 Mar 2015 13:27:17 -0400 Subject: [PATCH 38/60] Return a single phone number in JSON contacts list --- SoObjects/Contacts/SOGoContactSourceFolder.m | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/SoObjects/Contacts/SOGoContactSourceFolder.m b/SoObjects/Contacts/SOGoContactSourceFolder.m index 19e726a96..e385d9c09 100644 --- a/SoObjects/Contacts/SOGoContactSourceFolder.m +++ b/SoObjects/Contacts/SOGoContactSourceFolder.m @@ -267,6 +267,13 @@ data = [oldRecord objectForKey: @"homephone"]; if (![data length]) data = @""; + else if ([data isKindOfClass: [NSArray class]]) + { + if ([data count] > 0) + data = [data objectAtIndex: 0]; + else + data = @""; + } [newRecord setObject: data forKey: @"c_telephonenumber"]; // Custom attribute for group-lookups. See LDAPSource.m where From 37fbd75d552873575f11853e4478d6dce9640201 Mon Sep 17 00:00:00 2001 From: Jens Erat Date: Fri, 13 Mar 2015 11:41:07 +0100 Subject: [PATCH 39/60] Rename "Archive" to "Export" in Webmail, ctd. Fixes #2758 also for non-Inbox folders --- UI/Templates/MailerUI/UIxMailMainFrame.wox | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UI/Templates/MailerUI/UIxMailMainFrame.wox b/UI/Templates/MailerUI/UIxMailMainFrame.wox index aa924a35d..4aaf37b3a 100644 --- a/UI/Templates/MailerUI/UIxMailMainFrame.wox +++ b/UI/Templates/MailerUI/UIxMailMainFrame.wox @@ -85,7 +85,7 @@
  • -
  • +
  • @@ -103,7 +103,7 @@
  • -
  • +
  • From 1bdd5dfc9085e1f08f839b8179a7ccb37b038e5c Mon Sep 17 00:00:00 2001 From: Jens Erat Date: Fri, 13 Mar 2015 14:06:58 +0100 Subject: [PATCH 40/60] Remove obsolete archive string from translations --- UI/MailerUI/Arabic.lproj/Localizable.strings | 1 - UI/MailerUI/Danish.lproj/Localizable.strings | 1 - UI/MailerUI/Icelandic.lproj/Localizable.strings | 1 - UI/MailerUI/Italian.lproj/Localizable.strings | 1 - UI/MailerUI/NorwegianNynorsk.lproj/Localizable.strings | 1 - UI/MailerUI/Swedish.lproj/Localizable.strings | 1 - UI/MailerUI/Ukrainian.lproj/Localizable.strings | 1 - UI/MailerUI/Welsh.lproj/Localizable.strings | 1 - 8 files changed, 8 deletions(-) diff --git a/UI/MailerUI/Arabic.lproj/Localizable.strings b/UI/MailerUI/Arabic.lproj/Localizable.strings index deb1bc17e..490cea964 100644 --- a/UI/MailerUI/Arabic.lproj/Localizable.strings +++ b/UI/MailerUI/Arabic.lproj/Localizable.strings @@ -79,7 +79,6 @@ "Remove this folder" = "مسح المجلد"; "Erase mails from this folder" = "مسح الرسائل من هذا المجلد"; "Expunge this folder" = "محو هذا المجلد"; -"Archive This Folder" = "أرشفة هذا المجلد"; "Modify the acl of this folder" = "تعديل قائمة الصلاحيات لهذا المجلد"; "Saved Messages.zip" = "حفظ Messages.zip"; diff --git a/UI/MailerUI/Danish.lproj/Localizable.strings b/UI/MailerUI/Danish.lproj/Localizable.strings index 7a60b99c7..e668f8cae 100644 --- a/UI/MailerUI/Danish.lproj/Localizable.strings +++ b/UI/MailerUI/Danish.lproj/Localizable.strings @@ -79,7 +79,6 @@ "Remove this folder" = "Fjern denne mappe"; "Erase mails from this folder" = "Slet beskeder fra denne mappe"; "Expunge this folder" = "Slet denne mappe"; -"Archive This Folder" = "Gem denne mappe"; "Modify the acl of this folder" = "Rediger ACL i denne mappe"; "Saved Messages.zip" = "Gemte beskeder.zip"; diff --git a/UI/MailerUI/Icelandic.lproj/Localizable.strings b/UI/MailerUI/Icelandic.lproj/Localizable.strings index 21cf027cf..375f4e6e7 100644 --- a/UI/MailerUI/Icelandic.lproj/Localizable.strings +++ b/UI/MailerUI/Icelandic.lproj/Localizable.strings @@ -76,7 +76,6 @@ "Remove this folder" = "Fjarlægja þessa möppu"; "Erase mails from this folder" = "Eyða bréfum úr þessari möppu"; "Expunge this folder" = "Afmá allt í þessari möppu"; -"Archive This Folder" = "Setja þessa möppu í geymslu"; "Modify the acl of this folder" = "Breyta aðgangsstýringum fyrir þessa möppu"; "Saved Messages.zip" = "vistud_skilabod.zip"; diff --git a/UI/MailerUI/Italian.lproj/Localizable.strings b/UI/MailerUI/Italian.lproj/Localizable.strings index 79ae3f99a..0bf331060 100644 --- a/UI/MailerUI/Italian.lproj/Localizable.strings +++ b/UI/MailerUI/Italian.lproj/Localizable.strings @@ -79,7 +79,6 @@ "Remove this folder" = "Rimuovi questa cartella"; "Erase mails from this folder" = "Elimina emails da questa cartella"; "Expunge this folder" = "Pulisci questa cartella"; -"Archive This Folder" = "Archivia questa cartella"; "Modify the acl of this folder" = "Modifica i permessi per questa cartella"; "Saved Messages.zip" = "Salvato Messages.zip"; diff --git a/UI/MailerUI/NorwegianNynorsk.lproj/Localizable.strings b/UI/MailerUI/NorwegianNynorsk.lproj/Localizable.strings index 6cd8f6e8f..776cc23e6 100644 --- a/UI/MailerUI/NorwegianNynorsk.lproj/Localizable.strings +++ b/UI/MailerUI/NorwegianNynorsk.lproj/Localizable.strings @@ -76,7 +76,6 @@ "Remove this folder" = "Ta bort mappen"; "Erase mails from this folder" = "Slett meldinger fra mappen"; "Expunge this folder" = "Fjern mappen"; -"Archive This Folder" = "Arkiver denne mappen"; "Modify the acl of this folder" = "Endre adgangsrettigheter til mappen"; "Saved Messages.zip" = "Lagrete Meldinger.zip"; diff --git a/UI/MailerUI/Swedish.lproj/Localizable.strings b/UI/MailerUI/Swedish.lproj/Localizable.strings index 207ab4c15..ee18ce90f 100644 --- a/UI/MailerUI/Swedish.lproj/Localizable.strings +++ b/UI/MailerUI/Swedish.lproj/Localizable.strings @@ -76,7 +76,6 @@ "Remove this folder" = "Ta bort mappen"; "Erase mails from this folder" = "Radera meddelanden från mappen"; "Expunge this folder" = "Radera mappen"; -"Archive This Folder" = "Arkivera mappen"; "Modify the acl of this folder" = "Ändra åtkomsträttigheter på mappen"; "Saved Messages.zip" = "Sparat Messages.zip"; diff --git a/UI/MailerUI/Ukrainian.lproj/Localizable.strings b/UI/MailerUI/Ukrainian.lproj/Localizable.strings index f9a64ebac..d7ae77b28 100644 --- a/UI/MailerUI/Ukrainian.lproj/Localizable.strings +++ b/UI/MailerUI/Ukrainian.lproj/Localizable.strings @@ -79,7 +79,6 @@ "Remove this folder" = "Вилучати цю теку"; "Erase mails from this folder" = "Вилучати повідомлення з цієї теки"; "Expunge this folder" = "Позначати листи як вилучені"; -"Archive This Folder" = "Архівувати цю теку"; "Modify the acl of this folder" = "Керувати правами доступу до цієї теки"; "Saved Messages.zip" = "Збережено Messages.zip"; diff --git a/UI/MailerUI/Welsh.lproj/Localizable.strings b/UI/MailerUI/Welsh.lproj/Localizable.strings index 87fc7fec3..8a4d93d7e 100644 --- a/UI/MailerUI/Welsh.lproj/Localizable.strings +++ b/UI/MailerUI/Welsh.lproj/Localizable.strings @@ -76,7 +76,6 @@ "Remove this folder" = "Dileu'r ffolder hwn"; "Erase mails from this folder" = "Dileu ebost o'r ffolder hwn"; "Expunge this folder" = "Dileu'r ffolder hwn"; -"Archive This Folder" = "Archive This Folder"; "Modify the acl of this folder" = "Newid acl y ffolder"; "Saved Messages.zip" = "Saved Messages.zip"; From 1d5ae27c996f63488653d3a8638b33320540741c Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 17 Mar 2015 15:31:35 -0400 Subject: [PATCH 41/60] Fix issues with freebusy (Web, busyOffHours) --- NEWS | 2 ++ SoObjects/Appointments/SOGoFreeBusyObject.m | 3 +-- UI/WebServerResources/UIxAttendeesEditor.js | 21 ++++++++++++++++----- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/NEWS b/NEWS index 65260d954..ef3ca3c3b 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,8 @@ Bug fixes - use correct mail attachment elements for EAS 2.5 clients - fixed contacts lookup by UID in freebusy - reduced telephone number to a single value in JSON response of contacts list + - fixed freebusy data when 'busy off hours' is enabled and period starts during the weekend + - fixed fetching of freebusy data from the Web interface 2.2.16 (2015-02-12) ------------------- diff --git a/SoObjects/Appointments/SOGoFreeBusyObject.m b/SoObjects/Appointments/SOGoFreeBusyObject.m index ff8ee6263..1c6e55662 100644 --- a/SoObjects/Appointments/SOGoFreeBusyObject.m +++ b/SoObjects/Appointments/SOGoFreeBusyObject.m @@ -381,8 +381,7 @@ ([currentStartDate compare: startDate] == NSOrderedAscending)? startDate : currentStartDate, @"startDate", currentEndDate, @"endDate", nil]]; - if (!firstRange - && currentEndDate != endDate + if (currentEndDate != endDate && ([currentEndDate dayOfWeek] == 6 || [currentEndDate dayOfWeek] == 0)) { // Fill weekend days diff --git a/UI/WebServerResources/UIxAttendeesEditor.js b/UI/WebServerResources/UIxAttendeesEditor.js index af2fc0d5c..6d6c77fe5 100644 --- a/UI/WebServerResources/UIxAttendeesEditor.js +++ b/UI/WebServerResources/UIxAttendeesEditor.js @@ -917,6 +917,7 @@ _freeBusyCacheEntry.prototype = { fetchDates = []; if (adjustedSd.getTime() < this.startDate.getTime()) { + // Period extends to before current start var start = adjustedSd.clone(); start.addDays(-7); var end = this.startDate.beginOfDay(); @@ -928,35 +929,45 @@ _freeBusyCacheEntry.prototype = { var nextDate = this.startDate.clone(); nextDate.addDays(currentNbrDays); if (adjustedEd.getTime() >= nextDate.getTime()) { - var end = nextDate.clone(); + // Period extends to after current end + var end = adjustedEd.clone(); end.addDays(7); fetchDates.push({ start: nextDate, end: end }); } } else { + // Initial range var start = adjustedSd.clone(); start.addDays(-7); var end = adjustedEd.clone(); end.addDays(7); fetchDates = [ { start: start, end: end } ]; } - return fetchDates; }, integrateEntries: function fBCE_integrateEntries(entries, start, end) { + var days, merged = false; if (this.startDate) { if (start.getTime() < this.startDate) { - var days = start.deltaDays(this.startDate); + days = start.deltaDays(this.startDate); if (entries.length == (days * 96)) { + // New period is just before previous period this.startDate = start; this.entries = entries.concat(this.entries); + merged = true; } } else { - this.entries = this.entries.concat(entries); + days = this.startDate.deltaDays(start); + if (this.entries.length == (days * 96)) { + // New period is just after previous period + this.entries = this.entries.concat(entries); + merged = true; + } } - } else { + } + if (!merged) { this.startDate = start; this.entries = entries; } From e25a7e3d8d0a5f11a65a6fa337a637b3e1f44432 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 18 Mar 2015 09:36:35 -0400 Subject: [PATCH 42/60] Fix for bug #3138 --- ActiveSync/NGMimeMessage+ActiveSync.m | 48 +++++++++++++++------------ ActiveSync/SOGoActiveSyncDispatcher.m | 2 +- NEWS | 1 + 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/ActiveSync/NGMimeMessage+ActiveSync.m b/ActiveSync/NGMimeMessage+ActiveSync.m index 85fec63cd..7954d7f38 100644 --- a/ActiveSync/NGMimeMessage+ActiveSync.m +++ b/ActiveSync/NGMimeMessage+ActiveSync.m @@ -1,6 +1,6 @@ /* -Copyright (c) 2014, Inverse inc. +Copyright (c) 2015, Inverse inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -40,35 +40,39 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @implementation NGMimeMessage (ActiveSync) -- (NSArray *) allRecipients +- (void) _addRecipients: (NSEnumerator *) enumerator + toArray: (NSMutableArray *) recipients { - NSEnumerator *enumerator, *addressList; - NSMutableArray *recipients; NGMailAddressParser *parser; + NSEnumerator *addressList; NGMailAddress *address; NSString *s; + while ((s = [enumerator nextObject])) + { + parser = [NGMailAddressParser mailAddressParserWithString: s]; + addressList = [[parser parseAddressList] objectEnumerator]; + + while ((address = [addressList nextObject])) + [recipients addObject: [address address]]; + } +} + +- (NSArray *) allRecipients +{ + NSMutableArray *recipients; + NSEnumerator *enumerator; + recipients = [NSMutableArray array]; - enumerator = [[self headersForKey: @"to"] objectEnumerator]; - while ((s = [enumerator nextObject])) - { - parser = [NGMailAddressParser mailAddressParserWithString: s]; - addressList = [[parser parseAddressList] objectEnumerator]; - - while ((address = [addressList nextObject])) - [recipients addObject: [address address]]; - } + [self _addRecipients: [[self headersForKey: @"to"] objectEnumerator] + toArray: recipients]; - enumerator = [[self headersForKey: @"cc"] objectEnumerator]; - while ((s = [enumerator nextObject])) - { - parser = [NGMailAddressParser mailAddressParserWithString: s]; - addressList = [[parser parseAddressList] objectEnumerator]; - - while ((address = [addressList nextObject])) - [recipients addObject: [address address]]; - } + [self _addRecipients: [[self headersForKey: @"cc"] objectEnumerator] + toArray: recipients]; + + [self _addRecipients: [[self headersForKey: @"bcc"] objectEnumerator] + toArray: recipients]; return recipients; } diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index 0b481132a..9c3b0a3ee 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -2273,7 +2273,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. error = [self _sendMail: data recipients: [message allRecipients] - saveInSentItems: ([(id)[theDocumentElement getElementsByTagName: @"SaveInSentItems"] count] ? YES : NO)]; + saveInSentItems: ([(id)[theDocumentElement getElementsByTagName: @"SaveInSentItems"] count] ? YES : NO)]; if (error) { diff --git a/NEWS b/NEWS index ef3ca3c3b..855bebdb0 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,7 @@ Bug fixes - reduced telephone number to a single value in JSON response of contacts list - fixed freebusy data when 'busy off hours' is enabled and period starts during the weekend - fixed fetching of freebusy data from the Web interface + - fixed EAS handling of Bcc in emails (#3138) 2.2.16 (2015-02-12) ------------------- From cdb766e2eff3b6e420da48b3f396814edff96b4f Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 18 Mar 2015 10:15:33 -0400 Subject: [PATCH 43/60] Documented NGMimeBuildMimeTempDirectory --- Documentation/SOGoInstallationGuide.asciidoc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Documentation/SOGoInstallationGuide.asciidoc b/Documentation/SOGoInstallationGuide.asciidoc index 7fa4dff3d..e128b02c4 100644 --- a/Documentation/SOGoInstallationGuide.asciidoc +++ b/Documentation/SOGoInstallationGuide.asciidoc @@ -1689,6 +1689,13 @@ cronjob `sogo-tmpwatch`. Defaults to `/var/spool/sogo`. +|S |NGMimeBuildMimeTempDirectory +|Parameter used to set the path where temporary files will be stored +by SOPE when dealing with MIME messages. + +Defaults to `/tmp`. + + |S |NGImap4DisableIMAP4Pooling |Disables IMAP pooling when set to `YES`. Enable pooling by setting to `NO` or using a caching proxy like imapproxy. From 69974807b5740f245376f8e19f71559997bcae44 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Thu, 19 Mar 2015 08:32:37 -0400 Subject: [PATCH 44/60] Fix Language-Region tags in Web interface Fixes #3121 --- NEWS | 1 + UI/MailerUI/UIxMailEditor.m | 4 +++- UI/Scheduler/UIxCalMainView.m | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 855bebdb0..9826552c3 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,7 @@ Bug fixes - fixed freebusy data when 'busy off hours' is enabled and period starts during the weekend - fixed fetching of freebusy data from the Web interface - fixed EAS handling of Bcc in emails (#3138) + - fixed Language-Region tags in Web interface (#3121) 2.2.16 (2015-02-12) ------------------- diff --git a/UI/MailerUI/UIxMailEditor.m b/UI/MailerUI/UIxMailEditor.m index 80c29f512..7931bee13 100644 --- a/UI/MailerUI/UIxMailEditor.m +++ b/UI/MailerUI/UIxMailEditor.m @@ -230,7 +230,9 @@ static NSArray *infoKeys = nil; - (NSString *) localeCode { // WARNING : NSLocaleCode is not defined in - return [locale objectForKey: @"NSLocaleCode"]; + // Region subtag must be separated by a dash + NSString *s = [locale objectForKey: @"NSLocaleCode"]; + return [s stringByReplacingOccurrencesOfString: @"_" withString: @"-"]; } - (void) setFrom: (NSString *) newFrom diff --git a/UI/Scheduler/UIxCalMainView.m b/UI/Scheduler/UIxCalMainView.m index f9fd125eb..78d4723c6 100644 --- a/UI/Scheduler/UIxCalMainView.m +++ b/UI/Scheduler/UIxCalMainView.m @@ -82,7 +82,9 @@ - (NSString *) localeCode { // WARNING : NSLocaleCode is not defined in - return [locale objectForKey: @"NSLocaleCode"]; + // Region subtag must be separated by a dash + NSString *s = [locale objectForKey: @"NSLocaleCode"]; + return [s stringByReplacingOccurrencesOfString: @"_" withString: @"-"]; } - (NSArray *) monthMenuItems From 6d99226b1390d2dce1f7dfc6a3bab5143aad6364 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 19 Mar 2015 14:53:01 -0400 Subject: [PATCH 45/60] Always add DisplayName no matter EAS client version --- ActiveSync/SOGoMailObject+ActiveSync.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index 7386bc182..c1df14dca 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -797,8 +797,7 @@ struct GlobalObjectId { value = [attachmentKeys objectAtIndex: i]; [s appendString: @""]; - if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"]) - [s appendFormat: @"%@", [[value objectForKey: @"filename"] activeSyncRepresentationInContext: context]]; + [s appendFormat: @"%@", [[value objectForKey: @"filename"] activeSyncRepresentationInContext: context]]; // FileReference must be a unique identifier across the whole store. We use the following structure: // mail// From bff21ab1ff136ada7d93cc529a87da9dd254fa60 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 19 Mar 2015 16:08:33 -0400 Subject: [PATCH 46/60] support for mail prority using EAS --- ActiveSync/SOGoMailObject+ActiveSync.m | 25 +++++++++++++++++++++++-- NEWS | 3 +++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index c1df14dca..0eb08b2ec 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -538,6 +538,10 @@ struct GlobalObjectId { NSData *d, *globalObjId; NSArray *attachmentKeys; NSMutableString *s; + + uint32_t v; + NSString *p; + id value; iCalCalendar *calendar; @@ -578,8 +582,25 @@ struct GlobalObjectId { if (value) [s appendFormat: @"%@", [value activeSyncRepresentationInContext: context]]; - // Importance - FIXME - [s appendFormat: @"%@", @"1"]; + // Importance + v = 0x1; + p = [[self mailHeaders] objectForKey: @"x-priority"]; + + if (p) + { + if ([p hasPrefix: @"1"]) v = 0x2; + else if ([p hasPrefix: @"2"]) v = 0x2; + else if ([p hasPrefix: @"4"]) v = 0x0; + else if ([p hasPrefix: @"5"]) v = 0x0; + } + else + { + p = [[self mailHeaders] objectForKey: @"importance"]; + if ([p hasPrefix: @"High"]) v = 0x2; + else if ([p hasPrefix: @"Low"]) v = 0x0; + } + + [s appendFormat: @"%d", v]; // Read [s appendFormat: @"%d", ([self read] ? 1 : 0)]; diff --git a/NEWS b/NEWS index 9826552c3..ee919af3e 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,9 @@ 2.2.17 (2015-02-xx) ------------------- +Enhancements + - support for mail prority using EAS + Bug fixes - fixed login issue after password change (#2601) - fixed potential encoding issue using EAS and 8-bit mails (#3116) From afd73289d1ebb13c643f7a8290eac7da43b69330 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 20 Mar 2015 08:45:42 -0400 Subject: [PATCH 47/60] properly fallback over EAS to UTF-8 and then Latin1 for messages w/o charset (#3103) --- ActiveSync/SOGoMailObject+ActiveSync.m | 22 +++++++++++++++++----- NEWS | 1 + 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index 0eb08b2ec..49eb8dc29 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -272,10 +272,14 @@ struct GlobalObjectId { charset = [[[self lookupInfoForBodyPart: key] objectForKey: @"parameterList"] objectForKey: @"charset"]; if (![charset length]) - charset = @"us-ascii"; + charset = @"utf-8"; s = [NSString stringWithData: d usingEncodingNamed: charset]; + // We fallback to ISO-8859-1 string encoding + if (!s) + s = [[[NSString alloc] initWithData: d encoding: NSISOLatin1StringEncoding] autorelease]; + if (theType == 1 && *theNativeTypeFound == 2) s = [s htmlToText]; @@ -323,7 +327,7 @@ struct GlobalObjectId { [[[thePart contentType] type] isEqualToString: @"text"] && ([[[thePart contentType] subType] isEqualToString: @"plain"] || [[[thePart contentType] subType] isEqualToString: @"html"])) { - // We make sure everything is encoded in UTF-8 + // We make sure everything is encoded in UTF-8. NGMimeType *mimeType; NSString *s; @@ -334,9 +338,13 @@ struct GlobalObjectId { charset = [[thePart contentType] valueOfParameter: @"charset"]; if (![charset length]) - charset = @"us-ascii"; + charset = @"utf-8"; - s = [NSString stringWithData: body usingEncodingNamed: charset]; + s = [NSString stringWithData: body usingEncodingNamed: charset]; + + // We fallback to ISO-8859-1 string encoding. We avoid #3103. + if (!s) + s = [[[NSString alloc] initWithData: d encoding: NSISOLatin1StringEncoding] autorelease]; } else { @@ -439,7 +447,7 @@ struct GlobalObjectId { charset = [[[self lookupInfoForBodyPart: @""] objectForKey: @"parameterList"] objectForKey: @"charset"]; if (![charset length]) - charset = @"us-ascii"; + charset = @"utf-8"; d = [[self fetchPlainTextParts] objectForKey: @""]; @@ -453,6 +461,10 @@ struct GlobalObjectId { d = [d dataByDecodingQuotedPrintableTransferEncoding]; s = [NSString stringWithData: d usingEncodingNamed: charset]; + + // We fallback to ISO-8859-1 string encoding. We avoid #3103. + if (!s) + s = [[[NSString alloc] initWithData: d encoding: NSISOLatin1StringEncoding] autorelease]; // Check if we must convert html->plain if (theType == 1 && [subtype isEqualToString: @"html"]) diff --git a/NEWS b/NEWS index ee919af3e..505731fe3 100644 --- a/NEWS +++ b/NEWS @@ -21,6 +21,7 @@ Bug fixes - fixed fetching of freebusy data from the Web interface - fixed EAS handling of Bcc in emails (#3138) - fixed Language-Region tags in Web interface (#3121) + - properly fallback over EAS to UTF-8 and then Latin1 for messages w/o charset (#3103) 2.2.16 (2015-02-12) ------------------- From ecd336fa5c6513ee8533dae05e5a328c81527a38 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 20 Mar 2015 08:51:35 -0400 Subject: [PATCH 48/60] Fix compilation warning and error --- ActiveSync/NGMimeMessage+ActiveSync.m | 1 - ActiveSync/SOGoMailObject+ActiveSync.m | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/ActiveSync/NGMimeMessage+ActiveSync.m b/ActiveSync/NGMimeMessage+ActiveSync.m index 7954d7f38..f3c11cd96 100644 --- a/ActiveSync/NGMimeMessage+ActiveSync.m +++ b/ActiveSync/NGMimeMessage+ActiveSync.m @@ -61,7 +61,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (NSArray *) allRecipients { NSMutableArray *recipients; - NSEnumerator *enumerator; recipients = [NSMutableArray array]; diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index 49eb8dc29..45c865c84 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -344,7 +344,7 @@ struct GlobalObjectId { // We fallback to ISO-8859-1 string encoding. We avoid #3103. if (!s) - s = [[[NSString alloc] initWithData: d encoding: NSISOLatin1StringEncoding] autorelease]; + s = [[[NSString alloc] initWithData: body encoding: NSISOLatin1StringEncoding] autorelease]; } else { From baf3d1f986d48d4fa37a076ccf555d75f4d5dbda Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 20 Mar 2015 09:10:49 -0400 Subject: [PATCH 49/60] immediately delete mails from EAS clients when they are marked as deleted on the IMAP server --- NEWS | 1 + SoObjects/Mailer/SOGoMailFolder.m | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 505731fe3..88fccc564 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ Enhancements - support for mail prority using EAS + - immediately delete mails from EAS clients when they are marked as deleted on the IMAP server Bug fixes - fixed login issue after password change (#2601) diff --git a/SoObjects/Mailer/SOGoMailFolder.m b/SoObjects/Mailer/SOGoMailFolder.m index d83ca78a6..c65c6c43c 100644 --- a/SoObjects/Mailer/SOGoMailFolder.m +++ b/SoObjects/Mailer/SOGoMailFolder.m @@ -2129,13 +2129,13 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) value: nextModseq]; searchQualifier = [[EOAndQualifier alloc] initWithQualifiers: - kvQualifier, [self _nonDeletedQualifier], nil]; + kvQualifier, nil]; [kvQualifier release]; [searchQualifier autorelease]; } else { - searchQualifier = [self _nonDeletedQualifier]; + searchQualifier = nil; } if (theStartDate) @@ -2144,7 +2144,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) sinceDateQualifier = [EOQualifier qualifierWithQualifierFormat: @"(DATE >= %@)", theStartDate]; - searchQualifier = [[EOAndQualifier alloc] initWithQualifiers: searchQualifier, sinceDateQualifier, + searchQualifier = [[EOAndQualifier alloc] initWithQualifiers: sinceDateQualifier, searchQualifier, nil]; [searchQualifier autorelease]; } @@ -2155,7 +2155,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) sortOrdering: nil]; fetchResults = [(NSDictionary *)[self fetchUIDs: uids - parts: [NSArray arrayWithObject: @"modseq"]] + parts: [NSArray arrayWithObjects: @"modseq", @"flags", nil]] objectForKey: @"fetch"]; /* NOTE: we sort items manually because Cyrus does not properly sort @@ -2166,7 +2166,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) for (i = 0; i < [fetchResults count]; i++) { - d = [NSDictionary dictionaryWithObject: [[fetchResults objectAtIndex: i] objectForKey: @"modseq"] + d = [NSDictionary dictionaryWithObject: ([[[fetchResults objectAtIndex: i] objectForKey: @"flags"] containsObject: @"deleted"]) ? [NSNull null] : [[fetchResults objectAtIndex: i] objectForKey: @"modseq"] forKey: [[[fetchResults objectAtIndex: i] objectForKey: @"uid"] stringValue]]; [allTokens addObject: d]; } From 9eb138b867ebd0a51b9a649891422bac70406510 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 23 Mar 2015 10:54:36 -0400 Subject: [PATCH 50/60] prevent potential freebusy lookup crashes during timezone changes with repetitive events --- NEWS | 1 + UI/MainUI/SOGoUserHomePage.m | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 88fccc564..322216415 100644 --- a/NEWS +++ b/NEWS @@ -23,6 +23,7 @@ Bug fixes - fixed EAS handling of Bcc in emails (#3138) - fixed Language-Region tags in Web interface (#3121) - properly fallback over EAS to UTF-8 and then Latin1 for messages w/o charset (#3103) + - prevent potential freebusy lookup crashes during timezone changes with repetitive events 2.2.16 (2015-02-12) ------------------- diff --git a/UI/MainUI/SOGoUserHomePage.m b/UI/MainUI/SOGoUserHomePage.m index 2a8415d70..c6223e656 100644 --- a/UI/MainUI/SOGoUserHomePage.m +++ b/UI/MainUI/SOGoUserHomePage.m @@ -155,6 +155,7 @@ delta = [[currentDate timeZoneDetail] timeZoneSecondsFromGMT] - [[startDate timeZoneDetail] timeZoneSecondsFromGMT]; startInterval += (delta/60/15); + startInterval = (startInterval < -4 ? -4 : startInterval); currentDate = [record objectForKey: @"endDate"]; if ([currentDate earlierDate: endDate] == endDate) @@ -165,6 +166,8 @@ delta = [[currentDate timeZoneDetail] timeZoneSecondsFromGMT] - [[startDate timeZoneDetail] timeZoneSecondsFromGMT]; endInterval += (delta/60/15); + endInterval = (endInterval < 0 ? 0 : endInterval); + endInterval = (endInterval > itemCount+4 ? itemCount+4 : endInterval); // Update bit string representation // If the user is a resource with restristed amount of bookings, keep the sum of overlapping events @@ -230,7 +233,7 @@ intervals = interval / intervalSeconds + 8; // Build a bit string representation of the freebusy data for the period - freeBusyItems = NSZoneCalloc (NULL, intervals, sizeof (int)); + freeBusyItems = calloc(intervals, sizeof (unsigned int)); [self _fillFreeBusyItems: (freeBusyItems+4) count: (intervals-4) withRecords: [fb fetchFreeBusyInfosFrom: start to: end forContact: uid] @@ -243,7 +246,7 @@ { [freeBusy addObject: [NSString stringWithFormat: @"%d", *(freeBusyItems + count)]]; } - NSZoneFree (NULL, freeBusyItems); + free(freeBusyItems); // Return a NSString representation return [freeBusy componentsJoinedByString: @","]; From 67139ce3e3f69160a683d8c11bee439be202a84e Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 23 Mar 2015 11:35:45 -0400 Subject: [PATCH 51/60] improved GetItemEstimate to count all vasnished/deleted mails too --- ActiveSync/SOGoActiveSyncDispatcher.m | 21 +++++---------------- NEWS | 1 + 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index 9c3b0a3ee..795791612 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -1166,27 +1166,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // if (folderType == ActiveSyncMailFolder) { - EOQualifier *notDeletedQualifier, *sinceDateQualifier; - EOAndQualifier *qualifier; NSCalendarDate *filter; - NSArray *uids; + NSString *syncKey; + NSArray *allMessages; filter = [NSCalendarDate dateFromFilterType: [[(id)[[allCollections objectAtIndex: j] getElementsByTagName: @"FilterType"] lastObject] textValue]]; + syncKey = [[(id)[[allCollections objectAtIndex: j] getElementsByTagName: @"SyncKey"] lastObject] textValue]; - notDeletedQualifier = [EOQualifier qualifierWithQualifierFormat: - @"(not (flags = %@))", - @"deleted"]; - sinceDateQualifier = [EOQualifier qualifierWithQualifierFormat: - @"(DATE >= %@)", filter]; - - qualifier = [[EOAndQualifier alloc] initWithQualifiers: notDeletedQualifier, sinceDateQualifier, - nil]; - AUTORELEASE(qualifier); + allMessages = [currentCollection syncTokenFieldsWithProperties: nil matchingSyncToken: syncKey fromDate: filter]; - uids = [currentCollection fetchUIDsMatchingQualifier: qualifier - sortOrdering: @"REVERSE ARRIVAL" - threaded: NO]; - count = [uids count]; + count = [allMessages count]; // Add the number of UIDs expected to "soft delete" count += [self _softDeleteCountWithFilter: filter collectionId: nameInCache]; diff --git a/NEWS b/NEWS index 322216415..f3a161d57 100644 --- a/NEWS +++ b/NEWS @@ -24,6 +24,7 @@ Bug fixes - fixed Language-Region tags in Web interface (#3121) - properly fallback over EAS to UTF-8 and then Latin1 for messages w/o charset (#3103) - prevent potential freebusy lookup crashes during timezone changes with repetitive events + - improved GetItemEstimate to count all vasnished/deleted mails too 2.2.16 (2015-02-12) ------------------- From d2915add6d69a8fd05d15bb8c2ed979fe6ad9026 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 23 Mar 2015 14:08:31 -0400 Subject: [PATCH 52/60] now favor login@domain as the default email address if multiple mail: fields are specified --- NEWS | 1 + SoObjects/SOGo/SOGoUser.h | 2 +- SoObjects/SOGo/SOGoUser.m | 22 +++++++++++++++------- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/NEWS b/NEWS index f3a161d57..1136cf8b9 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,7 @@ Enhancements - support for mail prority using EAS - immediately delete mails from EAS clients when they are marked as deleted on the IMAP server + - now favor login@domain as the default email address if multiple mail: fields are specified Bug fixes - fixed login issue after password change (#2601) diff --git a/SoObjects/SOGo/SOGoUser.h b/SoObjects/SOGo/SOGoUser.h index fad66e4e8..5702f10cc 100644 --- a/SoObjects/SOGo/SOGoUser.h +++ b/SoObjects/SOGo/SOGoUser.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2006-2013 Inverse inc. + Copyright (C) 2006-2015 Inverse inc. Copyright (C) 2005 SKYRIX Software AG This file is part of SOGo. diff --git a/SoObjects/SOGo/SOGoUser.m b/SoObjects/SOGo/SOGoUser.m index 5465d64ea..91d3b1b5a 100644 --- a/SoObjects/SOGo/SOGoUser.m +++ b/SoObjects/SOGo/SOGoUser.m @@ -235,7 +235,6 @@ [currentPassword release]; [cn release]; [loginInDomain release]; - //[language release]; [super dealloc]; } @@ -578,13 +577,13 @@ - (void) _appendSystemMailAccount { NSString *fullName, *replyTo, *imapLogin, *imapServer, *cImapServer, *signature, - *encryption, *scheme, *action, *query, *customEmail, *sieveServer; + *encryption, *scheme, *action, *query, *customEmail, *defaultEmail, *sieveServer; NSMutableDictionary *mailAccount, *identity, *mailboxes, *receipts; NSNumber *port; NSMutableArray *identities; NSArray *mails; NSURL *url, *cUrl; - unsigned int count, max; + unsigned int count, max, default_identity; NSInteger defaultPort; [self userDefaults]; @@ -662,8 +661,9 @@ [mailAccount setObject: sieveServer forKey: @"sieveServerName"]; } - - /* identities */ + // Identities + defaultEmail = [NSString stringWithFormat: @"%@@%@", [self loginInDomain], [self domain]]; + default_identity = 0; identities = [NSMutableArray new]; mails = [self allEmails]; [mailAccount setObject: [mails objectAtIndex: 0] forKey: @"name"]; @@ -703,6 +703,10 @@ if (signature) [identity setObject: signature forKey: @"signature"]; [identities addObject: identity]; + + if ([[identity objectForKey: @"email"] caseInsensitiveCompare: defaultEmail] == NSOrderedSame) + default_identity = [identities count]-1; + [identity release]; } } @@ -724,10 +728,14 @@ if (signature) [identity setObject: signature forKey: @"signature"]; [identities addObject: identity]; + + if ([[identity objectForKey: @"email"] caseInsensitiveCompare: defaultEmail] == NSOrderedSame) + default_identity = [identities count]-1; + [identity release]; } - [[identities objectAtIndex: 0] setObject: [NSNumber numberWithBool: YES] - forKey: @"isDefault"]; + [[identities objectAtIndex: default_identity] setObject: [NSNumber numberWithBool: YES] + forKey: @"isDefault"]; [mailAccount setObject: identities forKey: @"identities"]; [identities release]; From 9d7bbbc312cbe8ccb535e24308be111a3a2eb710 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 23 Mar 2015 14:55:14 -0400 Subject: [PATCH 53/60] enable by default HTML mails support using EAS on Windows and BB phones --- ActiveSync/SOGoActiveSyncDispatcher.m | 1 + NEWS | 1 + 2 files changed, 2 insertions(+) diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index 795791612..fc73a7b5e 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -1937,6 +1937,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [s appendString: @""]; [s appendString: @""]; [s appendString: @""]; + [s appendString: @"1"]; [s appendString: @""]; d = [[s dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml]; diff --git a/NEWS b/NEWS index 1136cf8b9..0d172d38d 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ Enhancements - support for mail prority using EAS - immediately delete mails from EAS clients when they are marked as deleted on the IMAP server - now favor login@domain as the default email address if multiple mail: fields are specified + - enable by default HTML mails support using EAS on Windows and BB phones Bug fixes - fixed login issue after password change (#2601) From cc3652b59b40bcb420d806412277509ac247d85d Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 23 Mar 2015 17:23:29 -0400 Subject: [PATCH 54/60] improvements to EAS SyncKey handling to avoid missing mails (#3048, #3058) --- ActiveSync/SOGoActiveSyncDispatcher+Sync.m | 7 +++++-- NEWS | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m index 47aed901f..cdd4cd9d1 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m +++ b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m @@ -540,6 +540,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { NSMutableDictionary *folderMetadata, *dateCache, *syncCache; + NSString *davCollectionTagToStore; NSAutoreleasePool *pool; NSMutableString *s; @@ -618,6 +619,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. more_available = NO; + davCollectionTagToStore = [theCollection davCollectionTag]; + switch (theFolderType) { // Handle all the GCS components @@ -788,7 +791,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. else { [folderMetadata removeObjectForKey: @"MoreAvailable"]; - [folderMetadata setObject: [theCollection davCollectionTag] forKey: @"SyncKey"]; + [folderMetadata setObject: davCollectionTagToStore forKey: @"SyncKey"]; } [self _setFolderMetadata: folderMetadata @@ -963,7 +966,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. else { [folderMetadata removeObjectForKey: @"MoreAvailable"]; - [folderMetadata setObject: [theCollection davCollectionTag] forKey: @"SyncKey"]; + [folderMetadata setObject: davCollectionTagToStore forKey: @"SyncKey"]; } [self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]]; diff --git a/NEWS b/NEWS index 0d172d38d..176a81059 100644 --- a/NEWS +++ b/NEWS @@ -27,6 +27,7 @@ Bug fixes - properly fallback over EAS to UTF-8 and then Latin1 for messages w/o charset (#3103) - prevent potential freebusy lookup crashes during timezone changes with repetitive events - improved GetItemEstimate to count all vasnished/deleted mails too + - improvements to EAS SyncKey handling to avoid missing mails (#3048, #3058) 2.2.16 (2015-02-12) ------------------- From 26d876e67a32e6c2dc36a3a92449aa0b6638ec41 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Mon, 23 Mar 2015 16:28:32 -0400 Subject: [PATCH 55/60] Improve event attendees editor - Avoid repetitive AJAX queries; - Improve handling of daylight changes. --- .../JavascriptAPIExtensions.js | 2 +- UI/WebServerResources/UIxAttendeesEditor.js | 69 +++++++++++-------- 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/UI/WebServerResources/JavascriptAPIExtensions.js b/UI/WebServerResources/JavascriptAPIExtensions.js index d71b92a10..190a8e99b 100644 --- a/UI/WebServerResources/JavascriptAPIExtensions.js +++ b/UI/WebServerResources/JavascriptAPIExtensions.js @@ -218,7 +218,7 @@ Date.prototype.stringWithSeparator = function(separator) { Date.prototype.addDays = function(nbrDays) { var milliSeconds = this.getTime(); - milliSeconds += 86400000 * nbrDays; + milliSeconds += 86400000 * Math.round(nbrDays); this.setTime(milliSeconds); }; diff --git a/UI/WebServerResources/UIxAttendeesEditor.js b/UI/WebServerResources/UIxAttendeesEditor.js index 6d6c77fe5..7ca8e2874 100644 --- a/UI/WebServerResources/UIxAttendeesEditor.js +++ b/UI/WebServerResources/UIxAttendeesEditor.js @@ -896,9 +896,8 @@ _freeBusyCacheEntry.prototype = { if (this.entries.length > offset) { var adjustedEd = ed.beginOfDay(); var nbrDays = adjustedSd.deltaDays(adjustedEd) + 1; - var nbrQu = nbrDays * 96; - var offsetEnd = offset + nbrQu; - if (this.entries.length >= offsetEnd) { + var offsetEnd = offset + (nbrDays * 96); + if (Math.round(this.entries.length/96) >= nbrDays) { entries = this.entries.slice(offset, offsetEnd); } } @@ -912,16 +911,19 @@ _freeBusyCacheEntry.prototype = { var adjustedSd = sd.beginOfDay(); var adjustedEd = ed.beginOfDay(); - var nbrDays = adjustedSd.deltaDays(adjustedEd) + 1; + var start = adjustedSd.clone(); + start.addDays(-7); + var end = adjustedEd.clone(); + end.addDays(7); if (this.startDate) { fetchDates = []; if (adjustedSd.getTime() < this.startDate.getTime()) { // Period extends to before current start - var start = adjustedSd.clone(); - start.addDays(-7); - var end = this.startDate.beginOfDay(); - end.addDays(-1); + if (end.getTime() >= this.startDate.getTime()) { + end = this.startDate.beginOfDay(); + end.addDays(-1); + } fetchDates.push({ start: start, end: end }); } @@ -930,19 +932,18 @@ _freeBusyCacheEntry.prototype = { nextDate.addDays(currentNbrDays); if (adjustedEd.getTime() >= nextDate.getTime()) { // Period extends to after current end - var end = adjustedEd.clone(); - end.addDays(7); - fetchDates.push({ start: nextDate, end: end }); + if (start.getTime() <= nextDate.getTime()) { + start = nextDate.beginOfDay(); + start.addDays(1); + } + fetchDates.push({ start: start, end: end }); } } else { // Initial range - var start = adjustedSd.clone(); - start.addDays(-7); - var end = adjustedEd.clone(); - end.addDays(7); fetchDates = [ { start: start, end: end } ]; } + return fetchDates; }, @@ -960,7 +961,7 @@ _freeBusyCacheEntry.prototype = { } else { days = this.startDate.deltaDays(start); - if (this.entries.length == (days * 96)) { + if (Math.round(this.entries.length/96) == days) { // New period is just after previous period this.entries = this.entries.concat(entries); merged = true; @@ -1204,7 +1205,7 @@ function drawFbData(input, slots) { else { log("inconsistency between freebusy results and" + " the number of cells"); - log(" expecting: " + tds.length + " received: " + slots.length); + log(" expecting: " + (tds.length * 4) + " received: " + slots.length); } } @@ -1685,10 +1686,10 @@ function initTimeWidgets(widgets) { function onAdjustTime(event) { var endDate = window.getEndDate(); var startDate = window.getStartDate(); + var delta = 0; if (this.id.startsWith("start")) { // Start date was changed - var delta = window.getShadowStartDate().valueOf() - - startDate.valueOf(); + delta = window.getShadowStartDate().valueOf() - startDate.valueOf(); var newEndDate = new Date(endDate.valueOf() - delta); window.setEndDate(newEndDate); window.timeWidgets['end']['date'].updateShadowValue(); @@ -1698,20 +1699,27 @@ function onAdjustTime(event) { } else { // End date was changed - var delta = endDate.valueOf() - startDate.valueOf(); - if (delta < 0) { - showAlertDialog(labels.validate_endbeforestart); - var oldEndDate = window.getShadowEndDate(); - window.setEndDate(oldEndDate); - - window.timeWidgets['end']['date'].updateShadowValue(); - window.timeWidgets['end']['time'].updateShadowValue(); - window.timeWidgets['end']['time'].onChange(); // method from SOGoTimePicker + delta = window.getShadowEndDate().valueOf() - endDate.valueOf(); + if (delta != 0) { + var startEndDelta = endDate.valueOf() - startDate.valueOf(); + if (startEndDelta < 0) { + showAlertDialog(labels.validate_endbeforestart); + var oldEndDate = window.getShadowEndDate(); + window.setEndDate(oldEndDate); + window.timeWidgets['end']['date'].updateShadowValue(); + window.timeWidgets['end']['time'].updateShadowValue(); + window.timeWidgets['end']['time'].onChange(); // method from SOGoTimePicker + } + else { + window.timeWidgets['end']['date'].updateShadowValue(); + window.timeWidgets['end']['time'].updateShadowValue(); + } } } - // Specific function for the attendees editor - onTimeDateWidgetChange(); + if ($("freeBusyHeader").getElementsByTagName("th").length == 0 || delta != 0) + // Update freebusy data + onTimeDateWidgetChange(); } function _getDate(which) { @@ -1750,6 +1758,7 @@ function getShadowEndDate() { function _setDate(which, newDate) { window.timeWidgets[which]['date'].setInputAsDate(newDate); + jQuery(window.timeWidgets[which]['date']).closest('.date').datepicker('update'); if (!isAllDay) { window.timeWidgets[which]['time'].value = newDate.getDisplayHoursString(); if (window.timeWidgets[which]['time'].onChange) window.timeWidgets[which]['time'].onChange(); // method from SOGoTimePicker From d75fb0722a0ced5bb937e5b754e95cd0261df7a7 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 24 Mar 2015 08:34:29 -0400 Subject: [PATCH 56/60] Code cleanups --- UI/Scheduler/UIxAttendeesEditor.h | 4 +- UI/Scheduler/UIxAttendeesEditor.m | 4 +- UI/Scheduler/UIxComponentEditor.h | 2 +- UI/Scheduler/UIxComponentEditor.m | 81 +++---------------------------- 4 files changed, 10 insertions(+), 81 deletions(-) diff --git a/UI/Scheduler/UIxAttendeesEditor.h b/UI/Scheduler/UIxAttendeesEditor.h index 530c33c51..4e08ccfa1 100644 --- a/UI/Scheduler/UIxAttendeesEditor.h +++ b/UI/Scheduler/UIxAttendeesEditor.h @@ -1,8 +1,6 @@ /* UIxAttendeesEditor.h - this file is part of SOGo * - * Copyright (C) 2007-2012 Inverse inc. - * - * Author: Wolfgang Sourdeau + * Copyright (C) 2007-2015 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/UI/Scheduler/UIxAttendeesEditor.m b/UI/Scheduler/UIxAttendeesEditor.m index 40379d48e..ae7de6700 100644 --- a/UI/Scheduler/UIxAttendeesEditor.m +++ b/UI/Scheduler/UIxAttendeesEditor.m @@ -1,8 +1,6 @@ /* UIxAttendeesEditor.m - this file is part of SOGo * - * Copyright (C) 2007-2012 Inverse inc. - * - * Author: Wolfgang Sourdeau + * Copyright (C) 2007-2015 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/UI/Scheduler/UIxComponentEditor.h b/UI/Scheduler/UIxComponentEditor.h index 201065c11..b660dc436 100644 --- a/UI/Scheduler/UIxComponentEditor.h +++ b/UI/Scheduler/UIxComponentEditor.h @@ -1,6 +1,6 @@ /* UIxComponentEditor.h - this file is part of SOGo * - * Copyright (C) 2006-2014 Inverse inc. + * Copyright (C) 2006-2015 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/UI/Scheduler/UIxComponentEditor.m b/UI/Scheduler/UIxComponentEditor.m index c1d666e63..a7581e57c 100644 --- a/UI/Scheduler/UIxComponentEditor.m +++ b/UI/Scheduler/UIxComponentEditor.m @@ -176,7 +176,6 @@ iRANGE(2); [self setIsCycleEndNever]; componentOwner = @""; organizer = nil; - //organizerIdentity = nil; organizerProfile = nil; ownerAsAttendee = nil; attendee = nil; @@ -213,7 +212,6 @@ iRANGE(2); [title release]; [location release]; [organizer release]; - //[organizerIdentity release]; [organizerProfile release]; [ownerAsAttendee release]; [comment release]; @@ -820,25 +818,27 @@ iRANGE(2); uid = email; [profile setObject: name - forKey: @"name"]; + forKey: @"name"]; [profile setObject: email - forKey: @"email"]; + forKey: @"email"]; if (partstat == nil || ![partstat length]) partstat = @"accepted"; + [profile setObject: partstat - forKey: @"partstat"]; + forKey: @"partstat"]; if (role == nil || ![role length]) role = @"chair"; + [profile setObject: role - forKey: @"role"]; + forKey: @"role"]; organizerProfile = [NSDictionary dictionaryWithObject: profile forKey: uid]; [organizerProfile retain]; } - + return organizerProfile; } @@ -897,30 +897,6 @@ iRANGE(2); return [[[[self organizerProfile] allValues] lastObject] jsonRepresentation]; } -// - (BOOL) canBeOrganizer -// { -// NSString *owner; -// SOGoObject *co; -// SOGoUser *currentUser; -// BOOL hasOrganizer; -// SoSecurityManager *sm; - -// co = [self clientObject]; -// owner = [co ownerInContext: context]; -// currentUser = [context activeUser]; - -// hasOrganizer = ([[organizer value: 0] length] > 0); - -// sm = [SoSecurityManager sharedSecurityManager]; - -// return ([co isNew] -// || (([owner isEqualToString: [currentUser login]] -// || ![sm validatePermission: SOGoCalendarPerm_ModifyComponent -// onObject: co -// inContext: context]) -// && (!hasOrganizer || [component userIsOrganizer: currentUser]))); -// } - - (BOOL) hasOrganizer { // We check if there's an organizer and if it's not ourself @@ -948,51 +924,8 @@ iRANGE(2); } return NO; - - //return ([[organizer value: 0] length] && ![self canBeOrganizer]); } -//- (void) setOrganizerIdentity: (NSDictionary *) newOrganizerIdentity -//{ -// ASSIGN (organizerIdentity, newOrganizerIdentity); -//} - -// - (NSDictionary *) organizerIdentity -// { -// NSArray *allIdentities; -// NSEnumerator *identities; -// NSDictionary *currentIdentity; -// NSString *orgEmail; - -// orgEmail = [organizer rfc822Email]; -// if (!organizerIdentity) -// { -// if ([orgEmail length]) -// { -// allIdentities = [[context activeUser] allIdentities]; -// identities = [allIdentities objectEnumerator]; -// while (!organizerIdentity -// && ((currentIdentity = [identities nextObject]))) -// if ([[currentIdentity objectForKey: @"email"] -// caseInsensitiveCompare: orgEmail] -// == NSOrderedSame) -// ASSIGN (organizerIdentity, currentIdentity); -// } -// } - -// return organizerIdentity; -// } - -//- (NSArray *) organizerList -//{ -// return [[context activeUser] allIdentities]; -//} - -//- (NSString *) itemOrganizerText -//{ -// return [item keysWithFormat: @"%{fullName} <%{email}>"]; -//} - - (BOOL) hasAttendees { return ([[component attendees] count] > 0); From 097d5c2333515092f03ace5e64fc6824682ba974 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 24 Mar 2015 08:40:13 -0400 Subject: [PATCH 57/60] now possible to configure objectClass names for LDAP groups using GroupObjectClasses (#1499) --- Documentation/SOGoInstallationGuide.asciidoc | 5 +++ NEWS | 1 + SoObjects/SOGo/LDAPSource.h | 2 + SoObjects/SOGo/LDAPSource.m | 40 ++++++++++++++------ SoObjects/SOGo/SOGoGroup.m | 13 ++++--- SoObjects/SOGo/SOGoSource.h | 1 + 6 files changed, 45 insertions(+), 17 deletions(-) diff --git a/Documentation/SOGoInstallationGuide.asciidoc b/Documentation/SOGoInstallationGuide.asciidoc index e128b02c4..e74cf48b0 100644 --- a/Documentation/SOGoInstallationGuide.asciidoc +++ b/Documentation/SOGoInstallationGuide.asciidoc @@ -1048,6 +1048,11 @@ of supported attributes. user addressbooks (see _abOU_ below), this list of object classes will be applied to new records as they are created. +|GroupObjectClasses +|A list (array) of names identifying groups within the LDAP source. If not +set, SOGo will use `group`, `groupofnames`, `groupofuniquenames` +and `posixgroup`. + |modifiers |A list (array) of usernames that are authorized to perform modifications to the address book defined by this LDAP source. diff --git a/NEWS b/NEWS index 176a81059..cd6363480 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,7 @@ Enhancements - immediately delete mails from EAS clients when they are marked as deleted on the IMAP server - now favor login@domain as the default email address if multiple mail: fields are specified - enable by default HTML mails support using EAS on Windows and BB phones + - now possible to configure objectClass names for LDAP groups using GroupObjectClasses (#1499) Bug fixes - fixed login issue after password change (#2601) diff --git a/SoObjects/SOGo/LDAPSource.h b/SoObjects/SOGo/LDAPSource.h index 938948cd2..3877ec4ee 100644 --- a/SoObjects/SOGo/LDAPSource.h +++ b/SoObjects/SOGo/LDAPSource.h @@ -72,6 +72,7 @@ NSDictionary *contactMapping; NSArray *contactObjectClasses; + NSArray *groupObjectClasses; NSDictionary *modulesConstraints; @@ -106,6 +107,7 @@ UIDField: (NSString *) newUIDField mailFields: (NSArray *) newMailFields searchFields: (NSArray *) newSearchFields +groupObjectClasses: (NSArray *) newGroupObjectClasses IMAPHostField: (NSString *) newIMAPHostField IMAPLoginField: (NSString *) newIMAPLoginField SieveHostField: (NSString *) newSieveHostField diff --git a/SoObjects/SOGo/LDAPSource.m b/SoObjects/SOGo/LDAPSource.m index 23f22c1e7..598e56ffe 100644 --- a/SoObjects/SOGo/LDAPSource.m +++ b/SoObjects/SOGo/LDAPSource.m @@ -101,6 +101,8 @@ static Class NSStringK; contactMapping = nil; searchFields = [NSArray arrayWithObjects: @"sn", @"displayname", @"telephonenumber", nil]; [searchFields retain]; + groupObjectClasses = [NSArray arrayWithObjects: @"group", @"groupofnames", @"groupofuniquenames", @"posixgroup", nil]; + [groupObjectClasses retain]; IMAPHostField = nil; IMAPLoginField = nil; SieveHostField = nil; @@ -144,6 +146,7 @@ static Class NSStringK; [contactMapping release]; [mailFields release]; [searchFields release]; + [groupObjectClasses release]; [IMAPHostField release]; [IMAPLoginField release]; [SieveHostField release]; @@ -189,6 +192,7 @@ static Class NSStringK; UIDField: [udSource objectForKey: @"UIDFieldName"] mailFields: [udSource objectForKey: @"MailFieldNames"] searchFields: [udSource objectForKey: @"SearchFieldNames"] + groupObjectClasses: [udSource objectForKey: @"GroupObjectClasses"] IMAPHostField: [udSource objectForKey: @"IMAPHostFieldName"] IMAPLoginField: [udSource objectForKey: @"IMAPLoginFieldName"] SieveHostField: [udSource objectForKey: @"SieveHostFieldName"] @@ -310,6 +314,7 @@ static Class NSStringK; UIDField: (NSString *) newUIDField mailFields: (NSArray *) newMailFields searchFields: (NSArray *) newSearchFields +groupObjectClasses: (NSArray *) newGroupObjectClasses IMAPHostField: (NSString *) newIMAPHostField IMAPLoginField: (NSString *) newIMAPLoginField SieveHostField: (NSString *) newSieveHostField @@ -334,6 +339,8 @@ static Class NSStringK; ASSIGN(mailFields, newMailFields); if (newSearchFields) ASSIGN(searchFields, newSearchFields); + if (newGroupObjectClasses) + ASSIGN(groupObjectClasses, newGroupObjectClasses); if (newBindFields) { // Before SOGo v1.2.0, bindFields was a comma-separated list @@ -1031,6 +1038,8 @@ static Class NSStringK; NSString *value; static NSArray *resourceKinds = nil; NSMutableArray *classes; + NSEnumerator *gclasses; + NSString *gclass; id o; if (!resourceKinds) @@ -1059,24 +1068,27 @@ static Class NSStringK; if (classes) { - // We check if our entry is a group. If so, we set the - // 'isGroup' custom attribute. - if ([classes containsObject: @"group"] || - [classes containsObject: @"groupofnames"] || - [classes containsObject: @"groupofuniquenames"] || - [classes containsObject: @"posixgroup"]) - { - [ldifRecord setObject: [NSNumber numberWithInt: 1] - forKey: @"isGroup"]; - } // We check if our entry is a resource. We also support // determining resources based on the KindFieldName attribute // value - see below. - else if ([classes containsObject: @"calendarresource"]) + if ([classes containsObject: @"calendarresource"]) { [ldifRecord setObject: [NSNumber numberWithInt: 1] forKey: @"isResource"]; } + else + { + // We check if our entry is a group. If so, we set the + // 'isGroup' custom attribute. + gclasses = [groupObjectClasses objectEnumerator]; + while (gclass = [gclasses nextObject]) + if ([classes containsObject: [gclass lowercaseString]]) + { + [ldifRecord setObject: [NSNumber numberWithInt: 1] + forKey: @"isGroup"]; + break; + } + } } // We check if that entry corresponds to a resource. For this, @@ -1368,6 +1380,11 @@ static Class NSStringK; return modifiers; } +- (NSArray *) groupObjectClasses +{ + return groupObjectClasses; +} + static NSArray * _convertRecordToLDAPAttributes (LDAPSourceSchema *schema, NSDictionary *ldifRecord) { @@ -1683,6 +1700,7 @@ _makeLDAPChanges (NGLdapConnection *ldapConnection, UIDField: @"cn" mailFields: nil searchFields: nil + groupObjectClasses: nil IMAPHostField: nil IMAPLoginField: nil SieveHostField: nil diff --git a/SoObjects/SOGo/SOGoGroup.m b/SoObjects/SOGo/SOGoGroup.m index 648b97ae4..cacdd7770 100644 --- a/SoObjects/SOGo/SOGoGroup.m +++ b/SoObjects/SOGo/SOGoGroup.m @@ -137,6 +137,8 @@ NGLdapEntry *entry; NSObject *source; id o; + NSEnumerator *gclasses; + NSString *gclass; int i; @@ -194,12 +196,11 @@ } } - // Found a group, let's return it. - if ([classes containsObject: @"group"] || - [classes containsObject: @"groupofnames"] || - [classes containsObject: @"groupofuniquenames"] || - [classes containsObject: @"posixgroup"]) - { + gclasses = [[source groupObjectClasses] objectEnumerator]; + while (gclass = [gclasses nextObject]) + if ([classes containsObject: gclass]) + { + // Found a group, let's return it. o = [[self alloc] initWithIdentifier: theValue domain: domain source: source diff --git a/SoObjects/SOGo/SOGoSource.h b/SoObjects/SOGo/SOGoSource.h index 2415f408c..b55a5a14a 100644 --- a/SoObjects/SOGo/SOGoSource.h +++ b/SoObjects/SOGo/SOGoSource.h @@ -110,6 +110,7 @@ - (NSString *) baseDN; - (NSString *) MSExchangeHostname; +- (NSArray *) groupObjectClasses; @end #endif /* SOGOSOURCE_H */ From b933f53fc2580bd5b9913f7afebcf6b2d9bedc53 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 24 Mar 2015 10:56:26 -0400 Subject: [PATCH 58/60] Changes for the 2.2.17 release --- ChangeLog | 350 ++++++++++++++++++ Documentation/docinfo.xml | 6 +- .../includes/global-attributes.asciidoc | 2 +- NEWS | 2 +- Version | 2 +- 5 files changed, 356 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2402f9b7e..26aaadc7f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,353 @@ +commit 097d5c2333515092f03ace5e64fc6824682ba974 +Author: Ludovic Marcotte +Date: Tue Mar 24 08:40:13 2015 -0400 + + now possible to configure objectClass names for LDAP groups using GroupObjectClasses (#1499) + +M Documentation/SOGoInstallationGuide.asciidoc +M NEWS +M SoObjects/SOGo/LDAPSource.h +M SoObjects/SOGo/LDAPSource.m +M SoObjects/SOGo/SOGoGroup.m +M SoObjects/SOGo/SOGoSource.h + +commit d75fb0722a0ced5bb937e5b754e95cd0261df7a7 +Author: Ludovic Marcotte +Date: Tue Mar 24 08:34:29 2015 -0400 + + Code cleanups + +M UI/Scheduler/UIxAttendeesEditor.h +M UI/Scheduler/UIxAttendeesEditor.m +M UI/Scheduler/UIxComponentEditor.h +M UI/Scheduler/UIxComponentEditor.m + +commit 26d876e67a32e6c2dc36a3a92449aa0b6638ec41 +Author: Francis Lachapelle +Date: Mon Mar 23 16:28:32 2015 -0400 + + Improve event attendees editor + + - Avoid repetitive AJAX queries; + - Improve handling of daylight changes. + +M UI/WebServerResources/JavascriptAPIExtensions.js +M UI/WebServerResources/UIxAttendeesEditor.js + +commit cc3652b59b40bcb420d806412277509ac247d85d +Author: Ludovic Marcotte +Date: Mon Mar 23 17:23:29 2015 -0400 + + improvements to EAS SyncKey handling to avoid missing mails (#3048, #3058) + +M ActiveSync/SOGoActiveSyncDispatcher+Sync.m +M NEWS + +commit 9d7bbbc312cbe8ccb535e24308be111a3a2eb710 +Author: Ludovic Marcotte +Date: Mon Mar 23 14:55:14 2015 -0400 + + enable by default HTML mails support using EAS on Windows and BB phones + +M ActiveSync/SOGoActiveSyncDispatcher.m +M NEWS + +commit d2915add6d69a8fd05d15bb8c2ed979fe6ad9026 +Author: Ludovic Marcotte +Date: Mon Mar 23 14:08:31 2015 -0400 + + now favor login@domain as the default email address if multiple mail: fields are specified + +M NEWS +M SoObjects/SOGo/SOGoUser.h +M SoObjects/SOGo/SOGoUser.m + +commit 67139ce3e3f69160a683d8c11bee439be202a84e +Author: Ludovic Marcotte +Date: Mon Mar 23 11:35:45 2015 -0400 + + improved GetItemEstimate to count all vasnished/deleted mails too + +M ActiveSync/SOGoActiveSyncDispatcher.m +M NEWS + +commit 9eb138b867ebd0a51b9a649891422bac70406510 +Author: Ludovic Marcotte +Date: Mon Mar 23 10:54:36 2015 -0400 + + prevent potential freebusy lookup crashes during timezone changes with repetitive events + +M NEWS +M UI/MainUI/SOGoUserHomePage.m + +commit baf3d1f986d48d4fa37a076ccf555d75f4d5dbda +Author: Ludovic Marcotte +Date: Fri Mar 20 09:10:49 2015 -0400 + + immediately delete mails from EAS clients when they are marked as deleted on the IMAP server + +M NEWS +M SoObjects/Mailer/SOGoMailFolder.m + +commit ecd336fa5c6513ee8533dae05e5a328c81527a38 +Author: Ludovic Marcotte +Date: Fri Mar 20 08:51:35 2015 -0400 + + Fix compilation warning and error + +M ActiveSync/NGMimeMessage+ActiveSync.m +M ActiveSync/SOGoMailObject+ActiveSync.m + +commit afd73289d1ebb13c643f7a8290eac7da43b69330 +Author: Ludovic Marcotte +Date: Fri Mar 20 08:45:42 2015 -0400 + + properly fallback over EAS to UTF-8 and then Latin1 for messages w/o charset (#3103) + +M ActiveSync/SOGoMailObject+ActiveSync.m +M NEWS + +commit bff21ab1ff136ada7d93cc529a87da9dd254fa60 +Author: Ludovic Marcotte +Date: Thu Mar 19 16:08:33 2015 -0400 + + support for mail prority using EAS + +M ActiveSync/SOGoMailObject+ActiveSync.m +M NEWS + +commit 6d99226b1390d2dce1f7dfc6a3bab5143aad6364 +Author: Ludovic Marcotte +Date: Thu Mar 19 14:53:01 2015 -0400 + + Always add DisplayName no matter EAS client version + +M ActiveSync/SOGoMailObject+ActiveSync.m + +commit 69974807b5740f245376f8e19f71559997bcae44 +Author: Francis Lachapelle +Date: Thu Mar 19 08:32:37 2015 -0400 + + Fix Language-Region tags in Web interface + + Fixes #3121 + +M NEWS +M UI/MailerUI/UIxMailEditor.m +M UI/Scheduler/UIxCalMainView.m + +commit cdb766e2eff3b6e420da48b3f396814edff96b4f +Author: Ludovic Marcotte +Date: Wed Mar 18 10:15:33 2015 -0400 + + Documented NGMimeBuildMimeTempDirectory + +M Documentation/SOGoInstallationGuide.asciidoc + +commit e25a7e3d8d0a5f11a65a6fa337a637b3e1f44432 +Author: Ludovic Marcotte +Date: Wed Mar 18 09:36:35 2015 -0400 + + Fix for bug #3138 + +M ActiveSync/NGMimeMessage+ActiveSync.m +M ActiveSync/SOGoActiveSyncDispatcher.m +M NEWS + +commit 1d5ae27c996f63488653d3a8638b33320540741c +Author: Francis Lachapelle +Date: Tue Mar 17 15:31:35 2015 -0400 + + Fix issues with freebusy (Web, busyOffHours) + +M NEWS +M SoObjects/Appointments/SOGoFreeBusyObject.m +M UI/WebServerResources/UIxAttendeesEditor.js + +commit 1bdd5dfc9085e1f08f839b8179a7ccb37b038e5c +Author: Jens Erat +Date: Fri Mar 13 14:06:58 2015 +0100 + + Remove obsolete archive string from translations + +M UI/MailerUI/Arabic.lproj/Localizable.strings +M UI/MailerUI/Danish.lproj/Localizable.strings +M UI/MailerUI/Icelandic.lproj/Localizable.strings +M UI/MailerUI/Italian.lproj/Localizable.strings +M UI/MailerUI/NorwegianNynorsk.lproj/Localizable.strings +M UI/MailerUI/Swedish.lproj/Localizable.strings +M UI/MailerUI/Ukrainian.lproj/Localizable.strings +M UI/MailerUI/Welsh.lproj/Localizable.strings + +commit 37fbd75d552873575f11853e4478d6dce9640201 +Author: Jens Erat +Date: Fri Mar 13 11:41:07 2015 +0100 + + Rename "Archive" to "Export" in Webmail, ctd. + + Fixes #2758 also for non-Inbox folders + +M UI/Templates/MailerUI/UIxMailMainFrame.wox + +commit f1fda8bd0617d5e6b924bb1ae57fb7840bbcc13f +Author: Francis Lachapelle +Date: Tue Mar 10 13:27:17 2015 -0400 + + Return a single phone number in JSON contacts list + +M SoObjects/Contacts/SOGoContactSourceFolder.m + +commit 517f4b0f49e2545f930408b922dabc1a4a9006eb +Author: Francis Lachapelle +Date: Mon Mar 9 14:04:21 2015 -0400 + + Fix possible JS exception in Contacts module + +M NEWS + +commit cbba0719bb58229d9be8d3bb5af5fba23da3ae14 +Author: Francis Lachapelle +Date: Wed Mar 4 10:05:12 2015 -0500 + + Fix exception in SOGoUserManager + +M SoObjects/SOGo/SOGoUserManager.m + +commit 8e0849029ea93bfc9e1f9e2cb4ff2e0e5b6a4308 +Author: Francis Lachapelle +Date: Tue Mar 3 21:18:46 2015 -0500 + + Fix contacts lookup by UID + + When looking for a specific contact UID, we no longer match a pattern + that could return multiple results. We search for the exact UID only. + +M NEWS +M SoObjects/Appointments/SOGoFreeBusyObject.m +M SoObjects/SOGo/SOGoUserManager.h +M SoObjects/SOGo/SOGoUserManager.m + +commit 61923225136db72ceb89294d504b65a7f62e7a7f +Author: Francis Lachapelle +Date: Tue Mar 3 20:59:32 2015 -0500 + + Fix some gcc warnings + +M SoObjects/SOGo/SOGoCASSession.m +M SoObjects/SOGo/SOGoUser.m +M SoObjects/SOGo/SOGoUserManager.m + +commit df59b73a221467523c18c56493c13c86003d7271 +Author: Ludovic Marcotte +Date: Thu Feb 26 17:56:42 2015 -0500 + + use correct mail attachment elements for EAS 2.5 clients - patch from tfu + +M ActiveSync/SOGoMailObject+ActiveSync.m +M NEWS + +commit a5672fda5210e6149bd893683c7ee4338f0c3cf9 +Author: Ludovic Marcotte +Date: Thu Feb 26 17:55:36 2015 -0500 + + do not use syncKey from cache when davCollectionTag = -1 - patch from tfu + +M ActiveSync/SOGoActiveSyncDispatcher+Sync.m +M NEWS + +commit b593ddc6436e0d4aff2ef24e6ff9b3cda0c0c396 +Author: Ludovic Marcotte +Date: Thu Feb 26 17:53:58 2015 -0500 + + SmartReply improvements for missing body attributes - patch from tfu + +M ActiveSync/NSString+ActiveSync.h +M ActiveSync/NSString+ActiveSync.m +M ActiveSync/SOGoActiveSyncDispatcher.m +M NEWS + +commit 38d61f720f0c9352619fa2cb214e81734ed05868 +Author: Ludovic Marcotte +Date: Thu Feb 26 17:52:37 2015 -0500 + + use the correct body element for events for EAS 2.5 clients - patch from tfu + +M ActiveSync/iCalEvent+ActiveSync.m +M NEWS + +commit 733e334726824be7ab3a41ca7d4b885550a18f9a +Author: Ludovic Marcotte +Date: Thu Feb 26 17:51:02 2015 -0500 + + fixed tasks disappearing issue with RoadSync - patch from tfu + +M ActiveSync/iCalToDo+ActiveSync.m +M NEWS + +commit 22888ba5ac2cdc8d52d4c8eba9a94936376b7520 +Author: Ludovic Marcotte +Date: Thu Feb 26 17:49:26 2015 -0500 + + use the correct mail body element for EAS 2.5 clients - patch from tfu + +M ActiveSync/SOGoMailObject+ActiveSync.m +M NEWS + +commit 33c485d2f6d58443c0c67297b87d8cc3d67d1398 +Author: Ludovic Marcotte +Date: Thu Feb 26 17:48:06 2015 -0500 + + fixed empty sync responses for EAS 2.5 and 12.0 clients - patch from tfu + +M ActiveSync/SOGoActiveSyncDispatcher+Sync.m +M NEWS + +commit 9160e34134c1c24f5f51cd6c9081723f0963e7c5 +Author: Ludovic Marcotte +Date: Thu Feb 26 17:46:34 2015 -0500 + + multiple collections support for GetItemEstimate - patch from tfu + +M ActiveSync/SOGoActiveSyncDispatcher.m +M NEWS + +commit 5ceddc213ec08ccb5b44b07aae47921a19b36fd8 +Author: Ludovic Marcotte +Date: Thu Feb 26 16:00:03 2015 -0500 + + Fix for bug #3116 + +M ActiveSync/SOGoMailObject+ActiveSync.m +M NEWS + +commit b97002565e3d21b417f99b704641abee1052642c +Author: Ludovic Marcotte +Date: Wed Feb 25 08:42:18 2015 -0500 + + Updated NEWS file regarding previous commit + +M NEWS + +commit 8d21bc3e36014d63db0e37bf7121d81c8200b5e1 +Author: Jesús García Sáez +Date: Wed Feb 25 12:01:31 2015 +0100 + + Fix change password with DomainBasedUID + + When users use full domain to login (SOGoEnableDomainBasedUID) the + user attributes in the cache were not being properly updated because + in this case the key is `uid@domain` instead of just `uid`. + +M SoObjects/SOGo/SOGoUserManager.m + +commit b26ea30b1b794e983ea272b5de713b0205fda0d8 +Author: Ludovic Marcotte +Date: Thu Feb 12 11:06:57 2015 -0500 + + Update ChangeLog + +M ChangeLog + commit 72b210cd2ebccc8e9cdc13c23abb76b7f455b780 Author: Ludovic Marcotte Date: Thu Feb 12 10:29:46 2015 -0500 diff --git a/Documentation/docinfo.xml b/Documentation/docinfo.xml index 8340a32fa..de0e62990 100644 --- a/Documentation/docinfo.xml +++ b/Documentation/docinfo.xml @@ -1,7 +1,7 @@ -Version 2.2.16 - February 2015 -for version 2.2.16 -2015-02-12 +Version 2.2.17 - March 2015 +for version 2.2.17 +2015-03-24 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". diff --git a/Documentation/includes/global-attributes.asciidoc b/Documentation/includes/global-attributes.asciidoc index 6ca1caa2f..adfcd8484 100644 --- a/Documentation/includes/global-attributes.asciidoc +++ b/Documentation/includes/global-attributes.asciidoc @@ -13,6 +13,6 @@ // TODO have the build system take care of this -:release_version: 2.2.16 +:release_version: 2.2.17 // vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab: diff --git a/NEWS b/NEWS index cd6363480..3d6177b36 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,4 @@ -2.2.17 (2015-02-xx) +2.2.17 (2015-03-24) ------------------- Enhancements diff --git a/Version b/Version index 135790138..e9b904350 100644 --- a/Version +++ b/Version @@ -4,4 +4,4 @@ MAJOR_VERSION=2 MINOR_VERSION=2 -SUBMINOR_VERSION=16 +SUBMINOR_VERSION=17 From f11bcd3373f39967b870f8d8f3358759a6221b62 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 26 Mar 2015 13:54:17 -0400 Subject: [PATCH 59/60] Avoid using stringByReplacing... since old runtimes don't support it --- UI/MailerUI/UIxMailEditor.m | 12 +++++++++--- UI/Scheduler/UIxCalMainView.m | 13 +++++++++---- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/UI/MailerUI/UIxMailEditor.m b/UI/MailerUI/UIxMailEditor.m index 7931bee13..a9bf3a65c 100644 --- a/UI/MailerUI/UIxMailEditor.m +++ b/UI/MailerUI/UIxMailEditor.m @@ -1,6 +1,6 @@ /* Copyright (C) 2004-2005 SKYRIX Software AG - Copyright (C) 2008-2014 Inverse inc. + Copyright (C) 2008-2015 Inverse inc. This file is part of SOGo. @@ -231,8 +231,14 @@ static NSArray *infoKeys = nil; { // WARNING : NSLocaleCode is not defined in // Region subtag must be separated by a dash - NSString *s = [locale objectForKey: @"NSLocaleCode"]; - return [s stringByReplacingOccurrencesOfString: @"_" withString: @"-"]; + NSMutableString *s = [NSMutableString stringWithString: [locale objectForKey: @"NSLocaleCode"]]; + + [s replaceOccurrencesOfString: @"_" + withString: @"-" + options: 0 + range: NSMakeRange(0, [s length])]; + + return s; } - (void) setFrom: (NSString *) newFrom diff --git a/UI/Scheduler/UIxCalMainView.m b/UI/Scheduler/UIxCalMainView.m index 78d4723c6..e13a05738 100644 --- a/UI/Scheduler/UIxCalMainView.m +++ b/UI/Scheduler/UIxCalMainView.m @@ -1,7 +1,6 @@ /* UIxCalMainView.m - this file is part of SOGo * - * Copyright (C) 2006-2014 Inverse inc. - * + * Copyright (C) 2006-2015 Inverse inc. * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -83,8 +82,14 @@ { // WARNING : NSLocaleCode is not defined in // Region subtag must be separated by a dash - NSString *s = [locale objectForKey: @"NSLocaleCode"]; - return [s stringByReplacingOccurrencesOfString: @"_" withString: @"-"]; + NSMutableString *s = [NSMutableString stringWithString: [locale objectForKey: @"NSLocaleCode"]]; + + [s replaceOccurrencesOfString: @"_" + withString: @"-" + options: 0 + range: NSMakeRange(0, [s length])]; + + return s; } - (NSArray *) monthMenuItems From ddcae9f132619a15d85af629910c92cd1ac261ba Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 26 Mar 2015 13:57:58 -0400 Subject: [PATCH 60/60] Updates for the release --- ChangeLog | 21 +++++++++++++++++++ Documentation/docinfo.xml | 6 +++--- .../includes/global-attributes.asciidoc | 2 +- NEWS | 6 ++++++ Version | 2 +- 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 26aaadc7f..8c90ec341 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +commit f11bcd3373f39967b870f8d8f3358759a6221b62 +Author: Ludovic Marcotte +Date: Thu Mar 26 13:54:17 2015 -0400 + + Avoid using stringByReplacing... since old runtimes don't support it + +M UI/MailerUI/UIxMailEditor.m +M UI/Scheduler/UIxCalMainView.m + +commit b933f53fc2580bd5b9913f7afebcf6b2d9bedc53 +Author: Ludovic Marcotte +Date: Tue Mar 24 10:56:26 2015 -0400 + + Changes for the 2.2.17 release + +M ChangeLog +M Documentation/docinfo.xml +M Documentation/includes/global-attributes.asciidoc +M NEWS +M Version + commit 097d5c2333515092f03ace5e64fc6824682ba974 Author: Ludovic Marcotte Date: Tue Mar 24 08:40:13 2015 -0400 diff --git a/Documentation/docinfo.xml b/Documentation/docinfo.xml index de0e62990..5a83383db 100644 --- a/Documentation/docinfo.xml +++ b/Documentation/docinfo.xml @@ -1,7 +1,7 @@ -Version 2.2.17 - March 2015 -for version 2.2.17 -2015-03-24 +Version 2.2.17a - March 2015 +for version 2.2.17a +2015-03-26 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". diff --git a/Documentation/includes/global-attributes.asciidoc b/Documentation/includes/global-attributes.asciidoc index adfcd8484..815d94e72 100644 --- a/Documentation/includes/global-attributes.asciidoc +++ b/Documentation/includes/global-attributes.asciidoc @@ -13,6 +13,6 @@ // TODO have the build system take care of this -:release_version: 2.2.17 +:release_version: 2.2.17a // vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab: diff --git a/NEWS b/NEWS index 3d6177b36..df8209afb 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,9 @@ +2.2.17a (2014-03-15) +-------------------- + +Bug fixes + - avoid calling -stringByReplacingOccurrencesOfString:... for old GNUstep runtime + 2.2.17 (2015-03-24) ------------------- diff --git a/Version b/Version index e9b904350..e7b91ec62 100644 --- a/Version +++ b/Version @@ -4,4 +4,4 @@ MAJOR_VERSION=2 MINOR_VERSION=2 -SUBMINOR_VERSION=17 +SUBMINOR_VERSION=17a