From 491d7aaffcc2fc2b8acb468e6387501c2af376e4 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 30 Mar 2015 09:42:32 -0400 Subject: [PATCH 001/109] improved multipart handling using EAS --- ActiveSync/NSString+ActiveSync.h | 3 ++- ActiveSync/NSString+ActiveSync.m | 12 ++++++++++++ ActiveSync/SOGoActiveSyncDispatcher.m | 3 ++- NEWS | 11 ++++++++++- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/ActiveSync/NSString+ActiveSync.h b/ActiveSync/NSString+ActiveSync.h index 4aad558a2..963b3d00a 100644 --- a/ActiveSync/NSString+ActiveSync.h +++ b/ActiveSync/NSString+ActiveSync.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2014, Inverse inc. +Copyright (c) 2014-2015, Inverse inc. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -51,6 +51,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (NSString *) command; - (NSString *) collectionid; - (NSString *) itemid; +- (BOOL) acceptsMultiPart; - (NSData *) convertHexStringToBytes; @end diff --git a/ActiveSync/NSString+ActiveSync.m b/ActiveSync/NSString+ActiveSync.m index 6aa054d10..a66f38252 100644 --- a/ActiveSync/NSString+ActiveSync.m +++ b/ActiveSync/NSString+ActiveSync.m @@ -322,6 +322,18 @@ static NSArray *easCommandParameters = nil; return s; } +- (BOOL) acceptsMultiPart +{ + NSString *s; + + s = [self _valueForParameter: @"OPTIONS="]; + + if (s && [s rangeOfString: @"AcceptMultiPart" options: NSCaseInsensitiveSearch].location != NSNotFound) + return YES; + + return NO; +} + // // FIXME: combine with our OpenChange code. diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index fc73a7b5e..622bdddf0 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -2630,7 +2630,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. aSelector = NSSelectorFromString(cmdName); // The -processItemOperations: method will generate a multipart response when Content-Type is application/vnd.ms-sync.multipart - if ([[theRequest headerForKey: @"MS-ASAcceptMultiPart"] isEqualToString:@"T"]) + if (([cmdName rangeOfString: @"ItemOperations" options: NSCaseInsensitiveSearch].location != NSNotFound) && + ([[theRequest headerForKey: @"MS-ASAcceptMultiPart"] isEqualToString:@"T"] || [[theRequest uri] acceptsMultiPart])) [theResponse setHeader: @"application/vnd.ms-sync.multipart" forKey: @"Content-Type"]; else [theResponse setHeader: @"application/vnd.ms-sync.wbxml" forKey: @"Content-Type"]; diff --git a/NEWS b/NEWS index df8209afb..38ab54e89 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,13 @@ -2.2.17a (2014-03-15) +2.2.18 (2015-04-XX) +------------------- + +Enhancements + - improved multipart handling using EAS + +Bug fixes + - + +2.2.17a (2015-03-15) -------------------- Bug fixes From f5607b3e857270f2efdf7c28a629d93b54029d86 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 30 Mar 2015 09:49:44 -0400 Subject: [PATCH 002/109] now keep the BodyPreference for future EAS use and default to MIME if none set (#3146) --- ActiveSync/SOGoActiveSyncDispatcher+Sync.m | 46 +++++++++++++++++++--- ActiveSync/SOGoActiveSyncDispatcher.m | 3 ++ NEWS | 2 +- 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m index cdd4cd9d1..9c306061a 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m +++ b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m @@ -131,6 +131,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [[o properties] removeObjectForKey: @"SyncCache"]; [[o properties] removeObjectForKey: @"DateCache"]; [[o properties] removeObjectForKey: @"MoreAvailable"]; + [[o properties] removeObjectForKey: @"BodyPreferenceType"]; [[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"]; [[o properties] addEntriesFromDictionary: values]; @@ -1068,14 +1069,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. changeDetected: (BOOL *) changeDetected maxSyncResponseSize: (int) theMaxSyncResponseSize { - NSString *collectionId, *realCollectionId, *syncKey, *davCollectionTag, *bodyPreferenceType, *lastServerKey, *syncKeyInCache; + NSString *collectionId, *realCollectionId, *syncKey, *davCollectionTag, *bodyPreferenceType, *mimeSupport, *lastServerKey, *syncKeyInCache; SOGoMicrosoftActiveSyncFolderType folderType; id collection, value; NSMutableString *changeBuffer, *commandsBuffer; BOOL getChanges, first_sync; unsigned int windowSize, v, status; - NSMutableDictionary *folderMetadata; + NSMutableDictionary *folderMetadata, *folderOptions; changeBuffer = [NSMutableString string]; commandsBuffer = [NSMutableString string]; @@ -1124,20 +1125,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. first_sync = NO; + folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]]; + if ([syncKey isEqualToString: @"0"]) { davCollectionTag = @"-1"; first_sync = YES; *changeDetected = YES; } - else if ((![syncKey isEqualToString: @"-1"]) && !([[self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]] objectForKey: @"SyncCache"])) + else if ((![syncKey isEqualToString: @"-1"]) && !([folderMetadata objectForKey: @"SyncCache"])) { //NSLog(@"Reset folder: %@", [collection nameInContainer]); davCollectionTag = @"0"; first_sync = YES; *changeDetected = YES; - if (!([[self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]] objectForKey: @"displayName"])) + if (!([folderMetadata objectForKey: @"displayName"])) status = 12; // need folderSync else status = 3; // do a complete resync @@ -1147,7 +1150,40 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. bodyPreferenceType = [[(id)[[(id)[theDocumentElement getElementsByTagName: @"BodyPreference"] lastObject] getElementsByTagName: @"Type"] lastObject] textValue]; if (!bodyPreferenceType) - bodyPreferenceType = @"1"; + { + bodyPreferenceType = [[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"BodyPreferenceType"]; + + // By default, send MIME mails. See #3146 for details. + if (!bodyPreferenceType) + bodyPreferenceType = @"4"; + } + else + { + mimeSupport = [[(id)[theDocumentElement getElementsByTagName: @"MIMESupport"] lastObject] textValue]; + + if (!mimeSupport) + mimeSupport = [[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"MIMESupport"]; + + if (!mimeSupport) + mimeSupport = @"0"; + + if ([mimeSupport isEqualToString: @"1"] && [bodyPreferenceType isEqualToString: @"4"]) + bodyPreferenceType = @"2"; + else if ([mimeSupport isEqualToString: @"2"] && [bodyPreferenceType isEqualToString: @"4"]) + bodyPreferenceType = @"4"; + else if ([mimeSupport isEqualToString: @"0"] && [bodyPreferenceType isEqualToString: @"4"]) + bodyPreferenceType = @"2"; + + + // Avoid writing to cache if there is nothing to change. + if (![[[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"BodyPreferenceType"] isEqualToString: bodyPreferenceType] || + ![[[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"MIMESupport"] isEqualToString: mimeSupport]) + { + folderOptions = [[NSDictionary alloc] initWithObjectsAndKeys: mimeSupport, @"MIMESupport", bodyPreferenceType, @"BodyPreferenceType", nil]; + [folderMetadata setObject: folderOptions forKey: @"FolderOptions"]; + [self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: collection withType: folderType]]; + } + } [context setObject: bodyPreferenceType forKey: @"BodyPreferenceType"]; diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index 622bdddf0..c684c3ec8 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -917,6 +917,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [[o properties] removeObjectForKey: @"SyncCache"]; [[o properties] removeObjectForKey: @"DateCache"]; [[o properties] removeObjectForKey: @"MoreAvailable"]; + [[o properties] removeObjectForKey: @"BodyPreferenceType"]; [[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"]; [o save]; @@ -1001,6 +1002,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [[o properties] removeObjectForKey: @"SyncCache"]; [[o properties] removeObjectForKey: @"DateCache"]; [[o properties] removeObjectForKey: @"MoreAvailable"]; + [[o properties] removeObjectForKey: @"BodyPreferenceType"]; [[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"]; } @@ -1023,6 +1025,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [[o properties] removeObjectForKey: @"SyncCache"]; [[o properties] removeObjectForKey: @"DateCache"]; [[o properties] removeObjectForKey: @"MoreAvailable"]; + [[o properties] removeObjectForKey: @"BodyPreferenceType"]; [[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"]; } diff --git a/NEWS b/NEWS index 38ab54e89..7280a512b 100644 --- a/NEWS +++ b/NEWS @@ -5,7 +5,7 @@ Enhancements - improved multipart handling using EAS Bug fixes - - + - now keep the BodyPreference for future EAS use and default to MIME if none set (#3146) 2.2.17a (2015-03-15) -------------------- From c428ac255337739856833fe96d56fb82ab8df977 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 30 Mar 2015 09:57:27 -0400 Subject: [PATCH 003/109] EAS reply fix when message/rfc822 parts are included in the original mail (#3153) --- ActiveSync/SOGoMailObject+ActiveSync.m | 4 ++++ NEWS | 1 + 2 files changed, 5 insertions(+) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index 45c865c84..d8aa6e0f9 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -224,6 +224,10 @@ struct GlobalObjectId { while ((key = [e nextObject])) { + // don't use body parts from a nested body - e.g. body of type message/rfc822 + if (![key hasPrefix: @"1"]) + continue; + part = [self lookupInfoForBodyPart: key]; type = [part valueForKey: @"type"]; subtype = [part valueForKey: @"subtype"]; diff --git a/NEWS b/NEWS index 7280a512b..2b2149d13 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,7 @@ Enhancements Bug fixes - now keep the BodyPreference for future EAS use and default to MIME if none set (#3146) + - EAS reply fix when message/rfc822 parts are included in the original mail (#3153) 2.2.17a (2015-03-15) -------------------- From db9536adcc5f57fa1596c8ed6efbcdf0b349d664 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 31 Mar 2015 09:25:57 -0400 Subject: [PATCH 004/109] (fix) fix yet an other potential crash during freebusy lookups during timezone changes --- NEWS | 1 + UI/MainUI/SOGoUserHomePage.m | 24 +++++++++++++----------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/NEWS b/NEWS index 2b2149d13..708fc7f59 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,7 @@ Enhancements Bug fixes - now keep the BodyPreference for future EAS use and default to MIME if none set (#3146) - EAS reply fix when message/rfc822 parts are included in the original mail (#3153) + - fix yet an other potential crash during freebusy lookups during timezone changes 2.2.17a (2015-03-15) -------------------- diff --git a/UI/MainUI/SOGoUserHomePage.m b/UI/MainUI/SOGoUserHomePage.m index c6223e656..42f373f8d 100644 --- a/UI/MainUI/SOGoUserHomePage.m +++ b/UI/MainUI/SOGoUserHomePage.m @@ -52,7 +52,9 @@ #import -#define intervalSeconds 900 /* 15 minutes */ +#define INTERVALSECONDS 900 /* 15 minutes */ +#define PADDING 8 +#define HALFPADDING PADDING/2 @interface SOGoUserHomePage : UIxComponent @@ -151,23 +153,23 @@ startInterval = 0; else startInterval = ([currentDate timeIntervalSinceDate: startDate] - / intervalSeconds); + / INTERVALSECONDS); delta = [[currentDate timeZoneDetail] timeZoneSecondsFromGMT] - [[startDate timeZoneDetail] timeZoneSecondsFromGMT]; - startInterval += (delta/60/15); - startInterval = (startInterval < -4 ? -4 : startInterval); + startInterval += (delta/INTERVALSECONDS); + startInterval = (startInterval < -(HALFPADDING) ? -(HALFPADDING) : startInterval); currentDate = [record objectForKey: @"endDate"]; if ([currentDate earlierDate: endDate] == endDate) endInterval = itemCount - 1; else endInterval = ([currentDate timeIntervalSinceDate: startDate] - / intervalSeconds); + / INTERVALSECONDS); delta = [[currentDate timeZoneDetail] timeZoneSecondsFromGMT] - [[startDate timeZoneDetail] timeZoneSecondsFromGMT]; - endInterval += (delta/60/15); + endInterval += (delta/INTERVALSECONDS); endInterval = (endInterval < 0 ? 0 : endInterval); - endInterval = (endInterval > itemCount+4 ? itemCount+4 : endInterval); + endInterval = (endInterval > itemCount+HALFPADDING ? itemCount+HALFPADDING : endInterval); // Update bit string representation // If the user is a resource with restristed amount of bookings, keep the sum of overlapping events @@ -230,19 +232,19 @@ // Slices of 15 minutes. The +8 is to take into account that we can // have a timezone change during the freebusy lookup. We have +4 at the // beginning and +4 at the end. - intervals = interval / intervalSeconds + 8; + intervals = interval / INTERVALSECONDS + PADDING; // Build a bit string representation of the freebusy data for the period freeBusyItems = calloc(intervals, sizeof (unsigned int)); - [self _fillFreeBusyItems: (freeBusyItems+4) - count: (intervals-4) + [self _fillFreeBusyItems: (freeBusyItems+HALFPADDING) + count: (intervals-PADDING) withRecords: [fb fetchFreeBusyInfosFrom: start to: end forContact: uid] fromStartDate: startDate toEndDate: endDate]; // Convert bit string to a NSArray. We also skip by the default the non-requested information. freeBusy = [NSMutableArray arrayWithCapacity: intervals]; - for (count = 4; count < (intervals-4); count++) + for (count = HALFPADDING; count < (intervals-HALFPADDING); count++) { [freeBusy addObject: [NSString stringWithFormat: @"%d", *(freeBusyItems + count)]]; } From 784f0100e9d4dc55d5320e41eecfc3a7e68f9943 Mon Sep 17 00:00:00 2001 From: peruchi Date: Tue, 31 Mar 2015 14:18:23 -0300 Subject: [PATCH 005/109] Create sogo-systemd-redhat.spec --- packaging/rhel/sogo-systemd-redhat.spec | 465 ++++++++++++++++++++++++ 1 file changed, 465 insertions(+) create mode 100644 packaging/rhel/sogo-systemd-redhat.spec diff --git a/packaging/rhel/sogo-systemd-redhat.spec b/packaging/rhel/sogo-systemd-redhat.spec new file mode 100644 index 000000000..e17f917e3 --- /dev/null +++ b/packaging/rhel/sogo-systemd-redhat.spec @@ -0,0 +1,465 @@ +# We disable OpenChange builds on el5 since it's prehistoric +%define enable_openchange 1 +%{?el5:%define enable_openchange 0} +%{?el7:%define enable_openchange 0} + +%ifarch %ix86 +%define enable_openchange 0 +%endif + +%{!?sogo_major_version: %global sogo_major_version %(/bin/echo %{sogo_version} | /bin/cut -f 1 -d .)} +%if %enable_openchange +%global oc_build_depends samba4 openchange +%endif + +%{!?python_sys_pyver: %global python_sys_pyver %(/usr/bin/python -c "import sys; print sys.hexversion")} + +%define sogo_user sogo + +Summary: SOGo +Name: sogo +Version: %{sogo_version} +Release: %{dist_suffix}%{?dist} +Vendor: http://www.inverse.ca/ +Packager: Inverse inc. +License: GPL +URL: http://www.inverse.ca/contributions/sogo.html +Group: Productivity/Groupware +Source: SOGo-%{sogo_version}.tar.gz +Prefix: /usr +AutoReqProv: off +Requires: gnustep-base >= 1.23, sope%{sope_major_version}%{sope_minor_version}-core, httpd, sope%{sope_major_version}%{sope_minor_version}-core, sope%{sope_major_version}%{sope_minor_version}-appserver, sope%{sope_major_version}%{sope_minor_version}-ldap, sope%{sope_major_version}%{sope_minor_version}-cards >= %{sogo_version}, sope%{sope_major_version}%{sope_minor_version}-gdl1-contentstore >= %{sogo_version}, sope%{sope_major_version}%{sope_minor_version}-sbjson, libmemcached, memcached, tmpwatch, zip +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release} +BuildRequires: gcc-objc gnustep-base gnustep-make sope%{sope_major_version}%{sope_minor_version}-appserver-devel sope%{sope_major_version}%{sope_minor_version}-core-devel sope%{sope_major_version}%{sope_minor_version}-ldap-devel sope%{sope_major_version}%{sope_minor_version}-mime-devel sope%{sope_major_version}%{sope_minor_version}-xml-devel sope%{sope_major_version}%{sope_minor_version}-gdl1-devel sope%{sope_major_version}%{sope_minor_version}-sbjson-devel libmemcached-devel sed %{?oc_build_depends} + + +# Required by MS Exchange freebusy lookups +%{?el5:Requires: curl} +%{?el5:BuildRequires: curl-devel} +%{?el6:Requires: libcurl} +%{?el6:BuildRequires: libcurl-devel} + +# saml is enabled everywhere except on el5 since its glib2 is prehistoric +%define saml2_cfg_opts "--enable-saml2" +%{?el5:%define saml2_cfg_opts ""} +%{?el7:%define saml2_cfg_opts ""} +%{?el6:Requires: lasso} +%{?el6:BuildRequires: lasso-devel} + +%description +SOGo is a groupware server built around OpenGroupware.org (OGo) and +the SOPE application server. It focuses on scalability. + +The Inverse edition of this project has many feature enhancements: +- CalDAV and GroupDAV compliance +- full handling of vCard as well as vCalendar/iCalendar formats +- support for folder sharing and ACLs + +The Web interface has been rewritten in an AJAX fashion to provided a faster +UI for the users, consistency in look and feel with the Mozilla applications, +and to reduce the load of the transactions on the server. + +%package -n sogo-tool +Summary: Command-line toolsuite for SOGo +Group: Productivity/Groupware +Requires: sogo = %{sogo_version} +AutoReqProv: off + +%description -n sogo-tool +Administrative tool for SOGo that provides the following internal commands: + backup -- backup user folders + restore -- restore user folders + remove-doubles -- remove duplicate contacts from the user addressbooks + check-doubles -- list user addressbooks with duplicate contacts + +%package -n sogo-slapd-sockd +Summary: SOGo backend for slapd and back-sock +Group: Productivity/Groupware +AutoReqProv: off + +%description -n sogo-slapd-sockd +SOGo backend for slapd and back-sock, enabling access to private addressbooks +via LDAP. + +%package -n sogo-ealarms-notify +Summary: SOGo utility for executing email alarms +Group: Productivity/Groupware +AutoReqProv: off + +%description -n sogo-ealarms-notify +SOGo utility executed each minute via a cronjob for executing email alarms. + +%package -n sogo-activesync +Summary: SOGo module to handle ActiveSync requests +Group: Productivity/Groupware +Requires: libwbxml, sogo = %{sogo_version} +BuildRequires: libwbxml-devel +AutoReqProv: off + +%description -n sogo-activesync +SOGo module to handle ActiveSync requests + +%package -n sogo-devel +Summary: Development headers and libraries for SOGo +Group: Development/Libraries/Objective C +AutoReqProv: off + +%description -n sogo-devel +Development headers and libraries for SOGo. Needed to create modules. + +%package -n sope%{sope_major_version}%{sope_minor_version}-gdl1-contentstore +Summary: Storage backend for folder abstraction. +Group: Development/Libraries/Objective C +Requires: sope%{sope_major_version}%{sope_minor_version}-gdl1 +AutoReqProv: off + +%description -n sope%{sope_major_version}%{sope_minor_version}-gdl1-contentstore +The storage backend implements the "low level" folder abstraction, which is +basically an arbitary "BLOB" containing some document. + +SOPE is a framework for developing web applications and services. The +name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. + +%package -n sope%{sope_major_version}%{sope_minor_version}-gdl1-contentstore-devel +Summary: Development files for the GNUstep database libraries +Group: Development/Libraries/Objective C +Requires: sope%{sope_major_version}%{sope_minor_version}-gdl1 +AutoReqProv: off + +%description -n sope%{sope_major_version}%{sope_minor_version}-gdl1-contentstore-devel +This package contains the header files for SOPE's GDLContentStore library. + +SOPE is a framework for developing web applications and services. The +name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. + +%package -n sope%{sope_major_version}%{sope_minor_version}-cards +Summary: SOPE versit parsing library for iCal and VCard formats +Group: Development/Libraries/Objective C +AutoReqProv: off + +%description -n sope%{sope_major_version}%{sope_minor_version}-cards +SOPE versit parsing library for iCal and VCard formats + +%package -n sope%{sope_major_version}%{sope_minor_version}-cards-devel +Summary: SOPE versit parsing library for iCal and VCard formats +Group: Development/Libraries/Objective C +Requires: sope%{sope_major_version}%{sope_minor_version}-cards +AutoReqProv: off + +%description -n sope%{sope_major_version}%{sope_minor_version}-cards-devel +SOPE versit parsing library for iCal and VCard formats + +%if %enable_openchange +%package openchange-backend +Summary: SOGo backend for OpenChange +Group: Productivity/Groupware +AutoReqProv: off + +%description openchange-backend +SOGo backend for OpenChange +%endif + +######################################## +%prep +rm -fr ${RPM_BUILD_ROOT} +%setup -q -n SOGo-%{sogo_version} + + +# small tweak to the python script for RHEL5 +# if hex(sys.hexversion) < 0x02060000 +%if %{python_sys_pyver} < 33947648 + sed -i 's!/usr/bin/env python!/usr/bin/env python2.6!' Scripts/openchange_user_cleanup +%endif + + +# ****************************** build ******************************** +%build +%if 0%{?el7} +. /usr/lib64/GNUstep/Makefiles/GNUstep.sh +%else +. /usr/share/GNUstep/Makefiles/GNUstep.sh +%endif +./configure %saml2_cfg_opts + +case %{_target_platform} in +ppc64-*) + cc="gcc -m64"; + ldflags="-m64";; +*) + cc="gcc"; + ldflags="";; +esac + +make CC="$cc" LDFLAGS="$ldflags" messages=yes + +# OpenChange +%if %{sogo_major_version} >= 2 +(cd OpenChange; \ + LD_LIBRARY_PATH=../SOPE/NGCards/obj:../SOPE/GDLContentStore/obj \ + make GNUSTEP_INSTALLATION_DOMAIN=SYSTEM ) +%endif + +# ****************************** install ****************************** +%install +QA_SKIP_BUILD_ROOT=1 +export QA_SKIP_BUILD_ROOT + +case %{_target_platform} in +ppc64-*) + cc="gcc -m64"; + ldflags="-m64";; +*) + cc="gcc"; + ldflags="";; +esac + +make DESTDIR=${RPM_BUILD_ROOT} \ + GNUSTEP_INSTALLATION_DOMAIN=SYSTEM \ + CC="$cc" LDFLAGS="$ldflags" \ + install +install -d ${RPM_BUILD_ROOT}/usr/lib/systemd/system/ +install -d ${RPM_BUILD_ROOT}/etc/cron.d +install -d ${RPM_BUILD_ROOT}/etc/cron.daily +install -d ${RPM_BUILD_ROOT}/etc/logrotate.d +install -d ${RPM_BUILD_ROOT}/etc/sysconfig +install -d ${RPM_BUILD_ROOT}/etc/httpd/conf.d +install -d ${RPM_BUILD_ROOT}/usr/sbin +install -d ${RPM_BUILD_ROOT}/var/lib/sogo +install -d ${RPM_BUILD_ROOT}/var/log/sogo +install -d ${RPM_BUILD_ROOT}/var/run/sogo +install -d ${RPM_BUILD_ROOT}/var/spool/sogo +install -d -m 750 -o %sogo_user -g %sogo_user ${RPM_BUILD_ROOT}/etc/sogo +install -m 640 -o %sogo_user -g %sogo_user Scripts/sogo.conf ${RPM_BUILD_ROOT}/etc/sogo/ +install -m 755 Scripts/openchange_user_cleanup ${RPM_BUILD_ROOT}/%{_sbindir} +cat Apache/SOGo.conf | sed -e "s@/lib/@/%{_lib}/@g" > ${RPM_BUILD_ROOT}/etc/httpd/conf.d/SOGo.conf +install -m 600 Scripts/sogo.cron ${RPM_BUILD_ROOT}/etc/cron.d/sogo +cp Scripts/tmpwatch ${RPM_BUILD_ROOT}/etc/cron.daily/sogo-tmpwatch +chmod 755 ${RPM_BUILD_ROOT}/etc/cron.daily/sogo-tmpwatch +cp Scripts/logrotate ${RPM_BUILD_ROOT}/etc/logrotate.d/sogo +cp Scripts/sogo-systemd-redhat ${RPM_BUILD_ROOT}/usr/lib/systemd/system/sogod.service +chmod 644 ${RPM_BUILD_ROOT}/usr/lib/systemd/system/sogod.service +cp Scripts/sogo-default ${RPM_BUILD_ROOT}/etc/sysconfig/sogo +rm -rf ${RPM_BUILD_ROOT}%{_bindir}/test_quick_extract + +# OpenChange +%if %{sogo_major_version} >= 2 +(cd OpenChange; \ + LD_LIBRARY_PATH=${RPM_BUILD_ROOT}%{_libdir} \ + make DESTDIR=${RPM_BUILD_ROOT} \ + GNUSTEP_INSTALLATION_DOMAIN=SYSTEM \ + CC="$cc" LDFLAGS="$ldflags" \ + install) +%endif + +# ActiveSync +(cd ActiveSync; \ + LD_LIBRARY_PATH=${RPM_BUILD_ROOT}%{_libdir} \ + make DESTDIR=${RPM_BUILD_ROOT} \ + GNUSTEP_INSTALLATION_DOMAIN=SYSTEM \ + CC="$cc" LDFLAGS="$ldflags" \ + install) + +# ****************************** clean ******************************** +%clean +rm -fr ${RPM_BUILD_ROOT} + +# ****************************** files ******************************** +%files -n sogo +%defattr(-,root,root,-) + +/etc/init.d/sogod +/etc/cron.daily/sogo-tmpwatch +%dir %attr(0700, %sogo_user, %sogo_user) %{_var}/lib/sogo +%dir %attr(0700, %sogo_user, %sogo_user) %{_var}/log/sogo +%dir %attr(0755, %sogo_user, %sogo_user) %{_var}/run/sogo +%dir %attr(0700, %sogo_user, %sogo_user) %{_var}/spool/sogo +%dir %attr(0750, root, %sogo_user) %{_sysconfdir}/sogo +%{_sbindir}/sogod +%{_sbindir}/openchange_user_cleanup +%{_libdir}/sogo/libSOGo.so* +%{_libdir}/sogo/libSOGoUI.so* +%{_libdir}/GNUstep/SOGo/AdministrationUI.SOGo +%{_libdir}/GNUstep/SOGo/Appointments.SOGo +%{_libdir}/GNUstep/SOGo/CommonUI.SOGo +%{_libdir}/GNUstep/SOGo/Contacts.SOGo +%{_libdir}/GNUstep/SOGo/ContactsUI.SOGo +%{_libdir}/GNUstep/SOGo/MailPartViewers.SOGo +%{_libdir}/GNUstep/SOGo/Mailer.SOGo +%{_libdir}/GNUstep/SOGo/MailerUI.SOGo +%{_libdir}/GNUstep/SOGo/MainUI.SOGo +%{_libdir}/GNUstep/SOGo/PreferencesUI.SOGo +%{_libdir}/GNUstep/SOGo/SchedulerUI.SOGo + +%{_libdir}/GNUstep/Frameworks/SOGo.framework/Resources +%{_libdir}/GNUstep/Frameworks/SOGo.framework/Versions/%{sogo_major_version}/sogo/libSOGo.so* +%{_libdir}/GNUstep/Frameworks/SOGo.framework/Versions/%{sogo_major_version}/Resources +%{_libdir}/GNUstep/Frameworks/SOGo.framework/Versions/Current +%{_libdir}/GNUstep/SOGo/Templates +%{_libdir}/GNUstep/SOGo/WebServerResources +%{_libdir}/GNUstep/OCSTypeModels +%{_libdir}/GNUstep/WOxElemBuilders-* + +%config(noreplace) %attr(0640, root, %sogo_user) %{_sysconfdir}/sogo/sogo.conf +%config(noreplace) %{_sysconfdir}/logrotate.d/sogo +%config(noreplace) %{_sysconfdir}/cron.d/sogo +%config(noreplace) %{_sysconfdir}/httpd/conf.d/SOGo.conf +%config(noreplace) %{_sysconfdir}/sysconfig/sogo +%doc ChangeLog NEWS Scripts/*sh Scripts/updates.php Apache/SOGo-apple-ab.conf + +%files -n sogo-tool +%{_sbindir}/sogo-tool + +%files -n sogo-ealarms-notify +%{_sbindir}/sogo-ealarms-notify + +%files -n sogo-slapd-sockd +%{_sbindir}/sogo-slapd-sockd + +%files -n sogo-activesync +%{_libdir}/GNUstep/SOGo/ActiveSync.SOGo +%doc ActiveSync/LICENSE ActiveSync/README + +%files -n sogo-devel +%{_includedir}/SOGo +%{_includedir}/SOGoUI +%{_libdir}/sogo/libSOGo.so* +%{_libdir}/sogo/libSOGoUI.so* +%{_libdir}/GNUstep/Frameworks/SOGo.framework/Headers +%{_libdir}/GNUstep/Frameworks/SOGo.framework/sogo/libSOGo.so +%{_libdir}/GNUstep/Frameworks/SOGo.framework/sogo/SOGo +%{_libdir}/GNUstep/Frameworks/SOGo.framework/Versions/%{sogo_major_version}/Headers +%{_libdir}/GNUstep/Frameworks/SOGo.framework/Versions/%{sogo_major_version}/sogo/libSOGo.so* +%{_libdir}/GNUstep/Frameworks/SOGo.framework/Versions/%{sogo_major_version}/sogo/SOGo + +%files -n sope%{sope_major_version}%{sope_minor_version}-gdl1-contentstore +%defattr(-,root,root,-) +%{_libdir}/sogo/libGDLContentStore*.so* + +%files -n sope%{sope_major_version}%{sope_minor_version}-gdl1-contentstore-devel +%{_includedir}/GDLContentStore +%{_libdir}/sogo/libGDLContentStore*.so* + +%files -n sope%{sope_major_version}%{sope_minor_version}-cards +%{_libdir}/sogo/libNGCards.so* +%{_libdir}/GNUstep/SaxDrivers-* +%{_libdir}/GNUstep/SaxMappings +%{_libdir}/GNUstep/Libraries/Resources/NGCards + +%files -n sope%{sope_major_version}%{sope_minor_version}-cards-devel +%{_includedir}/NGCards +%{_libdir}/sogo/libNGCards.so* + +%if %enable_openchange +%files openchange-backend +%defattr(-,root,root,-) +%{_libdir}/GNUstep/SOGo/*.MAPIStore +%{_libdir}/mapistore_backends/* +%endif + +# **************************** pkgscripts ***************************** +%pre +if ! id %sogo_user >& /dev/null; then + /usr/sbin/useradd -d %{_var}/lib/sogo -c "SOGo daemon" -s /sbin/nologin -M -r %sogo_user +fi + +%post +# update timestamp on imgs,css,js to let apache know the files changed +find %{_libdir}/GNUstep/SOGo/WebServerResources -exec touch {} \; +systemctl enable sogod +systemctl start sogod > /dev/null 2>&1 + +%preun +if [ "$1" == "0" ] +then + systemctl disable sogod + systemctl stop sogod > /dev/null 2>&1 +fi + +%postun +if test "$1" = "0" +then + /usr/sbin/userdel %sogo_user + /usr/sbin/groupdel %sogo_user > /dev/null 2>&1 + /bin/rm -rf %{_var}/run/sogo + /bin/rm -rf %{_var}/spool/sogo + # not removing /var/lib/sogo to keep .GNUstepDefaults +fi + +# ********************************* changelog ************************* +%changelog +* Thu Mar 31 2015. Inverse inc. +- Change script start sogod for systemd + +* Wed Oct 8 2014 Inverse inc. +- fixed the library move to "sogo" app dir + +* Wed Jan 15 2014 Inverse inc. +- New package: sogo-activesync +- explicitly list all *.SOGo modules in sogo package +- added dependency on sogo = %version for sogo-tool + +* Thu Apr 17 2013 Inverse inc. +- Install openchange_user_cleanup in sbindir instead of doc + +* Wed Apr 10 2013 Inverse inc. +- use %sogo_user instead of 'sogo' +- install a sample sogo.conf in /etc/sogo + +* Tue Jan 22 2013 Inverse inc. +- Create the sogo user as a system user +- Use %attr() to set directory permissions instead of chown/chmod + +* Mon Nov 12 2012 Inverse inc. +- Add missing dependency on lasso and lasso-devel + +* Mon Nov 05 2012 Inverse inc. +- Disable saml2 on rhel5 - glib2 too old + +* Fri Nov 02 2012 Inverse inc. +- Enable saml2 + +* Tue Aug 28 2012 Inverse inc. +- Add openchange_cleanup.py and tweak it to work on RHEL5 + +* Tue Jul 31 2012 Inverse inc. +- treat logrotate file as a config file + +* Fri May 24 2012 Inverse inc. +- %post: restart sogo if it was running before rpm install + +* Fri Mar 16 2012 Inverse inc. +- %post: update timestamp on imgs,css,js to let apache know the files changed + +* Fri Feb 16 2012 Inverse inc. +- Use globbing to include all sql upgrade scripts instead of listing them all + +* Tue Jan 10 2012 Inverse inc. +- /etc/cron.d/sogo + +* Thu Oct 27 2011 Inverse inc. +- make build of sogo-openchange-backend conditional to sogo_version >= 2 + +* Fri Oct 14 2011 Inverse inc. +- adapted to gnustep-make 2.6 +- added sogo-openchange-backend + +* Tue Sep 28 2010 Inverse inc. +- removed "README" from documentation + +* Fri Aug 20 2010 Inverse inc. +- added sogo-ealarms-notify package + +* Tue Apr 06 2010 Inverse inc. +- added sogo-slapd-sockd package + +* Thu Jul 31 2008 Inverse inc. +- added dependencies on sopeXY-appserver, -core, -gdl1-contentstore and -ldap + +* Wed May 21 2008 Inverse inc. +- removed installation of template and resource files, since it is now done by the upstream package + +* Tue Oct 4 2007 Inverse inc. +- added package sope-gdl1-contentstore + +* Wed Jul 18 2007 Inverse inc. +- initial build From 36a70b161c32653cf8d7f2bdf83c6d0c4aac9b76 Mon Sep 17 00:00:00 2001 From: peruchi Date: Tue, 31 Mar 2015 14:19:16 -0300 Subject: [PATCH 006/109] Create sogo-systemd-redhat --- Scripts/sogo-systemd-redhat | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 Scripts/sogo-systemd-redhat diff --git a/Scripts/sogo-systemd-redhat b/Scripts/sogo-systemd-redhat new file mode 100644 index 000000000..7fdd56b96 --- /dev/null +++ b/Scripts/sogo-systemd-redhat @@ -0,0 +1,12 @@ +[Unit] +Description=SOGo is a groupware server +After=network.target + +[Service] +Type=forking +ExecStart=/usr/sbin/sogod -WOWorkersCount 3 -WOPidFile /var/run/sogo/sogo.pid -WOLogFile /var/log/sogo/sogo.log +PIDFile=/var/run/sogo/sogo.pid +User=sogo + +[Install] +WantedBy=multi-user.target From c9ec636a533836ec8464acadea97dc09276d2557 Mon Sep 17 00:00:00 2001 From: peruchi Date: Tue, 31 Mar 2015 14:36:04 -0300 Subject: [PATCH 007/109] Update sogo.spec --- packaging/rhel/sogo.spec | 47 ++++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/packaging/rhel/sogo.spec b/packaging/rhel/sogo.spec index 8f275e956..33afa3f1a 100644 --- a/packaging/rhel/sogo.spec +++ b/packaging/rhel/sogo.spec @@ -14,6 +14,13 @@ %{!?python_sys_pyver: %global python_sys_pyver %(/usr/bin/python -c "import sys; print sys.hexversion")} +# Systemd for fedora >= 17 or el 7 +%if 0%{?fedora} >= 17 || 0%{?rhel} >= 7 + %global _with_systemd 1 +%else + %global _with_systemd 0 +%endif + %define sogo_user sogo Summary: SOGo @@ -217,7 +224,13 @@ make DESTDIR=${RPM_BUILD_ROOT} \ GNUSTEP_INSTALLATION_DOMAIN=SYSTEM \ CC="$cc" LDFLAGS="$ldflags" \ install -install -d ${RPM_BUILD_ROOT}/etc/init.d + +%if 0%{?_with_systemd} + install -d ${RPM_BUILD_ROOT}/usr/lib/systemd/system/ +%else + install -d ${RPM_BUILD_ROOT}/etc/init.d +%endif + install -d ${RPM_BUILD_ROOT}/etc/cron.d install -d ${RPM_BUILD_ROOT}/etc/cron.daily install -d ${RPM_BUILD_ROOT}/etc/logrotate.d @@ -236,8 +249,15 @@ install -m 600 Scripts/sogo.cron ${RPM_BUILD_ROOT}/etc/cron.d/sogo cp Scripts/tmpwatch ${RPM_BUILD_ROOT}/etc/cron.daily/sogo-tmpwatch chmod 755 ${RPM_BUILD_ROOT}/etc/cron.daily/sogo-tmpwatch cp Scripts/logrotate ${RPM_BUILD_ROOT}/etc/logrotate.d/sogo -cp Scripts/sogo-init.d-redhat ${RPM_BUILD_ROOT}/etc/init.d/sogod -chmod 755 ${RPM_BUILD_ROOT}/etc/init.d/sogod + +%if 0%{?_with_systemd} + cp Scripts/sogo-systemd-redhat ${RPM_BUILD_ROOT}/usr/lib/systemd/system/sogod.service + chmod 644 ${RPM_BUILD_ROOT}/usr/lib/systemd/system/sogod.service +%else + cp Scripts/sogo-init.d-redhat ${RPM_BUILD_ROOT}/etc/init.d/sogod + chmod 755 ${RPM_BUILD_ROOT}/etc/init.d/sogod +%endif + cp Scripts/sogo-default ${RPM_BUILD_ROOT}/etc/sysconfig/sogo rm -rf ${RPM_BUILD_ROOT}%{_bindir}/test_quick_extract @@ -365,14 +385,24 @@ fi %post # update timestamp on imgs,css,js to let apache know the files changed find %{_libdir}/GNUstep/SOGo/WebServerResources -exec touch {} \; -/sbin/chkconfig --add sogod -/etc/init.d/sogod condrestart >&/dev/null +%if 0%{?_with_systemd} + systemctl enable sogod + systemctl start sogod > /dev/null 2>&1 +%else + /sbin/chkconfig --add sogod + /etc/init.d/sogod condrestart >&/dev/null +%endif %preun if [ "$1" == "0" ] then - /sbin/chkconfig --del sogod - /sbin/service sogod stop > /dev/null 2>&1 + %if 0%{?_with_systemd} + systemctl disable sogod + systemctl stop sogod > /dev/null 2>&1 + %else + /sbin/chkconfig --del sogod + /sbin/service sogod stop > /dev/null 2>&1 + %endif fi %postun @@ -387,6 +417,9 @@ fi # ********************************* changelog ************************* %changelog +* Thu Mar 31 2015. Inverse inc. +- Change script start sogod for systemd + * Wed Oct 8 2014 Inverse inc. - fixed the library move to "sogo" app dir From 06ef3fe8564729d971b50822e1669372324600c1 Mon Sep 17 00:00:00 2001 From: peruchi Date: Tue, 31 Mar 2015 14:37:35 -0300 Subject: [PATCH 008/109] Delete sogo-systemd-redhat.spec --- packaging/rhel/sogo-systemd-redhat.spec | 465 ------------------------ 1 file changed, 465 deletions(-) delete mode 100644 packaging/rhel/sogo-systemd-redhat.spec diff --git a/packaging/rhel/sogo-systemd-redhat.spec b/packaging/rhel/sogo-systemd-redhat.spec deleted file mode 100644 index e17f917e3..000000000 --- a/packaging/rhel/sogo-systemd-redhat.spec +++ /dev/null @@ -1,465 +0,0 @@ -# We disable OpenChange builds on el5 since it's prehistoric -%define enable_openchange 1 -%{?el5:%define enable_openchange 0} -%{?el7:%define enable_openchange 0} - -%ifarch %ix86 -%define enable_openchange 0 -%endif - -%{!?sogo_major_version: %global sogo_major_version %(/bin/echo %{sogo_version} | /bin/cut -f 1 -d .)} -%if %enable_openchange -%global oc_build_depends samba4 openchange -%endif - -%{!?python_sys_pyver: %global python_sys_pyver %(/usr/bin/python -c "import sys; print sys.hexversion")} - -%define sogo_user sogo - -Summary: SOGo -Name: sogo -Version: %{sogo_version} -Release: %{dist_suffix}%{?dist} -Vendor: http://www.inverse.ca/ -Packager: Inverse inc. -License: GPL -URL: http://www.inverse.ca/contributions/sogo.html -Group: Productivity/Groupware -Source: SOGo-%{sogo_version}.tar.gz -Prefix: /usr -AutoReqProv: off -Requires: gnustep-base >= 1.23, sope%{sope_major_version}%{sope_minor_version}-core, httpd, sope%{sope_major_version}%{sope_minor_version}-core, sope%{sope_major_version}%{sope_minor_version}-appserver, sope%{sope_major_version}%{sope_minor_version}-ldap, sope%{sope_major_version}%{sope_minor_version}-cards >= %{sogo_version}, sope%{sope_major_version}%{sope_minor_version}-gdl1-contentstore >= %{sogo_version}, sope%{sope_major_version}%{sope_minor_version}-sbjson, libmemcached, memcached, tmpwatch, zip -BuildRoot: %{_tmppath}/%{name}-%{version}-%{release} -BuildRequires: gcc-objc gnustep-base gnustep-make sope%{sope_major_version}%{sope_minor_version}-appserver-devel sope%{sope_major_version}%{sope_minor_version}-core-devel sope%{sope_major_version}%{sope_minor_version}-ldap-devel sope%{sope_major_version}%{sope_minor_version}-mime-devel sope%{sope_major_version}%{sope_minor_version}-xml-devel sope%{sope_major_version}%{sope_minor_version}-gdl1-devel sope%{sope_major_version}%{sope_minor_version}-sbjson-devel libmemcached-devel sed %{?oc_build_depends} - - -# Required by MS Exchange freebusy lookups -%{?el5:Requires: curl} -%{?el5:BuildRequires: curl-devel} -%{?el6:Requires: libcurl} -%{?el6:BuildRequires: libcurl-devel} - -# saml is enabled everywhere except on el5 since its glib2 is prehistoric -%define saml2_cfg_opts "--enable-saml2" -%{?el5:%define saml2_cfg_opts ""} -%{?el7:%define saml2_cfg_opts ""} -%{?el6:Requires: lasso} -%{?el6:BuildRequires: lasso-devel} - -%description -SOGo is a groupware server built around OpenGroupware.org (OGo) and -the SOPE application server. It focuses on scalability. - -The Inverse edition of this project has many feature enhancements: -- CalDAV and GroupDAV compliance -- full handling of vCard as well as vCalendar/iCalendar formats -- support for folder sharing and ACLs - -The Web interface has been rewritten in an AJAX fashion to provided a faster -UI for the users, consistency in look and feel with the Mozilla applications, -and to reduce the load of the transactions on the server. - -%package -n sogo-tool -Summary: Command-line toolsuite for SOGo -Group: Productivity/Groupware -Requires: sogo = %{sogo_version} -AutoReqProv: off - -%description -n sogo-tool -Administrative tool for SOGo that provides the following internal commands: - backup -- backup user folders - restore -- restore user folders - remove-doubles -- remove duplicate contacts from the user addressbooks - check-doubles -- list user addressbooks with duplicate contacts - -%package -n sogo-slapd-sockd -Summary: SOGo backend for slapd and back-sock -Group: Productivity/Groupware -AutoReqProv: off - -%description -n sogo-slapd-sockd -SOGo backend for slapd and back-sock, enabling access to private addressbooks -via LDAP. - -%package -n sogo-ealarms-notify -Summary: SOGo utility for executing email alarms -Group: Productivity/Groupware -AutoReqProv: off - -%description -n sogo-ealarms-notify -SOGo utility executed each minute via a cronjob for executing email alarms. - -%package -n sogo-activesync -Summary: SOGo module to handle ActiveSync requests -Group: Productivity/Groupware -Requires: libwbxml, sogo = %{sogo_version} -BuildRequires: libwbxml-devel -AutoReqProv: off - -%description -n sogo-activesync -SOGo module to handle ActiveSync requests - -%package -n sogo-devel -Summary: Development headers and libraries for SOGo -Group: Development/Libraries/Objective C -AutoReqProv: off - -%description -n sogo-devel -Development headers and libraries for SOGo. Needed to create modules. - -%package -n sope%{sope_major_version}%{sope_minor_version}-gdl1-contentstore -Summary: Storage backend for folder abstraction. -Group: Development/Libraries/Objective C -Requires: sope%{sope_major_version}%{sope_minor_version}-gdl1 -AutoReqProv: off - -%description -n sope%{sope_major_version}%{sope_minor_version}-gdl1-contentstore -The storage backend implements the "low level" folder abstraction, which is -basically an arbitary "BLOB" containing some document. - -SOPE is a framework for developing web applications and services. The -name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. - -%package -n sope%{sope_major_version}%{sope_minor_version}-gdl1-contentstore-devel -Summary: Development files for the GNUstep database libraries -Group: Development/Libraries/Objective C -Requires: sope%{sope_major_version}%{sope_minor_version}-gdl1 -AutoReqProv: off - -%description -n sope%{sope_major_version}%{sope_minor_version}-gdl1-contentstore-devel -This package contains the header files for SOPE's GDLContentStore library. - -SOPE is a framework for developing web applications and services. The -name "SOPE" (SKYRiX Object Publishing Environment) is inspired by ZOPE. - -%package -n sope%{sope_major_version}%{sope_minor_version}-cards -Summary: SOPE versit parsing library for iCal and VCard formats -Group: Development/Libraries/Objective C -AutoReqProv: off - -%description -n sope%{sope_major_version}%{sope_minor_version}-cards -SOPE versit parsing library for iCal and VCard formats - -%package -n sope%{sope_major_version}%{sope_minor_version}-cards-devel -Summary: SOPE versit parsing library for iCal and VCard formats -Group: Development/Libraries/Objective C -Requires: sope%{sope_major_version}%{sope_minor_version}-cards -AutoReqProv: off - -%description -n sope%{sope_major_version}%{sope_minor_version}-cards-devel -SOPE versit parsing library for iCal and VCard formats - -%if %enable_openchange -%package openchange-backend -Summary: SOGo backend for OpenChange -Group: Productivity/Groupware -AutoReqProv: off - -%description openchange-backend -SOGo backend for OpenChange -%endif - -######################################## -%prep -rm -fr ${RPM_BUILD_ROOT} -%setup -q -n SOGo-%{sogo_version} - - -# small tweak to the python script for RHEL5 -# if hex(sys.hexversion) < 0x02060000 -%if %{python_sys_pyver} < 33947648 - sed -i 's!/usr/bin/env python!/usr/bin/env python2.6!' Scripts/openchange_user_cleanup -%endif - - -# ****************************** build ******************************** -%build -%if 0%{?el7} -. /usr/lib64/GNUstep/Makefiles/GNUstep.sh -%else -. /usr/share/GNUstep/Makefiles/GNUstep.sh -%endif -./configure %saml2_cfg_opts - -case %{_target_platform} in -ppc64-*) - cc="gcc -m64"; - ldflags="-m64";; -*) - cc="gcc"; - ldflags="";; -esac - -make CC="$cc" LDFLAGS="$ldflags" messages=yes - -# OpenChange -%if %{sogo_major_version} >= 2 -(cd OpenChange; \ - LD_LIBRARY_PATH=../SOPE/NGCards/obj:../SOPE/GDLContentStore/obj \ - make GNUSTEP_INSTALLATION_DOMAIN=SYSTEM ) -%endif - -# ****************************** install ****************************** -%install -QA_SKIP_BUILD_ROOT=1 -export QA_SKIP_BUILD_ROOT - -case %{_target_platform} in -ppc64-*) - cc="gcc -m64"; - ldflags="-m64";; -*) - cc="gcc"; - ldflags="";; -esac - -make DESTDIR=${RPM_BUILD_ROOT} \ - GNUSTEP_INSTALLATION_DOMAIN=SYSTEM \ - CC="$cc" LDFLAGS="$ldflags" \ - install -install -d ${RPM_BUILD_ROOT}/usr/lib/systemd/system/ -install -d ${RPM_BUILD_ROOT}/etc/cron.d -install -d ${RPM_BUILD_ROOT}/etc/cron.daily -install -d ${RPM_BUILD_ROOT}/etc/logrotate.d -install -d ${RPM_BUILD_ROOT}/etc/sysconfig -install -d ${RPM_BUILD_ROOT}/etc/httpd/conf.d -install -d ${RPM_BUILD_ROOT}/usr/sbin -install -d ${RPM_BUILD_ROOT}/var/lib/sogo -install -d ${RPM_BUILD_ROOT}/var/log/sogo -install -d ${RPM_BUILD_ROOT}/var/run/sogo -install -d ${RPM_BUILD_ROOT}/var/spool/sogo -install -d -m 750 -o %sogo_user -g %sogo_user ${RPM_BUILD_ROOT}/etc/sogo -install -m 640 -o %sogo_user -g %sogo_user Scripts/sogo.conf ${RPM_BUILD_ROOT}/etc/sogo/ -install -m 755 Scripts/openchange_user_cleanup ${RPM_BUILD_ROOT}/%{_sbindir} -cat Apache/SOGo.conf | sed -e "s@/lib/@/%{_lib}/@g" > ${RPM_BUILD_ROOT}/etc/httpd/conf.d/SOGo.conf -install -m 600 Scripts/sogo.cron ${RPM_BUILD_ROOT}/etc/cron.d/sogo -cp Scripts/tmpwatch ${RPM_BUILD_ROOT}/etc/cron.daily/sogo-tmpwatch -chmod 755 ${RPM_BUILD_ROOT}/etc/cron.daily/sogo-tmpwatch -cp Scripts/logrotate ${RPM_BUILD_ROOT}/etc/logrotate.d/sogo -cp Scripts/sogo-systemd-redhat ${RPM_BUILD_ROOT}/usr/lib/systemd/system/sogod.service -chmod 644 ${RPM_BUILD_ROOT}/usr/lib/systemd/system/sogod.service -cp Scripts/sogo-default ${RPM_BUILD_ROOT}/etc/sysconfig/sogo -rm -rf ${RPM_BUILD_ROOT}%{_bindir}/test_quick_extract - -# OpenChange -%if %{sogo_major_version} >= 2 -(cd OpenChange; \ - LD_LIBRARY_PATH=${RPM_BUILD_ROOT}%{_libdir} \ - make DESTDIR=${RPM_BUILD_ROOT} \ - GNUSTEP_INSTALLATION_DOMAIN=SYSTEM \ - CC="$cc" LDFLAGS="$ldflags" \ - install) -%endif - -# ActiveSync -(cd ActiveSync; \ - LD_LIBRARY_PATH=${RPM_BUILD_ROOT}%{_libdir} \ - make DESTDIR=${RPM_BUILD_ROOT} \ - GNUSTEP_INSTALLATION_DOMAIN=SYSTEM \ - CC="$cc" LDFLAGS="$ldflags" \ - install) - -# ****************************** clean ******************************** -%clean -rm -fr ${RPM_BUILD_ROOT} - -# ****************************** files ******************************** -%files -n sogo -%defattr(-,root,root,-) - -/etc/init.d/sogod -/etc/cron.daily/sogo-tmpwatch -%dir %attr(0700, %sogo_user, %sogo_user) %{_var}/lib/sogo -%dir %attr(0700, %sogo_user, %sogo_user) %{_var}/log/sogo -%dir %attr(0755, %sogo_user, %sogo_user) %{_var}/run/sogo -%dir %attr(0700, %sogo_user, %sogo_user) %{_var}/spool/sogo -%dir %attr(0750, root, %sogo_user) %{_sysconfdir}/sogo -%{_sbindir}/sogod -%{_sbindir}/openchange_user_cleanup -%{_libdir}/sogo/libSOGo.so* -%{_libdir}/sogo/libSOGoUI.so* -%{_libdir}/GNUstep/SOGo/AdministrationUI.SOGo -%{_libdir}/GNUstep/SOGo/Appointments.SOGo -%{_libdir}/GNUstep/SOGo/CommonUI.SOGo -%{_libdir}/GNUstep/SOGo/Contacts.SOGo -%{_libdir}/GNUstep/SOGo/ContactsUI.SOGo -%{_libdir}/GNUstep/SOGo/MailPartViewers.SOGo -%{_libdir}/GNUstep/SOGo/Mailer.SOGo -%{_libdir}/GNUstep/SOGo/MailerUI.SOGo -%{_libdir}/GNUstep/SOGo/MainUI.SOGo -%{_libdir}/GNUstep/SOGo/PreferencesUI.SOGo -%{_libdir}/GNUstep/SOGo/SchedulerUI.SOGo - -%{_libdir}/GNUstep/Frameworks/SOGo.framework/Resources -%{_libdir}/GNUstep/Frameworks/SOGo.framework/Versions/%{sogo_major_version}/sogo/libSOGo.so* -%{_libdir}/GNUstep/Frameworks/SOGo.framework/Versions/%{sogo_major_version}/Resources -%{_libdir}/GNUstep/Frameworks/SOGo.framework/Versions/Current -%{_libdir}/GNUstep/SOGo/Templates -%{_libdir}/GNUstep/SOGo/WebServerResources -%{_libdir}/GNUstep/OCSTypeModels -%{_libdir}/GNUstep/WOxElemBuilders-* - -%config(noreplace) %attr(0640, root, %sogo_user) %{_sysconfdir}/sogo/sogo.conf -%config(noreplace) %{_sysconfdir}/logrotate.d/sogo -%config(noreplace) %{_sysconfdir}/cron.d/sogo -%config(noreplace) %{_sysconfdir}/httpd/conf.d/SOGo.conf -%config(noreplace) %{_sysconfdir}/sysconfig/sogo -%doc ChangeLog NEWS Scripts/*sh Scripts/updates.php Apache/SOGo-apple-ab.conf - -%files -n sogo-tool -%{_sbindir}/sogo-tool - -%files -n sogo-ealarms-notify -%{_sbindir}/sogo-ealarms-notify - -%files -n sogo-slapd-sockd -%{_sbindir}/sogo-slapd-sockd - -%files -n sogo-activesync -%{_libdir}/GNUstep/SOGo/ActiveSync.SOGo -%doc ActiveSync/LICENSE ActiveSync/README - -%files -n sogo-devel -%{_includedir}/SOGo -%{_includedir}/SOGoUI -%{_libdir}/sogo/libSOGo.so* -%{_libdir}/sogo/libSOGoUI.so* -%{_libdir}/GNUstep/Frameworks/SOGo.framework/Headers -%{_libdir}/GNUstep/Frameworks/SOGo.framework/sogo/libSOGo.so -%{_libdir}/GNUstep/Frameworks/SOGo.framework/sogo/SOGo -%{_libdir}/GNUstep/Frameworks/SOGo.framework/Versions/%{sogo_major_version}/Headers -%{_libdir}/GNUstep/Frameworks/SOGo.framework/Versions/%{sogo_major_version}/sogo/libSOGo.so* -%{_libdir}/GNUstep/Frameworks/SOGo.framework/Versions/%{sogo_major_version}/sogo/SOGo - -%files -n sope%{sope_major_version}%{sope_minor_version}-gdl1-contentstore -%defattr(-,root,root,-) -%{_libdir}/sogo/libGDLContentStore*.so* - -%files -n sope%{sope_major_version}%{sope_minor_version}-gdl1-contentstore-devel -%{_includedir}/GDLContentStore -%{_libdir}/sogo/libGDLContentStore*.so* - -%files -n sope%{sope_major_version}%{sope_minor_version}-cards -%{_libdir}/sogo/libNGCards.so* -%{_libdir}/GNUstep/SaxDrivers-* -%{_libdir}/GNUstep/SaxMappings -%{_libdir}/GNUstep/Libraries/Resources/NGCards - -%files -n sope%{sope_major_version}%{sope_minor_version}-cards-devel -%{_includedir}/NGCards -%{_libdir}/sogo/libNGCards.so* - -%if %enable_openchange -%files openchange-backend -%defattr(-,root,root,-) -%{_libdir}/GNUstep/SOGo/*.MAPIStore -%{_libdir}/mapistore_backends/* -%endif - -# **************************** pkgscripts ***************************** -%pre -if ! id %sogo_user >& /dev/null; then - /usr/sbin/useradd -d %{_var}/lib/sogo -c "SOGo daemon" -s /sbin/nologin -M -r %sogo_user -fi - -%post -# update timestamp on imgs,css,js to let apache know the files changed -find %{_libdir}/GNUstep/SOGo/WebServerResources -exec touch {} \; -systemctl enable sogod -systemctl start sogod > /dev/null 2>&1 - -%preun -if [ "$1" == "0" ] -then - systemctl disable sogod - systemctl stop sogod > /dev/null 2>&1 -fi - -%postun -if test "$1" = "0" -then - /usr/sbin/userdel %sogo_user - /usr/sbin/groupdel %sogo_user > /dev/null 2>&1 - /bin/rm -rf %{_var}/run/sogo - /bin/rm -rf %{_var}/spool/sogo - # not removing /var/lib/sogo to keep .GNUstepDefaults -fi - -# ********************************* changelog ************************* -%changelog -* Thu Mar 31 2015. Inverse inc. -- Change script start sogod for systemd - -* Wed Oct 8 2014 Inverse inc. -- fixed the library move to "sogo" app dir - -* Wed Jan 15 2014 Inverse inc. -- New package: sogo-activesync -- explicitly list all *.SOGo modules in sogo package -- added dependency on sogo = %version for sogo-tool - -* Thu Apr 17 2013 Inverse inc. -- Install openchange_user_cleanup in sbindir instead of doc - -* Wed Apr 10 2013 Inverse inc. -- use %sogo_user instead of 'sogo' -- install a sample sogo.conf in /etc/sogo - -* Tue Jan 22 2013 Inverse inc. -- Create the sogo user as a system user -- Use %attr() to set directory permissions instead of chown/chmod - -* Mon Nov 12 2012 Inverse inc. -- Add missing dependency on lasso and lasso-devel - -* Mon Nov 05 2012 Inverse inc. -- Disable saml2 on rhel5 - glib2 too old - -* Fri Nov 02 2012 Inverse inc. -- Enable saml2 - -* Tue Aug 28 2012 Inverse inc. -- Add openchange_cleanup.py and tweak it to work on RHEL5 - -* Tue Jul 31 2012 Inverse inc. -- treat logrotate file as a config file - -* Fri May 24 2012 Inverse inc. -- %post: restart sogo if it was running before rpm install - -* Fri Mar 16 2012 Inverse inc. -- %post: update timestamp on imgs,css,js to let apache know the files changed - -* Fri Feb 16 2012 Inverse inc. -- Use globbing to include all sql upgrade scripts instead of listing them all - -* Tue Jan 10 2012 Inverse inc. -- /etc/cron.d/sogo - -* Thu Oct 27 2011 Inverse inc. -- make build of sogo-openchange-backend conditional to sogo_version >= 2 - -* Fri Oct 14 2011 Inverse inc. -- adapted to gnustep-make 2.6 -- added sogo-openchange-backend - -* Tue Sep 28 2010 Inverse inc. -- removed "README" from documentation - -* Fri Aug 20 2010 Inverse inc. -- added sogo-ealarms-notify package - -* Tue Apr 06 2010 Inverse inc. -- added sogo-slapd-sockd package - -* Thu Jul 31 2008 Inverse inc. -- added dependencies on sopeXY-appserver, -core, -gdl1-contentstore and -ldap - -* Wed May 21 2008 Inverse inc. -- removed installation of template and resource files, since it is now done by the upstream package - -* Tue Oct 4 2007 Inverse inc. -- added package sope-gdl1-contentstore - -* Wed Jul 18 2007 Inverse inc. -- initial build From 94d546dc7a87ee65cfa0668da7bfd889e6155129 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 31 Mar 2015 13:42:59 -0400 Subject: [PATCH 009/109] (feat) added systemd startup script (PR#76) --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index 708fc7f59..e402364d2 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ Enhancements - improved multipart handling using EAS + - added systemd startup script (PR#76) Bug fixes - now keep the BodyPreference for future EAS use and default to MIME if none set (#3146) From ab121e6c153208a9e18174d664645c52826ae9d2 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 31 Mar 2015 15:19:53 -0400 Subject: [PATCH 010/109] [fix] Issues with freebusy in attendees editor --- NEWS | 1 + UI/WebServerResources/JavascriptAPIExtensions.js | 9 ++++----- UI/WebServerResources/UIxAttendeesEditor.js | 12 ++++++++++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/NEWS b/NEWS index e402364d2..b9b1c6661 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,7 @@ Bug fixes - now keep the BodyPreference for future EAS use and default to MIME if none set (#3146) - EAS reply fix when message/rfc822 parts are included in the original mail (#3153) - fix yet an other potential crash during freebusy lookups during timezone changes + - fix display of freebusy information in event attendees editor during timezone changes 2.2.17a (2015-03-15) -------------------- diff --git a/UI/WebServerResources/JavascriptAPIExtensions.js b/UI/WebServerResources/JavascriptAPIExtensions.js index 190a8e99b..0ee1b6b1e 100644 --- a/UI/WebServerResources/JavascriptAPIExtensions.js +++ b/UI/WebServerResources/JavascriptAPIExtensions.js @@ -130,7 +130,7 @@ Date.prototype.deltaDays = function(otherDate) { day1 = tmp; } - return Math.floor((day2 - day1) / 86400000); + return Math.round((day2 - day1) / 86400000); } Date.prototype.daysUpTo = function(otherDate) { @@ -152,7 +152,7 @@ Date.prototype.daysUpTo = function(otherDate) { // var day1 = day1Date.getTime(); // var day2 = day2Date.getTime(); - var nbrDays = Math.floor((day2 - day1) / 86400000) + 1; + var nbrDays = Math.round((day2 - day1) / 86400000) + 1; for (var i = 0; i < nbrDays; i++) { var newDate = new Date(); newDate.setTime(day1 + (i * 86400000)); @@ -217,9 +217,8 @@ Date.prototype.stringWithSeparator = function(separator) { }; Date.prototype.addDays = function(nbrDays) { - var milliSeconds = this.getTime(); - milliSeconds += 86400000 * Math.round(nbrDays); - this.setTime(milliSeconds); + var dat = new Date(this.valueOf()); + this.setDate(dat.getDate() + Math.round(nbrDays)); }; Date.prototype.earlierDate = function(otherDate) { diff --git a/UI/WebServerResources/UIxAttendeesEditor.js b/UI/WebServerResources/UIxAttendeesEditor.js index 7ca8e2874..be7a854bd 100644 --- a/UI/WebServerResources/UIxAttendeesEditor.js +++ b/UI/WebServerResources/UIxAttendeesEditor.js @@ -391,6 +391,12 @@ function redisplayEventSpans() { etHour++; } + if (isAllDay) { + addDays++; + stHour = stMinute = 0; + etHour = etMinute = 0; + } + if (stHour < displayStartHour) { stHour = displayStartHour; stMinute = 0; @@ -432,8 +438,10 @@ function redisplayEventSpans() { if (currentSpanNbr > 3) { currentSpanNbr = 0; currentCellNbr++; - currentCell = row.cells[currentCellNbr]; - spans = $(currentCell).childNodesWithTag("span"); + if (currentCellNbr < row.cells.length) { + currentCell = row.cells[currentCellNbr]; + spans = $(currentCell).childNodesWithTag("span"); + } } deltaSpans--; } From b2d7eb40c2d86b9c536477170eebe68716212b60 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 31 Mar 2015 16:13:52 -0400 Subject: [PATCH 011/109] (fix) fixed a potential EAS error with multiple email priority flags --- ActiveSync/SOGoMailObject+ActiveSync.m | 13 +++++++++++-- NEWS | 3 ++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index d8aa6e0f9..1d74830c6 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -600,7 +600,11 @@ struct GlobalObjectId { // Importance v = 0x1; - p = [[self mailHeaders] objectForKey: @"x-priority"]; + value = [[self mailHeaders] objectForKey: @"x-priority"]; + if ([value isKindOfClass: [NSArray class]]) + p = [value lastObject]; + else + p = value; if (p) { @@ -611,7 +615,12 @@ struct GlobalObjectId { } else { - p = [[self mailHeaders] objectForKey: @"importance"]; + value = [[self mailHeaders] objectForKey: @"importance"]; + if ([value isKindOfClass: [NSArray class]]) + p = [value lastObject]; + else + p = value; + if ([p hasPrefix: @"High"]) v = 0x2; else if ([p hasPrefix: @"Low"]) v = 0x0; } diff --git a/NEWS b/NEWS index b9b1c6661..2a552a6f7 100644 --- a/NEWS +++ b/NEWS @@ -8,8 +8,9 @@ Enhancements Bug fixes - now keep the BodyPreference for future EAS use and default to MIME if none set (#3146) - EAS reply fix when message/rfc822 parts are included in the original mail (#3153) - - fix yet an other potential crash during freebusy lookups during timezone changes + - fixed yet an other potential crash during freebusy lookups during timezone changes - fix display of freebusy information in event attendees editor during timezone changes + - fixed a potential EAS error with multiple email priority flags 2.2.17a (2015-03-15) -------------------- From 9b320ec2a175f1db74a410b8a34767b4c28951e7 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 31 Mar 2015 16:17:21 -0400 Subject: [PATCH 012/109] Improvements over 491d7aaffcc2fc2b8acb468e6387501c2af376e4 --- ActiveSync/SOGoMailObject+ActiveSync.m | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index 1d74830c6..15e3b1ca7 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -224,9 +224,17 @@ struct GlobalObjectId { while ((key = [e nextObject])) { - // don't use body parts from a nested body - e.g. body of type message/rfc822 - if (![key hasPrefix: @"1"]) + // Don't use body parts from nested bodies if not of type multipart/alternative. - e.g. body of type message/rfc822 + // Use only parts of level 0 or 1. + if ([key countOccurrencesOfString: @"."] > 1) continue; + else if ([key countOccurrencesOfString: @"."] == 1) + { + // Ignore nested parts if the container is not of type multipart/alternative. + part = [self lookupInfoForBodyPart: [[key componentsSeparatedByString: @"."] objectAtIndex:0]]; + if (!([[part valueForKey: @"type"] isEqualToString: @"multipart"] && [[part valueForKey: @"subtype"] isEqualToString: @"alternative"])) + continue; + } part = [self lookupInfoForBodyPart: key]; type = [part valueForKey: @"type"]; From 77917780c81310ab72cc294798a2574cf84d6544 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 1 Apr 2015 08:46:46 -0400 Subject: [PATCH 013/109] (fix) packaging issue on RHEL --- packaging/rhel/sogo.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/rhel/sogo.spec b/packaging/rhel/sogo.spec index 33afa3f1a..02bf547ce 100644 --- a/packaging/rhel/sogo.spec +++ b/packaging/rhel/sogo.spec @@ -417,7 +417,7 @@ fi # ********************************* changelog ************************* %changelog -* Thu Mar 31 2015. Inverse inc. +* Thu Mar 31 2015 Inverse inc. - Change script start sogod for systemd * Wed Oct 8 2014 Inverse inc. From e2c3259b164d16c4ae4cbe4aa14914d071e9c80a Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Wed, 1 Apr 2015 20:10:52 -0400 Subject: [PATCH 014/109] [fix] Issues with freebusy in attendees editor --- UI/WebServerResources/JavascriptAPIExtensions.js | 6 +++--- UI/WebServerResources/UIxAttendeesEditor.js | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/UI/WebServerResources/JavascriptAPIExtensions.js b/UI/WebServerResources/JavascriptAPIExtensions.js index 0ee1b6b1e..245078268 100644 --- a/UI/WebServerResources/JavascriptAPIExtensions.js +++ b/UI/WebServerResources/JavascriptAPIExtensions.js @@ -119,7 +119,7 @@ Date.prototype.clone = function() { newDate.setTime(this.getTime()); return newDate; -} +}; Date.prototype.deltaDays = function(otherDate) { var day1 = this.getTime(); @@ -131,7 +131,7 @@ Date.prototype.deltaDays = function(otherDate) { } return Math.round((day2 - day1) / 86400000); -} +}; Date.prototype.daysUpTo = function(otherDate) { var days = new Array(); @@ -248,7 +248,7 @@ Date.prototype.beginOfDay = function() { beginOfDay.setMilliseconds(0); return beginOfDay; -} +}; Date.prototype.beginOfWeek = function() { var offset = firstDayOfWeek - this.getDay(); diff --git a/UI/WebServerResources/UIxAttendeesEditor.js b/UI/WebServerResources/UIxAttendeesEditor.js index be7a854bd..16d297425 100644 --- a/UI/WebServerResources/UIxAttendeesEditor.js +++ b/UI/WebServerResources/UIxAttendeesEditor.js @@ -905,7 +905,7 @@ _freeBusyCacheEntry.prototype = { var adjustedEd = ed.beginOfDay(); var nbrDays = adjustedSd.deltaDays(adjustedEd) + 1; var offsetEnd = offset + (nbrDays * 96); - if (Math.round(this.entries.length/96) >= nbrDays) { + if (Math.round((this.entries.length - offset)/96) >= nbrDays) { entries = this.entries.slice(offset, offsetEnd); } } @@ -942,7 +942,6 @@ _freeBusyCacheEntry.prototype = { // Period extends to after current end if (start.getTime() <= nextDate.getTime()) { start = nextDate.beginOfDay(); - start.addDays(1); } fetchDates.push({ start: start, end: end }); } @@ -960,7 +959,7 @@ _freeBusyCacheEntry.prototype = { if (this.startDate) { if (start.getTime() < this.startDate) { days = start.deltaDays(this.startDate); - if (entries.length == (days * 96)) { + if (Math.round(entries.length/96) == days) { // New period is just before previous period this.startDate = start; this.entries = entries.concat(this.entries); @@ -1131,7 +1130,7 @@ function displayFreeBusyForNode(input) { var rowIndex = input.parentNode.parentNode.sectionRowIndex; var row = $("freeBusyData").tBodies[0].rows[rowIndex]; var nodes = row.cells; - //log ("displayFreeBusyForNode index " + rowIndex + " (" + nodes.length + " cells)"); + //log ("displayFreeBusyForNode index " + rowIndex + " uid " + input.uid + " (" + nodes.length + " cells)"); if (input.uid) { if (!input.hasfreebusy) { // log("forcing draw of nodes"); @@ -1459,10 +1458,11 @@ function onTimeDateWidgetChange() { function prepareTableHeaders() { var startTimeDate = $("startTime_date"); var startDate = startTimeDate.inputAsDate(); + startDate.setHours(0, 0); var endTimeDate = $("endTime_date"); var endDate = endTimeDate.inputAsDate(); - endDate.setTime(endDate.getTime()); + endDate.setHours(0, 0); var rows = $("freeBusyHeader").rows; var days = startDate.daysUpTo(endDate); From 01857a9a47ae11561ab844a8759478f48ee607d3 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Thu, 2 Apr 2015 11:53:03 -0400 Subject: [PATCH 015/109] [fix] Timezone of MS Exchange freebusy information --- NEWS | 3 ++- .../MSExchangeFreeBusySOAPRequest.m | 20 +++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 2a552a6f7..6c559e539 100644 --- a/NEWS +++ b/NEWS @@ -9,7 +9,8 @@ Bug fixes - now keep the BodyPreference for future EAS use and default to MIME if none set (#3146) - EAS reply fix when message/rfc822 parts are included in the original mail (#3153) - fixed yet an other potential crash during freebusy lookups during timezone changes - - fix display of freebusy information in event attendees editor during timezone changes + - fixed display of freebusy information in event attendees editor during timezone changes + - fixed timezone of MSExchange freebusy information - fixed a potential EAS error with multiple email priority flags 2.2.17a (2015-03-15) diff --git a/SoObjects/Appointments/MSExchangeFreeBusySOAPRequest.m b/SoObjects/Appointments/MSExchangeFreeBusySOAPRequest.m index 01c9e8aea..425178b36 100644 --- a/SoObjects/Appointments/MSExchangeFreeBusySOAPRequest.m +++ b/SoObjects/Appointments/MSExchangeFreeBusySOAPRequest.m @@ -70,11 +70,27 @@ to: (NSCalendarDate *) newEndDate { ASSIGN(address, newAddress); - ASSIGN(startDate, newStartDate); - ASSIGN(endDate, newEndDate); + + startDate = [NSCalendarDate dateWithYear: [newStartDate yearOfCommonEra] + month: [newStartDate monthOfYear] + day: [newStartDate dayOfMonth] + hour: [newStartDate hourOfDay] + minute: [newStartDate minuteOfHour] + second: [newStartDate secondOfMinute] + timeZone: [newStartDate timeZone]]; + endDate = [NSCalendarDate dateWithYear: [newEndDate yearOfCommonEra] + month: [newEndDate monthOfYear] + day: [newEndDate dayOfMonth] + hour: [newEndDate hourOfDay] + minute: [newEndDate minuteOfHour] + second: [newEndDate secondOfMinute] + timeZone: [newEndDate timeZone]]; [startDate setTimeZone: timeZone]; [endDate setTimeZone: timeZone]; + + [startDate retain]; + [endDate retain]; } - (NSString *) serverVersion From eae327ca191957ad956be7c750761c341ce599a9 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 7 Apr 2015 08:27:30 -0400 Subject: [PATCH 016/109] [fix] Paragraph margins in HTML message Fixes #3163 --- NEWS | 1 + UI/WebServerResources/MailerUI.css | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 6c559e539..4ee6daf1f 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,7 @@ Bug fixes - fixed display of freebusy information in event attendees editor during timezone changes - fixed timezone of MSExchange freebusy information - fixed a potential EAS error with multiple email priority flags + - fixed paragraphs margins in HTML messages (#3163) 2.2.17a (2015-03-15) -------------------- diff --git a/UI/WebServerResources/MailerUI.css b/UI/WebServerResources/MailerUI.css index abd14f5c8..61c8750b2 100644 --- a/UI/WebServerResources/MailerUI.css +++ b/UI/WebServerResources/MailerUI.css @@ -510,7 +510,6 @@ DIV.mailer_htmlcontent P white-space: normal; font-family: sans-serif; font-size: inherit; - margin: 0px; padding: 0px; } From 755efa789bb2cfdc6f3c056266cbaa9575a91b4e Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Wed, 8 Apr 2015 12:07:28 -0400 Subject: [PATCH 017/109] [fix] initial loading of inbox uids and headers --- NEWS | 1 + UI/WebServerResources/MailerUI.js | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 4ee6daf1f..59fe4397a 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,7 @@ Bug fixes - fixed timezone of MSExchange freebusy information - fixed a potential EAS error with multiple email priority flags - fixed paragraphs margins in HTML messages (#3163) + - fixed regression when loading the inbox for the first time 2.2.17a (2015-03-15) -------------------- diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index 995a11f9c..1941ed32b 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -916,10 +916,11 @@ function openMailbox(mailbox, reload) { dataSource.init(inboxData['uids'], inboxData['threaded'], inboxData['headers'], inboxData['quotas']); inboxData = null; // invalidate this initial lookup } - else + else { // Fetch UIDs and headers from server var content = Object.toJSON(urlParams); dataSource.load(content); + } // Cache data source Mailer.dataSources.set(key, dataSource); // Update unseen count From 1e4596ca3a42bc1e3c64d4c0d075fb7ea09336be Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 8 Apr 2015 14:20:33 -0400 Subject: [PATCH 018/109] (fix) fixed serialization of PreventInvitationsWhitelist --- NEWS | 1 + UI/PreferencesUI/UIxPreferences.m | 14 ++++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 59fe4397a..d888d1a07 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,7 @@ Bug fixes - fixed a potential EAS error with multiple email priority flags - fixed paragraphs margins in HTML messages (#3163) - fixed regression when loading the inbox for the first time + - fixed serialization of the PreventInvitationsWhitelist settings 2.2.17a (2015-03-15) -------------------- diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 6e54bc043..9f55e4166 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -640,15 +640,21 @@ static NSArray *reminderValues = nil; return [userDefaults busyOffHours]; } -- (NSArray *) whiteList +- (NSString *) whiteList { SOGoUserSettings *us; NSMutableDictionary *moduleSettings; - NSArray *whiteList; + id whiteList; us = [user userSettings]; moduleSettings = [us objectForKey: @"Calendar"]; - whiteList = [moduleSettings objectForKey:@"PreventInvitationsWhitelist"]; + whiteList = [moduleSettings objectForKey: @"PreventInvitationsWhitelist"]; + + if (whiteList && [whiteList isKindOfClass: [NSDictionary class]]) + { + whiteList = [whiteList jsonRepresentation]; + } + return whiteList; } @@ -659,7 +665,7 @@ static NSArray *reminderValues = nil; us = [user userSettings]; moduleSettings = [us objectForKey: @"Calendar"]; - [moduleSettings setObject: whiteListString forKey: @"PreventInvitationsWhitelist"]; + [moduleSettings setObject: [whiteListString objectFromJSONString] forKey: @"PreventInvitationsWhitelist"]; [us synchronize]; } From cdc74e498448d701dc8ea9998542effc13d5cb0c Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Thu, 9 Apr 2015 09:06:19 -0400 Subject: [PATCH 019/109] Update translations --- NEWS | 1 + .../Localizable.strings | 2 +- .../Localizable.strings | 2 +- .../Localizable.strings | 16 ++-- .../Localizable.strings | 90 +++++++++---------- .../Localizable.strings | 2 +- .../Localizable.strings | 10 +-- .../NorwegianBokmal.lproj/Localizable.strings | 2 +- .../Localizable.strings | 6 +- .../Localizable.strings | 42 +++++---- .../Dutch.lproj/Localizable.strings | 4 + .../NorwegianBokmal.lproj/Localizable.strings | 10 ++- .../Polish.lproj/Localizable.strings | 4 + .../Russian.lproj/Localizable.strings | 7 ++ .../SpanishSpain.lproj/Localizable.strings | 4 + .../Localizable.strings | 22 ++--- .../English.lproj/Localizable.strings | 3 +- 17 files changed, 130 insertions(+), 97 deletions(-) diff --git a/NEWS b/NEWS index d888d1a07..08b83e687 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,7 @@ Enhancements - improved multipart handling using EAS - added systemd startup script (PR#76) + - updated Brazilian (Portuguese), Dutch, Norwegian (Bokmal), Polish, Russian, and Spanish (Spain) translations Bug fixes - now keep the BodyPreference for future EAS use and default to MIME if none set (#3146) diff --git a/SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings b/SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings index f6117f8ef..5fcb33090 100644 --- a/SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings +++ b/SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings @@ -56,7 +56,7 @@ vtodo_class2 = "(Tarefa Confidencial)"; "%{Attendee} %{SentByText}has accepted your event invitation." = "%{Attendee} %{SentByText}foi aceitado seu convite ao evento."; "%{Attendee} %{SentByText}has declined your event invitation." -= "%{Attendee} %{SentByText}foi declinado seu convite ao evento."; += "%{Attendee} %{SentByText}recusou seu convite para o evento."; "%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}." = "%{Attendee} %{SentByText} delegou o convite para %{Delegate}."; "%{Attendee} %{SentByText}has not yet decided upon your event invitation." diff --git a/SoObjects/Contacts/BrazilianPortuguese.lproj/Localizable.strings b/SoObjects/Contacts/BrazilianPortuguese.lproj/Localizable.strings index 8923eae93..9b2176e92 100644 --- a/SoObjects/Contacts/BrazilianPortuguese.lproj/Localizable.strings +++ b/SoObjects/Contacts/BrazilianPortuguese.lproj/Localizable.strings @@ -1,2 +1,2 @@ -"Personal Address Book" = "Livro de Endereços Pessoais"; +"Personal Address Book" = "Livro de Endereço Pessoal"; "Collected Address Book" = "Catálogos Coletados"; diff --git a/UI/Common/BrazilianPortuguese.lproj/Localizable.strings b/UI/Common/BrazilianPortuguese.lproj/Localizable.strings index dabc4b454..0e6c1db6e 100644 --- a/UI/Common/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/Common/BrazilianPortuguese.lproj/Localizable.strings @@ -94,7 +94,7 @@ "OK" = "OK"; "Cancel" = "Cancelar"; "Yes" = "Sim"; -"No" = "No"; +"No" = "Não"; /* alarms */ "Reminder:" = "Lembrete:"; @@ -109,10 +109,10 @@ "To Do" = "Tarefa"; "Later" = "Adiar"; -"a2_Sunday" = "Do"; -"a2_Monday" = "Se"; -"a2_Tuesday" = "Te"; -"a2_Wednesday" = "Qu"; -"a2_Thursday" = "Qu"; -"a2_Friday" = "Se"; -"a2_Saturday" = "Sa"; +"a2_Sunday" = "Dom"; +"a2_Monday" = "Seg"; +"a2_Tuesday" = "Ter"; +"a2_Wednesday" = "Qua"; +"a2_Thursday" = "Qui"; +"a2_Friday" = "Sex"; +"a2_Saturday" = "Sab"; diff --git a/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings b/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings index 934456c1c..4a09eae65 100644 --- a/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings @@ -1,20 +1,20 @@ /* this file is in UTF-8 format! */ -"Contact" = "Contact"; -"Address" = "Address"; -"Photos" = "Photos"; -"Other" = "Other"; +"Contact" = "Contato"; +"Address" = "Catálogo"; +"Photos" = "Fotos"; +"Other" = "Outros"; -"Address Books" = "Addressbooks"; +"Address Books" = "Catálogo de Endereços"; "Addressbook" = "Catálogo"; -"Addresses" = "Contato"; +"Addresses" = "Endereços"; "Update" = "Atualizar"; "Cancel" = "Cancelar"; "Common" = "Comum"; "Contact editor" = "Editor de Contatos"; "Contact viewer" = "Visualizador de Contatos"; "Email" = "Email"; -"Screen Name" = "Nome Apresentação"; +"Screen Name" = "Nome de Exibição"; "Extended" = "Extendido"; "Fax" = "Fax"; "Firstname" = "Primeiro Nome"; @@ -32,16 +32,16 @@ "Postal" = "CEP"; "Save" = "Salvar"; "Internet" = "Internet"; -"Unit" = "Setor"; +"Unit" = "Unidade"; "delete" = "apagar"; "edit" = "editar"; "invalidemailwarn" = "O email informado é inválido"; "new" = "novo"; "Preferred Phone" = "Telefone Preferencial"; -"Move To" = "Move To"; -"Copy To" = "Copy To"; -"Add to:" = "Add to:"; +"Move To" = "Mover para"; +"Copy To" = "Copiar para"; +"Add to:" = "Adicionar em:"; /* Tooltips */ @@ -50,14 +50,14 @@ "Edit the selected card" = "Edita o contato selecionado"; "Send a mail message" = "Envia uma mensagem de email"; "Delete selected card or address book" = "Apaga o contato ou catálogo selecionado"; -"Reload all contacts" = "Reload all contacts"; +"Reload all contacts" = "Recarregar todos os contatos"; "htmlMailFormat_UNKNOWN" = "Desconhecido"; "htmlMailFormat_FALSE" = "Texto Puro"; "htmlMailFormat_TRUE" = "HTML"; "Name or Email" = "Nome ou Email"; -"Category" = "Category"; +"Category" = "Categoria"; "Personal Addressbook" = "Catálogo Pessoal"; "Search in Addressbook" = "Localizar no Catálogo"; @@ -76,15 +76,15 @@ "No possible subscription" = "Sem possibilidades de inscrição"; "Preferred" = "Preferido"; -"Display:" = "Display:"; +"Display:" = "Exibição:"; "Display Name:" = "Exibir Nome:"; "Email:" = "Endereço de Email:"; -"Additional Email:" = "Additional Email:"; +"Additional Email:" = "Email Adicional:"; -"Phone Number:" = "Phone Number:"; -"Prefers to receive messages formatted as:" = "Prefers to receive messages formatted as:"; -"Screen Name:" = "Screen Name:"; -"Categories:" = "Categories:"; +"Phone Number:" = "Telefone:"; +"Prefers to receive messages formatted as:" = "Prefere receber mensagens formatadas como:"; +"Screen Name:" = "Nome de Exibição:"; +"Categories:" = "Categorias:"; "First:" = "Primeiro Nome:"; "Last:" = "Último Nome:"; @@ -98,22 +98,22 @@ "Pager:" = "Pager:"; /* categories */ -"contacts_category_labels" = "Colleague, Competitor, Customer, Friend, Family, Business Partner, Provider, Press, VIP"; -"Categories" = "Categories"; -"New category" = "New category"; +"contacts_category_labels" = "Colega, Concorrente, Cliente, Amigo, Família, Parceiro de Negócios, Provedor, Press, VIP"; +"Categories" = "Categorias"; +"New category" = "Nova categoria"; /* adresses */ "Title:" = "Título:"; "Service:" = "Serviço:"; "Company:" = "Empresa:"; -"Department:" = "Department:"; -"Organization:" = "Organization:"; +"Department:" = "Departamento"; +"Organization:" = "Organização"; "Address:" = "Endereço:"; "City:" = "Cidade:"; "State_Province:" = "Estado:"; "ZIP_Postal Code:" = "CEP:"; "Country:" = "País:"; -"Web Page:" = "Web Page:"; +"Web Page:" = "Página Web:"; "Work" = "Comercial"; "Other Infos" = "Outras Informações"; @@ -125,7 +125,7 @@ "Freebusy URL:" = "URL Livre/Ocupado:"; "Add as..." = "Adicionar como..."; -"Recipient" = "Recipient"; +"Recipient" = "Destinatário"; "Carbon Copy" = "Cópia Carbono"; "Blind Carbon Copy" = "Cópia Carbono Oculta"; @@ -158,8 +158,8 @@ "Access rights to" = "Direitos de acesso para"; "For user" = "Para usuário"; -"Any Authenticated User" = "Any Authenticated User"; -"Public Access" = "Public Access"; +"Any Authenticated User" = "Qualquer Usuário Autenticado"; +"Public Access" = "Acesso Público"; "This person can add cards to this addressbook." = "Essa pessoa pode adicionar contatos ao meu catálogo."; @@ -185,25 +185,25 @@ "Unknown Destination Folder" = "O catálogo de destino selecionado não existe."; /* Lists */ -"List details" = "List details"; -"List name:" = "List name:"; -"List nickname:" = "List nickname:"; -"List description:" = "List description:"; -"Members" = "Members"; -"Contacts" = "Contacts"; -"Add" = "Add"; -"Lists can't be moved or copied." = "Lists can't be moved or copied."; -"Export" = "Export"; -"Export Address Book..." = "Export Address Book..."; +"List details" = "Detalhes da lista"; +"List name:" = "Lista nome:"; +"List nickname:" = "Lista Apelido:"; +"List description:" = "Lista descrição:"; +"Members" = "Membros"; +"Contacts" = "Contatos"; +"Add" = "Adicionar"; +"Lists can't be moved or copied." = "As listas não podem ser movidos ou copiados."; +"Export" = "Exportar"; +"Export Address Book..." = "Exportar Catálogo de Endereço..."; "View Raw Source" = "Visualizar Fonte"; -"Import Cards" = "Import Cards"; -"Select a vCard or LDIF file." = "Select a vCard or LDIF file."; -"Upload" = "Upload"; +"Import Cards" = "Importar cartões"; +"Select a vCard or LDIF file." = "Selecione um arquivo vCard ou LDIF."; +"Upload" = "Carregar"; "Uploading" = "Carregando"; -"Done" = "Done"; -"An error occured while importing contacts." = "An error occured while importing contacts."; -"No card was imported." = "No card was imported."; -"A total of %{0} cards were imported in the addressbook." = "A total of %{0} cards were imported in the addressbook."; +"Done" = "Pronto"; +"An error occured while importing contacts." = "Ocorreu um erro ao importar contatos."; +"No card was imported." = "Nenhum cartão foi importado."; +"A total of %{0} cards were imported in the addressbook." = "Um total de %{0} cartões foram importados no catálogo de endereços."; "Reload" = "Atualizar"; diff --git a/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings b/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings index d038b316d..94b9e6bec 100644 --- a/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings @@ -10,7 +10,7 @@ you_are_an_attendee = "você é um participante"; add_info_text = "As solicitações iMIP 'ADD' ainda não são suportadas pelo SOGo."; publish_info_text = "O solicitante lhe informa sobre um evento anexo."; cancel_info_text = "Seu convite ou evento foi cancelado."; -request_info_no_attendee = "está propondo um reunião aos participantes. Você está recebendo este email como uma notificação, você não está agendado como um particiopante."; +request_info_no_attendee = "está propondo uma reunião aos participantes. Você está recebendo este email como uma notificação, você não está agendado como um particiopante."; Appointment = "Apontamento"; "Status Update" = "Status da Atualização"; was = "foi"; diff --git a/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings index b07718473..92af97fe0 100644 --- a/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings @@ -26,7 +26,7 @@ /* Tooltips */ "Send this message now" = "Envia esta mensagem agora"; -"Select a recipient from an Address Book" = "Seleciona um destinatário de a partir de um Catálogo"; +"Select a recipient from an Address Book" = "Seleciona um destinatário de catálogo de endereços"; "Include an attachment" = "Inclui um anexo"; "Save this message" = "Salva esta mensagem"; "Get new messages" = "Receber novas mensagens"; @@ -95,7 +95,7 @@ "Subject" = "Assunto"; "To" = "Para"; "Cc" = "Cc"; -"Bcc" = "Bcc"; +"Bcc" = "Cco"; "Reply-To" = "Responder-Para"; "Add address" = "Adicionar endereço"; "Body" = "Corpo"; @@ -109,7 +109,7 @@ "to" = "Para"; "cc" = "Cc"; -"bcc" = "Bcc"; +"bcc" = "Cco"; "Edit Draft..." = "Editar Rascunho..."; "Load Images" = "Carregar Imagens"; @@ -180,7 +180,7 @@ /* Address Popup menu */ "Add to Address Book..." = "Adicionar ao Catálogo..."; -"Compose Mail To" = "Escrever Mensagem Parana"; +"Compose Mail To" = "Escrever Mensagem Para"; "Create Filter From Message..." = "Criar Filtro Da Mensagem..."; /* Image Popup menu */ @@ -261,7 +261,7 @@ "Operation failed" = "Falha na Operação"; "Quota" = "Quota:"; -"quotasFormat" = "%{0}% usedo em %{1} MB"; +"quotasFormat" = "%{0}% usado em %{1} MB"; "Please select a message." = "Por favor, selecione uma mensagem."; "Please select a message to print." = "Por favor, selecione a mensagem para imprimir."; diff --git a/UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings b/UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings index c389d4c13..e2f6937d9 100644 --- a/UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings +++ b/UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings @@ -17,7 +17,7 @@ "Send" = "Send"; "Contacts" = "Kontakter"; -"Attach" = "Vedlegg ved"; +"Attach" = "Vedlegg"; "Save" = "Lagre"; "Options" = "Innstillinger"; "Close" = "Lukk"; diff --git a/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings index 4bc1a21ca..0f8f74599 100644 --- a/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings @@ -10,7 +10,7 @@ "Connect" = "Conectar"; "Wrong username or password." = "Usuário ou Senha Inválido."; -"cookiesNotEnabled" = "Você não pode logar por a opção cookies está desabilitada. Por favor, habilite os cookies nas configurações de seu navegador e tente novamente."; +"cookiesNotEnabled" = "Você não pode logar porque a opção cookies está desabilitada. Por favor, habilite os cookies nas configurações de seu navegador e tente novamente."; "browserNotCompatible" = "Foi detectado que a atual versão de seu navegador não é suportado neste site. Recomentamos que use o Firefox. Clique no link abaixo para baixar a versão atual deste navegador."; "alternativeBrowsers" = "Alternativamente, você pode usar os seguinte navegadores compatíveis"; @@ -44,7 +44,7 @@ "Welsh" = "Cymraeg"; "About" = "Sobre"; -"AboutBox" = "Developed by Inverse, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.

⏎ \nSOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.

⏎ \nSOGo is distributed under the GNU GPL version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

⏎ \nSee this page for various support options."; +"AboutBox" = "Desenvolvido por Inverse, Sogo é um servidor de groupware cheio de recursos com foco em escalabilidade e simplicidade.\nSogo fornece uma interface Web baseada em AJAX ricos e suporta vários clientes nativos através da utilização de protocolos padrão como CalDAV e CardDAV.\nSogo é distribuído sob a GNU GPL versão 2 ou posterior e as partes são distribuídos sob a GNU LGPL versão 2. Este é um software livre: você é livre para mudar e redistribuí-lo. Não há NENHUMA GARANTIA, até o limite permitido por lei.\nVeja desta página para várias opções de suporte."; "Your account was locked due to too many failed attempts." = "Sua conta foi bloqueada devido a muitas tentativas fracassadas."; "Your account was locked due to an expired password." = "Sua conta foi bloqueada devido a uma senha expirada."; @@ -67,7 +67,7 @@ "Password change failed - Insufficient password quality" = "Alteração da senha falhou - Senha muito fraca"; "Password change failed - Password is too short" = "Alteração da senha falhou - Senha muito curta"; "Password change failed - Password is too young" = "Alteração da senha falhou - Senha usada recentemente"; -"Password change failed - Password is in history" = "Password is too young - Senha está no histórico"; +"Password change failed - Password is in history" = "Alteração de senha falhou - Password está no histórico"; "Unhandled policy error: %{0}" = "Política de erro não tratada: %{0}"; "Unhandled error response" = "Erro de resposta não tratado"; "Password change is not supported." = "Alteração da senha não suportada."; diff --git a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings index 01dc12d01..77db2492b 100644 --- a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings @@ -23,12 +23,13 @@ /* vacation (auto-reply) */ "Enable vacation auto reply" = "Habilitar auto resposta de férias"; -"Auto reply message :" = "AutoResponder somente uma vez a cada remetente com o seguinte texto :"; +"Auto reply message :" = "Auto Responder somente uma vez a cada remetente com o seguinte texto:"; "Email addresses (separated by commas) :" = "Endereço de e-mail (separado por vírgulas):"; "Add default email addresses" = "Adicionar endereço de e-mail padrão"; "Days between responses :" = "Dias entre respostas:"; "Do not send responses to mailing lists" = "Não envie respostas para lista de e-mails"; "Disable auto reply on" = "Desativar resposta automática em"; +"Always send vacation message response" = "Sempre enviar resposta de mensagem de férias"; "Please specify your message and your email addresses for which you want to enable auto reply." = "Favor especificar a sua mensagem e seus endereços de e-mail para o qual você deseja ativar resposta automática."; "Your vacation message must not end with a single dot on a line." = "Sua mensagem de férias não deve terminar com um ponto único em uma linha."; @@ -40,9 +41,12 @@ "Keep a copy" = "Manter uma cópia"; "Please specify an address to which you want to forward your messages." = "Favor especificar um endereço para o qual você deseja encaminhar suas mensagens."; +"You are not allowed to forward your messages to an external email address." = "Você não tem permissão para transmitir a sua mensagem para um endereço de e-mail externo."; +"You are not allowed to forward your messages to an internal email address." = "Você não tem permissão para transmitir a sua mensagem para um endereço de e-mail interno."; + /* d & t */ -"Current Time Zone :" = "Fuso Horário :"; +"Current Time Zone :" = "Fuso Horário:"; "Short Date Format :" = "Formato da Data (Curto) :"; "Long Date Format :" = "Formato da Data (Longo) :"; "Time Format :" = "Formato da Hora :"; @@ -170,7 +174,7 @@ "User Name:" = "Nome do Usuário:"; "Password:" = "Senha:"; -"Full Name:" = "Nome Compelto:"; +"Full Name:" = "Nome Completo:"; "Email:" = "E-mail:"; "Reply To Email:" = "Responder para o Email:"; "Signature:" = "Assinatura:"; @@ -207,7 +211,7 @@ "Mail" = "Correio"; "Last" = "Último usado"; "Default Module :" = "Módulo Padrão:"; -"SOGo Version :" = "Versão SOGo:"; +"SOGo Version :" = "Versão do SOGo:"; "Language :" = "Idioma :"; "choose" = "Escolha ..."; @@ -283,7 +287,7 @@ "Header" = "Cabeçalho"; "Body" = "Corpo"; "Flag the message with:" = "Marcar a mensagem com:"; -"Discard the message" = "Discate a mensagem"; +"Discard the message" = "Descarte a mensagem"; "File the message in:" = "Arquivo da mensagem em:"; "Keep the message" = "Manter a mensagem"; "Forward the message to:" = "Encaminhar a mensagem para:"; @@ -293,7 +297,7 @@ "is under" = "abaixo"; "is over" = "acima"; -"is" = "is"; +"is" = "é igual"; "is not" = "não é"; "contains" = "contem"; "does not contain" = "não contem"; @@ -307,19 +311,19 @@ "Answered" = "Respondido"; "Flagged" = "Marcado"; "Junk" = "Lixo"; -"Not Junk" = "Não é Lixo"; +"Not Junk" = "Não é Lixo Eletrônico"; /* Password policy */ "The password was changed successfully." = "Senha alterada com sucesso."; -"Password must not be empty." = "Le mot de passe ne doit pas être vide."; -"The passwords do not match. Please try again." = "Les mots de passe ne sont pas identiques. Essayez de nouveau."; -"Password change failed" = "Échec au changement"; -"Password change failed - Permission denied" = "Échec au changement - mauvaises permissions"; -"Password change failed - Insufficient password quality" = "Échec au changement - qualité insuffisante"; -"Password change failed - Password is too short" = "Échec au changement - mot de passe trop court"; -"Password change failed - Password is too young" = "Échec au changement - mot de passe trop récent"; -"Password change failed - Password is in history" = "Échec au changement - mot de passe dans l'historique"; -"Unhandled policy error: %{0}" = "Erreur inconnue pour le ppolicy: %{0}"; -"Unhandled error response" = "Erreur inconnue"; -"Password change is not supported." = "Changement de mot de passe non-supporté."; -"Unhandled HTTP error code: %{0}" = "Code HTTP non-géré: %{0}"; +"Password must not be empty." = "A Senha não pode ser vazia."; +"The passwords do not match. Please try again." = "As senhas não coincidem. Por favor, tente novamente."; +"Password change failed" = "Alteração de senha falhou"; +"Password change failed - Permission denied" = "Alteração de senha falhou - Permissão Negada"; +"Password change failed - Insufficient password quality" = "Alteração de senha falhou pois não atende os requisitos minímos"; +"Password change failed - Password is too short" = "Alteração de senha falhou - Senha muito curta"; +"Password change failed - Password is too young" = "Alteração de senha falhou - Senha alterada recentemente"; +"Password change failed - Password is in history" = "Alteração de senha falhou - A Senha já foi utilizada"; +"Unhandled policy error: %{0}" = "Erro de política não tratada: %{0}"; +"Unhandled error response" = "Resposta de erro não tratada"; +"Password change is not supported." = "Troca de senha não suportada"; +"Unhandled HTTP error code: %{0}" = "Código de erro HTTP não tratada: %{0}"; diff --git a/UI/PreferencesUI/Dutch.lproj/Localizable.strings b/UI/PreferencesUI/Dutch.lproj/Localizable.strings index f4fe086f4..89a6ad964 100644 --- a/UI/PreferencesUI/Dutch.lproj/Localizable.strings +++ b/UI/PreferencesUI/Dutch.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Days between responses :" = "Dagen tussen reacties:"; "Do not send responses to mailing lists" = "Geen reacties naar maillinglijsten sturen"; "Disable auto reply on" = "Automatisch bericht bij afwezigheid uitschakelen op"; +"Always send vacation message response" = "Afwezigheidsbericht altijd versturen"; "Please specify your message and your email addresses for which you want to enable auto reply." = "Geeft u alstublieft de tekst van het automatische bericht bij afwezigheid op en de e-mailadressen waarvoor het moet worden geactiveerd."; "Your vacation message must not end with a single dot on a line." = "Uw automatisch bericht bij afwezigheid mag niet eindigen met een enkele punt op een regel."; @@ -40,6 +41,9 @@ "Keep a copy" = "Kopie bewaren"; "Please specify an address to which you want to forward your messages." = "Alstublieft het e-mailadres waarnaar u de berichten wilt laten doorsturen aangeven."; +"You are not allowed to forward your messages to an external email address." = "Email naar een extern emailadres doorsturen is niet toegestaan"; +"You are not allowed to forward your messages to an internal email address." = "Email naar een intern emailadres doorsturen is niet toegestaan"; + /* d & t */ "Current Time Zone :" = "Huidige tijdzone:"; diff --git a/UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings b/UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings index 17be0b3fa..c1f59838d 100644 --- a/UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings +++ b/UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings @@ -12,6 +12,7 @@ "Forward" = "Videresend"; "Password" = "Passord"; "Categories" = "Kategorier"; +"Appointments invitations" = "Avtale varslinger"; "Name" = "Navn"; "Color" = "Farge"; "Add" = "Legg til"; @@ -28,6 +29,7 @@ "Days between responses :" = "Dager mellom svar:"; "Do not send responses to mailing lists" = "Ikke send svar til e-postlister"; "Disable auto reply on" = "Skru av auto-svar"; +"Always send vacation message response" = "Alltid send ferie melding"; "Please specify your message and your email addresses for which you want to enable auto reply." = "Skriv melding og angi din e-postadresse som du vil aktivere auto-svar for."; "Your vacation message must not end with a single dot on a line." = "Fraværsmeldingen kan ikke slutte med ett ensomt punktum på en linje. "; @@ -39,6 +41,9 @@ "Keep a copy" = "Behold en kopi"; "Please specify an address to which you want to forward your messages." = "Angi adressen du vil videresende dine meldinger til."; +"You are not allowed to forward your messages to an external email address." = "Du har ikke lov til å videresende mail til en ekstern e-mail addresse."; +"You are not allowed to forward your messages to an internal email address." = "Du har ikke love til å videresende mail til en ekstern e-mail addresse."; + /* d & t */ "Current Time Zone :" = "Gjeldende tidssone:"; @@ -137,7 +142,7 @@ "Forward messages:" = "Videresend meldinger:"; "messageforward_inline" = "Innsatt"; -"messageforward_attached" = "Vedlegg"; +"messageforward_attached" = "Som Vedlegg"; "When replying to a message:" = "Ved svar på melding: "; "replyplacement_above" = "Start svaret ovenfor"; @@ -152,6 +157,9 @@ "displayremoteinlineimages_never" = "Aldri"; "displayremoteinlineimages_always" = "Alltid"; +"Auto save every" = "Lagre automatisk"; +"minutes" = "minutter"; + /* Contact */ "Personal Address Book" = "Personlig addressebok"; "Collected Address Book" = "Samlet addressebok"; diff --git a/UI/PreferencesUI/Polish.lproj/Localizable.strings b/UI/PreferencesUI/Polish.lproj/Localizable.strings index 9936e5a4c..e432f9182 100644 --- a/UI/PreferencesUI/Polish.lproj/Localizable.strings +++ b/UI/PreferencesUI/Polish.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Days between responses :" = "Dni pomiędzy odpowiedziami :"; "Do not send responses to mailing lists" = "Nie wysyłaj odpowiedzi do grup pocztowych"; "Disable auto reply on" = "Zablokuj autoodpowiedź w"; +"Always send vacation message response" = "Zawsze wysyłaj autoodpowiedź"; "Please specify your message and your email addresses for which you want to enable auto reply." = "Podaj treść wiadomości i twoje adresy e-mail, dla których chcesz włączyć autoodpowiedź."; "Your vacation message must not end with a single dot on a line." = "Twoja wiadomość nie może kończyć się kropką w pustej linii."; @@ -40,6 +41,9 @@ "Keep a copy" = "Zatrzymaj kopię"; "Please specify an address to which you want to forward your messages." = "Podaj adres, na który chcesz przekazywać wiadomości."; +"You are not allowed to forward your messages to an external email address." = "Nie masz uprawnień do przesyłania dalej swoich wiadomości na zewnętrzny adres e-mail."; +"You are not allowed to forward your messages to an internal email address." = "Nie masz uprawnień do przesyłania dalej swoich wiadomości na wewnętrzny adres e-mail."; + /* d & t */ "Current Time Zone :" = "Bieżąca strefa czasowa :"; diff --git a/UI/PreferencesUI/Russian.lproj/Localizable.strings b/UI/PreferencesUI/Russian.lproj/Localizable.strings index 0dc61be59..59dc0c09e 100644 --- a/UI/PreferencesUI/Russian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Russian.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Days between responses :" = "Дни между ответами :"; "Do not send responses to mailing lists" = "Не отправлять ответы на почтовые списки рассылки"; "Disable auto reply on" = "Запрет автоответа включен"; +"Always send vacation message response" = "Всегда отправлять ответное сообщение об отпуске"; "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." = "Ваше сообщение о верменном отсутсвии не должно оканчиваться строкой с одиночной точкой."; @@ -40,6 +41,9 @@ "Keep a copy" = "Оставлять копию"; "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 internal email address." = "Вы не можете пересылать свои сообщения на внутренний адрес электронной почты."; + /* d & t */ "Current Time Zone :" = "Текущая временная зона :"; @@ -153,6 +157,9 @@ "displayremoteinlineimages_never" = "Никогда"; "displayremoteinlineimages_always" = "Всегда"; +"Auto save every" = "Автосохранение каждые"; +"minutes" = "минут"; + /* Contact */ "Personal Address Book" = "Личная адресная книга"; "Collected Address Book" = "Собранные адреса"; diff --git a/UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings b/UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings index 7a5eb414a..55d72d435 100644 --- a/UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings +++ b/UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings @@ -29,6 +29,7 @@ "Days between responses :" = "Dias entre respuestas :"; "Do not send responses to mailing lists" = "No enviar respuestas a las listas de distribución"; "Disable auto reply on" = "Desactivar respuesta automatica"; +"Always send vacation message response" = "Siempre enviar mensaje de vacaciones"; "Please specify your message and your email addresses for which you want to enable auto reply." = "Por favor, especificar el mensaje y la dirección de correo para aquellos a los que quiere habilitar la respuesta automática."; "Your vacation message must not end with a single dot on a line." = "El mensaje de vacaciones no puede finalizarse con un único punto en una linea."; @@ -40,6 +41,9 @@ "Keep a copy" = "Guardar una copia"; "Please specify an address to which you want to forward your messages." = "Por favor, especificar una dirección para aquellos mensajes que quiere desviar."; +"You are not allowed to forward your messages to an external email address." = "No esta autorizado a reenviar sus mensajes a una dirección de correo externa."; +"You are not allowed to forward your messages to an internal email address." = "No esta autorizado a reenviar sus mensajes a una dirección de correo interna."; + /* d & t */ "Current Time Zone :" = "Zona horaria actual :"; diff --git a/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings b/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings index 3c5891e81..b3686c62f 100644 --- a/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings @@ -7,7 +7,7 @@ "Edit this event or task" = "Editar este evento ou tarefa"; "Print the current calendar view" = "Imprimir a visualização do calendário atual"; "Delete this event or task" = "Apagar este evento ou tarefa"; -"Go to today" = "Vai para hoje"; +"Go to today" = "Ir para Hoje"; "Switch to day view" = "Visualizar Dia"; "Switch to week view" = "Visualizar Semana"; "Switch to month view" = "Visualizar Mês"; @@ -129,7 +129,7 @@ "Update" = "Atualizar"; "Cancel" = "Cancelar"; "show_rejected_apts" = "Exibir apontamentos rejeitados"; -"hide_rejected_apts" = "Ocultar apontamentos rejeitados"; +"hide_rejected_apts" = "Ocultar compromissos rejeitados"; /* Schedule */ @@ -144,7 +144,7 @@ "decline" = "Declinar"; "more attendees" = "Mais Participantes"; "Hide already accepted and rejected appointments" = "Ocultar apontamentos já aceitos e rejeitados"; -"Show already accepted and rejected appointments" = "Exibir apontamentos já aceitos e rejeitados"; +"Show already accepted and rejected appointments" = "Exibir compromissos já aceitos e rejeitados"; /* Print view */ @@ -163,10 +163,10 @@ /* Appointments */ -"Appointment viewer" = "Visualizador de Apontamentos"; -"Appointment editor" = "Editor de Apontamento"; -"Appointment proposal" = "Apontamento Proposto"; -"Appointment on" = "Apontamento em"; +"Appointment viewer" = "Visualizador de Compromissos"; +"Appointment editor" = "Editor de Compromisso"; +"Appointment proposal" = "Compromisso Proposto"; +"Appointment on" = "Compromisso em"; "Start:" = "Inicio:"; "End:" = "Fim:"; "Due Date:" = "Data:"; @@ -210,7 +210,7 @@ "Private" = "Privado"; /* text used in overviews and tooltips */ "empty title" = "Título Vazio"; -"private appointment" = "Apontamento privado"; +"private appointment" = "Compromisso privado"; "Change..." = "Alterar..."; @@ -331,7 +331,7 @@ "cycle_of" = "de"; "No end date" = "Sem data final"; "Create" = "Criar"; -"appointment(s)" = "apontamento(s)"; +"appointment(s)" = "compromisso(s)"; "Repeat until" = "Repetir até"; "First" = "Primeiro"; @@ -429,7 +429,7 @@ validate_endbeforestart = "A data que você informou ocorre antes da data ini /* menu */ "New Event..." = "Novo Evento..."; -"New Task..." = "Neva Tarefa..."; +"New Task..." = "Nova Tarefa"; "Edit Selected Event..." = "Editar o Evento Selecionado..."; "Delete Selected Event" = "Apagar o Evento Selecionado"; "Select All" = "Selecionar Tudo"; @@ -471,7 +471,7 @@ validate_endbeforestart = "A data que você informou ocorre antes da data ini "Work days only" = "Somente dias de trabalho"; "The whole day" = "O dia inteiro"; "Between" = "Entre"; -"and" = "and"; +"and" = "e"; "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" = "Existe um conflito de tempo com um ou mais participantes.\nGostaria de manter as configurações atuais?"; diff --git a/UI/Scheduler/English.lproj/Localizable.strings b/UI/Scheduler/English.lproj/Localizable.strings index 321198ea8..4bb62c42b 100644 --- a/UI/Scheduler/English.lproj/Localizable.strings +++ b/UI/Scheduler/English.lproj/Localizable.strings @@ -325,9 +325,11 @@ "Week(s)" = "Week(s)"; "On" = "On"; "Month(s)" = "Month(s)"; +/* [Event recurrence editor] Ex: _The_ first Sunday */ "The" = "The"; "Recur on day(s)" = "Recur on day(s)"; "Year(s)" = "Year(s)"; +/* [Event recurrence editor] Ex: Every first Sunday _of_ April */ "cycle_of" = "of"; "No end date" = "No end date"; "Create" = "Create"; @@ -548,7 +550,6 @@ vtodo_class2 = "(Confidential task)"; "EventCopyError" = "The copy failed. Please try to copy to a difference calendar."; "Please select at least one calendar" = "Please select at least one calendar"; - "Open Task..." = "Open Task..."; "Mark Completed" = "Mark Completed"; "Delete Task" = "Delete Task"; From 8706443685ff3cb4e71d79e08204e826698db597 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20Garc=C3=ADa?= Date: Wed, 15 Apr 2015 16:10:03 +0200 Subject: [PATCH 020/109] Prepare for 2.2.17a-zentyal1 --- NEWS | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/NEWS b/NEWS index 2a8958ee1..4bc7d920a 100644 --- a/NEWS +++ b/NEWS @@ -1,24 +1,7 @@ -2.2.15-zentyal3 (2015-04-14) ------- +2.2.17a-zentyal1 (2014-04-15) +-------------------- -New features - - Internet headers are now shown in Outlook - -Enhancements - - Sharing request among different Outlook versions - - Improve sync speed from Outlook by non-reprocessing already downloaded unread mails - -Bug fixes - - Sent mails are not longer in Drafts folder using Outlook - - Deleted mails are properly synced between Outlook profiles from the same account - - Does not create a mail folder in other user's mailbox - - Fix server-side crash with invalid events - - Fix setting permissions for a folder with several users - - Fix reception of calendar event invitations on optional attendees - - Fix server side crash parsing rtf without color table - - Weekly recurring events created in SOGo web interface are now shown in Outlook - - Fix exception modifications import in recurrence series - - Fix server side crash parsing rtf emails with images (with word97 format) +Zentyal Release 2.2.17a (2014-03-15) -------------------- @@ -79,6 +62,28 @@ Bug fixes - 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-zentyal3 (2015-04-14) +------ + +New features + - Internet headers are now shown in Outlook + +Enhancements + - Sharing request among different Outlook versions + - Improve sync speed from Outlook by non-reprocessing already downloaded unread mails + +Bug fixes + - Sent mails are not longer in Drafts folder using Outlook + - Deleted mails are properly synced between Outlook profiles from the same account + - Does not create a mail folder in other user's mailbox + - Fix server-side crash with invalid events + - Fix setting permissions for a folder with several users + - Fix reception of calendar event invitations on optional attendees + - Fix server side crash parsing rtf without color table + - Weekly recurring events created in SOGo web interface are now shown in Outlook + - Fix exception modifications import in recurrence series + - Fix server side crash parsing rtf emails with images (with word97 format) + 2.2.15-zentyal2 (2015-03-16) ---------------------------- From 6b3454376eee8f81f023f91dc982c5d40f48e76f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20Garc=C3=ADa?= Date: Thu, 16 Apr 2015 09:55:22 +0200 Subject: [PATCH 021/109] Revert "configure: Fix gnulib/crypto/md4 dependency" This reverts commit f0a3fdae5bdfa242d8b4a6b01025195c0eb4a620. --- SoObjects/SOGo/.gitignore | 2 -- SoObjects/SOGo/GNUmakefile.preamble | 2 -- configure | 39 ----------------------------- 3 files changed, 43 deletions(-) delete mode 100644 SoObjects/SOGo/.gitignore diff --git a/SoObjects/SOGo/.gitignore b/SoObjects/SOGo/.gitignore deleted file mode 100644 index 8fa5151fd..000000000 --- a/SoObjects/SOGo/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -config.h -md4.c diff --git a/SoObjects/SOGo/GNUmakefile.preamble b/SoObjects/SOGo/GNUmakefile.preamble index 8a484d3a1..b7456f8bd 100644 --- a/SoObjects/SOGo/GNUmakefile.preamble +++ b/SoObjects/SOGo/GNUmakefile.preamble @@ -30,8 +30,6 @@ SOGo_LIBRARIES_DEPEND_UPON += \ ifeq ($(HAS_LIBRARY_gnutls),yes) ADDITIONAL_CPPFLAGS += -DHAVE_GNUTLS=1 SOGo_LIBRARIES_DEPEND_UPON += -lgnutls -ADDITIONAL_INCLUDE_DIRS += -I$(GNULIB_INCLUDE) -SOGo_C_FILES += $(GNULIB_FILES) else ifeq ($(HAS_LIBRARY_ssl),yes) ADDITIONAL_CPPFLAGS += -DHAVE_OPENSSL=1 diff --git a/configure b/configure index 0a3acdc06..94d933fe7 100755 --- a/configure +++ b/configure @@ -374,41 +374,6 @@ EOF return $LINK_RESULT } - -# gnulib requires autoconf https://www.gnu.org/software/gnulib/manual/html_node/Initial-import.html -# We only require crypyo/md4 module (no dependencies, two files) when using gnutls -# Workaround: copy manually the files to the project needed (md4.c) -# Really ugly but it works, glad to change this to better alternative. -gnulib_dir=/usr/share/gnulib/lib - -checkGnulib() { - if test ! -d $gnulib_dir; then - echo "When using --with-ssl=gnutls option gnulib package is required to be installed in $gnulib_dir" - exit 1 - fi - cfgwrite "GNULIB_INCLUDE := $gnulib_dir" -} - -gnulibMd4() { - local source_files="md4.c" - local local_gnulib_dir="SoObjects/SOGo" - - for source_file in $source_files; do - if test -f $gnulib_dir/$source_file; then - cp $gnulib_dir/$source_file $local_gnulib_dir - else - echo "Error with gnulib file $source_file, gnulib package not installed?" - exit 1 - fi - done - - # md4.c requires config.h, create empty one - touch $local_gnulib_dir/config.h - - cfgwrite "GNULIB_FILES := $source_files" -} -# End of gnulib stuff - checkDependencies() { cfgwrite "BASE_LIBS := `gnustep-config --base-libs`" if test "x$ARG_ENABLE_SAML2" = "x1"; then @@ -424,15 +389,11 @@ checkDependencies() { checkLinking "ssl" optional; if test $? != 0; then checkLinking "gnutls" optional; - checkGnulib - gnulibMd4 fi; elif test "x$ARG_CFGSSL" = "xssl"; then checkLinking "ssl" required; elif test "x$ARG_CFGSSL" = "xgnutls"; then checkLinking "gnutls" required; - checkGnulib - gnulibMd4 fi } From cdb608551018fe6de9696393cd4b021cfe46dd7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20Garc=C3=ADa?= Date: Thu, 16 Apr 2015 09:55:32 +0200 Subject: [PATCH 022/109] Revert "Adding missing build dependency gnulib" This reverts commit 210053ea20ef9b803b7486e700576bc33e70330f. --- SoObjects/SOGo/NSData+Crypto.m | 1 - packaging/debian/control | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/SoObjects/SOGo/NSData+Crypto.m b/SoObjects/SOGo/NSData+Crypto.m index b449664e2..d869f9b68 100644 --- a/SoObjects/SOGo/NSData+Crypto.m +++ b/SoObjects/SOGo/NSData+Crypto.m @@ -39,7 +39,6 @@ #include #include #include -#include #define MD4_DIGEST_LENGTH 16 #define MD5_DIGEST_LENGTH 16 #define SHA_DIGEST_LENGTH 20 diff --git a/packaging/debian/control b/packaging/debian/control index cbe90d8e4..ceee29543 100644 --- a/packaging/debian/control +++ b/packaging/debian/control @@ -1,7 +1,7 @@ Source: sogo Priority: optional Maintainer: Inverse Support -Build-Depends: debhelper (>= 7.0.15), gobjc | objc-compiler, libgnustep-base-dev, libsope-appserver4.9-dev, libsope-core4.9-dev, libsope-gdl1-4.9-dev, libsope-ldap4.9-dev, libsope-mime4.9-dev, libsope-xml4.9-dev, libmemcached-dev, libxml2-dev, libsbjson-dev, libssl-dev, libcurl4-openssl-dev | libcurl4-gnutls-dev, libwbxml2-dev (>= 0.11.2), liblasso3-dev (>= 2.3.5), gnulib +Build-Depends: debhelper (>= 7.0.15), gobjc | objc-compiler, libgnustep-base-dev, libsope-appserver4.9-dev, libsope-core4.9-dev, libsope-gdl1-4.9-dev, libsope-ldap4.9-dev, libsope-mime4.9-dev, libsope-xml4.9-dev, libmemcached-dev, libxml2-dev, libsbjson-dev, libssl-dev, libcurl4-openssl-dev | libcurl4-gnutls-dev, libwbxml2-dev (>= 0.11.2), liblasso3-dev (>= 2.3.5) Section: web Standards-Version: 3.9.1 From a7306a77cb3db91ebef22771b9fd5e69f0ed22b0 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Thu, 16 Apr 2015 15:27:55 -0400 Subject: [PATCH 023/109] (fix) JavaScript error when saving preferences The error was occuring when the user enabled forwarding but no domains constraints were defined in the SOGo's configuration. --- UI/WebServerResources/UIxPreferences.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UI/WebServerResources/UIxPreferences.js b/UI/WebServerResources/UIxPreferences.js index 8b1f59f9d..bf6a503f5 100644 --- a/UI/WebServerResources/UIxPreferences.js +++ b/UI/WebServerResources/UIxPreferences.js @@ -77,9 +77,9 @@ function savePreferences(sender) { 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); + var constraints = (typeof forwardConstraints != "undefined") && parseInt(forwardConstraints); if (constraints > 0) { // We first extract the list of 'known domains' to SOGo From beb666bc5f995e81c3cf56925038a780ad80e7f4 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 17 Apr 2015 09:29:49 -0400 Subject: [PATCH 024/109] (fix) fixed md4 support (for NTLM password changes) with GNU TLS --- NEWS | 1 + SoObjects/SOGo/GNUmakefile | 2 +- SoObjects/SOGo/GNUmakefile.preamble | 1 + SoObjects/SOGo/NSData+Crypto.m | 3 + SoObjects/SOGo/md4.c | 383 ++++++++++++++++++++++++++++ SoObjects/SOGo/md4.h | 91 +++++++ 6 files changed, 480 insertions(+), 1 deletion(-) create mode 100644 SoObjects/SOGo/md4.c create mode 100644 SoObjects/SOGo/md4.h diff --git a/NEWS b/NEWS index 08b83e687..0e2955da5 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,7 @@ Bug fixes - fixed paragraphs margins in HTML messages (#3163) - fixed regression when loading the inbox for the first time - fixed serialization of the PreventInvitationsWhitelist settings + - fixed md4 support (for NTLM password changes) with GNU TLS 2.2.17a (2015-03-15) -------------------- diff --git a/SoObjects/SOGo/GNUmakefile b/SoObjects/SOGo/GNUmakefile index 4e506d166..40e19725b 100644 --- a/SoObjects/SOGo/GNUmakefile +++ b/SoObjects/SOGo/GNUmakefile @@ -159,7 +159,7 @@ SOGo_OBJC_FILES = \ \ SOGoCredentialsFile.m -SOGo_C_FILES = lmhash.c +SOGo_C_FILES += lmhash.c SOGo_RESOURCE_FILES = \ SOGoDefaults.plist \ diff --git a/SoObjects/SOGo/GNUmakefile.preamble b/SoObjects/SOGo/GNUmakefile.preamble index b7456f8bd..24d3493e6 100644 --- a/SoObjects/SOGo/GNUmakefile.preamble +++ b/SoObjects/SOGo/GNUmakefile.preamble @@ -30,6 +30,7 @@ SOGo_LIBRARIES_DEPEND_UPON += \ ifeq ($(HAS_LIBRARY_gnutls),yes) ADDITIONAL_CPPFLAGS += -DHAVE_GNUTLS=1 SOGo_LIBRARIES_DEPEND_UPON += -lgnutls +SOGo_C_FILES += md4.c else ifeq ($(HAS_LIBRARY_ssl),yes) ADDITIONAL_CPPFLAGS += -DHAVE_OPENSSL=1 diff --git a/SoObjects/SOGo/NSData+Crypto.m b/SoObjects/SOGo/NSData+Crypto.m index d869f9b68..5e2f3640a 100644 --- a/SoObjects/SOGo/NSData+Crypto.m +++ b/SoObjects/SOGo/NSData+Crypto.m @@ -39,6 +39,7 @@ #include #include #include +#include "md4.h" #define MD4_DIGEST_LENGTH 16 #define MD5_DIGEST_LENGTH 16 #define SHA_DIGEST_LENGTH 20 @@ -53,6 +54,8 @@ #error this module requires either gnutls or openssl #endif +#include "lmhash.h" + #import #import #import "NSData+Crypto.h" diff --git a/SoObjects/SOGo/md4.c b/SoObjects/SOGo/md4.c new file mode 100644 index 000000000..6807a830d --- /dev/null +++ b/SoObjects/SOGo/md4.c @@ -0,0 +1,383 @@ +/* Functions to compute MD4 message digest of files or memory blocks. + according to the definition of MD4 in RFC 1320 from April 1992. + Copyright (C) 1995-1997, 1999-2003, 2005-2006, 2008-2011 Free Software + Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* Adapted by Simon Josefsson from gnulib md5.? and Libgcrypt + cipher/md4.c . */ + +#include + +#include "md4.h" + +#include +#include +#include +#include +#include + +#if USE_UNLOCKED_IO +# include "unlocked-io.h" +#endif + +#ifdef WORDS_BIGENDIAN +# define SWAP(n) \ + (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24)) +#else +# define SWAP(n) (n) +#endif + +#define BLOCKSIZE 32768 +#if BLOCKSIZE % 64 != 0 +# error "invalid BLOCKSIZE" +#endif + +/* This array contains the bytes used to pad the buffer to the next + 64-byte boundary. (RFC 1320, 3.1: Step 1) */ +static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; + + +/* Initialize structure containing state of computation. + (RFC 1320, 3.3: Step 3) */ +void +md4_init_ctx (struct md4_ctx *ctx) +{ + ctx->A = 0x67452301; + ctx->B = 0xefcdab89; + ctx->C = 0x98badcfe; + ctx->D = 0x10325476; + + ctx->total[0] = ctx->total[1] = 0; + ctx->buflen = 0; +} + +/* Copy the 4 byte value from v into the memory location pointed to by *cp, + If your architecture allows unaligned access this is equivalent to + * (uint32_t *) cp = v */ +static inline void +set_uint32 (char *cp, uint32_t v) +{ + memcpy (cp, &v, sizeof v); +} + +/* Put result from CTX in first 16 bytes following RESBUF. The result + must be in little endian byte order. */ +void * +md4_read_ctx (const struct md4_ctx *ctx, void *resbuf) +{ + char *r = resbuf; + set_uint32 (r + 0 * sizeof ctx->A, SWAP (ctx->A)); + set_uint32 (r + 1 * sizeof ctx->B, SWAP (ctx->B)); + set_uint32 (r + 2 * sizeof ctx->C, SWAP (ctx->C)); + set_uint32 (r + 3 * sizeof ctx->D, SWAP (ctx->D)); + + return resbuf; +} + +/* Process the remaining bytes in the internal buffer and the usual + prolog according to the standard and write the result to RESBUF. */ +void * +md4_finish_ctx (struct md4_ctx *ctx, void *resbuf) +{ + /* Take yet unprocessed bytes into account. */ + uint32_t bytes = ctx->buflen; + size_t pad; + + /* Now count remaining bytes. */ + ctx->total[0] += bytes; + if (ctx->total[0] < bytes) + ++ctx->total[1]; + + pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes; + memcpy (&((char*)ctx->buffer)[bytes], fillbuf, pad); + + /* Put the 64-bit file length in *bits* at the end of the buffer. */ + ctx->buffer[(bytes + pad) / 4] = SWAP (ctx->total[0] << 3); + ctx->buffer[(bytes + pad) / 4 + 1] = SWAP ((ctx->total[1] << 3) | + (ctx->total[0] >> 29)); + + /* Process last bytes. */ + md4_process_block (ctx->buffer, bytes + pad + 8, ctx); + + return md4_read_ctx (ctx, resbuf); +} + +/* Compute MD4 message digest for bytes read from STREAM. The + resulting message digest number will be written into the 16 bytes + beginning at RESBLOCK. */ +int +md4_stream (FILE * stream, void *resblock) +{ + struct md4_ctx ctx; + size_t sum; + + char *buffer = malloc (BLOCKSIZE + 72); + if (!buffer) + return 1; + + /* Initialize the computation context. */ + md4_init_ctx (&ctx); + + /* Iterate over full file contents. */ + while (1) + { + /* We read the file in blocks of BLOCKSIZE bytes. One call of the + computation function processes the whole buffer so that with the + next round of the loop another block can be read. */ + size_t n; + sum = 0; + + /* Read block. Take care for partial reads. */ + while (1) + { + n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream); + + sum += n; + + if (sum == BLOCKSIZE) + break; + + if (n == 0) + { + /* Check for the error flag IFF N == 0, so that we don't + exit the loop after a partial read due to e.g., EAGAIN + or EWOULDBLOCK. */ + if (ferror (stream)) + { + free (buffer); + return 1; + } + goto process_partial_block; + } + + /* We've read at least one byte, so ignore errors. But always + check for EOF, since feof may be true even though N > 0. + Otherwise, we could end up calling fread after EOF. */ + if (feof (stream)) + goto process_partial_block; + } + + /* Process buffer with BLOCKSIZE bytes. Note that + BLOCKSIZE % 64 == 0 + */ + md4_process_block (buffer, BLOCKSIZE, &ctx); + } + +process_partial_block:; + + /* Process any remaining bytes. */ + if (sum > 0) + md4_process_bytes (buffer, sum, &ctx); + + /* Construct result in desired memory. */ + md4_finish_ctx (&ctx, resblock); + free (buffer); + return 0; +} + +/* Compute MD4 message digest for LEN bytes beginning at BUFFER. The + result is always in little endian byte order, so that a byte-wise + output yields to the wanted ASCII representation of the message + digest. */ +void * +md4_buffer (const char *buffer, size_t len, void *resblock) +{ + struct md4_ctx ctx; + + /* Initialize the computation context. */ + md4_init_ctx (&ctx); + + /* Process whole buffer but last len % 64 bytes. */ + md4_process_bytes (buffer, len, &ctx); + + /* Put result in desired memory area. */ + return md4_finish_ctx (&ctx, resblock); +} + +void +md4_process_bytes (const void *buffer, size_t len, struct md4_ctx *ctx) +{ + /* When we already have some bits in our internal buffer concatenate + both inputs first. */ + if (ctx->buflen != 0) + { + size_t left_over = ctx->buflen; + size_t add = 128 - left_over > len ? len : 128 - left_over; + + memcpy (&((char*)ctx->buffer)[left_over], buffer, add); + ctx->buflen += add; + + if (ctx->buflen > 64) + { + md4_process_block (ctx->buffer, ctx->buflen & ~63, ctx); + + ctx->buflen &= 63; + /* The regions in the following copy operation cannot overlap. */ + memcpy (ctx->buffer, &((char*)ctx->buffer)[(left_over + add) & ~63], + ctx->buflen); + } + + buffer = (const char *) buffer + add; + len -= add; + } + + /* Process available complete blocks. */ + if (len >= 64) + { +#if !_STRING_ARCH_unaligned +# define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (uint32_t) != 0) + if (UNALIGNED_P (buffer)) + while (len > 64) + { + md4_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx); + buffer = (const char *) buffer + 64; + len -= 64; + } + else +#endif + { + md4_process_block (buffer, len & ~63, ctx); + buffer = (const char *) buffer + (len & ~63); + len &= 63; + } + } + + /* Move remaining bytes in internal buffer. */ + if (len > 0) + { + size_t left_over = ctx->buflen; + + memcpy (&((char*)ctx->buffer)[left_over], buffer, len); + left_over += len; + if (left_over >= 64) + { + md4_process_block (ctx->buffer, 64, ctx); + left_over -= 64; + memcpy (ctx->buffer, &ctx->buffer[16], left_over); + } + ctx->buflen = left_over; + } +} + +/* --- Code below is the primary difference between md5.c and md4.c --- */ + +/* MD4 round constants */ +#define K1 0x5a827999 +#define K2 0x6ed9eba1 + +/* Round functions. */ +#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) +#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define rol(x, n) (((x) << (n)) | ((uint32_t) (x) >> (32 - (n)))) +#define R1(a,b,c,d,k,s) a=rol(a+F(b,c,d)+x[k],s); +#define R2(a,b,c,d,k,s) a=rol(a+G(b,c,d)+x[k]+K1,s); +#define R3(a,b,c,d,k,s) a=rol(a+H(b,c,d)+x[k]+K2,s); + +/* Process LEN bytes of BUFFER, accumulating context into CTX. + It is assumed that LEN % 64 == 0. */ + +void +md4_process_block (const void *buffer, size_t len, struct md4_ctx *ctx) +{ + const uint32_t *words = buffer; + size_t nwords = len / sizeof (uint32_t); + const uint32_t *endp = words + nwords; + uint32_t x[16]; + uint32_t A = ctx->A; + uint32_t B = ctx->B; + uint32_t C = ctx->C; + uint32_t D = ctx->D; + + /* First increment the byte count. RFC 1320 specifies the possible + length of the file up to 2^64 bits. Here we only compute the + number of bytes. Do a double word increment. */ + ctx->total[0] += len; + if (ctx->total[0] < len) + ++ctx->total[1]; + + /* Process all bytes in the buffer with 64 bytes in each round of + the loop. */ + while (words < endp) + { + int t; + for (t = 0; t < 16; t++) + { + x[t] = SWAP (*words); + words++; + } + + /* Round 1. */ + R1 (A, B, C, D, 0, 3); + R1 (D, A, B, C, 1, 7); + R1 (C, D, A, B, 2, 11); + R1 (B, C, D, A, 3, 19); + R1 (A, B, C, D, 4, 3); + R1 (D, A, B, C, 5, 7); + R1 (C, D, A, B, 6, 11); + R1 (B, C, D, A, 7, 19); + R1 (A, B, C, D, 8, 3); + R1 (D, A, B, C, 9, 7); + R1 (C, D, A, B, 10, 11); + R1 (B, C, D, A, 11, 19); + R1 (A, B, C, D, 12, 3); + R1 (D, A, B, C, 13, 7); + R1 (C, D, A, B, 14, 11); + R1 (B, C, D, A, 15, 19); + + /* Round 2. */ + R2 (A, B, C, D, 0, 3); + R2 (D, A, B, C, 4, 5); + R2 (C, D, A, B, 8, 9); + R2 (B, C, D, A, 12, 13); + R2 (A, B, C, D, 1, 3); + R2 (D, A, B, C, 5, 5); + R2 (C, D, A, B, 9, 9); + R2 (B, C, D, A, 13, 13); + R2 (A, B, C, D, 2, 3); + R2 (D, A, B, C, 6, 5); + R2 (C, D, A, B, 10, 9); + R2 (B, C, D, A, 14, 13); + R2 (A, B, C, D, 3, 3); + R2 (D, A, B, C, 7, 5); + R2 (C, D, A, B, 11, 9); + R2 (B, C, D, A, 15, 13); + + /* Round 3. */ + R3 (A, B, C, D, 0, 3); + R3 (D, A, B, C, 8, 9); + R3 (C, D, A, B, 4, 11); + R3 (B, C, D, A, 12, 15); + R3 (A, B, C, D, 2, 3); + R3 (D, A, B, C, 10, 9); + R3 (C, D, A, B, 6, 11); + R3 (B, C, D, A, 14, 15); + R3 (A, B, C, D, 1, 3); + R3 (D, A, B, C, 9, 9); + R3 (C, D, A, B, 5, 11); + R3 (B, C, D, A, 13, 15); + R3 (A, B, C, D, 3, 3); + R3 (D, A, B, C, 11, 9); + R3 (C, D, A, B, 7, 11); + R3 (B, C, D, A, 15, 15); + + A = ctx->A += A; + B = ctx->B += B; + C = ctx->C += C; + D = ctx->D += D; + } +} diff --git a/SoObjects/SOGo/md4.h b/SoObjects/SOGo/md4.h new file mode 100644 index 000000000..5377eb5d8 --- /dev/null +++ b/SoObjects/SOGo/md4.h @@ -0,0 +1,91 @@ +/* Declarations of functions and data types used for MD4 sum + library functions. + Copyright (C) 2000-2001, 2003, 2005, 2008-2011 Free Software Foundation, + Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef MD4_H +# define MD4_H 1 + +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + +# define MD4_DIGEST_SIZE 16 + +/* Structure to save state of computation between the single steps. */ +struct md4_ctx +{ + uint32_t A; + uint32_t B; + uint32_t C; + uint32_t D; + + uint32_t total[2]; + uint32_t buflen; + uint32_t buffer[32]; +}; + + +/* Initialize structure containing state of computation. */ +extern void md4_init_ctx (struct md4_ctx *ctx); + +/* Starting with the result of former calls of this function (or the + initialization function update the context for the next LEN bytes + starting at BUFFER. + It is necessary that LEN is a multiple of 64!!! */ +extern void md4_process_block (const void *buffer, size_t len, + struct md4_ctx *ctx); + +/* Starting with the result of former calls of this function (or the + initialization function update the context for the next LEN bytes + starting at BUFFER. + It is NOT required that LEN is a multiple of 64. */ +extern void md4_process_bytes (const void *buffer, size_t len, + struct md4_ctx *ctx); + +/* Process the remaining bytes in the buffer and put result from CTX + in first 16 bytes following RESBUF. The result is always in little + endian byte order, so that a byte-wise output yields to the wanted + ASCII representation of the message digest. */ +extern void *md4_finish_ctx (struct md4_ctx *ctx, void *resbuf); + + +/* Put result from CTX in first 16 bytes following RESBUF. The result is + always in little endian byte order, so that a byte-wise output yields + to the wanted ASCII representation of the message digest. */ +extern void *md4_read_ctx (const struct md4_ctx *ctx, void *resbuf); + + +/* Compute MD4 message digest for bytes read from STREAM. The + resulting message digest number will be written into the 16 bytes + beginning at RESBLOCK. */ +extern int md4_stream (FILE * stream, void *resblock); + +/* Compute MD4 message digest for LEN bytes beginning at BUFFER. The + result is always in little endian byte order, so that a byte-wise + output yields to the wanted ASCII representation of the message + digest. */ +extern void *md4_buffer (const char *buffer, size_t len, void *resblock); + +# ifdef __cplusplus +} +# endif + +#endif From 3872af35d1ecdf93ff0cf3db92ff0bd6708eaeb8 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 17 Apr 2015 09:41:39 -0400 Subject: [PATCH 025/109] (fix) Improve prevent invitations error handling --- SoObjects/Appointments/SOGoAppointmentObject.m | 14 ++++++++++---- UI/PreferencesUI/UIxPreferences.m | 9 +++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/SoObjects/Appointments/SOGoAppointmentObject.m b/SoObjects/Appointments/SOGoAppointmentObject.m index 64baf52d7..4e1371dc8 100644 --- a/SoObjects/Appointments/SOGoAppointmentObject.m +++ b/SoObjects/Appointments/SOGoAppointmentObject.m @@ -421,11 +421,14 @@ SOGoUserSettings *us; NSMutableArray *unavailableAttendees; NSEnumerator *enumerator; - NSString *currentUID, *ownerUID, *whiteListString; + NSString *currentUID, *ownerUID; NSMutableString *reason; NSDictionary *values; - NSMutableDictionary *value, *moduleSettings, *whiteList; + NSMutableDictionary *value, *moduleSettings; + id whiteList; + int i, count; + i = count = 0; // Build list of the attendees uids without ressources @@ -447,8 +450,11 @@ if (![user isResource] && [[moduleSettings objectForKey:@"PreventInvitations"] boolValue]) { // Check if the user have a whiteList - whiteListString = [moduleSettings objectForKey:@"PreventInvitationsWhitelist"]; - whiteList = [whiteListString objectFromJSONString]; + whiteList = [moduleSettings objectForKey:@"PreventInvitationsWhitelist"]; + + // For backward <= 2.2.17 compatibility + if ([whiteList isKindOfClass: [NSString class]]) + whiteList = [whiteList objectFromJSONString]; // If the filter have a hit, do not add the currentUID to the unavailableAttendees array if (![whiteList objectForKey:ownerUID]) diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 9f55e4166..990fda1ed 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -660,12 +660,17 @@ static NSArray *reminderValues = nil; - (void) setWhiteList: (NSString *) whiteListString { - SOGoUserSettings *us; NSMutableDictionary *moduleSettings; + SOGoUserSettings *us; + id o; us = [user userSettings]; moduleSettings = [us objectForKey: @"Calendar"]; - [moduleSettings setObject: [whiteListString objectFromJSONString] forKey: @"PreventInvitationsWhitelist"]; + + if (!(o = [whiteListString objectFromJSONString])) + o = [NSDictionary dictionary]; + + [moduleSettings setObject: o forKey: @"PreventInvitationsWhitelist"]; [us synchronize]; } From 5847e086ec803905d8225e064a9a5dfc38612761 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Fri, 17 Apr 2015 09:55:27 -0400 Subject: [PATCH 026/109] (fix) Edition and access of attach URL in editor --- NEWS | 1 + UI/WebServerResources/UIxComponentEditor.js | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 0e2955da5..10eb03724 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,7 @@ Bug fixes - fixed regression when loading the inbox for the first time - fixed serialization of the PreventInvitationsWhitelist settings - fixed md4 support (for NTLM password changes) with GNU TLS + - fixed edition of attachment URL in event/task editor 2.2.17a (2015-03-15) -------------------- diff --git a/UI/WebServerResources/UIxComponentEditor.js b/UI/WebServerResources/UIxComponentEditor.js index 42d1cad0b..8208b597b 100644 --- a/UI/WebServerResources/UIxComponentEditor.js +++ b/UI/WebServerResources/UIxComponentEditor.js @@ -123,7 +123,7 @@ function initializeDocumentHref() { var documentLabel = $("documentLabel"); var documentUrl = $("attach"); - documentHref.on("click", onPopupDocumentWindow, false); + documentHref.on("click", onPopupDocumentWindow); if (documentUrl.value.length > 0) { documentHref.appendChild(document.createTextNode(documentUrl.value)); documentLabel.setStyle({ display: "block" }); @@ -131,7 +131,7 @@ function initializeDocumentHref() { var changeUrlButton = $("changeAttachButton"); if (changeUrlButton) - changeUrlButton.on("click", onPopupAttachWindow, false); + changeUrlButton.on("click", onPopupAttachWindow); } function initializeClassificationMenu() { From a86b164228a43e897c338d6f362446410048a2f2 Mon Sep 17 00:00:00 2001 From: Luc Charland Date: Fri, 17 Apr 2015 10:38:40 -0400 Subject: [PATCH 027/109] uses a dict instead of a string of a dict for preventInvitationsTest --- Tests/Integration/test-preferences.py | 2 +- Tests/Integration/test-prevent-invitations.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/Integration/test-preferences.py b/Tests/Integration/test-preferences.py index e49e82dd2..a13eb16be 100644 --- a/Tests/Integration/test-preferences.py +++ b/Tests/Integration/test-preferences.py @@ -46,7 +46,7 @@ class preferencesTest(unittest.TestCase): def testPreventInvitationsWhiteList(self): """Add to the PreventInvitations Whitelist""" - self.prefs.set("whiteList", white_listed_attendee) + self.prefs.set("whiteList", simplejson.dumps(white_listed_attendee)) whitelist = self.prefs.get_settings('Calendar')['PreventInvitationsWhitelist'] self.assertEqual(whitelist, white_listed_attendee) diff --git a/Tests/Integration/test-prevent-invitations.py b/Tests/Integration/test-prevent-invitations.py index a1ec81b1f..4493597db 100755 --- a/Tests/Integration/test-prevent-invitations.py +++ b/Tests/Integration/test-prevent-invitations.py @@ -56,7 +56,7 @@ class preventInvitationsTest(unittest.TestCase): """ Set PreventInvitation add to WhiteList and accept the Invitation""" #- First, add the Organiser to the Attendee's whitelist self.prefs.set('enablePreventInvitations', '0') - self.prefs.set("whiteList", white_listed_attendee) + self.prefs.set("whiteList", simplejson.dumps(white_listed_attendee)) whitelist = self.prefs.get_settings('Calendar')['PreventInvitationsWhitelist'] self.assertEqual(whitelist, white_listed_attendee) From 836095e9844f37c29fc140680980877dd1ed0a57 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 17 Apr 2015 14:09:13 -0400 Subject: [PATCH 028/109] Removed old TODO file --- TODO | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 TODO diff --git a/TODO b/TODO deleted file mode 100644 index 63e2dcb85..000000000 --- a/TODO +++ /dev/null @@ -1,13 +0,0 @@ -Rendering of multi-status responses is suboptimal in SOPE: - PROPPATCH "subresponses" indicates either complete failure or success - REPORT responses are handled by SOGo -Therefore it would be nice to refactor those things a little bit and maybe put -some code from SOGo up into SOPE. - -- wsourdeau@inverse.ca, Tue, 22 Apr 2008 15:21:32 -0400 - -ACL: -- the "default user" concept in the SOGo ACL paradigm should probably match -the "authenticated" role in SOGo/SOPE. Also, we should reconsider the handling -of the DAV:authenticated principal wrt the DAV ACL interface. -- we should add support for DAV privilege descriptions - -- wsourdeau@inverse.ca, Tue, 29 Apr 2008 12:05:17 -0400 From d0c1737b1b65c4ab16a65594002ca1ad7a8a7215 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 17 Apr 2015 14:09:51 -0400 Subject: [PATCH 029/109] Removed TODO refs --- packaging/debian-multiarch/sogo.docs | 1 - packaging/debian/sogo.docs | 1 - 2 files changed, 2 deletions(-) diff --git a/packaging/debian-multiarch/sogo.docs b/packaging/debian-multiarch/sogo.docs index aba10029f..fb22e65a1 100644 --- a/packaging/debian-multiarch/sogo.docs +++ b/packaging/debian-multiarch/sogo.docs @@ -1,5 +1,4 @@ NEWS -TODO Scripts/*.sh Scripts/updates.php Apache/SOGo-apple-ab.conf diff --git a/packaging/debian/sogo.docs b/packaging/debian/sogo.docs index aba10029f..fb22e65a1 100644 --- a/packaging/debian/sogo.docs +++ b/packaging/debian/sogo.docs @@ -1,5 +1,4 @@ NEWS -TODO Scripts/*.sh Scripts/updates.php Apache/SOGo-apple-ab.conf From f6370d10cba1f75c59b837addc5d4236a579c744 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20Garc=C3=ADa?= Date: Mon, 20 Apr 2015 09:47:40 +0200 Subject: [PATCH 030/109] Revert "Prepare for new 2.2.15-zentyal3 version" This reverts commit 914e7b7418128dbc112746d4b58a81eef2a64d88. Conflicts: NEWS --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 55f030370..52f9f7989 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,4 @@ -2.2.19 (2015-05-XX) +master ------ New features From 8e39f03f834679bc8f0073daaf286849da919da5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20Garc=C3=ADa?= Date: Mon, 20 Apr 2015 09:48:52 +0200 Subject: [PATCH 031/109] Revert "Prepare for 2.2.17a-zentyal1" This reverts commit 8706443685ff3cb4e71d79e08204e826698db597. Conflicts: NEWS --- NEWS | 46 +++++++++++++++++----------------------------- 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/NEWS b/NEWS index 52f9f7989..6b138dd08 100644 --- a/NEWS +++ b/NEWS @@ -1,32 +1,3 @@ -master ------- - -New features - - Internet headers are now shown in Outlook - -Enhancements - - Sharing request among different Outlook versions - - Improve sync speed from Outlook by non-reprocessing already downloaded unread mails - - Give support to calendar sharing invitations - - Missing contact fields are now saved and available when sharing it - (Office, Profession, Manager's name, Assistant's name, Spouse/Partner, Anniversary) - - Appointment color and importance work now between Outlooks - -Bug fixes - - Sent mails are not longer in Drafts folder using Outlook - - Deleted mails are properly synced between Outlook profiles from the same account - - Does not create a mail folder in other user's mailbox - - Fix server-side crash with invalid events - - Fix setting permissions for a folder with several users - - Fix reception of calendar event invitations on optional attendees - - Fix server side crash parsing rtf without color table - - Weekly recurring events created in SOGo web interface are now shown in Outlook - - Fix exception modifications import in recurrence series - - Fix server side crash parsing rtf emails with images (with word97 format) - - Fix sender on importing email messages like event invitations - - Fix Outlook crashes when modifying the view of a folder - - Fix server side crash when reading some recurrence appointments - 2.2.18 (2015-04-XX) ------------------- @@ -105,6 +76,23 @@ Bug fixes - fixed plain/text mails showing on one line on Android/EAS (#3055) - fixed exception in sogo-tool when parsing arguments of a set operation +<<<<<<< HEAD +======= +2.2.15-zentyal2 (2015-03-16) +---------------------------- + +Enhancements + - Give support to calendar sharing invitations + - Missing contact fields are now saved and available when sharing it + (Office, Profession, Manager's name, Assistant's name, Spouse/Partner, Anniversary) + - Appointment color and importance work now between Outlooks + +Bug fixes + - Fix sender on importing email messages like event invitations + - Fix Outlook crashes when modifying the view of a folder + - Fix server side crash when reading some recurrence appointments + +>>>>>>> parent of 8706443... Prepare for 2.2.17a-zentyal1 2.2.15 (2015-01-30) ------------------- From 9901788db67cb09843752652d6170aeeead50e0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20Garc=C3=ADa?= Date: Mon, 20 Apr 2015 09:51:02 +0200 Subject: [PATCH 032/109] Revert "Update news for next release" This reverts commit cd47c926c92c29c7ee63c3990417883d60be2be7. Conflicts: NEWS --- NEWS | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/NEWS b/NEWS index 6b138dd08..08b83e687 100644 --- a/NEWS +++ b/NEWS @@ -76,23 +76,6 @@ Bug fixes - fixed plain/text mails showing on one line on Android/EAS (#3055) - fixed exception in sogo-tool when parsing arguments of a set operation -<<<<<<< HEAD -======= -2.2.15-zentyal2 (2015-03-16) ----------------------------- - -Enhancements - - Give support to calendar sharing invitations - - Missing contact fields are now saved and available when sharing it - (Office, Profession, Manager's name, Assistant's name, Spouse/Partner, Anniversary) - - Appointment color and importance work now between Outlooks - -Bug fixes - - Fix sender on importing email messages like event invitations - - Fix Outlook crashes when modifying the view of a folder - - Fix server side crash when reading some recurrence appointments - ->>>>>>> parent of 8706443... Prepare for 2.2.17a-zentyal1 2.2.15 (2015-01-30) ------------------- From 1d9e085658cdb8ca93a44b8066a3907f14f0047b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20Garc=C3=ADa?= Date: Mon, 20 Apr 2015 13:15:04 +0200 Subject: [PATCH 033/109] Revert "oc: NGImap4Connection:fetchUids changed error messages" This reverts commit 41320a4813e232b02780eea42792b108c7f4bf3f. --- OpenChange/NGImap4Connection+Monkeypatching.m | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/OpenChange/NGImap4Connection+Monkeypatching.m b/OpenChange/NGImap4Connection+Monkeypatching.m index 1a09948e7..bdeca87ff 100644 --- a/OpenChange/NGImap4Connection+Monkeypatching.m +++ b/OpenChange/NGImap4Connection+Monkeypatching.m @@ -73,8 +73,8 @@ partial_result = [[self client] fetchUids:partial_uids parts:_parts]; if (![[partial_result valueForKey:@"result"] boolValue]) { - [self errorWithFormat: @"Error fetching %u uids for url: %@", - total, _url]; + [self errorWithFormat: @"could not fetch %d uids for url: %@", + [_uids count], _url]; return nil; } @@ -99,8 +99,8 @@ current_obj = [target objectForKey: key]; if (current_obj == nil) { /* This should never happen but just in case... */ - [self errorWithFormat: @"Error merging fetchUids results: " - @"nonexistent key %@ on current target", key]; + [self errorWithFormat: @"Error while merging results: nonexistent key " + @"%@ on current target", key]; continue; } @@ -115,13 +115,13 @@ [self _mergeNGHashMap: obj into: current_obj]; } else if ([obj isKindOfClass: [NSNumber class]]) { if (obj != current_obj) { - [self errorWithFormat: @"Error merging fetchUids results: " - @"incorrect value for key %@: %@ != %@", + [self errorWithFormat: @"While fetching uids problem happened " + @"merging results for key %@: %@ != %@", key, obj, current_obj]; } } else { - [self errorWithFormat: @"Error merging fetchUids results: " - @"ignored %@ (%@) key", key, [key class]]; + [self errorWithFormat: @"While fetching uids and mergin results ignored " + @"%@ (%@) key", key, [key class]]; } } } @@ -135,8 +135,8 @@ current_obj = [target objectsForKey: key]; if (current_obj == nil) { /* This should never happen but just in case... */ - [self errorWithFormat: @"Error merging fetchUids results: " - @"nonexistent key %@ on current target", key]; + [self errorWithFormat: @"Error while merging results: nonexistent key " + @"%@ on current target", key]; continue; } From 255b3d2d006a6acf2aeb854aa20d88f8e77f8c1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20Garc=C3=ADa?= Date: Mon, 20 Apr 2015 13:15:13 +0200 Subject: [PATCH 034/109] Revert "oc: NGImap4Connection:fetchUids don't delete RawResponse" This reverts commit c410a9fc3ff7694d179e69e5d9a904396f0ab07e. --- OpenChange/NGImap4Connection+Monkeypatching.h | 12 +-- OpenChange/NGImap4Connection+Monkeypatching.m | 95 +++++-------------- 2 files changed, 27 insertions(+), 80 deletions(-) diff --git a/OpenChange/NGImap4Connection+Monkeypatching.h b/OpenChange/NGImap4Connection+Monkeypatching.h index acbf26cd5..3a188b8c7 100644 --- a/OpenChange/NGImap4Connection+Monkeypatching.h +++ b/OpenChange/NGImap4Connection+Monkeypatching.h @@ -24,20 +24,12 @@ #import #import #import -#import @interface NGImap4Connection (Monkeypatching) -- (NSArray *) fetchUIDs: (NSArray *) _uids - inURL: (NSURL *) _url - parts: (NSArray *) _parts; - -- (void) _mergeDict: (NSDictionary *) source - into: (NSMutableDictionary *) target; - -- (void) _mergeNGHashMap: (NGMutableHashMap *) source - into: (NGMutableHashMap *) target; +- (NSArray *)fetchUIDs:(NSArray *)_uids inURL:(NSURL *)_url + parts:(NSArray *)_parts; @end diff --git a/OpenChange/NGImap4Connection+Monkeypatching.m b/OpenChange/NGImap4Connection+Monkeypatching.m index bdeca87ff..d94a145a1 100644 --- a/OpenChange/NGImap4Connection+Monkeypatching.m +++ b/OpenChange/NGImap4Connection+Monkeypatching.m @@ -20,7 +20,7 @@ #import "NGImap4Connection+Monkeypatching.h" -#import +#import #import #import @@ -28,9 +28,8 @@ @implementation NGImap4Connection (Monkeypatching) -- (NSArray *) fetchUIDs: (NSArray *) _uids - inURL: (NSURL *) _url - parts: (NSArray *) _parts +- (NSArray *)fetchUIDs:(NSArray *)_uids inURL:(NSURL *)_url + parts:(NSArray *)_parts { // currently returns a dict?! /* @@ -73,81 +72,37 @@ partial_result = [[self client] fetchUids:partial_uids parts:_parts]; if (![[partial_result valueForKey:@"result"] boolValue]) { - [self errorWithFormat: @"could not fetch %d uids for url: %@", - [_uids count], _url]; + [self errorWithFormat: @"could not fetch %d uids for url: %@", [_uids count], _url]; return nil; } - if (result == nil) { + if (!result) { /* First iteration, first result */ result = [[partial_result mutableCopy] autorelease]; - } else { - /* Merge partial_result into previous result */ - [self _mergeDict: partial_result into: result]; + /* RawResponse has already been processed, ignore it */ + [result removeObjectForKey: @"RawResponse"]; + continue; + } + + /* Merge partial_result into previous result */ + for (id key in [partial_result keyEnumerator]) { + id obj, current_obj; + + current_obj = [result objectForKey: key]; + if (!current_obj) continue; + + obj = [partial_result objectForKey: key]; + if ([obj isKindOfClass: [NSArray class]]) { + NSArray *data, *current_data, *new_data; + data = obj; + current_data = current_obj; + new_data = [current_data arrayByAddingObjectsFromArray: data]; + [result setObject: new_data forKey: key]; + } } } return (id)result; } -- (void) _mergeDict: (NSDictionary *) source - into: (NSMutableDictionary *) target -{ - for (id key in [source keyEnumerator]) { - id obj, current_obj; - - current_obj = [target objectForKey: key]; - if (current_obj == nil) { - /* This should never happen but just in case... */ - [self errorWithFormat: @"Error while merging results: nonexistent key " - @"%@ on current target", key]; - continue; - } - - obj = [source objectForKey: key]; - if ([obj isKindOfClass: [NSArray class]]) { - NSArray *data, *current_data, *new_data; - data = obj; - current_data = current_obj; - new_data = [current_data arrayByAddingObjectsFromArray: data]; - [target setObject: new_data forKey: key]; - } else if ([obj isKindOfClass: [NGMutableHashMap class]]) { - [self _mergeNGHashMap: obj into: current_obj]; - } else if ([obj isKindOfClass: [NSNumber class]]) { - if (obj != current_obj) { - [self errorWithFormat: @"While fetching uids problem happened " - @"merging results for key %@: %@ != %@", - key, obj, current_obj]; - } - } else { - [self errorWithFormat: @"While fetching uids and mergin results ignored " - @"%@ (%@) key", key, [key class]]; - } - } -} - -- (void) _mergeNGHashMap: (NGMutableHashMap *) source - into: (NGMutableHashMap *) target -{ - for (id key in [source keyEnumerator]) { - NSArray *obj, *current_obj; - - current_obj = [target objectsForKey: key]; - if (current_obj == nil) { - /* This should never happen but just in case... */ - [self errorWithFormat: @"Error while merging results: nonexistent key " - @"%@ on current target", key]; - continue; - } - - if ([current_obj count] == 1) { - /* Merge only results, that means fields with more than 1 object */ - continue; - } - - obj = [source objectsForKey: key]; - [target addObjects: obj forKey: key]; - } -} - @end From 78f5f60b16194f502871ec77270bef8ac1265fdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20Garc=C3=ADa?= Date: Mon, 20 Apr 2015 13:15:22 +0200 Subject: [PATCH 035/109] Revert "oc: monkeypatched NGImap4Connection class from sope" This reverts commit 24e35103ff0a5094f81b9f241cb8164293ac7b83. --- OpenChange/GNUmakefile | 4 +- OpenChange/NGImap4Connection+Monkeypatching.h | 37 ------ OpenChange/NGImap4Connection+Monkeypatching.m | 108 ------------------ 3 files changed, 1 insertion(+), 148 deletions(-) delete mode 100644 OpenChange/NGImap4Connection+Monkeypatching.h delete mode 100644 OpenChange/NGImap4Connection+Monkeypatching.m diff --git a/OpenChange/GNUmakefile b/OpenChange/GNUmakefile index 688ef19e1..e443ec3f6 100644 --- a/OpenChange/GNUmakefile +++ b/OpenChange/GNUmakefile @@ -124,9 +124,7 @@ $(SOGOBACKEND)_OBJC_FILES += \ \ RTFHandler.m \ \ - Codepages.m \ - \ - NGImap4Connection+Monkeypatching.m + Codepages.m $(SOGOBACKEND)_RESOURCE_FILES += \ diff --git a/OpenChange/NGImap4Connection+Monkeypatching.h b/OpenChange/NGImap4Connection+Monkeypatching.h deleted file mode 100644 index 3a188b8c7..000000000 --- a/OpenChange/NGImap4Connection+Monkeypatching.h +++ /dev/null @@ -1,37 +0,0 @@ -/* NGImap4Connection+Monkeypatching.h - this file is part of SOGo - * - * Copyright (C) 2014 Jesús García Sáez - * - * 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 - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * This file 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __OpenChange_NGImap4Connection_Monkeypatching_H__ -#define __OpenChange_NGImap4Connection_Monkeypatching_H__ - -#import -#import -#import - - -@interface NGImap4Connection (Monkeypatching) - -- (NSArray *)fetchUIDs:(NSArray *)_uids inURL:(NSURL *)_url - parts:(NSArray *)_parts; - -@end - - -#endif // __OpenChange_NGImap4Connection_Monkeypatching_H__ diff --git a/OpenChange/NGImap4Connection+Monkeypatching.m b/OpenChange/NGImap4Connection+Monkeypatching.m deleted file mode 100644 index d94a145a1..000000000 --- a/OpenChange/NGImap4Connection+Monkeypatching.m +++ /dev/null @@ -1,108 +0,0 @@ -/* NGImap4Connection+Monkeypatching.m - this file is part of SOGo - * - * Copyright (C) 2014 Jesús García Sáez - * - * 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 - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * This file 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#import "NGImap4Connection+Monkeypatching.h" - -#import -#import - -#import - - -@implementation NGImap4Connection (Monkeypatching) - -- (NSArray *)fetchUIDs:(NSArray *)_uids inURL:(NSURL *)_url - parts:(NSArray *)_parts -{ - // currently returns a dict?! - /* - Allowed fetch keys: - UID - BODY.PEEK[
]<> - BODY [this is the bodystructure, supported] - BODYSTRUCTURE [not supported yet!] - ENVELOPE [this is a parsed header, but does not include type] - FLAGS - INTERNALDATE - RFC822 - RFC822.HEADER - RFC822.SIZE - RFC822.TEXT - */ - NSMutableDictionary *result = nil; - NSUInteger i, total, step = 1000; - - if (_uids == nil || [_uids count] == 0) - return nil; - - /* select folder */ - - if (![self selectFolder:_url]) - return nil; - - /* fetch parts */ - - total = [_uids count]; - for (i = 0; i < total; i += step) { - NSRange range; - NSArray *partial_uids; - NSDictionary *partial_result; - - range = NSMakeRange(i, (i + step) > total ? (total - i) : step); - partial_uids = [_uids subarrayWithRange: range]; - - /* We will only fetch "step" uids each time */ - partial_result = [[self client] fetchUids:partial_uids parts:_parts]; - - if (![[partial_result valueForKey:@"result"] boolValue]) { - [self errorWithFormat: @"could not fetch %d uids for url: %@", [_uids count], _url]; - return nil; - } - - if (!result) { - /* First iteration, first result */ - result = [[partial_result mutableCopy] autorelease]; - /* RawResponse has already been processed, ignore it */ - [result removeObjectForKey: @"RawResponse"]; - continue; - } - - /* Merge partial_result into previous result */ - for (id key in [partial_result keyEnumerator]) { - id obj, current_obj; - - current_obj = [result objectForKey: key]; - if (!current_obj) continue; - - obj = [partial_result objectForKey: key]; - if ([obj isKindOfClass: [NSArray class]]) { - NSArray *data, *current_data, *new_data; - data = obj; - current_data = current_obj; - new_data = [current_data arrayByAddingObjectsFromArray: data]; - [result setObject: new_data forKey: key]; - } - } - } - - return (id)result; -} - -@end From 769045bbf6bd010c36c56e1b30cc6d4773dc78f6 Mon Sep 17 00:00:00 2001 From: Jeroen Dekkers Date: Sat, 25 Apr 2015 14:40:42 +0200 Subject: [PATCH 036/109] Do not include nonexistent config.h --- SoObjects/SOGo/md4.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/SoObjects/SOGo/md4.c b/SoObjects/SOGo/md4.c index 6807a830d..a2198dcf5 100644 --- a/SoObjects/SOGo/md4.c +++ b/SoObjects/SOGo/md4.c @@ -20,8 +20,6 @@ /* Adapted by Simon Josefsson from gnulib md5.? and Libgcrypt cipher/md4.c . */ -#include - #include "md4.h" #include From 84c199b95a8e83374305688c4408a839ff7be8f7 Mon Sep 17 00:00:00 2001 From: Jeroen Dekkers Date: Sun, 26 Apr 2015 13:33:03 +0200 Subject: [PATCH 037/109] Spelling fix: dictionnary -> dictionary --- SoObjects/Appointments/SOGoAppointmentFolder.m | 2 +- UI/MailerUI/UIxMailActions.m | 2 +- UI/WebServerResources/MailerUI.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SoObjects/Appointments/SOGoAppointmentFolder.m b/SoObjects/Appointments/SOGoAppointmentFolder.m index fc1552235..6d04cd8c5 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolder.m +++ b/SoObjects/Appointments/SOGoAppointmentFolder.m @@ -800,7 +800,7 @@ static Class iCalEventK = nil; /** * Set the timezone of the event start and end dates to the user's timezone. - * @param theRecord a dictionnary with the attributes of the event. + * @param theRecord a dictionary with the attributes of the event. * @return a copy of theRecord with adjusted dates. */ - (NSMutableDictionary *) _fixupRecord: (NSDictionary *) theRecord diff --git a/UI/MailerUI/UIxMailActions.m b/UI/MailerUI/UIxMailActions.m index f3b84e7b0..bff34d821 100644 --- a/UI/MailerUI/UIxMailActions.m +++ b/UI/MailerUI/UIxMailActions.m @@ -163,7 +163,7 @@ co = [self clientObject]; us = [[context activeUser] userSettings]; if (!(moduleSettings = [us objectForKey: @"Mail"])) - [us setObject:[NSMutableDictionary dictionnary] forKey: @"Mail"]; + [us setObject:[NSMutableDictionary dictionary] forKey: @"Mail"]; if (isCollapsing) { diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index 1941ed32b..9144db5b9 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -249,7 +249,7 @@ function mailListToggleMessageThread(row, cell) { row.hide(); } - // Update the dictionnary of the collapsed threads + // Update the dictionary of the collapsed threads var mailbox = Mailer.currentMailbox; var url = ApplicationBaseURL + encodeURI(mailbox) + "/" + msguid + "/" + action; var callbackData = { "currentMailbox": Mailer.currentMailbox, "msguid": msguid, "action": action}; From 07ac3f43fbdaeede58a7941c831f9f86c13bcdbd Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Mon, 27 Apr 2015 10:38:29 -0400 Subject: [PATCH 038/109] Simplify some calls in SOGoAppointmentFolder.m --- SoObjects/Appointments/SOGoAppointmentFolder.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SoObjects/Appointments/SOGoAppointmentFolder.m b/SoObjects/Appointments/SOGoAppointmentFolder.m index 6d04cd8c5..9b670d83b 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolder.m +++ b/SoObjects/Appointments/SOGoAppointmentFolder.m @@ -502,12 +502,12 @@ static Class iCalEventK = nil; BOOL is_owner; userLogin = [[context activeUser] login]; - is_owner = [userLogin isEqualToString: [self ownerInContext: context]]; + is_owner = [userLogin isEqualToString: self->owner]; // Check if the owner (not the active user) has excluded the calendar from her/his free busy data. excludeFromFreeBusy = [self folderPropertyValueInCategory: @"FreeBusyExclusions" - forUser: [SOGoUser userWithLogin: userLogin]]; + forUser: [context activeUser]]; if ([self isSubscription]) { From a1406d01e18e3ffe69f0d47206a864661fbfbf79 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Mon, 27 Apr 2015 13:57:37 -0400 Subject: [PATCH 039/109] Initial Basque translation --- .tx/config | 11 + NEWS | 1 + .../Basque.lproj/Localizable.strings | 67 +++ SoObjects/Appointments/GNUmakefile | 2 +- .../Contacts/Basque.lproj/Localizable.strings | 2 + SoObjects/Contacts/GNUmakefile | 2 +- .../Mailer/Basque.lproj/Localizable.strings | 2 + SoObjects/Mailer/GNUmakefile | 2 +- .../SOGoMailBasqueForward.html | 16 + .../SOGoMailBasqueForward.wod | 97 +++ .../SOGoMailBasqueReply.html | 16 + .../SOGoMailBasqueReply.wod | 106 ++++ SoObjects/SOGo/SOGoDefaults.plist | 2 +- Tests/Integration/preferences.py | 2 +- .../Basque.lproj/Localizable.strings | 15 + UI/AdministrationUI/GNUmakefile | 2 +- UI/Common/Basque.lproj/Localizable.strings | 118 ++++ UI/Common/GNUmakefile | 2 +- UI/Contacts/Basque.lproj/Localizable.strings | 215 +++++++ UI/Contacts/GNUmakefile | 2 +- .../Basque.lproj/Localizable.strings | 48 ++ UI/MailPartViewers/GNUmakefile | 2 +- UI/MailerUI/Basque.lproj/Localizable.strings | 308 ++++++++++ UI/MailerUI/GNUmakefile | 2 +- UI/MainUI/Arabic.lproj/Localizable.strings | 1 + UI/MainUI/Basque.lproj/Locale | 35 ++ UI/MainUI/Basque.lproj/Localizable.strings | 78 +++ .../Localizable.strings | 1 + UI/MainUI/Catalan.lproj/Localizable.strings | 1 + UI/MainUI/Czech.lproj/Localizable.strings | 1 + UI/MainUI/Danish.lproj/Localizable.strings | 1 + UI/MainUI/Dutch.lproj/Localizable.strings | 1 + UI/MainUI/English.lproj/Localizable.strings | 1 + UI/MainUI/Finnish.lproj/Localizable.strings | 1 + UI/MainUI/French.lproj/Localizable.strings | 1 + UI/MainUI/GNUmakefile | 2 +- UI/MainUI/German.lproj/Localizable.strings | 1 + UI/MainUI/Hungarian.lproj/Localizable.strings | 1 + UI/MainUI/Icelandic.lproj/Localizable.strings | 1 + UI/MainUI/Italian.lproj/Localizable.strings | 1 + .../NorwegianBokmal.lproj/Localizable.strings | 1 + .../Localizable.strings | 1 + UI/MainUI/Polish.lproj/Localizable.strings | 1 + UI/MainUI/Russian.lproj/Localizable.strings | 1 + .../Localizable.strings | 1 + .../SpanishSpain.lproj/Localizable.strings | 1 + UI/MainUI/Swedish.lproj/Localizable.strings | 1 + UI/MainUI/Ukrainian.lproj/Localizable.strings | 1 + UI/MainUI/Welsh.lproj/Localizable.strings | 1 + .../Arabic.lproj/Localizable.strings | 1 + .../Basque.lproj/Localizable.strings | 330 ++++++++++ .../Localizable.strings | 1 + .../Catalan.lproj/Localizable.strings | 1 + .../Czech.lproj/Localizable.strings | 1 + .../Danish.lproj/Localizable.strings | 1 + .../Dutch.lproj/Localizable.strings | 1 + .../English.lproj/Localizable.strings | 1 + .../Finnish.lproj/Localizable.strings | 1 + .../French.lproj/Localizable.strings | 1 + UI/PreferencesUI/GNUmakefile | 2 +- .../German.lproj/Localizable.strings | 1 + .../Hungarian.lproj/Localizable.strings | 1 + .../Icelandic.lproj/Localizable.strings | 1 + .../Italian.lproj/Localizable.strings | 1 + .../NorwegianBokmal.lproj/Localizable.strings | 1 + .../Localizable.strings | 1 + .../Polish.lproj/Localizable.strings | 1 + .../Russian.lproj/Localizable.strings | 1 + .../Slovak.lproj/Localizable.strings | 1 + .../Localizable.strings | 1 + .../SpanishSpain.lproj/Localizable.strings | 1 + .../Swedish.lproj/Localizable.strings | 1 + .../Ukrainian.lproj/Localizable.strings | 1 + .../Welsh.lproj/Localizable.strings | 1 + UI/Scheduler/Basque.lproj/Localizable.strings | 565 ++++++++++++++++++ UI/Scheduler/GNUmakefile | 2 +- 76 files changed, 2088 insertions(+), 13 deletions(-) create mode 100644 SoObjects/Appointments/Basque.lproj/Localizable.strings create mode 100644 SoObjects/Contacts/Basque.lproj/Localizable.strings create mode 100644 SoObjects/Mailer/Basque.lproj/Localizable.strings create mode 100755 SoObjects/Mailer/SOGoMailBasqueForward.wo/SOGoMailBasqueForward.html create mode 100755 SoObjects/Mailer/SOGoMailBasqueForward.wo/SOGoMailBasqueForward.wod create mode 100755 SoObjects/Mailer/SOGoMailBasqueReply.wo/SOGoMailBasqueReply.html create mode 100755 SoObjects/Mailer/SOGoMailBasqueReply.wo/SOGoMailBasqueReply.wod create mode 100644 UI/AdministrationUI/Basque.lproj/Localizable.strings create mode 100644 UI/Common/Basque.lproj/Localizable.strings create mode 100644 UI/Contacts/Basque.lproj/Localizable.strings create mode 100644 UI/MailPartViewers/Basque.lproj/Localizable.strings create mode 100644 UI/MailerUI/Basque.lproj/Localizable.strings create mode 100644 UI/MainUI/Basque.lproj/Locale create mode 100644 UI/MainUI/Basque.lproj/Localizable.strings create mode 100644 UI/PreferencesUI/Basque.lproj/Localizable.strings create mode 100644 UI/Scheduler/Basque.lproj/Localizable.strings diff --git a/.tx/config b/.tx/config index aface7e2b..b0d1ec3f6 100644 --- a/.tx/config +++ b/.tx/config @@ -12,6 +12,7 @@ trans.da_DK = UI/MailerUI/Danish.lproj/Localizable.strings trans.de = UI/MailerUI/German.lproj/Localizable.strings trans.es_AR = UI/MailerUI/SpanishArgentina.lproj/Localizable.strings trans.es_ES = UI/MailerUI/SpanishSpain.lproj/Localizable.strings +trans.eu = UI/MailerUI/Basque.lproj/Localizable.strings trans.fi = UI/MailerUI/Finnish.lproj/Localizable.strings trans.fr = UI/MailerUI/French.lproj/Localizable.strings trans.hu = UI/MailerUI/Hungarian.lproj/Localizable.strings @@ -38,6 +39,7 @@ trans.da_DK = UI/PreferencesUI/Danish.lproj/Localizable.strings trans.de = UI/PreferencesUI/German.lproj/Localizable.strings trans.es_AR = UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings trans.es_ES = UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings +trans.eu = UI/PreferencesUI/Basque.lproj/Localizable.strings trans.fi = UI/PreferencesUI/Finnish.lproj/Localizable.strings trans.fr = UI/PreferencesUI/French.lproj/Localizable.strings trans.hu = UI/PreferencesUI/Hungarian.lproj/Localizable.strings @@ -64,6 +66,7 @@ trans.da_DK = UI/Scheduler/Danish.lproj/Localizable.strings trans.de = UI/Scheduler/German.lproj/Localizable.strings trans.es_AR = UI/Scheduler/SpanishArgentina.lproj/Localizable.strings trans.es_ES = UI/Scheduler/SpanishSpain.lproj/Localizable.strings +trans.eu = UI/Scheduler/Basque.lproj/Localizable.strings trans.fi = UI/Scheduler/Finnish.lproj/Localizable.strings trans.fr = UI/Scheduler/French.lproj/Localizable.strings trans.hu = UI/Scheduler/Hungarian.lproj/Localizable.strings @@ -90,6 +93,7 @@ trans.da_DK = UI/Contacts/Danish.lproj/Localizable.strings trans.de = UI/Contacts/German.lproj/Localizable.strings trans.es_AR = UI/Contacts/SpanishArgentina.lproj/Localizable.strings trans.es_ES = UI/Contacts/SpanishSpain.lproj/Localizable.strings +trans.eu = UI/Contacts/Basque.lproj/Localizable.strings trans.fi = UI/Contacts/Finnish.lproj/Localizable.strings trans.fr = UI/Contacts/French.lproj/Localizable.strings trans.hu = UI/Contacts/Hungarian.lproj/Localizable.strings @@ -116,6 +120,7 @@ trans.da_DK = UI/MainUI/Danish.lproj/Localizable.strings trans.de = UI/MainUI/German.lproj/Localizable.strings trans.es_AR = UI/MainUI/SpanishArgentina.lproj/Localizable.strings trans.es_ES = UI/MainUI/SpanishSpain.lproj/Localizable.strings +trans.eu = UI/MainUI/Basque.lproj/Localizable.strings trans.fi = UI/MainUI/Finnish.lproj/Localizable.strings trans.fr = UI/MainUI/French.lproj/Localizable.strings trans.hu = UI/MainUI/Hungarian.lproj/Localizable.strings @@ -142,6 +147,7 @@ trans.da_DK = UI/Common/Danish.lproj/Localizable.strings trans.de = UI/Common/German.lproj/Localizable.strings trans.es_AR = UI/Common/SpanishArgentina.lproj/Localizable.strings trans.es_ES = UI/Common/SpanishSpain.lproj/Localizable.strings +trans.eu = UI/Common/Basque.lproj/Localizable.strings trans.fi = UI/Common/Finnish.lproj/Localizable.strings trans.fr = UI/Common/French.lproj/Localizable.strings trans.hu = UI/Common/Hungarian.lproj/Localizable.strings @@ -168,6 +174,7 @@ trans.da_DK = UI/AdministrationUI/Danish.lproj/Localizable.strings trans.de = UI/AdministrationUI/German.lproj/Localizable.strings trans.es_AR = UI/AdministrationUI/SpanishArgentina.lproj/Localizable.strings trans.es_ES = UI/AdministrationUI/SpanishSpain.lproj/Localizable.strings +trans.eu = UI/AdministrationUI/Basque.lproj/Localizable.strings trans.fi = UI/AdministrationUI/Finnish.lproj/Localizable.strings trans.fr = UI/AdministrationUI/French.lproj/Localizable.strings trans.hu = UI/AdministrationUI/Hungarian.lproj/Localizable.strings @@ -194,6 +201,7 @@ trans.da_DK = SoObjects/Appointments/Danish.lproj/Localizable.strings trans.de = SoObjects/Appointments/German.lproj/Localizable.strings trans.es_AR = SoObjects/Appointments/SpanishArgentina.lproj/Localizable.strings trans.es_ES = SoObjects/Appointments/SpanishSpain.lproj/Localizable.strings +trans.eu = SoObjects/Appointments/Basque.lproj/Localizable.strings trans.fi = SoObjects/Appointments/Finnish.lproj/Localizable.strings trans.fr = SoObjects/Appointments/French.lproj/Localizable.strings trans.hu = SoObjects/Appointments/Hungarian.lproj/Localizable.strings @@ -220,6 +228,7 @@ trans.da_DK = SoObjects/Contacts/Danish.lproj/Localizable.strings trans.de = SoObjects/Contacts/German.lproj/Localizable.strings trans.es_AR = SoObjects/Contacts/SpanishArgentina.lproj/Localizable.strings trans.es_ES = SoObjects/Contacts/SpanishSpain.lproj/Localizable.strings +trans.eu = SoObjects/Contacts/Basque.lproj/Localizable.strings trans.fi = SoObjects/Contacts/Finnish.lproj/Localizable.strings trans.fr = SoObjects/Contacts/French.lproj/Localizable.strings trans.hu = SoObjects/Contacts/Hungarian.lproj/Localizable.strings @@ -246,6 +255,7 @@ trans.da_DK = SoObjects/Mailer/Danish.lproj/Localizable.strings trans.de = SoObjects/Mailer/German.lproj/Localizable.strings trans.es_AR = SoObjects/Mailer/SpanishArgentina.lproj/Localizable.strings trans.es_ES = SoObjects/Mailer/SpanishSpain.lproj/Localizable.strings +trans.eu = SoObjects/Mailer/Basque.lproj/Localizable.strings trans.fi = SoObjects/Mailer/Finnish.lproj/Localizable.strings trans.fr = SoObjects/Mailer/French.lproj/Localizable.strings trans.hu = SoObjects/Mailer/Hungarian.lproj/Localizable.strings @@ -272,6 +282,7 @@ trans.da_DK = UI/MailPartViewers/Danish.lproj/Localizable.strings trans.de = UI/MailPartViewers/German.lproj/Localizable.strings trans.es_AR = UI/MailPartViewers/SpanishArgentina.lproj/Localizable.strings trans.es_ES = UI/MailPartViewers/SpanishSpain.lproj/Localizable.strings +trans.eu = UI/MailPartViewers/Basque.lproj/Localizable.strings trans.fi = UI/MailPartViewers/Finnish.lproj/Localizable.strings trans.fr = UI/MailPartViewers/French.lproj/Localizable.strings trans.hu = UI/MailPartViewers/Hungarian.lproj/Localizable.strings diff --git a/NEWS b/NEWS index 10eb03724..d435d84a2 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,7 @@ Enhancements - improved multipart handling using EAS - added systemd startup script (PR#76) + - added Basque translation - thanks to Gorka Gonzalez - updated Brazilian (Portuguese), Dutch, Norwegian (Bokmal), Polish, Russian, and Spanish (Spain) translations Bug fixes diff --git a/SoObjects/Appointments/Basque.lproj/Localizable.strings b/SoObjects/Appointments/Basque.lproj/Localizable.strings new file mode 100644 index 000000000..316b6371f --- /dev/null +++ b/SoObjects/Appointments/Basque.lproj/Localizable.strings @@ -0,0 +1,67 @@ +"Inviting the following persons is prohibited:" = "Ondorengo pertsonak gonbidatzea debekatuta dago:"; +"Personal Calendar" = "Egutegi pertsonala"; +vevent_class0 = "(Ekitaldi publikoa)"; +vevent_class1 = "(Ekitaldi pribatua)"; +vevent_class2 = "(Isilpeko ekitaldia)"; + +vtodo_class0 = "(Zeregin publikoa)"; +vtodo_class1 = "(Zeregin pribatua)"; +vtodo_class2 = "(Isilpeko egitekoa)"; + +/* Receipts */ +"The event \"%{Summary}\" was created" = "\"%{Summary}\" ekitaldia sortu da"; +"The event \"%{Summary}\" was deleted" = "\"%{Summary}\" ekitaldia ezabatu da"; +"The event \"%{Summary}\" was updated" = "\"%{Summary}\" ekitaldia eguneratu da"; +"The following attendees(s) were notified:" = "Ondorengo partaidea(k) jakinarazi d(ir)a:"; +"The following attendees(s) were added:" = "Ondorengo partaidea(k) gehitu d(ir)a:"; +"The following attendees(s) were removed:" = "Ondorengo partaidea(k) ezabatu d(ir)a:"; + +/* IMIP messages */ +"calendar_label" = "Egutegia"; +"startDate_label" = "Hasi:"; +"endDate_label" = "Amaitu:"; +"due_label" = "Epemuga:"; +"location_label" = "Kokapena:"; +"summary_label" = "Laburpena:"; +"comment_label" = "Iruzkina:"; + +/* Invitation */ +"Event Invitation: \"%{Summary}\"" = "Ekitaldirako gonbidapena: \"%{Summary}\""; +"(sent by %{SentBy}) " = "(%{SentBy}-k bidalia) "; +"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}" = "%{Organizer} %{SentByText}-k gonbidatu zaitu %{Summary}.-ra\n\nHasiera: %{StartDate}\nAmaiera: %{EndDate}\nDeskribapena: %{Description}"; +"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText}-k gonbidatu zaitu %{Summary}-ra \n\nHasiera: %{StartDate}-an, %{StartTime}-tan\nEnd: %{EndDate}-an, %{EndTime}-tan\nDeskribapena: %{Description}"; + +/* Deletion */ +"Event Cancelled: \"%{Summary}\"" = "Ekitaldia bertan behera utzi da: \"%{Summary}\""; +"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}" += "%{Organizer} %{SentByText} ekitaldi hau bertan behera utzi du: %{Summary}.\n\nHasiera: %{StartDate}\nAmaiera: %{EndDate}\nDEskribapena: %{Description}"; +"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" += "%{Organizer} %{SentByText}-k honako ekitaldia bertan behera utzi du: %{Summary}.\n\nHasiera: %{StartDate}-an, %{StartTime}-tan\nAmaiera: %{EndDate}-an %{EndTime}-tan\nDeskribapena: %{Description}"; + +/* Update */ +"The appointment \"%{Summary}\" for the %{OldStartDate} has changed" += "%{OldStartDate} eguneko \"%{Summary}\" hitzordua aldatu da"; +"The appointment \"%{Summary}\" for the %{OldStartDate} at %{OldStartTime} has changed" += "%{OldStartDate} eguneko eta %{OldStartTime} orduko \"%{Summary}\" hitzordua aldatu da"; +"The following parameters have changed in the \"%{Summary}\" meeting:" += " \"%{Summary}\" bilerako ondorengo parametroak aldatu dira:"; +"Please accept or decline those changes." += "Mesedez, onartu edo ezetsi ondorengo aldaketak."; + +/* Reply */ +"Accepted invitation: \"%{Summary}\"" = "Gonbidapena onartua: \"%{Summary}\""; +"Declined invitation: \"%{Summary}\"" = "Ezetzitako gonbidapena: \"%{Summary}\""; +"Delegated invitation: \"%{Summary}\"" = "Delegatutako gonbidapena: \"%{Summary}\""; +"Not yet decided on invitation: \"%{Summary}\"" = "\"%{Summary}\" gonbidapenari buruz erabaki gabe"; +"%{Attendee} %{SentByText}has accepted your event invitation." += "%{Attendee} %{SentByText} -k zure gonbidapena onartu du."; +"%{Attendee} %{SentByText}has declined your event invitation." += "%{Attendee} %{SentByText}-k zure gonbidapenari uko egin dio."; +"%{Attendee} %{SentByText}has delegated the invitation to %{Delegate}." += "%{Attendee} %{SentByText}-k zure gonbidapena %{Delegate}-ri delegatu dio."; +"%{Attendee} %{SentByText}has not yet decided upon your event invitation." += "%{Attendee} %{SentByText}-k ez du oraindik zure gonbidapenari buruz erabakirik hartu."; + +/* Resources */ +"Cannot access resource: \"%{Cn} %{SystemEmail}\"" = "Ezin da honako baliabidea atzitu: \"%{Cn} %{SystemEmail}\""; +"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\". The conflicting event is \"%{EventTitle}\", and starts on %{StartDate}." = "\"%{Cn} %{SystemEmail}\" baliabidearentzako gehienezko erreserba kopurura (%{NumberOfSimultaneousBookings}) iritsi gara. Gatazka sortu duen ekitaldia \"%{EventTitle}\" da, eta %{StartDate}-n hasten da."; diff --git a/SoObjects/Appointments/GNUmakefile b/SoObjects/Appointments/GNUmakefile index 55c66a1bd..1dd3c1a7d 100644 --- a/SoObjects/Appointments/GNUmakefile +++ b/SoObjects/Appointments/GNUmakefile @@ -54,7 +54,7 @@ Appointments_RESOURCE_FILES += \ MSExchangeFreeBusySOAPResponseMap.plist \ MSExchangeFreeBusySOAPRequest.wo -Appointments_LANGUAGES = Arabic BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +Appointments_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh Appointments_LOCALIZED_RESOURCE_FILES = Localizable.strings diff --git a/SoObjects/Contacts/Basque.lproj/Localizable.strings b/SoObjects/Contacts/Basque.lproj/Localizable.strings new file mode 100644 index 000000000..d4b4186ee --- /dev/null +++ b/SoObjects/Contacts/Basque.lproj/Localizable.strings @@ -0,0 +1,2 @@ +"Personal Address Book" = "Helbide liburu pertsonala"; +"Collected Address Book" = "Bildutako helbide liburua"; diff --git a/SoObjects/Contacts/GNUmakefile b/SoObjects/Contacts/GNUmakefile index 23871c73d..a27339462 100644 --- a/SoObjects/Contacts/GNUmakefile +++ b/SoObjects/Contacts/GNUmakefile @@ -27,7 +27,7 @@ Contacts_OBJC_FILES = \ Contacts_RESOURCE_FILES += \ product.plist \ -Contacts_LANGUAGES = Arabic BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +Contacts_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh Contacts_LOCALIZED_RESOURCE_FILES = Localizable.strings diff --git a/SoObjects/Mailer/Basque.lproj/Localizable.strings b/SoObjects/Mailer/Basque.lproj/Localizable.strings new file mode 100644 index 000000000..a8c68b3da --- /dev/null +++ b/SoObjects/Mailer/Basque.lproj/Localizable.strings @@ -0,0 +1,2 @@ +"OtherUsersFolderName" = "Beste erabiltzaileak"; +"SharedFoldersName" = "Partekatutako karpetak"; diff --git a/SoObjects/Mailer/GNUmakefile b/SoObjects/Mailer/GNUmakefile index b4725fc4f..1a931ed99 100644 --- a/SoObjects/Mailer/GNUmakefile +++ b/SoObjects/Mailer/GNUmakefile @@ -92,7 +92,7 @@ Mailer_RESOURCE_FILES += \ SOGoMailWelshReply.wo -Mailer_LANGUAGES = Arabic BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +Mailer_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh Mailer_LOCALIZED_RESOURCE_FILES = Localizable.strings diff --git a/SoObjects/Mailer/SOGoMailBasqueForward.wo/SOGoMailBasqueForward.html b/SoObjects/Mailer/SOGoMailBasqueForward.wo/SOGoMailBasqueForward.html new file mode 100755 index 000000000..34c1eb31f --- /dev/null +++ b/SoObjects/Mailer/SOGoMailBasqueForward.wo/SOGoMailBasqueForward.html @@ -0,0 +1,16 @@ +<#newLine/> +<#newLine/> +<#signaturePlacementOnTop><#newLine/> +<#signature/><#newLine/> +-------- Original Message --------<#newLine/> +Gaia: <#subject/><#newLine/> +Data: <#date/><#newLine/> +Nork: <#from/><#newLine/> +<#hasReplyTo>Erantzun-honi: <#replyTo/><#hasOrganization>Erakundea: <#organization/>Nori: <#to/><#newLine/> +<#hasCc>Kopia: <#cc/><#hasNewsGroups>Berri-taldeak: <#newsgroups/><#hasReferences>Erreferentziak: <#references/><#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#signaturePlacementOnBottom><#newLine/> +<#newLine/> +<#signature/> +<#newLine/> diff --git a/SoObjects/Mailer/SOGoMailBasqueForward.wo/SOGoMailBasqueForward.wod b/SoObjects/Mailer/SOGoMailBasqueForward.wo/SOGoMailBasqueForward.wod new file mode 100755 index 000000000..96bb247ee --- /dev/null +++ b/SoObjects/Mailer/SOGoMailBasqueForward.wo/SOGoMailBasqueForward.wod @@ -0,0 +1,97 @@ +subject: WOString { + value = subject; + escapeHTML = NO; +} + +date: WOString { + value = date; + escapeHTML = NO; +} + +from: WOString { + value = from; + escapeHTML = NO; +} + +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + +hasReplyTo: WOConditional { + condition = hasReplyTo; +} + +replyTo: WOString { + value = replyTo; + escapeHTML = NO; +} + +hasOrganization: WOConditional { + condition = hasOrganization; +} + +organization: WOString { + value = organization; + escapeHTML = NO; +} + +to: WOString { + value = to; + escapeHTML = NO; +} + +hasCc: WOConditional { + condition = hasCc; +} + +cc: WOString { + value = cc; + escapeHTML = NO; +} + +hasNewsGroups: WOConditional { + condition = hasNewsGroups; +} + +newsgroups: WOString { + value = newsgroups; + escapeHTML = NO; +} + +hasReferences: WOConditional { + condition = hasReferences; +} + +references: WOString { + value = references; + escapeHTML = NO; +} + +messageBody: WOString { + value = messageBody; + escapeHTML = NO; +} + +signature: WOString { + value = signature; + escapeHTML = NO; +} + +signaturePlacementOnTop: WOConditional { + condition = signaturePlacementOnTop; +} + +signaturePlacementOnBottom: WOConditional { + condition = signaturePlacementOnTop; + negate = YES; +} + +signaturePlacementOnTop: WOConditional { + condition = signaturePlacementOnTop; +} + +signaturePlacementOnBottom: WOConditional { + condition = signaturePlacementOnTop; + negate = YES; +} diff --git a/SoObjects/Mailer/SOGoMailBasqueReply.wo/SOGoMailBasqueReply.html b/SoObjects/Mailer/SOGoMailBasqueReply.wo/SOGoMailBasqueReply.html new file mode 100755 index 000000000..65b70bae3 --- /dev/null +++ b/SoObjects/Mailer/SOGoMailBasqueReply.wo/SOGoMailBasqueReply.html @@ -0,0 +1,16 @@ +<#replyPlacementOnTop><#newLine/> +<#newLine/> +<#signaturePlacementOnTop><#newLine/> +<#signature/><#newLine/> +<#outlookMode>-------- Jatorrizko Mezua --------<#newLine/> +Gaia: <#subject/><#newLine/> +Data: <#date/><#newLine/> +Nork: <#from/><#newLine/> +<#hasReplyTo>Erantzun-honi: <#replyTo/><#hasOrganization>Erakundea: <#organization/>Nori: <#to/><#newLine/> +<#hasCc>Kopia: <#cc/><#hasNewsGroups>Berri-taldeak: <#newsgroups/><#hasReferences>Erreferentziak: <#references/><#newLine/> +<#standardMode><#date/>-an, <#from/>-k idatzi zuen:<#newLine/> +<#newLine/> +<#messageBody/><#newLine/> +<#replyPlacementOnBottom><#newLine/> +<#newLine/> +<#signaturePlacementOnBottom><#signature/><#newLine/> diff --git a/SoObjects/Mailer/SOGoMailBasqueReply.wo/SOGoMailBasqueReply.wod b/SoObjects/Mailer/SOGoMailBasqueReply.wo/SOGoMailBasqueReply.wod new file mode 100755 index 000000000..3fbed6d61 --- /dev/null +++ b/SoObjects/Mailer/SOGoMailBasqueReply.wo/SOGoMailBasqueReply.wod @@ -0,0 +1,106 @@ +outlookMode: WOConditional { + condition = outlookMode; +} + +standardMode: WOConditional { + condition = outlookMode; + negate = YES; +} + +subject: WOString { + value = subject; + escapeHTML = NO; +} + +date: WOString { + value = date; + escapeHTML = NO; +} + +from: WOString { + value = from; + escapeHTML = NO; +} + +newLine: WOString { + value = newLine; + escapeHTML = NO; +} + +hasReplyTo: WOConditional { + condition = hasReplyTo; +} + +replyTo: WOString { + value = replyTo; + escapeHTML = NO; +} + +hasOrganization: WOConditional { + condition = hasOrganization; +} + +organization: WOString { + value = organization; + escapeHTML = NO; +} + +to: WOString { + value = to; + escapeHTML = NO; +} + +hasCc: WOConditional { + condition = hasCc; +} + +cc: WOString { + value = cc; + escapeHTML = NO; +} + +hasNewsGroups: WOConditional { + condition = hasNewsGroups; +} + +newsgroups: WOString { + value = newsgroups; + escapeHTML = NO; +} + +hasReferences: WOConditional { + condition = hasReferences; +} + +references: WOString { + value = references; + escapeHTML = NO; +} + +messageBody: WOString { + value = messageBody; + escapeHTML = NO; +} + +signature: WOString { + value = signature; + escapeHTML = NO; +} + +replyPlacementOnTop: WOConditional { + condition = replyPlacementOnTop; +} + +replyPlacementOnBottom: WOConditional { + condition = replyPlacementOnTop; + negate = YES; +} + +signaturePlacementOnTop: WOConditional { + condition = signaturePlacementOnTop; +} + +signaturePlacementOnBottom: WOConditional { + condition = signaturePlacementOnTop; + negate = YES; +} diff --git a/SoObjects/SOGo/SOGoDefaults.plist b/SoObjects/SOGo/SOGoDefaults.plist index d0d230c43..e804095f0 100644 --- a/SoObjects/SOGo/SOGoDefaults.plist +++ b/SoObjects/SOGo/SOGoDefaults.plist @@ -39,7 +39,7 @@ SOGoLoginModule = "Mail"; SOGoLanguage = "English"; - SOGoSupportedLanguages = ( "Arabic", "Catalan", "Czech", "Dutch", "Danish", "Welsh", "English", + SOGoSupportedLanguages = ( "Arabic", "Basque", "Catalan", "Czech", "Dutch", "Danish", "Welsh", "English", "SpanishSpain", "SpanishArgentina", "Finnish", "French", "German", "Icelandic", "Italian", "Hungarian", "BrazilianPortuguese", "NorwegianBokmal", "NorwegianNynorsk", "Polish", "Russian", "Slovak", diff --git a/Tests/Integration/preferences.py b/Tests/Integration/preferences.py index ab12f7894..bc861a2fd 100644 --- a/Tests/Integration/preferences.py +++ b/Tests/Integration/preferences.py @@ -10,7 +10,7 @@ import sogoLogin # must be kept in sync with SoObjects/SOGo/SOGoDefaults.plist # this should probably be fetched magically... -SOGoSupportedLanguages = [ "Arabic", "Catalan", "Czech", "Dutch", "Danish", "Welsh", "English", "Finnish", +SOGoSupportedLanguages = [ "Arabic", "Basque", "Catalan", "Czech", "Dutch", "Danish", "Welsh", "English", "Finnish", "SpanishSpain", "SpanishArgentina", "French", "German", "Icelandic", "Italian", "Hungarian", "BrazilianPortuguese", "NorwegianBokmal", "NorwegianNynorsk", "Polish", "Russian", "Slovak", diff --git a/UI/AdministrationUI/Basque.lproj/Localizable.strings b/UI/AdministrationUI/Basque.lproj/Localizable.strings new file mode 100644 index 000000000..97da5c92a --- /dev/null +++ b/UI/AdministrationUI/Basque.lproj/Localizable.strings @@ -0,0 +1,15 @@ +/* this file is in UTF-8 format! */ + +"Help" = "Laguntza"; +"Close" = "Itxi"; + +"Modules" = "Moduluak"; + +/* Modules short names */ +"ACLs" = "ACL-ak"; + +/* Modules titles */ +"ACLs_title" = "Erabiltzaileen karpeten ACL-en kudeaketa"; + +/* Modules descriptions */ +"ACLs_description" = "

\"Access Control List\" administrazio moduluak erabiltzaile bakoitzaren egutegi eta helbide liburuen ACL-ak aldatzea baimentzen du.

Erabiltzaile baten karpetaren ACL-ak aldatzeko idatzi erabiltzailearen izena leihoaren gainaldeko bilaketa eremuan eta klik bikoitza egin gogoko karpetan.

"; diff --git a/UI/AdministrationUI/GNUmakefile b/UI/AdministrationUI/GNUmakefile index 041edd709..949624e98 100644 --- a/UI/AdministrationUI/GNUmakefile +++ b/UI/AdministrationUI/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = AdministrationUI AdministrationUI_PRINCIPAL_CLASS = AdministrationUIProduct -AdministrationUI_LANGUAGES = Arabic BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +AdministrationUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh AdministrationUI_OBJC_FILES = \ AdministrationUIProduct.m \ diff --git a/UI/Common/Basque.lproj/Localizable.strings b/UI/Common/Basque.lproj/Localizable.strings new file mode 100644 index 000000000..de81ffdde --- /dev/null +++ b/UI/Common/Basque.lproj/Localizable.strings @@ -0,0 +1,118 @@ +/* this file is in UTF-8 format! */ + +/* toolbars */ +"Save" = "Gorde"; +"Close" = "Itxi"; +"Edit User Rights" = "Erabiltzailearen baimenak aldatu"; + +"Home" = "Hasiera"; +"Calendar" = "Egutegia"; +"Address Book" = "Helbide liburua"; +"Mail" = "Emaila"; +"Preferences" = "Hoberespenak"; +"Administration" = "Administrazio"; +"Disconnect" = "Deskonektatu"; +"Right Administration" = "Baimenen kudeaketa"; +"Log Console (dev.)" = "Erregistro kontsola (garap.)"; + +"User" = "Erabiltzailea"; +"Vacation message is enabled" = "\"Oporretan nago\" mezua gaituta dago"; + +"Help" = "Laguntza"; + +"noJavascriptError" = "SOGo-k javascript beharrezkoa du. Mesedez ziurtatu zure nabigatzailearen aukeratan aktibatua dagoela."; +"noJavascriptRetry" = "Berriz saiatu"; + +"Owner:" = "Jabea:"; +"Publish the Free/Busy information" = "Argitaratu Libre/Lanpetu informazioa"; + +"Add..." = "Gehitu..."; +"Remove" = "Ezabatu"; + +"Subscribe User" = "Erabiltzailea harpidetu"; + +"Any Authenticated User" = "Autentifikatutako edozein erabiltzaile"; +"Public Access" = "Atzipen publikoa"; +"Any user not listed above" = "Goian zerrendatu gabeko edozein erabiltzaile"; +"Anybody accessing this resource from the public area" = "Eremu publikotik baliabidea atzitzen duen edonork"; + +"Sorry, the user rights can not be configured for that object." = "Barkatu, erabiltzailearen baimenak ezin dira objetu horretarako konfiguratu."; + +"Any user with an account on this system will be able to access your mailbox \"%{0}\". Are you certain you trust them all?" + = "Sistema honetan kontua daukan edonor zure \"%{0}\" postontzia atzitzeko gai izango da. Ziur zaude hori nahi duzula? "; +"Any user with an account on this system will be able to access your calendar \"%{0}\". Are you certain you trust them all?" + = "Sistema honetan kontua daukan edonor zure \"%{0}\" egutegia atzitzeko gai izango da. Ziur zaude hori nahi duzula? "; +"Potentially anyone on the Internet will be able to access your calendar \"%{0}\", even if they do not have an account on this system. Is this information suitable for the public Internet?" + = "Internet-eko edonor zure \"%{0}\" egutegia atzitzeko gai izango da, naiz eta sistema honetan konturik ez eduki. Informazio hau egokia da internet publikorako?"; +"Any user with an account on this system will be able to access your address book \"%{0}\". Are you certain you trust them all?" + = "Sistemako edozein erabiltzaile zure \"%{0}\" helbide liburua atzitzeko gai izango da. Ziur zaude hori nahi duzula?"; +"Potentially anyone on the Internet will be able to access your address book \"%{0}\", even if they do not have an account on this system. Is this information suitable for the public Internet?" + = "Internet-eko edonor zure \"%{0}\" helbide liburua atzitzeko gai izango da, naiz eta sistema honetan konturik ez eduki. Informazio hau egokia da internet publikorako?"; +"Give Access" = "Baimendu atzipena"; +"Keep Private" = "Pribatua mantendu"; + +/* generic.js */ +"Unable to subscribe to that folder!" + = "Ezin da karpeta hori harpidetu!"; +"You cannot subscribe to a folder that you own!" + = "Ezin duzu zure karpeta bat harpidetu!"; +"Unable to unsubscribe from that folder!" + = "Ezin da karpetaren harpidetza kendu!"; +"You cannot unsubscribe from a folder that you own!" + = "Ezin duzu zure karpeta baten harpidetza kendu!"; +"Unable to rename that folder!" = "Karpetaren izena ezin da aldatu!"; +"You have already subscribed to that folder!" + = "Karpeta hau dagoeneko harpidetuta daukazu!"; +"The user rights cannot be edited for this object!" + = "Objetu honen erabiltzaile baimenak ezin dira editatu!"; +"A folder by that name already exists." = "Izen hori daukan karpeta existitzen da dagoeneko."; +"You cannot create a list in a shared address book." + = "Ezin duzu zerrenda bat sortu partekatutako helbide liburu batean"; +"Warning" = "Oharra"; +"Can't contact server" = "Errore gertatu da zerbitzariarekin konektatzerakoan. Mesedez saiatu beranduago."; + +"You are not allowed to access this module or this system. Please contact your system administrator." += "Ez daukazu modulu edo sistema honetarako atzipen baimenik. Mesedez, jarri harremanetan sistemaren administratzailearekin."; +"You don't have the required privileges to perform the operation." += "Ez daukazu eragiketa egiteko beharrezko baimenik."; + +"noEmailForDelegation" = "Zure gonbidapena delegatu nahi duzun email helbidea zehaztu behar duzu."; +"delegate is organizer" = "Delegatua antolatzailea da. Mesedez, aukeratu beste delegatu bat."; +"delegate is a participant" = "DElegatua parte-hartzailea da jada."; +"delegate is a group" = "Zehaztutako helbidea talde bati dagokio. Pertsona baten gain bakarrik delega dezakezu."; + +"Snooze for " = "Errepikatu "; +"5 minutes" = "5 minutu"; +"10 minutes" = "10 minutu"; +"15 minutes" = "15 minutu"; +"30 minutes" = "30 minutu"; +"45 minutes" = "45 minutu"; +"1 hour" = "1 ordu"; +"1 day" = "1 egun"; + +/* common buttons */ +"OK" = "Onartu"; +"Cancel" = "Ezeztatu"; +"Yes" = "Bai"; +"No" = "Ez"; + +/* alarms */ +"Reminder:" = "Ohartarazpena:"; +"Start:" = "Hasi:"; +"Due Date:" = "Epemuga:"; +"Location:" = "Kokapen"; + +/* mail labels */ +"Important" = "Garrantzitsua"; +"Work" = "Lana"; +"Personal" = "Pertsonala"; +"To Do" = "Egitekoa"; +"Later" = "Beranduago"; + +"a2_Sunday" = "Ig"; +"a2_Monday" = "Al"; +"a2_Tuesday" = "As"; +"a2_Wednesday" = "Az"; +"a2_Thursday" = "Os"; +"a2_Friday" = "Or"; +"a2_Saturday" = "Lr"; diff --git a/UI/Common/GNUmakefile b/UI/Common/GNUmakefile index eb5671695..45357b5f2 100644 --- a/UI/Common/GNUmakefile +++ b/UI/Common/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = CommonUI CommonUI_PRINCIPAL_CLASS = CommonUIProduct -CommonUI_LANGUAGES = Arabic BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +CommonUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh CommonUI_OBJC_FILES += \ CommonUIProduct.m \ diff --git a/UI/Contacts/Basque.lproj/Localizable.strings b/UI/Contacts/Basque.lproj/Localizable.strings new file mode 100644 index 000000000..9a9b7fd18 --- /dev/null +++ b/UI/Contacts/Basque.lproj/Localizable.strings @@ -0,0 +1,215 @@ +/* this file is in UTF-8 format! */ + +"Contact" = "Kontaktua"; +"Address" = "Helbidea"; +"Photos" = "Argazkiak"; +"Other" = "Bestelakoak"; + +"Address Books" = "Helbide Liburuak"; +"Addressbook" = "helbideliburua"; +"Addresses" = "Helbideak"; +"Update" = "Eguneratu"; +"Cancel" = "Ezeztatu"; +"Common" = "Arrunta"; +"Contact editor" = "Kontaktuen editorea"; +"Contact viewer" = "Kontaktuen ikuskatzailea"; +"Email" = "Emaila"; +"Screen Name" = "Pantailaren izena"; +"Extended" = "Luzatua"; +"Fax" = "Fax"; +"Firstname" = "Izena"; +"Home" = "Hasiera"; +"HomePhone" = "EtxekoTelefonoa"; +"Lastname" = "Abizena"; +"Location" = "Kokapena"; +"MobilePhone" = "Telefono mugikorra"; +"Name" = "Izena"; +"OfficePhone" = "BulegokoTelefonoa"; +"Organization" = "Erakundea"; +"Work Phone" = "Laneko telefonoa"; +"Phone" = "Telefonoa"; +"Phones" = "Telefonoak"; +"Postal" = "Posta"; +"Save" = "Gorde"; +"Internet" = "Internet"; +"Unit" = "Unitatea"; +"delete" = "ezabatu"; +"edit" = "aldatu"; +"invalidemailwarn" = "Idatzitako posta elektronikoa baliogabea da"; +"new" = "berria"; +"Preferred Phone" = "Hobetsitako telefonoa"; + +"Move To" = "Mugitu hona"; +"Copy To" = "Kopiatu hona"; +"Add to:" = "Gehitu hona:"; + +/* Tooltips */ + +"Create a new address book card" = "Sortu helbide liburu txartel berria"; +"Create a new list" = "Sortu zerrenda berria"; +"Edit the selected card" = "Aldatu aukeratutako txartela"; +"Send a mail message" = "Bidali mezua"; +"Delete selected card or address book" = "Ezabatu hautatutako txartela edo helbide liburua"; +"Reload all contacts" = "Kontaktu guztiak birkargatu"; + +"htmlMailFormat_UNKNOWN" = "Ezezaguna"; +"htmlMailFormat_FALSE" = "Testu hutsa"; +"htmlMailFormat_TRUE" = "HTML"; + +"Name or Email" = "Izena edo email helbidea"; +"Category" = "Kategoria"; +"Personal Addressbook" = "Helbide-liburu pertsonala"; +"Search in Addressbook" = "Bilatu Helbide-liburuan"; + +"New Card" = "Txartel berria"; +"New List" = "Zerrenda berria"; +"Edit" = "Aldatu"; +"Properties" = "Ezaugarriak"; +"Sharing..." = "Partekatzen..."; +"Write" = "Idatzi"; +"Delete" = "Ezabatu"; +"Instant Message" = "Berehalako mezua"; +"Add..." = "Gehitu..."; +"Remove" = "Ezabatu"; + +"Please wait..." = "Mesedez itxaron..."; +"No possible subscription" = "Ez dago harpidetzarako aukerarik"; + +"Preferred" = "Hobetsitakoa"; +"Display:" = "Bistaratzea:"; +"Display Name:" = "Erakusteko izena:"; +"Email:" = "Emaila:"; +"Additional Email:" = "Beste emaila:"; + +"Phone Number:" = "Telefono zenbakia"; +"Prefers to receive messages formatted as:" = "Nahiago du mezuak honako formatuan jasotzea:"; +"Screen Name:" = "Pantailaren izena"; +"Categories:" = "Kategoriak:"; + +"First:" = "Lehenengoa:"; +"Last:" = "Azkena:"; +"Nickname:" = "Goitizena:"; + +"Telephone" = "Telefonoa:"; +"Work:" = "Lana:"; +"Home:" = "Etxea:"; +"Fax:" = "Fax-a:"; +"Mobile:" = "Mugikorra:"; +"Pager:" = "Orrikatzailea:"; + +/* categories */ +"contacts_category_labels" = "Lankide, Lehiakide, Bezero, Lagun, Familia, Negoziokidea, Hornitzailea, Prentsa, VIP"; +"Categories" = "Kategoriak"; +"New category" = "Kategoria berria"; + +/* adresses */ +"Title:" = "Izenburua"; +"Service:" = "Zerbitzua:"; +"Company:" = "Enpresa"; +"Department:" = "Saila"; +"Organization:" = "Saila:"; +"Address:" = "Helbidea"; +"City:" = "Herria"; +"State_Province:" = "Estatua / Probintzia"; +"ZIP_Postal Code:" = "Posta kodea"; +"Country:" = "Herrialdea"; +"Web Page:" = "Web orria"; + +"Work" = "Lana"; +"Other Infos" = "Bestelako informazioak"; + +"Note:" = "Ohar:"; +"Timezone:" = "Ordu-zona:"; +"Birthday:" = "Jaiotze data:"; +"Birthday (yyyy-mm-dd):" = "Jaiotze data (uuuu-hh-ee):"; +"Freebusy URL:" = "LibreLanpetu URL-a:"; + +"Add as..." = "Gehitu honela..."; +"Recipient" = "Jasotzailea"; +"Carbon Copy" = "Kopia"; +"Blind Carbon Copy" = "Ezkutuko kopia"; + +"New Addressbook..." = "Helbideliburu berria"; +"Subscribe to an Addressbook..." = "Harpidetu helbide liburu bat..."; +"Remove the selected Addressbook" = "Ezabatu aukeratutako helbide-liburua"; + +"Name of the Address Book" = "Helbide-liburuaren izena"; +"Are you sure you want to delete the selected address book?" += "Ziur zaude aukeratutako helbide-lburua ezabatu nahi duzula?"; +"You cannot remove nor unsubscribe from a public addressbook." += "Helbide-liburu publiko bat ezin duzu ezabatu edo harpidetza kendu."; +"You cannot remove nor unsubscribe from your personal addressbook." += "Ezin duzu ezabatu edo harpidetza kendu zure helbide-liburu pertsonala."; + +"Are you sure you want to delete the selected contacts?" += "Ziur zaude aukeratutako kontaktuak ezabatu nahi dituzula?"; + +"You cannot delete the card of \"%{0}\"." += "Ezin duzu \"%{0}\"-en txartela ezabatu."; + + + +"You cannot subscribe to a folder that you own!" += "Ezin duzu zure karpeta bat harpidetu."; +"Unable to subscribe to that folder!" += "Ezin da karpeta hori harpidetu."; + +/* acls */ +"Access rights to" = "Atzipen baimenak honi"; +"For user" = "Erabiltzailearentzat"; + +"Any Authenticated User" = "Autentifikatutako edozein erabiltzaile"; +"Public Access" = "Atzipen publikoa"; + +"This person can add cards to this addressbook." += "Pertsona honek txartelak gehitu ditzake helbide liburu honetan."; +"This person can edit the cards of this addressbook." += "Pertsona honek helbide liburu honetako txartelak aldatu ditzake."; +"This person can list the content of this addressbook." += "Pertsona honek helbide-liburu honetako edukiak zerrendatu ditzake."; +"This person can read the cards of this addressbook." += "Pertsona honek helbide-liburu honetako txartelak irakurri ditzake."; +"This person can erase cards from this addressbook." += "Pertsona honek helbide-liburu honetako txartelak ezabatu ditzake."; + +"The selected contact has no email address." += "Aukeratutako kontaktuak ez dauka email helbiderik."; + +"Please select a contact." = "Mesedez, aukeratu kontaktu bat."; + +/* Error messages for move and copy */ + +"SoAccessDeniedException" = "Ezin duzu helbide liburu honetan idatzi."; +"Forbidden" = "Ezin duzu helbide liburu honetan idatzi."; +"Invalid Contact" = "Aukeratutako kontaktua jada ez da existitzen."; +"Unknown Destination Folder" = "Aukeratutako helburu helbide-liburua jada ez da existitzen."; + +/* Lists */ +"List details" = "Zerrendaren xehetasunak"; +"List name:" = "Zerrendaren izena:"; +"List nickname:" = "Zerrendaren goitizena:"; +"List description:" = "Zerrendaren deskribapena:"; +"Members" = "Kideak"; +"Contacts" = "Kontaktuak"; +"Add" = "Gehitu"; +"Lists can't be moved or copied." = "Zerrendak ezin dira kopiatu edo mugitu."; +"Export" = "Esportatu"; +"Export Address Book..." = "Esportatu helbide liburua..."; +"View Raw Source" = "Ikusi Raw iturburua"; +"Import Cards" = "Inportatu txartelak"; +"Select a vCard or LDIF file." = "Aukeratu vCard edo LDIF fitxategia"; +"Upload" = "Kargatu"; +"Uploading" = "Kargatzen"; +"Done" = "Eginda"; +"An error occured while importing contacts." = "Errorea gertatu da txartelak inportatzean."; +"No card was imported." = "Ez da txartelik inportatu."; +"A total of %{0} cards were imported in the addressbook." = "Guztira %{0} txartel inportatu dira helbide liburuan."; + +"Reload" = "Birkargatu"; + +/* Properties window */ +"Address Book Name:" = "Helbide-Liburuaren izena:"; +"Links to this Address Book" = "Helbide liburu honetarako estekak"; +"Authenticated User Access" = "Autentifikatutako erabiltzaileentzako atzipena"; +"CardDAV URL: " = "CardDAV URL-a:"; + diff --git a/UI/Contacts/GNUmakefile b/UI/Contacts/GNUmakefile index ef8a09ebf..59ba95ab5 100644 --- a/UI/Contacts/GNUmakefile +++ b/UI/Contacts/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = ContactsUI ContactsUI_PRINCIPAL_CLASS = ContactsUIProduct -ContactsUI_LANGUAGES = Arabic BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +ContactsUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh ContactsUI_OBJC_FILES = \ UIxContactsUserFolders.m \ diff --git a/UI/MailPartViewers/Basque.lproj/Localizable.strings b/UI/MailPartViewers/Basque.lproj/Localizable.strings new file mode 100644 index 000000000..f2ff1ca7f --- /dev/null +++ b/UI/MailPartViewers/Basque.lproj/Localizable.strings @@ -0,0 +1,48 @@ +ACCEPTED = "onartua"; +COMPLETED = "amaitua"; +DECLINED = "gaitzetsia"; +DELEGATED = "delegatua"; +"IN-PROCESS" = "prozesuan"; +"NEEDS-ACTION" = "ekintza behar du"; +TENTATIVE = "behin-behineko"; +organized_by_you = "zuk antolatua"; +you_are_an_attendee = "Partaidea zera"; +add_info_text = "SOGo-k ez du iMIP 'ADD' eskaerarik onartzen"; +publish_info_text = "Bidaltzaileak atxikitutako ekitaldiari buruz jakinarazten zaitu."; +cancel_info_text = "Zure gonbidapena edo ekitaldi osoa bertan behera utzi da."; +request_info_no_attendee = "partaideei topaketa bat proposatzen die. Email hau jakinarazpen bezala jasotzen duzu, ez zaude partaide bezala programatua"; +Appointment = "Hitzordua"; +"Status Update" = "Egoera eguneraketa"; +was = "zen"; + +Organizer = "Antolatzailea"; +Time = "Ordua"; +Attendees = "Partaideak"; +request_info = "bileran parte-hartzera gonbidatzen zaitu."; +"Add to calendar" = "Egutegira gehitu"; +"Delete from calendar" = "Egutegitik ezabatu"; +"Update status" = "Egoera eguneratu"; +Accept = "Onartu"; +Decline = "Uko egin"; +Tentative = "Behin-behineko"; +"Delegate ..." = "Delegatu ..."; +"Delegated to" = "Beste honen esku utzia"; +"Update status in calendar" = "Egoera egunerartu egutegian"; +"delegated from" = "Beste honek zure esku utzia"; + +reply_info_no_attendee = "Ekitaldi planifikazio bati erantzuna jaso duzu baina erantzunaren bidaltzailea ez da parte-hartzailea."; +reply_info = "Zuk egindako gonbidapen bati erantzuna da hau."; + +"to" = "nori"; + +"Untitled" = "Izenburu-gabea"; + +"Size" = "Tamaina"; + +"Digital signature is not valid" = "Sinadura digitala ez da baliozkoa"; +"Message is signed" = "Mezua sinatua dago"; +"Subject" = "Gaia"; +"From" = "Nork"; +"Date" = "Data"; +"To" = "Nori"; +"Issuer" = "jaulkitzailea"; diff --git a/UI/MailPartViewers/GNUmakefile b/UI/MailPartViewers/GNUmakefile index 57a874fb4..89ed971ef 100644 --- a/UI/MailPartViewers/GNUmakefile +++ b/UI/MailPartViewers/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = MailPartViewers MailPartViewers_PRINCIPAL_CLASS = MailPartViewersProduct -MailPartViewers_LANGUAGES = Arabic BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +MailPartViewers_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh MailPartViewers_OBJC_FILES += \ MailPartViewersProduct.m \ diff --git a/UI/MailerUI/Basque.lproj/Localizable.strings b/UI/MailerUI/Basque.lproj/Localizable.strings new file mode 100644 index 000000000..aa1603cba --- /dev/null +++ b/UI/MailerUI/Basque.lproj/Localizable.strings @@ -0,0 +1,308 @@ +/* this file is in UTF-8 format! */ + +/* Icon's label */ +"Create" = "Sortu"; +"Empty Trash" = "Hustu zakarrontzia"; +"Delete" = "Ezabatu"; +"Expunge" = "Suntsitu"; +"Forward" = "Birbidali"; +"Get Mail" = "Eskuratu mezuak"; +"Junk" = "Zaborra"; +"Reply" = "Erantzun"; +"Reply All" = "Erantzun denei"; +"Print" = "Inprimatu"; +"Stop" = "Gelditu"; +"Write" = "Idatzi"; +"Search" = "Bilatu"; + +"Send" = "Bidali"; +"Contacts" = "Kontaktuak"; +"Attach" = "Erantsi"; +"Save" = "Gorde"; +"Options" = "Aukerak"; +"Close" = "Itxi"; +"Size" = "Tamaina"; + +/* Tooltips */ + +"Send this message now" = "Bidali mezu hau orain"; +"Select a recipient from an Address Book" = "Aukeratu jasotzailea Helbide-liburu batetik"; +"Include an attachment" = "Erantsi eranskin bat"; +"Save this message" = "Gorde mezu hau"; +"Get new messages" = "Eskuratu mezu berriak"; +"Create a new message" = "Sortu mezu berria"; +"Go to address book" = "Joan helbide liburura"; +"Reply to the message" = "Erantzun mezuari"; +"Reply to sender and all recipients" = "Erantzun bidaltzaile eta jasotzaile guztiei"; +"Forward selected message" = "Birbidali aukeratutako mezua"; +"Delete selected message or folder" = "Ezabatu aukeratutako mezu edo karpeta"; +"Mark the selected messages as junk" = "Markatu aukeratutako mezua zabor-posta gisa"; +"Print this message" = "Inprimatu mezu hau"; +"Stop the current transfer" = "Gelditu uneko transferentzia"; +"Attachment" = "Eranskina"; +"Unread" = "Irakurri-gabea"; +"Flagged" = "Bandera dauka"; +"Search multiple mailboxes" = "Bilatu postontzi anitzetan"; + +/* Main Frame */ + +"Home" = "Hasiera"; +"Calendar" = "Egutegia"; +"Addressbook" = "Helbide liburua"; +"Mail" = "Emaila"; +"Right Administration" = "Eskubideen kudeaketa"; + +"Help" = "Laguntza"; + +/* Mail account main windows */ + +"Welcome to the SOGo Mailer. Use the folder tree on the left to browse your mail accounts!" = "Ongi etorria SOGo webmail-era. Erabili ezkerreko zuhaitza zure email kontuak arakatzeko "; + +"Read messages" = "Irakurri mezuak"; +"Write a new message" = "Idatzi mezu berria"; + +"Share: " = "Partekatu:"; +"Account: " = "Kontua:"; +"Shared Account: " = "Partekatutako kontua:"; + +/* acls */ +"Access rights to" = "Atzipen baimenak honi"; +"For user" = "Erabiltzailearentzat"; + +"Any Authenticated User" = "Autentifikatutako edozein erabiltzaile"; + +"List and see this folder" = "Zerrendatu eta ikuskatu karpeta hau"; +"Read mails from this folder" = "Irakurri karpeta honetako mezuak"; +"Mark mails read and unread" = "Markatu mezuak irakurrita eta irakurri gabeko gisa"; +"Modify the flags of the mails in this folder" = "Karpeta honetako mezuen banderak aldatu."; +"Insert, copy and move mails into this folder" = "Txertatu, kopiatu eta mugitu mezuak karpeta honetara"; +"Post mails" = "Bidali emailak"; +"Add subfolders to this folder" = "Sortu azpikarpetak karpeta honetan"; +"Remove this folder" = "Ezabatu karpeta hau"; +"Erase mails from this folder" = "Ezabatu karpeta honetako mezuak"; +"Expunge this folder" = "Suntsitu karpeta honetako mezuak"; +"Export This Folder" = "Esportatu karpeta hau"; +"Modify the acl of this folder" = "Karpeta honen ACL-ak aldatu"; + +"Saved Messages.zip" = "Gorde Messages.zip"; + +"Update" = "Eguneratu"; +"Cancel" = "Ezeztatu"; + +/* Mail edition */ + +"From" = "Nork"; +"Subject" = "Gaia"; +"To" = "Nori"; +"Cc" = "Kopia"; +"Bcc" = "Izkutuko kopia"; +"Reply-To" = "Erantzun-honi"; +"Add address" = "Gehitu helbidea"; +"Body" = "Gorputza"; + +"Open" = "Ireki"; +"Select All" = "Denak aukeratu"; +"Attach Web Page..." = "Erantsi Web Orria ..."; +"file" = "fitxategia"; +"files" = "fitxategiak"; +"Save all" = "Dena gorde"; + +"to" = "Nori"; +"cc" = "Kopia"; +"bcc" = "Izkutuko kopia"; + +"Edit Draft..." = "Aldatu zirriborroa..."; +"Load Images" = "Kargatu irudiak"; + +"Return Receipt" = "Jasotze agiria"; +"The sender of this message has asked to be notified when you read this message. Do you with to notify the sender?" = "Mezu honen bidaltzaileak mezua irakurtzen duzunean jakinarazia izan nahi du. Jakinarazpena bidali nahi diozu?"; +"Return Receipt (displayed) - %@"= "Jasotze agiria (bistaratua) - %@"; +"This is a Return Receipt for the mail that you sent to %@.\n\nNote: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents." = "Honako hau zuk %@-ri bidalitako mezuaren jasotze-agiria da.\n\nOharra: Jasotze agiri honek mezua jasotzailearen ordenagailuan bistaratu dela bakarrik ziurtatzen du. Ezin da ziurtatu jasotzaileak mezuaren edukia irakurri edota ulertu duenik."; + +"Priority" = "Lehentasuna"; +"highest" = "Altuena"; +"high" = "Altua"; +"normal" = "Arrunta"; +"low" = "Baxua"; +"lowest" = "Baxuena"; + +"This mail is being sent from an unsecure network!" = "Mezu hau sare ez-seguru bat erabiliz hari zara bidaltzen!"; + +"Address Book:" = "Helbide Liburua"; +"Search For:" = "Bilatu hau:"; + +/* Popup "show" */ + +"all" = "denak"; +"read" = "irakurria"; +"unread" = "irakurri-gabea"; +"deleted" = "ezabatua"; +"flagged" = "bandera dauka"; + +/* MailListView */ + +"Sender" = "Bidaltzailea"; +"Subject or Sender" = "Gaia edo Bidaltzailea"; +"To or Cc" = "Nori edo kopia"; +"Entire Message" = "Mezu osoa"; + +"Date" = "Data"; +"View" = "Ikuskatu"; +"All" = "Denak"; +"No message" = "Mezurik ez"; +"messages" = "mezuak"; + +"first" = "Lehenengoa"; +"previous" = "Aurrekoa"; +"next" = "Hurrengoa"; +"last" = "Azkena"; + +"msgnumber_to" = "nori"; +"msgnumber_of" = "nork"; + +"Mark Unread" = "Markatu irakurri-gabeko gisa"; +"Mark Read" = "Markatu irakurri gisa"; + +"Untitled" = "Izenburu gabe"; + +/* Tree */ + +"SentFolderName" = "Bidalia"; +"TrashFolderName" = "Zakarrontzia"; +"InboxFolderName" = "Sarrera"; +"DraftsFolderName" = "Zirriborroak"; +"SieveFolderName" = "Iragazkiak"; +"Folders" = "Karpetak"; /* title line */ + +/* MailMoveToPopUp */ + +"MoveTo" = "Mugitu …"; + +/* Address Popup menu */ +"Add to Address Book..." = "Gehitu helbide liburuan..."; +"Compose Mail To" = "Idatzi mezua honi"; +"Create Filter From Message..." = "Sortu iragazkia mezua erabiliz..."; + +/* Image Popup menu */ +"Save Image" = "Gorde mezua"; +"Save Attachment" = "Gorde eranskina"; + +/* Mailbox popup menus */ +"Open in New Mail Window" = "Ireki \"mezu berri\" leihoan"; +"Copy Folder Location" = "Kopiatu karpetaren kokapena"; +"Subscribe..." = "Harpidetu..."; +"Mark Folder Read" = "Markatu karpeta irakurri gisa"; +"New Folder..." = "karpeta berria"; +"Compact This Folder" = "Trinkotu karpeta hau"; +"Search Messages..." = "Bilatu mezuak..."; +"Sharing..." = "Partekatzea...."; +"New Subfolder..." = "Azpikarpeta berria..."; +"Rename Folder..." = "Karpeta berrizendatu..."; +"Delete Folder" = "Ezabatu karpeta"; +"Use This Folder For" = "Erabili karpeta hau "; +"Get Messages for Account" = "Eskuratu kontu honen mezuak"; +"Properties..." = "Ezaugarriak..."; +"Delegation..." = "Ordezkaritza ..."; + +/* Use This Folder menu */ +"Sent Messages" = "Bidalitako mezuak"; +"Drafts" = "Zirriborroak"; +"Deleted Messages" = "Ezabatutako mezuak"; + +/* Message list popup menu */ +"Open Message In New Window" = "Ireki mezua leiho berrian"; +"Reply to Sender Only" = "Erantzun bidaltzaileari soilik"; +"Reply to All" = "Erantzun denei"; +"Edit As New..." = "Editatu mezu berri bezala..."; +"Move To" = "Mugitu hona"; +"Copy To" = "Kopiatu hona"; +"Label" = "Etiketa"; +"Mark" = "Markatu"; +"Save As..." = "Gorde honela..."; +"Print Preview" = "Inprimatzeko aurrebista"; +"View Message Source" = "Ikusi mezuaren iturburua"; +"Print..." = "Inprimatu..."; +"Delete Message" = "Ezabatu mezua"; +"Delete Selected Messages" = "Ezabatu aukeratutako mezuak"; + +"This Folder" = "Karpeta hau"; + +/* Label popup menu */ +"None" = "Bat ere ez"; + +/* Mark popup menu */ +"As Read" = "Irakurri gisa"; +"Thread As Read" = "Haria irakurri gisa"; +"As Read By Date..." = "Data bidez irakurritako gisa..."; +"All Read" = "Denak irakurrita"; +"Flag" = "Bandera"; +"As Junk" = "Zabor-posta gisa"; +"As Not Junk" = "ez zaborra gisa"; +"Run Junk Mail Controls" = "Exekutatu zabor-posta kontrolak"; + +"Search messages in:" = "Bilatu mezuak hemen:"; +"Search" = "Bilatu"; +"Search subfolders" = "Bilatu azpikarpetak"; +"Match any of the following" = "Irizpide hauetako edozein betetzen dituztenak"; +"Match all of the following" = "Irizpide guzti hauek betetzen dituztenak"; +"contains" = "dauka"; +"does not contain" = "ez dauka"; +"No matches found" = "Ez da emaitzarik aurkitu"; +"results found" = "emaitza topatu dira"; +"result found" = "emaitza topatu da"; +"Please specify at least one filter" = "Mesedez, zehaztu gutxienez iragazki bat"; + +/* Folder operations */ +"Name :" = "Izena:"; +"Enter the new name of your folder :" + = "Idatzi zure karpetaren izen berria:"; +"Do you really want to move this folder into the trash ?" + = "Ziur zaude karpeta hau zakarrontzira mugitu nahi duzula?"; +"Operation failed" = "Eragiketak huts egin du"; + +"Quota" = "Kuota"; +"quotasFormat" = "%{0}% erabilia %{1}-n MB "; + +"Please select a message." = "Mesedez, aukeratu mezu bat."; +"Please select a message to print." = "Mesedez, aukeratu inprimatzeko mezu bat."; +"Please select only one message to print." = "Mesdez, aukeratu inprimatzekom mezu bakarra."; +"The message you have selected doesn't exist anymore." = "Aukertutako mezua jada ez da existitzen"; + +"The folder with name \"%{0}\" could not be created." += "\"%{0}\" izeneko karpeta ezin izan da sortu"; +"This folder could not be renamed to \"%{0}\"." += "Karpeta hau ezin izan da \"%{0}\"-ra berrizendatu."; +"The folder could not be deleted." += "Karpeta ezin izan da ezabatu."; +"The trash could not be emptied." += "Zakarrontzia ezin izan da hustu."; +"The folder functionality could not be changed." += "Karpetaren funtzionalitatea ezin izan da aldatu."; + +"You need to choose a non-virtual folder!" = "Karpeta ez-birtual bat aukeratu behar duzu!"; + +"Moving a message into its own folder is impossible!" += "Mezu bat bere karpeta berera ezin da mugitu!"; +"Copying a message into its own folder is impossible!" += "Mezu bat ezin da bere karpetara kopiatu!"; + +/* Message operations */ +"The messages could not be moved to the trash folder. Would you like to delete them immediately?" += "Mezuak ezin izan dira zakarrontzira mugitu. Berehala ezabatu nahi dituzu?"; + +/* Message editing */ +"error_missingsubject" = "Mezuak ez dauka gairik. Ziur zaude horrela bidali nahi duzula?"; +"error_missingrecipients" = "Mesedez, zehaztu gutxienez jasotzaile bat."; +"Send Anyway" = "Bidali hala ere"; +"Error while saving the draft:" = "Errorea zirriborroa gordetzerakoan:"; +"Error while uploading the file \"%{0}\":" = "Errorea \"%{0}\" fitxategia igotzerakoan:"; +"There is an active file upload. Closing the window will interrupt it." = "Fitxategi igoera aktibo bat dago. Leihoa ixteak etengo du."; + +/* Message sending */ +"cannot send message: (smtp) all recipients discarded" = "Ezin izan da mezua bidali: jasotzaile guztiak baliogabeak dira."; +"cannot send message (smtp) - recipients discarded:" = "Ezin izan da mezua bidali. Ondorengo jasotzaileak ez dira baliozkoak:"; +"cannot send message: (smtp) error when connecting" = "Ezin izan da mezua bidali: errorea SMTP zerbitzarira konektatzean."; + +/* Contacts list in mail editor */ +"Email" = "Emaila"; +"Name" = "Izena"; diff --git a/UI/MailerUI/GNUmakefile b/UI/MailerUI/GNUmakefile index b3754bbaf..329a4c873 100644 --- a/UI/MailerUI/GNUmakefile +++ b/UI/MailerUI/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = MailerUI MailerUI_PRINCIPAL_CLASS = MailerUIProduct -MailerUI_LANGUAGES = Arabic BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +MailerUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh MailerUI_OBJC_FILES += \ MailerUIProduct.m \ diff --git a/UI/MainUI/Arabic.lproj/Localizable.strings b/UI/MainUI/Arabic.lproj/Localizable.strings index bf38766c0..7ec32a3a4 100644 --- a/UI/MainUI/Arabic.lproj/Localizable.strings +++ b/UI/MainUI/Arabic.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "اللغة:"; "choose" = "إختار ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/Basque.lproj/Locale b/UI/MainUI/Basque.lproj/Locale new file mode 100644 index 000000000..81ff8eb45 --- /dev/null +++ b/UI/MainUI/Basque.lproj/Locale @@ -0,0 +1,35 @@ +/* English */ +{ + NSLanguageName = "Basque"; + NSFormalName = "Euskara"; + NSLocaleCode = "eu"; /* ISO 639-1 */ + NSLanguageCode = "eus"; /* ISO 639-2 */ + NSParentContext = ""; + + NSAMPMDesignation = (AM, PM); + NSCurrencySymbol = "$"; + NSDateFormatString = "%A, %B %e, %Y"; + NSDateTimeOrdering = YMDH; + NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); + NSDecimalSeparator = ","; + NSEarlierTimeDesignations = ("aurreko", "azken", "joan den", "duela"); + NSHourNameDesignations = ((0, gauerdia), (10, goiza), (12, eguerdia), (14, arratsaldea), (19, gaua)); + NSInternationalCurrencyString = EUR; /* ISO 4217 */ + NSLaterTimeDesignations = ("hurrengo", "ondorengo", "datorren"); + NSMonthNameArray = (Urtarrila, Otsaila, Martxoa, Apirila, Maiatza, Ekaina, Uztaila, Abuztua, Iraila, Urria, Azaroa, Abendua); + NSNextDayDesignations = (bihar); + NSNextNextDayDesignations = ("hurrengo eguna"); + NSPriorDayDesignations = (atzo); + NSShortDateFormatString = "%y/%m/%e"; + NSShortMonthNameArray = (Urt, Ots, Mar, Apr, Mai, Eka, Uzt, Abu, Ira, Urr, Aza, Abe); + NSShortTimeDateFormatString = "%/%m/%e %I:%M %p"; + NSShortWeekDayNameArray = (Ig, Al, As, Az, Os, Or, Ig); + NSThisDayDesignations = (gaur); + NSThousandsSeparator = "."; + NSTimeDateFormatString = "%A, %B %e, %Y %I:%M:%S %p %Z"; + NSTimeFormatString = "%I:%M:%S %p"; + NSWeekDayNameArray = (Igandea, Astelehena, Asteartea, Asteazkena, Osteguna, Ostirala, Larunbata); + NSYearMonthWeekDesignations = (urtea, hilabetea, astea); + NSPositiveCurrencyFormatString = "9.999,00"; + NSNegativeCurrencyFormatString = "-9.999,00"; +} diff --git a/UI/MainUI/Basque.lproj/Localizable.strings b/UI/MainUI/Basque.lproj/Localizable.strings new file mode 100644 index 000000000..5bfc86638 --- /dev/null +++ b/UI/MainUI/Basque.lproj/Localizable.strings @@ -0,0 +1,78 @@ +/* this file is in UTF-8 format! */ + +"title" = "SOGo"; + +"Username:" = "Erabiltzailea:"; +"Password:" = "Pasahitza:"; +"Domain:" = "Domeinua"; +"Remember username" = "Gogoratu erabiltzaile-izena"; + +"Connect" = "Konektatu"; + +"Wrong username or password." = "Erabiltzaile edo pasahitz okerrak"; +"cookiesNotEnabled" = "Ezin zara sartu zure arakatzailearen 'cookie'-ak desgaituta daudelako. Mesedez, gaitu 'cookie'-ak zure arakatzailearen ezarpenetan."; + +"browserNotCompatible" = "Zure arakatzailearen bertsioa ez da onartzen webgune honetan. Gure gomendioa Firefox erabiltzea da. Klikatu ondorengo estekan arakatzaile honen bertsio berriena jeisteko."; +"alternativeBrowsers" = "Aukeran, honako beste arakatzaileak erabili ditzakezu"; +"alternativeBrowserSafari" = "Aukeran, Safari arakatzailea erabili dezakezu ere."; +"Download" = "Deskargatu"; + +"Language:" = "Hizkuntza"; +"choose" = "Aukeratu ..."; +"Arabic" = "العربية"; +"Catalan" = "Català"; +"Czech" = "Česky"; +"Danish" = "Dansk (Danmark)"; +"Dutch" = "Nederlands"; +"English" = "English"; +"Finnish" = "Suomi"; +"French" = "Français"; +"German" = "Deutsch"; +"Hungarian" = "Magyar"; +"Icelandic" = "Íslenska"; +"Italian" = "Italiano"; +"NorwegianBokmal" = "Norsk bokmål"; +"NorwegianNynorsk" = "Norsk nynorsk"; +"Polish" = "Polski"; +"BrazilianPortuguese" = "Português brasileiro"; +"Russian" = "Русский"; +"Slovak" = "Slovensky"; +"SpanishSpain" = "Español (España)"; +"SpanishArgentina" = "Español (Argentina)"; +"Swedish" = "Svenska"; +"Ukrainian" = "Українська"; +"Welsh" = "Cymraeg"; + +"About" = "Honi buruz"; +"AboutBox" = "Inverse-k garatua. SOGo ezaugarri guztidun groupware zerbitzaria da, eskalagarritasunean eta simpletasunean bideratzen dena.

\nSOGo-k AJAX-ean oinarritutako web interfaze aberatsa eskeintzen du eta jatorrizko bezero anitz onartzen ditu ValDAv eta CardDAV bezalako protokolo estandarrak erabiliz.

\nSOGo GNU GPL 2. bertsio edo berriago lizentziapean dago banatua, eta honen zatiak GNU LGPL 2. bertsio lizentziapean. Software librea da: Askatasun osoa daukazu aldatu eta banatzeko. EZ dago inolako GARANTIARIK, legeak onartzen duen neurrian.

\nLaguntza aukera ezberdinak ikusteko klikatu hemen "; + +"Your account was locked due to too many failed attempts." = "Zure kontua blokeatuta dago saiakera oker gehiegi egiteagatik."; +"Your account was locked due to an expired password." = "Zure kontua blokeatuta dago pasahitza iraungita dagoelako."; +"Login failed due to unhandled error case: " = "Login-ak hutsegin du landu gabeko akats-kasu batengatik:"; +"Change your Password" = "Aldatu zure pasahitza"; +"The password was changed successfully." = "Pasahitza ondo aldatu da."; +"Your password has expired, please enter a new one below:" = "Zure pasahitza iraungita dago, mesedez sartu pasahitz berria:"; +"Password must not be empty." = "Pasahitza ezin da hutsa izan."; +"The passwords do not match. Please try again." = "Pasahaitzak ez datoz bat. Mesedez, saiatu berriz."; +"Password Grace Period" = "Pasahitzaren graziazko aldia"; +"You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog." = "%{0} saiakera geratzen zaizkizu zure kontua blokeatu aurretik. Mesedez, aldatu pasahitza hoberespenen elkarrizketa-koadroan."; +"Password about to expire" = "Pasahitza iraungitzear dago"; +"Your password is going to expire in %{0} %{1}." = "Zure pasahitza %{0} %{1}-n iraungiko da."; +"days" = "egun"; +"hours" = "ordu"; +"minutes" = "minutu"; +"seconds" = "segundu"; +"Password change failed" = "Pasahitz aldaketak hutsegin du"; +"Password change failed - Permission denied" = "Pasahitz aldaketak hutsegin du - Baimena ukatua"; +"Password change failed - Insufficient password quality" = "Pasahitz aldaketak hutsegin du - Pasahitzaren kalitate eskasa"; +"Password change failed - Password is too short" = "Pasahitz aldaketak hutsegin du - Pasahitz motzegia"; +"Password change failed - Password is too young" = "Pasahitz aldaketak hutsegin du - Pasahitza berriegia da"; +"Password change failed - Password is in history" = "Pasahitz aldaketak hutsegin du - Pasahitza historikoan dago"; +"Unhandled policy error: %{0}" = "Landu gabeko politika errorea: %{0}"; +"Unhandled error response" = "Landu gabeko errore erantzuna"; +"Password change is not supported." = "Pasahitz aldaketa ez dago onartua."; +"Unhandled HTTP error code: %{0}" = "Landu gabeko HTTP errore kodea: %{0}"; +"New password:" = "Pasahitz berria"; +"Confirmation:" = "Berrespena:"; +"Cancel" = "Ezeztatu"; +"Please wait..." = "Itxaron mesedez..."; diff --git a/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings index 0f8f74599..84724f9a7 100644 --- a/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "Idioma:"; "choose" = "Escolha ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/Catalan.lproj/Localizable.strings b/UI/MainUI/Catalan.lproj/Localizable.strings index 4a7817cec..ee073336c 100644 --- a/UI/MainUI/Catalan.lproj/Localizable.strings +++ b/UI/MainUI/Catalan.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "Llengua:"; "choose" = "Triar ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/Czech.lproj/Localizable.strings b/UI/MainUI/Czech.lproj/Localizable.strings index 9342a11b0..5d64d5b05 100644 --- a/UI/MainUI/Czech.lproj/Localizable.strings +++ b/UI/MainUI/Czech.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "Jazyk:"; "choose" = "Vybrat ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/Danish.lproj/Localizable.strings b/UI/MainUI/Danish.lproj/Localizable.strings index 806108d4d..c439c40df 100644 --- a/UI/MainUI/Danish.lproj/Localizable.strings +++ b/UI/MainUI/Danish.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "Sprog:"; "choose" = "Vælg ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/Dutch.lproj/Localizable.strings b/UI/MainUI/Dutch.lproj/Localizable.strings index 073cc9638..ba9875d58 100644 --- a/UI/MainUI/Dutch.lproj/Localizable.strings +++ b/UI/MainUI/Dutch.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "Taal:"; "choose" = "Kies..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/English.lproj/Localizable.strings b/UI/MainUI/English.lproj/Localizable.strings index 294a8d0d6..64ee320ee 100644 --- a/UI/MainUI/English.lproj/Localizable.strings +++ b/UI/MainUI/English.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "Language:"; "choose" = "Choose ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/Finnish.lproj/Localizable.strings b/UI/MainUI/Finnish.lproj/Localizable.strings index 0b3d54586..22347aebc 100644 --- a/UI/MainUI/Finnish.lproj/Localizable.strings +++ b/UI/MainUI/Finnish.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "Kieli:"; "choose" = "Valitse ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/French.lproj/Localizable.strings b/UI/MainUI/French.lproj/Localizable.strings index a94998cec..f1ceecdf8 100644 --- a/UI/MainUI/French.lproj/Localizable.strings +++ b/UI/MainUI/French.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "Langue:"; "choose" = "Choisir ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/GNUmakefile b/UI/MainUI/GNUmakefile index acd40f8ef..81eb5a635 100644 --- a/UI/MainUI/GNUmakefile +++ b/UI/MainUI/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = MainUI MainUI_PRINCIPAL_CLASS = MainUIProduct -MainUI_LANGUAGES = Arabic BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +MainUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh MainUI_OBJC_FILES += \ MainUIProduct.m \ diff --git a/UI/MainUI/German.lproj/Localizable.strings b/UI/MainUI/German.lproj/Localizable.strings index 69b74ca8d..bbea2d2e8 100644 --- a/UI/MainUI/German.lproj/Localizable.strings +++ b/UI/MainUI/German.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "Sprache:"; "choose" = "Auswählen ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/Hungarian.lproj/Localizable.strings b/UI/MainUI/Hungarian.lproj/Localizable.strings index 3f0759575..14d6765b0 100644 --- a/UI/MainUI/Hungarian.lproj/Localizable.strings +++ b/UI/MainUI/Hungarian.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "Nyelv:"; "choose" = "Válasszon ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/Icelandic.lproj/Localizable.strings b/UI/MainUI/Icelandic.lproj/Localizable.strings index 87a17a180..a5d44cbf4 100644 --- a/UI/MainUI/Icelandic.lproj/Localizable.strings +++ b/UI/MainUI/Icelandic.lproj/Localizable.strings @@ -19,6 +19,7 @@ "Language:" = "Tungumál:"; "choose" = "Velja..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/Italian.lproj/Localizable.strings b/UI/MainUI/Italian.lproj/Localizable.strings index 3fc8fde10..448aa673b 100644 --- a/UI/MainUI/Italian.lproj/Localizable.strings +++ b/UI/MainUI/Italian.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "Lingua:"; "choose" = "Scegli..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/NorwegianBokmal.lproj/Localizable.strings b/UI/MainUI/NorwegianBokmal.lproj/Localizable.strings index d0f97272e..99a482322 100644 --- a/UI/MainUI/NorwegianBokmal.lproj/Localizable.strings +++ b/UI/MainUI/NorwegianBokmal.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "Språk:"; "choose" = "Velg ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings b/UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings index a8171823b..b4fd888b8 100644 --- a/UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings +++ b/UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "Språk:"; "choose" = "Velg ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/Polish.lproj/Localizable.strings b/UI/MainUI/Polish.lproj/Localizable.strings index 6e9db4694..862672ecd 100644 --- a/UI/MainUI/Polish.lproj/Localizable.strings +++ b/UI/MainUI/Polish.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "Język:"; "choose" = "Wybierz ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/Russian.lproj/Localizable.strings b/UI/MainUI/Russian.lproj/Localizable.strings index 7769a8b9c..f29ffc134 100644 --- a/UI/MainUI/Russian.lproj/Localizable.strings +++ b/UI/MainUI/Russian.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "Язык:"; "choose" = "Выбрать ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/SpanishArgentina.lproj/Localizable.strings b/UI/MainUI/SpanishArgentina.lproj/Localizable.strings index cd3c336be..60ec1e466 100644 --- a/UI/MainUI/SpanishArgentina.lproj/Localizable.strings +++ b/UI/MainUI/SpanishArgentina.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "Idioma:"; "choose" = "Elija ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/SpanishSpain.lproj/Localizable.strings b/UI/MainUI/SpanishSpain.lproj/Localizable.strings index 25e9987fd..f9e75aa0b 100644 --- a/UI/MainUI/SpanishSpain.lproj/Localizable.strings +++ b/UI/MainUI/SpanishSpain.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "Idioma:"; "choose" = "Elija ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/Swedish.lproj/Localizable.strings b/UI/MainUI/Swedish.lproj/Localizable.strings index 7a7189dc3..9f72869bd 100644 --- a/UI/MainUI/Swedish.lproj/Localizable.strings +++ b/UI/MainUI/Swedish.lproj/Localizable.strings @@ -19,6 +19,7 @@ "Language:" = "Språk:"; "choose" = "Välj ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/Ukrainian.lproj/Localizable.strings b/UI/MainUI/Ukrainian.lproj/Localizable.strings index 2032809c1..fe3086522 100644 --- a/UI/MainUI/Ukrainian.lproj/Localizable.strings +++ b/UI/MainUI/Ukrainian.lproj/Localizable.strings @@ -20,6 +20,7 @@ "Language:" = "Мова:"; "choose" = "Вибрати ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/MainUI/Welsh.lproj/Localizable.strings b/UI/MainUI/Welsh.lproj/Localizable.strings index e2873d63c..42d4e962d 100644 --- a/UI/MainUI/Welsh.lproj/Localizable.strings +++ b/UI/MainUI/Welsh.lproj/Localizable.strings @@ -19,6 +19,7 @@ "Language:" = "Iaith:"; "choose" = "Dewis ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/Arabic.lproj/Localizable.strings b/UI/PreferencesUI/Arabic.lproj/Localizable.strings index 855e12075..6ec457f3b 100644 --- a/UI/PreferencesUI/Arabic.lproj/Localizable.strings +++ b/UI/PreferencesUI/Arabic.lproj/Localizable.strings @@ -204,6 +204,7 @@ "Language :" = "اللغة:"; "choose" = "اختيار ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/Basque.lproj/Localizable.strings b/UI/PreferencesUI/Basque.lproj/Localizable.strings new file mode 100644 index 000000000..c203c0549 --- /dev/null +++ b/UI/PreferencesUI/Basque.lproj/Localizable.strings @@ -0,0 +1,330 @@ +/* toolbar */ +"Save and Close" = "Gorde eta itxi"; +"Close" = "Itxi"; + +/* tabs */ +"General" = "Orokorra"; +"Calendar Options" = "Egutegiaren aukerak"; +"Contacts Options" = "Kontaktuen aukerak"; +"Mail Options" = "Email aukerak"; +"IMAP Accounts" = "IMAP kontuak"; +"Vacation" = "'Oporretan nago'"; +"Forward" = "Birbidali"; +"Password" = "Pasahitza"; +"Categories" = "Kategoriak"; +"Appointments invitations" = "Hitzordu gonbidapenak"; +"Name" = "Izena"; +"Color" = "Kolorea"; +"Add" = "Gehitu"; +"Delete" = "Ezabatu"; + +/* contacts categories */ +"contacts_category_labels" = "Lankide, Lehiakide, Bezero, Lagun, Familia, Negoziokide, Hornitzaile, Prentsa, VIP"; + +/* vacation (auto-reply) */ +"Enable vacation auto reply" = "Gaitu \"oporretan nago\" erantzun automatikoa"; +"Auto reply message :" = "Erantzun automatikorako mezua:"; +"Email addresses (separated by commas) :" = "Email helbideak (koma bidez banatuak):"; +"Add default email addresses" = "Gehitu email helbide lehenetsiak"; +"Days between responses :" = "Erantzunen arteko egunak:"; +"Do not send responses to mailing lists" = "Ez bidali erantzunak email zerrendatara"; +"Disable auto reply on" = "Ezgaitu erantzun automatikoa"; +"Always send vacation message response" = "'Oporretan nago' erantzun mezua beti bidali"; +"Please specify your message and your email addresses for which you want to enable auto reply." += "Mesedez, zehaztu zure mezua eta zure helbide elektronikoa zeini erantzun automatikoa gaitu nahi diozun."; +"Your vacation message must not end with a single dot on a line." = "Zure 'oporretan nago' mezua ezin da lerro batean puntu bakarrarekin amaitu."; +"End date of your auto reply must be in the future." += "Erantzun automatikoaren amaiera datak etorkizuenan behar du izan."; + +/* forward messages */ +"Forward incoming messages" = "Birbidali sarrera mezuak"; +"Keep a copy" = "Gorde kopia bat"; +"Please specify an address to which you want to forward your messages." += "Mesedez, zehaztu zein helbidetara birbidali nahi dituzun mezuak."; +"You are not allowed to forward your messages to an external email address." = "Ezin dituzu zure mezuak kanpoko email helbide batera birbidali."; +"You are not allowed to forward your messages to an internal email address." = "Ezin dituzu zure mezuak barneko email helbide batera birbidali."; + + +/* d & t */ +"Current Time Zone :" = "Uneko ordu-zona:"; +"Short Date Format :" = "Data-formatu laburra:"; +"Long Date Format :" = "Data-formatu luzea:"; +"Time Format :" = "Ordu-formatua:"; + +"default" = "Lehenetsia"; + +"shortDateFmt_0" = "%d-%b-%y"; + +"shortDateFmt_1" = "%d-%m-%y"; +"shortDateFmt_2" = "%d/%m/%y"; +"shortDateFmt_3" = "%e/%m/%y"; + +"shortDateFmt_4" = "%d-%m-%Y"; +"shortDateFmt_5" = "%d/%m/%Y"; + +"shortDateFmt_6" = "%m-%d-%y"; +"shortDateFmt_7" = "%m/%d/%y"; +"shortDateFmt_8" = "%m/%e/%y"; + +"shortDateFmt_9" = "%y-%m-%d"; +"shortDateFmt_10" = "%y/%m/%d"; +"shortDateFmt_11" = "%y.%m.%d"; + +"shortDateFmt_12" = "%Y-%m-%d"; +"shortDateFmt_13" = "%Y/%m/%d"; +"shortDateFmt_14" = "%Y.%m.%d"; + +"shortDateFmt_15" = ""; + +"longDateFmt_0" = "%A, %B %d, %Y"; +"longDateFmt_1" = "%B %d, %Y"; +"longDateFmt_2" = "%A, %d %B, %Y"; +"longDateFmt_3" = "%d %B, %Y"; +"longDateFmt_4" = ""; +"longDateFmt_5" = ""; +"longDateFmt_6" = ""; +"longDateFmt_7" = ""; +"longDateFmt_8" = ""; +"longDateFmt_9" = ""; +"longDateFmt_10" = ""; + +"timeFmt_0" = "%I:%M %p"; +"timeFmt_1" = "%H:%M"; +"timeFmt_2" = ""; +"timeFmt_3" = ""; +"timeFmt_4" = ""; + +/* calendar */ +"Week begins on :" = "Astea hasteko eguna:"; +"Day start time :" = "Egunaren hasiera ordua:"; +"Day end time :" = "Egunaren amaiera ordua:"; +"Day start time must be prior to day end time." = "Egunaren hasiera orduak amaiera orduak baino lehenago behar du izan."; +"Show time as busy outside working hours" = "Erakutsi denbora lanpetuta bezala lan orduetatik kanpo"; +"First week of year :" = "Urteko lehen astea:"; +"Enable reminders for Calendar items" = "Gaitu oroigarriak egutegiko elementuetarako"; +"Play a sound when a reminder comes due" = "Soinua jo oroigarri baten ondorioz."; +"Default reminder :" = "Lehenetsitako oroigarria:"; + +"firstWeekOfYear_January1" = "Urtarrilak 1eab hasten da"; +"firstWeekOfYear_First4DayWeek" = "Lehenengo 4 eguneko astea"; +"firstWeekOfYear_FirstFullWeek" = "Lehenengo aste osoa"; + +"Prevent from being invited to appointments" = "Hitzorduetara gonbidatua izatea eragotzi."; +"White list for appointment invitations:" = "Hitzordu gonbidapenetarako zerrenda-zuria:"; +"Contacts Names" = "Kontaktuen izenak"; + +/* Default Calendar */ +"Default calendar :" = "Lehenetsitako egutegia:"; +"selectedCalendar" = "Aukeratutako egutegia"; +"personalCalendar" = "Egutegi pertsonala"; +"firstCalendar" = "Gaitutako lehenengo egutegia"; + +"reminder_NONE" = "Oroigarririk ez"; +"reminder_5_MINUTES_BEFORE" = "5 minutu lehenago"; +"reminder_10_MINUTES_BEFORE" = "10 minutu lehenago"; +"reminder_15_MINUTES_BEFORE" = "15 minutu lehenago"; +"reminder_30_MINUTES_BEFORE" = "30 minutu lehenago"; +"reminder_45_MINUTES_BEFORE" = "45 minutu lehenago"; +"reminder_1_HOUR_BEFORE" = "1 ordu lehenago"; +"reminder_2_HOURS_BEFORE" = "2 ordu lehenago"; +"reminder_5_HOURS_BEFORE" = "5 ordu lehenago"; +"reminder_15_HOURS_BEFORE" = "15 ordu lehenago"; +"reminder_1_DAY_BEFORE" = "1 egun lehenago"; +"reminder_2_DAYS_BEFORE" = "2 egun lehenago"; +"reminder_1_WEEK_BEFORE" = "1 aste lehenago"; + +/* Mailer */ +"Labels" = "Etiketak"; +"Label" = "Etiketa"; +"Show subscribed mailboxes only" = "Erakutsi harpidetutako postontziak bakarrik"; +"Sort messages by threads" = "Antolatu mezuak haritan"; +"When sending mail, add unknown recipients to my" = "Mezua bidaltzerakoan gehitu jasotzaile ezezagunak nere"; + +"Forward messages:" = "Mezuak birbidali:"; +"messageforward_inline" = "Mezuaren barruan"; +"messageforward_attached" = "Iruzkin bezala"; + +"When replying to a message:" = "Mezu bati erantzuterakoan:"; +"replyplacement_above" = "Hasi nere erantzuna aipamenaren gainean"; +"replyplacement_below" = "Hasi nere erantzuna aipamenaren azpian"; +"And place my signature" = "Eta jarri nere sinadura"; +"signatureplacement_above" = "nere erantzunaren azpian"; +"signatureplacement_below" = "aipamenaren azpian"; +"Compose messages in" = "Sortu mezuak hemen:"; +"composemessagestype_html" = "HTML"; +"composemessagestype_text" = "Testu arrunta"; +"Display remote inline images" = "Erakutsi mezuaren barneko hurruneko irudiak"; +"displayremoteinlineimages_never" = "Inoiz ez"; +"displayremoteinlineimages_always" = "Beti"; + +"Auto save every" = "Automatikoki gorde"; +"minutes" = "minuturo"; + +/* Contact */ +"Personal Address Book" = "Helbide liburu pertsonala"; +"Collected Address Book" = "Bildutako helbide liburua"; + +/* IMAP Accounts */ +"New Mail Account" = "Email kontu berria"; + +"Server Name:" = "Zerbitzariaren izena:"; +"Port:" = "Portua:"; +"Encryption:" = "Zifraketa:"; +"None" = "Bat ere ez"; +"User Name:" = "Erabiltzaile izena"; +"Password:" = "Pasahitza"; + +"Full Name:" = "Izen osoa:"; +"Email:" = "Emaila:"; +"Reply To Email:" = "Erantzun honi emaila:"; +"Signature:" = "Sinadura"; +"(Click to create)" = "(Klikatu sortzeko)"; + +"Signature" = "Sinadura"; +"Please enter your signature below:" = "Mesedez, idatzi zure sinadura azpian:"; + +"Please specify a valid sender address." = "Mesedez, idatzi baliodun bidaltzaile-helbide bat."; +"Please specify a valid reply-to address." = "Mesedez, idatzi baliodun erantzun-honi helbide bat."; + +/* Additional Parameters */ +"Additional Parameters" = "Beste parametroak"; + +/* password */ +"New password:" = "Pasahitz berria:"; +"Confirmation:" = "Berrespena:"; +"Change" = "Aldatu"; + +/* Event+task classifications */ +"Default events classification :" = "Ekitaldien sailkapen lehenetsia:"; +"Default tasks classification :" = "Zereginen sailkapen lehenetsia:"; +"PUBLIC_item" = "Publikoa"; +"CONFIDENTIAL_item" = "Isilpekoa"; +"PRIVATE_item" = "Pribatua"; + +/* Event+task categories */ +"category_none" = "Bat ere ez"; +"calendar_category_labels" = "Urteurrena, Urtebetetzea, Negozio, Deiak, Bezeroak, Lehia, Bezeroa, Gogokoak, Jarraitu, Opariak, Oporrak, Ideiak, Bilera, Aleak, Denetarik, Pertsonala, Proiektuak, Jaieguna, Egoera, Hornitzaileak, Bidaia, Oporrak"; + +/* Default module */ +"Calendar" = "Egutegia"; +"Contacts" = "Helbide liburua"; +"Mail" = "Emaila"; +"Last" = "Azkenekoz erabilia"; +"Default Module :" = "Lehenetsitako modulua:"; +"SOGo Version :" = "SOGo betsioa:"; + +"Language :" = "Hizkuntza"; +"choose" = "Aukeratu ..."; +"Arabic" = "العربية"; +"Basque" = "Euskara"; +"Catalan" = "Català"; +"Czech" = "Česky"; +"Danish" = "Dansk (Danmark)"; +"Dutch" = "Nederlands"; +"English" = "English"; +"Finnish" = "Suomi"; +"French" = "Français"; +"German" = "Deutsch"; +"Hungarian" = "Magyar"; +"Icelandic" = "Íslenska"; +"Italian" = "Italiano"; +"NorwegianBokmal" = "Norsk bokmål"; +"NorwegianNynorsk" = "Norsk nynorsk"; +"BrazilianPortuguese" = "Português brasileiro"; +"Polish" = "Polski"; +"Russian" = "Русский"; +"Slovak" = "Slovensky"; +"SpanishSpain" = "Español (España)"; +"SpanishArgentina" = "Español (Argentina)"; +"Swedish" = "Svenska"; +"Ukrainian" = "Українська"; +"Welsh" = "Cymraeg"; + +"Refresh View :" = "Eguneratu ikuspegia"; +"refreshview_manually" = "Eskuz"; +"refreshview_every_minute" = "Minuturo"; +"refreshview_every_2_minutes" = "2 minuturo"; +"refreshview_every_5_minutes" = "5 minuturo"; +"refreshview_every_10_minutes" = "10 minuturo"; +"refreshview_every_20_minutes" = "20 minuturo"; +"refreshview_every_30_minutes" = "30 minuturo"; +"refreshview_once_per_hour" = "Orduro"; + +/* Return receipts */ +"When I receive a request for a return receipt:" = "Jasotze-agiriaren eskakizun bat jasotzen dudanean:"; +"Never send a return receipt" = "Jasotze agiria inoiz ez bidali."; +"Allow return receipts for some messages" = "Baimendu jasotze-agiriak zenbait mezutarako."; +"If I'm not in the To or Cc of the message:" = "Ez banago mezuaren 'nori' edo 'kopia' eremuetan:"; +"If the sender is outside my domain:" = "Bidaltzailea nere domeinutik kanpo badago:"; +"In all other cases:" = "Beste kasu guztietan:"; + +"Never send" = "Inoiz ez bidali"; +"Always send" = "Bidali beti"; +"Ask me" = "Galde nazazu"; + +/* Filters - UIxPreferences */ +"Filters" = "Iragazkiak"; +"Active" = "Aktibo"; +"Move Up" = "Mugitu goruntz"; +"Move Down" = "Mugitu beheruntz"; +"Connection error" = "Konexio errorea"; +"Service temporarily unavailable" = "Zerbitzua aldi baterako ez dago erabligarri"; + +/* Filters - UIxFilterEditor */ +"Filter name:" = "Iragazkiaren izena"; +"For incoming messages that" = "Honako hau betetzen duten mezuentzat"; +"match all of the following rules:" = "Arau guzti hauek betetzen dituztenak:"; +"match any of the following rules:" = "Arau hauetako edozein betetzen dituztenak:"; +"match all messages" = "mezu guztiekin bat etorri"; +"Perform these actions:" = "Egikaritu honako ekintzak:"; +"Untitled Filter" = "Izenburu gabeko iragazkia"; + +"Subject" = "Gaia"; +"From" = "Nork"; +"To" = "Nori"; +"Cc" = "Kopia"; +"To or Cc" = "Nori edo kopia"; +"Size (Kb)" = "Tamaina (Kb)"; +"Header" = "Goiburua"; +"Body" = "Gorputza"; +"Flag the message with:" = "Mezuari honako bandera jarri:"; +"Discard the message" = "Baztertu mezua"; +"File the message in:" = "Fitxategiratu mezua:"; +"Keep the message" = "Mantendu mezua"; +"Forward the message to:" = "Birbidali mezua honi:"; +"Send a reject message:" = "Bidali ezetsi mezu bat:"; +"Send a vacation message" = "Bildai 'oporretan nago' mezu bat."; +"Stop processing filter rules" = "Iragazki arauen prozesatzea gelditu."; + +"is under" = "azpian dago"; +"is over" = "gainean dago"; +"is" = "da"; +"is not" = "ez da"; +"contains" = "dauka"; +"does not contain" = "ez dauka"; +"matches" = "Bat dator"; +"does not match" = "ez dator bat"; +"matches regex" = "regex-ekin bat dator"; +"does not match regex" = "regex-ekin ez dator bat"; + +"Seen" = "Ikusia"; +"Deleted" = "Ezabatua"; +"Answered" = "Erantzunda"; +"Flagged" = "Bandera dauka"; +"Junk" = "Zaborra"; +"Not Junk" = "Ez da zaborra"; + +/* Password policy */ +"The password was changed successfully." = "Pasahitza ondo aldatu da."; +"Password must not be empty." = "Pasahitza ezin da hutsa izan."; +"The passwords do not match. Please try again." = "Pasahitzak ez datoz bat. Mesedez, saiatu berriz"; +"Password change failed" = "Pasahitz aldaketak hutsegin du."; +"Password change failed - Permission denied" = "Pasahitz aldaketak hutsegin du - Baimena ukatua"; +"Password change failed - Insufficient password quality" = "Pasahitz aldaketak hutsegin du - Pasahitzaren kalitate eskasa"; +"Password change failed - Password is too short" = "Pasahitz aldaketak hutsegin du - Pasahitz motzegia"; +"Password change failed - Password is too young" = "Pasahitz aldaketak hutsegin du - Pasahitza berriegia da"; +"Password change failed - Password is in history" = "Pasahitz aldaketak hutsegin du - Pasahitza historikoan dago"; +"Unhandled policy error: %{0}" = "Landu gabeko politika errorea: %{0}"; +"Unhandled error response" = "Landu gabeko errore erantzuna"; +"Password change is not supported." = "Pasahitz aldaketa ez dago onartua."; +"Unhandled HTTP error code: %{0}" = "Landu gabeko HTTP errore kodea: %{0}"; diff --git a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings index 77db2492b..e18095e74 100644 --- a/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings @@ -216,6 +216,7 @@ "Language :" = "Idioma :"; "choose" = "Escolha ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/Catalan.lproj/Localizable.strings b/UI/PreferencesUI/Catalan.lproj/Localizable.strings index 459878dda..f299cc42d 100644 --- a/UI/PreferencesUI/Catalan.lproj/Localizable.strings +++ b/UI/PreferencesUI/Catalan.lproj/Localizable.strings @@ -217,6 +217,7 @@ "Language :" = "Language :"; "choose" = "Choose ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/Czech.lproj/Localizable.strings b/UI/PreferencesUI/Czech.lproj/Localizable.strings index 8d362aef4..7482be602 100644 --- a/UI/PreferencesUI/Czech.lproj/Localizable.strings +++ b/UI/PreferencesUI/Czech.lproj/Localizable.strings @@ -216,6 +216,7 @@ "Language :" = "Jazyk :"; "choose" = "Vybrat ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/Danish.lproj/Localizable.strings b/UI/PreferencesUI/Danish.lproj/Localizable.strings index 903abf10d..f9976e293 100644 --- a/UI/PreferencesUI/Danish.lproj/Localizable.strings +++ b/UI/PreferencesUI/Danish.lproj/Localizable.strings @@ -204,6 +204,7 @@ "Language :" = "Sprog:"; "choose" = "Vælg ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/Dutch.lproj/Localizable.strings b/UI/PreferencesUI/Dutch.lproj/Localizable.strings index 89a6ad964..d19f8fd06 100644 --- a/UI/PreferencesUI/Dutch.lproj/Localizable.strings +++ b/UI/PreferencesUI/Dutch.lproj/Localizable.strings @@ -216,6 +216,7 @@ "Language :" = "Taal:"; "choose" = "Kies..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index c0885ec35..a5d59ae2b 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -216,6 +216,7 @@ "Language :" = "Language:"; "choose" = "Choose ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/Finnish.lproj/Localizable.strings b/UI/PreferencesUI/Finnish.lproj/Localizable.strings index 912e0b11b..355f2e61f 100644 --- a/UI/PreferencesUI/Finnish.lproj/Localizable.strings +++ b/UI/PreferencesUI/Finnish.lproj/Localizable.strings @@ -216,6 +216,7 @@ "Language :" = "Kieli:"; "choose" = "Valitse..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/French.lproj/Localizable.strings b/UI/PreferencesUI/French.lproj/Localizable.strings index 56f72a0ad..f2d537b60 100644 --- a/UI/PreferencesUI/French.lproj/Localizable.strings +++ b/UI/PreferencesUI/French.lproj/Localizable.strings @@ -216,6 +216,7 @@ "Language :" = "Langue :"; "choose" = "Choisir ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/GNUmakefile b/UI/PreferencesUI/GNUmakefile index c2c75ab39..570327559 100644 --- a/UI/PreferencesUI/GNUmakefile +++ b/UI/PreferencesUI/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = PreferencesUI PreferencesUI_PRINCIPAL_CLASS = PreferencesUIProduct -PreferencesUI_LANGUAGES = Arabic BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +PreferencesUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh PreferencesUI_OBJC_FILES = \ PreferencesUIProduct.m \ diff --git a/UI/PreferencesUI/German.lproj/Localizable.strings b/UI/PreferencesUI/German.lproj/Localizable.strings index 473fa7706..756f73bbf 100644 --- a/UI/PreferencesUI/German.lproj/Localizable.strings +++ b/UI/PreferencesUI/German.lproj/Localizable.strings @@ -216,6 +216,7 @@ "Language :" = "Sprache:"; "choose" = "Auswählen ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/Hungarian.lproj/Localizable.strings b/UI/PreferencesUI/Hungarian.lproj/Localizable.strings index b90ff2297..367362e67 100644 --- a/UI/PreferencesUI/Hungarian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Hungarian.lproj/Localizable.strings @@ -216,6 +216,7 @@ "Language :" = "Nyelv :"; "choose" = "Válasszon ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/Icelandic.lproj/Localizable.strings b/UI/PreferencesUI/Icelandic.lproj/Localizable.strings index 264172a04..4e9808cd2 100644 --- a/UI/PreferencesUI/Icelandic.lproj/Localizable.strings +++ b/UI/PreferencesUI/Icelandic.lproj/Localizable.strings @@ -174,6 +174,7 @@ "Language :" = "Tungumál :"; "choose" = "Velja..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/Italian.lproj/Localizable.strings b/UI/PreferencesUI/Italian.lproj/Localizable.strings index dda3400af..630154439 100644 --- a/UI/PreferencesUI/Italian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Italian.lproj/Localizable.strings @@ -195,6 +195,7 @@ "Language :" = "Lingua :"; "choose" = "Scegli..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings b/UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings index c1f59838d..4b4a0c91b 100644 --- a/UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings +++ b/UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings @@ -216,6 +216,7 @@ "Language :" = "Språk:"; "choose" = "Velg ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings b/UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings index 3c8f23b64..839c7adce 100644 --- a/UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings +++ b/UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings @@ -181,6 +181,7 @@ "Language :" = "Språk:"; "choose" = "Velg ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/Polish.lproj/Localizable.strings b/UI/PreferencesUI/Polish.lproj/Localizable.strings index e432f9182..7fab8b4e8 100644 --- a/UI/PreferencesUI/Polish.lproj/Localizable.strings +++ b/UI/PreferencesUI/Polish.lproj/Localizable.strings @@ -216,6 +216,7 @@ "Language :" = "Język:"; "choose" = "Wybierz"; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/Russian.lproj/Localizable.strings b/UI/PreferencesUI/Russian.lproj/Localizable.strings index 59dc0c09e..36584850c 100644 --- a/UI/PreferencesUI/Russian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Russian.lproj/Localizable.strings @@ -216,6 +216,7 @@ "Language :" = "Язык:"; "choose" = "Выбрать ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/Slovak.lproj/Localizable.strings b/UI/PreferencesUI/Slovak.lproj/Localizable.strings index e564e8c50..19bada4f6 100644 --- a/UI/PreferencesUI/Slovak.lproj/Localizable.strings +++ b/UI/PreferencesUI/Slovak.lproj/Localizable.strings @@ -213,6 +213,7 @@ "Language :" = "Jazyk:"; "choose" = "Vyber..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings b/UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings index 45ccd63df..1b6f89dc3 100644 --- a/UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings +++ b/UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings @@ -209,6 +209,7 @@ "Language :" = "Idioma :"; "choose" = "Elija ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings b/UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings index 55d72d435..71d83d25a 100644 --- a/UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings +++ b/UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings @@ -216,6 +216,7 @@ "Language :" = "Idioma :"; "choose" = "Elija ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/Swedish.lproj/Localizable.strings b/UI/PreferencesUI/Swedish.lproj/Localizable.strings index 915b3d324..b2463926b 100644 --- a/UI/PreferencesUI/Swedish.lproj/Localizable.strings +++ b/UI/PreferencesUI/Swedish.lproj/Localizable.strings @@ -183,6 +183,7 @@ Servernamn:"; "Language :" = "Språk:"; "choose" = "Välj ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/Ukrainian.lproj/Localizable.strings b/UI/PreferencesUI/Ukrainian.lproj/Localizable.strings index 0f3ef69ec..9944a8d0a 100644 --- a/UI/PreferencesUI/Ukrainian.lproj/Localizable.strings +++ b/UI/PreferencesUI/Ukrainian.lproj/Localizable.strings @@ -193,6 +193,7 @@ "Language :" = "Мова :"; "choose" = "Choose ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/PreferencesUI/Welsh.lproj/Localizable.strings b/UI/PreferencesUI/Welsh.lproj/Localizable.strings index f7a9f46ba..b2f2622d6 100644 --- a/UI/PreferencesUI/Welsh.lproj/Localizable.strings +++ b/UI/PreferencesUI/Welsh.lproj/Localizable.strings @@ -181,6 +181,7 @@ "Language :" = "Iaith :"; "choose" = "Dewis ..."; "Arabic" = "العربية"; +"Basque" = "Euskara"; "Catalan" = "Català"; "Czech" = "Česky"; "Danish" = "Dansk (Danmark)"; diff --git a/UI/Scheduler/Basque.lproj/Localizable.strings b/UI/Scheduler/Basque.lproj/Localizable.strings new file mode 100644 index 000000000..8e0c6589f --- /dev/null +++ b/UI/Scheduler/Basque.lproj/Localizable.strings @@ -0,0 +1,565 @@ +/* this file is in UTF-8 format! */ + +/* Tooltips */ + +"Create a new event" = "Gertaera berria sortu"; +"Create a new task" = "Zeregin berria sortu"; +"Edit this event or task" = "Gertaera edo zeregin hau aldatu"; +"Print the current calendar view" = "Egutegi hau inprimatu"; +"Delete this event or task" = "Gertaera edo zeregin hau ezabatu"; +"Go to today" = "Gaurko egunera joan"; +"Switch to day view" = "Eguneko ikuspegia"; +"Switch to week view" = "Aste bateko ikuspegia"; +"Switch to month view" = "Hilabeteko ikuspegia"; +"Reload all calendars" = "Birkargatu egutegi guztiak"; + +/* Tabs */ +"Date" = "Eguna"; +"Calendars" = "Egutegiak"; + +/* Day */ + +"DayOfTheMonth" = "Hileko eguna"; +"dayLabelFormat" = "%m/%d/%Y"; +"today" = "Gaur"; + +"Previous Day" = "Aurreko eguna"; +"Next Day" = "Hurrengo eguna"; + +/* Week */ + +"Week" = "Astea"; +"this week" = "Aste hau"; + +"Week %d" = "%d astea"; + +"Previous Week" = "Aurreko astea"; +"Next Week" = "Hurrengo astea"; + +/* Month */ + +"this month" = "Hilabete hau"; + +"Previous Month" = "Aurreko hilabetea"; +"Next Month" = "Hurrengo hilabetea"; + +/* Year */ + +"this year" = "Urte hau"; + +/* Menu */ + +"Calendar" = "Egutegia"; +"Contacts" = "Kontaktuak"; + +"New Calendar..." = "Egutegi berria..."; +"Delete Calendar" = "Ezabatu egutegia..."; +"Unsubscribe Calendar" = "Desharpidetu egutegi hau"; +"Sharing..." = "Konpartitzea..."; +"Export Calendar..." = "Egutegia esportatu..."; +"Import Events..." = "Gertakariak inportatu..."; +"Import Events" = "Gertakariak inportatu"; +"Select an iCalendar file (.ics)." = "Aukeratu iCalendar motatako fitxategia (.ics)"; +"Upload" = "Kargatu"; +"Uploading" = "Kargatzen"; +"Publish Calendar..." = "Egutegia argitaratu"; +"Reload Remote Calendars" = "Hurrutiko egutegiak birkargatu"; +"Properties" = "Ezaugarria"; +"Done" = "Prest"; +"An error occurred while importing calendar." = "Akats bat suertatu da egutegia inportatzerakoan"; +"No event was imported." = "Ez da gertakaririk inportatu"; +"A total of %{0} events were imported in the calendar." = "Gertakarien %{0}a inportatu da egutegian"; + +"Compose E-Mail to All Attendees" = "Sortu mezu bat partaide guztientzat"; +"Compose E-Mail to Undecided Attendees" = "Sortu mezu bat ezbaian dauden partaideei"; + +/* Folders */ +"Personal calendar" = "Norberaren egutegia"; + +/* Misc */ + +"OpenGroupware.org" = "OpenGroupware.org"; +"Forbidden" = "Debekatua"; + +/* acls */ + +"Access rights to" = "Hona sartzeko baimenak"; +"For user" = "Erabiltzailearentzat"; + +"Any Authenticated User" = "Identifikatutako erabiltzaile denak"; +"Public Access" = "Sarrera irekia"; + +"label_Public" = "Irekia"; +"label_Private" = "Pribatua"; +"label_Confidential" = "Ezkutukoa"; + +"label_Viewer" = "Ikusi dena"; +"label_DAndTViewer" = "Ikusi eguna eta ordua"; +"label_Modifier" = "Aldatu"; +"label_Responder" = "Erantzun honi"; +"label_None" = "Inor ez"; + +"View All" = "Ikusi dena"; +"View the Date & Time" = "Ikusi eguna eta ordua"; +"Modify" = "Aldatu"; +"Respond To" = "Erantzun honi"; +"None" = "Inor ez"; + +"This person can create objects in my calendar." += "Pertsona honek nire eguteko gauzak sor ditzake"; +"This person can erase objects from my calendar." += "Pertsona honek nire eguteko gauzak ezabatu ditzake"; + +/* Button Titles */ + +"Subscribe to a Calendar..." = "Harpidetu egutegi hau"; +"Remove the selected Calendar" = "Ezabatu egutegi hau"; + +"Name of the Calendar" = "Egutegiaren izena"; + +"new" = "Berria"; +"Print view" = "Inprimatu ikuspegi hau"; +"edit" = "Aldatu"; +"delete" = "Ezabatu"; +"proposal" = "Proposamena egin"; +"Save and Close" = "Gorde eta itxi"; +"Close" = "Itxi"; +"Invite Attendees" = "Partaideak gonbidatu"; +"Attach" = "Erantsi"; +"Update" = "Eguneratu"; +"Cancel" = "Ezeztatu"; +"show_rejected_apts" = "Erakutsi atzera botatako hitzorduak"; +"hide_rejected_apts" = "Ezkutatu atzera botatako hitzorduak"; + + +/* Schedule */ + +"Schedule" = "Ordutegia"; +"No appointments found" = "Ez da hitzordurik aurkitu"; +"Meetings proposed by you" = "Zuk proposatutako bilerak"; +"Meetings proposed to you" = "Zuri proposatutako bilerak"; +"sched_startDateFormat" = "%d/%m %H:%M"; +"action" = "Ekintza"; +"accept" = "Onartu"; +"decline" = "Uko egin"; +"more attendees" = "Partaide gehiago"; +"Hide already accepted and rejected appointments" = "Ezkutatu jada onartu edo baztertutako hitzorduak"; +"Show already accepted and rejected appointments" = "Erakutsi jada onartu edo baztertutako hitzorduak"; + +/* Print view */ + +"LIST" = "Zerrenda"; +"Print Settings" = "Ezarpenak inprimatu"; +"Title:" = "Izena:"; +"Layout:" = "Plana"; +"What to Print" = "Inprimatzeko elementuak"; +"Options" = "Aukerak"; +"Tasks with no due date" = "Amaiera-datarik gabeko eginkizunak"; +"Display working hours only" = "Erakutsi soilik lan-orduak"; +"Completed tasks" = "Amaitutako ekintzak"; +"Display events and tasks colors" = "Erakutsi gertaera eta ekintzen koloreak"; +"Borders" = "Hertzak"; +"Backgrounds" = "Azpikoa"; + +/* Appointments */ + +"Appointment viewer" = "Kontaktuen ikuskatzailea"; +"Appointment editor" = "Kontaktuen editorea"; +"Appointment proposal" = "Hitzordu proposamenak"; +"Appointment on" = "Hitzordua"; +"Start:" = "Hasi:"; +"End:" = "Amaitu:"; +"Due Date:" = "Epemuga:"; +"Title:" = "Izena:"; +"Calendar:" = "Egutegia"; +"Name" = "Izena"; +"Email" = "Emaila"; +"Status:" = "Egoera"; +"% complete" = "% amaituta"; +"Location:" = "Kokapena"; +"Priority:" = "Lehentasuna"; +"Privacy" = "Pribatasuna"; +"Cycle" = "Zikloa"; +"Cycle End" = "Zikloaren amaiera"; +"Categories" = "Kategoriak"; +"Classification" = "Sailkapena"; +"Duration" = "Epea"; +"Attendees:" = "Partaideak:"; +"Resources" = "Baliabideak"; +"Organizer:" = "Antolatzailea:"; +"Description:" = "Deskribapena:"; +"Document:" = "Dokumentua:"; +"Category:" = "Kategoria:"; +"Repeat:" = "Errepikatu:"; +"Reminder:" = "Oroigarria:"; +"General:" = "Orokorra:"; +"Reply:" = "Errepikatu:"; +"Created by:" = "Honek sortua:"; + + +"Target:" = "Helburua:"; + +"attributes" = "ezaugarriak"; +"attendees" = "partaideak"; +"delegated from" = "Beste honek zure esku utzia"; + +/* checkbox title */ +"is private" = "pribatua da"; +/* classification */ +"Public" = "Publikoa"; +"Private" = "Pribatua"; +/* text used in overviews and tooltips */ +"empty title" = "Izenburu hutsa"; +"private appointment" = "Hitzordu pribatua"; + +"Change..." = "Aldatu..."; + +/* Appointments (participation state) */ + +"partStat_NEEDS-ACTION" = "Beranduago berretsiko dut"; +"partStat_ACCEPTED" = "Zain egongo naiz"; +"partStat_DECLINED" = "Ez dut itxarongo"; +"partStat_TENTATIVE" = "Joan nintekeen"; +"partStat_DELEGATED" = "Eskuordetu dut"; +"partStat_OTHER" = "Bestelakoak"; + +/* Appointments (error messages) */ + +"Conflicts found!" = "Arazoak daude!"; +"Invalid iCal data!" = "iCal-aren datak ez du balio!"; +"Could not create iCal data!" = "Ezin izan da iCal-aren data sortu!"; + +/* Searching */ + +"view_all" = "Denak"; +"view_today" = "Gaur"; +"view_next7" = "Hurrengo 7 egunak"; +"view_next14" = "Hurrengo 14 egunak"; +"view_next31" = "Hurrengo 31 egunak"; +"view_thismonth" = "Hilabete hau"; +"view_future" = "Etorkizuneko gertaera guztiak"; +"view_selectedday" = "Aukeratutako eguna"; + +"view_not_started" = "Hasi gabeko ekintzak"; +"view_overdue" = "Epemuga gainditutako zeregina"; +"view_incomplete" = "Amaitu gabeko zeregina"; + +"View:" = "Ikuskatu:"; +"Title, category or location" = "Izenburua, sailkapena edo kokapena"; +"Entire content" = "Eduki osoa"; + +"Search" = "Bilatu"; +"Search attendees" = "Bilatu partaideak"; +"Search resources" = "Bilatu baliabideak"; +"Search appointments" = "Bilatu hitzorduak"; + +"All day Event" = "Egun osoko ekitaldia"; +"check for conflicts" = "Aztertu gatazka"; + +"Browse URL" = "URLa arakatu"; + +"newAttendee" = "Gehitu partaidea"; + +/* calendar modes */ + +"Overview" = "Ikuspegi orokorra"; +"Chart" = "Taula"; +"List" = "Zerrenda"; +"Columns" = "Zutabeak"; + +/* Priorities */ + +"prio_0" = "Zehaztu gabe"; +"prio_1" = "Altua"; +"prio_2" = "Altua"; +"prio_3" = "Altua"; +"prio_4" = "Altua"; +"prio_5" = "Arrunta"; +"prio_6" = "Baxua"; +"prio_7" = "Baxua"; +"prio_8" = "Baxua"; +"prio_9" = "Baxua"; + +/* access classes (privacy) */ +"PUBLIC_vevent" = "Ekitaldi publikoa"; +"CONFIDENTIAL_vevent" = "Isilpekko ekitaldia"; +"PRIVATE_vevent" = "Ekitaldi pribatua"; +"PUBLIC_vtodo" = "Zeregin publikoa"; +"CONFIDENTIAL_vtodo" = "Isilpeko zeregina"; +"PRIVATE_vtodo" = "Zeregin pribatua"; + +/* status type */ +"status_" = "Zehaztu gabe"; +"status_NOT-SPECIFIED" = "Zehaztu gabe"; +"status_TENTATIVE" = "Behin-behineko"; +"status_CONFIRMED" = "Berretsia"; +"status_CANCELLED" = "Ezeztatua"; +"status_NEEDS-ACTION" = "Ekintza behar du"; +"status_IN-PROCESS" = "Prozesuan"; +"status_COMPLETED" = "amaituta"; + +/* Cycles */ + +"cycle_once" = "Ziklo bat egin"; +"cycle_daily" = "Eguneroko zikloa"; +"cycle_weekly" = "Asteroko zikloa"; +"cycle_2weeks" = "2 asteko zikloa"; +"cycle_4weeks" = "4 asteko zikloa"; +"cycle_monthly" = "Hilabeteroko zikloa"; +"cycle_weekday" = "Asteguneko zikloa"; +"cycle_yearly" = "Urteroko zikloa"; + +"cycle_end_never" = "Amaierarik gabeko zikloa"; +"cycle_end_until" = "Zikloaren amaiera noiz arte"; + +"Recurrence pattern" = "Birgertatze-eredua"; +"Range of recurrence" = "Birgertatze tartea"; + +"Repeat" = "Errepikatu"; +"Daily" = "Egunero"; +"Weekly" = "Astero"; +"Monthly" = "Hilabetero"; +"Yearly" = "Urtero"; +"Every" = "Guztietan"; +"Days" = "Egunak"; +"Week(s)" = "Astea(k)"; +"On" = "noiz"; +"Month(s)" = "Hilabetea(k)"; +/* [Event recurrence editor] Ex: _The_ first Sunday */ +"The" = " "; +"Recur on day(s)" = "Egunean(etan) errepikatu"; +"Year(s)" = "Urtea(k)"; +/* [Event recurrence editor] Ex: Every first Sunday _of_ April */ +"cycle_of" = " "; +"No end date" = "Amaiaera datarik gabe"; +"Create" = "Sortu"; +"appointment(s)" = "hitzordua(k)"; +"Repeat until" = "Errepikatu honaino"; + +"First" = "Lehenengoa"; +"Second" = "Bigarrena"; +"Third" = "Hirugarrena"; +"Fourth" = "Laugarrena"; +"Fift" = "Bosgarrena"; +"Last" = "Azkena"; + +/* Appointment categories */ + +"category_none" = "Bat ere ez"; +"category_labels" = "Urteurrena, Urtebetetzea, Negozio, Deiak, Bezeroak, Lehia, Bezeroa, Gogokoak, Jarraitu, Opariak, Oporrak, Ideiak, Bilera, Aleak, Denetarik, Pertsonala, Proiektuak, Jaieguna, Egoera, Hornitzaileak, Bidaia, Oporrak"; + +"repeat_NEVER" = "Ez errepikatu"; +"repeat_DAILY" = "Egunero"; +"repeat_WEEKLY" = "Astero"; +"repeat_BI-WEEKLY" = "Bi astero"; +"repeat_EVERY WEEKDAY" = "Astegun guztietan"; +"repeat_MONTHLY" = "Hilabetero"; +"repeat_YEARLY" = "Urtero"; +"repeat_CUSTOM" = "Pertsonalizatu..."; + +"reminder_NONE" = "Oroigarririk ez"; +"reminder_5_MINUTES_BEFORE" = "5 minutu lehenago"; +"reminder_10_MINUTES_BEFORE" = "10 minutu lehenago"; +"reminder_15_MINUTES_BEFORE" = "15 minutu lehenago"; +"reminder_30_MINUTES_BEFORE" = "30 minutu lehenago"; +"reminder_45_MINUTES_BEFORE" = "45 minutu lehenago"; +"reminder_1_HOUR_BEFORE" = "Ordu 1 lehenago"; +"reminder_2_HOURS_BEFORE" = "2 ordu lehenago"; +"reminder_5_HOURS_BEFORE" = "5 ordu lehenago"; +"reminder_15_HOURS_BEFORE" = "15 ordu lehenago"; +"reminder_1_DAY_BEFORE" = "Egun 1 lehenago"; +"reminder_2_DAYS_BEFORE" = "2 egun lehenago"; +"reminder_1_WEEK_BEFORE" = "Aste 1 lehenago"; +"reminder_CUSTOM" = "Pertsonalizatu..."; + +"reminder_MINUTES" = "minutuak"; +"reminder_HOURS" = "orduak"; +"reminder_DAYS" = "egunak"; +"reminder_BEFORE" = "lehenago"; +"reminder_AFTER" = "ondoren"; +"reminder_START" = "gertaera hasi da"; +"reminder_END" = "gertaera amaitu da"; +"Reminder Details" = "Ohartarapenaren xehetasunak"; + +"Choose a Reminder Action" = "Ohartapenaren ekintza aukeratu"; +"Show an Alert" = "Erakutsi alarmak"; +"Send an E-mail" = "Bidali mezua"; +"Email Organizer" = "Mezu-antolatzailea"; +"Email Attendees" = "Mezuen partaideak"; + +"zoom_400" = "400%"; +"zoom_200" = "200%"; +"zoom_100" = "100%"; +"zoom_50" = "50%"; +"zoom_25" = "25%"; + +/* transparency */ + +"Show Time as Free" = "Erakutsi denbora librea"; + +/* email notifications */ +"Send Appointment Notifications" = "Bidali hitzordu jakinarazpenak"; + +/* validation errors */ + +validate_notitle = "Ez du izenbururik, jarraitu?"; +validate_invalid_startdate = "Hasierako dataren eremua gaizki dago!"; +validate_invalid_enddate = "Amaiaerako dataren eremua gaizki dago!"; +validate_endbeforestart = "Ipini duzun amaiera-data hasiera-dataren aurretik da."; + +"Events" = "Gertakaria"; +"Tasks" = "Zeregin"; +"Show completed tasks" = "Erakutsi amaitutako zereginak"; + +/* tabs */ +"Task" = "Zeregin"; +"Event" = "Gertakari"; +"Recurrence" = "Birgertatzea"; + +/* toolbar */ +"New Event" = "Gertakari berria"; +"New Task" = "Zeregin berria"; +"Edit" = "Aldatu"; +"Delete" = "Ezabatu"; +"Go to Today" = "Gaurko egunera joan"; +"Day View" = "Eguneko ikuspegia"; +"Week View" = "Asteko ikuspegia"; +"Month View" = "Hileko ikuspegia"; +"Reload" = "Birkargatu"; + +"eventPartStatModificationError" = "Zure partaidetzaren izaera ezin da aldatu."; + +/* menu */ +"New Event..." = "Gertakari berria..."; +"New Task..." = "Zeregin berria..."; +"Edit Selected Event..." = "Aldatu aukeratutako gertakaria..."; +"Delete Selected Event" = "Ezabatu aukeratutako gertakaria"; +"Select All" = "Denak aukeratu"; +"Workweek days only" = "Lanegunak soilik"; +"Tasks in View" = "Zereginak ikuspegian"; + +"eventDeleteConfirmation" = "Ondorengo gertakaria(k) ezabatuko da(dira):"; +"taskDeleteConfirmation" = "Ondorengo zeregina(k) ezabatuko da(dira):"; +"Would you like to continue?" = "Jarraitu nahi duzu?"; + +"You cannot remove nor unsubscribe from your personal calendar." += "Ezin duzu ezabatu edo harpidetza kendu zure egutegi pertsonala."; +"Are you sure you want to delete the calendar \"%{0}\"?" += "Ziru zaude \"%{0}\" egutegia ezabatu nahi duzula?"; + +/* Legend */ +"Participant" = "Parte-hartzailea"; +"Optional Participant" = "Hautazko parte-hartzailea"; +"Non Participant" = "Ez parte-hartzailea"; +"Chair" = "Aulkia"; + +"Needs action" = "Ekintza behar du"; +"Accepted" = "Onartua"; +"Declined" = "Ezetsia"; +"Tentative" = "Behin-behineko"; + +"Free" = "Libre"; +"Busy" = "Lanpetuta"; +"Maybe busy" = "Beharbada lanpetuta"; +"No free-busy information" = "Libre/lanpetu informaziorik ez"; + +/* FreeBusy panel buttons and labels */ +"Suggest time slot:" = "Iradoki denbora hutsunea:"; +"Zoom:" = "Zoom:"; +"Previous slot" = "Aurreko hutsunea"; +"Next slot" = "Hurrengo hutsunea"; +"Previous hour" = "Aurreko ordua"; +"Next hour" = "Hurrengo ordua"; +"Work days only" = "Lan egunak soilik"; +"The whole day" = "Egun osoa"; +"Between" = "Tartean"; +"and" = "eta"; + +"A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?" += "Partaide bat edo gehiagorekin denbora gatazka bat dago. \nHala ere uneko ezarpena mantendu nahi duzu?"; + +/* apt list */ +"Title" = "Izenburua"; +"Start" = "Hasi:"; +"End" = "Amaitu:"; +"Due Date" = "Epemuga:"; +"Location" = "Kokapena"; + +"(Private Event)" = "(Ekitaldi pribatua)"; + +vevent_class0 = "(Ekitaldi publikoa)"; +vevent_class1 = "(Ekitaldi pribatua)"; +vevent_class2 = "(Isilpeko ekitaldia)"; + +"Priority" = "Lehentasuna"; +"Category" = "Kategoria"; + +vtodo_class0 = "(Zeregin publikoa)"; +vtodo_class1 = "(Zeregin pribatua)"; +vtodo_class2 = "(Isilpeko zeregina)"; + +"closeThisWindowMessage" = "Eskerrik asko! Leiho hau itxi dezakezu edo ikusi zure"; +"Multicolumn Day View" = "Zutabe anitzeko eguneko ikuspegia"; + +"Please select an event or a task." = "Mesedez, aukeratu ekitaldi edo egiteko bat."; + +"editRepeatingItem" = "Aldatzen ari zaren elementua errepikapen elementu bat da. Elementu honen agerraldi guztiak aldatu nahi dituzu edo agerrladi hau bakarrik?"; +"button_thisOccurrenceOnly" = "Agerraldi hau bakarrik"; +"button_allOccurrences" = "Agerraldi guztiak"; + +/* Properties dialog */ +"Name:" = "Izena:"; +"Color:" = "Kolorea:"; + +"Include in free-busy" = "libre-lanpetua-n gehitu"; + +"Synchronization" = "Sinkronizatzea"; +"Synchronize" = "Sinkronizatu"; +"Tag:" = "Etiketa:"; + +"Display" = "Bistaratu"; +"Show alarms" = "Erakutsi alarmak"; +"Show tasks" = "Erakutsi zereginak"; + +"Notifications" = "Jakinarazpenak"; +"Receive a mail when I modify my calendar" = "Jaso mezua nere egutegia aldatzen dudanean"; +"Receive a mail when someone else modifies my calendar" = "Jaso mezua edonorkl nere egutegia aldatzen duenean"; +"When I modify my calendar, send a mail to:" = "Nere egutegia aldatzen dudanean, bidali mezua honi:"; + +"Links to this Calendar" = "Egutegi honetarako estekak"; +"Authenticated User Access" = "Autentifikatutako erabiltzaileentzako atzipena"; +"CalDAV URL" = "CalDAV URL-a:"; +"WebDAV ICS URL" = "WebDAV ICS URL-a"; +"WebDAV XML URL" = "WebDAV XML URL-a"; + +/* Error messages */ +"dayFieldInvalid" = "Mesedez, idatz ezazu zenbakizko balio bat, 1 baino handiago edo berdin, eguna eremuan."; +"weekFieldInvalid" = "Mesedez, idatz ezazu zenbakizko balio bat, 1 baino handiago edo berdin, astea(k) eremuan."; +"monthFieldInvalid" = "Mesedez, idatz ezazu zenbakizko balio bat, 1 baino handiago edo berdin, hilabetea(k) eremuan."; +"monthDayFieldInvalid" = "Mesedez, idatz ezazu zenbakizko balio bat, 1 baino handiago edo berdin, hilabetearen eguna eremuan."; +"yearFieldInvalid" = "Mesedez, idatz ezazu zenbakizko balio bat, 1 baino handiago edo berdin, urtea(k) eremuan."; +"appointmentFieldInvalid" = "Mesedez, idatz ezazu zenbakizko balio bat, 1 baino handiago edo berdin, hitzordua(k) eremuan."; +"recurrenceUnsupported" = "Mota honetako errekurtsioa ez da momentuz onartzen."; +"Please specify a calendar name." = "Mesedez, zehaztu egutegiaren izena."; +"tagNotDefined" = "Egutegi hau sinkronizatu nahi baduzu etiketa bat zehaztu behar duzu."; +"tagAlreadyExists" = "Zehaztutako etiketa beste egutegi batekin dago lotuta jada."; +"tagHasChanged" = "Zure egutegiaren etiketa aldatzen baduzu, zure mugikorrean data birkargatu beharko duzu.\nJarraitu nahi duzu?"; +"tagWasAdded" = "Egutegi hau sinkronizatu nahi baduzu, zure mugikorrean data birkargatu beharko duzu.\nJarraitu nahi duzu?"; +"tagWasRemoved" = "Egutegi hau sinkronizaziotik kentzen baduzu zure mugikorrean data birkargatu beharko duzu.\nJarraitu nahi duzu?"; +"DestinationCalendarError" = "Jatorrizko eta helburu egutegiak berdinak dira. Mesedez, saiatu beste egutegi batean kopiatzen."; +"EventCopyError" = "Kopiak hutsegin du. Mesedez, saiatu beste egutegi batean kopiatzen."; +"Please select at least one calendar" = "Mesedez, zehaztu gutxienez egutegi bat"; + +"Open Task..." = "Ireki zeregina..."; +"Mark Completed" = "Markatu amaituta"; +"Delete Task" = "Ezabatu egitekoa"; +"Delete Event" = "Ezabatu ekitaldia"; +"Copy event to my calendar" = "Kpiatu ekitaldia nere egutegian"; +"View Raw Source" = "Ikusi Raw iturburua"; + +"Subscribe to a web calendar..." = "Harpidetu web egutegi bat..."; +"URL of the Calendar" = "Egutegiaren URL-a"; +"Web Calendar" = "Web egutegia"; +"Reload on login" = "Birkargatu saio hasieran"; +"Invalid number." = "Zenbaki baliogabea."; +"Please identify yourself to %{0}" = "Mesedez, %{0}-ren aurrean identifikatu zaitez"; diff --git a/UI/Scheduler/GNUmakefile b/UI/Scheduler/GNUmakefile index 4c0765244..5c3d00357 100644 --- a/UI/Scheduler/GNUmakefile +++ b/UI/Scheduler/GNUmakefile @@ -6,7 +6,7 @@ BUNDLE_NAME = SchedulerUI SchedulerUI_PRINCIPAL_CLASS = SchedulerUIProduct -SchedulerUI_LANGUAGES = Arabic BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh +SchedulerUI_LANGUAGES = Arabic Basque BrazilianPortuguese Catalan Czech Danish Dutch English Finnish French German Hungarian Icelandic Italian NorwegianBokmal NorwegianNynorsk Polish Russian Slovak SpanishSpain SpanishArgentina Swedish Ukrainian Welsh SchedulerUI_OBJC_FILES = \ SchedulerUIProduct.m \ From dfb960eac423292e0be74cd8e1ad1f301cc215f2 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 27 Apr 2015 14:57:44 -0400 Subject: [PATCH 040/109] Disabled -Werr for now --- OpenChange/GNUmakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenChange/GNUmakefile b/OpenChange/GNUmakefile index e443ec3f6..1b9570a94 100644 --- a/OpenChange/GNUmakefile +++ b/OpenChange/GNUmakefile @@ -175,7 +175,7 @@ $(SOGOBACKEND)_LIB_DIRS += \ $(LIBMAPISTORE_LIBS) ADDITIONAL_INCLUDE_DIRS += \ - -Werror -Wall \ + -Wall \ -DSAMBA_PRIVATE_DIR=@"\"$(SAMBA_PRIVATE_DIR)\"" \ $(LIBMAPI_CFLAGS) \ $(LIBMAPISTORE_CFLAGS) \ From f2b5f5917b123eade52c13903a6cc3486ca85e7a Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 27 Apr 2015 15:02:00 -0400 Subject: [PATCH 041/109] Fixed dot notation --- OpenChange/RTFHandler.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenChange/RTFHandler.m b/OpenChange/RTFHandler.m index e7be0f14e..0df3f1fd3 100644 --- a/OpenChange/RTFHandler.m +++ b/OpenChange/RTFHandler.m @@ -885,16 +885,16 @@ const unsigned short ansicpg874[256] = { char *v = NULL; if (fontInfo && fontInfo->name) { - if (fontInfo->name.length < 128) + if ([fontInfo->name length] < 128) { - int tag_size = 15 + fontInfo->name.length; + int tag_size = 15 + [fontInfo->name length]; v = calloc(tag_size, sizeof(char)); snprintf(v, tag_size, "", [fontInfo->name UTF8String]); } else { NSLog(@"RTFHandler: Font %u has %d chars length, parse error? " - "Ignored", font_index, fontInfo->name.length); + "Ignored", font_index, [fontInfo->name length]); v = calloc(7, sizeof(char)); sprintf(v, ""); } From 7ff12c7a64bf86a039ee6c9ca4f33ad91cbb26bd Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 27 Apr 2015 15:07:44 -0400 Subject: [PATCH 042/109] Updated NEWS file regarding Zentyal's PRs --- NEWS | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index d435d84a2..fd2f63b5e 100644 --- a/NEWS +++ b/NEWS @@ -1,11 +1,20 @@ 2.2.18 (2015-04-XX) ------------------- +New features + - Internet headers are now shown in Outlook (Zentyal) + Enhancements - improved multipart handling using EAS - added systemd startup script (PR#76) - added Basque translation - thanks to Gorka Gonzalez - - updated Brazilian (Portuguese), Dutch, Norwegian (Bokmal), Polish, Russian, and Spanish (Spain) translations + - updated Brazilian (Portuguese), Dutch, Norwegian (Bokmal), Polish, Russian, and Spanish (Spain) translations Enhancements + - Sharing request among different Outlook versions (Zentyal) + - Improve sync speed from Outlook by non-reprocessing already downloaded unread mails (Zentyal) + - Give support to calendar sharing invitations + - Missing contact fields are now saved and available when sharing it (Office, Profession, Manager's name, Assistant's name, Spouse/Partner, Anniversary) (Zentyal) + - Appointment color and importance work now between Outlooks (Zentyal) + - Synchronize events, contacts and tasks in reverse chronological order (Zentyal) Bug fixes - now keep the BodyPreference for future EAS use and default to MIME if none set (#3146) @@ -19,6 +28,22 @@ Bug fixes - fixed serialization of the PreventInvitationsWhitelist settings - fixed md4 support (for NTLM password changes) with GNU TLS - fixed edition of attachment URL in event/task editor + - Sent mails are not longer in Drafts folder using Outlook (Zentyal) + - Deleted mails are properly synced between Outlook profiles from the same account (Zentyal) + - Does not create a mail folder in other user's mailbox (Zentyal) + - Fix server-side crash with invalid events (Zentyal) + - Fix setting permissions for a folder with several users (Zentyal) + - Fix reception of calendar event invitations on optional attendees (Zentyal) + - Fix server side crash parsing rtf without color table (Zentyal) + - Weekly recurring events created in SOGo web interface are now shown in Outlook (Zentyal) + - Fix exception modifications import in recurrence series (Zentyal) + - Fix server side crash parsing rtf emails with images (with word97 format) (Zentyal) + - Fix sender on importing email messages like event invitations (Zentyal) + - Fix Outlook crashes when modifying the view of a folder (Zentyal) + - Fix server side crash when reading some recurrence appointments (Zentyal) + - Outlook clients can use reply all functionality on multidomain environment (Zentyal) + - Optional attendes on events are now shown properly (Zentyal) + 2.2.17a (2015-03-15) -------------------- From 50896eb526b2bb1b3f50c9b5ef2bf183fab156cf Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 28 Apr 2015 14:44:29 -0400 Subject: [PATCH 043/109] (i18n) Improve Basque Locale file --- UI/MainUI/Basque.lproj/Locale | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/UI/MainUI/Basque.lproj/Locale b/UI/MainUI/Basque.lproj/Locale index 81ff8eb45..21d995e19 100644 --- a/UI/MainUI/Basque.lproj/Locale +++ b/UI/MainUI/Basque.lproj/Locale @@ -7,7 +7,7 @@ NSParentContext = ""; NSAMPMDesignation = (AM, PM); - NSCurrencySymbol = "$"; + NSCurrencySymbol = " €"; NSDateFormatString = "%A, %B %e, %Y"; NSDateTimeOrdering = YMDH; NSDecimalDigits = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); @@ -30,6 +30,6 @@ NSTimeFormatString = "%I:%M:%S %p"; NSWeekDayNameArray = (Igandea, Astelehena, Asteartea, Asteazkena, Osteguna, Ostirala, Larunbata); NSYearMonthWeekDesignations = (urtea, hilabetea, astea); - NSPositiveCurrencyFormatString = "9.999,00"; - NSNegativeCurrencyFormatString = "-9.999,00"; + NSPositiveCurrencyFormatString = "9.999,00$"; + NSNegativeCurrencyFormatString = "-9.999,00$"; } From a37f43866343131b7da329020193d10684c72092 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 4 May 2015 09:11:52 -0400 Subject: [PATCH 044/109] (fix) the EAS maximum response size being per-folder, and not global --- ActiveSync/SOGoActiveSyncDispatcher+Sync.m | 3 +++ NEWS | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m index 9c306061a..e0561ff31 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m +++ b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m @@ -1452,6 +1452,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. inBuffer: s changeDetected: &changeDetected maxSyncResponseSize: maxSyncResponseSize]; + + if (maxSyncResponseSize > 0 && [s length] >= maxSyncResponseSize) + break; } if (changeDetected) diff --git a/NEWS b/NEWS index fd2f63b5e..992a01184 100644 --- a/NEWS +++ b/NEWS @@ -43,7 +43,7 @@ Bug fixes - Fix server side crash when reading some recurrence appointments (Zentyal) - Outlook clients can use reply all functionality on multidomain environment (Zentyal) - Optional attendes on events are now shown properly (Zentyal) - + - fixed the EAS maximum response size being per-folder, and not global 2.2.17a (2015-03-15) -------------------- From fbb779a71d6fc1b97ccfb7ba5a68f02ab973f43a Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 6 May 2015 16:03:33 -0400 Subject: [PATCH 045/109] (fix) During login, we now extract the domain from the user to accelerate authentication requests on sources --- NEWS | 1 + SoObjects/SOGo/SOGoUserManager.m | 36 +++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 992a01184..672072ade 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,7 @@ Enhancements - Missing contact fields are now saved and available when sharing it (Office, Profession, Manager's name, Assistant's name, Spouse/Partner, Anniversary) (Zentyal) - Appointment color and importance work now between Outlooks (Zentyal) - Synchronize events, contacts and tasks in reverse chronological order (Zentyal) + - During login, we now extract the domain from the user to accelerate authentication requests on sources Bug fixes - now keep the BodyPreference for future EAS use and default to MIME if none set (#3146) diff --git a/SoObjects/SOGo/SOGoUserManager.m b/SoObjects/SOGo/SOGoUserManager.m index 125ca3fcc..ae4d8612d 100644 --- a/SoObjects/SOGo/SOGoUserManager.m +++ b/SoObjects/SOGo/SOGoUserManager.m @@ -479,17 +479,47 @@ static Class NSNullK; NSString *dictPassword, *username, *jsonUser; SOGoSystemDefaults *dd; BOOL checkOK; - + + dd = [SOGoSystemDefaults sharedSystemDefaults]; + // We check for cached passwords. If the entry is cached, we // check this immediately. If not, we'll go directly at the // authentication source and try to validate there, then cache it. if (*_domain != nil) username = [NSString stringWithFormat: @"%@@%@", _login, *_domain]; else - username = _login; + { + NSRange r; + + username = _login; + + // We try to extract the domain in use in order to avoid pounding all the authentication + // sources if SOGoLoginDomains isn't specified. This is also true if the user is + // using DAV or EAS. + r = [username rangeOfString: @"@"]; + + if (r.location != NSNotFound) + { + NSArray *allDomains; + int i; + + *_domain = [username substringFromIndex: r.location+1]; + + allDomains = [[dd dictionaryForKey: @"domains"] allValues]; + + for (i = 0; i < [allDomains count]; i++) + { + if ([*_domain isEqualToString: [[allDomains objectAtIndex: i] objectForKey: @"SOGoMailDomain"]]) + break; + } + + // We haven't found one + if (i == [allDomains count]) + *_domain = nil; + } + } failedCount = [[SOGoCache sharedCache] failedCountForLogin: username]; - dd = [SOGoSystemDefaults sharedSystemDefaults]; // // We check the fail count per user in memcache (per server). If the From 4826f0155552d56a98712dff1a607a2504b98591 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 12 May 2015 09:52:13 -0400 Subject: [PATCH 046/109] (fix) fixed EAS replies decoding from Outlook (#3123) --- NEWS | 1 + SoObjects/Mailer/SOGoMailObject.m | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/NEWS b/NEWS index 672072ade..1fb8ad6c4 100644 --- a/NEWS +++ b/NEWS @@ -83,6 +83,7 @@ Bug fixes - 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) + - fixed EAS replies decoding from Outlook (#3123) 2.2.16 (2015-02-12) ------------------- diff --git a/SoObjects/Mailer/SOGoMailObject.m b/SoObjects/Mailer/SOGoMailObject.m index f99bcf49d..2aabcaa75 100644 --- a/SoObjects/Mailer/SOGoMailObject.m +++ b/SoObjects/Mailer/SOGoMailObject.m @@ -384,6 +384,11 @@ static BOOL debugSoParts = NO; _path = [_path componentsSeparatedByString: @"."]; } + // deal with mails of type text/calendar + if ([[[info valueForKey: @"type"] lowercaseString] isEqualToString: @"text"] && + [[[info valueForKey: @"subtype"] lowercaseString] isEqualToString: @"calendar"]) + return info; + /* For each path component, eg 1,1,3 From f666b436dd40e48de67c8f1f6e29b65c714f9e52 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 12 May 2015 09:59:01 -0400 Subject: [PATCH 047/109] (fix) make sure sure email invitations can always be read by EAS clients --- ActiveSync/SOGoMailObject+ActiveSync.m | 66 +++++++++++++++++++++++++- NEWS | 43 +++++++++-------- 2 files changed, 87 insertions(+), 22 deletions(-) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index 15e3b1ca7..da4539347 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -49,6 +49,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import #import #import +#import #import #import @@ -74,6 +75,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#import + typedef struct { uint32_t dwLowDateTime; uint32_t dwHighDateTime; @@ -452,7 +455,7 @@ struct GlobalObjectId { // We get the right part based on the preference if (theType == 1 || theType == 2) { - if ([type isEqualToString: @"text"]) + if ([type isEqualToString: @"text"] && ![subtype isEqualToString: @"calendar"]) { NSString *s, *charset; @@ -511,9 +514,37 @@ struct GlobalObjectId { - (iCalCalendar *) calendarFromIMIPMessage { NSDictionary *part; + NSString *type, *subtype; NSArray *parts; int i; + type = [[[self bodyStructure] valueForKey: @"type"] lowercaseString]; + subtype = [[[self bodyStructure] valueForKey: @"subtype"] lowercaseString]; + + // process mail of type text/calendar + if ([type isEqualToString: @"text"] && [subtype isEqualToString: @"calendar"]) + { + iCalCalendar *calendar; + NSString *encoding; + NSData *calendarData; + + encoding = [[[self bodyStructure] valueForKey: @"encoding"] lowercaseString]; + calendarData = [[self fetchPlainTextParts] objectForKey: @""]; + + if ([encoding caseInsensitiveCompare: @"base64"] == NSOrderedSame) + calendarData = [calendarData dataByDecodingBase64]; + else if ([encoding caseInsensitiveCompare: @"quoted-printable"] == NSOrderedSame) + calendarData = [calendarData dataByDecodingQuotedPrintableTransferEncoding]; + + NS_DURING + calendar = [iCalCalendar parseSingleFromSource: calendarData]; + NS_HANDLER + calendar = nil; + NS_ENDHANDLER + + return calendar; + } + // We check if we have at least 2 parts and if one of them is a text/calendar parts = [[self bodyStructure] objectForKey: @"parts"]; @@ -783,6 +814,39 @@ struct GlobalObjectId { nativeBodyType = 1; d = [self _preferredBodyDataUsingType: preferredBodyType nativeType: &nativeBodyType]; + + if (calendar && !d) + { + WOApplication *app; + SOGoAptMailNotification *p; + NSString *pageName; + + nativeBodyType = 2; + + /* get WOApplication instance */ + app = [WOApplication application]; + + /* create page name */ + pageName = [NSString stringWithFormat: @"SOGoAptMail%@", @"Invitation"]; + /* construct message content */ + p = [app pageWithName: pageName inContext: context]; + [p setApt: (iCalEvent *) [[calendar events] lastObject]]; + + if ([[ [[calendar events] lastObject] organizer] cn] && [[[ [[calendar events] lastObject] organizer] cn] length]) + { + [p setOrganizerName: [[ [[calendar events] lastObject] organizer] cn]]; + } + else + { + [p setOrganizerName: [[SOGoUser userWithLogin: owner] cn]]; + } + + if (preferredBodyType == 1 && nativeBodyType == 2) + d = [[[p getBody] htmlToText] dataUsingEncoding: NSUTF8StringEncoding]; + else + d = [[p getBody] dataUsingEncoding: NSUTF8StringEncoding]; + + } if (d) { diff --git a/NEWS b/NEWS index 1fb8ad6c4..ab745b271 100644 --- a/NEWS +++ b/NEWS @@ -9,13 +9,14 @@ Enhancements - added systemd startup script (PR#76) - added Basque translation - thanks to Gorka Gonzalez - updated Brazilian (Portuguese), Dutch, Norwegian (Bokmal), Polish, Russian, and Spanish (Spain) translations Enhancements - - Sharing request among different Outlook versions (Zentyal) - - Improve sync speed from Outlook by non-reprocessing already downloaded unread mails (Zentyal) - - Give support to calendar sharing invitations - - Missing contact fields are now saved and available when sharing it (Office, Profession, Manager's name, Assistant's name, Spouse/Partner, Anniversary) (Zentyal) - - Appointment color and importance work now between Outlooks (Zentyal) - - Synchronize events, contacts and tasks in reverse chronological order (Zentyal) - - During login, we now extract the domain from the user to accelerate authentication requests on sources + - sharing request among different Outlook versions (Zentyal) + - improve sync speed from Outlook by non-reprocessing already downloaded unread mails (Zentyal) + - give support to calendar sharing invitations + - missing contact fields are now saved and available when sharing it (Office, Profession, Manager's name, Assistant's name, Spouse/Partner, Anniversary) (Zentyal) + - appointment color and importance work now between Outlooks (Zentyal) + - synchronize events, contacts and tasks in reverse chronological order (Zentyal) + - during login, we now extract the domain from the user to accelerate authentication requests on sources + - make sure sure email invitations can always be read by EAS clients Bug fixes - now keep the BodyPreference for future EAS use and default to MIME if none set (#3146) @@ -29,21 +30,21 @@ Bug fixes - fixed serialization of the PreventInvitationsWhitelist settings - fixed md4 support (for NTLM password changes) with GNU TLS - fixed edition of attachment URL in event/task editor - - Sent mails are not longer in Drafts folder using Outlook (Zentyal) - - Deleted mails are properly synced between Outlook profiles from the same account (Zentyal) - - Does not create a mail folder in other user's mailbox (Zentyal) - - Fix server-side crash with invalid events (Zentyal) - - Fix setting permissions for a folder with several users (Zentyal) - - Fix reception of calendar event invitations on optional attendees (Zentyal) - - Fix server side crash parsing rtf without color table (Zentyal) - - Weekly recurring events created in SOGo web interface are now shown in Outlook (Zentyal) - - Fix exception modifications import in recurrence series (Zentyal) - - Fix server side crash parsing rtf emails with images (with word97 format) (Zentyal) - - Fix sender on importing email messages like event invitations (Zentyal) - - Fix Outlook crashes when modifying the view of a folder (Zentyal) - - Fix server side crash when reading some recurrence appointments (Zentyal) + - sent mails are not longer in Drafts folder using Outlook (Zentyal) + - deleted mails are properly synced between Outlook profiles from the same account (Zentyal) + - does not create a mail folder in other user's mailbox (Zentyal) + - fix server-side crash with invalid events (Zentyal) + - fix setting permissions for a folder with several users (Zentyal) + - fix reception of calendar event invitations on optional attendees (Zentyal) + - fix server side crash parsing rtf without color table (Zentyal) + - weekly recurring events created in SOGo web interface are now shown in Outlook (Zentyal) + - fix exception modifications import in recurrence series (Zentyal) + - fix server side crash parsing rtf emails with images (with word97 format) (Zentyal) + - fix sender on importing email messages like event invitations (Zentyal) + - fix Outlook crashes when modifying the view of a folder (Zentyal) + - fix server side crash when reading some recurrence appointments (Zentyal) - Outlook clients can use reply all functionality on multidomain environment (Zentyal) - - Optional attendes on events are now shown properly (Zentyal) + - optional attendes on events are now shown properly (Zentyal) - fixed the EAS maximum response size being per-folder, and not global 2.2.17a (2015-03-15) From ee8caa5a990ced533059020ad82c21ebb66a541f Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 12 May 2015 10:05:45 -0400 Subject: [PATCH 048/109] (fix) now set MeetingMessageType only for EAS 14.1 --- ActiveSync/SOGoMailObject+ActiveSync.m | 4 +++- NEWS | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index da4539347..8cb72900c 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -787,7 +787,9 @@ struct GlobalObjectId { [s appendFormat: @"%@", [globalObjId activeSyncRepresentationInContext: context]]; // We set the right message type - we must set AS version to 14.1 for this - [s appendFormat: @"%d", 1]; + if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.1"]) + [s appendFormat: @"%d", 1]; + [s appendString: @""]; // ContentClass diff --git a/NEWS b/NEWS index ab745b271..1806f1cb5 100644 --- a/NEWS +++ b/NEWS @@ -46,6 +46,7 @@ Bug fixes - Outlook clients can use reply all functionality on multidomain environment (Zentyal) - optional attendes on events are now shown properly (Zentyal) - fixed the EAS maximum response size being per-folder, and not global + - now set MeetingMessageType only for EAS 14.1 2.2.17a (2015-03-15) -------------------- From 2c78d60e4abeb972ecc86e3d3ecd43ca376a5c84 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 12 May 2015 10:12:57 -0400 Subject: [PATCH 049/109] (fix) now correct handle external invitations using EAS --- ActiveSync/SOGoActiveSyncDispatcher.m | 20 +++++++++++++++++++- NEWS | 1 + 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index e2e301565..36e38bb2b 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -1454,6 +1454,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. appointmentObject = [collection lookupName: [NSString stringWithFormat: @"%@.ics", [event uid]] inContext: context acquire: NO]; + + // Create the appointment if it is not added to calendar yet + if ([appointmentObject isKindOfClass: [NSException class]]) + { + appointmentObject = [[SOGoAppointmentObject alloc] initWithName: [NSString stringWithFormat: @"%@.ics", [event uid]] + inContainer: collection]; + [appointmentObject saveComponent: event]; + } } } @@ -1489,7 +1497,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } else { - [theResponse setStatus: 500]; + [s appendString: @""]; + [s appendString: @""]; + [s appendString: @""]; + [s appendString: @""]; + [s appendFormat: @"%@", requestId]; + [s appendFormat: @"%d", 2]; + [s appendString: @""]; + [s appendString: @""]; + d = [[s dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml]; + + [theResponse setContent: d]; } } diff --git a/NEWS b/NEWS index 1806f1cb5..9dd1820c1 100644 --- a/NEWS +++ b/NEWS @@ -47,6 +47,7 @@ Bug fixes - optional attendes on events are now shown properly (Zentyal) - fixed the EAS maximum response size being per-folder, and not global - now set MeetingMessageType only for EAS 14.1 + - now correct handle external invitations using EAS 2.2.17a (2015-03-15) -------------------- From 364a07bd05834c356ba4c3391b0a20ca52d7073e Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 12 May 2015 10:15:07 -0400 Subject: [PATCH 050/109] set the preferred body type for meeting response --- ActiveSync/SOGoMailObject+ActiveSync.m | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index 8cb72900c..3b9af73ae 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -846,7 +846,10 @@ struct GlobalObjectId { if (preferredBodyType == 1 && nativeBodyType == 2) d = [[[p getBody] htmlToText] dataUsingEncoding: NSUTF8StringEncoding]; else - d = [[p getBody] dataUsingEncoding: NSUTF8StringEncoding]; + { + preferredBodyType = 2; + d = [[p getBody] dataUsingEncoding: NSUTF8StringEncoding]; + } } From 64da65d827a282de96353eeed3179c6e2886a228 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 12 May 2015 10:19:20 -0400 Subject: [PATCH 051/109] (fix) fallback to Latin1 when trying to parse versit data --- SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m b/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m index b7cc0144c..d9b906c8e 100644 --- a/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m +++ b/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m @@ -1075,6 +1075,12 @@ static NSCharacterSet *whitespaceCharSet = nil; // FIXME: Data is not always utf-8..... source = [[[NSString alloc] initWithData: _data encoding: encoding] autorelease]; + + // We fallback to ISO-8859-1 string encoding + if (!source) + source = [[[NSString alloc] initWithData: _data encoding: NSISOLatin1StringEncoding] + autorelease]; + if (!source) { e = (id)[SaxParseException exceptionWithName: @"SaxIOException" From 619e9fe7ddc2696ebd6ef58eee73f7884d2a2c47 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 12 May 2015 10:28:47 -0400 Subject: [PATCH 052/109] (fix) now correctly handle multiple email addresses in the GAL over EAS --- ActiveSync/SOGoActiveSyncDispatcher.m | 61 +++++++++++++++++++++------ NEWS | 3 +- 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index 36e38bb2b..e9264283d 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -2109,13 +2109,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. inResponse: (WOResponse *) theResponse { SOGoContactSourceFolder *currentFolder; + NSArray *allKeys, *allContacts, *mails; NSDictionary *systemSources, *contact; + NSString *name, *query, *current_mail; SOGoContactFolders *contactFolders; - NSArray *allKeys, *allContacts; SOGoUserFolder *userFolder; - NSString *name, *query; NSMutableString *s; NSData *d; + id o; int i, j, total; @@ -2166,18 +2167,50 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // We get the LDIF entry of our record, for easier processing contact = [[currentFolder lookupName: [contact objectForKey: @"c_name"] inContext: context acquire: NO] ldifRecord]; - - [s appendString: @""]; - [s appendString: @""]; - [s appendFormat: @"%@", [contact objectForKey: @"displayname"]]; - [s appendFormat: @"%@", [contact objectForKey: @"givenname"]]; - [s appendFormat: @"%@", [contact objectForKey: @"sn"]]; - [s appendFormat: @"%@", [contact objectForKey: @"mail"]]; - [s appendFormat: @"%@", [contact objectForKey: @"telephonenumber"]]; - [s appendFormat: @"%@", [contact objectForKey: @"o"]]; - [s appendString: @""]; - [s appendString: @""]; - total++; + + o = [contact objectForKey: @"mail"]; + if ([o isKindOfClass: [NSArray class]]) + mails = o; + else + mails = [NSArray arrayWithObjects: o ? o : @"", nil]; + + for (total = 0; total < [mails count]; total++) + { + current_mail = [mails objectAtIndex: total]; + + [s appendString: @""]; + [s appendString: @""]; + + if ((o = [contact objectForKey: @"displayname"])) + [s appendFormat: @"%@", o]; + + if ((o = [contact objectForKey: @"title"])) + [s appendFormat: @"%@", o]; + + if ((o = [contact objectForKey: @"givenname"])) + [s appendFormat: @"%@", o]; + + if ((o = [contact objectForKey: @"sn"])) + [s appendFormat: @"%@", o]; + + if ([current_mail length] > 0) + [s appendFormat: @"%@", current_mail]; + + if ((o = [contact objectForKey: @"telephonenumber"])) + [s appendFormat: @"%@", o]; + + if ((o = [contact objectForKey: @"homephone"])) + [s appendFormat: @"%@", o]; + + if ((o = [contact objectForKey: @"mobile"])) + [s appendFormat: @"%@", o]; + + if ((o = [contact objectForKey: @"o"])) + [s appendFormat: @"%@", o]; + + [s appendString: @""]; + [s appendString: @""]; + } } } diff --git a/NEWS b/NEWS index 9dd1820c1..12680c84c 100644 --- a/NEWS +++ b/NEWS @@ -47,7 +47,8 @@ Bug fixes - optional attendes on events are now shown properly (Zentyal) - fixed the EAS maximum response size being per-folder, and not global - now set MeetingMessageType only for EAS 14.1 - - now correct handle external invitations using EAS + - now correctly handle external invitations using EAS + - now correctly handle multiple email addresses in the GAL over EAS (#3102) 2.2.17a (2015-03-15) -------------------- From a145fdbb5366703c8eb564430a3d1ec8953e3275 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 12 May 2015 10:33:05 -0400 Subject: [PATCH 053/109] (fix) ensure calendar objects have a (fake) filename --- SoObjects/Mailer/SOGoMailObject.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SoObjects/Mailer/SOGoMailObject.m b/SoObjects/Mailer/SOGoMailObject.m index 2aabcaa75..8dd632d65 100644 --- a/SoObjects/Mailer/SOGoMailObject.m +++ b/SoObjects/Mailer/SOGoMailObject.m @@ -777,6 +777,8 @@ static BOOL debugSoParts = NO; filename = [NSString stringWithFormat: @"unknown_%@", path]; else if ([mimeType isEqualToString: @"message/rfc822"]) filename = [NSString stringWithFormat: @"email_%@.eml", path]; + else if ([mimeType isEqualToString: @"text/calendar"]) + filename = [NSString stringWithFormat: @"calendar_%@.ics", path]; if (filename) From 96b2e0e1f5465627925faa60188c232d67f4e4ae Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 12 May 2015 10:37:26 -0400 Subject: [PATCH 054/109] (fix) use dateTime instead of compact format for meeting requests --- ActiveSync/SOGoMailObject+ActiveSync.m | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index 3b9af73ae..3e513a4d5 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -728,18 +728,18 @@ struct GlobalObjectId { [s appendFormat: @"%d", ([event isAllDay] ? 1 : 0)]; - // StartTime -- http://msdn.microsoft.com/en-us/library/ee157132(v=exchg.80).aspx + // StartTime -- https://msdn.microsoft.com/en-us/library/ee203365%28v=exchg.80%29.aspx if ([event startDate]) - [s appendFormat: @"%@", [[event startDate] activeSyncRepresentationWithoutSeparatorsInContext: context]]; + [s appendFormat: @"%@", [[event startDate] activeSyncRepresentationInContext: context]]; if ([event timeStampAsDate]) - [s appendFormat: @"%@", [[event timeStampAsDate] activeSyncRepresentationWithoutSeparatorsInContext: context]]; + [s appendFormat: @"%@", [[event timeStampAsDate] activeSyncRepresentationInContext: context]]; else if ([event created]) - [s appendFormat: @"%@", [[event created] activeSyncRepresentationWithoutSeparatorsInContext: context]]; + [s appendFormat: @"%@", [[event created] activeSyncRepresentationInContext: context]]; - // EndTime -- http://msdn.microsoft.com/en-us/library/ee157945(v=exchg.80).aspx + // EndTime -- https://msdn.microsoft.com/en-us/library/ee158628(v=exchg.80).aspx if ([event endDate]) - [s appendFormat: @"%@", [[event endDate] activeSyncRepresentationWithoutSeparatorsInContext: context]]; + [s appendFormat: @"%@", [[event endDate] activeSyncRepresentationInContext: context]]; // FIXME: Single appointment - others are not supported right now [s appendFormat: @"%d", 0]; From e71a1c9974cc6f0177b50065a173aa37963cc159 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 12 May 2015 10:44:51 -0400 Subject: [PATCH 055/109] (fix) addition fix for #3152 --- ActiveSync/SOGoActiveSyncDispatcher.m | 3 +++ ActiveSync/SOGoMailObject+ActiveSync.m | 11 ++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index e9264283d..5bbc394c9 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -2490,6 +2490,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. else [map setObject: email forKey: @"from"]; + if ([[mailObject envelope] messageId]) + [map setObject: [[mailObject envelope] messageId] forKey: @"in-reply-to"]; + messageToSend = [[[NGMimeMessage alloc] initWithHeader: map] autorelease]; body = [[[NGMimeMultipartBody alloc] initWithPart: messageToSend] autorelease]; diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index 3e513a4d5..96f05e929 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -973,9 +973,18 @@ struct GlobalObjectId { [s appendFormat: @""]; } + if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.0"] && + [[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.1"]) + { + if ([self inReplyTo]) + [s appendFormat: @"%@", [[[self inReplyTo] dataUsingEncoding: NSUTF8StringEncoding] activeSyncRepresentationInContext: context]]; + else if ([self messageId]) + [s appendFormat: @"%@", [[[self messageId] dataUsingEncoding: NSUTF8StringEncoding] activeSyncRepresentationInContext: context]]; + } + // FIXME - support these in the future - //[s appendString: @"foobar"]; //[s appendString: @"zot="]; + // NativeBodyType -- http://msdn.microsoft.com/en-us/library/ee218276(v=exchg.80).aspx // This is a required child element. From c1ce32ac943f559b5ada73c3b88d924a1a415aa2 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 12 May 2015 15:48:42 -0400 Subject: [PATCH 056/109] (fix) now handle very large amount of participants correctly (#3175) --- Documentation/SOGoInstallationGuide.asciidoc | 7 +++ NEWS | 1 + SOPE/GDLContentStore/appointment-oracle.ocs | 2 +- SOPE/GDLContentStore/appointment.ocs | 2 +- Scripts/sql-update-2.1.17_to_2.1.18-mysql.sh | 57 ++++++++++++++++++++ Scripts/sql-update-2.1.17_to_2.1.18.sh | 54 +++++++++++++++++++ 6 files changed, 121 insertions(+), 2 deletions(-) create mode 100755 Scripts/sql-update-2.1.17_to_2.1.18-mysql.sh create mode 100755 Scripts/sql-update-2.1.17_to_2.1.18.sh diff --git a/Documentation/SOGoInstallationGuide.asciidoc b/Documentation/SOGoInstallationGuide.asciidoc index e74cf48b0..4f35a7e47 100644 --- a/Documentation/SOGoInstallationGuide.asciidoc +++ b/Documentation/SOGoInstallationGuide.asciidoc @@ -2714,6 +2714,13 @@ sudo -u sogo mv ~/GNUstep/Defaults/.GNUstepDefaults \ ~/GNUstep/Defaults/GNUstepDefaults.old ---- +h|2.1.18 +|Run the shell script `sql-update-2.1.17_to_2.1.18.sh` or +`sql-update-2.1.18_to_2.1.18-mysql.sh` (if you use MySQL). + +This will grow the "participant states" field of calendar tables to a larger +size. + h|2.0.4 |The parameter _SOGoForceIMAPLoginWithEmail_ is now deprecated and is replaced by _SOGoForceExternalLoginWithEmail_ (which extends the diff --git a/NEWS b/NEWS index 12680c84c..23e65b00e 100644 --- a/NEWS +++ b/NEWS @@ -49,6 +49,7 @@ Bug fixes - now set MeetingMessageType only for EAS 14.1 - now correctly handle external invitations using EAS - now correctly handle multiple email addresses in the GAL over EAS (#3102) + - now handle very large amount of participants correctly (#3175) 2.2.17a (2015-03-15) -------------------- diff --git a/SOPE/GDLContentStore/appointment-oracle.ocs b/SOPE/GDLContentStore/appointment-oracle.ocs index e5ab7197b..845c933b6 100644 --- a/SOPE/GDLContentStore/appointment-oracle.ocs +++ b/SOPE/GDLContentStore/appointment-oracle.ocs @@ -131,7 +131,7 @@ }, { columnName = c_partstates; - sqlType = "VARCHAR2(255)"; + sqlType = "CLOB"; allowsNull = YES; }, { diff --git a/SOPE/GDLContentStore/appointment.ocs b/SOPE/GDLContentStore/appointment.ocs index d17e7d69f..926df67b8 100644 --- a/SOPE/GDLContentStore/appointment.ocs +++ b/SOPE/GDLContentStore/appointment.ocs @@ -131,7 +131,7 @@ }, { columnName = c_partstates; - sqlType = "VARCHAR(255)"; + sqlType = "TEXT"; allowsNull = YES; }, { diff --git a/Scripts/sql-update-2.1.17_to_2.1.18-mysql.sh b/Scripts/sql-update-2.1.17_to_2.1.18-mysql.sh new file mode 100755 index 000000000..0a1dfb522 --- /dev/null +++ b/Scripts/sql-update-2.1.17_to_2.1.18-mysql.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +set -e + +# This script only works with MySQL +# updates c_partstates to mediumtext. +# http://www.sogo.nu/bugs/view.php?id=3175 +# the field length was actually changed in v2.2.18 + +defaultusername=$USER +defaulthostname=127.0.0.1 +defaultdatabase=$USER +indextable=$(sogo-tool dump-defaults -f /etc/sogo/sogo.conf | awk -F\" '/ OCSFolderInfoURL =/ {print $2}' | awk -F/ '{print $NF}') +if [ -z "$indextable" ]; then + echo "Couldn't fetch OCSFolderInfoURL value, aborting" >&2 + exit 1 +fi + +read -p "Username ($defaultusername): " username +read -p "Hostname ($defaulthostname): " hostname +read -p "Database ($defaultdatabase): " database + +if [ -z "$username" ] +then + username=$defaultusername +fi + +if [ -z "$hostname" ] +then + hostname=$defaulthostname +fi + +if [ -z "$database" ] +then + database=$defaultdatabase + fi + +sqlscript="" + +function growVC() { + oldIFS="$IFS" + IFS=" " + part="`echo -e \"ALTER TABLE $table MODIFY c_partstates mediumtext;\\n\"`"; + sqlscript="$sqlscript$part" + IFS="$oldIFS" +} + +echo "This script will ask for the sql password twice" >&2 +echo "Converting c_partstates from VARCHAR(255) to mediumtext in calendar quick tables" >&2 +tables=`mysql -p -s -u $username -h $hostname $database -e "select SUBSTRING_INDEX(c_quick_location, '/', -1) from $indextable where c_path3 = 'Calendar';"` + +for table in $tables; +do + growVC +done + +echo "$sqlscript" | mysql -p -s -u $username -h $hostname $database diff --git a/Scripts/sql-update-2.1.17_to_2.1.18.sh b/Scripts/sql-update-2.1.17_to_2.1.18.sh new file mode 100755 index 000000000..9312a1a33 --- /dev/null +++ b/Scripts/sql-update-2.1.17_to_2.1.18.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +set -e +# This script only works with PostgreSQL +# updates c_partstates to text. +# http://www.sogo.nu/bugs/view.php?id=3175 +# the field length was actually changed in v2.2.18 + +defaultusername=$USER +defaulthostname=localhost +defaultdatabase=$USER +#indextable=sogo_folder_info +indextable=$(sogo-tool dump-defaults -f /etc/sogo/sogo.conf | awk -F\" '/ OCSFolderInfoURL =/ {print $2}' | awk -F/ '{print $NF}') +if [ -z "$indextable" ]; then + echo "Couldn't fetch OCSFolderInfoURL value, aborting" >&2 + exit 1 +fi + +read -p "Username ($defaultusername): " username +read -p "Hostname ($defaulthostname): " hostname +read -p "Database ($defaultdatabase): " database + +if [ -z "$username" ] +then + username=$defaultusername +fi +if [ -z "$hostname" ] +then + hostname=$defaulthostname +fi +if [ -z "$database" ] +then + database=$defaultdatabase +fi + +sqlscript="" + +function growVC() { + oldIFS="$IFS" + IFS=" " + part="`echo -e \"ALTER TABLE $table ALTER COLUMN c_partstates TYPE TEXT;\\n\"`"; + sqlscript="$sqlscript$part" + IFS="$oldIFS" +} + +echo "Converting c_cycleinfo from VARCHAR(255) to TEXT in calendar quick tables" >&2 +tables=`psql -t -U $username -h $hostname $database -c "select split_part(c_quick_location, '/', 5) from $indextable where c_path3 = 'Calendar';"` + +for table in $tables; +do + growVC +done + +echo "$sqlscript" | psql -q -e -U $username -h $hostname $database From 5cf500d56013ab76d61c490a2da3bc771adb6a20 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 13 May 2015 10:45:19 -0400 Subject: [PATCH 057/109] (feat) added c_description to calendar quick tables --- Scripts/sql-update-2.1.17_to_2.1.18-mysql.sh | 12 +++++++----- Scripts/sql-update-2.1.17_to_2.1.18.sh | 12 +++++++----- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Scripts/sql-update-2.1.17_to_2.1.18-mysql.sh b/Scripts/sql-update-2.1.17_to_2.1.18-mysql.sh index 0a1dfb522..bd8f3dd77 100755 --- a/Scripts/sql-update-2.1.17_to_2.1.18-mysql.sh +++ b/Scripts/sql-update-2.1.17_to_2.1.18-mysql.sh @@ -3,7 +3,8 @@ set -e # This script only works with MySQL -# updates c_partstates to mediumtext. +# updates c_partstates to mediumtext +# adds c_description to Calendar quick tables # http://www.sogo.nu/bugs/view.php?id=3175 # the field length was actually changed in v2.2.18 @@ -37,11 +38,12 @@ then sqlscript="" -function growVC() { +function adjustSchema() { oldIFS="$IFS" IFS=" " - part="`echo -e \"ALTER TABLE $table MODIFY c_partstates mediumtext;\\n\"`"; - sqlscript="$sqlscript$part" + part1="`echo -e \"ALTER TABLE $table MODIFY c_partstates mediumtext;\\n\"`"; + part2="`echo -e \"ALTER TABLE $table ADD COLUMN c_description mediumtext;\\n\"`"; + sqlscript="$sqlscript$part1$part2" IFS="$oldIFS" } @@ -51,7 +53,7 @@ tables=`mysql -p -s -u $username -h $hostname $database -e "select SUBSTRING_IND for table in $tables; do - growVC + adjustSchema done echo "$sqlscript" | mysql -p -s -u $username -h $hostname $database diff --git a/Scripts/sql-update-2.1.17_to_2.1.18.sh b/Scripts/sql-update-2.1.17_to_2.1.18.sh index 9312a1a33..fb6010d49 100755 --- a/Scripts/sql-update-2.1.17_to_2.1.18.sh +++ b/Scripts/sql-update-2.1.17_to_2.1.18.sh @@ -2,7 +2,8 @@ set -e # This script only works with PostgreSQL -# updates c_partstates to text. +# updates c_partstates to text +# adds c_description to Calendar quick tables # http://www.sogo.nu/bugs/view.php?id=3175 # the field length was actually changed in v2.2.18 @@ -35,11 +36,12 @@ fi sqlscript="" -function growVC() { +function adjustSchema() { oldIFS="$IFS" IFS=" " - part="`echo -e \"ALTER TABLE $table ALTER COLUMN c_partstates TYPE TEXT;\\n\"`"; - sqlscript="$sqlscript$part" + part1="`echo -e \"ALTER TABLE $table ALTER COLUMN c_partstates TYPE TEXT;\\n\"`"; + part2="`echo -e \"ALTER TABLE $table ADD COLUMN c_description TEXT;\\n\"`"; + sqlscript="$sqlscript$part1$part2" IFS="$oldIFS" } @@ -48,7 +50,7 @@ tables=`psql -t -U $username -h $hostname $database -c "select split_part(c_quic for table in $tables; do - growVC + adjustSchema done echo "$sqlscript" | psql -q -e -U $username -h $hostname $database From f8b7ebdaf8215406208b756e94d18c7b420cd9f6 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 13 May 2015 10:51:12 -0400 Subject: [PATCH 058/109] Adjust OCS files regarding previous commit --- SOPE/GDLContentStore/appointment-oracle.ocs | 5 +++++ SOPE/GDLContentStore/appointment.ocs | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/SOPE/GDLContentStore/appointment-oracle.ocs b/SOPE/GDLContentStore/appointment-oracle.ocs index 845c933b6..f0ceef7d6 100644 --- a/SOPE/GDLContentStore/appointment-oracle.ocs +++ b/SOPE/GDLContentStore/appointment-oracle.ocs @@ -154,5 +154,10 @@ sqlType = "INTEGER"; allowsNull = YES; }, + { + columnName = c_description; + sqlType = "CLOB"; + allowsNull = YES; + } ); } diff --git a/SOPE/GDLContentStore/appointment.ocs b/SOPE/GDLContentStore/appointment.ocs index 926df67b8..ce909e87a 100644 --- a/SOPE/GDLContentStore/appointment.ocs +++ b/SOPE/GDLContentStore/appointment.ocs @@ -154,5 +154,10 @@ sqlType = "INT"; allowsNull = YES; } + { + columnName = c_description; + sqlType = "TEXT"; + allowsNull = YES; + } ); } From 0ea0a776664c02716f693171a0e787266bdd1c68 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 13 May 2015 10:55:17 -0400 Subject: [PATCH 059/109] fixed typo in previous commit --- SOPE/GDLContentStore/appointment.ocs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SOPE/GDLContentStore/appointment.ocs b/SOPE/GDLContentStore/appointment.ocs index ce909e87a..af05f9487 100644 --- a/SOPE/GDLContentStore/appointment.ocs +++ b/SOPE/GDLContentStore/appointment.ocs @@ -153,7 +153,7 @@ columnName = c_nextalarm; sqlType = "INT"; allowsNull = YES; - } + }, { columnName = c_description; sqlType = "TEXT"; From dc48e05dd37ae05a5d2c16c8b0da8da76e07582e Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 13 May 2015 13:12:15 -0400 Subject: [PATCH 060/109] (feat) print event/task description in list view (#2881) --- NEWS | 1 + SoObjects/Appointments/SOGoAppointmentFolder.m | 2 +- SoObjects/Appointments/iCalEvent+SOGo.m | 6 ++++++ SoObjects/Appointments/iCalToDo+SOGo.m | 6 ++++++ UI/Scheduler/UIxCalListingActions.m | 4 ++-- UI/WebServerResources/UIxCalViewPrint.js | 13 +++++++++++-- 6 files changed, 27 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 23e65b00e..0287f5a22 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,7 @@ Enhancements - synchronize events, contacts and tasks in reverse chronological order (Zentyal) - during login, we now extract the domain from the user to accelerate authentication requests on sources - make sure sure email invitations can always be read by EAS clients + - now able to print event/task's description (new components only) in the list view (#2881) Bug fixes - now keep the BodyPreference for future EAS use and default to MIME if none set (#3146) diff --git a/SoObjects/Appointments/SOGoAppointmentFolder.m b/SoObjects/Appointments/SOGoAppointmentFolder.m index 9b670d83b..915fd4aa5 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolder.m +++ b/SoObjects/Appointments/SOGoAppointmentFolder.m @@ -2814,7 +2814,7 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir @"c_category", @"c_classification", @"c_isallday", @"c_isopaque", @"c_participants", @"c_partmails", @"c_partstates", @"c_sequence", @"c_priority", - @"c_cycleinfo", @"c_iscycle", @"c_nextalarm", nil]; + @"c_cycleinfo", @"c_iscycle", @"c_nextalarm", @"c_description", nil]; return [self fetchFields: infos from: _startDate to: _endDate title: title component: _component diff --git a/SoObjects/Appointments/iCalEvent+SOGo.m b/SoObjects/Appointments/iCalEvent+SOGo.m index 485d2822e..a19dcf3cd 100644 --- a/SoObjects/Appointments/iCalEvent+SOGo.m +++ b/SoObjects/Appointments/iCalEvent+SOGo.m @@ -248,6 +248,12 @@ else [row setObject: [NSNull null] forKey: @"c_category"]; + /* handle description */ + if ([self comment]) + [row setObject: [self comment] forKey: @"c_description"]; + else + [row setObject: [NSNull null] forKey: @"c_description"]; + return row; } diff --git a/SoObjects/Appointments/iCalToDo+SOGo.m b/SoObjects/Appointments/iCalToDo+SOGo.m index cb42c6a03..79ed39265 100644 --- a/SoObjects/Appointments/iCalToDo+SOGo.m +++ b/SoObjects/Appointments/iCalToDo+SOGo.m @@ -177,6 +177,12 @@ [row setObject: [categories componentsJoinedByString: @","] forKey: @"c_category"]; + /* handle description */ + if ([self comment]) + [row setObject: [self comment] forKey: @"c_description"]; + else + [row setObject: [NSNull null] forKey: @"c_description"]; + return row; } diff --git a/UI/Scheduler/UIxCalListingActions.m b/UI/Scheduler/UIxCalListingActions.m index 32d2a6a7f..59e124326 100644 --- a/UI/Scheduler/UIxCalListingActions.m +++ b/UI/Scheduler/UIxCalListingActions.m @@ -89,7 +89,7 @@ static NSArray *tasksFields = nil; @"c_partmails", @"c_partstates", @"c_owner", @"c_iscycle", @"c_nextalarm", @"c_recurrence_id", @"isException", @"editable", - @"erasable", @"ownerIsOrganizer", nil]; + @"erasable", @"ownerIsOrganizer", @"c_description", nil]; [eventsFields retain]; } if (!tasksFields) @@ -99,7 +99,7 @@ static NSArray *tasksFields = nil; @"c_status", @"c_title", @"c_enddate", @"c_classification", @"c_location", @"c_category", @"editable", @"erasable", - @"c_priority", @"c_owner", @"c_recurrence_id", @"isException", nil]; + @"c_priority", @"c_owner", @"c_recurrence_id", @"isException", @"c_description", nil]; [tasksFields retain]; } } diff --git a/UI/WebServerResources/UIxCalViewPrint.js b/UI/WebServerResources/UIxCalViewPrint.js index 0fe3a6385..f0b35bf86 100644 --- a/UI/WebServerResources/UIxCalViewPrint.js +++ b/UI/WebServerResources/UIxCalViewPrint.js @@ -538,7 +538,7 @@ function _parseEvent(event) { var end = _("End:"); var location = _("Location:"); var calendar = _("Calendar:"); - + var description = _("Description:"); var newEvent = document.createElement("div"); var table = document.createElement("table"); Element.addClassName(newEvent, "divEventsPreview"); @@ -562,7 +562,11 @@ function _parseEvent(event) { var calendarCell = row.insertCell(0); Element.addClassName(calendarCell, "cellFormat"); var calendarCellValue = row.insertCell(1); - + row = table.insertRow(5); + var descriptionCell = row.insertCell(0); + Element.addClassName(descriptionCell, "cellFormat"); + var descriptionCellValue = row.insertCell(1); + title.innerHTML = event[4]; startCell.innerHTML = start; var startDate = new Date(event[5] *1000); @@ -575,6 +579,11 @@ function _parseEvent(event) { calendarCell.innerHTML = calendar; calendarCellValue.innerHTML = event[2]; + if (event[21] && event[21].length) { + descriptionCell.innerHTML = description; + descriptionCellValue.innerHTML = event[21]; + } + if (printColors.checked) { var allColors = window.parentvar("UserSettings")['Calendar']['FolderColors']; var owner = event[13]; From 39aa9a97db9785a1857436a6cd17ffd8203d7935 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 13 May 2015 14:36:35 -0400 Subject: [PATCH 061/109] (fix) make sure we return event blocks sorted by start date (#2939) --- UI/Scheduler/UIxCalListingActions.m | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/UI/Scheduler/UIxCalListingActions.m b/UI/Scheduler/UIxCalListingActions.m index 59e124326..f6690f080 100644 --- a/UI/Scheduler/UIxCalListingActions.m +++ b/UI/Scheduler/UIxCalListingActions.m @@ -75,6 +75,15 @@ static NSArray *tasksFields = nil; #define maxBlocks (offsetBlocks * 2) // maximum number of blocks to search // for a free slot (10 days) +@implementation NSArray (SOGoBlocksCompare) + +- (NSComparisonResult) compareBlock: (NSArray *) theOtherBlock +{ + return [[self objectAtIndex: 5] compare: [theOtherBlock objectAtIndex: 5]]; +} + +@end + @implementation UIxCalListingActions + (void) initialize @@ -483,7 +492,9 @@ static NSArray *tasksFields = nil; } } } - + + [infos sortUsingSelector: @selector(compareBlock:)]; + return infos; } From fb121974ec38564f194cb2f710d6adaf1758bc50 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 13 May 2015 14:52:10 -0400 Subject: [PATCH 062/109] refactored previous commit --- UI/Scheduler/UIxCalListingActions.m | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/UI/Scheduler/UIxCalListingActions.m b/UI/Scheduler/UIxCalListingActions.m index f6690f080..bb94e7c4f 100644 --- a/UI/Scheduler/UIxCalListingActions.m +++ b/UI/Scheduler/UIxCalListingActions.m @@ -75,15 +75,6 @@ static NSArray *tasksFields = nil; #define maxBlocks (offsetBlocks * 2) // maximum number of blocks to search // for a free slot (10 days) -@implementation NSArray (SOGoBlocksCompare) - -- (NSComparisonResult) compareBlock: (NSArray *) theOtherBlock -{ - return [[self objectAtIndex: 5] compare: [theOtherBlock objectAtIndex: 5]]; -} - -@end - @implementation UIxCalListingActions + (void) initialize @@ -493,7 +484,7 @@ static NSArray *tasksFields = nil; } } - [infos sortUsingSelector: @selector(compareBlock:)]; + [infos sortUsingSelector: @selector(compareEventsStartDateAscending:)]; return infos; } From 4de814c3b22d93cd51e368f7f4c3d93edb871d16 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 13 May 2015 15:48:47 -0400 Subject: [PATCH 063/109] (fix) first pass (and hopefully only) at Apache 2.2->2.4 mess --- packaging/debian/rules | 2 +- packaging/debian/sogo.install | 2 +- packaging/debian/sogo.postinst | 12 ++++++++++++ packaging/debian/sogo.prerm | 9 +++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packaging/debian/rules b/packaging/debian/rules index d09f6cc6d..5c6729d6f 100755 --- a/packaging/debian/rules +++ b/packaging/debian/rules @@ -80,7 +80,7 @@ install-arch: build-arch install -D -m 644 Scripts/sogo-default debian/tmp/etc/default/sogo install -D -m 644 debian/sogo.overrides debian/tmp/usr/share/lintian/overrides/sogo - install -D -m 644 Apache/SOGo.conf debian/tmp/etc/apache2/conf.d/SOGo.conf + install -D -m 644 Apache/SOGo.conf debian/tmp/etc/apache2/conf-available/SOGo.conf install -D -m 644 Scripts/sogo.cron debian/tmp/etc/cron.d/sogo install -D -m 644 Scripts/logrotate debian/tmp/etc/logrotate.d/sogo install -d -m 750 debian/tmp/etc/sogo diff --git a/packaging/debian/sogo.install b/packaging/debian/sogo.install index ba044b824..e6de0eda6 100644 --- a/packaging/debian/sogo.install +++ b/packaging/debian/sogo.install @@ -1,4 +1,4 @@ -etc/apache2/conf.d/SOGo.conf +etc/apache2/conf-available/SOGo.conf etc/cron.d/sogo etc/default/sogo etc/logrotate.d/sogo diff --git a/packaging/debian/sogo.postinst b/packaging/debian/sogo.postinst index 82cfa7d4e..cb988a921 100644 --- a/packaging/debian/sogo.postinst +++ b/packaging/debian/sogo.postinst @@ -26,6 +26,18 @@ case "$1" in chown root:sogo /etc/sogo chmod 640 /etc/sogo/sogo.conf chown root:sogo /etc/sogo/sogo.conf + + # Apache 2.2 / 2.4 kungfu + COMMON_STATE=$(dpkg-query -f '${Status}' -W 'apache2.2-common' 2>/dev/null | awk '{print $3}' || true) + + if [ -e /usr/share/apache2/apache2-maintscript-helper ] ; then + . /usr/share/apache2/apache2-maintscript-helper + apache2_invoke enconf SOGo || exit $? + elif [ "$COMMON_STATE" = "installed" ] || [ "$COMMON_STATE" = "unpacked" ] ; then + if [ -d /etc/apache2/conf.d/ -a ! -L /etc/apache2/conf.d/SOGo.conf ]; then + ln -s ../conf-available/SOGo.conf /etc/apache2/conf.d/SOGo.conf + fi + fi ;; abort-upgrade|abort-remove|abort-deconfigure) diff --git a/packaging/debian/sogo.prerm b/packaging/debian/sogo.prerm index 914a28b5e..7d304833a 100644 --- a/packaging/debian/sogo.prerm +++ b/packaging/debian/sogo.prerm @@ -13,5 +13,14 @@ set -e # for details, see /usr/share/doc/packaging-manual/ #DEBHELPER# +if [ "$1" = "deconfigure" ] ; then + # Apache 2.2 / 2.4 kungfu + COMMON_STATE=$(dpkg-query -f '${Status}' -W 'apache2.2-common' 2>/dev/null | awk '{print $3}' || true) + + if [ "$COMMON_STATE" = "installed" ] || [ "$COMMON_STATE" = "unpacked" ] ; then + [ ! -L /etc/apache2/conf.d/SOGo.conf ] || rm /etc/apache2/conf.d/SOGo.conf + fi + +fi exit 0 From d97813451eae96da5a0441d6789e56271440b764 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 13 May 2015 16:09:41 -0400 Subject: [PATCH 064/109] (fix) moved stuff to multiarch --- packaging/debian-multiarch/rules | 2 +- packaging/debian-multiarch/sogo.install | 2 +- packaging/debian-multiarch/sogo.postinst | 12 ++++++++++++ packaging/debian-multiarch/sogo.prerm | 9 +++++++++ packaging/debian/rules | 2 +- packaging/debian/sogo.install | 2 +- packaging/debian/sogo.postinst | 12 ------------ packaging/debian/sogo.prerm | 9 --------- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/packaging/debian-multiarch/rules b/packaging/debian-multiarch/rules index 4b733f2a8..c349ef5f4 100755 --- a/packaging/debian-multiarch/rules +++ b/packaging/debian-multiarch/rules @@ -78,7 +78,7 @@ install-arch: build-arch install -D -m 644 Scripts/sogo-default debian/tmp/etc/default/sogo install -D -m 644 debian/sogo.overrides debian/tmp/usr/share/lintian/overrides/sogo - install -D -m 644 Apache/SOGo.conf debian/tmp/etc/apache2/conf.d/SOGo.conf + install -D -m 644 Apache/SOGo.conf debian/tmp/etc/apache2/conf-available/SOGo.conf install -D -m 644 Scripts/sogo.cron debian/tmp/etc/cron.d/sogo install -D -m 644 Scripts/logrotate debian/tmp/etc/logrotate.d/sogo install -d -m 750 debian/tmp/etc/sogo/ diff --git a/packaging/debian-multiarch/sogo.install b/packaging/debian-multiarch/sogo.install index ba044b824..e6de0eda6 100644 --- a/packaging/debian-multiarch/sogo.install +++ b/packaging/debian-multiarch/sogo.install @@ -1,4 +1,4 @@ -etc/apache2/conf.d/SOGo.conf +etc/apache2/conf-available/SOGo.conf etc/cron.d/sogo etc/default/sogo etc/logrotate.d/sogo diff --git a/packaging/debian-multiarch/sogo.postinst b/packaging/debian-multiarch/sogo.postinst index 82cfa7d4e..cb988a921 100644 --- a/packaging/debian-multiarch/sogo.postinst +++ b/packaging/debian-multiarch/sogo.postinst @@ -26,6 +26,18 @@ case "$1" in chown root:sogo /etc/sogo chmod 640 /etc/sogo/sogo.conf chown root:sogo /etc/sogo/sogo.conf + + # Apache 2.2 / 2.4 kungfu + COMMON_STATE=$(dpkg-query -f '${Status}' -W 'apache2.2-common' 2>/dev/null | awk '{print $3}' || true) + + if [ -e /usr/share/apache2/apache2-maintscript-helper ] ; then + . /usr/share/apache2/apache2-maintscript-helper + apache2_invoke enconf SOGo || exit $? + elif [ "$COMMON_STATE" = "installed" ] || [ "$COMMON_STATE" = "unpacked" ] ; then + if [ -d /etc/apache2/conf.d/ -a ! -L /etc/apache2/conf.d/SOGo.conf ]; then + ln -s ../conf-available/SOGo.conf /etc/apache2/conf.d/SOGo.conf + fi + fi ;; abort-upgrade|abort-remove|abort-deconfigure) diff --git a/packaging/debian-multiarch/sogo.prerm b/packaging/debian-multiarch/sogo.prerm index 914a28b5e..7d304833a 100644 --- a/packaging/debian-multiarch/sogo.prerm +++ b/packaging/debian-multiarch/sogo.prerm @@ -13,5 +13,14 @@ set -e # for details, see /usr/share/doc/packaging-manual/ #DEBHELPER# +if [ "$1" = "deconfigure" ] ; then + # Apache 2.2 / 2.4 kungfu + COMMON_STATE=$(dpkg-query -f '${Status}' -W 'apache2.2-common' 2>/dev/null | awk '{print $3}' || true) + + if [ "$COMMON_STATE" = "installed" ] || [ "$COMMON_STATE" = "unpacked" ] ; then + [ ! -L /etc/apache2/conf.d/SOGo.conf ] || rm /etc/apache2/conf.d/SOGo.conf + fi + +fi exit 0 diff --git a/packaging/debian/rules b/packaging/debian/rules index 5c6729d6f..d09f6cc6d 100755 --- a/packaging/debian/rules +++ b/packaging/debian/rules @@ -80,7 +80,7 @@ install-arch: build-arch install -D -m 644 Scripts/sogo-default debian/tmp/etc/default/sogo install -D -m 644 debian/sogo.overrides debian/tmp/usr/share/lintian/overrides/sogo - install -D -m 644 Apache/SOGo.conf debian/tmp/etc/apache2/conf-available/SOGo.conf + install -D -m 644 Apache/SOGo.conf debian/tmp/etc/apache2/conf.d/SOGo.conf install -D -m 644 Scripts/sogo.cron debian/tmp/etc/cron.d/sogo install -D -m 644 Scripts/logrotate debian/tmp/etc/logrotate.d/sogo install -d -m 750 debian/tmp/etc/sogo diff --git a/packaging/debian/sogo.install b/packaging/debian/sogo.install index e6de0eda6..ba044b824 100644 --- a/packaging/debian/sogo.install +++ b/packaging/debian/sogo.install @@ -1,4 +1,4 @@ -etc/apache2/conf-available/SOGo.conf +etc/apache2/conf.d/SOGo.conf etc/cron.d/sogo etc/default/sogo etc/logrotate.d/sogo diff --git a/packaging/debian/sogo.postinst b/packaging/debian/sogo.postinst index cb988a921..82cfa7d4e 100644 --- a/packaging/debian/sogo.postinst +++ b/packaging/debian/sogo.postinst @@ -26,18 +26,6 @@ case "$1" in chown root:sogo /etc/sogo chmod 640 /etc/sogo/sogo.conf chown root:sogo /etc/sogo/sogo.conf - - # Apache 2.2 / 2.4 kungfu - COMMON_STATE=$(dpkg-query -f '${Status}' -W 'apache2.2-common' 2>/dev/null | awk '{print $3}' || true) - - if [ -e /usr/share/apache2/apache2-maintscript-helper ] ; then - . /usr/share/apache2/apache2-maintscript-helper - apache2_invoke enconf SOGo || exit $? - elif [ "$COMMON_STATE" = "installed" ] || [ "$COMMON_STATE" = "unpacked" ] ; then - if [ -d /etc/apache2/conf.d/ -a ! -L /etc/apache2/conf.d/SOGo.conf ]; then - ln -s ../conf-available/SOGo.conf /etc/apache2/conf.d/SOGo.conf - fi - fi ;; abort-upgrade|abort-remove|abort-deconfigure) diff --git a/packaging/debian/sogo.prerm b/packaging/debian/sogo.prerm index 7d304833a..914a28b5e 100644 --- a/packaging/debian/sogo.prerm +++ b/packaging/debian/sogo.prerm @@ -13,14 +13,5 @@ set -e # for details, see /usr/share/doc/packaging-manual/ #DEBHELPER# -if [ "$1" = "deconfigure" ] ; then - # Apache 2.2 / 2.4 kungfu - COMMON_STATE=$(dpkg-query -f '${Status}' -W 'apache2.2-common' 2>/dev/null | awk '{print $3}' || true) - - if [ "$COMMON_STATE" = "installed" ] || [ "$COMMON_STATE" = "unpacked" ] ; then - [ ! -L /etc/apache2/conf.d/SOGo.conf ] || rm /etc/apache2/conf.d/SOGo.conf - fi - -fi exit 0 From fbf5c4f6c2dcad6fa8afb24e0faa7f1704d074fb Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 13 May 2015 19:09:58 -0400 Subject: [PATCH 065/109] (fix) always include SrcMsgId in the MoveItems's response --- ActiveSync/SOGoActiveSyncDispatcher.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index 5bbc394c9..65d76a390 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -1621,10 +1621,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // See http://msdn.microsoft.com/en-us/library/gg651088(v=exchg.80).aspx for Status response codes. // + [s appendFormat: @"%@", srcMessageId]; if ([prevSuccessfulMoveItemsOps objectForKey: srcMessageId]) { // Previous move failed operation but we can recover the dstMessageId from previous request - [s appendFormat: @"%@", srcMessageId]; [s appendFormat: @"%@", [prevSuccessfulMoveItemsOps objectForKey: srcMessageId]]; [s appendFormat: @"%d", 3]; [newSuccessfulMoveItemsOps setObject: [prevSuccessfulMoveItemsOps objectForKey: srcMessageId] forKey: srcMessageId]; From 5412599832d812e4db181d2398dfd06dbd0a16de Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 14 May 2015 15:26:18 -0400 Subject: [PATCH 066/109] (feat) now possible to log EAS commands using the SOGoEASDebugEnabled system defaults --- ActiveSync/SOGoActiveSyncDispatcher.m | 12 +++++++++++- Documentation/SOGoInstallationGuide.asciidoc | 5 +++++ NEWS | 1 + SoObjects/SOGo/SOGoSystemDefaults.h | 4 +++- SoObjects/SOGo/SOGoSystemDefaults.m | 7 ++++++- 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index 65d76a390..5166a7cad 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -113,6 +113,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import #import +#import #include "iCalEvent+ActiveSync.h" #include "iCalToDo+ActiveSync.h" @@ -138,10 +139,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @implementation SOGoActiveSyncDispatcher +static BOOL debugOn = NO; + - (id) init { [super init]; + debugOn = [[SOGoSystemDefaults sharedSystemDefaults] easDebugEnabled]; folderTableURL = nil; return self; } @@ -2607,7 +2611,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. pool = [[NSAutoreleasePool alloc] init]; ASSIGN(context, theContext); - + // Get the device ID, device type and "stash" them deviceId = [[theRequest uri] deviceId]; [context setObject: deviceId forKey: @"DeviceId"]; @@ -2670,6 +2674,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. if (d) { + if (debugOn) + [self logWithFormat: @"EAS - request for device %@: %@", [context objectForKey: @"DeviceId"], [[[NSString alloc] initWithData: d encoding: NSUTF8StringEncoding] autorelease]]; + builder = [[[NSClassFromString(@"DOMSaxBuilder") alloc] init] autorelease]; dom = [builder buildFromData: d]; documentElement = [dom documentElement]; @@ -2699,6 +2706,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [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.5,12.0,12.1,14.0,14.1" forKey: @"MS-ASProtocolVersions"]; + if (debugOn && [[theResponse content] length]) + [self logWithFormat: @"EAS - response for device %@: %@", [context objectForKey: @"DeviceId"], [[[NSString alloc] initWithData: [[theResponse content] wbxml2xml] encoding: NSUTF8StringEncoding] autorelease]]; + RELEASE(context); RELEASE(pool); diff --git a/Documentation/SOGoInstallationGuide.asciidoc b/Documentation/SOGoInstallationGuide.asciidoc index 4f35a7e47..68b8206da 100644 --- a/Documentation/SOGoInstallationGuide.asciidoc +++ b/Documentation/SOGoInstallationGuide.asciidoc @@ -2439,6 +2439,11 @@ Defaults to `0`, which means no overwrite is performed. Setting this parameter to a value greater than `512` will have unexpected behaviour with various ActiveSync clients. +|S |SOGoEASDebugEnabled +|Parameter used to log the complete request and response of every single +EAS command. + +Defaults to `NO`, which means no logging is performed. |======================================================================= Please be aware of the following limitations: diff --git a/NEWS b/NEWS index 0287f5a22..96f96e766 100644 --- a/NEWS +++ b/NEWS @@ -18,6 +18,7 @@ Enhancements - during login, we now extract the domain from the user to accelerate authentication requests on sources - make sure sure email invitations can always be read by EAS clients - now able to print event/task's description (new components only) in the list view (#2881) + - now possible to log EAS commands using the SOGoEASDebugEnabled system defaults Bug fixes - now keep the BodyPreference for future EAS use and default to MIME if none set (#3146) diff --git a/SoObjects/SOGo/SOGoSystemDefaults.h b/SoObjects/SOGo/SOGoSystemDefaults.h index 7f811f208..50064c0de 100644 --- a/SoObjects/SOGo/SOGoSystemDefaults.h +++ b/SoObjects/SOGo/SOGoSystemDefaults.h @@ -1,6 +1,6 @@ /* SOGoSystemDefaults.h - 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 @@ -64,6 +64,8 @@ - (BOOL) uixAdditionalPreferences; - (BOOL) uixDebugEnabled; +- (BOOL) easDebugEnabled; + - (NSString *) pageTitle; - (NSArray *) supportedLanguages; diff --git a/SoObjects/SOGo/SOGoSystemDefaults.m b/SoObjects/SOGo/SOGoSystemDefaults.m index 9fbb9ef48..8c9181665 100644 --- a/SoObjects/SOGo/SOGoSystemDefaults.m +++ b/SoObjects/SOGo/SOGoSystemDefaults.m @@ -1,6 +1,6 @@ /* SOGoSystemDefaults.m - this file is part of SOGo * - * Copyright (C) 2009-2014 Inverse inc. + * Copyright (C) 2009-2015 Inverse inc. * Copyright (C) 2012 Jeroen Dekkers * * This file is free software; you can redistribute it and/or modify @@ -427,6 +427,11 @@ _injectConfigurationFromFile (NSMutableDictionary *defaultsDict, return [self boolForKey: @"SOGoUIxDebugEnabled"]; } +- (BOOL) easDebugEnabled +{ + return [self boolForKey: @"SOGoEASDebugEnabled"]; +} + - (NSString *) pageTitle { return [self stringForKey: @"SOGoPageTitle"]; From 9dc0a08bba30c80412652be02b3c5b1d79042769 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 14 May 2015 15:28:23 -0400 Subject: [PATCH 067/109] (fix) removed unused import --- ActiveSync/SOGoActiveSyncDispatcher.m | 1 - 1 file changed, 1 deletion(-) diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index 5166a7cad..5a4153eac 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -113,7 +113,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import #import -#import #include "iCalEvent+ActiveSync.h" #include "iCalToDo+ActiveSync.h" From cc1e9f2fff0460cd7cff5acdf6cccc705c14c666 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 14 May 2015 15:40:03 -0400 Subject: [PATCH 068/109] (fix) additional fix for #3152 --- ActiveSync/SOGoMailObject+ActiveSync.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index 96f05e929..7d74147d8 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -973,7 +973,7 @@ struct GlobalObjectId { [s appendFormat: @""]; } - if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.0"] && + if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.0"] || [[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.1"]) { if ([self inReplyTo]) From c98a00051597a9c1bee39bdb9f9e0514c4089b23 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 14 May 2015 15:49:53 -0400 Subject: [PATCH 069/109] (feat) many improvements to EAS SmartReply/SmartForward commands --- ActiveSync/SOGoActiveSyncDispatcher.m | 242 +++++++++++++++++++++----- NEWS | 1 + 2 files changed, 197 insertions(+), 46 deletions(-) diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index 5a4153eac..7cd0e5c53 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -61,6 +61,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import #import #import +#import #import #import @@ -95,6 +96,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import #import #import +#import #import #import @@ -110,6 +112,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import #import #import +#import +#import + #import #import @@ -2389,26 +2394,19 @@ static BOOL debugOn = NO; } -// -// -// -// -// C9FF94FE-EA40-473A-B3E2-AAEE94F753A4 -// -// -// -// mail/INBOX -// 82 -// -// ... the data ... -// -// -- (void) processSmartForward: (id ) theDocumentElement - inResponse: (WOResponse *) theResponse +- (void) _processSmartCommand: (id ) theDocumentElement + inResponse: (WOResponse *) theResponse + isSmartForward: (BOOL ) isSmartForward { NSString *folderId, *itemId, *realCollectionId; SOGoMicrosoftActiveSyncFolderType folderType; + SOGoUserDefaults *ud; + + BOOL htmlComposition, isHTML; id value; + + isHTML = NO; + ud = [[context activeUser] userDefaults]; folderId = [[(id)[theDocumentElement getElementsByTagName: @"FolderId"] lastObject] textValue]; @@ -2457,11 +2455,15 @@ static BOOL debugOn = NO; NGMutableHashMap *map; NGMimeFileData *fdata; NSException *error; + NSArray *attachmentKeys; + NSMutableArray *attachments; - id body, bodyFromSmartForward; - NSString *fullName, *email; + id body, bodyFromSmartForward, htmlPart, textPart; + NSString *fullName, *email, *charset, *s; NSDictionary *identity; + int a; + userFolder = [[context activeUser] homeFolderInContext: context]; accountsFolder = [userFolder lookupName: @"Mail" inContext: context acquire: NO]; currentFolder = [accountsFolder lookupName: @"0" inContext: context acquire: NO]; @@ -2472,7 +2474,6 @@ static BOOL debugOn = NO; mailObject = [currentCollection lookupName: itemId inContext: context acquire: NO]; - parser = [[NGMimeMessageParser alloc] init]; data = [[[[(id)[theDocumentElement getElementsByTagName: @"MIME"] lastObject] textValue] stringByDecodingBase64] dataUsingEncoding: NSUTF8StringEncoding]; messageFromSmartForward = [parser parsePartFromData: data]; @@ -2493,8 +2494,8 @@ static BOOL debugOn = NO; else [map setObject: email forKey: @"from"]; - if ([[mailObject envelope] messageId]) - [map setObject: [[mailObject envelope] messageId] forKey: @"in-reply-to"]; + if ([mailObject messageId]) + [map setObject: [mailObject messageId] forKey: @"in-reply-to"]; messageToSend = [[[NGMimeMessage alloc] initWithHeader: map] autorelease]; body = [[[NGMimeMultipartBody alloc] initWithPart: messageToSend] autorelease]; @@ -2503,12 +2504,16 @@ static BOOL debugOn = NO; // we take the first part text/* part we see. map = [[[NGMutableHashMap alloc] initWithCapacity: 1] autorelease]; bodyFromSmartForward = nil; + textPart = nil; + htmlPart = nil; + + attachments = [NSMutableArray array]; if ([[messageFromSmartForward body] isKindOfClass: [NGMimeMultipartBody class]]) { - NGMimeBodyPart *part; - NSArray *parts; - int i; + NGMimeBodyPart *part, *apart; + NSArray *parts, *aparts; + int i, j; parts = [[messageFromSmartForward body] parts]; @@ -2516,37 +2521,159 @@ static BOOL debugOn = NO; { part = [parts objectAtIndex: i]; - if ([[[part contentType] type] isEqualToString: @"text"]) + if ([[[part contentType] type] isEqualToString: @"multipart"] && [[[part contentType] subType] isEqualToString: @"alternative"]) { - [map setObject: [[part contentType] stringValue] forKey: @"content-type"]; - bodyFromSmartForward = [part body]; - break; + aparts = [[part body] parts]; + for (j = 0; j < [aparts count]; j++) + { + apart = [aparts objectAtIndex: j]; + if ([[[apart contentType] type] isEqualToString: @"text"] && [[[apart contentType] subType] isEqualToString: @"html"]) + htmlPart = apart; + if ([[[apart contentType] type] isEqualToString: @"text"] && [[[apart contentType] subType] isEqualToString: @"plain"]) + textPart = apart; + } } + else + { + if ([[[part contentType] type] isEqualToString: @"text"] && [[[part contentType] subType] isEqualToString: @"html"]) + htmlPart = part; + else if ([[[part contentType] type] isEqualToString: @"text"] && [[[part contentType] subType] isEqualToString: @"plain"]) + textPart = part; + else + [attachments addObject: part]; + } } } else { - [map setObject: [[messageFromSmartForward contentType] stringValue] forKey: @"content-type"]; - bodyFromSmartForward = [messageFromSmartForward body]; + if ([[[messageFromSmartForward contentType] type] isEqualToString: @"text"] && [[[messageFromSmartForward contentType] subType] isEqualToString: @"html"]) + htmlPart = messageFromSmartForward; + else + textPart = messageFromSmartForward; } + htmlComposition = [[ud mailComposeMessageType] isEqualToString: @"html"]; + + if (htmlComposition && htmlPart) + { + bodyFromSmartForward = [htmlPart body]; + charset = [[htmlPart contentType] valueOfParameter: @"charset"]; + isHTML = YES; + } + else if (!htmlComposition && !textPart) + { + bodyFromSmartForward = [htmlPart body]; + charset = [[htmlPart contentType] valueOfParameter: @"charset"]; + isHTML = YES; + } + else + { + bodyFromSmartForward = [textPart body]; + charset = [[textPart contentType] valueOfParameter: @"charset"]; + } + + // We make sure everything is encoded in UTF-8. + if ([bodyFromSmartForward isKindOfClass: [NSData class]]) + { + if (![charset length]) + charset = @"utf-8"; + + s = [NSString stringWithData: bodyFromSmartForward usingEncodingNamed: charset]; + + // We fallback to ISO-8859-1 string encoding. We avoid #3103. + if (!s) + s = [[[NSString alloc] initWithData: bodyFromSmartForward encoding: NSISOLatin1StringEncoding] autorelease]; + + bodyFromSmartForward = s; + } + + if (htmlComposition && !isHTML) + { + [map setObject: @"text/html; charset=utf-8" forKey: @"content-type"]; + bodyFromSmartForward = [[bodyFromSmartForward stringByEscapingHTMLString] stringByConvertingCRLNToHTML]; + } + else if (!htmlComposition && isHTML) + { + [map setObject: @"text/plain; charset=utf-8" forKey: @"content-type"]; + bodyFromSmartForward = [bodyFromSmartForward htmlToText]; + } + else if (htmlComposition && isHTML) + { + [map setObject: @"text/html; charset=utf-8" forKey: @"content-type"]; + } + else + { + [map setObject: @"text/plain; charset=utf-8" forKey: @"content-type"]; + } + bodyPart = [[[NGMimeBodyPart alloc] initWithHeader:map] autorelease]; - [bodyPart setBody: bodyFromSmartForward]; + + if (isSmartForward && [[ud mailMessageForwarding] isEqualToString: @"attached"]) + [bodyPart setBody: [bodyFromSmartForward dataUsingEncoding: NSUTF8StringEncoding]]; + else + [bodyPart setBody: [[NSString stringWithFormat: @"%@%@", bodyFromSmartForward, [mailObject contentForEditing]] dataUsingEncoding: NSUTF8StringEncoding]]; + [body addBodyPart: bodyPart]; - // Second part - map = [[[NGMutableHashMap alloc] initWithCapacity: 1] autorelease]; - [map setObject: @"message/rfc822" forKey: @"content-type"]; - [map setObject: @"8bit" forKey: @"content-transfer-encoding"]; - bodyPart = [[[NGMimeBodyPart alloc] initWithHeader:map] autorelease]; - - data = [mailObject content]; - fdata = [[NGMimeFileData alloc] initWithBytes:[data bytes] - length:[data length]]; + // Add attachments + for (a = 0; a < [attachments count]; a++) + { + [body addBodyPart: [attachments objectAtIndex: a]]; + } + + // For a forward decide whether do it inline or as an attachment. + if (isSmartForward) + { + if ([[ud mailMessageForwarding] isEqualToString: @"attached"]) + { + map = [[[NGMutableHashMap alloc] initWithCapacity: 1] autorelease]; + [map setObject: @"message/rfc822" forKey: @"content-type"]; + [map setObject: @"8bit" forKey: @"content-transfer-encoding"]; + [map addObject: [NSString stringWithFormat: @"attachment; filename=\"%@\"", [mailObject filenameForForward]] forKey: @"content-disposition"]; + bodyPart = [[[NGMimeBodyPart alloc] initWithHeader: map] autorelease]; + + data = [mailObject content]; + fdata = [[NGMimeFileData alloc] initWithBytes: [data bytes] length: [data length]]; + + [bodyPart setBody: fdata]; + RELEASE(fdata); + [body addBodyPart: bodyPart]; + } + else + { + attachmentKeys = [mailObject fetchFileAttachmentKeys]; + if ([attachmentKeys count]) + { + id currentAttachment; + NGHashMap *response; + NSData *bodydata; + NSArray *paths; + + paths = [attachmentKeys keysWithFormat: @"BODY[%{path}]"]; + response = [[mailObject fetchParts: paths] objectForKey: @"RawResponse"]; + + for (a = 0; a < [attachmentKeys count]; a++) + { + currentAttachment = [attachmentKeys objectAtIndex: a]; + bodydata = [[[response objectForKey: @"fetch"] objectForKey: [NSString stringWithFormat: @"body[%@]", [currentAttachment objectForKey: @"path"]]] valueForKey: @"data"]; + + map = [[[NGMutableHashMap alloc] initWithCapacity: 1] autorelease]; + [map setObject: [currentAttachment objectForKey: @"mimetype"] forKey: @"content-type"]; + [map setObject: [currentAttachment objectForKey: @"encoding"] forKey: @"content-transfer-encoding"]; + [map addObject: [NSString stringWithFormat: @"attachment; filename=\"%@\"", [currentAttachment objectForKey: @"filename"]] forKey: @"content-disposition"]; + bodyPart = [[[NGMimeBodyPart alloc] initWithHeader: map] autorelease]; + + fdata = [[NGMimeFileData alloc] initWithBytes:[bodydata bytes] length:[bodydata length]]; + + [bodyPart setBody: fdata]; + RELEASE(fdata); + [body addBodyPart: bodyPart]; + } + + } + } + } - [bodyPart setBody: fdata]; - RELEASE(fdata); - [body addBodyPart: bodyPart]; [messageToSend setBody: body]; generator = [[[NGMimeMessageGenerator alloc] init] autorelease]; @@ -2570,6 +2697,29 @@ static BOOL debugOn = NO; } } +// +// +// +// +// C9FF94FE-EA40-473A-B3E2-AAEE94F753A4 +// +// +// +// mail/INBOX +// 82 +// +// ... the data ... +// +// +- (void) processSmartForward: (id ) theDocumentElement + inResponse: (WOResponse *) theResponse +{ + [self _processSmartCommand: theDocumentElement + inResponse: theResponse + isSmartForward: YES]; +} + + // // // @@ -2587,11 +2737,11 @@ static BOOL debugOn = NO; - (void) processSmartReply: (id ) theDocumentElement inResponse: (WOResponse *) theResponse { - [self processSmartForward: theDocumentElement inResponse: theResponse]; + [self _processSmartCommand: theDocumentElement + inResponse: theResponse + isSmartForward: NO]; } - - // // // diff --git a/NEWS b/NEWS index 96f96e766..4fdabf5d7 100644 --- a/NEWS +++ b/NEWS @@ -19,6 +19,7 @@ Enhancements - make sure sure email invitations can always be read by EAS clients - now able to print event/task's description (new components only) in the list view (#2881) - now possible to log EAS commands using the SOGoEASDebugEnabled system defaults + - many improvements to EAS SmartReply/SmartForward commands Bug fixes - now keep the BodyPreference for future EAS use and default to MIME if none set (#3146) From 037a3a136a83ecf4bf5c4d01ca3d396cee6d31ad Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 14 May 2015 15:58:53 -0400 Subject: [PATCH 070/109] (fix) message bodies not shown on some EAS devices (#3173) --- ActiveSync/SOGoMailObject+ActiveSync.m | 27 ++++++++++++++++++-------- NEWS | 1 + 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index 7d74147d8..d3095a966 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -219,6 +219,8 @@ struct GlobalObjectId { NSEnumerator *e; NSData *d; + BOOL ignore; + textParts = [self fetchPlainTextParts]; e = [textParts keyEnumerator]; plainKey = nil; @@ -227,15 +229,24 @@ struct GlobalObjectId { while ((key = [e nextObject])) { - // Don't use body parts from nested bodies if not of type multipart/alternative. - e.g. body of type message/rfc822 - // Use only parts of level 0 or 1. - if ([key countOccurrencesOfString: @"."] > 1) - continue; - else if ([key countOccurrencesOfString: @"."] == 1) + // Walk the hierarchy up and check whether parents are of type mulipart - i.e. ignore message/rfc822 + if ([key countOccurrencesOfString: @"."] > 0) { - // Ignore nested parts if the container is not of type multipart/alternative. - part = [self lookupInfoForBodyPart: [[key componentsSeparatedByString: @"."] objectAtIndex:0]]; - if (!([[part valueForKey: @"type"] isEqualToString: @"multipart"] && [[part valueForKey: @"subtype"] isEqualToString: @"alternative"])) + NSMutableArray *a; + + a = [[[key componentsSeparatedByString: @"."] mutableCopy] autorelease]; + ignore = NO; + + while ([a count] > 0) + { + [a removeLastObject]; + part = [self lookupInfoForBodyPart: [a componentsJoinedByString: @"."]]; + + if (![[part valueForKey: @"type"] isEqualToString: @"multipart"]) + ignore = YES; + } + + if (ignore) continue; } diff --git a/NEWS b/NEWS index 4fdabf5d7..f5acf941a 100644 --- a/NEWS +++ b/NEWS @@ -53,6 +53,7 @@ Bug fixes - now correctly handle external invitations using EAS - now correctly handle multiple email addresses in the GAL over EAS (#3102) - now handle very large amount of participants correctly (#3175) + - fix message bodies not shown on some EAS devices (#3173) 2.2.17a (2015-03-15) -------------------- From 143ee59f5b5401c28374f882ad73d7763c3894d7 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 15 May 2015 09:38:58 -0400 Subject: [PATCH 071/109] Improved debian packaging regarding apache 2.2 -> 2.4 --- packaging/debian-multiarch/sogo.postinst | 2 +- packaging/debian-multiarch/sogo.prerm | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packaging/debian-multiarch/sogo.postinst b/packaging/debian-multiarch/sogo.postinst index cb988a921..0cbb5b80e 100644 --- a/packaging/debian-multiarch/sogo.postinst +++ b/packaging/debian-multiarch/sogo.postinst @@ -34,7 +34,7 @@ case "$1" in . /usr/share/apache2/apache2-maintscript-helper apache2_invoke enconf SOGo || exit $? elif [ "$COMMON_STATE" = "installed" ] || [ "$COMMON_STATE" = "unpacked" ] ; then - if [ -d /etc/apache2/conf.d/ -a ! -L /etc/apache2/conf.d/SOGo.conf ]; then + if [ -d /etc/apache2/conf.d/ -a ! -e /etc/apache2/conf.d/SOGo.conf ]; then ln -s ../conf-available/SOGo.conf /etc/apache2/conf.d/SOGo.conf fi fi diff --git a/packaging/debian-multiarch/sogo.prerm b/packaging/debian-multiarch/sogo.prerm index 7d304833a..35f46aa4a 100644 --- a/packaging/debian-multiarch/sogo.prerm +++ b/packaging/debian-multiarch/sogo.prerm @@ -18,7 +18,10 @@ if [ "$1" = "deconfigure" ] ; then # Apache 2.2 / 2.4 kungfu COMMON_STATE=$(dpkg-query -f '${Status}' -W 'apache2.2-common' 2>/dev/null | awk '{print $3}' || true) - if [ "$COMMON_STATE" = "installed" ] || [ "$COMMON_STATE" = "unpacked" ] ; then + if [ -e /usr/share/apache2/apache2-maintscript-helper ] ; then + . /usr/share/apache2/apache2-maintscript-helper + apache2_invoke disconf SOGo || exit $? + elif [ "$COMMON_STATE" = "installed" ] || [ "$COMMON_STATE" = "unpacked" ] ; then [ ! -L /etc/apache2/conf.d/SOGo.conf ] || rm /etc/apache2/conf.d/SOGo.conf fi From ae72c2f1d5c32a009207b09bc748cdccd257452e Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 19 May 2015 06:35:19 -0400 Subject: [PATCH 072/109] Renamed scripts --- ....17_to_2.1.18-mysql.sh => sql-update-2.1.17_to_2.3.0-mysql.sh} | 0 ...l-update-2.1.17_to_2.1.18.sh => sql-update-2.1.17_to_2.3.0.sh} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename Scripts/{sql-update-2.1.17_to_2.1.18-mysql.sh => sql-update-2.1.17_to_2.3.0-mysql.sh} (100%) rename Scripts/{sql-update-2.1.17_to_2.1.18.sh => sql-update-2.1.17_to_2.3.0.sh} (100%) diff --git a/Scripts/sql-update-2.1.17_to_2.1.18-mysql.sh b/Scripts/sql-update-2.1.17_to_2.3.0-mysql.sh similarity index 100% rename from Scripts/sql-update-2.1.17_to_2.1.18-mysql.sh rename to Scripts/sql-update-2.1.17_to_2.3.0-mysql.sh diff --git a/Scripts/sql-update-2.1.17_to_2.1.18.sh b/Scripts/sql-update-2.1.17_to_2.3.0.sh similarity index 100% rename from Scripts/sql-update-2.1.17_to_2.1.18.sh rename to Scripts/sql-update-2.1.17_to_2.3.0.sh From 5a8f310bc80b2e2daed248d7e7fb4a400a6ee48a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Amor=20Garc=C3=ADa?= Date: Mon, 18 May 2015 14:43:11 +0200 Subject: [PATCH 073/109] Show 'complexity password' error instead of a generic error. There is not discrimination between complexity and length errors because backend does not return different error codes for each case. --- SoObjects/SOGo/LDAPSource.m | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/SoObjects/SOGo/LDAPSource.m b/SoObjects/SOGo/LDAPSource.m index 598e56ffe..1d2d55f5f 100644 --- a/SoObjects/SOGo/LDAPSource.m +++ b/SoObjects/SOGo/LDAPSource.m @@ -737,7 +737,14 @@ groupObjectClasses: (NSArray *) newGroupObjectClasses } NS_HANDLER { - [self logWithFormat: @"%@", localException]; + if ([[localException name] isEqual: @"LDAPException"] && ([[[localException userInfo] objectForKey: @"error_code"] intValue] == LDAP_CONSTRAINT_VIOLATION)) + { + *perr = PolicyInsufficientPasswordQuality; + } + else + { + [self logWithFormat: @"%@", localException]; + } } NS_ENDHANDLER ; From 416711ea43af4fe1c7095111ef6beef5fb577432 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 19 May 2015 13:48:59 -0400 Subject: [PATCH 074/109] (fix) avoid appending the domain unconditionally when SOGoEnableDomainBasedUID is set to YES --- NEWS | 1 + SoObjects/SOGo/SOGoUserFolder.m | 3 ++- SoObjects/SOGo/SOGoUserManager.m | 3 ++- UI/MainUI/SOGoRootPage.m | 6 ++++-- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index f5acf941a..0ebb8076d 100644 --- a/NEWS +++ b/NEWS @@ -54,6 +54,7 @@ Bug fixes - now correctly handle multiple email addresses in the GAL over EAS (#3102) - now handle very large amount of participants correctly (#3175) - fix message bodies not shown on some EAS devices (#3173) + - avoid appending the domain unconditionally when SOGoEnableDomainBasedUID is set to YES 2.2.17a (2015-03-15) -------------------- diff --git a/SoObjects/SOGo/SOGoUserFolder.m b/SoObjects/SOGo/SOGoUserFolder.m index ba8414b81..2a44128e8 100644 --- a/SoObjects/SOGo/SOGoUserFolder.m +++ b/SoObjects/SOGo/SOGoUserFolder.m @@ -427,7 +427,8 @@ { currentUser = [users objectAtIndex: i]; field = [currentUser objectForKey: @"c_uid"]; - if (enableDomainBasedUID) + if (enableDomainBasedUID && + [field rangeOfString: @"@"].location == NSNotFound) field = [NSString stringWithFormat: @"%@@%@", field, domain]; if (![field isEqualToString: login]) { diff --git a/SoObjects/SOGo/SOGoUserManager.m b/SoObjects/SOGo/SOGoUserManager.m index ae4d8612d..6354a0cf4 100644 --- a/SoObjects/SOGo/SOGoUserManager.m +++ b/SoObjects/SOGo/SOGoUserManager.m @@ -652,7 +652,8 @@ static Class NSNullK; // internal cache. [currentUser setObject: [newPassword asSHA1String] forKey: @"password"]; sd = [SOGoSystemDefaults sharedSystemDefaults]; - if ([sd enableDomainBasedUID]) + if ([sd enableDomainBasedUID] && + [login rangeOfString: @"@"].location == NSNotFound) userLogin = [NSString stringWithFormat: @"%@@%@", login, domain]; else userLogin = login; diff --git a/UI/MainUI/SOGoRootPage.m b/UI/MainUI/SOGoRootPage.m index df3e944b1..dc9712e88 100644 --- a/UI/MainUI/SOGoRootPage.m +++ b/UI/MainUI/SOGoRootPage.m @@ -228,7 +228,8 @@ if ([domain isNotNull]) { sd = [SOGoSystemDefaults sharedSystemDefaults]; - if ([sd enableDomainBasedUID]) + if ([sd enableDomainBasedUID] && + [username rangeOfString: @"@"].location == NSNotFound) username = [NSString stringWithFormat: @"%@@%@", username, domain]; } @@ -587,7 +588,8 @@ if ([domain isNotNull]) { sd = [SOGoSystemDefaults sharedSystemDefaults]; - if ([sd enableDomainBasedUID]) + if ([sd enableDomainBasedUID] && + [username rangeOfString: @"@"].location == NSNotFound) username = [NSString stringWithFormat: @"%@@%@", username, domain]; } From 7e8c79c64697ff012d7fb4419e07e8ad0e297498 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 20 May 2015 13:51:16 -0400 Subject: [PATCH 075/109] (fix) use the contact-info, not the user/group bit identifier --- UI/WebServerResources/AdministrationUI.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UI/WebServerResources/AdministrationUI.js b/UI/WebServerResources/AdministrationUI.js index a22f9d8d1..961beedf9 100644 --- a/UI/WebServerResources/AdministrationUI.js +++ b/UI/WebServerResources/AdministrationUI.js @@ -80,8 +80,8 @@ function addUserLineToTree(tree, parent, line) { var icon = ResourcesURL + '/busy.gif'; var email = line[1] + " <" + line[2] + ">"; - if (line[3] && !line[3].empty()) - email += ", " + line[3]; // extra contact info + if (line[4] && !line[4].empty()) + email += ", " + line[4]; // extra contact info tree.add(parent, 0, email, 0, '#', line[0], 'person', '', '', ResourcesURL + '/abcard.png', From 54ab0bf822bec60bec48a1e79ba0553e69f1dd79 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 20 May 2015 14:24:02 -0400 Subject: [PATCH 076/109] (fix) rhel7 packaging fix --- packaging/rhel/sogo.spec | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packaging/rhel/sogo.spec b/packaging/rhel/sogo.spec index 02bf547ce..1400b39e4 100644 --- a/packaging/rhel/sogo.spec +++ b/packaging/rhel/sogo.spec @@ -287,7 +287,9 @@ rm -fr ${RPM_BUILD_ROOT} %files -n sogo %defattr(-,root,root,-) +%if !0%{?_with_systemd} /etc/init.d/sogod +%endif /etc/cron.daily/sogo-tmpwatch %dir %attr(0700, %sogo_user, %sogo_user) %{_var}/lib/sogo %dir %attr(0700, %sogo_user, %sogo_user) %{_var}/log/sogo From 79bfc7aedf0b03acf40f78fbc714c12d11f37254 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 20 May 2015 14:27:57 -0400 Subject: [PATCH 077/109] (fix) more rhel7 fix --- packaging/rhel/sogo.spec | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packaging/rhel/sogo.spec b/packaging/rhel/sogo.spec index 1400b39e4..988f7c693 100644 --- a/packaging/rhel/sogo.spec +++ b/packaging/rhel/sogo.spec @@ -287,7 +287,9 @@ rm -fr ${RPM_BUILD_ROOT} %files -n sogo %defattr(-,root,root,-) -%if !0%{?_with_systemd} +%if 0%{?_with_systemd} +/usr/lib/systemd/system/sogod.service +%else /etc/init.d/sogod %endif /etc/cron.daily/sogo-tmpwatch From e40be922048b284597fb6711da60ad89e155acee Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 21 May 2015 08:48:45 -0400 Subject: [PATCH 078/109] Updated NEWS file regarding PR#84 --- NEWS | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 0ebb8076d..abf1c6cbe 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,4 @@ -2.2.18 (2015-04-XX) +2.3.0 (2015-05-XX) ------------------- New features @@ -20,6 +20,9 @@ Enhancements - now able to print event/task's description (new components only) in the list view (#2881) - now possible to log EAS commands using the SOGoEASDebugEnabled system defaults - many improvements to EAS SmartReply/SmartForward commands + - event invitation response mails are now sent + - mail subfolders created in WebMail are created when Outlook synchronises + - mail root folder created in WebMail (same level INBOX) are created on Outlook logon Bug fixes - now keep the BodyPreference for future EAS use and default to MIME if none set (#3146) @@ -55,6 +58,7 @@ Bug fixes - now handle very large amount of participants correctly (#3175) - fix message bodies not shown on some EAS devices (#3173) - avoid appending the domain unconditionally when SOGoEnableDomainBasedUID is set to YES + - recurrent all day events are now shown properly in Outlook 2.2.17a (2015-03-15) -------------------- From 789334924429a4750d5f2c7ad4cfdb84c42e0717 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Thu, 21 May 2015 21:35:13 -0400 Subject: [PATCH 079/109] TimePicker: allow entries from numpad Fixes #1516 --- UI/WebServerResources/SOGoTimePicker.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/UI/WebServerResources/SOGoTimePicker.js b/UI/WebServerResources/SOGoTimePicker.js index a5acbea5b..18efc19cc 100644 --- a/UI/WebServerResources/SOGoTimePicker.js +++ b/UI/WebServerResources/SOGoTimePicker.js @@ -206,7 +206,9 @@ var SOGoTimePickerInterface = { event.keyCode == Event.KEY_TAB || event.keyCode == Event.KEY_BACKSPACE) return true; - if (event.keyCode > 57 && event.keyCode != 186 && event.keyCode != 59 || + if (event.keyCode > 57 && // ignore non-numeric characters + (event.keyCode < 96 || event.keyCode > 105) && // but allow entries from keypad + event.keyCode != 186 && event.keyCode != 59 || (event.keyCode == 186 || event.keyCode == 59) && this.value.indexOf(":") >= 0) Event.stop(event); }, From 9922ec56d9d19eed61874a80b33975c3377043e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Wed, 20 May 2015 11:44:06 +0200 Subject: [PATCH 080/109] Avoid uid+attributes entries on shared cache In multidomain environments this will produce that info@domain1.com can read info@domain2.com emails when info@domain2.com log in after info@domain1.com is already logged in. If multidomain is not enabled, this action is not needed because uid+attributes has been already saved on shared cache --- SoObjects/SOGo/SOGoUserManager.m | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/SoObjects/SOGo/SOGoUserManager.m b/SoObjects/SOGo/SOGoUserManager.m index 6354a0cf4..6c10894de 100644 --- a/SoObjects/SOGo/SOGoUserManager.m +++ b/SoObjects/SOGo/SOGoUserManager.m @@ -806,24 +806,20 @@ static Class NSNullK; withLogin: (NSString *) login { NSEnumerator *emails; - NSString *key; - - [[SOGoCache sharedCache] - setUserAttributes: [newUser jsonRepresentation] - forLogin: login]; + NSString *key, *user_json; + + user_json = [newUser jsonRepresentation]; + [[SOGoCache sharedCache] setUserAttributes: user_json + forLogin: login]; if (![newUser isKindOfClass: NSNullK]) { - key = [newUser objectForKey: @"c_uid"]; - if (key && ![key isEqualToString: login]) - [[SOGoCache sharedCache] - setUserAttributes: [newUser jsonRepresentation] - forLogin: key]; - emails = [[newUser objectForKey: @"emails"] objectEnumerator]; while ((key = [emails nextObject])) - [[SOGoCache sharedCache] - setUserAttributes: [newUser jsonRepresentation] - forLogin: key]; + { + if (![key isEqualToString: login]) + [[SOGoCache sharedCache] setUserAttributes: user_json + forLogin: key]; + } } } From 37461e650d1dca5106daea7e73bf0428211fc803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Wed, 20 May 2015 12:30:05 +0200 Subject: [PATCH 081/109] Fix conflicts with externalLoginWithEmail + DomainBasedUid On multidomain environment (SOGoEnableDomainBasedUID) with email for imap authentication (SOGoForceExternalLoginWithEmail) we need to use uid@domain instead of just uid in method getEmailForUID --- SoObjects/SOGo/SOGoUserManager.m | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/SoObjects/SOGo/SOGoUserManager.m b/SoObjects/SOGo/SOGoUserManager.m index 6c10894de..52f7167ad 100644 --- a/SoObjects/SOGo/SOGoUserManager.m +++ b/SoObjects/SOGo/SOGoUserManager.m @@ -362,6 +362,7 @@ static Class NSNullK; NSDictionary *contactInfos; NSString *login; SOGoDomainDefaults *dd; + SOGoSystemDefaults *sd; contactInfos = [self contactInfosForUserWithUIDorEmail: uid inDomain: domain]; @@ -372,10 +373,22 @@ static Class NSNullK; dd = [SOGoDomainDefaults defaultsForDomain: domain]; else dd = [SOGoSystemDefaults sharedSystemDefaults]; - - login = [dd forceExternalLoginWithEmail] ? [self getEmailForUID: uid] : uid; + + if ([dd forceExternalLoginWithEmail]) + { + sd = [SOGoSystemDefaults sharedSystemDefaults]; + if ([sd enableDomainBasedUID]) + // On multidomain environment we must use uid@domain + // for getEmailForUID method + login = [NSString stringWithFormat: @"%@@%@", uid, domain]; + else + login = uid; + login = [self getEmailForUID: login]; + } + else + login = uid; } - + return login; } From 04ce8d10665ca734fefcbb8cd5c217add4ab614b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Wed, 20 May 2015 12:31:25 +0200 Subject: [PATCH 082/109] Avoid cache entries with uid@domain@domain prefix Depend of the current workflow this paths are reached with username as uid and sometimes as uid@domain. So in multidomain environments only append @domain when needed. Conflicts: SoObjects/SOGo/SOGoUserManager.m --- SoObjects/SOGo/SOGoUserManager.m | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/SoObjects/SOGo/SOGoUserManager.m b/SoObjects/SOGo/SOGoUserManager.m index 52f7167ad..be7d21979 100644 --- a/SoObjects/SOGo/SOGoUserManager.m +++ b/SoObjects/SOGo/SOGoUserManager.m @@ -495,11 +495,11 @@ static Class NSNullK; dd = [SOGoSystemDefaults sharedSystemDefaults]; - // We check for cached passwords. If the entry is cached, we - // check this immediately. If not, we'll go directly at the - // authentication source and try to validate there, then cache it. - if (*_domain != nil) - username = [NSString stringWithFormat: @"%@@%@", _login, *_domain]; + if (*_domain) + { + if ([_login rangeOfString: @"@"].location == NSNotFound) + username = [NSString stringWithFormat: @"%@@%@", _login, *_domain]; + } else { NSRange r; @@ -532,13 +532,10 @@ static Class NSNullK; } } - failedCount = [[SOGoCache sharedCache] failedCountForLogin: username]; - - // // We check the fail count per user in memcache (per server). If the // fail count reaches X in Y minutes, we deny immediately the // authentications for Z minutes - // + failedCount = [[SOGoCache sharedCache] failedCountForLogin: username]; if (failedCount) { unsigned int current_time, start_time, delta, block_time; @@ -564,7 +561,9 @@ static Class NSNullK; } } - + // We check for cached passwords. If the entry is cached, we + // check this immediately. If not, we'll go directly at the + // authentication source and try to validate there, then cache it. jsonUser = [[SOGoCache sharedCache] userAttributesForLogin: username]; currentUser = [jsonUser objectFromJSONString]; dictPassword = [currentUser objectForKey: @"password"]; From 7990e23aaa2dfc4ade88309f8a53cfe9e23ccb80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Wed, 20 May 2015 15:24:00 +0200 Subject: [PATCH 083/109] Fix warning distinct Objective-C type failedCount is a NSDictionary *, not NSMutableDictionary * --- SoObjects/SOGo/SOGoUserManager.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SoObjects/SOGo/SOGoUserManager.m b/SoObjects/SOGo/SOGoUserManager.m index be7d21979..300ea7000 100644 --- a/SoObjects/SOGo/SOGoUserManager.m +++ b/SoObjects/SOGo/SOGoUserManager.m @@ -488,7 +488,8 @@ static Class NSNullK; grace: (int *) _grace useCache: (BOOL) useCache { - NSMutableDictionary *currentUser, *failedCount; + NSMutableDictionary *currentUser; + NSDictionary *failedCount; NSString *dictPassword, *username, *jsonUser; SOGoSystemDefaults *dd; BOOL checkOK; From 1e0473f1e51bc1ae5e6b1a7e75a04f2849f6494b Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Fri, 22 May 2015 07:58:26 -0400 Subject: [PATCH 084/109] Localization --- UI/Common/French.lproj/Localizable.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/Common/French.lproj/Localizable.strings b/UI/Common/French.lproj/Localizable.strings index 3d07d74ff..723ed62be 100644 --- a/UI/Common/French.lproj/Localizable.strings +++ b/UI/Common/French.lproj/Localizable.strings @@ -1,7 +1,7 @@ /* this file is in UTF-8 format! */ /* toolbars */ -"Save" = "Sauver"; +"Save" = "Enregistrer"; "Close" = "Fermer"; "Edit User Rights" = "Édition des droits"; From 2ae5f342daf05b8fa865458ed51a616dda163ab6 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 22 May 2015 13:47:48 -0400 Subject: [PATCH 085/109] Fix a crasher --- SoObjects/SOGo/SOGoUserManager.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SoObjects/SOGo/SOGoUserManager.m b/SoObjects/SOGo/SOGoUserManager.m index 300ea7000..cfc159c3c 100644 --- a/SoObjects/SOGo/SOGoUserManager.m +++ b/SoObjects/SOGo/SOGoUserManager.m @@ -496,6 +496,8 @@ static Class NSNullK; dd = [SOGoSystemDefaults sharedSystemDefaults]; + username = _login; + if (*_domain) { if ([_login rangeOfString: @"@"].location == NSNotFound) @@ -505,8 +507,6 @@ static Class NSNullK; { NSRange r; - username = _login; - // We try to extract the domain in use in order to avoid pounding all the authentication // sources if SOGoLoginDomains isn't specified. This is also true if the user is // using DAV or EAS. From c8995087d8da99a5ece2b3d0742dcac51981a252 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 22 May 2015 13:50:06 -0400 Subject: [PATCH 086/109] Small improvements to the docs --- Documentation/SOGoInstallationGuide.asciidoc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Documentation/SOGoInstallationGuide.asciidoc b/Documentation/SOGoInstallationGuide.asciidoc index 68b8206da..98497ccdc 100644 --- a/Documentation/SOGoInstallationGuide.asciidoc +++ b/Documentation/SOGoInstallationGuide.asciidoc @@ -167,9 +167,9 @@ Operating System Requirements The following 32-bit and 64-bit operating systems are currently supported by SOGo: -* Red Hat Enterprise Linux (RHEL) Server 5 and 6 -* Community ENTerprise Operating System (CentOS) 5 and 6 -* Debian GNU/Linux 5.0 (Lenny) to 7.0 (Wheezy) +* Red Hat Enterprise Linux (RHEL) Server 5, 6 and 7 +* Community ENTerprise Operating System (CentOS) 5, 6 and 7 +* Debian GNU/Linux 6.0 (Squeeze) to 8.0 (Jessie) * Ubuntu 10.04 (Lucid) to 14.04 (Trusty) Make sure the required components are started automatically at boot time @@ -194,7 +194,8 @@ Installation This section will guide you through the installation of SOGo together with its dependencies. The steps described here apply to an RPM-based -installation for a Red Hat or CentOS distribution. +installation for a Red Hat or CentOS 6 distribution. Most of these steps +should apply to all supported operating systems. Software Downloads ~~~~~~~~~~~~~~~~~~ From 4f303f8aa26046ecae916c457839d84622b260bb Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 22 May 2015 14:03:49 -0400 Subject: [PATCH 087/109] Fixed mess regarding uid/realUID --- SoObjects/SOGo/SOGoUser.m | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/SoObjects/SOGo/SOGoUser.m b/SoObjects/SOGo/SOGoUser.m index 91d3b1b5a..c1b0f7603 100644 --- a/SoObjects/SOGo/SOGoUser.m +++ b/SoObjects/SOGo/SOGoUser.m @@ -197,8 +197,12 @@ // When the user is associated to a domain, the [SOGoUser login] // method returns the combination login@domain while // [SOGoUser loginInDomain] only returns the login. - uid = [NSString stringWithString: realUID]; - realUID = [NSString stringWithFormat: @"%@@%@", realUID, domain]; + r = [realUID rangeOfString: domain options: NSBackwardsSearch|NSCaseInsensitiveSearch]; + + if (r.location != NSNotFound) + uid = [realUID substringToIndex: r.location-1]; + else + uid = [NSString stringWithString: realUID]; } } From 55d91973bda76775518b0070cf0d9ac019bcc058 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 22 May 2015 15:23:48 -0400 Subject: [PATCH 088/109] Improved the doc for the release --- ...GoNativeOutlookConfigurationGuide.asciidoc | 146 ++++++++++++++++-- 1 file changed, 130 insertions(+), 16 deletions(-) diff --git a/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc b/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc index 99efb47fe..4a85f8dbc 100644 --- a/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc +++ b/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc @@ -268,16 +268,16 @@ from this guide. Samba4/OpenChange are not available for now on CentOS 5 i386/x86_64, CentOS 6 i386 and CentOS 7. -Debian 7.0 (Wheezy) and Ubuntu 12.04 (Precise Pangolin) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Debian 7 (Wheezy) and Ubuntu 12.04 (Precise Pangolin) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SOGo, OpenChange and the SOGo OpenChange backend are now available from SOGo's web site. Please follow the instructions from http://www.sogo.nu/english/downloads/backend.html to setup your apt sources. -For Samba 4, you need to use the _wheezy-backports_ repository. To do so, create -`/etc/apt/sources.list.d/backports.list`: +On Debian7, for Samba 4, you need to use the _wheezy-backports_ repository. +To do so, create `/etc/apt/sources.list.d/backports.list`: deb http://http.debian.net/debian wheezy-backports main @@ -303,7 +303,12 @@ apt-get install openchangeserver \ openchangeproxy \ python-ocsmanager \ mysql-server \ - python-mysqldb + python-mysqldb \ + openchange-ocsmanager \ + openchange-rpcproxy \ + python-sievelib \ + python-spyne \ + python-rpclib ---- Once the packages are installed, refer to the _Configuration_ chapter @@ -315,10 +320,10 @@ disable the upstart check. For more details, refer to: https://wiki.samba.org/index.php/Samba4/InitScript -Ubuntu 14.04 (Trusty Tahr) -~~~~~~~~~~~~~~~~~~~~~~~~~~ +Debian 8 (Jessie) and Ubuntu 14.04 (Trusty Tahr) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -For Ubuntu 14.04, you must not use the Debian Wheezy backports. +For Debian 8 and Ubuntu 14.04, you must not use the Debian Wheezy backports. Please follow the instructions from http://www.sogo.nu/english/downloads/backend.html to setup your @@ -341,12 +346,26 @@ apt-get install openchangeserver \ openchangeproxy \ python-ocsmanager \ mysql-server \ - python-mysqldb + python-mysqldb \ + openchange-ocsmanager \ + openchange-rpcproxy \ + python-sievelib \ + python-spyne \ + python-rpclib ---- Once the packages are installed, refer to the _Configuration_ chapter from this guide. +[NOTE] +The `ocsmanager.conf` and `rpcproxy.conf` are currently located in +`/etc/apache2/conf.d`. These should be moved to `/etc/apache2/conf-available`. +This is a packaging error that will soon be fixed. + +[NOTE] +You might have to adjust the `rpcproxy.conf` configuration file to add the +`Require all granted` permission if you get Apache errors such as +`client denied by server configuration`. Configuration ------------- @@ -533,7 +552,7 @@ services can be found in `/etc/httpd/conf.d/ocsmanager.conf` and `/etc/httpd/conf.d/rpcproxy.conf`. For Debian-based distributions, these files can be found -in `/etc/apache2/conf.d/`. +in `/etc/apache2/conf.d/` or `/etc/apache2/conf-available`. The configuration requires three Apache modules:  _mod_proxy_, _mod_proxy_http_ and _mod_wsgi_. These are usually already installed but @@ -541,13 +560,17 @@ might need to be activated on Debian-based installations: a2enmod proxy proxy_http wsgi +The OCS Manager and RPC Proxy configuration module can be enabled using: + + a2enconf ocsmanager + a2enconf rpcproxy + On RHEL-based distributions, make sure the `LoadModule` directive is -uncommented in `/etc/httpd/conf.d/wsgi.conf` (or -`python26-mod_wsgi.conf` on RHELv5). +uncommented in `/etc/httpd/conf.d/wsgi.conf`. The _reqtimeout_ apache module is known to cause problems when using the default configuration shipped with Debian-based systems. On such -distributions, apache will close (HTTP/1.1 500) any HTTP request for +distributions, Apache will close (HTTP/1.1 500) any HTTP request for which the HTTP body hasn't arrived in 10 seconds. While this is arguably good practice with regular HTTP, it will disrupt @@ -567,9 +590,100 @@ On Debian-based distributions, do: update-rc.d apache2 defaults && /etc/init.d/apache2 restart -[NOTE] -Debian-based distributions are not supported anymore for -OCSManager/rpcproxy. Support will soon resume. +Finally, you must adjust the OCS Manager configuration file, which is +located in `/etc/ocsmanager/ocsmanager.ini`. You should enable LDAP-based +authentication in the `main` section and configure it accordingly. You should +also enable rpcproxy. You file should be similar to this one: + +---- +[DEFAULT] +debug = true +email_to = you@yourdomain.com +smtp_server = localhost +error_email_from = paste@localhost + +[main] +auth = ldap +mapistore_root = /var/lib/samba/private +mapistore_data = /var/lib/samba/private/mapistore +debug = yes + +[auth:file] + +[auth:ldap] +host = ldap://127.0.0.1 +port = 389 +bind_dn = cn=administrator,cn=Users,dc=example,dc=com +bind_pw = %1OpenChange +basedn = cn=Users,dc=example,dc=com + +[auth:single] +username = openchange +password = {SSHA}I6Hy5Wv0wuxyXvMBFWFQDVVN12_CLaX9 + +[server:main] +use = egg:Paste#http +host = 127.0.0.1 +port = 5000 +protocol_version = HTTP/1.1 + +[app:main] +use = egg:ocsmanager +full_stack = true +static_files = true +cache_dir = %(here)s/data +beaker.session.key = ocsmanager +beaker.session.secret = SDyKK3dKyDgW0mlpqttTMGU1f +app_instance_uuid = {ee533ebc-f266-49d1-ae10-d017ee6aa98c} +NTLMAUTHHANDLER_WORKDIR = /var/cache/ntlmauthhandler +SAMBA_HOST = 127.0.0.1 + +[rpcproxy:ldap] +host = localhost +port = 389 +basedn = CN=Users,DC=example,DC=com +set debug = true + +[autodiscover] + +[autodiscover:rpcproxy] +enabled = true + +[outofoffice] + +[outofoffice:file] +sieve_script_path = /var/vmail/$domain/$user/sieve-script +sieve_script_path_mkdir = false + +[outofoffice:managesieve] +secret = secret + +[loggers] +keys = root + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = INFO +handlers = console + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(asctime)s %(levelname)-5.5s [%(name)s] [%(threadName)s] %(message)s +---- + +Once completed, start the OCS Manager service: + + /etc/init.d/openchange-ocsmanager start Name Service Configuration for Web Services ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From e0c1d5e47ba9104030946abe99f3778436e4ae55 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 25 May 2015 08:27:46 -0400 Subject: [PATCH 089/109] Improved the doc for the 2.3 release --- Documentation/SOGoInstallationGuide.asciidoc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Documentation/SOGoInstallationGuide.asciidoc b/Documentation/SOGoInstallationGuide.asciidoc index 98497ccdc..945b1fd80 100644 --- a/Documentation/SOGoInstallationGuide.asciidoc +++ b/Documentation/SOGoInstallationGuide.asciidoc @@ -2699,6 +2699,13 @@ current version of SOGo from the previous release. [cols="100a"] |======================================================================= +h|2.3.0 +|Run the shell script `sql-update-2.2.17_to_2.3.0.sh` or +`sql-update-2.2.17_to_2.3.0-mysql.sh` (if you use MySQL). + +This will grow the "participant states" field of calendar quick tables to a larger +size and add the the "c_description" column to calendar quick tables. + h|2.2.8 |The configuration configuration parameters were renamed: @@ -2720,13 +2727,6 @@ sudo -u sogo mv ~/GNUstep/Defaults/.GNUstepDefaults \ ~/GNUstep/Defaults/GNUstepDefaults.old ---- -h|2.1.18 -|Run the shell script `sql-update-2.1.17_to_2.1.18.sh` or -`sql-update-2.1.18_to_2.1.18-mysql.sh` (if you use MySQL). - -This will grow the "participant states" field of calendar tables to a larger -size. - h|2.0.4 |The parameter _SOGoForceIMAPLoginWithEmail_ is now deprecated and is replaced by _SOGoForceExternalLoginWithEmail_ (which extends the From ed42d1e26b047e9d074a46a1a60c13a65e2d39de Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 25 May 2015 09:19:04 -0400 Subject: [PATCH 090/109] (fix) more multi-domain fixes and cleanups --- SoObjects/SOGo/SOGoUser.m | 8 ++++---- SoObjects/SOGo/SOGoUserManager.m | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/SoObjects/SOGo/SOGoUser.m b/SoObjects/SOGo/SOGoUser.m index c1b0f7603..12d028fd3 100644 --- a/SoObjects/SOGo/SOGoUser.m +++ b/SoObjects/SOGo/SOGoUser.m @@ -165,9 +165,7 @@ // The domain is probably appended to the username; // make sure it is defined as a domain in the configuration. domain = [newLogin substringFromIndex: (r.location + r.length)]; - if ([[sd domainIds] containsObject: domain]) - newLogin = [newLogin substringToIndex: r.location]; - else + if (![[sd domainIds] containsObject: domain]) domain = nil; if (domain != nil && ![sd enableDomainBasedUID]) @@ -199,7 +197,9 @@ // [SOGoUser loginInDomain] only returns the login. r = [realUID rangeOfString: domain options: NSBackwardsSearch|NSCaseInsensitiveSearch]; - if (r.location != NSNotFound) + // Do NOT strip @domain.com if SOGoEnableDomainBasedUID is enabled since + // the real login most likely is the email address. + if (r.location != NSNotFound && ![sd enableDomainBasedUID]) uid = [realUID substringToIndex: r.location-1]; else uid = [NSString stringWithString: realUID]; diff --git a/SoObjects/SOGo/SOGoUserManager.m b/SoObjects/SOGo/SOGoUserManager.m index cfc159c3c..6ee3b4d76 100644 --- a/SoObjects/SOGo/SOGoUserManager.m +++ b/SoObjects/SOGo/SOGoUserManager.m @@ -912,7 +912,7 @@ static Class NSNullK; { // Remove the "@" prefix used to identified groups in the ACL tables. aUID = [uid hasPrefix: @"@"] ? [uid substringFromIndex: 1] : uid; - if (domain) + if (domain && [aUID rangeOfString: @"@"].location == NSNotFound) cacheUid = [NSString stringWithFormat: @"%@@%@", aUID, domain]; else cacheUid = aUID; From 772c3b3115d596d28f2e86e0ee75328f583374f0 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 25 May 2015 10:43:42 -0400 Subject: [PATCH 091/109] (fix) formatting fixes --- Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc b/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc index 4a85f8dbc..acb0ca216 100644 --- a/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc +++ b/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc @@ -239,7 +239,7 @@ Red Hat Enterprise Linux v6 x86_64 If you are using Red Hat Enterprise Linux version 6 x86_64, packages for Samba 4, OpenChange and SOGo and the SOGo OpenChange backend are available from SOGo's web site. Please follow the instructions from -http://www.sogo.nu/english/downloads/backend_nightly.html. +http://www.sogo.nu/english/downloads/backend.html. In order to satisfy certain dependencies, you should also add the EPEL source corresponding to your distribution and architecture. More @@ -643,7 +643,9 @@ host = localhost port = 389 basedn = CN=Users,DC=example,DC=com set debug = true +---- +---- [autodiscover] [autodiscover:rpcproxy] From d07df554f3d43078dedd74cefe7a63049992c67f Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 25 May 2015 13:00:08 -0400 Subject: [PATCH 092/109] (fix) more fixes and clarifications on the mutli-domain settings --- Documentation/SOGoInstallationGuide.asciidoc | 12 ++++++++---- SoObjects/SOGo/SOGoUser.m | 5 +++-- SoObjects/SOGo/SOGoUserManager.m | 14 +------------- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/Documentation/SOGoInstallationGuide.asciidoc b/Documentation/SOGoInstallationGuide.asciidoc index 945b1fd80..8a3e0442a 100644 --- a/Documentation/SOGoInstallationGuide.asciidoc +++ b/Documentation/SOGoInstallationGuide.asciidoc @@ -2124,7 +2124,8 @@ Multi-domains Configuration ~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you want your installation to isolate two groups of users, you must -define a distinct authentication source for each _domain_. Following is +define a distinct authentication source for each _domain_. Your domain keys +must have the same value as your email domain you want to add. Following is the same configuration that now includes two domains (acme.com and coyote.com): @@ -2132,7 +2133,7 @@ coyote.com): { ... domains = { - acme = { + acme.com = { SOGoMailDomain = acme.com; SOGoDraftsFolderName = Drafts; SOGoUserSources = ( @@ -2153,7 +2154,7 @@ coyote.com): } ); }; - coyote = { + coyote.com = { SOGoMailDomain = coyote.com; SOGoIMAPServer = imap.coyote.com; SOGoUserSources = ( @@ -2184,7 +2185,7 @@ domains. [cols="3,47,50a"] |======================================================================= |S |SOGoEnableDomainBasedUID -|Parameter used to activate user identification by domain. Users will be +|Parameter used to enable user identification by domain. Users will be able (without being required) to login using the form `username@domain`, meaning that values of _UIDFieldName_ no longer have to be unique among all domains but only within the same domain. Internally, users will @@ -2706,6 +2707,9 @@ h|2.3.0 This will grow the "participant states" field of calendar quick tables to a larger size and add the the "c_description" column to calendar quick tables. +Moreover, if you are using a multi-domain configuration, make sure the keys for +your domains match the email domains you have defined. + h|2.2.8 |The configuration configuration parameters were renamed: diff --git a/SoObjects/SOGo/SOGoUser.m b/SoObjects/SOGo/SOGoUser.m index 12d028fd3..fa6459f59 100644 --- a/SoObjects/SOGo/SOGoUser.m +++ b/SoObjects/SOGo/SOGoUser.m @@ -165,8 +165,9 @@ // The domain is probably appended to the username; // make sure it is defined as a domain in the configuration. domain = [newLogin substringFromIndex: (r.location + r.length)]; - if (![[sd domainIds] containsObject: domain]) - domain = nil; + if ([[sd domainIds] containsObject: domain] && + ![sd enableDomainBasedUID]) + newLogin = [newLogin substringToIndex: r.location]; if (domain != nil && ![sd enableDomainBasedUID]) // Login domains are enabled (SOGoLoginDomains) but not diff --git a/SoObjects/SOGo/SOGoUserManager.m b/SoObjects/SOGo/SOGoUserManager.m index 6ee3b4d76..21cebce2d 100644 --- a/SoObjects/SOGo/SOGoUserManager.m +++ b/SoObjects/SOGo/SOGoUserManager.m @@ -514,21 +514,9 @@ static Class NSNullK; if (r.location != NSNotFound) { - NSArray *allDomains; - int i; - *_domain = [username substringFromIndex: r.location+1]; - allDomains = [[dd dictionaryForKey: @"domains"] allValues]; - - for (i = 0; i < [allDomains count]; i++) - { - if ([*_domain isEqualToString: [[allDomains objectAtIndex: i] objectForKey: @"SOGoMailDomain"]]) - break; - } - - // We haven't found one - if (i == [allDomains count]) + if (![[[SOGoSystemDefaults sharedSystemDefaults] domainIds] containsObject: *_domain]) *_domain = nil; } } From abcd48a0cdd0662df43e79738fec8456af8cb89d Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 25 May 2015 13:37:04 -0400 Subject: [PATCH 093/109] Added missing image used in the documentation --- Documentation/images/note.png | Bin 0 -> 6406 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Documentation/images/note.png diff --git a/Documentation/images/note.png b/Documentation/images/note.png new file mode 100644 index 0000000000000000000000000000000000000000..095238a80d87b8cf98a9930102ab21242dd81b97 GIT binary patch literal 6406 zcmV+h8TsakP)4Tx0C)joU|=$Eba8TJ5@2A+%_}Jia(7aQh>TKTzreu3z|A1cV9a2hm|R@o z7!csY00epYd8r^86@0tKzz7n#tP3&=RgNH!E4iSk1gPo{5F4eW7AG?>Fd6{a+2th# zKyk)7K(fg`*Y-X*7Wg z@4xTfeDh8B-h1!44?g(7eeuN??wfDEao>LXt^57=-`$^o{^|bt=N~u35JM!N;f5Q| zjW*h7Zq!jnb>ogZuA6Ye3EjjKPwb|eYAQGU@Wc03GPqvBz%Rf2(mnj}!|sts9&t}R z@q~NnrI*}~KmJ$>(fjr5=O&tHA~)lVGrGCwo;&%>GRrJ(u)%r-XM3`_ z4L7*kZoADr_uO-?lS}o8BaY}6S!5Bn)KW{i<(FSRnYE=nEfqAuo_eag|Ni?M4t%V!#;S?9>8GFG zO*73jZoKivbAt?0To?QK=bs%9%!@C+=w5i?1^4*lkGp4{c_v|a77`#xJ|{pRb!}J9!1K>P-;XrX zNOglnEM0QRC0>l}I;48Tg^xe}*l)4L79NowuHg$Wys#HdwaXvY`|PqKKeIhwGhqEc(n^ zSCsJLzx9(%Hd%@$;^y<>j4#?$!}@JA5M?A38xq3t0|pFe*zteiPw~I{C6-ts#l&HU z9oCD3zO>=D#XxMgC6`<>g`mXN5~H^?410M)&}i+o*G|z$9Ps|8n{Fy)WGyog??i~$ z7-Njl75>3eC{to1&}zpWcT6!+A|_s9oNf2gG6O?|Sfs_f-!?*hxq-tDJ1oUSJU8w7 zQCni*5l0-6LWITn_19nT%d{_TY`gEidy01WfZOrf6lUO6S6!7tfJM1%&8jqNb!kHz zZn$BJhSN?vZOf6DLJWNM)mObF2h}=fF)mZ1>QZ`_j@Dm){pFWgW|h6=YKF{p!%Rt1!(&_NS56?Z^rVQL+haFOlpK!tn4I7uF zTaR)BLIiCQz2v|=_Sj=hHLbn(-n-V9WKP$<^U&@WBj`A_=a^%Tgz$LdCH1`!y`OyY$r{tHx#k*w%rVD!Tyy$#N(OZ@YYR2n zODaoBr6);B$BN|10}UByBh4i4NDgJgHkqA@03xy|;Bu1O&!mm5x86Frog}9<*IcvK zF74xg?TcQY&_2BT?z@|kFq47z-FIJ#Xj^W%Wy8i~vxhrm-#Ic3XXq|G+lENKHJ z#sW{M&DCUvBXWQFc%r}Y#v47eEe1E=d~>bePD6M9mdFF<_MHy&ge53?^|NZxwjmXw7k29MNM<0E3FMIS-b(u8_F1TO~ zAw`Vx;)^d%)zu#`m;YB-VFkSuEkm)2_DfoPBO5i^P?udq%2+xvp|YTkfp`L}HiYM- z5m*Hy#t;Zo_+RNA4^5o_DO(^0qZSBKlL7Z=%HAZx@$49y1)Vpv>k7&>!?E)Y}g4} zpd`j1#X!~{>-K8oAt&EMH>hBE#?*S4s?3U&S^iY)NoEoE?6c24F}yRcg<=&umf-Ub zKm3q+PdENSj8Gq9=zw=C1}O&OzqEvIWQSme+-S+?g>*G0<*6;f9!&NF%ZtvbIjLIVH9+B}^X( znMhnQwws5{ZPvc9KB1Q^^CUJfuEoUaJoC)spMU=OtXsP3I?2$M4wzvf)EJ2RN;pGr zK>5gmM<0E(Ru8)+2BF!Y?P|I2zWc^*OQk5HLfgfhdx;r-_~D1qd$TSgR*8CR->l2* zF#7Jh@3L;`itCtPYEpqaOF;-V1`-+20aCKRAq!Ze)K(!78-w}hpFh=}ZJVe=EZ%3s zR?I@u(J@o7Ev;ru%n(;y5$ASHtYY?@d+xcJk|s8;PG94JRoYEH`Q&xo*BFSaOe?Zp zWQk90VWW*UO6sG);7t!<-F4TkwWsY;%2_Q@g@-omcI(iH$I(6e?6arZBw``^>%*=a z{*H-N9Pm#+{dB|odg@Q>B!Pb6Hia4k?Ka}|*I&OWzPNalF|oWDX0V2pw4R(Kk(oDY zLrJVtu?L82=bUp+;xN!QDKSTirssv)DjMJBn{Qs{h-gZPiYv$gMk(oY#u;a%dQ2FI z6V(zVW{{`uk{`%tW*_$vGmHUB2bvU5_-?!HmWabxJ;GMloV10Lx|vIiwQJjLw@ulY zmLSjDRZkys|W1>{7I8h_-tlN4GB1Bty^28K@L)E(xBW>yh>Xb0?iStJZa zcx%4-=1bv@h$h*p2m@kbl}G^Eb~k{{Mg{Vah<(zq|mU^uAV;Q!lvSf?6AB ziZPR<89wBdsNt{ppurYRT@S@7iW3SHid0Vm5>dxRY5mO!19c|xCn7H|@Z_p?*h-2a zh%jU5mo+G6=j6o&{~_)t6~#JWq83FqSH{FDrc9R8AuoRI)C-*=JZK6D18ve0YgG|Y z%@Dh6VhQjv!ttL>uKd8q7zdGg68*P3vo z09v0Lk$@tA8x2B{8c0XY0NagJd=5I$*-MTnzST0}y6djVH2R2I2(T+9FGPsymr5Q3dhNuJzOB4aZOMC6LS0ct(V}Or7`Y7f9Vv=dGZYc@JT$Ffoe0@ZqX-2yfQh zACABz$r;9HIrGDN+x;Exp-_dLFA6ofEJB_K{xPh$QlBZ3=MK(4GerUPJAAfu< zO*c;;TIazBAN1B$MPJO$Bab{XmD`HzP_<@kWo%ZZ8{ah|3HOT4$Q}N1CP0 zuA>e>|7xOeZa|fg$-pv2Xlww4L&*8JM8WgJ&fFpZvBD@n#48%u&C_Qr_NdIHgk}mP zU2zSuo3(ao-FC`Qgd)-bhtiZvp&(9F)uJ_ls;OL{H4HJq#JVNKyCIoQCJHr1s_nX=QfDY|LgkM*IHpeK<^Z0eyM5D_A zKGQOQV_g&vN~FyR}_l=4*SDHeQ-A&?f0pp{%LjF5-GW(erSt8U}XJ^g-NFHv5~g za;N~|C7TULqykl4iB>f3$4u2ji&(pC+d8Hqr5^kMKH=dH2?Ox~DzcQ=J>3W#W}tf# z72l%igD6D%%btHtO4fGp12bE2{aJ+pMz*rI(8frQJMOr)$Z1dK2(#uB2GTkM(7|MF zyle}Ll5WP)Km>+$Gxml1mYgicf+9rxntGT6!cx{K0Oa%)y z24bLUMZ{AT-UQomyWbJ>@`}_N&ft!Vspv_E9C>23aHRomG3)aziZ3RMwnd3Mt`)#W zw(W!wm>L67yKTi*pS)I(Z08<=so}cD?;_4^{IHr}tTZ_K=%d>~E75YbElLz3&I~9D zHUfht972tOBs1Am2Ag{r-qdZsS=VCb0wxg~XBq)seM=-}9+Cfc!D{x(NcM3Q0kX}l z2^4b<)EG#^xUaM`_8Js%EEhqns=9b#Lg%&~au7=&gg{mdQpG?lh&PEsKa{ zUe9OmjqPDfF%WNuy`hNh)9#?lydP~cOvS*yWpANAlsM9D9YiQ;hh;$cN(M_)QWJ47 zj&jVVb5)iT3GaS+iCC|2^a? zhqPK3lJ$Itb$ioq!a(ykICw#*(RAjNRi_zES+DJ}lbQt=qjyS#Y6TmPp`lj7FxpnP zm83kd&j44K)$qz&9QaNg3r=j)q^e{rI7tZ0zAbBpkTE8AB_HfV4ni0R z)l(om@xPfR5EY@I$(o@Iq$Iad0Ox};j&k+YS8slk)M&^+THwT9+i;P$isZsz zV5Q`UXx)1Vt$w=nO{5#zj%;#i*yzCD`6$4~9_vhChf~pf zq}&X|IZWESWnvj|vwTDCd$q{8v$;3WmFRm>$jv|+CXd8!*uG~u==f_FD<267Xr7uMNLa#7Je@Y?x*u_PX8PvM1mgt&@qAFy;Q%s_6oM_zycSy#Q~ zAaOhRp7?GL?16UV@3iBlY>9yk+-~{+5mE?>o|@Ye1nkK^Lz|i`fuc%Fh=0orq#>Iz z3==s3C(oXP5Q)D2n@nvEMu0~8AxuYFN4wA#13^sp#3^E^#pGHJg#S~3wJl7vB4N0! zqf**pASlAb@XeEGr(p*1f03bV4h@flMvJ$*i`u12+YD3$?8};THp19W?73GQx~U`_ z7w+R=+jp}!fEOJ@X$+)e414QxgOQx9RAf(I(E)T@eYPZU=npxj`XEzs>JxdZWkab9 z1UV8{ZH70<6Qukvh*Zo0yO&)VNHSHcn_HSOymSWAA?Acln$>}@#}98#Uj)t;&|@fd zyp&|1>7hJTjJpyBf+%V0p>o53(7@O?pr`FsF{n z7HyRf5W8e;YQD}syiuKgC3;5~s80`j4)r|~I%q99Y718rc{tq$tYN&yAbcN%;*LWf zGpg*vee%$uqYMNg)NI}`ZMSqQAt;%pytbSJ3}SEi%rmI6>X14@AX`r(w0QEJS;%bc zzpttvu}BCgCo^kPP2Eycqd0+C28nlcV^xb`$LHC zM9FZXh&Wl(oOnl^?3r-laNvQC-I81r#mhr?`J9$UFlMHAln=G5QO9gR4 zIC*P|lS6@$k~X^ux{868FmiCKlLHK#>)IKiQ!p4q_*YMKU{?tz`hahUD}ICt2rC400#OQzpMfnJT0C%G>A_42)4h zY|CT~lT&*gAMrINB2pBQL_8ukSx;dQ;#5-hoR}(!m}RFcTe$d$li9Hoxwpdq04e9r UIO~Se!2kdN07*qoM6N<$f;a+DQ~&?~ literal 0 HcmV?d00001 From b43c3f6d98d06529972d0bcbcff8e7b1e2d043c1 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Mon, 25 May 2015 13:52:25 -0400 Subject: [PATCH 094/109] Fix asciidoc of Installation guide --- Documentation/SOGoInstallationGuide.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/SOGoInstallationGuide.asciidoc b/Documentation/SOGoInstallationGuide.asciidoc index 8a3e0442a..3302fb043 100644 --- a/Documentation/SOGoInstallationGuide.asciidoc +++ b/Documentation/SOGoInstallationGuide.asciidoc @@ -844,7 +844,7 @@ source: [cols="^3,>47,50a"] |======================================================================= -.33+|D <|SOGoUserSources +.34+|D <|SOGoUserSources |Parameter used to set the LDAP and/or SQL sources used for authentication and global address books. Multiple sources can be specified as an array of dictionaries. A dictionary that defines an LDAP From ce3d55d2cc9ddafe2e76c0200c3a1a9dd74266ef Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 26 May 2015 11:08:30 -0400 Subject: [PATCH 095/109] (fix) do not rewrite the username when using the session from the db --- SoObjects/SOGo/SOGoSession.m | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/SoObjects/SOGo/SOGoSession.m b/SoObjects/SOGo/SOGoSession.m index 235ef371e..936877336 100644 --- a/SoObjects/SOGo/SOGoSession.m +++ b/SoObjects/SOGo/SOGoSession.m @@ -261,9 +261,7 @@ // The domain is probably appended to the username; // make sure it is defined as a domain in the configuration. *theDomain = [*theLogin substringFromIndex: (r.location + r.length)]; - if ([[sd domainIds] containsObject: *theDomain]) - *theLogin = [*theLogin substringToIndex: r.location]; - else + if (![[sd domainIds] containsObject: *theDomain]) *theDomain = nil; } } From 84dfba797809d0181fdbf35d78ec7b1caec7c040 Mon Sep 17 00:00:00 2001 From: Gilles Gagniard Date: Tue, 26 May 2015 22:50:28 +0200 Subject: [PATCH 096/109] honor PREFORK setting in /etc/sysconfig/sogo when starting sogod with systemd --- Scripts/sogo-systemd-redhat | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Scripts/sogo-systemd-redhat b/Scripts/sogo-systemd-redhat index 7fdd56b96..3dacbc40b 100644 --- a/Scripts/sogo-systemd-redhat +++ b/Scripts/sogo-systemd-redhat @@ -3,8 +3,10 @@ Description=SOGo is a groupware server After=network.target [Service] +Environment="PREFORK=3" +EnvironmentFile=-/etc/sysconfig/sogo Type=forking -ExecStart=/usr/sbin/sogod -WOWorkersCount 3 -WOPidFile /var/run/sogo/sogo.pid -WOLogFile /var/log/sogo/sogo.log +ExecStart=/usr/sbin/sogod -WOWorkersCount ${PREFORK} -WOPidFile /var/run/sogo/sogo.pid -WOLogFile /var/log/sogo/sogo.log PIDFile=/var/run/sogo/sogo.pid User=sogo From bea9b2690741c34817b1b103bee868f4e6f3eabc Mon Sep 17 00:00:00 2001 From: Gilles Gagniard Date: Tue, 26 May 2015 22:55:14 +0200 Subject: [PATCH 097/109] systemd needs to reload the newly installed sogod.service, otherwise enable/start will fail on first sogo installation --- packaging/rhel/sogo.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/packaging/rhel/sogo.spec b/packaging/rhel/sogo.spec index 988f7c693..0b73d702b 100644 --- a/packaging/rhel/sogo.spec +++ b/packaging/rhel/sogo.spec @@ -390,6 +390,7 @@ fi # update timestamp on imgs,css,js to let apache know the files changed find %{_libdir}/GNUstep/SOGo/WebServerResources -exec touch {} \; %if 0%{?_with_systemd} + systemctl daemon-reload systemctl enable sogod systemctl start sogod > /dev/null 2>&1 %else From db4cd9da6eb4623006a1d8cef10d6cb99ed00009 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 27 May 2015 11:07:38 -0400 Subject: [PATCH 098/109] (fix) doc update regarding samba 4.1.18 --- Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc b/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc index acb0ca216..f44e50aec 100644 --- a/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc +++ b/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc @@ -409,6 +409,7 @@ Add the following parameters to the `[global]` section of the ---- ### Configuration required by OpenChange server ### +dsdb:schema update allowed = true dcerpc endpoint servers = epmapper, mapiproxy, dnsserver dcerpc_mapiproxy:server = true dcerpc_mapiproxy:interfaces = exchange_emsmdb, exchange_nsp, exchange_ds_rfr @@ -426,6 +427,7 @@ Your Samba 4 configuration file should look like this: netbios name = sogo passdb backend = samba4 ### Configuration required by OpenChange server ### + dsdb:schema update allowed = true dcerpc endpoint servers = +epmapper, +mapiproxy dcerpc_mapiproxy:server = true dcerpc_mapiproxy:interfaces = exchange_emsmdb, exchange_nsp, exchange_ds_rfr From 2fd0beeaca85e615d8af693f8bc3eb0b3828bd40 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 27 May 2015 15:52:44 -0400 Subject: [PATCH 099/109] Added precision on supported architectures --- Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc b/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc index f44e50aec..c1b1bcb33 100644 --- a/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc +++ b/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc @@ -266,7 +266,8 @@ from this guide. [NOTE] Samba4/OpenChange are not available for now on CentOS 5 i386/x86_64, -CentOS 6 i386 and CentOS 7. +CentOS 6 i386 and CentOS 7. On Debian-based systems, packages are +available only on the x86_64 platform. Debian 7 (Wheezy) and Ubuntu 12.04 (Precise Pangolin) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From bd12a817a68facbfa351d8b887aff8eb70a84f19 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Thu, 28 May 2015 08:30:30 -0400 Subject: [PATCH 100/109] Update languages in Installation Guide --- Documentation/SOGoInstallationGuide.asciidoc | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Documentation/SOGoInstallationGuide.asciidoc b/Documentation/SOGoInstallationGuide.asciidoc index 3302fb043..46980463b 100644 --- a/Documentation/SOGoInstallationGuide.asciidoc +++ b/Documentation/SOGoInstallationGuide.asciidoc @@ -567,17 +567,29 @@ usernames like this: `SOGoSuperUsernames = ([, , ...]);` for SOGo. Possible values are: [options="compact"] +* `Arabic` +* `Basque` * `BrazilianPortuguese` +* `Catalan` * `Czech` +* `Danish` * `Dutch` * `English` +* `Finnish` * `French` * `German` * `Hungarian` +* `Icelandic` * `Italian` +* `NorwegianBokmal` +* `NorwegianNynorsk` +* `Polish` * `Russian` -* `Spanish` +* `Slovak` +* `SpanishSpain` +* `SpanishArgentina` * `Swedish` +* `Ukrainian` * `Welsh` |D |SOGoNotifyOnPersonalModifications @@ -650,7 +662,7 @@ of 1 day by default. |Parameter used to configure which languages are available from SOGo's Web interface. Available languages are specified as an array of string. -The default value is: `( "Czech", "Welsh", "English", "Spanish", "French", "German", "Italian", "Hungarian", "Dutch", "BrazilianPortuguese", "Polish", "Russian", Ukrainian", "Swedish" )` +The default value is: `( "Arabic", "Basque", "Catalan", "Czech", "Dutch", "Danish", "Welsh", "English", "SpanishSpain", "SpanishArgentina", "Finnish", "French", "German", "Icelandic", "Italian", "Hungarian", "BrazilianPortuguese", "NorwegianBokmal", "NorwegianNynorsk", "Polish", "Russian", "Slovak", "Ukrainian", "Swedish" )` |D |SOGoHideSystemEMail |Parameter used to control if SOGo should hide or not the system email From c95568373fd4711b4795a418ad4804835fba70a7 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 28 May 2015 11:29:44 -0400 Subject: [PATCH 101/109] Added control file for i386/i686 distro to not build OC --- .../debian-multiarch/control-no-openchange | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 packaging/debian-multiarch/control-no-openchange diff --git a/packaging/debian-multiarch/control-no-openchange b/packaging/debian-multiarch/control-no-openchange new file mode 100644 index 000000000..02dc887f3 --- /dev/null +++ b/packaging/debian-multiarch/control-no-openchange @@ -0,0 +1,59 @@ +Source: sogo +Priority: optional +Maintainer: Inverse Support +Build-Depends: debhelper (>= 8.0.0), gobjc | objc-compiler, libgnustep-base-dev, libsope-appserver4.9-dev, libsope-core4.9-dev, libsope-gdl1-4.9-dev, libsope-ldap4.9-dev, libsope-mime4.9-dev, libsope-xml4.9-dev, libmemcached-dev, libxml2-dev, libsbjson-dev, libssl-dev, libcurl4-openssl-dev | libcurl4-gnutls-dev, libwbxml2-dev (>= 0.11.2), liblasso3-dev (>= 2.3.5) +Section: web +Standards-Version: 3.9.2 + +Package: sogo +Pre-Depends: ${misc:Pre-Depends} +Multi-Arch: same +Section: web +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, tmpreaper, sope4.9-libxmlsaxdriver, sope4.9-db-connector, gnustep-make, libcurl3, zip, liblasso3 (>= 2.3.5) +Recommends: memcached +Suggests: nginx +Description: a modern and scalable groupware + SOGo is a groupware server built around OpenGroupware.org (OGo) and + the SOPE application server with focus on scalability. + The Inverse edition of this project has many feature enhancements: + * CalDAV and GroupDAV compliance + * full handling of vCard as well as vCalendar/iCalendar formats + * support for folder sharing and ACLs + . + The Web interface has been rewritten in an AJAX fashion to provide a faster + UI for the users, consistency in look and feel with the Mozilla applications, + and to reduce the load of the transactions on the server. + +Package: sogo-dev +Section: devel +Architecture: any +Depends: sogo (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} +Replaces: sogo (<< ${binary:Version}) +Description: a modern and scalable groupware - development files + SOGo is a groupware server built around OpenGroupware.org (OGo) and + the SOPE application server with focus on scalability. + . + This package contains the development files for developing SOGo modules. + +Package: sogo-activesync +Section: web +Priority: extra +Architecture: any +Depends: sogo (= ${binary:Version}), libwbxml2-0 (>= 0.11.2), ${shlibs:Depends}, ${misc:Depends} +Description: a modern and scalable groupware - ActiveSync module + SOGo is a groupware server built around OpenGroupware.org (OGo) and + the SOPE application server with focus on scalability. + . + This package provides Microsoft EAS support for SOGo. + +Package: sogo-dbg +Section: debug +Priority: extra +Architecture: any +Depends: sogo (= ${binary:Version}), ${misc:Depends} +Description: a modern and scalable groupware - debugging symbols + SOGo is a groupware server built around OpenGroupware.org (OGo) and + the SOPE application server with focus on scalability. + . + This package contains the debugging symbols for SOGo. From 6cf2fd1e52373fbf7c783795c29e08b8800d0615 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 28 May 2015 13:41:19 -0400 Subject: [PATCH 102/109] Adjusted the doc for the procedure on Wheezy/Precise --- ...GoNativeOutlookConfigurationGuide.asciidoc | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc b/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc index c1b1bcb33..ac4679a07 100644 --- a/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc +++ b/Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc @@ -266,8 +266,8 @@ from this guide. [NOTE] Samba4/OpenChange are not available for now on CentOS 5 i386/x86_64, -CentOS 6 i386 and CentOS 7. On Debian-based systems, packages are -available only on the x86_64 platform. +and CentOS 7. On Debian-based systems, packages are available only on +the x86_64 platform. Debian 7 (Wheezy) and Ubuntu 12.04 (Precise Pangolin) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -277,22 +277,19 @@ available from SOGo's web site. Please follow the instructions from http://www.sogo.nu/english/downloads/backend.html to setup your apt sources. -On Debian7, for Samba 4, you need to use the _wheezy-backports_ repository. -To do so, create `/etc/apt/sources.list.d/backports.list`: +On Debian7, for some Samba 4 dependencies, you need to use the +_wheezy-backports_ repository. To do so, create +`/etc/apt/sources.list.d/backports.list` with the following +content: deb http://http.debian.net/debian wheezy-backports main -On Ubuntu 12.04, you will also have to add the Wheezy sources: - - deb http://ftp.us.debian.org/debian wheezy main - deb http://security.debian.org/ wheezy/updates main - Then install Samba 4 on top of an existing SOGo installation: ---- apt-get update -apt-get -t wheezy-backports install samba samba-dev +apt-get install samba samba-dev ---- Once completed, install the packages related to OpenChange and the SOGo @@ -324,8 +321,6 @@ https://wiki.samba.org/index.php/Samba4/InitScript Debian 8 (Jessie) and Ubuntu 14.04 (Trusty Tahr) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -For Debian 8 and Ubuntu 14.04, you must not use the Debian Wheezy backports. - Please follow the instructions from http://www.sogo.nu/english/downloads/backend.html to setup your apt sources. From 7da6b0b822c302e3ec1e661fd05fc7c60dfabf82 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Fri, 29 May 2015 14:23:01 -0400 Subject: [PATCH 103/109] (fix) only dump broken eas data to file if SOGoEASDebugEnabled is enabled --- ActiveSync/NSData+ActiveSync.m | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/ActiveSync/NSData+ActiveSync.m b/ActiveSync/NSData+ActiveSync.m index 7114403cc..dd925c715 100644 --- a/ActiveSync/NSData+ActiveSync.m +++ b/ActiveSync/NSData+ActiveSync.m @@ -32,6 +32,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import #import +#import + #import #import @@ -45,11 +47,18 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (void) _dumpToFile { - NSString *path; + BOOL debugOn; - path = [NSString stringWithFormat: @"/tmp/%@.data", [[NSProcessInfo processInfo] globallyUniqueString]]; - [self writeToFile: path atomically: YES]; - [self errorWithFormat: @"Original data written to: %@", path]; + debugOn = [[SOGoSystemDefaults sharedSystemDefaults] easDebugEnabled]; + + if (debugOn) + { + NSString *path; + + path = [NSString stringWithFormat: @"/tmp/%@.data", [[NSProcessInfo processInfo] globallyUniqueString]]; + [self writeToFile: path atomically: YES]; + [self errorWithFormat: @"Original data written to: %@", path]; + } } // From 289100beff160072d12afd74e8aaa4d116a0be03 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Mon, 1 Jun 2015 08:36:02 -0400 Subject: [PATCH 104/109] Updated files for the 2.3 release --- ChangeLog | 2695 +++++++++++++++++ Documentation/docinfo.xml | 6 +- .../includes/global-attributes.asciidoc | 2 +- NEWS | 2 +- Version | 4 +- 5 files changed, 2702 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8c90ec341..305a9ad4f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,1380 @@ +commit 7da6b0b822c302e3ec1e661fd05fc7c60dfabf82 +Author: Ludovic Marcotte +Date: Fri May 29 14:23:01 2015 -0400 + + (fix) only dump broken eas data to file if SOGoEASDebugEnabled is enabled + +M ActiveSync/NSData+ActiveSync.m + +commit 6cf2fd1e52373fbf7c783795c29e08b8800d0615 +Author: Ludovic Marcotte +Date: Thu May 28 13:41:19 2015 -0400 + + Adjusted the doc for the procedure on Wheezy/Precise + +M Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc + +commit c95568373fd4711b4795a418ad4804835fba70a7 +Author: Ludovic Marcotte +Date: Thu May 28 11:29:44 2015 -0400 + + Added control file for i386/i686 distro to not build OC + +A packaging/debian-multiarch/control-no-openchange + +commit bd12a817a68facbfa351d8b887aff8eb70a84f19 +Author: Francis Lachapelle +Date: Thu May 28 08:30:30 2015 -0400 + + Update languages in Installation Guide + +M Documentation/SOGoInstallationGuide.asciidoc + +commit 2fd0beeaca85e615d8af693f8bc3eb0b3828bd40 +Author: Ludovic Marcotte +Date: Wed May 27 15:52:44 2015 -0400 + + Added precision on supported architectures + +M Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc + +commit db4cd9da6eb4623006a1d8cef10d6cb99ed00009 +Author: Ludovic Marcotte +Date: Wed May 27 11:07:38 2015 -0400 + + (fix) doc update regarding samba 4.1.18 + +M Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc + +commit bea9b2690741c34817b1b103bee868f4e6f3eabc +Author: Gilles Gagniard +Date: Tue May 26 22:55:14 2015 +0200 + + systemd needs to reload the newly installed sogod.service, otherwise enable/start will fail on first sogo installation + +M packaging/rhel/sogo.spec + +commit 84dfba797809d0181fdbf35d78ec7b1caec7c040 +Author: Gilles Gagniard +Date: Tue May 26 22:50:28 2015 +0200 + + honor PREFORK setting in /etc/sysconfig/sogo when starting sogod with systemd + +M Scripts/sogo-systemd-redhat + +commit ce3d55d2cc9ddafe2e76c0200c3a1a9dd74266ef +Author: Ludovic Marcotte +Date: Tue May 26 11:08:30 2015 -0400 + + (fix) do not rewrite the username when using the session from the db + +M SoObjects/SOGo/SOGoSession.m + +commit b43c3f6d98d06529972d0bcbcff8e7b1e2d043c1 +Author: Francis Lachapelle +Date: Mon May 25 13:52:25 2015 -0400 + + Fix asciidoc of Installation guide + +M Documentation/SOGoInstallationGuide.asciidoc + +commit abcd48a0cdd0662df43e79738fec8456af8cb89d +Author: Ludovic Marcotte +Date: Mon May 25 13:37:04 2015 -0400 + + Added missing image used in the documentation + +A Documentation/images/note.png + +commit d07df554f3d43078dedd74cefe7a63049992c67f +Author: Ludovic Marcotte +Date: Mon May 25 13:00:08 2015 -0400 + + (fix) more fixes and clarifications on the mutli-domain settings + +M Documentation/SOGoInstallationGuide.asciidoc +M SoObjects/SOGo/SOGoUser.m +M SoObjects/SOGo/SOGoUserManager.m + +commit 772c3b3115d596d28f2e86e0ee75328f583374f0 +Author: Ludovic Marcotte +Date: Mon May 25 10:43:42 2015 -0400 + + (fix) formatting fixes + +M Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc + +commit ed42d1e26b047e9d074a46a1a60c13a65e2d39de +Author: Ludovic Marcotte +Date: Mon May 25 09:19:04 2015 -0400 + + (fix) more multi-domain fixes and cleanups + +M SoObjects/SOGo/SOGoUser.m +M SoObjects/SOGo/SOGoUserManager.m + +commit e0c1d5e47ba9104030946abe99f3778436e4ae55 +Author: Ludovic Marcotte +Date: Mon May 25 08:27:46 2015 -0400 + + Improved the doc for the 2.3 release + +M Documentation/SOGoInstallationGuide.asciidoc + +commit 55d91973bda76775518b0070cf0d9ac019bcc058 +Author: Ludovic Marcotte +Date: Fri May 22 15:23:48 2015 -0400 + + Improved the doc for the release + +M Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc + +commit 4f303f8aa26046ecae916c457839d84622b260bb +Author: Ludovic Marcotte +Date: Fri May 22 14:03:49 2015 -0400 + + Fixed mess regarding uid/realUID + +M SoObjects/SOGo/SOGoUser.m + +commit c8995087d8da99a5ece2b3d0742dcac51981a252 +Author: Ludovic Marcotte +Date: Fri May 22 13:50:06 2015 -0400 + + Small improvements to the docs + +M Documentation/SOGoInstallationGuide.asciidoc + +commit 2ae5f342daf05b8fa865458ed51a616dda163ab6 +Author: Ludovic Marcotte +Date: Fri May 22 13:47:48 2015 -0400 + + Fix a crasher + +M SoObjects/SOGo/SOGoUserManager.m + +commit 1e0473f1e51bc1ae5e6b1a7e75a04f2849f6494b +Author: Francis Lachapelle +Date: Fri May 22 07:58:26 2015 -0400 + + Localization + +M UI/Common/French.lproj/Localizable.strings + +commit 7990e23aaa2dfc4ade88309f8a53cfe9e23ccb80 +Author: Jesús García Sáez +Date: Wed May 20 15:24:00 2015 +0200 + + Fix warning distinct Objective-C type + + failedCount is a NSDictionary *, not NSMutableDictionary * + +M SoObjects/SOGo/SOGoUserManager.m + +commit 04ce8d10665ca734fefcbb8cd5c217add4ab614b +Author: Jesús García Sáez +Date: Wed May 20 12:31:25 2015 +0200 + + Avoid cache entries with uid@domain@domain prefix + + Depend of the current workflow this paths are reached with + username as uid and sometimes as uid@domain. So in multidomain + environments only append @domain when needed. + + Conflicts: + SoObjects/SOGo/SOGoUserManager.m + +M SoObjects/SOGo/SOGoUserManager.m + +commit 37461e650d1dca5106daea7e73bf0428211fc803 +Author: Jesús García Sáez +Date: Wed May 20 12:30:05 2015 +0200 + + Fix conflicts with externalLoginWithEmail + DomainBasedUid + + On multidomain environment (SOGoEnableDomainBasedUID) with email for imap + authentication (SOGoForceExternalLoginWithEmail) we need to use uid@domain + instead of just uid in method getEmailForUID + +M SoObjects/SOGo/SOGoUserManager.m + +commit 9922ec56d9d19eed61874a80b33975c3377043e8 +Author: Jesús García Sáez +Date: Wed May 20 11:44:06 2015 +0200 + + Avoid uid+attributes entries on shared cache + + In multidomain environments this will produce that info@domain1.com + can read info@domain2.com emails when info@domain2.com log in after + info@domain1.com is already logged in. + + If multidomain is not enabled, this action is not needed because + uid+attributes has been already saved on shared cache + +M SoObjects/SOGo/SOGoUserManager.m + +commit 789334924429a4750d5f2c7ad4cfdb84c42e0717 +Author: Francis Lachapelle +Date: Thu May 21 21:35:13 2015 -0400 + + TimePicker: allow entries from numpad + + Fixes #1516 + +M UI/WebServerResources/SOGoTimePicker.js + +commit e40be922048b284597fb6711da60ad89e155acee +Author: Ludovic Marcotte +Date: Thu May 21 08:48:45 2015 -0400 + + Updated NEWS file regarding PR#84 + +M NEWS + +commit 79bfc7aedf0b03acf40f78fbc714c12d11f37254 +Author: Ludovic Marcotte +Date: Wed May 20 14:27:57 2015 -0400 + + (fix) more rhel7 fix + +M packaging/rhel/sogo.spec + +commit 54ab0bf822bec60bec48a1e79ba0553e69f1dd79 +Author: Ludovic Marcotte +Date: Wed May 20 14:24:02 2015 -0400 + + (fix) rhel7 packaging fix + +M packaging/rhel/sogo.spec + +commit 7e8c79c64697ff012d7fb4419e07e8ad0e297498 +Author: Ludovic Marcotte +Date: Wed May 20 13:51:16 2015 -0400 + + (fix) use the contact-info, not the user/group bit identifier + +M UI/WebServerResources/AdministrationUI.js + +commit 416711ea43af4fe1c7095111ef6beef5fb577432 +Author: Ludovic Marcotte +Date: Tue May 19 13:48:59 2015 -0400 + + (fix) avoid appending the domain unconditionally when SOGoEnableDomainBasedUID is set to YES + +M NEWS +M SoObjects/SOGo/SOGoUserFolder.m +M SoObjects/SOGo/SOGoUserManager.m +M UI/MainUI/SOGoRootPage.m + +commit 5a8f310bc80b2e2daed248d7e7fb4a400a6ee48a +Author: Javier Amor García +Date: Mon May 18 14:43:11 2015 +0200 + + Show 'complexity password' error instead of a generic error. + + There is not discrimination between complexity and length errors because backend does not + return different error codes for each case. + +M SoObjects/SOGo/LDAPSource.m + +commit ae72c2f1d5c32a009207b09bc748cdccd257452e +Author: Ludovic Marcotte +Date: Tue May 19 06:35:19 2015 -0400 + + Renamed scripts + +D Scripts/sql-update-2.1.17_to_2.1.18-mysql.sh +D Scripts/sql-update-2.1.17_to_2.1.18.sh +A Scripts/sql-update-2.1.17_to_2.3.0-mysql.sh +A Scripts/sql-update-2.1.17_to_2.3.0.sh + +commit e2ef0103c4c05c38354b620a09fc83c8c299da0d +Author: Enrique J. Hernández Blasco +Date: Tue May 19 00:01:47 2015 +0200 + + oc-calendar: Fix regression on AppointmentTimeZoneDefinitionStartDisplay + + Introduced by ebe2a466e7 in PR #132 when the event is not + all day neither recurrent one. + + The fix is just to initialise to nil when it is a normal event + and it returns NOT_FOUND for this property. + +M OpenChange/MAPIStoreAppointmentWrapper.m + +commit 143ee59f5b5401c28374f882ad73d7763c3894d7 +Author: Ludovic Marcotte +Date: Fri May 15 09:38:58 2015 -0400 + + Improved debian packaging regarding apache 2.2 -> 2.4 + +M packaging/debian-multiarch/sogo.postinst +M packaging/debian-multiarch/sogo.prerm + +commit 037a3a136a83ecf4bf5c4d01ca3d396cee6d31ad +Author: Ludovic Marcotte +Date: Thu May 14 15:58:53 2015 -0400 + + (fix) message bodies not shown on some EAS devices (#3173) + +M ActiveSync/SOGoMailObject+ActiveSync.m +M NEWS + +commit c98a00051597a9c1bee39bdb9f9e0514c4089b23 +Author: Ludovic Marcotte +Date: Thu May 14 15:49:53 2015 -0400 + + (feat) many improvements to EAS SmartReply/SmartForward commands + +M ActiveSync/SOGoActiveSyncDispatcher.m +M NEWS + +commit cc1e9f2fff0460cd7cff5acdf6cccc705c14c666 +Author: Ludovic Marcotte +Date: Thu May 14 15:40:03 2015 -0400 + + (fix) additional fix for #3152 + +M ActiveSync/SOGoMailObject+ActiveSync.m + +commit 9dc0a08bba30c80412652be02b3c5b1d79042769 +Author: Ludovic Marcotte +Date: Thu May 14 15:28:23 2015 -0400 + + (fix) removed unused import + +M ActiveSync/SOGoActiveSyncDispatcher.m + +commit 5412599832d812e4db181d2398dfd06dbd0a16de +Author: Ludovic Marcotte +Date: Thu May 14 15:26:18 2015 -0400 + + (feat) now possible to log EAS commands using the SOGoEASDebugEnabled system defaults + +M ActiveSync/SOGoActiveSyncDispatcher.m +M Documentation/SOGoInstallationGuide.asciidoc +M NEWS +M SoObjects/SOGo/SOGoSystemDefaults.h +M SoObjects/SOGo/SOGoSystemDefaults.m + +commit fbf5c4f6c2dcad6fa8afb24e0faa7f1704d074fb +Author: Ludovic Marcotte +Date: Wed May 13 19:09:58 2015 -0400 + + (fix) always include SrcMsgId in the MoveItems's response + +M ActiveSync/SOGoActiveSyncDispatcher.m + +commit d97813451eae96da5a0441d6789e56271440b764 +Author: Ludovic Marcotte +Date: Wed May 13 16:09:41 2015 -0400 + + (fix) moved stuff to multiarch + +M packaging/debian-multiarch/rules +M packaging/debian-multiarch/sogo.install +M packaging/debian-multiarch/sogo.postinst +M packaging/debian-multiarch/sogo.prerm +M packaging/debian/rules +M packaging/debian/sogo.install +M packaging/debian/sogo.postinst +M packaging/debian/sogo.prerm + +commit 4de814c3b22d93cd51e368f7f4c3d93edb871d16 +Author: Ludovic Marcotte +Date: Wed May 13 15:48:47 2015 -0400 + + (fix) first pass (and hopefully only) at Apache 2.2->2.4 mess + +M packaging/debian/rules +M packaging/debian/sogo.install +M packaging/debian/sogo.postinst +M packaging/debian/sogo.prerm + +commit fb121974ec38564f194cb2f710d6adaf1758bc50 +Author: Ludovic Marcotte +Date: Wed May 13 14:52:10 2015 -0400 + + refactored previous commit + +M UI/Scheduler/UIxCalListingActions.m + +commit 39aa9a97db9785a1857436a6cd17ffd8203d7935 +Author: Ludovic Marcotte +Date: Wed May 13 14:36:35 2015 -0400 + + (fix) make sure we return event blocks sorted by start date (#2939) + +M UI/Scheduler/UIxCalListingActions.m + +commit dc48e05dd37ae05a5d2c16c8b0da8da76e07582e +Author: Ludovic Marcotte +Date: Wed May 13 13:12:15 2015 -0400 + + (feat) print event/task description in list view (#2881) + +M NEWS +M SoObjects/Appointments/SOGoAppointmentFolder.m +M SoObjects/Appointments/iCalEvent+SOGo.m +M SoObjects/Appointments/iCalToDo+SOGo.m +M UI/Scheduler/UIxCalListingActions.m +M UI/WebServerResources/UIxCalViewPrint.js + +commit 0ea0a776664c02716f693171a0e787266bdd1c68 +Author: Ludovic Marcotte +Date: Wed May 13 10:55:17 2015 -0400 + + fixed typo in previous commit + +M SOPE/GDLContentStore/appointment.ocs + +commit f8b7ebdaf8215406208b756e94d18c7b420cd9f6 +Author: Ludovic Marcotte +Date: Wed May 13 10:51:12 2015 -0400 + + Adjust OCS files regarding previous commit + +M SOPE/GDLContentStore/appointment-oracle.ocs +M SOPE/GDLContentStore/appointment.ocs + +commit 5cf500d56013ab76d61c490a2da3bc771adb6a20 +Author: Ludovic Marcotte +Date: Wed May 13 10:45:19 2015 -0400 + + (feat) added c_description to calendar quick tables + +M Scripts/sql-update-2.1.17_to_2.1.18-mysql.sh +M Scripts/sql-update-2.1.17_to_2.1.18.sh + +commit c1ce32ac943f559b5ada73c3b88d924a1a415aa2 +Author: Ludovic Marcotte +Date: Tue May 12 15:48:42 2015 -0400 + + (fix) now handle very large amount of participants correctly (#3175) + +M Documentation/SOGoInstallationGuide.asciidoc +M NEWS +M SOPE/GDLContentStore/appointment-oracle.ocs +M SOPE/GDLContentStore/appointment.ocs +A Scripts/sql-update-2.1.17_to_2.1.18-mysql.sh +A Scripts/sql-update-2.1.17_to_2.1.18.sh + +commit e71a1c9974cc6f0177b50065a173aa37963cc159 +Author: Ludovic Marcotte +Date: Tue May 12 10:44:51 2015 -0400 + + (fix) addition fix for #3152 + +M ActiveSync/SOGoActiveSyncDispatcher.m +M ActiveSync/SOGoMailObject+ActiveSync.m + +commit 96b2e0e1f5465627925faa60188c232d67f4e4ae +Author: Ludovic Marcotte +Date: Tue May 12 10:37:26 2015 -0400 + + (fix) use dateTime instead of compact format for meeting requests + +M ActiveSync/SOGoMailObject+ActiveSync.m + +commit a145fdbb5366703c8eb564430a3d1ec8953e3275 +Author: Ludovic Marcotte +Date: Tue May 12 10:33:05 2015 -0400 + + (fix) ensure calendar objects have a (fake) filename + +M SoObjects/Mailer/SOGoMailObject.m + +commit 619e9fe7ddc2696ebd6ef58eee73f7884d2a2c47 +Author: Ludovic Marcotte +Date: Tue May 12 10:28:47 2015 -0400 + + (fix) now correctly handle multiple email addresses in the GAL over EAS + +M ActiveSync/SOGoActiveSyncDispatcher.m +M NEWS + +commit 64da65d827a282de96353eeed3179c6e2886a228 +Author: Ludovic Marcotte +Date: Tue May 12 10:19:20 2015 -0400 + + (fix) fallback to Latin1 when trying to parse versit data + +M SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m + +commit 364a07bd05834c356ba4c3391b0a20ca52d7073e +Author: Ludovic Marcotte +Date: Tue May 12 10:15:07 2015 -0400 + + set the preferred body type for meeting response + +M ActiveSync/SOGoMailObject+ActiveSync.m + +commit 2c78d60e4abeb972ecc86e3d3ecd43ca376a5c84 +Author: Ludovic Marcotte +Date: Tue May 12 10:12:57 2015 -0400 + + (fix) now correct handle external invitations using EAS + +M ActiveSync/SOGoActiveSyncDispatcher.m +M NEWS + +commit ee8caa5a990ced533059020ad82c21ebb66a541f +Author: Ludovic Marcotte +Date: Tue May 12 10:05:45 2015 -0400 + + (fix) now set MeetingMessageType only for EAS 14.1 + +M ActiveSync/SOGoMailObject+ActiveSync.m +M NEWS + +commit f666b436dd40e48de67c8f1f6e29b65c714f9e52 +Author: Ludovic Marcotte +Date: Tue May 12 09:59:01 2015 -0400 + + (fix) make sure sure email invitations can always be read by EAS clients + +M ActiveSync/SOGoMailObject+ActiveSync.m +M NEWS + +commit 4826f0155552d56a98712dff1a607a2504b98591 +Author: Ludovic Marcotte +Date: Tue May 12 09:52:13 2015 -0400 + + (fix) fixed EAS replies decoding from Outlook (#3123) + +M NEWS +M SoObjects/Mailer/SOGoMailObject.m + +commit 0a285eedec327c8ea7f285f228c6083bcf5438d0 +Author: Juan Vallés +Date: Wed May 6 16:22:06 2015 +0200 + + oc-calendar: Fix property values of invitation responses + + The value of `PidTagResponseRequested` property in the invitation mail + wasn't being set properly, while the `PidTagReplyRequested` property + wasn't being set at all. This caused invitation response mails not to be + sent. Both properties are expected to be `true`. + +M OpenChange/MAPIStoreMailMessage.h +M OpenChange/MAPIStoreMailMessage.m + +commit fbb779a71d6fc1b97ccfb7ba5a68f02ab973f43a +Author: Ludovic Marcotte +Date: Wed May 6 16:03:33 2015 -0400 + + (fix) During login, we now extract the domain from the user to accelerate authentication requests on sources + +M NEWS +M SoObjects/SOGo/SOGoUserManager.m + +commit 15f95c4956b897eb5927c65abc5adcdd172a768a +Author: Enrique J. Hernández Blasco +Date: Thu Apr 30 00:16:24 2015 +0200 + + oc-mail: Support restricitions on name for MAPIStoreMailFolderTable + + This allows us to search for a subfolder in a mail + folder successfully. This is happening, for instance, on folder creation. + +M OpenChange/GNUmakefile +M OpenChange/MAPIStoreMailFolder.m +A OpenChange/MAPIStoreMailFolderTable.h +A OpenChange/MAPIStoreMailFolderTable.m + +commit 2d65b75b56c43f105ff7982864f0fa7cab2a0f83 +Author: Enrique J. Hernández Blasco +Date: Tue May 5 10:46:53 2015 +0200 + + oc-mail: Flush IMAP hierarchy cache to update Outlook folders + + This fixes two scenarios: + + * An IMAP subfolder has updated its hierarchy when it is asked + to be synchronised + * An IMAP root folder is created on Outlook when you logon. OpenChange + changes are required to be refreshed on synchronisation. + +M OpenChange/MAPIStoreMailContext.m +M OpenChange/MAPIStoreMailFolder.m + +commit ebe2a466e7ac3d6aa0f10befc9367555224ac752 +Author: Juan Vallés +Date: Tue May 5 10:28:58 2015 +0200 + + oc-calendar: Compute PidLidAppointmentDefinitionStartWhole for all-day events + +M OpenChange/MAPIStoreAppointmentWrapper.m + +commit 7e89c43919a258dc4f41d309b58408dab307b6d5 +Author: Juan Vallés +Date: Tue May 5 10:01:09 2015 +0200 + + oc-calendar: Compute time offset in floating time in all-day recurring events + +M OpenChange/MAPIStoreAppointmentWrapper.m + +commit a37f43866343131b7da329020193d10684c72092 +Author: Ludovic Marcotte +Date: Mon May 4 09:11:52 2015 -0400 + + (fix) the EAS maximum response size being per-folder, and not global + +M ActiveSync/SOGoActiveSyncDispatcher+Sync.m +M NEWS + +commit 50896eb526b2bb1b3f50c9b5ef2bf183fab156cf +Author: Francis Lachapelle +Date: Tue Apr 28 14:44:29 2015 -0400 + + (i18n) Improve Basque Locale file + +M UI/MainUI/Basque.lproj/Locale + +commit 7ff12c7a64bf86a039ee6c9ca4f33ad91cbb26bd +Author: Ludovic Marcotte +Date: Mon Apr 27 15:07:44 2015 -0400 + + Updated NEWS file regarding Zentyal's PRs + +M NEWS + +commit f2b5f5917b123eade52c13903a6cc3486ca85e7a +Author: Ludovic Marcotte +Date: Mon Apr 27 15:02:00 2015 -0400 + + Fixed dot notation + +M OpenChange/RTFHandler.m + +commit dfb960eac423292e0be74cd8e1ad1f301cc215f2 +Author: Ludovic Marcotte +Date: Mon Apr 27 14:57:44 2015 -0400 + + Disabled -Werr for now + +M OpenChange/GNUmakefile + +commit a1406d01e18e3ffe69f0d47206a864661fbfbf79 +Author: Francis Lachapelle +Date: Mon Apr 27 13:57:37 2015 -0400 + + Initial Basque translation + +M .tx/config +M NEWS +A SoObjects/Appointments/Basque.lproj/Localizable.strings +M SoObjects/Appointments/GNUmakefile +A SoObjects/Contacts/Basque.lproj/Localizable.strings +M SoObjects/Contacts/GNUmakefile +A SoObjects/Mailer/Basque.lproj/Localizable.strings +M SoObjects/Mailer/GNUmakefile +A SoObjects/Mailer/SOGoMailBasqueForward.wo/SOGoMailBasqueForward.html +A SoObjects/Mailer/SOGoMailBasqueForward.wo/SOGoMailBasqueForward.wod +A SoObjects/Mailer/SOGoMailBasqueReply.wo/SOGoMailBasqueReply.html +A SoObjects/Mailer/SOGoMailBasqueReply.wo/SOGoMailBasqueReply.wod +M SoObjects/SOGo/SOGoDefaults.plist +M Tests/Integration/preferences.py +A UI/AdministrationUI/Basque.lproj/Localizable.strings +M UI/AdministrationUI/GNUmakefile +A UI/Common/Basque.lproj/Localizable.strings +M UI/Common/GNUmakefile +A UI/Contacts/Basque.lproj/Localizable.strings +M UI/Contacts/GNUmakefile +A UI/MailPartViewers/Basque.lproj/Localizable.strings +M UI/MailPartViewers/GNUmakefile +A UI/MailerUI/Basque.lproj/Localizable.strings +M UI/MailerUI/GNUmakefile +M UI/MainUI/Arabic.lproj/Localizable.strings +A UI/MainUI/Basque.lproj/Locale +A UI/MainUI/Basque.lproj/Localizable.strings +M UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings +M UI/MainUI/Catalan.lproj/Localizable.strings +M UI/MainUI/Czech.lproj/Localizable.strings +M UI/MainUI/Danish.lproj/Localizable.strings +M UI/MainUI/Dutch.lproj/Localizable.strings +M UI/MainUI/English.lproj/Localizable.strings +M UI/MainUI/Finnish.lproj/Localizable.strings +M UI/MainUI/French.lproj/Localizable.strings +M UI/MainUI/GNUmakefile +M UI/MainUI/German.lproj/Localizable.strings +M UI/MainUI/Hungarian.lproj/Localizable.strings +M UI/MainUI/Icelandic.lproj/Localizable.strings +M UI/MainUI/Italian.lproj/Localizable.strings +M UI/MainUI/NorwegianBokmal.lproj/Localizable.strings +M UI/MainUI/NorwegianNynorsk.lproj/Localizable.strings +M UI/MainUI/Polish.lproj/Localizable.strings +M UI/MainUI/Russian.lproj/Localizable.strings +M UI/MainUI/SpanishArgentina.lproj/Localizable.strings +M UI/MainUI/SpanishSpain.lproj/Localizable.strings +M UI/MainUI/Swedish.lproj/Localizable.strings +M UI/MainUI/Ukrainian.lproj/Localizable.strings +M UI/MainUI/Welsh.lproj/Localizable.strings +M UI/PreferencesUI/Arabic.lproj/Localizable.strings +A UI/PreferencesUI/Basque.lproj/Localizable.strings +M UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings +M UI/PreferencesUI/Catalan.lproj/Localizable.strings +M UI/PreferencesUI/Czech.lproj/Localizable.strings +M UI/PreferencesUI/Danish.lproj/Localizable.strings +M UI/PreferencesUI/Dutch.lproj/Localizable.strings +M UI/PreferencesUI/English.lproj/Localizable.strings +M UI/PreferencesUI/Finnish.lproj/Localizable.strings +M UI/PreferencesUI/French.lproj/Localizable.strings +M UI/PreferencesUI/GNUmakefile +M UI/PreferencesUI/German.lproj/Localizable.strings +M UI/PreferencesUI/Hungarian.lproj/Localizable.strings +M UI/PreferencesUI/Icelandic.lproj/Localizable.strings +M UI/PreferencesUI/Italian.lproj/Localizable.strings +M UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings +M UI/PreferencesUI/NorwegianNynorsk.lproj/Localizable.strings +M UI/PreferencesUI/Polish.lproj/Localizable.strings +M UI/PreferencesUI/Russian.lproj/Localizable.strings +M UI/PreferencesUI/Slovak.lproj/Localizable.strings +M UI/PreferencesUI/SpanishArgentina.lproj/Localizable.strings +M UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings +M UI/PreferencesUI/Swedish.lproj/Localizable.strings +M UI/PreferencesUI/Ukrainian.lproj/Localizable.strings +M UI/PreferencesUI/Welsh.lproj/Localizable.strings +A UI/Scheduler/Basque.lproj/Localizable.strings +M UI/Scheduler/GNUmakefile + +commit 07ac3f43fbdaeede58a7941c831f9f86c13bcdbd +Author: Francis Lachapelle +Date: Mon Apr 27 10:38:29 2015 -0400 + + Simplify some calls in SOGoAppointmentFolder.m + +M SoObjects/Appointments/SOGoAppointmentFolder.m + +commit 84c199b95a8e83374305688c4408a839ff7be8f7 +Author: Jeroen Dekkers +Date: Sun Apr 26 13:33:03 2015 +0200 + + Spelling fix: dictionnary -> dictionary + +M SoObjects/Appointments/SOGoAppointmentFolder.m +M UI/MailerUI/UIxMailActions.m +M UI/WebServerResources/MailerUI.js + +commit 769045bbf6bd010c36c56e1b30cc6d4773dc78f6 +Author: Jeroen Dekkers +Date: Sat Apr 25 14:40:42 2015 +0200 + + Do not include nonexistent config.h + +M SoObjects/SOGo/md4.c + +commit 78f5f60b16194f502871ec77270bef8ac1265fdf +Author: Julio García +Date: Mon Apr 20 13:15:22 2015 +0200 + + Revert "oc: monkeypatched NGImap4Connection class from sope" + + This reverts commit 24e35103ff0a5094f81b9f241cb8164293ac7b83. + +M OpenChange/GNUmakefile +D OpenChange/NGImap4Connection+Monkeypatching.h +D OpenChange/NGImap4Connection+Monkeypatching.m + +commit 255b3d2d006a6acf2aeb854aa20d88f8e77f8c1d +Author: Julio García +Date: Mon Apr 20 13:15:13 2015 +0200 + + Revert "oc: NGImap4Connection:fetchUids don't delete RawResponse" + + This reverts commit c410a9fc3ff7694d179e69e5d9a904396f0ab07e. + +M OpenChange/NGImap4Connection+Monkeypatching.h +M OpenChange/NGImap4Connection+Monkeypatching.m + +commit 1d9e085658cdb8ca93a44b8066a3907f14f0047b +Author: Julio García +Date: Mon Apr 20 13:15:04 2015 +0200 + + Revert "oc: NGImap4Connection:fetchUids changed error messages" + + This reverts commit 41320a4813e232b02780eea42792b108c7f4bf3f. + +M OpenChange/NGImap4Connection+Monkeypatching.m + +commit 9901788db67cb09843752652d6170aeeead50e0e +Author: Julio García +Date: Mon Apr 20 09:51:02 2015 +0200 + + Revert "Update news for next release" + + This reverts commit cd47c926c92c29c7ee63c3990417883d60be2be7. + + Conflicts: + NEWS + +M NEWS + +commit 8e39f03f834679bc8f0073daaf286849da919da5 +Author: Julio García +Date: Mon Apr 20 09:48:52 2015 +0200 + + Revert "Prepare for 2.2.17a-zentyal1" + + This reverts commit 8706443685ff3cb4e71d79e08204e826698db597. + + Conflicts: + NEWS + +M NEWS + +commit f6370d10cba1f75c59b837addc5d4236a579c744 +Author: Julio García +Date: Mon Apr 20 09:47:40 2015 +0200 + + Revert "Prepare for new 2.2.15-zentyal3 version" + + This reverts commit 914e7b7418128dbc112746d4b58a81eef2a64d88. + + Conflicts: + NEWS + +M NEWS + +commit d0c1737b1b65c4ab16a65594002ca1ad7a8a7215 +Author: Ludovic Marcotte +Date: Fri Apr 17 14:09:51 2015 -0400 + + Removed TODO refs + +M packaging/debian-multiarch/sogo.docs +M packaging/debian/sogo.docs + +commit 836095e9844f37c29fc140680980877dd1ed0a57 +Author: Ludovic Marcotte +Date: Fri Apr 17 14:09:13 2015 -0400 + + Removed old TODO file + +D TODO + +commit a86b164228a43e897c338d6f362446410048a2f2 +Author: Luc Charland +Date: Fri Apr 17 10:38:40 2015 -0400 + + uses a dict instead of a string of a dict for preventInvitationsTest + +M Tests/Integration/test-preferences.py +M Tests/Integration/test-prevent-invitations.py + +commit 5847e086ec803905d8225e064a9a5dfc38612761 +Author: Francis Lachapelle +Date: Fri Apr 17 09:55:27 2015 -0400 + + (fix) Edition and access of attach URL in editor + +M NEWS +M UI/WebServerResources/UIxComponentEditor.js + +commit 3872af35d1ecdf93ff0cf3db92ff0bd6708eaeb8 +Author: Ludovic Marcotte +Date: Fri Apr 17 09:41:39 2015 -0400 + + (fix) Improve prevent invitations error handling + +M SoObjects/Appointments/SOGoAppointmentObject.m +M UI/PreferencesUI/UIxPreferences.m + +commit beb666bc5f995e81c3cf56925038a780ad80e7f4 +Author: Ludovic Marcotte +Date: Fri Apr 17 09:29:49 2015 -0400 + + (fix) fixed md4 support (for NTLM password changes) with GNU TLS + +M NEWS +M SoObjects/SOGo/GNUmakefile +M SoObjects/SOGo/GNUmakefile.preamble +M SoObjects/SOGo/NSData+Crypto.m +A SoObjects/SOGo/md4.c +A SoObjects/SOGo/md4.h + +commit 030d34343271f3e41a3d8c7715bd917bbaf791d6 +Author: Enrique J. Hernández Blasco +Date: Mon Apr 13 11:55:43 2015 +0200 + + oc: Do not create indexing entry for a root folder + + This is done by OpenChange after this patchset is merged: + + https://github.com/openchange/openchange/pull/273 + +M OpenChange/MAPIStoreContext.m + +commit a7306a77cb3db91ebef22771b9fd5e69f0ed22b0 +Author: Francis Lachapelle +Date: Thu Apr 16 15:27:55 2015 -0400 + + (fix) JavaScript error when saving preferences + + The error was occuring when the user enabled forwarding but no domains + constraints were defined in the SOGo's configuration. + +M UI/WebServerResources/UIxPreferences.js + +commit 539060d25271cc5e5ba0a28d34522f806ff4025b +Author: José Antonio Calvo +Date: Thu Apr 16 09:34:43 2015 +0200 + + oc-calendar: Fix recipient type for invitations + + Take into account optional attendees setting the recipient + type to MAPI_CC when they have the iCal role set to OPT-PARTICIPANT + instead of harding always MAPI_TO (required) as was done before. + + This is a complementary fix for: https://github.com/Zentyal/sogo/pull/108 + +M OpenChange/MAPIStoreAppointmentWrapper.m + +commit d4930a7960e0cd3c8891d2695d8f957b3471e69d +Author: Julien Kerihuel +Date: Mon Mar 30 04:42:13 2015 +0200 + + oc: Remove deprecated notification code. + +M OpenChange/MAPIStoreFolder.h +M OpenChange/MAPIStoreFolder.m +M OpenChange/MAPIStoreMailFolder.m +M OpenChange/MAPIStoreMessage.m +M OpenChange/MAPIStoreMessageTable.m + +commit 0f432b654f708ab96c79c5197d67e8cd8980951a +Author: Jesús García Sáez +Date: Wed Apr 15 18:52:55 2015 +0200 + + oc: Fix internal EntryIds properties on multidomain + + PidTag*EntryId properties were not being generated (which contain + the email address and so on). Functionality on Outlook clients like + "Reply All" were not working because of this (probably a lot more + stuff related with email addresses). + + With multidomain support enabled outlook clients will use full email + address (e.g. user@domain.com) as login. + + This change is needed because we were performing ldap queries on samdb + using (sAMAccountName=UIDFieldName), being UIDFieldName the parameter + configured in sogo.conf for that source. In multidomain environment + this field could be `sAMAccountName` but it could not. Actually the + more logical scenario will be to use `uid` field here (which will be + just `user`, without the `@domain.com` part). + + SOGoUserManager will return `sAMAccountName` if the contact has it + (in Outlook environment that means always) so it can (and must) be + used to query samdb in MAPIStoreSamDBUtils properly. + + TL;DR: use sAMAccoutName instead of uid to query samdb + +M OpenChange/MAPIStoreAppointmentWrapper.m +M OpenChange/MAPIStoreMailMessage.m +M OpenChange/MAPIStoreMailVolatileMessage.m +M OpenChange/MAPIStoreSamDBUtils.m +M SoObjects/SOGo/SOGoUserManager.m + +commit cdb608551018fe6de9696393cd4b021cfe46dd7b +Author: Julio García +Date: Thu Apr 16 09:55:32 2015 +0200 + + Revert "Adding missing build dependency gnulib" + + This reverts commit 210053ea20ef9b803b7486e700576bc33e70330f. + +M SoObjects/SOGo/NSData+Crypto.m +M packaging/debian/control + +commit 6b3454376eee8f81f023f91dc982c5d40f48e76f +Author: Julio García +Date: Thu Apr 16 09:55:22 2015 +0200 + + Revert "configure: Fix gnulib/crypto/md4 dependency" + + This reverts commit f0a3fdae5bdfa242d8b4a6b01025195c0eb4a620. + +D SoObjects/SOGo/.gitignore +M SoObjects/SOGo/GNUmakefile.preamble +M configure + +commit a8e8ec535af3d1674d261df0e39e1bd5ce3bc954 +Author: Julio García +Date: Wed Apr 15 16:10:03 2015 +0200 + + Prepare for 2.2.17a-zentyal1 + +M NEWS + +commit 8706443685ff3cb4e71d79e08204e826698db597 +Author: Julio García +Date: Wed Apr 15 16:10:03 2015 +0200 + + Prepare for 2.2.17a-zentyal1 + +M NEWS + +commit f0a3fdae5bdfa242d8b4a6b01025195c0eb4a620 +Author: Jesús García Sáez +Date: Wed Apr 15 14:31:42 2015 +0200 + + configure: Fix gnulib/crypto/md4 dependency + + Gnulib project needs Autoconf to be able to import their modules with gnulib-tool + http://www.gnu.org/software/gnulib/manual/html_node/Initial-import.html#Initial-import + + We only need md4.c file so this is a workaround to compile it without using + gnulib-tool --import + +A SoObjects/SOGo/.gitignore +M SoObjects/SOGo/GNUmakefile.preamble +M configure + +commit 210053ea20ef9b803b7486e700576bc33e70330f +Author: Julio García +Date: Fri Apr 10 18:50:47 2015 +0200 + + Adding missing build dependency gnulib + +M SoObjects/SOGo/NSData+Crypto.m +M packaging/debian/control + +commit 1d6f1a83af84b563914e5f47ddafdb093b9b2016 +Author: Jesús García Sáez +Date: Tue Apr 14 13:08:21 2015 +0200 + + use full login for sogo_cache_folder tables + + So when multidomain is enabled we will have tables like + sogo_cache_folder_user_A_domain_D_com instead of just + sogo_cache_folder_user + + If multidomain is disabled the folders will still be like + sogo_cache_folder_user + +M ActiveSync/SOGoActiveSyncDispatcher.m +M OpenChange/MAPIStoreUserContext.m +M Tools/SOGoToolManageEAS.m + +commit 914e7b7418128dbc112746d4b58a81eef2a64d88 +Author: Julio García +Date: Tue Apr 14 11:44:32 2015 +0200 + + Prepare for new 2.2.15-zentyal3 version + +M NEWS + +commit bddd67fb9317c03fcf17e384ee4785050885136a +Author: Enrique J. Hernández Blasco +Date: Mon Apr 13 11:48:42 2015 +0200 + + oc: Enforce the folder creation mapping when the FID exists + + We believe the folder ID OpenChange is sending us is new + and we keep the indexing database properly updated. + + Although the solution is not elegant, this could avoid + inconsistencies between what the client stores and the + relation in the MAPIStore backend. + +M OpenChange/MAPIStoreFolder.m +M OpenChange/MAPIStoreMapping.h +M OpenChange/MAPIStoreMapping.m + +commit fa23b574eb7f58cc8fdc679dd6c2e47a5f7090da +Author: Enrique J. Hernández Blasco +Date: Mon Apr 13 11:37:48 2015 +0200 + + oc: Search for properties in a SOGoMAPIDB object now works + + sogo-openchange library stores the properties as NSString keys + and the search function casts the values to NSNumber, which it may + be valid for other parts but not for this library. + + The real fix would be to store the property keys as NSNumbers as + they are uint32_t at the end. However, this may lead to a great + refactor in the library. + + With this fix, we can match the search for a property in a + MAPIStoreFallback folder, such as Notes or Deleted Items, or + MAPIStoreFolder properties (ie: search for a subfolder) or + for MAPIStoreFAIMessages in a folder. + +M SoObjects/SOGo/EOQualifier+SOGoCacheObject.m + +commit cdc74e498448d701dc8ea9998542effc13d5cb0c +Author: Francis Lachapelle +Date: Thu Apr 9 09:06:19 2015 -0400 + + Update translations + +M NEWS +M SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings +M SoObjects/Contacts/BrazilianPortuguese.lproj/Localizable.strings +M UI/Common/BrazilianPortuguese.lproj/Localizable.strings +M UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings +M UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings +M UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings +M UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings +M UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings +M UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings +M UI/PreferencesUI/Dutch.lproj/Localizable.strings +M UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings +M UI/PreferencesUI/Polish.lproj/Localizable.strings +M UI/PreferencesUI/Russian.lproj/Localizable.strings +M UI/PreferencesUI/SpanishSpain.lproj/Localizable.strings +M UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings +M UI/Scheduler/English.lproj/Localizable.strings + +commit 1e4596ca3a42bc1e3c64d4c0d075fb7ea09336be +Author: Ludovic Marcotte +Date: Wed Apr 8 14:20:33 2015 -0400 + + (fix) fixed serialization of PreventInvitationsWhitelist + +M NEWS +M UI/PreferencesUI/UIxPreferences.m + +commit 755efa789bb2cfdc6f3c056266cbaa9575a91b4e +Author: Francis Lachapelle +Date: Wed Apr 8 12:07:28 2015 -0400 + + [fix] initial loading of inbox uids and headers + +M NEWS +M UI/WebServerResources/MailerUI.js + +commit eae327ca191957ad956be7c750761c341ce599a9 +Author: Francis Lachapelle +Date: Tue Apr 7 08:27:30 2015 -0400 + + [fix] Paragraph margins in HTML message + + Fixes #3163 + +M NEWS +M UI/WebServerResources/MailerUI.css + +commit 01857a9a47ae11561ab844a8759478f48ee607d3 +Author: Francis Lachapelle +Date: Thu Apr 2 11:53:03 2015 -0400 + + [fix] Timezone of MS Exchange freebusy information + +M NEWS +M SoObjects/Appointments/MSExchangeFreeBusySOAPRequest.m + +commit e2c3259b164d16c4ae4cbe4aa14914d071e9c80a +Author: Francis Lachapelle +Date: Wed Apr 1 20:10:52 2015 -0400 + + [fix] Issues with freebusy in attendees editor + +M UI/WebServerResources/JavascriptAPIExtensions.js +M UI/WebServerResources/UIxAttendeesEditor.js + +commit 77917780c81310ab72cc294798a2574cf84d6544 +Author: Ludovic Marcotte +Date: Wed Apr 1 08:46:46 2015 -0400 + + (fix) packaging issue on RHEL + +M packaging/rhel/sogo.spec + +commit 9b320ec2a175f1db74a410b8a34767b4c28951e7 +Author: Ludovic Marcotte +Date: Tue Mar 31 16:17:21 2015 -0400 + + Improvements over 491d7aaffcc2fc2b8acb468e6387501c2af376e4 + +M ActiveSync/SOGoMailObject+ActiveSync.m + +commit b2d7eb40c2d86b9c536477170eebe68716212b60 +Author: Ludovic Marcotte +Date: Tue Mar 31 16:13:52 2015 -0400 + + (fix) fixed a potential EAS error with multiple email priority flags + +M ActiveSync/SOGoMailObject+ActiveSync.m +M NEWS + +commit ab121e6c153208a9e18174d664645c52826ae9d2 +Author: Francis Lachapelle +Date: Tue Mar 31 15:19:53 2015 -0400 + + [fix] Issues with freebusy in attendees editor + +M NEWS +M UI/WebServerResources/JavascriptAPIExtensions.js +M UI/WebServerResources/UIxAttendeesEditor.js + +commit 94d546dc7a87ee65cfa0668da7bfd889e6155129 +Author: Ludovic Marcotte +Date: Tue Mar 31 13:42:59 2015 -0400 + + (feat) added systemd startup script (PR#76) + +M NEWS + +commit 06ef3fe8564729d971b50822e1669372324600c1 +Author: peruchi +Date: Tue Mar 31 14:37:35 2015 -0300 + + Delete sogo-systemd-redhat.spec + +D packaging/rhel/sogo-systemd-redhat.spec + +commit c9ec636a533836ec8464acadea97dc09276d2557 +Author: peruchi +Date: Tue Mar 31 14:36:04 2015 -0300 + + Update sogo.spec + +M packaging/rhel/sogo.spec + +commit 36a70b161c32653cf8d7f2bdf83c6d0c4aac9b76 +Author: peruchi +Date: Tue Mar 31 14:19:16 2015 -0300 + + Create sogo-systemd-redhat + +A Scripts/sogo-systemd-redhat + +commit 784f0100e9d4dc55d5320e41eecfc3a7e68f9943 +Author: peruchi +Date: Tue Mar 31 14:18:23 2015 -0300 + + Create sogo-systemd-redhat.spec + +A packaging/rhel/sogo-systemd-redhat.spec + +commit db9536adcc5f57fa1596c8ed6efbcdf0b349d664 +Author: Ludovic Marcotte +Date: Tue Mar 31 09:25:57 2015 -0400 + + (fix) fix yet an other potential crash during freebusy lookups during timezone changes + +M NEWS +M UI/MainUI/SOGoUserHomePage.m + +commit c428ac255337739856833fe96d56fb82ab8df977 +Author: Ludovic Marcotte +Date: Mon Mar 30 09:57:27 2015 -0400 + + EAS reply fix when message/rfc822 parts are included in the original mail (#3153) + +M ActiveSync/SOGoMailObject+ActiveSync.m +M NEWS + +commit f5607b3e857270f2efdf7c28a629d93b54029d86 +Author: Ludovic Marcotte +Date: Mon Mar 30 09:49:44 2015 -0400 + + now keep the BodyPreference for future EAS use and default to MIME if none set (#3146) + +M ActiveSync/SOGoActiveSyncDispatcher+Sync.m +M ActiveSync/SOGoActiveSyncDispatcher.m +M NEWS + +commit 491d7aaffcc2fc2b8acb468e6387501c2af376e4 +Author: Ludovic Marcotte +Date: Mon Mar 30 09:42:32 2015 -0400 + + improved multipart handling using EAS + +M ActiveSync/NSString+ActiveSync.h +M ActiveSync/NSString+ActiveSync.m +M ActiveSync/SOGoActiveSyncDispatcher.m +M NEWS + +commit 95a8a9316a8723999fc12de4c97fcc4f0c95c0c4 +Author: Enrique J. Hernández Blasco +Date: Thu Mar 26 23:43:28 2015 +0100 + + oc: Use new OC_DEBUG macro + + Avoiding the usage of __FUNCTION__ and __LINE__ + and more related with the logging system is being in place + for OpenChange. + + As well as set the proper level to some debug messages. + +M OpenChange/MAPIStoreSOGo.m + +commit 1ee47b1ee233a1e5218441ccae777a769932ffd0 +Author: Enrique J. Hernández Blasco +Date: Fri Mar 27 10:27:16 2015 +0100 + + oc: return last modified messages when sorted by PidMessageTagDeliveryTime + + This change is required as oxcfxics is asking for sorting + using this property. + + We fake this property on GCS folders (Tasks, Calendar, Contacts) + using c_lastmodified column. + +M OpenChange/MAPIStoreCalendarMessageTable.m +M OpenChange/MAPIStoreContactsMessageTable.m +M OpenChange/MAPIStoreTasksMessageTable.m + +commit dfde498b7c170cd0c92bf75e74dd8c47d8764fa0 +Author: Enrique J. Hernández Blasco +Date: Thu Mar 26 22:45:13 2015 +0100 + + oc-mail: Include Deleted flagged messages on syncing cache + + This gives an accurate value for SyncLastDeletedMessage + +M OpenChange/MAPIStoreMailFolder.m + +commit 06476abdf7018337116b1608ffe2016196f3924c +Author: Enrique J. Hernández Blasco +Date: Thu Mar 26 22:05:43 2015 +0100 + + oc-mail: return soft-deleted mails while syncing + + As well as hard deleted + + As explained in [MS-OXCFXICS] Section 2.2.1.3.1, the + property MetaTagIdsetDeleted must include both types + of messages and this idset is filled with the return + value of this message. + +M OpenChange/MAPIStoreMailFolder.m + +commit dc869ce106dad20c0fc8595ae283e77de3042a64 +Author: Jesús García Sáez +Date: Tue Mar 24 18:05:58 2015 +0100 + + oc-mail: Support for PidTagTransportMessageHeaders property + + This property is needed to show the 'Internet Headers' in Outlook. + Outlook 2010 shows them in the properties dialog of a message. + Outlook 2007 show them in message options section from context menu + of a mail message. + + The property is defined in [MS-OXOMSG] section 2.2.1.61. + + The property is formed concatenating the mail message headers + properly mime encoded. + + The headers are appended in no defined order. + +M NEWS +M OpenChange/MAPIStoreMailMessage.m + +commit ddcae9f132619a15d85af629910c92cd1ac261ba +Author: Ludovic Marcotte +Date: Thu Mar 26 13:57:58 2015 -0400 + + Updates for the release + +M ChangeLog +M Documentation/docinfo.xml +M Documentation/includes/global-attributes.asciidoc +M NEWS +M Version + commit f11bcd3373f39967b870f8d8f3358759a6221b62 Author: Ludovic Marcotte Date: Thu Mar 26 13:54:17 2015 -0400 @@ -7,6 +1384,95 @@ Date: Thu Mar 26 13:54:17 2015 -0400 M UI/MailerUI/UIxMailEditor.m M UI/Scheduler/UIxCalMainView.m +commit a47f1de6074c7604b794c2ba507e96a2b63cfd86 +Author: Enrique J. Hernández Blasco +Date: Thu Mar 26 14:18:34 2015 +0100 + + oc-mail: Update place for Sharing Flavour prop values + + It has been moved in OpenChange + +M OpenChange/MAPIStoreSharingMessage.m + +commit 82fb03b67b7106aea8b489e21b03225bcb761faa +Author: Enrique J. Hernández Blasco +Date: Wed Mar 25 16:53:42 2015 +0100 + + oc-mail: Ensure we are creating folder to the right user + + As it happened with dba17fb if we interleave requests + from different users while creating a folder we can + create the folder in other user's mailbox as latest + activeUser is the one from latest sogo_context_get_root_folder + call. + + This is for me a lack of right design and a workaround + only fixing this issue but not the root cause. + +M OpenChange/MAPIStoreMailFolder.m + +commit f9c8661fe6308e795ac098f85de2407344342869 +Author: Enrique J. Hernández Blasco +Date: Wed Mar 25 00:03:51 2015 +0100 + + oc-mail: Use constant names in props value + + This gives to the developer more information about + the property values for PidLidSharingFlavor and + PidLidSharingCapabilities. + +M OpenChange/MAPIStoreMailVolatileMessage.m +M OpenChange/MAPIStoreSharingMessage.h +M OpenChange/MAPIStoreSharingMessage.m + +commit 661b6694af3e2dacb1daa560c489b6ac9553db4a +Author: Enrique J. Hernández Blasco +Date: Thu Mar 19 00:00:55 2015 +0100 + + oc-mail: Fix several sharing properties managing + + * PidNameXSharingFlavor is used by Outlook 2010 so we have + to store it + * 0x5100 is used although it is not in spec as Sharing Flavour + value when the request is denied from a message where + Request + Invitation was sent. + * Return properly PidNameXSharingCapabilities and PidNameXSharingFlavor + as it is an string representation of a hex number + * Try to guess proper sharing flavour value when it is missing + +M OpenChange/MAPIStoreMailVolatileMessage.m +M OpenChange/MAPIStoreSharingMessage.m + +commit 514b1c03be190f065f45e5e205e2efd0a2d241d9 +Author: Enrique J. Hernández Blasco +Date: Wed Mar 18 23:57:33 2015 +0100 + + oc-mail: Store request properties + + Save them in extra properties from folder container. + + This is required because the client once a request is accepted + or denied sets these two properties and save the message again. + As we cannot modify an IMAP message, we use this utility. + + See [MS-OXSHARE] Section 3.1.4.3 for details. + +M OpenChange/MAPIStoreMailMessage.m +M OpenChange/MAPIStoreSharingMessage.h +M OpenChange/MAPIStoreSharingMessage.m + +commit a663fdd260e0bed5e3f09b3ff1ad709037b4a553 +Author: Enrique J. Hernández Blasco +Date: Wed Mar 18 23:54:10 2015 +0100 + + oc-mail: Give support to store extra properties in versions message + + This is handy when you want to store properties once a mail + has hit the server and thus cannot be changed. + +M OpenChange/MAPIStoreMailFolder.h +M OpenChange/MAPIStoreMailFolder.m + commit b933f53fc2580bd5b9913f7afebcf6b2d9bedc53 Author: Ludovic Marcotte Date: Tue Mar 24 10:56:26 2015 -0400 @@ -43,6 +1509,23 @@ M UI/Scheduler/UIxAttendeesEditor.m M UI/Scheduler/UIxComponentEditor.h M UI/Scheduler/UIxComponentEditor.m +commit 6204aebf2c9143d1b124c82d9a8046944115492e +Author: Enrique J. Hernández Blasco +Date: Mon Mar 23 23:57:33 2015 +0100 + + oc-calendar: do not crash with invalid events + + A failure in parsing an ICS makes return a nil calendar + object. Instead of creating an appointment with nil + information which can lead to crashes like the one + generated creating PidLidCleanGlobalObjectId property. + + We return an empty message with no information which is + taken into account in Outlook but not displayed like + in SOGo webmail does. + +M OpenChange/MAPIStoreCalendarMessage.m + commit 26d876e67a32e6c2dc36a3a92449aa0b6638ec41 Author: Francis Lachapelle Date: Mon Mar 23 16:28:32 2015 -0400 @@ -157,6 +1640,50 @@ M NEWS M UI/MailerUI/UIxMailEditor.m M UI/Scheduler/UIxCalMainView.m +commit 8ee2303e781056d512c4d83ba76683c7c1496669 +Author: Enrique J. Hernández Blasco +Date: Thu Mar 19 00:06:14 2015 +0100 + + oc: Empty ACL from a folder works with several users + + The `[SOGoFolder:aclUsers]` returns a reference to a `NSArray` + which is being modified in the `for` loop making fail when + more than one user is in the ACL with `NSRangeException`. + +M OpenChange/MAPIStoreFolder.m + +commit 2668bc313cdd517c7f127e921e277ea8e672b018 +Author: José Antonio Calvo +Date: Fri Mar 13 18:50:10 2015 +0100 + + oc-calendar: Fix event invitations for optional attendees + + Outlook sets recipient type of Required attendees as MAPI_TO and + optional ones as MAPI_CC, so the fix is just to not only iterate + over the "to" list of recipients but also the "cc" one. We're + also setting the proper iCal value for this case (OPT-PARTICIPANT + instead of REQ-PARTICIPANT) + + In [MS-OXOCAL] Section 2.2.4.10.7 says the recipient type is 0x01 + as Required and 0x02 as Optional and other documents such as + [MS-OXCMSG] 2.2.3.1.2 indicates that MAPI_TO is 0x01 and MAPI_CC + is 0x02, that's why is stored in 'to' and 'cc' respectively. + +M NEWS +M OpenChange/iCalEvent+MAPIStore.m + +commit 637ac1e98a720fb7e1ca07d5d72ee8ad0b72d13d +Author: Jesús García Sáez +Date: Thu Mar 12 21:36:50 2015 +0100 + + oc-rtf: no color table definition + + Be able to parse rtf files without color table defined + \colortbl + +M NEWS +M OpenChange/RTFHandler.m + commit cdb766e2eff3b6e420da48b3f396814edff96b4f Author: Ludovic Marcotte Date: Wed Mar 18 10:15:33 2015 -0400 @@ -165,6 +1692,40 @@ Date: Wed Mar 18 10:15:33 2015 -0400 M Documentation/SOGoInstallationGuide.asciidoc +commit fb4c3a4730a05238ef88b29715f6716b4c0057e6 +Author: Enrique J. Hernández Blasco +Date: Tue Mar 10 00:36:36 2015 +0100 + + oc-calendar: Fix weekly recurring events exported to Outlook from SOGo + + SOGo does not create BYDAY mask in weekly recurrence, so + we have to guess it from the start date's day of week. + + In other case, the event is not exported to Outlook and it + says that is corrupted. + +M NEWS +M OpenChange/MAPIStoreRecurrenceUtils.m + +commit 6f44ec42c1bdf934f8035bdd1fb3035bc74925d3 +Author: Enrique J. Hernández Blasco +Date: Fri Mar 6 13:23:17 2015 +0100 + + oc-calendar: Fix import in SOGo exceptions from recurring series + + According to [MS-OXICAL] Section 2.1.3.1.1.20.13, the EXDATE property + must be written only if there are ocurrences from the series that have + been deleted and before this commit ModifiedInstanceDates were also + included. + + We check against every ExceptionInfo from exception ocurrences of the series + to know if the ocurrence was deleted or only modified. + +M NEWS +M OpenChange/MAPIStoreRecurrenceUtils.h +M OpenChange/MAPIStoreRecurrenceUtils.m +M OpenChange/iCalEvent+MAPIStore.m + commit e25a7e3d8d0a5f11a65a6fa337a637b3e1f44432 Author: Ludovic Marcotte Date: Wed Mar 18 09:36:35 2015 -0400 @@ -175,6 +1736,29 @@ M ActiveSync/NGMimeMessage+ActiveSync.m M ActiveSync/SOGoActiveSyncDispatcher.m M NEWS +commit 9f3f2aebe458a6cb6ea94aa9e32d2607f83afb39 +Author: Enrique J. Hernández Blasco +Date: Thu Mar 12 20:24:06 2015 +0100 + + oc-mail: Register source message as soft deleted on movement + + This makes sent mails are not longer automatically copied + to Drafts folder. + + Reasoning: + + When Outlook sends a mail, OpenChange submits the message and + copy the message to Drafts folder. Afterwards, the client asks + to move this message using SyncImportMessageMove ROP from + Drafts to Sent. During this movement, the message is unregistered + from the indexing database. If the client has updated Drafts + folder before that movement, then the client will keep this + message as the MID is not returned in oxcfxics download sync + as deleted. Setting the message as soft deleted, make it work. + +M NEWS +M OpenChange/MAPIStoreMailFolder.m + commit 1d5ae27c996f63488653d3a8638b33320540741c Author: Francis Lachapelle Date: Tue Mar 17 15:31:35 2015 -0400 @@ -185,6 +1769,14 @@ M NEWS M SoObjects/Appointments/SOGoFreeBusyObject.m M UI/WebServerResources/UIxAttendeesEditor.js +commit 0be36df21173a33d1494d2ed1e09507a525b5c02 +Author: Julio García +Date: Mon Mar 16 13:22:52 2015 +0100 + + Preparing release for 2.2.15-zentyal2 + +M NEWS + commit 1bdd5dfc9085e1f08f839b8179a7ccb37b038e5c Author: Jens Erat Date: Fri Mar 13 14:06:58 2015 +0100 @@ -210,6 +1802,63 @@ Date: Fri Mar 13 11:41:07 2015 +0100 M UI/Templates/MailerUI/UIxMailMainFrame.wox +commit 1c1a75d2c16b5b331c90695f8bee31f1d3ccfd00 +Author: Enrique J. Hernández Blasco +Date: Fri Mar 13 09:34:21 2015 +0100 + + oc-mail: Use body.peek to preload message bodies + + In this way, we do not modify the flags (\Seen) on preloading. + The IMAP server returns the content without .peek section so + it is removed. + + This also performs the modification intended by the following + Pull Request: + + https://github.com/Zentyal/sogo/pull/50 + + That tried to avoid set \Seen flag when preloading message bodies + on synchronisation. But in this case we are not incrementing the + modseq as we are not modifying any messages flags. + +M NEWS +M OpenChange/MAPIStoreMailFolder.m +M OpenChange/MAPIStoreMailMessage.m + +commit f0488607299e7941be4315ad1407ab125b6b7032 +Author: Enrique J. Hernández Blasco +Date: Fri Mar 13 00:00:40 2015 +0100 + + Revert "oc-mailfolder: Avoid setting seen flag on preloading message bodies" + + This reverts commit 7e0cddc06bc520c8eefe1b9190e92443853a15bc. + +M OpenChange/MAPIStoreMailFolder.m + +commit 6d6053865f970f40e6dc4e6ac37df8c4d5bf29d7 +Author: Enrique J. Hernández Blasco +Date: Fri Mar 13 00:00:29 2015 +0100 + + Revert "oc-mailfolder: Get seen flag directly from message in preloading" + + This reverts commit d076e04ad47c8938531450af9f002552328f8fa1. + +M OpenChange/MAPIStoreMailFolder.m +M OpenChange/MAPIStoreMailMessage.h +M OpenChange/MAPIStoreMailMessage.m + +commit 6e0027498814f27a2cac3cdbdd472431a700c259 +Author: Jesús García Sáez +Date: Wed Mar 11 11:22:41 2015 +0100 + + oc-rtf: safe parse ignoring content + + Be able to parse safely \*\xxxxx control words with \binXXXX + elements inside it (before final }) + +M NEWS +M OpenChange/RTFHandler.m + commit f1fda8bd0617d5e6b924bb1ae57fb7840bbcc13f Author: Francis Lachapelle Date: Tue Mar 10 13:27:17 2015 -0400 @@ -226,6 +1875,58 @@ Date: Mon Mar 9 14:04:21 2015 -0400 M NEWS +commit 2b54897d29cf6beeadd602acb4620229858623d8 +Author: Enrique J. Hernández Blasco +Date: Thu Mar 5 00:05:02 2015 +0100 + + oc-sharing: Guess PidLidSharingFlavor from other props + + When it is not set by the client on the first place. + + See [MS-OXSHARE] Section 2.2.2.5 for details on returned values. + +M OpenChange/MAPIStoreSharingMessage.m + +commit ae7ac1be296ab362ac98c55345c66811ce591f9d +Author: Enrique J. Hernández Blasco +Date: Thu Mar 5 00:02:19 2015 +0100 + + oc-mail: Return sharing properties on sharing object mail message + + When it is asked for available properties for an specific message. + +M OpenChange/MAPIStoreMailMessage.m + +commit 6af8b486df521274082f312e57614c0e88b68e0d +Author: Enrique J. Hernández Blasco +Date: Tue Mar 3 00:08:34 2015 +0100 + + oc-mail: Return special properties on sharing_metadata.xml attachment + + As required by [MS-OXWSMSHR] Section 3.1.1 to display the share + object message correctly and be able to open the shared calendar + directly from the message. + +M NEWS +M OpenChange/MAPIStoreMailAttachment.m + +commit 316ade13f84798006c3cdaf2c0fa5e884d7a29c1 +Author: Enrique J. Hernández Blasco +Date: Mon Mar 2 23:41:04 2015 +0100 + + oc: Implement Sharing Message Object + + It acts as a proxy of MAPIStoreMailMessage and it manages the properties + defined in [MS-OXSHARE] Section 2.2 by storing them in the mail message + as eXtensible MIME headers which starts with X-MS-Sharing. + +M OpenChange/GNUmakefile +M OpenChange/MAPIStoreMailMessage.h +M OpenChange/MAPIStoreMailMessage.m +M OpenChange/MAPIStoreMailVolatileMessage.m +A OpenChange/MAPIStoreSharingMessage.h +A OpenChange/MAPIStoreSharingMessage.m + commit cbba0719bb58229d9be8d3bb5af5fba23da3ae14 Author: Francis Lachapelle Date: Wed Mar 4 10:05:12 2015 -0500 @@ -234,6 +1935,14 @@ Date: Wed Mar 4 10:05:12 2015 -0500 M SoObjects/SOGo/SOGoUserManager.m +commit 3b2cbb945c86b4a9fdfea7f6f66ff64d0005daf9 +Author: Carlos Pérez-Aradros Herce +Date: Wed Jan 21 00:27:14 2015 +0100 + + oc: Free headerEncoding variable + +M OpenChange/MAPIStoreMailMessage.m + commit 8e0849029ea93bfc9e1f9e2cb4ff2e0e5b6a4308 Author: Francis Lachapelle Date: Tue Mar 3 21:18:46 2015 -0500 @@ -258,6 +1967,46 @@ M SoObjects/SOGo/SOGoCASSession.m M SoObjects/SOGo/SOGoUser.m M SoObjects/SOGo/SOGoUserManager.m +commit 44dfd35521b4f94420fb674e00ada395fab7a370 +Author: Enrique J. Hernández Blasco +Date: Tue Mar 3 22:52:42 2015 +0100 + + oc-mail: Set sender on email messages without an orig recipient + + But it has recipients. This is for sure happening with event + invitations messages. + +M NEWS +M OpenChange/MAPIStoreMailVolatileMessage.m + +commit 575600cabc57b29f3161b999389e50497307506e +Author: Enrique J. Hernández Blasco +Date: Mon Mar 2 23:36:28 2015 +0100 + + oc-calendar: Return PidTagContainerClass for Calendar folders + + And it must "IPF.Appointment" as described in [MS-OXOCAL] Section 2.2.11.1 + +M OpenChange/MAPIStoreCalendarFolder.m + +commit cd47c926c92c29c7ee63c3990417883d60be2be7 +Author: Julio García +Date: Mon Mar 2 10:12:20 2015 +0100 + + Update news for next release + +M NEWS + +commit ef6aab63c900f7fe3d6ee2b00c540a4e54e3b286 +Author: Javier Amor García +Date: Mon Feb 23 15:21:16 2015 +0100 + + oc-calendar: Don't change event recurrence if parse failed. + + get_AppointmentRecurrencePattern() can fail to parse the input data, added a check to avoid setup the recurrence pattern in that case. This should only happen when input data is incorrect. + +M OpenChange/iCalEvent+MAPIStore.m + commit df59b73a221467523c18c56493c13c86003d7271 Author: Ludovic Marcotte Date: Thu Feb 26 17:56:42 2015 -0500 @@ -349,6 +2098,18 @@ Date: Wed Feb 25 08:42:18 2015 -0500 M NEWS +commit 22196e0054f9040ba33557e693701afc9ee16ec2 +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 8d21bc3e36014d63db0e37bf7121d81c8200b5e1 Author: Jesús García Sáez Date: Wed Feb 25 12:01:31 2015 +0100 @@ -361,6 +2122,99 @@ Date: Wed Feb 25 12:01:31 2015 +0100 M SoObjects/SOGo/SOGoUserManager.m +commit 4c3c741d9f6b05eb67c0bb1c454b5f9027682493 +Author: Juan Vallés +Date: Mon Feb 23 14:45:16 2015 +0100 + + oc-contacts: Save missing contact properties in database + +M OpenChange/MAPIStoreContactsMessage.m + +commit 731934f0618c17760bd6c2cac53e9d97d485914c +Author: Jesús García Sáez +Date: Thu Feb 19 15:00:27 2015 +0100 + + oc: Add fai properties for custom views + + Without this outlook clients with custom views set on folders will + crash because this are needed properties and were not being saved + +M OpenChange/MAPIStoreDBMessage.m + +commit 9b847a276c5bf442a67975078d13c028a112a579 +Author: Enrique J. Hernández Blasco +Date: Sun Feb 15 23:52:06 2015 +0100 + + oc-calendar: Implement categories to share the colour + + See [MS-OXCICAL] Section 2.1.3.1.1.20.3 for details. + + It requires https://github.com/openchange/openchange/pull/216 to retrieve + the value from MAPI client + +M OpenChange/MAPIStoreAppointmentWrapper.m +M OpenChange/iCalEvent+MAPIStore.m + +commit 624967c60b5d4c2bb23051f6995e323163f0c12d +Author: Enrique J. Hernández Blasco +Date: Sun Feb 15 18:44:47 2015 +0100 + + oc-calendar: Implement PidTagSensitivity + + As described in [MS-OXCICAL] Section 2.1.3.11.20.4 by using + access CLASS iCal field. + + Although Outlook does not support confidential level, it is properly + exported and imported. + +M OpenChange/MAPIStoreAppointmentWrapper.m +M OpenChange/MAPIStoreCalendarMessage.m +M OpenChange/MAPIStoreMessage.m +M OpenChange/iCalEvent+MAPIStore.m + +commit e6ba15bbae0633bf4a8bbd327a1578217cb2128f +Author: Enrique J. Hernández Blasco +Date: Sun Feb 15 18:41:03 2015 +0100 + + oc-calendar: PidTagImportance and PidTagNormalizedSubject working + + It wasn't being called because the proxy (AppointmentWrapper) is not + being called as there is a base implementation for these properties + in MAPIStoreMessage making them impossible to be shared between + Outlook profiles. + +M OpenChange/MAPIStoreCalendarMessage.m + +commit 2a1b363feedf77f1bcc1c848d8468d93817d7023 +Author: Enrique J. Hernández Blasco +Date: Sun Feb 15 18:39:43 2015 +0100 + + oc-calendar: Proper getter for AppointmentWrapper proxy object + + Do not assume it is in 0 position any longer + +M OpenChange/MAPIStoreCalendarMessage.m + +commit eaec3c061074ff7bf42bc54569acb8f066243a9e +Author: Enrique J. Hernández Blasco +Date: Sun Feb 15 18:38:59 2015 +0100 + + oc-calendar: Remove useless method + + Better off implemented by AppointmentWrapper proxy + +M OpenChange/MAPIStoreCalendarMessage.m + +commit d3a4b497c69c39de6130cd5861d0f43e5a91614e +Author: Enrique J. Hernández Blasco +Date: Sun Feb 15 18:34:28 2015 +0100 + + oc-calendar: Remove commented code + + Available at MAPIStoreAppointmentWrapper class + +M OpenChange/MAPIStoreCalendarMessage.m + commit b26ea30b1b794e983ea272b5de713b0205fda0d8 Author: Ludovic Marcotte Date: Thu Feb 12 11:06:57 2015 -0500 @@ -503,6 +2357,19 @@ Date: Wed Feb 11 08:31:32 2015 -0500 M ActiveSync/SOGoMailObject+ActiveSync.m +commit 68ebc9e0ff64f1baebbd9f5adbd38cfd1fcf0b76 +Author: Enrique J. Hernández Blasco +Date: Tue Feb 10 23:34:51 2015 +0100 + + oc: Use dlinklist from samba for now + + Due to https://github.com/openchange/openchange/pull/204. + + Until it is published by OC or dismissed. + +M OpenChange/MAPIStoreContext.m +M OpenChange/MAPIStoreFallbackContext.m + commit 6cf1ec998e33990e77725b9c84bb3ba7ec34dcbc Author: Ludovic Marcotte Date: Tue Feb 10 07:09:31 2015 -0500 @@ -531,6 +2398,42 @@ Date: Mon Feb 9 09:10:55 2015 -0500 M Documentation/SOGoInstallationGuide.asciidoc +commit 96986812f458922f012ccb7af3f149266d6ea93a +Author: Enrique J. Hernández Blasco +Date: Sat Feb 7 00:22:45 2015 +0100 + + oc-mail: Set content type for a message after upgrading sope 2.2.15 + + Now that message headers can be set dynamically, we can + set the body-related headers using `setHeader` selector. + + This fixes emails sent using this sope version are all in plain text. + +M OpenChange/MAPIStoreMailVolatileMessage.m + +commit 142deeb5f0ed97cbc78f7641a7c5141d30aefd70 +Author: Enrique J. Hernández Blasco +Date: Thu Feb 5 23:49:59 2015 +0100 + + oc: Implement move a DB subfolder to root + + DB folders are Notes and Fallback (Journal, InfoPath Form and Deleted Items). + + By moving the DB path and update the indexing DB. + +M OpenChange/MAPIStoreDBFolder.m + +commit dc8012e3d34c76c2dbc4302361fdf02b6147ead6 +Author: Enrique J. Hernández Blasco +Date: Thu Feb 5 23:48:46 2015 +0100 + + oc-mail: Implement move a mail subfolder to root + + By moving at IMAP level the mailbox and update the indexing DB + and local db path. + +M OpenChange/MAPIStoreMailFolder.m + commit 3731819e1565a6198237218dff078047628b1316 Author: Ludovic Marcotte Date: Thu Feb 5 16:21:27 2015 -0500 @@ -652,6 +2555,63 @@ M ActiveSync/SOGoActiveSyncDispatcher+Sync.m M ActiveSync/SOGoActiveSyncDispatcher.m M NEWS +commit 5258ee2e76e85d053917fb52f1c1954a162e54de +Author: Jesús García Sáez +Date: Tue Jan 27 19:07:26 2015 +0100 + + oc-appointments: ignore alarms already triggered + +M OpenChange/MAPIStoreAppointmentWrapper.m + +commit 57d591c427b2d7897bcd57717545d6aea2084381 +Author: Enrique J. Hernández Blasco +Date: Wed Jan 28 11:26:56 2015 +0100 + + oc: Set right container in dbFolder when moving a folder + + The path attribute from SOGoCacheGCSFolder is properly updated + in the database but not when returning from path message as + the container is the old one. + +M OpenChange/MAPIStoreDBFolder.m +M OpenChange/MAPIStoreMailFolder.m +M SoObjects/SOGo/SOGoCacheGCSFolder.h +M SoObjects/SOGo/SOGoCacheGCSFolder.m +M SoObjects/SOGo/SOGoObject.h + +commit b01de763dafde3d8b7f083b53814ba9a074b4541 +Author: Enrique J. Hernández Blasco +Date: Tue Jan 27 18:27:11 2015 +0100 + + oc: Move back and forth folders now are in sync + + Two different indexing entries were created on move operation making + impossible to restore old folder position in the original parent folder. + This was due to cleanupCaches message calls to objectId which requires + to have the indexing entry available. + + Use case: + + * Restore a folder from "Deleted items" folders + +M OpenChange/MAPIStoreFolder.m + +commit 0e8bf0d2390c848154de4f9c9fa864b7c4b03002 +Author: Enrique J. Hernández Blasco +Date: Mon Jan 26 15:55:22 2015 +0100 + + oc-mail: Move mail folders with reserved chars + + The URL was incorrectly set when any of ;/?:@&=+$,# was used + in the folder name. + + We have to mimetise what it is done in createFolder message selector. + That is, perform the IMAP4 encoding + URL encoding without CSS + encoding. The IMAP4 + CSS encoding (without URL encoding) is used to store the folder + in SOGo and OpenChange Indexing database as we do right now. + +M OpenChange/MAPIStoreMailFolder.m + commit 086361b79a8be7722d8ae476140858067bb06c2a Author: Ludovic Marcotte Date: Fri Jan 23 16:16:36 2015 -0500 @@ -675,6 +2635,48 @@ M SoObjects/SOGo/SOGoMailer.m M SoObjects/SOGo/SOGoSieveManager.m M SoObjects/SOGo/SOGoWebDAVAclManager.m +commit 312084243b664932f55457738b30bc345457f5a4 +Author: Jesús García Sáez +Date: Fri Jan 23 18:19:24 2015 +0100 + + oc: improve modseqFromMessageChangeNumber to return an approximation. + + Only for scenarios where we hadn't store the cn <-> modseq relationship + +M OpenChange/MAPIStoreMailFolder.m + +commit 47be392d4f92c6afb1954244fe52cc4344c2ae1f +Author: Jesús García Sáez +Date: Fri Jan 23 18:18:25 2015 +0100 + + oc: avoid request change number until necessary + + Minor changenumber leak, but avoid it anyway + +M OpenChange/MAPIStoreMailFolder.m + +commit 34efcfee4e4bc593d01efe64c0db2b7e20b1a994 +Author: Jesús García Sáez +Date: Fri Jan 23 18:17:45 2015 +0100 + + oc: synchroniseCache store modseq for last delete change number. + + This will be the more frequent change number used to obtain updates + on the folder related with deleted messages + +M OpenChange/MAPIStoreMailFolder.m + +commit 8e7f6d1aec1ebf05afe3330447cea4cf6797d3a3 +Author: Jesús García Sáez +Date: Fri Jan 23 18:15:44 2015 +0100 + + oc: avoid change number leaking when refreshing folder. + + Everytime a folder where its last operation was delete some email was + requesting change numbers that were not used. + +M OpenChange/MAPIStoreMailFolder.m + commit e2bee230217d16287883fb595d7bfc7ddec0ff77 Author: Ludovic Marcotte Date: Thu Jan 22 16:25:16 2015 -0500 @@ -711,6 +2713,60 @@ M ActiveSync/SOGoActiveSyncDispatcher.m M Main/SOGo.m M Main/sogod.m +commit 99a36be03403ced16f6c3952a4086252fdc3f7e8 +Author: Enrique J. Hernández Blasco +Date: Wed Jan 21 12:44:31 2015 +0100 + + oc: Remove a source folder on move folder operation + + Calling deleteFolder message to actually remove it from DB/IMAP + depending on the class. + +M OpenChange/MAPIStoreFolder.m + +commit 8b44c08a32375b8386b24d518e3fdc0b906ec3cd +Author: Enrique J. Hernández Blasco +Date: Fri Jan 16 00:12:24 2015 +0100 + + oc-calendar: Remove unnecessary shifts on start,end and replace time props + + As the data is sent in UTC, no shifts are longer required. + +M OpenChange/iCalEvent+MAPIStore.m + +commit c893963da592bc56d0d95b7c18e7085907a9fdeb +Author: Enrique J. Hernández Blasco +Date: Fri Jan 16 00:09:01 2015 +0100 + + oc-tasks: Set right start, due and complete dates + + As explained in [MS-OXOTASK], we have to shift the given date + to store the right point in time with the correct timezone. + +M OpenChange/MAPIStoreTasksMessage.m + +commit c6b976a83077b94b043d38b4e1bb7c16ccbc1898 +Author: Enrique J. Hernández Blasco +Date: Fri Jan 16 00:06:11 2015 +0100 + + oc-mail: Remove unnecessary time shift in date for new mails + + The MIME type can store the date in UTC and the clients are + responsible on showing correctly to the client as it does. + +M OpenChange/MAPIStoreMailVolatileMessage.m + +commit d5d97db8e8d64ddbc0797325ce023723fd1227bb +Author: Enrique J. Hernández Blasco +Date: Fri Jan 16 00:02:01 2015 +0100 + + oc: PT_SYSTIME is an absolute timestamp + + As the epoch is in UTC timezone, we set this timezone for NSCalendarDate. + +M OpenChange/MAPIStoreObject.m +M OpenChange/MAPIStoreTypes.m + commit d98ff69fbee723ae268b0cb0836c8dca75394743 Author: Ludovic Marcotte Date: Tue Jan 20 08:35:10 2015 -0500 @@ -732,6 +2788,31 @@ Date: Mon Jan 19 13:54:04 2015 -0500 M Documentation/SOGoInstallationGuide.asciidoc M UI/MainUI/SOGoUserHomePage.m +commit 00cef845b75ec2859e412a63a1a97fecfe21463d +Author: Carlos Pérez-Aradros Herce +Date: Mon Jan 19 19:04:06 2015 +0100 + + Restore multitenancy changes for OpenChange + +M OpenChange/MAPIStoreFallbackContext.m +M OpenChange/MAPIStoreGCSBaseContext.m +M OpenChange/MAPIStoreMailContext.m +M OpenChange/MAPIStoreNotesContext.m +M OpenChange/MAPIStoreSOGo.m + +commit f9550b91812248b12657943fd81d3524399eb4ae +Author: Jesús García Sáez +Date: Mon Jan 19 15:35:44 2015 +0100 + + oc: several uninitialized variables + +M OpenChange/MAPIStoreDBFolder.m +M OpenChange/MAPIStoreFolder.m +M OpenChange/MAPIStoreMailFolder.m +M OpenChange/MAPIStoreMessage.m +M OpenChange/MAPIStoreObject.m +M OpenChange/RTFHandler.m + commit 3e59b1ad6eb4dcca87b75fc478931bb9a404900e Author: Ludovic Marcotte Date: Fri Jan 16 12:55:38 2015 -0500 @@ -748,6 +2829,17 @@ Date: Fri Jan 16 09:18:37 2015 -0500 M SOPE/NGCards/iCalTimeZonePeriod.m +commit b35fee8efc206b92d55c30757005df484f764cbf +Author: Enrique J. Hernández Blasco +Date: Fri Jan 16 01:34:16 2015 +0100 + + oc-contacts: Implement Wedding Anniversary + + As specified by Microsoft using x-ms-anniversary custom vcard element + [MS-OXVCARD] Section 2.1.3.9.6 + +M OpenChange/MAPIStoreContactsMessage.m + commit e9e3dd5646cdf004896f350e35fddd661463f029 Author: Ludovic Marcotte Date: Thu Jan 15 15:29:02 2015 -0500 @@ -767,6 +2859,22 @@ Date: Thu Jan 15 11:55:04 2015 -0500 M ActiveSync/SOGoActiveSyncDispatcher+Sync.m M NEWS +commit 7e7d302165061964a8730e5b42f1ef5c27a20465 +Author: Jesús García Sáez +Date: Thu Jan 15 13:50:26 2015 +0100 + + oc: warning if codepage not found from headerCharset + +M OpenChange/MAPIStoreMailMessage.m + +commit d052356724fdde9a5b1777e81edceb5e0a794696 +Author: Jesús García Sáez +Date: Thu Jan 15 13:27:37 2015 +0100 + + oc: encoding names must be case insensitive + +M OpenChange/Codepages.m + commit d87056ebfadff870518d032a0fbbd52d5c6d0a88 Author: Ludovic Marcotte Date: Mon Jan 12 14:38:55 2015 -0500 @@ -918,6 +3026,18 @@ M ActiveSync/iCalEvent+ActiveSync.m M ActiveSync/iCalToDo+ActiveSync.m M NEWS +commit 838ae8995ff592d4526194a37c8f5554082cbca6 +Author: Jesús García Sáez +Date: Mon Dec 29 19:20:16 2014 +0100 + + oc: ignore unhandled properties instead of abort + + When setting a row with properties not handled right now, ignore them + like they were never there instead of abort() + +M OpenChange/MAPIStoreObject.m +M OpenChange/MAPIStoreTypes.m + commit a0c1ce8f3b7c22002661d40c24e95a1233b6a6e8 Author: Ludovic Marcotte Date: Mon Dec 29 12:43:20 2014 -0500 @@ -947,6 +3067,14 @@ M SoObjects/Appointments/SOGoAppointmentFolder.m M SoObjects/SOGo/SOGoFolder.h M SoObjects/SOGo/SOGoFolder.m +commit 501ee7976664629616089cf88b9f779c6c9fe75e +Author: Jesús García Sáez +Date: Tue Dec 23 10:59:01 2014 +0100 + + oc-rtf: fix parse \pict tag with \bin data + +M OpenChange/RTFHandler.m + commit 255bcbe92fa6b4610edf5f4d05c97b74537ecb6e Author: Ludovic Marcotte Date: Mon Dec 22 19:59:33 2014 -0500 @@ -967,6 +3095,25 @@ Date: Mon Dec 22 19:32:17 2014 -0500 M SoObjects/SOGo/NSObject+Utilities.h M SoObjects/SOGo/NSObject+Utilities.m +commit a56fc93a9afbeaf2323296d2843be0ca9aa80238 +Author: Enrique J. Hernández Blasco +Date: Tue Dec 23 00:54:16 2014 +0100 + + oc: Guess recipients from some properties while importing PST + + This is happening when importing a PST file. + + From -> PidTagSenderEntryId + To -> PidTagOriginalDisplayTo + CC -> PidTagOriginalDisplayCc + + The tested EntryID are the local users and OneOffEntries + when the users are not from the directory. + + It requires https://github.com/openchange/openchange/pull/175 to work. + +M OpenChange/MAPIStoreMailVolatileMessage.m + commit 24a934275f5678f7ab86cb706aa817dfb5ef8991 Author: Ludovic Marcotte Date: Mon Dec 22 16:12:26 2014 -0500 @@ -1130,6 +3277,23 @@ Date: Wed Dec 17 13:57:49 2014 -0500 M NEWS M SoObjects/Appointments/SOGoAppointmentFolder.m +commit dba17fbcbcd3c8725385df5273911499a6321bdd +Author: Enrique J. Hernández Blasco +Date: Tue Dec 16 23:39:42 2014 +0100 + + Create child folder objects using parent context for real + + We activate the user for the context using the root folder + context as there are times where the active user is not + matching with the one stored in the application context + and SOGo object is storing cached data with the wrong user + leading to create folders in wrong mailboxes, etc. + + As this application is single-threaded, no problems are expected. + Indeed, the same code is available at getting the root folder (ie INBOX). + +M OpenChange/MAPIStoreFolder.m + commit 6027cb50d4d1d351935ef924d957d5876e73d026 Author: Francis Lachapelle Date: Tue Dec 16 16:13:59 2014 -0500 @@ -1558,6 +3722,32 @@ Date: Tue Dec 2 19:33:54 2014 -0500 M SoObjects/SOGo/SOGoSAML2Metadata.xml +commit 067809ef1c314becd908a0af48edc8a4a3aabcba +Author: Enrique J. Hernández Blasco +Date: Mon Dec 1 23:19:38 2014 +0100 + + Store changeNumber maps with modseq in cache for subfolders + + By getting the root folder/container whose properties + are stored in OpenChange DB. + + This makes the synchronisation of sub-folders faster as + when we evaluate restrictions for this folder, we are able + to get the modseq from where to get the latest messages + unseen by the client. + +M OpenChange/MAPIStoreFolder.h +M OpenChange/MAPIStoreFolder.m +M OpenChange/MAPIStoreMailFolder.m + +commit 97201c56a45ac51ea744fe85ca4e875a87c5fe68 +Author: Jesús García Sáez +Date: Mon Dec 1 10:47:16 2014 +0100 + + abort if attemp to sync an UID in setChangekey fails + +M OpenChange/MAPIStoreMailFolder.m + commit 9ffa32eebdcc5d3b102aa4d86a93590684800cdc Author: Ludovic Marcotte Date: Sun Nov 30 17:35:39 2014 -0500 @@ -1570,6 +3760,53 @@ M packaging/debian/control M packaging/debian/control-squeeze M packaging/debian/rules +commit 7691d616a9ff46d4540d1a0c5a0ecbf64b3ecad2 +Author: Enrique J. Hernández Blasco +Date: Sat Nov 29 08:07:41 2014 +0100 + + Attempt to sync an UID in setChangeKey to avoid crashing + + This may happen if between sync cache and setChangeKey a modSeq + is making synchroniseCache not retrieve the newly stored message. + + This should fix the following crash: + + https://tracker.zentyal.org/issues/2673 + +M OpenChange/MAPIStoreMailFolder.m + +commit 2c6d833c118d26d13d9689f371008043bf510cb1 +Author: Enrique J. Hernández Blasco +Date: Thu Nov 27 17:13:02 2014 +0100 + + Remove an attempt to double free content + + As content is freed by resetExceptResult message received by reset + which has been called by dealloc as well + +M SOPE/NGCards/NGCardsSaxHandler.m + +commit f4e15e2db8fdda0ff6d94d1690e35ebab1d334a4 +Author: Enrique J. Hernández Blasco +Date: Wed Nov 26 09:20:45 2014 +0100 + + Fix memory leak on getPidTagSubject + + Valgrind crafted report: + + =40967== 128,927 (53,750 direct, 75,177 indirect) bytes in 383 blocks are definitely lost in loss record 10,104 of 10,179 + ==40967== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) + ==40967== by 0x86EDE3D: talloc_strndup (talloc.c:613) + ==40967== by 0x34D2BB9E: _i_NSString_MAPIStoreDataTypes_asUnicodeInMemCtx_ (in /usr/lib/GNUstep/SOGo/SOGoBackend.MAPIStore/SOGoBackend) + ==40967== by 0x34D2025B: _i_MAPIStoreMailMessage__getPidTagNormalizedSubject_inMemCtx_ (in /usr/lib/GNUstep/SOGo/SOGoBackend.MAPIStore/SOGoBackend) + ==40967== by 0x34CFCD40: _i_MAPIStoreObject__getProperty_withTag_inMemCtx_ (in /usr/lib/GNUstep/SOGo/SOGoBackend.MAPIStore/SOGoBackend) + ==40967== by 0x34CFBE21: _i_MAPIStoreMessage__getPidTagSubject_inMemCtx_ (in /usr/lib/GNUstep/SOGo/SOGoBackend.MAPIStore/SOGoBackend) + ==40967== by 0x34CFBEB6: _i_MAPIStoreMessage__getPidTagOriginalSubject_inMemCtx_ (in /usr/lib/GNUstep/SOGo/SOGoBackend.MAPIStore/SOGoBackend) + ==40967== by 0x34CFCD40: _i_MAPIStoreObject__getProperty_withTag_inMemCtx_ (in /usr/lib/GNUstep/SOGo/SOGoBackend.MAPIStore/SOGoBackend) + ==40967== by 0x34CFD07E: _i_MAPIStoreObject__getProperties_withTags_andCount_inMemCtx_ (in /usr/lib/GNUstep/SOGo/SOGoBackend.MAPIStore/SOGoBackend) + +M OpenChange/MAPIStoreMessage.m + commit 1b715e0812dba3d9f2c4d3f2daa0cbd4313f8def Author: Ludovic Marcotte Date: Thu Nov 27 11:37:08 2014 -0500 @@ -1790,6 +4027,464 @@ Date: Wed Nov 19 12:06:44 2014 -0500 M Documentation/SOGoNativeOutlookConfigurationGuide.asciidoc +commit a8b716fbaa87f617781565963ecd3594fe455475 +Author: Enrique J. Hernández Blasco +Date: Wed Nov 19 00:23:16 2014 +0100 + + oc: sync old messages as last resort if there are not in cache + + This is happening when the lastModSeq is greater than the modseq + from an old message and that message is not in cache. + + This is used as last resort before crashing and it is only used + in objectVersion as it is the first place to call on sync. Other + related properties would work. + +M OpenChange/MAPIStoreMailFolder.h +M OpenChange/MAPIStoreMailFolder.m +M OpenChange/MAPIStoreMailMessage.m + +commit ef7b919175636b9c15c2a7f48a97925f26a280bb +Author: Enrique J. Hernández Blasco +Date: Wed Nov 12 16:21:44 2014 +0100 + + Return MAPISTORE_ERR_NOT_FOUND when a mail is indexed but not in IMAP server + + And remove that entry from the indexing table. + + This avoids to crash getting properties from a no longer available message + in the IMAP server, for instance, the `PidTagPredecessorChangeList` attribute. + +M OpenChange/MAPIStoreFolder.m + +commit 973ab78761453a24bac1f19b417f8c7c5e851f81 +Author: Jesús García Sáez +Date: Thu Nov 6 17:42:45 2014 +0100 + + oc: synchronize folders ChangeNumber <-> modseq + +M OpenChange/MAPIStoreMailFolder.h +M OpenChange/MAPIStoreMailFolder.m + +commit c4b0ac209b3913897c9d59b5d04d12d46df9e1a8 +Author: Jesús García Sáez +Date: Fri Oct 24 12:38:11 2014 +0200 + + NSString:objectFromJSONString now can parse single values + + Like null => [NSNull null] + +M SoObjects/SOGo/NSString+Utilities.m + +commit 41320a4813e232b02780eea42792b108c7f4bf3f +Author: Jesús García Sáez +Date: Thu Oct 23 12:47:43 2014 +0200 + + oc: NGImap4Connection:fetchUids changed error messages + +M OpenChange/NGImap4Connection+Monkeypatching.m + +commit c410a9fc3ff7694d179e69e5d9a904396f0ab07e +Author: Jesús García Sáez +Date: Wed Oct 22 19:21:17 2014 +0200 + + oc: NGImap4Connection:fetchUids don't delete RawResponse + +M OpenChange/NGImap4Connection+Monkeypatching.h +M OpenChange/NGImap4Connection+Monkeypatching.m + +commit 24e35103ff0a5094f81b9f241cb8164293ac7b83 +Author: Jesús García Sáez +Date: Wed Oct 22 15:01:41 2014 +0200 + + oc: monkeypatched NGImap4Connection class from sope + + To improve fetchUids method so we can retrieve uids in batches. + Otherwise we will face an error 'too long request' kind + +M OpenChange/GNUmakefile +A OpenChange/NGImap4Connection+Monkeypatching.h +A OpenChange/NGImap4Connection+Monkeypatching.m + +commit 616f2abbb218c1dc9417162d4b95b2a1c4269660 +Author: Enrique J. Hernández Blasco +Date: Mon Oct 20 11:47:46 2014 +0200 + + Fix compilation when samba file is not others readable + + This happens when any smb.conf or included file is not others readable, + thus we are fallbacking to the default installation path. + +M OpenChange/GNUmakefile + +commit 3910769ae86d6a58c44702ef4c09bf88c4912914 +Author: Enrique J. Hernández Blasco +Date: Wed Oct 15 00:39:49 2014 +0200 + + oc-folder: Uniform call to deleteMessageWithMID + + To make sure flags argument is used accordingly with the specs + and not working by chance. + +M OpenChange/MAPIStoreFolder.m + +commit b67e1deda55ffc702d090629587f8a85b5967d8a +Author: Enrique J. Hernández Blasco +Date: Wed Oct 15 00:35:17 2014 +0200 + + oc-folder: Make deleted items synched when shared + + By keeping mid on moving messages by soft deleting and + only if srcMid is different from targetMid. + + This makes restore/shared deleted items work. + + It also requires to do the following to work smoothly: + + * Do not add soft-deleted messages in ensureIDsForChildKeys + * Return soft-deleted messages on getDeletedFMIDs + * Do not register a new mid if the URL is matched with soft deleted messages + +M OpenChange/MAPIStoreFolder.m +M OpenChange/MAPIStoreMapping.h +M OpenChange/MAPIStoreMapping.m + +commit 35ca313c37c2efbf99c62a81b1ef8b5564e74884 +Author: Enrique J. Hernández Blasco +Date: Thu Oct 16 16:29:23 2014 +0200 + + oc-calendar: Fix PidLidClipStart on recurrent events + + The midnight value must be in user's timezone and returned back in UTC. + +M OpenChange/MAPIStoreAppointmentWrapper.m + +commit c631689975a4532abc4f3d184ad199d15f29bd6b +Author: Enrique J. Hernández Blasco +Date: Thu Oct 16 16:26:57 2014 +0200 + + oc-calendar: getPidLidClipEnd now follows [MS-OXOCAL] + + On recurrent events when there is no end, the time to set is + 31 August 4500, 11:59 P.M ([MS-OXOCAL] Section 2.2.1.15) + +M OpenChange/MAPIStoreAppointmentWrapper.m + +commit cd64ca199a9846d9dc9a36a99fac39285303b9c3 +Author: Enrique J. Hernández Blasco +Date: Thu Oct 16 16:11:43 2014 +0200 + + oc-calendar: wDay field cannot be negative + + Furthermore, [MS-OXOCAL] Section 2.2.1.41.1 indicates: + + The wDay field is set to indicate + the occurrence of the day of the week within the month + (1 to 5, where 5 indicates the final occurrence during + the month if that day of the week does not occur 5 times). + + [rule firstOccurrence] may return negative values according to iCal spec for + recurrent rules iCal 4.8.5.4 Recurrence Rule. For instance, for defining + a timezone whose recurrent rule is done using this rule: + + RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU + + This fixes the problem when editing a recurrent appointment in + Outlook were incorrectly shifted when SOGo provides back the event. + +M OpenChange/iCalTimeZone+MAPIStore.m + +commit be60fdebcc1e92ab13ce93dcc019457e5c4d7722 +Author: Enrique J. Hernández Blasco +Date: Tue Oct 14 23:48:36 2014 +0200 + + oc-folder: Flags are now used in indexing db when deleting a msg + + Unregistering the URL in indexing db accordingly to the flags (SOFT or HARD) + +M OpenChange/MAPIStoreFolder.m +M OpenChange/MAPIStoreMapping.h +M OpenChange/MAPIStoreMapping.m + +commit d076e04ad47c8938531450af9f002552328f8fa1 +Author: Enrique J. Hernández Blasco +Date: Tue Oct 7 12:37:23 2014 +0200 + + oc-mailfolder: Get seen flag directly from message in preloading + + To avoid a loop and a server-call. + + We are not using body.peek[text] directly because bodyContentPart message + is explicitly avoiding it. + +M OpenChange/MAPIStoreMailFolder.m +M OpenChange/MAPIStoreMailMessage.h +M OpenChange/MAPIStoreMailMessage.m + +commit 7e0cddc06bc520c8eefe1b9190e92443853a15bc +Author: Enrique J. Hernández Blasco +Date: Tue Oct 7 00:51:45 2014 +0200 + + oc-mailfolder: Avoid setting seen flag on preloading message bodies + + Fetching a body[text] property using IMAP makes IMAP server set seen flag. + + This commit fetches the flag beforehand to restore the previous state + once the body has been fetched. + +M OpenChange/MAPIStoreMailFolder.m + +commit 258444bb93b974825c428ef45db58e288d742f18 +Author: Enrique J. Hernández Blasco +Date: Sat Oct 4 00:58:13 2014 +0200 + + oc-rtf: Be more resilient to spaces while parsing font tables + + This avoids to crash on this example: + + \f0\fibi \fcharset0 + -------^ + + Or: + + \f0 \fibi\fcharset0 + --^ + + Take into account that I found lots of RTF documents with this format: + + \f0\fbidi \froman\fcharset0 + \f0\froman\fprq2 \fcharset0 + + Which are not unsupported by this handler. + +M OpenChange/RTFHandler.m + +commit 75ce59d010c92a89453136300ec2c5f9c8e42c8a +Author: Enrique J. Hernández Blasco +Date: Fri Oct 3 23:23:01 2014 +0200 + + oc-rtf: Fix current position to match where _bytes pointer is + + This avoids to have extra unknown bytes at the end of the RTF document + as _len would have been reached but _current_pos had incorrect less value. + +M OpenChange/RTFHandler.m + +commit cbfcd548581849ede2d6bbd0edbe580300f5d4af +Author: Enrique J. Hernández Blasco +Date: Fri Sep 19 16:51:26 2014 +0200 + + oc-rtf: Use what RTF Spec 1.9.1 for control words + + This reverts 7581c0a. + +M OpenChange/RTFHandler.m + +commit 415fb6034e76dc666970070b9ac437bf4e1e9834 +Author: Enrique J. Hernández Blasco +Date: Thu Sep 18 10:23:51 2014 +0200 + + oc-calendar: Retrieve properly event description created on SOGo + + As it is stored as plain text without triming string. + + The correct comparison here is NSNotFound as stated in Apple documentation. + +M OpenChange/MAPIStoreAppointmentWrapper.m + +commit 445a1fb2d6b6eb24d4fb04c2610e517247d7f47f +Author: Jesús García Sáez +Date: Thu Oct 2 17:40:12 2014 +0200 + + oc: MailMessages return correct codepage + +A OpenChange/Codepages.h +A OpenChange/Codepages.m +M OpenChange/GNUmakefile +M OpenChange/MAPIStoreMailMessage.m +M OpenChange/MAPIStoreMailVolatileMessage.m + +commit c866bce8e8b0ff4540571b58d580244ecff5b2e0 +Author: Enrique J. Hernández Blasco +Date: Sat Sep 27 18:04:45 2014 +0200 + + Store FreeBusySimple and FreeBusyDetailed rights as roles + + Map: FreeBusySimple -> PublicDAndTViewer + FreeBusyDetailed -> ConfidentialDAndTViewer + + Although SOGo is not really used AFAIK, we can now keep it and + keep Calendar permission issues consistent. + +M OpenChange/MAPIStoreCalendarFolder.m + +commit ed4ca3bd1b2cba344892cf80fc94af288ca15e03 +Author: Jesús García Sáez +Date: Thu Aug 28 04:19:28 2014 +0200 + + oc: add talloc reference to indexing context + + We have a cache with user contexts (objc) which have mapping contexts (objc) + where we store the indexing context (c) which will be freed by openchange + code once the connection is closed. + + Right now all indexing context created for an user are the same, + independently when in time was created or by which connection, etc... + So this is a valid workaround, but this has to be refactored to used the + indexing context of the current connection that is performing the + call to SOGo backend. + +M OpenChange/MAPIStoreMapping.m + +commit bb9764bc6bef8633bdeda51860e4cc0db3ad4e35 +Author: Jesús García Sáez +Date: Thu Aug 28 04:14:06 2014 +0200 + + Revert "oc: cached usercontext updates indexing_context" + + This reverts commit 0750f64b787db088e944756b66fbd0883cf44cbf. + +M OpenChange/MAPIStoreMapping.h +M OpenChange/MAPIStoreMapping.m +M OpenChange/MAPIStoreUserContext.h +M OpenChange/MAPIStoreUserContext.m + +commit 05578bfcb6e753fdce2f0b5d7c4167fe326b4a17 +Author: Jesús García Sáez +Date: Mon Aug 25 18:27:11 2014 +0200 + + oc-rtf: control words can also have a space before next tag + + This was causing to parse a single space as an empty control + word with length 0, which was the source of several crashes. + + Example: + + \f0\fbidi \fcharset0 + --------^ + + font index is 0, font family is bidi but when parsing charset we were + assuming control word was '' instead of 'charset0'. + + This only fixes the crashes, the parseFontTable function works quite + awful right now. + +M OpenChange/RTFHandler.m + +commit a7c2054cce0d3dd1a093d9f369e715b519751d3a +Author: Jesús García Sáez +Date: Fri Aug 22 17:05:49 2014 +0200 + + oc: cached usercontext updates indexing_context + + Instead of use always the one given on initialization + +M OpenChange/MAPIStoreMapping.h +M OpenChange/MAPIStoreMapping.m +M OpenChange/MAPIStoreUserContext.h +M OpenChange/MAPIStoreUserContext.m + +commit 52ad0e0e5b12d88d0d8259284537d360084cfb2a +Author: Julien Kerihuel +Date: Tue Aug 19 22:24:34 2014 +0200 + + Prevent SOGo backend from crashing when mapistore_set_connection_info is + not called beforehand and connInfo is not initialized. + +M OpenChange/MAPIStoreContext.m + +commit dc8b73b12bf8388c0bfce5af652b8e3957461c0c +Author: Kamen Mazdrashki +Date: Mon Aug 4 13:56:30 2014 +0200 + + oc/MailFolder: Add more logging so we can trace invalid message kyes + +M OpenChange/MAPIStoreMailFolder.m + +commit 18acdf20a61e2d865facc6b1798d9a1e75a06440 +Author: Kamen Mazdrashki +Date: Mon Aug 4 13:56:22 2014 +0200 + + oc: Make sure we always use NSString keys in 'messages' dictionary + + Different types for keys in Dictionaries leads to not finding + expected entry - we should make sure that everythime we set/get + entry from a dictionary, key object type is same + +M OpenChange/MAPIStoreMailFolder.m + +commit 0a23f18fc99930246d891f5f059c0d9e0c9b466e +Author: Kamen Mazdrashki +Date: Mon Aug 4 13:55:41 2014 +0200 + + oc: Set log level to 0 in samba-get-config script - it is very chatty during builds + + This script is very "chatty" when "log level" is set to a high number + (usual scenario on developer machine) + +M OpenChange/samba-get-config.py + +commit b8366d796d5628ee821dd3c5c9c855512adfbce8 +Author: Kamen Mazdrashki +Date: Thu Jul 31 12:12:35 2014 +0200 + + oc/util: Tune dbmsgreader for new caching classes names + +M OpenChange/dbmsgreader.m + +commit 5ee8cb3a3fd31e8d445c77e616d8dcb1334fac13 +Author: Jesús García Sáez +Date: Mon Aug 4 10:35:04 2014 +0200 + + oc-rtf: check valid font name when generating tag + +M OpenChange/RTFHandler.m + +commit 4e3a242f2fe32230819eb175b55e62e9934cbf8b +Author: Jesús García Sáez +Date: Thu Jul 31 20:44:14 2014 +0200 + + oc-rtf: Don't crash when we don't know the specified font + +M OpenChange/RTFHandler.m + +commit 68c38e2b5c0958a4ec96b56c2e0c16948fa73307 +Author: Jesús García Sáez +Date: Tue Jul 29 18:51:37 2014 +0200 + + openchange: return proper url for folders with non-ascii chars + + toManyRelationshipKeysWithNamespaces applies asCSSIdentifier function + to the names which are already "Imap4Encoded". So we need to remove the + CSSIdentifier function first and then "Imap4Decode" to get the real name. + + Once we have the real name, to create the url we have to use the same + logic as the function that creates the folder and creates this url for + the first time (this function is createRootSecondaryFolderWithFID) + which is to apply, in this order: + + - asCSSIdentifier + - stringByEncodingImap4FolderName + - stringByAddingPercentEscapesUsingEncoding + +M OpenChange/MAPIStoreMailContext.m + +commit f1d14fdeca522120a5350b30cf958b456fdef613 +Author: Jesús García Sáez +Date: Fri Jun 27 15:40:21 2014 +0200 + + multitenancy: adapt openchangedb_* calls + +M OpenChange/MAPIStoreContext.m + +commit a5550cff18db6f7b17ba3fbb30b0b155f06fa03f +Author: Jesús García Sáez +Date: Fri Jun 20 17:12:26 2014 +0200 + + avoid decode @ from url with username on it + +M OpenChange/MAPIStoreContext.m + commit 95e3c7ca88403003305c2bf32166fdeac45f0005 Author: Ludovic Marcotte Date: Tue Nov 18 18:36:59 2014 -0500 diff --git a/Documentation/docinfo.xml b/Documentation/docinfo.xml index 5a83383db..31fb97f96 100644 --- a/Documentation/docinfo.xml +++ b/Documentation/docinfo.xml @@ -1,7 +1,7 @@ -Version 2.2.17a - March 2015 -for version 2.2.17a -2015-03-26 +Version 2.3.0 - June 2015 +for version 2.3.0 +2015-06-01 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 815d94e72..e3c86ba46 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.17a +:release_version: 2.3.0 // vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab: diff --git a/NEWS b/NEWS index abf1c6cbe..6347e14e4 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,4 @@ -2.3.0 (2015-05-XX) +2.3.0 (2015-06-01) ------------------- New features diff --git a/Version b/Version index e7b91ec62..897c2ddb2 100644 --- a/Version +++ b/Version @@ -3,5 +3,5 @@ # of the executable. MAJOR_VERSION=2 -MINOR_VERSION=2 -SUBMINOR_VERSION=17a +MINOR_VERSION=3 +SUBMINOR_VERSION=0 From f65076defdc21f487ee0db7574261a17e555a317 Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Mon, 1 Jun 2015 11:20:32 -0400 Subject: [PATCH 105/109] Update NEWS file --- NEWS | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 6347e14e4..e59c64b20 100644 --- a/NEWS +++ b/NEWS @@ -8,9 +8,9 @@ Enhancements - improved multipart handling using EAS - added systemd startup script (PR#76) - added Basque translation - thanks to Gorka Gonzalez - - updated Brazilian (Portuguese), Dutch, Norwegian (Bokmal), Polish, Russian, and Spanish (Spain) translations Enhancements + - updated Brazilian (Portuguese), Dutch, Norwegian (Bokmal), Polish, Russian, and Spanish (Spain) translations - sharing request among different Outlook versions (Zentyal) - - improve sync speed from Outlook by non-reprocessing already downloaded unread mails (Zentyal) + - improved sync speed from Outlook by non-reprocessing already downloaded unread mails (Zentyal) - give support to calendar sharing invitations - missing contact fields are now saved and available when sharing it (Office, Profession, Manager's name, Assistant's name, Spouse/Partner, Anniversary) (Zentyal) - appointment color and importance work now between Outlooks (Zentyal) @@ -20,7 +20,7 @@ Enhancements - now able to print event/task's description (new components only) in the list view (#2881) - now possible to log EAS commands using the SOGoEASDebugEnabled system defaults - many improvements to EAS SmartReply/SmartForward commands - - event invitation response mails are now sent + - event invitation response mails from Outlook are now sent - mail subfolders created in WebMail are created when Outlook synchronises - mail root folder created in WebMail (same level INBOX) are created on Outlook logon From 617e6f6454439cde3a41126de35ed47e02815cec Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Mon, 1 Jun 2015 11:56:52 -0400 Subject: [PATCH 106/109] Update NEWS file --- NEWS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index e59c64b20..ec8cf7a00 100644 --- a/NEWS +++ b/NEWS @@ -9,9 +9,9 @@ Enhancements - added systemd startup script (PR#76) - added Basque translation - thanks to Gorka Gonzalez - updated Brazilian (Portuguese), Dutch, Norwegian (Bokmal), Polish, Russian, and Spanish (Spain) translations - - sharing request among different Outlook versions (Zentyal) + - calendar sharing request support among different Outlook versions (Zentyal) - improved sync speed from Outlook by non-reprocessing already downloaded unread mails (Zentyal) - - give support to calendar sharing invitations + - added support for sharing calendar invitations - missing contact fields are now saved and available when sharing it (Office, Profession, Manager's name, Assistant's name, Spouse/Partner, Anniversary) (Zentyal) - appointment color and importance work now between Outlooks (Zentyal) - synchronize events, contacts and tasks in reverse chronological order (Zentyal) From 3dd8bddc0e0e5f8cab3507e36e37f643ea70bea6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20Garc=C3=ADa?= Date: Tue, 2 Jun 2015 12:24:32 +0200 Subject: [PATCH 107/109] Revert "(fix) more fixes and clarifications on the mutli-domain settings" This reverts commit d07df554f3d43078dedd74cefe7a63049992c67f. --- Documentation/SOGoInstallationGuide.asciidoc | 12 ++++-------- SoObjects/SOGo/SOGoUser.m | 5 ++--- SoObjects/SOGo/SOGoUserManager.m | 14 +++++++++++++- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/Documentation/SOGoInstallationGuide.asciidoc b/Documentation/SOGoInstallationGuide.asciidoc index 46980463b..5ecd53450 100644 --- a/Documentation/SOGoInstallationGuide.asciidoc +++ b/Documentation/SOGoInstallationGuide.asciidoc @@ -2136,8 +2136,7 @@ Multi-domains Configuration ~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you want your installation to isolate two groups of users, you must -define a distinct authentication source for each _domain_. Your domain keys -must have the same value as your email domain you want to add. Following is +define a distinct authentication source for each _domain_. Following is the same configuration that now includes two domains (acme.com and coyote.com): @@ -2145,7 +2144,7 @@ coyote.com): { ... domains = { - acme.com = { + acme = { SOGoMailDomain = acme.com; SOGoDraftsFolderName = Drafts; SOGoUserSources = ( @@ -2166,7 +2165,7 @@ coyote.com): } ); }; - coyote.com = { + coyote = { SOGoMailDomain = coyote.com; SOGoIMAPServer = imap.coyote.com; SOGoUserSources = ( @@ -2197,7 +2196,7 @@ domains. [cols="3,47,50a"] |======================================================================= |S |SOGoEnableDomainBasedUID -|Parameter used to enable user identification by domain. Users will be +|Parameter used to activate user identification by domain. Users will be able (without being required) to login using the form `username@domain`, meaning that values of _UIDFieldName_ no longer have to be unique among all domains but only within the same domain. Internally, users will @@ -2719,9 +2718,6 @@ h|2.3.0 This will grow the "participant states" field of calendar quick tables to a larger size and add the the "c_description" column to calendar quick tables. -Moreover, if you are using a multi-domain configuration, make sure the keys for -your domains match the email domains you have defined. - h|2.2.8 |The configuration configuration parameters were renamed: diff --git a/SoObjects/SOGo/SOGoUser.m b/SoObjects/SOGo/SOGoUser.m index fa6459f59..12d028fd3 100644 --- a/SoObjects/SOGo/SOGoUser.m +++ b/SoObjects/SOGo/SOGoUser.m @@ -165,9 +165,8 @@ // The domain is probably appended to the username; // make sure it is defined as a domain in the configuration. domain = [newLogin substringFromIndex: (r.location + r.length)]; - if ([[sd domainIds] containsObject: domain] && - ![sd enableDomainBasedUID]) - newLogin = [newLogin substringToIndex: r.location]; + if (![[sd domainIds] containsObject: domain]) + domain = nil; if (domain != nil && ![sd enableDomainBasedUID]) // Login domains are enabled (SOGoLoginDomains) but not diff --git a/SoObjects/SOGo/SOGoUserManager.m b/SoObjects/SOGo/SOGoUserManager.m index 21cebce2d..6ee3b4d76 100644 --- a/SoObjects/SOGo/SOGoUserManager.m +++ b/SoObjects/SOGo/SOGoUserManager.m @@ -514,9 +514,21 @@ static Class NSNullK; if (r.location != NSNotFound) { + NSArray *allDomains; + int i; + *_domain = [username substringFromIndex: r.location+1]; - if (![[[SOGoSystemDefaults sharedSystemDefaults] domainIds] containsObject: *_domain]) + allDomains = [[dd dictionaryForKey: @"domains"] allValues]; + + for (i = 0; i < [allDomains count]; i++) + { + if ([*_domain isEqualToString: [[allDomains objectAtIndex: i] objectForKey: @"SOGoMailDomain"]]) + break; + } + + // We haven't found one + if (i == [allDomains count]) *_domain = nil; } } From 90e11d76f61dd8855f7c6ddb267feb39bf26bc52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20Garc=C3=ADa?= Date: Tue, 2 Jun 2015 12:24:44 +0200 Subject: [PATCH 108/109] Revert "(fix) more multi-domain fixes and cleanups" This reverts commit ed42d1e26b047e9d074a46a1a60c13a65e2d39de. --- SoObjects/SOGo/SOGoUser.m | 8 ++++---- SoObjects/SOGo/SOGoUserManager.m | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/SoObjects/SOGo/SOGoUser.m b/SoObjects/SOGo/SOGoUser.m index 12d028fd3..c1b0f7603 100644 --- a/SoObjects/SOGo/SOGoUser.m +++ b/SoObjects/SOGo/SOGoUser.m @@ -165,7 +165,9 @@ // The domain is probably appended to the username; // make sure it is defined as a domain in the configuration. domain = [newLogin substringFromIndex: (r.location + r.length)]; - if (![[sd domainIds] containsObject: domain]) + if ([[sd domainIds] containsObject: domain]) + newLogin = [newLogin substringToIndex: r.location]; + else domain = nil; if (domain != nil && ![sd enableDomainBasedUID]) @@ -197,9 +199,7 @@ // [SOGoUser loginInDomain] only returns the login. r = [realUID rangeOfString: domain options: NSBackwardsSearch|NSCaseInsensitiveSearch]; - // Do NOT strip @domain.com if SOGoEnableDomainBasedUID is enabled since - // the real login most likely is the email address. - if (r.location != NSNotFound && ![sd enableDomainBasedUID]) + if (r.location != NSNotFound) uid = [realUID substringToIndex: r.location-1]; else uid = [NSString stringWithString: realUID]; diff --git a/SoObjects/SOGo/SOGoUserManager.m b/SoObjects/SOGo/SOGoUserManager.m index 6ee3b4d76..cfc159c3c 100644 --- a/SoObjects/SOGo/SOGoUserManager.m +++ b/SoObjects/SOGo/SOGoUserManager.m @@ -912,7 +912,7 @@ static Class NSNullK; { // Remove the "@" prefix used to identified groups in the ACL tables. aUID = [uid hasPrefix: @"@"] ? [uid substringFromIndex: 1] : uid; - if (domain && [aUID rangeOfString: @"@"].location == NSNotFound) + if (domain) cacheUid = [NSString stringWithFormat: @"%@@%@", aUID, domain]; else cacheUid = aUID; From 96d88de564f36e45bf9d82258c1378b881532b7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20Garc=C3=ADa?= Date: Tue, 2 Jun 2015 12:24:56 +0200 Subject: [PATCH 109/109] Revert "Fixed mess regarding uid/realUID" This reverts commit 4f303f8aa26046ecae916c457839d84622b260bb. --- SoObjects/SOGo/SOGoUser.m | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/SoObjects/SOGo/SOGoUser.m b/SoObjects/SOGo/SOGoUser.m index c1b0f7603..91d3b1b5a 100644 --- a/SoObjects/SOGo/SOGoUser.m +++ b/SoObjects/SOGo/SOGoUser.m @@ -197,12 +197,8 @@ // When the user is associated to a domain, the [SOGoUser login] // method returns the combination login@domain while // [SOGoUser loginInDomain] only returns the login. - r = [realUID rangeOfString: domain options: NSBackwardsSearch|NSCaseInsensitiveSearch]; - - if (r.location != NSNotFound) - uid = [realUID substringToIndex: r.location-1]; - else - uid = [NSString stringWithString: realUID]; + uid = [NSString stringWithString: realUID]; + realUID = [NSString stringWithFormat: @"%@@%@", realUID, domain]; } }