Compare commits

...
913 Commits
Author SHA1 Message Date
Ludovic Marcotte dd9b5e18b6 Updates for the release 2015-07-23 11:51:36 -04:00
Francis Lachapelle 5c017c19fc Update Spanish (Argentina) translation 2015-07-23 11:49:07 -04:00
Francis Lachapelle dec152e8e5 Update CKEditor to version 4.5.1 2015-07-23 11:48:51 -04:00
Francis Lachapelle 4922e6004d Add missing templates for Basque language 2015-07-23 11:14:11 -04:00
Francis Lachapelle b91972d1dc Add missing template for Slovenian language 2015-07-23 11:14:09 -04:00
Francis Lachapelle 5c3cdda186 Add Chinese (Taiwan) translation 2015-07-23 11:14:08 -04:00
Ludovic Marcotte 4b19e64071 (fix) fallback to utf-8/latin1 in rare decoding error cases - this is ugly 2015-07-23 10:22:36 -04:00
Francis Lachapelle b6dee056ca (fix) Return value of [iCalPerson+SOGo uidInDomain:] 2015-07-23 08:46:08 -04:00
Francis Lachapelle 6830d6d930 Calendar module optimizations in multidomain setup 2015-07-22 17:23:02 -04:00
Francis Lachapelle 366ad44cd1 Fix .wod files for English and Basque 2015-07-22 17:22:26 -04:00
Francis Lachapelle 9430f40101 Add Slovenian translation 2015-07-22 17:22:26 -04:00
Ludovic Marcotte b7c2d8ae95 (fix) we now respect the cr/lf in event's description (#3228) 2015-07-22 14:49:09 -04:00
Ludovic Marcotte f03e7a6604 (doc) ModuleConstraints for EAS 2015-07-22 11:54:50 -04:00
Ludovic Marcotte 4e7a3ce5fa (fix) fixed EAS conversation ID issues on BB10 (#3152) 2015-07-22 10:26:09 -04:00
Ludovic Marcotte 61c542cb95 (fix) make sure ActiveSync is always usable with SQL-based auth sources 2015-07-22 10:12:47 -04:00
Ludovic Marcotte d2640e1501 (fix) fixed computation of GlobalObjectId (#3235) 2015-07-22 09:59:36 -04:00
Ludovic Marcotte 20b91cc7bf (fix) improved EAS email flagging handling (#3140) 2015-07-22 09:46:06 -04:00
Ludovic Marcotte b05f7a5beb (fix) compilation warning 2015-07-22 09:25:29 -04:00
Ludovic Marcotte 3a61b7bae4 Android EAS Lollipop fixes (#3268 and #3269) 2015-07-22 09:15:34 -04:00
Ludovic Marcotte 7c6c78d13b Updated NEWS file regarding PR from Zentyal folks 2015-07-19 13:37:08 -04:00
extrafu 7db109525d Merge pull request #90 from Zentyal/master
Latest changes for sogo-openchange
2015-07-19 13:36:56 -04:00
Julio J. García Martín d0d93a297b Merge pull request #156 from Zentyal/jjgarcia/remove-not-needed-code
Remove not needed block in SoObjects/SOGo/SOGoUserManager.m
2015-07-13 09:13:21 +02:00
Julio García 936c38c43e Remove not needed block in SoObjects/SOGo/SOGoUserManager.m 2015-07-07 14:25:17 +02:00
Jesús García Sáez 7da7bdc1bf Merge pull request #150 from Zentyal/merge-upstream
Merge upstream
2015-07-06 18:57:45 +02:00
Jesús García Sáez 1e101ef01a Merge branch 'master' into merge-upstream
Conflicts:
	SoObjects/SOGo/SOGoUserManager.m
2015-07-06 18:54:35 +02:00
Enrique J. Hernández 3171257ef4 Merge pull request #153 from Zentyal/jag/active-sync-access
ActiveSync: can be controlled by module constraint
2015-07-03 08:42:55 +02:00
Julio J. García Martín 2c8d65843f Merge pull request #154 from Zentyal/ejhernandez/fix-crash-no-object-type-rec
oc: Check PidTagObjectType before dereferencing on ModifyRecipients
2015-07-01 10:57:25 +02:00
Enrique J. Hernández Blasco 62b16f4ef3 oc: Check PidTagObjectType before dereferencing on ModifyRecipients
This is crashing when the PidTagObjectType property is set for
some recipient and not for others.

If the property is missing, then no object type for the recipient
is assumed.
2015-06-29 23:53:12 +02:00
Ludovic Marcotte b86b1afdb9 Fix for dfecce7381 2015-06-29 13:49:41 -04:00
Julio García 8e047aaa9c Merge remote-tracking branch 'upstream/master' into merge-upstream
Conflicts:
	SoObjects/SOGo/SOGoUserManager.m
	Tools/SOGoToolRestore.m
2015-06-26 09:41:58 +02:00
Julio García dc2cc14d25 Revert "Revert "(fix) more fixes and clarifications on the mutli-domain settings""
This reverts commit 3dd8bddc0e.
2015-06-26 09:35:47 +02:00
Julio García 3f1a43cc13 Revert "Revert "(fix) more multi-domain fixes and cleanups""
This reverts commit 90e11d76f6.
2015-06-26 09:35:37 +02:00
Julio García 67d0d95869 Revert "Revert "Fixed mess regarding uid/realUID""
This reverts commit 96d88de564.
2015-06-26 09:35:26 +02:00
Francis Lachapelle d16bf7c1a7 (fix) Tasks list display in Calendar module
Fixes #3267
2015-06-24 07:48:01 -04:00
Francis Lachapelle b527099907 (fix) Events list display in Calendar module
Fixes #3261
2015-06-23 09:25:29 -04:00
Javier Amor García 72aab7f83f ActiveSync: can be controlled by module constraint
Added 'ActiveSync' module constraint. If constraint is not
honored the ActiveSync request returns a forbidden (403).
2015-06-23 09:11:45 +02:00
Ludovic Marcotte dfecce7381 (feat) added support for DeletesAsMoves over EAS 2015-06-22 09:19:54 -04:00
Francis Lachapelle 82798ccb99 Change signature of [iCalAlarm alarmForEvent:..]
The first argument doesn't have to be a iCalRepeatableEntity; a simple
iCalEntity is enough.
2015-06-19 22:11:24 -04:00
Ludovic Marcotte 3809c002ed Revert "(fix) ensure calendar objects have a (fake) filename"
This reverts commit a145fdbb53.
2015-06-17 15:57:16 -04:00
Ludovic Marcotte d9b4abc2f1 (fix) improved memory usage 2015-06-17 08:46:09 -04:00
Ludovic Marcotte 5ad3662640 (fix) fixed multi-domain support for sogo-tool backup/restore (#2600) 2015-06-11 13:32:57 -04:00
Francis Lachapelle 667e38ff0c (fix) Escaping of unexpected characters in emails
Properly encode characters in DOM attributes.

Fixes #3241
2015-06-11 13:14:19 -04:00
Francis Lachapelle 76196bf6f4 (fix) Handling of cards with unexpected UID
Fixes #3239
Fixes #3245
2015-06-11 12:09:21 -04:00
Francis Lachapelle 5435c2dd04 (js) New method String.prototype.fromCSSIdentifier 2015-06-11 11:45:24 -04:00
Francis Lachapelle a70ea38572 New method [NSString+Utilities asSafeJSString] 2015-06-11 11:44:17 -04:00
Ludovic Marcotte 5e66e8e299 (fix) improvement over previous commit to avoid double-bind 2015-06-11 11:36:03 -04:00
Ludovic Marcotte 44af47f69e (fix) avoid method clash from categories that would lead to unexpected behaviors 2015-06-10 20:09:40 -04:00
Ludovic Marcotte 54224637b6 Revert "Revert "(fix) JavaScript syntax error in 'asCSSIdentifier'""
This reverts commit 662d06d24a.
2015-06-10 20:06:00 -04:00
Ludovic Marcotte d9896192f3 Revert "Revert "Improve creation of CSS identifier""
This reverts commit 7d018221ef.
2015-06-10 20:05:40 -04:00
Ludovic Marcotte 85ad849189 Revert "Revert "Improved rationale""
This reverts commit 6994c029b8.
2015-06-10 20:05:13 -04:00
Ludovic Marcotte 2c5f598a23 Revert "Revert "(fix) fixed multidomain issue where UID isn't part of the email address""
This reverts commit ac30c82165.
2015-06-10 20:04:51 -04:00
Ludovic Marcotte ac30c82165 Revert "(fix) fixed multidomain issue where UID isn't part of the email address"
This reverts commit 1f83ba9d50.
2015-06-10 19:11:26 -04:00
Ludovic Marcotte 6994c029b8 Revert "Improved rationale"
This reverts commit 977406de76.
2015-06-10 19:11:04 -04:00
Ludovic Marcotte 977406de76 Improved rationale 2015-06-10 16:31:30 -04:00
Ludovic Marcotte 7d018221ef Revert "Improve creation of CSS identifier"
This reverts commit e40a19cf89.
2015-06-10 16:31:15 -04:00
Ludovic Marcotte 662d06d24a Revert "(fix) JavaScript syntax error in 'asCSSIdentifier'"
This reverts commit 9897cee779.
2015-06-10 16:30:56 -04:00
Francis Lachapelle 9897cee779 (fix) JavaScript syntax error in 'asCSSIdentifier' 2015-06-10 15:43:00 -04:00
Ludovic Marcotte 1f83ba9d50 (fix) fixed multidomain issue where UID isn't part of the email address 2015-06-10 14:33:22 -04:00
Francis Lachapelle e40a19cf89 Improve creation of CSS identifier
Now escaping (), [], {}, ", and ;
2015-06-10 14:02:44 -04:00
Ludovic Marcotte 6bc471ad9a (fix) properly support big characters in EAS and fix encoding QP EAS error for Outlook (#3082) 2015-06-10 10:58:59 -04:00
Ludovic Marcotte b1453e1d7e (fix) fixed potential organizer highjacking when using EAS (#3131) 2015-06-10 10:47:30 -04:00
Ludovic Marcotte 88cab67f6d (fix) properly escape folder after creation using EAS (#3237) 2015-06-10 10:21:15 -04:00
Francis Lachapelle e1ecf797f5 Use double-quotes for setTimeout of UIxJSClose.wox 2015-06-10 09:09:01 -04:00
Ludovic Marcotte a56dbeb6a9 (fix) improved the handling of default calendar categories/colors (#3200) 2015-06-09 20:30:22 -04:00
Ludovic Marcotte 76360958a2 (fix) make sure PRODID is set to Inverse/SOGo when importing events 2015-06-09 13:38:10 -04:00
Ludovic Marcotte aa623c5171 (fix) don't add the domain if already in the uid 2015-06-09 09:46:38 -04:00
Jesús García Sáez c1b0fd53dc Merge pull request #100 from Zentyal/jag/recipient-from-client-call
mapistore: can use client data to get recipient address
2015-06-08 14:32:31 +02:00
Ludovic Marcotte b93cbeee26 (fix) fixed some rare cornercases in multidomain configurations 2015-06-05 12:18:27 -04:00
Ludovic Marcotte f3c2d3ca09 Slightly improvement to the text displayed to users 2015-06-04 14:02:50 -04:00
Ludovic Marcotte 24edb2bce8 (fix) code improvemnent to previous commits 2015-06-04 13:46:50 -04:00
Julio J. García Martín c0a22ead1d Merge pull request #146 from Zentyal/merge-from-upstream
Merge from upstream
2015-06-04 18:53:24 +02:00
Ludovic Marcotte 05232526a7 (fix) small improvement over previous commit 2015-06-04 11:46:59 -04:00
Ludovic Marcotte 8c4cb64246 (fix) now always enforce the organizer's default identity in appointments 2015-06-04 11:39:54 -04:00
Ludovic Marcotte ccbaea6999 (fix) EAS's GetItemEstimate/ItemOperations now support fetching mails and empty folders 2015-06-02 13:05:37 -04:00
Ludovic Marcotte 75206f1f2c (fix) improved EAS speed, especially when fetching big attachments 2015-06-02 12:57:37 -04:00
Enrique J. Hernández d8e37cd7d8 Merge pull request #142 from Zentyal/jag/sogo-tool-create-folder
sogo-tool: Added create-folder command
2015-06-02 17:43:03 +02:00
Javier Amor García 7540cc3e33 oc: can use client data to get recipient address
Before this change, the recipient address was only extracted from the sogo
user object. This made mail to groups undeliverable.
Now if we do not have mail addresses from user object,
we try to use parameters from the client call.
2015-06-02 15:07:50 +02:00
Ludovic Marcotte 18a0422367 (fix) wrong filename for chmod 2015-06-02 09:03:34 -04:00
Ludovic Marcotte 2f533f6dae (fix) create ${RPM_BUILD_ROOT}/etc/tmpfiles.d/ if not present (test) 2015-06-02 09:00:21 -04:00
Ludovic Marcotte 4df323eddb (fix) fixed the target path and name 2015-06-02 08:46:17 -04:00
Ludovic Marcotte 9435a22905 (fix) added tmpfs systemd script 2015-06-02 08:41:53 -04:00
Ludovic Marcotte 15bbfeda3a (fix) renamed scripts 2.1.17 -> 2.2.17 2015-06-02 08:25:54 -04:00
Jesús García Sáez d92b0341fb sogo-tool restore works in multidomain environments
c_uid is not unique globally when multidomain is enabled
2015-06-02 13:17:43 +02:00
Javier Amor García 5e84f2817f sogo-tool: Added create-folder command 2015-06-02 13:17:35 +02:00
Julio García c61eca27a1 Merge branch 'upstream-master' into merge-from-upstream
Conflicts:
	SoObjects/SOGo/LDAPSource.m
	SoObjects/SOGo/SOGoUserManager.m
2015-06-02 12:27:20 +02:00
Julio García 96d88de564 Revert "Fixed mess regarding uid/realUID"
This reverts commit 4f303f8aa2.
2015-06-02 12:24:56 +02:00
Julio García 90e11d76f6 Revert "(fix) more multi-domain fixes and cleanups"
This reverts commit ed42d1e26b.
2015-06-02 12:24:44 +02:00
Julio García 3dd8bddc0e Revert "(fix) more fixes and clarifications on the mutli-domain settings"
This reverts commit d07df554f3.
2015-06-02 12:24:32 +02:00
Enrique J. Hernández 95f11f6d0d Merge pull request #145 from Zentyal/jvalles/appointment-updates
oc-calendar: Improve check for appointment updates
2015-06-01 22:48:45 +02:00
Francis Lachapelle 617e6f6454 Update NEWS file 2015-06-01 11:56:52 -04:00
Francis Lachapelle f65076defd Update NEWS file 2015-06-01 11:20:32 -04:00
Juan Vallés 1ec53a063c oc-calendar: Improve check for appointment updates
The UID was being used to check if  the changes in an appointment had been made by
its organiser. In this case, the UID is the user name, without taking the domain into account.
The `owner` variable, however, is a full email address, so the comparison was never successful. This
caused the update notification mail not to be sent.
2015-06-01 17:09:48 +02:00
Enrique J. Hernández cab5846e37 Merge pull request #143 from Zentyal/jgarcia/crash-session
Safe decoding of secured value
2015-06-01 17:01:07 +02:00
Ludovic Marcotte 289100beff Updated files for the 2.3 release 2015-06-01 08:36:02 -04:00
Ludovic Marcotte 7da6b0b822 (fix) only dump broken eas data to file if SOGoEASDebugEnabled is enabled 2015-05-29 14:23:01 -04:00
Ludovic Marcotte 6cf2fd1e52 Adjusted the doc for the procedure on Wheezy/Precise 2015-05-28 13:41:19 -04:00
Ludovic Marcotte c95568373f Added control file for i386/i686 distro to not build OC 2015-05-28 11:29:44 -04:00
Francis Lachapelle bd12a817a6 Update languages in Installation Guide 2015-05-28 08:30:30 -04:00
Jesús García Sáez 76f80c507c safe decoding of secured value
This was crashing with invalid value (shorter than it should be or nil value)
2015-05-28 12:35:18 +02:00
Ludovic Marcotte 2fd0beeaca Added precision on supported architectures 2015-05-27 15:53:23 -04:00
Ludovic Marcotte db4cd9da6e (fix) doc update regarding samba 4.1.18 2015-05-27 15:53:23 -04:00
Jesús García Sáez afed233131 Merge pull request #141 from Zentyal/ejhernandez/bson-encode-datestz-offset
Use UTC offset to encode NSCalendarDate in BSON
2015-05-27 14:50:14 +02:00
extrafu d1551bc7bb Merge pull request #86 from gillesgagniard/rhel7-improvements
various fixes for systemd service on RHEL7
2015-05-26 16:59:36 -04:00
Gilles Gagniard bea9b26907 systemd needs to reload the newly installed sogod.service, otherwise enable/start will fail on first sogo installation 2015-05-26 22:55:14 +02:00
Gilles Gagniard 84dfba7978 honor PREFORK setting in /etc/sysconfig/sogo when starting sogod with systemd 2015-05-26 22:50:28 +02:00
Enrique J. Hernández Blasco b04b66fd79 Use UTC offset to encode NSCalendarDate in BSON
Using name abbreviation in Objective-C is discouraged
as it stated in the following link:

https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Reference/Foundation/Classes/NSTimeZone_Class/index.html#//apple_ref/occ/clm/NSTimeZone/timeZoneWithAbbreviation:

Indeed, the GNUStep library is generating the name
abbreviation using the system tzdata information
but parsing this data using GNUStep resources making
changes like this:

http://mm.icann.org/pipermail/tz-announce/2014-August/000023.html

Not working until GNUStep reaches these tzdata changes.

Using the UTC offset we are losing the position in planet
Earth but it could be considered valid looking at other
bson implementations.
2015-05-26 21:42:57 +02:00
Ludovic Marcotte ce3d55d2cc (fix) do not rewrite the username when using the session from the db 2015-05-26 11:08:30 -04:00
Enrique J. Hernández 13f2ac9cbb Merge pull request #138 from Zentyal/jgarcia/fix-multidomain-web
Avoid reading emails from other domains (info@foo vs info@bar)
2015-05-25 22:17:42 +02:00
Francis Lachapelle b43c3f6d98 Fix asciidoc of Installation guide 2015-05-25 13:52:25 -04:00
Ludovic Marcotte abcd48a0cd Added missing image used in the documentation 2015-05-25 13:37:04 -04:00
Ludovic Marcotte d07df554f3 (fix) more fixes and clarifications on the mutli-domain settings 2015-05-25 13:00:08 -04:00
Jesús García Sáez 7dc333e790 Fix warning distinct Objective-C type
failedCount is a NSDictionary *, not NSMutableDictionary *
2015-05-25 17:33:46 +02:00
Jesús García Sáez cc62576fef Avoid cache entries with uid@domain@domain prefix
Depend of the current workflow these paths are reached with
username as uid and sometimes as uid@domain. So in multidomain
environments only append @domain when needed.
2015-05-25 17:33:32 +02:00
Ludovic Marcotte 772c3b3115 (fix) formatting fixes 2015-05-25 10:43:42 -04:00
Ludovic Marcotte ed42d1e26b (fix) more multi-domain fixes and cleanups 2015-05-25 09:19:04 -04:00
Ludovic Marcotte e0c1d5e47b Improved the doc for the 2.3 release 2015-05-25 08:27:46 -04:00
Jesús García Sáez a1d07c59af Merge pull request #137 from Zentyal/jag/change-passsword-exceptions
Return appropiate error code when changing AD password with incorrect…
2015-05-23 02:23:02 +02:00
Ludovic Marcotte 55d91973bd Improved the doc for the release 2015-05-22 15:23:48 -04:00
Enrique J. Hernández 0a37652dd6 Merge pull request #139 from Zentyal/jgarcia/get-sources-from-your-domain
Try to authenticate only against sources of the given domain
2015-05-22 20:43:41 +02:00
Ludovic Marcotte 4f303f8aa2 Fixed mess regarding uid/realUID 2015-05-22 14:03:49 -04:00
Ludovic Marcotte c8995087d8 Small improvements to the docs 2015-05-22 13:50:06 -04:00
Ludovic Marcotte 2ae5f342da Fix a crasher 2015-05-22 13:47:48 -04:00
extrafu d6ab7582e5 Merge pull request #85 from Zentyal/inverse_fix-multidomain-web
Avoid reading emails from other domains
2015-05-22 09:19:54 -04:00
Javier Amor García 725dea5f6f Show 'complexity password' error instead of a generic error
There is not discrimination between complexity and
length errors because LDAP does not
return different error codes for each case.
2015-05-22 14:59:49 +02:00
Francis Lachapelle 1e0473f1e5 Localization 2015-05-22 07:58:26 -04:00
Jesús García Sáez 7990e23aaa Fix warning distinct Objective-C type
failedCount is a NSDictionary *, not NSMutableDictionary *
2015-05-22 10:19:09 +02:00
Jesús García Sáez 04ce8d1066 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
2015-05-22 10:18:55 +02:00
Jesús García Sáez 37461e650d 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
2015-05-22 10:14:49 +02:00
Jesús García Sáez 9922ec56d9 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
2015-05-22 10:14:43 +02:00
Francis Lachapelle 7893349244 TimePicker: allow entries from numpad
Fixes #1516
2015-05-21 21:35:13 -04:00
Jesús García Sáez 76dd53b461 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
2015-05-21 17:13:18 +02:00
Jesús García Sáez 020c895925 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
2015-05-21 17:13:18 +02:00
Ludovic Marcotte f4963df50f (fix) avoid appending the domain unconditionally when SOGoEnableDomainBasedUID is set to YES 2015-05-21 17:13:11 +02:00
Ludovic Marcotte e40be92204 Updated NEWS file regarding PR#84 2015-05-21 08:48:45 -04:00
extrafu 30103532ae Merge pull request #84 from Zentyal/master
sogo-openchange fixes
2015-05-21 08:46:21 -04:00
extrafu b433bac432 Merge pull request #83 from Zentyal/jag/change-passsword-exceptions
Return appropiate error code when changing AD password with incorrect…
2015-05-21 08:42:17 -04:00
Ludovic Marcotte 79bfc7aedf (fix) more rhel7 fix 2015-05-20 14:27:57 -04:00
Ludovic Marcotte 54ab0bf822 (fix) rhel7 packaging fix 2015-05-20 14:24:02 -04:00
Ludovic Marcotte 7e8c79c646 (fix) use the contact-info, not the user/group bit identifier 2015-05-20 13:51:16 -04:00
Jesús García Sáez 7160d94e91 Set domain before fetching auth sources
In multidomain environment right now we are trying to authenticate against
all sources defined in sogo.conf because the domain is not set at this point.

In sogo.conf we have to specify the domain a source is useful for, so with this
patch instead of 'n' tries of authentication we will perform only 1 (in a scenario
where we have 1 source per domain, and we have 'n' domains).
2015-05-20 18:33:11 +02:00
Ludovic Marcotte 416711ea43 (fix) avoid appending the domain unconditionally when SOGoEnableDomainBasedUID is set to YES 2015-05-19 13:48:59 -04:00
Javier Amor García 5a8f310bc8 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.
2015-05-19 15:00:18 +02:00
Ludovic Marcotte ae72c2f1d5 Renamed scripts 2015-05-19 06:35:19 -04:00
Jesús García Sáez ca500df0af Merge pull request #136 from Zentyal/ejhernandez/fix-regression-all-day-recurrent
oc-calendar: Fix regression on PidLidAppointmentTimeZoneDefinitionStartDisplay
2015-05-19 10:38:35 +02:00
Enrique J. Hernández Blasco e2ef0103c4 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.
2015-05-19 00:26:42 +02:00
Julio J. García Martín e6d1a00928 Merge pull request #135 from Zentyal/jvalles/reply-requested-return-values
oc-calendar: Fix property values of invitation responses
2015-05-18 12:48:37 +02:00
Ludovic Marcotte 143ee59f5b Improved debian packaging regarding apache 2.2 -> 2.4 2015-05-15 09:38:58 -04:00
Ludovic Marcotte 037a3a136a (fix) message bodies not shown on some EAS devices (#3173) 2015-05-14 15:58:53 -04:00
Ludovic Marcotte c98a000515 (feat) many improvements to EAS SmartReply/SmartForward commands 2015-05-14 15:49:53 -04:00
Ludovic Marcotte cc1e9f2fff (fix) additional fix for #3152 2015-05-14 15:40:03 -04:00
Ludovic Marcotte 9dc0a08bba (fix) removed unused import 2015-05-14 15:28:23 -04:00
Ludovic Marcotte 5412599832 (feat) now possible to log EAS commands using the SOGoEASDebugEnabled system defaults 2015-05-14 15:26:18 -04:00
Ludovic Marcotte fbf5c4f6c2 (fix) always include SrcMsgId in the MoveItems's response 2015-05-13 19:09:58 -04:00
Ludovic Marcotte d97813451e (fix) moved stuff to multiarch 2015-05-13 16:09:41 -04:00
Ludovic Marcotte 4de814c3b2 (fix) first pass (and hopefully only) at Apache 2.2->2.4 mess 2015-05-13 15:48:47 -04:00
Ludovic Marcotte fb121974ec refactored previous commit 2015-05-13 14:52:10 -04:00
Ludovic Marcotte 39aa9a97db (fix) make sure we return event blocks sorted by start date (#2939) 2015-05-13 14:36:35 -04:00
Ludovic Marcotte dc48e05dd3 (feat) print event/task description in list view (#2881) 2015-05-13 13:12:15 -04:00
Ludovic Marcotte 0ea0a77666 fixed typo in previous commit 2015-05-13 10:55:17 -04:00
Ludovic Marcotte f8b7ebdaf8 Adjust OCS files regarding previous commit 2015-05-13 10:51:12 -04:00
Ludovic Marcotte 5cf500d560 (feat) added c_description to calendar quick tables 2015-05-13 10:45:19 -04:00
Ludovic Marcotte c1ce32ac94 (fix) now handle very large amount of participants correctly (#3175) 2015-05-12 15:48:42 -04:00
Ludovic Marcotte e71a1c9974 (fix) addition fix for #3152 2015-05-12 10:44:51 -04:00
Ludovic Marcotte 96b2e0e1f5 (fix) use dateTime instead of compact format for meeting requests 2015-05-12 10:37:26 -04:00
Ludovic Marcotte a145fdbb53 (fix) ensure calendar objects have a (fake) filename 2015-05-12 10:33:05 -04:00
Ludovic Marcotte 619e9fe7dd (fix) now correctly handle multiple email addresses in the GAL over EAS 2015-05-12 10:28:47 -04:00
Ludovic Marcotte 64da65d827 (fix) fallback to Latin1 when trying to parse versit data 2015-05-12 10:19:20 -04:00
Ludovic Marcotte 364a07bd05 set the preferred body type for meeting response 2015-05-12 10:15:07 -04:00
Ludovic Marcotte 2c78d60e4a (fix) now correct handle external invitations using EAS 2015-05-12 10:12:57 -04:00
Ludovic Marcotte ee8caa5a99 (fix) now set MeetingMessageType only for EAS 14.1 2015-05-12 10:05:45 -04:00
Ludovic Marcotte f666b436dd (fix) make sure sure email invitations can always be read by EAS clients 2015-05-12 09:59:01 -04:00
Ludovic Marcotte 4826f01555 (fix) fixed EAS replies decoding from Outlook (#3123) 2015-05-12 09:52:13 -04:00
Juan Vallés 0a285eedec 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`.
2015-05-11 12:58:06 +02:00
Julio J. García Martín 582c24afc5 Merge pull request #133 from Zentyal/ejhernandez/flush-cache
oc-mail: Flush IMAP hierarchy cache to update Outlook folders
2015-05-07 09:53:49 +02:00
Enrique J. Hernández 92ab267db5 Merge pull request #131 from Zentyal/ejhernandez/set-restriction-on-name-for-mail-folders
oc-mail: Support restricitions on name for MAPIStoreMailFolderTable
2015-05-07 02:03:39 +02:00
Ludovic Marcotte fbb779a71d (fix) During login, we now extract the domain from the user to accelerate authentication requests on sources 2015-05-06 16:03:33 -04:00
Julio J. García Martín 54b405a83d Merge pull request #132 from Zentyal/jvalles/floating-time-in-all-day-events
oc-calendar: Interpret dates of all-day events in floating time
2015-05-06 12:22:51 +02:00
Enrique J. Hernández Blasco 15f95c4956 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.
2015-05-05 23:34:09 +02:00
Enrique J. Hernández Blasco 2d65b75b56 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.
2015-05-05 23:30:12 +02:00
Juan Vallés ebe2a466e7 oc-calendar: Compute PidLidAppointmentDefinitionStartWhole for all-day events 2015-05-05 10:29:24 +02:00
Juan Vallés 7e89c43919 oc-calendar: Compute time offset in floating time in all-day recurring events 2015-05-05 10:29:24 +02:00
Ludovic Marcotte a37f438663 (fix) the EAS maximum response size being per-folder, and not global 2015-05-04 09:11:52 -04:00
Julio J. García Martín dc5237e92e Merge pull request #123 from Zentyal/ejhernandez/no-mapping-creation-root-folder
oc: Do not create indexing entry for a root folder
2015-05-04 11:10:47 +02:00
Francis Lachapelle 50896eb526 (i18n) Improve Basque Locale file 2015-04-28 14:44:29 -04:00
Ludovic Marcotte 7ff12c7a64 Updated NEWS file regarding Zentyal's PRs 2015-04-27 15:07:44 -04:00
Ludovic Marcotte f2b5f5917b Fixed dot notation 2015-04-27 15:02:00 -04:00
Ludovic Marcotte ee74b78bf2 Merge branch 'master' of https://github.com/inverse-inc/sogo 2015-04-27 14:58:20 -04:00
Ludovic Marcotte dfb960eac4 Disabled -Werr for now 2015-04-27 14:57:44 -04:00
Francis Lachapelle a1406d01e1 Initial Basque translation 2015-04-27 13:59:05 -04:00
Francis Lachapelle 07ac3f43fb Simplify some calls in SOGoAppointmentFolder.m 2015-04-27 10:39:09 -04:00
extrafu 1db2b9793a Merge pull request #79 from Zentyal/contribute-back
Latest changes for sogo-openchange
2015-04-27 10:14:29 -04:00
extrafu 393d8e5a73 Merge pull request #80 from dekkers/md4-compile-fix
Do not include nonexistent config.h in md4.c
2015-04-26 20:00:29 -04:00
extrafu 6f741168a9 Merge pull request #81 from dekkers/spelling-fix
Spelling fix: dictionnary -> dictionary
2015-04-26 20:00:08 -04:00
Jeroen Dekkers 84c199b95a Spelling fix: dictionnary -> dictionary 2015-04-26 13:33:03 +02:00
Jeroen Dekkers 769045bbf6 Do not include nonexistent config.h 2015-04-25 14:40:42 +02:00
Julio García 08501dacaa Merge branch 'master' into contribute-back
Conflicts:
	NEWS
2015-04-24 16:53:05 +02:00
Jesús García Sáez b7907d654d Merge pull request #127 from Zentyal/jkerihuel/asynchronous-notifications
[oxcnotif] Delete deprecated notification code
2015-04-22 12:45:20 +02:00
extrafu a94591a365 Merge pull request #78 from Zentyal/contribute-back
Fixes for OpenChange integration from Zentyal
2015-04-20 11:43:04 -04:00
Julio García 78f5f60b16 Revert "oc: monkeypatched NGImap4Connection class from sope"
This reverts commit 24e35103ff.
2015-04-20 13:15:22 +02:00
Julio García 255b3d2d00 Revert "oc: NGImap4Connection:fetchUids don't delete RawResponse"
This reverts commit c410a9fc3f.
2015-04-20 13:15:13 +02:00
Julio García 1d9e085658 Revert "oc: NGImap4Connection:fetchUids changed error messages"
This reverts commit 41320a4813.
2015-04-20 13:15:04 +02:00
Julio García 9901788db6 Revert "Update news for next release"
This reverts commit cd47c926c9.

Conflicts:
	NEWS
2015-04-20 09:51:02 +02:00
Julio García 8e39f03f83 Revert "Prepare for 2.2.17a-zentyal1"
This reverts commit 8706443685.

Conflicts:
	NEWS
2015-04-20 09:48:52 +02:00
Julio García f6370d10cb Revert "Prepare for new 2.2.15-zentyal3 version"
This reverts commit 914e7b7418.

Conflicts:
	NEWS
2015-04-20 09:47:40 +02:00
Ludovic Marcotte d0c1737b1b Removed TODO refs 2015-04-17 14:09:51 -04:00
Ludovic Marcotte 836095e984 Removed old TODO file 2015-04-17 14:09:13 -04:00
Luc Charland a86b164228 uses a dict instead of a string of a dict for preventInvitationsTest 2015-04-17 10:38:40 -04:00
Francis Lachapelle 5847e086ec (fix) Edition and access of attach URL in editor 2015-04-17 10:00:29 -04:00
Ludovic Marcotte 3872af35d1 (fix) Improve prevent invitations error handling 2015-04-17 09:41:39 -04:00
Ludovic Marcotte beb666bc5f (fix) fixed md4 support (for NTLM password changes) with GNU TLS 2015-04-17 09:29:49 -04:00
Enrique J. Hernández Blasco 8fce211172 Merge pull request #125 from Zentyal/jgarcia/multidomain-outlook-entryId
All this basically is to make it work on multidomain environment
the Reply all functionality of emails but I'm sure there are more use cases
as an Outlook client that don't work nowadays without this patch.

More info on commit message but basically it was that we were using user
instead of user@domain.com in several places.
2015-04-17 11:33:21 +02:00
Enrique J. Hernández Blasco 030d343432 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
2015-04-16 23:23:32 +02:00
Francis Lachapelle a7306a77cb (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.
2015-04-16 15:27:55 -04:00
Jesús García Sáez 58449076a3 Merge branch 'jacalvo/fix-optional-rec-type' 2015-04-16 19:55:19 +02:00
José Antonio Calvo 539060d252 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
2015-04-16 19:47:47 +02:00
Jesús García Sáez 336c4fb9d3 Merge pull request #121 from Zentyal/ejhernandez/search-mapidb-message-props
oc: Search for properties in a SOGoMAPIDB object now works
2015-04-16 18:51:18 +02:00
Jesús García Sáez d3bf3dcd8f Merge pull request #122 from Zentyal/ejhernandez/enforce-mapping-subfolder
oc: Enforce the folder creation mapping when the FID exists
2015-04-16 18:05:29 +02:00
Julien Kerihuel d4930a7960 oc: Remove deprecated notification code. 2015-04-16 16:04:47 +02:00
Jesús García Sáez 49ee0850e1 Merge pull request #118 from Zentyal/ejhernandez/return-sorted-events
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.
2015-04-16 12:50:20 +02:00
Jesús García Sáez 0f432b654f 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
2015-04-16 11:32:24 +02:00
Julio García cdb6085510 Revert "Adding missing build dependency gnulib"
This reverts commit 210053ea20.
2015-04-16 09:55:32 +02:00
Julio García 6b3454376e Revert "configure: Fix gnulib/crypto/md4 dependency"
This reverts commit f0a3fdae5b.
2015-04-16 09:55:22 +02:00
Julio García a8e8ec535a Prepare for 2.2.17a-zentyal1 2015-04-15 19:57:56 +02:00
Julio García 3f3ae3acd7 Merge remote-tracking branch 'upstream/master' into contribute-back
Conflicts:
	NEWS
2015-04-15 17:08:30 +02:00
Julio García 8706443685 Prepare for 2.2.17a-zentyal1 2015-04-15 16:10:03 +02:00
Julio García ca7c4c026e Merge pull request #119 from Zentyal/jjgarcia/merge-from-upstream
Merge from upstream version 2.2.17a
2015-04-15 16:05:37 +02:00
Jesús García Sáez f0a3fdae5b 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
2015-04-15 15:28:32 +02:00
Julio García 210053ea20 Adding missing build dependency gnulib 2015-04-15 15:28:23 +02:00
Julio J. García Martín 35f81318d6 Merge pull request #124 from Zentyal/jgarcia/multidomain_cache_tables
Multidomain cache tables
2015-04-15 10:41:17 +02:00
Jesús García Sáez 1d6f1a83af 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
2015-04-14 13:18:23 +02:00
Julio García 914e7b7418 Prepare for new 2.2.15-zentyal3 version 2015-04-14 11:44:32 +02:00
Enrique J. Hernández Blasco bddd67fb93 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.
2015-04-13 11:48:42 +02:00
Enrique J. Hernández Blasco fa23b574eb 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.
2015-04-13 11:37:48 +02:00
Julio García 321e16c382 Merge tag 'SOGo-2.2.17a' into jjgarcia/merge-from-upstream
SOGo 2.2.17a

Conflicts:
	NEWS
2015-04-10 13:12:46 +02:00
Julio García 479bbce7d0 Merge pull request #116 from Zentyal/ejhernandez/soft-deleted-sync
Soft deleted mail messages sync
2015-04-10 10:27:48 +02:00
Julio J. García Martín 69b06d3c7a Merge pull request #113 from Zentyal/jag/show-internet-headers
Support for PidTagTransportMessageHeaders property
2015-04-10 10:02:00 +02:00
Julio J. García Martín 65d1fc2134 Merge pull request #117 from Zentyal/ejhernandez/oc-debug
oc: Use new OC_DEBUG macro
2015-04-10 10:01:18 +02:00
Francis Lachapelle cdc74e4984 Update translations 2015-04-09 09:06:19 -04:00
Ludovic Marcotte 1e4596ca3a (fix) fixed serialization of PreventInvitationsWhitelist 2015-04-08 14:20:33 -04:00
Francis Lachapelle 755efa789b [fix] initial loading of inbox uids and headers 2015-04-08 12:07:28 -04:00
Francis Lachapelle eae327ca19 [fix] Paragraph margins in HTML message
Fixes #3163
2015-04-07 08:27:30 -04:00
Francis Lachapelle 01857a9a47 [fix] Timezone of MS Exchange freebusy information 2015-04-02 11:53:03 -04:00
Francis Lachapelle e2c3259b16 [fix] Issues with freebusy in attendees editor 2015-04-01 20:10:52 -04:00
Ludovic Marcotte 77917780c8 (fix) packaging issue on RHEL 2015-04-01 08:46:46 -04:00
Ludovic Marcotte 9b320ec2a1 Improvements over 491d7aaffc 2015-03-31 16:17:21 -04:00
Ludovic Marcotte b2d7eb40c2 (fix) fixed a potential EAS error with multiple email priority flags 2015-03-31 16:13:52 -04:00
Francis Lachapelle ab121e6c15 [fix] Issues with freebusy in attendees editor 2015-03-31 15:19:53 -04:00
Ludovic Marcotte 94d546dc7a (feat) added systemd startup script (PR#76) 2015-03-31 13:42:59 -04:00
extrafu 2082acc1aa Merge pull request #76 from peruchi/master
Change script start sogod for systemd
2015-03-31 13:40:42 -04:00
peruchi 06ef3fe856 Delete sogo-systemd-redhat.spec 2015-03-31 14:37:35 -03:00
peruchi c9ec636a53 Update sogo.spec 2015-03-31 14:36:04 -03:00
peruchi 36a70b161c Create sogo-systemd-redhat 2015-03-31 14:19:16 -03:00
peruchi 784f0100e9 Create sogo-systemd-redhat.spec 2015-03-31 14:18:23 -03:00
Ludovic Marcotte db9536adcc (fix) fix yet an other potential crash during freebusy lookups during timezone changes 2015-03-31 09:25:57 -04:00
Ludovic Marcotte c428ac2553 EAS reply fix when message/rfc822 parts are included in the original mail (#3153) 2015-03-30 09:57:27 -04:00
Ludovic Marcotte f5607b3e85 now keep the BodyPreference for future EAS use and default to MIME if none set (#3146) 2015-03-30 09:49:44 -04:00
Ludovic Marcotte 491d7aaffc improved multipart handling using EAS 2015-03-30 09:42:32 -04:00
Enrique J. Hernández Blasco 95a8a9316a 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.
2015-03-27 11:12:40 +01:00
Enrique J. Hernández Blasco 1ee47b1ee2 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.
2015-03-27 10:27:16 +01:00
Enrique J. Hernández Blasco dfde498b7c oc-mail: Include Deleted flagged messages on syncing cache
This gives an accurate value for SyncLastDeletedMessage
2015-03-26 22:45:13 +01:00
Enrique J. Hernández Blasco 06476abdf7 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.
2015-03-26 22:05:43 +01:00
Jesús García Sáez bb0221c763 Merge pull request #115 from Zentyal/ejhernandez/sharing-flavour-val-idl
oc-mail: Update place for Sharing Flavour prop values
2015-03-26 19:45:24 +01:00
Jesús García Sáez dc869ce106 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.
2015-03-26 19:26:48 +01:00
Ludovic Marcotte ddcae9f132 Updates for the release 2015-03-26 13:57:58 -04:00
Ludovic Marcotte f11bcd3373 Avoid using stringByReplacing... since old runtimes don't support it 2015-03-26 13:54:17 -04:00
Enrique J. Hernández Blasco a47f1de607 oc-mail: Update place for Sharing Flavour prop values
It has been moved in OpenChange
2015-03-26 14:18:34 +01:00
Jesús García Sáez 09aed26f10 Merge pull request #114 from Zentyal/ejhernandez/fix-interleaving-creating-folder
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.
2015-03-25 17:15:05 +01:00
Jesús García Sáez 0e5de2df42 Merge pull request #110 from Zentyal/ejhernandez/sharing-calendar-request
This requires https://github.com/openchange/openchange/pull/244 to work
but basically we have modified this backend to store request-related
properties in a `MAPIStoreMailMessage` using the versions message
from the `MAPIStoreMailFolder` container and fix the setter/getter
for the following properties:

  * PidNameXSharingFlavor
  * PidLidSharingFlavor
  * PidNameXSharingCapabilities
  * PidLidSharingResponseType
  * PidLidSharingResponseTime
2015-03-25 17:09:14 +01:00
Enrique J. Hernández Blasco 82fb03b67b 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.
2015-03-25 16:53:42 +01:00
Enrique J. Hernández Blasco f9c8661fe6 oc-mail: Use constant names in props value
This gives to the developer more information about
the property values for PidLidSharingFlavor and
PidLidSharingCapabilities.
2015-03-25 10:12:15 +01:00
Enrique J. Hernández Blasco 661b6694af 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
2015-03-25 10:12:15 +01:00
Enrique J. Hernández Blasco 514b1c03be 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.
2015-03-25 10:12:15 +01:00
Enrique J. Hernández Blasco a663fdd260 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.
2015-03-25 10:12:15 +01:00
Jesús García Sáez 0db16aedb1 Merge pull request #112 from Zentyal/ejhernandez/fix-crash-invalid-ics
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.
2015-03-24 19:15:05 +01:00
Jesús García Sáez 6f70066986 Merge pull request #109 from Zentyal/ejhernandez/empty-acl-perms
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`.
2015-03-24 17:40:37 +01:00
Ludovic Marcotte b933f53fc2 Changes for the 2.2.17 release 2015-03-24 10:56:26 -04:00
Ludovic Marcotte 097d5c2333 now possible to configure objectClass names for LDAP groups using GroupObjectClasses (#1499) 2015-03-24 08:40:13 -04:00
Ludovic Marcotte d75fb0722a Code cleanups 2015-03-24 08:34:29 -04:00
Enrique J. Hernández Blasco 6204aebf2c 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.
2015-03-23 23:57:33 +01:00
Francis Lachapelle 26d876e67a Improve event attendees editor
- Avoid repetitive AJAX queries;
- Improve handling of daylight changes.
2015-03-23 17:54:05 -04:00
Ludovic Marcotte cc3652b59b improvements to EAS SyncKey handling to avoid missing mails (#3048, #3058) 2015-03-23 17:23:29 -04:00
Ludovic Marcotte 9d7bbbc312 enable by default HTML mails support using EAS on Windows and BB phones 2015-03-23 14:55:14 -04:00
Ludovic Marcotte d2915add6d now favor login@domain as the default email address if multiple mail: fields are specified 2015-03-23 14:08:31 -04:00
Ludovic Marcotte 67139ce3e3 improved GetItemEstimate to count all vasnished/deleted mails too 2015-03-23 11:35:45 -04:00
Ludovic Marcotte 9eb138b867 prevent potential freebusy lookup crashes during timezone changes with repetitive events 2015-03-23 10:54:36 -04:00
Ludovic Marcotte baf3d1f986 immediately delete mails from EAS clients when they are marked as deleted on the IMAP server 2015-03-20 09:10:49 -04:00
Ludovic Marcotte ecd336fa5c Fix compilation warning and error 2015-03-20 08:51:35 -04:00
Ludovic Marcotte afd73289d1 properly fallback over EAS to UTF-8 and then Latin1 for messages w/o charset (#3103) 2015-03-20 08:45:42 -04:00
Ludovic Marcotte bff21ab1ff support for mail prority using EAS 2015-03-19 16:08:33 -04:00
Ludovic Marcotte 6d99226b13 Always add DisplayName no matter EAS client version 2015-03-19 14:53:01 -04:00
Francis Lachapelle 69974807b5 Fix Language-Region tags in Web interface
Fixes #3121
2015-03-19 08:35:10 -04:00
Enrique J. Hernández Blasco 8ee2303e78 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`.
2015-03-19 00:06:14 +01:00
Enrique J. Hernández 7bc8cd58dd Merge pull request #108 from Zentyal/jacalvo/fix-optional-attendees
oc-calendar: Fix event invitations for optional attendees
2015-03-18 21:34:51 +01:00
José Antonio Calvo 2668bc313c 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.
2015-03-18 18:18:46 +01:00
Jesús García Sáez 418ac15de6 Merge pull request #107 from Zentyal/jgarcia/rtf-no-color-table
oc-rtf: no color table definition
2015-03-18 18:08:05 +01:00
Jesús García Sáez 637ac1e98a oc-rtf: no color table definition
Be able to parse rtf files without color table defined
\colortbl
2015-03-18 18:06:49 +01:00
Jesús García Sáez b0ba6f4a22 Merge pull request #101 from Zentyal/ejhernandez/recurrence-exceptions-fixes
Two fixes on recurring events
2015-03-18 18:05:06 +01:00
Ludovic Marcotte cdb766e2ef Documented NGMimeBuildMimeTempDirectory 2015-03-18 10:15:33 -04:00
Enrique J. Hernández Blasco fb4c3a4730 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.
2015-03-18 15:08:24 +01:00
Enrique J. Hernández Blasco 6f44ec42c1 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.
2015-03-18 15:08:24 +01:00
Ludovic Marcotte e25a7e3d8d Fix for bug #3138 2015-03-18 09:36:35 -04:00
Julio García 3b0b43f28f Merge branch 'ejhernandez/peek-preload-bodies-for-real' 2015-03-18 09:28:57 +01:00
Julio García afa9061f2f Merge branch 'ejhernandez/client-drafts-no-updated' 2015-03-18 09:22:41 +01:00
Enrique J. Hernández Blasco 9f3f2aebe4 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.
2015-03-18 00:42:01 +01:00
Francis Lachapelle 1d5ae27c99 Fix issues with freebusy (Web, busyOffHours) 2015-03-17 15:34:00 -04:00
Julio García 0be36df211 Preparing release for 2.2.15-zentyal2 2015-03-17 12:30:09 +01:00
Francis Lachapelle beb57707e8 Merge pull request #72 from JensErat/export-not-archive
Rename "Archive" to "Export" in Webmail, ctd.
2015-03-13 10:15:30 -04:00
Jens Erat 1bdd5dfc90 Remove obsolete archive string from translations 2015-03-13 14:06:58 +01:00
Enrique J. Hernández 43debc1d70 Merge pull request #102 from Zentyal/jgarcia/rtf-safe-parsing
oc-rtf: safe parse ignoring content
2015-03-13 12:46:38 +01:00
Jens Erat 37fbd75d55 Rename "Archive" to "Export" in Webmail, ctd.
Fixes #2758 also for non-Inbox folders
2015-03-13 11:41:07 +01:00
Enrique J. Hernández Blasco 1c1a75d2c1 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.
2015-03-13 10:54:57 +01:00
Enrique J. Hernández Blasco f048860729 Revert "oc-mailfolder: Avoid setting seen flag on preloading message bodies"
This reverts commit 7e0cddc06b.
2015-03-13 00:00:40 +01:00
Enrique J. Hernández Blasco 6d6053865f Revert "oc-mailfolder: Get seen flag directly from message in preloading"
This reverts commit d076e04ad4.
2015-03-13 00:00:29 +01:00
Jesús García Sáez 6e00274988 oc-rtf: safe parse ignoring content
Be able to parse safely \*\xxxxx control words with \binXXXX
elements inside it (before final })
2015-03-12 17:13:17 +01:00
Jesús García Sáez 307fe90854 Merge pull request #99 from Zentyal/ejhernandez/corner-cases-import-PST
oc-mail: Set sender on email messages without an orig recipient
2015-03-11 13:08:33 +01:00
Jesús García Sáez 8031f066dc Merge pull request #98 from Zentyal/ejhernandez/calendar-sharing-invitation
Give support to calendar sharing invitation
2015-03-11 13:07:36 +01:00
Francis Lachapelle f1fda8bd06 Return a single phone number in JSON contacts list 2015-03-10 13:27:17 -04:00
Francis Lachapelle 517f4b0f49 Fix possible JS exception in Contacts module 2015-03-09 14:04:21 -04:00
Enrique J. Hernández Blasco 2b54897d29 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.
2015-03-05 00:05:02 +01:00
Enrique J. Hernández Blasco ae7ac1be29 oc-mail: Return sharing properties on sharing object mail message
When it is asked for available properties for an specific message.
2015-03-05 00:02:19 +01:00
Enrique J. Hernández Blasco 6af8b486df 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.
2015-03-04 18:49:31 +01:00
Enrique J. Hernández Blasco 316ade13f8 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.
2015-03-04 18:49:17 +01:00
Francis Lachapelle cbba0719bb Fix exception in SOGoUserManager 2015-03-04 10:05:12 -05:00
Jesús García Sáez c4566c4773 Merge pull request #95 from Zentyal/free-header-encoding
Free headerEncoding variable when destroying parent
2015-03-04 10:51:14 +01:00
Carlos Pérez-Aradros Herce 3b2cbb945c oc: Free headerEncoding variable 2015-03-04 10:10:32 +01:00
Francis Lachapelle 8e0849029e Fix contacts lookup by UID
When looking for a specific contact UID, we no longer match a pattern
that could return multiple results. We search for the exact UID only.
2015-03-03 21:26:09 -05:00
Francis Lachapelle 6192322513 Fix some gcc warnings 2015-03-03 21:23:19 -05:00
Enrique J. Hernández Blasco 44dfd35521 oc-mail: Set sender on email messages without an orig recipient
But it has recipients. This is for sure happening with event
invitations messages.
2015-03-03 22:52:42 +01:00
Enrique J. Hernández Blasco 575600cabc oc-calendar: Return PidTagContainerClass for Calendar folders
And it must "IPF.Appointment" as described in [MS-OXOCAL] Section 2.2.11.1
2015-03-03 17:47:37 +01:00
Enrique J. Hernández acc2bd0369 Merge pull request #97 from Zentyal/jjgarcia/update-news
Update news for next release
2015-03-03 16:08:31 +01:00
Julio García cd47c926c9 Update news for next release 2015-03-03 11:16:01 +01:00
Julio J. García Martín 9b038db0b6 Merge pull request #93 from Zentyal/jvalles/missing-contact-props
Save missing contact properties in database
2015-03-02 09:17:15 +01:00
Julio J. García Martín bcc1aa8049 Merge pull request #89 from Zentyal/jag/set-null-recurrence-pattern
In setupRecurrenceWithMasterEntit a null recurrence pattern is now inter...
2015-03-02 09:16:38 +01:00
Javier Amor García ef6aab63c9 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.
2015-02-27 17:32:22 +01:00
Ludovic Marcotte df59b73a22 use correct mail attachment elements for EAS 2.5 clients - patch from tfu 2015-02-26 17:56:42 -05:00
Ludovic Marcotte a5672fda52 do not use syncKey from cache when davCollectionTag = -1 - patch from tfu 2015-02-26 17:55:36 -05:00
Ludovic Marcotte b593ddc643 SmartReply improvements for missing body attributes - patch from tfu 2015-02-26 17:53:58 -05:00
Ludovic Marcotte 38d61f720f use the correct body element for events for EAS 2.5 clients - patch from tfu 2015-02-26 17:52:37 -05:00
Ludovic Marcotte 733e334726 fixed tasks disappearing issue with RoadSync - patch from tfu 2015-02-26 17:51:02 -05:00
Ludovic Marcotte 22888ba5ac use the correct mail body element for EAS 2.5 clients - patch from tfu 2015-02-26 17:49:26 -05:00
Ludovic Marcotte 33c485d2f6 fixed empty sync responses for EAS 2.5 and 12.0 clients - patch from tfu 2015-02-26 17:48:06 -05:00
Ludovic Marcotte 9160e34134 multiple collections support for GetItemEstimate - patch from tfu 2015-02-26 17:46:34 -05:00
Ludovic Marcotte 5ceddc213e Fix for bug #3116 2015-02-26 16:00:03 -05:00
Jesús García Sáez 85d9440ccd Merge pull request #94 from Zentyal/jgarcia/reset-password
Fix change password with multidomains
2015-02-26 10:48:58 +01:00
Ludovic Marcotte b97002565e Updated NEWS file regarding previous commit 2015-02-25 08:42:18 -05:00
extrafu 03b6a8a028 Merge pull request #70 from Zentyal/jgarcia/reset-password-sogo
Fix change password with DomainBasedUID
2015-02-25 08:41:05 -05:00
Jesús García Sáez 22196e0054 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`.
2015-02-25 12:42:03 +01:00
Jesús García Sáez 8d21bc3e36 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`.
2015-02-25 12:39:01 +01:00
Juan Vallés 4c3c741d9f oc-contacts: Save missing contact properties in database 2015-02-25 11:59:24 +01:00
Jesús García Sáez 731934f061 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
2015-02-24 17:44:56 +01:00
Jesús García Sáez b645b4187d Merge pull request #88 from Zentyal/ejhernandez/add-categories-calendar-events
oc-calendar: Implement categories to share the colour
2015-02-24 14:23:36 +01:00
Enrique J. Hernández Blasco 9b847a276c 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
2015-02-17 10:20:16 +01:00
Jesús García Sáez 68216a7456 Merge pull request #87 from Zentyal/ejhernandez/fixes-on-calendar-props
Calendar: PidTagSensitivity and PidTagImportance now works in Outlook
2015-02-16 11:00:45 +01:00
Enrique J. Hernández Blasco 624967c60b 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.
2015-02-15 18:44:47 +01:00
Enrique J. Hernández Blasco e6ba15bbae 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.
2015-02-15 18:41:03 +01:00
Enrique J. Hernández Blasco 2a1b363fee oc-calendar: Proper getter for AppointmentWrapper proxy object
Do not assume it is in 0 position any longer
2015-02-15 18:39:43 +01:00
Enrique J. Hernández Blasco eaec3c0610 oc-calendar: Remove useless method
Better off implemented by AppointmentWrapper proxy
2015-02-15 18:38:59 +01:00
Enrique J. Hernández Blasco d3a4b497c6 oc-calendar: Remove commented code
Available at MAPIStoreAppointmentWrapper class
2015-02-15 18:34:28 +01:00
Ludovic Marcotte b26ea30b1b Update ChangeLog 2015-02-12 11:06:57 -05:00
Ludovic Marcotte 72b210cd2e Fixed typo 2015-02-12 10:29:46 -05:00
Ludovic Marcotte a80d75d09c Preparation for the release 2015-02-12 10:27:10 -05:00
Ludovic Marcotte aae76dc4e6 Limit curl request for webcalendars to 60 seconds 2015-02-12 09:57:10 -05:00
Francis Lachapelle c20ca0e33d Fix exception in set operation of sogo-tool 2015-02-12 09:29:40 -05:00
Francis Lachapelle 601a9ca559 Update translations 2015-02-12 09:09:18 -05:00
Ludovic Marcotte d7c283f751 improved fetching of text parts over EAS 2015-02-12 08:49:17 -05:00
Ludovic Marcotte f3325b8b0d Updated NEWS file wrt fixes 2015-02-11 18:13:36 -05:00
Ludovic Marcotte b4ea4d7e9f Improvement over previous commit 2015-02-11 14:39:57 -05:00
Ludovic Marcotte 9447437d6f Added missing strings from previous commit 2015-02-11 14:33:32 -05:00
Ludovic Marcotte 322f72626a now possible to limit automatic forwards to internal/external domains 2015-02-11 14:30:40 -05:00
Ludovic Marcotte 55ae4cb8c0 First pass at EAS' best practices for SOGo 2015-02-11 12:59:04 -05:00
Ludovic Marcotte e5d01428ad now possible for SOGo to change the sambaNTPassword/sambaLMPassword 2015-02-11 11:31:35 -05:00
Jesús García Sáez 7406fc3772 Merge pull request #83 from Zentyal/ejhernandez/move-subfolder-to-root
Move subfolder (Mail, Journal, Notes) to root
2015-02-11 15:29:26 +01:00
Ludovic Marcotte 82178fd6ce Initial patch from tfu for bug #3055 2015-02-11 08:31:32 -05:00
Jesús García Sáez efe2070227 Merge pull request #85 from Zentyal/ejhernandez/dlinklist-samba
oc: Use dlinklist from samba for now
2015-02-11 10:05:51 +01:00
Enrique J. Hernández Blasco 68ebc9e0ff oc: Use dlinklist from samba for now
Due to https://github.com/openchange/openchange/pull/204.

Until it is published by OC or dismissed.
2015-02-10 23:37:40 +01:00
Ludovic Marcotte 6cf1ec998e Updated NEWS file for the #3095 bug fix in SOPE 2015-02-10 07:09:31 -05:00
Ludovic Marcotte 6c9b1a494f Fix for bug #2332 2015-02-09 16:12:59 -05:00
Ludovic Marcotte 98e4c8ca55 Fixed doc regarder domain vs. system settings 2015-02-09 09:10:55 -05:00
Julio J. García Martín 1178bf2d60 Merge pull request #84 from Zentyal/ejhernandez/fix-send-mail-sope-2.2.15
Fix send mail with sope 2.2.15
2015-02-09 13:41:29 +01:00
Enrique J. Hernández Blasco 96986812f4 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.
2015-02-07 00:22:45 +01:00
Enrique J. Hernández Blasco 142deeb5f0 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.
2015-02-05 23:49:59 +01:00
Enrique J. Hernández Blasco dc8012e3d3 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.
2015-02-05 23:48:46 +01:00
Ludovic Marcotte 3731819e15 Added patch from tfu for #2995 2015-02-05 16:21:27 -05:00
Ludovic Marcotte eca22caefc Fix for bug #3078 2015-02-05 11:14:53 -05:00
Ludovic Marcotte 923bcf8ae2 Applied patch for #3092 2015-02-05 09:29:29 -05:00
Francis Lachapelle 0b44fa81f4 Update NEWS file 2015-02-03 13:20:57 -05:00
Francis Lachapelle 776b17ff20 Fix mail editor when not called from mail module
Fixes #3088
2015-02-03 12:06:28 -05:00
Julio García 12b159a6c0 Merge branch 'master-upstream' into jjgarcia/merge-from-upstream 2015-02-02 12:53:49 +01:00
Ludovic Marcotte 2aa528dacc Preparation for the release 2015-01-30 11:08:43 -05:00
Francis Lachapelle d1d3980919 Update translations 2015-01-30 11:03:38 -05:00
Ludovic Marcotte cf35eec1f5 Improved the NEWS file for the release 2015-01-30 10:28:45 -05:00
Ludovic Marcotte 58a0b0c173 Updated for the release 2015-01-30 10:23:04 -05:00
Ludovic Marcotte 723a9d4e08 Reverted bug fix from #3054 and added comment 2015-01-29 16:21:06 -05:00
Francis Lachapelle 4cc158043e Improve CSS server-side cleaner
Fixes #3040
2015-01-28 16:38:27 -05:00
Ludovic Marcotte 7fd1564a86 fix for #3076 2015-01-28 15:16:21 -05:00
Ludovic Marcotte 981c718d22 improved handling of EAS Push when no heartbeat is provided 2015-01-28 15:03:49 -05:00
Jesús García Sáez 6cfa6b9952 Merge pull request #82 from Zentyal/jgarcia/appointments-alarms
oc-appointments: ignore alarms already triggered
2015-01-28 18:57:36 +01:00
Jesús García Sáez 0a198ccb05 Merge pull request #81 from Zentyal/ejhernandez/fix-move-db-folder
oc: Set right container in dbFolder when moving a folder
2015-01-28 16:34:27 +01:00
Jesús García Sáez 5258ee2e76 oc-appointments: ignore alarms already triggered 2015-01-28 12:56:27 +01:00
Jesús García Sáez d5ec25ee62 Merge pull request #79 from Zentyal/ejhernandez/fix-sync-move-between-different-folder-types
oc: Move back and forth folders now are in sync
2015-01-28 12:05:53 +01:00
Enrique J. Hernández Blasco 57d591c427 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.
2015-01-28 11:26:56 +01:00
Enrique J. Hernández Blasco b01de763da 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
2015-01-27 18:27:11 +01:00
Enrique J. Hernández 2dcb8fa732 Merge pull request #75 from Zentyal/ejhernandez/move-mail-folder-with-reserved-chars
oc-mail: Move mail folders with reserved chars
2015-01-26 23:39:15 +01:00
Jesús García Sáez 6ce4cc1919 Merge pull request #78 from Zentyal/jgarcia/sync-deleted-messages
Sync deleted messages
2015-01-26 18:03:54 +01:00
Enrique J. Hernández Blasco 0e8bf0d239 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.
2015-01-26 15:55:22 +01:00
Ludovic Marcotte 086361b79a Avoid GNUstep warnings 2015-01-23 16:16:36 -05:00
Ludovic Marcotte ab12c84887 More NSLog usage cleanups 2015-01-23 15:32:22 -05:00
Jesús García Sáez 312084243b oc: improve modseqFromMessageChangeNumber to return an approximation.
Only for scenarios where we hadn't store the cn <-> modseq relationship
2015-01-23 18:19:24 +01:00
Jesús García Sáez 47be392d4f oc: avoid request change number until necessary
Minor changenumber leak, but avoid it anyway
2015-01-23 18:18:25 +01:00
Jesús García Sáez 34efcfee4e 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
2015-01-23 18:17:45 +01:00
Jesús García Sáez 8e7f6d1aec 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.
2015-01-23 18:15:44 +01:00
Ludovic Marcotte e2bee23021 Avoid unnecessary calls to NSLog 2015-01-22 16:25:16 -05:00
Ludovic Marcotte 1a10599369 Removed unnecessary NSLog calls 2015-01-22 15:39:57 -05:00
Ludovic Marcotte d907d5d268 Avoid using NSLog() where we can 2015-01-22 13:31:31 -05:00
Jesús García Sáez 7014d94937 Merge pull request #74 from Zentyal/ejhernandez/delete-folder-on-moving
oc: Remove a source folder on move folder operation
2015-01-22 17:06:13 +01:00
Enrique J. Hernández Blasco 99a36be034 oc: Remove a source folder on move folder operation
Calling deleteFolder message to actually remove it from DB/IMAP
depending on the class.
2015-01-21 12:44:31 +01:00
Jesús García Sáez 8e41e5d665 Merge pull request #71 from Zentyal/ejhernandez/filetime-utc
Use PT_SYSTIME as absolute timestamp
2015-01-20 16:54:56 +01:00
Jesús García Sáez b1dfe47f01 Merge pull request #70 from Zentyal/jgarcia/working-encoding-parse
Outlook can view mails with non-ascii characters in their body (II)
2015-01-20 14:36:50 +01:00
Jesús García Sáez 014632fddb Merge pull request #72 from Zentyal/ejhernandez/wedding-anniversary
oc-contacts: Implement Wedding Anniversary
2015-01-20 14:36:14 +01:00
Enrique J. Hernández Blasco 8b44c08a32 oc-calendar: Remove unnecessary shifts on start,end and replace time props
As the data is sent in UTC, no shifts are longer required.
2015-01-20 14:35:32 +01:00
Enrique J. Hernández Blasco c893963da5 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.
2015-01-20 14:35:32 +01:00
Enrique J. Hernández Blasco c6b976a830 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.
2015-01-20 14:35:32 +01:00
Enrique J. Hernández Blasco d5d97db8e8 oc: PT_SYSTIME is an absolute timestamp
As the epoch is in UTC timezone, we set this timezone for NSCalendarDate.
2015-01-20 14:35:32 +01:00
Ludovic Marcotte d98ff69fbe Version bumps for the release 2015-01-20 08:35:10 -05:00
Jesús García Sáez 87a91fbdf2 Merge pull request #73 from Zentyal/cperez/sogo-multitenancy
Restore multitenancy changes for OpenChange
2015-01-20 11:09:48 +01:00
Ludovic Marcotte daa7ab87d7 Fix cosmetic change when fetching fb info 2015-01-19 13:54:04 -05:00
Carlos Pérez-Aradros Herce 00cef845b7 Restore multitenancy changes for OpenChange 2015-01-19 19:04:06 +01:00
Jesús García Sáez f9550b9181 oc: several uninitialized variables 2015-01-19 15:35:44 +01:00
Ludovic Marcotte 3e59b1ad6e Improved documentation regarding password policies over LDAP 2015-01-16 12:55:38 -05:00
Ludovic Marcotte e45451a9f9 Improved comments over previous commit 2015-01-16 09:18:37 -05:00
Enrique J. Hernández Blasco b35fee8efc oc-contacts: Implement Wedding Anniversary
As specified by Microsoft using x-ms-anniversary custom vcard element
[MS-OXVCARD] Section 2.1.3.9.6
2015-01-16 01:34:16 +01:00
Ludovic Marcotte e9e3dd5646 fixed timezone calculation on recurring event 2015-01-15 15:29:02 -05:00
Ludovic Marcotte 16c863d89d Fixed potential issue when handling multiple Add/Change/Delete/Fetch EAS commands (#3057) 2015-01-15 11:55:04 -05:00
Jesús García Sáez 7e7d302165 oc: warning if codepage not found from headerCharset 2015-01-15 13:50:26 +01:00
Jesús García Sáez d052356724 oc: encoding names must be case insensitive 2015-01-15 13:27:37 +01:00
Ludovic Marcotte d87056ebfa handle multipart for EAS/ItemOperations 2015-01-12 14:38:55 -05:00
Ludovic Marcotte 135b463e8f Updated the EAS doc 2015-01-12 13:39:06 -05:00
Ludovic Marcotte f4c4f5af62 fixed From's full name over EAS 2015-01-12 09:09:06 -05:00
Ludovic Marcotte 70e45f7843 fixed birthday offset in EAS 2015-01-12 08:40:06 -05:00
Ludovic Marcotte 28e449b050 Updated NEWS file for bugs fixed 2015-01-10 07:55:55 -05:00
Ludovic Marcotte 6b52e9c945 Fix for bug #2960 2015-01-09 09:04:15 -05:00
Ludovic Marcotte 1cfbea69c1 Make sure we always release local pool 2015-01-08 15:56:16 -05:00
Ludovic Marcotte cb9118d869 Moved the pool destruction at the correct location 2015-01-07 09:29:31 -05:00
Francis Lachapelle dd6dd7251c Fix selection of calendar in event/task editors
Fixes #3049
Fixes #3050
2015-01-06 13:59:20 -05:00
Ludovic Marcotte 24c6c8c91d Fix for bug #3054 2015-01-06 10:59:56 -05:00
Ludovic Marcotte b1ac7a0cca MultipleBookingsFieldName can be set to -1 2015-01-05 13:49:28 -05:00
Francis Lachapelle 59e6d6df4a Fix selection of calendar in event/task editors
Fixes #3049
Fixes #3050
2015-01-05 10:21:37 -05:00
Ludovic Marcotte 71ad5de910 Bumped everything for the release 2014-12-30 08:00:41 -05:00
Enrique J. Hernández b5369530f0 Merge pull request #69 from Zentyal/jgarcia/ignore-unhandled-properties
Ignore unhandled properties instead of abort
2014-12-30 12:31:16 +01:00
Ludovic Marcotte ead665de85 fix tz issue when the user one was different from the system one with EAS 2014-12-29 16:19:10 -05:00
Jesús García Sáez 838ae8995f 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()
2014-12-29 19:20:27 +01:00
Ludovic Marcotte a0c1ce8f3b Improved handling of non-existant vs. subscribed folders over EAS 2014-12-29 12:43:20 -05:00
Jesús García Sáez 3ef28b390d Merge pull request #66 from Zentyal/ejhernandez/guessing-recipients-from-import-PST
oc: Guess recipients from some properties while importing PST
2014-12-24 13:16:46 +01:00
Jesús García Sáez 0cd6fe6135 Merge pull request #67 from Zentyal/jgarcia/rtf-with-pict-data
Parse \pict control word with binary data
2014-12-24 13:16:03 +01:00
Ludovic Marcotte 204a62aa6a Improved comments in the code 2014-12-23 10:25:53 -05:00
Ludovic Marcotte 31cffdffd3 Fix freebusy info not always returned 2014-12-23 10:24:16 -05:00
Jesús García Sáez 501ee79766 oc-rtf: fix parse \pict tag with \bin data 2014-12-23 11:14:54 +01:00
Ludovic Marcotte 255bcbe92f Fixed memory leaks in SOGoSyncCacheObject and correctly kill the cache upon each EAS iteration 2014-12-22 19:59:33 -05:00
Ludovic Marcotte 72732879fa Added memory statistics - set SOGoDebugLeaks = YES and call [[self class] memoryStatistics] 2014-12-22 19:32:17 -05:00
Enrique J. Hernández Blasco a56fc93a9a 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.
2014-12-23 00:59:29 +01:00
Ludovic Marcotte 24a934275f Fix small memory leak incase of errors 2014-12-22 16:12:26 -05:00
Ludovic Marcotte 58f634bffe Cosmetic improvements to the code 2014-12-22 15:26:22 -05:00
Ludovic Marcotte ca4a754f2c Use the right cutoff date 2014-12-22 12:39:58 -05:00
Ludovic Marcotte 8015688df3 Added SOGoMaximumSyncResponseSize to support memory-limited EAS syncs 2014-12-22 11:50:51 -05:00
Ludovic Marcotte b07913d66d See NEWS file 2014-12-22 08:36:55 -05:00
extrafu 6b49a8a341 Merge pull request #68 from Crosenhain/master
Change ACL modification text to non-gender specific terms
2014-12-20 08:29:01 -05:00
Ludovic Marcotte df8a0d8715 Update ChangeLog 2014-12-19 09:03:37 -05:00
Ludovic Marcotte e6cc56dca1 Bumped version to 2.2.12a 2014-12-19 09:03:19 -05:00
Ludovic Marcotte de3d38262b Fix for bug #3034 2014-12-19 09:01:39 -05:00
Chris Rosenhain 0e56527e05 Change ACL modification text to non-gender specific terms 2014-12-19 11:04:05 +10:30
Ludovic Marcotte db911f323d Updated ChangeLog and version numbers for the release 2014-12-18 08:56:23 -05:00
Ludovic Marcotte fcddb37a0d Fixed typo and bumped for release 2014-12-18 08:53:31 -05:00
Francis Lachapelle 8e79d4f88b Update translations 2014-12-18 08:51:50 -05:00
Francis Lachapelle f8ab3d5a42 Update NEWS file 2014-12-18 08:45:27 -05:00
Ludovic Marcotte 8aea5f232e Fix for bug #3028 2014-12-17 16:18:39 -05:00
Ludovic Marcotte 493c366ac4 Fix for bug #3003 2014-12-17 15:26:02 -05:00
Ludovic Marcotte cd70bec9fa Fix for bug #3008 2014-12-17 13:57:49 -05:00
Jesús García Sáez 12cdc60af7 Merge pull request #65 from Zentyal/ejhernandez/fix-folder-other-users
Create child folder objects using parent context for real
2014-12-17 11:53:36 +01:00
Enrique J. Hernández Blasco dba17fbcbc 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).
2014-12-16 23:43:57 +01:00
Francis Lachapelle 6027cb50d4 Fix CSS and templates of component/apptmt editor 2014-12-16 16:13:59 -05:00
Ludovic Marcotte eb4d20e50f Privacy and categories support for tasks 2014-12-16 13:27:01 -05:00
Ludovic Marcotte 70dbcf0418 Fix for MeetingStatus applied yesterday 2014-12-16 13:24:10 -05:00
Ludovic Marcotte bfaaf6eb34 Revert back to using GNUSTEP_SYSTEM_LIBRARIES for teststrings 2014-12-16 13:17:59 -05:00
Ludovic Marcotte 68655deabd Improved rpath handling (#2996) 2014-12-16 12:36:08 -05:00
Ludovic Marcotte 7380b25b75 Be a bit more verbose regarding IMAP requirements for EAS 2014-12-16 10:55:12 -05:00
Ludovic Marcotte cbfb927ec9 Properly escape Attendee's email address in case it contains crap 2014-12-16 10:46:05 -05:00
Ludovic Marcotte 0f2798f017 Lucid fixes for EAS 2014-12-16 10:46:05 -05:00
Francis Lachapelle e040805e0d Fix display of dialog in RO appointment editor 2014-12-16 10:07:08 -05:00
Ludovic Marcotte fb6ef3aa8a Now possible to set alarms on event invitations 2014-12-16 09:20:27 -05:00
Ludovic Marcotte 3eac0f5261 Improved NEWS file 2014-12-15 19:37:04 -05:00
Ludovic Marcotte f29a74f82f avoid testing for IMAP ANNOTATION when X-GUID is available 2014-12-15 19:34:51 -05:00
Ludovic Marcotte 20b3d4882d MeetingStatus fix affecting iOS devices 2014-12-15 19:27:21 -05:00
Ludovic Marcotte 175b99b9ee Updated NEWS regarding previous commit 2014-12-15 19:25:38 -05:00
Ludovic Marcotte e79ea75834 Categories and privacy fixes for bug #3022 2014-12-15 19:24:10 -05:00
Ludovic Marcotte 9cb1f8097c Fix sogo-tool when cleaning up devices 2014-12-15 19:23:04 -05:00
Francis Lachapelle 54dabb6861 Update CKEditor to version 4.4.6 (+ sourcearea)
Added an enabled the 'Source Area' plugin to be able to edit the HTML
code directly.
2014-12-15 10:54:44 -05:00
Francis Lachapelle 6526d587f2 Localization 2014-12-11 14:13:56 -05:00
Ludovic Marcotte 9dd0d6c427 Draft autossave feature 2014-12-11 13:31:32 -05:00
Ludovic Marcotte 990f782b62 Allow including or not freebusy info from subscribed calendars 2014-12-11 10:01:21 -05:00
Ludovic Marcotte c8b74686cc Update ChangeLog 2014-12-10 15:22:32 -05:00
Ludovic Marcotte 16bf299b3b Version bump for the release 2014-12-10 15:22:01 -05:00
Ludovic Marcotte b8c79664e1 Update ChangeLog 2014-12-10 14:24:51 -05:00
Ludovic Marcotte 3c063e04fb v2.2.11a release + bug fix 2014-12-10 14:24:06 -05:00
Francis Lachapelle ce5e46f5fb Remove unused templates from SchedulerUI 2014-12-10 09:22:03 -05:00
Ludovic Marcotte 1c0e64f169 Update ChangeLog 2014-12-09 09:09:18 -05:00
Ludovic Marcotte aac6b22ab5 Preparation for the release 2014-12-09 09:08:54 -05:00
extrafu fd756b581d Merge pull request #67 from JensErat/documentation
ActiveSync URL fix and paragraph on common configuration issues
2014-12-09 07:30:53 -05:00
Jens Erat 39e8f055d7 Added information on common configuration issues
A very common issue (watching the mailing list) is not wrapping the
whole configuration in a dictionary. SOGo is not very helpful at
debugging broken configuration files, thus hinting `plparse` already
installed with the GNUstep runtime.
2014-12-09 13:23:21 +01:00
Ludovic Marcotte 64637d842b Prevent compilation failures with old gcc versions 2014-12-09 07:21:34 -05:00
Jens Erat 4e6214d6fc Fixed ActiveSync URL in documentation 2014-12-09 13:11:03 +01:00
Ludovic Marcotte 12788c847d New sogo-tool feature to manage EAS data 2014-12-08 10:45:34 -05:00
Ludovic Marcotte 2b95dd2c0a Avoid generating GUID for "Other user"/"Shared" folders 2014-12-08 10:29:23 -05:00
Ludovic Marcotte 9e14a37cb8 Improvements over fixes for #2982 2014-12-08 10:25:37 -05:00
Ludovic Marcotte ae0cbfe6a6 Fix for bug #2982 2014-12-05 13:52:10 -05:00
Ludovic Marcotte 3f3673cf5a Added SOGoSAML2LogoutURL 2014-12-04 17:59:17 -05:00
Ludovic Marcotte 9ef4d1f551 Fix for bug #3010 2014-12-04 12:21:23 -05:00
Ludovic Marcotte fe9ad9c6e9 Radically reduced EAS memory usage 2014-12-04 11:27:10 -05:00
Jesús García Sáez ba79234ceb Merge pull request #64 from Zentyal/ejhernandez/store-change-number-subfolders-cache
Store changeNumber maps with modseq in cache for subfolders
2014-12-03 16:05:51 +01:00
extrafu 47094b6d91 Update SOGoSAML2Metadata.xml
Fixed XML template generation.
2014-12-02 19:33:54 -05:00
Enrique J. Hernández Blasco 067809ef1c 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.
2014-12-01 23:19:38 +01:00
Jesús García Sáez bdf12e5c01 Merge pull request #62 from Zentyal/ejhernandez/fix-space-temporal-crash-setChangeKey
Attempt to sync an UID in setChangeKey to avoid crashing
2014-12-01 19:45:51 +01:00
Jesús García Sáez 97201c56a4 abort if attemp to sync an UID in setChangekey fails 2014-12-01 10:47:16 +01:00
Ludovic Marcotte 9ffa32eebd Enable SAML support on all Debian-based distro 2014-11-30 17:35:39 -05:00
Kamen Mazdrashki 4a6daf45e0 Merge pull request #61 from Zentyal/ejhernandez/memory-leaks
Fix memory leak on getPidTagSubject
2014-11-30 00:58:01 +01:00
Enrique J. Hernández Blasco 7691d616a9 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
2014-11-29 08:07:41 +01:00
Enrique J. Hernández Blasco 2c6d833c11 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
2014-11-28 10:04:18 +01:00
Enrique J. Hernández Blasco f4e15e2db8 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)
2014-11-28 10:04:10 +01:00
extrafu a942e96bee Merge pull request #11 from Xenopathic/master
Allow fallback if proxy did not authenticate user, and trusted proxy auth set
2014-11-27 14:14:07 -05:00
Ludovic Marcotte 1b715e0812 We now handle correctly the SOGo logout when using SAML (#2376 and #2379) 2014-11-27 11:37:08 -05:00
Ludovic Marcotte c3715c9485 Added additional bugfix for #2982 2014-11-26 15:27:36 -05:00
Ludovic Marcotte be608dc76c Bug fixes for #2378 and #2377 and documentation improvements 2014-11-26 15:09:30 -05:00
Ludovic Marcotte 5a5464dc61 An other fix for #2930 2014-11-26 13:24:04 -05:00
Ludovic Marcotte 89917c941c New entry for bug #2381 2014-11-26 13:01:50 -05:00
Ludovic Marcotte 913a75f410 Fix for bug # 2014-11-26 13:00:47 -05:00
Ludovic Marcotte 20e728afac Remove unnecessary comments 2014-11-25 17:28:12 -05:00
Ludovic Marcotte 5f14bc1101 Report the correct preference keys 2014-11-25 17:27:03 -05:00
Robin McCorkell b0633ba1f4 Add check for remote_user variable for trusted proxy auth
If trusted proxy authentication is on, yet the proxy did not authenticate the
user, then the default authentication method is used instead of returning 'Unauthorized'.
2014-11-24 09:43:28 +00:00
Ludovic Marcotte bb227443ed Check lenght of string before trying to use parameters 2014-11-22 08:14:31 -05:00
Ludovic Marcotte efff32e44d Update ChangeLog 2014-11-21 09:13:11 -05:00
Francis Lachapelle f7f78eaba6 Update CKEditor to version 4.4.5 2014-11-21 09:08:36 -05:00
Francis Lachapelle 78ea147383 Update translations 2014-11-21 08:53:12 -05:00
Ludovic Marcotte f7935c6084 Bumped version numbers for the releasex 2014-11-21 08:29:25 -05:00
Ludovic Marcotte 327147f716 Fixed typo 2014-11-19 12:07:50 -05:00
Ludovic Marcotte b4718f363b More documentation fixes for v2.2.10 2014-11-19 12:06:44 -05:00
Enrique J. Hernández Blasco a8b716fbaa 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.
2014-11-19 17:16:45 +01:00
Enrique J. Hernández Blasco ef7b919175 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.
2014-11-19 17:12:32 +01:00
Jesús García Sáez 973ab78761 oc: synchronize folders ChangeNumber <-> modseq 2014-11-19 17:12:32 +01:00
Jesús García Sáez c4b0ac209b NSString:objectFromJSONString now can parse single values
Like null => [NSNull null]
2014-11-19 17:12:32 +01:00
Jesús García Sáez 41320a4813 oc: NGImap4Connection:fetchUids changed error messages 2014-11-19 17:12:32 +01:00
Jesús García Sáez c410a9fc3f oc: NGImap4Connection:fetchUids don't delete RawResponse 2014-11-19 17:12:31 +01:00
Jesús García Sáez 24e35103ff 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
2014-11-19 17:12:31 +01:00
Enrique J. Hernández Blasco 616f2abbb2 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.
2014-11-19 17:12:31 +01:00
Enrique J. Hernández Blasco 3910769ae8 oc-folder: Uniform call to deleteMessageWithMID
To make sure flags argument is used accordingly with the specs
and not working by chance.
2014-11-19 17:12:31 +01:00
Enrique J. Hernández Blasco b67e1deda5 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
2014-11-19 17:12:31 +01:00
Enrique J. Hernández Blasco 35ca313c37 oc-calendar: Fix PidLidClipStart on recurrent events
The midnight value must be in user's timezone and returned back in UTC.
2014-11-19 17:12:31 +01:00
Enrique J. Hernández Blasco c631689975 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)
2014-11-19 17:12:30 +01:00
Enrique J. Hernández Blasco cd64ca199a 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.
2014-11-19 17:12:30 +01:00
Enrique J. Hernández Blasco be60fdebcc 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)
2014-11-19 17:12:30 +01:00
Enrique J. Hernández Blasco d076e04ad4 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.
2014-11-19 17:12:30 +01:00
Enrique J. Hernández Blasco 7e0cddc06b 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.
2014-11-19 17:12:30 +01:00
Enrique J. Hernández Blasco 258444bb93 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.
2014-11-19 17:12:30 +01:00
Enrique J. Hernández Blasco 75ce59d010 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.
2014-11-19 17:12:29 +01:00
Enrique J. Hernández Blasco cbfcd54858 oc-rtf: Use what RTF Spec 1.9.1 for control words
This reverts 7581c0a.
2014-11-19 17:12:29 +01:00
Enrique J. Hernández Blasco 415fb6034e 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.
2014-11-19 17:12:29 +01:00
Jesús García Sáez 445a1fb2d6 oc: MailMessages return correct codepage 2014-11-19 17:12:29 +01:00
Enrique J. Hernández Blasco c866bce8e8 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.
2014-11-19 17:12:29 +01:00
Jesús García Sáez ed4ca3bd1b 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.
2014-11-19 17:12:29 +01:00
Jesús García Sáez bb9764bc6b Revert "oc: cached usercontext updates indexing_context"
This reverts commit 0750f64b787db088e944756b66fbd0883cf44cbf.
2014-11-19 17:12:28 +01:00
Jesús García Sáez 05578bfcb6 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.
2014-11-19 17:12:28 +01:00
Jesús García Sáez a7c2054cce oc: cached usercontext updates indexing_context
Instead of use always the one given on initialization
2014-11-19 17:12:28 +01:00
Julien Kerihuel 52ad0e0e5b Prevent SOGo backend from crashing when mapistore_set_connection_info is
not called beforehand and connInfo is not initialized.
2014-11-19 17:12:28 +01:00
Kamen Mazdrashki dc8b73b12b oc/MailFolder: Add more logging so we can trace invalid message kyes 2014-11-19 17:12:28 +01:00
Kamen Mazdrashki 18acdf20a6 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
2014-11-19 17:12:27 +01:00
Kamen Mazdrashki 0a23f18fc9 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)
2014-11-19 17:12:27 +01:00
Kamen Mazdrashki b8366d796d oc/util: Tune dbmsgreader for new caching classes names 2014-11-19 17:12:27 +01:00
Jesús García Sáez 5ee8cb3a3f oc-rtf: check valid font name when generating <font> tag 2014-11-19 17:12:27 +01:00
Jesús García Sáez 4e3a242f2f oc-rtf: Don't crash when we don't know the specified font 2014-11-19 17:12:27 +01:00
Jesús García Sáez 68c38e2b5c 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
2014-11-19 17:12:27 +01:00
Jesús García Sáez f1d14fdeca multitenancy: adapt openchangedb_* calls 2014-11-19 17:12:26 +01:00
Jesús García Sáez a5550cff18 avoid decode @ from url with username on it 2014-11-19 17:12:26 +01:00
Ludovic Marcotte 95e3c7ca88 More doc fixes for v2.2.10 2014-11-18 18:36:59 -05:00
Ludovic Marcotte 6bbaf58d43 Initial pass of the doc for v2.2.10 on Debian/Ubuntu 2014-11-18 16:56:45 -05:00
Ludovic Marcotte ac55509aea Updated NEWS file regarding the SOPE commit for bug #2957 2014-11-18 12:45:15 -05:00
Francis Lachapelle 2781fbe0b3 Merge pull request #64 from JensErat/SOGo-asciidoc
Removed erroneous backslash in documentation
2014-11-18 06:17:32 -05:00
Jens Erat 19221beb1f Removed erroneous backslash in documentation 2014-11-18 11:32:12 +01:00
Francis Lachapelle 3d18c94789 Fix extraction of email addresses in some cases
Fixes #2945
2014-11-17 14:33:28 -05:00
Ludovic Marcotte 1f167d9e82 Fixed IMAP searches with non-ASCII folder names 2014-11-17 11:49:56 -05:00
Ludovic Marcotte 3872341a85 Added required patch for previous commit 2014-11-14 10:34:36 -05:00
Ludovic Marcotte b3cd609ae7 Added WindowSize support for GCS collections 2014-11-14 09:13:14 -05:00
Ludovic Marcotte c0f0f2023c added NEWS entry for BSON goodie 2014-11-12 15:09:26 -05:00
Ludovic Marcotte ea43f4a635 Comment improvement 2014-11-12 15:05:05 -05:00
Ludovic Marcotte d25fe1a58b Dramatically improved BSON deserialization speed by avoiding tz name lookups 2014-11-12 14:57:54 -05:00
Ludovic Marcotte 8e1dc0ecb0 Typo in previous commit 2014-11-12 12:56:34 -05:00
Ludovic Marcotte 715999edc8 Avoid compilation failures on non-RHEL 7 distros 2014-11-12 12:54:07 -05:00
Ludovic Marcotte c159d5461b disable rpm-check-build for now 2014-11-12 10:02:04 -05:00
Ludovic Marcotte 5284b57340 More EL7 fixes 2014-11-10 16:19:10 -05:00
Ludovic Marcotte d8e6447fcc More disable lasso 2014-11-10 16:17:06 -05:00
Ludovic Marcotte cb8b0b028e Disable lasso for RHEL7 for now 2014-11-10 16:15:05 -05:00
Francis Lachapelle df648c9204 Add 'zip' to packages dependencies
Fixes #2963
2014-11-10 13:51:38 -05:00
Ludovic Marcotte 624af1c0fb Fixed test 2014-11-10 08:58:30 -05:00
Ludovic Marcotte 395a8ddcfe Updated once more the tz and added missing zones 2014-11-07 10:36:11 -05:00
Ludovic Marcotte 8cd72a8fda Fix borken ORGANIZER fields during the PUT action 2014-11-07 10:06:53 -05:00
Ludovic Marcotte 11a4c1358d Fixed corrupted PNG files (#2975) 2014-11-06 11:23:34 -05:00
Ludovic Marcotte 54d8aa8887 Added new zone files 2014-11-06 11:10:31 -05:00
Ludovic Marcotte 49da494260 Fix for bug #2968 2014-11-06 11:09:16 -05:00
Ludovic Marcotte e08dd3f9eb Fix for bug #2978 2014-11-06 10:16:47 -05:00
Ludovic Marcotte 6de70e4043 sanitize strings before encoding them when using EAS 2014-11-06 09:35:58 -05:00
Francis Lachapelle 7052daa1c8 Fix rename of subscribed addressbooks 2014-11-05 10:05:25 -05:00
Francis Lachapelle 15be4861b6 Fix support for SieveFolderEncoding default
Fixes #2622
2014-11-05 08:44:52 -05:00
Ludovic Marcotte 4b9958336c Handle base64-encoded command parameters in EAS 2014-11-04 13:50:10 -05:00
Ludovic Marcotte 52fdcc34de Fixed typo 2014-10-31 06:46:03 -04:00
Ludovic Marcotte 08427e0bfb set userTimeZone if event has no tz 2014-10-30 18:58:52 -04:00
Ludovic Marcotte d76a4361a0 Added one more sanitization pass on decoded content 2014-10-30 09:20:21 -04:00
Ludovic Marcotte 70cd24e111 Fix for bug #2965 2014-10-29 16:42:52 -04:00
Ludovic Marcotte b5023eeb24 Fix for bug #2940 2014-10-29 14:56:03 -04:00
Ludovic Marcotte da962aed01 Added support for multiple calendars/addressbooks over ActiveSync 2014-10-29 14:20:03 -04:00
Ludovic Marcotte 395545ca51 WP fails to sync if an event is changed on the sever and the client sends a modification of another event 2014-10-29 11:13:18 -04:00
Ludovic Marcotte b53c726766 TZ fixes on WP devices all day events 2014-10-29 10:46:45 -04:00
Francis Lachapelle 6695aa083f Fix crash when opening a mailbox with empty filter
Fixes #2959
2014-10-17 15:22:38 -04:00
Ludovic Marcotte 42ef0bfc3f Added doc around IMAP word size vs. ActiveSync on large mail folders 2014-10-16 11:49:07 -04:00
Ludovic Marcotte fb95d84a3a Handle base64 encoded query strings, popular on Windows devices 2014-10-16 09:35:15 -04:00
Ludovic Marcotte 231987242b Handle empty Attendees tag 2014-10-16 09:10:54 -04:00
Ludovic Marcotte b4f7ec3708 Don't send empty <Responses> tag 2014-10-16 09:08:50 -04:00
Ludovic Marcotte b2cab02d70 Handle empty categories 2014-10-16 09:03:34 -04:00
Ludovic Marcotte d6ff9038ce Disable timezone in AS for now 2014-10-16 09:02:18 -04:00
Ludovic Marcotte c43ad37850 Disable OpenChange for now on RHEL 7 2014-10-15 15:21:20 -04:00
Ludovic Marcotte 096a0ef8e4 Disabled openchange builds on all i386 arch 2014-10-15 11:35:59 -04:00
Francis Lachapelle e2136e0413 Don't leak database passwords in the logs
Fixes #2953
2014-10-14 12:54:04 -04:00
Ludovic Marcotte 3264458f4b Added back -L directives to properly compile teststrings 2014-10-14 11:27:08 -04:00
Alexandre Cloutier 0327a42c9c Update NEWS file 2014-10-14 10:45:30 -04:00
Ludovic Marcotte 5f811e1a4e Added rpath for integration tests 2014-10-14 10:43:52 -04:00
Alexandre Cloutier 923aa5d9b6 bugfix #2952, default sorting for new user 2014-10-14 10:31:11 -04:00
Ludovic Marcotte 3416bfea94 Adjusted rpath and removed unusued -L directives 2014-10-14 10:00:05 -04:00
Ludovic Marcotte f663950808 Adjusted the rpath, removed unnecessary variables/values 2014-10-14 09:51:04 -04:00
Ludovic Marcotte ccabd93ff2 moved system lib dirs to additional lib dirs 2014-10-14 09:21:12 -04:00
Ludovic Marcotte c5a7bcf2aa Fixed the system lib dir to point to the sogo lib dir 2014-10-14 09:17:00 -04:00
Ludovic Marcotte 81ff6bebfe Removed dependancies when openchange is disabled 2014-10-14 09:02:15 -04:00
Ludovic Marcotte 1a8aa5a587 Fixed spec file to not build sogo-openchange if disabled 2014-10-14 09:00:14 -04:00
Ludovic Marcotte 4b76e2b933 Added lib64 in the search path 2014-10-14 08:43:28 -04:00
Francis Lachapelle 27ac9e3904 Cleanup of unused parameters 2014-10-09 15:51:30 -04:00
Francis Lachapelle f8a371e351 Fix folder's name when subscribing to a folder 2014-10-09 15:12:24 -04:00
Francis Lachapelle 460ed2e7bc Fix JavaScript warning on undefined variable 2014-10-09 15:11:06 -04:00
Francis Lachapelle 6cc8f17c86 Fix display name of subscribed folders 2014-10-09 15:10:20 -04:00
Ludovic Marcotte ff9d49be71 Dropped rpath since it seems to be ignored on el5 2014-10-08 10:25:46 -04:00
Ludovic Marcotte f1919d10ed Flag for conditional openchange build 2014-10-08 09:35:50 -04:00
Ludovic Marcotte 3e2de9701c Fixes 2014-10-08 09:29:08 -04:00
Ludovic Marcotte 435ebb9eb4 Fixes 2014-10-08 09:25:40 -04:00
Ludovic Marcotte ab9ba66b36 More fixes 2014-10-08 09:22:14 -04:00
Ludovic Marcotte 29295f93c5 Fixed again the spec file 2014-10-08 09:17:26 -04:00
Ludovic Marcotte 20e0cd6234 Fixed RHEL packaging with lib move to "sogo" app directory 2014-10-08 09:10:02 -04:00
extrafu 2208d5d4a7 Merge pull request #58 from JensErat/SOGo-asciidoc
Minor documentation issues and missing IMAP pooling option description
2014-10-08 07:37:44 -04:00
Jens Erat 25f68c7eb5 Added missing NGImap4DisableIMAP4Pooling option to documentation 2014-10-08 10:07:48 +02:00
Jens Erat 22844a5742 Minor fixes in documentation 2014-10-08 10:01:17 +02:00
Ludovic Marcotte e3837188fd Updated spec file for SOGo's private libraries move 2014-10-06 14:45:30 -04:00
Francis Lachapelle a0317046ba Card view: don't escape <br>'s in note field 2014-10-06 08:42:59 -04:00
extrafu f353b6d1c0 Merge pull request #57 from dekkers/make-png-non-executable
Make png files non-executable
2014-10-05 09:58:29 -04:00
Jeroen Dekkers 4cc6b72cfb Make png files non-executable 2014-10-05 15:47:00 +02:00
Francis Lachapelle d7f8427623 Improve XSL for documentation 2014-10-03 13:13:42 -04:00
Ludovic Marcotte 7f49dcb2fa Avoid using SOGO_SYSLIBDIR when testing since it's undefined 2014-10-02 13:10:54 -04:00
Ludovic Marcotte f29a47d443 Added rpath 2014-10-02 12:42:06 -04:00
Ludovic Marcotte f88cfae611 Improved and simplified rpath 2014-10-02 12:36:22 -04:00
Ludovic Marcotte fb3ddca9e8 Improved makefiles 2014-10-02 11:17:45 -04:00
Ludovic Marcotte ba4a50e778 Added rpath kungfu 2014-10-02 11:05:19 -04:00
Ludovic Marcotte 8875c42d25 Fixed makefile 2014-10-02 11:00:43 -04:00
Ludovic Marcotte 18431922ab Fixed makefile 2014-10-02 10:55:05 -04:00
Ludovic Marcotte f93c06e6a9 Fixed include 2014-10-02 10:50:34 -04:00
Ludovic Marcotte 68d79472a5 Fixed makefile for teststrings due to sogo lib change 2014-10-02 10:46:47 -04:00
Ludovic Marcotte 51ed371796 Adjusted debian install files regarding sogo lib move 2014-10-02 10:21:36 -04:00
extrafu 641b6a3174 Merge pull request #3 from dekkers/put-private-library-in-usr-lib-sogo
Put private SOGo libraries in /usr/lib/sogo
2014-10-01 14:39:18 -04:00
Jeroen Dekkers 6ded9e95b3 Put private libraries in /usr/lib/sogo 2014-10-01 20:36:42 +02:00
Ludovic Marcotte 25b7fffb00 Fix for bug #2930 2014-10-01 14:08:29 -04:00
Francis Lachapelle 89284d558c Add missing translation 2014-10-01 09:02:03 -04:00
Ludovic Marcotte 9610fcc5ca Bumped version 2014-09-29 15:30:02 -04:00
Ludovic Marcotte 9cdcfd1d4a Updated for the 2.2.9a release 2014-09-29 15:29:49 -04:00
Ludovic Marcotte 95b122c912 Simplified even more -safeString 2014-09-29 15:04:40 -04:00
Ludovic Marcotte aa0499dbac Fixed sanitization char skipping and #2936 2014-09-29 14:28:13 -04:00
extrafu a263939d8a Merge pull request #49 from Zentyal/Contrib
Several patches for the OpenChange integration
2014-09-29 09:07:36 -04:00
Francis Lachapelle 80acafadd3 Fix URL in documentation 2014-09-26 14:49:36 -04:00
Ludovic Marcotte 4c5be2fd97 Update ChangeLog 2014-09-26 14:31:57 -04:00
Ludovic Marcotte a5af5da259 Merge branch 'master' of https://github.com/inverse-inc/sogo 2014-09-26 14:30:30 -04:00
Ludovic Marcotte c0e8eb6ce3 Adjusted the doc for TB31 2014-09-26 14:29:20 -04:00
Francis Lachapelle 4be2ddb793 Update translations 2014-09-26 14:23:58 -04:00
Ludovic Marcotte 5744d18474 Updated scripts for TB31 2014-09-26 14:15:32 -04:00
Francis Lachapelle 9e1423cd4a New font for asciidoc documentation
We now use Lato.
2014-09-26 14:14:54 -04:00
Ludovic Marcotte 275eebde0f Updated NEWS file for the release 2014-09-26 10:53:01 -04:00
Ludovic Marcotte 0b6e3dc22d Fix for bug #589 2014-09-25 09:25:13 -04:00
Ludovic Marcotte 3675220756 Refactored code to be more rigorous Unicode-wise. 2014-09-24 14:14:25 -04:00
Ludovic Marcotte 1c60ab2337 Fix for bug #2889 2014-09-24 12:02:12 -04:00
Ludovic Marcotte f4372af16d Add over DAV a PARTSTAT if none is defined 2014-09-23 13:46:44 -04:00
Ludovic Marcotte 6ba85ee43a Added some comments in the code 2014-09-22 11:38:07 -04:00
Ludovic Marcotte ae6afedc92 Fixed potential exception when Calendar module is disabled 2014-09-22 08:38:01 -04:00
Ludovic Marcotte d572f2af02 get rid of control chars before returning the response 2014-09-19 14:34:20 -04:00
Ludovic Marcotte a338b193ba Fix for bug #2838 2014-09-17 19:45:44 -04:00
Ludovic Marcotte 11adf388cf Cleaned the code and fixed #2894 while at it ... 2014-09-17 11:51:46 -04:00
Ludovic Marcotte a4ab2942e8 Fix for bugs #2878, #2879 2014-09-17 11:35:09 -04:00
Francis Lachapelle 7e281dca99 Fix encoding of calendar names in Web interface 2014-09-17 09:45:44 -04:00
Ludovic Marcotte ce1896b627 Fixed typo 2014-09-17 09:36:35 -04:00
Ludovic Marcotte f52a083326 fixed sending mails to multiple recipients over AS 2014-09-17 09:34:36 -04:00
Ludovic Marcotte 8ba031d6ec Consider 0x0C as "unsafe" 2014-09-15 19:54:07 -04:00
Ludovic Marcotte c5c2bfb7a6 Fixed iCal detection for 10.9 (and perhaps even 10.8) 2014-09-15 14:10:05 -04:00
Alexandre Cloutier 6ec79f7792 bugfix with threads collapsing for a nested folder 2014-09-15 10:38:02 -04:00
Francis Lachapelle 4b9db66f8b Fix warning when generating docbook 2014-09-15 10:33:44 -04:00
Ludovic Marcotte 02b3de6465 Fix for bug #2326 2014-09-15 09:32:36 -04:00
extrafu e0fee3b0e0 Merge pull request #56 from JensErat/SOGo-asciidoc
Converted documentation to ASCIIdoc
2014-09-15 09:08:25 -04:00
Jens Erat 4b49fc33b2 Updated for 2.2.8 2014-09-15 02:48:44 +02:00
Jens Erat 19b313e6c4 Updated some copyright lines from PacketFence to SOGo 2014-09-15 02:48:44 +02:00
Jens Erat 397d8d7574 Remove old documentation files 2014-09-15 02:48:44 +02:00
Jens Erat 8a564975c8 Added makefile for asciidoc-conversion, included docbook-templates 2014-09-15 02:47:36 +02:00
Jens Erat 95191cb29b Added other documentation files as asciidoc 2014-09-15 02:47:36 +02:00
Jens Erat 8d4c0ff694 Converted Installation Guide to asciidoc 2014-09-15 02:47:36 +02:00
Ludovic Marcotte 8b4a16df4e NEWS entry for previous commit 2014-09-12 14:10:22 -04:00
Ludovic Marcotte b8b3519a40 Initial support for multiple alarms and better iCal compatibility 2014-09-12 14:09:28 -04:00
Ludovic Marcotte 12a4fd05a2 Support for repetitive alarms and tasks 2014-09-12 08:34:15 -04:00
extrafu 8cdaac6300 Merge pull request #35 from dekkers/link-libraries-correctly
Link correctly against libraries used
2014-09-11 21:02:08 -04:00
extrafu 0e21904c03 Merge pull request #10 from dekkers/link-libsogo-with-libdl
Link libSOGo with libdl on systems with glibc
2014-09-11 21:01:30 -04:00
extrafu 496fa73d36 Merge pull request #26 from Skrupellos/master
ModulesConstraints tests all values of a multi-valued attributes
2014-09-11 16:09:06 -04:00
Francis Lachapelle 0825a810e3 Add missing localization string 2014-09-11 11:58:39 -04:00
Francis Lachapelle ed85a09ff0 Allow alarms to be snoozed for 1 day 2014-09-11 11:55:20 -04:00
Ludovic Marcotte 38cb86bdb1 Update ChangeLog 2014-09-10 14:15:34 -04:00
Alexandre Cloutier 69c8aa0743 quickfix for IE for searchInbox 2014-09-10 13:22:36 -04:00
Alexandre Cloutier 60e3c1c822 Merge branch 'master' of https://github.com/inverse-inc/sogo 2014-09-10 13:02:45 -04:00
Alexandre Cloutier 36b833ccb5 bugFix InboxSearch IMAP query keywords 2014-09-10 13:02:13 -04:00
Francis Lachapelle 9d6bcb00bc Fix compilation warning 2014-09-10 11:58:47 -04:00
Francis Lachapelle 1dd3dbacb5 Various fixes and improvements to the Mail module 2014-09-10 11:37:52 -04:00
Francis Lachapelle c441fa5b80 Various fix and improvements to Scheduler module 2014-09-10 10:58:58 -04:00
Francis Lachapelle 7e297ad56c Remove spaces 2014-09-10 10:58:46 -04:00
Francis Lachapelle 8eb4212f5d Various fix and improvements to Mail module 2014-09-10 10:49:54 -04:00
Luc Charland 3ad9327d17 putting test-prevent-invitations back in 2014-09-10 10:25:42 -04:00
Ludovic Marcotte 0483794f45 Updated the documentation for the release 2014-09-10 09:20:47 -04:00
Alexandre Cloutier 3c1d6d7d89 bugfix; UserSettings was not refresh properly after toggling threads 2014-09-09 16:05:12 -04:00
Francis Lachapelle 1dcf631ad6 Update translations 2014-09-09 15:50:39 -04:00
Ludovic Marcotte cbc53b3a52 Updated NEWS file 2014-09-09 15:38:15 -04:00
Alexandre Cloutier 574c245758 bugfix PreventInvitation; fix object parsing on a blank user 2014-09-09 15:36:14 -04:00
Alexandre Cloutier f3ca4ea7fc bugfix foldingThread; Renaming a foldername with a space was not correctly handled 2014-09-09 15:36:14 -04:00
Ludovic Marcotte e542ff5646 Fix for bug #1240 2014-09-09 15:15:56 -04:00
Francis Lachapelle bbe1e09ab9 Merge pull request #52 from alexcloutier/feature/RefreshViewCheck
All modules can now be automatically refreshed
2014-09-09 15:12:21 -04:00
Alexandre Cloutier 9daab5a9a1 update NEWS file 2014-09-09 14:28:05 -04:00
Alexandre Cloutier 1fb3198dbc applied comments 2014-09-09 14:27:05 -04:00
Alexandre Cloutier d62c504763 Changed the configurable variable SOGoMailMessageCheck to a general refresh associated to the current view 2014-09-09 14:27:05 -04:00
extrafu 126a05d391 Merge pull request #54 from alexcloutier/feature/FoldingThreads
Feature/folding threads
2014-09-09 14:06:30 -04:00
extrafu 42ffe14052 Merge pull request #55 from alexcloutier/bugfix/LabelsTagging
Bugfix/labels tagging
2014-09-09 14:06:19 -04:00
Alexandre Cloutier 7db526a5d9 bugfix for new user without userSettings.mail 2014-09-09 13:51:02 -04:00
Alexandre Cloutier 06f81a032c applied comments 2014-09-09 13:51:02 -04:00
Alexandre Cloutier df42c31618 Update NEWS file 2014-09-09 13:51:02 -04:00
Alexandre Cloutier e6002c9b2a applied comments 2014-09-09 13:51:02 -04:00
Alexandre Cloutier 0c88edc61b bugfix where an exception was raised if threadsCollapsed is undefined 2014-09-09 13:51:02 -04:00
Alexandre Cloutier 267a689683 Applied comments 2014-09-09 13:51:02 -04:00
Alexandre Cloutier c9d1294a8a Manage the collapse UIDs save in the user settings 2014-09-09 13:51:02 -04:00
Alexandre Cloutier 59023da7f0 applied comments and fix bug where the folded threads were saved only after refreshing the entire page 2014-09-09 13:51:02 -04:00
Alexandre Cloutier c5f9dd086b Possibility to collapsed threads with persistance 2014-09-09 13:51:02 -04:00
Alexandre Cloutier 0bfaceb398 applied comments 2014-09-09 12:51:59 -04:00
Alexandre Cloutier 9a380f711c bugfix PreventInvitation 2014-09-09 11:30:00 -04:00
Ludovic Marcotte 8c8e7d24a7 Modified Apache's config file to handle Apache > 2.3 2014-09-08 15:25:21 -04:00
Alexandre Cloutier 77c50e5232 applied comments; fix errors from merge and update NEWS file 2014-09-08 14:11:42 -04:00
Francis Lachapelle 56ef00661c Merge pull request #50 from alexcloutier/feature/SearchInbox
New feature to search multiple mailboxes
2014-09-05 16:09:59 -04:00
Francis Lachapelle b639c2d251 Fixes for IE 2014-09-05 16:04:29 -04:00
Alexandre Cloutier 984e208dd9 IE bugfixes 2014-09-05 11:01:57 -04:00
Luc Charland 606ee9780e dont test prevent invitations 2014-09-04 22:36:02 -04:00
Luc Charland c6f82dac01 catch specific exception 2014-09-04 22:24:32 -04:00
Luc Charland e37a603632 should help some builds that might timeout 2014-09-04 21:59:36 -04:00
Alexandre Cloutier ca8351d1f9 fix IE7, IE8, IE9, IE10, IE11 GUI 2014-09-04 10:50:03 -04:00
Luc Charland 031e4c9409 more of the same 2014-09-03 22:43:49 -04:00
Luc Charland c621bbcd56 Those need the same adjustments 2014-09-03 22:32:46 -04:00
Luc Charland 4b94a183be urllib.quote needs a string 2014-09-03 13:50:13 -04:00
Alexandre Cloutier 32476b16cc applied comments and fix bug when tagging msgs already tagged 2014-09-02 14:31:46 -04:00
Alexandre Cloutier 3b65eaea0b Tagging labels with 1 AJAX request 2014-09-02 13:42:04 -04:00
Alexandre Cloutier 7e26d80c77 merge conflicts 2014-09-02 10:11:27 -04:00
Francis Lachapelle 1af52e6d6b Fix message labels handling
Selecting "none" from the label submenu on a multiple selection of
messages is now working. When changing the label of multiple messages,
the display is now properly updated.

Fixes #2902
2014-08-29 15:39:06 -04:00
Alexandre Cloutier eaf815eae6 update NEWS file 2014-08-29 14:55:21 -04:00
Alexandre Cloutier 9bd09cc55d add the location column 2014-08-28 13:20:43 -04:00
Luc Charland ced0962894 Added white_listed_attendee to the config file 2014-08-28 10:43:32 -04:00
Francis Lachapelle dadad3df2a Fix some compilation warnings 2014-08-28 09:38:09 -04:00
Alexandre Cloutier da184f8459 bugfix#2864 2014-08-27 16:50:45 -04:00
Alexandre Cloutier 03152ea3d4 bugfix with DND from calendar view to calendar list 2014-08-27 16:01:35 -04:00
Alexandre Cloutier 8fbd2384a4 Merge branch 'master' of https://github.com/inverse-inc/sogo 2014-08-27 13:55:02 -04:00
Alexandre Cloutier 84a08659ec bugfix where it is not possible to delete msg when mailbox is full 2014-08-27 13:50:56 -04:00
Luc Charland d749d5c2fb Added tests for prevent invitation and whitelist 2014-08-27 13:31:49 -04:00
Alexandre Cloutier 07a138e0d6 applied comments and add the possibility to resize the search inbox window 2014-08-27 12:30:33 -04:00
Alexandre Cloutier 76c9b45fd0 update Localizable.strings
Update the print window options strings
2014-08-26 14:25:27 -04:00
Alexandre Cloutier 1ab3a588f3 Merge branch 'master' of https://github.com/inverse-inc/sogo 2014-08-26 13:41:58 -04:00
Alexandre Cloutier 38a3b7bb4f print calendars events&Tasks with colors - either borders or backgrounds 2014-08-26 13:36:42 -04:00
Francis Lachapelle b2b77c65d3 Fix folders paths of "sogo-tool restore -l" 2014-08-26 09:00:13 -04:00
Alexandre Cloutier 6aecccf6ca indentations 2014-08-25 13:46:35 -04:00
Francis Lachapelle e4a84d4920 Fix usage of SOGoSubscriptionFolderFormat default 2014-08-25 12:15:05 -04:00
Francis Lachapelle 28f26ec08e Fix display of users with no possible subscription 2014-08-25 10:16:10 -04:00
Francis Lachapelle 74bd96e5a6 Fix encoding of new calendars + new subscriptions 2014-08-25 10:12:09 -04:00
Alexandre Cloutier e044476772 bugFix #2827 2014-08-15 13:41:30 -04:00
Alexandre Cloutier c76cb36461 Disable the search button on toolbar once it is opened 2014-08-15 13:06:46 -04:00
Alexandre Cloutier 73fcdc2306 adjust css for other browser, fix display bug 2014-08-15 11:41:37 -04:00
Ludovic Marcotte b9dd1ddc5a Fix for bug #2892 2014-08-15 09:57:19 -04:00
Alexandre Cloutier 8783f09a4a fix leak 2014-08-14 15:01:40 -04:00
Alexandre Cloutier 52476251b8 applied comments, fix bug and add sortable results 2014-08-14 14:49:44 -04:00
Alexandre Cloutier f6c7ca3379 applied comments 2014-08-13 17:41:58 -04:00
Alexandre Cloutier c3e46e4baf code refactoring and GUI improvement 2014-08-11 09:25:09 -04:00
Alexandre Cloutier 7794d716b9 version 1 of the inbox search 2014-08-06 14:49:36 -04:00
Francis Lachapelle 5b886e5c4d Fix issue with DnD of tasks with FireFox 2014-08-01 12:26:53 -04:00
Jesús García Sáez 1a2fe8908b Revert "Merge pull request #2 from Zentyal/jgarcia/fix-encoding-of-mapistoreuris" 2014-08-01 15:50:17 +02:00
Ludovic Marcotte cde1db9324 Refactored GCSFolder: -writeContent and fixed sogo-tool restore 2014-08-01 09:40:45 -04:00
Ludovic Marcotte f43341c100 Fixed JSON'ification of the admin module 2014-07-31 16:19:49 -04:00
Ludovic Marcotte b05fcc7d82 Fat commit to refactor the quick record generation 2014-07-30 14:51:00 -04:00
Francis Lachapelle 07324e56a0 Update ChangeLog 2014-07-30 11:16:35 -04:00
Francis Lachapelle 397a36cc89 Preparation for release 2.2.7 2014-07-30 11:16:10 -04:00
Francis Lachapelle c240931c54 Update CKEditor to version 4.4.3 2014-07-30 11:15:05 -04:00
Francis Lachapelle ef2432e10f Update NEWS file 2014-07-30 10:36:31 -04:00
Francis Lachapelle 571322958a Update fi, fr, de, and es_ES translations 2014-07-30 10:33:15 -04:00
Francis Lachapelle bd5c05cca2 Indentation in JavaScript files 2014-07-30 10:31:25 -04:00
Francis Lachapelle ea44308aa3 Fix all-day events display in IE
It also fixes the display of the event categories for all-day events in
IE.
2014-07-29 16:05:46 -04:00
Carlos Pérez-Aradros Herce f76a6cfc96 Fix mysql cleanup log message 2014-07-29 18:27:20 +02:00
Kamen Mazdrashki 2b3bc10f78 Scripts/openchange_user_cleanup: Don't hardcode samba private dir, use samba LoadParm()
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-29 18:26:30 +02:00
Jesús García Sáez 3eba5f940e increase log level of debug message 2014-07-29 18:25:46 +02:00
Jesús García Sáez 7f2ee7be89 Error message only when initialization hadn't been done
In a multithread environment, sogo_backend_init is registering the thread
only for the first one that calls this function, then the others threads
(even if they call sogo_backend_init) won't be registered because
moduleInitialized was YES.

We just want to ensure sogo_backend_init is called at least once (per process,
not per thread).
2014-07-29 18:25:28 +02:00
Miguel Julián 41f2e917e7 Removed development tip comment 2014-07-29 18:22:34 +02:00
Miguel Julián 65ece61273 Removing some trail characters at event description
* They are sometimes present after a \r\n\n
2014-07-29 18:22:32 +02:00
Ludovic Marcotte 94f3246658 Improved error message when you cannot invite users 2014-07-29 10:36:20 -04:00
Ludovic Marcotte 1df7e989e0 Removed worthless declaration 2014-07-25 14:48:25 -04:00
Francis Lachapelle d9ca1051b3 Improve headers of multicolumns view 2014-07-25 11:34:33 -04:00
Ludovic Marcotte 4eefa4c269 Fixed test since we now return a 200 instead of a 204 2014-07-25 08:12:12 -04:00
Ludovic Marcotte 4c21a050d9 JSON interface to folder subscriptions 2014-07-24 14:00:57 -04:00
Alexandre Cloutier b52289904f task.png for DnD taskList 2014-07-24 13:48:41 -04:00
Alexandre Cloutier d5b71526ed Merge branch 'master' of https://github.com/inverse-inc/sogo 2014-07-24 13:44:02 -04:00
Alexandre Cloutier c389630d76 DnD tasksList 2014-07-24 13:35:14 -04:00
Ludovic Marcotte f6ef94a631 improved handling of SOGoSubscriptionFolderFormat 2014-07-24 12:48:03 -04:00
Francis Lachapelle 5de51e8aa1 Fix missing argument with new DnD controller 2014-07-24 09:30:19 -04:00
Ludovic Marcotte 006727a74b Properly destroy cache objects of vanished folders 2014-07-24 08:39:41 -04:00
extrafu 037dd67635 Merge pull request #47 from dekkers/mailpartviewers-requires
Add Mailer and Appointments to product.list requires of MailPartViewers
2014-07-22 14:00:35 -04:00
Jeroen Dekkers 6619840f80 Add Mailer and Appointments to product.list requires of MailPartViewers 2014-07-22 19:54:18 +02:00
Francis Lachapelle 08fd2fcfaa Fix JavaScript after bad merge 2014-07-22 13:26:28 -04:00
Alexandre Cloutier a43dd97fc9 Fix bug with DnD; leftPanelController.stopEvent() 2014-07-22 11:37:45 -04:00
Francis Lachapelle 192659fdd9 Add missing localizable string 2014-07-21 16:12:27 -04:00
Francis Lachapelle 06fe36fd75 Add missing localizable strings 2014-07-21 16:07:13 -04:00
Francis Lachapelle 24f9d83ff7 Fix JavaScript from merge leftover 2014-07-21 16:06:24 -04:00
Ludovic Marcotte 8dd967d0a8 Updated NEWS file for two merged pull requests 2014-07-21 15:38:23 -04:00
Ludovic Marcotte 08cd080d47 Fixed charset substitution in meta tags 2014-07-21 15:34:56 -04:00
Francis Lachapelle 11920f592c Merge pull request #46 from alexcloutier/feature/DragNDropCalendars
Improve drag'n'drop of events in multi-column view
2014-07-21 11:00:27 -04:00
Alexandre Cloutier 28e6bb8b9d Applied comments 2014-07-21 09:52:09 -04:00
Alexandre Cloutier b892b3f794 Add RegEx 2014-07-21 09:52:09 -04:00
Alexandre Cloutier cdf4cc1acb fix DnD from eventList to calendarList for repeated event 2014-07-21 09:52:08 -04:00
Alexandre Cloutier 3cac794de5 move line 2014-07-21 09:52:08 -04:00
Alexandre Cloutier 8f9b24a23f visual helper while dragging from calendar view to calendarList 2014-07-21 09:52:08 -04:00
Alexandre Cloutier a2a7014140 fix dnd repeated event bug + applied comments 2014-07-21 09:52:08 -04:00
Alexandre Cloutier a5ecb2063f added event7.png and adjust javascript indentation 2014-07-21 09:52:08 -04:00
Alexandre Cloutier 9bd7aeebfb DnD from calendarView to CalendarList 2014-07-21 09:40:04 -04:00
Alexandre Cloutier 01af72cfe9 DnD from eventList to the calendarList 2014-07-21 09:40:04 -04:00
Alexandre Cloutier 6dddb5c98c dragNdrop from the events table to the calendars list 2014-07-21 09:40:04 -04:00
Alexandre Cloutier ccf181bcf9 applied comments and fix repeated events dragNdrop between calendars 2014-07-21 09:40:04 -04:00
Alexandre Cloutier e478b29c2e creating and dragNDrop between calendars in multicolumndayview 2014-07-21 09:40:04 -04:00
Francis Lachapelle f3ded6ce2a Merge pull request #45 from alexcloutier/feature/PreventInvitations
New user preference to prevent invitations
2014-07-21 09:38:42 -04:00
Alexandre Cloutier c2027f072d indentation 2014-07-21 09:29:00 -04:00
Alexandre Cloutier ce6a31dd38 Adjust line of code to make it easier to read 2014-07-21 09:27:02 -04:00
Alexandre Cloutier a71013eebf javascript indentation 2014-07-21 09:27:02 -04:00
Alexandre Cloutier eaec5a614d Change exception 403 to 409 and fix indentation in the javascript 2014-07-21 09:27:02 -04:00
Alexandre Cloutier 5217bed5ae Organized the categories and appointments invitations inside a tabContainer 2014-07-21 09:27:02 -04:00
Alexandre Cloutier 17319cc8dd reverted UIxListEditor.wox 2014-07-21 09:27:02 -04:00
Alexandre Cloutier 89d116363c replace ampersands with commas 2014-07-21 09:27:02 -04:00
Alexandre Cloutier 7c3e85f517 applied comments 2014-07-21 09:27:02 -04:00
Alexandre Cloutier 05fb7ae0c8 applied comments 2014-07-21 09:27:02 -04:00
Alexandre Cloutier ef20108e32 fix bug where the user could enter any names in the whitelist 2014-07-21 09:27:02 -04:00
Alexandre Cloutier b5c0363400 applied comment and refactor code 2014-07-21 09:27:02 -04:00
Alexandre Cloutier f0b8eb8dfb server side code to integrate the whitelist 2014-07-21 09:27:02 -04:00
Alexandre Cloutier 16d02455bd Serialization of the whiteList 2014-07-21 09:27:02 -04:00
Alexandre Cloutier 8ded5a8aaf Prevent Invitations and whitelist GUI 2014-07-21 09:27:02 -04:00
Ludovic Marcotte 1cc93c700a Updated NEWS file for changes occurred right after v2.2.6 was released 2014-07-09 14:08:31 -04:00
Francis Lachapelle 44d0cb5c0d Fix refresh of list when forwarding a message
Fixes #2818
2014-07-09 11:19:35 -04:00
Ludovic Marcotte dbdb7d9051 Fix sending of METHOD:REPLY for DAV clients 2014-07-09 10:04:44 -04:00
Francis Lachapelle e343ed240b Fix regression of word breaking
Fixes #2845
2014-07-08 22:01:41 -04:00
Francis Lachapelle 45553be122 Fix rename of calendars, improve tasks count badge 2014-07-08 17:19:55 -04:00
Alexandre Cloutier 1cf4841477 fix display glitch 2014-07-04 11:23:59 -04:00
Alexandre Cloutier 017a85b7f2 fix month events categories display 2014-07-04 10:46:49 -04:00
Alexandre Cloutier 103bb6803a Merge branch 'master' of https://github.com/inverse-inc/sogo 2014-07-04 10:38:24 -04:00
Alexandre Cloutier 8c8e47daf6 fix spacing between events and categorie display 2014-07-04 10:37:35 -04:00
Ludovic Marcotte 8a17246725 Cleaned up code and fixed the translation of the weekdays in the datepicker 2014-07-04 10:18:56 -04:00
Ludovic Marcotte 4843c6b6d7 Renamed Multi-Column to Multicolumn and refactored some code 2014-07-04 08:55:35 -04:00
Kamen Mazdrashki 1846e1ee5d oc/TallocWrapper: don't handle Threading initialization here
It is SOGo backend module responsibility to setup/teardonw all
ObjC specific initialization

Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 15:20:51 +02:00
Kamen Mazdrashki 1fc3a57210 oc: Protect backend initialization to happen only once 2014-07-02 15:20:31 +02:00
Kamen Mazdrashki 5b75c817e2 oc: Log when mapistore backend is successfully initialized 2014-07-02 15:20:19 +02:00
Kamen Mazdrashki c91741ad1f oc/dbmsgreader: Fix to work again this time basen on BSON format for msg data
Also, implement reading for message data in case only 1 param is passed.
This could be usefull when have msg data by other means than by
reading it directly from DB

Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 15:19:59 +02:00
Kamen Mazdrashki 86e54989fb oc/utils: Make "plext" category publicly visible
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 15:19:47 +02:00
Kamen Mazdrashki 116e738e63 oc/utils: Move OCDumpPListData() function into plreader - this is the only user for this function
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 15:19:31 +02:00
Kamen Mazdrashki bf0f2a76d5 oc/MAPIStoreSOGo: Do not destroy current thread context after any API call
We have thread context already in place during *_init() function.
Thus guarding every API call with TreadInit/Destroy is:
- a bit redundand
- makes SOGo backend not reentrant even on single thread and leads
  to hard to find use-after-free crashes

Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 15:19:19 +02:00
Kamen Mazdrashki 6de298d202 oc/MAPIStoreMapping: Split the check for existing entry so we have better error message
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 15:18:49 +02:00
Kamen Mazdrashki 98505c1b6b oc/MAPIStoreContext: Fix log messages to actually print 64bit FMIDs
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>

Conflicts:
	OpenChange/MAPIStoreContext.m
2014-07-02 15:18:33 +02:00
Miguel Julián 51df0adb79 Removed development tip comment 2014-07-02 15:00:24 +02:00
Miguel Julián 5d43513dd9 Removing some trail characters at event description
* They are sometimes present after a \r\n\n
2014-07-02 14:59:16 +02:00
Miguel Julián 2458af1a43 All day events deladyed one day if user timezone is +XX:XX
* Those events were not shown properly in SOGo web UI
2014-07-02 14:59:06 +02:00
Kamen Mazdrashki 2792baac02 openchange: don't overflow possible recipient type while creating message headers
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:58:57 +02:00
Kamen Mazdrashki 4b383705ff openchange: Fix submitWithFlags to submit to BCC-ed recipients also
this reintroduces commit 7efb263c659451d2c781547a5b38cb5d01ed837f

Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:58:47 +02:00
Kamen Mazdrashki dd7200e00f openchange/MAPIStoreFolder: Add private selector for actual folder delete action
Usually, it is a bad idea for an object to call its own public methods
(just like in this case). Thus separating impelementation for deleteFolder:
would allow MAPIStoreFolder to call only private implementation when needed

Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:58:33 +02:00
Kamen Mazdrashki 27851ef428 openchange: FillMessageHeadersFromProperties fix skipping of last value in
possible range of recepients

IMHO, this fixes a bug, that when saving a meessage, it  is saved
without BCC fields.

Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:58:16 +02:00
Kamen Mazdrashki 7da8885190 openchange: getMessageData - replace int literals with ulRecipClass values
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:58:06 +02:00
Kamen Mazdrashki fc9dc08045 oc-sogo: pretty print Exceptions in sogo_backend_handle_objc_exception()
Now we have a nice stack trace printed out from [NSException callStackSymbols]

Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:53:34 +02:00
Kamen Mazdrashki bcfb674cd1 oc-sogo: Print both [NSException callStackSymbols] and execinfo.h stack trace
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:53:24 +02:00
Kamen Mazdrashki 6be768af42 oc-sogo: Move memory clean up *after* handling the exception
Otherwise the mess is full :)

Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:53:10 +02:00
Kamen Mazdrashki 2c94d21f3e oc-sogo: Use [e name] and [e reason] selectors
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:52:59 +02:00
Kamen Mazdrashki cbe616358d oc-sogo: Clean up AutoRelease pool and unregister threads in Catch handler
Most of the time we have "not yet implemented" kind of exceptions,
so it is better to clean up allocated resources

Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:52:34 +02:00
Kamen Mazdrashki 09e6fcc3ff oc-sogo: try/catch to guard only the actual impelementation rather than *everything*
Signed-off-by: Kamen Mazdrashki <kmazdrashki@zentyal.com>
2014-07-02 14:52:20 +02:00
Jesús García Sáez 3b2174eeec if there is no password file for specific user, try to read global password file
This way we can have a master password for imap access
2014-07-02 14:51:08 +02:00
Jesús García Sáez c6b8be742d use execinfo.h to get backtrace
Really poor backtrace because it will only have the frames from oc side,
I don't know why callStackSymbols is returning null, compilation flags?
2014-07-02 14:50:54 +02:00
Jesús García Sáez a77863947f add try catch to all functions on struct mapistore_backend 2014-07-02 14:50:41 +02:00
Jesús García Sáez d1f54298d2 stringByDecodingImap4FolderName is not neccesary
For russian locale and characters nonexistent in latin1 sogo crashes
2014-07-02 14:48:45 +02:00
Kamen Mazdrashki f8028b5a94 OpenChange: Avoid crashing when creating embedded message in attachment
Signed-off-by: Kamen Mazdrashki <kamenim@samba.org>
(cherry picked from commit 15a55f9f707247c9164e8fa7a102639744f686e5)
2014-07-02 14:48:27 +02:00
Jesús García Sáez 6bef678114 fix format logging uint64_t 2014-07-02 14:47:57 +02:00
Jesús García Sáez c81476bd04 no need to modify url 2014-07-02 14:47:45 +02:00
Jesús García Sáez a24f009cfe mapistoreURI encoding should be done the same way as listContextForUser
stringByEncodingImap4FolderName is used inside [newFolder create] where is needed
2014-07-02 14:47:31 +02:00
Jesús García Sáez 95298de9f1 avoid infinite loop when trying to update a folder id 2014-07-02 14:45:52 +02:00
Jesús García Sáez f6d1a37127 use properly get_uri function and check ret value 2014-07-02 14:44:23 +02:00
Jesús García Sáez 2aa71cc8a3 check ret value properly 2014-07-02 14:43:42 +02:00
Jesús García Sáez 34b98a563d get_new_folderID functions are now on mapistore_indexing 2014-07-02 14:42:17 +02:00
Carlos Pérez-Aradros Herce fd308b592f Converted all the indexing code to indexing backends 2014-07-02 14:41:51 +02:00
Carlos Pérez-Aradros Herce a6bfb9d5c5 Use indexing generic code instead of tdb private funtions 2014-07-02 14:41:40 +02:00
Carlos Pérez-Aradros Herce 33b353b974 Moved to abstract index_context instead of tdb_wrap 2014-07-02 14:41:25 +02:00
Jeroen Dekkers b5dc2e264d Link correctly against libraries used
Link the mapistore backend against libgnustep-base, libobjc,
libNGObjWeb. Link the SAML code against gobject-2.0.
2014-04-12 20:32:20 +02:00
Skruppy 1c3f1af662 ModulesConstraints tests all values of a multi-valued attributes 2014-03-15 15:10:26 +01:00
Jeroen Dekkers 4d8bff5130 Link libSOGo with libdl on systems with glibc 2013-04-14 11:50:28 +02:00
1193 changed files with 43544 additions and 11974 deletions

No files matched your search

+2
View File
@@ -14,3 +14,5 @@ SoObjects/SOGo/derived_src/
Tests/*/config.py
*.pyc
._*
Documentation/*.docbook
Documentation/*.pdf
+33
View File
@@ -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
@@ -24,8 +25,10 @@ trans.pl = UI/MailerUI/Polish.lproj/Localizable.strings
trans.pt_BR = UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = UI/MailerUI/Russian.lproj/Localizable.strings
trans.sk = UI/MailerUI/Slovak.lproj/Localizable.strings
trans.sl_SI = UI/MailerUI/Slovenian.lproj/Localizable.strings
trans.sv = UI/MailerUI/Swedish.lproj/Localizable.strings
trans.uk = UI/MailerUI/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/MailerUI/ChineseTaiwan.lproj/Localizable.strings
[sogo.ui-preferencesui]
source_file = UI/PreferencesUI/English.lproj/Localizable.strings
@@ -38,6 +41,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
@@ -50,8 +54,10 @@ trans.pl = UI/PreferencesUI/Polish.lproj/Localizable.strings
trans.pt_BR = UI/PreferencesUI/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = UI/PreferencesUI/Russian.lproj/Localizable.strings
trans.sk = UI/PreferencesUI/Slovak.lproj/Localizable.strings
trans.sl_SI = UI/PreferencesUI/Slovenian.lproj/Localizable.strings
trans.sv = UI/PreferencesUI/Swedish.lproj/Localizable.strings
trans.uk = UI/PreferencesUI/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/PreferencesUI/ChineseTaiwan.lproj/Localizable.strings
[sogo.ui-scheduler]
source_file = UI/Scheduler/English.lproj/Localizable.strings
@@ -64,6 +70,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
@@ -76,8 +83,10 @@ trans.pl = UI/Scheduler/Polish.lproj/Localizable.strings
trans.pt_BR = UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = UI/Scheduler/Russian.lproj/Localizable.strings
trans.sk = UI/Scheduler/Slovak.lproj/Localizable.strings
trans.sl_SI = UI/Scheduler/Slovenian.lproj/Localizable.strings
trans.sv = UI/Scheduler/Swedish.lproj/Localizable.strings
trans.uk = UI/Scheduler/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/Scheduler/ChineseTaiwan.lproj/Localizable.strings
[sogo.ui-contacts]
source_file = UI/Contacts/English.lproj/Localizable.strings
@@ -90,6 +99,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
@@ -102,8 +112,10 @@ trans.pl = UI/Contacts/Polish.lproj/Localizable.strings
trans.pt_BR = UI/Contacts/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = UI/Contacts/Russian.lproj/Localizable.strings
trans.sk = UI/Contacts/Slovak.lproj/Localizable.strings
trans.sl_SI = UI/Contacts/Slovenian.lproj/Localizable.strings
trans.sv = UI/Contacts/Swedish.lproj/Localizable.strings
trans.uk = UI/Contacts/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/Contacts/ChineseTaiwan.lproj/Localizable.strings
[sogo.ui-mainui]
source_file = UI/MainUI/English.lproj/Localizable.strings
@@ -116,6 +128,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
@@ -128,8 +141,10 @@ trans.pl = UI/MainUI/Polish.lproj/Localizable.strings
trans.pt_BR = UI/MainUI/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = UI/MainUI/Russian.lproj/Localizable.strings
trans.sk = UI/MainUI/Slovak.lproj/Localizable.strings
trans.sl_SI = UI/MainUI/Slovenian.lproj/Localizable.strings
trans.sv = UI/MainUI/Swedish.lproj/Localizable.strings
trans.uk = UI/MainUI/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/MainUI/ChineseTaiwan.lproj/Localizable.strings
[sogo.ui-common]
source_file = UI/Common/English.lproj/Localizable.strings
@@ -142,6 +157,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
@@ -154,8 +170,10 @@ trans.pl = UI/Common/Polish.lproj/Localizable.strings
trans.pt_BR = UI/Common/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = UI/Common/Russian.lproj/Localizable.strings
trans.sk = UI/Common/Slovak.lproj/Localizable.strings
trans.sl_SI = UI/Common/Slovenian.lproj/Localizable.strings
trans.sv = UI/Common/Swedish.lproj/Localizable.strings
trans.uk = UI/Common/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/Common/ChineseTaiwan.lproj/Localizable.strings
[sogo.ui-administrationui]
source_file = UI/AdministrationUI/English.lproj/Localizable.strings
@@ -168,6 +186,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
@@ -180,8 +199,10 @@ trans.pl = UI/AdministrationUI/Polish.lproj/Localizable.strings
trans.pt_BR = UI/AdministrationUI/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = UI/AdministrationUI/Russian.lproj/Localizable.strings
trans.sk = UI/AdministrationUI/Slovak.lproj/Localizable.strings
trans.sl_SI = UI/AdministrationUI/Slovenian.lproj/Localizable.strings
trans.sv = UI/AdministrationUI/Swedish.lproj/Localizable.strings
trans.uk = UI/AdministrationUI/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/AdministrationUI/ChineseTaiwan.lproj/Localizable.strings
[sogo.soobjects-appointments]
source_file = SoObjects/Appointments/English.lproj/Localizable.strings
@@ -194,6 +215,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
@@ -206,8 +228,10 @@ trans.pl = SoObjects/Appointments/Polish.lproj/Localizable.strings
trans.pt_BR = SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = SoObjects/Appointments/Russian.lproj/Localizable.strings
trans.sk = SoObjects/Appointments/Slovak.lproj/Localizable.strings
trans.sl_SI = SoObjects/Appointments/Slovenian.lproj/Localizable.strings
trans.sv = SoObjects/Appointments/Swedish.lproj/Localizable.strings
trans.uk = SoObjects/Appointments/Ukrainian.lproj/Localizable.strings
trans.zh_TW = SoObjects/Appointments/ChineseTaiwan.lproj/Localizable.strings
[sogo.soobjects-contacts]
source_file = SoObjects/Contacts/English.lproj/Localizable.strings
@@ -220,6 +244,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
@@ -232,8 +257,10 @@ trans.pl = SoObjects/Contacts/Polish.lproj/Localizable.strings
trans.pt_BR = SoObjects/Contacts/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = SoObjects/Contacts/Russian.lproj/Localizable.strings
trans.sk = SoObjects/Contacts/Slovak.lproj/Localizable.strings
trans.sl_SI = SoObjects/Contacts/Slovenian.lproj/Localizable.strings
trans.sv = SoObjects/Contacts/Swedish.lproj/Localizable.strings
trans.uk = SoObjects/Contacts/Ukrainian.lproj/Localizable.strings
trans.zh_TW = SoObjects/Contacts/ChineseTaiwan.lproj/Localizable.strings
[sogo.soobjects-mailer]
source_file = SoObjects/Mailer/English.lproj/Localizable.strings
@@ -246,6 +273,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
@@ -258,8 +286,10 @@ trans.pl = SoObjects/Mailer/Polish.lproj/Localizable.strings
trans.pt_BR = SoObjects/Mailer/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = SoObjects/Mailer/Russian.lproj/Localizable.strings
trans.sk = SoObjects/Mailer/Slovak.lproj/Localizable.strings
trans.sl_SI = SoObjects/Mailer/Slovenian.lproj/Localizable.strings
trans.sv = SoObjects/Mailer/Swedish.lproj/Localizable.strings
trans.uk = SoObjects/Mailer/Ukrainian.lproj/Localizable.strings
trans.zh_TW = SoObjects/Mailer/ChineseTaiwan.lproj/Localizable.strings
[sogo.ui-mailpartviewers]
source_file = UI/MailPartViewers/English.lproj/Localizable.strings
@@ -272,6 +302,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
@@ -284,5 +315,7 @@ trans.pl = UI/MailPartViewers/Polish.lproj/Localizable.strings
trans.pt_BR = UI/MailPartViewers/BrazilianPortuguese.lproj/Localizable.strings
trans.ru = UI/MailPartViewers/Russian.lproj/Localizable.strings
trans.sk = UI/MailPartViewers/Slovak.lproj/Localizable.strings
trans.sl_SI = UI/MailPartViewers/Slovenian.lproj/Localizable.strings
trans.sv = UI/MailPartViewers/Swedish.lproj/Localizable.strings
trans.uk = UI/MailPartViewers/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/MailPartViewers/ChineseTaiwan.lproj/Localizable.strings
+29 -13
View File
@@ -1,6 +1,6 @@
/*
Copyright (c) 2014, Inverse inc.
Copyright (c) 2015, Inverse inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -33,29 +33,45 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import <Foundation/NSEnumerator.h>
#import <Foundation/NSString.h>
#import <NGMail/NGMailAddress.h>
#import <NGMail/NGMailAddressParser.h>
#import <SOGo/NSString+Utilities.h>
@implementation NGMimeMessage (ActiveSync)
- (void) _addRecipients: (NSEnumerator *) enumerator
toArray: (NSMutableArray *) recipients
{
NGMailAddressParser *parser;
NSEnumerator *addressList;
NGMailAddress *address;
NSString *s;
while ((s = [enumerator nextObject]))
{
parser = [NGMailAddressParser mailAddressParserWithString: s];
addressList = [[parser parseAddressList] objectEnumerator];
while ((address = [addressList nextObject]))
[recipients addObject: [address address]];
}
}
- (NSArray *) allRecipients
{
NSMutableArray *recipients;
NSEnumerator *enumerator;
NSString *s;
recipients = [NSMutableArray array];
enumerator = [[self headersForKey: @"to"] objectEnumerator];
while ((s = [enumerator nextObject]))
{
[recipients addObject: [s pureEMailAddress]];
}
[self _addRecipients: [[self headersForKey: @"to"] objectEnumerator]
toArray: recipients];
enumerator = [[self headersForKey: @"cc"] objectEnumerator];
while ((s = [enumerator nextObject]))
{
[recipients addObject: [s pureEMailAddress]];
}
[self _addRecipients: [[self headersForKey: @"cc"] objectEnumerator]
toArray: recipients];
[self _addRecipients: [[self headersForKey: @"bcc"] objectEnumerator]
toArray: recipients];
return recipients;
}
+5 -3
View File
@@ -33,6 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import <Foundation/NSCalendarDate.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSString.h>
#import <Foundation/NSTimeZone.h>
#import <NGExtensions/NSString+misc.h>
@@ -193,11 +194,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
if ((o = [self note]))
{
// It is very important here to NOT set <Truncated>0</Truncated> in the response,
// otherwise it'll prevent WP8 phones from sync'ing. See #3028 for details.
o = [o activeSyncRepresentationInContext: context];
[s appendString: @"<Body xmlns=\"AirSyncBase:\">"];
[s appendFormat: @"<Type>%d</Type>", 1];
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", [o length]];
[s appendFormat: @"<Truncated>%d</Truncated>", 0];
[s appendFormat: @"<Data>%@</Data>", o];
[s appendString: @"</Body>"];
}
@@ -222,14 +224,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[self setNote: o];
// Categories
if ((o = [theValues objectForKey: @"Categories"]))
if ((o = [theValues objectForKey: @"Categories"]) && [o length])
[self setCategories: o];
// Birthday
if ((o = [theValues objectForKey: @"Birthday"]))
{
o = [o calendarDate];
[self setBday: [o descriptionWithCalendarFormat: @"%Y-%m-%d"]];
[self setBday: [o descriptionWithCalendarFormat: @"%Y-%m-%d" timeZone: nil locale: nil]];
}
//
+49 -16
View File
@@ -32,7 +32,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import <Foundation/NSProcessInfo.h>
#import <Foundation/NSString.h>
#import <SOGo/SOGoSystemDefaults.h>
#import <NGExtensions/NGBase64Coding.h>
#import <NGExtensions/NSObject+Logs.h>
#include <wbxml/wbxml.h>
#include <wbxml/wbxml_conv.h>
@@ -44,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];
NSLog(@"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];
}
}
//
@@ -56,7 +66,33 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
{
return [[self stringByEncodingBase64] stringByReplacingString: @"\n" withString: @""];
NSString *tmp, *s;
unichar *buf, *start, c;
int len, i, j;
tmp = [self stringByEncodingBase64] ;
len = [tmp length];
start = buf = (unichar *)malloc(len*sizeof(unichar));
[tmp getCharacters: buf range: NSMakeRange(0, len)];
for (i = 0, j = 0; i < len; i++)
{
c = *buf;
if (!(c == 0xA))
{
*(start+j) = c;
j++;
}
buf++;
}
s = [[NSString alloc] initWithCharactersNoCopy: start length: j freeWhenDone: YES];
return AUTORELEASE(s);
}
- (NSData *) wbxml2xml
@@ -81,20 +117,18 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
if (ret != WBXML_OK)
{
NSLog(@"wbxml2xmlFromContent: failed: %s\n", wbxml_errors_string(ret));
[self errorWithFormat: @"wbxml2xmlFromContent: failed: %s\n", wbxml_errors_string(ret)];
[self _dumpToFile];
return nil;
}
data = [[NSData alloc] initWithBytes: xml length: xml_len];
data = [NSData dataWithBytesNoCopy: xml length: xml_len freeWhenDone: YES];
#if WBXMLDEBUG
[data writeToFile: @"/tmp/protocol.decoded" atomically: YES];
#endif
free(xml);
return AUTORELEASE(data);
return data;
}
@@ -116,7 +150,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
if (ret != WBXML_OK)
{
NSLog(@"xml2wbxmlFromContent: failed: %s\n", wbxml_errors_string(ret));
[self logWithFormat: @"xml2wbxmlFromContent: failed: %s\n", wbxml_errors_string(ret)];
[self _dumpToFile];
return nil;
}
@@ -131,22 +165,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
if (ret != WBXML_OK)
{
NSLog(@"xml2wbxmlFromContent: failed: %s\n", wbxml_errors_string(ret));
[self errorWithFormat: @"xml2wbxmlFromContent: failed: %s\n", wbxml_errors_string(ret)];
[self _dumpToFile];
free(wbxml);
wbxml_conv_xml2wbxml_destroy(conv);
return nil;
}
data = [[NSData alloc] initWithBytes: wbxml length: wbxml_len];
data = [NSData dataWithBytesNoCopy: wbxml length: wbxml_len freeWhenDone: YES];
#if WBXMLDEBUG
[data writeToFile: @"/tmp/protocol.encoded" atomically: YES];
#endif
free(wbxml);
wbxml_conv_xml2wbxml_destroy(conv);
return AUTORELEASE(data);
return data;
}
@end
+4 -1
View File
@@ -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
@@ -49,6 +49,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- (NSString *) deviceType;
- (NSString *) attachmentName;
- (NSString *) command;
- (NSString *) collectionid;
- (NSString *) itemid;
- (BOOL) acceptsMultiPart;
- (NSData *) convertHexStringToBytes;
@end
+217 -11
View File
@@ -33,13 +33,112 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <Foundation/NSCalendarDate.h>
#include <Foundation/NSData.h>
#include <Foundation/NSDate.h>
#include <Foundation/NSTimeZone.h>
#include <SOGo/NSString+Utilities.h>
#include <SOGo/NSData+Crypto.h>
#include <NGExtensions/NGBase64Coding.h>
#include <NGExtensions/NSString+misc.h>
static NSArray *easCommandCodes = nil;
static NSArray *easCommandParameters = nil;
@implementation NSString (ActiveSync)
//
// This is a copy from NSString+XMLEscaping.m from SOPE.
// The difference here is that we use wchar_t instead of unichar.
// This is needed to get the rigth numeric character reference.
// e.g. SMILING FACE WITH OPEN MOUTH
// ok: wchar_t -> &#128515; wrong: unichar -> &#55357; &#56835;
//
// We avoir naming it like the one in SOPE since if the ActiveSync
// bundle is loaded, it'll overwrite the one provided by SOPE.
//
- (NSString *) _stringByEscapingXMLStringUsingCharacters {
register unsigned i, len, j;
register wchar_t *buf;
const wchar_t *chars;
unsigned escapeCount;
if ([self length] == 0) return @"";
NSData *data = [self dataUsingEncoding:NSUTF32StringEncoding];
chars = [data bytes];
len = [data length]/4;
/* check for characters to escape ... */
for (i = 0, escapeCount = 0; i < len; i++) {
switch (chars[i]) {
case '&': case '"': case '<': case '>': case '\r':
escapeCount++;
break;
default:
if (chars[i] > 127)
escapeCount++;
break;
}
}
if (escapeCount == 0 ) {
/* nothing to escape ... */
return [[self copy] autorelease];
}
buf = calloc((len + 5) + (escapeCount * 16), sizeof(wchar_t));
for (i = 0, j = 0; i < len; i++) {
switch (chars[i]) {
/* escape special chars */
case '\r':
buf[j] = '&'; j++; buf[j] = '#'; j++; buf[j] = '1'; j++;
buf[j] = '3'; j++; buf[j] = ';'; j++;
break;
case '&':
buf[j] = '&'; j++; buf[j] = 'a'; j++; buf[j] = 'm'; j++;
buf[j] = 'p'; j++; buf[j] = ';'; j++;
break;
case '"':
buf[j] = '&'; j++; buf[j] = 'q'; j++; buf[j] = 'u'; j++;
buf[j] = 'o'; j++; buf[j] = 't'; j++; buf[j] = ';'; j++;
break;
case '<':
buf[j] = '&'; j++; buf[j] = 'l'; j++; buf[j] = 't'; j++;
buf[j] = ';'; j++;
break;
case '>':
buf[j] = '&'; j++; buf[j] = 'g'; j++; buf[j] = 't'; j++;
buf[j] = ';'; j++;
break;
default:
/* escape big chars */
if (chars[i] > 127) {
unsigned char nbuf[32];
unsigned int k;
sprintf((char *)nbuf, "&#%i;", (int)chars[i]);
for (k = 0; nbuf[k] != '\0'; k++) {
buf[j] = nbuf[k];
j++;
}
}
else if (chars[i] == 0x9 || chars[i] == 0xA || chars[i] == 0xD || chars[i] >= 0x20) { // ignore any unsupported control character
/* nothing to escape */
buf[j] = chars[i];
j++;
}
break;
}
}
self = [[NSString alloc] initWithBytesNoCopy: buf
length: (j*sizeof(wchar_t))
encoding: NSUTF32StringEncoding
freeWhenDone: YES];
return [self autorelease];
}
- (NSString *) sanitizedServerIdWithType: (SOGoMicrosoftActiveSyncFolderType) folderType
{
if (folderType == ActiveSyncEventFolder)
@@ -59,12 +158,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
{
NSString *s;
s = [self stringByEscapingHTMLString];
return [[s componentsSeparatedByCharactersInSet: [self safeCharacterSet]]
componentsJoinedByString: @""];
return [self _stringByEscapingXMLStringUsingCharacters];
}
- (int) activeSyncFolderType
@@ -123,23 +217,98 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
- (NSCalendarDate *) calendarDate
{
NSString *s;
id o;
o = [NSCalendarDate dateWithString: self calendarFormat: @"%Y%m%dT%H%M%SZ"];
// We force parsing in the GMT timezone. If we don't do that, the date will be parsed
// in the default timezone.
s = [NSString stringWithFormat: @"%@ GMT", self];
o = [NSCalendarDate dateWithString: s calendarFormat: @"%Y%m%dT%H%M%SZ %Z"];
if (!o)
o = [NSCalendarDate dateWithString: self calendarFormat: @"%Y-%m-%dT%H:%M:%S.%FZ"];
o = [NSCalendarDate dateWithString: s calendarFormat: @"%Y-%m-%dT%H:%M:%S.%FZ %Z"];
return o;
}
- (NSString *) _valueForParameter: (NSString *) theParameter
{
NSArray *components;
NSMutableArray *components;
NSString *s;
int i;
components = [[[self componentsSeparatedByString: @"?"] lastObject] componentsSeparatedByString: @"&"];
components = [NSMutableArray arrayWithArray: [[[self componentsSeparatedByString: @"?"] lastObject] componentsSeparatedByString: @"&"]];
// We handle BASE64 encoded queryStrings. See http://msdn.microsoft.com/en-us/library/ee160227%28v=exchg.80%29.aspx for details.
if ([components count] == 1)
{
NSString *deviceType, *parameterValue;
NSData *queryString;
int cmd_code, deviceid_length, policy_length, devicetype_length, parameter_code, parameter_length, i;
const char* qs_bytes;
queryString = [[components objectAtIndex: 0] dataByDecodingBase64];
if (![queryString length])
return nil;
qs_bytes = (const char*)[queryString bytes];
if (!easCommandCodes)
{
easCommandCodes = [NSArray arrayWithObjects:@"Sync", @"SendMail", @"SmartForward", @"SmartReply", @"GetAttachment", @"na", @"na", @"na", @"na",
@"FolderSync", @"FolderCreate", @"FolderDelete", @"FolderUpdate", @"MoveItems", @"GetItemEstimate", @"MeetingResponse",
@"Search", @"Settings", @"Ping", @"ItemOperations", @"Provision", @"ResolveRecipients", @"ValidateCert", nil];
RETAIN(easCommandCodes);
}
if (!easCommandParameters)
{
easCommandParameters = [NSArray arrayWithObjects:@"AttachmentName", @"CollectionId", @"na", @"ItemId", @"LongId", @"na", @"Occurrence", @"Options", @"User", nil];
RETAIN(easCommandParameters);
}
// Command code, 1 byte, ie.: cmd=
cmd_code = qs_bytes[1];
[components addObject: [NSString stringWithFormat: @"cmd=%@", [easCommandCodes objectAtIndex: cmd_code]]];
// Device ID length and Device ID (variable)
deviceid_length = qs_bytes[4];
[components addObject: [NSString stringWithFormat: @"deviceId=%@", [[NSData encodeDataAsHexString: [queryString subdataWithRange: NSMakeRange(5, deviceid_length)]] uppercaseString]]];
// Device type length and type (variable)
policy_length = qs_bytes[5+deviceid_length];
devicetype_length = qs_bytes[5+deviceid_length+1+policy_length];
deviceType = [[NSString alloc] initWithData: [queryString subdataWithRange: NSMakeRange(5+deviceid_length+1+policy_length+1, devicetype_length)]
encoding: NSASCIIStringEncoding];
AUTORELEASE(deviceType);
[components addObject: [NSString stringWithFormat: @"deviceType=%@", deviceType]];
// Command Parameters
i = 5+deviceid_length+1+policy_length+1+devicetype_length;
while (i < [queryString length])
{
parameter_code = qs_bytes[i];
parameter_length = qs_bytes[i+1];
parameterValue = [[NSString alloc] initWithData: [queryString subdataWithRange: NSMakeRange(i+1+1, parameter_length)]
encoding: NSASCIIStringEncoding];
AUTORELEASE(parameterValue);
// parameter_code 7 == Options
// http://msdn.microsoft.com/en-us/library/ee237789(v=exchg.80).aspx
if (parameter_code == 7)
[components addObject: [NSString stringWithFormat: @"%@=%@", [easCommandParameters objectAtIndex: parameter_code],
([parameterValue isEqualToString: @"\001"]) ? @"SaveInSent" : @"AcceptMultiPart"]];
else
[components addObject: [NSString stringWithFormat: @"%@=%@", [easCommandParameters objectAtIndex: parameter_code], parameterValue]];
i = i + 1 + 1 + parameter_length;
}
}
for (i = 0; i < [components count]; i++)
{
@@ -218,6 +387,43 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
return s;
}
- (NSString *) itemid
{
NSString *s;
s = [self _valueForParameter: @"ITEMID="];
if (!s)
s = @"Unknown";
return s;
}
- (NSString *) collectionid
{
NSString *s;
s = [self _valueForParameter: @"COLLECTIONID="];
if (!s)
s = @"Unknown";
return s;
}
- (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.
//
+1 -1
View File
@@ -4,7 +4,7 @@ to negotiate the fees associated to your user base.
To contact Microsoft, please visit:
http://www.microsoft.com/en-us/legal/intellectualproperty/IPLicensing/Programs/exchangeactivesyncprotocol.aspx
http://www.microsoft.com/en-us/legal/intellectualproperty/
and send an email to iplicreq@microsoft.com
+417 -130
View File
@@ -29,11 +29,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#import "SOGoActiveSyncDispatcher+Sync.h"
#import <Foundation/NSArray.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSCalendarDate.h>
#import <Foundation/NSNull.h>
#import <Foundation/NSProcessInfo.h>
#import <Foundation/NSSortDescriptor.h>
#import <Foundation/NSTimeZone.h>
#import <Foundation/NSURL.h>
#import <Foundation/NSValue.h>
@@ -56,6 +57,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import <NGCards/NGVCard.h>
#import <NGExtensions/NSCalendarDate+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSString+misc.h>
#import <NGImap4/NSString+Imap4.h>
@@ -114,22 +116,27 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
forKey: (NSString *) theFolderKey
{
SOGoCacheGCSObject *o;
NSDictionary *values;
NSString *key;
key = [NSString stringWithFormat: @"%@+%@", [context objectForKey: @"DeviceId"], theFolderKey];
values = [theFolderMetadata copy];
o = [SOGoCacheGCSObject objectWithName: key inContainer: nil];
[o setObjectType: ActiveSyncFolderCacheObject];
[o setTableUrl: [self folderTableURL]];
[o reloadIfNeeded];
//[o reloadIfNeeded];
[[o properties] removeObjectForKey: @"SyncKey"];
[[o properties] removeObjectForKey: @"SyncCache"];
[[o properties] removeObjectForKey: @"DateCache"];
[[o properties] removeObjectForKey: @"MoreAvailable"];
[[o properties] removeObjectForKey: @"BodyPreferenceType"];
[[o properties] removeObjectForKey: @"SuccessfulMoveItemsOps"];
[[o properties] addEntriesFromDictionary: theFolderMetadata];
[[o properties] addEntriesFromDictionary: values];
[o save];
[values release];
}
- (NSMutableDictionary *) _folderMetadataForKey: (NSString *) theFolderKey
@@ -147,6 +154,29 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
return [o properties];
}
- (NSString *) _getNameInCache: (id) theCollection withType: (SOGoMicrosoftActiveSyncFolderType) theFolderType
{
NSString *nameInCache;
if (theFolderType == ActiveSyncMailFolder)
nameInCache= [[[theCollection mailAccountFolder] imapFolderGUIDs] objectForKey: [theCollection nameInContainer]];
else
{
NSString *component_name;
if (theFolderType == ActiveSyncContactFolder)
component_name = @"vcard";
else if (theFolderType == ActiveSyncEventFolder)
component_name = @"vevent";
else
component_name = @"vtodo";
nameInCache= [NSString stringWithFormat: @"%@/%@", component_name, [theCollection nameInContainer]];
}
return nameInCache;
}
//
// <?xml version="1.0"?>
@@ -190,7 +220,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
withType: (SOGoMicrosoftActiveSyncFolderType) theFolderType
inBuffer: (NSMutableString *) theBuffer
{
NSMutableDictionary *allValues;
NSMutableDictionary *folderMetadata, *dateCache, *syncCache, *allValues;
NSString *clientId, *serverId;
NSArray *additions;
@@ -253,15 +283,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
serverId = [NSString stringWithFormat: @"%@.ics", [theCollection globallyUniqueObjectId]];
sogoObject = [[SOGoTaskObject alloc] initWithName: serverId
inContainer: theCollection];
o = [sogoObject component: YES secure: NO];
o = [sogoObject component: YES secure: NO];
}
break;
case ActiveSyncMailFolder:
default:
{
// FIXME
//continue;
NSLog(@"BLARG!");
// FIXME - what to do?
[self errorWithFormat: @"Fatal error occured - tried to call -processSyncAddCommand: ... on a mail folder. We abort."];
abort();
}
}
@@ -276,6 +305,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[theBuffer appendFormat: @"<ServerId>%@</ServerId>", serverId];
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
[theBuffer appendString: @"</Add>"];
// Update syncCache
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]];
syncCache = [folderMetadata objectForKey: @"SyncCache"];
dateCache = [folderMetadata objectForKey: @"DateCache"];
[syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId];
[dateCache setObject: [NSCalendarDate date] forKey: serverId];
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
}
}
}
@@ -325,6 +365,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NSString *serverId;
NSArray *changes;
id aChange, o, sogoObject;
NSMutableDictionary *folderMetadata, *syncCache;
int i;
@@ -332,6 +373,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
if ([changes count])
{
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]];
syncCache = [folderMetadata objectForKey: @"SyncCache"];
for (i = 0; i < [changes count]; i++)
{
aChange = [changes objectAtIndex: i];
@@ -358,6 +402,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
o = [sogoObject vCard];
[o takeActiveSyncValues: allChanges inContext: context];
[sogoObject saveComponent: o];
[syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId];
}
break;
case ActiveSyncEventFolder:
@@ -366,15 +413,34 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
o = [sogoObject component: NO secure: NO];
[o takeActiveSyncValues: allChanges inContext: context];
[sogoObject saveComponent: o];
[syncCache setObject: [NSString stringWithFormat:@"%f", [[sogoObject lastModified] timeIntervalSince1970]] forKey: serverId];
}
break;
case ActiveSyncMailFolder:
default:
{
NSDictionary *result;
NSString *modseq;
[sogoObject takeActiveSyncValues: allChanges inContext: context];
result = [sogoObject fetchParts: [NSArray arrayWithObject: @"MODSEQ"]];
modseq = [[[result objectForKey: @"RawResponse"] objectForKey: @"fetch"] objectForKey: @"modseq"];
if (modseq)
[syncCache setObject: modseq forKey: serverId];
}
}
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
[theBuffer appendString: @"<Change>"];
[theBuffer appendFormat: @"<ServerId>%@</ServerId>", serverId];
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
[theBuffer appendString: @"</Change>"];
}
}
}
@@ -409,16 +475,27 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
withType: (SOGoMicrosoftActiveSyncFolderType) theFolderType
inBuffer: (NSMutableString *) theBuffer
{
id aDelete, sogoObject, value;
NSArray *deletions;
NSString *serverId;
id aDelete, sogoObject;
BOOL deletesAsMoves, useTrash;
int i;
deletions = (id)[theDocumentElement getElementsByTagName: @"Delete"];
if ([deletions count])
{
// From the documention, if DeletesAsMoves is missing, we must assume it's a YES.
// See https://msdn.microsoft.com/en-us/library/gg675480(v=exchg.80).aspx for all details.
value = [theDocumentElement getElementsByTagName: @"DeletesAsMoves"];
deletesAsMoves = YES;
useTrash = YES;
if ([value count] && [[[value lastObject] textValue] length])
deletesAsMoves = [[[value lastObject] textValue] boolValue];
for (i = 0; i < [deletions count]; i++)
{
aDelete = [deletions objectAtIndex: i];
@@ -430,7 +507,30 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
acquire: NO];
if (![sogoObject isKindOfClass: [NSException class]])
[sogoObject delete];
{
// FIXME: handle errors here
if (deletesAsMoves && theFolderType == ActiveSyncMailFolder)
[(SOGoMailFolder *)[sogoObject container] deleteUIDs: [NSArray arrayWithObjects: serverId, nil] useTrashFolder: &useTrash inContext: context];
else
[sogoObject delete];
}
[theBuffer appendString: @"<Delete>"];
[theBuffer appendFormat: @"<ServerId>%@</ServerId>", serverId];
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
[theBuffer appendString: @"</Delete>"];
// update syncCache
NSMutableDictionary *folderMetadata, *dateCache, *syncCache;
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]];
syncCache = [folderMetadata objectForKey: @"SyncCache"];
dateCache = [folderMetadata objectForKey: @"DateCache"];
[syncCache removeObjectForKey: serverId];
[dateCache removeObjectForKey: serverId];
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
}
}
}
@@ -471,6 +571,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- (void) processSyncGetChanges: (id <DOMElement>) theDocumentElement
inCollection: (id) theCollection
withWindowSize: (unsigned int) theWindowSize
withMaxSyncResponseSize: (unsigned int) theMaxSyncResponseSize
withSyncKey: (NSString *) theSyncKey
withFolderType: (SOGoMicrosoftActiveSyncFolderType) theFolderType
withFilterType: (NSCalendarDate *) theFilterType
@@ -479,6 +580,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
NSMutableDictionary *folderMetadata, *dateCache, *syncCache;
NSString *davCollectionTagToStore;
NSAutoreleasePool *pool;
NSMutableString *s;
BOOL more_available;
@@ -488,18 +591,30 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
more_available = NO;
if (theFolderType == ActiveSyncMailFolder && !([theSyncKey isEqualToString: @"-1"]) && theFilterType)
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]];
// If this is a new sync operation, DateCache and SyncCache needs to be deleted
if ([theSyncKey isEqualToString: @"-1"])
{
[folderMetadata setObject: [NSMutableDictionary dictionary] forKey: @"SyncCache"];
[folderMetadata setObject: [NSMutableDictionary dictionary] forKey: @"DateCache"];
}
syncCache = [folderMetadata objectForKey: @"SyncCache"];
dateCache = [folderMetadata objectForKey: @"DateCache"];
if ((theFolderType == ActiveSyncMailFolder || theFolderType == ActiveSyncEventFolder || theFolderType == ActiveSyncTaskFolder) &&
!([folderMetadata objectForKey: @"MoreAvailable"]) && // previous sync operation reached the windowSize or maximumSyncReponseSize
!([theSyncKey isEqualToString: @"-1"]) && // new sync operation
theFilterType)
{
NSArray *allKeys;
NSString *key;
int softdelete_count;
softdelete_count = 0;
folderMetadata = [self _folderMetadataForKey: [theCollection nameInContainer]];
dateCache = [folderMetadata objectForKey: @"DateCache"];
syncCache = [folderMetadata objectForKey: @"SyncCache"];
allKeys = [dateCache allKeys];
for (i = 0; i < [allKeys count]; i++)
{
@@ -510,17 +625,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[s appendString: @"<SoftDelete xmlns=\"AirSync:\">"];
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", key];
[s appendString: @"</SoftDelete>"];
[syncCache removeObjectForKey: key];
[dateCache removeObjectForKey: key];
softdelete_count++;
}
if (softdelete_count >= theWindowSize)
if (softdelete_count >= theWindowSize || (theMaxSyncResponseSize > 0 && [s length] >= theMaxSyncResponseSize))
{
[folderMetadata setObject: [NSNumber numberWithBool: YES] forKey: @"MoreAvailable"];
[self _setFolderMetadata: folderMetadata forKey: [theCollection nameInContainer]];
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
more_available = YES;
*theLastServerKey = theSyncKey;
@@ -532,7 +647,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
}
[folderMetadata removeObjectForKey: @"MoreAvailable"];
[self _setFolderMetadata: folderMetadata forKey: [theCollection nameInContainer]];
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
}
//
@@ -544,6 +659,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
more_available = NO;
davCollectionTagToStore = [theCollection davCollectionTag];
switch (theFolderType)
{
// Handle all the GCS components
@@ -557,7 +674,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NSArray *allComponents;
BOOL updated;
int deleted;
int deleted, return_count;
if (theFolderType == ActiveSyncContactFolder)
component_name = @"vcard";
@@ -567,39 +684,67 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
component_name = @"vtodo";
allComponents = [theCollection syncTokenFieldsWithProperties: nil matchingSyncToken: theSyncKey fromDate: theFilterType];
allComponents = [allComponents sortedArrayUsingDescriptors: [NSArray arrayWithObjects: [[NSSortDescriptor alloc] initWithKey: @"c_lastmodified" ascending:YES], nil]];
// Check for the WindowSize
max = [allComponents count];
// Disabled for now for GCS folders.
// if (max > theWindowSize)
// {
// max = theWindowSize;
// more_available = YES;
// }
return_count = 0;
for (i = 0; i < max; i++)
{
pool = [[NSAutoreleasePool alloc] init];
// Check for the WindowSize and slice accordingly
if (return_count >= theWindowSize || (theMaxSyncResponseSize > 0 && [s length] >= theMaxSyncResponseSize))
{
more_available = YES;
// -1 to make sure that we miss no event in case there are more with the same c_lastmodified
*theLastServerKey = [[NSString alloc] initWithFormat: @"%d", [[component objectForKey: @"c_lastmodified"] intValue] - 1];
DESTROY(pool);
break;
}
component = [allComponents objectAtIndex: i];
deleted = [[component objectForKey: @"c_deleted"] intValue];
if (!deleted && ![[component objectForKey: @"c_component"] isEqualToString: component_name])
continue;
{
DESTROY(pool);
continue;
}
uid = [[component objectForKey: @"c_name"] sanitizedServerIdWithType: theFolderType];
if (deleted)
{
[s appendString: @"<Delete xmlns=\"AirSync:\">"];
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", uid];
[s appendString: @"</Delete>"];
if ([syncCache objectForKey: uid])
{
[s appendString: @"<Delete xmlns=\"AirSync:\">"];
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", uid];
[s appendString: @"</Delete>"];
[syncCache removeObjectForKey: uid];
[dateCache removeObjectForKey: uid];
return_count++;
}
}
else
{
updated = YES;
if ([[component objectForKey: @"c_creationdate"] intValue] > [theSyncKey intValue])
if (![syncCache objectForKey: uid])
updated = NO;
else if ([[component objectForKey: @"c_lastmodified"] intValue] == [[syncCache objectForKey: uid] intValue])
{
DESTROY(pool);
continue;
}
return_count++;
sogoObject = [theCollection lookupName: [uid sanitizedServerIdWithType: theFolderType]
inContext: context
@@ -610,7 +755,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
else
componentObject = [sogoObject component: NO secure: NO];
//
// We do NOT synchronize NEW events that are in fact, invitations
// to events. This is due to the fact that Outlook 2013 creates
@@ -632,9 +776,29 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
partstat = [attendee participationStatus];
if (partstat == iCalPersonPartStatNeedsAction)
continue;
{
DESTROY(pool);
continue;
}
}
}
[syncCache setObject: [component objectForKey: @"c_lastmodified"] forKey: uid];
// No need to set dateCache for Contacts
if ((theFolderType == ActiveSyncEventFolder || theFolderType == ActiveSyncTaskFolder))
{
NSCalendarDate *d;
if ([[component objectForKey: @"c_cycleenddate"] intValue])
d = [NSCalendarDate dateWithTimeIntervalSince1970: [[component objectForKey: @"c_cycleenddate"] intValue]];
else if ([[component objectForKey: @"c_enddate"] intValue])
d = [NSCalendarDate dateWithTimeIntervalSince1970: [[component objectForKey: @"c_enddate"] intValue]];
else
d = [NSCalendarDate distantFuture];
[dateCache setObject: d forKey: uid];
}
if (updated)
[s appendString: @"<Change xmlns=\"AirSync:\">"];
@@ -652,13 +816,28 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[s appendString: @"</Change>"];
else
[s appendString: @"</Add>"];
}
} // for ...
folderMetadata = [NSDictionary dictionaryWithObject: [theCollection davCollectionTag]
forKey: @"SyncKey"];
return_count++;
}
DESTROY(pool);
} // for (i = 0; i < max; i++) ...
if (more_available)
{
[folderMetadata setObject: [NSNumber numberWithBool: YES] forKey: @"MoreAvailable"];
[folderMetadata setObject: *theLastServerKey forKey: @"SyncKey"];
}
else
{
[folderMetadata removeObjectForKey: @"MoreAvailable"];
[folderMetadata setObject: davCollectionTagToStore forKey: @"SyncKey"];
}
[self _setFolderMetadata: folderMetadata
forKey: [NSString stringWithFormat: @"%@/%@", component_name, [theCollection nameInContainer]]];
RELEASE(*theLastServerKey);
}
break;
case ActiveSyncMailFolder:
@@ -673,7 +852,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
int j, k, return_count;
BOOL found_in_cache;
allMessages = [theCollection syncTokenFieldsWithProperties: nil matchingSyncToken: theSyncKey fromDate: theFilterType];
max = [allMessages count];
@@ -685,27 +863,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
sequence: [[[allMessages objectAtIndex: i] allValues] lastObject]]];
}
// If it's a new Sync operation, DateCache and SyncCache need to be deleted
// but GUID stored by folderSync shouldn't be touched
folderMetadata = [self _folderMetadataForKey: [theCollection nameInContainer]];
if ([theSyncKey isEqualToString: @"-1"])
{
[folderMetadata setObject: [NSMutableDictionary dictionary] forKey: @"SyncCache"];
[folderMetadata setObject: [NSMutableDictionary dictionary] forKey: @"DateCache"];
}
// Check whether GUID in cache is equal to the GUID from imap - this is to avoid cache corruptions if a folder has been renamed and a new folder
// with the same name has been created but folderSync has not yet updated the cache
if (!([[theCollection nameInContainer] isEqualToString:
[NSString stringWithFormat: @"folder%@", [self globallyUniqueIDToIMAPFolderName: [folderMetadata objectForKey: @"GUID"] type: theFolderType]]]))
{
NSLog(@"GUID mismatch don't sync now!");
return;
}
syncCache = [folderMetadata objectForKey: @"SyncCache"];
dateCache = [folderMetadata objectForKey: @"DateCache"];
sortedBySequence = [[NSMutableArray alloc] initWithDictionary: syncCache];
[sortedBySequence sortUsingSelector: @selector(compareSequence:)];
[sortedBySequence autorelease];
@@ -732,7 +889,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
else
found_in_cache = NO;
if (found_in_cache)
k = j+1;
else
@@ -747,15 +903,18 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
for (; k < [allCacheObjects count]; k++)
{
pool = [[NSAutoreleasePool alloc] init];
// Check for the WindowSize and slice accordingly
if (return_count >= theWindowSize)
if (return_count >= theWindowSize || (theMaxSyncResponseSize > 0 && [s length] >= theMaxSyncResponseSize))
{
NSString *lastSequence;
more_available = YES;
lastSequence = ([[aCacheObject sequence] isEqual: [NSNull null]] ? @"1" : [aCacheObject sequence]);
*theLastServerKey = [NSString stringWithFormat: @"%@-%@", [aCacheObject uid], lastSequence];
*theLastServerKey = [[NSString alloc] initWithFormat: @"%@-%@", [aCacheObject uid], lastSequence];
//NSLog(@"Reached windowSize - lastUID will be: %@", *theLastServerKey);
DESTROY(pool);
break;
}
@@ -773,6 +932,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[syncCache removeObjectForKey: [aCacheObject uid]];
[dateCache removeObjectForKey: [aCacheObject uid]];
return_count++;
}
else
{
@@ -782,17 +943,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
inContext: context
acquire: 0];
[s appendString: @"<Change xmlns=\"AirSync:\">"];
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", [aCacheObject uid]];
[s appendString: @"<ApplicationData xmlns=\"AirSync:\">"];
[s appendString: [mailObject activeSyncRepresentationInContext: context]];
[s appendString: @"</ApplicationData>"];
[s appendString: @"</Change>"];
if (![[aCacheObject sequence] isEqual: [syncCache objectForKey: [aCacheObject uid]]])
{
[s appendString: @"<Change xmlns=\"AirSync:\">"];
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", [aCacheObject uid]];
[s appendString: @"<ApplicationData xmlns=\"AirSync:\">"];
[s appendString: [mailObject activeSyncRepresentationInContext: context]];
[s appendString: @"</ApplicationData>"];
[s appendString: @"</Change>"];
return_count++;
}
[syncCache setObject: [aCacheObject sequence] forKey: [aCacheObject uid]];
}
return_count++;
}
else
{
@@ -836,7 +1000,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
}
}
}
DESTROY(pool);
} // for (; k < ...)
if (more_available)
{
@@ -846,11 +1011,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
else
{
[folderMetadata removeObjectForKey: @"MoreAvailable"];
[folderMetadata setObject: [theCollection davCollectionTag] forKey: @"SyncKey"];
[folderMetadata setObject: davCollectionTagToStore forKey: @"SyncKey"];
}
[self _setFolderMetadata: folderMetadata
forKey: [theCollection nameInContainer]];
[self _setFolderMetadata: folderMetadata forKey: [self _getNameInCache: theCollection withType: theFolderType]];
RELEASE(*theLastServerKey);
} // default:
break;
} // switch (folderType) ...
@@ -862,9 +1028,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[theBuffer appendString: @"<Commands>"];
[theBuffer appendString: s];
[theBuffer appendString: @"</Commands>"];
if (more_available)
[theBuffer appendString: @"<MoreAvailable/>"];
}
}
@@ -904,7 +1067,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
if ([[element tagName] isEqualToString: @"Add"])
{
// Add
[self processSyncAddCommand: aCommand
[self processSyncAddCommand: element
inCollection: theCollection
withType: theFolderType
inBuffer: theBuffer];
@@ -913,7 +1076,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
else if ([[element tagName] isEqualToString: @"Change"])
{
// Change
[self processSyncChangeCommand: aCommand
[self processSyncChangeCommand: element
inCollection: theCollection
withType: theFolderType
inBuffer: theBuffer];
@@ -922,15 +1085,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
else if ([[element tagName] isEqualToString: @"Delete"])
{
// Delete
[self processSyncDeleteCommand: aCommand
[self processSyncDeleteCommand: element
inCollection: theCollection
withType: theFolderType
inBuffer: theBuffer];
*processed = YES;
}
else if ([[element tagName] isEqualToString: @"Fetch"])
{
// Fetch
[self processSyncFetchCommand: aCommand
[self processSyncFetchCommand: element
inCollection: theCollection
withType: theFolderType
inBuffer: theBuffer];
@@ -947,14 +1111,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- (void) processSyncCollection: (id <DOMElement>) theDocumentElement
inBuffer: (NSMutableString *) theBuffer
changeDetected: (BOOL *) changeDetected
maxSyncResponseSize: (int) theMaxSyncResponseSize
{
NSString *collectionId, *realCollectionId, *syncKey, *davCollectionTag, *bodyPreferenceType, *lastServerKey;
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;
unsigned int windowSize, v, status;
NSMutableDictionary *folderMetadata, *folderOptions;
changeBuffer = [NSMutableString string];
commandsBuffer = [NSMutableString string];
@@ -965,6 +1131,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
collection = [self collectionFromId: realCollectionId type: folderType];
syncKey = davCollectionTag = [[(id)[theDocumentElement getElementsByTagName: @"SyncKey"] lastObject] textValue];
if (collection == nil)
{
// Collection not found - next folderSync will do the cleanup
//NSLog(@"Sync Collection not found %@ %@", collectionId, realCollectionId);
//Outlook doesn't like following response
//[theBuffer appendString: @"<Collection>"];
//[theBuffer appendFormat: @"<SyncKey>%@</SyncKey>", syncKey];
//[theBuffer appendFormat: @"<CollectionId>%@</CollectionId>", collectionId];
//[theBuffer appendFormat: @"<Status>%d</Status>", 8];
//[theBuffer appendString: @"</Collection>"];
return;
}
// We check for a window size, default to 100 if not specfied or out of bounds
windowSize = [[[(id)[theDocumentElement getElementsByTagName: @"WindowSize"] lastObject] textValue] intValue];
@@ -978,6 +1157,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
windowSize = v;
lastServerKey = nil;
status = 1;
// From the documention, if GetChanges is missing, we must assume it's a YES.
// See http://msdn.microsoft.com/en-us/library/gg675447(v=exchg.80).aspx for all details.
@@ -989,37 +1169,68 @@ 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"]) && !([folderMetadata objectForKey: @"SyncCache"]))
{
//NSLog(@"Reset folder: %@", [collection nameInContainer]);
davCollectionTag = @"0";
first_sync = YES;
*changeDetected = YES;
if (!([folderMetadata objectForKey: @"displayName"]))
status = 12; // need folderSync
else
status = 3; // do a complete resync
}
// We check our sync preferences and we stash them
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"];
// We generate the commands, if any, for the response. We might also have
// generated some in processSyncCommand:inResponse: as we could have
// received a Fetch command
if (getChanges && !first_sync)
{
[self processSyncGetChanges: theDocumentElement
inCollection: collection
withWindowSize: windowSize
withSyncKey: syncKey
withFolderType: folderType
withFilterType: [NSCalendarDate dateFromFilterType: [[(id)[theDocumentElement getElementsByTagName: @"FilterType"] lastObject] textValue]]
inBuffer: changeBuffer
lastServerKey: &lastServerKey];
}
//
// We process the commands from the request
//
@@ -1037,27 +1248,58 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
inBuffer: s
processed: &processed];
if (processed)
// Windows phones don't like empty Responses tags - such as: <Responses></Responses>.
// We only generate this tag when there is a response
if (processed && [s length])
[commandsBuffer appendFormat: @"<Responses>%@</Responses>", s];
else
[commandsBuffer appendString: s];
}
// We generate the commands, if any, for the response. We might also have
// generated some in processSyncCommand:inResponse: as we could have
// received a Fetch command
if (getChanges && !first_sync)
{
[self processSyncGetChanges: theDocumentElement
inCollection: collection
withWindowSize: windowSize
withMaxSyncResponseSize: theMaxSyncResponseSize
withSyncKey: syncKey
withFolderType: folderType
withFilterType: [NSCalendarDate dateFromFilterType: [[(id)[theDocumentElement getElementsByTagName: @"FilterType"] lastObject] textValue]]
inBuffer: changeBuffer
lastServerKey: &lastServerKey];
}
folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: collection withType: folderType]];
// If we got any changes or if we have applied any commands
// let's regenerate our SyncKey based on the collection tag.
if ([changeBuffer length] || [commandsBuffer length])
{
if (lastServerKey)
davCollectionTag = lastServerKey;
else if (![[self _folderMetadataForKey: [collection nameInContainer]] objectForKey: @"MoreAvailable"])
davCollectionTag = [collection davCollectionTag];
else
{
// Use the SyncKey saved by processSyncGetChanges - if processSyncGetChanges is not called (because of getChanges=false)
// SyncKey has the value of the previous sync operation.
davCollectionTag = [folderMetadata objectForKey: @"SyncKey"];
if (!davCollectionTag)
davCollectionTag = [collection davCollectionTag];
}
*changeDetected = YES;
}
else
{
if (folderType == ActiveSyncMailFolder && [syncKey isEqualToString: @"-1"])
davCollectionTag = [collection davCollectionTag];
// Make sure that client is updated with the right syncKey. - This keeps vtodo's and vevent's syncKey in sync.
syncKeyInCache = [folderMetadata objectForKey: @"SyncKey"];
if (syncKeyInCache && !([davCollectionTag isEqualToString:syncKeyInCache]) && !first_sync)
{
davCollectionTag = syncKeyInCache;
*changeDetected = YES;
}
}
// Generate the response buffer
@@ -1074,10 +1316,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[theBuffer appendFormat: @"<SyncKey>%@</SyncKey>", davCollectionTag];
[theBuffer appendFormat: @"<CollectionId>%@</CollectionId>", collectionId];
[theBuffer appendFormat: @"<Status>%d</Status>", 1];
[theBuffer appendFormat: @"<Status>%d</Status>", status];
// MoreAvailable breaks Windows Mobile devices if not between <Status> and <Commands>
// https://social.msdn.microsoft.com/Forums/en-US/040b254e-f47e-4cc1-a397-6d8393cdb819/airsyncmoreavailable-breaks-windows-mobile-devices-what-am-i-doing-wrong?forum=os_exchangeprotocols
if ([folderMetadata objectForKey: @"MoreAvailable"])
[theBuffer appendString: @"<MoreAvailable/>"];
[theBuffer appendString: changeBuffer];
[theBuffer appendString: commandsBuffer];
[theBuffer appendString: changeBuffer];
[theBuffer appendString: @"</Collection>"];
}
@@ -1186,21 +1433,42 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NSArray *allCollections;
NSData *d;
int i, j, defaultInterval, heartbeatInterval, internalInterval;
int i, j, defaultInterval, heartbeatInterval, internalInterval, maxSyncResponseSize;
BOOL changeDetected;
changeDetected = NO;
maxSyncResponseSize = [[SOGoSystemDefaults sharedSystemDefaults] maximumSyncResponseSize];
// We initialize our output buffer
output = [NSMutableString string];
output = [[NSMutableString alloc] init];
[output appendString: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"];
[output appendString: @"<!DOCTYPE ActiveSync PUBLIC \"-//MICROSOFT//DTD ActiveSync//EN\" \"http://www.microsoft.com/\">"];
[output appendString: @"<Sync xmlns=\"AirSync:\">"];
//
// We don't support yet empty Sync requests. See: http://msdn.microsoft.com/en-us/library/ee203280(v=exchg.80).aspx
// We return '13' - see http://msdn.microsoft.com/en-us/library/gg675457(v=exchg.80).aspx
//
if (!theDocumentElement || [[(id)[theDocumentElement getElementsByTagName: @"Partial"] lastObject] textValue])
{
[output appendString: @"<Status>13</Status>"];
[output appendString: @"</Sync>"];
d = [[output dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml];
[theResponse setContent: d];
return;
}
defaults = [SOGoSystemDefaults sharedSystemDefaults];
heartbeatInterval = [[[(id)[theDocumentElement getElementsByTagName: @"HeartbeatInterval"] lastObject] textValue] intValue];
defaultInterval = [defaults maximumSyncInterval];
internalInterval = [defaults internalSyncInterval];
// If the request doesn't contain "HeartbeatInterval" there is no reason to delay the response.
if (heartbeatInterval == 0)
heartbeatInterval = internalInterval = 1;
// We check to see if our heartbeat interval falls into the supported ranges.
if (heartbeatInterval > defaultInterval || heartbeatInterval < 1)
{
@@ -1217,7 +1485,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
allCollections = (id)[theDocumentElement getElementsByTagName: @"Collection"];
// We enter our loop detection change
for (i = 0; i < (defaultInterval/internalInterval); i++)
for (i = 0; i < (heartbeatInterval/internalInterval); i++)
{
s = [NSMutableString string];
@@ -1225,31 +1493,50 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
aCollection = [allCollections objectAtIndex: j];
[self processSyncCollection: aCollection inBuffer: s changeDetected: &changeDetected];
[self processSyncCollection: aCollection
inBuffer: s
changeDetected: &changeDetected
maxSyncResponseSize: maxSyncResponseSize];
if (maxSyncResponseSize > 0 && [s length] >= maxSyncResponseSize)
break;
}
if (changeDetected)
{
NSLog(@"Change detected, we push the content.");
[self logWithFormat: @"Change detected, we push the content."];
break;
}
else if (heartbeatInterval > 1)
{
[self logWithFormat: @"Sleeping %d seconds while detecting changes...", internalInterval];
sleep(internalInterval);
}
else
{
NSLog(@"Sleeping %d seconds while detecting changes...", internalInterval);
sleep(internalInterval);
break;
}
}
// We always return the last generated response.
// If we only return <Sync><Collections/></Sync>,
// iOS powered devices will simply crash.
[output appendString: s];
[output appendString: @"</Collections></Sync>"];
d = [[output dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml];
// Only send a response if there are changes or MS-ASProtocolVersion is either 2.5 or 12.0 oterwise send an empty response.
if (changeDetected || [[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"] || [[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"12.0"])
{
// We always return the last generated response.
// If we only return <Sync><Collections/></Sync>,
// iOS powered devices will simply crash.
[output appendString: s];
[theResponse setContent: d];
[output appendString: @"</Collections></Sync>"];
d = [output dataUsingEncoding: NSUTF8StringEncoding];
d = [d xml2wbxml];
[theResponse setContent: d];
}
// Avoid overloading the autorelease pool here, as Sync command can
// generate fairly large responses.
RELEASE(output);
}
@end
File diff suppressed because it is too large. Load diff
+435 -72
View File
@@ -30,7 +30,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "SOGoMailObject+ActiveSync.h"
#import <Foundation/NSArray.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSCalendarDate.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSException.h>
@@ -48,7 +47,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import <NGExtensions/NSString+Encoding.h>
#import <NGImap4/NGImap4Envelope.h>
#import <NGImap4/NGImap4EnvelopeAddress.h>
#import <NGImap4/NSString+Imap4.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGObjWeb/WOApplication.h>
#import <NGMime/NGMimeBodyPart.h>
#import <NGMime/NGMimeFileData.h>
@@ -58,6 +59,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import <NGMail/NGMimeMessage.h>
#import <NGMail/NGMimeMessageGenerator.h>
#import <Mailer/SOGoMailLabel.h>
#import <SOGo/SOGoUserDefaults.h>
#include "iCalTimeZone+ActiveSync.h"
#include "NSData+ActiveSync.h"
#include "NSDate+ActiveSync.h"
@@ -67,8 +72,45 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <Appointments/iCalPerson+SOGo.h>
#include <Mailer/NSString+Mail.h>
#include <Mailer/SOGoMailBodyPart.h>
#include <SOGo/SOGoUser.h>
#include <SOGo/NSString+Utilities.h>
#import <Appointments/SOGoAptMailNotification.h>
unsigned char strToChar(char a, char b) {
char encoder[3] = {'\0','\0','\0'};
encoder[0] = a;
encoder[1] = b;
return (char) strtol(encoder,NULL,16);
}
@interface NSString (NSStringExtensions)
- (NSData *) decodeFromHexidecimal;
@end
@implementation NSString (NSStringExtensions)
- (NSData *) decodeFromHexidecimal;
{
const char * bytes = [self cStringUsingEncoding: NSUTF8StringEncoding];
NSUInteger length = strlen(bytes);
unsigned char * r = (unsigned char *) malloc(length / 2 + 1);
unsigned char * index = r;
while ((*bytes) && (*(bytes +1))) {
*index = strToChar(*bytes, *(bytes +1));
index++;
bytes+=2;
}
*index = '\0';
NSData * result = [NSData dataWithBytes: r length: length / 2];
free(r);
return result;
}
@end
typedef struct {
uint32_t dwLowDateTime;
@@ -84,7 +126,7 @@ struct GlobalObjectId {
FILETIME CreationTime;
uint8_t X[8];
uint32_t Size;
uint8_t* Data;
uint8_t Data[0];
};
@implementation SOGoMailObject (ActiveSync)
@@ -111,39 +153,40 @@ struct GlobalObjectId {
//
// The GlobalObjId is documented here: http://msdn.microsoft.com/en-us/library/ee160198(v=EXCHG.80).aspx
//
- (NSData *) _computeGlobalObjectIdFromEvent: (iCalEvent *) event
{
NSData *binPrefix, *globalObjectId, *uidAsASCII;
NSString *prefix, *uid;
struct GlobalObjectId newGlobalId;
struct GlobalObjectId *newGlobalId;
const char *bytes;
uid = [event uid];
uidAsASCII = [uid decodeFromHexidecimal];
newGlobalId = (struct GlobalObjectId*)calloc(sizeof(uint8_t), sizeof(struct GlobalObjectId) + 0x0c + [uidAsASCII length]);
prefix = @"040000008200e00074c5b7101a82e008";
// dataPrefix is "vCal-Uid %x01 %x00 %x00 %x00"
uint8_t dataPrefix[] = { 0x76, 0x43, 0x61, 0x6c, 0x2d, 0x55, 0x69, 0x64, 0x01, 0x00, 0x00, 0x00 };
uid = [event uid];
binPrefix = [prefix convertHexStringToBytes];
[binPrefix getBytes: &newGlobalId.ByteArrayID];
[self _setInstanceDate: &newGlobalId
[binPrefix getBytes: &newGlobalId->ByteArrayID];
[self _setInstanceDate: newGlobalId
fromDate: [event recurrenceId]];
uidAsASCII = [uid dataUsingEncoding: NSASCIIStringEncoding];
bytes = [uidAsASCII bytes];
// 0x0c is the size of our dataPrefix
newGlobalId.Size = 0x0c + [uidAsASCII length];
newGlobalId.Data = malloc(newGlobalId.Size * sizeof(uint8_t));
memcpy(newGlobalId.Data, dataPrefix, 0x0c);
memcpy(newGlobalId.Data + 0x0c, bytes, newGlobalId.Size - 0x0c);
newGlobalId->Size = 0x0c + [uidAsASCII length];
memcpy(newGlobalId->Data, dataPrefix, 0x0c);
memcpy(newGlobalId->Data + 0x0c, bytes, newGlobalId->Size - 0x0c);
globalObjectId = [[NSData alloc] initWithBytes: &newGlobalId length: 40 + newGlobalId.Size*sizeof(uint8_t)];
free(newGlobalId.Data);
globalObjectId = [[NSData alloc] initWithBytes: newGlobalId length: 40 + newGlobalId->Size*sizeof(uint8_t)];
free(newGlobalId);
return [globalObjectId autorelease];
}
//
// For debugging purposes...
//
@@ -205,12 +248,15 @@ struct GlobalObjectId {
//
//
- (NSData *) _preferredBodyDataInMultipartUsingType: (int) theType
nativeTypeFound: (int *) theNativeTypeFound
{
NSString *encoding, *key, *plainKey, *htmlKey, *type, *subtype;
NSDictionary *textParts, *part;
NSEnumerator *e;
NSData *d;
BOOL ignore;
textParts = [self fetchPlainTextParts];
e = [textParts keyEnumerator];
plainKey = nil;
@@ -219,10 +265,35 @@ struct GlobalObjectId {
while ((key = [e nextObject]))
{
// Walk the hierarchy up and check whether parents are of type mulipart - i.e. ignore message/rfc822
if ([key countOccurrencesOfString: @"."] > 0)
{
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;
}
part = [self lookupInfoForBodyPart: key];
type = [part valueForKey: @"type"];
subtype = [part valueForKey: @"subtype"];
// Don't select an attachment as body
if ([[[part valueForKey: @"disposition"] valueForKey: @"type"] isEqualToString: @"attachment"])
continue;
if ([type isEqualToString: @"text"] && [subtype isEqualToString: @"html"])
htmlKey = key;
else if ([type isEqualToString: @"text"] && [subtype isEqualToString: @"plain"])
@@ -230,11 +301,22 @@ struct GlobalObjectId {
}
key = nil;
*theNativeTypeFound = 1;
if (theType == 2)
key = htmlKey;
else if (theType == 1)
if (theType == 2 && htmlKey)
{
key = htmlKey;
*theNativeTypeFound = 2;
}
else if (theType == 1 && plainKey)
key = plainKey;
else if (theType == 2 && plainKey)
key = plainKey;
else if (theType == 1 && htmlKey)
{
key = htmlKey;
*theNativeTypeFound = 2;
}
if (key)
{
@@ -252,9 +334,17 @@ struct GlobalObjectId {
charset = [[[self lookupInfoForBodyPart: key] objectForKey: @"parameterList"] objectForKey: @"charset"];
if (![charset length])
charset = @"us-ascii";
charset = @"utf-8";
s = [NSString stringWithData: d usingEncodingNamed: charset];
// We fallback to ISO-8859-1 string encoding
if (!s)
s = [[[NSString alloc] initWithData: d encoding: NSISOLatin1StringEncoding] autorelease];
if (theType == 1 && *theNativeTypeFound == 2)
s = [s htmlToText];
d = [s dataUsingEncoding: NSUTF8StringEncoding];
}
@@ -283,7 +373,7 @@ struct GlobalObjectId {
performed: b];
}
}
else if ([thePart isKindOfClass: [NGMimeBodyPart class]])
else if ([thePart isKindOfClass: [NGMimeBodyPart class]] || [thePart isKindOfClass: [NGMimeMessage class]])
{
NGMimeFileData *fdata;
id body;
@@ -299,7 +389,7 @@ struct GlobalObjectId {
[[[thePart contentType] type] isEqualToString: @"text"] &&
([[[thePart contentType] subType] isEqualToString: @"plain"] || [[[thePart contentType] subType] isEqualToString: @"html"]))
{
// We make sure everything is encoded in UTF-8
// We make sure everything is encoded in UTF-8.
NGMimeType *mimeType;
NSString *s;
@@ -310,9 +400,13 @@ struct GlobalObjectId {
charset = [[thePart contentType] valueOfParameter: @"charset"];
if (![charset length])
charset = @"us-ascii";
charset = @"utf-8";
s = [NSString stringWithData: body usingEncodingNamed: charset];
s = [NSString stringWithData: body usingEncodingNamed: charset];
// We fallback to ISO-8859-1 string encoding. We avoid #3103.
if (!s)
s = [[[NSString alloc] initWithData: body encoding: NSISOLatin1StringEncoding] autorelease];
}
else
{
@@ -362,8 +456,7 @@ struct GlobalObjectId {
if (message)
{
[self _sanitizedMIMEPart: [message body]
performed: &b];
[self _sanitizedMIMEPart: message performed: &b];
if (b)
{
@@ -404,14 +497,14 @@ 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;
charset = [[[self lookupInfoForBodyPart: @""] objectForKey: @"parameterList"] objectForKey: @"charset"];
if (![charset length])
charset = @"us-ascii";
charset = @"utf-8";
d = [[self fetchPlainTextParts] objectForKey: @""];
@@ -425,25 +518,30 @@ struct GlobalObjectId {
d = [d dataByDecodingQuotedPrintableTransferEncoding];
s = [NSString stringWithData: d usingEncodingNamed: charset];
// We fallback to ISO-8859-1 string encoding. We avoid #3103.
if (!s)
s = [[[NSString alloc] initWithData: d encoding: NSISOLatin1StringEncoding] autorelease];
// Check if we must convert html->plain
if (theType == 1 && [subtype isEqualToString: @"html"])
{
s = [s htmlToText];
}
d = [s dataUsingEncoding: NSUTF8StringEncoding];
}
else if ([type isEqualToString: @"multipart"])
{
d = [self _preferredBodyDataInMultipartUsingType: theType];
d = [self _preferredBodyDataInMultipartUsingType: theType nativeTypeFound: theNativeType];
}
}
else if (theType == 4)
{
// We sanitize the content *ONLY* for Outlook clients. Outlook has strange issues
// We sanitize the content *ONLY* for Outlook clients and if the content-transfer-encoding is 8bit. Outlook has strange issues
// with quoted-printable/base64 encoded text parts. It just doesn't decode them.
if ([[context objectForKey: @"DeviceType"] isEqualToString: @"WindowsOutlook15"])
encoding = [[self lookupInfoForBodyPart: @""] objectForKey: @"encoding"];
if ([[context objectForKey: @"DeviceType"] isEqualToString: @"WindowsOutlook15"] || ([encoding caseInsensitiveCompare: @"8bit"] == NSOrderedSame))
d = [self _sanitizedMIMEMessage];
else
d = [self content];
@@ -452,15 +550,65 @@ struct GlobalObjectId {
return d;
}
- (NSString *) _getNormalizedSubject
{
NSString *subject;
NSUInteger colIdx;
NSString *stringValue;
subject = [[self subject] decodedHeader];
colIdx = [subject rangeOfString: @":" options:NSBackwardsSearch].location;
if (colIdx != NSNotFound && colIdx + 1 < [subject length])
stringValue = [[subject substringFromIndex: colIdx + 1] stringByTrimmingLeadSpaces];
else
stringValue = subject;
if (!stringValue)
stringValue = @"";
return stringValue;
}
//
//
//
- (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"];
@@ -506,10 +654,13 @@ struct GlobalObjectId {
//
- (NSString *) activeSyncRepresentationInContext: (WOContext *) _context
{
NSAutoreleasePool *pool;
NSData *d, *globalObjId;
NSArray *attachmentKeys;
NSMutableString *s;
uint32_t v;
NSString *p;
id value;
iCalCalendar *calendar;
@@ -534,7 +685,7 @@ struct GlobalObjectId {
if (value)
{
[s appendFormat: @"<Subject xmlns=\"Email:\">%@</Subject>", [value activeSyncRepresentationInContext: context]];
[s appendFormat: @"<ThreadTopic xmlns=\"Email:\">%@</ThreadTopic>", [value activeSyncRepresentationInContext: context]];
[s appendFormat: @"<ThreadTopic xmlns=\"Email:\">%@</ThreadTopic>", [[self _getNormalizedSubject] activeSyncRepresentationInContext: context]];
}
// DateReceived
@@ -550,8 +701,34 @@ struct GlobalObjectId {
if (value)
[s appendFormat: @"<Cc xmlns=\"Email:\">%@</Cc>", [value activeSyncRepresentationInContext: context]];
// Importance - FIXME
[s appendFormat: @"<Importance xmlns=\"Email:\">%@</Importance>", @"1"];
// Importance
v = 0x1;
value = [[self mailHeaders] objectForKey: @"x-priority"];
if ([value isKindOfClass: [NSArray class]])
p = [value lastObject];
else
p = value;
if (p)
{
if ([p hasPrefix: @"1"]) v = 0x2;
else if ([p hasPrefix: @"2"]) v = 0x2;
else if ([p hasPrefix: @"4"]) v = 0x0;
else if ([p hasPrefix: @"5"]) v = 0x0;
}
else
{
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;
}
[s appendFormat: @"<Importance xmlns=\"Email:\">%d</Importance>", v];
// Read
[s appendFormat: @"<Read xmlns=\"Email:\">%d</Read>", ([self read] ? 1 : 0)];
@@ -615,18 +792,18 @@ struct GlobalObjectId {
[s appendFormat: @"<AllDayEvent xmlns=\"Email:\">%d</AllDayEvent>", ([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: @"<StartTime xmlns=\"Email:\">%@</StartTime>", [[event startDate] activeSyncRepresentationWithoutSeparatorsInContext: context]];
[s appendFormat: @"<StartTime xmlns=\"Email:\">%@</StartTime>", [[event startDate] activeSyncRepresentationInContext: context]];
if ([event timeStampAsDate])
[s appendFormat: @"<DTStamp xmlns=\"Email:\">%@</DTStamp>", [[event timeStampAsDate] activeSyncRepresentationWithoutSeparatorsInContext: context]];
[s appendFormat: @"<DTStamp xmlns=\"Email:\">%@</DTStamp>", [[event timeStampAsDate] activeSyncRepresentationInContext: context]];
else if ([event created])
[s appendFormat: @"<DTStamp xmlns=\"Email:\">%@</DTStamp>", [[event created] activeSyncRepresentationWithoutSeparatorsInContext: context]];
[s appendFormat: @"<DTStamp xmlns=\"Email:\">%@</DTStamp>", [[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: @"<EndTime xmlns=\"Email:\">%@</EndTime>", [[event endDate] activeSyncRepresentationWithoutSeparatorsInContext: context]];
[s appendFormat: @"<EndTime xmlns=\"Email:\">%@</EndTime>", [[event endDate] activeSyncRepresentationInContext: context]];
// FIXME: Single appointment - others are not supported right now
[s appendFormat: @"<InstanceType xmlns=\"Email:\">%d</InstanceType>", 0];
@@ -674,7 +851,9 @@ struct GlobalObjectId {
[s appendFormat: @"<GlobalObjId xmlns=\"Email:\">%@</GlobalObjId>", [globalObjId activeSyncRepresentationInContext: context]];
// We set the right message type - we must set AS version to 14.1 for this
[s appendFormat: @"<MeetingMessageType xmlns=\"Email2:\">%d</MeetingMessageType>", 1];
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.1"])
[s appendFormat: @"<MeetingMessageType xmlns=\"Email2:\">%d</MeetingMessageType>", 1];
[s appendString: @"</MeetingRequest>"];
// ContentClass
@@ -699,19 +878,82 @@ struct GlobalObjectId {
// Body - namespace 17
preferredBodyType = [[context objectForKey: @"BodyPreferenceType"] intValue];
// Make use of a local pool here as _preferredBodyDataUsingType:nativeType: will consume
// a significant amout of RAM and file descriptors
pool = [[NSAutoreleasePool alloc] init];
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
{
preferredBodyType = 2;
d = [[p getBody] dataUsingEncoding: NSUTF8StringEncoding];
}
}
if (d)
{
NSMutableData *sanitizedData;
NSString *content;
int len, truncated;
content = [[NSString alloc] initWithData: d encoding: NSUTF8StringEncoding];
// Outlook fails to decode quoted-printable (see #3082) if lines are not termined by CRLF.
const char *bytes;
char *mbytes;
int mlen;
len = [d length];
mlen = 0;
sanitizedData = [NSMutableData dataWithLength: len*2];
bytes = [d bytes];
mbytes = [sanitizedData mutableBytes];
while (len > 0)
{
if (*bytes == '\n' && *(bytes-1) != '\r' && mlen > 0)
{
*mbytes = '\r';
mbytes++;
mlen++;
}
*mbytes = *bytes;
mbytes++; bytes++;
len--;
mlen++;
}
[sanitizedData setLength: mlen];
content = [[NSString alloc] initWithData: sanitizedData encoding: NSUTF8StringEncoding];
// FIXME: This is a hack. We should normally avoid doing this as we might get
// broken encodings. We should rather tell that the data was truncated and expect
@@ -721,38 +963,53 @@ struct GlobalObjectId {
// for an "interesting" discussion around this.
//
if (!content)
content = [[NSString alloc] initWithData: d encoding: NSISOLatin1StringEncoding];
content = [[NSString alloc] initWithData: sanitizedData encoding: NSISOLatin1StringEncoding];
AUTORELEASE(content);
content = [content activeSyncRepresentationInContext: context];
truncated = 0;
len = [content length];
[s appendString: @"<Body xmlns=\"AirSyncBase:\">"];
[s appendFormat: @"<Type>%d</Type>", preferredBodyType];
[s appendFormat: @"<Truncated>%d</Truncated>", truncated];
[s appendFormat: @"<Preview></Preview>"];
if (!truncated)
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
{
[s appendFormat: @"<Data>%@</Data>", content];
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", len];
[s appendFormat: @"<Body xmlns=\"Email:\">%@</Body>", content];
[s appendFormat: @"<BodyTruncated xmlns=\"Email:\">%d</BodyTruncated>", truncated];
}
[s appendString: @"</Body>"];
else
{
[s appendString: @"<Body xmlns=\"AirSyncBase:\">"];
// Set the correct type if client requested text/html but we got text/plain
if (preferredBodyType == 2 && nativeBodyType == 1)
[s appendString: @"<Type>1</Type>"];
else
[s appendFormat: @"<Type>%d</Type>", preferredBodyType];
[s appendFormat: @"<Truncated>%d</Truncated>", truncated];
[s appendFormat: @"<Preview></Preview>"];
if (!truncated)
{
[s appendFormat: @"<Data>%@</Data>", content];
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", len];
}
[s appendString: @"</Body>"];
}
}
DESTROY(pool);
// Attachments -namespace 16
attachmentKeys = [self fetchFileAttachmentKeys];
if ([attachmentKeys count])
{
int i;
[s appendString: @"<Attachments xmlns=\"AirSyncBase:\">"];
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
[s appendString: @"<Attachments xmlns=\"Email:\">"];
else
[s appendString: @"<Attachments xmlns=\"AirSyncBase:\">"];
for (i = 0; i < [attachmentKeys count]; i++)
{
value = [attachmentKeys objectAtIndex: i];
@@ -763,11 +1020,22 @@ struct GlobalObjectId {
// FileReference must be a unique identifier across the whole store. We use the following structure:
// mail/<foldername>/<message UID/<pathofpart>
// mail/INBOX/2
[s appendFormat: @"<FileReference>mail/%@/%@/%@</FileReference>", [[[self container] relativeImap4Name] stringByEscapingURL], [self nameInContainer], [value objectForKey: @"path"]];
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
[s appendFormat: @"<AttName>mail/%@/%@/%@</AttName>", [[[self container] relativeImap4Name] stringByEscapingURL], [self nameInContainer], [value objectForKey: @"path"]];
else
[s appendFormat: @"<FileReference>mail/%@/%@/%@</FileReference>", [[[self container] relativeImap4Name] stringByEscapingURL], [self nameInContainer], [value objectForKey: @"path"]];
[s appendFormat: @"<Method>%d</Method>", 1]; // See: http://msdn.microsoft.com/en-us/library/ee160322(v=exchg.80).aspx
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", [[value objectForKey: @"size"] intValue]];
//[s appendFormat: @"<IsInline>%d</IsInline>", 1];
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
{
[s appendFormat: @"<AttMethod>%d</AttMethod>", 1];
[s appendFormat: @"<AttSize>%d</AttSize>", [[value objectForKey: @"size"] intValue]];
}
else
{
[s appendFormat: @"<Method>%d</Method>", 1]; // See: http://msdn.microsoft.com/en-us/library/ee160322(v=exchg.80).aspx
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", [[value objectForKey: @"size"] intValue]];
//[s appendFormat: @"<IsInline>%d</IsInline>", 1];
}
[s appendString: @"</Attachment>"];
}
@@ -778,10 +1046,46 @@ struct GlobalObjectId {
[s appendString: @"<Flag xmlns=\"Email:\">"];
[s appendFormat: @"<FlagStatus>%d</FlagStatus>", ([self flagged] ? 2 : 0)];
[s appendString: @"</Flag>"];
// Categroies/Labels
NSEnumerator *categories;
categories = [[[self fetchCoreInfos] objectForKey: @"flags"] objectEnumerator];
if (categories)
{
NSString *currentFlag;
NSDictionary *v;
v = [[[context activeUser] userDefaults] mailLabelsColors];
[s appendFormat: @"<Categories xmlns=\"Email:\">"];
while ((currentFlag = [categories nextObject]))
{
if ([[v objectForKey: currentFlag] objectAtIndex:0])
[s appendFormat: @"<Category>%@</Category>", [[[v objectForKey: currentFlag] objectAtIndex:0] activeSyncRepresentationInContext: context]];
}
[s appendFormat: @"</Categories>"];
}
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.0"] ||
[[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.1"])
{
NSString *reference;
reference = [[[[self mailHeaders] objectForKey: @"references"] componentsSeparatedByString: @" "] objectAtIndex: 0];
if ([reference length] > 0)
[s appendFormat: @"<ConversationId xmlns=\"Email2:\">%@</ConversationId>", [[reference dataUsingEncoding: NSUTF8StringEncoding] activeSyncRepresentationInContext: context]];
else if ([self inReplyTo])
[s appendFormat: @"<ConversationId xmlns=\"Email2:\">%@</ConversationId>", [[[self inReplyTo] dataUsingEncoding: NSUTF8StringEncoding] activeSyncRepresentationInContext: context]];
else if ([self messageId])
[s appendFormat: @"<ConversationId xmlns=\"Email2:\">%@</ConversationId>", [[[self messageId] dataUsingEncoding: NSUTF8StringEncoding] activeSyncRepresentationInContext: context]];
}
// FIXME - support these in the future
//[s appendString: @"<ConversationId xmlns=\"Email2:\">foobar</ConversationId>"];
//[s appendString: @"<ConversationIndex xmlns=\"Email2:\">zot=</ConversationIndex>"];
// NativeBodyType -- http://msdn.microsoft.com/en-us/library/ee218276(v=exchg.80).aspx
// This is a required child element.
@@ -840,6 +1144,65 @@ struct GlobalObjectId {
else
[self removeFlags: @"seen"];;
}
if ((o = [theValues objectForKey: @"Categories"]))
{
NSEnumerator *categories;
NSString *currentFlag;
NSDictionary *v;
v = [[[context activeUser] userDefaults] mailLabelsColors];
// add categories/labels sent from client
if ([o isKindOfClass: [NSArray class]])
{
NSEnumerator *enumerator;
NSMutableArray *labels;
NSEnumerator *flags;
id key;
labels = [NSMutableArray array];
enumerator = [v keyEnumerator];
flags = [o objectEnumerator];
while ((currentFlag = [flags nextObject]))
{
while ((key = [enumerator nextObject]))
{
if (([currentFlag isEqualToString:[[v objectForKey:key] objectAtIndex:0]]))
{
[labels addObject: key];
break;
}
}
}
[self addFlags: [labels componentsJoinedByString: @" "]];
}
categories = [[[self fetchCoreInfos] objectForKey: @"flags"] objectEnumerator];
// remove all categories/labels from server which were not it the list sent from client
if (categories)
{
while ((currentFlag = [categories nextObject]))
{
// only deal with lables and don't touch flags like seen and flagged
if (([v objectForKey: currentFlag]))
{
if (![o isKindOfClass: [NSArray class]])
{
[self removeFlags: currentFlag];
}
else if (([o indexOfObject: [[v objectForKey:currentFlag] objectAtIndex:0]] == NSNotFound))
{
[self removeFlags: currentFlag];
}
}
}
}
}
}
@end
+1 -1
View File
@@ -55,7 +55,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[o setUID: theUID];
[o setSequence: theSequence];
return o;
return [o autorelease];
}
- (void) dealloc
@@ -61,7 +61,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[response setHeader: @"private" forKey: @"Cache-Control"];
[response setHeader: @"OPTIONS, POST" forKey: @"Allow"];
[response setHeader: @"14.1" forKey: @"MS-Server-ActiveSync"];
[response setHeader: @"2.0,2.1,2.5,12.0,12.1,14.0,14.1" forKey: @"MS-ASProtocolVersions"];
[response setHeader: @"2.5,12.0,12.1,14.0,14.1" forKey: @"MS-ASProtocolVersions"];
[response setHeader: @"Sync,SendMail,SmartForward,SmartReply,GetAttachment,GetHierarchy,CreateCollection,DeleteCollection,MoveCollection,FolderSync,FolderCreate,FolderDelete,FolderUpdate,MoveItems,GetItemEstimate,MeetingResponse,Search,Settings,Ping,ItemOperations,ResolveRecipients,ValidateCert" forKey: @"MS-ASProtocolCommands"];
[response setHeader: @"OPTIONS, POST" forKey: @"Public"];
}
+3 -3
View File
@@ -16,11 +16,11 @@ ADDITIONAL_INCLUDE_DIRS += \
-I../../SOPE
ADDITIONAL_LIB_DIRS += \
-L../SoObjects/SOGo/SOGo.framework/ \
-L../SoObjects/SOGo/SOGo.framework/Versions/Current/sogo \
-L../SoObjects/SOGo/$(GNUSTEP_OBJ_DIR)/ \
-L../OGoContentStore/$(GNUSTEP_OBJ_DIR)/ \
-L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ \
-L/usr/local/lib
-L/usr/local/lib \
-Wl,-rpath,$(SOGO_SYSLIBDIR)/sogo
BUNDLE_LIBS += \
-lSOGo \
+108 -47
View File
@@ -40,6 +40,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import <NGExtensions/NSString+misc.h>
#import <NGObjWeb/WOContext.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGObjWeb/WORequest.h>
#import <NGCards/iCalCalendar.h>
#import <NGCards/iCalDateTime.h>
@@ -76,13 +77,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
{
NSMutableString *s;
NSArray *attendees;
NSArray *attendees, *categories;
iCalPerson *organizer, *attendee;
iCalTimeZone *tz;
id o;
int v;
int v, i, meetingStatus;
NSTimeZone *userTimeZone;
userTimeZone = [[[context activeUser] userDefaults] timeZone];
@@ -127,13 +128,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
tz = [(iCalDateTime *)[self firstChildWithTag: @"dtstart"] timeZone];
if (!tz)
tz = [iCalTimeZone timeZoneForName: @"Europe/London"];
tz = [iCalTimeZone timeZoneForName: [userTimeZone name]];
[s appendFormat: @"<TimeZone xmlns=\"Calendar:\">%@</TimeZone>", [tz activeSyncRepresentationInContext: context]];
// Organizer and other invitations related properties
if ((organizer = [self organizer]))
{
meetingStatus = 1; // meeting and the user is the meeting organizer.
o = [organizer rfc822Email];
if ([o length])
{
@@ -159,7 +161,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[s appendString: @"<Attendee xmlns=\"Calendar:\">"];
attendee = [attendees objectAtIndex: i];
[s appendFormat: @"<Attendee_Email xmlns=\"Calendar:\">%@</Attendee_Email>", [attendee rfc822Email]];
[s appendFormat: @"<Attendee_Email xmlns=\"Calendar:\">%@</Attendee_Email>", [[attendee rfc822Email] activeSyncRepresentationInContext: context]];
[s appendFormat: @"<Attendee_Name xmlns=\"Calendar:\">%@</Attendee_Name>", [[attendee cn] activeSyncRepresentationInContext: context]];
attendee_status = [self _attendeeStatus: attendee];
@@ -177,6 +179,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
}
[s appendString: @"</Attendees>"];
}
else
{
meetingStatus = 0; // appointment
}
// This depends on the 'NEEDS-ACTION' parameter.
// This will trigger the SendMail command
@@ -186,18 +192,21 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
int attendee_status;
meetingStatus = 3; // event is a meeting, and the user is not the meeting organizer
attendee = [self userAsAttendee: [context activeUser]];
attendee_status = [self _attendeeStatus: attendee];
[s appendFormat: @"<ResponseRequested xmlns=\"Calendar:\">%d</ResponseRequested>", 1];
[s appendFormat: @"<ResponseType xmlns=\"Calendar:\">%d</ResponseType>", attendee_status];
[s appendFormat: @"<MeetingStatus xmlns=\"Calendar:\">%d</MeetingStatus>", 3];
[s appendFormat: @"<DisallowNewTimeProposal xmlns=\"Calendar:\">%d</DisallowNewTimeProposal>", 1];
// BusyStatus -- http://msdn.microsoft.com/en-us/library/ee202290(v=exchg.80).aspx
[s appendFormat: @"<BusyStatus xmlns=\"Calendar:\">%d</BusyStatus>", 2];
}
[s appendFormat: @"<MeetingStatus xmlns=\"Calendar:\">%d</MeetingStatus>", meetingStatus];
// Subject -- http://msdn.microsoft.com/en-us/library/ee157192(v=exchg.80).aspx
if ([[self summary] length])
[s appendFormat: @"<Subject xmlns=\"Calendar:\">%@</Subject>", [[self summary] activeSyncRepresentationInContext: context]];
@@ -223,12 +232,25 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Sensitivity
if ([[self accessClass] isEqualToString: @"PRIVATE"])
v = 2;
if ([[self accessClass] isEqualToString: @"CONFIDENTIAL"])
else if ([[self accessClass] isEqualToString: @"CONFIDENTIAL"])
v = 3;
else
v = 0;
[s appendFormat: @"<Sensitivity xmlns=\"Calendar:\">%d</Sensitivity>", v];
categories = [self categories];
if ([categories count])
{
[s appendFormat: @"<Categories xmlns=\"Calendar:\">"];
for (i = 0; i < [categories count]; i++)
{
[s appendFormat: @"<Category xmlns=\"Calendar:\">%@</Category>", [[categories objectAtIndex: i] activeSyncRepresentationInContext: context]];
}
[s appendFormat: @"</Categories>"];
}
// Reminder -- http://msdn.microsoft.com/en-us/library/ee219691(v=exchg.80).aspx
// TODO: improve this to handle more alarm types
@@ -236,7 +258,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
iCalAlarm *alarm;
alarm = [[self alarms] objectAtIndex: 0];
alarm = [self firstDisplayOrAudioAlarm];
[s appendString: [alarm activeSyncRepresentationInContext: context]];
}
@@ -250,13 +272,23 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
o = [self comment];
if ([o length])
{
// It is very important here to NOT set <Truncated>0</Truncated> in the response,
// otherwise it'll prevent WP8 phones from sync'ing. See #3028 for details.
o = [o activeSyncRepresentationInContext: context];
[s appendString: @"<Body xmlns=\"AirSyncBase:\">"];
[s appendFormat: @"<Type>%d</Type>", 1];
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", [o length]];
[s appendFormat: @"<Truncated>%d</Truncated>", 0];
[s appendFormat: @"<Data>%@</Data>", o];
[s appendString: @"</Body>"];
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
{
[s appendFormat: @"<Body xmlns=\"Calendar:\">%@</Body>", o];
[s appendString: @"<BodyTruncated xmlns=\"Calendar:\">0</BodyTruncated>"];
}
else
{
[s appendString: @"<Body xmlns=\"AirSyncBase:\">"];
[s appendFormat: @"<Type>%d</Type>", 1];
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", [o length]];
[s appendFormat: @"<Data>%@</Data>", o];
[s appendString: @"</Body>"];
}
}
[s appendFormat: @"<NativeBodyType xmlns=\"AirSyncBase:\">%d</NativeBodyType>", 1];
@@ -310,7 +342,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
iCalTimeZone *tz;
id o;
NSInteger tzOffset;
BOOL isAllDay;
if ((o = [theValues objectForKey: @"UID"]))
@@ -334,18 +365,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[o intValue];
}
//
//
//
if ((o = [theValues objectForKey: @"MeetingStatus"]))
{
[o intValue];
}
//
// 0- normal, 1- personal, 2- private and 3-confidential
//
if ((o = [theValues objectForKey: @"Sensitivy"]))
if ((o = [theValues objectForKey: @"Sensitivity"]))
{
switch ([o intValue])
{
@@ -362,18 +385,36 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
}
}
if ((o = [theValues objectForKey: @"TimeZone"]))
// Categories
if ((o = [theValues objectForKey: @"Categories"]) && [o length])
[self setCategories: o];
// We ignore TimeZone sent by mobile devices for now.
// Some Windows devices don't send during event updates.
//if ((o = [theValues objectForKey: @"TimeZone"]))
// {
// }
//else
{
// Ugh, we ignore it for now.
// We haven't received a timezone, let's use the user's timezone
// specified in SOGo for now.
userTimeZone = [[[context activeUser] userDefaults] timeZone];
tz = [iCalTimeZone timeZoneForName: [userTimeZone name]];
[(iCalCalendar *) parent addTimeZone: tz];
}
// FIXME: merge with iCalToDo
if ((o = [[theValues objectForKey: @"Body"] objectForKey: @"Data"]))
[self setComment: o];
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
{
if ((o = [theValues objectForKey: @"Body"]))
[self setComment: o];
}
else
{
if ((o = [[theValues objectForKey: @"Body"] objectForKey: @"Data"]))
[self setComment: o];
}
if ((o = [theValues objectForKey: @"Location"]))
[self setLocation: o];
@@ -383,21 +424,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
start = (iCalDateTime *) [self uniqueChildWithTag: @"dtstart"];
[start setTimeZone: tz];
if (isAllDay)
{
tzOffset = [userTimeZone secondsFromGMTForDate: o];
o = [o dateByAddingYears: 0 months: 0 days: 0
hours: 0 minutes: 0
seconds: tzOffset];
if (isAllDay)
{
[start setDate: o];
[start setTimeZone: nil];
}
else
{
tzOffset = [userTimeZone secondsFromGMTForDate: o];
o = [o dateByAddingYears: 0 months: 0 days: 0
hours: 0 minutes: 0
seconds: tzOffset];
[start setDateTime: o];
}
}
@@ -410,19 +443,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
if (isAllDay)
{
tzOffset = [userTimeZone secondsFromGMTForDate: o];
o = [o dateByAddingYears: 0 months: 0 days: 0
hours: 0 minutes: 0
seconds: tzOffset];
[end setDate: o];
[end setTimeZone: nil];
}
else
{
tzOffset = [userTimeZone secondsFromGMTForDate: o];
o = [o dateByAddingYears: 0 months: 0 days: 0
hours: 0 minutes: 0
seconds: tzOffset];
[end setDateTime: o];
}
}
@@ -481,11 +506,47 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[self setOrganizer: person];
}
if ((o = [theValues objectForKey: @"MeetingStatus"]))
{
//
// iOS is plain stupid here. It seends event invitations with no Organizer.
// We check this corner-case and if MeetingStatus == 1 (see http://msdn.microsoft.com/en-us/library/ee219342(v=exchg.80).aspx or details)
// and there's no organizer, we fake one.
//
if ([o intValue] == 1 && ![theValues objectForKey: @"Organizer_Email"] && ![[[self organizer] rfc822Email] length])
{
iCalPerson *person;
person = [iCalPerson elementWithTag: @"organizer"];
[person setEmail: [[[context activeUser] primaryIdentity] objectForKey: @"email"]];
[person setCn: [[context activeUser] cn]];
[person setPartStat: @"ACCEPTED"];
[self setOrganizer: person];
}
//
// When MeetingResponse fails Outlook still sends a new calendar entry with MeetingStatus=3.
// Use the organizer from the request if the event has no organizer.
//
if ([o intValue] == 3 && [theValues objectForKey: @"Organizer_Email"] && ![[[self organizer] rfc822Email] length])
{
iCalPerson *person;
person = [iCalPerson elementWithTag: @"organizer"];
[person setEmail: [theValues objectForKey: @"Organizer_Email"]];
[person setCn: [theValues objectForKey: @"Organizer_Name"]];
[person setPartStat: @"ACCEPTED"];
[self setOrganizer: person];
}
}
// Attendees - we don't touch the values if we're an attendee. This is gonna
// be done automatically by the ActiveSync client when invoking MeetingResponse.
if (![self userIsAttendee: [context activeUser]])
{
if ((o = [theValues objectForKey: @"Attendees"]))
// Windows phones sens sometimes an empty Attendees tag.
// We check it's an array before processing it.
if ((o = [theValues objectForKey: @"Attendees"])&& [o isKindOfClass: [NSArray class]])
{
NSMutableArray *attendees;
NSDictionary *attendee;
+3 -1
View File
@@ -76,15 +76,17 @@ struct SYSTEMTIME {
byMonth = [rrule byMonth];
if ([byMonth count] > 0)
{
tzData->wYear = 0;
tzData->wMonth = [[byMonth objectAtIndex: 0] intValue];
mask = [rrule byDayMask];
tzData->wDayOfWeek = [mask firstDay];
tzData->wDay = [mask firstOccurrence];
tzData->wDay = ([mask firstOccurrence] == -1) ? 5 : [mask firstOccurrence];
dateValue = [self startDate];
tzData->wHour = [dateValue hourOfDay];
tzData->wMinute = [dateValue minuteOfHour];
tzData->wSecond = [dateValue secondOfMinute];
tzData->wMilliseconds = 0;
}
}
+92 -28
View File
@@ -38,6 +38,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import <NGExtensions/NSString+misc.h>
#import <NGObjWeb/WOContext.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGObjWeb/WORequest.h>
#import <SOGo/SOGoUser.h>
#import <SOGo/SOGoUserDefaults.h>
@@ -49,23 +50,24 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "NSDate+ActiveSync.h"
#include "NSString+ActiveSync.h"
@implementation iCalToDo (ActiveSync)
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
{
NSMutableString *s;
NSArray *categories;
id o;
int v;
int v, i;
s = [NSMutableString string];
// Complete
o = [self completed];
[s appendFormat: @"<Complete xmlns=\"Tasks:\">%d</Complete>", (o ? 1 : 0)];
[s appendFormat: @"<Complete xmlns=\"Tasks:\">%d</Complete>", [[self status] isEqualToString: @"COMPLETED"] ? 1 : 0];
// DateCompleted
if (o)
if ((o = [self completed]))
[s appendFormat: @"<DateCompleted xmlns=\"Tasks:\">%@</DateCompleted>", [o activeSyncRepresentationInContext: context]];
// Start date
@@ -96,9 +98,28 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Reminder - FIXME
[s appendFormat: @"<ReminderSet xmlns=\"Tasks:\">%d</ReminderSet>", 0];
// Sensitivity - FIXME
[s appendFormat: @"<Sensitivity xmlns=\"Tasks:\">%d</Sensitivity>", 0];
// Sensitivity
if ([[self accessClass] isEqualToString: @"PRIVATE"])
v = 2;
else if ([[self accessClass] isEqualToString: @"CONFIDENTIAL"])
v = 3;
else
v = 0;
[s appendFormat: @"<Sensitivity xmlns=\"Tasks:\">%d</Sensitivity>", v];
categories = [self categories];
if ([categories count])
{
[s appendFormat: @"<Categories xmlns=\"Tasks:\">"];
for (i = 0; i < [categories count]; i++)
{
[s appendFormat: @"<Category xmlns=\"Tasks:\">%@</Category>", [[categories objectAtIndex: i] activeSyncRepresentationInContext: context]];
}
[s appendFormat: @"</Categories>"];
}
// Subject
o = [self summary];
if ([o length])
@@ -106,13 +127,23 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
if ((o = [self comment]))
{
// It is very important here to NOT set <Truncated>0</Truncated> in the response,
// otherwise it'll prevent WP8 phones from sync'ing. See #3028 for details.
o = [o activeSyncRepresentationInContext: context];
[s appendString: @"<Body xmlns=\"AirSyncBase:\">"];
[s appendFormat: @"<Type>%d</Type>", 1];
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", [o length]];
[s appendFormat: @"<Truncated>%d</Truncated>", 0];
[s appendFormat: @"<Data>%@</Data>", o];
[s appendString: @"</Body>"];
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
{
[s appendFormat: @"<Body xmlns=\"Tasks:\">%@</Body>", o];
[s appendString: @"<BodyTruncated xmlns=\"Tasks:\">0</BodyTruncated>"];
}
else
{
[s appendString: @"<Body xmlns=\"AirSyncBase:\">"];
[s appendFormat: @"<Type>%d</Type>", 1];
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", [o length]];
[s appendFormat: @"<Data>%@</Data>", o];
[s appendString: @"</Body>"];
}
}
return s;
@@ -125,8 +156,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
iCalTimeZone *tz;
id o;
NSInteger tzOffset;
userTimeZone = [[[context activeUser] userDefaults] timeZone];
tz = [iCalTimeZone timeZoneForName: [userTimeZone name]];
[(iCalCalendar *) parent addTimeZone: tz];
@@ -136,9 +165,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[self setSummary: o];
// FIXME: merge with iCalEvent
if ((o = [[theValues objectForKey: @"Body"] objectForKey: @"Data"]))
[self setComment: o];
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
{
if ((o = [theValues objectForKey: @"Body"]))
[self setComment: o];
}
else
{
if ((o = [[theValues objectForKey: @"Body"] objectForKey: @"Data"]))
[self setComment: o];
}
if ([[theValues objectForKey: @"Complete"] intValue] &&
((o = [theValues objectForKey: @"DateCompleted"])) )
@@ -147,27 +183,32 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
o = [o calendarDate];
completed = (iCalDateTime *) [self uniqueChildWithTag: @"completed"];
//tzOffset = [[o timeZone] secondsFromGMTForDate: o];
//o = [o dateByAddingYears: 0 months: 0 days: 0
// hours: 0 minutes: 0
// seconds: -tzOffset];
[completed setDate: o];
[self setStatus: @"COMPLETED"];
}
else
{
[self setStatus: @"IN-PROCESS"];
[self setCompleted: nil];
}
if ((o = [theValues objectForKey: @"DueDate"]))
{
iCalDateTime *due;
o = [o calendarDate];
due = (iCalDateTime *) [self uniqueChildWithTag: @"due"];
[due setTimeZone: tz];
tzOffset = [userTimeZone secondsFromGMTForDate: o];
o = [o dateByAddingYears: 0 months: 0 days: 0
hours: 0 minutes: 0
seconds: tzOffset];
[due setDateTime: o];
}
if ((o = [theValues objectForKey: @"StartDate"]))
{
iCalDateTime *due;
o = [o calendarDate];
due = (iCalDateTime *) [self uniqueChildWithTag: @"dtstart"];
[due setTimeZone: tz];
[due setDateTime: o];
}
@@ -182,6 +223,29 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[self setPriority: @"9"];
}
//
// 0- normal, 1- personal, 2- private and 3-confidential
//
if ((o = [theValues objectForKey: @"Sensitivity"]))
{
switch ([o intValue])
{
case 2:
[self setAccessClass: @"PRIVATE"];
break;
case 3:
[self setAccessClass: @"CONFIDENTIAL"];
break;
case 0:
case 1:
default:
[self setAccessClass: @"PUBLIC"];
}
}
// Categories
if ((o = [theValues objectForKey: @"Categories"]) && [o length])
[self setCategories: o];
if ((o = [theValues objectForKey: @"ReminderTime"]))
{
+7 -2
View File
@@ -28,8 +28,13 @@
ProxyPass /SOGo http://127.0.0.1:20000/SOGo interpolate
ProxyPass / http://127.0.0.1:20000/SOGo/dav/ interpolate
<Location />
Order allow,deny
Allow from all
<IfVersion < 2.4>
Order deny,allow
Allow from all
</IfVersion>
<IfVersion >= 2.4>
Require all granted
</IfVersion>
</Location>
<Proxy http://127.0.0.1:20000>
+21 -3
View File
@@ -5,8 +5,14 @@ Alias /SOGo/WebServerResources/ \
<Directory /usr/lib/GNUstep/SOGo/>
AllowOverride None
Order deny,allow
Allow from all
<IfVersion < 2.4>
Order deny,allow
Allow from all
</IfVersion>
<IfVersion >= 2.4>
Require all granted
</IfVersion>
# Explicitly allow caching of static content to avoid browser specific behavior.
# A resource's URL MUST change in order to have the client load the new version.
@@ -20,12 +26,23 @@ Alias /SOGo/WebServerResources/ \
## need to set the "SOGoTrustProxyAuthentication" SOGo user default to YES and
## adjust the "x-webobjects-remote-user" proxy header in the "Proxy" section
## below.
#
## For full proxy-side authentication:
#<Location /SOGo>
# AuthType XXX
# Require valid-user
# SetEnv proxy-nokeepalive 1
# Allow from all
#</Location>
#
## For proxy-side authentication only for CardDAV and GroupDAV from external
## clients:
#<Location /SOGo/dav>
# AuthType XXX
# Require valid-user
# SetEnv proxy-nokeepalive 1
# Allow from all
#</Location>
ProxyRequests Off
SetEnv proxy-nokeepalive 1
@@ -58,7 +75,8 @@ ProxyPass /SOGo http://127.0.0.1:20000/SOGo retry=0
## When using proxy-side autentication, you need to uncomment and
## adjust the following line:
# RequestHeader set "x-webobjects-remote-user" "%{REMOTE_USER}e"
RequestHeader unset "x-webobjects-remote-user"
# RequestHeader set "x-webobjects-remote-user" "%{REMOTE_USER}e" env=REMOTE_USER
RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0"
+9404
View File
File diff suppressed because it is too large. Load diff
+8
View File
@@ -0,0 +1,8 @@
all: $(patsubst %.asciidoc,%.pdf,$(wildcard *.asciidoc))
%.pdf : %.asciidoc
asciidoc -a docinfo1 -b docbook -d book -o $<.docbook $<
fop -c fonts/fop-config.xml -xsl docbook/xsl/sogo-fo.xsl -xml $<.docbook -pdf $@
clean:
rm *.asciidoc.docbook *.pdf
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,330 @@
Mobile Devices Configuration Guide
==================================
////
This file is part of the SOGo project.
See SOGo Mobile Devices Configuration-docinfo.xml for authors,
copyright and license information.
////
include::includes/global-attributes.asciidoc[]
About this Guide
----------------
This guide will walk you through the installation and configuration of
popular SyncML clients to be used with the SOGo solution.
This guide also include instructions for configuring Apple iPhone OS
devices (iPhone, iPod touch, and iPad).
The instructions are based on version {release_version} of SOGo.
The latest version of this guide is available at
http://www.sogo.nu/downloads/documentation.html.
Introduction
------------
SOGo is a free and modern scalable groupware server. It offers shared
calendars, address books, and emails through your favourite Web browser
and by using a native client such as Mozilla Thunderbird and Lightning.
SOGo is standard-compliant. It supports CalDAV, CardDAV, GroupDAV, iMIP
and iTIP and reuses existing IMAP, SMTP and database servers - making
the solution easy to deploy and interoperable with many applications.
SOGo features:
* Scalable architecture suitable for deployments from dozen to many
thousand users
* Rich Web-based interface that shares the look and feel, the features
and the data of Mozilla Thunderbird and Lightning
* Improved integration with Mozilla Thunderbird and Lighthing by using
the SOGo Connector and the SOGo Integrator
* Two-way synchronization support with any Microsoft ActiveSync-capable
device, or Outlook 2013
SOGo is developed by a community of developers located mainly in North
America and Europe. More information can be found on
http://www.sogo.nu/.
Installation
------------
This section will guide you through the installation of popular SyncML
clients on various devices.
Funambol SyncML Client
~~~~~~~~~~~~~~~~~~~~~~
The recommended SyncML client for BlackBerry, Apple iPhone (for
contacts), mobile devices based on Microsoft Windows Mobile Smartphone
or Windows Mobile PocketPC, is the one provided directly by Funambol,
which is free and open source.
For Microsoft Window Mobile, you must identify which kind of device you
have ("Smartphone" vs. "PocketPC").
Once you've identified what kind of device you have, download the
appropriate client from:
http://www.funambol.com/opensource/downloads.php
The version 8.5 GA or later is required. 
NextHaus SyncJe
~~~~~~~~~~~~~~~
For BlackBerry and Apple iPhone devices, you can also use the
SyncJe SyncML client from NextHaus (http://www.nexthaus.com/). This
client allows one to synchronize contacts, event and tasks with SOGo.
The version 2.43 or later is required. For BlackBerry 7XXX devices, the
required version is 2.25 but isn't officially supported. You can install
SyncJe on your BlackBerry device, over the air, by opening the following
link from your BlackBerry device:
http://www.nexthaus.com/bb/syncjebb.jad
This will download and install the application on your mobile device.
It's important to use the Web browser application and not the WAP
browser to perform this operation. Once installed, restart the device.
This procedure can also be used to update the SyncJe application. Note
that an update of SyncJe will not affect the state of previous
synchronizations. It's not necessary to perform a "slow sync" after an
update of SyncJe. 
Synthesis SyncML Client
~~~~~~~~~~~~~~~~~~~~~~~
The Synthesis (http://www.synthesis.ch/) company provides a SyncML
client for Palm OS-based devices.
"Over The Air" synchronization is possible, as well as synchronization
through a cradle. For the latter, you must install Softick PPP using the
Palm Desktop software. The version 3.01 or later is required and you can
download it from http://www.softick.com/ppp/. Once installed, the
desktop computer must be restarted.
Once completed, you must download the Synthesis client for Palm OS. The
version 3.0.2.9 or later is required. Either the standard or the
professional version can be used.
Once downloaded, uncompress the archive and install the `.prc` file on
your Palm OS-based device. After, you should see a "SyncML" icon on your
device.
Configuration
-------------
In this section, you'll learn how to configure the popular SyncML
clients in order to fully synchronize your mobile device with SOGo.
Instructions for Apple iPhone OS based devices are also included. Note
that those devices do not require a SyncML client for synchronizing
calendars.
Funambol SyncML Client
~~~~~~~~~~~~~~~~~~~~~~
Once the Funambol SyncML client is installed, start the application from
your mobile device to configure it using the following steps:
From the _Tools_ menu, choose _Options..._:
* Specify the _Location_. If your SOGo server is `sogo.domain.com`, the
location should be `http://sogo.domain.com/funambol/ds`.
* Specify your username and password
* Check the _Contacts_ check box and click on the _Details_ button.
The synchronization type is _two-way_ and the _Remote name_ is
`sogo-card`. The data format is vCard.
* Check the _Calendar_ check box and click on the _Details_ button. The
synchronization type is _two-way_ and the _Remote name_ is `sogo-cal`.
The data format is vCalendar.
* Check the _Tasks_ check box and click on the _Details_ button. The
synchronization type is _two-way_ and the _Remote name_ is
`sogo-todo`. The data format is SIF.
* Save the preferences.
To prevent the BlackBerry to automatically add a new event in the
calendar when an invitation is received by email (IMIP message) on the
BlackBerry device, you should delete the CICAL service from the Service
Book. To do so, proceed with the following steps:
From the _Options_ menu:
* Choose _Advanced Options_
* Choose _Service Book_
* Identify the line that mentions the email address of the BlackBerry
user followed by the `[CICAL]` string. For example, `user@domain.com
[CICAL]`.
* Delete this entry.
Once completed, you must restart the device by removing its battery for
a couple of seconds. If you ever want to reactivate the CICAL service,
follow those instructions:
http://support.appriver.com/KB/a205/how-to-resend-service-books-on-blackberry.aspx
Once complete, the client is ready for an initial synchronization.
Ideally, you should *delete* all data from the mobile device before the
initial synchronization. To do so:
* From the _Tools_ menu, choose _Recover..._
* Choose _Replace with data from server_
* Check the _Contacts_, _Calendar_ and _Tasks_ check boxes
Finally, click on the _Sync All_ button to proceed with the
synchronization.
NextHaus SyncJe
~~~~~~~~~~~~~~~
Once NextHaus SyncJe is installed, proceed with the following steps,
from your BlackBerry device, to configure it:
* Open the _SyncJe Client_
From the _Settings_ menu:
* Specify the _Server URL_. If your SOGo server is `sogo.domain.com`,
the URL should be `http://sogo.domain.com/funambol/ds`.
* Specify your user name and password
* Check the _Contacts_ check box and specify `sogo-card` as the
_Foldername_
* Check the _Calendar_ check box and specify `sogo-cal` as the
_Foldername_
* Check the _ToDo_ check box and specify `sogo-todo` as the _Foldername_
* Check the _Auto Sync_ check box if you wish to automatically
synchronize contacts, events and tasks at a predefined time interval
* Do *not* check the _Sync events between_ check box
* Check the _Skip saving attendees_ - this will prevent the BlackBerry
device from sending emails to meeting participants for events
downloaded from the SOGo server
* Check the _BIS_ check box (for _BlackBerry Internet Services_)
* Leave the other fields to the their default value
* Then choose _Save_ from the menu to save the preferences 
To prevent the BlackBerry to automatically add a new event in the
calendar when an invitation is received by email (IMIP message) on the
BlackBerry device, you should delete the CICAL service from the Service
Book. To do so, proceed with the following steps:
From the _Options_ menu:
* Choose _Advanced Options_
* Choose _Service Book_
* Identify the line that mentions the email address of the BlackBerry
user followed by the `[CICAL]` string. For example, `user@domain.com
[CICAL]`.
* Delete this entry
Once completed, you must restart the device by removing its battery for
a couple of seconds. If you ever want to reactivate the CICAL service,
follow those instructions:
http://support.appriver.com/KB/a205/how-to-resend-service-books-on-blackberry.aspx
Once done, you're now ready for your first synchronization.
Ideally, you must delete all data on the BlackBerry before proceeding
with the initial synchronization. To do so, proceed with the following
steps:
* Open the _SyncJe Client_
From the _Settings_ menu:
* Choose the _Clear databases_ option
* Respond _Yes_ to all questions. This will delete all contacts, events
and tasks from your BlackBerry device. 
* Go back in the previous menu
* Choose the _Force Slow Sync_ option
* Choose the _Start Sync_ option to start the synchronization. This
could take a few minutes if you have many contacts, events or tasks.
Subsequent synchronizations should be much faster. 
After the initial _Slow Sync_, you can simply chose the _Start Sync_
option if you do a manual synchronization to synchronize all changes. 
Synthesis SyncML Client
~~~~~~~~~~~~~~~~~~~~~~~
Once the Synthesis SyncML client is installed, proceed with the
following steps to configure it:
* Open the _Synthesis SyncML Standard Edition_ application
From the _Settings..._ menu:
* Specify the _Server URL_. If your SOGo server is `sogo.domain.com`,
the URL should be `http://sogo.domain.com/funambol/ds`.
* Specify your user name and password
* Check the _Contacts_, _Events_ and _Task_ check boxes
* Click on the _more..._ button
* For the _Contacts_, choose _reload device_ and specify `sogo-card` as
the _Server Path_.
* For the _Events_, choose _reload device_ and specify `sogo-cal` as
the _Server Path_. Do *not* check the _Only from..._ check box.
* For the _Tasks_, choose _reload device_ and specify `sogo-todo` as
the _Server Path_.
* Once completed, click on the _Done_ button
The _reload device_ value will *delete* all entries on the device during
the initial synchronization and obtain contacts, events and tasks from
the server. If you do not want to delete everything from the device,
please choose _normal_ instead of _reload device_.
Once ready, click on the _Start_ button to proceed with the initial
synchronization.
During the initial synchronization, the Palm device will ask you how to
connect to the desktop system. From the Palm device, choose _Windows
RAS_ without specifying an user name or a password. This will allow the
Palm device to establish a PPP connection between itself and Softick PPP
and then communicate using its TCP/IP stack to the Funambol server.
Apple iOS — Calendars
~~~~~~~~~~~~~~~~~~~~~
Starting from iOS 3, Apple has added CalDAV support to the calendar
application included in the iPhone/iPod/iPad.
To add a CalDAV account, follow those instructions:
* From the _Settings_ menu, choose _Mail, Contacts, Calendars_
* Choose _Add Account..._
* Choose _Other_
* Choose _Add CalDAV Account_
* Specify the _Server_, the URL should be
`http://sogo.domain.com/SOGo/dav/<username>`
On iOS 3.1.2 and later, you must also specify the range of events you
want to have. 
* From the _Settings_ menu, choose _Mail, Contacts, Calendars_
* From the _Sync_ menu, choose _All Events_
Note that other options (_Events 2 Weeks Back_, etc.) do not work right
now.
Apple iOS — Contacts
~~~~~~~~~~~~~~~~~~~~
If you want to synchronize contacts with your Apple mobile device, use
the native address book application with SOGo using the CardDAV
protocol. To configure the address book application so it works with
SOGo, create a new CardDAV account and specify your server name. In
the _Advanced Settings_, set the port to `8800`.
On iOS prior to version 4, you must install the Funambol client and
configure the `sogo-card` source.
include::includes/additional-info.asciidoc[]
include::includes/commercial-support.asciidoc[]
@@ -0,0 +1,358 @@
Mozilla Thunderbird Configuration Guide
=======================================
////
This file is part of the SOGo project.
See SOGo Mozilla Thunderbird Configuration Guide-docinfo.xml for
authors, copyright and license information.
////
include::includes/global-attributes.asciidoc[]
About this Guide
----------------
This guide will walk you through the installation and configuration of
Mozilla Thunderbird and its associated extensions so it can be used with
the SOGo solution.
The instructions are based on version {release_version} of SOGo.
The latest version of this guide is available
at http://www.sogo.nu/downloads/documentation.html.
Introduction
------------
SOGo is a free and modern scalable groupware server. It offers shared
calendars, address books, and emails through your favourite Web browser
and by using a native client such as Mozilla Thunderbird and Lightning.
SOGo is standard-compliant. It supports CalDAV, CardDAV, GroupDAV, iMIP
and iTIP and reuses existing IMAP, SMTP and database servers - making
the solution easy to deploy and interoperable with many applications.
SOGo features:
* Scalable architecture suitable for deployments from dozen to many
thousand users
* Rich Web-based interface that shares the look and feel, the features
and the data of Mozilla Thunderbird and Lightning
* Improved integration with Mozilla Thunderbird and Lightning by using
the SOGo Connector and the SOGo Integrator extensions
* Two-way synchronization support with any Microsoft ActiveSync-capable
device, or Outlook 2013
SOGo is developed by a community of developers located mainly in North
America and Europe. More information can be found on
http://www.sogo.nu/.
Installation
------------
This section will guide you through the installation of Thunderbird and
its associated extensions.
Mozilla Thunderbird
~~~~~~~~~~~~~~~~~~~
Mozilla Thunderbird is the official front end client of SOGo.
Mozilla Thunderbird version 2, 3.1, 10 ESR (Extended Support Release),
17 ESR, 24 and 31 are supported and it is recommended to use version 31 of
Thunderbird.
In order to download and install Mozilla Thunderbird, please visit:
https://www.mozilla.org/en-US/thunderbird/organizations/all-esr.html
Mozilla Lightning
~~~~~~~~~~~~~~~~~
When using version 24 or 31 of Thunderbird, you can use the latest version of
Mozilla Lightning. Use the Add-ons manager of Thunderbird or visit:
https://addons.mozilla.org/en-US/thunderbird/addon/lightning/
When using version 17 ESR of Thunderbird, you can use Mozilla Lightning
version 1.9.1. In order to download the extension, please visit:
https://addons.mozilla.org/en-US/thunderbird/addon/lightning/versions/1.9.1
For Thunderbird 2 and 3.1, you need the _Inverse Edition_of Mozilla
Lightning. It provides back ported features, bug fixes and security
fixes from the current development version of Mozilla Lightning. For
Thunderbird 2, it is based on release version 0.9 of Lightning. For
Thunderbird 3.1, it is based on 1.0b2.
In order to download and install Mozilla Lightning – Inverse Edition for
Thunderbird 2 or 3.1, please visit:
http://www.sogo.nu/downloads/frontends.html
SOGo Connector and SOGo Integrator
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The SOGo Connector and Integrator extensions are provided to perfect the
integration of Mozilla Thunderbird 2, 3.1, 10 ESR, 17 ESR, 24 and 31 with
the SOGo groupware solution.
First of all, the SOGo Connector extension transforms Thunderbird into a
full DAV client for groupware servers such as SOGo, eGroupware or
Citadel. It does this by adding support for remote DAV address books and
by adding features to be used along with the Lightning calendar
extension.
Among supported features of the SOGo Connector extension, we have:
* Free / Busy URL field in the address book
* Free / Busy functionality through HTTP
* Event organizers
* Synchronization of the address book using GroupDAV
* CardDAV implementation for the address book
* Support for WebDAV ACL
On the other hand, the SOGo Integrator extension transforms Thunderbird
into a pure "heavy" client for SOGo. Whereas the SOGo Connector is meant
for portability (horizontal integration), the SOGo Integrator makes use
of the features and layout only available from SOGo (vertical
integration).
Among the supported features of the SOGo Integrator extension, we have :
* Remote administration of folder subscriptions
* Remote administration of folder access control lists (ACL)
* Automatic replication of your local and subscribed folders
* When correctly configured, it handles the propagation of updates to
chosen extensions from a local update server
* Automatic propagation of default settings
In order to download and install the SOGo Connector and Integrator
extensions, please visit:
http://www.sogo.nu/downloads/frontends.html
Prior to installing the SOGo Integrator extension, you should read the
following chapter – _SOGo Integrator Customization_.
SOGo Integrator Customization
-----------------------------
In this section, you'll learn how to customize the SOGo Integrator
extension so it can be used alongside your SOGo server.
Customization
~~~~~~~~~~~~~
The customization steps described here involves understanding of XML and
of text file edition. If you do not have those skills, it is recommended
that you don't try to use this extension.
There are actually two steps in the configuration of a working
environment for SOGo Integrator. First of all, the Integrator will use
the same user name used to connect to the first email server configured
in Thunderbird. It is a current limitation but it will fit nearly all
configurations out there.
For testing purpose, you are strongly recommended to create and
configure an additional user profile for Thunderbird. This is for two
reasons. The first is because of the limitation mentioned above. The
second is because the Integrator will synchronize your personal address
book onto the SOGo server and then remove it so that only your personal
address book on SOGo will be available. If you are not able to do that,
you may want to make a copy of that address book beforehand.
The second part requires editing one file in the extension file sub tree
to specify where the SOGo server is located. This is done by hand. In an
enterprise environment, this step is only required once per release
since the updates are expected to propagate automatically. 
Uncompress (using a ZIP or jar tool) the SOGo Integrator XPI and locate
the following file:
extensions.rdf
This file is used for locating the extension update server and the SOGo
server, which we consider to be the same for the moment. There is a line
starting with a "Seq" tag and with an attribute named "isi:updateURL".
Replace the host part of that url with the SOGo server you want to
connect to.
For example, one would replace:
<Seq about="http://inverse.ca/sogo-integrator/extensions" isi:updateURL="http://sogo-demo.inverse.ca/plugins/updates.php?plugin=%ITEM_ID%&amp;version=%ITEM_VERSION%&amp;platform=%PLATFORM%">
by:
<Seq about="http://inverse.ca/sogo-integrator/extensions" isi:updateURL="https://sogo.acme.com/plugins/updates.php?plugin=%ITEM_ID%&amp;version=%ITEM_VERSION%&amp;platform=%PLATFORM%">
if the SOGo server is accessible from the following URL:
https://sogo.acme.com/SOGo
Note that if you changed the `x-webobjects-server-url` configuration
setting from your HTTP server configuration file for SOGo, the
value *must* match the one you specify in `isi:updateURL` – even the
port number.
Moreover, you *must* change the value of the
`sogo-integrator.autocomplete.server.urlid` preference from
`defaults/preferences/site.js` to match the identifier of your
_SOGoUserSources_. This source will be used by Thunderbird for
autocompletion.
Once you're done modifying the configuration file, save your changes and
reconstruct the XPI file. 
Now start Thunderbird and install your newly modified extension.
SOGo Update Server
------------------
In this section, you will learn how to install and configure the SOGo
Update Server.
The SOGo Update Server can be used to automatically install or uninstall
Mozilla Thunderbird extensions, push user settings and more – all from a
central place managed by system administrators.
Installation
~~~~~~~~~~~~
Installation is relatively straightforward. You need to make
the `updates.php` script available through your HTTP server at the URL
you've specified from the `extensions.rdf` file. The `updates.php`
script can be found in the SOGo sources, under the `Scripts` directory.
The `updateLink` section of the XML payload returned to sogo-integrator
is built dynamically using the `SCRIPT_URI` variable, which is only
available when running with mod_rewrite. It should work out of the box
as long as the script is placed in the same directory as the xpi files.
If it is not the case, then the link should be adjusted to fit the
actual file layout:
<em:updateLink><?php echo dirname(getenv('SCRIPT_URI')) . '/relative/path/to/' . $plugin["filename"] ?></em:updateLink>
An http request similar to the following can be used to make sure that
the generated link is correct:
http://sogo.host/path/to/updates.php?plugin=sogo-integrator@inverse.ca&version=0.00
Please refer to your HTTP server documentation for the installation and
configuration of PHP.
Configuration
~~~~~~~~~~~~~
To configure the SOGo update server, you need to modify the
`updates.php` script directly.
Adding an extension to be pushed automatically by the update server
require you to modify the `$plugins` array from updates.php and also
adjust accordingly SOGo Integrator's `extensions.rdf` file.
For example, to automatically install SOGo Connector, SOGo Integrator
and Lightning, you would have:
----
$plugins
= array( "sogo-connector@inverse.ca"
=> array( "application" => "thunderbird",
"version" => "31.0.0",
"filename" => "sogo-connector-31.0.0.xpi" ),
"sogo-integrator@inverse.ca"
=> array( "application" => "thunderbird",
"version" => "31.0.0",
"filename" => "sogo-integrator-31.0.0-sogo-demo.xpi" ),
"{e2fda1a4-762b-4020-b5ad-a41df1933103}"
=> array( "application" => "thunderbird",
"version" => "3.3.1",
"filename" => "lightning.xpi" ));
----
The syntax is:
----
"<extension ID>"
=> array( "application" => "thunderbird",
"version" => "<exact version found in the extension's install.rdf file>",
"filename" => "<exact filename on the filesystem>" )
----
The path of the filename, specified in the `filename` parameter, is
relative to the location of the `updates.php` script. For extensions
that are dependant on the architecture and operating system (Microsoft
Windows, Apple Mac OS X, etc.), they can be placed in subdirectories
relative again to the `updates.php` script (but the filename must be
identical in all subdirectories). For exemple, for Mozilla Lightning, we
could have:
----
Darwin_x86-gcc3/lightning.xpi
Linux_x86-gcc3/lightning.xpi
Linux_x86_64-gcc3/lightning.xpi
WINNT_x86-msvc/lightning.xpi
----
If you eventually want to disable an extension, that is, without
removing it from your users' computers, you can specify `disabled` as
the version number.
Next is to modify the `extensions.rdf` file. Again, to automatically
install SOGo Connector, SOGo Integrator and Lightning, you would have:
----
<li>
<Description
em:id="{e2fda1a4-762b-4020-b5ad-a41df1933103}"
em:name="Lightning"/>
</li>
<li>
<Description
em:id="sogo-integrator@inverse.ca"
em:name="SOGo Integrator"/>
</li>
<li>
<Description
em:id="sogo-connector@inverse.ca"
em:name="SOGo Connector"/>
</li>
----
Using SOGo Integrator, you can also push user-settings for any part of
Thunderbird or its extensions. There are two kind of user-settings
push:
* Settings that are pushed during the initial configuration of
Thunderbird
* Settings that are pushed upon every restart (ie., forced) of
Thunderbird
Settings that pushed are pushed during initial configuration are
controlled by the `./defaults/preferences/site.js` file from SOGo
Integrator. Here is an example:
----
pref("calendar.alarms.showmissed", false);
pref("calendar.caldav.sched.enabled", true);
----
Preferences that are forced upon every restart of Thunderbird are
controlled from the `./chrome/content/general/custom-preferences.js`
configuration file.
Here is an example:
----
force_int_pref("changequote.replyformat.format", 0);
force_bool_pref("changequote.headers.withcc", true);
force_char_pref(“foo.bar”, “zot”);
----
include::includes/additional-info.asciidoc[]
include::includes/commercial-support.asciidoc[]
@@ -0,0 +1,872 @@
Native Microsoft Outlook Configuration Guide
============================================
////
This file is part of the SOGo project.
See SOGo Native Microsoft Outlook Configuration-docinfo.xml for
authors, copyright and license information.
////
include::includes/global-attributes.asciidoc[]
About this Guide
----------------
This guide will walk you through the installation and configuration of
the native Microsoft Outlook compatibility layer SOGo offers.
Prior going over this guide, you should have a working SOGo
installation. Please refer to the _SOGo Installation and Configuration
Guide_ for more information on installing and configuring SOGo.
This guide also includes instructions for configuring Microsoft Outlook
with SOGo.
The instructions are based on version {release_version} of SOGo.
The latest version of this guide is available
at http://www.sogo.nu/downloads/documentation.html.
Introduction
------------
SOGo is a free and modern scalable groupware server. It offers shared
calendars, address books, and emails through your favourite Web browser
and by using a native client such as Mozilla Thunderbird and Lightning.
SOGo is standard-compliant. It supports CalDAV, CardDAV, GroupDAV, iMIP
and iTIP and reuses existing IMAP, SMTP and database servers — making
the solution easy to deploy and interoperable with many applications.
SOGo features:
* Scalable architecture suitable for deployments from dozen to many
thousand users
* Rich Web-based interface that shares the look and feel, the features
and the data of Mozilla Thunderbird and Lightning
* Improved integration with Mozilla Thunderbird and Lightning by using
the SOGo Connector and the SOGo Integrator
* Native compatibility for Microsoft Outlook 2003, 2007, 2010, and 2013
* Two-way synchronization support with any Microsoft ActiveSync-capable
device, and Outlook 2013
SOGo is developed by a community of developers located mainly in North
America and Europe. More information can be found
on http://www.sogo.nu/.
Architecture
------------
The following diagram demonstrates the architecture of the native
Outlook compatibility layer of SOGo.
image::images/openchange.png[]
With Samba 4 and OpenChange, Microsoft Outlook clients can communicate
natively with SOGo using the Microsoft Exchange protocol, without
requiring costly and hard-to-maintain third-party MAPI connectors for
Microsoft Outlook.
Requirements
------------
Organizations generally have solutions to authenticate users such as
LDAP servers or Microsoft Active Directory servers.
The solution being used will influence how users are provisioned in
Samba 4, a key component for native Outlook compatibility in SOGo.
LDAP Server
~~~~~~~~~~~
If your organization uses a LDAP server such OpenLDAP, Novell
eDirectory, Apache Directory or any other solution, you must use
Samba 4's internal directory server and synchronize the data between
both.
Synchronization scripts are not provided and unless you have clear-text
passwords of your existing users, they will have to be changed during
your initial synchronization so that your LDAP's server passwords are
identical to the ones from Samba 4.
Any modifications to your existing LDAP server (password change, user
addition or deletion, etc.) will have to be replicated to Samba 4's
internal directory server.
Note that if you install Samba 4 on a server that is already running a
LDAP service, you will have to change to TCP port on which your LDAP
server listens to. Samba 4 will use the TCP port 389 and it can't be
changed.
For example, with OpenLDAP, you can use the `-h` parameter for `slapd`
to make it listen on an other TCP port.
Microsoft Active Directory
~~~~~~~~~~~~~~~~~~~~~~~~~~
If your organization uses Microsoft Active Directory, Samba 4 will need
to be joined to your Active Directory domain, as a DC.
Samba 4 will be able to reuse all the information contained in Microsoft
Active Directory and no synchronization process needs to be put in place
as information will get replicated to Samba 4 automatically.
For more information on joining Samba 4 to an existing Microsoft Active
Directory domain, please refer to the Samba 4 documentation available at
the following URL:
http://wiki.samba.org/index.php/Samba4
More specifically, have a look at the `samba-tool domain join` command.
Note that joining Samba 4 to your Active Directory domain as a member
will currently not work. An authentication bug is present in Samba 4
which then prevents all Outlook users to successfully authenticate
through Samba 4. This issue has been reported to the Samba team and is
being worked on.
Other or No Solution
~~~~~~~~~~~~~~~~~~~~
If your organization neither uses a LDAP server or Microsoft Active
Directory, you can start using Samba 4 as your directory server.
Samba 4's directory can be queried over LDAP just like Microsoft Active
Directory and can also serve as a domain controller for Windows-based
environments.
For example, SOGo can very well use Samba 4's built-in directory server
to authenticate users. A SOGoUserSources entry to achieve this wold look
like this:
----
su – sogo
defaults write sogod SOGoUserSources '(
{
CNFieldName = displayName;
IDFieldName = cn;
UIDFieldName = sAMAccountName;
baseDN = "cn=Users,dc=example,dc=com";
bindDN = "cn=Administrator,cn=Users,dc=example,dc=com";
bindFields = (
sAMAccountName
);
bindPassword = "%1OpenChange";
canAuthenticate = YES;
displayName = "Shared Addresses";
hostname = "127.0.0.1";
id = samba;
isAddressBook = YES;
port = 389;
}
)'
----
Please refer to the _SOGo Installation and Configuration Guide_ for more
information regarding `SOGoUserSources`.
IMAP Server and Trust
~~~~~~~~~~~~~~~~~~~~~
An IMAP server supporting the ACL, UIDPLUS and QRESYNC IMAP extensions
is required, such as Cyrus IMAP version 2.4 or later, or Dovecot version
2.1 or later. If your current IMAP server does not support these
extensions, you can use Dovecot's proxying capabilities. The follow
configuration example makes Dovecot proxy all IMAP request to an
existing server:
----
auth_mechanisms = plain login
imapc_host = inverse.ca
imapc_port = 993
imapc_ssl = imaps
imapc_ssl_verify = no
mail_gid = imapproxy
mail_home = /home/imapproxy/%u
mail_location = imapc:~/imapc
mail_uid = imapproxy
passdb {
args = host=inverse.ca ssl=imaps port=993 ssl_ca_dir=/etc/pki/tls/certs
default_fields = userdb_imapc_user=%u userdb_imapc_password=%w
driver = imap
}
protocols = imap
ssl = no
userdb {
driver = prefetch
}
----
SOGo would then be configured to use Dovecot's proxy as the IMAP server.
Moreover, the authentication mode in use by Windows with Samba and
Exchange servers prevent the backend from knowing the real password
being used by the user. This implies that the IMAP server must accept
any passwords from the host on which Samba is running.
To accomplish this with Cyrus IMAP Server, set `sasl_pwcheck_method`
to `alwaystrue` in `/etc/imapd.conf`. You should restrain this to
an `imapd` instance dedicated to SOGo.
For Dovecot, use an authentication source similar to:
----
passdb {
driver = static
args = nopassword=y allow_nets=127.0.0.1/32
}
----
You should also make sure that you restrain this only to the SOGo
processes.
For any other IMAP server, refer to the product's documentation. If such
capability is not offered, you can alternatively define the cleartext
password for each user. Please refer to the _Adding Users_ section from
this document.
Installation
------------
This section will guide you through the installation of the native
Microsoft Outlook compatibility layer SOGo offers.
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.html.
In order to satisfy certain dependencies, you should also add the EPEL
source corresponding to your distribution and architecture. More
information on this is available here:
http://fedoraproject.org/wiki/EPEL – or more specifically,
http://fedoraproject.org/wiki/EPEL/FAQ#How_can_I_install_the_packages_from_the_EPEL_software_repository.3F.
Once ready, install the OpenChange packages on top of an existing SOGo
installation:
----
yum clean all && yum makecache
yum install samba \
openchange \
sogo-openchange-backend \
openchange-ocsmanager \
openchange-rpcproxy \
mysql-server \
MySQL-python
----
Once the packages are installed, refer to the _Configuration_ chapter
from this guide.
[NOTE]
Samba4/OpenChange are not available for now on CentOS 5 i386/x86_64,
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)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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.
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
Then install Samba 4 on top of an existing SOGo
installation:
----
apt-get update
apt-get install samba samba-dev
----
Once completed, install the packages related to OpenChange and the SOGo
provider:
----
apt-get install openchangeserver \
sogo-openchange \
openchangeproxy \
python-ocsmanager \
mysql-server \
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]
On Ubuntu 12.04, the Samba init scripts need to be modified to
disable the upstart check. For more details, refer to:
https://wiki.samba.org/index.php/Samba4/InitScript
Debian 8 (Jessie) and Ubuntu 14.04 (Trusty Tahr)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Please follow the instructions from
http://www.sogo.nu/english/downloads/backend.html to setup your
apt sources.
Then install Samba 4 on top of an existing SOGo
installation:
----
apt-get update
apt-get install samba samba-dev
----
Once completed, install the packages related to OpenChange and the SOGo
provider:
----
apt-get install openchangeserver \
sogo-openchange \
openchangeproxy \
python-ocsmanager \
mysql-server \
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
-------------
In this section, you'll learn how to configure the native Microsoft
Outlook compatibility layer that SOGo offers.
SOGo Configuration
~~~~~~~~~~~~~~~~~~
First thing to do is to configure SOGo to use your current services,
which are your IMAP, SMTP and SQL database servers. The configuration
instructions for this are available in the SOGo Installation and
Configuration Guide available from http://www.sogo.nu/.
Please refer to that documentation before continuing with the
instructions included in this guide.
Samba 4 Configuration
~~~~~~~~~~~~~~~~~~~~~
Run the following commands as root: 
----
samba-tool domain provision --realm=example.com \
--domain=OPENCHANGE \
--adminpass='%1OpenChange' \
--server-role='domain controller'
samba-tool user setexpiry administrator --noexpiry
----
You might consider changing the realm and domain used, to suit your
enviroment.
You might also have to
remove `/etc/samba/smb.conf` prior running this command.
Add the following parameters to the `[global]` section of the
`/etc/samba/smb.conf` configuration file:
----
### 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
### Configuration required by OpenChange server ###
----
Your Samba 4 configuration file should look like this:
----
# Global parameters
[global]
server role = active directory domain controller
workgroup = EXAMPLE
realm = example.com
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
### Configuration required by OpenChange server ###
[netlogon]
path = /var/lib/samba/sysvol/example.com/scripts
read only = No
[sysvol]
path = /var/lib/samba/sysvol
read only = No
----
OpenChange Configuration
~~~~~~~~~~~~~~~~~~~~~~~~
OpenChange 2.2 stores its metadata in MySQL so you need to have it installed.
First, create the OpenChange MySQL user:
----
$ mysql -u root -p
mysql> CREATE USER 'openchange-user'@'localhost' IDENTIFIED BY 'openchange$123';
mysql> GRANT ALL PRIVILEGES ON `openchange`.* TO 'openchange-user'@'localhost' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
----
The Samba AD schema needs to be filled with additional object
definitions by running the following commands: 
----
openchange_provision --standalone
NOTE: This operation can take several minutes
[+] Step 1: Register Exchange OIDs
[+] Step 2: Add Exchange attributes to Samba schema
[+] Step 3: Add Exchange auxiliary classes to Samba schema
[+] Step 4: Add Exchange objectCategory to Samba schema
[+] Step 5: Add Exchange containers to Samba schema
[+] Step 6: Add Exchange *sub* containers to Samba schema
[+] Step 7: Add Exchange CfgProtocol subcontainers to Samba schema
[+] Step 8: Add Exchange mailGateway subcontainers to Samba schema
[+] Step 9: Add Exchange classes to Samba schema
[+] Step 10: Add possSuperior attributes to Exchange classes
[+] Step 11: Extend existing Samba classes and attributes
[+] Step 12: Generic Exchange configuration objects
[+] Step 13: Finalize generic Exchange configuration objects
[SUCCESS] Done!
[+] Step 1: Exchange Samba registration
[SUCCESS] Done!
[+] Step 1: Register Exchange Samba as the main server
[SUCCESS] Done!
----
Create the OpenChange database: 
----
openchange_provision --openchangedb --openchangedb-uri 'mysql://openchange-user:openchange$123@localhost/openchange'
Setting up openchange db
[+] Public Folders
===================
* Public Folder Root : 0x0100000000000001 (72057594037927937)
* IPM_SUBTREE : 0x0200000000000001 (144115188075855873)
* NON_IPM_SUBTREE : 0x0300000000000001 (216172782113783809)
* EFORMS REGISTRY : 0x0400000000000001 (288230376151711745)
* OFFLINE ADDRESS BOOK : 0x0500000000000001 (360287970189639681)
* /o=First Organization/cn=addrlists/cn=oabs/cn=Default Offline Address Book: 0x0600000000000001 (432345564227567617)
* SCHEDULE+ FREE BUSY : 0x0700000000000001 (504403158265495553)
* EX:/o=first organization/ou=first administrative group: 0x0800000000000001 (576460752303423489)
* Events Root : 0x0900000000000001 (648518346341351425)
----
Finally, modify `/etc/samba/smb.conf` to specify OpenChange connection information
for its indexing database. Add the following at the end of the `[global]` section:
----
mapistore:namedproperties = mysql
namedproperties:mysql_user = openchange-user
namedproperties:mysql_pass = openchange$123
namedproperties:mysql_host = localhost
namedproperties:mysql_db = openchange
mapistore:indexing_backend = mysql://openchange-user:openchange$123@localhost/openchange
mapiproxy:openchangedb = mysql://openchange-user:openchange$123@localhost/openchange
----
On RHEL, make sure SELinux is disabled:
setenforce 0
Next, you can start Samba using the usual command:
/etc/init.d/samba start
On upstart-based distributions, use:
start samba-ad-dc
You can also launch the OpenChange web services:
/etc/init.d/openchange-ocsmanager start
Apache Configuration for Web Services
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The OpenChange web services consist of two components:
1. *OCS Manager* which is used for autodiscovery and freebusy lookups on
Outlook 2007 and 2010. This service runs in its own application server
which listens on `127.0.0.1:5000` by default. Apache needs to be
configured to forward certain requests to it to make it accessible from
the outside.
Note that this service *MUST* be accessible over*HTTPS*, otherwise Outlook
won't use it.
2. *RPC Proxy* which is used for RPC over HTTP ("Outlook Anywhere").
This service runs as a WSGI application under apache (mod_wsgi).
While HTTPS is not required to access this service, it is strongly
recommended.
On RHEL-based distributions, the apache configuration required by these
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/` 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
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`.
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
which the HTTP body hasn't arrived in 10 seconds.
While this is arguably good practice with regular HTTP, it will disrupt
the RPC over HTTP protocol implemented by RPC Proxy: Outlook will
continuously disconnect and reconnect leading to suboptimal performance.
To avoid this problem, use a much higher timeout or disable the module:
a2dismod reqtimeout
You should now restart the Apache service and make sure it will start on
boot. On RHEL-based distributions, do:
chkconfig httpd on && /etc/init.d/httpd restart
On Debian-based distributions, do:
update-rc.d apache2 defaults && /etc/init.d/apache2 restart
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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The autodiscovery service must be made accessible in order to advertise
the web services provided by OpenChange. This can be done in two ways.
1. The first is to associate the FQDN `autodiscover.example.com.` with
the machine that hosts Samba 4 / OpenChange, by adding a `CNAME` entry
in your DNS configuration. Note that, instead or changing your DNS
server configuration, you can simply add a similar entry to the _hosts_
file of the Windows machine from where you'll run Outlook, which is
handy for testing purposes.
2. The second option is to add a `SRV` entry to your DNS configuration
where the `_service` value would be `Autodiscover` and the `_protocol`
would be `_tcp`.
For example:
_autodiscover._tcp.example.com. IN SRV 0 0 443 sogo.example.com.
Again, the autodiscovery service must be accessible over HTTPS.
Adding Users
------------
Users that wish to connect natively to SOGo must be provisioned in
Samba 4 and in OpenChange – even if they already exist in your current
LDAP or Microsoft Active Directory server.
To add a user, execute the following commands: 
----
# add user to samba
samba-tool domain passwordsettings set --complexity=off
samba-tool domain passwordsettings set --min-pwd-length=1
samba-tool user add <username>
samba-tool user setexpiry <username> --noexpiry
# create user in openchange
openchange_newuser --create <username>
----
If you don't have a trust between your IMAP server and SOGo, you must at
this point set the cleartext password of the newly created user in
`/var/lib/samba/private/mapistore/<username/password`.
This per-user file contains the cleartext password of the user as a
UTF-8 string, on a single line. This password will be used to
authenticate SOGo/OpenChange storage provider to your IMAP server.
Microsoft Outlook Configuration
-------------------------------
To connect Microsoft Outlook, you can either use the IP address of the
server or its DNS name. If you prefer using the DNS name, add an entry
like the following to the `c:\windows\system32\drivers\etc\hosts` file
in order to associate the IP address with the right DNS names:
192.168.1.1 sogo.example.com autodiscover.example.com
Next, you must configure Microsoft Outlook.
* Open the Control Panel => Mail => Email Accounts.
* Select _Add a new e-mail account_
* Choose _Microsoft Exchange Server_
* Fill the required information. Enter the DNS name or the IP address of
your SOGo server in the _Microsoft Exchange Server_ field
* Leave the _Use Cached Exchange Mode_ checkbox enabled
* Enter your username in the _User Name_ field
* Click on _More Settings_ and ignore the warning, if any, about
Exchange being offline by clicking on Cancel
* From the Security tab, enable Always prompt for user name and password
* From the _Connection_ tab, enable _"Outlook Anywhere"_ if you plan to
use Outlook outside of your LAN. Moreover, click on the _Exchange Proxy
Settings..._ button to enable it for slow and fast networks. Specify
also the host, which should be the same value you specified in the
Microsoft Exchange Server field.
* Finally, click on Check Name and confirm your username and password
Start Microsoft Outlook and enter your username and password. It will
start to synchronize your mailbox. This could take a long time if you
have many emails, events, tasks and contacts. Once this step is
completed, check the autodiscovery service with Outlook 2007 or 2010 by
simultaneously holding the CTRL key on your keyboard and right-clicking
on the Outlook icon in the notification toolbar. A special entry named
"Test E-mail AutoConfiguration..." will appear and will enable you to
check the service.
Known Issues or Limitations
---------------------------
* Make sure you periodically backup all your data regarding SOGo.
* Make sure you have no firewalls activated between your Microsoft
Outlook clients and the SOGo server with Native Outlook Compatibility
module. If you do, use "Outlook Anywhere" to connect Outlook to
SOGo/OpenChange.
Current Limitations
~~~~~~~~~~~~~~~~~~~
The current version of the Native Microsoft Outlook compatibility layer
has some limitations.
Those limitations will be overcome in the upcoming releases. If you are
interested in having those limitations fixed more rapidly, please
contact Inverse by sending an email to support@inverse.ca.
General
^^^^^^^
* If you can't see any email's content with Microsoft Outlook 2007,
install the latest Service Pack available from Microsoft's website for
this specific version. Microsoft Outlook 2007 (12.0.6423.100) SP2 MSO
(12.0.6425.1000) is known to work.
* When you create a new Microsoft Outlook profile, not all folders might
be synchronized during the first start. Simply select the appropriate
folder and click "Send and Receive". Synchronizing a folder may take
some time. For example, a folder with 1000 email messages might take
around 5 minutes based on the underlying hardware.
* Errors when synchronizing the "Offline Address Book" are normal and
can be ignored for now. This feature is currently not supported.
* If you face strange issues from Microsoft Outlook, you might want to
remove any data associated with the user from the SOGo server and
recreate a Microsoft Outlook profile.
To remove any data associated to a user, use
the `openchange_user_cleanup` script distributed with SOGo. The script
can be found in `/usr/share/doc/sogo/` (`/usr/share/sogo-VERSION/` on
RHEL).
To reset a user, run the script as root:
`python openchange_user_cleanup username`. See the usage output for additional options.
* The "Out of Office Assistant" will not currently work. This feature
has not been implemented.
* Creating folders below INBOX (when not normally permitted by the IMAP
server), below the Personal Calendar or Personal Address Book will work
in Outlook cached mode but the server-side operation will fail and these
folders will never be created. Potentially data loss can occur if the
Outlook profile is destroyed. If you wan to create additional top-level
mail folders, calendars or address books, open Outlook's folder list,
select the top level node (usually, "email@example.com") and choose "New
Folder..." from the contextual menu. Choose the relevant item types.
Mail
^^^^
* Sharing mail folders is not supported.
* To avoid possibly lossy conversion from RTF to HTML, Outlook should be
configured to send all mails as HTML (or plaintext) instead of _Outlook
Rich Text Format_.
Calendar
^^^^^^^^
* Labels will not work.
* It might be impossible to view event details from a shared calendar.
This issue is being worked on.
Tasks
^^^^^
* Tasks with start/due dates created from Outlook might not appear
correctly in SOGo due to a timezone issue.
* Reminders are not yet supported.
* Assigning tasks will not work.
Contacts
^^^^^^^^
* Categories will not work.
* Distribution lists will not work.
* Under Microsoft Outlook 2010, the special folder "Suggested Contacts"
will not work.
* The "Offline Address Book" will not work. This feature is not yet
supported.
Notes
^^^^^
* Notes are not synchronized in any ways with SOGo. The current version
of SOGo lacks support for notes.
If you notice anything else, please send contact Inverse by sending an
email to support@inverse.ca.
include::includes/additional-info.asciidoc[]
include::includes/commercial-support.asciidoc[]
Binary file not shown.

Before

Width:  |  Height:  |  Size: 401 KiB

+16
View File
@@ -0,0 +1,16 @@
#
# fop fix to build our documentation on CentOS 6
#
# Inverse inc. <info@inverse.ca>
#
--- /usr/bin/fop.orig 2012-01-17 21:25:50.000000000 -0500
+++ /usr/bin/fop 2012-01-17 21:26:04.000000000 -0500
@@ -26,7 +26,7 @@
# Set parameters
set_jvm
set_classpath commons-io batik-all avalon-framework xmlgraphics-commons \
- commons-logging fop
+ commons-logging fop xalan-j2
set_flags $BASE_FLAGS
set_options $BASE_OPTIONS
@@ -0,0 +1,17 @@
#
# xmlgraphics-fop fix to build our documentation on CentOS 5
# taken from https://build.opensuse.org/request/show/68994
#
# Inverse inc. <info@inverse.ca>
#
--- /usr/bin/xmlgraphics-fop.orig 2012-01-17 18:42:08.000000000 -0500
+++ /usr/bin/xmlgraphics-fop 2012-01-17 18:42:18.000000000 -0500
@@ -24,7 +24,7 @@
# Rest of the configuration
MAIN_CLASS=org.apache.fop.cli.Main
-BASE_JARS="xmlgraphics-fop xmlgraphics-batik/util xml-commons-jaxp-1.3-apis excalibur/avalon-framework-api xerces-j2 xalan-j2 xalan-j2-serializer"
+BASE_JARS="xmlgraphics-fop batik-all xml-commons-jaxp-1.3-apis excalibur/avalon-framework-impl excalibur/avalon-framework-api xerces-j2 xalan-j2 xalan-j2-serializer"
# Set parameters
set_jvm
@@ -0,0 +1,107 @@
<?xml version='1.0'?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
version="1.0">
<!-- ********************************************************************
Header / Footer customizations
This file is part of the SOGo project.
Authors:
- Inverse inc. <info@inverse.ca>
Copyright (C) 2011-2014 Inverse inc.
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
******************************************************************** -->
<!--
Here we are re-defining docbook-xsl/fo/pagesetup.xsl to fit our needs.
- top: chapter number on the left
- bottom: copyright, chapter name, page
-->
<xsl:param name="header.rule" select="0"/>
<xsl:template name="header.content">
<xsl:param name="pageclass" select="''"/>
<xsl:param name="sequence" select="''"/>
<xsl:param name="position" select="''"/>
<xsl:param name="gentext-key" select="''"/>
<fo:block>
<!-- sequence can be odd, even, first, blank -->
<!-- position can be left, center, right -->
<xsl:choose>
<xsl:when test="$sequence = 'blank'">
<!-- nothing -->
</xsl:when>
<xsl:when test="($sequence='first' or $sequence='odd' or $sequence='even') and $position='left'">
<xsl:if test="$pageclass != 'titlepage' and $pageclass != 'lot'">
<xsl:call-template name="gentext">
<xsl:with-param name="key" select="'chapter'"/>
</xsl:call-template>
<xsl:call-template name="gentext.space"/>
<xsl:number count="chapter" from="book" level="any"/>
</xsl:if>
</xsl:when>
<!-- draft -->
<xsl:when test="$position='right'">
<xsl:call-template name="draft.text"/>
</xsl:when>
<xsl:otherwise>
<!-- nop -->
</xsl:otherwise>
</xsl:choose>
</fo:block>
</xsl:template>
<xsl:param name="footer.rule" select="0"/>
<xsl:template name="footer.content">
<xsl:param name="pageclass" select="''"/>
<xsl:param name="sequence" select="''"/>
<xsl:param name="position" select="''"/>
<xsl:param name="gentext-key" select="''"/>
<fo:block>
<!-- pageclass can be front, body, back -->
<!-- sequence can be odd, even, first, blank -->
<!-- position can be left, center, right -->
<xsl:choose>
<xsl:when test="$pageclass = 'titlepage'">
<!-- nop; no footer on title pages -->
</xsl:when>
<xsl:when test="$double.sided = 0 and $position='left'">
<xsl:apply-templates select="//copyright[1]" mode="titlepage.mode"/>
</xsl:when>
<xsl:when test="($sequence='first' or $sequence='odd' or $sequence='even') and $position='center'">
<xsl:if test="$pageclass != 'titlepage' and $pageclass != 'lot'">
<xsl:apply-templates select="." mode="titleabbrev.markup"/>
</xsl:if>
</xsl:when>
<xsl:when test="$double.sided = 0 and $position='right'">
<fo:page-number/>
</xsl:when>
<xsl:when test="$sequence='blank'">
<!-- nop -->
</xsl:when>
<xsl:otherwise>
<!-- nop -->
</xsl:otherwise>
</xsl:choose>
</fo:block>
</xsl:template>
</xsl:stylesheet>
<!-- vim: set shiftwidth=2 tabstop=2 expandtab: -->
+182
View File
@@ -0,0 +1,182 @@
<?xml version='1.0'?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
version="1.0">
<!-- ********************************************************************
SOGo Documentation Docbook FO Parameters
This file is part of the SOGo project.
Authors:
- Inverse inc. <info@inverse.ca>
Copyright (C) 2011-2014 Inverse inc.
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
******************************************************************** -->
<!--
Global Tasks
TODO prettier revhistory
TODO prettier Table of Contents
TODO generate PDF table of contents (like OSX's Preview shows on the right hand side)
TODO title 2
- align with text?
- more above whitespace
TODO change the bullet for a prettier one
TODO title 3 and 4
- align with text?
- should be easier to differentiate (check network guide)
TODO icon on line wrap in monospace boxes
TODO caution, notes, warnings, etc.
- box around it
- sexy icon
TODO -> is converted into an arrow but it's not pretty (is it font or docbook-thingy?)
-->
<!--
Load default values
Real upstream schema is at:
<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/>
but we decided to load all sensible local xsd since it only produce a warning on missing imports.
-->
<!-- CentOS / RHEL -->
<xsl:import href="/usr/share/sgml/docbook/xsl-stylesheets/fo/docbook.xsl"/>
<!-- Debian / Ubuntu -->
<xsl:import href="/usr/share/xml/docbook/stylesheet/docbook-xsl/fo/docbook.xsl"/>
<!-- OSX through mac ports -->
<xsl:import href="/opt/local/share/xsl/docbook-xsl/fo/docbook.xsl"/>
<!-- title page extra styling -->
<xsl:import href="titlepage-fo.xsl"/>
<!-- header / footer extra styling -->
<xsl:import href="headerfooter-fo.xsl"/>
<!-- attaching an image to the verso legalnotice component -->
<xsl:template match="legalnotice" mode="book.titlepage.verso.mode">
<xsl:apply-templates mode="titlepage.mode"/>
<fo:block text-align="right">
<fo:external-graphic src="url('images/inverse-logo.jpg')" width="3in" content-width="scale-to-fit"/>
</fo:block>
</xsl:template>
<!-- stylesheet options -->
<xsl:param name="title.font.family">Lato-Medium</xsl:param>
<xsl:param name="chapter.autolabel" select="0"/>
<xsl:attribute-set name="component.title.properties">
<xsl:attribute name="padding-bottom">2.5em</xsl:attribute>
<xsl:attribute name="border-bottom">solid 2px</xsl:attribute>
<xsl:attribute name="margin-bottom">1em</xsl:attribute>
</xsl:attribute-set>
<xsl:attribute-set name="section.title.level1.properties">
<xsl:attribute name="border-bottom">solid 1px</xsl:attribute>
<xsl:attribute name="margin-top">2em</xsl:attribute>
<xsl:attribute name="margin-bottom">1em</xsl:attribute>
</xsl:attribute-set>
<!-- titles spacing -->
<xsl:attribute-set name="section.title.level2.properties">
<xsl:attribute name="margin-top">1em</xsl:attribute>
</xsl:attribute-set>
<!-- default fonts -->
<xsl:param name="body.font.family">Lato-Light</xsl:param>
<xsl:param name="body.font.master">10</xsl:param>
<xsl:param name="monospace.font.family">Incosolata</xsl:param>
<!-- revision table layout -->
<xsl:attribute-set name="revhistory.title.properties">
<xsl:attribute name="font-size">12pt</xsl:attribute>
<xsl:attribute name="font-weight">bold</xsl:attribute>
<xsl:attribute name="text-align">center</xsl:attribute>
</xsl:attribute-set>
<xsl:attribute-set name="revhistory.table.properties">
<xsl:attribute name="break-before">page</xsl:attribute>
</xsl:attribute-set>
<xsl:attribute-set name="revhistory.table.cell.properties">
<xsl:attribute name="border-bottom">1px solid</xsl:attribute>
</xsl:attribute-set>
<!-- Table Of Contents (TOC) options -->
<!-- We only want 2 level of ToC depth -->
<xsl:param name="toc.section.depth" select="1"/>
<!-- titles left margin -->
<xsl:attribute-set name="section.title.properties">
<xsl:attribute name="start-indent"><xsl:value-of select="$body.start.indent"/></xsl:attribute>
</xsl:attribute-set>
<!-- lists type -->
<xsl:template name="itemizedlist.label.markup">
<xsl:param name="itemsymbol" select="'square'"/>
<xsl:choose>
<xsl:when test="$itemsymbol='square'"><fo:inline font-family="Lato-Light">&#x25aa;</fo:inline></xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="next.itemsymbol">
<xsl:param name="itemsymbol" select="'default'"/>
<xsl:choose>
<xsl:otherwise>square</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- admonition -->
<xsl:param name="admon.graphics" select="1"></xsl:param>
<xsl:param name="admon.graphics.path">images/</xsl:param>
<xsl:param name="admon.graphics.extension">.png</xsl:param>
<xsl:attribute-set name="graphical.admonition.properties">
<xsl:attribute name="border-top">1px solid</xsl:attribute>
<xsl:attribute name="border-bottom">1px solid</xsl:attribute>
<xsl:attribute name="padding-top">0.5em</xsl:attribute>
<xsl:attribute name="padding-bottom">0.5em</xsl:attribute>
<xsl:attribute name="margin-left">2em</xsl:attribute>
</xsl:attribute-set>
<!-- grey boxes around code (screen, programlisting) -->
<xsl:param name="shade.verbatim" select="1"/>
<xsl:attribute-set name="shade.verbatim.style">
<xsl:attribute name="background-color">#E0E0E0</xsl:attribute>
<xsl:attribute name="border">thin #9F9F9F solid</xsl:attribute>
<xsl:attribute name="margin">0pt</xsl:attribute>
<xsl:attribute name="padding">0.5em</xsl:attribute>
<!-- prevent page breaks in screen and programlisting tags -->
<xsl:attribute name="keep-together.within-column">always</xsl:attribute>
</xsl:attribute-set>
<!-- breaking long lines in code (screen, programlisting) -->
<xsl:attribute-set name="monospace.verbatim.properties">
<xsl:attribute name="wrap-option">wrap</xsl:attribute>
</xsl:attribute-set>
<!-- don't show raw links in [ .. ] after a link -->
<xsl:param name="ulink.show" select="0"/>
<!-- blue underlined hyperlink -->
<xsl:attribute-set name="xref.properties">
<xsl:attribute name="color">blue</xsl:attribute>
<xsl:attribute name="text-decoration">underline</xsl:attribute>
</xsl:attribute-set>
<!-- strong emphasis in bold -->
<xsl:template match="emphasis[@role='strong']">
<fo:inline font-family="Lato" font-weight="normal">
<xsl:apply-templates/>
</fo:inline>
</xsl:template>
<!-- copyright in range instead of seperated years -->
<xsl:param name="make.year.ranges" select="1" />
<!-- variablelist behavior (asciidoc's term:: lists) -->
<!-- <xsl:param name="variablelist.term.break.after" select="1" /> -->
</xsl:stylesheet>
<!-- vim: set shiftwidth=2 tabstop=2 expandtab: -->
@@ -0,0 +1,96 @@
<!DOCTYPE t:templates [
<!ENTITY hsize0 "10pt">
<!ENTITY hsize1 "12pt">
<!ENTITY hsize2 "14.4pt">
<!ENTITY hsize3 "17.28pt">
<!ENTITY hsize4 "20.736pt">
<!ENTITY hsize5 "24.8832pt">
<!ENTITY hsize0space "7.5pt"> <!-- 0.75 * hsize0 -->
<!ENTITY hsize1space "9pt"> <!-- 0.75 * hsize1 -->
<!ENTITY hsize2space "10.8pt"> <!-- 0.75 * hsize2 -->
<!ENTITY hsize3space "12.96pt"> <!-- 0.75 * hsize3 -->
<!ENTITY hsize4space "15.552pt"> <!-- 0.75 * hsize4 -->
<!ENTITY hsize5space "18.6624pt"> <!-- 0.75 * hsize5 -->
]>
<t:templates xmlns:t="http://nwalsh.com/docbook/xsl/template/1.0"
xmlns:param="http://nwalsh.com/docbook/xsl/template/1.0/param"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- ********************************************************************
SOGo title page
This file is part of the SOGo project.
Authors:
- Inverse inc. <info@inverse.ca>
Copyright (C) 2011-2014 Inverse inc.
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
******************************************************************** -->
<!--
If you make changes you need to rebuild XSL:
xsltproc -o docs/docbook/xsl/titlepage-fo.xsl \
/usr/share/xml/docbook/stylesheet/docbook-xsl/template/titlepage.xsl \
docs/docbook/xsl/titlepage-fo.xml
On some platforms the titlepage.xsl is located elsewhere:
* OSX: /opt/local/share/xsl/docbook-xsl/template/titlepage.xsl
This is a customized version of docbook-xsl/fo/titlepage.templates.xml.
I removed every section except the book one. Feel free to add more if more
customization are required.
-->
<t:titlepage t:element="book" t:wrapper="fo:block">
<t:titlepage-content t:side="recto">
<mediaobject/>
<title
t:named-template="division.title"
param:node="ancestor-or-self::book[1]"
text-align="right"
font-size="&hsize5;"
space-before="&hsize5space;"
font-weight="bold"
font-family="{$title.fontset}"
margin-top="8em"/>
<subtitle
text-align="right"
font-size="&hsize4;"
space-before="&hsize4space;"
font-family="{$title.fontset}"
border-bottom="solid"/>
</t:titlepage-content>
<t:titlepage-content t:side="verso">
<title
font-size="&hsize2;"
font-weight="bold"
font-family="{$title.fontset}"/>
<corpauthor/>
<authorgroup t:named-template="verso.authorgroup"/>
<author/>
<othercredit/>
<releaseinfo space-before="0.5em"/>
<pubdate space-before="1em"/>
<copyright/>
<abstract/>
<legalnotice font-size="8pt"/>
</t:titlepage-content>
<t:titlepage-separator>
<fo:block break-after="page"/>
</t:titlepage-separator>
<t:titlepage-before t:side="recto">
</t:titlepage-before>
<t:titlepage-before t:side="verso">
<fo:block break-after="page"/>
</t:titlepage-before>
</t:titlepage>
</t:templates>
+208
View File
@@ -0,0 +1,208 @@
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" version="1.0" exclude-result-prefixes="exsl">
<!-- This stylesheet was created by template/titlepage.xsl-->
<xsl:template name="book.titlepage.recto">
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/mediaobject"/>
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/mediaobject"/>
<xsl:choose>
<xsl:when test="bookinfo/title">
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/title"/>
</xsl:when>
<xsl:when test="info/title">
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/title"/>
</xsl:when>
<xsl:when test="title">
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="title"/>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="bookinfo/subtitle">
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/subtitle"/>
</xsl:when>
<xsl:when test="info/subtitle">
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/subtitle"/>
</xsl:when>
<xsl:when test="subtitle">
<xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="subtitle"/>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="book.titlepage.verso">
<xsl:choose>
<xsl:when test="bookinfo/title">
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/title"/>
</xsl:when>
<xsl:when test="info/title">
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/title"/>
</xsl:when>
<xsl:when test="title">
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="title"/>
</xsl:when>
</xsl:choose>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/corpauthor"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/corpauthor"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/authorgroup"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/authorgroup"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/author"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/author"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/othercredit"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/othercredit"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/releaseinfo"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/releaseinfo"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/pubdate"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/pubdate"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/copyright"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/copyright"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/abstract"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/abstract"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/legalnotice"/>
<xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/legalnotice"/>
</xsl:template>
<xsl:template name="book.titlepage.separator"><fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" break-after="page"/>
</xsl:template>
<xsl:template name="book.titlepage.before.recto">
</xsl:template>
<xsl:template name="book.titlepage.before.verso"><fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" break-after="page"/>
</xsl:template>
<xsl:template name="book.titlepage">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:variable name="recto.content">
<xsl:call-template name="book.titlepage.before.recto"/>
<xsl:call-template name="book.titlepage.recto"/>
</xsl:variable>
<xsl:variable name="recto.elements.count">
<xsl:choose>
<xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
<xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
<!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
<xsl:otherwise>1</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
<fo:block><xsl:copy-of select="$recto.content"/></fo:block>
</xsl:if>
<xsl:variable name="verso.content">
<xsl:call-template name="book.titlepage.before.verso"/>
<xsl:call-template name="book.titlepage.verso"/>
</xsl:variable>
<xsl:variable name="verso.elements.count">
<xsl:choose>
<xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
<xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
<!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
<xsl:otherwise>1</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
<fo:block><xsl:copy-of select="$verso.content"/></fo:block>
</xsl:if>
<xsl:call-template name="book.titlepage.separator"/>
</fo:block>
</xsl:template>
<xsl:template match="*" mode="book.titlepage.recto.mode">
<!-- if an element isn't found in this mode, -->
<!-- try the generic titlepage.mode -->
<xsl:apply-templates select="." mode="titlepage.mode"/>
</xsl:template>
<xsl:template match="*" mode="book.titlepage.verso.mode">
<!-- if an element isn't found in this mode, -->
<!-- try the generic titlepage.mode -->
<xsl:apply-templates select="." mode="titlepage.mode"/>
</xsl:template>
<xsl:template match="mediaobject" mode="book.titlepage.recto.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style">
<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="title" mode="book.titlepage.recto.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" text-align="right" font-size="24.8832pt" space-before="18.6624pt" font-weight="bold" font-family="{$title.fontset}" margin-top="8em">
<xsl:call-template name="division.title">
<xsl:with-param name="node" select="ancestor-or-self::book[1]"/>
</xsl:call-template>
</fo:block>
</xsl:template>
<xsl:template match="subtitle" mode="book.titlepage.recto.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" text-align="right" font-size="20.736pt" space-before="15.552pt" font-family="{$title.fontset}" border-bottom="solid">
<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="title" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" font-size="14.4pt" font-weight="bold" font-family="{$title.fontset}">
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="corpauthor" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="authorgroup" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
<xsl:call-template name="verso.authorgroup">
</xsl:call-template>
</fo:block>
</xsl:template>
<xsl:template match="author" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="othercredit" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="releaseinfo" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" space-before="0.5em">
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="pubdate" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" space-before="1em">
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="copyright" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="abstract" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
</fo:block>
</xsl:template>
<xsl:template match="legalnotice" mode="book.titlepage.verso.auto.mode">
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" font-size="8pt">
<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
</fo:block>
</xsl:template>
</xsl:stylesheet>
+24
View File
@@ -0,0 +1,24 @@
<!-- TODO have the build system take care of this -->
<releaseinfo>Version 2.3.1 - July 2015</releaseinfo>
<subtitle>for version 2.3.1</subtitle>
<date>2015-07-23</date>
<legalnotice>
<para>Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".</para>
<!-- font licenses -->
<para>The fonts used in this guide are licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: <ulink url="http://scripts.sil.org/OFL">http://scripts.sil.org/OFL</ulink></para>
<para>Copyright © Łukasz Dziedzic, <ulink url="http://www.latofonts.com/">http://www.latofonts.com</ulink>, with Reserved Font Name: "Lato".</para>
<para>Copyright © Raph Levien, <ulink url="http://levien.com/">http://levien.com/</ulink>, with Reserved Font Name: "Inconsolata".</para>
</legalnotice>
<mediaobject>
<objectinfo>
<corpname>Inverse inc.</corpname>
</objectinfo>
<textobject>
<phrase>SOGo logo</phrase>
</textobject>
<imageobject>
<imagedata align="left" width="4in" format="PNG" fileref="images/sogo-logo.png" />
</imageobject>
</mediaobject>
+32
View File
@@ -0,0 +1,32 @@
<fop version="1.0">
<renderers>
<renderer mime="application/pdf">
<fonts>
<font metrics-url="fonts/inconsolata.xml" kerning="yes" embed-url="fonts/inconsolata.ttf">
<font-triplet name="Incosolata" style="normal" weight="normal"/>
</font>
<font metrics-url="fonts/lato/Lato-Regular.xml" kerning="yes" embed-url="fonts/lato/Lato-Regular.ttf">
<font-triplet name="Lato" style="normal" weight="normal"/>
</font>
<font metrics-url="fonts/lato/Lato-Italic.xml" kerning="yes" embed-url="fonts/lato/Lato-Italic.ttf">
<font-triplet name="Lato" style="italic" weight="normal"/>
</font>
<font metrics-url="fonts/lato/Lato-Light.xml" kerning="yes" embed-url="fonts/lato/Lato-Light.ttf">
<font-triplet name="Lato-Light" style="normal" weight="normal"/>
</font>
<font metrics-url="fonts/lato/Lato-LightItalic.xml" kerning="yes" embed-url="fonts/lato/Lato-LightItalic.ttf">
<font-triplet name="Lato-Light" style="italic" weight="normal"/>
</font>
<font metrics-url="fonts/lato/Lato-Medium.xml" kerning="yes" embed-url="fonts/lato/Lato-Medium.ttf">
<font-triplet name="Lato-Medium" style="normal" weight="normal"/>
</font>
<font metrics-url="fonts/lato/Lato-MediumItalic.xml" kerning="yes" embed-url="fonts/lato/Lato-MediumItalic.ttf">
<font-triplet name="Lato-Medium" style="italic" weight="normal"/>
</font>
<font metrics-url="fonts/lato/Lato-Semibold.xml" kerning="yes" embed-url="fonts/lato/Lato-Semibold.ttf">
<font-triplet name="Lato-Semibold" style="normal" weight="normal"/>
</font>
</fonts>
</renderer>
</renderers>
</fop>
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Inconsolata</font-name><full-name>Inconsolata</full-name><family-name>Inconsolata</family-name><embed/><cap-height>624</cap-height><x-height>458</x-height><ascender>820</ascender><descender>-180</descender><bbox><left>-1</left><bottom>-177</bottom><right>510</right><top>835</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="3" ue="126" us="32"/><bf gi="98" ue="255" us="160"/><bf gi="194" ue="263" us="258"/><bf gi="200" ue="273" us="268"/><bf gi="206" ue="283" us="280"/><bf gi="210" ue="287" us="286"/><bf gi="212" ue="305" us="304"/><bf gi="214" ue="314" us="312"/><bf gi="217" ue="318" us="317"/><bf gi="219" ue="324" us="321"/><bf gi="223" ue="328" us="327"/><bf gi="225" ue="331" us="330"/><bf gi="227" ue="333" us="333"/><bf gi="228" ue="341" us="336"/><bf gi="234" ue="347" us="344"/><bf gi="238" ue="357" us="350"/><bf gi="246" ue="369" us="366"/><bf gi="250" ue="382" us="376"/><bf gi="257" ue="402" us="402"/><bf gi="258" ue="567" us="567"/><bf gi="259" ue="711" us="710"/><bf gi="261" ue="713" us="713"/><bf gi="262" ue="715" us="715"/><bf gi="263" ue="733" us="728"/><bf gi="269" ue="8218" us="8216"/><bf gi="272" ue="8222" us="8220"/><bf gi="275" ue="8226" us="8224"/><bf gi="278" ue="8230" us="8230"/><bf gi="279" ue="8250" us="8249"/><bf gi="281" ue="8260" us="8260"/><bf gi="282" ue="8308" us="8308"/><bf gi="283" ue="8364" us="8364"/><bf gi="284" ue="8482" us="8482"/><bf gi="285" ue="8593" us="8593"/><bf gi="286" ue="8595" us="8595"/><bf gi="287" ue="8722" us="8722"/><bf gi="288" ue="9251" us="9251"/><bf gi="0" ue="65535" us="65535"/></bfranges><cid-widths start-index="0"><wx w="500"/><wx w="0"/><wx w="333"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wLine truncated
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Black</font-name><full-name>Lato Black</full-name><family-name>Lato</family-name><embed/><cap-height>728</cap-height><x-height>518</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-654</left><bottom>-299</bottom><right>1356</right><top>1116</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293" us=Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-BlackItalic</font-name><full-name>Lato Black Italic</full-name><family-name>Lato</family-name><embed/><cap-height>728</cap-height><x-height>518</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-537</left><bottom>-297</bottom><right>1295</right><top>1114</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="276Line truncated
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Bold</font-name><full-name>Lato Bold</full-name><family-name>Lato</family-name><embed/><cap-height>723</cap-height><x-height>513</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-603</left><bottom>-285</bottom><right>1344</right><top>1099</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293" us="2Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-BoldItalic</font-name><full-name>Lato Bold Italic</full-name><family-name>Lato</family-name><embed/><cap-height>723</cap-height><x-height>513</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-520</left><bottom>-283</bottom><right>1293</right><top>1097</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="276" Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Hairline</font-name><full-name>Lato Hairline</full-name><family-name>Lato</family-name><embed/><cap-height>700</cap-height><x-height>490</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-459</left><bottom>-259</bottom><right>1340</right><top>1034</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="29Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-HairlineItalic</font-name><full-name>Lato Hairline Italic</full-name><family-name>Lato</family-name><embed/><cap-height>700</cap-height><x-height>490</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-459</left><bottom>-259</bottom><right>1286</right><top>1034</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gLine truncated
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Heavy</font-name><full-name>Lato Heavy</full-name><family-name>Lato</family-name><embed/><cap-height>725</cap-height><x-height>515</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-626</left><bottom>-291</bottom><right>1345</right><top>1107</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293" us=Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-HeavyItalic</font-name><full-name>Lato Heavy Italic</full-name><family-name>Lato</family-name><embed/><cap-height>725</cap-height><x-height>515</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-528</left><bottom>-289</bottom><right>1294</right><top>1105</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="276Line truncated
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Italic</font-name><full-name>Lato Italic</full-name><family-name>Lato</family-name><embed/><cap-height>716</cap-height><x-height>506</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-501</left><bottom>-268</bottom><right>1290</right><top>1077</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="276" ue="293" Line truncated
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Light</font-name><full-name>Lato Light</full-name><family-name>Lato</family-name><embed/><cap-height>707</cap-height><x-height>497</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-479</left><bottom>-263</bottom><right>1341</right><top>1055</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293" us=Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-LightItalic</font-name><full-name>Lato Light Italic</full-name><family-name>Lato</family-name><embed/><cap-height>707</cap-height><x-height>497</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-479</left><bottom>-263</bottom><right>1288</right><top>1054</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="276Line truncated
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Medium</font-name><full-name>Lato Medium</full-name><family-name>Lato</family-name><embed/><cap-height>717</cap-height><x-height>507</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-556</left><bottom>-270</bottom><right>1343</right><top>1082</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293" uLine truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-MediumItalic</font-name><full-name>Lato Medium Italic</full-name><family-name>Lato</family-name><embed/><cap-height>717</cap-height><x-height>507</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-504</left><bottom>-269</bottom><right>1291</right><top>1080</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="2Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Regular</font-name><full-name>Lato Regular</full-name><family-name>Lato</family-name><embed/><cap-height>716</cap-height><x-height>506</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-546</left><bottom>-268</bottom><right>1342</right><top>1078</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293"Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Semibold</font-name><full-name>Lato Semibold</full-name><family-name>Lato</family-name><embed/><cap-height>720</cap-height><x-height>510</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-576</left><bottom>-277</bottom><right>1343</right><top>1090</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="29Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-SemiboldItalic</font-name><full-name>Lato Semibold Italic</full-name><family-name>Lato</family-name><embed/><cap-height>720</cap-height><x-height>510</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-511</left><bottom>-275</bottom><right>1291</right><top>1088</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gLine truncated
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-Thin</font-name><full-name>Lato Thin</full-name><family-name>Lato</family-name><embed/><cap-height>703</cap-height><x-height>493</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-467</left><bottom>-261</bottom><right>1340</right><top>1042</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="171" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="82" ue="33" us="33"/><bf gi="122" ue="34" us="34"/><bf gi="134" ue="35" us="35"/><bf gi="130" ue="36" us="36"/><bf gi="166" ue="37" us="37"/><bf gi="123" ue="38" us="38"/><bf gi="121" ue="39" us="39"/><bf gi="108" ue="41" us="40"/><bf gi="114" ue="42" us="42"/><bf gi="144" ue="43" us="43"/><bf gi="84" ue="44" us="44"/><bf gi="102" ue="45" us="45"/><bf gi="87" ue="46" us="46"/><bf gi="99" ue="47" us="47"/><bf gi="135" ue="53" us="48"/><bf gi="164" ue="54" us="54"/><bf gi="141" ue="55" us="55"/><bf gi="165" ue="56" us="56"/><bf gi="142" ue="57" us="57"/><bf gi="86" ue="58" us="58"/><bf gi="85" ue="59" us="59"/><bf gi="149" ue="60" us="60"/><bf gi="146" ue="61" us="61"/><bf gi="150" ue="62" us="62"/><bf gi="83" ue="63" us="63"/><bf gi="124" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="110" ue="91" us="91"/><bf gi="101" ue="92" us="92"/><bf gi="111" ue="93" us="93"/><bf gi="119" ue="94" us="94"/><bf gi="105" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="163" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="112" ue="123" us="123"/><bf gi="100" ue="124" us="124"/><bf gi="113" ue="125" us="125"/><bf gi="120" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="167" ue="161" us="161"/><bf gi="131" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="133" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="117" ue="167" us="167"/><bf gi="73" ue="168" us="168"/><bf gi="125" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="97" ue="171" us="171"/><bf gi="154" ue="172" us="172"/><bf gi="102" ue="173" us="173"/><bf gi="126" ue="174" us="174"/><bf gi="74" ue="175" us="175"/><bf gi="128" ue="176" us="176"/><bf gi="151" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="118" ue="182" us="182"/><bf gi="107" ue="183" us="183"/><bf gi="79" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="98" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="168" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="2203" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="145" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2538" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1889" ue="256" us="256"/><bf gi="2229" ue="257" us="257"/><bf gi="1890" ue="258" us="258"/><bf gi="2230" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1947" ue="262" us="262"/><bf gi="2263" ue="263" us="263"/><bf gi="1948" ue="264" us="264"/><bf gi="2264" ue="265" us="265"/><bf gi="1950" ue="266" us="266"/><bf gi="2266" ue="267" us="267"/><bf gi="1949" ue="268" us="268"/><bf gi="2265" ue="269" us="269"/><bf gi="1955" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1962" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1965" ue="274" us="274"/><bf gi="2279" ue="275" us="275"/><bf gi="1966" ue="276" us="276"/><bf gi="2280" ue="277" us="277"/><bf gi="1967" ue="278" us="278"/><bf gi="2281" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1964" ue="282" us="282"/><bf gi="2278" ue="283" us="283"/><bf gi="2000" ue="284" us="284"/><bf gi="2322" ue="285" us="285"/><bf gi="2001" ue="286" us="286"/><bf gi="2323" ue="287" us="287"/><bf gi="2002" ue="288" us="288"/><bf gi="2324" ue="289" us="289"/><bf gi="2003" ue="290" us="290"/><bf gi="2325" ue="291" us="291"/><bf gi="2007" ue="292" us="292"/><bf gi="276" ue="293" us="2Line truncated
Binary file not shown.
@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><font-metrics metrics-version="2" type="TYPE0"><font-name>Lato-ThinItalic</font-name><full-name>Lato Thin Italic</full-name><family-name>Lato</family-name><embed/><cap-height>703</cap-height><x-height>493</x-height><ascender>805</ascender><descender>-195</descender><bbox><left>-467</left><bottom>-261</bottom><right>1287</right><top>1042</top></bbox><flags>97</flags><stemv>0</stemv><italicangle>-7</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf gi="1" ue="0" us="0"/><bf gi="169" ue="13" us="13"/><bf gi="2" ue="32" us="32"/><bf gi="81" ue="33" us="33"/><bf gi="120" ue="34" us="34"/><bf gi="132" ue="35" us="35"/><bf gi="128" ue="36" us="36"/><bf gi="164" ue="37" us="37"/><bf gi="121" ue="38" us="38"/><bf gi="119" ue="39" us="39"/><bf gi="106" ue="41" us="40"/><bf gi="112" ue="42" us="42"/><bf gi="142" ue="43" us="43"/><bf gi="83" ue="44" us="44"/><bf gi="100" ue="45" us="45"/><bf gi="85" ue="46" us="46"/><bf gi="97" ue="47" us="47"/><bf gi="133" ue="53" us="48"/><bf gi="162" ue="54" us="54"/><bf gi="139" ue="55" us="55"/><bf gi="163" ue="56" us="56"/><bf gi="140" ue="57" us="57"/><bf gi="170" ue="58" us="58"/><bf gi="84" ue="59" us="59"/><bf gi="147" ue="60" us="60"/><bf gi="144" ue="61" us="61"/><bf gi="148" ue="62" us="62"/><bf gi="82" ue="63" us="63"/><bf gi="122" ue="64" us="64"/><bf gi="3" ue="65" us="65"/><bf gi="5" ue="67" us="66"/><bf gi="8" ue="79" us="68"/><bf gi="22" ue="90" us="80"/><bf gi="108" ue="91" us="91"/><bf gi="99" ue="92" us="92"/><bf gi="109" ue="93" us="93"/><bf gi="117" ue="94" us="94"/><bf gi="103" ue="95" us="95"/><bf gi="68" ue="96" us="96"/><bf gi="33" ue="97" us="97"/><bf gi="35" ue="99" us="98"/><bf gi="38" ue="102" us="100"/><bf gi="43" ue="105" us="103"/><bf gi="47" ue="107" us="106"/><bf gi="161" ue="108" us="108"/><bf gi="49" ue="111" us="109"/><bf gi="54" ue="115" us="112"/><bf gi="59" ue="122" us="116"/><bf gi="110" ue="123" us="123"/><bf gi="98" ue="124" us="124"/><bf gi="111" ue="125" us="125"/><bf gi="118" ue="126" us="126"/><bf gi="2" ue="160" us="160"/><bf gi="165" ue="161" us="161"/><bf gi="129" ue="163" us="162"/><bf gi="455" ue="164" us="164"/><bf gi="131" ue="165" us="165"/><bf gi="452" ue="166" us="166"/><bf gi="115" ue="167" us="167"/><bf gi="171" ue="168" us="168"/><bf gi="123" ue="169" us="169"/><bf gi="66" ue="170" us="170"/><bf gi="95" ue="171" us="171"/><bf gi="152" ue="172" us="172"/><bf gi="100" ue="173" us="173"/><bf gi="124" ue="174" us="174"/><bf gi="73" ue="175" us="175"/><bf gi="126" ue="176" us="176"/><bf gi="149" ue="177" us="177"/><bf gi="1202" ue="179" us="178"/><bf gi="69" ue="180" us="180"/><bf gi="224" ue="181" us="181"/><bf gi="116" ue="182" us="182"/><bf gi="105" ue="183" us="183"/><bf gi="78" ue="184" us="184"/><bf gi="1204" ue="185" us="185"/><bf gi="67" ue="186" us="186"/><bf gi="96" ue="187" us="187"/><bf gi="1205" ue="190" us="188"/><bf gi="166" ue="191" us="191"/><bf gi="172" ue="197" us="192"/><bf gi="4" ue="198" us="198"/><bf gi="7" ue="199" us="199"/><bf gi="178" ue="207" us="200"/><bf gi="226" ue="208" us="208"/><bf gi="186" ue="214" us="209"/><bf gi="517" ue="215" us="215"/><bf gi="20" ue="216" us="216"/><bf gi="192" ue="220" us="217"/><bf gi="1973" ue="221" us="221"/><bf gi="233" ue="222" us="222"/><bf gi="58" ue="223" us="223"/><bf gi="197" ue="229" us="224"/><bf gi="34" ue="230" us="230"/><bf gi="37" ue="231" us="231"/><bf gi="203" ue="239" us="232"/><bf gi="244" ue="240" us="240"/><bf gi="211" ue="246" us="241"/><bf gi="143" ue="247" us="247"/><bf gi="52" ue="248" us="248"/><bf gi="217" ue="252" us="249"/><bf gi="2312" ue="253" us="253"/><bf gi="285" ue="254" us="254"/><bf gi="221" ue="255" us="255"/><bf gi="1659" ue="256" us="256"/><bf gi="1999" ue="257" us="257"/><bf gi="1660" ue="258" us="258"/><bf gi="2000" ue="259" us="259"/><bf gi="225" ue="260" us="260"/><bf gi="237" ue="261" us="261"/><bf gi="1717" ue="262" us="262"/><bf gi="2033" ue="263" us="263"/><bf gi="1718" ue="264" us="264"/><bf gi="2034" ue="265" us="265"/><bf gi="1720" ue="266" us="266"/><bf gi="2036" ue="267" us="267"/><bf gi="1719" ue="268" us="268"/><bf gi="2035" ue="269" us="269"/><bf gi="1725" ue="270" us="270"/><bf gi="242" ue="271" us="271"/><bf gi="1732" ue="272" us="272"/><bf gi="243" ue="273" us="273"/><bf gi="1735" ue="274" us="274"/><bf gi="2049" ue="275" us="275"/><bf gi="1736" ue="276" us="276"/><bf gi="2050" ue="277" us="277"/><bf gi="1737" ue="278" us="278"/><bf gi="2051" ue="279" us="279"/><bf gi="227" ue="280" us="280"/><bf gi="245" ue="281" us="281"/><bf gi="1734" ue="282" us="282"/><bf gi="2048" ue="283" us="283"/><bf gi="1770" ue="284" us="284"/><bf gi="2092" ue="285" us="285"/><bf gi="1771" ue="286" us="286"/><bf gi="2093" ue="287" us="287"/><bf gi="1772" ue="288" us="288"/><bf gi="2094" ue="289" us="289"/><bf gi="1773" ue="290" us="290"/><bf gi="2095" ue="291" us="291"/><bf gi="1777" ue="292" us="292"/><bf gi="276" Line truncated
+41
View File
@@ -0,0 +1,41 @@
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.
The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the copyright statement(s).
"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.
"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.
5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
Binary file not shown.

After

Width:  |  Height:  |  Size: 272 KiB

File renamed without changes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

File renamed without changes.
File renamed without changes.
@@ -0,0 +1,27 @@
////
Additional information section
This file is part of the SOGo project.
Authors:
- Inverse inc. <info@inverse.ca>
Copyright (C) 2008-2014 Inverse inc.
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
////
Additional Information
----------------------
For more information, please consult the online FAQs (Frequently Asked
Questions) :
http://www.sogo.nu/english/support/faq.html
You can also read the mailing archives or post your questions to it. For
details, see :
https://lists.inverse.ca/sogo
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
@@ -0,0 +1,26 @@
////
Commercial support section
This file is part of the SOGo project.
Authors:
- Inverse inc. <info@inverse.ca>
Copyright (C) 2008-2014 Inverse inc.
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
////
Commercial Support and Contact Information
------------------------------------------
For any questions or comments, do not hesitate to contact us by writing
an email to :
mailto:support@inverse.ca[support@inverse.ca]
Inverse (http://inverse.ca/[http://inverse.ca]) offers professional
services around SOGo to help organizations deploy the solution and
migrate from their legacy systems.
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
@@ -0,0 +1,18 @@
////
Global Attributes for our documentation
This file is part of the SOGo project.
Authors:
- Inverse inc. <info@inverse.ca>
Copyright (C) 2008-2015 Inverse inc.
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
////
// TODO have the build system take care of this
:release_version: 2.3.1
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
+19
View File
@@ -0,0 +1,19 @@
////
License section
This file is part of the SOGo project.
Authors:
- Inverse inc. <info@inverse.ca>
Copyright (C) 2008-2014 Inverse inc.
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
////
GNU Free Documentation License
------------------------------
Please refer to http://www.gnu.org/licenses/fdl-1.2.txt for the full license.
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
Binary file not shown.

Before

Width:  |  Height:  |  Size: 311 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

-1
View File
@@ -6,7 +6,6 @@ include $(GNUSTEP_MAKEFILES)/common.make
SUBPROJECTS = \
SOPE/NGCards \
SOPE/GDLContentStore \
OGoContentStore \
SoObjects \
Main \
UI \
+1 -2
View File
@@ -6,8 +6,7 @@ include ../Version
ADDITIONAL_OBJCFLAGS += -fPIE
ADDITIONAL_INCLUDE_DIRS +=
ADDITIONAL_LIB_DIRS += -L../SOPE/GDLContentStore/obj/
ADDITIONAL_LDFLAGS += -Wl,--no-as-needed -fPIE -pie
ADDITIONAL_LDFLAGS += -Wl,--no-as-needed -fPIE -pie -Wl,--rpath,$(SOGO_SYSLIBDIR)/sogo
SOGOD = sogod
TOOL_NAME = $(SOGOD)
+3 -6
View File
@@ -9,15 +9,12 @@ ADDITIONAL_INCLUDE_DIRS += \
-I..
ADDITIONAL_LIB_DIRS += \
-L../SoObjects/SOGo/SOGo.framework \
-L../OGoContentStore/$(GNUSTEP_OBJ_DIR)/ \
-L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/
SYSTEM_LIB_DIR += -L/usr/local/lib -L/usr/lib
-L../SoObjects/SOGo/SOGo.framework/sogo \
-L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ \
-L../SOPE/GDLContentStore/$(GNUSTEP_OBJ_DIR)/
$(SOGOD)_TOOL_LIBS += \
-lSOGo \
-lOGoContentStore \
-lGDLContentStore \
-lGDLAccess \
-lWEExtensions \
+3 -3
View File
@@ -245,7 +245,7 @@ static BOOL debugLeaks;
}
else
{
NSLog (@"No value specified for '%@'", *urlString);
[self errorWithFormat: @"No value specified for '%@'", *urlString];
ok = NO;
}
}
@@ -283,7 +283,7 @@ static BOOL debugLeaks;
{
id authenticator;
if (trustProxyAuthentication)
if (trustProxyAuthentication && [[context request] headerForKey: @"x-webobjects-remote-user"])
authenticator = [SOGoProxyAuthenticator sharedSOGoProxyAuthenticator];
else
{
@@ -441,7 +441,7 @@ static BOOL debugLeaks;
if (debugLeaks)
{
if (debugOn)
NSLog (@"allocated classes:\n%s", GSDebugAllocationList (YES));
[self logWithFormat: @"allocated classes:\n%s", GSDebugAllocationList (YES)];
else
{
debugOn = YES;
+4 -4
View File
@@ -1,15 +1,15 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
Copyright (C) 2006-2009 Inverse inc.
Copyright (C) 2006-2015 Inverse inc.
This file is part of OpenGroupware.org.
This file is part of SOGo.
OGo is free software; you can redistribute it and/or modify it under
SOGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo is distributed in the hope that it will be useful, but WITHOUT ANY
SOGo is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
+365 -1
View File
@@ -1,3 +1,367 @@
2.3.1 (2015-07-23)
------------------
Enhancements
- improved EAS speed, especially when fetching big attachments
- now always enforce the organizer's default identity in appointments
- improved the handling of default calendar categories/colors (#3200)
- added support for DeletesAsMoves over EAS
- added create-folder subcommand to sogo-tool to create contact and calendar folders
- group mail addresses can be used as recipient in Outlook
- added 'ActiveSync' module constraints
- updated CKEditor to version 4.5.1
- added Slovenian translation - thanks to Jens Riecken
- added Chinese (Taiwan) translation
Bug fixes
- EAS's GetItemEstimate/ItemOperations now support fetching mails and empty folders
- fixed some rare cornercases in multidomain configurations
- properly escape folder after creation using EAS (#3237)
- fixed potential organizer highjacking when using EAS (#3131)
- properly support big characters in EAS and fix encoding QP EAS error for Outlook (#3082)
- properly encode id of DOM elements in Address Book module (#3239, #3245)
- fixed multi-domain support for sogo-tool backup/restore (#2600)
- fixed data ordering in events list of Calendar module (#3261)
- fixed data ordering in tasks list of Calendar module (#3267)
- Android EAS Lollipop fixes (#3268 and #3269)
- improved EAS email flagging handling (#3140)
- fixed computation of GlobalObjectId (#3235)
- fixed EAS conversation ID issues on BB10 (#3152)
- fixed CR/LF printing in event's description (#3228)
- optimized Calendar module in multidomain configurations
2.3.0 (2015-06-01)
-------------------
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
- calendar sharing request support among different Outlook versions (Zentyal)
- improved sync speed from Outlook by non-reprocessing already downloaded unread mails (Zentyal)
- 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)
- 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
- many improvements to EAS SmartReply/SmartForward commands
- 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
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
- 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)
- 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
- 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)
- fixed the EAS maximum response size being per-folder, and not global
- 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)
- 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)
--------------------
Bug fixes
- avoid calling -stringByReplacingOccurrencesOfString:... for old GNUstep runtime
2.2.17 (2015-03-24)
-------------------
Enhancements
- support for mail prority using EAS
- immediately delete mails from EAS clients when they are marked as deleted on the IMAP server
- now favor login@domain as the default email address if multiple mail: fields are specified
- enable by default HTML mails support using EAS on Windows and BB phones
- now possible to configure objectClass names for LDAP groups using GroupObjectClasses (#1499)
Bug fixes
- fixed login issue after password change (#2601)
- fixed potential encoding issue using EAS and 8-bit mails (#3116)
- multiple collections support for GetItemEstimate using EAS
- fixed empty sync responses for EAS 2.5 and 12.0 clients
- use the correct mail body element for EAS 2.5 clients
- fixed tasks disappearing issue with RoadSync
- use the correct body element for events for EAS 2.5 clients
- SmartReply improvements for missing body attributes
- do not use syncKey from cache when davCollectionTag = -1
- use correct mail attachment elements for EAS 2.5 clients
- fixed contacts lookup by UID in freebusy
- reduced telephone number to a single value in JSON response of contacts list
- fixed freebusy data when 'busy off hours' is enabled and period starts during the weekend
- fixed fetching of freebusy data from the Web interface
- fixed EAS handling of Bcc in emails (#3138)
- fixed Language-Region tags in Web interface (#3121)
- properly fallback over EAS to UTF-8 and then Latin1 for messages w/o charset (#3103)
- prevent potential freebusy lookup crashes during timezone changes with repetitive events
- improved GetItemEstimate to count all vasnished/deleted mails too
- improvements to EAS SyncKey handling to avoid missing mails (#3048, #3058)
- fixed EAS replies decoding from Outlook (#3123)
2.2.16 (2015-02-12)
-------------------
New features
- now possible for SOGo to change the sambaNTPassword/sambaLMPassword
- now possible to limit automatic forwards to internal/external domains
Enhancements
- added support for email categories using EAS (#2995)
- now possible to always send vacation messages (#2332)
- added EAS best practices to the documentation
- improved fetching of text parts over EAS
- updated Czech, Finnish, French, German and Hungarian translations
Bug fixes
- (regression) fixed sending a message when mail module is not active (#3088)
- mail labels with blanks are not handled correctly (#3078)
- fixed BlackBerry issues sending multiple mails over EAS (#3095)
- fixed plain/text mails showing on one line on Android/EAS (#3055)
- fixed exception in sogo-tool when parsing arguments of a set operation
2.2.15 (2015-01-30)
-------------------
Enhancements
- improved handling of EAS Push when no heartbeat is provided
- no longer need to kill Outlook 2013 when creating EAS profiles (#3076)
- improved server-side CSS cleaner (#3040)
- unified the logging messages in sogo.log file (#2534/#3063)
- updated Brazilian (Portuguese) and Hungarian translations
2.2.14 (2015-01-20)
-------------------
Enhancements
- MultipleBookingsFieldName can be set to -1 to show busy status when booked at least once
- handle multipart objects in EAS/ItemOperations
Bug fixes
- fixed calendar selection in event and task editors (#3049, #3050)
- check for resources existence when listing subscribed ones (#3054)
- correctly recognize Apple Calendar on Yosemite (#2960)
- fixed two potential autorelease pool leaks (#3026 and #3051)
- fixed birthday offset in EAS
- fixed From's full name over EAS
- fixed potential issue when handling multiple Add/Change/Delete/Fetch EAS commands (#3057)
- fixed wrong timezone calculation on recurring events
2.2.13 (2014-12-30)
-------------------
Enhancements
- initial support for empty sync request/response for EAS
- added the SOGoMaximumSyncResponseSize EAS configuration parameter to
support memory-limited sync response sizes
- we now not only use the creation date for event's cutoff date (EAS)
Bug fixes
- fixed contact description truncation on WP8 phones (#3028)
- fixed freebusy information not always returned
- fixed tz issue when the user one was different from the system one with EAS
2.2.12a (2014-12-19)
--------------------
Bug fixes
- fixed empty HTML mails being sent (#3034)
2.2.12 (2014-12-18)
-------------------
New features
- allow including or not freebusy info from subscribed calendars
- now possible to set an autosave timer for draft messages
- now possible to set alarms on event invitations (#76)
Enhancements
- updated CKEditor to version 4.4.6 and added the 'Source Area' plugin
- avoid testing for IMAP ANNOTATION when X-GUID is available (#3018)
- updated Czech, Dutch, Finnish, French, German, Polish and Spanish (Spain) translations
Bug fixes
- fixed for privacy and categories for EAS (#3022)
- correctly set MeetingStatus for EAS on iOS devices
- Ubuntu Lucid fixes for EAS
- fixed calendar reminders for future events (#3008)
- make sure all text parts are UTF-8 re-encoded for Outlook 2013 over EAS (#3003)
- fixed task description truncation affecting WP8 phones over EAS (#3028)
2.2.11a (2014-12-10)
--------------------
Bug fixes
- make sure all address books returned using EAS are GCS ones
2.2.11 (2014-12-09)
-------------------
New features
- sogo-tool can now be used to manage EAS metadata for all devices
Enhancements
- improved the SAML2 documentation
- radically reduced AES memory usage
Bug fixes
- now possible to specify the username attribute for SAML2 (SOGoSAML2LoginAttribute) (#2381)
- added support for IdP-initiated SAML2 logout (#2377)
- we now generate SAML2 metadata on the fly (#2378)
- we now handle correctly the SOGo logout when using SAML (#2376 and #2379)
- fixed freebusy lookups going off bounds for resources (#3010)
- fixed EAS clients moving mails between folders but disconnecting before receiving server's response (#2982)
2.2.10 (2014-11-21)
-------------------
Enhancements
- no longer leaking database passwords in the logs (#2953)
- added support for multiple calendars and address books over ActiveSync
- updated timezone information (#2968)
- updated Brazilian Portuguese, Czech, Dutch, Finnish, French, German, Hungarian, Polish,
Russian, Spanish (Argentina), and Spanish (Spain) translations
- updated CKEditor to version 4.4.5
Bug fixes
- fixed freebusy lookup with "Show time as busy" (#2930)
- don't escape <br>'s in a card's note field
- fixed folder's display name when subscribing to a folder
- fixed folder's display name when the active user subscribes another user to one of her/his folders
- fixed error with new user default sorting value for the mailer module (#2952)
- fixed ActiveSync PING command flooding the server (#2940)
- fixed many interop issues with Windows Phones over ActiveSync
- fixed automatic return receipts crash when not in the recepient list (#2965)
- fixed support for Sieve folder encoding parameter (#2622)
- fixed rename of subscribed addressbooks
- sanitize strings before escaping them when using EAS
- fixed handling of event invitations on iOS/EAS with no organizer (#2978)
- fixed corrupted png files (#2975)
- improved dramatically the BSON decoding speed
- added WindowSize support for GCS collections when using EAS
- fixed IMAP search with non-ASCII folder names
- fixed extraction of email addresses when pasting text with tabs (#2945)
- fixed Outlook attachment corruption issues when using AES (#2957)
2.2.9a (2014-09-29)
-------------------
Bug fixes
- correctly skip unallowed characters (#2936)
2.2.9 (2014-09-26)
------------------
New features
- support for recurrent tasks (#2160)
- support for alarms on recurrent events / tasks
Enhancements
- alarms can now be snoozed for 1 day
- better iOS/Mac OS X Calendar compability regarding alarms (#1920)
- force default classification over CalDAV if none is set (#2326)
- now compliant when handling completed tasks (#589)
- better iOS invitations handling regarding part state (#2852)
- fixed Mac OS X Calendar delegation issue (#2837)
- converted ODT documentation to AsciiDoc format
- updated Czech, Dutch, Finnish, French, German, Hungarian, Norwegian (Bokmal), Polish, Russian, and
Spanish (Spain) translations
Bug fixes
- fixed sending mails to multiple recipients over AS
- fixed freebusy support in iCal 7 and free/busy state changes (#2878, #2879)
- we now get rid of all potential control characters before sending the DAV response
- sync-token can now be returned during PROPFIND (#2493)
- fixed calendar deletion on iOS/Mac OS Calendar (#2838)
2.2.8 (2014-09-10)
------------------
New features
- new user settings for threads collapsing
- IMAP global search support (#2670)
Enhancements
- major refactoring of the GCS component saving code (dropped OGoContentStore)
- printing calendars in colors is now possible in all views; list, daily, weekly and multicolumns
- new option to print calendars events and tasks with a background color or with a border color
- labels tagging only make one AJAX call for all the selected messages instead of one AJAX call per message
- new option to print calendars events and tasks with a background color or with a border color
- all modules can now be automatically refreshed
- new configurable user defaults variables; SOGoRefreshViewCheck & SOGoRefreshViewIntervals. SOGoMailMessageCheck has
been replaced by SOGoRefreshViewCheck and SOGoMailPollingIntervals has been replaced by SOGoRefreshViewIntervals
- updated Catalan, Czech, Dutch, Finnish, French, Hungarian, Norwegian, and Polish translations
Bug fixes
- fixed crasher when subscribing users to resources (#2892)
- fixed encoding of new calendars and new subscriptions (JavaScript only)
- fixed display of users with no possible subscription
- fixed usage of SOGoSubscriptionFolderFormat domain default when the folder's name hasn't been changed
- fixed "sogo-tool restore -l" that was returning incorrect folder IDs
- fixed Can not delete mail when over quota (#2812)
- fixed Events and tasks cannot be moved to other calendars using drag&drop (#2759)
- fixed In "Multicolumn Day View" mouse position is not honored when creating an event (#2864)
- fixed handling of messages labels (#2902)
- fixed Apache > 2.3 configuration
- fixed freebusy retrieval during timezone changes (#1240)
2.2.7 (2014-07-30)
------------------
New features
- new user preference to prevent event invitations
Enhancements
- improved badges of active tasks count
- refresh draft folder after sending a message
- now possible to DnD events in the calendar list
- improved handling of SOGoSubscriptionFolderFormat
- JSON'ified folder subscription interface
- updated Finnish, French, German, and Spanish (Spain) translations
- updated CKEditor to version 4.4.3
Bug fixes
- fixed weekdays translation in the datepicker
- fixed event categories display
- fixed all-day events display in IE
- fixed rename of calendars
- we now correctly add the "METHOD:REPLY" when sending out ITIP messages from DAV clients
- fixed refresh of message headers when forwarding a message (#2818)
- we now correctly escape all charset= in <meta> tags, not only in the <head>
- we now destroy cache objects of vanished folders
2.2.6 (2014-07-02)
------------------
@@ -9,7 +373,7 @@ Enhancements
- implemented the GetAttachment ActiveSync command (#2808)
- implemented the Ping ActiveSync command
- added "soft deletes" support for ActiveSync (#2734)
- now display the active tasks next to calendar names (#2760)
- now display the active tasks count next to calendar names (#2760)
Bug fixes
- better handling of empty "Flag" messages over ActiveSync (#2806)
-482
View File
@@ -1,482 +0,0 @@
GNU LIBRARY GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1991 Free Software Foundation, Inc.
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the library GPL. It is
numbered 2 because it goes with version 2 of the ordinary GPL.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Library General Public License, applies to some
specially designated Free Software Foundation software, and to any
other libraries whose authors decide to use it. You can use it for
your libraries, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if
you distribute copies of the library, or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link a program with the library, you must provide
complete object files to the recipients so that they can relink them
with the library, after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
Our method of protecting your rights has two steps: (1) copyright
the library, and (2) offer you this license which gives you legal
permission to copy, distribute and/or modify the library.
Also, for each distributor's protection, we want to make certain
that everyone understands that there is no warranty for this free
library. If the library is modified by someone else and passed on, we
want its recipients to know that what they have is not the original
version, so that any problems introduced by others will not reflect on
the original authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that companies distributing free
software will individually obtain patent licenses, thus in effect
transforming the program into proprietary software. To prevent this,
we have made it clear that any patent must be licensed for everyone's
free use or not licensed at all.
Most GNU software, including some libraries, is covered by the ordinary
GNU General Public License, which was designed for utility programs. This
license, the GNU Library General Public License, applies to certain
designated libraries. This license is quite different from the ordinary
one; be sure to read it in full, and don't assume that anything in it is
the same as in the ordinary license.
The reason we have a separate public license for some libraries is that
they blur the distinction we usually make between modifying or adding to a
program and simply using it. Linking a program with a library, without
changing the library, is in some sense simply using the library, and is
analogous to running a utility program or application program. However, in
a textual and legal sense, the linked executable is a combined work, a
derivative of the original library, and the ordinary General Public License
treats it as such.
Because of this blurred distinction, using the ordinary General
Public License for libraries did not effectively promote software
sharing, because most developers did not use the libraries. We
concluded that weaker conditions might promote sharing better.
However, unrestricted linking of non-free programs would deprive the
users of those programs of all benefit from the free status of the
libraries themselves. This Library General Public License is intended to
permit developers of non-free programs to use free libraries, while
preserving your freedom as a user of such programs to change the free
libraries that are incorporated in them. (We have not seen how to achieve
this as regards changes in header files, but we have achieved it as regards
changes in the actual functions of the Library.) The hope is that this
will lead to faster development of free libraries.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, while the latter only
works together with the library.
Note that it is possible for a library to be covered by the ordinary
General Public License rather than by this special one.
GNU LIBRARY GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library which
contains a notice placed by the copyright holder or other authorized
party saying it may be distributed under the terms of this Library
General Public License (also called "this License"). Each licensee is
addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also compile or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
c) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
d) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the source code distributed need not include anything that is normally
distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Library General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
-34
View File
@@ -1,34 +0,0 @@
# GNUstep makefile
include ../config.make
include $(GNUSTEP_MAKEFILES)/common.make
include ./Version
LIBRARY_NAME = libOGoContentStore
TYPEMODELS_DIR = $(SOGO_TYPEMODELS)
libOGoContentStore_HEADER_FILES_DIR = .
libOGoContentStore_HEADER_FILES_INSTALL_DIR = /OGoContentStore
libOGoContentStore_INTERFACE_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION)
ADDITIONAL_INCLUDE_DIRS += -I../SOPE
ADDITIONAL_LIB_DIRS += -L../SOPE/GDLContentStore/obj
libOGoContentStore_OBJC_FILES += \
OCSiCalFieldExtractor.m \
OCSContactFieldExtractor.m \
libOGoContentStore_TYPEMODELS += \
appointment.ocs \
contact.ocs \
appointment-oracle.ocs \
contact-oracle.ocs
-include GNUmakefile.preamble
ifneq ($(FHS_INSTALL_ROOT),)
GNUSTEP_HEADERS=$(DESTDIR)$(FHS_INSTALL_ROOT)/include
endif
include $(GNUSTEP_MAKEFILES)/library.make
include $(GNUSTEP_MAKEFILES)/tool.make
-include GNUmakefile.postamble
-32
View File
@@ -1,32 +0,0 @@
# compilation settings
libOGoContentStore_LIBRARIES_DEPEND_UPON += \
-lGDLContentStore \
-lGDLAccess \
-lNGCards \
-lNGExtensions \
-lEOControl \
-lSaxObjC \
$(BASE_LIBS)
ADDITIONAL_INCLUDE_DIRS += -I. -I.. -I../SOPE -I../SoObjects
ADDITIONAL_LIB_DIRS += -L./$(GNUSTEP_OBJ_DIR) -L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ -L../SoObjects/SOGo/SOGo.framework/
SYSTEM_LIB_DIR += -L/usr/local/lib -L/usr/lib
ifeq ($(FOUNDATION_LIB),apple)
libOGoContentStore_PREBIND_ADDR="0xC7700000"
libOGoContentStore_LDFLAGS += -seg1addr $(libOGoContentStore_PREBIND_ADDR)
endif
test_quick_extract_TOOL_LIBS += \
-lEOControl \
-lSaxObjC \
-lDOM \
-lNGExtensions \
-lNGCards \
-lGDLContentStore \
-lGDLAccess \
-lOGoContentStore \
$(BASE_LIBS)
-136
View File
@@ -1,136 +0,0 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#import <Foundation/NSArray.h>
#import <Foundation/NSDictionary.h>
#import <NGExtensions/NSNull+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import <GDLContentStore/GCSFieldExtractor.h>
#import <NGCards/NGVCard.h>
#import <NGCards/NGVList.h>
#import <SOGo/NSArray+Utilities.h>
@interface OCSContactFieldExtractor : GCSFieldExtractor
@end
@implementation OCSContactFieldExtractor
- (NSMutableDictionary *) extractQuickFieldsFromVCard: (NGVCard *) vCard
{
NSMutableDictionary *fields;
NSArray *values;
CardElement *element;
NSString *value;
fields = [NSMutableDictionary dictionaryWithCapacity: 16];
value = [vCard fn];
if (value)
[fields setObject: value forKey: @"c_cn"];
element = [vCard n];
[fields setObject: [element flattenedValueAtIndex: 0 forKey: @""]
forKey: @"c_sn"];
[fields setObject: [element flattenedValueAtIndex: 1 forKey: @""]
forKey: @"c_givenName"];
value = [vCard preferredTel];
if (value)
[fields setObject: value forKey: @"c_telephonenumber"];
value = [vCard preferredEMail];
if (![value isNotNull])
value = @"";
[fields setObject: value forKey: @"c_mail"];
element = [vCard org];
[fields setObject: [element flattenedValueAtIndex: 0 forKey: @""]
forKey: @"c_o"];
[fields setObject: [element flattenedValueAtIndex: 1 forKey: @""]
forKey: @"c_ou"];
element = [vCard preferredAdr];
if (element && ![element isVoid])
[fields setObject: [element flattenedValueAtIndex: 3
forKey: @""]
forKey: @"c_l"];
value = [[vCard uniqueChildWithTag: @"X-AIM"] flattenedValuesForKey: @""];
[fields setObject: value forKey: @"c_screenname"];
values = [[vCard categories] trimmedComponents];
if ([values count] > 0)
[fields setObject: [values componentsJoinedByString: @","]
forKey: @"c_categories"];
else
[fields setObject: [NSNull null] forKey: @"c_categories"];
[fields setObject: @"vcard" forKey: @"c_component"];
return fields;
}
- (NSMutableDictionary *) extractQuickFieldsFromVList: (NGVList *) vList
{
NSMutableDictionary *fields;
NSString *value;
fields = [NSMutableDictionary dictionaryWithCapacity: 1];
value = [vList fn];
if (value)
[fields setObject: value forKey: @"c_cn"];
[fields setObject: @"vlist" forKey: @"c_component"];
return fields;
}
- (NSMutableDictionary *) extractQuickFieldsFromContent: (NSString *) content
{
NSMutableDictionary *fields;
NGVCard *vCard;
NGVList *vList;
NSString *upperContent;
fields = nil;
if ([content length] > 0)
{
upperContent = [content uppercaseString];
if ([upperContent hasPrefix: @"BEGIN:VCARD"])
{
vCard = [NGVCard parseSingleFromSource: content];
if (vCard)
fields = [self extractQuickFieldsFromVCard: vCard];
else
[self errorWithFormat: @"Could not parse VCARD content."];
}
else if ([upperContent hasPrefix: @"BEGIN:VLIST"])
{
vList = [NGVList parseSingleFromSource: content];
if (vList)
fields = [self extractQuickFieldsFromVList: vList];
else
[self errorWithFormat: @"Could not parse VLIST content."];
}
else
[self errorWithFormat: @"Content is unknown."];
}
else
[self errorWithFormat: @"Content is empty."];
return fields;
}
@end /* OCSContactFieldExtractor */
-35
View File
@@ -1,35 +0,0 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#ifndef __OGoContentStore_OCSiCalFieldExtractor_H__
#define __OGoContentStore_OCSiCalFieldExtractor_H__
#include <GDLContentStore/GCSFieldExtractor.h>
@interface OCSiCalFieldExtractor : GCSFieldExtractor
{
}
+ (id)sharedICalFieldExtractor;
@end
#endif /* __OGoContentStore_OCSiCalFieldExtractor_H__ */
Loaded 100 of 1193 files, more files were not shown because too many files have changed in this diff. Show more