Compare commits

..
478 Commits
Author SHA1 Message Date
Francis Lachapelle 4c6c0a3644 Update ChangeLog 2016-02-05 12:16:34 -05:00
Francis Lachapelle 1c65424242 Preparation for release 2.3.8 2016-02-05 12:16:13 -05:00
Francis Lachapelle 08bf6d528b Update translations 2016-02-05 12:14:48 -05:00
Francis Lachapelle a9083004ef Update CKEditor to version 4.5.7 2016-02-05 12:11:36 -05:00
Ludovic Marcotte ec02c41d9b Updated NEWS file 2016-02-05 10:09:47 -05:00
Ludovic Marcotte 07e3c48ed0 (fix) added local memory pool 2016-02-05 10:04:25 -05:00
Ludovic Marcotte 920bfba8b8 (fix) add shared/public namespaces in the list or returned folders 2016-02-05 10:02:05 -05:00
Ludovic Marcotte bc2e46cda7 Updated NEWS file regarding PR#196 2016-02-04 10:41:21 -05:00
Ludovic Marcotte e9d24fe0e6 (fix) correctly encode filename of attachments over EAS (#3491) 2016-02-04 10:37:44 -05:00
Francis Lachapelle 24d32ae220 Merge pull request #196 from gilcn/SOGo-issue-0003321
(fix) Folders with square brackets error

Fixes #3321
2016-02-04 10:32:42 -05:00
gilcn 8baf8731b7 (fix) Bug #3321: Folders with square brackets error
http://sogo.nu/bugs/view.php?id=3321
2016-02-04 11:34:07 +01:00
Francis Lachapelle b9cdc437eb Update translations 2016-01-27 13:13:14 -05:00
Francis Lachapelle a451a1120b Preparation for release 2.3.7a 2016-01-26 11:41:59 -05:00
Francis Lachapelle 6cfed4eb67 Update translations 2016-01-26 11:14:53 -05:00
Francis Lachapelle a55c98b98d Update French translation 2016-01-26 09:19:13 -05:00
Ludovic Marcotte 7c0649efcf (fix) small i18n fixes 2016-01-26 09:07:26 -05:00
Ludovic Marcotte 0ca6512617 (fix) added missing icon + localization 2016-01-26 08:16:19 -05:00
Francis Lachapelle 3ee29c0b71 Update ChangeLog 2016-01-25 11:19:20 -05:00
Francis Lachapelle 7b4c6346f8 Preparation for release 2.3.7 2016-01-25 11:19:06 -05:00
Ludovic Marcotte d5fd719212 (doc) missing SOGoMailKeepDraftsAfterSend documentation 2016-01-25 11:08:33 -05:00
Francis Lachapelle be7971ceef Add Croatian translation 2016-01-25 10:51:09 -05:00
Ludovic Marcotte 3f0c2b647c (fix) do not try to decode non-wbxml responses for debug output (#3444) 2016-01-25 10:25:54 -05:00
Ludovic Marcotte 155acfa9a6 (feat) newly created folders using EAS are always sync'ed by default (#3454) 2016-01-25 10:21:23 -05:00
extrafu 57901b8469 Merge pull request #187 from ethoms/patch-1
fix (revised) for issue with CardDAV sync with the DAVDroid sync client.
2016-01-25 09:19:16 -05:00
ethoms 5ba476789c fix (revised) for issue with CardDAV sync with the DAVDroid sync client.
This is a revised fix for the issue raiased in sogo bug tracker 3370 and 3373. It supercedes the fix in commit  2c723070c6 .

The fix was noted in NEWS with the comment "we now return all cards when we receive an empty addressbook-query REPORT". However it did not work for me and at least two others, as can be seen in the commit comments. In summary, only contacts with email addresses were synced. The suggested change from kwirk fixes the regular address book sync, but it completely breaks syncing of the read-only Group Directory (Corporate Directory). My suggested changes work in full (as far as I'm able to test).

I have done some fairly extensive testing of CardDAV sync (with DAVDroid only) and it seems to work 100% now. In addition to the obvious tests, I have tested with contacts that only have one field of data entered. The feilds I've tested (with all other fields empty) are as follows:

First name
Last name
Display name
email address
Work (telephone)
Home (telephone)
Fax (telephone)
Mobile (telephone)

Additionally, I tested syncing of a contact with only the Work Address fully populated. In the webmail, since the name fields are all missing, the "Organization" field of the Work Address takes the place of the name field in the 'Name' column. This does get synced to my phone and it also appears my Android contact list with 'Name' set to the 'Organization' field data. The address, organization and website fields being in tact also.

In addition, I tested a Group Directory (Corporate Directory) [SOGoUserSources->isAddressBook] sync. It seems contacts without email addresses do not sync. This seems to be the behaviour across the board with a "." search filter. This happens despite the filter in SOGoUserSources including ldap entries without a mail attribute. Nothing I can do to patch this in SOGoFolder+CardDAV.m, that would have to be fixed in the code that deals with the special "." search filter (I guess).

I think the contact search system needs some looking into, particularly the "." search filter behaviour. There is another bug related to contact search in the webmail address book view. I will make a bug report on that soon. It's a shame there isn't an "all" search filter, it would seem it would make various parts of SOGo easier to get the right behaviour.
2016-01-24 03:43:24 +08:00
Ludovic Marcotte 49d5a72d65 (fix) rewrote the string sanitization to be 32-bit Unicode safe 2016-01-22 20:30:40 -05:00
Ludovic Marcotte f34aa2996d (fix) more fix regarding recurrence exceptions and body tags 2016-01-22 14:02:05 -05:00
Ludovic Marcotte 5686e086cd (fix) now always generate invitation updates when using EAS 2016-01-22 13:35:02 -05:00
Ludovic Marcotte ed9ec04669 (fix) make sure we escape control chars 2016-01-22 12:37:00 -05:00
Ludovic Marcotte 737d2ffccc (feat) UI for previously commited new feature (junk/not junk) 2016-01-22 10:32:13 -05:00
Ludovic Marcotte 7ca66b4078 (feat) new junk/not junk capability with generic SMTP integration 2016-01-22 10:30:27 -05:00
Francis Lachapelle 04c68e0674 Localization 2016-01-21 10:10:13 -05:00
Francis Lachapelle bf7f5e8be7 Localization 2016-01-20 15:09:22 -05:00
Francis Lachapelle f1d0f770df Revert "Request all contacts when no filter"
This reverts commit 1c8b693656.
2016-01-20 13:59:13 -05:00
Francis Lachapelle 596c22d828 Update ChangeLog 2016-01-18 14:17:36 -05:00
Ludovic Marcotte e223d064d9 (fix) disabled test for now since it fails on squeeze 2016-01-18 14:13:25 -05:00
Ludovic Marcotte dbf6426449 (fix) don't use false, but use NO 2016-01-18 14:05:30 -05:00
Francis Lachapelle 7fc6eec157 Update ChangeLog 2016-01-18 11:24:23 -05:00
Ludovic Marcotte f48b3405d7 (fix) old case with gcc 2016-01-18 11:14:25 -05:00
Ludovic Marcotte 52bc589ab8 (fix) re-enabled test 2016-01-18 10:50:48 -05:00
Ludovic Marcotte 03f879433b (fix) let the test compile on older gcc 2016-01-18 10:23:19 -05:00
Francis Lachapelle ad141295ed Update ChangeLog 2016-01-18 09:55:36 -05:00
Francis Lachapelle 5fef815191 Preparation for release 2.3.6 2016-01-18 09:55:21 -05:00
Francis Lachapelle ec28fdc8d0 Update ChangeLog 2016-01-18 09:51:58 -05:00
Francis Lachapelle b1590f6b2e Update translations 2016-01-18 09:51:22 -05:00
Ludovic Marcotte 800d143a35 Update NEWS file regarding PR#184 2016-01-18 09:20:41 -05:00
extrafu a503b34d7a Merge pull request #184 from zentyal/master
Fixes from Zentyal since 2015/12/30
2016-01-18 09:10:35 -05:00
Jesús García Sáez 65670027cb Merge pull request #231 from zentyal/ejhernandez/calendar-perm
Calendar folder permission roles
2016-01-18 13:49:39 +01:00
Ludovic Marcotte d5bf661cf1 (fix) avoid generating empty ConversationId which can break Android EAS 2016-01-17 06:30:02 -05:00
Ludovic Marcotte dc2878b5e2 (fix) don't generate dual Body tag for event exceptions 2016-01-16 08:33:55 -05:00
Ludovic Marcotte f9aab0de75 (fix) correctly remove the event/task 2016-01-14 14:50:58 -05:00
Francis Lachapelle 5c58299458 Update Russian translation 2016-01-14 09:10:56 -05:00
Enrique J. Hernández Blasco 57fad470fb oc-calendar: Detail limitations on setting permissions
As MAPI permission flags are much more detailed that SOGo ones.
2016-01-13 17:52:49 +01:00
Enrique J. Hernández Blasco e0b7efbbbf oc-calendar: Set simple and Detailed Free/Busy permission level
By restricting when FolderVisible right is set to the following rights:

* ReadAny
* EditAny
* DeleteAny

This goes beyond what specs says about when FolderVisible right is
mandatory but there is no more information stored in SOGo
(no possibility to set FolderVisible specific right)

See [MS-OXCPERM] Section 2.2.6 for more details
2016-01-13 17:52:48 +01:00
Enrique J. Hernández Blasco 4278e417a7 oc-calendar: Enable editor role
When Outlook sets the editor role, the FreeBusyDetailed and FreeBusySimple
right flags are set as Full Details are available.

When we store this information in SOGo, the SOGoCalendarRole_PublicModifier,
SOGoCalendarRole_PrivateModifier and SOGoCalendarRole_ConfidentialModifier
are stored as well as the free busy related roles, but as
[SOGoAppointmentFolder aclsForUser:forObjectAtPath] only returns the highest
access rights, we have to set as well the FreeBusy flags.

More details on [MS-OXCPERM] Section 2.2.6
2016-01-13 17:52:48 +01:00
Ludovic Marcotte 230688bf4e (fix) adjusted JS files regarding translation updates 2016-01-13 11:29:41 -05:00
Francis Lachapelle 1a1f74b5d0 (fix) Remove non-localized languages names 2016-01-13 10:52:36 -05:00
Francis Lachapelle 93d1c3d4e7 verify_translations.py: fix syntax error 2016-01-13 10:49:29 -05:00
Francis Lachapelle ea37a9cd29 verify_translations.py: handle JavaScript files 2016-01-13 10:48:17 -05:00
Francis Lachapelle 8e8e19666a Localization 2016-01-13 09:45:03 -05:00
Francis Lachapelle 76b4563b2f verify_translations.py: handle toolbars 2016-01-13 09:41:03 -05:00
Francis Lachapelle 4ce3947e60 Fix localizable strings (templates, JavaScript) 2016-01-13 09:26:21 -05:00
Francis Lachapelle 0a8f52ce7d Update Russian translation 2016-01-13 09:17:20 -05:00
Enrique J. Hernández 9bb2473c8e Merge pull request #233 from zentyal/jgarcia/delete-attach-after-fail
Do not include failure attachments (really long filenames)
2016-01-13 12:08:58 +01:00
Jesús García Sáez 2d5995a8f4 Merge pull request #213 from zentyal/jamor/unittest-merge
Add RTFHandler unittest
2016-01-12 18:35:43 +01:00
Jesús García Sáez cee83df085 Merge pull request #232 from zentyal/ejhernandez/junit-output
Give support to JUnit output format for sogo-tests
2016-01-12 18:29:49 +01:00
Enrique J. Hernández Blasco 0c5f4edb36 Give support to JUnit output format for sogo-tests
To integrate with CI system.

sogo-tests now accepts a flag (-f) to determine the output format:

  * text : Current behaviour and default value
  * junit: XML output suitable for CI system such as Jenkins
2016-01-12 16:14:30 +01:00
Jesús García Sáez 90378b76eb draft: remove attachment on failure
Attachment creation can succeed and attachment mime file could fail

This can happen, e.g., when the filename's length is close to the maximum
allowed but your filesystem and then mime file will exceed that limit
(because it has a prefix).
2016-01-12 16:10:39 +01:00
Enrique J. Hernández 6aeb13ba65 Merge pull request #227 from zentyal/jgarcia/qp-encode-subjects
Fix encoding of subjects of emails with non-ascii characters
2016-01-12 16:04:42 +01:00
Francis Lachapelle 216371fd80 Russian localization
Fixes #3383
2016-01-11 09:47:27 -05:00
Jesús García Sáez 5927d3303c Merge pull request #230 from zentyal/ejhernandez/debug-rc
oc: Print retval on high debug for library interface
2016-01-11 09:33:29 +01:00
Ludovic Marcotte 6a3e64f849 (fix) when deleting an event using EAS, properly invoke the auto-scheduling code 2016-01-08 13:12:00 -05:00
Ludovic Marcotte 490043b2e1 (fix) we now follow 301 redirects when fetching ICS calendars 2016-01-08 12:02:33 -05:00
Ludovic Marcotte 210d6908b8 (fix) Fixed DomainLessLogin logins in multi-domain 2016-01-08 11:39:19 -05:00
Ludovic Marcotte ca7f093155 (fix) properly escape the UID too 2016-01-07 11:12:33 -05:00
Enrique J. Hernández 2ad00f8cef Merge pull request #229 from zentyal/jvalles/missing-appointment-notifications
Add the domain in the `uidInDomain` method
2016-01-07 16:42:03 +01:00
Ludovic Marcotte b5780357cb (fix) updated NEWS file 2016-01-07 10:00:45 -05:00
Ludovic Marcotte 67f38e1127 (fix) don't escape twice (#3423) 2016-01-07 09:58:44 -05:00
Ludovic Marcotte 36985a19e9 (feat) UI for previous commit 2016-01-07 09:17:46 -05:00
Ludovic Marcotte 06cbe527e8 (feat) Now able to sync only default mail folders when using EAS 2016-01-07 09:17:35 -05:00
Francis Lachapelle 51dbfaba15 Improve verification of SOGoLoginDomains array 2016-01-06 09:52:15 -05:00
Francis Lachapelle 3d55396661 Update ChangeLog 2016-01-05 14:33:12 -05:00
Francis Lachapelle 2c97b680a8 Preparation for release 2.3.5 2016-01-05 14:33:01 -05:00
Francis Lachapelle f9cb896f92 Update Russian translation
Fixes #3383
2016-01-05 14:08:05 -05:00
Francis Lachapelle 46edcce1d5 Don't try to translate "SOGo" 2016-01-05 14:01:27 -05:00
Francis Lachapelle 1b14fee96e Localization 2016-01-05 13:56:40 -05:00
Francis Lachapelle 0777e9fe67 Fix Danish localization
Fixes #3422
2016-01-05 13:44:20 -05:00
Enrique J. Hernández Blasco 8b078817e2 oc: Print retval on high debug for library interface
When exiting a library function
2016-01-04 09:38:10 +01:00
Ludovic Marcotte dd56d5e85c Updated NEWS file regarding the merge of PR #180 2015-12-30 09:08:38 -05:00
Ludovic Marcotte e009af6864 Merge branch 'v2' of https://github.com/inverse-inc/sogo into v2 2015-12-30 09:06:13 -05:00
extrafu 673db179b1 Merge pull request #180 from zentyal/master
Fixes from Zentyal since 2015/10/29
2015-12-30 09:06:15 -05:00
Ludovic Marcotte fd0f1499b1 Merge branch 'v2' of https://github.com/inverse-inc/sogo into v2 2015-12-30 08:57:08 -05:00
Jesús García Sáez 20575226b8 Merge pull request #221 from zentyal/jvalles/time-shifts-in-events
oc-calendar: Use the time zone provided by the client
2015-12-30 11:24:39 +01:00
Enrique J. Hernández 8b04a468c2 Merge pull request #223 from inverse-inc/v2
SOGo v2.3.4
2015-12-29 22:41:02 +01:00
Juan Vallés ccd9e385a0 Add the domain in the uidInDomain method
This method is used to get the login and we weren't returning
the domain, which led to problems when creating appointments
on multidomain environments like, for instance, not sending
the invitation mails.
2015-12-29 12:19:07 +01:00
Juan Vallés 376e717f45 oc-calendar: Use the calendar's time zone if it is present
If the event was created by the MAPI client, the client's time zone (if
present) is assigned to the event's calendar in iCalEvent+MAPIStore.
This way, we can use it to deliver the event's properties correctly.
2015-12-23 17:27:10 +01:00
Jesús García Sáez 5b25f85c02 Merge pull request #228 from zentyal/ejhernandez/fix-editor-perm
oc: Set Editor as role is now possible in Outlook
2015-12-23 15:54:56 +01:00
Jesús García Sáez 63b8c3ed5e Merge pull request #226 from zentyal/ejhernandez/return-rc-message-submit
oc-mail: Return error when delivery was not successful
2015-12-23 15:43:54 +01:00
Jesús García Sáez c76c48fb0c Merge pull request #225 from zentyal/ejhernandez/sogo-oc-samba-4.1
oc: Do compile with Samba 4.1
2015-12-23 15:37:03 +01:00
Enrique J. Hernández Blasco 7fe1b5f046 oc: Do compile with Samba 4.1
As requested by @extrafu to maintain sogo packages for a little while
2015-12-23 15:34:17 +01:00
Jesús García Sáez 2a25675b3a Merge pull request #220 from zentyal/ejhernandez/improve-dbmsgreader
oc: Dump property canonical name in dbmsgreader
2015-12-23 15:05:37 +01:00
Enrique J. Hernández Blasco dbfd86db04 oc: Set Editor as role is now possible in Outlook
According to [MS-OXCPERM] Section 2.2.7 in PidTagMemberRights possible
values, once we set the DeleteAny flag, the DeleteOwned flag must be set.
Likewise EditOwned must be set when EditAny is set. In this way,
the rights sent by the MAPI client are equal to the returned by the
server when Editor is set.

In real world practice, makes more strict Outlook 2013 work with editor permissions
the sharing of user's defined calendars, tasks or contacts folders as
the recipients can be editors of that folder.
2015-12-23 00:27:09 +01:00
Francis Lachapelle 135535e00e Update NEWS file 2015-12-22 14:25:00 -05:00
Francis Lachapelle e386404b0a Properly compute the last week number for the year
Fixes #1010
2015-12-22 14:21:37 -05:00
Jesús García Sáez 966d13c5b6 Merge pull request #219 from zentyal/ejhernandez/mult-cn-restriction
Manage multiple Change Number restrictions
2015-12-22 17:14:53 +01:00
Juan Vallés 4ae5feb131 oc-calendar: Extract time zone from TimeZoneDefinition
All-day and recurrent events have a binary property that describes the
time zone they take place in. We were using the user's time zone in
the webmail, but it may not be equal to the one in the client. This
difference eventually leads to time shifts in events.
2015-12-22 16:05:23 +01:00
Jesús García Sáez db213c2b73 unittest: just reformat and indentation
no real changes
2015-12-22 11:48:35 +01:00
Jesús García Sáez c2922e2a26 unittest: QP encode function from NGMimeHeaderFieldGenerator 2015-12-22 11:48:34 +01:00
Jesús García Sáez 1529e7ec4e unittest: compare properly decimal numbers 2015-12-22 11:48:34 +01:00
Juan Vallés 332508e2db oc-calendar: Use signed integer for time zone biases
This change adapts the bias fields in the TimeZoneStruct and TZRule
structures to the changes in openchange that allow this offsets to be
negative (zentyal/openchange bba372faea29d942b9471e6bed90bf425dc4b231)
2015-12-22 11:40:59 +01:00
Juan Vallés d2ea6fef2e oc-calendar: Initialise NSCalendarDate with a SYSTEMTIME struct
The method computes the date of a SYSTEMTIME structure, in which the day
within the month is given by the Nth occurrence of a weekday (see
[MS-OXOCAL] 2.2.1.39).
2015-12-22 11:40:59 +01:00
Jesús García Sáez 75ff4af7cc Use new function from sope to qp-encode the subject 2015-12-21 17:09:11 +01:00
Enrique J. Hernández Blasco 916c04387b oc-mail: Return error when delivery was not successful
For example, if the SMTP is down, then the message is not sent and
an error is returned. We returned back this error code to be managed
by upper layer.
2015-12-18 12:23:49 +01:00
Ludovic Marcotte 7c460b694e Enable new code. 2015-12-16 08:32:20 -05:00
Ludovic Marcotte 29f2d960a7 Enable old code. 2015-12-15 16:15:48 -05:00
Ludovic Marcotte 225fe847a7 Disabled today's code for now. It requires more testing. 2015-12-15 16:12:17 -05:00
Ludovic Marcotte 720b1d5ab5 (fix) carry over delegatedFrom too 2015-12-15 15:21:33 -05:00
Ludovic Marcotte 28bd4ca318 (fix) carry over the delegatedTo, not only the part stat 2015-12-15 15:05:40 -05:00
Francis Lachapelle c6dbcb2f7c Update ChangeLog 2015-12-15 14:24:25 -05:00
Francis Lachapelle 5dfbfe827d Preparation for release 2.3.4 2015-12-15 14:24:12 -05:00
Francis Lachapelle 6ddb40fd2b Update CKEditor to version 4.5.6 2015-12-15 14:20:57 -05:00
Francis Lachapelle 37f29c06ea Localization 2015-12-15 13:18:06 -05:00
Ludovic Marcotte 248892c394 (fix) small fix over previous commit 2015-12-15 11:14:58 -05:00
Ludovic Marcotte b4e4b9c29f (fix) avoid duplicating attendees when accepting event using a different identity over CalDAV 2015-12-15 11:08:59 -05:00
Francis Lachapelle e94b4416f8 Localization cleanup 2015-12-15 10:05:21 -05:00
Francis Lachapelle 8d19ec4aff Remove duplicate key in MainUI localization 2015-12-15 09:55:51 -05:00
Enrique J. Hernández aeeeeea802 Merge pull request #216 from zentyal/jag/fix-i18n-attachment-names
Priorize filename attribute first to get attachment name
2015-12-15 11:44:26 +01:00
Javier Amor García 41e388c5f6 sogo-mail: Priorize filename attribute to get attachment name
Some clients (such apple mail) use only the filename
attribute in the content/disposition header and the
name attribute from the content/type header is filled with
uninternationalized characters.

Example:

Content-Type: application/msword;
x-apple-part-url=C4977556-0D01-4C6C-8A51-451E0AADE431;
name=_______.doc
Content-Disposition: attachment;
filename*=utf-8''%D0%A0%D0%95%D0%9A%D0%92%D0%98%D0%97%D0%98.doc

This changeset gives priority to the filename attribute.
2015-12-15 08:01:21 +01:00
Enrique J. Hernández Blasco db17872dd6 oc: Dump property canonical name in dbmsgreader 2015-12-14 23:39:32 +01:00
Enrique J. Hernández 73e86bb8e5 Merge pull request #217 from zentyal/jgarcia/fix-contacts-listing
Request all contacts when there is no filter
2015-12-14 14:53:33 +01:00
Enrique J. Hernández c3bce410f1 Merge pull request #215 from zentyal/jgarcia/fix-contacts-outlook
Fix contacts on outlook
2015-12-14 11:06:37 +01:00
Ludovic Marcotte 980db7a980 (fix #127) fallback to "work" when export as ldif 2015-12-11 14:51:08 -05:00
Ludovic Marcotte c5c6ff33d8 (fix #119) disable servername and url by default 2015-12-11 14:11:26 -05:00
Ludovic Marcotte 7e1bbe34dc (fix #118) handle /.well-known/carddav 2015-12-11 14:03:50 -05:00
Enrique J. Hernández Blasco a618386d5e oc-db: Store version number instead of CN
To be able to search in this for every kind of operator.

As we cannot do a migration, we have to add a new key to the property
dictionary (@"version_number") which stores the version:

  version = exchange_globcnt(CN >> 16)

Instead of the CN structure which is stored in @"version" key.

This way we can do searches for CN to download only missing data from the
given state of the client for this kind of messages.
2015-12-11 11:38:21 +01:00
Enrique J. Hernández Blasco 5993fe97c3 oc-db: Implement description message to ease debugging
Which dumps the properties NSMutableDictionary
2015-12-11 11:37:02 +01:00
Enrique J. Hernández Blasco 7cdf48335b oc: Support every operator for CN restriction
No limitation is found in SQL queries. So use them all.
2015-12-11 11:35:55 +01:00
Enrique J. Hernández Blasco 3dff73636c oc: Use NSString index for version lookup
It was using NSNumber in versions Dictionary for GCSMessages but it is
stored as the NSString representation (0x390300000000001), so the lookup
has always failed.
2015-12-11 11:33:41 +01:00
Enrique J. Hernández Blasco 2fc21e48d8 oc: Use proper variable name for last modified value 2015-12-11 11:31:15 +01:00
Enrique J. Hernández Blasco 98ed9c3b17 oc-mail: Manage multiple CN restriction
By ignoring <, =< and = operators and simplifying the following
request:

    MODSEQ >= x || MODSEQ >= y || MODSEQ >= z  --> MODSEQ >= min(x, y, z)

This hack will reduce the number of current retrieved UID keys
from the IMAP server. Current status is to retrieve everything when
the multiple CN restriction is sent as the required restriction
is too complex and it is not defined by the IMAP spec.

The proper implementation for:

    CN > x_1 & CN < x_2 | CN > y_1 & CN < y_2 | CN > z_1

It will be something like this:

    set(MODSEQ >= x_1 + 1) - set(MODSEQ >= x_2)
    U
    set(MODSEQ >= y_1 + 1) - set(MODSEQ >= y_2)
    U
    set(MODSEQ >= z_1)

Assuming x_1 <= x_2 <= y_1 <= y_2 <= z_1.
2015-12-11 11:22:26 +01:00
Ludovic Marcotte f9884e3f55 (fix) added new strings from v3 2015-12-10 14:12:33 -05:00
Enrique J. Hernández Blasco 10cabca57e oc: Use ReplicaID from connection info
Instead of hardcoding it to 0x0001.
2015-12-10 16:36:22 +01:00
Jesús García Sáez 2e1ed274c8 unittest: fix TestNGMailAddressParser
It had wrong expectation strings
2015-12-09 20:02:57 +01:00
Jesús García Sáez e4cd451be8 unittest: removed TestNGMimeAddressHeaderFieldGenerator
Needs redo
2015-12-09 20:02:56 +01:00
Javier Amor García 603da75818 Added test for spanish characters 2015-12-09 20:02:56 +01:00
Javier Amor García 9ed3812795 Added test for character escape 2015-12-09 20:02:55 +01:00
Javier Amor García a0b15d0c8c Test for [RTFHandler parseFontTable]
This changeset includes changes in relevant classes to make
them easier to test.
2015-12-09 20:02:55 +01:00
Javier Amor García 7e4571874e Added test for RTF with russian characters
Changed and refactored TestRTFHandler helper methods
2015-12-09 20:02:54 +01:00
Javier Amor García b076801e1b Added test fixture for RTF crash 6977 2015-12-09 20:02:54 +01:00
Jesús García Sáez 0316e441fc unittest: RTF without color table definition 2015-12-09 20:02:53 +01:00
Jesús García Sáez 75208428dd unittest: New unittest with a rtf file
This currently sigfault due to bad parsing a \*\shppict tag
with a \binXXXX tag inside it
2015-12-09 20:02:53 +01:00
Jesús García Sáez 942f48c9a0 unittest: RTF with \pict 2015-12-09 20:02:52 +01:00
Jesús García Sáez 24a7515bb5 unittest: file as NSData and try different encodings 2015-12-09 20:02:51 +01:00
Jesús García Sáez a8e5a3c025 unittest: NSString objectFromJSONString for single values 2015-12-09 20:02:51 +01:00
Jesús García Sáez 0b69727a49 unittest: add rtf test 2015-12-09 20:02:50 +01:00
Jesús García Sáez 2a2d141629 unittest: rtf, test crash core dump 2015-12-09 20:02:48 +01:00
Jesús García Sáez b98d112738 unittest: commented failing test 2015-12-09 20:02:28 +01:00
Jesús García Sáez 1c8b693656 Request all contacts when there is no filter 2015-12-09 13:07:30 +01:00
Francis Lachapelle 15ab0f851d Localization 2015-12-08 10:05:19 -05:00
Ludovic Marcotte 1f98d7cced (fix) fixed broken translations 2015-12-03 15:40:38 -05:00
Ludovic Marcotte 2755a83e65 (fix) remove trailing semicolon everywhere 2015-12-03 15:02:01 -05:00
Francis Lachapelle 9936477f07 Update translations 2015-12-03 13:09:24 -05:00
Enrique J. Hernández 2e1bfb25d5 Merge pull request #210 from zentyal/cperez/ldapsource-refactor
Unify user sources API
2015-12-03 17:15:20 +01:00
Jesús García Sáez 25dbce42cd Reorganize methods according to MS-OXOCNTC
Nothing has been change but this way is much more readable
2015-12-03 16:58:58 +01:00
Jesús García Sáez a9fe80c367 oc-contacts: don't return empty values
If the property has an empty string, return not found
2015-12-03 16:58:58 +01:00
Jesús García Sáez bc5aa3cacb Whitespaces and indentation
No real changes
2015-12-03 16:58:58 +01:00
Jesús García Sáez 0ddbd79fad Remove commented code
These methods don't make any sense here
2015-12-03 16:58:57 +01:00
Jesús García Sáez 2a3367a13b oc-contacts: returning properly personal contacts
We needed to return AddressBookProviderEmailList,
AddressBookProviderArrayType and Email1OriginalEntryId to
make it compatible with the standard.

Besides a refactorization to return better EmailNFoobar properties
2015-12-03 16:58:57 +01:00
Carlos Pérez-Aradros Herce 4b7cbba0c8 Merge pull request #214 from zentyal/ejhernandez/no-crash-after-reconnect
oc-mail: Do not crash after reconnect sending mails
2015-12-03 14:27:07 +01:00
Enrique J. Hernández Blasco 2deda01e5c oc-mail: Do not crash after reconnect sending mails
After the providing the workaround on rebuilding the LDAP connection,
the sam_ctx variable can be freed and it was used as memory context
to store the AddressBookEntryId or OneOffEntryId when resolving
recipients. After this changeset, a local memory context which I
think is more sane.
2015-12-02 16:06:31 +01:00
Ludovic Marcotte 8c0ef9cf50 (fix) proper fix for #3389 2015-12-01 11:42:02 -05:00
Ludovic Marcotte 8456d49686 Revert "(fix) fixed addressbrook-only source entires having a c_uid set"
This reverts commit ef7de7c10d.
2015-12-01 11:39:07 -05:00
Ludovic Marcotte 5a3cafbbb0 (fix) prevent characters in calendar component UID causing issues during import process 2015-12-01 09:26:52 -05:00
Ludovic Marcotte dc085789e7 (feat) Initial support for EAS calendar exceptions 2015-11-30 09:19:01 -05:00
Enrique J. Hernández f6973d8aa4 Merge pull request #209 from zentyal/jag/rtf-parser-fix-unicode
RTFHandler fixes with focus in unicode and characters set
2015-11-30 12:20:04 +01:00
Javier Amor García 94d4da6e1e Reimplemented [RTFHandler parse] to have an unambiguous decoding of control words
[RTFHandler parseFontTable] reimplemented on the same line.
2015-11-27 17:49:01 +01:00
Javier Amor García 2f63542e07 Fixed problem with ascii chars that had different unicode value
Also cleaned a bit the parse loop
2015-11-27 17:49:01 +01:00
Javier Amor García 3155bd0172 Fixed bug which created unnecesary font tags 2015-11-27 17:34:08 +01:00
Javier Amor García 2518b37e32 Fixed RTF support for unicode characters greater than 32767 2015-11-27 17:34:08 +01:00
Javier Amor García 8e3e4a5445 Added RTF escapes parsing 2015-11-27 17:34:07 +01:00
Javier Amor García 01dcf3d6c8 Fixed activation of characters sets in [RTFHandler parse] 2015-11-27 17:34:07 +01:00
Javier Amor García fa4d3a0e20 Reimplementation of [RTFHandler parseFontTable] 2015-11-27 17:34:06 +01:00
Francis Lachapelle bbdb27e75e (css) Enlarge max width of toolbar buttons 2015-11-27 08:36:34 -05:00
Ludovic Marcotte 1279629e86 (fix) correctly handle all-day event exceptions when the master event changes 2015-11-25 15:53:08 -05:00
Ludovic Marcotte f7d748ea98 (fix) EAS fix on qp-encoded subjects (#3390) 2015-11-25 15:08:24 -05:00
Ludovic Marcotte 2d1a4b320c (fix) adjust doc and packaging regarding oc cleanup script 2015-11-25 10:56:39 -05:00
Jesús García Sáez e8e610c7b3 Merge pull request #212 from zentyal/safe-ldb-search
Adapt to new safe_ldb_search function
2015-11-25 12:12:28 +01:00
Ludovic Marcotte 8df311547f (fix) EAS fix for wrong charset being used (#3392) 2015-11-23 18:07:50 -05:00
Francis Lachapelle f42d6f5f4a Enlarge size of event/task editor window
Fixes #3381
2015-11-23 13:29:02 -05:00
Ludovic Marcotte 01642eca3e (fix) fixed one unit test 2015-11-23 13:20:55 -05:00
Carlos Pérez-Aradros Herce 9554e92c8b Adapt to new safe_ldb_search function 2015-11-23 17:01:35 +01:00
Francis Lachapelle 2ae8c6f8b2 Add missing tooltips on buttons of toolbars 2015-11-23 10:33:03 -05:00
Enrique J. Hernández f64b324133 Merge pull request #203 from inverse-inc/v2
Merge from upstream
2015-11-23 12:51:52 +01:00
Ludovic Marcotte 31deae11b4 (fix) domain in doc 2015-11-20 11:21:38 -05:00
extrafu 19676593ea (fix) allow getting password from context for OC 2015-11-19 17:57:04 -05:00
Francis Lachapelle 4a27beabdd (css) Limit toolbar buttons min/max width 2015-11-19 09:46:07 -05:00
Francis Lachapelle 8dae5faaa1 Localization 2015-11-19 09:41:36 -05:00
Francis Lachapelle 85ce41dc68 (fix) JS exception when printing calendars
Fixes #3203
2015-11-19 09:23:46 -05:00
Enrique J. Hernández 0622980f38 Merge pull request #205 from zentyal/jag/dont-sync-contact-group-from-sogo
Do not save IPM.DistList messages
2015-11-19 10:39:59 +01:00
Javier Amor García a73df96b78 [MAPIStoreGCSMessage getPidTagChangeKey:inMemCtx:] return on error
This method aborted when no PidTagChangeKey was found and the new flag was not
set. Now it returns MAPISTORE_ERR_NOT_FOUND.
2015-11-18 18:25:24 +01:00
Francis Lachapelle 7015713741 Update ChangeLog 2015-11-18 09:43:02 -05:00
Francis Lachapelle 7644d6fb4d Preparation for release 2.3.3a 2015-11-18 09:42:05 -05:00
Enrique J. Hernández 9dcf459827 Merge pull request #207 from zentyal/jag/idl-compile-warnings
sogo-openchange: Avoid compile warnings after changes in exchange.idl
2015-11-18 14:47:36 +01:00
Enrique J. Hernández 4c7bd6dd76 Merge pull request #208 from zentyal/jgarcia/wocontext-fun
User context activation when cached
2015-11-18 06:56:16 +01:00
Carlos Pérez-Aradros Herce ec598321c4 Add user defined user source 2015-11-16 17:43:52 +01:00
Francis Lachapelle 4b8a9bcc3b Always show user's name in top banner 2015-11-16 09:02:37 -05:00
Francis Lachapelle a9984d9487 Fix regression when saving mail folders state 2015-11-16 09:01:05 -05:00
Javier Amor García 88a74bcb5c Do not save IPM.DistList messages 2015-11-16 13:56:31 +01:00
Francis Lachapelle 2a90102a81 Update translations 2015-11-11 15:51:33 -05:00
Francis Lachapelle fbc73dc3bc Update ChangeLog 2015-11-11 14:06:11 -05:00
Francis Lachapelle 1d78b2df96 Preparation for release 2.3.3 2015-11-11 14:04:19 -05:00
Francis Lachapelle 6aef713d28 Update prototype.js to v1.7.3 2015-11-11 14:02:25 -05:00
Francis Lachapelle 71db3945cb Update CKEditor to version 4.5.4 2015-11-11 14:01:30 -05:00
Francis Lachapelle da230410be Handle ExpandedFolders settings like in v3
This implies a transition where ExpandedFolders can be either a string
or an array.
2015-11-11 13:31:58 -05:00
Francis Lachapelle 82114f75aa Fix Macedonian et Portuguese translations 2015-11-11 12:58:26 -05:00
Francis Lachapelle f8d31a6413 Update NEWS file 2015-11-11 12:04:19 -05:00
Francis Lachapelle 707aabde15 Update Slovenian translation 2015-11-11 12:04:04 -05:00
Francis Lachapelle ceec497aec Fix Portuguese translation 2015-11-11 11:50:32 -05:00
Francis Lachapelle 46f93d8629 Fix Macedonian translation 2015-11-11 11:50:06 -05:00
Francis Lachapelle f2347e13d7 Fix localizable strings in contact editor 2015-11-11 11:49:36 -05:00
Francis Lachapelle 106f8ec314 Improve Portuguese translation 2015-11-11 09:46:21 -05:00
Francis Lachapelle f58554a700 Add Macedonian translation 2015-11-11 09:46:01 -05:00
Francis Lachapelle 76b8de1805 Add Portuguese translation 2015-11-10 16:33:11 -05:00
Enrique J. Hernández 0751c51b89 Merge pull request #204 from zentyal/jvalles/event-invitation-subjects
oc-calendar: Make invitation/update mails have the event name as subject
2015-11-09 23:35:22 +01:00
Ludovic Marcotte 64456c10e5 (fix) additional fix for #3356 2015-11-09 14:30:58 -05:00
Jesús García Sáez 5f5b5d9273 oc: activate user context on initialization (for real)
Even with cached ones (completes cfab18e1b8)
2015-11-09 19:56:05 +01:00
Jesús García Sáez 194c415631 Log an error for SOGoObject without wocontext 2015-11-09 19:55:55 +01:00
Javier Amor García 08f05ac2ef sogo-openchange: Avoid compile warnings after changes in exchange.idl
The changes in the exchange.idl file from OpenChange has changed
some string pointers from 'const char *' to 'uint8_t *'.
This changeset cast them to avoid compilation warnings.
2015-11-09 19:08:51 +01:00
Jesús García Sáez af413f2b32 Merge pull request #202 from zentyal/ejhernandez/workaround-sync-configure-crash
Workaround sync configure crashes
2015-11-09 11:34:29 +01:00
Enrique J. Hernández Blasco 77bba8e5ea Use application context when initialising quick tables ACLs
As the stored context from initialisation may have changed
by `setContext` by other operations when acting as a OpenChange
library. This would make having a login set to nil and forcing
a NSException when it attempts to set a nil key at
[SOGoAppointmentFolder:roleForComponentsWithAccessClass:forUser]
inside [SOGoAppointmentFolder:initializeQuickTablesAclsInContext].
2015-11-09 11:30:03 +01:00
Juan Vallés 946665ff49 oc-calendar: Make invitation/update mails have the event name as subject
SOGo event notification mails add information to the event name in their
subject (e.g. _Event invitation: "foo"_). The client uses the mail
subject to create a copy of the event on the attendee's calendar, so we
need to strip out that extra information if we want the event to have
the proper name.
2015-11-09 10:28:46 +01:00
Ludovic Marcotte ef7de7c10d (fix) fixed addressbrook-only source entires having a c_uid set 2015-11-06 13:33:36 -05:00
Francis Lachapelle 106c6a24ae (js) Fix dialogs when partially visible
Fixes #2646, #3378
2015-11-06 09:42:09 -05:00
Ludovic Marcotte 863f182e84 (fix) fixed wrong comparison of meta vs. META tag in HTML mails 2015-11-06 09:25:49 -05:00
Francis Lachapelle ba37353e42 (fix) Position of popup menu
Fixes #3381
2015-11-06 09:15:23 -05:00
Francis Lachapelle 1915748e33 Bump version to 2.3.3 2015-11-06 09:15:23 -05:00
Ludovic Marcotte b170ae866f (fix) small fixes 2015-11-06 09:01:33 -05:00
Francis Lachapelle 7c69e37449 (fix) JavaScript syntax error in attendees editor 2015-11-06 08:45:42 -05:00
Ludovic Marcotte 7f26d47cd1 We drop Lucid. 2015-11-05 15:39:08 -05:00
Ludovic Marcotte b55ec52bfe (fix) handle emails having an attachment as their content 2015-11-05 15:21:13 -05:00
Ludovic Marcotte f919df050a (fix) one more fix for #3118 2015-11-05 14:58:58 -05:00
Ludovic Marcotte c2e4f7441d (fix) double declaration of same method 2015-11-05 13:57:51 -05:00
Ludovic Marcotte ca27464984 (fix) added type cast 2015-11-05 13:43:48 -05:00
extrafu 6cbc5573a1 Merge pull request #121 from ethoms/clang-warnings-stage1v2
Stage1b (v2 branch) of clang compiler warning patches.
2015-11-05 13:41:50 -05:00
Euan Thoms e4fae417b9 Stage 8 of clang compiler warning patches.
Update WORequest+SOGo.m
2015-11-05 13:30:40 -05:00
Carlos Pérez-Aradros Herce a6bbe13f9b Add missing header files 2015-11-05 19:11:19 +01:00
Jesús García Sáez 8cfb0f0d44 Avoid inserting second email for Contacts
When we have a contact with an email, avoid generating another one
with SOGoMailDomain value (normally we ended up with a contact with
two identical emails on 'emails' key and for multidomain source we
would had ended up with an email @localhost)
2015-11-05 19:11:19 +01:00
Jesús García Sáez 08f57f6ad5 SOGoUserManager: get domain after authentication
For multidomain source which has no domain defined, we get
the domain from the username which must have @domain as suffix
2015-11-05 19:11:19 +01:00
Jesús García Sáez 30a94161af SOGoUserManager.m: format and small refactor
Removed all tabs used for indentation
2015-11-05 19:11:19 +01:00
Jesús García Sáez ec533809aa return enableDomainBasedUID based only on the key 2015-11-05 19:11:19 +01:00
Jesús García Sáez 0d05e3579c defaultsForDomain return sharedSystemDefaults for unknown domains 2015-11-05 19:11:19 +01:00
Jesús García Sáez bf4a581d0f Added isDomainDefined
To check whether a domain is supported by our defined sources
2015-11-05 19:11:19 +01:00
Jesús García Sáez 9d3f3c619d LDAPSource: release displayName on dealloc 2015-11-05 19:11:19 +01:00
Jesús García Sáez 7d49674d9d Add domain to lookupContactEntry 2015-11-05 19:11:19 +01:00
Jesús García Sáez 48832a4878 Add domain to lookupGroupEntryByUID/ByEmail 2015-11-05 19:11:19 +01:00
Euan Thoms eda84c7b5d Stage1b (v2 branch) of clang compiler warning patches. 2015-11-06 01:29:26 +08:00
Ludovic Marcotte 9d31023724 (fix) additional fix for #3118 2015-11-05 11:11:18 -05:00
Ludovic Marcotte 41e80bb105 Updated NEWS file regarding PR#120 2015-11-05 09:48:17 -05:00
extrafu e428e74e6c Merge pull request #120 from zentyal/master
Fixes for OpenChange integration from Zentyal
2015-11-05 09:45:51 -05:00
Ludovic Marcotte 7a5e550510 (fix) manually added patch from PR#113 to avoid many "broken" commits 2015-11-05 09:36:11 -05:00
Euan Thoms 0605fdf02a Delete .orig files left over from applying patches to Stage 2. 2015-11-04 13:50:16 -05:00
Euan Thoms d3290dbb8d Stage 2 of clang compiler warning patches. 2015-11-04 13:50:05 -05:00
Ludovic Marcotte 34f626b84c (fix) small fixes around web calendars + sync 2015-11-04 09:21:42 -05:00
Euan Thoms e173c6d621 Stage 9 of clang compiler warning patches. 2015-11-04 08:42:03 -05:00
Euan Thoms 1425bb1c75 Stage 5 of clang compiler warning patches. 2015-11-04 08:41:49 -05:00
Euan Thoms 5b65eaa572 Stage 4 of clang compiler warning patches. 2015-11-04 08:41:36 -05:00
Euan Thoms 892bd693d7 Stage 3 of clang compiler warning patches.
Conflicts:

	UI/PreferencesUI/UIxJSONPreferences.m
2015-11-04 08:41:19 -05:00
Francis Lachapelle 6812cb08dc Display missing events when printing working hours 2015-11-03 09:00:19 -05:00
Francis Lachapelle b62167dd00 Fix Brazilian (Portuguese) translation
Fixes #3355
2015-11-03 08:27:50 -05:00
Enrique J. Hernández Blasco e0d49d2407 oc-mail: Check the number of uids fetched on synchroniseCache
Equals to the number of uids requested.

There are corner-cases when this is not happening, we don't know yet
why this is happening but IMAP server log should do the trick.

This avoids to launch a NSException trying to access an element
outside the array bounds.
2015-10-29 23:04:42 +01:00
Jesús García Sáez c8d05d41a5 Merge pull request #201 from zentyal/ejhernandez/sync-expunged-msgs-first-sync
oc-mail: Sync expunged messages on first cache sync
2015-10-26 19:37:01 +01:00
Ludovic Marcotte 1013c473cd (feat) support for ghosted elements on contacts over EAS 2015-10-26 10:25:11 -04:00
Ludovic Marcotte b8d77259cd (feat) we now save the supported elements in EAS collections 2015-10-26 10:15:35 -04:00
Ludovic Marcotte 40cb81fd0b (fix) prevent postal address showing on single line over EAS (#2614) 2015-10-26 10:08:00 -04:00
Jesús García Sáez 2937ba7f30 Merge pull request #200 from zentyal/ejhernandez/always-increase-cn-set-message-read-flag
oc-mail: Always increase the CN when setting the message read flag
2015-10-26 14:38:29 +01:00
Jesús García Sáez 3c6fb10d9f Merge pull request #199 from zentyal/jvalles/missing-calendar-metadata
oc-calendar: force cache synchronisation for a message before aborting
2015-10-26 14:30:38 +01:00
Ludovic Marcotte b378d258cb (fix) add unit test from PR #105 2015-10-23 15:54:33 -04:00
Ludovic Marcotte 3ba1e33eb6 (fix) perms fixes on scripts 2015-10-23 15:39:49 -04:00
Ludovic Marcotte 40a1d5fdbf (fix) inline images sent from SOGo webmail are not displayed in Mozilla Thunderbird (#3271) 2015-10-23 14:34:19 -04:00
Ludovic Marcotte 1b44218a35 (fix) avoid crash when replying to a mail with no recipients (#3359) 2015-10-23 12:44:43 -04:00
Ludovic Marcotte df211af604 (fix) fixed br_pt translation + updated transifex (#3355) 2015-10-23 11:32:04 -04:00
Ludovic Marcotte 2c723070c6 (fix) we now return all cards when we receive an empty addressbook-query REPORT 2015-10-21 10:54:15 -04:00
Enrique J. Hernández Blasco 6f5bb3882c oc-mail: Sync expunged messages on first cache sync
There is a use case where this has caused crashes:

A message was hard-deleted using an IMAP client, this is the first
message you deleted in that folder and you have cleared offline
items in the client so a full sync is asked by upper layer.

In that situation, the SyncLastDeleteChangeNumber version property
is not set and return 0 in [getDeletedKeysFromChangeNumber:andCN:inTableType]
making OpenChange to crash while it is asking for deleted fmids
since a given change number.

This is a regression from 18d7070c4a.
2015-10-21 11:24:14 +02:00
Ludovic Marcotte fc9b175f25 (feat) now possible to choose which folders to sync over EAS 2015-10-20 15:33:18 -04:00
Ludovic Marcotte 1716e46210 (fix) last fixes for cache coherency 2015-10-20 08:48:39 -04:00
Juan Vallés 8800cdf641 oc-calendar: force cache synchronisation for a message before aborting
Sometimes we're trying to get the `objectVersion` of a calendar message,
but this message's entry is not in the cache. The method
`synchroniseCache` won't work in this case, so we try to force the
synchronisation of that particular message in order to get the change
number before aborting.
2015-10-20 11:33:10 +02:00
Enrique J. Hernández Blasco d998786ea6 oc-mail: Always increase the CN when setting the message read flag
And perform the real IMAP operation on save method as described by
[MS-OXCFXICS] and [MS-OXCMSG] Section 2.2.3.3, these operations must be
committed when SaveChangesMessage is called.

As it is expected by Outlook to increase the change number when
performing the `SetMessageReadFlag` ROP, if it is not done, the client
tries indefinitely to store that.
2015-10-20 09:56:11 +02:00
Jesús García Sáez a50758cc06 Merge pull request #197 from zentyal/jvalles/revert-content-as-blob-master
Revert "Store c_content in sogo_cache_folder as a BLOB"
2015-10-16 12:43:14 +02:00
Juan Vallés 498cec767b Revert "Store c_content in sogo_cache_folder as a BLOB"
This reverts commit b329513845. It was
causing issues and we'll need to do more testing on this optimisation.
2015-10-16 12:08:50 +02:00
Ludovic Marcotte 8cb580633d (fix) oh well, old crappy distros 2015-10-15 15:54:25 -04:00
Ludovic Marcotte 2b1e060881 (feat) initial S/MIME support for EAS (#3327) 2015-10-15 15:31:46 -04:00
Ludovic Marcotte 3702e79a00 (fix) don't escape quoted strings during versit generation 2015-10-15 12:51:30 -04:00
Ludovic Marcotte beb484da10 (fix) make sure English is always used when generating Date headers using EAS (#3356) 2015-10-14 09:57:56 -04:00
Ludovic Marcotte a54cc22da8 (fix) we no longer always rewrite emails for Outlook when using EAS 2015-10-14 09:29:52 -04:00
Ludovic Marcotte 7f92aca0bd (fix) handle references correctly over EAS (#3365) 2015-10-14 09:27:34 -04:00
Ludovic Marcotte 8d85ca13df (fix) numerous EAS fixes when connections are dropped before the EAS client receives the response (#3058, #2849) 2015-10-14 09:21:32 -04:00
Carlos Pérez-Aradros Herce fb7e044bd3 Merge pull request #194 from zentyal/ejhernandez/skip-recurrence-id-without-dtstart
Ignore recurrence-id vevents without dtstart and outside date range
2015-10-07 17:49:56 +02:00
Enrique J. Hernández c08abdb32f Merge pull request #195 from zentyal/jbahillo/view-all-spanish
Changed Spanish string for view all (events/tasks)
2015-10-02 16:25:30 +02:00
Xavy Bahillo c55eab6404 Changed Spanish string for view all (events/tasks)
As current string was referring only to events
2015-10-01 18:16:59 +02:00
Enrique J. Hernández 7680c4091e Merge pull request #191 from zentyal/jvalles/cache-blob
Store c_content in sogo_cache_folder as a BLOB
2015-09-30 16:44:18 +02:00
Enrique J. Hernández 5911563b0f Merge pull request #178 from inverse-inc/v2
Merge from upstream 2.3.2
2015-09-30 14:26:38 +02:00
Enrique J. Hernández Blasco eebf878e89 Ignore recurrence-id vevents without dtstart and outside date range
Happened in an imported vevent from Mozilla Thunderbird.

The crash was:

  Sep 14 15:49:38 sogod [21063]: <0x6442DBF8[SOGoAppointmentFolder]:personal> missing 'c_startdate' in record?
  Sep 14 15:49:38 sogod [21063]: <0x6442DBF8[SOGoAppointmentFolder]:personal> missing 'c_enddate' in record?
  2015-09-14 15:49:38.927 sogod[21063] NGCalendarDateRange.m:37  Assertion failed in NGCalendarDateRange(instance), method initWithStartDate:endDate:.  startDate MUST NOT be nil!
  EXCEPTION: <NSException: 0x7fb96b3c0ed8> NAME:NSInternalInconsistencyException REASON:NGCalendarDateRange.m:37  Assertion failed in NGCalendarDateRange(instance), method initWithStartDate:endDate:.  startDate MUST NOT be nil! INFO:(null)

The relevant ICS file lines are the following ones:

  BEGIN:VEVENT
  UID:040000008200E00074C5B7101A82E00800000000901646A7234BCE01000000000000000010000000E9152C8FF1C27D488C91967FAAFCC2B0
  RECURRENCE-ID:20140513T100000Z
  DURATION:PT1H
  CLASS:PUBLIC
  ATTENDEE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE;CN=krsny >>
      Ann Thierry K:mailto:krsny@example.com
  END:VEVENT
2015-09-30 11:35:12 +02:00
Enrique J. Hernández a8e02b94d4 Merge pull request #193 from zentyal/jag/attach-has-content-id
oc-mail: Fixed false positive in [MAPIStoreAttachment hasContentId]
2015-09-29 19:24:41 +02:00
Jesús García Sáez 6ada034c33 Merge pull request #190 from zentyal/jgarcia/freebusy-multidomain
Fix freebusy for multidomain environments
2015-09-29 13:57:22 +02:00
Javier Amor García c01b21e402 oc-mail: Fixed false positive in [MAPIStoreAttachment hasContentId]
This method does not longer returns true if the content id
was a empty string.
In some case the old false positive triggered the removal of
attachments when sending messages.
2015-09-28 13:06:30 +02:00
Ludovic Marcotte c8c7aaa459 (feat) GUI code to set or now sync flag on address book.
Also thrashed entirely the sync tag concept. Funambol is dead, thank god for that.
2015-09-25 15:21:06 -04:00
Ludovic Marcotte 5409cb2927 (feat) moved FolderSynchronize code to GCS 2015-09-25 15:18:22 -04:00
Juan Vallés b329513845 Store c_content in sogo_cache_folder as a BLOB
This reduces considerably the query time for that column, which can be
rather large.
2015-09-25 12:14:32 +02:00
Jesús García Sáez 0ca6e7c6d3 Fix freebusy for multidomain environments
When returning contacts we have to supply also the domain field.
Because in a multidomain environment UIDField is unique only in
the domain so an user must be identified as uid@domain.

So when creating http requests from client side, we have to use
uid@domain instead of only uid so the SOGoUser created on server
side when parsing the requests is created properly.
2015-09-24 19:00:48 +02:00
Jesús García Sáez bea2415fad Merge pull request #184 from zentyal/jvalles/double-digit-folders
Make folderKey encoding consistent
2015-09-23 18:30:18 +02:00
Jesús García Sáez 180269e39e Merge pull request #185 from zentyal/ejhernandez/return-fai-props-on-available
Avoid crashing Outlook after setting a custom view in a calendar folder
2015-09-22 16:04:42 +02:00
Francis Lachapelle 8a3adeadd2 Rename Slovenian template
Closes #104
2015-09-21 20:37:50 -04:00
Enrique J. Hernández fc8eedf494 Merge pull request #186 from zentyal/ejhernandez/cherry-pick-42f10e1
(fix) safe-guard against not-yet-created calendar of local users
2015-09-18 21:57:25 +02:00
Ludovic Marcotte c8acba8f5a (fix) safe-guard against not-yet-created calendar of local users 2015-09-18 21:56:43 +02:00
Enrique J. Hernández Blasco deca6e383a oc: Include 0x683d0040 as another unknown FAI message property
And returning right type.

We have sorted the FAI properties by number and set the available
name as a comment to ease the tracking afterwards.
2015-09-18 21:45:00 +02:00
Enrique J. Hernández Blasco f3ac7b8334 oc: Return FAI available properties on instance method as well
The operation RopFastTransferSourceCopyTo calls the available
properties for a message using the instance method. It seems the
preferred method by Outlook to synchronise a FAI message. OpenChange
calls the message to get the available properties, so the instance
method is called. As it is specialised to return the custom hack
FAI properties, we have to call that class method instead of using
generic one available at NSObject (MAPIStoreProperties) class.

This avoids crashing the Outlook client after we synchronise the
calendar folder after changing the timeframe view (eg from day view
to month view).
2015-09-18 21:40:01 +02:00
Francis Lachapelle ad8941ba56 Fix URL escaping unti test 2015-09-18 13:48:36 -04:00
Ludovic Marcotte 2bccfcb725 (fix) additional fix for issue #3152 2015-09-17 16:28:42 -04:00
Ludovic Marcotte 4d174b4c6c (fix) typo in previous commit 2015-09-17 16:02:21 -04:00
Ludovic Marcotte 3b15a79c0a (fix) memory leak when sync'ing GCS collections 2015-09-17 15:58:38 -04:00
Ludovic Marcotte b4c2857bb5 (fix) typo in version number for doc 2015-09-16 15:18:10 -04:00
Ludovic Marcotte 6f2eae5d67 Bump version to 2.3.2 2015-09-16 14:37:56 -04:00
Ludovic Marcotte 9a7ea26b80 Update ChangeLog 2015-09-16 13:45:28 -04:00
Ludovic Marcotte 38c9a229c0 Update for the release 2015-09-16 13:44:59 -04:00
Francis Lachapelle e75ec09445 Update NEWS file 2015-09-16 13:31:48 -04:00
Francis Lachapelle 58d03eedc3 Update CKEditor to version 4.5.3 2015-09-16 13:29:37 -04:00
Francis Lachapelle 98ad8f1c0b Update NEWS file 2015-09-16 11:52:46 -04:00
Francis Lachapelle 37b817cd68 Fix options availability in Contacts module cont'd 2015-09-16 11:43:22 -04:00
Francis Lachapelle 9fd8f3edef Add verbose output to "sogo-tool remove" command 2015-09-16 11:39:05 -04:00
Ludovic Marcotte ce11aca2bd (fix) update the doc regarding the temporarily dropping rhel/old debian/ubuntu support 2015-09-16 09:44:29 -04:00
Francis Lachapelle 861057f22f Fix options availability in Contacts module
A user can edit/delete a card from a system addressbook if included in
the "modifiers". Enable the delete/move options of the contextual menu
in this case.
Fixes #3342
2015-09-16 09:38:52 -04:00
Francis Lachapelle b910501afa Fix localization of calendar categories
Fixes #3295
2015-09-15 15:59:31 -04:00
Juan Vallés ba68bd8935 Make folderKey encoding consistent
The folder names are encoded through the `asCSSIdentifier` and
`stringByEncodingImap4FolderName` functions when we store them as folder
keys. In addition, the prefix "folder" is added to the key.

The order in which these operations were done when storing the folder
keys (and reverted when retrieving them) wasn't consistent trough the
code. This led to problems such as creating twice a folder with a digit
at the beginning of its name.

The folder name goes now through the following operations when being
stored as a key (the retrieval reverts these in the reverse order):

 * `stringByEncodingImap4FolderName`
 * `asCSSIdentifier`
 * Add "folder" prefix
2015-09-15 09:57:30 +02:00
extrafu 063f878199 Merge pull request #103 from zentyal/master
Fixes for OpenChange integration
2015-09-14 12:55:03 -04:00
Ludovic Marcotte 6bccd2eea0 (fix) improve spec file regarding disabling OC build 2015-09-14 11:06:54 -04:00
Ludovic Marcotte 652ae763d4 (fix) Start/end shifting by 1 hour due to timezone change on last Sunday of October 2015 (#3344) 2015-09-14 10:55:50 -04:00
Juan Vallés 734aba5ddb oc: Fix asCSSIdentifier in openchange_user_cleanup
The method lacked the check for the initial character, which adds an
underscore at the beginning of the strings that start with a digit.
2015-09-14 15:53:07 +02:00
Jesús García Sáez 3da6c90bbe Merge pull request #182 from zentyal/ejhernandez/save-tasks
oc-task: Save tasks from Outlook
2015-09-14 12:24:01 +02:00
Enrique J. Hernández 21a6480834 Merge pull request #181 from zentyal/jvalles/underscore-folders
Improve first character check in CSS identifiers
2015-09-14 11:38:26 +02:00
Ludovic Marcotte 42f10e1929 (fix) safe-guard against not-yet-created calendar of local users 2015-09-10 20:07:42 -04:00
Ludovic Marcotte 03b706e1d8 (fix) disable oc builds on el6 for now 2015-09-10 19:44:45 -04:00
Ludovic Marcotte 2be556299e (fix) slight modification for fix #3293 2015-09-10 19:10:50 -04:00
Enrique J. Hernández Blasco b075a306c6 oc-task: Save tasks from Outlook
It was not working because we try to save as component the
full calendar and its parent was nil. We have to save the calendar
itself to save the task in the personal calendar.
2015-09-10 17:26:41 +02:00
Juan Vallés 36d8fa12d3 Improve first character check in CSS identifiers
A CSS identifier can't start with a digit, so when a folder name does,
a '_' character is appended at the beginning of its CSS identifier.

The check for this first character used the `isdigit()` function, which
takes a `char` argument, while `[self objectAtIndex: 0]` returns a
`unichar`, i.e. a 16-bit unsigned integer. This caused some non-digit
characters to pass this check (e.g. Chinese characters), ending up with
an underscore at the beginning of the folder name.
2015-09-10 10:24:50 +02:00
Ludovic Marcotte 07092828fe (fix) improved EAS speed during initial syncing of large mailboxes (#3293) 2015-09-09 10:20:31 -04:00
Ludovic Marcotte 7c0ba7b72b (fix) avoid too-many LIST commands over EAS (#3294) 2015-09-09 10:12:32 -04:00
Ludovic Marcotte 750a629df8 Updated NEWS file regarding PR#102 2015-09-09 08:24:59 -04:00
extrafu 33a1d2c397 Merge pull request #102 from zentyal/master
Changes for sogo-openchange from Zentyal
2015-09-09 08:19:14 -04:00
Enrique J. Hernández 2e75972df6 Merge pull request #177 from zentyal/jag/remove-compile-warnings
Fix some compilation warnings
2015-09-09 10:15:40 +02:00
Javier Amor García 1fdb44b0a7 Fix some compilation warnings
The warnings were introduced in the fix for attachment with used
the filename extended parameter.

Also removed trailing whitespaces.
2015-09-08 15:39:59 +02:00
Jesús García Sáez 3868ce0fb1 Merge pull request #169 from zentyal/ejhernandez/increase-cn-setting-seen-flag
oc-mail: Increase Change Number after modifying seen flag
2015-09-07 18:46:18 +02:00
Jesús García Sáez fc82eb79f6 Merge pull request #175 from zentyal/ejhernandez/versions-msg-reload-if-needed
oc: load versionsMessage on setting up
2015-09-07 16:48:55 +02:00
Jesús García Sáez 9425868365 Merge pull request #176 from zentyal/ejhernandez/set-read-flag-db
Implement setReadFlag for MAPIStoreDBMessage
2015-09-07 16:35:30 +02:00
Enrique J. Hernández Blasco 6280e4ded6 oc: Implement setReadFlag for MAPIStoreDBMessage
This is an utility for testing as I don't see any added value
for real scenario but according to [MS-OXCMSG] all messages
can have PidTagMessageFlags.
2015-09-04 16:16:00 +02:00
Enrique J. Hernández Blasco f19074334c oc: Use enum mapistore_error as returned value for setReadFlag 2015-09-04 16:15:05 +02:00
Enrique J. Hernández Blasco b702e40ebb oc: load versionsMessage on setting up
versionsMessage object could have outdated version in a root folder
in the following case:

* Download latest contents using FXBuffer
  * versionsMessage is updated by synchroniseCache
* OpenMessage from last FXBuffer
  * Setup versions message as root folder
* Get Predecessor Change List from that message

We could just reload if needed the versions message if something
is missing but I don't know if that situation fixes more than this
one.
2015-09-03 23:01:21 +02:00
Enrique J. Hernández 190f27ed7c Merge pull request #174 from zentyal/jag/test-quote-mime-header-value
Test for [NGMimeMessageGenerator generateDataForHeaderField:value:]
2015-09-01 16:15:23 +02:00
Javier Amor García cbc3e3e97d Test for [NGMimeMessageGenerator generateDataForHeaderField:value:]
The NGMimeMessageGenerator can be found in sope
2015-09-01 09:09:54 +02:00
Javier Amor García 361d5ea3a6 Added method [SOGoTest stringFromDiffBetween:and:] 2015-09-01 09:09:54 +02:00
Jesús García Sáez 24e3071e24 Merge pull request #170 from zentyal/jag/attachments-nolatin-filename
sogo-openchange: Support attachments with filename extended parameter
2015-08-26 15:15:15 +02:00
Jesús García Sáez 1f29198495 Merge pull request #172 from zentyal/ejhernandez/save-draft-right-change-key
oc-mail: Return right change key after saving a draft mail
2015-08-26 13:37:42 +02:00
Jesús García Sáez 916442f9cf Merge pull request #171 from zentyal/ejhernandez/restriction-cn-ge
oc-mail: Implement ChangeNumber >= restriction
2015-08-25 13:17:20 +02:00
Enrique J. Hernández Blasco 47859b76d6 oc-mail: Return right change key after saving a draft mail
After saving a draft mail (this is done automatically by Outlook)
a GetProps call is done checking the PidTagChangeKey has been
updated properly. Without this patch, it returned MAPI_E_NOT_FOUND.

With this patch, we addressed that problem and we have updated
the Predecessor Change List metadata for the draft mail with the
change key provided by the client to avoid conflicting messages
whenever it is possible.
2015-08-24 23:42:38 +02:00
Enrique J. Hernández Blasco 3a60b6e38e oc-mail: Implement ChangeNumber >= restriction
And warn when other operator than > or >= is used.

This allows OpenChange to query for change numbers starting from
a given point.
2015-08-24 15:39:05 +02:00
Javier Amor García ae3ac0a09a oc-mail: Support attachments with filename extended parameter
The attachments which used a extended parameter for their filename
('filename*=') where silently dropped.
This was because MAPIStore was only looking for no-extended filename
parameter.
The solution is using the 'filename' from the
SOGOExtension of the NSDictionary interface.
2015-08-24 14:19:47 +02:00
Ludovic Marcotte 27a19ac956 (fix) Session fix when SOGoEnableDomainBasedUID is enabled but logins are domain-less 2015-08-21 10:30:47 -04:00
Enrique J. Hernández Blasco 27b9b7bfa7 oc-mail: Increase Change Number after modifying seen flag
It is required when you are using SynchronizeImportReadStateChanges ROP
to update the MetaTagCnsetRead meta property.

See [MS-OXCFXICS] Section 3.2.5.9.4.6

This could lead to sync issues.
2015-08-10 18:38:39 +02:00
Julio J. García Martín 18f758cb0a Merge pull request #159 from Zentyal/ejhernandez/fixes-on-move
Maintain PidTagPredecessorChangeList with client's data
2015-08-04 18:13:19 +02:00
Enrique J. Hernández Blasco 321672e2c3 oc: Update predecessor change list on saving
There were cases where only the change key was updated (GCS) or
others were the change key was updated with wrong info.

This changeset has as goal to update the predecessor change list
and, change key if required, on saving taking into account the latest information
given by the client in high level ROPs such as ImportMessageMove
or SetProperties, and merge it with information provided by the server
backend (IMAP server, SOGo DB) using `synchroniseCache`.

For more details about `PidTagChangeKey` and `PidTagPredecessorChangeList`
property values check [MS-OXCFXICS] Section 2.2.1.2
2015-08-04 08:41:38 +02:00
Enrique J. Hernández Blasco 8d9b54815c oc: Receive new predecessor change list parameter on move copy op
This is to apply new API introduced by 85e2d7c commit in OpenChange
repository.
2015-08-04 08:41:38 +02:00
Enrique J. Hernández Blasco 1dbfc18379 oc: Update to new XID structure definition
From ede986f commit from OpenChange repository.
2015-08-04 08:41:38 +02:00
Ludovic Marcotte 05b330e11b (fix) added changes from PR94 to avoid big merge conflicts 2015-08-03 11:06:30 -04:00
Luc Charland 307876e6c7 cleaned up a few comments 2015-08-03 11:01:33 -04:00
Luc Charland ac6b299988 removed double Name translation in 5 languages 2015-08-03 10:13:23 -04:00
Ludovic Marcotte 234db671ad Removed merged in templates from v3 2015-08-03 10:12:40 -04:00
Luc Charland 2d33b01f31 Removing colons
Conflicts:

	UI/Templates/ContactsUI/UIxContactEditorTemplate.wox
	UI/Templates/ContactsUI/UIxContactFolderLinksTemplate.wox
	UI/Templates/MailerUI/UIxMailMainFrame.wox
	UI/Templates/MainUI/SOGoRootPage.wox
	UI/Templates/PreferencesUI/UIxAccountEditor.wox
	UI/Templates/PreferencesUI/UIxPreferences.wox
	UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox
	UI/Templates/SchedulerUI/UIxAppointmentViewTemplate.wox
	UI/Templates/SchedulerUI/UIxCalMainView.wox
	UI/Templates/SchedulerUI/UIxCalendarFolderLinksTemplate.wox
	UI/Templates/SchedulerUI/UIxTaskEditorTemplate.wox
	UI/Templates/SchedulerUI/UIxTaskViewTemplate.wox
	UI/WebServerResources/angular-material
2015-08-03 10:12:02 -04:00
Luc Charland 490354427d fixed Appointments path 2015-08-03 09:56:14 -04:00
Luc Charland 22ce38808a cleaned up a few comments 2015-08-03 09:55:52 -04:00
Luc Charland 82aca2cfe5 added first draft of verify_translation 2015-08-03 09:55:17 -04:00
Ludovic Marcotte b17488ff25 Updated NEWS file regarding PR93 2015-08-03 09:18:20 -04:00
extrafu ff3557598f Merge pull request #93 from Zentyal/jjgarcia/contribute-back
Changes for sogo-openchange from Zentyal
2015-08-03 09:13:55 -04:00
Julio García 26bd1b30fa Revert "Merge pull request #164 from Zentyal/jgarcia/revert-merge-inverse"
This reverts commit 1404dbdb88, reversing
changes made to 72cbd9a45f.
2015-08-03 09:48:06 +02:00
Enrique J. Hernández 0ce04fd4b6 Merge pull request #165 from Zentyal/jgarcia/uids_login_party_hard
SOGoUser bad initialization on multidomain environment
2015-07-31 18:46:15 +02:00
Jesús García Sáez f3656f7571 Merge pull request #166 from Zentyal/ejhernandez/update-cn-setting-folder-props
oc: Update ChangeNumber after setting folder properties
2015-07-30 14:49:56 +02:00
Enrique J. Hernández Blasco 2aba083147 oc: Update ChangeNumber after setting folder properties
As required by operations like SynchronizationImportHierarchyChanges
a new change number must be generated when a change in a folder
is set. This affects to subfolders.

See [MS-OXCFXICS] Section 3.2.5.9.4.3 for details.
2015-07-30 10:07:55 +02:00
Jesús García Sáez 9414df26c5 getUIDForEmail works on multidomain: returns login
This method is used everywhere to try to retrieve the login of the user
(and normally use the return value to [SOGoUser initwithLogin: ...])

In multidomain environments (with DomainLessLogin = false) there were
several paths (mostly in SOGoAppointmentObject.m) that were trying to
create SOGoUser objects with incorrect login: using only the uid part,
not full email. Then like domain based uid was enabled, these users
had DomainLessLogin set to true and further calls tried to authenticate
only with the uid part (and they should not).

This affects to several methods in:

  * ActiveSync/SOGoActiveSyncDispatcher.m
  * Appointments/SOGoAppointmentFolder.m
  * Appointments/SOGoAppointmentObject.m
  * Appointments/SOGoCalendarComponent.m
  * SOGoSAML2Session.m

Probably a few features related with calendars are now fixed or working
as intended in multidomain environments where the email is used as login
2015-07-29 17:40:56 +02:00
Jesús García Sáez 7496b92da5 Merge pull request #158 from Zentyal/jag/mapistorefolder-getpidtagdisplayname
oc-mail: Added [MAPIStoreFolder getPidTagDisplayName:inMemCtx:]
2015-07-28 18:08:20 +02:00
Jesús García Sáez e38b0ac64f Merge pull request #163 from Zentyal/ejhernandez/subject-fallback
oc-mail: Fallback to PidTagSubject unicode when creating new mail
2015-07-28 17:16:11 +02:00
Julio J. García Martín 1404dbdb88 Merge pull request #164 from Zentyal/jgarcia/revert-merge-inverse
Revert merge from inverse
2015-07-28 12:57:31 +02:00
Jesús García Sáez 3dc8cc78ea Revert merge from inverse
https://github.com/Zentyal/sogo/pull/150

Because the login on web with the use of outlook is broken after
including the DomainLessLogin feature
2015-07-28 12:37:33 +02:00
Jesús García Sáez 72cbd9a45f Merge pull request #162 from Zentyal/ejhernandez/fix-compilation-warn
oc: Fix compilation warning in MAPIStoreContext
2015-07-27 13:41:36 +02:00
Enrique J. Hernández Blasco 10ac445f7c oc-mail: Fallback to PidTagSubject unicode when creating new mail
Some clients such as OpenChange client does not send the following
properties PidTagNormalizedSubject or PidTagSubjectPrefix as
suggested by [MS-OXCMAIL].
2015-07-27 11:18:14 +02:00
Enrique J. Hernández Blasco c5b5a4243d oc: Fix compilation warning in MAPIStoreContext 2015-07-25 09:56:21 +02:00
Ludovic Marcotte 304ffa2099 (fix) SOGoMaximumMessageSubmissionCount should be independant from SOGoMaximumRecipientCount 2015-07-24 11:19:57 -04:00
Francis Lachapelle e4ad255fc2 (fix) chmod 644 UI/MainUI/Slovenian.lproj/Locale 2015-07-23 14:09:27 -04:00
Francis Lachapelle 390a853471 (fix) Display of whitelisted attendees in Firefox
Fixes #3285
2015-07-23 14:07:34 -04:00
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
Enrique J. Hernández 372247a643 Merge pull request #160 from Zentyal/jgarcia/useless-indexing
oc: remove useless mapistore_indexing call
2015-07-23 08:58:36 +02: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
Jesús García Sáez 7bde181d3f oc: check ret value get_new_folderID
On [MAPIStoreContext idForObjectWithKey: key inFolderUrl: url] check the ret value
of mapistore_indexing_get_new_folderID. This should never happen (oh my...) but
if this happens it will be reported
2015-07-21 19:47:17 +02:00
Jesús García Sáez 1336a1d5a8 oc: remove useless mapistore_indexing call
[mapping registerURL ...] will insert the mappingId in indexing database
there is no need to call, again, mapistore_indexing_record_add_mid
2015-07-21 19:47:17 +02:00
Enrique J. Hernández cf606e3224 Merge pull request #157 from Zentyal/jgarcia/wocontext_broken_like_hell
Fix sharing imap connections between different clients
2015-07-21 18:38:09 +02:00
Jesús García Sáez c9f2fe2f85 oc-folder: user context activation on rootFolders
Several fixes related with userContext activation
2015-07-21 11:08:03 +02:00
Jesús García Sáez 10bc15d41d oc-folder: activate user context when needed
Before creating sogo objects
2015-07-21 11:08:02 +02:00
Jesús García Sáez 393b6d5128 oc-folder: simplify lookupFolder method
use activate and no need to set wocontext, it's already set properly
2015-07-21 11:08:02 +02:00
Jesús García Sáez 68ae978b13 oc-mail: activate user context needed
Before creating new sogo objects
2015-07-21 11:08:02 +02:00
Jesús García Sáez f4e3b98042 Nothing changed: format and hoarding code removed 2015-07-21 11:08:02 +02:00
Jesús García Sáez cfab18e1b8 oc: activate user context on initialization 2015-07-21 11:08:02 +02:00
Javier Amor García 959b4e015d [SOgoMailFolder displayName] decodes IMAP4 2015-07-20 15:19:43 +02: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
Javier Amor García 2ce85f6c5c oc-mail: Added [MAPIStoreFolder getPidTagDisplayName:inMemCtx:]
This getter is necessary to decode folder names
in utf7 encoding.
2015-07-17 18:23:40 +02:00
Jesús García Sáez 7d2f96e96b oc: use activate instead of activateWithUser
100% of the times the user is the one that MAPIStoreUserContext
already has, so no need to have it as an argument.
2015-07-15 11:26:05 +02:00
Jesús García Sáez 3bf7afdfb7 oc: remove and disable userContext after each call
This adds [MAPIStoreUserContext activate] method to use
it instead of activateWithUser.

A cleanup operation is executed after each public function
so there won't be any conflicts with future calls.

In practice, this will deactivate the current user context set on
MAPIApp, this means two things: (1) set nil as current user context
on MAPIApp and (2) remove woContext from current thread dictionary
2015-07-15 11:25:45 +02:00
Jesús García Sáez 503a70118f oc: remove tabs and unused code 2015-07-14 19:19:58 +02:00
Jesús García Sáez 928b6b596e oc: OC_DEBUG inside macros
These macros are used before and after every performed
operation
2015-07-14 19:19:51 +02: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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
1814 changed files with 79319 additions and 194397 deletions

No files matched your search

+13 -27
View File
@@ -1,32 +1,18 @@
config.make
tags
*._*
*.css
*.pyc
*.sax
*.swp
*.wox/
*/*/*.SOGo/
*/*/*/obj/
*/*/obj/
*/obj/
.scss-lint-config.yml_
ActiveSync/ActiveSync.SOGo
Documentation/*.docbook
Documentation/*.pdf
*._*
*/*/obj/
*/*/*/obj/
*/*/*.SOGo/
*.sax
*.wox/
*.swp
SoObjects/SOGo/SOGo.framework/
SoObjects/SOGo/derived_src/
Tests/*/config.py
UI/WebServerResources/.bowerrc
UI/WebServerResources/.sass-cache/
UI/WebServerResources/bower_components/
UI/WebServerResources/css/
UI/WebServerResources/css/styles.css
UI/WebServerResources/css/styles.css.map
UI/WebServerResources/js/*.js
UI/WebServerResources/js/*.js.map
UI/WebServerResources/js/vendor/*.js
UI/WebServerResources/js/vendor/*.js.map
UI/WebServerResources/node_modules/
UI/WebServerResources/scss/.sass-cache/
config.make
doc
tags
*.pyc
._*
Documentation/*.docbook
Documentation/*.pdf
-3
View File
@@ -1,3 +0,0 @@
[submodule "UI/WebServerResources/angular-material"]
path = UI/WebServerResources/angular-material
url = https://github.com/angular/material
-33
View File
@@ -19,7 +19,6 @@ trans.hr_HR = UI/MailerUI/Croatian.lproj/Localizable.strings
trans.hu = UI/MailerUI/Hungarian.lproj/Localizable.strings
trans.is = UI/MailerUI/Icelandic.lproj/Localizable.strings
trans.it = UI/MailerUI/Italian.lproj/Localizable.strings
trans.lt = UI/MailerUI/Lithuanian.lproj/Localizable.strings
trans.mk_MK = UI/MailerUI/Macedonian.lproj/Localizable.strings
trans.nb_NO = UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings
trans.nl = UI/MailerUI/Dutch.lproj/Localizable.strings
@@ -30,9 +29,7 @@ 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.sr = UI/MailerUI/Serbian.lproj/Localizable.strings
trans.sv = UI/MailerUI/Swedish.lproj/Localizable.strings
trans.tr_TR = UI/MailerUI/TurkishTurkey.lproj/Localizable.strings
trans.uk = UI/MailerUI/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/MailerUI/ChineseTaiwan.lproj/Localizable.strings
@@ -54,7 +51,6 @@ trans.hr_HR = UI/PreferencesUI/Croatian.lproj/Localizable.strings
trans.hu = UI/PreferencesUI/Hungarian.lproj/Localizable.strings
trans.is = UI/PreferencesUI/Icelandic.lproj/Localizable.strings
trans.it = UI/PreferencesUI/Italian.lproj/Localizable.strings
trans.lt = UI/PreferencesUI/Lithuanian.lproj/Localizable.strings
trans.mk_MK = UI/PreferencesUI/Macedonian.lproj/Localizable.strings
trans.nb_NO = UI/PreferencesUI/NorwegianBokmal.lproj/Localizable.strings
trans.nl = UI/PreferencesUI/Dutch.lproj/Localizable.strings
@@ -65,9 +61,7 @@ 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.sr = UI/PreferencesUI/Serbian.lproj/Localizable.strings
trans.sv = UI/PreferencesUI/Swedish.lproj/Localizable.strings
trans.tr_TR = UI/PreferencesUI/TurkishTurkey.lproj/Localizable.strings
trans.uk = UI/PreferencesUI/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/PreferencesUI/ChineseTaiwan.lproj/Localizable.strings
@@ -89,7 +83,6 @@ trans.hr_HR = UI/Scheduler/Croatian.lproj/Localizable.strings
trans.hu = UI/Scheduler/Hungarian.lproj/Localizable.strings
trans.is = UI/Scheduler/Icelandic.lproj/Localizable.strings
trans.it = UI/Scheduler/Italian.lproj/Localizable.strings
trans.lt = UI/Scheduler/Lithuanian.lproj/Localizable.strings
trans.mk_MK = UI/Scheduler/Macedonian.lproj/Localizable.strings
trans.nb_NO = UI/Scheduler/NorwegianBokmal.lproj/Localizable.strings
trans.nl = UI/Scheduler/Dutch.lproj/Localizable.strings
@@ -100,9 +93,7 @@ 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.sr = UI/Scheduler/Serbian.lproj/Localizable.strings
trans.sv = UI/Scheduler/Swedish.lproj/Localizable.strings
trans.tr_TR = UI/Scheduler/TurkishTurkey.lproj/Localizable.strings
trans.uk = UI/Scheduler/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/Scheduler/ChineseTaiwan.lproj/Localizable.strings
@@ -124,7 +115,6 @@ trans.hr_HR = UI/Contacts/Croatian.lproj/Localizable.strings
trans.hu = UI/Contacts/Hungarian.lproj/Localizable.strings
trans.is = UI/Contacts/Icelandic.lproj/Localizable.strings
trans.it = UI/Contacts/Italian.lproj/Localizable.strings
trans.lt = UI/Contacts/Lithuanian.lproj/Localizable.strings
trans.mk_MK = UI/Contacts/Macedonian.lproj/Localizable.strings
trans.nb_NO = UI/Contacts/NorwegianBokmal.lproj/Localizable.strings
trans.nl = UI/Contacts/Dutch.lproj/Localizable.strings
@@ -135,9 +125,7 @@ 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.sr = UI/Contacts/Serbian.lproj/Localizable.strings
trans.sv = UI/Contacts/Swedish.lproj/Localizable.strings
trans.tr_TR = UI/Contacts/TurkishTurkey.lproj/Localizable.strings
trans.uk = UI/Contacts/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/Contacts/ChineseTaiwan.lproj/Localizable.strings
@@ -159,7 +147,6 @@ trans.hr_HR = UI/MainUI/Croatian.lproj/Localizable.strings
trans.hu = UI/MainUI/Hungarian.lproj/Localizable.strings
trans.is = UI/MainUI/Icelandic.lproj/Localizable.strings
trans.it = UI/MainUI/Italian.lproj/Localizable.strings
trans.lt = UI/MainUI/Lithuanian.lproj/Localizable.strings
trans.mk_MK = UI/MainUI/Macedonian.lproj/Localizable.strings
trans.nb_NO = UI/MainUI/NorwegianBokmal.lproj/Localizable.strings
trans.nl = UI/MainUI/Dutch.lproj/Localizable.strings
@@ -170,9 +157,7 @@ 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.sr = UI/MainUI/Serbian.lproj/Localizable.strings
trans.sv = UI/MainUI/Swedish.lproj/Localizable.strings
trans.tr_TR = UI/MainUI/TurkishTurkey.lproj/Localizable.strings
trans.uk = UI/MainUI/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/MainUI/ChineseTaiwan.lproj/Localizable.strings
@@ -194,7 +179,6 @@ trans.hr_HR = UI/Common/Croatian.lproj/Localizable.strings
trans.hu = UI/Common/Hungarian.lproj/Localizable.strings
trans.is = UI/Common/Icelandic.lproj/Localizable.strings
trans.it = UI/Common/Italian.lproj/Localizable.strings
trans.lt = UI/Common/Lithuanian.lproj/Localizable.strings
trans.mk_MK = UI/Common/Macedonian.lproj/Localizable.strings
trans.nb_NO = UI/Common/NorwegianBokmal.lproj/Localizable.strings
trans.nl = UI/Common/Dutch.lproj/Localizable.strings
@@ -205,9 +189,7 @@ 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.sr = UI/Common/Serbian.lproj/Localizable.strings
trans.sv = UI/Common/Swedish.lproj/Localizable.strings
trans.tr_TR = UI/Common/TurkishTurkey.lproj/Localizable.strings
trans.uk = UI/Common/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/Common/ChineseTaiwan.lproj/Localizable.strings
@@ -229,7 +211,6 @@ trans.hr_HR = UI/AdministrationUI/Croatian.lproj/Localizable.strings
trans.hu = UI/AdministrationUI/Hungarian.lproj/Localizable.strings
trans.is = UI/AdministrationUI/Icelandic.lproj/Localizable.strings
trans.it = UI/AdministrationUI/Italian.lproj/Localizable.strings
trans.lt = UI/AdministrationUI/Lithuanian.lproj/Localizable.strings
trans.mk_MK = UI/AdministrationUI/Macedonian.lproj/Localizable.strings
trans.nb_NO = UI/AdministrationUI/NorwegianBokmal.lproj/Localizable.strings
trans.nl = UI/AdministrationUI/Dutch.lproj/Localizable.strings
@@ -240,9 +221,7 @@ 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.sr = UI/AdministrationUI/Serbian.lproj/Localizable.strings
trans.sv = UI/AdministrationUI/Swedish.lproj/Localizable.strings
trans.tr_TR = UI/AdministrationUI/TurkishTurkey.lproj/Localizable.strings
trans.uk = UI/AdministrationUI/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/AdministrationUI/ChineseTaiwan.lproj/Localizable.strings
@@ -264,7 +243,6 @@ trans.hr_HR = SoObjects/Appointments/Croatian.lproj/Localizable.strings
trans.hu = SoObjects/Appointments/Hungarian.lproj/Localizable.strings
trans.is = SoObjects/Appointments/Icelandic.lproj/Localizable.strings
trans.it = SoObjects/Appointments/Italian.lproj/Localizable.strings
trans.lt = SoObjects/Appointments/Lithuanian.lproj/Localizable.strings
trans.mk_MK = SoObjects/Appointments/Macedonian.lproj/Localizable.strings
trans.nb_NO = SoObjects/Appointments/NorwegianBokmal.lproj/Localizable.strings
trans.nl = SoObjects/Appointments/Dutch.lproj/Localizable.strings
@@ -275,9 +253,7 @@ trans.pt_BR = SoObjects/Appointments/BrazilianPortuguese.lproj/Localizable.strin
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.sr = SoObjects/Appointments/Serbian.lproj/Localizable.strings
trans.sv = SoObjects/Appointments/Swedish.lproj/Localizable.strings
trans.tr_TR = SoObjects/Appointments/TurkishTurkey.lproj/Localizable.strings
trans.uk = SoObjects/Appointments/Ukrainian.lproj/Localizable.strings
trans.zh_TW = SoObjects/Appointments/ChineseTaiwan.lproj/Localizable.strings
@@ -299,7 +275,6 @@ trans.hr_HR = SoObjects/Contacts/Croatian.lproj/Localizable.strings
trans.hu = SoObjects/Contacts/Hungarian.lproj/Localizable.strings
trans.is = SoObjects/Contacts/Icelandic.lproj/Localizable.strings
trans.it = SoObjects/Contacts/Italian.lproj/Localizable.strings
trans.lt = SoObjects/Contacts/Lithuanian.lproj/Localizable.strings
trans.mk_MK = SoObjects/Contacts/Macedonian.lproj/Localizable.strings
trans.nb_NO = SoObjects/Contacts/NorwegianBokmal.lproj/Localizable.strings
trans.nl = SoObjects/Contacts/Dutch.lproj/Localizable.strings
@@ -310,9 +285,7 @@ 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.sr = SoObjects/Contacts/Serbian.lproj/Localizable.strings
trans.sv = SoObjects/Contacts/Swedish.lproj/Localizable.strings
trans.tr_TR = SoObjects/Contacts/TurkishTurkey.lproj/Localizable.strings
trans.uk = SoObjects/Contacts/Ukrainian.lproj/Localizable.strings
trans.zh_TW = SoObjects/Contacts/ChineseTaiwan.lproj/Localizable.strings
@@ -334,7 +307,6 @@ trans.hr_HR = SoObjects/Mailer/Croatian.lproj/Localizable.strings
trans.hu = SoObjects/Mailer/Hungarian.lproj/Localizable.strings
trans.is = SoObjects/Mailer/Icelandic.lproj/Localizable.strings
trans.it = SoObjects/Mailer/Italian.lproj/Localizable.strings
trans.lt = SoObjects/Mailer/Lithuanian.lproj/Localizable.strings
trans.mk_MK = SoObjects/Mailer/Macedonian.lproj/Localizable.strings
trans.nb_NO = SoObjects/Mailer/NorwegianBokmal.lproj/Localizable.strings
trans.nl = SoObjects/Mailer/Dutch.lproj/Localizable.strings
@@ -345,9 +317,7 @@ 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.sr = SoObjects/Mailer/Serbian.lproj/Localizable.strings
trans.sv = SoObjects/Mailer/Swedish.lproj/Localizable.strings
trans.tr_TR = SoObjects/Mailer/TurkishTurkey.lproj/Localizable.strings
trans.uk = SoObjects/Mailer/Ukrainian.lproj/Localizable.strings
trans.zh_TW = SoObjects/Mailer/ChineseTaiwan.lproj/Localizable.strings
@@ -369,7 +339,6 @@ trans.hr_HR = UI/MailPartViewers/Croatian.lproj/Localizable.strings
trans.hu = UI/MailPartViewers/Hungarian.lproj/Localizable.strings
trans.is = UI/MailPartViewers/Icelandic.lproj/Localizable.strings
trans.it = UI/MailPartViewers/Italian.lproj/Localizable.strings
trans.lt = UI/MailPartViewers/Lithuanian.lproj/Localizable.strings
trans.mk_MK = UI/MailPartViewers/Macedonian.lproj/Localizable.strings
trans.nb_NO = UI/MailPartViewers/NorwegianBokmal.lproj/Localizable.strings
trans.nl = UI/MailPartViewers/Dutch.lproj/Localizable.strings
@@ -380,8 +349,6 @@ 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.sr = UI/MailPartViewers/Serbian.lproj/Localizable.strings
trans.sv = UI/MailPartViewers/Swedish.lproj/Localizable.strings
trans.tr_TR = UI/MailPartViewers/TurkishTurkey.lproj/Localizable.strings
trans.uk = UI/MailPartViewers/Ukrainian.lproj/Localizable.strings
trans.zh_TW = UI/MailPartViewers/ChineseTaiwan.lproj/Localizable.strings
+1
View File
@@ -31,6 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define __NGDOMELEMENTACTIVESYNC_H__
#import <DOM/DOMElement.h>
#import <DOM/DOMProtocols.h>
@class NSDictionary;
+2
View File
@@ -30,6 +30,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import "NGMimeMessage+ActiveSync.h"
#import <Foundation/NSArray.h>
#import <Foundation/NSEnumerator.h>
#import <Foundation/NSString.h>
#import <NGMail/NGMailAddress.h>
#import <NGMail/NGMailAddressParser.h>
+11 -18
View File
@@ -29,12 +29,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#import "NGVCard+ActiveSync.h"
#import <Foundation/NSArray.h>
#import <Foundation/NSCalendarDate.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSString.h>
#import <Foundation/NSTimeZone.h>
#import <NGExtensions/NSString+misc.h>
#import <NGCards/CardElement.h>
#import <Contacts/NGVCard+SOGo.h>
#import <SOGo/NSString+Utilities.h>
@@ -42,11 +46,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "NSDate+ActiveSync.h"
#include "NSString+ActiveSync.h"
#import <NGObjWeb/WOContext+SoObjects.h>
#import <SOGo/SOGoUser.h>
#import <SOGo/SOGoUserDefaults.h>
@implementation NGVCard (ActiveSync)
//
@@ -138,7 +137,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[s appendFormat: @"<JobTitle xmlns=\"Contacts:\">%@</JobTitle>", [o activeSyncRepresentationInContext: context]];
if ((o = [self preferredEMail]))
[s appendFormat: @"<Email1Address xmlns=\"Contacts:\">%@</Email1Address>", [o activeSyncRepresentationInContext: context]];
[s appendFormat: @"<Email1Address xmlns=\"Contacts:\">%@</Email1Address>", o];
// Secondary email addresses (2 and 3)
@@ -148,7 +147,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
o = [[emails objectAtIndex: i] flattenedValuesForKey: @""];
[s appendFormat: @"<Email%dAddress xmlns=\"Contacts:\">%@</Email%dAddress>", i+2, [o activeSyncRepresentationInContext: context], i+2];
[s appendFormat: @"<Email%dAddress xmlns=\"Contacts:\">%@</Email%dAddress>", i+2, o, i+2];
if (i == 1)
break;
@@ -181,10 +180,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
a = [NSMutableString string];
if ((o = [homeAdr flattenedValueAtIndex: 2 forKey: @""]))
[a appendString: [o activeSyncRepresentationInContext: context]];
[a appendString: o];
if ((o = [homeAdr flattenedValueAtIndex: 1 forKey: @""]) && [o length])
[a appendFormat: @"\n%@", [o activeSyncRepresentationInContext: context]];
[a appendFormat: @"\n%@", o];
[s appendFormat: @"<HomeStreet xmlns=\"Contacts:\">%@</HomeStreet>", [a activeSyncRepresentationInContext: context]];
@@ -212,10 +211,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
a = [NSMutableString string];
if ((o = [workAdr flattenedValueAtIndex: 2 forKey: @""]))
[a appendString: [o activeSyncRepresentationInContext: context]];
[a appendString: o];
if ((o = [workAdr flattenedValueAtIndex: 1 forKey: @""]) && [o length])
[a appendFormat: @"\n%@", [o activeSyncRepresentationInContext: context]];
[a appendFormat: @"\n%@", o];
[s appendFormat: @"<BusinessStreet xmlns=\"Contacts:\">%@</BusinessStreet>", [a activeSyncRepresentationInContext: context]];
@@ -234,13 +233,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Other, less important fields
if ((o = [self birthday]))
{
[s appendFormat: @"<Birthday xmlns=\"Contacts:\">%@</Birthday>",
[[o dateByAddingYears: 0 months: 0 days: 0
hours: -12 minutes: 0
seconds: 0]
activeSyncRepresentationInContext: context]];
}
[s appendFormat: @"<Birthday xmlns=\"Contacts:\">%@</Birthday>", [o activeSyncRepresentationInContext: context]];
if ((o = [self note]))
{
+1
View File
@@ -30,6 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import "NSCalendarDate+ActiveSync.h"
#import <Foundation/NSString.h>
#import <Foundation/NSTimeZone.h>
#define ONE_DAY 86400
+3
View File
@@ -30,6 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import "NSData+ActiveSync.h"
#import <Foundation/NSProcessInfo.h>
#import <Foundation/NSString.h>
#import <SOGo/SOGoSystemDefaults.h>
@@ -37,6 +38,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import <NGExtensions/NSObject+Logs.h>
#include <wbxml/wbxml.h>
#include <wbxml/wbxml_conv.h>
#include <wbxml/wbxml_errors.h>
#define WBXMLDEBUG 0
+1 -1
View File
@@ -31,6 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define __NSSTRINGACTIVESYNC_H__
#import <Foundation/NSString.h>
#include "SOGoActiveSyncConstants.h"
@class NSCalendarDate;
@@ -52,7 +53,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- (NSString *) itemid;
- (BOOL) acceptsMultiPart;
- (NSData *) convertHexStringToBytes;
- (NSString *) protocolVersion;
@end
+97 -22
View File
@@ -31,6 +31,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <Foundation/NSArray.h>
#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>
@@ -43,6 +46,99 @@ 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] < 0x20 || 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)
@@ -62,7 +158,7 @@ static NSArray *easCommandParameters = nil;
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
{
return [self safeStringByEscapingXMLString: YES];
return [self _stringByEscapingXMLStringUsingCharacters];
}
- (int) activeSyncFolderType
@@ -135,27 +231,6 @@ static NSArray *easCommandParameters = nil;
return o;
}
- (NSString *) protocolVersion
{
NSMutableArray *components;
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)
{
NSData *queryString;
const char* qs_bytes;
queryString = [[components objectAtIndex: 0] dataByDecodingBase64];
qs_bytes = (const char*)[queryString bytes];
return [NSString stringWithFormat:@"%.1f", (float)((uint8_t)qs_bytes[0]/10)];
}
return nil;
}
- (NSString *) _valueForParameter: (NSString *) theParameter
{
NSMutableArray *components;
@@ -33,6 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import "SOGoActiveSyncDispatcher.h"
#import <DOM/DOMElement.h>
#import <DOM/DOMProtocols.h>
@class WOResponse;
File diff suppressed because it is too large. Load diff
+1 -4
View File
@@ -27,7 +27,6 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#import <Foundation/NSObject.h>
#include "SOGoActiveSyncConstants.h"
@@ -38,8 +37,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@class NSURL;
@class NSNumber;
static volatile BOOL easShouldTerminate = NO;
@interface SOGoActiveSyncDispatcher : NSObject
{
NSURL *folderTableURL;
@@ -47,6 +44,7 @@ static volatile BOOL easShouldTerminate = NO;
id context;
NSNumber *syncRequest;
BOOL debugOn;
}
@@ -64,6 +62,5 @@ static volatile BOOL easShouldTerminate = NO;
- (NSURL *) folderTableURL;
- (void) ensureFolderTableExists;
- (BOOL) easShouldTerminate;
@end
File diff suppressed because it is too large. Load diff
+36 -197
View File
@@ -29,19 +29,20 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "SOGoMailObject+ActiveSync.h"
#import <Foundation/NSArray.h>
#import <Foundation/NSCalendarDate.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSException.h>
#import <Foundation/NSString.h>
#import <Foundation/NSCharacterSet.h>
#import <NGCards/iCalCalendar.h>
#import <NGCards/iCalDateTime.h>
#import <NGCards/iCalEvent.h>
#import <NGCards/iCalPerson.h>
#import <NGCards/iCalTimeZone.h>
#import <NGExtensions/NGBase64Coding.h>
#import <NGExtensions/NGQuotedPrintableCoding.h>
#import <NGExtensions/NSString+misc.h>
#import <NGExtensions/NSString+Encoding.h>
#import <NGImap4/NGImap4Envelope.h>
@@ -49,7 +50,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import <NGImap4/NSString+Imap4.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGObjWeb/WOApplication.h>
#import <NGObjWeb/WORequest.h>
#import <NGMime/NGMimeBodyPart.h>
#import <NGMime/NGMimeFileData.h>
@@ -59,6 +59,8 @@ 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"
@@ -68,16 +70,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <Appointments/iCalEntityObject+SOGo.h>
#include <Appointments/iCalPerson+SOGo.h>
#include <Mailer/SOGoMailBodyPart.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;
@@ -424,7 +423,7 @@ struct GlobalObjectId {
mimeType = [NGMimeType mimeType: [[thePart contentType] type]
subType: [[thePart contentType] subType]
parameters: [NSDictionary dictionaryWithObject: @"utf-8" forKey: @"charset"]];
[(NGMimeBodyPart *)thePart setHeader: mimeType forKey: @"content-type"];
[thePart setHeader: mimeType forKey: @"content-type"];
fdata = [[NGMimeFileData alloc] initWithBytes: [body bytes]
length: [body length]];
@@ -485,7 +484,7 @@ struct GlobalObjectId {
{
encoding = [[theParts objectAtIndex: i ] objectForKey: @"encoding"];
charset = [[[theParts objectAtIndex: i ] objectForKey: @"parameterList"] objectForKey: @"charset"];
if (encoding && ([encoding caseInsensitiveCompare: @"7bit"] == NSOrderedSame || [encoding caseInsensitiveCompare: @"8bit"] == NSOrderedSame) &&
if (encoding && [encoding caseInsensitiveCompare: @"8bit"] == NSOrderedSame &&
charset && ![charset caseInsensitiveCompare: @"utf-8"] == NSOrderedSame
&& ![charset caseInsensitiveCompare: @"us-ascii"] == NSOrderedSame)
{
@@ -499,91 +498,6 @@ struct GlobalObjectId {
return NO;
}
- (BOOL) _isSigned: (NSDictionary *) thePart
{
NSMutableDictionary *currentPart;
NSArray *subparts;
NSString *type, *subtype;
NSUInteger i;
type = [[thePart objectForKey: @"type"] lowercaseString];
subtype = [[thePart objectForKey: @"subtype"] lowercaseString];
if ([type isEqualToString: @"multipart"])
{
if ([subtype isEqualToString: @"signed"])
return YES;
subparts = [thePart objectForKey: @"parts"];
for (i = 0; i < [subparts count]; i++)
{
currentPart = [subparts objectAtIndex: i];
if ([self _isSigned: currentPart])
return YES;
}
}
return NO;
}
- (BOOL) _isSmimeEncrypted: (NSDictionary *) thePart
{
NSMutableDictionary *currentPart;
NSArray *subparts;
NSString *type, *subtype;
NSUInteger i;
type = [[thePart objectForKey: @"type"] lowercaseString];
subtype = [[thePart objectForKey: @"subtype"] lowercaseString];
if ([type isEqualToString: @"multipart"])
{
subparts = [thePart objectForKey: @"parts"];
for (i = 0; i < [subparts count]; i++)
{
currentPart = [subparts objectAtIndex: i];
if ([self _isSmimeEncrypted: currentPart])
return YES;
}
}
else if ([type isEqualToString: @"application"] && ([subtype isEqualToString: @"pkcs7-mime"] ||
[subtype isEqualToString: @"x-pkcs7-mime"]))
return YES;
return NO;
}
- (BOOL) _isPGP: (NSDictionary *) thePart
{
NSMutableDictionary *currentPart;
NSArray *subparts;
NSString *type, *subtype, *protocol;
NSUInteger i;
type = [[thePart objectForKey: @"type"] lowercaseString];
subtype = [[thePart objectForKey: @"subtype"] lowercaseString];
protocol = [[[thePart objectForKey: @"parameterList"] objectForKey: @"protocol"] lowercaseString];
if ([type isEqualToString: @"multipart"])
{
if (([protocol isEqualToString: @"application/pgp-signature"] || [protocol isEqualToString: @"application/pgp-encrypted"]))
return YES;
subparts = [thePart objectForKey: @"parts"];
for (i = 0; i < [subparts count]; i++)
{
currentPart = [subparts objectAtIndex: i];
if ([self _isPGP: currentPart])
return YES;
}
}
else if ([type isEqualToString: @"application"] && [subtype isEqualToString: @"pgp-encrypted"])
return YES;
return NO;
}
//
//
//
@@ -608,9 +522,7 @@ struct GlobalObjectId {
else if ([type isEqualToString: @"multipart"])
*theNativeType = 4;
if (([self _isSigned: [self bodyStructure]] ||
[self _isSmimeEncrypted: [self bodyStructure]] ||
[self _isPGP: [self bodyStructure]]) && theMimeSupport > 0)
if (([subtype isEqualToString: @"signed"] || [subtype isEqualToString: @"pkcs7-mime"] ) && theMimeSupport > 0)
{
*theNativeType = 4;
isSMIME = YES;
@@ -694,35 +606,6 @@ struct GlobalObjectId {
}
- (NSString *) _truncateContent: (NSString *) theContent
limit: (int) theLimit
truncated: (int *) wasTruncated
{
if ([theContent length] > theLimit)
{
int i, len;
theContent = [theContent substringToIndex: theLimit];
*wasTruncated = 1;
// We search for the first "space" character starting from the
// end and we truncate the string once more. We do this to avoid
// truncating the content in the middle of a XML entity
len = theLimit-1;
for (i = len; i >= 0; i--)
{
if (isspace([theContent characterAtIndex: i]))
break;
}
return [theContent substringToIndex: i];
}
*wasTruncated = 0;
return theContent;
}
//
//
//
@@ -782,7 +665,7 @@ struct GlobalObjectId {
iCalCalendar *calendar;
NSData *calendarData;
calendarData = [bodyPart fetchBLOBWithPeek: YES];
calendarData = [bodyPart fetchBLOB];
calendar = nil;
NS_DURING
@@ -808,16 +691,17 @@ struct GlobalObjectId {
NSData *d, *globalObjId;
NSArray *attachmentKeys;
iCalCalendar *calendar;
NSString *p;
NSString *p, *subtype;
NSMutableString *s;
id value;
int preferredBodyType, mimeSupport, mimeTruncation, nativeBodyType;
int preferredBodyType, mimeSupport, nativeBodyType;
uint32_t v;
subtype = [[[self bodyStructure] valueForKey: @"subtype"] lowercaseString];
preferredBodyType = [[context objectForKey: @"BodyPreferenceType"] intValue];
mimeSupport = [[context objectForKey: @"MIMESupport"] intValue];
mimeTruncation = [[context objectForKey: @"MIMETruncation"] intValue];
s = [NSMutableString string];
@@ -1003,7 +887,7 @@ 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
if ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 14.1)
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.1"])
[s appendFormat: @"<MeetingMessageType xmlns=\"Email2:\">%d</MeetingMessageType>", 1];
[s appendString: @"</MeetingRequest>"];
@@ -1014,13 +898,12 @@ struct GlobalObjectId {
else
{
// MesssageClass and ContentClass
if ([self _isSigned: [self bodyStructure]])
if ([subtype isEqualToString: @"signed"])
[s appendFormat: @"<MessageClass xmlns=\"Email:\">%@</MessageClass>", @"IPM.Note.SMIME.MultipartSigned"];
else if ([self _isSmimeEncrypted: [self bodyStructure]])
else if ([subtype isEqualToString: @"pkcs7-mime"])
[s appendFormat: @"<MessageClass xmlns=\"Email:\">%@</MessageClass>", @"IPM.Note.SMIME"];
else
[s appendFormat: @"<MessageClass xmlns=\"Email:\">%@</MessageClass>", @"IPM.Note"];
[s appendFormat: @"<ContentClass xmlns=\"Email:\">%@</ContentClass>", @"urn:content-classes:message"];
}
@@ -1124,87 +1007,48 @@ struct GlobalObjectId {
AUTORELEASE(content);
content = [content activeSyncRepresentationInContext: context];
len = [content length];
truncated = 0;
// We handle MIMETruncation
switch (mimeTruncation)
{
case 0:
{
content = @"";
len = 0; truncated = 1;
}
break;
case 1:
content = [self _truncateContent: content limit: 4096 truncated: &truncated];
len = [content length];
break;
case 2:
content = [self _truncateContent: content limit: 5120 truncated: &truncated];
len = [content length];
break;
case 3:
content = [self _truncateContent: content limit: 7168 truncated: &truncated];
len = [content length];
break;
case 4:
content = [self _truncateContent: content limit: 10240 truncated: &truncated];
len = [content length];
break;
case 5:
content = [self _truncateContent: content limit: 20480 truncated: &truncated];
len = [content length];
break;
case 6:
content = [self _truncateContent: content limit: 51200 truncated: &truncated];
len = [content length];
break;
case 7:
content = [self _truncateContent: content limit: 102400 truncated: &truncated];
len = [content length];
break;
case 8:
default:
truncated = 0;
}
len = [content length];
if ([[context objectForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
{
[s appendFormat: @"<Body xmlns=\"Email:\">%@</Body>", content];
[s appendFormat: @"<BodyTruncated xmlns=\"Email:\">%d</BodyTruncated>", truncated];
}
else
{
{
[s appendString: @"<Body xmlns=\"AirSyncBase:\">"];
// Set the correct type if client requested text/html but we got text/plain.
// For s/mime mails type is always 4 if mimeSupport is 1 or 2.
if (preferredBodyType == 2 && nativeBodyType == 1)
[s appendString: @"<Type>1</Type>"];
else if (([self _isSigned: [self bodyStructure]] ||
[self _isSmimeEncrypted: [self bodyStructure]] ||
[self _isPGP: [self bodyStructure]]) && mimeSupport > 0)
else if (([subtype isEqualToString: @"signed"] || [subtype isEqualToString: @"pkcs7-mime"] ) && mimeSupport > 0)
[s appendString: @"<Type>4</Type>"];
else
[s appendFormat: @"<Type>%d</Type>", preferredBodyType];
[s appendFormat: @"<Truncated>%d</Truncated>", truncated];
[s appendFormat: @"<Preview></Preview>"];
[s appendFormat: @"<Data>%@</Data>", content];
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", len];
if (!truncated)
{
[s appendFormat: @"<Data>%@</Data>", content];
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", len];
}
[s appendString: @"</Body>"];
}
}
// Attachments -namespace 16
attachmentKeys = [self fetchFileAttachmentKeys];
if ([attachmentKeys count] && !([self _isSigned: [self bodyStructure]]))
if ([attachmentKeys count] && !([subtype isEqualToString: @"signed"]))
{
int i;
if ([[context objectForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
[s appendString: @"<Attachments xmlns=\"Email:\">"];
else
[s appendString: @"<Attachments xmlns=\"AirSyncBase:\">"];
@@ -1219,24 +1063,18 @@ 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
if ([[context objectForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
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"]];
if ([[context objectForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
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
{
if ([[value objectForKey: @"bodyId"] length])
{
[s appendFormat: @"<ContentId>%@</ContentId>", [[value objectForKey: @"bodyId"] activeSyncRepresentationInContext: context]];
[s appendFormat: @"<IsInline>%d</IsInline>", 1];
}
[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];
@@ -1273,7 +1111,8 @@ struct GlobalObjectId {
[s appendFormat: @"</Categories>"];
}
if ([[context objectForKey: @"ASProtocolVersion"] floatValue] >= 14.0)
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.0"] ||
[[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.1"])
{
id value;
NSString *reference;
@@ -1281,9 +1120,9 @@ struct GlobalObjectId {
value = [[self mailHeaders] objectForKey: @"references"];
if ([value isKindOfClass: [NSArray class]])
reference = [[[value objectAtIndex: 0] componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] objectAtIndex: 0];
reference = [[[value objectAtIndex: 0] componentsSeparatedByString: @" "] objectAtIndex: 0];
else
reference = [[value componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] objectAtIndex: 0];
reference = [[value componentsSeparatedByString: @" "] objectAtIndex: 0];
if ([reference length] > 0)
[s appendFormat: @"<ConversationId xmlns=\"Email2:\">%@</ConversationId>", [[reference dataUsingEncoding: NSUTF8StringEncoding] activeSyncRepresentationInContext: context]];
@@ -27,11 +27,9 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#import <NGObjWeb/SoObjectWebDAVDispatcher.h>
#include <NGObjWeb/SoObject+SoDAV.h>
#include <NGObjWeb/WEClientCapabilities.h>
#include <NGObjWeb/WOContext.h>
#include <NGObjWeb/WORequest.h>
@@ -39,7 +37,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import <Foundation/NSArray.h>
@interface SoObjectWebDAVDispatcher (ActiveSync)
- (id)_callObjectMethod:(NSString *)_method inContext:(WOContext *)_ctx;
+4 -1
View File
@@ -30,9 +30,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import "iCalAlarm+ActiveSync.h"
#import <Foundation/NSDictionary.h>
#import <NGExtensions/NSCalendarDate+misc.h>
#import <Foundation/NSString.h>
#import <NGExtensions/NSString+misc.h>
#import <NGObjWeb/WOContext.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGCards/iCalAlarm.h>
#import <NGCards/iCalEvent.h>
#import <NGCards/iCalTrigger.h>
+17 -40
View File
@@ -30,19 +30,26 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import "iCalEvent+ActiveSync.h"
#import <Foundation/NSArray.h>
#import <Foundation/NSCalendarDate.h>
#import <Foundation/NSDate.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSString.h>
#import <Foundation/NSTimeZone.h>
#import <NGExtensions/NSString+misc.h>
#import <NGExtensions/NSCalendarDate+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGObjWeb/WOContext.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGObjWeb/WORequest.h>
#import <NGCards/iCalCalendar.h>
#import <NGCards/iCalDateTime.h>
#import <NGCards/iCalPerson.h>
#import <NGCards/NSCalendarDate+NGCards.h>
#import <NGCards/NSString+NGCards.h>
#import <NGCards/iCalCalendar.h>
#import <SOGo/SOGoUser.h>
#import <SOGo/SOGoUserDefaults.h>
@@ -63,7 +70,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- (int) _attendeeStatus: (iCalPerson *) attendee
{
int attendee_status;
attendee_status = 5;
if ([[attendee partStat] caseInsensitiveCompare: @"ACCEPTED"] == NSOrderedSame)
attendee_status = 3;
@@ -75,29 +82,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
return attendee_status;
}
//
// Possible values are:
// 0 Free
// 1 Tentative
// 2 Busy
// 3 Out of Office
// 4 Working elsewhere
//
- (int) _busyStatus: (iCalPerson *) attendee
{
int attendee_status;
attendee_status = 2;
if ([[attendee partStat] caseInsensitiveCompare: @"DECLINED"] == NSOrderedSame)
attendee_status = 0;
else if ([[attendee partStat] caseInsensitiveCompare: @"TENTATIVE"] == NSOrderedSame)
attendee_status = 1;
return attendee_status;
}
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
{
NSMutableString *s;
@@ -168,7 +152,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
o = [organizer cn];
if ([o length])
[s appendFormat: @"<Organizer_Name xmlns=\"Calendar:\">%@</Organizer_Name>", [o activeSyncRepresentationInContext: context]];
[s appendFormat: @"<Organizer_Name xmlns=\"Calendar:\">%@</Organizer_Name>", o];
}
}
@@ -206,7 +190,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
}
else
{
meetingStatus = 0; // The event is an appointment, which has no attendees.
meetingStatus = 0; // appointment
}
// This depends on the 'NEEDS-ACTION' parameter.
@@ -227,12 +211,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[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>", [self _busyStatus: attendee]];
}
else
{
// If it's a normal event (ie, with no organizer/attendee) or we are the organizer to an event
// invitation, we set the busy status to 2 (Busy)
[s appendFormat: @"<BusyStatus xmlns=\"Calendar:\">%d</BusyStatus>", 2];
}
@@ -273,7 +251,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// otherwise it'll prevent WP8 phones from sync'ing. See #3028 for details.
o = [o activeSyncRepresentationInContext: context];
if ([[context objectForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
{
[s appendFormat: @"<Body xmlns=\"Calendar:\">%@</Body>", o];
[s appendString: @"<BodyTruncated xmlns=\"Calendar:\">0</BodyTruncated>"];
@@ -516,7 +494,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
}
// FIXME: merge with iCalToDo
if ([[context objectForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
{
if ((o = [theValues objectForKey: @"Body"]))
[self setComment: o];
@@ -530,9 +508,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
if ((o = [theValues objectForKey: @"Location"]))
[self setLocation: o];
deltasecs = 0;
start = nil;
if ((o = [theValues objectForKey: @"StartTime"]))
{
o = [o calendarDate];
@@ -540,8 +515,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
oldstart = [start dateTime];
[start setTimeZone: tz];
if (isAllDay)
{
if (isAllDay)
{
[start setDate: o];
[start setTimeZone: nil];
}
@@ -552,7 +527,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Calculate delta if start date has been changed.
if (oldstart)
deltasecs = [[start dateTime ] timeIntervalSinceDate: oldstart] * -1;
deltasecs = [[start dateTime ] timeIntervalSinceDate: oldstart] * -1;
else
deltasecs = 0;
}
if ((o = [theValues objectForKey: @"EndTime"]))
+4 -22
View File
@@ -37,25 +37,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#import <NGCards/iCalEvent.h>
#import <NGCards/iCalByDayMask.h>
#import <NGCards/iCalDateTime.h>
#import <NGCards/iCalTimeZone.h>
#import "NSCalendarDate+ActiveSync.h"
#import "NSDate+ActiveSync.h"
@implementation iCalRecurrenceRule (ActiveSync)
- (NSCalendarDate *) _adjustedStartDate
{
iCalTimeZone *timeZone;
timeZone = [(iCalDateTime *)[[self parent] firstChildWithTag: @"dtstart"] timeZone];
if (timeZone)
return [timeZone computedDateForDate: [[self parent] startDate]];
else
return [[self parent] startDate];
}
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
{
NSMutableString *s;
@@ -104,7 +90,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
// No byDayMask, we take the event's start date to compute the DayOfWeek
// 0 == Sunday, 6 == Saturday
v = (1 << [[self _adjustedStartDate] dayOfWeek]);
v = (1 << [[[self parent] startDate] dayOfWeek]);
}
[s appendFormat: @"<Recurrence_DayOfWeek xmlns=\"Calendar:\">%d</Recurrence_DayOfWeek>", v];
@@ -153,7 +139,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
// Simple reccurrence rule of type "Monthly"
type = 2;
[s appendFormat: @"<Recurrence_DayOfMonth xmlns=\"Calendar:\">%d</Recurrence_DayOfMonth>", [[self _adjustedStartDate] dayOfMonth]];
[s appendFormat: @"<Recurrence_DayOfMonth xmlns=\"Calendar:\">%d</Recurrence_DayOfMonth>",
(int)[[[self parent] startDate] dayOfMonth]];
}
}
else if ([self frequency] == iCalRecurrenceFrequenceYearly)
@@ -189,12 +176,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
}
}
else
{
type = 5;
[s appendFormat: @"<Recurrence_DayOfMonth xmlns=\"Calendar:\">%d</Recurrence_DayOfMonth>", [[self _adjustedStartDate] dayOfMonth]];
[s appendFormat: @"<Recurrence_MonthOfYear xmlns=\"Calendar:\">%d</Recurrence_MonthOfYear>", [[self _adjustedStartDate] monthOfYear]];
}
type = 5;
}
[s appendFormat: @"<Recurrence_Type xmlns=\"Calendar:\">%d</Recurrence_Type>", type];
+13 -12
View File
@@ -31,10 +31,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <Foundation/NSArray.h>
#include <Foundation/NSCalendarDate.h>
#include <Foundation/NSData.h>
#include <Foundation/NSDate.h>
#include <Foundation/NSString.h>
#import <NGCards/iCalByDayMask.h>
#import <NGCards/iCalTimeZonePeriod.h>
#import <NGCards/iCalRecurrenceRule.h>
#import <NGExtensions/NGBase64Coding.h>
#include "NSData+ActiveSync.h"
@@ -123,7 +128,7 @@ struct SYSTEMTIME {
//uint16_t wStandardYear;
struct SYSTEMTIME stStandardDate;
//uint16_t wDaylightYear;
struct SYSTEMTIME stDaylightDate = {0,0,0,0,0,0,0,0};
struct SYSTEMTIME stDaylightDate;
char standardName[64], daylightName[64];
@@ -139,17 +144,13 @@ struct SYSTEMTIME {
period = [self _mostRecentPeriodWithName: @"DAYLIGHT"];
if (!period)
{
stStandardDate.wMonth = 0;
lDaylightBias = 0;
}
else
{
lDaylightBias = (uint32_t) -([period secondsOffsetFromGMT] / 60) - lBias;
[period _fillTZDate: &stDaylightDate];
//wStandardYear = stStandardDate.wYear;
//wDaylightYear = stDaylightDate.wYear;
}
stStandardDate.wMonth = 0;
lDaylightBias = (uint32_t) -([period secondsOffsetFromGMT] / 60) - lBias;
[period _fillTZDate: &stDaylightDate];
//wStandardYear = stStandardDate.wYear;
//wDaylightYear = stDaylightDate.wYear;
// We build the timezone
[bytes appendBytes: &lBias length: 4];
+6 -2
View File
@@ -29,10 +29,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#import "iCalToDo+ActiveSync.h"
#import <Foundation/NSCalendarDate.h>
#import <Foundation/NSDate.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSString.h>
#import <Foundation/NSTimeZone.h>
#import <NGExtensions/NSString+misc.h>
#import <NGObjWeb/WOContext.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGObjWeb/WORequest.h>
@@ -127,7 +131,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// otherwise it'll prevent WP8 phones from sync'ing. See #3028 for details.
o = [o activeSyncRepresentationInContext: context];
if ([[context objectForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
{
[s appendFormat: @"<Body xmlns=\"Tasks:\">%@</Body>", o];
[s appendString: @"<BodyTruncated xmlns=\"Tasks:\">0</BodyTruncated>"];
@@ -161,7 +165,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
[self setSummary: o];
// FIXME: merge with iCalEvent
if ([[context objectForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"])
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
{
if ((o = [theValues objectForKey: @"Body"]))
[self setComment: o];
+4 -7
View File
@@ -57,6 +57,8 @@ ProxyPreserveHost On
# Allow from your-cas-host-addr
# </Proxy>
ProxyPass /SOGo http://127.0.0.1:20000/SOGo retry=0
# Enable to use Microsoft ActiveSync support
# Note that you MUST have many sogod workers to use ActiveSync.
# See the SOGo Installation and Configuration guide for more details.
@@ -65,15 +67,11 @@ ProxyPreserveHost On
# http://127.0.0.1:20000/SOGo/Microsoft-Server-ActiveSync \
# retry=60 connectiontimeout=5 timeout=360
ProxyPass /SOGo http://127.0.0.1:20000/SOGo retry=0
<Proxy http://127.0.0.1:20000/SOGo>
## adjust the following to your configuration
## and do not forget to enable the headers module
<IfModule headers_module>
RequestHeader set "x-webobjects-server-port" "443"
RequestHeader set "x-webobjects-server-name" "%{HTTP_HOST}e" env=HTTP_HOST
RequestHeader set "x-webobjects-server-url" "https://%{HTTP_HOST}e" env=HTTP_HOST
# RequestHeader set "x-webobjects-server-name" "yourhostname"
# RequestHeader set "x-webobjects-server-url" "https://yourhostname"
## When using proxy-side autentication, you need to uncomment and
## adjust the following line:
@@ -81,7 +79,6 @@ ProxyPass /SOGo http://127.0.0.1:20000/SOGo retry=0
# RequestHeader set "x-webobjects-remote-user" "%{REMOTE_USER}e" env=REMOTE_USER
RequestHeader set "x-webobjects-server-protocol" "HTTP/1.0"
</IfModule>
AddDefaultCharset UTF-8
+3459 -29739
View File
File diff suppressed because it is too large. Load diff
+5655
View File
File diff suppressed because it is too large. Load diff
-189
View File
@@ -1,189 +0,0 @@
Developer's Guide
=================
:toc: left
:icons: font
////
This file is part of the SOGo project.
See docinfo.xml for authors, copyright and license information.
////
include::includes/global-attributes.asciidoc[]
UI and UX
---------
* http://www.google.com/design/spec/material-design/
* http://goodui.org/
- Try Repeating Your Primary Action instead of showing it just once.
- Try Distinct Clickable/Selected Styles instead of blurring them.
- Try Undos instead of prompting for confirmation.
- Try More Contrast instead of similarity.
- Try Exposing Options instead of hiding them.
- Try Showing State instead of being state agnostic.
- Try Direct Manipulation instead of contextless menus.
- Try Exposing Fields instead of creating extra pages.
- Try Transitions instead of showing changes instantly.
- Try Fewer Borders instead of wasting attention.
- Try Designing For Zero Data instead of just data heavy cases.
- Try Consistency instead of making people relearn.
- Try Conventions instead of reinventing the wheel.
- Try Visual Hierarchy instead of dullness.
- Try Grouping Related Items instead of disordering.
- Try Inline Validation instead of delaying errors.
- Try Forgiving Inputs instead of being strict with data.
- Try Bigger Click Areas instead of tiny ones.
- Try Faster Load Times instead of making people wait.
- Try Keyboard Shortcuts instead of buttons only.
- Try Upfront Progress instead of starting with a blank.
- Try Softer Prompts instead of modal windows.
- Try Multifunctional Controls instead of more parts.
- Try Icon Labels instead of opening for interpretation.
* http://designmodo.com/create-style-guides/
* http://uxmyths.com/
Frameworks & Tools
------------------
GNUstep
~~~~~~~
SOPE
~~~~
JavaScript libraries
~~~~~~~~~~~~~~~~~~~~
* https://angularjs.org/
* http://angular-ui.github.io/ui-router/
* https://material.angularjs.org/
* http://lodash.com/
* https://github.com/nervgh/angular-file-upload
Code Style
----------
Objective-C
~~~~~~~~~~~
* To document the Web APIs, we follow the http://apidocjs.com/[APIDOC] standards.
apidoc -f ".*\\.m" -i UI -o Documentation/JSON-API
* When returning JSON from an object extending UIxComponent, use the following method:
- (WOResponse *) responseWithStatus: (unsigned int) status
andJSONRepresentation: (NSObject *) contentObject;
HTML
~~~~
* Localize your strings:
<var:string label:value="I'm localized!"/>
* Localize your attributes:
<input type="text" label:placeholder="I'm localized!"/>
* Reuse existing localized strings as much as possible. Otherwise don't forget to update the English Localizable.strings file of the appropriate module.
JavaScript
~~~~~~~~~~
* http://eslint.org/
* http://standardjs.com
* https://github.com/toddmotto/angularjs-styleguide
* https://github.com/angular/material/blob/master/docs/guides/CODING.md
* http://jshint.com/
* https://github.com/angular/material/tree/master/docs/guides
* We conform to https://github.com/airbnb/javascript[Airbnb coding standards]. Use https://github.com/jscs-dev/node-jscs[jscs] with the 'airbnb' preset to validate your code style:
jscs -p airbnb *.js
* For documentation, we follow the http://usejsdoc.org/[JSDoc3] standards:
jsdoc UI/WebServerResources/js/{Common,Contacts,Mailer,Preferences,Scheduler}/*.js -d Documentation/JavaScript-API
Models (facades)
^^^^^^^^^^^^^^^^
////
http://trochette.github.io/Angular-Design-Patterns-Best-Practices/
////
* Move business logic into models and share them.
* Keep it simple, separate server interaction and error handling from the model. That way model only handle data processing and code is easier to maintain.
SASS/CSS
~~~~~~~~
* http://componentcss.com/
* https://github.com/styleguide/css
* https://smacss.com/
* http://cssguidelin.es/
* http://sixrevisions.com/css/css-methodologies/
* https://css-tricks.com/what-a-css-code-review-might-look-like/
* http://una.im/classy-css/
* http://stylelint.io/
A `@mixin` is like a stamp: it creates a duplicated version of the property block (optionally) with arguments provided. An `@extend` appends the element you are extending to the property block. It is your "yes, and ___" statement.
* For documentation, we follow http://sassdoc.com/[SassDoc] annotations.
* We need the SASS files of Angular Material to build our CSS. The git repository of Angular Material is included as a submodule of SOGo:
git submodule init
git submodule update
* FlexBox compatibility http://caniuse.com/#feat=flexbox
Fonts
^^^^^
* http://mozilla.github.io/Fira/[Mozilla Fira]
* https://www.google.com/design/icons/[Material icons]
Building frontend
-----------------
* Install the latest stable release of https://nodejs.org[Node.js]
* Install grunt
npm install -g grunt-cli
npm install -g bower
* Generate JavaScript files
cd UI/WebServerResources
npm install
grunt build
Version Control
---------------
* https://devcharm.com/articles/46/improve-your-git-workflow/
* https://github.com/angular/material/blob/master/docs/guides/CONTRIBUTING.md#-commit-message-format
* Each commit should cover only one thing;
* Begin the commit message with a single short (less than 50 characters) line summarizing the change, followed by a blank line and then a more thorough description;
* When fixing a bug, commit to the devel branch as well as the maintenance branch of the latest release version (named maintenance/x.y). When a ticket is associated to the bug, add to the description a line saying *Fixes #1234*.
* `git pull` may introduce http://stackoverflow.com/questions/15316601/in-what-cases-could-git-pull-be-harmful[inconsistencies and problems]. Replace it with the following alias:
git config --global alias.up '!git remote update -p; git merge --ff-only @{u}'
Testing
-------
* https://github.com/angular/protractor
* http://karma-runner.github.io/
JSON API
~~~~~~~~
One practical way to test the JSON API is to use `curl`. To do so, you need to enable `SOGoTrustProxyAuthentication` and configure HTTP authentifcation in Apache. You can pipe the result to http://stedolan.github.io/jq/[jq] to nicely format and filter the output:
curl -u username:password http://localhost/SOGo/so/username/Calendar/calendarslist | jq '.'
curl -u username:password -H 'Content-Type: application/json' -d '{}' http://localhost/SOGo/so/francis/Calendar/personal/71B6-54904400-1-7C308500.ics/save
+68 -299
View File
@@ -18,13 +18,13 @@ About this Guide
This guide will walk you through the installation and configuration of
the SOGo solution. It also covers the installation and configuration of
SOGo ActiveSync support - the solution used to synchronize mobile
SOGo ActiveSync support – the solution used to synchronize mobile
devices with SOGo.
The instructions are based on version {release_version} of SOGo.
The latest version of this guide is available
at http://sogo.nu/downloads/documentation.html.
at http://www.sogo.nu/downloads/documentation.html.
Introduction
------------
@@ -50,7 +50,8 @@ the SOGo Connector and the SOGo Integrator
device, or Outlook 2013
SOGo is developed by a community of developers located mainly in North
America and Europe. More information can be found at http://sogo.nu/
America and Europe. More information can be found
at http://www.sogo.nu/
Architecture and Compatibility
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -170,21 +171,21 @@ supported by SOGo:
* Red Hat Enterprise Linux (RHEL) Server 5, 6 and 7
* Community ENTerprise Operating System (CentOS) 5, 6 and 7
* Debian GNU/Linux 6.0 (Squeeze), 7.0 (Wheezy) and 8.0 (Jessie)
* Ubuntu 12.04 (Precise), 14.04 (Trusty) and 16.04 (Xenial)
* Debian GNU/Linux 6.0 (Squeeze) to 8.0 (Jessie)
* Ubuntu 12.04 (Precise) to 14.04 (Trusty)
Make sure the required components are started automatically at boot time
and that they are running before proceeding with the SOGo configuration.
Also make sure that you can install additional packages from your
standard distribution. For example, if you are using Red Hat Enterprise
Linux 7, you have to be subscribed to the Red Hat Network before
Linux 5, you have to be subscribed to the Red Hat Network before
continuing with the SOGo software installation.
NOTE: This document covers the installation of SOGo under RHEL 7.
NOTE: This document covers the installation of SOGo under RHEL 6.
For installation instructions on Debian and Ubuntu, please refer
directly to the SOGo website at http://sogo.nu/.
Under the _Support_ section, you will find links for installation steps
directly to the SOGo website at http://www.sogo.nu/.
Under the downloads section, you will find links for installation steps
for Debian and Ubuntu.
Note that once the SOGo packages are installed under Debian and Ubuntu,
@@ -195,17 +196,12 @@ Installation
This section will guide you through the installation of SOGo together
with its dependencies. The steps described here apply to an RPM-based
installation for a Red Hat or CentOS 7 distribution. Most of these steps
installation for a Red Hat or CentOS 6 distribution. Most of these steps
should apply to all supported operating systems.
Software Downloads
~~~~~~~~~~~~~~~~~~
[NOTE]
In order to access the production builds, you need a proper support contract
from https://sogo.nu/support/index_new.html#support-plans[Inverse]. Continue
with the configuration once you received your username and password.
SOGo can be installed using the `yum` utility. To do so, first create
the `/etc/yum.repos.d/inverse.repo` configuration file with the following
content:
@@ -213,32 +209,19 @@ content:
----
[SOGo]
name=Inverse SOGo Repository
baseurl=https://<username>:<password>@packages.inverse.ca/SOGo/release/3/rhel/7/$basearch
gpgcheck=1
baseurl=http://inverse.ca/downloads/SOGo/RHEL6/$basearch
gpgcheck=0
----
[NOTE]
Any non-URL safe characters in username/password must be URL-encoded. For
example, if your password is `so%go`, you must set the value in your
configuration file to `so%25go` - where `%` is encoded to `%25`.
Some of the softwares on which SOGo depends are available from the
repository of RepoForge (previously known as RPMforge). To add RepoForge
to your packages sources, download and install the appropriate RPM
package
from http://packages.sw.be/rpmforge-release/.
Also make sure you enabled the "rpmforge-extras" repository.
Inverse signs its RPM packages with its GPG key. Integrity verification happens
all by itself on package installation, all you need to do is first import the
key into your rpm keychain:
----
rpm --import "https://pgp.mit.edu/pks/lookup?op=get&search=0xCB2D3A2AA0030E2C"
----
Some of the softwares on which SOGo depends are available from the repository
"Extra Packages for Enterprise Linux" (EPEL). To add EPEL to your packages
sources, install the following package:
----
rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
----
For more information on EPEL, visit http://fedoraproject.org/wiki/EPEL/.
For more information on using RepoForge,
visit http://repoforge.org/use/.
Software Installation
~~~~~~~~~~~~~~~~~~~~~
@@ -387,13 +370,6 @@ Defaults to 10 (minutes).
Do not set this too low as child processes replying to clients on a slow
internet connection could be killed prematurely.
|S |WOMaxUploadSize
|Parameter used to set the maximum allowed size for content being
sent to SOGo using a PUT or a POST call. This can also limit the file
attachment size being uploaded to SOGo when composing a mail. The
value is in kilobyte. By default, the value is 0, or disabled so no
limit will be set.
|S |SxVMemLimit
|Parameter used to set the maximum amount of memory (in
megabytes) that a child can use. Reaching that value will force children
@@ -523,8 +499,8 @@ In our example, we set the default domain to `acme.com`.
meeting participants. Possible values are:
[options="compact"]
* `YES` - to send notifications
* `NO` - to not send notifications
* `YES` – to send notifications
* `NO` – to not send notifications
Defaults to `NO` when unset.
@@ -597,8 +573,6 @@ for SOGo. Possible values are:
* `Basque`
* `BrazilianPortuguese`
* `Catalan`
* `ChineseTaiwan`
* `Croatian`
* `Czech`
* `Danish`
* `Dutch`
@@ -609,19 +583,14 @@ for SOGo. Possible values are:
* `Hungarian`
* `Icelandic`
* `Italian`
* `Lithuanian`
* `Macedonian`
* `NorwegianBokmal`
* `NorwegianNynorsk`
* `Polish`
* `Portuguese`
* `Russian`
* `Slovak`
* `Slovenian`
* `SpanishArgentina`
* `SpanishSpain`
* `SpanishArgentina`
* `Swedish`
* `TurkishTurkey`
* `Ukrainian`
* `Welsh`
@@ -630,8 +599,8 @@ for SOGo. Possible values are:
someone changes his/her own calendar. Possible values are:
[options="compact"]
- `YES` - to send notifications
- `NO` - to not send notifications
- `YES` – to send notifications
- `NO` – to not send notifications
Defaults to `NO` when unset. User can overwrite this from the calendar
properties window.
@@ -642,8 +611,8 @@ modification is being done to his/her own calendar by someone else.
Possible values are:
[options="compact"]
* `YES` - to send notifications
* `NO` - to not send notifications
* `YES` – to send notifications
* `NO` – to not send notifications
Defaults to `NO` when unset. User can overwrite this from the calendar
properties window.
@@ -666,8 +635,8 @@ requiring not authentication) their calendars and address books.
Possible values are:
[options="compact"]
* `YES` - to allow them
* `NO` - to prevent them from doing so
* `YES` – to allow them
* `NO` – to prevent them from doing so
Defaults to `NO` when unset.
@@ -678,8 +647,8 @@ SOGo.
Possible values are:
[options="compact"]
* `YES` - to allow them
* `NO` - to prevent them from doing so
* `YES` – to allow them
* `NO` – to prevent them from doing so
Defaults to `NO` when unset.
@@ -709,7 +678,7 @@ Defaults to `NO` when unset.
string (attendee completion, address book search, etc.) prior triggering
the server-side search operation.
Defaults to `2` when unset - which means a search operation will be
Defaults to `2` when unset – which means a search operation will be
triggered on the 3rd typed character.
|S |SOGoMaximumFailedLoginCount
@@ -747,25 +716,6 @@ Default value is `0`, or disabled.
|Number of seconds, default to `300` (or 5 minutes). Note that
_SOGoCacheCleanupInterval_ must be set to a value equal or higher than
_SOGoFailedLoginBlockInterval_.
|S |SOGoMaximumRequestCount
|Parameter used to control the number of requests a user can send to the SOGo
server in _SOGoMaximumRequestInterval_ seconds or more. If conditions are met
or exceeded, the user will not be able to perform requests on the SOGo server
for _SOGoRequestBlockInterval_ seconds and will receive 429 HTTP responses for
any requests being made. Default value is 0, or disabled
|S |SOGoMaximumRequestInterval
|Number of seconds, defaults to `30`.
|S |SOGoRequestBlockInterval
|Number of seconds, defaults to 300 (or 5 minutes). Note that _SOGoCacheCleanupInterval_
must be set to a value equal or higher than _SOGoRequestBlockInterval_.
|D |SOGoXSRFValidationEnabled
|Parameter used to enable or not XSRF (also known as CSRF) protection in SOGo.
Default value is `NO`, or disabled.
|=======================================================================
Authentication using LDAP
@@ -892,11 +842,11 @@ would be:
CNFieldName = cn;
IDFieldName = cn;
UIDFieldName = cn;
baseDN = "ou=groups,dc=inverse,dc=ca";
baseDN = "ou=groups,dc=inverse,dc=ca”;
bindDN = "cn=sogo,ou=services,dc=inverse,dc=ca";
bindPassword = zot;
canAuthenticate = YES;
displayName = "Inverse Groups";
displayName = “Inverse Groups”;
hostname = ldap://127.0.0.1:389;
id = inverse_groups;
isAddressBook = YES;
@@ -908,7 +858,7 @@ source:
[cols="^3,>47,50a"]
|=======================================================================
.36+|D <|SOGoUserSources
.34+|D <|SOGoUserSources
|Parameter used to set the LDAP and/or SQL sources used for
authentication and global address books. Multiple sources can be
specified as an array of dictionaries. A dictionary that defines an LDAP
@@ -918,7 +868,7 @@ source can contain the following values:
|The type of this user source, set to ldap` for an LDAP source.
|id
|The identification name of the LDAP repository. This must be unique -
|The identification name of the LDAP repository. This must be unique –
even when using multiple domains.
|CNFieldName
@@ -937,8 +887,7 @@ table.
|MailFieldNames
|An array of fields that returns the user's email addresses (defaults to
`mail` when unset). Note that SOGo will always automatically strip the
protocol value from the attribute if the attribute name is `proxyAddresses`.
`mail` when unset).
|SearchFieldNames
|An array of fields to to match against the search string when filtering
@@ -985,8 +934,8 @@ be marked as busy the first time it is booked.
EOQualifier. The following operators are supported:
[options="compact"]
* `<>` - inequality operator
* `=` - equality operator
* `<>` – inequality operator
* `=` – equality operator
Multiple qualifiers can be joined by using `OR` and `AND`, they can also
be grouped together by using parenthesis. Attribute values should be
@@ -1086,10 +1035,6 @@ not work for entries in this source and thus, freebusy lookups.
|If set as an address book, the human identification name of the LDAP
repository
|listRequiresDot (optional)
|If set to `YES`, listing of this LDAP source is only possible when performing a search (respecting the SOGoSearchMinimumWordLength parameter) or when explicitely typing a single dot.
Defaults to `YES` when unset.
|ModulesConstraints (optional)
|Limits the access of any module through a constraint based on an LDAP
attribute; must be a dictionary with keys `Mail`, and/or `Calendar`,
@@ -1162,7 +1107,6 @@ LDAP Attributes Indexing
To ensure proper performance of the SOGo application, the following LDAP
attributes must be fully indexed:
[options="compact"]
* givenName
* cn
* mail
@@ -1358,7 +1302,7 @@ If you want to test the IdP-initiated logout using SimpleSAMLphp, you can do so
the following URL:
----
https://idp.example.org/simplesaml/saml2/idp/SingleLogoutService.php?ReturnTo=sogo.nu
https://idp.example.org/simplesaml/saml2/idp/SingleLogoutService.php?ReturnTo=www.sogo.nu
----
In order to relay authentication information to your IMAP server and if
@@ -1380,35 +1324,12 @@ supported, such as MySQL and Oracle.
First, make sure that your PostgreSQL server has TCP/IP connections
support enabled.
[TIP]
===============================
SOGo stores the database hostname together with table references inside
several database tables. To prevent possible future issues when moving
the database to another host, it is best practice to add a local alias name to
your `/etc/hosts` file, and using this in `/etc/sogo/sogo.conf` instead of the
actual name of your server or localhost. When the database host name changes,
you can now simply change the hosts file instead of updating several table
columns replacing the old hostname. An example entry for `/etc/hosts` when
running the database on the same host, registering `127.0.0.1` not only for
`localhost`, but also the `db-alias` alias:
127.0.0.1 localhost db-alias
In the SOGo configuration, use the alias name instead of the real IP address or
host name, for example
----
SOGoProfileURL =
"postgresql://sogo:sogo@db-alias:5432/sogo/sogo_user_profile";
----
===============================
Create the database user and schema using the following commands:
----
su - postgres
createuser --no-superuser --no-createdb --no-createrole \
--encrypted --pwprompt sogo
su – postgres
createuser --no-superuser --no-createdb –-no-createrole \
–-encrypted --pwprompt sogo
(specify “sogo” as password)
createdb -O sogo sogo
----
@@ -1463,46 +1384,9 @@ _SOGoEnableEMailAlarms_ is set to `YES`. For PostgreSQL, the database
URL could be set to something like:
`postgresql://sogo:sogo@localhost:5432/sogo/sogo_alarms_folder`
|S |OCSStoreURL
|Parameter used to set the database URL so that SOGo can use to store
all content data. You must also set `OCSAclURL` and `OCSCacheFolderURL`
if you set this parameter. Using these parameters will allow SOGo to use
a total of nine database tables - and prevent SOGo from creating three
database tables per collection.
For PostgresSQL, set the database URL to something like:
`postgresql://sogo:@localhost:5432/sogo/sogo_store`.
|S |OCSAclURL
|Parameter used to set the database URL so that SOGo can use to store
all ACL data. You must also set `OCSStoreURL` and `OCSCacheFolderURL`
if you set this parameter.
For PostgresSQL, set the database URL to something like:
`postgresql://sogo:@localhost:5432/sogo/sogo_acl`.
|S |OCSCacheFolderURL
|Parameter used to set the database URL so that SOGo can use to store
all cache data. You must also set `OCSStoreURL` and `OCSAclURL`
if you set this parameter.
For PostgresSQL, set the database URL to something like:
`postgresql://sogo:@localhost:5432/sogo/sogo_cache_folder`.
See the "EMail reminders" section in this document for more information.
|=======================================================================
[NOTE]
Any non-URL safe characters in username/password must be URL-encoded.
For example, if your SOGo database password is `so%go`, you must set
the value in your preferences to `so%25go` - where `%` is encoded
to `%25`.
In addition to the seven tables described above, two other tables get
created in the database: `sogo_quick_appointment` and `sogo_quick_contact`
which store calendar and contact information.
If you're using MySQL, make sure in your `my.cnf` file you have:
----
@@ -1518,72 +1402,6 @@ default-character-set=utf8
default-character-set=utf8
----
MySQL complete Unicode compliance
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
By default MySQL only supports a subset of UTF-8, meaning that characters such
as emoji are not handled properly. Some extra steps at installation can be
undertaken to leverage full Unicode support under MySQL.
IMPORTANT: Switching to complete Unicode compliance on an already-deployed SOGo
is out of scope of this document, as it would typically involve delicate manual
operations on the database system.
Requirements:
* MySQL >= 5.5
* SOGo >= 3.1.0
Strongly suggested MySQL configuration settings (innodb* parameters are
mandatory):
----
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
innodb_file_per_table = TRUE
innodb_file_format = barracuda
innodb_large_prefix = TRUE
----
CAUTION: Changing InnoDB parameters on an already deployed database server can
cause severe data loss. Do not blindly edit MySQL parameters without reading
and understanding the implication of such changes.
A parameter must be added to `sogo.conf` to turn on complete Unicode
compliance:
----
MySQL4Encoding = "utf8mb4";
----
SOGo automatically creates missing database tables on start but slightly
different table creation parameters are needed for complete Unicode compliance;
meaning that before SOGo runs for the first time, all database tables must
already exist. A MySQL script to achieve just that is provided in the SOGo
distribution under `Scripts/mysql-utf8mb4.sql` and you can deploy it with
a command such as:
----
mysql -hHOST -uUSER -p -D SOGO < Scripts/mysql-utf8mb4.sql
----
Where `HOST`, `USER` and `SOGO` are your MySQL host, username and database name
respectively.
Once SOGo is running, you can test correctness by creating an event such as
“Lunch with &#127829; and fries” and seeing it properly displayed in the SOGo
calendar.
Ensure the computer used for the test has emoji fonts installed.
Authentication using SQL
~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1605,7 +1423,7 @@ source can contain the following values:
|The type of this user source, set to `sql` for a SQL source.
|id
|The identification name of the SQL repository. This must be unique -
|The identification name of the SQL repository. This must be unique –
even when using multiple domains.
|viewURL
@@ -1613,14 +1431,14 @@ even when using multiple domains.
present. Required columns are:
[options="compact"]
* `c_uid`: will be used for authentication - it's a username or
* `c_uid`: will be used for authentication – it's a username or
username@domain.tld
* `c_name`: will be used to uniquely identify entries - which can be
* `c_name`: will be used to uniquely identify entries – which can be
identical to `c_uid`
* `c_password`: password of the user, plain text, crypt, md5 or sha
encoded
* `c_cn`: the user's common name
* `mail`: the user's email address
* mail : the user's email address
Other columns can exist and will actually be mapped automatically if
they have the same name as popular LDAP attributes (such as `givenName`,
@@ -1666,10 +1484,8 @@ repository.
authentication usernames (defaults to `c_uid` when unset).
|MailFieldNames (optional)
|An array of fields that specifies the column names that hold
|Aan array of fields that specifies the column names that hold
additional email addresses (beside the `mail` column) for each user.
Values must be unique and not appear in more than one column.
Space-separated values allowed in all *additional* columns (besides in `mail`).
|IMAPHostFieldName (optional)
|The field that returns the IMAP hostname for the user.
@@ -1723,14 +1539,14 @@ SOGoUserSources =
Certain database columns must be present in the view/table, such as:
* `c_uid` - will be used for authentication - it's the username
* `c_uid` – will be used for authentication – it's the username
or username@domain.tld
* `c_name` - which can be identical to `c_uid` - will be used to
* `c_name` – which can be identical to `c_uid` – will be used to
uniquely identify entries
* `c_password` - password of the user, plain-text, md5 or sha encoded
* `c_password` – password of the user, plain-text, md5 or sha encoded
for now
* `c_cn` - the user's common name - such as "John Doe"
* `mail` - the user's mail address
* `c_cn` – the user's common name – such as "John Doe"
* `mail` – the user's mail address
Note that groups are currently not supported for SQL-based
authentication sources.
@@ -1750,8 +1566,8 @@ The following table describes the related parameters.
are:
[options="compact"]
* `sendmail` - to use the sendmail binary
* `smtp` - to use the SMTP protocol
* `sendmail` – to use the sendmail binary
* `smtp` – to use the SMTP protocol
|D |SOGoSMTPServer
|The DNS name or IP address of the SMTP server used when
@@ -1951,11 +1767,6 @@ behaviour of SOGo.
Defaults to `SOGo` when unset.
|S |SOGoHelpURL
|Parameter used to define the URL to online help for SOGo. When set,
an additional icon will appear near the logout button in SOGo's
web interface. The URL will always be open in a separate page.
|U |SOGoLoginModule
|Parameter used to specify which module to show after login. Possible
values are:
@@ -1994,17 +1805,7 @@ interface)
|Parameter used to specify the default order of the columns from the
SOGo webmail interface. The parameter is an array, for example:
`SOGoMailListViewColumnsOrder = (Flagged, Attachment, Priority, From, Subject, Unread, Date, Size);`
|D |SOGoExternalAvatarsEnabled
|Parameter used to enable fetching of avatars from remote services.
Defaults to `YES` when unset.
|U |SOGoGravatarEnabled
|Parameter used to activate fetching of avatars from http://gravatar.com/[Gravatar].
Defaults to `YES` when unset.
SOGoMailListViewColumnsOrder = (Flagged, Attachment, Priority, From, Subject, Unread, Date, Size);
|D |SOGoVacationEnabled
|Parameter used to activate the edition from the preferences window of a
@@ -2021,33 +1822,6 @@ message expiration.
See the _Cronjob — Vacation messages expiration_ section below for
details.
|D |SOGoVacationDefaultSubject
|Parameter used to define a default vacation subject if user don't specify a
custom subject.
Defaults to the characters "Auto: " followed by the original subject when unset,
as stated by RFC 5230.
|D |SOGoVacationHeaderTemplateFile
|Parameter used to specify the path of a text file whose content must be
prepended to the user's vacation message. For example:
`SOGoVacationHeaderTemplateFile = /etc/sogo/autoresponder.header.txt;`
The following template variables can appear in the content:
[options="compact"]
* `%{username}`
* `%{daysBetweenResponse}`
|D |SOGoVacationFooterTemplateFile
|Parameter used to specify the path of a text file whose content must be
appended to the user's vacation message. For example:
`SOGoVacationFooterTemplateFile = /etc/sogo/autoresponder.footer.txt;`
See `SOGoVacationHeaderTemplateFile` for available template variables.
|D |SOGoForwardEnabled
|Parameter used to activate the edition from the preferences window of a
forwarding email address. Requires Sieve script support on the IMAP
@@ -2068,11 +1842,6 @@ host.
Defaults to `NO` when unset.
|U |SOGoSieveFilters
|Parameter used to define initial Sieve scripts for users. The user
can still modify the scripts and the initial values will be written
to the Sieve server upon first login.
|D |SOGoMailPollingIntervals
|Parameter used to define the mail polling intervals (in minutes)
available to the user. The parameter is an array that can contain the
@@ -2330,7 +2099,7 @@ be put under `~sogo/GNUstep/Library/SOGo/Templates/PreferencesUI/`.
and the follow keys are supported: `vendor` (which must be set to "generic"
for now), `junkEmailAddress` which sets the email address to whom SOGo will
send junk mails to, `notJunkEmailAddress` which sets the email address to
whom SOGo will send non-junk mails to and `limit`, which is an integer value
whome SOGo will send non-junk mails to and `limit`, which is an integer value
and sets the maximum number of mails that will be attached to a
junk/not junk report sent by SOGo. Example: `SOGoMailJunkSettings = {
vendor = "generic"; junkEmailAddress = "spam@foo.com";
@@ -2509,7 +2278,7 @@ RequestHeader set "x-webobjects-server-url" "http://yourhostname"
You may consider enabling SSL on top of this current installation to
secure access to your SOGo installation.
See http://httpd.apache.org/docs/2.4/ssl/ for details.
See http://httpd.apache.org/docs/2.2/ssl/ for details.
You might also have to adjust the configuration if you have SELinux
enabled.
@@ -2524,13 +2293,13 @@ Starting Services
Once SOGo if fully installed and configured, start the services using
the following command:
systemctl start sogod.service
service sogod start
You may verify using the `systemctl is-enabled sogod` command that the SOGo
service is automatically started at boot time. Restart the Apache service since
You may verify using thechkconfigcommand that the SOGo service is
automatically started at boot time. Restart the Apache service since
modules and configuration files were added:
systemctl restart httpd.service
service httpd restart
Finally, you should also make sure that the `memcached` service is
started and that it is also automatically started at boot time.
@@ -2559,11 +2328,11 @@ If your mail server requires use of SMTP AUTH, specify a credential file
using `-p /path/to/credFile`. This file should contain the username and
password, separated by a colon (`username:password`)
_Cronjob_ — Vacation messages activation and expiration
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_Cronjob_ — Vacation messages expiration
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When vacation messages are enabled (see the parameter
_SOGoVacationEnabled_), users can set an activation or expiration date to messages
_SOGoVacationEnabled_), users can set an expiration date to messages
auto-reply. For this feature to work, you must run a _cronjob_ under the
"sogo" user.
@@ -2577,7 +2346,7 @@ contain the username and password, separated by a colon
The _cronjob_ should look like this:
----
0 0 * * * sogo /usr/sbin/sogo-tool update-autoreply -p /etc/sogo/sieve.creds
0 0 * * * sogo /usr/sbin/sogo-tool expire-autoreply -p /etc/sogo/sieve.creds
----
Managing User Accounts
@@ -2874,7 +2643,7 @@ your site. However, be aware that in order to use the SOGo Integrator
plug in, you will need to repackage it with specific modifications.
Please refer to the documentation published online:
http://sogo.nu/downloads/documentation.html
http://www.sogo.nu/downloads/documentation.html
If you only use the SOGo Connector plug in, you can still easily access
your data.
@@ -1,7 +1,5 @@
Mobile Devices Configuration Guide
==================================
:toc: left
:icons: font
////
@@ -1,7 +1,5 @@
Mozilla Thunderbird Configuration Guide
=======================================
:toc: left
:icons: font
////
@@ -63,8 +61,9 @@ Mozilla Thunderbird
Mozilla Thunderbird is the official front end client of SOGo.
Mozilla Thunderbird versions 31, 38, 45 and above are supported
and it is recommended to use the latest version of Thunderbird.
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:
@@ -73,16 +72,33 @@ https://www.mozilla.org/en-US/thunderbird/organizations/all-esr.html
Mozilla Lightning
~~~~~~~~~~~~~~~~~
When using Thunderbird, you can use the latest version of Mozilla
Lightning. Use the Add-ons manager of Thunderbird or visit:
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 with the SOGo groupware solution.
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
@@ -120,7 +136,7 @@ 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_.
following chapter – _SOGo Integrator Customization_.
SOGo Integrator Customization
-----------------------------
@@ -141,7 +157,7 @@ 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, it is strongly recommended to create and
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
@@ -152,7 +168,7 @@ 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.
since the updates are expected to propagate automatically. 
Uncompress (using a ZIP or jar tool) the SOGo Integrator XPI and locate
the following file:
@@ -179,7 +195,7 @@ if the SOGo server is accessible from the following URL:
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
value *must* match the one you specify in `isi:updateURL` – even the
port number.
Moreover, you *must* change the value of the
@@ -200,7 +216,7 @@ 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
Mozilla Thunderbird extensions, push user settings and more – all from a
central place managed by system administrators.
Installation
@@ -1,7 +1,5 @@
Native Microsoft Outlook Configuration Guide
============================================
:toc: left
:icons: font
////
@@ -144,7 +142,7 @@ to authenticate users. A SOGoUserSources entry to achieve this wold look
like this:
----
su - sogo
su – sogo
defaults write sogod SOGoUserSources '(
{
CNFieldName = displayName;
@@ -247,7 +245,7 @@ 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 – 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
@@ -321,11 +319,11 @@ disable the upstart check. For more details, refer to:
https://wiki.samba.org/index.php/Samba4/InitScript
////
Ubuntu 16.04 (Xenial Xerus)
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Debian 8 (Jessie) and Ubuntu 14.04 (Trusty Tahr)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Please follow the instructions from
https://sogo.nu/download.html to setup your
http://www.sogo.nu/english/downloads/backend.html to setup your
apt sources.
Then install Samba 4 on top of an existing SOGo
@@ -722,7 +720,7 @@ 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
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: 
@@ -805,6 +803,10 @@ 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
+3 -3
View File
@@ -1,7 +1,7 @@
<!-- TODO have the build system take care of this -->
<releaseinfo>Version 3.2.0 - October 2016</releaseinfo>
<subtitle>for version 3.2.0</subtitle>
<date>2016-10-03</date>
<releaseinfo>Version 2.3.8 - February 2016</releaseinfo>
<subtitle>for version 2.3.8</subtitle>
<date>2016-02-05</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>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

@@ -6,7 +6,7 @@
Authors:
- Inverse inc. <info@inverse.ca>
Copyright (C) 2008-2016 Inverse inc.
Copyright (C) 2008-2014 Inverse inc.
License: GFDL 1.2 or later. http://www.gnu.org/licenses/fdl.html
////
@@ -17,7 +17,7 @@ Additional Information
For more information, please consult the online FAQs (Frequently Asked
Questions) :
http://sogo.nu/support/faq.html
http://www.sogo.nu/english/support/faq.html
You can also read the mailing archives or post your questions to it. For
details, see :
@@ -13,6 +13,6 @@
// TODO have the build system take care of this
:release_version: 3.2.0
:release_version: 2.3.8
// vim: set syntax=asciidoc tabstop=2 shiftwidth=2 expandtab:
+2
View File
@@ -19,6 +19,7 @@
02111-1307, USA.
*/
#import <Foundation/NSObject.h>
@interface MainUIProduct : NSObject
{
@@ -26,6 +27,7 @@
@end
#import <Foundation/Foundation.h>
@implementation MainUIProduct
+1
View File
@@ -20,6 +20,7 @@
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSException.h>
@interface NSException (SOGoExtensions)
+1
View File
@@ -19,6 +19,7 @@
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include <execinfo.h>
#import "NSException+Stacktrace.h"
+25 -14
View File
@@ -18,12 +18,18 @@
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSDictionary.h>
#import <Foundation/NSEnumerator.h>
#import <NGObjWeb/NSException+HTTP.h>
#import <NGObjWeb/SoObject+SoDAV.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGObjWeb/WORequest.h>
#import <NGExtensions/NSObject+Logs.h>
#import <DOM/DOMDocument.h>
#import <DOM/DOMNode.h>
#import <DOM/DOMProtocols.h>
#import <SaxObjC/XMLNamespaces.h>
#import <SOGo/NSArray+Utilities.h>
@@ -36,7 +42,6 @@
#import <SOGo/SOGoPermissions.h>
#import <SOGo/SOGoUser.h>
#import <SOGo/SOGoUserFolder.h>
#import <SOGo/SOGoUserManager.h>
#import "SOGo+DAV.h"
@@ -360,26 +365,31 @@
withEmailAddressSetMatching: (NSString *) value
inContext: (WOContext *) localContext
{
SOGoUserManager *um;
id <SOGoSource> authenticationSource;
SOGoUser *activeUser;
NSArray *records;
NSUInteger count, max;
NSString *uid;
SOGoUserFolder *collection;
um = [SOGoUserManager sharedUserManager];
records = [um fetchUsersMatching: value
inDomain: [[localContext activeUser] domain]];
max = [records count];
for (count = 0; count < max; count++)
activeUser = [localContext activeUser];
if ([activeUser respondsToSelector: @selector (authenticationSource)])
{
uid = [[records objectAtIndex: count] objectForKey: @"c_uid"];
if ([uid length] > 0)
{
collection = [[SOGoUser userWithLogin: uid]
authenticationSource = [[localContext activeUser] authenticationSource];
records = [authenticationSource
fetchContactsMatching: value
inDomain: [activeUser domain]];
max = [records count];
for (count = 0; count < max; count++)
{
uid = [[records objectAtIndex: count] objectForKey: @"c_uid"];
if ([uid length] > 0)
{
collection = [[SOGoUser userWithLogin: uid]
homeFolderInContext: localContext];
[collections addObject: collection];
}
[collections addObject: collection];
}
}
}
}
@@ -575,6 +585,7 @@
@"addressbook", @"calendar-access",
@"calendar-schedule", @"calendar-auto-schedule",
@"calendar-proxy",
@"calendar-query-extended",
@"extended-mkcol",
@"calendarserver-principal-property-search",
+3 -1
View File
@@ -1,5 +1,6 @@
/*
Copyright (C) 2005-2016 Inverse inc.
Copyright (C) 2005-2010 Inverse inc.
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of SOGo.
@@ -26,6 +27,7 @@
@class NSArray;
@class NSDictionary;
@class NSMutableDictionary;
@class SOGoCache;
+24 -136
View File
@@ -1,5 +1,6 @@
/*
Copyright (C) 2005-2016 Inverse inc.
Copyright (C) 2005-2014 Inverse inc.
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of SOGo
@@ -19,11 +20,18 @@
02111-1307, USA.
*/
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSDebug.h>
#import <Foundation/NSData.h>
#import <Foundation/NSDate.h>
#import <Foundation/NSEnumerator.h>
#import <Foundation/NSProcessInfo.h>
#import <Foundation/NSRunLoop.h>
#import <Foundation/NSURL.h>
#import <GDLAccess/EOAdaptorChannel.h>
#import <GDLContentStore/GCSChannelManager.h>
#import <GDLContentStore/GCSFolderManager.h>
#import <GDLContentStore/GCSFolderType.h>
#import <GDLContentStore/GCSAlarmsFolder.h>
#import <GDLContentStore/GCSSessionsFolder.h>
@@ -50,6 +58,7 @@
#import <SOGo/SOGoPublicBaseFolder.h>
#import <SOGo/SOGoProductLoader.h>
#import <SOGo/SOGoProxyAuthenticator.h>
#import <SOGo/SOGoUserFolder.h>
#import <SOGo/SOGoUser.h>
#import <SOGo/SOGoSystemDefaults.h>
#import <SOGo/SOGoWebAuthenticator.h>
@@ -136,7 +145,7 @@ static BOOL debugLeaks;
[$(@"SOGoFolder") soClass];
/* load products */
[[SOGoProductLoader productLoader] loadAllProducts: YES];
[[SOGoProductLoader productLoader] loadAllProducts];
}
- (id) init
@@ -211,94 +220,36 @@ static BOOL debugLeaks;
[cm releaseChannel: tc];
}
- (void) _checkQuickTableWithTypeName: typeName
withCm: (GCSChannelManager *) cm
tableURL: (NSString *) url
{
GCSFolderType *type;
NSString *sql;
NSString *tableName;
EOAdaptorChannel *channel;
channel = [cm acquireOpenChannelForURL: [NSURL URLWithString: url]];
tableName = [NSString stringWithFormat: @"sogo_quick_%@", typeName];
sql = [NSString stringWithFormat: @"SELECT count(*) FROM %@",
tableName];
if ([channel evaluateExpressionX: sql])
{
type = [GCSFolderType folderTypeWithName: typeName];
if (type)
{
sql = [type sqlQuickCreateWithTableName: tableName];
if (![channel evaluateExpressionX: sql])
[self logWithFormat: @"sogo quick table %@ successfully created!",
tableName];
}
}
else
[channel cancelFetch];
[cm releaseChannel:channel];
}
//
// If OCSStoreURL is defined, we also check for OCSAclURL, OCSCacheFolderURL
// and we create the combined quick tables.
//
- (BOOL) _checkMandatoryTables
{
GCSChannelManager *cm;
GCSFolderManager *fm;
NSArray *urlStrings;
NSArray *quickTypeStrings;
NSString *tmp, *value;
NSString *urlStrings[] = {@"SOGoProfileURL", @"OCSFolderInfoURL", nil};
NSString **urlString;
NSString *value;
SOGoSystemDefaults *defaults;
NSEnumerator *e;
BOOL ok, combined;
BOOL ok;
defaults = [SOGoSystemDefaults sharedSystemDefaults];
ok = YES;
if ([GCSFolderManager singleStoreMode])
{
urlStrings = [NSArray arrayWithObjects: @"SOGoProfileURL", @"OCSFolderInfoURL", @"OCSStoreURL", @"OCSAclURL", @"OCSCacheFolderURL", nil];
quickTypeStrings = [NSArray arrayWithObjects: @"contact", @"appointment", nil];
combined = YES;
}
else
{
urlStrings = [NSArray arrayWithObjects: @"SOGoProfileURL", @"OCSFolderInfoURL", nil];
combined = NO;
}
cm = [GCSChannelManager defaultChannelManager];
e = [urlStrings objectEnumerator];
while (ok && (tmp = [e nextObject]))
urlString = urlStrings;
while (ok && *urlString)
{
value = [defaults stringForKey: tmp];
value = [defaults stringForKey: *urlString];
if (value)
[self _checkTableWithCM: cm tableURL: value andType: tmp];
{
[self _checkTableWithCM: cm tableURL: value andType: *urlString];
urlString++;
}
else
{
[self errorWithFormat: @"No value specified for '%@'", tmp];
[self errorWithFormat: @"No value specified for '%@'", *urlString];
ok = NO;
}
}
if (combined)
{
e = [quickTypeStrings objectEnumerator];
while ((tmp = [e nextObject]))
{
[self _checkQuickTableWithTypeName: tmp
withCm: cm
tableURL: [defaults stringForKey: @"OCSFolderInfoURL"]];
}
}
if (ok)
{
fm = [GCSFolderManager defaultFolderManager];
@@ -474,12 +425,8 @@ static BOOL debugLeaks;
{
static NSArray *runLoopModes = nil;
static BOOL debugOn = NO;
SOGoSystemDefaults *sd;
WOResponse *resp;
NSDate *startDate;
NSString *path;
NSTimeInterval timeDelta;
if (debugRequests)
@@ -489,7 +436,6 @@ static BOOL debugLeaks;
startDate = [NSDate date];
}
sd = [SOGoSystemDefaults sharedSystemDefaults];
cache = [SOGoCache sharedCache];
#ifdef GNUSTEP_BASE_LIBRARY
if (debugLeaks)
@@ -504,64 +450,6 @@ static BOOL debugLeaks;
}
#endif
// We check for rate-limiting settings - ignore anything actually
// sent to /SOGo/ (so unauthenticated requests).
path = [_request requestHandlerPath];
if ([path length] && [sd maximumRequestCount] > 0)
{
NSDictionary *requestCount;
NSString *username;
NSRange r;
r = [path rangeOfString: @"/"];
// We handle /sogo1/Calendar/.../ and "sogo1" as paths
if (r.length)
username = [path substringWithRange: NSMakeRange(0, r.location)];
else
username = path;
requestCount = [cache requestCountForLogin: username];
if (requestCount)
{
unsigned int current_time, start_time, delta, block_time, request_count;
current_time = [[NSCalendarDate date] timeIntervalSince1970];
start_time = [[requestCount objectForKey: @"InitialDate"] unsignedIntValue];
delta = current_time - start_time;
block_time = [sd requestBlockInterval];
request_count = [[requestCount objectForKey: @"RequestCount"] intValue];
if ( request_count >= [sd maximumRequestCount] &&
delta < [sd maximumRequestInterval] &&
delta <= block_time )
{
resp = [WOResponse responseWithRequest: _request];
[resp setStatus: 429];
return resp;
}
if (delta > block_time)
{
[cache setRequestCount: 1
forLogin: username
interval: current_time];
}
else
[cache setRequestCount: (request_count+1)
forLogin: username
interval: start_time];
}
else
{
[cache setRequestCount: 1
forLogin: username
interval: 0];
}
}
resp = [super dispatchRequest: _request];
[cache killCache];
+2
View File
@@ -21,8 +21,10 @@
*/
#include <unistd.h>
#include <sys/types.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSString.h>
#import <Foundation/NSTimeZone.h>
#import <NGObjWeb/SoApplication.h>
+6 -340
View File
@@ -1,347 +1,13 @@
3.2.0 (2016-10-03)
------------------
New features
- [web] added IMAP folder subscriptions management (#255)
- [web] keyboard hotkeys (#1711, #1467, #3817)
- [eas] initial support for server-side mailbox search operations
Enhancements
- [web] don't allow a recurrence rule to end before the first occurrence
- [web] updated Angular Material to version 1.1.1
- [web] show user's name upon successful login
- [web] inserted unseen messages count and mailbox name in browser's window title
- [web] disable JavaScript theme generation when SOGoUIxDebugEnabled is set to NO
- [web] added Serbian (sr) translation - thanks to Bogdanović Bojan
- [web] added sort by arrival date in Mail module (#708)
- [web] restored "now" line in Calendar module
- [web] updated CKEditor to version 4.5.11
- [web] allow custom email address to be one of the user's profile (#3551)
- [eas] propagate message submission errors to EAS clients (#3774)
Bug fixes
- [eas] properly generate the BusyStatus for normal events
- [eas] properly escape all email and address fields
- [eas] properly generate yearly rrule
- [eas] make sure we don't sleep for too long when EAS processes need interruption
- [eas] fixed recurring events with timezones for EAS (#3822)
- [web] restored functionality to save unknown recipient emails to address book on send
- [web] fixed ripple blocking the form when submitting no values (#3808)
- [web] fixed error handling when renaming a mailbox
- [web] handle binary content transfer encoding when displaying mails
- [web] removed resize grips to short events (#3771)
- [core] strip protocol value from proxyAddresses attribute (#3182)
- [core] we now search in all domain sources for Apple Calendar
- [core] properly handle groups in Apple Calendar's delegation
- [core] fixed caching expiration of ACLs assigned to LDAP groups (#2867)
- [core] make sure new cards always have a UID (#3819)
- [core] fixed default TRANSP value when creating event
3.1.5 (2016-08-10)
------------------
New features
- [web] drag'n'drop of messages in the Mail module (#3497, #3586, #3734, #3788)
- [web] drag'n'drop of cards in the AddressBook module
- [eas] added folder merging capabilities
Enhancements
- [web] improve action progress when login in or sending a message (#3765, #3761)
- [web] don't allow to send the message while an upload is in progress
- [web] notify when successfully copied or moved some messages
- [web] restored indicator in the top banner when a vacation message (auto-reply) is active
- [web] removed animation when dragging an event to speed up rendering
- [web] expunge drafts mailbox when a draft is sent and deleted
- [web] actions of Sieve filters are now sortable
- [web] show progress indicator when refreshing events/tasks lists
- [web] updated CKEditor to version 4.5.10
Bug fixes
- [web] fixed refresh of addressbook when deleting one or many cards
- [web] reset multiple-selection mode after deleting cards, events or tasks
- [web] fixed exception when moving tasks to a different calendar
- [web] fixed printing of long mail (#3731)
- [web] fixed position of ghost block when creating an event from DnD
- [web] fixed avatar image in autocompletion
- [web] restored expunge of current mailbox when leaving the Mail module
- [web] added support for multiple description values in LDAP entries (#3750)
- [web] don't allow drag'n'drop of invitations
- [eas] fixed long GUID issue preventing sometimes synchronisation (#3460)
- [core] fixing sogo-tool backup with multi-domain configuration but domain-less logins
- [core] during event scheduling, use 409 instead of 403 so Lightning doesn't fail silently
- [core] correctly calculate recurrence exceptions when not overlapping the recurrence id
- [core] prevent invalid SENT-BY handling during event invitations (#3759)
3.1.4 (2016-07-12)
------------------
New features
- [core] new sogo-tool truncate-calendar feature (#1513, #3141)
- [eas] initial Out-of-Office support in EAS
- [oc] initial support for calendar and address book sharing with OpenChange
Enhancements
- [eas] use the preferred email identity in EAS if valid (#3698)
- [eas] handle inline attachments during EAS content generation
- [web] all batch operations can now be performed on selected messages in advanced search mode
- [web] add date picker to change date, week, or month of current Calendar view
- [web] style cancelled events in Calendar module
- [web] replace sortable library for better support with Firefox
- [web] stage-1 tuning of sgColorPicker directive
- [oc] better handling of nested attachments with OpenChange
Bug fixes
- [web] fixed crash when an attachment filename has no extension
- [web] fixed selection of transparent all-day events (#3744)
- [web] leaving the dropping area while dragging a file was blocking the mail editor
- [web] fixed scrolling of all-day events (#3190)
- [eas] handle base64 EAS protocol version
- [eas] handle missing IMAP folders from a hierarchy using EAS
3.1.3 (2016-06-22)
------------------
New features
- [core] now possible to define default Sieve filters (#2949)
- [core] now possible to set vacation message start date (#3679)
- [web] add a header and/or footer to the vacation message (#1961)
- [web] specify a custom subject for the vacation message (#685, #1447)
Enhancements
- [core] when restoring data using sogo-tool, regenerate Sieve script (#3029)
- [web] always display name of month in week view (#3724)
- [web] use a speed dial (instead of a dialog) for card/list creation
- [web] use a speed dial for event/task creation
- [web] CSS is now minified using clean-css
Bug fixes
- [core] properly handle sorted/deleted calendars (#3723)
- [core] properly handle flattened timezone definitions (#2690)
- [web] fixed generic avatar in lists (#3719)
- [web] fixed validation in Sieve filter editor
- [web] properly encode rawsource of events and tasks to avoid XSS issues (#3718)
- [web] properly encode rawsource of cards to avoid XSS issues
- [web] fixed all-day events covering a timezone change (#3457)
- [web] sgTimePicker parser now respects the user's time format and language
- [web] fixed time format when user chooses the default one
- [web] added missing delegators identities in mail editor (#3720)
- [web] honour the domain default SOGoAppointmentSendEMailNotifications (#3729)
- [web] the login module parameter is now properly restored when set as "Last used"
- [web] if cn isn't found for shared mailboxes, use email address (#3733)
- [web] fixed handling of attendees when updating an event
- [web] show tooltips over long calendar/ab names (#232)
- [web] one-click option to give all permissions for user (#1637)
- [web] never query gravatar.com when disabled
3.1.2 (2016-06-06)
2.3.8 (2016-02-05)
------------------
Enhancements
- [web] updated Angular Material to version 1.1.0rc5
- updated CKEditor to version 4.5.7
Bug fixes
- [web] fixed error handling when renaming a mailbox
- [web] fixed user removal from ACLs in Administration module (#3713)
- [web] fixed event classification icon (private/confidential) in month view (#3711)
- [web] CKEditor: added the pastefromword plugin (#2295, #3313)
- [web] fixed loading of card from global addressbooks
- [web] fixed negative offset when saving an all-day event (#3717)
3.1.1 (2016-06-02)
------------------
Enhancements
- [web] expose all email addresses in autocompletion of message editor (#3443)
- [web] Gravatar service can now be disabled (#3600)
- [web] collapsable mail accounts (#3493)
- [web] show progress indicator when loading messages and cards
- [web] display messages sizes in list of Mail module
- [web] link event's attendees email addresses to mail composer
- [web] respect SOGoSearchMinimumWordLength when searching for events or tasks
- [web] updated CKEditor to version 4.5.9
- [web] CKEditor: switched to the minimalist skin
- [web] CKEditor: added the base64image plugin
Bug fixes
- [core] strip X- tags when securing content (#3695)
- [web] fixed creation of chip on blur (sgTransformOnBlur directive)
- [web] fixed composition of new messages from Contacts module
- [web] fixed autocompletion of LDAP-based groups (#3673)
- [web] fixed month view when current month covers six weeks (#3663)
- [web] fixed negative offset when converting a regular event to an all-day event (#3655)
- [web] fixed event classification icon (private/confidential) in day/week/multicolumn views
- [web] fixed display of mailboxes list on mobiles (#3654)
- [web] restored Catalan and Slovak translations (#3687)
- [web] fixed restore of mailboxes expansion state when multiple IMAP accounts are configured
- [web] improved CSS sanitizer for HTML messages (#3700)
- [web] fixed toolbar of mail editor when sender address was too long (#3705)
- [web] fixed decoding of filename in attachments (quotes and Cyrillic characters) (#2272)
- [web] fixed recipients when replying from a message in the Sent mailbox (#2625)
- [eas] when using EAS/ItemOperations, use IMAP PEEK operation
3.1.0 (2016-05-18)
------------------
New features
- [core] new database structure options to make SOGo use a total of nine tables
- [core] new user-based rate-limiting support for all SOGo requests (#3188)
- [web] toolbar of all-day events can be expanded to display all events
- [web] added AngularJS's XSRF support (#3246)
- [web] calendars list can be reordered and filtered
- [web] user can limit the calendars view to specific week days (#1841)
Enhancements
- [web] updated Angular Material to version 1.1.0rc4
- [web] added Lithuanan (lt) translation - thanks to Mantas Liobė
- [web] added Turkish (Turkey) (tr_TR) translation - thanks to Sinan Kurşunoğlu
- [web] we now "cc" delegates during invitation updates (#3195)
- [web] new SOGoHelpURL preference to set a custom URL for SOGo help (#2768)
- [web] now able to copy/move events and also duplicate them (#3196)
- [web] improved preferences validation and now check for unsaved changes
- [web] display events and tasks priorities in list and day/week views (#3162)
- [web] style events depending on the user participation state
- [web] style transparent events (show time as free) (#3192)
- [web] improved input parsing of time picker (#3659)
- [web] restored support for Web calendars that require authentication
Bug fixes
- [core] properly escape wide characters (#3616)
- [core] avoid double-appending domains in cache for multi-domain configurations (#3614)
- [core] fixed multidomain issue with non-unique ID accross domains (#3625)
- [core] fixed bogus headers generation when stripping folded bcc header (#3664)
- [core] fixed issue with multi-value org units (#3630)
- [core] sanity checks for events with bogus timezone offsets
- [web] fixed missing columns in SELECT statements (PostgreSQL)
- [web] fixed display of ghosts when dragging events
- [web] fixed management of mail labels in Preferences module
- [web] respect super user privileges to create in any calendar and addressbook (#3533)
- [web] properly null-terminate IS8601-formatted dates (#3539)
- [web] display CC/BCC fields in message editor when initialized with values
- [web] fixed message initialization in popup window (#3583)
- [web] create chip (recipient) on blur (#3470)
- [web] fixed position of warning when JavaScript is disabled (#3449)
- [web] respect the LDAP attributes mapping in the list view
- [web] handle empty body data when forwarding mails (#3581)
- [web] show repeating events when we ask for "All" or "Future" events (#69)
- [web] show the To instead of From when we are in the Sent folder (#3547)
- [web] fixed handling of mail tags in mail viewer
- [web] avoid marking mails as read when archiving a folder (#2792)
- [web] fixed crash when sending a message with a special priority
- [web] fixed saving of a custom weekly recurrence definition
- [web] properly escape the user's display name (#3617)
- [web] avoid returning search results on objects without read permissions (#3619)
- [web] restore priority of event or task in component editor
- [web] fixed menu content visibility when printing an email (#3584)
- [web] retired CSS reset so the style of HTML messages is respected (#3582)
- [web] fixed messages archiving as zip file
- [web] adapted time picker to match changes of md calendar picker
- [web] fixed sender addresses of draft when using multiple IMAP accounts (#3577)
- [web] create a new message when clicking on a "mailto" link (#3588)
- [web] fixed handling of Web calendars option "reload on login"
- [web] add recipient chip when leaving an input field (to/cc/bcc) (#3470)
- [dav] we now handle the default classifications for tasks (#3541)
- [eas] properly unfold long mail headers (#3152)
- [eas] correctly set EAS message class for S/MIME messages (#3576)
- [eas] handle FilterType changes using EAS (#3543)
- [eas] handle Dovecot's mail_shared_explicit_inbox parameter
- [eas] prevent concurrent Sync ops from same device (#3603)
- [eas] handle EAS loop termination when SOGo is being shutdown (#3604)
- [eas] now cache heartbeat interval and folders list during Ping ops (#3606)
- [eas] sanitize non-us-ascii 7bit emails (#3592)
- [eas] properly escape organizer name (#3615)
- [eas] correctly set answered/forwarded flags during smart operations
- [eas] don't mark calendar invitations as read when fetching messages
3.0.2 (2016-03-04)
------------------
New features
- [web] show all/only this calendar
- [web] convert a message to an appointment or a task (#1722)
- [web] customizable base font size for HTML messages
- [web you can now limit the file upload size using the WOMaxUploadSize
configuration parameter (integer value in kilobytes) (#3510, #3135)
Enhancements
- [web] added Junk handling feature from v2
- [web] updated Material Icons font to version 2.1.3
- [web] don't offer forward/vacation options in filters if not enabled
- [web] mail filters are now sortable
- [web] now supports RFC6154 and NoInferiors IMAP flag
- [web] improved confirm dialogs for deletions
- [web] allow resources to prevent invitations (#3410)
- [web] warn when double-booking attendees and offer force save option
- [web] list search now displays a warning regarding the minlength constraint
- [web] loading an LDAP-based addressbook is now instantaneous when listRequiresDot is disabled (#438, #3464)
- [web] improve display of messages with many recipients
- [web] colorize categories chips in event and task viewers
- [web] initial stylesheet for printing (#3484)
- [web] updated lodash to version 4.6.1
- [i18n] updated French and Finnish translations
- [eas] now support EAS MIME truncation
Bug fixes
- [web] handle birthday dates before 1970 (#3567)
- [web] safe-guarding against bogus value coming from the quick tables
- [web] apply search filters when automatically reloading current mailbox (#3507)
- [web] fixed virtual repeater when moving up in messages list
- [web] really delete mailboxes being deleted from the Trash folder (#595, #1189, #641)
- [web] fixed address autocompletion of mail editor affecting cards list of active addressbook
- [web] fixed batched delete of components (#3516)
- [web] fixed mail draft autosave in preferences (#3519)
- [web] fixed password change (#3496)
- [web] fixed saving of notification email for calendar changes (#3522)
- [web] fixed ACL editor for authenticated users in Mail module
- [web] fixed fab button position in Calendar module (#3462)
- [web] fixed default priority of sent messages (#3542)
- [web] removed double-quotes from Chinese (Taiwan) translations that were breaking templates
- [web] fixed unseen count retrieval of nested IMAP folders
- [web] properly extract the mail column values from an SQL contacts source (#3544)
- [web] fixed incorrect date formatting when timezone was after UTC+0 (#3481, #3494)
- [web] replaced checkboxes in menu by a custom checkmark (#3557)
- [web] fixed attachments display when forwarding a message (#3560)
- [web] activate new calendar subscriptions by default
- [web] keep specified task status when not completed (#3499)
- [eas] allow EAS attachments get on 2nd-level mailboxes (#3505)
- [eas] fix EAS bday shift (#3518)
- [eas] encode CR in EAS payload (#3626)
3.0.1 (2016-02-05)
------------------
Enhancements
- [web] improved scrolling behavior when deleting a single message (#3489)
- [web] added "Move To" option for selected messages (#3477)
- [web] updated CKEditor to version 4.5.7
- [web] updated Angular Material to 1.0.5
- [web/eas] add shared/public namespaces in the list or returned folders
Bug fixes
- [web] safeguard against mailboxes with no quota (#3468)
- [web] fixed blank calendar view when selecting "Descending Order" in the sort menu
- [web] show active user's default email address instead of system email address (#3473)
- [web] fixed display of HTML tags when viewing a message raw source (#3490)
- [web] fixed IMIP accept/decline when there is only one MIME part
- [web] improved handling of IMAP connection problem in Web interface
- [web] fixed frequency parsing of recurrence rule when saving new appointment (#3472)
- [web] added support for %p in date formatting (#3480)
- [web] make sure an email is defined before trying to use it (#3488)
- [web] handle broken messages that have no date (#3498)
- [web] fixed virtual-repeater display in Webmail when a search is performed (#3500)
- [web] fixed drag'n'drop of all-day events in multicolumn view
- [eas] correctly encode filename of attachments over EAS (#3491)
3.0.0 (2016-01-27)
------------------
New features
- complete rewrite of the JavaScript frontend using Angular and AngularMaterial
- responsive design and accessible options focused on mobile devices
- horizontal 3-pane view for a better experience on large desktop screens
- new color palette and better contrast ratio as recommended by the W3C
- improved accessibility to persons with disabilities by enabling common ARIA attributes
- use of Mozilla's Fira Sans typeface
- and many more!
- correctly encode filename of attachments over EAS (#3491)
- correctly encode square brackets for IMAP folder names (#3321)
- add shared/public namespaces in the list or returned folders
2.3.7 (2016-01-25)
------------------
@@ -365,7 +31,7 @@ New features
- now able to sync only default mail folders when using EAS
Enhancements
- Unit testing for RTFHandler
- unit testing for RTFHandler
- JUnit output for sogo-tests
Bug fixes
-3
View File
@@ -78,9 +78,6 @@ $(SOGOBACKEND)_OBJC_FILES += \
MAPIStoreGCSMessage.m \
MAPIStoreGCSMessageTable.m \
\
MAPIStoreCalTaskFolder.m \
MAPIStoreCalTaskMessage.m \
\
MAPIStoreCalendarAttachment.m \
MAPIStoreCalendarContext.m \
MAPIStoreCalendarFolder.m \
+94 -98
View File
@@ -68,109 +68,105 @@
- (void) fillMessageData: (struct mapistore_message *) dataPtr
inMemCtx: (TALLOC_CTX *) memCtx;
- (NSString *) creator;
- (NSString *) owner;
- (NSUInteger) sensitivity;
- (int) getPidTagSenderEmailAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagSenderAddressType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagSenderName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagSenderEntryId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagSenderEmailAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagSenderAddressType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagSenderName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagSenderEntryId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagReceivedByAddressType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagReceivedByEmailAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagReceivedByName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagReceivedByEntryId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagReceivedByAddressType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagReceivedByEmailAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagReceivedByName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagReceivedByEntryId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagIconIndex: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagOwnerAppointmentId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidMeetingType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagStartDate: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidAppointmentSequence: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidAppointmentStateFlags: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidResponseStatus: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidAppointmentStartWhole: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidCommonStart: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagEndDate: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidAppointmentEndWhole: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidCommonEnd: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidAppointmentDuration: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidAppointmentSubType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidBusyStatus: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidIndentedBusyStatus: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagNormalizedSubject: (void **) data // SUMMARY
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidLocation: (void **) data // LOCATION
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidPrivate: (void **) data // private (bool), should depend on CLASS and permissions
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagSensitivity: (void **) data // not implemented, depends on CLASS
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagImportance: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagBody: (void **) data
- (int) getPidTagIconIndex: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagOwnerAppointmentId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidMeetingType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagStartDate: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidAppointmentSequence: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidAppointmentStateFlags: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidIsRecurring: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidRecurring: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidAppointmentRecur: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidGlobalObjectId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidCleanGlobalObjectId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidServerProcessed: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidServerProcessingActions: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidAppointmentReplyTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidResponseStatus: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidAppointmentStartWhole: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidCommonStart: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagEndDate: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidAppointmentEndWhole: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidCommonEnd: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidAppointmentDuration: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidAppointmentSubType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidBusyStatus: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidIndentedBusyStatus: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagNormalizedSubject: (void **) data // SUMMARY
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidLocation: (void **) data // LOCATION
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidPrivate: (void **) data // private (bool), should depend on CLASS and permissions
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagSensitivity: (void **) data // not implemented, depends on CLASS
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagImportance: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagBody: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidIsRecurring: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidRecurring: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidAppointmentRecur: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidGlobalObjectId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidCleanGlobalObjectId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidServerProcessed: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidServerProcessingActions: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidAppointmentReplyTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
/* reminders */
- (enum mapistore_error) getPidLidReminderSet: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidReminderDelta: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidReminderTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidReminderSignalTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidReminderOverride: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidReminderType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidReminderPlaySound: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidReminderFileParameter: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidReminderSet: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidReminderDelta: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidReminderTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidReminderSignalTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidReminderOverride: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidReminderType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidReminderPlaySound: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidReminderFileParameter: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
@end
File diff suppressed because it is too large. Load diff
+7 -7
View File
@@ -36,13 +36,13 @@
- (void) setAID: (uint32_t) newAID;
- (uint32_t) AID;
- (enum mapistore_error) openEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr
withMID: (uint64_t *) mid
withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) createEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr
withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) openEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr
withMID: (uint64_t *) mid
withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) createEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr
withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr
inMemCtx: (TALLOC_CTX *) memCtx;
/* helpers */
- (NSData *) mimeAttachTag;
+15 -15
View File
@@ -67,40 +67,40 @@
return mimeAttachTag;
}
- (enum mapistore_error) getPidTagMid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongLongValue (memCtx, [container objectId]);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAttachNumber: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachNumber: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, aid);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagRenderingPosition: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagRenderingPosition: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, 0xffffffff);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAccessLevel: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAccessLevel: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getLongZero: data inMemCtx: memCtx];
}
- (enum mapistore_error) openEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr
withMID: (uint64_t *) mid
withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr
inMemCtx: (TALLOC_CTX *) memCtx
- (int) openEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr
withMID: (uint64_t *) mid
withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr
inMemCtx: (TALLOC_CTX *) memCtx
{
MAPIStoreEmbeddedMessage *attMessage;
struct mapistore_message *mapistoreMsg;
@@ -118,9 +118,9 @@
return (attMessage ? MAPISTORE_SUCCESS : MAPISTORE_ERROR);
}
- (enum mapistore_error) createEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr
withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr
inMemCtx: (TALLOC_CTX *) memCtx
- (int) createEmbeddedMessage: (MAPIStoreEmbeddedMessage **) messagePtr
withMAPIStoreMsg: (struct mapistore_message **) mapistoreMsgPtr
inMemCtx: (TALLOC_CTX *) memCtx
{
MAPIStoreEmbeddedMessage *attMessage;
struct mapistore_message *mapistoreMsg;
-35
View File
@@ -1,35 +0,0 @@
/* MAPIStoreCalTaskFolder.h - this file is part of SOGo
*
* Copyright (C) 2016 Enrique J. Hernandez
*
* Author: Enrique J. Hernandez <ejhernandez@zentyal.com>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef MAPISTORECALTASKFOLDER_H
#define MAPISTORECALTASKFOLDER_H
#import "MAPIStoreGCSFolder.h"
/* This class is intended to share code between Calendar and Tasks as
of nowadays share the table */
@interface MAPIStoreCalTaskFolder : MAPIStoreGCSFolder
@end
#endif /* MAPISTORECALTASKFOLDER_H */
-101
View File
@@ -1,101 +0,0 @@
/* MAPIStoreCalTaskFolder.m - this file is part of SOGo
*
* Copyright (C) 2016 Enrique J. Hernandez
*
* Author: Enrique J. Hernandez <ejhernandez@zentyal.com>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSArray.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSSet.h>
#import <Foundation/NSString.h>
#import <SOGo/SOGoPermissions.h>
#import "MAPIStoreCalTaskFolder.h"
@implementation MAPIStoreCalTaskFolder
- (NSArray *) expandRoles: (NSArray *) roles
{
static NSDictionary *rolesMap = nil;
NSArray *subRoles;
NSMutableSet *expandedRoles;
NSString *role, *subRole;
NSUInteger i, max, j;
if (!rolesMap)
{
/* Build the map of array permissions */
rolesMap = [[NSDictionary alloc] initWithObjects: [NSArray arrayWithObjects:
[NSArray arrayWithObjects: SOGoCalendarRole_PublicDAndTViewer,
SOGoCalendarRole_PublicViewer,
SOGoCalendarRole_PublicResponder,
SOGoCalendarRole_PublicModifier, nil],
[NSArray arrayWithObjects: SOGoCalendarRole_ConfidentialDAndTViewer,
SOGoCalendarRole_ConfidentialViewer,
SOGoCalendarRole_ConfidentialResponder,
SOGoCalendarRole_ConfidentialModifier, nil],
[NSArray arrayWithObjects: SOGoCalendarRole_PrivateDAndTViewer,
SOGoCalendarRole_PrivateViewer,
SOGoCalendarRole_PrivateResponder,
SOGoCalendarRole_PrivateModifier, nil],
[NSArray arrayWithObjects: SOGoCalendarRole_ComponentDAndTViewer,
SOGoCalendarRole_ComponentViewer,
SOGoCalendarRole_ComponentResponder,
SOGoCalendarRole_ComponentModifier, nil],
nil]
forKeys: [NSArray arrayWithObjects: @"Public", @"Confidential", @"Private",
@"Component", nil]];
}
max = [roles count];
expandedRoles = [NSMutableSet set];
for (i = 0; i < max; i++)
{
role = [roles objectAtIndex: i];
subRoles = nil;
if ([role hasPrefix: @"Public"])
subRoles = [rolesMap objectForKey: @"Public"];
else if ([role hasPrefix: @"Confidential"])
subRoles = [rolesMap objectForKey: @"Confidential"];
else if ([role hasPrefix: @"Private"])
subRoles = [rolesMap objectForKey: @"Private"];
else if ([role hasPrefix: @"Component"])
subRoles = [rolesMap objectForKey: @"Component"];
if (subRoles)
{
for (j = 0; j < [subRoles count]; j++)
{
subRole = [subRoles objectAtIndex: j];
[expandedRoles addObject: subRole];
if ([subRole isEqualToString: role])
break;
}
}
else
{
[expandedRoles addObject: role];
}
}
return [expandedRoles allObjects];
}
@end
-40
View File
@@ -1,40 +0,0 @@
/* MAPIStoreCalTaskMessage.h - this file is part of SOGo
*
* Copyright (C) 2016 Enrique J. Hernandez
*
* Author: Enrique J. Hernandez <ejhernandez@zentyal.com>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef MAPISTORECALTASKMESSAGE_H
#define MAPISTORECALTASKMESSAGE_H
#import "MAPIStoreGCSMessage.h"
/* This class is intended to share common logic for Calendar and Tasks
as of today they are stored in the same table. This is relevant for
permissions */
@interface MAPIStoreCalTaskMessage : MAPIStoreGCSMessage
{
}
/* Get the sensitivity (access class) from a message */
- (NSUInteger) sensitivity;
@end
#endif /* MAPISTORECALTASKMESSAGE_H */
-107
View File
@@ -1,107 +0,0 @@
/* MAPIStoreCalTaskMessage.h - this file is part of SOGo
*
* Copyright (C) 2016 Enrique J. Hernandez
*
* Author: Enrique J. Hernandez <ejhernandez@zentyal.com>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSArray.h>
#import <Foundation/NSString.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <SOGo/SOGoPermissions.h>
#import "MAPIStoreFolder.h"
#import "MAPIStoreCalTaskMessage.h"
@implementation MAPIStoreCalTaskMessage
/* It must be implemented by subclasses */
- (NSUInteger) sensitivity
{
[self subclassResponsibility: _cmd];
return 0;
}
- (NSArray *) expandRoles: (NSArray *) roles
{
return [container expandRoles: roles];
}
- (BOOL) subscriberCanModifyMessage
{
BOOL rc;
NSArray *roles;
roles = [self activeUserRoles];
if (isNew)
rc = [roles containsObject: SOGoRole_ObjectCreator];
else
rc = ([roles containsObject: SOGoCalendarRole_ComponentModifier]
|| [roles containsObject: SOGoCalendarRole_ComponentResponder]);
/* Check if the message is owned and it has permission to edit it */
if (!rc && [roles containsObject: MAPIStoreRightEditOwn])
{
NSString *currentUser;
currentUser = [[container context] activeUser];
rc = [currentUser isEqual: [self ownerUser]];
}
if (!rc)
{
NSUInteger sensitivity;
/* Get sensitivity of the message to check if the user can
modify the message */
sensitivity = [self sensitivity];
/* FIXME: Use OpenChange constant names */
switch (sensitivity)
{
case 0: /* PUBLIC */
rc = [roles containsObject: SOGoCalendarRole_PublicModifier]
|| [roles containsObject: SOGoCalendarRole_PublicResponder];
break;
case 1: /* PERSONAL */
case 2: /* PRIVATE */
rc = [roles containsObject: SOGoCalendarRole_PrivateModifier]
|| [roles containsObject: SOGoCalendarRole_PrivateResponder];
break;
case 3: /* CONFIDENTIAL */
rc = [roles containsObject: SOGoCalendarRole_ConfidentialModifier]
|| [roles containsObject: SOGoCalendarRole_ConfidentialResponder];
}
}
return rc;
}
- (BOOL) subscriberCanReadMessage
{
NSArray *roles;
roles = [self activeUserRoles];
return ([roles containsObject: SOGoCalendarRole_ComponentViewer]
|| [roles containsObject: SOGoCalendarRole_ComponentDAndTViewer]
|| [self subscriberCanModifyMessage]);
}
@end
+22 -22
View File
@@ -94,64 +94,64 @@
flattenedValuesForKey: @""];
}
- (enum mapistore_error) getPidTagAttachmentHidden: (void **) data
inMemCtx: (TALLOC_CTX *) localMemCtx
- (int) getPidTagAttachmentHidden: (void **) data
inMemCtx: (TALLOC_CTX *) localMemCtx
{
return [self getYes: data inMemCtx: localMemCtx];
}
- (enum mapistore_error) getPidTagAttachmentFlags: (void **) data
inMemCtx: (TALLOC_CTX *) localMemCtx
- (int) getPidTagAttachmentFlags: (void **) data
inMemCtx: (TALLOC_CTX *) localMemCtx
{
*data = MAPILongValue (localMemCtx, 0x00000002); /* afException */
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAttachmentLinkId: (void **) data
inMemCtx: (TALLOC_CTX *) localMemCtx
- (int) getPidTagAttachmentLinkId: (void **) data
inMemCtx: (TALLOC_CTX *) localMemCtx
{
return [self getLongZero: data inMemCtx: localMemCtx];
}
- (enum mapistore_error) getPidTagAttachFlags: (void **) data
inMemCtx: (TALLOC_CTX *) localMemCtx
- (int) getPidTagAttachFlags: (void **) data
inMemCtx: (TALLOC_CTX *) localMemCtx
{
return [self getLongZero: data inMemCtx: localMemCtx];
}
- (enum mapistore_error) getPidTagAttachMethod: (void **) data
inMemCtx: (TALLOC_CTX *) localMemCtx
- (int) getPidTagAttachMethod: (void **) data
inMemCtx: (TALLOC_CTX *) localMemCtx
{
*data = MAPILongValue (localMemCtx, afEmbeddedMessage);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAttachEncoding: (void **) data
inMemCtx: (TALLOC_CTX *) localMemCtx
- (int) getPidTagAttachEncoding: (void **) data
inMemCtx: (TALLOC_CTX *) localMemCtx
{
*data = [[NSData data] asBinaryInMemCtx: localMemCtx];
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) localMemCtx
- (int) getPidTagDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) localMemCtx
{
*data = [@"Untitled" asUnicodeInMemCtx: localMemCtx];
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAttachmentContactPhoto: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachmentContactPhoto: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getNo: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagExceptionReplaceTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagExceptionReplaceTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc;
NSCalendarDate *dateValue;
@@ -178,8 +178,8 @@
return rc;
}
- (enum mapistore_error) getPidTagExceptionStartTime: (void **) data
inMemCtx: (TALLOC_CTX *) localMemCtx
- (int) getPidTagExceptionStartTime: (void **) data
inMemCtx: (TALLOC_CTX *) localMemCtx
{
enum mapistore_error rc;
NSCalendarDate *dateValue;
@@ -205,8 +205,8 @@
return rc;
}
- (enum mapistore_error) getPidTagExceptionEndTime: (void **) data
inMemCtx: (TALLOC_CTX *) localMemCtx
- (int) getPidTagExceptionEndTime: (void **) data
inMemCtx: (TALLOC_CTX *) localMemCtx
{
enum mapistore_error rc;
NSCalendarDate *dateValue;
+21 -22
View File
@@ -89,73 +89,73 @@
*dataPtr = msgData;
}
- (enum mapistore_error) getPidTagMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = talloc_strdup (memCtx, "IPM.OLE.CLASS.{00061055-0000-0000-C000-000000000046}");
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagMessageFlags: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMessageFlags: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, MSGFLAG_UNMODIFIED);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getYes: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagResponseRequested: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagResponseRequested: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getYes: data inMemCtx: memCtx];
}
/* discarded properties */
- (enum mapistore_error) getPidLidAppointmentLastSequence: (void **)
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidAppointmentLastSequence: (void **)
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidLidMeetingWorkspaceUrl: (void **)
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidMeetingWorkspaceUrl: (void **)
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidLidContacts: (void **)
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidContacts: (void **)
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidTagSensitivity: (void **)
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagSensitivity: (void **)
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidLidPrivate: (void **)
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidPrivate: (void **)
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidNameKeywords: (void **)
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidNameKeywords: (void **)
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidLidFExceptionalBody: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidFExceptionalBody: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getNo: data inMemCtx: memCtx];
}
@@ -208,7 +208,6 @@
[[container event] updateFromMAPIProperties: properties
inUserContext: [self userContext]
withActiveUser: activeUser
isNew: NO
inMemCtx: memCtx];
}
+2 -2
View File
@@ -23,9 +23,9 @@
#ifndef MAPISTORECALENDARFOLDER_H
#define MAPISTORECALENDARFOLDER_H
#import "MAPIStoreCalTaskFolder.h"
#import "MAPIStoreGCSFolder.h"
@interface MAPIStoreCalendarFolder : MAPIStoreCalTaskFolder
@interface MAPIStoreCalendarFolder : MAPIStoreGCSFolder
@end
+19 -33
View File
@@ -81,7 +81,11 @@
Following rights are not supported by SOGo specifically:
- DeleteOwned : Delete only own objects
- EditOwned : Edit only own objects
- CreateSubfolders: No calendar subfolders
- FolderOwner: No sharing folder ownership?
- FolderContact: No support to store this information
- FolderVisible: It is inferred by other rights when extracting
*/
NSMutableArray *roles;
@@ -91,35 +95,26 @@
[roles addObject: SOGoRole_ObjectCreator];
if (rights & RightsDeleteAll)
[roles addObject: SOGoRole_ObjectEraser];
if (rights & RightsDeleteOwn)
[roles addObject: MAPIStoreRightDeleteOwn];
if (rights & RightsEditAll)
{
[roles addObject: SOGoCalendarRole_PublicModifier];
[roles addObject: SOGoCalendarRole_PrivateModifier];
[roles addObject: SOGoCalendarRole_ConfidentialModifier];
}
if (rights & RightsEditOwn)
[roles addObject: MAPIStoreRightEditOwn];
if (rights & RightsReadItems)
else if (rights & RightsReadItems)
{
[roles addObject: SOGoCalendarRole_PublicViewer];
[roles addObject: SOGoCalendarRole_PrivateViewer];
[roles addObject: SOGoCalendarRole_ConfidentialViewer];
}
if (rights & RightsFreeBusySimple)
[roles addObject: SOGoCalendarRole_PublicDAndTViewer];
{
[roles addObject: SOGoCalendarRole_PublicDAndTViewer];
}
if (rights & RightsFreeBusyDetailed)
[roles addObject: SOGoCalendarRole_ConfidentialDAndTViewer];
if (rights & RightsFolderOwner)
[roles addObject: MAPIStoreRightFolderOwner];
if (rights & RightsFolderContact)
[roles addObject: MAPIStoreRightFolderContact];
{
[roles addObject: SOGoCalendarRole_ConfidentialDAndTViewer];
}
// [self logWithFormat: @"roles for rights %.8x = (%@)", rights, roles];
@@ -141,28 +136,19 @@
else if ([roles containsObject: SOGoCalendarRole_PublicViewer]
&& [roles containsObject: SOGoCalendarRole_PrivateViewer]
&& [roles containsObject: SOGoCalendarRole_ConfidentialViewer])
rights |= RightsReadItems;
if ([roles containsObject: MAPIStoreRightEditOwn])
rights |= RightsEditOwn;
if ([roles containsObject: MAPIStoreRightDeleteOwn])
rights |= RightsDeleteOwn;
// We have to set by hand other rights as only the highest role is returned
// See SOGoAppointmentFolder.m:aclsForUser for details
rights |= RightsReadItems | RightsFreeBusySimple | RightsFreeBusyDetailed;
if ([roles containsObject: SOGoCalendarRole_PublicDAndTViewer])
rights |= RightsFreeBusySimple;
if ([roles containsObject: SOGoCalendarRole_ConfidentialDAndTViewer])
rights |= RightsFreeBusySimple | RightsFreeBusyDetailed;
rights |= RightsFreeBusyDetailed;
if ((rights & RightsReadItems) != 0 || (rights & RightsCreateItems) != 0 || (rights & RightsDeleteAll) != 0)
rights |= RoleNone; /* actually "folder visible" */
if ([roles containsObject: MAPIStoreRightFolderOwner])
rights |= RightsFolderOwner | RoleNone;
if ([roles containsObject: MAPIStoreRightFolderContact])
rights |= RightsFolderContact;
// [self logWithFormat: @"rights for roles (%@) = %.8x", roles, rights];
return rights;
@@ -207,16 +193,16 @@
[(SOGoAppointmentFolder *) sogoObject aclSQLListingFilter]];
}
- (enum mapistore_error) getPidTagContainerClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagContainerClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [@"IPF.Appointment" asUnicodeInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagDefaultPostMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDefaultPostMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [@"IPM.Appointment" asUnicodeInMemCtx: memCtx];
+2 -2
View File
@@ -23,13 +23,13 @@
#ifndef MAPISTORECALENDARMESSAGE_H
#define MAPISTORECALENDARMESSAGE_H
#import "MAPIStoreCalTaskMessage.h"
#import "MAPIStoreGCSMessage.h"
@class iCalCalendar;
@class iCalEvent;
@class MAPIStoreAppointmentWrapper;
@interface MAPIStoreCalendarMessage : MAPIStoreCalTaskMessage
@interface MAPIStoreCalendarMessage : MAPIStoreGCSMessage
{
iCalCalendar *calendar;
iCalEvent *masterEvent;
+31 -22
View File
@@ -228,8 +228,8 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK;
/* getters */
- (enum mapistore_error) getPidTagMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
SOGoUser *owner;
@@ -242,8 +242,8 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK;
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidLidSideEffects: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidSideEffects: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx,
seOpenToDelete | seOpenToCopy | seOpenToMove
@@ -252,7 +252,7 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK;
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getYes: data inMemCtx: memCtx];
}
@@ -347,8 +347,8 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK;
*dataPtr = msgData;
}
- (enum mapistore_error) getPidTagResponseRequested: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagResponseRequested: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getYes: data inMemCtx: memCtx];
}
@@ -358,8 +358,8 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK;
MAPIStoreMessage base class, then the proxy method is not reached
(see MAPIStoreObject).
*/
- (enum mapistore_error) getPidTagNormalizedSubject: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagNormalizedSubject: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
MAPIStoreAppointmentWrapper *appointmentWrapper;
@@ -370,8 +370,8 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK;
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidTagSensitivity: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagSensitivity: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
MAPIStoreAppointmentWrapper *appointmentWrapper;
@@ -382,8 +382,8 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK;
return [self getLongZero: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagImportance: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagImportance: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
MAPIStoreAppointmentWrapper *appointmentWrapper;
@@ -528,19 +528,29 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK;
ASSIGN (sogoObject, newObject);
}
- (NSUInteger) sensitivity
- (BOOL) subscriberCanReadMessage
{
return [[self _appointmentWrapper] sensitivity];
NSArray *roles;
roles = [self activeUserRoles];
return ([roles containsObject: SOGoCalendarRole_ComponentViewer]
|| [roles containsObject: SOGoCalendarRole_ComponentDAndTViewer]
|| [self subscriberCanModifyMessage]);
}
- (NSString *) creator
- (BOOL) subscriberCanModifyMessage
{
return [[self _appointmentWrapper] creator];
}
BOOL rc;
NSArray *roles = [self activeUserRoles];
- (NSString *) owner
{
return [[self _appointmentWrapper] owner];
if (isNew)
rc = [roles containsObject: SOGoRole_ObjectCreator];
else
rc = ([roles containsObject: SOGoCalendarRole_ComponentModifier]
|| [roles containsObject: SOGoCalendarRole_ComponentResponder]);
return rc;
}
- (void) _updateAttachedEvents
@@ -622,7 +632,6 @@ static Class NSArrayK, MAPIStoreAppointmentWrapperK;
[masterEvent updateFromMAPIProperties: properties
inUserContext: [self userContext]
withActiveUser: activeUser
isNew: isNew
inMemCtx: memCtx];
[self _updateAttachedEvents];
[[self userContext] activate];
+24 -24
View File
@@ -92,52 +92,52 @@
return [container lastModificationTime];
}
- (enum mapistore_error) getPidTagAttachEncoding: (void **) data inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagAttachEncoding: (void **) data inMemCtx: (TALLOC_CTX *) memCtx;
{
*data = [[NSData data] asBinaryInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAttachFlags: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachFlags: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getLongZero: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagAttachmentFlags: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachmentFlags: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getLongZero: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagAttachmentHidden: (void **) data inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachmentHidden: (void **) data inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getNo: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagAttachmentLinkId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachmentLinkId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getLongZero: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagAttachMethod: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachMethod: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, 0x00000001);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAttachmentContactPhoto: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachmentContactPhoto: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getYes: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagAttachDataBinary: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachDataBinary: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
if (!photoData)
ASSIGN (photoData,
@@ -148,8 +148,8 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAttachSize: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachSize: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
if (!photoData)
ASSIGN (photoData,
@@ -160,16 +160,16 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAttachExtension: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachExtension: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [[self fileExtension] asUnicodeInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAttachLongFilename: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachLongFilename: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *filename;
@@ -181,15 +181,15 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAttachFilename: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachFilename: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidTagAttachLongFilename: data
inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidTagAttachLongFilename: data inMemCtx: memCtx];
}
+3 -32
View File
@@ -74,34 +74,18 @@
- (NSArray *) rolesForExchangeRights: (uint32_t) rights
{
/* Limitations
Following rights are not supported by SOGo specifically:
- CreateSubfolders: No contacts subfolders
- FolderVisible: It is inferred by other rights when extracting
*/
NSMutableArray *roles;
roles = [NSMutableArray arrayWithCapacity: 8];
roles = [NSMutableArray arrayWithCapacity: 6];
if (rights & RightsCreateItems)
[roles addObject: SOGoRole_ObjectCreator];
if (rights & RightsDeleteAll)
[roles addObject: SOGoRole_ObjectEraser];
if (rights & RightsDeleteOwn)
[roles addObject: MAPIStoreRightDeleteOwn];
if (rights & RightsEditAll)
[roles addObject: SOGoRole_ObjectEditor];
if (rights & RightsEditOwn)
[roles addObject: MAPIStoreRightEditOwn];
if (rights & RightsReadItems)
[roles addObject: SOGoRole_ObjectViewer];
if (rights & RightsFolderOwner)
[roles addObject: MAPIStoreRightFolderOwner];
if (rights & RightsFolderContact)
[roles addObject: MAPIStoreRightFolderContact];
return roles;
}
@@ -111,28 +95,15 @@
if ([roles containsObject: SOGoRole_ObjectCreator])
rights |= RightsCreateItems;
if ([roles containsObject: SOGoRole_ObjectEraser])
rights |= RightsDeleteAll | RightsDeleteOwn;
else if ([roles containsObject: MAPIStoreRightDeleteOwn])
rights |= RightsDeleteOwn;
if ([roles containsObject: SOGoRole_ObjectEditor])
rights |= RightsEditAll | RightsEditOwn;
else if ([roles containsObject: MAPIStoreRightEditOwn])
rights |= RightsEditOwn;
if ([roles containsObject: SOGoRole_ObjectViewer])
rights |= RightsReadItems;
if (rights != 0)
rights |= RoleNone; /* actually "folder visible" */
if ([roles containsObject: MAPIStoreRightFolderOwner])
rights |= RightsFolderOwner | RoleNone;
if ([roles containsObject: MAPIStoreRightFolderContact])
rights |= RightsFolderContact;
return rights;
}
@@ -146,8 +117,8 @@
return [[self activeUserRoles] containsObject: SOGoRole_ObjectViewer];
}
- (enum mapistore_error) getPidTagDefaultPostMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDefaultPostMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [@"IPM.Contact" asUnicodeInMemCtx: memCtx];
+207 -231
View File
@@ -31,11 +31,9 @@
#import <NGCards/NGVCardPhoto.h>
#import <NGCards/NSArray+NGCards.h>
#import <NGCards/NSString+NGCards.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <Contacts/SOGoContactGCSEntry.h>
#import <Mailer/NSString+Mail.h>
#import <SOGo/SOGoPermissions.h>
#import <SOGo/SOGoUser.h>
#import <SOGo/SOGoUserManager.h>
#import "MAPIStoreAttachment.h"
@@ -106,8 +104,8 @@
return element;
}
- (enum mapistore_error) getPidTagIconIndex: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagIconIndex: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
{
/* see http://msdn.microsoft.com/en-us/library/cc815472.aspx */
*data = MAPILongValue (memCtx, 0x00000200);
@@ -115,52 +113,52 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAlternateRecipientAllowed: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAlternateRecipientAllowed: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getYes: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagMessageFlags: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMessageFlags: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, MSGFLAG_READ);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagDeleteAfterSubmit: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDeleteAfterSubmit: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getNo: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = talloc_strdup (memCtx, "IPM.Contact");
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagSendInternetEncoding: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagSendInternetEncoding: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, 0x00065001);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagNormalizedSubject: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagNormalizedSubject: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidTagDisplayName: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidFileUnder: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidFileUnder: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *surName, *givenName, *middleName;
NSMutableString *fileUnder;
@@ -186,22 +184,22 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidLidFileUnderId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidFileUnderId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, 0x00008017); /* what ol2003 sets */
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAccount: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAccount: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidLidEmail1EmailAddress: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagContactEmailAddresses: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagContactEmailAddresses: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *stringValue;
@@ -214,8 +212,8 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagEmsAbTargetAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagEmsAbTargetAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *stringValue;
@@ -226,8 +224,8 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagSearchKey: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagSearchKey: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *stringValue;
@@ -238,16 +236,16 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagMailPermission: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMailPermission: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getYes: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagBody: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagBody: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
NSString *stringValue;
stringValue = [[sogoObject vCard] note];
@@ -259,8 +257,8 @@
return rc;
}
- (enum mapistore_error) getPidTagSensitivity: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagSensitivity: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getLongZero: data inMemCtx: memCtx];
}
@@ -269,8 +267,8 @@
// Contact Name Properties [MS-OXOCNTC 2.2.1.1]
// ---------------------------------------------------------
- (enum mapistore_error) getPidTagNickname: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagNickname: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *stringValue;
@@ -280,8 +278,8 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagGeneration: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagGeneration: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *stringValue;
@@ -293,8 +291,8 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagSurname: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagSurname: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *stringValue;
@@ -306,8 +304,8 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagMiddleName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMiddleName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *stringValue;
@@ -319,8 +317,8 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagGivenName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagGivenName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *stringValue;
@@ -332,8 +330,8 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagDisplayNamePrefix: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDisplayNamePrefix: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *stringValue;
@@ -400,9 +398,9 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
Store on *data the given email (position)
It can return MAPISTORE_ERR_NOT_FOUND if the email doesn't exist
*/
- (enum mapistore_error) _getPidLidEmailAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
atPosition: (NSUInteger) position
- (int) _getPidLidEmailAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
atPosition: (NSUInteger) position
{
NSString *email;
@@ -414,60 +412,60 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidLidEmail1EmailAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidEmail1EmailAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getPidLidEmailAddress: data inMemCtx: memCtx atPosition: 1];
}
- (enum mapistore_error) getPidLidEmail2EmailAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidEmail2EmailAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getPidLidEmailAddress: data inMemCtx: memCtx atPosition: 2];
}
- (enum mapistore_error) getPidLidEmail3EmailAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidEmail3EmailAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getPidLidEmailAddress: data inMemCtx: memCtx atPosition: 3];
}
- (enum mapistore_error) getPidLidEmail1OriginalDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidEmail1OriginalDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidLidEmail1EmailAddress: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidEmail2OriginalDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidEmail2OriginalDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidLidEmail2EmailAddress: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidEmail3OriginalDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidEmail3OriginalDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidLidEmail3EmailAddress: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidEmail1AddressType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidEmail1AddressType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
if (![self _fetchEmailAddress: 1]) return MAPISTORE_ERR_NOT_FOUND;
return [self getSMTPAddrType: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidEmail2AddressType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidEmail2AddressType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
if (![self _fetchEmailAddress: 2]) return MAPISTORE_ERR_NOT_FOUND;
return [self getSMTPAddrType: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidEmail3AddressType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidEmail3AddressType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
if (![self _fetchEmailAddress: 3]) return MAPISTORE_ERR_NOT_FOUND;
@@ -478,9 +476,9 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
Store on *data a string with the display name for the given email (position)
It can return MAPISTORE_ERR_NOT_FOUND if the email doesn't exist
*/
- (enum mapistore_error) _getPidLidEmailDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
atPosition: (NSUInteger) position
- (int) _getPidLidEmailDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
atPosition: (NSUInteger) position
{
NGVCard *vCard;
NSString *fn, *email;
@@ -497,20 +495,20 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidLidEmail1DisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidEmail1DisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getPidLidEmailDisplayName: data inMemCtx: memCtx atPosition: 1];
}
- (enum mapistore_error) getPidLidEmail2DisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidEmail2DisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getPidLidEmailDisplayName: data inMemCtx: memCtx atPosition: 2];
}
- (enum mapistore_error) getPidLidEmail3DisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidEmail3DisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getPidLidEmailDisplayName: data inMemCtx: memCtx atPosition: 3];
}
@@ -546,9 +544,9 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
Store on *data an entryId for the given email (position)
It can return MAPISTORE_ERR_NOT_FOUND if the email doesn't exist
*/
- (enum mapistore_error) _getPidLidEmailOriginalEntryId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
atPosition: (NSUInteger) position
- (int) _getPidLidEmailOriginalEntryId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
atPosition: (NSUInteger) position
{
NSData *value;
@@ -560,36 +558,36 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidLidEmail1OriginalEntryId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidEmail1OriginalEntryId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getPidLidEmailOriginalEntryId: data
inMemCtx: memCtx
atPosition: 1];
}
- (enum mapistore_error) getPidLidEmail2OriginalEntryId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidEmail2OriginalEntryId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getPidLidEmailOriginalEntryId: data
inMemCtx: memCtx
atPosition: 2];
}
- (enum mapistore_error) getPidLidEmail3OriginalEntryId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidEmail3OriginalEntryId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getPidLidEmailOriginalEntryId: data
inMemCtx: memCtx
atPosition: 3];
}
- (enum mapistore_error) _getElement: (NSString *) elementTag
ofType: (NSString *) aType
excluding: (NSString *) aTypeToExclude
atPos: (NSUInteger) pos
inData: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) _getElement: (NSString *) elementTag
ofType: (NSString *) aType
excluding: (NSString *) aTypeToExclude
atPos: (NSUInteger) pos
inData: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSArray *elements;
CardElement *ce;
@@ -613,15 +611,15 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
}
if (!stringValue)
return MAPISTORE_ERR_NOT_FOUND;
stringValue = @"";
*data = [stringValue asUnicodeInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagBusinessFaxNumber: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagBusinessFaxNumber: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"tel" ofType: @"fax" excluding: nil
atPos: 0 inData: data inMemCtx: memCtx];
@@ -658,39 +656,30 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
return list;
}
- (enum mapistore_error) getPidLidAddressBookProviderArrayType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidAddressBookProviderArrayType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
// [MS-OXOCNTC] 2.2.1.2.12
// https://msdn.microsoft.com/en-us/library/ee218011%28v=exchg.80%29.aspx
uint32_t value = 0;
NSArray *emailList = [self _buildAddressBookProviderEmailList];
if ([emailList count] > 0)
{
for (NSNumber *maskValue in emailList)
value |= 1 << [maskValue intValue];
for (NSNumber *maskValue in emailList)
value |= 1 << [maskValue intValue];
*data = MAPILongValue (memCtx, value);
*data = MAPILongValue (memCtx, value);
return MAPISTORE_SUCCESS;
}
else
return MAPISTORE_ERR_NOT_FOUND;
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidLidAddressBookProviderEmailList: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidAddressBookProviderEmailList: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSArray *emailList = [self _buildAddressBookProviderEmailList];
if ([emailList count] > 0)
{
*data = [emailList asMVLongInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
}
else
return MAPISTORE_ERR_NOT_FOUND;
*data = [emailList asMVLongInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
}
// ---------------------------------------------------------
@@ -699,49 +688,49 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
// Home Address
- (enum mapistore_error) getPidTagHomeAddressStreet: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagHomeAddressStreet: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"adr" ofType: @"home" excluding: nil
atPos: 2 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagHomeAddressCity: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagHomeAddressCity: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"adr" ofType: @"home" excluding: nil
atPos: 3 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagHomeAddressStateOrProvince: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagHomeAddressStateOrProvince: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"adr" ofType: @"home" excluding: nil
atPos: 4 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagHomeAddressPostalCode: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagHomeAddressPostalCode: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"adr" ofType: @"home" excluding: nil
atPos: 5 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagHomeAddressCountry: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagHomeAddressCountry: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"adr" ofType: @"home" excluding: nil
atPos: 6 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagHomeAddressPostOfficeBox: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagHomeAddressPostOfficeBox: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"adr" ofType: @"home" excluding: nil
atPos: 0 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidHomeAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidHomeAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"label" ofType: @"home" excluding: nil
atPos: 0 inData: data inMemCtx: memCtx];
@@ -749,50 +738,50 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
// Work Address
- (enum mapistore_error) getPidLidWorkAddressStreet: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidWorkAddressStreet: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"adr" ofType: @"work" excluding: nil
atPos: 2 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidWorkAddressCity: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidWorkAddressCity: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"adr" ofType: @"work" excluding: nil
atPos: 3 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidWorkAddressState: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidWorkAddressState: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"adr" ofType: @"work" excluding: nil
atPos: 4 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidWorkAddressPostalCode: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidWorkAddressPostalCode: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"adr" ofType: @"work" excluding: nil
atPos: 5 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidWorkAddressCountry: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidWorkAddressCountry: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"adr" ofType: @"work" excluding: nil
atPos: 6 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidWorkAddressPostOfficeBox: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidWorkAddressPostOfficeBox: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"adr" ofType: @"work" excluding: nil
atPos: 0 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidWorkAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidWorkAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"label" ofType: @"work" excluding: nil
atPos: 0 inData: data inMemCtx: memCtx];
@@ -800,57 +789,57 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
// Mailing Address
- (enum mapistore_error) getPidTagStreetAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagStreetAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"adr" ofType: @"pref" excluding: nil
atPos: 2 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagLocality: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagLocality: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"adr" ofType: @"pref" excluding: nil
atPos: 3 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagStateOrProvince: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagStateOrProvince: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"adr" ofType: @"pref" excluding: nil
atPos: 4 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagPostalCode: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagPostalCode: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"adr" ofType: @"pref" excluding: nil
atPos: 5 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagCountry: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagCountry: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"adr" ofType: @"pref" excluding: nil
atPos: 6 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagPostOfficeBox: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagPostOfficeBox: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"adr" ofType: @"pref" excluding: nil
atPos: 0 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagPostalAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagPostalAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"label" ofType: @"pref" excluding: nil
atPos: 0 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidPostalAddressId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidPostalAddressId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSArray *elements;
CardElement *element;
@@ -880,36 +869,36 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
// Telephone Properties [MS-OXOCNTC 2.2.1.4]
// -------------------------------------------------------
- (enum mapistore_error) getPidTagPagerTelephoneNumber: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagPagerTelephoneNumber: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"tel" ofType: @"pager" excluding: nil
atPos: 0 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagBusinessTelephoneNumber: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagBusinessTelephoneNumber: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"tel" ofType: @"work" excluding: @"fax"
atPos: 0 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagHomeTelephoneNumber: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagHomeTelephoneNumber: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"tel" ofType: @"home" excluding: @"fax"
atPos: 0 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagPrimaryTelephoneNumber: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagPrimaryTelephoneNumber: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"tel" ofType: @"pref" excluding: nil
atPos: 0 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagMobileTelephoneNumber: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMobileTelephoneNumber: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"tel" ofType: @"cell" excluding: nil
atPos: 0 inData: data inMemCtx: memCtx];
@@ -919,12 +908,12 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
// Event Properties [MS-OXOCNTC 2.2.1.5]
// ---------------------------------------------------------
- (enum mapistore_error) getPidTagBirthday: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagBirthday: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSCalendarDate *dateValue;
NSString *stringValue;
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
stringValue = [[sogoObject vCard] bday];
if ([stringValue length] != 0)
@@ -940,12 +929,12 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
return rc;
}
- (enum mapistore_error) getPidTagWeddingAnniversary: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagWeddingAnniversary: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSCalendarDate *dateValue;
NSString *stringValue;
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
stringValue = [[[sogoObject vCard] uniqueChildWithTag: @"x-ms-anniversary"]
flattenedValuesForKey: @""];
@@ -965,8 +954,8 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
// Professional Properties [MS-OXOCNTC 2.2.1.6]
// ---------------------------------------------------------
- (enum mapistore_error) getPidTagTitle: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagTitle: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *stringValue;
@@ -976,8 +965,8 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagCompanyName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagCompanyName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
CardElement *org;
@@ -988,8 +977,8 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagDepartmentName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDepartmentName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
CardElement *org;
@@ -1000,11 +989,11 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagOfficeLocation: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagOfficeLocation: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *stringValue;
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
stringValue = [[[sogoObject vCard] uniqueChildWithTag: @"x-ms-office"]
flattenedValuesForKey: @""];
@@ -1016,11 +1005,11 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
return rc;
}
- (enum mapistore_error) getPidTagManagerName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagManagerName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *stringValue;
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
stringValue = [[[sogoObject vCard] uniqueChildWithTag: @"x-ms-manager"]
flattenedValuesForKey: @""];
@@ -1032,11 +1021,11 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
return rc;
}
- (enum mapistore_error) getPidTagAssistant: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAssistant: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *stringValue;
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
stringValue = [[[sogoObject vCard] uniqueChildWithTag: @"x-ms-assistant"]
flattenedValuesForKey: @""];
@@ -1048,11 +1037,11 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
return rc;
}
- (enum mapistore_error) getPidTagProfession: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagProfession: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *stringValue;
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
stringValue = [[sogoObject vCard] role];
if (stringValue)
@@ -1091,8 +1080,8 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
fetchedAttachments = YES;
}
- (enum mapistore_error) getPidLidHasPicture: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidHasPicture: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
if (!fetchedAttachments)
[self _fetchAttachmentParts];
@@ -1165,11 +1154,11 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
// Other Properties [MS-OXOCNTC 2.2.1.10]
// ---------------------------------------------------------
- (enum mapistore_error) getPidTagSpouseName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagSpouseName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *stringValue;
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
stringValue = [[[sogoObject vCard] uniqueChildWithTag: @"x-ms-spouse"]
flattenedValuesForKey: @""];
@@ -1181,8 +1170,8 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
return rc;
}
- (enum mapistore_error) getPidLidInstantMessagingAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidInstantMessagingAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *stringValue;
@@ -1195,11 +1184,11 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidLidFreeBusyLocation: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidFreeBusyLocation: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *stringValue;
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
stringValue = [[[sogoObject vCard] uniqueChildWithTag: @"fburl"]
flattenedValuesForKey: @""];
@@ -1211,43 +1200,38 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
return rc;
}
- (enum mapistore_error) getPidTagPersonalHomePage: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagPersonalHomePage: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"url" ofType: @"home" excluding: nil
atPos: 0 inData: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagBusinessHomePage: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagBusinessHomePage: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getElement: @"url" ofType: @"work" excluding: nil
atPos: 0 inData: data inMemCtx: memCtx];
}
// ---------------------------------------------------------
// Permissions
// ---------------------------------------------------------
- (NSString *) creator
{
return [[[sogoObject vCard] uniqueChildWithTag: @"x-openchange-creator"]
flattenedValuesForKey: @""];
}
- (NSString *) owner
{
return [self creator];
}
- (BOOL) subscriberCanReadMessage
{
return [[self activeUserRoles] containsObject: SOGoRole_ObjectViewer];
}
// ---------------------------------------------------------
// Save
// ---------------------------------------------------------
- (BOOL) subscriberCanModifyMessage
{
NSArray *roles;
roles = [self activeUserRoles];
return ((isNew
&& [roles containsObject: SOGoRole_ObjectCreator])
|| (!isNew && [roles containsObject: SOGoRole_ObjectEditor]));
}
- (void) saveDistList:(TALLOC_CTX *) memCtx
{
[self warnWithFormat: @"IPM.DistList messages are ignored"];
@@ -1591,14 +1575,6 @@ enum { // [MS-OXOCNTC] 2.2.1.2.11
if (value)
[newCard setNote: value];
/* Store the creator name for sharing purposes */
if (isNew)
{
value = [[[self context] activeUser] login];
[[newCard uniqueChildWithTag: @"x-openchange-creator"]
setSingleValue: value forKey: @""];
}
//
// we save the new/modified card
//
+9 -9
View File
@@ -72,10 +72,10 @@
forUser: (NSString *) username
withRole: (enum mapistore_context_role) role;
+ (enum mapistore_error) openContext: (MAPIStoreContext **) contextPtr
withURI: (const char *) newUri
connectionInfo: (struct mapistore_connection_info *) newConnInfo
andTDBIndexing: (struct indexing_context *) indexing;
+ (int) openContext: (MAPIStoreContext **) contextPtr
withURI: (const char *) newUri
connectionInfo: (struct mapistore_connection_info *) newConnInfo
andTDBIndexing: (struct indexing_context *) indexing;
- (id) initFromURL: (NSURL *) newUri
withConnectionInfo: (struct mapistore_connection_info *) newConnInfo
@@ -91,11 +91,11 @@
// - (id) lookupObject: (NSString *) objectURLString;
/* backend methods */
- (enum mapistore_error) getPath: (char **) path
ofFMID: (uint64_t) fmid
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getRootFolder: (MAPIStoreFolder **) folderPtr
withFID: (uint64_t) fmid;
- (int) getPath: (char **) path
ofFMID: (uint64_t) fmid
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getRootFolder: (MAPIStoreFolder **) folderPtr
withFID: (uint64_t) fmid;
/* util methods */
- (NSString *) extractChildNameFromURL: (NSString *) childURL
+35 -68
View File
@@ -212,16 +212,16 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri)
return completeURL;
}
+ (enum mapistore_error) openContext: (MAPIStoreContext **) contextPtr
withURI: (const char *) newUri
connectionInfo: (struct mapistore_connection_info *) newConnInfo
andTDBIndexing: (struct indexing_context *) indexing
+ (int) openContext: (MAPIStoreContext **) contextPtr
withURI: (const char *) newUri
connectionInfo: (struct mapistore_connection_info *) newConnInfo
andTDBIndexing: (struct indexing_context *) indexing
{
MAPIStoreContext *context;
Class contextClass;
NSString *module;
NSURL *baseURL;
enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND;
int rc = MAPISTORE_ERR_NOT_FOUND;
context = nil;
@@ -338,11 +338,11 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri)
return activeUser;
}
- (enum mapistore_error) getPath: (char **) path
ofFMID: (uint64_t) fmid
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPath: (char **) path
ofFMID: (uint64_t) fmid
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc;
int rc;
NSString *objectURL, *url;
url = [contextUrl absoluteString];
@@ -379,8 +379,8 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri)
{
}
- (enum mapistore_error) getRootFolder: (MAPIStoreFolder **) folderPtr
withFID: (uint64_t) newFid
- (int) getRootFolder: (MAPIStoreFolder **) folderPtr
withFID: (uint64_t) newFid
{
enum mapistore_error rc;
MAPIStoreFolder *baseFolder;
@@ -438,16 +438,8 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri)
mapiStoreObjectWithSOGoObject: currentFolder
inContainer: nil];
[baseFolder setContext: self];
if ([[userContext sogoUser] isEqual: activeUser]
|| [baseFolder subscriberCanReadMessages])
{
*folderPtr = baseFolder;
rc = MAPISTORE_SUCCESS;
}
else
rc = MAPISTORE_ERR_DENIED;
*folderPtr = baseFolder;
rc = MAPISTORE_SUCCESS;
}
else if ([[userContext sogoUser] isEqual: activeUser])
rc = MAPISTORE_ERR_NOT_FOUND;
@@ -502,11 +494,8 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri)
mappingId = [mapping idFromURL: childURL];
if (mappingId == NSNotFound)
{
const char *owner;
[self logWithFormat: @"No id exist yet for '%@', requesting one", childURL];
owner = [[userContext username] UTF8String];
ret = mapistore_indexing_get_new_folderID_as_user (connInfo->mstore_ctx, owner, &mappingId);
ret = mapistore_indexing_get_new_folderID (connInfo->mstore_ctx, &mappingId);
if (ret == MAPISTORE_SUCCESS)
[mapping registerURL: childURL withID: mappingId];
else
@@ -517,56 +506,36 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri)
return mappingId;
}
/* Get new change number from openchange db interface using
resource's owner user */
- (uint64_t) getNewChangeNumber
{
const char *owner;
enum MAPISTATUS retval;
uint64_t newVersionNumber;
owner = [[userContext username] UTF8String];
retval = openchangedb_get_new_changeNumber (connInfo->oc_ctx, owner, &newVersionNumber);
if (retval != MAPI_E_SUCCESS)
[NSException raise: @"MAPIStoreIOException"
format: @"Impossible to get new change number for %s: %s", owner,
mapi_get_errstr (retval)];
if (openchangedb_get_new_changeNumber (connInfo->oc_ctx, connInfo->username, &newVersionNumber)
!= MAPI_E_SUCCESS)
abort ();
return newVersionNumber;
}
/* Get new change numbers from openchange db interface using
resource's owner user */
- (NSArray *) getNewChangeNumbers: (uint64_t) max
{
const char *owner;
enum MAPISTATUS retval;
TALLOC_CTX *memCtx;
NSMutableArray *newChangeNumbers;
uint64_t count;
struct UI8Array_r *numbers;
NSString *newNumber;
memCtx = talloc_new (NULL);
if (!memCtx)
[NSException raise: @"MAPIStoreIOException"
format: @"Not enough memory to allocate change numbers"];
memCtx = talloc_zero(NULL, TALLOC_CTX);
newChangeNumbers = [NSMutableArray arrayWithCapacity: max];
owner = [[userContext username] UTF8String];
retval = openchangedb_get_new_changeNumbers (connInfo->oc_ctx, memCtx, owner, max, &numbers);
if (retval != MAPI_E_SUCCESS || numbers->cValues != max)
{
talloc_free (memCtx);
[NSException raise: @"MAPIStoreIOException"
format: @"Failing to get %d new change numbers: %s", max,
mapi_get_errstr (retval)];
}
if (openchangedb_get_new_changeNumbers (connInfo->oc_ctx,
memCtx, connInfo->username, max, &numbers)
!= MAPI_E_SUCCESS || numbers->cValues != max)
abort ();
for (count = 0; count < max; count++)
{
newNumber = [NSString stringWithUnsignedLongLong: numbers->lpui8[count]];
newNumber
= [NSString stringWithUnsignedLongLong: numbers->lpui8[count]];
[newChangeNumbers addObject: newNumber];
}
@@ -575,31 +544,29 @@ static inline NSURL *CompleteURLFromMapistoreURI (const char *uri)
return newChangeNumbers;
}
/* Get new fmids from mapistore_indexing interface using resource's
owner user */
- (NSArray *) getNewFMIDs: (uint64_t) max
{
const char *owner;
enum mapistore_error ret;
TALLOC_CTX *memCtx;
NSMutableArray *newFMIDs;
uint64_t count;
struct UI8Array_r *numbers;
NSString *newNumber;
uint64_t count, newFID;
memCtx = talloc_zero(NULL, TALLOC_CTX);
newFMIDs = [NSMutableArray arrayWithCapacity: max];
/* Get the resource's owner name */
owner = [[userContext username] UTF8String];
if (mapistore_indexing_get_new_folderIDs (connInfo->mstore_ctx,
memCtx, max, &numbers)
!= MAPISTORE_SUCCESS || numbers->cValues != max)
abort ();
for (count = 0; count < max; count++)
{
ret = mapistore_indexing_get_new_folderID_as_user (connInfo->mstore_ctx, owner, &newFID);
if (ret != MAPISTORE_SUCCESS)
[NSException raise: @"MAPIStoreIOException"
format: @"Impossible to get new fmid for %s", owner];
newNumber = [NSString stringWithUnsignedLongLong: newFID];
newNumber = [NSString stringWithUnsignedLongLong: numbers->lpui8[count]];
[newFMIDs addObject: newNumber];
}
talloc_free (memCtx);
return newFMIDs;
}
-10
View File
@@ -25,16 +25,6 @@
#import "MAPIStoreFolder.h"
extern NSString *MAPIStoreRightReadItems;
extern NSString *MAPIStoreRightCreateItems;
extern NSString *MAPIStoreRightEditOwn;
extern NSString *MAPIStoreRightEditAll;
extern NSString *MAPIStoreRightDeleteOwn;
extern NSString *MAPIStoreRightDeleteAll;
extern NSString *MAPIStoreRightCreateSubfolders;
extern NSString *MAPIStoreRightFolderOwner;
extern NSString *MAPIStoreRightFolderContact;
@interface MAPIStoreDBFolder : MAPIStoreFolder
@end
+14 -2
View File
@@ -51,6 +51,16 @@
static Class EOKeyValueQualifierK, SOGoCacheGCSFolderK, MAPIStoreDBFolderK;
static NSString *MAPIStoreRightReadItems = @"RightsReadItems";
static NSString *MAPIStoreRightCreateItems = @"RightsCreateItems";
static NSString *MAPIStoreRightEditOwn = @"RightsEditOwn";
static NSString *MAPIStoreRightEditAll = @"RightsEditAll";
static NSString *MAPIStoreRightDeleteOwn = @"RightsDeleteOwn";
static NSString *MAPIStoreRightDeleteAll = @"RightsDeleteAll";
static NSString *MAPIStoreRightCreateSubfolders = @"RightsCreateSubfolders";
static NSString *MAPIStoreRightFolderOwner = @"RightsFolderOwner";
static NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
@implementation MAPIStoreDBFolder
+ (void) initialize
@@ -345,7 +355,8 @@ static Class EOKeyValueQualifierK, SOGoCacheGCSFolderK, MAPIStoreDBFolderK;
- (BOOL) subscriberCanModifyMessages
{
return [self _testRoleForActiveUser: MAPIStoreRightEditAll];
return ([self _testRoleForActiveUser: MAPIStoreRightEditAll]
|| [self _testRoleForActiveUser: MAPIStoreRightEditOwn]);
}
- (BOOL) subscriberCanReadMessages
@@ -366,7 +377,8 @@ static Class EOKeyValueQualifierK, SOGoCacheGCSFolderK, MAPIStoreDBFolderK;
- (BOOL) subscriberCanDeleteMessages
{
return [self _testRoleForActiveUser: MAPIStoreRightDeleteAll];
return ([self _testRoleForActiveUser: MAPIStoreRightDeleteAll]
|| [self _testRoleForActiveUser: MAPIStoreRightDeleteOwn]);
}
- (BOOL) subscriberCanCreateSubFolders
+16 -86
View File
@@ -27,9 +27,6 @@
#import <Foundation/NSString.h>
#import <Foundation/NSValue.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <SOGo/SOGoFolder.h>
#import <SOGo/SOGoUser.h>
#import "MAPIStoreContext.h"
#import "MAPIStorePropertySelectors.h"
@@ -285,7 +282,7 @@
// We might get there if for some reasons, all classes weren't able
// to tell us the message class.
//
- (enum mapistore_error) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [@"IPM.Note" asUnicodeInMemCtx: memCtx];
@@ -294,10 +291,10 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getProperties: (struct mapistore_property_data *) data
withTags: (enum MAPITAGS *) tags
andCount: (uint16_t) columnCount
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getProperties: (struct mapistore_property_data *) data
withTags: (enum MAPITAGS *) tags
andCount: (uint16_t) columnCount
inMemCtx: (TALLOC_CTX *) memCtx
{
[sogoObject reloadIfNeeded];
@@ -307,12 +304,12 @@
inMemCtx: memCtx];
}
- (enum mapistore_error) getProperty: (void **) data
withTag: (enum MAPITAGS) propTag
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getProperty: (void **) data
withTag: (enum MAPITAGS) propTag
inMemCtx: (TALLOC_CTX *) memCtx
{
id value;
enum mapistore_error rc;
int rc;
value = [properties objectForKey: MAPIPropertyKey (propTag)];
if (value)
@@ -349,16 +346,6 @@
/* Update PredecessorChangeList accordingly */
[self _updatePredecessorChangeList];
if (isNew)
{
NSString *lastModifierName;
lastModifierName = (NSString *)[properties objectForKey: MAPIPropertyKey (PidTagLastModifierName)];
if ([lastModifierName length] > 0)
[properties setObject: lastModifierName
forKey: MAPIPropertyKey (PidTagCreatorName)];
}
// [self logWithFormat: @"Saving %@", [self description]];
// [self logWithFormat: @"%d props in dict", [properties count]];
@@ -377,77 +364,20 @@
return [msgClass isEqualToString: @"IPM.Microsoft.ScheduleData.FreeBusy"];
}
//-----------------------------
// Permissions
//-----------------------------
/* TODO: differentiate between the "Own" and "All" cases */
- (BOOL) subscriberCanReadMessage
{
return [(MAPIStoreFolder *) container subscriberCanReadMessages];
}
- (SOGoUser *) _ownerUser
{
NSString *ownerName;
SOGoUser *ownerUser = nil;
ownerName = [properties objectForKey: MAPIPropertyKey (PidTagCreatorName)];
if ([ownerName length] > 0)
ownerUser = [SOGoUser userWithLogin: ownerName];
return ownerUser;
}
- (NSArray *) activeUserRoles
{
/* Override because of this exception: NSInvalidArgumentException,
reason: [SOGoMAPIDBMessage-aclsForUser:] should be overridden by
subclass */
if (!activeUserRoles)
{
SOGoUser *activeUser;
activeUser = [[self context] activeUser];
activeUserRoles = [[container aclFolder] aclsForUser: [activeUser login]];
[activeUserRoles retain];
}
return activeUserRoles;
// || [self _messageIsFreeBusy]);
}
- (BOOL) subscriberCanModifyMessage
{
BOOL rc;
NSArray *roles;
roles = [self activeUserRoles];
if (isNew)
rc = [(MAPIStoreFolder *) container subscriberCanCreateMessages];
else
rc = [roles containsObject: MAPIStoreRightEditAll];
/* Check if the message is owned and it has permission to edit it */
if (!rc && [roles containsObject: MAPIStoreRightEditOwn])
rc = [[[container context] activeUser] isEqual: [self _ownerUser]];
return rc;
}
- (BOOL) subscriberCanDeleteMessage
{
BOOL rc;
NSArray *roles;
roles = [self activeUserRoles];
rc = [roles containsObject: MAPIStoreRightDeleteAll];
/* Check if the message is owned and it has permission to delete it */
if (!rc && [roles containsObject: MAPIStoreRightDeleteOwn])
rc = [[[container context] activeUser] isEqual: [self _ownerUser]];
return rc;
return ((isNew
&& [(MAPIStoreFolder *) container subscriberCanCreateMessages])
|| (!isNew
&& [(MAPIStoreFolder *) container subscriberCanModifyMessages]));
// || [self _messageIsFreeBusy]);
}
- (NSDate *) creationTime
+26 -26
View File
@@ -56,81 +56,81 @@ static Class MAPIStoreAttachmentK;
idForObjectWithKey: objectKey];
}
- (enum mapistore_error) getPidTagAccessLevel: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAccessLevel: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getLongZero: data inMemCtx: memCtx];
}
/* disabled properties */
- (enum mapistore_error) getPidTagFolderId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagFolderId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidTagChangeKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagChangeKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidTagSourceKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagSourceKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidTagParentSourceKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagParentSourceKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidTagChangeNumber: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagChangeNumber: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidTagInstID: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagInstID: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidTagInstanceNum: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagInstanceNum: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidTagRowType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagRowType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidTagDepth: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDepth: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidTagIconIndex: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagIconIndex: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidTagGenerateExchangeViews: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagGenerateExchangeViews: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidTagOriginalMessageClass: (void **) dataa
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagOriginalMessageClass: (void **) dataa
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
+3 -4
View File
@@ -24,7 +24,6 @@
#import "MAPIStoreActiveTables.h"
#import "MAPIStoreContext.h"
#import "MAPIStoreFolder.h"
#import "MAPIStoreUserContext.h"
#import "NSObject+MAPIStore.h"
@@ -46,8 +45,8 @@
andType: MAPISTORE_FAI_TABLE];
}
- (enum mapistore_error) getPidTagAssociated: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAssociated: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getYes: data inMemCtx: memCtx];
}
@@ -70,7 +69,7 @@
- (BOOL) subscriberCanReadMessage
{
return [(MAPIStoreFolder *)container subscriberCanReadMessages];
return NO;
}
- (BOOL) subscriberCanModifyMessage
+37 -54
View File
@@ -22,7 +22,6 @@
#define MAPISTOREFOLDER_H
#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>
@class NSArray;
@class NSMutableArray;
@@ -42,20 +41,6 @@
#import "MAPIStoreSOGoObject.h"
/* MAPI Permissions
This set has only sogo-openchange library scope
*/
extern NSString *MAPIStoreRightReadItems;
extern NSString *MAPIStoreRightCreateItems;
extern NSString *MAPIStoreRightEditOwn;
extern NSString *MAPIStoreRightEditAll;
extern NSString *MAPIStoreRightDeleteOwn;
extern NSString *MAPIStoreRightDeleteAll;
extern NSString *MAPIStoreRightCreateSubfolders;
extern NSString *MAPIStoreRightFolderOwner;
extern NSString *MAPIStoreRightFolderContact;
@interface MAPIStoreFolder : MAPIStoreSOGoObject
{
MAPIStoreContext *context;
@@ -89,8 +74,6 @@ extern NSString *MAPIStoreRightFolderContact;
- (MAPIStorePermissionsTable *) permissionsTable;
- (NSArray *) permissionEntries;
- (NSArray *) expandRoles: (NSArray *) roles;
/* message objects and tables */
- (id) lookupMessage: (NSString *) messageKey;
- (NSArray *) messageKeys;
@@ -113,34 +96,34 @@ extern NSString *MAPIStoreRightFolderContact;
/* backend interface */
- (enum mapistore_error) openFolder: (MAPIStoreFolder **) childFolderPtr
withFID: (uint64_t) fid;
- (enum mapistore_error) createFolder: (MAPIStoreFolder **) childFolderPtr
withRow: (struct SRow *) aRow
andFID: (uint64_t) fid;
- (enum mapistore_error) deleteFolder;
- (enum mapistore_error) getChildCount: (uint32_t *) rowCount
ofTableType: (enum mapistore_table_type) tableType;
- (int) openFolder: (MAPIStoreFolder **) childFolderPtr
withFID: (uint64_t) fid;
- (int) createFolder: (MAPIStoreFolder **) childFolderPtr
withRow: (struct SRow *) aRow
andFID: (uint64_t) fid;
- (int) deleteFolder;
- (int) getChildCount: (uint32_t *) rowCount
ofTableType: (enum mapistore_table_type) tableType;
- (enum mapistore_error) createMessage: (MAPIStoreMessage **) messagePtr
withMID: (uint64_t) mid
isAssociated: (BOOL) isAssociated;
- (int) createMessage: (MAPIStoreMessage **) messagePtr
withMID: (uint64_t) mid
isAssociated: (BOOL) isAssociated;
- (enum mapistore_error) openMessage: (MAPIStoreMessage **) messagePtr
withMID: (uint64_t) mid
forWriting: (BOOL) readWrite
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) deleteMessageWithMID: (uint64_t) mid
andFlags: (uint8_t) flags;
- (int) openMessage: (MAPIStoreMessage **) messagePtr
withMID: (uint64_t) mid
forWriting: (BOOL) readWrite
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) deleteMessageWithMID: (uint64_t) mid
andFlags: (uint8_t) flags;
- (enum mapistore_error) moveCopyMessagesWithMIDs: (uint64_t *) srcMids
andCount: (uint32_t) count
fromFolder: (MAPIStoreFolder *) sourceFolder
withMIDs: (uint64_t *) targetMids
andChangeKeys: (struct Binary_r **) targetChangeKeys
andPredecessorChangeLists: (struct Binary_r **) targetPredecessorChangeLists
wantCopy: (uint8_t) want_copy
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) moveCopyMessagesWithMIDs: (uint64_t *) srcMids
andCount: (uint32_t) count
fromFolder: (MAPIStoreFolder *) sourceFolder
withMIDs: (uint64_t *) targetMids
andChangeKeys: (struct Binary_r **) targetChangeKeys
andPredecessorChangeLists: (struct Binary_r **) targetPredecessorChangeLists
wantCopy: (uint8_t) want_copy
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) moveCopyToFolder: (MAPIStoreFolder *) targetFolder
withNewName: (NSString *) newFolderName
@@ -148,20 +131,20 @@ extern NSString *MAPIStoreRightFolderContact;
isRecursive: (BOOL) isRecursive
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getDeletedFMIDs: (struct UI8Array_r **) fmidsPtr
andCN: (uint64_t *) cnPtr
fromChangeNumber: (uint64_t) changeNum
inTableType: (enum mapistore_table_type) tableType
inMemCtx: (TALLOC_CTX *) mem_ctx;
- (int) getDeletedFMIDs: (struct UI8Array_r **) fmidsPtr
andCN: (uint64_t *) cnPtr
fromChangeNumber: (uint64_t) changeNum
inTableType: (enum mapistore_table_type) tableType
inMemCtx: (TALLOC_CTX *) mem_ctx;
- (enum mapistore_error) getTable: (MAPIStoreTable **) tablePtr
andRowCount: (uint32_t *) count
tableType: (enum mapistore_table_type) tableType
andHandleId: (uint32_t) handleId;
- (int) getTable: (MAPIStoreTable **) tablePtr
andRowCount: (uint32_t *) count
tableType: (enum mapistore_table_type) tableType
andHandleId: (uint32_t) handleId;
- (enum mapistore_error) modifyPermissions: (struct PermissionData *) permissions
withCount: (uint16_t) pcount
andFlags: (int8_t) flags;
- (int) modifyPermissions: (struct PermissionData *) permissions
withCount: (uint16_t) pcount
andFlags: (int8_t) flags;
- (enum mapistore_error) preloadMessageBodiesWithMIDs: (const struct UI8Array_r *) mids
ofTableType: (enum mapistore_table_type) tableType;
+113 -162
View File
@@ -65,17 +65,6 @@
Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMessageTableK, MAPIStoreFolderTableK;
/* MAPI permissions */
NSString *MAPIStoreRightReadItems = @"RightsReadItems";
NSString *MAPIStoreRightCreateItems = @"RightsCreateItems";
NSString *MAPIStoreRightEditOwn = @"RightsEditOwn";
NSString *MAPIStoreRightEditAll = @"RightsEditAll";
NSString *MAPIStoreRightDeleteOwn = @"RightsDeleteOwn";
NSString *MAPIStoreRightDeleteAll = @"RightsDeleteAll";
NSString *MAPIStoreRightCreateSubfolders = @"RightsCreateSubfolders";
NSString *MAPIStoreRightFolderOwner = @"RightsFolderOwner";
NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
@implementation MAPIStoreFolder
+ (void) initialize
@@ -376,10 +365,10 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
return foundObject;
}
- (enum mapistore_error) openFolder: (MAPIStoreFolder **) childFolderPtr
withFID: (uint64_t) fid
- (int) openFolder: (MAPIStoreFolder **) childFolderPtr
withFID: (uint64_t) fid
{
enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND;
int rc = MAPISTORE_ERR_NOT_FOUND;
MAPIStoreFolder *childFolder;
MAPIStoreMapping *mapping;
NSString *childURL;
@@ -401,9 +390,9 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
return rc;
}
- (enum mapistore_error) createFolder: (MAPIStoreFolder **) childFolderPtr
withRow: (struct SRow *) aRow
andFID: (uint64_t) fid
- (int) createFolder: (MAPIStoreFolder **) childFolderPtr
withRow: (struct SRow *) aRow
andFID: (uint64_t) fid
{
BOOL mapped;
enum mapistore_error rc = MAPISTORE_SUCCESS;
@@ -458,7 +447,7 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
return rc;
}
- (enum mapistore_error) deleteFolder
- (int) deleteFolder
{
// TODO: raise exception in case underlying delete fails?
// [propsMessage delete];
@@ -469,11 +458,11 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getChildCount: (uint32_t *) rowCount
ofTableType: (enum mapistore_table_type) tableType
- (int) getChildCount: (uint32_t *) rowCount
ofTableType: (enum mapistore_table_type) tableType
{
NSArray *keys;
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
//[self logWithFormat: @"METHOD '%s' (%d) -- tableType: %d",
//__FUNCTION__, __LINE__, tableType];
@@ -494,16 +483,16 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
return rc;
}
- (enum mapistore_error) openMessage: (MAPIStoreMessage **) messagePtr
withMID: (uint64_t) mid
forWriting: (BOOL) readWrite
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) openMessage: (MAPIStoreMessage **) messagePtr
withMID: (uint64_t) mid
forWriting: (BOOL) readWrite
inMemCtx: (TALLOC_CTX *) memCtx;
{
NSString *messageURL;
MAPIStoreMapping *mapping;
MAPIStoreMessage *message;
SOGoUser *ownerUser;
enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND;
int rc = MAPISTORE_ERR_NOT_FOUND;
mapping = [self mapping];
messageURL = [mapping urlFromID: mid];
@@ -534,9 +523,9 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
return rc;
}
- (enum mapistore_error) createMessage: (MAPIStoreMessage **) messagePtr
withMID: (uint64_t) mid
isAssociated: (BOOL) isAssociated
- (int) createMessage: (MAPIStoreMessage **) messagePtr
withMID: (uint64_t) mid
isAssociated: (BOOL) isAssociated
{
enum mapistore_error rc;
MAPIStoreMessage *message;
@@ -581,8 +570,8 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
return rc;
}
- (enum mapistore_error) deleteMessageWithMID: (uint64_t) mid
andFlags: (uint8_t) flags
- (int) deleteMessageWithMID: (uint64_t) mid
andFlags: (uint8_t) flags
{
NSString *childURL;
MAPIStoreMapping *mapping;
@@ -591,7 +580,7 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
NSUInteger count, max;
id msgObject;
SOGoUser *ownerUser;
enum mapistore_error rc;
int rc;
/* flags that control the behaviour of the operation
(MAPISTORE_SOFT_DELETE or MAPISTORE_PERMANENT_DELETE) */
@@ -608,7 +597,7 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
if ([[context activeUser] isEqual: ownerUser]
|| (![message isKindOfClass: MAPIStoreFAIMessageK]
&& ([self subscriberCanDeleteMessages] || [message subscriberCanDeleteMessage])))
&& [self subscriberCanDeleteMessages]))
{
/* we ensure the table caches are loaded so that old and new state
can be compared */
@@ -649,15 +638,15 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
}
// private method
- (enum mapistore_error) _moveCopyMessageWithMID: (uint64_t) srcMid
fromFolder: (MAPIStoreFolder *) sourceFolder
withMID: (uint64_t) targetMid
andChangeKey: (struct Binary_r *) targetChangeKey
andPredecessorChangeList: (struct Binary_r *) targetPredecessorChangeList
wantCopy: (uint8_t) wantCopy
inMemCtx: (TALLOC_CTX *) memCtx
- (int) _moveCopyMessageWithMID: (uint64_t) srcMid
fromFolder: (MAPIStoreFolder *) sourceFolder
withMID: (uint64_t) targetMid
andChangeKey: (struct Binary_r *) targetChangeKey
andPredecessorChangeList: (struct Binary_r *) targetPredecessorChangeList
wantCopy: (uint8_t) wantCopy
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc;
int rc;
MAPIStoreMessage *sourceMsg, *destMsg;
//TALLOC_CTX *memCtx;
struct SRow aRow;
@@ -706,16 +695,16 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
return rc;
}
- (enum mapistore_error) moveCopyMessagesWithMIDs: (uint64_t *) srcMids
andCount: (uint32_t) midCount
fromFolder: (MAPIStoreFolder *) sourceFolder
withMIDs: (uint64_t *) targetMids
andChangeKeys: (struct Binary_r **) targetChangeKeys
andPredecessorChangeLists: (struct Binary_r **) targetPredecessorChangeLists
wantCopy: (uint8_t) wantCopy
inMemCtx: (TALLOC_CTX *) memCtx
- (int) moveCopyMessagesWithMIDs: (uint64_t *) srcMids
andCount: (uint32_t) midCount
fromFolder: (MAPIStoreFolder *) sourceFolder
withMIDs: (uint64_t *) targetMids
andChangeKeys: (struct Binary_r **) targetChangeKeys
andPredecessorChangeLists: (struct Binary_r **) targetPredecessorChangeLists
wantCopy: (uint8_t) wantCopy
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
NSUInteger count;
NSMutableArray *oldMessageURLs;
NSString *oldMessageURL;
@@ -919,11 +908,6 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
return nil;
}
- (NSArray *) expandRoles: (NSArray *) roles
{
return roles;
}
- (void) _modifyPermissionEntryForUser: (NSString *) user
withRoles: (NSArray *) roles
isAddition: (BOOL) isAddition
@@ -973,13 +957,13 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
withIDs: newIDs];
}
- (enum mapistore_error) getDeletedFMIDs: (struct UI8Array_r **) fmidsPtr
andCN: (uint64_t *) cnPtr
fromChangeNumber: (uint64_t) changeNum
inTableType: (enum mapistore_table_type) tableType
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getDeletedFMIDs: (struct UI8Array_r **) fmidsPtr
andCN: (uint64_t *) cnPtr
fromChangeNumber: (uint64_t) changeNum
inTableType: (enum mapistore_table_type) tableType
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc;
int rc;
NSString *baseURL, *format, *url;
NSArray *keys;
NSNumber *cnNbr;
@@ -1032,15 +1016,14 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
return rc;
}
- (enum mapistore_error) getTable: (MAPIStoreTable **) tablePtr
andRowCount: (uint32_t *) countPtr
tableType: (enum mapistore_table_type) tableType
andHandleId: (uint32_t) handleId
- (int) getTable: (MAPIStoreTable **) tablePtr
andRowCount: (uint32_t *) countPtr
tableType: (enum mapistore_table_type) tableType
andHandleId: (uint32_t) handleId
{
BOOL access;
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
MAPIStoreTable *table;
SOGoUser *activeUser, *ownerUser;
SOGoUser *ownerUser;
if (tableType == MAPISTORE_MESSAGE_TABLE)
table = [self messageTable];
@@ -1051,20 +1034,8 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
else if (tableType == MAPISTORE_PERMISSIONS_TABLE)
{
ownerUser = [[self userContext] sogoUser];
activeUser = [context activeUser];
access = [activeUser isEqual: ownerUser];
if (!access)
{
NSArray *roles;
roles = [[self aclFolder] aclsForUser: [activeUser login]];
roles = [self expandRoles: roles]; // Not required here
/* Check FolderVisible right to return the table */
access = ([self exchangeRightsForRoles: roles] & RoleNone) != 0;
}
if (access)
table = [self permissionsTable];
if ([[context activeUser] isEqual: ownerUser])
table = [self permissionsTable];
else
rc = MAPISTORE_ERR_DENIED;
}
@@ -1237,16 +1208,16 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
// folderKeys = nil;
}
- (enum mapistore_error) getPidTagParentFolderId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagParentFolderId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongLongValue (memCtx, [container objectId]);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagFolderId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagFolderId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongLongValue (memCtx, [self objectId]);
@@ -1263,8 +1234,8 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
0x00000010 Create Contents Table
0x00000020 Create Associated Contents Table
*/
- (enum mapistore_error) getPidTagAccess: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAccess: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
uint32_t access = 0;
SOGoUser *ownerUser;
@@ -1292,107 +1263,103 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagRights: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagRights: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
uint32_t rights = 0;
SOGoUser *activeUser, *ownerUser;
SOGoUser *ownerUser;
BOOL userIsOwner;
ownerUser = [[self userContext] sogoUser];
activeUser = [context activeUser];
if ([activeUser isEqual: ownerUser])
{
rights = RightsReadItems | RightsCreateItems | RightsEditOwn | RightsEditAll
| RightsDeleteOwn | RightsDeleteAll | RightsFolderOwner | RightsFolderContact | RoleNone;
if ([self supportsSubFolders])
rights |= RightsCreateSubfolders;
}
else
{
NSArray *roles;
roles = [[self aclFolder] aclsForUser: [activeUser login]];
roles = [self expandRoles: roles];
rights = [self exchangeRightsForRoles: roles];
/* FreeBusySimple and FreeBusyDetailed does not apply here
[MS-OXCFOLD] Section 2.2.2.2.2.8 */
rights &= ~RightsFreeBusySimple & ~RightsFreeBusyDetailed;
}
userIsOwner = [[context activeUser] isEqual: ownerUser];
if (userIsOwner || [self subscriberCanReadMessages])
rights |= RightsReadItems;
if (userIsOwner || [self subscriberCanCreateMessages])
rights |= RightsCreateItems;
if (userIsOwner || [self subscriberCanModifyMessages])
rights |= RightsEditOwn | RightsEditAll;
if (userIsOwner || [self subscriberCanDeleteMessages])
rights |= RightsDeleteOwn | RightsDeleteAll;
if ((userIsOwner || [self subscriberCanCreateSubFolders])
&& [self supportsSubFolders])
rights |= RightsCreateSubfolders;
if (userIsOwner)
rights |= RightsFolderOwner | RightsFolderContact;
*data = MAPILongValue (memCtx, rights);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAccessControlListData: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAccessControlListData: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [[NSData data] asBinaryInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAttributeHidden: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttributeHidden: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getNo: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagAttributeSystem: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttributeSystem: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getNo: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagAttributeReadOnly: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttributeReadOnly: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getNo: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagSubfolders: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagSubfolders: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPIBoolValue (memCtx, [self supportsSubFolders] && [[self folderKeys] count] > 0);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagFolderChildCount: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagFolderChildCount: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, [[self folderKeys] count]);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagContentCount: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagContentCount: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, [[self messageKeys] count]);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagContentUnreadCount: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagContentUnreadCount: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, 0);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAssociatedContentCount: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAssociatedContentCount: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, [[self faiMessageKeys] count]);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagDeletedCountTotal: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDeletedCountTotal: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
/* TODO */
*data = MAPILongValue (memCtx, 0);
@@ -1400,10 +1367,10 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagLocalCommitTimeMax: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagLocalCommitTimeMax: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
NSDate *date;
date = [self lastMessageModificationTime];
@@ -1415,18 +1382,18 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
return rc;
}
- (enum mapistore_error) getPidTagDefaultPostMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDefaultPostMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [@"IPM.Note" asUnicodeInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getProperties: (struct mapistore_property_data *) data
withTags: (enum MAPITAGS *) tags
andCount: (uint16_t) columnCount
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getProperties: (struct mapistore_property_data *) data
withTags: (enum MAPITAGS *) tags
andCount: (uint16_t) columnCount
inMemCtx: (TALLOC_CTX *) memCtx
{
[dbFolder reloadIfNeeded];
@@ -1436,11 +1403,11 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
inMemCtx: memCtx];
}
- (enum mapistore_error) getProperty: (void **) data
withTag: (enum MAPITAGS) propTag
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getProperty: (void **) data
withTag: (enum MAPITAGS) propTag
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc;
int rc;
id value;
value = [properties objectForKey: MAPIPropertyKey (propTag)];
@@ -1647,9 +1614,9 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
[users release];
}
- (enum mapistore_error) modifyPermissions: (struct PermissionData *) permissions
withCount: (uint16_t) pcount
andFlags: (int8_t) flags
- (int) modifyPermissions: (struct PermissionData *) permissions
withCount: (uint16_t) pcount
andFlags: (int8_t) flags
{
NSUInteger count, propCount;
struct PermissionData *currentPermission;
@@ -1659,22 +1626,6 @@ NSString *MAPIStoreRightFolderContact = @"RightsFolderContact";
NSArray *permissionRoles;
BOOL reset, isAdd = NO, isDelete = NO, isModify = NO;
SOGoFolder *aclFolder;
SOGoUser *activeUser, *ownerUser;
/* Check if we have permissions to modify the permissions.
See [MS-OXCPERM] Section 3.2.5.2 for details */
ownerUser = [[self userContext] sogoUser];
activeUser = [context activeUser];
if (![activeUser isEqual: ownerUser])
{
/* Check if we have FolderOwner right */
NSArray *roles;
roles = [[self aclFolder] aclsForUser: [activeUser login]];
roles = [self expandRoles: roles]; // Not required
if (([self exchangeRightsForRoles: roles] & RightsFolderOwner) == 0)
return MAPISTORE_ERR_DENIED;
}
aclFolder = [self aclFolder];
+4 -5
View File
@@ -86,9 +86,9 @@ static Class NSNumberK;
[super dealloc];
}
- (enum mapistore_error) deleteFolder
- (int) deleteFolder
{
enum mapistore_error rc;
int rc;
NSException *error;
NSString *name;
@@ -138,8 +138,8 @@ static Class NSNumberK;
[sogoObject renameTo: newDisplayName];
}
- (enum mapistore_error) getPidTagDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *displayName;
Class cClass;
@@ -859,7 +859,6 @@ static Class NSNumberK;
woContext = [[self userContext] woContext];
activeUserRoles = [activeUser rolesForObject: sogoObject
inContext: woContext];
activeUserRoles = [self expandRoles: activeUserRoles];
[activeUserRoles retain];
}
-7
View File
@@ -23,8 +23,6 @@
#ifndef MAPISTOREGCSMESSAGE_H
#define MAPISTOREGCSMESSAGE_H
#import <SOGo/SOGoUser.h>
#import "MAPIStoreMessage.h"
@interface MAPIStoreGCSMessage : MAPIStoreMessage
@@ -32,11 +30,6 @@
}
/* subclass helpers */
/* Return the message original creator */
- (NSString *) creator;
- (NSString *) owner;
- (SOGoUser *) ownerUser;
- (void) updateVersions;
@end
+66 -86
View File
@@ -20,12 +20,10 @@
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSArray.h>
#import <Foundation/NSCalendarDate.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSValue.h>
#import <NGObjWeb/SoSecurityManager.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSObject+Values.h>
#import <SOGo/SOGoContentObject.h>
@@ -37,7 +35,6 @@
#import "MAPIStoreTypes.h"
#import "MAPIStoreUserContext.h"
#import "NSData+MAPIStore.h"
#import "NSString+MAPIStore.h"
#import "MAPIStoreGCSMessage.h"
@@ -57,28 +54,76 @@
return [sogoObject lastModified];
}
- (enum mapistore_error) getPidTagCreatorName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAccess: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc;
NSString *creator;
MAPIStoreContext *context;
WOContext *woContext;
SoSecurityManager *sm;
MAPIStoreUserContext *userContext;
uint32_t access;
creator = [self creator];
if (creator)
{
*data = [creator asUnicodeInMemCtx: memCtx];
rc = MAPISTORE_SUCCESS;
}
context = [self context];
userContext = [self userContext];
if ([[context activeUser] isEqual: [userContext sogoUser]])
access = 0x03;
else
rc = MAPISTORE_ERR_NOT_FOUND;
{
sm = [SoSecurityManager sharedSecurityManager];
woContext = [userContext woContext];
return rc;
access = 0;
if (![sm validatePermission: SoPerm_ChangeImagesAndFiles
onObject: sogoObject
inContext: woContext])
access |= 1;
if (![sm validatePermission: SoPerm_AccessContentsInformation
onObject: sogoObject
inContext: woContext])
access |= 2;
if (![sm validatePermission: SOGoPerm_DeleteObject
onObject: sogoObject
inContext: woContext])
access |= 4;
}
*data = MAPILongValue (memCtx, access);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagChangeKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAccessLevel: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc = MAPISTORE_SUCCESS;
MAPIStoreContext *context;
MAPIStoreUserContext *userContext;
WOContext *woContext;
SoSecurityManager *sm;
uint32_t accessLvl;
context = [self context];
userContext = [self userContext];
if ([[context activeUser] isEqual: [userContext sogoUser]])
accessLvl = 1;
else
{
sm = [SoSecurityManager sharedSecurityManager];
woContext = [userContext woContext];
if (![sm validatePermission: SoPerm_ChangeImagesAndFiles
onObject: sogoObject
inContext: woContext])
accessLvl = 1;
else
accessLvl = 0;
}
*data = MAPILongValue (memCtx, accessLvl);
return MAPISTORE_SUCCESS;
}
- (int) getPidTagChangeKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
int rc = MAPISTORE_SUCCESS;
NSData *changeKey;
MAPIStoreGCSFolder *parentFolder;
NSString *nameInContainer;
@@ -110,10 +155,10 @@
return rc;
}
- (enum mapistore_error) getPidTagPredecessorChangeList: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagPredecessorChangeList: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
NSData *changeList;
MAPIStoreGCSFolder *parentFolder;
@@ -196,69 +241,4 @@
andPredecessorChangeList: predecessorChangeList];
}
//----------------------
// Sharing
//----------------------
- (NSString *) creator
{
return [self owner];
}
- (NSString *) owner
{
return [sogoObject ownerInContext: nil];
}
- (SOGoUser *) ownerUser
{
NSString *ownerName;
SOGoUser *owner = nil;
ownerName = [self owner];
if ([ownerName length] != 0)
owner = [SOGoUser userWithLogin: ownerName];
return owner;
}
- (BOOL) subscriberCanModifyMessage
{
BOOL rc;
NSArray *roles;
roles = [self activeUserRoles];
if (isNew)
rc = [roles containsObject: SOGoRole_ObjectCreator];
else
rc = [roles containsObject: SOGoRole_ObjectEditor];
/* Check if the message is owned and it has permission to edit it */
if (!rc && [roles containsObject: MAPIStoreRightEditOwn])
rc = [[[container context] activeUser] isEqual: [self ownerUser]];
return rc;
}
- (BOOL) subscriberCanDeleteMessage
{
BOOL rc;
NSArray *roles;
roles = [self activeUserRoles];
rc = [roles containsObject: SOGoRole_ObjectEraser];
/* Check if the message is owned and it has permission to delete it */
if (!rc && [roles containsObject: MAPIStoreRightDeleteOwn])
{
NSString *currentUser;
currentUser = [[container context] activeUser];
rc = [currentUser isEqual: [self ownerUser]];
}
return rc;
}
@end
+20 -20
View File
@@ -76,24 +76,24 @@
ASSIGN (bodyPart, newBodyPart);
}
- (enum mapistore_error) getPidTagAttachMethod: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachMethod: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, 0x00000001); // afByValue
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAttachTag: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachTag: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [[self mimeAttachTag] asBinaryInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAttachSize: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachSize: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
uint32_t longValue;
@@ -103,8 +103,8 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagRecordKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagRecordKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
static char recordBytes[] = {0xd9, 0xd8, 0x11, 0xa3, 0xe2, 0x90, 0x18, 0x41,
0x9e, 0x04, 0x58, 0x46, 0x9d, 0x6d, 0x1b,
@@ -121,16 +121,16 @@
return [bodyInfo filename];
}
- (enum mapistore_error) getPidTagAttachLongFilename: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachLongFilename: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [[self _fileName] asUnicodeInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAttachFilename: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachFilename: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *fileName, *baseName, *ext;
@@ -149,8 +149,8 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *fileName;
@@ -165,8 +165,8 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAttachContentId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachContentId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [[bodyInfo objectForKey: @"bodyId"]
asUnicodeInMemCtx: memCtx];
@@ -174,8 +174,8 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAttachMimeTag: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachMimeTag: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *mimeTag, *fileName;
@@ -193,8 +193,8 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAttachDataBinary: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAttachDataBinary: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [[bodyPart fetchBLOBWithPeek: YES] asBinaryInMemCtx: memCtx];
+80 -37
View File
@@ -208,9 +208,9 @@ static Class SOGoMailFolderK, MAPIStoreMailFolderK, MAPIStoreOutboxFolderK;
return rc;
}
- (enum mapistore_error) deleteFolder
- (int) deleteFolder
{
enum mapistore_error rc;
int rc;
NSException *error;
NSString *name;
@@ -234,8 +234,8 @@ static Class SOGoMailFolderK, MAPIStoreMailFolderK, MAPIStoreOutboxFolderK;
return (rc == MAPISTORE_SUCCESS) ? [super deleteFolder] : rc;
}
- (enum mapistore_error) getPidTagContentUnreadCount: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagContentUnreadCount: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
EOQualifier *searchQualifier;
uint32_t longValue;
@@ -250,8 +250,8 @@ static Class SOGoMailFolderK, MAPIStoreMailFolderK, MAPIStoreOutboxFolderK;
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagContainerClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagContainerClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [@"IPF.Note" asUnicodeInMemCtx: memCtx];
@@ -1363,14 +1363,15 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP)
// Move (or eventually copy) the mails identified by
// "srcMids" from the source folder into this folder.
//
- (enum mapistore_error) moveCopyMessagesWithMIDs: (uint64_t *) srcMids
andCount: (uint32_t) midCount
fromFolder: (MAPIStoreFolder *) sourceFolder
withMIDs: (uint64_t *) targetMids
andChangeKeys: (struct Binary_r **) targetChangeKeys
andPredecessorChangeLists: (struct Binary_r **) targetPredecessorChangeLists
wantCopy: (uint8_t) wantCopy
inMemCtx: (TALLOC_CTX *) memCtx
- (int) moveCopyMessagesWithMIDs: (uint64_t *) srcMids
andCount: (uint32_t) midCount
fromFolder: (MAPIStoreFolder *) sourceFolder
withMIDs: (uint64_t *) targetMids
andChangeKeys: (struct Binary_r **) targetChangeKeys
andPredecessorChangeLists: (struct Binary_r **) targetPredecessorChangeLists
wantCopy: (uint8_t) wantCopy
inMemCtx: (TALLOC_CTX *) memCtx
{
NGImap4Connection *connection;
NGImap4Client *client;
@@ -1656,7 +1657,7 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP)
- (id) lookupMessage: (NSString *) messageKey
{
MAPIStoreMailMessage *message;
NSArray *rawBodyData;
NSData *rawBodyData;
message = [super lookupMessage: messageKey];
if (message)
@@ -1730,31 +1731,73 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP)
- (enum mapistore_error) preloadMessageBodiesWithKeys: (NSArray *) keys
ofTableType: (enum mapistore_table_type) tableType
{
NSEnumerator *enumerator;
NSUInteger max;
NSString *messageKey;
MAPIStoreMailMessage *message;
NSArray* bodyContent;
NSMutableSet *bodyPartKeys;
NSMutableDictionary *keyAssoc;
NSDictionary *response;
NSUInteger count, max;
NSString *messageKey, *messageUid, *bodyPartKey;
NGImap4Client *client;
NSArray *fetch;
NSData *bodyContent;
if (tableType != MAPISTORE_MESSAGE_TABLE)
return MAPISTORE_SUCCESS;
[bodyData removeAllObjects];
max = [keys count];
if (max == 0)
return MAPISTORE_SUCCESS;
enumerator = [keys objectEnumerator];
while ((messageKey = [enumerator nextObject]))
if (tableType == MAPISTORE_MESSAGE_TABLE)
{
message = [self lookupMessage: messageKey];
if (message)
[bodyData removeAllObjects];
max = [keys count];
if (max > 0)
{
bodyContent = [message getBodyContent];
if (bodyContent)
bodyPartKeys = [NSMutableSet setWithCapacity: max];
keyAssoc = [NSMutableDictionary dictionaryWithCapacity: max];
for (count = 0; count < max; count++)
{
[bodyData setObject: bodyContent forKey: messageKey];
messageKey = [keys objectAtIndex: count];
message = [self lookupMessage: messageKey];
if (message)
{
bodyPartKey = [message bodyContentPartKey];
if (bodyPartKey)
{
[bodyPartKeys addObject: bodyPartKey];
messageUid = [self messageUIDFromMessageKey: messageKey];
/* If the bodyPartKey include peek, remove it as it is not returned
as key in the IMAP server response.
IMAP conversation example:
a4 UID FETCH 1 (UID BODY.PEEK[text])
* 1 FETCH (UID 1 BODY[TEXT] {1677}
*/
bodyPartKey = [bodyPartKey stringByReplacingOccurrencesOfString: @"body.peek"
withString: @"body"];
[keyAssoc setObject: bodyPartKey forKey: messageUid];
}
}
}
client = [[(SOGoMailFolder *) sogoObject imap4Connection] client];
[client select: [sogoObject absoluteImap4Name]];
response = [client fetchUids: [keyAssoc allKeys]
parts: [bodyPartKeys allObjects]];
fetch = [response objectForKey: @"fetch"];
max = [fetch count];
for (count = 0; count < max; count++)
{
response = [fetch objectAtIndex: count];
messageUid = [[response objectForKey: @"uid"] stringValue];
bodyPartKey = [keyAssoc objectForKey: messageUid];
if (bodyPartKey)
{
bodyContent = [[response objectForKey: bodyPartKey]
objectForKey: @"data"];
if (bodyContent)
{
messageKey = [NSString stringWithFormat: @"%@.eml",
messageUid];
[bodyData setObject: bodyContent forKey: messageKey];
}
}
}
}
}
@@ -1766,8 +1809,8 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP)
@implementation MAPIStoreOutboxFolder
- (enum mapistore_error) getPidTagDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [@"Outbox" asUnicodeInMemCtx: memCtx];
+26 -33
View File
@@ -25,10 +25,8 @@
#import "MAPIStoreMessage.h"
@class NSData;
@class NSString;
@class NSArray;
@class NSMutableArray;
@class NSMutableDictionary;
@class MAPIStoreAppointmentWrapper;
@class MAPIStoreMailFolder;
@@ -39,17 +37,12 @@
BOOL mailIsEvent;
BOOL mailIsMeetingRequest;
BOOL mailIsSharingObject;
NSMutableArray *bodyContentKeys;
NSMutableDictionary *bodyPartsEncodings;
NSMutableDictionary *bodyPartsCharsets;
NSMutableDictionary *bodyPartsMimeTypes;
NSMutableDictionary *bodyPartsMixed;
NSString *mimeKey;
NSString *headerCharset;
NSString *headerEncoding;
NSString *headerMimeType;
BOOL bodySetup;
NSArray *bodyContent;
NSData *bodyContent;
BOOL fetchedAttachments;
MAPIStoreAppointmentWrapper *appointmentWrapper;
@@ -57,31 +50,31 @@
- (NSString *) subject;
- (enum mapistore_error) getPidTagIconIndex: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagFlagStatus: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagIconIndex: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagFlagStatus: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagMessageFlags: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagFollowupIcon: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagImportance: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagReceivedByEmailAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagSenderEmailAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagDisplayTo: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagDisplayCc: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagDisplayBcc: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagMessageFlags: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagFollowupIcon: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagImportance: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagReceivedByEmailAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagSenderEmailAddress: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagDisplayTo: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagDisplayCc: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagDisplayBcc: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
/* batch-mode helpers */
- (void) setBodyContentFromRawData: (NSArray *) rawContent;
- (NSArray *) getBodyContent;
- (NSString *) bodyContentPartKey;
- (void) setBodyContentFromRawData: (NSData *) rawContent;
@end
File diff suppressed because it is too large. Load diff
+6 -6
View File
@@ -340,10 +340,10 @@ static Class MAPIStoreMailMessageK, NSDataK, NSStringK;
[self cleanupCaches];
}
- (enum mapistore_error) getRow: (struct mapistore_property_data **) dataP
withRowID: (uint32_t) rowId
andQueryType: (enum mapistore_query_type) queryType
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getRow: (struct mapistore_property_data **) dataP
withRowID: (uint32_t) rowId
andQueryType: (enum mapistore_query_type) queryType
inMemCtx: (TALLOC_CTX *) memCtx
{
if (!fetchedCoreInfos)
{
@@ -352,8 +352,8 @@ static Class MAPIStoreMailMessageK, NSDataK, NSStringK;
prefetchCoreInfosForMessageKeys: [self restrictedChildKeys]];
}
return [super getRow: dataP withRowID: rowId
andQueryType: queryType inMemCtx: memCtx];
return [super getRow: dataP withRowID: rowId
andQueryType: queryType inMemCtx: memCtx];
}
@end
+1 -1
View File
@@ -27,7 +27,7 @@
@interface MAPIStoreMailVolatileMessage : MAPIStoreMessage
- (enum mapistore_error) submitWithFlags: (enum SubmitFlags) flags;
- (int) submitWithFlags: (enum SubmitFlags) flags;
@end
+4 -4
View File
@@ -290,17 +290,17 @@ static NSString *recTypes[] = { @"orig", @"to", @"cc", @"bcc" };
: ULLONG_MAX);
}
- (enum mapistore_error) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [@"IPM.Note" asUnicodeInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagChangeKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagChangeKey: (void **) data inMemCtx: (TALLOC_CTX *) memCtx
{
NSData *changeKey;
enum mapistore_error rc;
int rc;
changeKey = [properties objectForKey: MAPIPropertyKey (PR_CHANGE_KEY)];
if (changeKey)
@@ -1051,7 +1051,7 @@ MakeMessageBody (NSDictionary *mailProperties, NSDictionary *attachmentParts, NS
return messageData;
}
- (enum mapistore_error) submitWithFlags: (enum SubmitFlags) flags
- (int) submitWithFlags: (enum SubmitFlags) flags
{
enum mapistore_error rc = MAPISTORE_SUCCESS;
NSDictionary *recipients;
+2 -2
View File
@@ -258,7 +258,7 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr)
if (oldURL != NULL)
{
[self errorWithFormat:
@"url with idNbr already registered: (oldUrl='%@', newUrl='%@', id=0x%.16"PRIx64")",
@"url with idNbr already registered: (oldUrl='%@', newUrl='%@', id=x%.16"PRIx64")",
oldURL, urlString, idNbr];
return NO;
}
@@ -306,7 +306,7 @@ MAPIStoreMappingKeyFromId (uint64_t idNbr)
}
else
[NSException raise: NSInvalidArgumentException
format: @"number of urls (%d) and ids (%d) do not match", max, [idNbrs count]];
format: @"number of urls and ids do not match"];
}
- (void) unregisterURLWithID: (uint64_t) idNbr
+9 -11
View File
@@ -48,28 +48,27 @@
- (void) getMessageData: (struct mapistore_message **) dataPtr
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) modifyRecipientsWithRecipients: (struct mapistore_message_recipient *) recipients
andCount: (NSUInteger) max
andColumns: (struct SPropTagArray *) columns;
- (int) modifyRecipientsWithRecipients: (struct mapistore_message_recipient *) recipients
andCount: (NSUInteger) max
andColumns: (struct SPropTagArray *) columns;
- (NSArray *) attachmentKeys;
- (NSArray *) attachmentKeysMatchingQualifier: (EOQualifier *) qualifier
andSortOrderings: (NSArray *) sortOrderings;
- (id) lookupAttachment: (NSString *) childKey;
/* backend methods */
- (enum mapistore_error) createAttachment: (MAPIStoreAttachment **) attachmentPtr
inAID: (uint32_t *) aidPtr;
- (enum mapistore_error) getAttachment: (MAPIStoreAttachment **) attachmentPtr
withAID: (uint32_t) aid;
- (enum mapistore_error) getAttachmentTable: (MAPIStoreAttachmentTable **) tablePtr
andRowCount: (uint32_t *) countPtr;
- (int) createAttachment: (MAPIStoreAttachment **) attachmentPtr
inAID: (uint32_t *) aidPtr;
- (int) getAttachment: (MAPIStoreAttachment **) attachmentPtr
withAID: (uint32_t) aid;
- (int) getAttachmentTable: (MAPIStoreAttachmentTable **) tablePtr
andRowCount: (uint32_t *) countPtr;
- (enum mapistore_error) setReadFlag: (uint8_t) flag;
- (enum mapistore_error) saveMessage: (TALLOC_CTX *) memCtx;
- (NSArray *) activeContainerMessageTables;
- (NSArray *) activeUserRoles;
- (NSArray *) expandRoles: (NSArray *) roles;
/* move & copy internal ops */
- (void) copyToMessage: (MAPIStoreMessage *) newMessage inMemCtx: (TALLOC_CTX *) memCtx;
@@ -83,7 +82,6 @@
- (BOOL) subscriberCanReadMessage;
- (BOOL) subscriberCanModifyMessage;
- (BOOL) subscriberCanDeleteMessage;
@end
+87 -105
View File
@@ -276,9 +276,9 @@ rtf2html (NSData *compressedRTF)
return recipientProperties;
}
- (enum mapistore_error) modifyRecipientsWithRecipients: (struct mapistore_message_recipient *) newRecipients
andCount: (NSUInteger) max
andColumns: (struct SPropTagArray *) columns;
- (int) modifyRecipientsWithRecipients: (struct mapistore_message_recipient *) newRecipients
andCount: (NSUInteger) max
andColumns: (struct SPropTagArray *) columns;
{
static NSString *recTypes[] = { @"orig", @"to", @"cc", @"bcc" };
NSDictionary *recipientProperties;
@@ -318,7 +318,7 @@ rtf2html (NSData *compressedRTF)
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) addPropertiesFromRow: (struct SRow *) aRow
- (int) addPropertiesFromRow: (struct SRow *) aRow
{
enum mapistore_error rc;
MAPIStoreContext *context;
@@ -397,11 +397,11 @@ rtf2html (NSData *compressedRTF)
return newAttachment;
}
- (enum mapistore_error) createAttachment: (MAPIStoreAttachment **) attachmentPtr
inAID: (uint32_t *) aidPtr
- (int) createAttachment: (MAPIStoreAttachment **) attachmentPtr
inAID: (uint32_t *) aidPtr
{
MAPIStoreAttachment *attachment;
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
attachment = [self createAttachment];
if (attachment)
@@ -422,12 +422,12 @@ rtf2html (NSData *compressedRTF)
return nil;
}
- (enum mapistore_error) getAttachment: (MAPIStoreAttachment **) attachmentPtr
withAID: (uint32_t) aid
- (int) getAttachment: (MAPIStoreAttachment **) attachmentPtr
withAID: (uint32_t) aid
{
MAPIStoreAttachment *attachment;
NSArray *keys;
enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND;
int rc = MAPISTORE_ERR_NOT_FOUND;
keys = [self attachmentKeys];
if (aid < [keys count])
@@ -443,11 +443,11 @@ rtf2html (NSData *compressedRTF)
return rc;
}
- (enum mapistore_error) getAttachmentTable: (MAPIStoreAttachmentTable **) tablePtr
andRowCount: (uint32_t *) countPtr
- (int) getAttachmentTable: (MAPIStoreAttachmentTable **) tablePtr
andRowCount: (uint32_t *) countPtr
{
MAPIStoreAttachmentTable *attTable;
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
attTable = [self attachmentTable];
if (attTable)
@@ -547,8 +547,7 @@ rtf2html (NSData *compressedRTF)
for (count = 0; count < max; count++)
[[containerTables objectAtIndex: count] restrictedChildKeys];
}
/* TODO: Check the save process succeeded */
[self save: memCtx];
/* We make sure that any change-related properties are removed from the
properties dictionary, to make sure that related methods will be
@@ -583,8 +582,8 @@ rtf2html (NSData *compressedRTF)
}
/* getters */
- (enum mapistore_error) getPidTagInstID: (void **) data // TODO: DOUBT
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagInstID: (void **) data // TODO: DOUBT
inMemCtx: (TALLOC_CTX *) memCtx
{
/* we return a unique id based on the key */
*data = MAPILongLongValue (memCtx, [[sogoObject nameInContainer] hash]);
@@ -592,22 +591,22 @@ rtf2html (NSData *compressedRTF)
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagInstanceNum: (void **) data // TODO: DOUBT
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagInstanceNum: (void **) data // TODO: DOUBT
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getLongZero: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagRowType: (void **) data // TODO: DOUBT
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagRowType: (void **) data // TODO: DOUBT
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, TBL_LEAF_ROW);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagDepth: (void **) data // TODO: DOUBT
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDepth: (void **) data // TODO: DOUBT
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongLongValue (memCtx, 0);
@@ -624,8 +623,8 @@ rtf2html (NSData *compressedRTF)
0x00000010 Create Contents Table
0x00000020 Create Associated Contents Table
*/
- (enum mapistore_error) getPidTagAccess: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAccess: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
uint32_t access = 0;
BOOL userIsOwner;
@@ -650,7 +649,8 @@ rtf2html (NSData *compressedRTF)
if (userIsOwner
|| ([self isKindOfClass: MAPIStoreEmbeddedMessageK]
&& [mainMessage subscriberCanModifyMessage])
|| [mainMessage subscriberCanDeleteMessage])
|| [(MAPIStoreFolder *)
[mainMessage container] subscriberCanDeleteMessages])
access |= 0x04;
*data = MAPILongValue (memCtx, access);
@@ -664,8 +664,8 @@ rtf2html (NSData *compressedRTF)
0x00000000 Read-Only
0x00000001 Modify
*/
- (enum mapistore_error) getPidTagAccessLevel: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAccessLevel: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
uint32_t access = 0;
BOOL userIsOwner;
@@ -684,20 +684,20 @@ rtf2html (NSData *compressedRTF)
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagHasNamedProperties: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int ) getPidTagHasNamedProperties: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getYes: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidSideEffects: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidSideEffects: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getLongZero: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidCurrentVersion: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidCurrentVersion: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
// *data = MAPILongValue (memCtx, 115608); // Outlook 11.5608
*data = MAPILongValue (memCtx, 0x1ce3a); // Outlook 11.8330
@@ -705,34 +705,34 @@ rtf2html (NSData *compressedRTF)
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidLidCurrentVersionName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidCurrentVersionName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [@"11.0" asUnicodeInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidLidAutoProcessState: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidAutoProcessState: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, 0x00000000);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagFolderId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagFolderId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongLongValue (memCtx, [container objectId]);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagMid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc;
int rc;
uint64_t obId;
obId = [self objectId];
@@ -747,24 +747,24 @@ rtf2html (NSData *compressedRTF)
return rc;
}
- (enum mapistore_error) getPidTagMessageLocaleId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMessageLocaleId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, 0x0409);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagMessageFlags: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMessageFlags: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, MSGFLAG_FROMME | MSGFLAG_READ | MSGFLAG_UNMODIFIED);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagMessageSize: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMessageSize: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
{
/* TODO: choose another name in SOGo for that method */
*data = MAPILongValue (memCtx, [[sogoObject davContentLength] intValue]);
@@ -772,30 +772,30 @@ rtf2html (NSData *compressedRTF)
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagImportance: (void **) data // TODO -> subclass?
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagImportance: (void **) data // TODO -> subclass?
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, 1);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagPriority: (void **) data // TODO -> subclass?
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagPriority: (void **) data // TODO -> subclass?
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getLongZero: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagSensitivity: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagSensitivity: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getLongZero: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagSubject: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagSubject: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc;
int rc;
TALLOC_CTX *localMemCtx;
char *prefix, *normalizedSubject;
@@ -816,71 +816,71 @@ rtf2html (NSData *compressedRTF)
return rc;
}
- (enum mapistore_error) getPidTagNormalizedSubject: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagNormalizedSubject: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidTagOriginalSubject: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagOriginalSubject: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidTagSubject: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagConversationTopic: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagConversationTopic: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidTagNormalizedSubject: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagSubjectPrefix: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagSubjectPrefix: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getEmptyString: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagDeleteAfterSubmit: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDeleteAfterSubmit: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getNo: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagDisplayTo: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDisplayTo: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getEmptyString: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagDisplayCc: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDisplayCc: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getEmptyString: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagDisplayBcc: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDisplayBcc: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getEmptyString: data inMemCtx: memCtx];
}
// - (enum mapistore_error) getPidTagOriginalDisplayTo: (void **) data
// - (int) getPidTagOriginalDisplayTo: (void **) data
// {
// return [self getPidTagDisplayTo: data];
// }
// - (enum mapistore_error) getPidTagOriginalDisplayCc: (void **) data
// - (int) getPidTagOriginalDisplayCc: (void **) data
// {
// return [self getPidTagDisplayCc: data];
// }
// - (enum mapistore_error) getPidTagOriginalDisplayBcc: (void **) data
// - (int) getPidTagOriginalDisplayBcc: (void **) data
// {
// return [self getPidTagDisplayBcc: data];
// }
- (enum mapistore_error) getPidTagLastModifierName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagLastModifierName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSURL *contextUrl;
@@ -890,22 +890,22 @@ rtf2html (NSData *compressedRTF)
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
[self subclassResponsibility: _cmd];
return MAPISTORE_ERR_NOT_FOUND;
}
- (enum mapistore_error) getPidTagOriginalMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagOriginalMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getProperty: data withTag: PidTagMessageClass inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagHasAttachments: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagHasAttachments: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPIBoolValue (memCtx,
[[self attachmentKeys] count] > 0);
@@ -913,8 +913,8 @@ rtf2html (NSData *compressedRTF)
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagAssociated: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagAssociated: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getNo: data inMemCtx: memCtx];;
}
@@ -981,38 +981,20 @@ rtf2html (NSData *compressedRTF)
activeUserRoles = [[context activeUser]
rolesForObject: sogoObject
inContext: [userContext woContext]];
/* We use in this library the roles as flags, so we expand high
access rights with the lower ones */
activeUserRoles = [self expandRoles: activeUserRoles];
[activeUserRoles retain];
}
return activeUserRoles;
}
/* Expand current roles with lower access roles to transform them to
flags */
- (NSArray *) expandRoles: (NSArray *) roles
{
return roles;
}
/* Can the current active user read the message? */
- (BOOL) subscriberCanReadMessage
{
return NO;
}
/* Can the current active user modify the message? */
- (BOOL) subscriberCanModifyMessage
{
return NO;
}
/* Can the current active user delete the message? */
- (BOOL) subscriberCanDeleteMessage
{
return NO;
}
@end
-18
View File
@@ -1,7 +1,6 @@
/* MAPIStoreNotesContext.m - this file is part of SOGo
*
* Copyright (C) 2010-2012 Inverse inc.
* Copyright (C) 2016 Enrique J. Hernandez
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
*
@@ -31,30 +30,13 @@
#undef DEBUG
#include <mapistore/mapistore.h>
static Class MAPIStoreNotesFolderK;
@implementation MAPIStoreNotesContext
+ (void) initialize
{
MAPIStoreNotesFolderK = [MAPIStoreNotesFolder class];
}
+ (NSString *) MAPIModuleName
{
return @"notes";
}
+ (enum mapistore_context_role) MAPIContextRole
{
return MAPISTORE_NOTES_ROLE;
}
- (Class) MAPIStoreFolderClass
{
return MAPIStoreNotesFolderK;
}
+ (struct mapistore_contexts_list *) listContextsForUser: (NSString *) userName
withIndexing: (struct indexing_context *) indexing
inMemCtx: (TALLOC_CTX *) memCtx
+2 -2
View File
@@ -30,8 +30,8 @@
@implementation MAPIStoreNotesFolder
- (enum mapistore_error) getPidTagDefaultPostMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDefaultPostMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [@"IPM.StickyNote" asUnicodeInMemCtx: memCtx];
+3 -3
View File
@@ -32,8 +32,8 @@
@implementation MAPIStoreNotesMessage
- (enum mapistore_error) getPidTagIconIndex: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagIconIndex: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
{
/* see http://msdn.microsoft.com/en-us/library/cc815472.aspx */
// *longValue = 0x00000300 for blue
@@ -46,7 +46,7 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMessageClass: (void **) data inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [@"IPM.StickyNote" asUnicodeInMemCtx: memCtx];
+15 -15
View File
@@ -68,27 +68,27 @@
- (NSMutableDictionary *) properties;
/* ops */
- (enum mapistore_error) getProperties: (struct mapistore_property_data *) data
withTags: (enum MAPITAGS *) tags
andCount: (uint16_t) columnCount
inMemCtx: (TALLOC_CTX *) localMemCtx;
- (int) getProperties: (struct mapistore_property_data *) data
withTags: (enum MAPITAGS *) tags
andCount: (uint16_t) columnCount
inMemCtx: (TALLOC_CTX *) localMemCtx;
- (enum mapistore_error) addPropertiesFromRow: (struct SRow *) aRow;
- (int) addPropertiesFromRow: (struct SRow *) aRow;
- (enum mapistore_error) getProperty: (void **) data
withTag: (enum MAPITAGS) propTag
inMemCtx: (TALLOC_CTX *) localMemCtx;
- (int) getProperty: (void **) data
withTag: (enum MAPITAGS) propTag
inMemCtx: (TALLOC_CTX *) localMemCtx;
/* helper getters */
- (NSData *) getReplicaKeyFromGlobCnt: (uint64_t) objectCnt;
- (enum mapistore_error) getReplicaKey: (void **) data
fromGlobCnt: (uint64_t) objectCnt
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getReplicaKey: (void **) data
fromGlobCnt: (uint64_t) objectCnt
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagCreationTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagLastModificationTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagCreationTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagLastModificationTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
/* move and copy operations */
- (void) copyPropertiesToObject: (MAPIStoreObject *) newObject inMemCtx: (TALLOC_CTX *) memCtx;
+16 -16
View File
@@ -150,15 +150,15 @@ static Class NSExceptionK, MAPIStoreFolderK;
return properties;
}
- (enum mapistore_error) getProperty: (void **) data
withTag: (enum MAPITAGS) propTag
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getProperty: (void **) data
withTag: (enum MAPITAGS) propTag
inMemCtx: (TALLOC_CTX *) memCtx
{
MAPIStorePropertyGetter method = NULL;
uint16_t propValue;
SEL methodSel;
id value;
enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND;
int rc = MAPISTORE_ERR_NOT_FOUND;
NSUInteger count, max;
value = [properties objectForKey: MAPIPropertyKey (propTag)];
@@ -186,16 +186,16 @@ static Class NSExceptionK, MAPIStoreFolderK;
return rc;
}
- (enum mapistore_error) getPidTagCreationTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagCreationTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [[self creationTime] asFileTimeInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagLastModificationTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagLastModificationTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [[self lastModificationTime] asFileTimeInMemCtx: memCtx];
@@ -219,10 +219,10 @@ static Class NSExceptionK, MAPIStoreFolderK;
return canGetProperty;
}
- (enum mapistore_error) getProperties: (struct mapistore_property_data *) data
withTags: (enum MAPITAGS *) tags
andCount: (uint16_t) columnCount
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getProperties: (struct mapistore_property_data *) data
withTags: (enum MAPITAGS *) tags
andCount: (uint16_t) columnCount
inMemCtx: (TALLOC_CTX *) memCtx
{
uint16_t count;
@@ -239,7 +239,7 @@ static Class NSExceptionK, MAPIStoreFolderK;
[proxies addObject: newProxy];
}
- (enum mapistore_error) addPropertiesFromRow: (struct SRow *) aRow
- (int) addPropertiesFromRow: (struct SRow *) aRow
{
struct SPropValue *cValue;
NSUInteger counter;
@@ -298,9 +298,9 @@ static Class NSExceptionK, MAPIStoreFolderK;
return replicaKey;
}
- (enum mapistore_error) getReplicaKey: (void **) data
fromGlobCnt: (uint64_t) objectCnt
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getReplicaKey: (void **) data
fromGlobCnt: (uint64_t) objectCnt
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [[self getReplicaKeyFromGlobCnt: objectCnt] asBinaryInMemCtx: memCtx];
+1 -1
View File
@@ -51,7 +51,7 @@
MAPIStorePropertyGetter method;
uint16_t propValue;
SEL methodSel;
enum mapistore_error rc;
int rc;
propValue = (propTag & 0xffff0000) >> 16;
methodSel = MAPIStoreSelectorForPropertyGetter (propValue);
+8 -9
View File
@@ -84,16 +84,16 @@
return memberId;
}
- (enum mapistore_error) getPidTagMemberId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMemberId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongLongValue (memCtx, memberId);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagEntryId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagEntryId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSData *entryId;
struct mapistore_connection_info *connInfo;
@@ -110,8 +110,8 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagMemberName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMemberName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *displayName;
@@ -127,14 +127,13 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagMemberRights: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMemberRights: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
uint32_t rights;
NSArray *roles;
roles = [[(MAPIStoreFolder *) container aclFolder] aclsForUser: userId];
roles = [(MAPIStoreFolder *) container expandRoles: roles];
rights = [(MAPIStoreFolder *) container exchangeRightsForRoles: roles];
*data = MAPILongValue (memCtx, rights);
+40 -68
View File
@@ -146,8 +146,6 @@ sogo_backend_init (void)
NSUserDefaults *ud;
SoProductRegistry *registry;
char *argv[] = { SAMBA_PREFIX "/sbin/samba", NULL };
NSString *debugLevel;
uint8_t parentLogLevel;
GSRegisterCurrentThread();
@@ -172,11 +170,6 @@ sogo_backend_init (void)
/* We force the plugin to base its configuration on the SOGo tree. */
ud = [NSUserDefaults standardUserDefaults];
/* Ensure imap4Connection calls raise Exception if
IMAP connection is not established. See NGImap4Connection.m */
[ud setBool: YES forKey: @"SoIMAP4ExceptionsEnabled"];
if (!leakDebugging && [ud boolForKey: @"SOGoDebugLeaks"])
{
NSLog (@" leak debugging on");
@@ -185,22 +178,6 @@ sogo_backend_init (void)
leakDebugging = YES;
}
/* Set debug level according to samba */
parentLogLevel = DEBUGLEVEL_CLASS[DBGC_ALL]; // FIXME: samba logger specific code
if (parentLogLevel >= 4)
debugLevel = @"DEBUG";
else if (parentLogLevel >= 3)
debugLevel = @"INFO";
else if (parentLogLevel >= 2)
debugLevel = @"WARN";
else if (parentLogLevel >= 1)
debugLevel = @"ERROR";
else
debugLevel = @"FATAL";
OC_DEBUG(3, "[SOGo] Setting log level to %s", [debugLevel UTF8String]);
[ud setObject: debugLevel forKey: @"NGLogDefaultLogLevel"];
[ud synchronize];
registry = [SoProductRegistry sharedProductRegistry];
[registry scanForProductsInDirectory: SOGO_BUNDLES_DIR];
@@ -244,13 +221,8 @@ static void mapiapp_cleanup(void)
\details Create a connection context to the sogo backend
\param mem_ctx pointer to the memory context
\param conn_info pointer to the connection information available for this context
(database connection, connected user, replica server info)
\param indexing pointer to the indexing database connection
\param uri pointer to the sogo path
\param private_data pointer to the private backend context
\note the developer must free allocated private_data
*/
static enum mapistore_error
@@ -261,7 +233,7 @@ sogo_backend_create_context(TALLOC_CTX *mem_ctx,
{
NSAutoreleasePool *pool;
MAPIStoreContext *context;
enum mapistore_error rc;
int rc;
NS_CURRENT_THREAD_REGISTER();
pool = [NSAutoreleasePool new];
@@ -296,7 +268,7 @@ sogo_backend_create_root_folder (const char *username,
NSAutoreleasePool *pool;
NSString *userName, *folderName;
NSString *mapistoreUri;
enum mapistore_error rc;
int rc;
NS_CURRENT_THREAD_REGISTER();
pool = [NSAutoreleasePool new];
@@ -331,7 +303,7 @@ sogo_backend_list_contexts(const char *username, struct indexing_context *indexi
{
NSAutoreleasePool *pool;
NSString *userName;
enum mapistore_error rc;
int rc;
NS_CURRENT_THREAD_REGISTER();
pool = [NSAutoreleasePool new];
@@ -377,7 +349,7 @@ sogo_context_get_path(void *backend_object, TALLOC_CTX *mem_ctx,
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreContext *context;
enum mapistore_error rc;
int rc;
if (backend_object)
{
@@ -409,7 +381,7 @@ sogo_context_get_root_folder(void *backend_object, TALLOC_CTX *mem_ctx,
NSAutoreleasePool *pool;
MAPIStoreContext *context;
MAPIStoreFolder *folder;
enum mapistore_error rc;
int rc;
if (backend_object)
{
@@ -450,7 +422,7 @@ sogo_folder_open_folder(void *folder_object, TALLOC_CTX *mem_ctx, uint64_t fid,
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreFolder *folder, *childFolder;
enum mapistore_error rc;
int rc;
if (folder_object)
{
@@ -492,7 +464,7 @@ sogo_folder_create_folder(void *folder_object, TALLOC_CTX *mem_ctx,
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreFolder *folder, *childFolder;
enum mapistore_error rc;
int rc;
if (folder_object)
{
@@ -533,7 +505,7 @@ sogo_folder_delete(void *folder_object)
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreFolder *folder;
enum mapistore_error rc;
int rc;
if (folder_object)
{
@@ -563,7 +535,7 @@ sogo_folder_get_child_count(void *folder_object, enum mapistore_table_type table
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreFolder *folder;
enum mapistore_error rc;
int rc;
if (folder_object)
{
@@ -597,7 +569,7 @@ sogo_folder_open_message(void *folder_object,
NSAutoreleasePool *pool;
MAPIStoreFolder *folder;
MAPIStoreMessage *message;
enum mapistore_error rc;
int rc;
if (folder_object)
{
@@ -637,7 +609,7 @@ sogo_folder_create_message(void *folder_object,
NSAutoreleasePool *pool;
MAPIStoreFolder *folder;
MAPIStoreMessage *message;
enum mapistore_error rc;
int rc;
if (folder_object)
{
@@ -671,7 +643,7 @@ sogo_folder_delete_message(void *folder_object, uint64_t mid, uint8_t flags)
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreFolder *folder;
enum mapistore_error rc;
int rc;
if (folder_object)
{
@@ -708,7 +680,7 @@ sogo_folder_move_copy_messages(void *folder_object,
MAPIStoreFolder *sourceFolder, *targetFolder;
NSAutoreleasePool *pool;
struct MAPIStoreTallocWrapper *wrapper;
enum mapistore_error rc;
int rc;
if (folder_object)
{
@@ -751,7 +723,7 @@ sogo_folder_move_folder(void *folder_object, void *target_folder_object,
MAPIStoreFolder *moveFolder, *targetFolder;
NSString *newFolderName;
struct MAPIStoreTallocWrapper *wrapper;
enum mapistore_error rc;
int rc;
if (folder_object)
{
@@ -799,7 +771,7 @@ sogo_folder_copy_folder(void *folder_object, void *target_folder_object, TALLOC_
MAPIStoreFolder *copyFolder, *targetFolder;
NSString *newFolderName;
struct MAPIStoreTallocWrapper *wrapper;
enum mapistore_error rc;
int rc;
if (folder_object)
{
@@ -841,7 +813,7 @@ sogo_folder_get_deleted_fmids(void *folder_object, TALLOC_CTX *mem_ctx,
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreFolder *folder;
enum mapistore_error rc;
int rc;
if (folder_object)
{
@@ -878,7 +850,7 @@ sogo_folder_open_table(void *folder_object, TALLOC_CTX *mem_ctx,
NSAutoreleasePool *pool;
MAPIStoreFolder *folder;
MAPIStoreTable *table;
enum mapistore_error rc;
int rc;
if (folder_object)
{
@@ -915,7 +887,7 @@ sogo_folder_modify_permissions(void *folder_object, uint8_t flags,
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreFolder *folder;
enum mapistore_error rc;
int rc;
if (folder_object)
{
@@ -947,7 +919,7 @@ sogo_folder_preload_message_bodies(void *folder_object, enum mapistore_table_typ
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreFolder *folder;
enum mapistore_error rc;
int rc;
if (folder_object)
{
@@ -980,7 +952,7 @@ sogo_message_get_message_data(void *message_object,
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreMessage *message;
enum mapistore_error rc;
int rc;
if (message_object)
{
@@ -1013,7 +985,7 @@ sogo_message_create_attachment (void *message_object, TALLOC_CTX *mem_ctx, void
NSAutoreleasePool *pool;
MAPIStoreMessage *message;
MAPIStoreAttachment *attachment;
enum mapistore_error rc;
int rc;
if (message_object)
{
@@ -1047,7 +1019,7 @@ sogo_message_open_attachment (void *message_object, TALLOC_CTX *mem_ctx,
NSAutoreleasePool *pool;
MAPIStoreMessage *message;
MAPIStoreAttachment *attachment;
enum mapistore_error rc;
int rc;
if (message_object)
{
@@ -1080,7 +1052,7 @@ sogo_message_get_attachment_table (void *message_object, TALLOC_CTX *mem_ctx, vo
NSAutoreleasePool *pool;
MAPIStoreMessage *message;
MAPIStoreAttachmentTable *table;
enum mapistore_error rc;
int rc;
if (message_object)
{
@@ -1116,7 +1088,7 @@ sogo_message_modify_recipients (void *message_object,
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreMessage *message;
enum mapistore_error rc;
int rc;
if (message_object)
{
@@ -1178,7 +1150,7 @@ sogo_message_save (void *message_object, TALLOC_CTX *mem_ctx)
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreMessage *message;
enum mapistore_error rc;
int rc;
if (message_object)
{
@@ -1208,7 +1180,7 @@ sogo_message_submit (void *message_object, enum SubmitFlags flags)
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreMailVolatileMessage *message;
enum mapistore_error rc;
int rc;
if (message_object)
{
@@ -1243,7 +1215,7 @@ sogo_message_attachment_open_embedded_message (void *attachment_object,
NSAutoreleasePool *pool;
MAPIStoreAttachment *attachment;
MAPIStoreEmbeddedMessage *message;
enum mapistore_error rc;
int rc;
if (attachment_object)
{
@@ -1282,7 +1254,7 @@ sogo_message_attachment_create_embedded_message (void *attachment_object,
NSAutoreleasePool *pool;
MAPIStoreAttachment *attachment;
MAPIStoreEmbeddedMessage *message;
enum mapistore_error rc;
int rc;
if (attachment_object)
{
@@ -1316,7 +1288,7 @@ static enum mapistore_error sogo_table_get_available_properties(void *table_obje
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreTable *table;
enum mapistore_error rc;
int rc;
if (table_object)
{
@@ -1346,7 +1318,7 @@ sogo_table_set_columns (void *table_object, uint16_t count, enum MAPITAGS *prope
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreTable *table;
enum mapistore_error rc;
int rc;
if (table_object)
{
@@ -1377,7 +1349,7 @@ sogo_table_set_restrictions (void *table_object, struct mapi_SRestriction *restr
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreTable *table;
enum mapistore_error rc;
int rc;
if (table_object)
{
@@ -1410,7 +1382,7 @@ sogo_table_set_sort_order (void *table_object, struct SSortOrderSet *sort_order,
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreTable *table;
enum mapistore_error rc;
int rc;
if (table_object)
{
@@ -1445,7 +1417,7 @@ sogo_table_get_row (void *table_object, TALLOC_CTX *mem_ctx,
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreTable *table;
enum mapistore_error rc;
int rc;
if (table_object)
{
@@ -1478,7 +1450,7 @@ sogo_table_get_row_count (void *table_object,
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreTable *table;
enum mapistore_error rc;
int rc;
if (table_object)
{
@@ -1509,7 +1481,7 @@ sogo_table_handle_destructor (void *table_object, uint32_t handle_id)
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreTable *table;
enum mapistore_error rc;
int rc;
if (table_object)
{
@@ -1541,7 +1513,7 @@ static enum mapistore_error sogo_properties_get_available_properties(void *objec
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreObject *propObject;
enum mapistore_error rc;
int rc;
if (object)
{
@@ -1574,7 +1546,7 @@ sogo_properties_get_properties (void *object,
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreObject *propObject;
enum mapistore_error rc;
int rc;
if (object)
{
@@ -1606,7 +1578,7 @@ sogo_properties_set_properties (void *object, struct SRow *aRow)
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
MAPIStoreObject *propObject;
enum mapistore_error rc;
int rc;
if (object)
{
@@ -1684,10 +1656,10 @@ sogo_manager_generate_uri (TALLOC_CTX *mem_ctx,
\return MAPISTORE_SUCCESS on success, otherwise MAPISTORE error
*/
enum mapistore_error mapistore_init_backend(void)
int mapistore_init_backend(void)
{
struct mapistore_backend backend;
enum mapistore_error ret;
int ret;
static BOOL registered = NO;
if (registered)
+12 -12
View File
@@ -65,18 +65,18 @@
- (uint64_t) objectId;
/* implemented getters */
- (enum mapistore_error) getPidTagDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagSearchKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagGenerateExchangeViews: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagParentSourceKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagSourceKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTagChangeKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagSearchKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagGenerateExchangeViews: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagParentSourceKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagSourceKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagChangeKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
/* subclasses */
- (uint64_t) objectVersion;
+16 -16
View File
@@ -136,16 +136,16 @@ static Class MAPIStoreFolderK;
}
/* getters */
- (enum mapistore_error) getPidTagDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [[sogoObject displayName] asUnicodeInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagSearchKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagSearchKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *stringValue;
@@ -156,31 +156,31 @@ static Class MAPIStoreFolderK;
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagGenerateExchangeViews: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagGenerateExchangeViews: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getNo: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagParentSourceKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagParentSourceKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getReplicaKey: data fromGlobCnt: [container objectId] >> 16
inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagSourceKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagSourceKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getReplicaKey: data fromGlobCnt: [self objectId] >> 16
inMemCtx: memCtx];
}
/* helper getters */
- (enum mapistore_error) getPidTagChangeKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagChangeKey: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc;
int rc;
uint64_t obVersion;
obVersion = [self objectVersion];
@@ -193,10 +193,10 @@ static Class MAPIStoreFolderK;
return rc;
}
- (enum mapistore_error) getPidTagChangeNumber: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagChangeNumber: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc;
int rc;
struct mapistore_connection_info *connInfo;
uint64_t obVersion;
+53 -53
View File
@@ -1,6 +1,6 @@
/* MAPIStoreSharingMessage.h - this file is part of SOGo-OpenChange
*
* Copyright (C) 2015-2016 Enrique J. Hernández
* Copyright (C) 2015 Enrique J. Hernández
*
* Author: Enrique J. Hernández <ejhernandez@zentyal.com>
*
@@ -39,58 +39,58 @@
fromMessage: (MAPIStoreMailMessage *) msg;
/* getters */
- (enum mapistore_error) getPidLidSharingCapabilities: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidNameXSharingCapabilities: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidSharingConfigurationUrl: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidNameXSharingConfigUrl: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidSharingFlavor: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidNameXSharingFlavor: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidSharingInitiatorEntryId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidSharingInitiatorName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidSharingInitiatorSmtp: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidSharingLocalType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidNameXSharingLocalType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidSharingProviderGuid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidNameXSharingProviderGuid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidSharingProviderName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidNameXSharingProviderName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidSharingProviderUrl: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidNameXSharingProviderUrl: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidSharingRemoteName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidNameXSharingRemoteName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidSharingRemoteStoreUid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidNameXSharingRemoteStoreUid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidSharingRemoteType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidTypeXSharingRemoteType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidSharingResponseTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidLidSharingResponseType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getPidNameContentClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidSharingCapabilities: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidNameXSharingCapabilities: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidSharingConfigurationUrl: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidNameXSharingConfigUrl: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidSharingFlavor: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidNameXSharingFlavor: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidSharingInitiatorEntryId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidSharingInitiatorName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidSharingInitiatorSmtp: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidSharingLocalType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidNameXSharingLocalType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidSharingProviderGuid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidNameXSharingProviderGuid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidSharingProviderName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidNameXSharingProviderName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidSharingProviderUrl: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidNameXSharingProviderUrl: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidSharingRemoteName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidNameXSharingRemoteName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidSharingRemoteStoreUid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidNameXSharingRemoteStoreUid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidSharingRemoteType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTypeXSharingRemoteType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidSharingResponseTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidSharingResponseType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidNameContentClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
/* Save */
- (void) saveWithMessage: (MAPIStoreMailMessage *) msg
+57 -57
View File
@@ -1,6 +1,6 @@
/* MAPIStoreSharingMessage.m - this file is part of SOGo-OpenChange
*
* Copyright (C) 2015-2016 Enrique J. Hernández
* Copyright (C) 2015 Enrique J. Hernández
*
* Author: Enrique J. Hernández <ejhernandez@zentyal.com>
*
@@ -108,8 +108,8 @@
}
- (enum mapistore_error) getPidLidSharingCapabilities: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidSharingCapabilities: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND;
@@ -125,8 +125,8 @@
return rc;
}
- (enum mapistore_error) getPidNameXSharingCapabilities: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidNameXSharingCapabilities: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND;
@@ -143,22 +143,22 @@
return rc;
}
- (enum mapistore_error) getPidLidSharingConfigurationUrl: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidSharingConfigurationUrl: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [@"" asUnicodeInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidNameXSharingConfigUrl: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidNameXSharingConfigUrl: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidLidSharingConfigurationUrl: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidSharingFlavor: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidSharingFlavor: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
/* See [MS-OXSHARE] Section 2.2.2.5 for details */
enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND;
@@ -206,8 +206,8 @@
return rc;
}
- (enum mapistore_error) getPidNameXSharingFlavor: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidNameXSharingFlavor: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND;
id value;
@@ -223,8 +223,8 @@
return rc;
}
- (enum mapistore_error) getPidLidSharingInitiatorEntryId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidSharingInitiatorEntryId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND;
id value;
@@ -244,38 +244,38 @@
return rc;
}
- (enum mapistore_error) getPidLidSharingInitiatorName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidSharingInitiatorName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getStringProperty: @"x-ms-sharing-initiatorname"
inData: data
inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidSharingInitiatorSmtp: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidSharingInitiatorSmtp: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getStringProperty: @"x-ms-sharing-initiatorsmtp"
inData: data
inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidSharingLocalType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidSharingLocalType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getStringProperty: @"x-ms-sharing-localtype"
inData: data
inMemCtx: memCtx];
}
- (enum mapistore_error) getPidNameXSharingLocalType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidNameXSharingLocalType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidLidSharingLocalType: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidSharingProviderGuid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidSharingProviderGuid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
const unsigned char providerGuidBytes[] = {0xAE, 0xF0, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46};
@@ -284,15 +284,15 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidNameXSharingProviderGuid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidNameXSharingProviderGuid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [@"AEF0060000000000C000000000000046" asUnicodeInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidLidSharingProviderName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidSharingProviderName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getStringProperty: @"x-ms-sharing-providername"
@@ -300,84 +300,84 @@
inMemCtx: memCtx];
}
- (enum mapistore_error) getPidNameXSharingProviderName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidNameXSharingProviderName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidLidSharingProviderName: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidSharingProviderUrl: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidSharingProviderUrl: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getStringProperty: @"x-ms-sharing-providerurl"
inData: data
inMemCtx: memCtx];
}
- (enum mapistore_error) getPidNameXSharingProviderUrl: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidNameXSharingProviderUrl: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidLidSharingProviderUrl: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidSharingRemoteName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidSharingRemoteName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getStringProperty: @"x-ms-sharing-remotename"
inData: data
inMemCtx: memCtx];
}
- (enum mapistore_error) getPidNameXSharingRemoteName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidNameXSharingRemoteName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidLidSharingRemoteName: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidSharingRemoteStoreUid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidSharingRemoteStoreUid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getStringProperty: @"x-ms-sharing-remotestoreuid"
inData: data
inMemCtx: memCtx];
}
- (enum mapistore_error) getPidNameXSharingRemoteStoreUid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidNameXSharingRemoteStoreUid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidLidSharingRemoteStoreUid: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidSharingRemoteType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidSharingRemoteType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getStringProperty: @"x-ms-sharing-remotetype"
inData: data
inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTypeXSharingRemoteType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTypeXSharingRemoteType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidLidSharingRemoteType: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidSharingRemoteUid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidSharingRemoteUid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self _getStringProperty: @"x-ms-sharing-remoteuid"
inData: data
inMemCtx: memCtx];
}
- (enum mapistore_error) getPidUidXSharingRemoteUid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidUidXSharingRemoteUid: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidLidSharingRemoteUid: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidSharingResponseTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidSharingResponseTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND;
id value;
@@ -403,8 +403,8 @@
return rc;
}
- (enum mapistore_error) getPidLidSharingResponseType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidSharingResponseType: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc = MAPISTORE_ERR_NOT_FOUND;
@@ -423,8 +423,8 @@
return rc;
}
- (enum mapistore_error) getPidNameContentClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidNameContentClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = talloc_strdup (memCtx, "Sharing");
return MAPISTORE_SUCCESS;
+10 -10
View File
@@ -88,17 +88,17 @@ typedef enum {
- (void) cleanupCaches;
- (enum mapistore_error) getAvailableProperties: (struct SPropTagArray **) propertiesP
inMemCtx: (TALLOC_CTX *) localMemCtx;
- (int) getAvailableProperties: (struct SPropTagArray **) propertiesP
inMemCtx: (TALLOC_CTX *) localMemCtx;
- (void) setRestrictions: (const struct mapi_SRestriction *) res;
- (enum mapistore_error) setColumns: (enum MAPITAGS *) newColumns
withCount: (uint16_t) newColumCount;
- (enum mapistore_error) getRow: (struct mapistore_property_data **) dataP
withRowID: (uint32_t) rowId
andQueryType: (enum mapistore_query_type) queryType
inMemCtx: (TALLOC_CTX *) memCtx;
- (enum mapistore_error) getRowCount: (uint32_t *) countP
withQueryType: (enum mapistore_query_type) queryType;
- (int) setColumns: (enum MAPITAGS *) newColumns
withCount: (uint16_t) newColumCount;
- (int) getRow: (struct mapistore_property_data **) dataP
withRowID: (uint32_t) rowId
andQueryType: (enum mapistore_query_type) queryType
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getRowCount: (uint32_t *) countP
withQueryType: (enum mapistore_query_type) queryType;
/* helpers */
+11 -11
View File
@@ -366,8 +366,8 @@ static Class NSDataK, NSStringK;
currentRow = (uint32_t) -1;
}
- (enum mapistore_error) getAvailableProperties: (struct SPropTagArray **) propertiesP
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getAvailableProperties: (struct SPropTagArray **) propertiesP
inMemCtx: (TALLOC_CTX *) memCtx
{
return [[isa childObjectClass] getAvailableProperties: propertiesP
inMemCtx: memCtx];
@@ -749,8 +749,8 @@ static Class NSDataK, NSStringK;
}
/* proof of concept */
- (enum mapistore_error) setColumns: (enum MAPITAGS *) newColumns
withCount: (uint16_t) newColumnsCount
- (int) setColumns: (enum MAPITAGS *) newColumns
withCount: (uint16_t) newColumnsCount
{
NSUInteger count;
@@ -831,15 +831,15 @@ static Class NSDataK, NSStringK;
return nil;
}
- (enum mapistore_error) getRow: (struct mapistore_property_data **) dataP
withRowID: (uint32_t) rowId
andQueryType: (enum mapistore_query_type) queryType
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getRow: (struct mapistore_property_data **) dataP
withRowID: (uint32_t) rowId
andQueryType: (enum mapistore_query_type) queryType
inMemCtx: (TALLOC_CTX *) memCtx
{
NSUInteger count;
MAPIStoreObject *child;
struct mapistore_property_data *rowData;
enum mapistore_error rc;
int rc;
child = [self childAtRowID: rowId forQueryType: queryType];
if (child)
@@ -858,8 +858,8 @@ static Class NSDataK, NSStringK;
return rc;
}
- (enum mapistore_error) getRowCount: (uint32_t *) countP
withQueryType: (enum mapistore_query_type) queryType
- (int) getRowCount: (uint32_t *) countP
withQueryType: (enum mapistore_query_type) queryType
{
NSArray *children;
+2 -2
View File
@@ -23,9 +23,9 @@
#ifndef MAPISTORETASKSFOLDER_H
#define MAPISTORETASKSFOLDER_H
#import "MAPIStoreCalTaskFolder.h"
#import "MAPIStoreGCSFolder.h"
@interface MAPIStoreTasksFolder : MAPIStoreCalTaskFolder
@interface MAPIStoreTasksFolder : MAPIStoreGCSFolder
@end
+3 -65
View File
@@ -75,10 +75,6 @@
return newMessage;
}
// --------------------------------------------
// Permissions and sharing
// --------------------------------------------
- (NSArray *) rolesForExchangeRights: (uint32_t) rights
{
NSMutableArray *roles;
@@ -86,34 +82,21 @@
roles = [NSMutableArray arrayWithCapacity: 6];
if (rights & RightsCreateItems)
[roles addObject: SOGoRole_ObjectCreator];
if (rights & RightsDeleteAll)
[roles addObject: SOGoRole_ObjectEraser];
if (rights & RightsDeleteOwn)
[roles addObject: MAPIStoreRightDeleteOwn];
if (rights & RightsEditAll)
{
[roles addObject: SOGoCalendarRole_PublicModifier];
[roles addObject: SOGoCalendarRole_PrivateModifier];
[roles addObject: SOGoCalendarRole_ConfidentialModifier];
}
if (rights & RightsEditOwn)
[roles addObject: MAPIStoreRightEditOwn];
if (rights & RightsReadItems)
else if (rights & RightsReadItems)
{
[roles addObject: SOGoCalendarRole_PublicViewer];
[roles addObject: SOGoCalendarRole_PrivateViewer];
[roles addObject: SOGoCalendarRole_ConfidentialViewer];
}
if (rights & RightsFolderOwner)
[roles addObject: MAPIStoreRightFolderOwner];
if (rights & RightsFolderContact)
[roles addObject: MAPIStoreRightFolderContact];
return roles;
}
@@ -133,65 +116,20 @@
&& [roles containsObject: SOGoCalendarRole_PrivateViewer]
&& [roles containsObject: SOGoCalendarRole_ConfidentialViewer])
rights |= RightsReadItems;
if ([roles containsObject: MAPIStoreRightEditOwn])
rights |= RightsEditOwn;
if ([roles containsObject: MAPIStoreRightDeleteOwn])
rights |= RightsDeleteOwn;
if (rights != 0)
rights |= RoleNone; /* actually "folder visible" */
if ([roles containsObject: MAPIStoreRightFolderOwner])
rights |= RightsFolderOwner | RoleNone;
if ([roles containsObject: MAPIStoreRightFolderContact])
rights |= RightsFolderContact;
return rights;
}
- (BOOL) subscriberCanModifyMessages
{
static NSArray *modifierRoles = nil;
if (!modifierRoles)
modifierRoles = [[NSArray alloc] initWithObjects:
SOGoCalendarRole_PublicModifier,
SOGoCalendarRole_PrivateModifier,
SOGoCalendarRole_ConfidentialModifier,
nil];
return ([[self activeUserRoles] firstObjectCommonWithArray: modifierRoles]
!= nil);
}
- (BOOL) subscriberCanReadMessages
{
static NSArray *viewerRoles = nil;
if (!viewerRoles)
viewerRoles = [[NSArray alloc] initWithObjects:
SOGoCalendarRole_PublicViewer,
SOGoCalendarRole_PrivateViewer,
SOGoCalendarRole_ConfidentialViewer,
nil];
return ([[self activeUserRoles] firstObjectCommonWithArray: viewerRoles]
!= nil);
}
- (EOQualifier *) aclQualifier
{
return [EOQualifier qualifierWithQualifierFormat:
[(SOGoAppointmentFolder *) sogoObject aclSQLListingFilter]];
}
// --------------------------------------------
// Property getters
// --------------------------------------------
- (enum mapistore_error) getPidTagDefaultPostMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagDefaultPostMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [@"IPM.Task" asUnicodeInMemCtx: memCtx];
+2 -2
View File
@@ -23,9 +23,9 @@
#ifndef MAPISTORETASKSMESSAGE_H
#define MAPISTORETASKSMESSAGE_H
#import "MAPIStoreCalTaskMessage.h"
#import "MAPIStoreGCSMessage.h"
@interface MAPIStoreTasksMessage : MAPIStoreCalTaskMessage
@interface MAPIStoreTasksMessage : MAPIStoreGCSMessage
@end
+66 -107
View File
@@ -68,8 +68,8 @@
@implementation MAPIStoreTasksMessage
- (enum mapistore_error) getPidTagIconIndex: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagIconIndex: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
{
/* see http://msdn.microsoft.com/en-us/library/cc815472.aspx */
// Unassigned recurring task 0x00000501
@@ -83,16 +83,16 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = talloc_strdup(memCtx, "IPM.Task");
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagNormalizedSubject: (void **) data // SUMMARY
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagNormalizedSubject: (void **) data // SUMMARY
inMemCtx: (TALLOC_CTX *) memCtx
{
iCalToDo *task;
@@ -103,10 +103,10 @@
}
/* FIXME: Should be combined somehow with the code in MAPIStoreAppointmentWrapper.m */
- (enum mapistore_error) getPidTagBody: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagBody: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
NSString *stringValue;
iCalToDo *task;
@@ -122,32 +122,21 @@
}
/* FIXME: Should be combined somehow with the code in MAPIStoreAppointmentWrapper.m */
- (enum mapistore_error) getPidLidPrivate: (void **) data // private (bool), should depend on CLASS and permissions
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidPrivate: (void **) data // private (bool), should depend on CLASS and permissions
inMemCtx: (TALLOC_CTX *) memCtx
{
iCalToDo *task;
task = [sogoObject component: NO secure: YES];
if ([task isPublic])
if ([task symbolicAccessClass] == iCalAccessPublic)
return [self getNo: data inMemCtx: memCtx];
return [self getYes: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagSensitivity: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
uint32_t v;
v = (uint32_t) [self sensitivity];
*data = MAPILongValue (memCtx, v);
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidTagImportance: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagImportance: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
uint32_t v;
iCalToDo *task;
@@ -165,11 +154,8 @@
return MAPISTORE_SUCCESS;
}
//------------------------------------
// Specific task related properties
//------------------------------------
- (enum mapistore_error) getPidLidTaskComplete: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidTaskComplete: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
iCalToDo *task;
@@ -180,8 +166,8 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidLidPercentComplete: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidPercentComplete: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
double doubleValue;
iCalToDo *task;
@@ -194,10 +180,10 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidLidTaskDateCompleted: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidTaskDateCompleted: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
NSCalendarDate *dateValue;
iCalToDo *task;
@@ -212,54 +198,54 @@
return rc;
}
- (enum mapistore_error) getPidLidTaskState: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidTaskState: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, 0x1); // not assigned
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidLidTaskMode: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidTaskMode: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getLongZero: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidTaskFRecurring: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidTaskFRecurring: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getNo: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidTaskAccepted: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidTaskAccepted: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getNo: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidTaskActualEffort: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidTaskActualEffort: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getLongZero: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidTaskEstimatedEffort: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidTaskEstimatedEffort: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getLongZero: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidTagHasAttachments: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagHasAttachments: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getNo: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidTaskDueDate: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidTaskDueDate: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
NSCalendarDate *dateValue;
iCalToDo *task;
@@ -273,10 +259,10 @@
return rc;
}
- (enum mapistore_error) getPidLidTaskStartDate: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidTaskStartDate: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
enum mapistore_error rc = MAPISTORE_SUCCESS;
int rc = MAPISTORE_SUCCESS;
NSCalendarDate *dateValue;
iCalToDo *task;
@@ -291,26 +277,26 @@
}
- (enum mapistore_error) getPidTagMessageDeliveryTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidTagMessageDeliveryTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidTagLastModificationTime: data inMemCtx: memCtx];
}
- (enum mapistore_error) getClientSubmitTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getClientSubmitTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidTagLastModificationTime: data inMemCtx: memCtx];
}
- (enum mapistore_error) getLocalCommitTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getLocalCommitTime: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidTagLastModificationTime: data inMemCtx: memCtx];
}
- (enum mapistore_error) getPidLidTaskStatus: (void **) data // status
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidTaskStatus: (void **) data // status
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *status;
uint32_t longValue;
@@ -332,12 +318,11 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidLidTaskOwner: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidTaskOwner: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
NSString *owner;
/* FIXME: This is wrong when setting task's request */
owner = [sogoObject ownerInContext: nil];
*data = [owner asUnicodeInMemCtx: memCtx];
@@ -345,51 +330,31 @@
return MAPISTORE_SUCCESS;
}
- (enum mapistore_error) getPidLidTaskOwnership: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
- (int) getPidLidTaskOwnership: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getLongZero: data inMemCtx: memCtx];
}
// ----------------------------------
// Sharing
// ----------------------------------
- (NSUInteger) sensitivity
- (BOOL) subscriberCanReadMessage
{
iCalToDo *task;
NSUInteger v;
task = [sogoObject component: NO secure: YES];
/* FIXME: Use OpenChange constants names */
switch ([task symbolicAccessClass])
{
case iCalAccessPrivate:
v = 0x2;
break;
case iCalAccessConfidential:
v = 0x3;
break;
default:
v = 0x0;
break;
}
return v;
return ([[self activeUserRoles]
containsObject: SOGoCalendarRole_ComponentViewer]
|| [self subscriberCanModifyMessage]);
}
- (NSString *) creator
- (BOOL) subscriberCanModifyMessage
{
iCalToDo *task;
BOOL rc;
NSArray *roles = [self activeUserRoles];
task = [sogoObject component: NO secure: YES];
return [[task uniqueChildWithTag: @"x-sogo-component-created-by"]
flattenedValuesForKey: @""];
}
if (isNew)
rc = [roles containsObject: SOGoRole_ObjectCreator];
else
rc = ([roles containsObject: SOGoCalendarRole_ComponentModifier]
|| [roles containsObject: SOGoCalendarRole_ComponentResponder]);
- (NSString *) owner
{
/* This is not true but to allow a user edit its own tasks is required.
FIXME: When PidLidTaskOwner getter is properly implemented for Task Requests */
return [self creator];
return rc;
}
- (void) save:(TALLOC_CTX *) memCtx
@@ -559,16 +524,10 @@
[vToDo setAccessClass: @"PUBLIC"];
}
/* Creation */
now = [NSCalendarDate date];
if ([sogoObject isNew])
{
[vToDo setCreated: now];
/* Creator is used for sharing purposes */
value = [properties objectForKey: MAPIPropertyKey (PidTagLastModifierName)];
if (value)
[[vToDo uniqueChildWithTag: @"x-sogo-component-created-by"] setSingleValue: value
forKey: @""];
}
[vToDo setTimeStampAsDate: now];
+3 -5
View File
@@ -1,6 +1,8 @@
/* MAPIStoreUserContext.m - this file is part of SOGo
*
* Copyright (C) 2012-2016 Inverse inc
* Copyright (C) 2012 Inverse inc
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -33,7 +35,6 @@
#import <NGImap4/NGImap4Connection.h>
#import <GDLContentStore/GCSChannelManager.h>
#import <GDLContentStore/GCSFolderManager.h>
#import <SOGo/SOGoDomainDefaults.h>
#import <SOGo/SOGoUser.h>
#import <SOGo/SOGoUserFolder.h>
@@ -338,9 +339,6 @@ static NSMapTable *contextsTable = nil;
NSString *tableName, *query;
GCSSpecialQueries *queries;
if ([GCSFolderManager singleStoreMode])
return;
[self folderTableURL];
cm = [GCSChannelManager defaultChannelManager];
Loaded 100 of 1814 files, more files were not shown because too many files have changed in this diff. Show more