From 3187bca0ef596d577df35128c9ccbd0067427d12 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 4 Sep 2019 13:45:53 -0400 Subject: [PATCH] (fix) now dynamically detect and use the IMAP separator (fixes #1490) --- Documentation/SOGoInstallationGuide.asciidoc | 6 ------ NEWS | 1 + SoObjects/Mailer/SOGoMailAccount.h | 1 + SoObjects/Mailer/SOGoMailAccount.m | 12 ++++++++++++ SoObjects/SOGo/SOGoDomainDefaults.h | 1 - SoObjects/SOGo/SOGoDomainDefaults.m | 5 ----- SoObjects/SOGo/SOGoSieveManager.m | 18 +++++++++++++----- 7 files changed, 27 insertions(+), 17 deletions(-) diff --git a/Documentation/SOGoInstallationGuide.asciidoc b/Documentation/SOGoInstallationGuide.asciidoc index f209764e5..5c37ede74 100644 --- a/Documentation/SOGoInstallationGuide.asciidoc +++ b/Documentation/SOGoInstallationGuide.asciidoc @@ -1960,12 +1960,6 @@ Defaults to `/tmp`. The default value is `YES`. -|S |NGImap4ConnectionStringSeparator -|Parameter used to set the IMAP mailbox separator. Setting this will -also have an impact on the mailbox separator used by Sieve filters. - -The default separator is `/`. - |S |NGImap4AuthMechanism |Trigger the use of the IMAP `AUTHENTICATE` command with the specified SASL mechanism. Please note that feature might be limited at this time. diff --git a/NEWS b/NEWS index 815c431f6..dbacab051 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,7 @@ Enhancements - [web] prohibit duplicate contact categories in Preferences module - [web] improve constrat of text in toolbar with input fields - [web] updated Angular Material to version 1.1.20 + - [core] now dynamically detect and use the IMAP separator (#1490) Bug fixes - [web] properly handle Windows-1256 charaset (#4781) diff --git a/SoObjects/Mailer/SOGoMailAccount.h b/SoObjects/Mailer/SOGoMailAccount.h index 2b6c871a3..d62ecc17f 100644 --- a/SoObjects/Mailer/SOGoMailAccount.h +++ b/SoObjects/Mailer/SOGoMailAccount.h @@ -75,6 +75,7 @@ typedef enum { /* capabilities */ - (BOOL) hasCapability: (NSString *) capability; +- (NSString *) imap4Separator; - (BOOL) supportsQuotas; - (BOOL) supportsQResync; diff --git a/SoObjects/Mailer/SOGoMailAccount.m b/SoObjects/Mailer/SOGoMailAccount.m index f1980e37c..50eaddfa2 100644 --- a/SoObjects/Mailer/SOGoMailAccount.m +++ b/SoObjects/Mailer/SOGoMailAccount.m @@ -257,6 +257,18 @@ static NSString *inboxFolderName = @"INBOX"; return [capabilities containsObject: capability]; } +- (NSString *) imap4Separator +{ + NGImap4Client *imapClient; + + imapClient = [[self imap4Connection] client]; + + if (![imapClient delimiter]) + [imapClient list: @"INBOX" pattern: @""]; + + return [imapClient delimiter]; +} + - (BOOL) supportsQuotas { return [self hasCapability: @"quota"]; diff --git a/SoObjects/SOGo/SOGoDomainDefaults.h b/SoObjects/SOGo/SOGoDomainDefaults.h index 3d7d61139..2379a2a0d 100644 --- a/SoObjects/SOGo/SOGoDomainDefaults.h +++ b/SoObjects/SOGo/SOGoDomainDefaults.h @@ -44,7 +44,6 @@ - (NSString *) imapCASServiceName; - (NSString *) imapAclStyle; - (NSString *) imapAclGroupIdPrefix; -- (NSString *) imapFolderSeparator; - (BOOL) imapAclConformsToIMAPExt; - (BOOL) forceExternalLoginWithEmail; - (BOOL) externalAvatarsEnabled; diff --git a/SoObjects/SOGo/SOGoDomainDefaults.m b/SoObjects/SOGo/SOGoDomainDefaults.m index 0051dfba3..dc31ff05e 100644 --- a/SoObjects/SOGo/SOGoDomainDefaults.m +++ b/SoObjects/SOGo/SOGoDomainDefaults.m @@ -137,11 +137,6 @@ return [self stringForKey: @"NGImap4ConnectionGroupIdPrefix"]; } -- (NSString *) imapFolderSeparator -{ - return [self stringForKey: @"NGImap4ConnectionStringSeparator"]; -} - #warning this should be determined from the capabilities /* http://www.tools.ietf.org/wg/imapext/draft-ietf-imapext-acl/ */ - (BOOL) imapAclConformsToIMAPExt diff --git a/SoObjects/SOGo/SOGoSieveManager.m b/SoObjects/SOGo/SOGoSieveManager.m index 70d705b43..d917a20fb 100644 --- a/SoObjects/SOGo/SOGoSieveManager.m +++ b/SoObjects/SOGo/SOGoSieveManager.m @@ -446,6 +446,7 @@ static NSString *sieveScriptName = @"sogo"; } - (NSString *) _extractSieveAction: (NSDictionary *) action + delimiter: (NSString *) delimiter { NSString *sieveAction, *method, *requirement, *argument, *flag, *mailbox; NSDictionary *mailLabels; @@ -488,7 +489,7 @@ static NSString *sieveScriptName = @"sogo"; dd = [user domainDefaults]; mailbox = [[argument componentsSeparatedByString: @"/"] - componentsJoinedByString: [dd imapFolderSeparator]]; + componentsJoinedByString: delimiter]; sieveAction = [NSString stringWithFormat: @"%@ %@", method, [mailbox asSieveQuotedString]]; } @@ -520,6 +521,7 @@ static NSString *sieveScriptName = @"sogo"; } - (NSArray *) _extractSieveActions: (NSArray *) actions + delimiter: (NSString *) delimiter { NSMutableArray *sieveActions; NSString *sieveAction; @@ -529,7 +531,8 @@ static NSString *sieveScriptName = @"sogo"; sieveActions = [NSMutableArray arrayWithCapacity: max]; for (count = 0; !scriptError && count < max; count++) { - sieveAction = [self _extractSieveAction: [actions objectAtIndex: count]]; + sieveAction = [self _extractSieveAction: [actions objectAtIndex: count] + delimiter: delimiter]; if (!scriptError) [sieveActions addObject: sieveAction]; } @@ -538,6 +541,7 @@ static NSString *sieveScriptName = @"sogo"; } - (NSString *) _convertScriptToSieve: (NSDictionary *) newScript + delimiter: (NSString *) delimiter { NSMutableString *sieveText; NSString *match; @@ -565,7 +569,8 @@ static NSString *sieveScriptName = @"sogo"; else scriptError = [NSString stringWithFormat: @"Bad test: %@", match]; } - sieveActions = [self _extractSieveActions: [newScript objectForKey: @"actions"]]; + sieveActions = [self _extractSieveActions: [newScript objectForKey: @"actions"] + delimiter: delimiter]; if ([sieveActions count]) [sieveText appendFormat: @" %@;\r\n", [sieveActions componentsJoinedByString: @";\r\n "]]; @@ -577,6 +582,7 @@ static NSString *sieveScriptName = @"sogo"; } - (NSString *) sieveScriptWithRequirements: (NSMutableArray *) newRequirements + delimiter: (NSString *) delimiter { NSMutableString *sieveScript; NSString *sieveText; @@ -599,7 +605,8 @@ static NSString *sieveScriptName = @"sogo"; currentScript = [scripts objectAtIndex: count]; if ([[currentScript objectForKey: @"active"] boolValue]) { - sieveText = [self _convertScriptToSieve: currentScript]; + sieveText = [self _convertScriptToSieve: currentScript + delimiter: delimiter]; [sieveScript appendString: sieveText]; } } @@ -815,7 +822,8 @@ static NSString *sieveScriptName = @"sogo"; script = [NSMutableString string]; // We first handle filters - filterScript = [self sieveScriptWithRequirements: req]; + filterScript = [self sieveScriptWithRequirements: req + delimiter: [theAccount imap4Separator]]; if (filterScript) { if ([filterScript length])