Skip to content

Feat/initial eas16.1 support#166

Merged
ralflang merged 2 commits into
FRAMEWORK_6_0from
feat/Initial_EAS16.1-support
Jun 18, 2026
Merged

Feat/initial eas16.1 support#166
ralflang merged 2 commits into
FRAMEWORK_6_0from
feat/Initial_EAS16.1-support

Conversation

@TDannhauer

Copy link
Copy Markdown
Contributor

feat(core): add EAS 16.1 meeting proposal handling in MeetingResponse

Summary

Extends Horde_Core_ActiveSync_Driver::meetingResponse() to handle EAS 16.1 ProposedStartTime / ProposedEndTime: send RFC5546 METHOD=COUNTER to the organizer (via horde/itip), respect disallow-counter iCal flags, and keep the existing METHOD=REPLY path when SendResponse is set.

Motivation

horde/activesync parses 16.1 proposal fields from MeetingResponse WBXML; this PR is the application-layer bridge that turns them into standards-compliant iTip COUNTER messages and enforces organizer policy.

Note: Verify lib/Horde/Core/ActiveSync/Driver.php in your branch contains these changes before opening the PR. If your working tree only has activesync/kronolith/itip/imp/horde updates, re-apply the meetingResponse() patch from your feature branch.

Changes

meetingResponse() (EAS ≥16.1)

  1. Parse proposedstarttime / proposedendtime from the request array (UTC Horde_Date).
  2. Validate: ignore ProposedEndTime without start; derive end from original meeting duration when end omitted.
  3. If iCal event has DISALLOW-COUNTER, X-MICROSOFT-DISALLOW-COUNTER, or X-MS-DISALLOW-COUNTER set to a true-like value, clear proposal (no COUNTER sent).
  4. When sendresponse and/or proposal present:
    • Send normal REPLY via sendMultiPartResponse() when sendresponse is set.
    • Send separate COUNTER via sendCounterMultiPartResponse() when proposed start is present.

Docblock

  • Document proposedstarttime / proposedendtime request keys.

Files changed

lib/Horde/Core/ActiveSync/Driver.php

(No new tests in core for this slice; behaviour is covered by horde/itip integration tests and manual EAS testing. Optional follow-up: unit test with mocked Horde_Itip.)

Dependencies

  • activesyncVERSION_SIXTEENONE, MeetingResponse parsing passes proposed times into driver.
  • itipHorde_Itip::sendCounterMultiPartResponse().

Merge after activesync and itip, before or in parallel with imp (IMP does not call core meetingResponse directly).

Test plan

  • php -l lib/Horde/Core/ActiveSync/Driver.php
  • Existing vendor/bin/phpunit test/Unit/ActiveSync/ suite passes (no regression in version callback / draft sync).
  • Manual — 16.1 device, meeting invite:
    • Accept with “propose new time” → organizer receives COUNTER with correct times.
    • Event with disallow-counter → no COUNTER; normal accept/decline still works.
    • SendResponse + proposal → both REPLY and COUNTER when applicable.
  • Manual — 16.0 device unchanged (no proposed time fields).

Suggested commit message

feat(core): add EAS 16.1 meeting proposal handling in MeetingResponse

Parse proposed start/end on 16.1+, send RFC5546 COUNTER via Horde_Itip,
and respect disallow-counter flags on the source invitation.

Implementation reference

Key logic added after instance-id handling and before calendar import:

  • Proposed time parsing and duration derivation.
  • Disallow-counter guard on $vEvent.
  • Split iTip send: sendMultiPartResponse (reply) + sendCounterMultiPartResponse (counter).

* parse proposed start/end and send RFC5546 COUNTER updates
* respect DisallowNewTimeProposal/disallow-counter flags
* keep standard attendee response flow with separate counter handling
Include VERSION_SIXTEENONE in the supported-version list used when resolving
horde:activesync:version permissions. Without it, a per-user ceiling of 16.1
was ignored and the global 16.0 default remained in effect.
Add regression test for 16.1 per-user permission resolution.
@TDannhauer TDannhauer requested a review from ralflang June 17, 2026 13:40
@ralflang ralflang merged commit f18a901 into FRAMEWORK_6_0 Jun 18, 2026
0 of 4 checks passed
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