mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-04-28 08:19:28 +00:00
Merge to 2.2.15
This commit is contained in:
@@ -33,6 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import <NGExtensions/NGBase64Coding.h>
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
|
||||
#include <wbxml/wbxml.h>
|
||||
#include <wbxml/wbxml_conv.h>
|
||||
@@ -48,7 +49,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
path = [NSString stringWithFormat: @"/tmp/%@.data", [[NSProcessInfo processInfo] globallyUniqueString]];
|
||||
[self writeToFile: path atomically: YES];
|
||||
NSLog(@"Original data written to: %@", path);
|
||||
[self errorWithFormat: @"Original data written to: %@", path];
|
||||
}
|
||||
|
||||
//
|
||||
@@ -81,7 +82,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if (ret != WBXML_OK)
|
||||
{
|
||||
NSLog(@"wbxml2xmlFromContent: failed: %s\n", wbxml_errors_string(ret));
|
||||
[self errorWithFormat: @"wbxml2xmlFromContent: failed: %s\n", wbxml_errors_string(ret)];
|
||||
[self _dumpToFile];
|
||||
return nil;
|
||||
}
|
||||
@@ -114,7 +115,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if (ret != WBXML_OK)
|
||||
{
|
||||
NSLog(@"xml2wbxmlFromContent: failed: %s\n", wbxml_errors_string(ret));
|
||||
[self logWithFormat: @"xml2wbxmlFromContent: failed: %s\n", wbxml_errors_string(ret)];
|
||||
[self _dumpToFile];
|
||||
return nil;
|
||||
}
|
||||
@@ -129,7 +130,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if (ret != WBXML_OK)
|
||||
{
|
||||
NSLog(@"xml2wbxmlFromContent: failed: %s\n", wbxml_errors_string(ret));
|
||||
[self errorWithFormat: @"xml2wbxmlFromContent: failed: %s\n", wbxml_errors_string(ret)];
|
||||
[self _dumpToFile];
|
||||
free(wbxml);
|
||||
wbxml_conv_xml2wbxml_destroy(conv);
|
||||
|
||||
@@ -57,6 +57,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <NGCards/NGVCard.h>
|
||||
|
||||
#import <NGExtensions/NSCalendarDate+misc.h>
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
#import <NGExtensions/NSString+misc.h>
|
||||
|
||||
#import <NGImap4/NSString+Imap4.h>
|
||||
@@ -287,9 +288,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
case ActiveSyncMailFolder:
|
||||
default:
|
||||
{
|
||||
// FIXME
|
||||
//continue;
|
||||
NSLog(@"BLARG!");
|
||||
// FIXME - what to do?
|
||||
[self errorWithFormat: @"Fatal error occured - tried to call -processSyncAddCommand: ... on a mail folder. We abort."];
|
||||
abort();
|
||||
}
|
||||
}
|
||||
@@ -1065,13 +1065,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
changeDetected: (BOOL *) changeDetected
|
||||
maxSyncResponseSize: (int) theMaxSyncResponseSize
|
||||
{
|
||||
NSString *collectionId, *realCollectionId, *syncKey, *davCollectionTag, *bodyPreferenceType, *lastServerKey;
|
||||
NSString *collectionId, *realCollectionId, *syncKey, *davCollectionTag, *bodyPreferenceType, *lastServerKey, *syncKeyInCache;
|
||||
SOGoMicrosoftActiveSyncFolderType folderType;
|
||||
id collection, value;
|
||||
|
||||
NSMutableString *changeBuffer, *commandsBuffer;
|
||||
BOOL getChanges, first_sync;
|
||||
unsigned int windowSize, v, status;
|
||||
NSMutableDictionary *folderMetadata;
|
||||
|
||||
changeBuffer = [NSMutableString string];
|
||||
commandsBuffer = [NSMutableString string];
|
||||
@@ -1186,6 +1187,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[commandsBuffer appendFormat: @"<Responses>%@</Responses>", s];
|
||||
}
|
||||
|
||||
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]];
|
||||
|
||||
// If we got any changes or if we have applied any commands
|
||||
// let's regenerate our SyncKey based on the collection tag.
|
||||
if ([changeBuffer length] || [commandsBuffer length])
|
||||
@@ -1196,7 +1199,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
{
|
||||
// Use the SyncKey saved by processSyncGetChanges - if processSyncGetChanges is not called (because of getChanges=false)
|
||||
// SyncKey has the value of the previous sync operation.
|
||||
davCollectionTag = [[self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]] objectForKey: @"SyncKey"];
|
||||
davCollectionTag = [folderMetadata objectForKey: @"SyncKey"];
|
||||
|
||||
if (!davCollectionTag)
|
||||
davCollectionTag = [collection davCollectionTag];
|
||||
@@ -1206,8 +1209,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
}
|
||||
else
|
||||
{
|
||||
if (folderType == ActiveSyncMailFolder && [syncKey isEqualToString: @"-1"])
|
||||
davCollectionTag = [collection davCollectionTag];
|
||||
// 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]))
|
||||
{
|
||||
davCollectionTag = syncKeyInCache;
|
||||
*changeDetected = YES;
|
||||
}
|
||||
}
|
||||
|
||||
// Generate the response buffer
|
||||
@@ -1228,7 +1236,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// MoreAvailable breaks Windows Mobile devices if not between <Status> and <Commands>
|
||||
// https://social.msdn.microsoft.com/Forums/en-US/040b254e-f47e-4cc1-a397-6d8393cdb819/airsyncmoreavailable-breaks-windows-mobile-devices-what-am-i-doing-wrong?forum=os_exchangeprotocols
|
||||
if ([[self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]] objectForKey: @"MoreAvailable"])
|
||||
if ([folderMetadata objectForKey: @"MoreAvailable"])
|
||||
[theBuffer appendString: @"<MoreAvailable/>"];
|
||||
|
||||
[theBuffer appendString: commandsBuffer];
|
||||
@@ -1373,6 +1381,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
defaultInterval = [defaults maximumSyncInterval];
|
||||
internalInterval = [defaults internalSyncInterval];
|
||||
|
||||
// If the request doesn't contain "HeartbeatInterval" there is no reason to delay the response.
|
||||
if (heartbeatInterval == 0)
|
||||
heartbeatInterval = internalInterval = 1;
|
||||
|
||||
// We check to see if our heartbeat interval falls into the supported ranges.
|
||||
if (heartbeatInterval > defaultInterval || heartbeatInterval < 1)
|
||||
{
|
||||
@@ -1389,7 +1401,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
allCollections = (id)[theDocumentElement getElementsByTagName: @"Collection"];
|
||||
|
||||
// We enter our loop detection change
|
||||
for (i = 0; i < (defaultInterval/internalInterval); i++)
|
||||
for (i = 0; i < (heartbeatInterval/internalInterval); i++)
|
||||
{
|
||||
s = [NSMutableString string];
|
||||
|
||||
@@ -1405,13 +1417,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if (changeDetected)
|
||||
{
|
||||
NSLog(@"Change detected, we push the content.");
|
||||
[self logWithFormat: @"Change detected, we push the content."];
|
||||
break;
|
||||
}
|
||||
else if (heartbeatInterval > 1)
|
||||
{
|
||||
[self logWithFormat: @"Sleeping %d seconds while detecting changes...", internalInterval];
|
||||
sleep(internalInterval);
|
||||
}
|
||||
else
|
||||
{
|
||||
NSLog(@"Sleeping %d seconds while detecting changes...", internalInterval);
|
||||
sleep(internalInterval);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -59,6 +59,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#import <NGExtensions/NSCalendarDate+misc.h>
|
||||
#import <NGExtensions/NGCalendarDateRange.h>
|
||||
#import <NGExtensions/NGHashMap.h>
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
#import <NGExtensions/NSString+misc.h>
|
||||
|
||||
#import <NGImap4/NGImap4Client.h>
|
||||
@@ -1805,30 +1806,24 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// We build the list of folders to "ping". When the payload is empty, we use the list
|
||||
// of "cached" folders.
|
||||
allCollections = (id)[theDocumentElement getElementsByTagName: @"Folders"];
|
||||
allCollections = (id)[theDocumentElement getElementsByTagName: @"Folder"];
|
||||
allFoldersID = [NSMutableArray array];
|
||||
|
||||
if (![allCollections count])
|
||||
{
|
||||
SOGoMailAccounts *accountsFolder;
|
||||
SOGoMailAccount *accountFolder;
|
||||
SOGoUserFolder *userFolder;
|
||||
NSArray *allValues;
|
||||
// We received an empty Ping request. Return status '3' to ask client to resend the request with complete body.
|
||||
s = [NSMutableString string];
|
||||
[s appendString: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"];
|
||||
[s appendString: @"<!DOCTYPE ActiveSync PUBLIC \"-//MICROSOFT//DTD ActiveSync//EN\" \"http://www.microsoft.com/\">"];
|
||||
[s appendString: @"<Ping xmlns=\"Ping:\">"];
|
||||
[s appendString: @"<Status>3</Status>"];
|
||||
[s appendString: @"</Ping>"];
|
||||
|
||||
userFolder = [[context activeUser] homeFolderInContext: context];
|
||||
accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO];
|
||||
accountFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO];
|
||||
d = [[s dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml];
|
||||
|
||||
allValues = [[accountFolder imapFolderGUIDs] allValues];
|
||||
|
||||
for (i = 0; i < [allValues count]; i++)
|
||||
[allFoldersID addObject: [NSString stringWithFormat: @"mail/%@", [[allValues objectAtIndex: i] substringFromIndex: 6]]];
|
||||
[theResponse setContent: d];
|
||||
|
||||
|
||||
// FIXME: handle multiple GCS collecitons
|
||||
[allFoldersID addObject: @"vcard/personal"];
|
||||
[allFoldersID addObject: @"vevent/personal"];
|
||||
[allFoldersID addObject: @"vtodo/personal"];
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1872,13 +1867,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
if ([foldersWithChanges count])
|
||||
{
|
||||
NSLog(@"Change detected, we push the content.");
|
||||
[self logWithFormat: @"Change detected, we push the content."];
|
||||
status = 2;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
NSLog(@"Sleeping %d seconds while detecting changes...", internalInterval);
|
||||
[self logWithFormat: @"Sleeping %d seconds while detecting changes...", internalInterval];
|
||||
sleep(internalInterval);
|
||||
}
|
||||
}
|
||||
@@ -2617,7 +2612,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
[theResponse setHeader: @"14.1" forKey: @"MS-Server-ActiveSync"];
|
||||
[theResponse setHeader: @"Sync,SendMail,SmartForward,SmartReply,GetAttachment,GetHierarchy,CreateCollection,DeleteCollection,MoveCollection,FolderSync,FolderCreate,FolderDelete,FolderUpdate,MoveItems,GetItemEstimate,MeetingResponse,Search,Settings,Ping,ItemOperations,ResolveRecipients,ValidateCert" forKey: @"MS-ASProtocolCommands"];
|
||||
[theResponse setHeader: @"2.0,2.1,2.5,12.0,12.1,14.0,14.1" forKey: @"MS-ASProtocolVersions"];
|
||||
[theResponse setHeader: @"2.5,12.0,12.1,14.0,14.1" forKey: @"MS-ASProtocolVersions"];
|
||||
|
||||
RELEASE(context);
|
||||
RELEASE(pool);
|
||||
|
||||
@@ -61,7 +61,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[response setHeader: @"private" forKey: @"Cache-Control"];
|
||||
[response setHeader: @"OPTIONS, POST" forKey: @"Allow"];
|
||||
[response setHeader: @"14.1" forKey: @"MS-Server-ActiveSync"];
|
||||
[response setHeader: @"2.0,2.1,2.5,12.0,12.1,14.0,14.1" forKey: @"MS-ASProtocolVersions"];
|
||||
[response setHeader: @"2.5,12.0,12.1,14.0,14.1" forKey: @"MS-ASProtocolVersions"];
|
||||
[response setHeader: @"Sync,SendMail,SmartForward,SmartReply,GetAttachment,GetHierarchy,CreateCollection,DeleteCollection,MoveCollection,FolderSync,FolderCreate,FolderDelete,FolderUpdate,MoveItems,GetItemEstimate,MeetingResponse,Search,Settings,Ping,ItemOperations,ResolveRecipients,ValidateCert" forKey: @"MS-ASProtocolCommands"];
|
||||
[response setHeader: @"OPTIONS, POST" forKey: @"Public"];
|
||||
}
|
||||
|
||||
136
ChangeLog
136
ChangeLog
@@ -1,3 +1,139 @@
|
||||
commit d1d398091961f5d497b67313e098a8a5624089f4
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Fri Jan 30 11:03:38 2015 -0500
|
||||
|
||||
Update translations
|
||||
|
||||
M NEWS
|
||||
M UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings
|
||||
M UI/PreferencesUI/Hungarian.lproj/Localizable.strings
|
||||
|
||||
commit cf35eec1f5c56d8c7332bed34e2195a8ad9c9e9f
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Fri Jan 30 10:28:45 2015 -0500
|
||||
|
||||
Improved the NEWS file for the release
|
||||
|
||||
M NEWS
|
||||
|
||||
commit 58a0b0c173616db9a3a1592b437dba7e40475321
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Fri Jan 30 10:23:04 2015 -0500
|
||||
|
||||
Updated for the release
|
||||
|
||||
M NEWS
|
||||
|
||||
commit 723a9d4e080644a7a8cef60de9b7450621f0964e
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Thu Jan 29 16:21:06 2015 -0500
|
||||
|
||||
Reverted bug fix from #3054 and added comment
|
||||
|
||||
M SoObjects/SOGo/SOGoParentFolder.m
|
||||
|
||||
commit 4cc158043eb6183ecefed7abd93b579afbdfd7f6
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Wed Jan 28 16:38:27 2015 -0500
|
||||
|
||||
Improve CSS server-side cleaner
|
||||
|
||||
Fixes #3040
|
||||
|
||||
M UI/MailPartViewers/UIxMailPartHTMLViewer.m
|
||||
|
||||
commit 7fd1564a86d50cc96995bd3dec44939741312f4a
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Wed Jan 28 15:16:21 2015 -0500
|
||||
|
||||
fix for #3076
|
||||
|
||||
M ActiveSync/SOGoActiveSyncDispatcher.m
|
||||
M ActiveSync/SoObjectWebDAVDispatcher+ActiveSync.m
|
||||
M Documentation/SOGoInstallationGuide.asciidoc
|
||||
M NEWS
|
||||
|
||||
commit 981c718d228f70a23e73d8db913234be7161166c
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Wed Jan 28 15:03:49 2015 -0500
|
||||
|
||||
improved handling of EAS Push when no heartbeat is provided
|
||||
|
||||
M ActiveSync/SOGoActiveSyncDispatcher+Sync.m
|
||||
M ActiveSync/SOGoActiveSyncDispatcher.m
|
||||
M NEWS
|
||||
|
||||
commit 086361b79a8be7722d8ae476140858067bb06c2a
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Fri Jan 23 16:16:36 2015 -0500
|
||||
|
||||
Avoid GNUstep warnings
|
||||
|
||||
M SOPE/GDLContentStore/GCSFolderType.m
|
||||
M UI/MailerUI/UIxMailEditor.m
|
||||
|
||||
commit ab12c84887a663c0ec442cfa22b2c9fd1f737f24
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Fri Jan 23 15:32:22 2015 -0500
|
||||
|
||||
More NSLog usage cleanups
|
||||
|
||||
M SoObjects/Appointments/iCalCalendar+SOGo.m
|
||||
M SoObjects/Mailer/NSData+Mail.h
|
||||
M SoObjects/Mailer/NSData+Mail.m
|
||||
M SoObjects/SOGo/BSONCodec.m
|
||||
M SoObjects/SOGo/SOGoMailer.m
|
||||
M SoObjects/SOGo/SOGoSieveManager.m
|
||||
M SoObjects/SOGo/SOGoWebDAVAclManager.m
|
||||
|
||||
commit e2bee230217d16287883fb595d7bfc7ddec0ff77
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Thu Jan 22 16:25:16 2015 -0500
|
||||
|
||||
Avoid unnecessary calls to NSLog
|
||||
|
||||
M UI/Contacts/UIxListView.m
|
||||
M UI/MailPartViewers/UIxMailPartHTMLViewer.m
|
||||
M UI/MailerUI/UIxMailView.m
|
||||
M UI/Scheduler/UIxCalView.m
|
||||
M UI/Scheduler/UIxComponentEditor.m
|
||||
|
||||
commit 1a10599369da87e64b77cf110624ca6745605585
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Thu Jan 22 15:39:57 2015 -0500
|
||||
|
||||
Removed unnecessary NSLog calls
|
||||
|
||||
M SOPE/NGCards/CardGroup.m
|
||||
M SOPE/NGCards/IcalResponse.m
|
||||
M SOPE/NGCards/NSCalendarDate+ICal.m
|
||||
M SOPE/NGCards/NSString+NGCards.m
|
||||
M SOPE/NGCards/iCalObject.m
|
||||
|
||||
commit d907d5d268b470c7f461cb0b7951b894e4b77772
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Thu Jan 22 13:31:31 2015 -0500
|
||||
|
||||
Avoid using NSLog() where we can
|
||||
|
||||
M ActiveSync/NSData+ActiveSync.m
|
||||
M ActiveSync/SOGoActiveSyncDispatcher+Sync.m
|
||||
M ActiveSync/SOGoActiveSyncDispatcher.m
|
||||
M Main/SOGo.m
|
||||
M Main/sogod.m
|
||||
|
||||
commit d98ff69fbee723ae268b0cb0836c8dca75394743
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Tue Jan 20 08:35:10 2015 -0500
|
||||
|
||||
Version bumps for the release
|
||||
|
||||
M ChangeLog
|
||||
M Documentation/docinfo.xml
|
||||
M Documentation/includes/global-attributes.asciidoc
|
||||
M NEWS
|
||||
M Version
|
||||
|
||||
commit daa7ab87d7de8553c4df8790a10f18dead51e61f
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Mon Jan 19 13:54:04 2015 -0500
|
||||
|
||||
@@ -2417,9 +2417,6 @@ have unexpected behaviour with various ActiveSync clients.
|
||||
|
||||
Please be aware of the following limitations:
|
||||
|
||||
* When creating an Outlook 2013 profile, you must actually kill Outlook
|
||||
before the end of the creation process. See http://www.vionblog.com/connect-zimbra-community-with-outlook-2013
|
||||
for a procedure example.
|
||||
* Outlook 2013 does not search the GAL. One possible alternative
|
||||
solution is to configure Outlook to use a LDAP server (over SSL) with
|
||||
authentication. Outlook 2013 also does not seem to support multiple
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<!-- TODO have the build system take care of this -->
|
||||
<releaseinfo>Version 2.2.14 - January 2015</releaseinfo>
|
||||
<subtitle>for version 2.2.14</subtitle>
|
||||
<date>2015-01-20</date>
|
||||
<releaseinfo>Version 2.2.15 - January 2015</releaseinfo>
|
||||
<subtitle>for version 2.2.15</subtitle>
|
||||
<date>2015-01-30</date>
|
||||
|
||||
<legalnotice>
|
||||
<para>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".</para>
|
||||
|
||||
@@ -13,6 +13,6 @@
|
||||
|
||||
// TODO have the build system take care of this
|
||||
|
||||
:release_version: 2.2.14
|
||||
:release_version: 2.2.15
|
||||
|
||||
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
|
||||
|
||||
@@ -245,7 +245,7 @@ static BOOL debugLeaks;
|
||||
}
|
||||
else
|
||||
{
|
||||
NSLog (@"No value specified for '%@'", *urlString);
|
||||
[self errorWithFormat: @"No value specified for '%@'", *urlString];
|
||||
ok = NO;
|
||||
}
|
||||
}
|
||||
@@ -441,7 +441,7 @@ static BOOL debugLeaks;
|
||||
if (debugLeaks)
|
||||
{
|
||||
if (debugOn)
|
||||
NSLog (@"allocated classes:\n%s", GSDebugAllocationList (YES));
|
||||
[self logWithFormat: @"allocated classes:\n%s", GSDebugAllocationList (YES)];
|
||||
else
|
||||
{
|
||||
debugOn = YES;
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
/*
|
||||
Copyright (C) 2004-2005 SKYRIX Software AG
|
||||
Copyright (C) 2006-2009 Inverse inc.
|
||||
Copyright (C) 2006-2015 Inverse inc.
|
||||
|
||||
This file is part of OpenGroupware.org.
|
||||
This file is part of SOGo.
|
||||
|
||||
OGo is free software; you can redistribute it and/or modify it under
|
||||
SOGo is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU Lesser General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
OGo is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
SOGo is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
License for more details.
|
||||
|
||||
10
NEWS
10
NEWS
@@ -1,3 +1,13 @@
|
||||
2.2.15 (2015-01-30)
|
||||
-------------------
|
||||
|
||||
Enhancements
|
||||
- improved handling of EAS Push when no heartbeat is provided
|
||||
- no longer need to kill Outlook 2013 when creating EAS profiles (#3076)
|
||||
- improved server-side CSS cleaner (#3040)
|
||||
- unified the logging messages in sogo.log file (#2534/#3063)
|
||||
- updated Brazilian (Portuguese) and Hungarian translations
|
||||
|
||||
2.2.14 (2015-01-20)
|
||||
-------------------
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
*/
|
||||
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSKeyValueCoding.h>
|
||||
#import <Foundation/NSSet.h>
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
@@ -147,7 +148,7 @@
|
||||
if ([keys count] == 0)
|
||||
return folderQualifier;
|
||||
|
||||
bindings = [_folder valuesForKeys:keys];
|
||||
bindings = [_folder dictionaryWithValuesForKeys:keys];
|
||||
return [folderQualifier qualifierWithBindings:bindings
|
||||
requiresAllVariables:NO];
|
||||
}
|
||||
|
||||
@@ -59,8 +59,10 @@ static NGCardsSaxHandler *sax = nil;
|
||||
[parser setErrorHandler:sax];
|
||||
}
|
||||
else
|
||||
NSLog(@"ERROR(%s): did not find a parser for text/x-vcard!",
|
||||
__PRETTY_FUNCTION__);
|
||||
{
|
||||
//NSLog(@"ERROR(%s): did not find a parser for text/x-vcard!",
|
||||
// __PRETTY_FUNCTION__);
|
||||
}
|
||||
}
|
||||
|
||||
return parser;
|
||||
@@ -170,8 +172,8 @@ static NGCardsSaxHandler *sax = nil;
|
||||
{
|
||||
if (![aChild isKindOfClass: mappedClass])
|
||||
{
|
||||
NSLog (@"warning: new child to entity '%@': '%@' converted to '%@'",
|
||||
tag, childTag, NSStringFromClass(mappedClass));
|
||||
//NSLog (@"warning: new child to entity '%@': '%@' converted to '%@'",
|
||||
// tag, childTag, NSStringFromClass(mappedClass));
|
||||
newChild = [aChild elementWithClass: mappedClass];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
|
||||
- (BOOL)appendLine:(NSString *)_line {
|
||||
if (self->isFinished) {
|
||||
NSLog(@"WARNING[%s]: already finished!", __PRETTY_FUNCTION__);
|
||||
//NSLog(@"WARNING[%s]: already finished!", __PRETTY_FUNCTION__);
|
||||
return NO;
|
||||
}
|
||||
// limit length to 75 chars
|
||||
|
||||
@@ -77,8 +77,8 @@ static NSString *gmtcalfmt = @"%Y%m%dT%H%M%SZ";
|
||||
return [self icalStringInGMT];
|
||||
else {
|
||||
/* not in GMT */
|
||||
NSLog(@"WARNING(%s): arbitary timezones not supported yet: %@",
|
||||
__PRETTY_FUNCTION__, _tz);
|
||||
//NSLog(@"WARNING(%s): arbitary timezones not supported yet: %@",
|
||||
// __PRETTY_FUNCTION__, _tz);
|
||||
return [self icalStringInGMT];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -276,7 +276,9 @@
|
||||
}
|
||||
}
|
||||
else
|
||||
NSLog(@"Cannot parse iCal duration value: '%@'", self);
|
||||
{
|
||||
//NSLog(@"Cannot parse iCal duration value: '%@'", self);
|
||||
}
|
||||
|
||||
if (isNegative)
|
||||
ti = -ti;
|
||||
|
||||
@@ -59,8 +59,8 @@ static NSTimeZone *defTZ = nil;
|
||||
[self takeValue:_value forXKey:_key];
|
||||
}
|
||||
else {
|
||||
NSLog(@"0x%08x[%@]: ignoring attempt to set unbound key '%@'",
|
||||
self, NSStringFromClass([self class]), _key);
|
||||
//NSLog(@"0x%08x[%@]: ignoring attempt to set unbound key '%@'",
|
||||
// self, NSStringFromClass([self class]), _key);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -93,7 +93,7 @@
|
||||
element = [elements objectAtIndex: 0];
|
||||
else
|
||||
{
|
||||
NSLog(@"ERROR: given calendar contains no elements: %@", self);
|
||||
//NSLog(@"ERROR: given calendar contains no elements: %@", self);
|
||||
element = nil;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
/* NSData+Mail.h - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2007 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
* 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
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
/* NSData+Mail.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2007-2008 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
* Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
* 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
|
||||
@@ -52,7 +49,7 @@
|
||||
else
|
||||
{
|
||||
decodedData = nil;
|
||||
NSLog (@"encoding '%@' unknown, returning nil data", realEncoding);
|
||||
//NSLog (@"encoding '%@' unknown, returning nil data", realEncoding);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
#import <string.h>
|
||||
#import <objc/objc.h>
|
||||
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
|
||||
static NSMutableDictionary *timezoneCache = nil;
|
||||
|
||||
#define BSONTYPE(tag,className) [className class], [NSNumber numberWithChar: (tag)]
|
||||
@@ -604,7 +606,7 @@ static NSDictionary *BSONTypes()
|
||||
if (tz)
|
||||
[timezoneCache setObject: tz forKey: key];
|
||||
else
|
||||
NSLog(@"ERROR: timezone (%@) not found when deserializing BSON data", key);
|
||||
[self errorWithFormat: @"BSON error: timezone (%@) not found when deserializing BSON data", key];
|
||||
}
|
||||
|
||||
return [NSCalendarDate dateWithYear: year
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* SOGoMailer.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2007-2014 Inverse inc.
|
||||
* 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
|
||||
@@ -213,7 +213,7 @@
|
||||
}
|
||||
NS_HANDLER
|
||||
{
|
||||
NSLog(@"Could not connect to the SMTP server %@ on port %d", host, port);
|
||||
[self errorWithFormat: @"Could not connect to the SMTP server %@ on port %d", host, port];
|
||||
result = [NSException exceptionWithHTTPStatus: 500
|
||||
reason: @"cannot send message:"
|
||||
@" (smtp) error when connecting"];
|
||||
|
||||
@@ -297,8 +297,14 @@ static SoSecurityManager *sm = nil;
|
||||
// This is important because user A could delete folder X, and user B has subscribed to it.
|
||||
// If the "default roles" are enabled for calendars/address books, -validatePersmission:.. will
|
||||
// work (grabbing the default role) and the deleted resource will be incorrectly returned.
|
||||
//
|
||||
// FIXME - 2015/01/29 - this fix (24c6c8c91d421594bd51f07904d4cd3911cd187c) was reverted. Normally, we should add
|
||||
// [subscribedFolder ocsFolderForPath: [subscribedFolder ocsPath]] to check the existence of the folder but it causes
|
||||
// massive SQL traffic.
|
||||
//
|
||||
// The proper fix would be to check upon login and only upon login if GCS folders that we're subscribed to are still existent.
|
||||
//
|
||||
if (subscribedFolder
|
||||
&& [subscribedFolder ocsFolderForPath: [subscribedFolder ocsPath]]
|
||||
&& ![sm validatePermission: SOGoPerm_AccessObject
|
||||
onObject: subscribedFolder
|
||||
inContext: context])
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* SOGoSieveManager.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2010-2014 Inverse inc.
|
||||
* Copyright (C) 2010-2015 Inverse inc.
|
||||
*
|
||||
* Author: Inverse <info@inverse.ca>
|
||||
*
|
||||
@@ -31,6 +31,7 @@
|
||||
#import <SOGo/SOGoDomainDefaults.h>
|
||||
#import <SOGo/SOGoUser.h>
|
||||
|
||||
#import <NGExtensions/NSObject+Logs.h>
|
||||
#import <NGStreams/NGInternetSocketAddress.h>
|
||||
#import <NGImap4/NGSieveClient.h>
|
||||
|
||||
@@ -717,7 +718,7 @@ static NSString *sieveScriptName = @"sogo";
|
||||
client = [[NGSieveClient alloc] initWithURL: url];
|
||||
|
||||
if (!client) {
|
||||
NSLog(@"Sieve connection failed on %@", [url description]);
|
||||
[self errorWithFormat: @"Sieve connection failed on %@", [url description]];
|
||||
return nil;
|
||||
}
|
||||
|
||||
@@ -738,19 +739,19 @@ static NSString *sieveScriptName = @"sogo";
|
||||
|
||||
if (!connected)
|
||||
{
|
||||
NSLog(@"Sieve connection failed on %@", [url description]);
|
||||
[self errorWithFormat: @"Sieve connection failed on %@", [url description]];
|
||||
return nil;
|
||||
}
|
||||
|
||||
if (![[result valueForKey:@"result"] boolValue] && !theUsername && !thePassword) {
|
||||
NSLog(@"failure. Attempting with a renewed password (no authname supported)");
|
||||
[self logWithFormat: @"failure. Attempting with a renewed password (no authname supported)"];
|
||||
password = [theAccount imap4PasswordRenewed: YES];
|
||||
result = [client login: login password: password];
|
||||
}
|
||||
|
||||
if (![[result valueForKey:@"result"] boolValue]) {
|
||||
NSLog(@"Could not login '%@' on Sieve server: %@: %@",
|
||||
login, client, result);
|
||||
[self logWithFormat: @"Could not login '%@' on Sieve server: %@: %@",
|
||||
login, client, result];
|
||||
[client closeConnection];
|
||||
return nil;
|
||||
}
|
||||
@@ -823,7 +824,7 @@ static NSString *sieveScriptName = @"sogo";
|
||||
}
|
||||
else
|
||||
{
|
||||
NSLog(@"Sieve generation failure: %@", [self lastScriptError]);
|
||||
[self errorWithFormat: @"Sieve generation failure: %@", [self lastScriptError]];
|
||||
[client closeConnection];
|
||||
return NO;
|
||||
}
|
||||
@@ -913,7 +914,7 @@ static NSString *sieveScriptName = @"sogo";
|
||||
result = [client deleteScript: sieveScriptName];
|
||||
|
||||
if (![[result valueForKey:@"result"] boolValue]) {
|
||||
NSLog(@"WARNING: Could not delete Sieve script - continuing...: %@", result);
|
||||
[self logWithFormat: @"WARNING: Could not delete Sieve script - continuing...: %@", result];
|
||||
}
|
||||
|
||||
// We put and activate the script only if we actually have a script
|
||||
@@ -923,14 +924,14 @@ static NSString *sieveScriptName = @"sogo";
|
||||
result = [client putScript: sieveScriptName script: script];
|
||||
|
||||
if (![[result valueForKey:@"result"] boolValue]) {
|
||||
NSLog(@"Could not upload Sieve script: %@", result);
|
||||
[self logWithFormat: @"Could not upload Sieve script: %@", result];
|
||||
[client closeConnection];
|
||||
return NO;
|
||||
}
|
||||
|
||||
result = [client setActiveScript: sieveScriptName];
|
||||
if (![[result valueForKey:@"result"] boolValue]) {
|
||||
NSLog(@"Could not enable Sieve script: %@", result);
|
||||
[self logWithFormat: @"Could not enable Sieve script: %@", result];
|
||||
[client closeConnection];
|
||||
return NO;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
/* SOGoWebDAVAclManager.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2008 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
* Copyright (C) 2008-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
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
acquire: NO];
|
||||
if ([test isKindOfClass: [NSException class]])
|
||||
{
|
||||
NSLog (@"%@ not found", [card reference]);
|
||||
//NSLog (@"%@ not found", [card reference]);
|
||||
cardCopy = [card copy];
|
||||
[invalid addObject: cardCopy];
|
||||
[cardCopy release];
|
||||
|
||||
@@ -272,7 +272,7 @@ static NSData* _sanitizeContent(NSData *theData)
|
||||
if ([tag caseInsensitiveCompare: found_tag] == NSOrderedSame)
|
||||
{
|
||||
// Remove the leading slash
|
||||
NSLog(@"Found void tag with invalid leading slash: </%@>", found_tag);
|
||||
//NSLog(@"Found void tag with invalid leading slash: </%@>", found_tag);
|
||||
i--;
|
||||
[d replaceBytesInRange: NSMakeRange(i, 1)
|
||||
withBytes: NULL
|
||||
@@ -455,6 +455,10 @@ static NSData* _sanitizeContent(NSData *theData)
|
||||
{
|
||||
if (*currentChar == '{')
|
||||
inCSSDeclaration = YES;
|
||||
if (*currentChar == '}')
|
||||
// CSS syntax error: ending declaration character while not in a CSS declaration.
|
||||
// Ignore eveything from last CSS declaration.
|
||||
start = currentChar + 1;
|
||||
else if (*currentChar == ',')
|
||||
hasEmbeddedCSS = NO;
|
||||
else if (!hasEmbeddedCSS)
|
||||
|
||||
@@ -436,7 +436,7 @@ static NSArray *infoKeys = nil;
|
||||
- (NSDictionary *) storeInfo
|
||||
{
|
||||
[self debugWithFormat:@"storing info ..."];
|
||||
return [self valuesForKeys: infoKeys];
|
||||
return [self dictionaryWithValuesForKeys: infoKeys];
|
||||
}
|
||||
|
||||
/* contacts search */
|
||||
|
||||
@@ -77,7 +77,7 @@ static NSString *mailETag = nil;
|
||||
SOGO_MAJOR_VERSION,
|
||||
SOGO_MINOR_VERSION,
|
||||
SOGO_SUBMINOR_VERSION];
|
||||
NSLog (@"Note: using constant etag for mail viewer: '%@'", mailETag);
|
||||
//NSLog (@"Note: using constant etag for mail viewer: '%@'", mailETag);
|
||||
}
|
||||
|
||||
- (void) dealloc
|
||||
|
||||
@@ -153,6 +153,9 @@
|
||||
"displayremoteinlineimages_never" = "Nunca";
|
||||
"displayremoteinlineimages_always" = "Sempre";
|
||||
|
||||
"Auto save every" = "Auto salvar cada";
|
||||
"minutes" = "minutos";
|
||||
|
||||
/* Contact */
|
||||
"Personal Address Book" = "Catálogo Pessoal";
|
||||
"Collected Address Book" = "Catálogo Coletado";
|
||||
|
||||
@@ -153,6 +153,9 @@
|
||||
"displayremoteinlineimages_never" = "Soha";
|
||||
"displayremoteinlineimages_always" = "Mindig";
|
||||
|
||||
"Auto save every" = "Automatikus mentés gyakorisága";
|
||||
"minutes" = "perc";
|
||||
|
||||
/* Contact */
|
||||
"Personal Address Book" = "Személyes címjegyzék";
|
||||
"Collected Address Book" = "Összegyűjtöt címek jegyzéke";
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
/* UIxCalView.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2006-2009 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
* 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
|
||||
@@ -584,7 +582,7 @@
|
||||
[uri appendString: @"Groups/_custom_"];
|
||||
[uri appendString: uidsString];
|
||||
[uri appendString: @"/"];
|
||||
NSLog (@"Group URI = '%@'", uri);
|
||||
//NSLog (@"Group URI = '%@'", uri);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* UIxComponentEditor.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
|
||||
@@ -594,7 +594,7 @@ iRANGE(2);
|
||||
ASSIGN (reminderUnit, @"MINUTES");
|
||||
break;
|
||||
default:
|
||||
NSLog(@"Cannot process duration unit: '%c'", c);
|
||||
//NSLog(@"Cannot process duration unit: '%c'", c);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1887,7 +1887,9 @@ RANGE(2);
|
||||
[component setAttendees: newAttendees];
|
||||
}
|
||||
else
|
||||
NSLog(@"Error scanning following JSON:\n%@", json);
|
||||
{
|
||||
//NSLog(@"Error scanning following JSON:\n%@", json);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user