Skip to content

feat(activesync): EAS 16.0 draft sync and calendar initial-sync in co…#163

Merged
TDannhauer merged 1 commit into
FRAMEWORK_6_0from
feat/finish_EAS16.0
Jun 17, 2026
Merged

feat(activesync): EAS 16.0 draft sync and calendar initial-sync in co…#163
TDannhauer merged 1 commit into
FRAMEWORK_6_0from
feat/finish_EAS16.0

Conversation

@TDannhauer

Copy link
Copy Markdown
Contributor

Pull request: Core EAS 16.0 driver and draft sync

Conventional commit message

feat(activesync): EAS 16.0 draft sync and calendar initial-sync in core driver

Report Drafts folder changes as CHANGE_TYPE_DRAFT, handle POOMMAIL2:Send and
draft Add/Modify via Mail/Draft, expose bound recurrence exceptions on initial
calendar sync at 16.0+, and unify calendar_import() return shape.

PR title

feat(activesync): EAS 16.0 draft sync and calendar initial-sync in core driver

Summary

  • Draft folder sync (EAS 16.0+):
    • Export draft content changes as CHANGE_TYPE_DRAFT (not flag-only changes).
    • Handle inbound draft <Add> / <Modify> via Horde_Core_ActiveSync_Mail_Draft (append + replace-by-delete for edits).
    • Handle POOMMAIL2:Send on Drafts-folder Sync: build RFC822 via toRfc822Stream(), send via SMTP, delete source draft.
    • Set IsDraft on outbound mail messages from the Drafts collection at 16.0+.
  • Calendar initial sync (EAS 16.0+):
    • Pass hide_exceptions => false to calendar_listUids() when protocol version ≥ 16.0 so bound recurrence exceptions appear as separate items on first sync (matches kronolith instance model).
  • Connector:
    • calendar_import() always returns ['uid' => …, 'atchash' => …]; deprecated calendar_import16() delegates to it.
  • Draft MIME bodies:
    • Horde_Core_ActiveSync_Mail_Draft parses Type-4 (MIME) bodies from iOS when POOMMAIL headers are omitted.
  • Cleanup: clarify draft-send comment in Driver.php; fix typo.

Changed files

File Change
lib/Horde/Core/ActiveSync/Driver.php CHANGE_TYPE_DRAFT; draft send/edit path; hide_exceptions on initial calendar sync; IsDraft export
lib/Horde/Core/ActiveSync/Connector.php Unified calendar_import(); deprecate calendar_import16()
lib/Horde/Core/ActiveSync/Mail/Draft.php Type-4 MIME body import; toRfc822Stream() / append-replace edit model
test/Unit/ActiveSync/DraftSyncTest.php Unit tests for RFC822 build, replace-on-edit, MIME envelope import

Related changes (other packages)

Deploy together with:

  • horde/kronolith — ClientUid, Location, 16.0 instance export/import, listUids(hide_exceptions)
  • horde/activesync — appointment 16.0 validation strip, recurrence protocol version, docs

Test plan

  • php vendor/bin/phpunit --bootstrap core-tests-bootstrap.php vendor/horde/core/test/Unit/ActiveSync/DraftSyncTest.php — all tests pass
  • EAS 16.0 calendar on device: recurring series initial sync includes bound exceptions as separate items (with kronolith deployed)
  • EAS 16.0 mail: SendMail sends message and saves to Sent (device test @ single account)
  • EAS 16.0 mail: server-created draft syncs down to client with IsDraft: 1 (device test)
  • Draft edit upload from iOS not verified (client keeps edits local); server path covered by unit tests

Device testing notes (2026-06-16)

Area Result
Calendar ClientUid / Location / recurrence instances Pass (iPhone, EAS 16.0)
SendMail Pass
Draft download (IMP → iPhone) Pass
Draft edit upload (iPhone → IMP) Not observed — iOS Mail limitation, not server regression

…re driver

Report Drafts folder changes as CHANGE_TYPE_DRAFT, handle POOMMAIL2:Send and
draft Add/Modify via Mail/Draft, expose bound recurrence exceptions on initial
calendar sync at 16.0+, and unify calendar_import() return shape.
@TDannhauer TDannhauer requested a review from ralflang June 16, 2026 22:20
@TDannhauer TDannhauer merged commit 52de599 into FRAMEWORK_6_0 Jun 17, 2026
0 of 4 checks passed
@TDannhauer TDannhauer deleted the feat/finish_EAS16.0 branch June 17, 2026 13:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants