6.0.0-RC7
6/28/26

ActiveSync Development

Developer documentation for the Horde ActiveSync stack. Horde 6 / ActiveSync 3.x.

Where to read what

Topic Location
Protocol versions, EAS 16 features, deployment config, integrator API horde/activesync README.md -- canonical, versioned with the library
Request flow, sync keys, class roles, tests Same README -- Architecture and Development and tests sections
Open refactor work and Horde 6 breaking plans doc/todo.md in the package repo
Operator setup, Autodiscover, web server ActiveSync wiki
Client quirks and server workarounds Broken Client Behavior
Symptoms and unfixed client bugs Known Issues
Feature matrix vs other servers Feature Grid

Recommendation: keep architecture and protocol depth in the git README.md so it stays aligned with releases. This wiki page covers Horde deployment wiring and points to the repo for everything else. The old long-form class tour and 2016 synclog walkthrough have been retired here in favour of the README.

Package split

ActiveSync logic spans two Composer packages in a normal Horde install:

horde/activesync -- protocol engine

Decodes WBXML, dispatches Horde_ActiveSync_Request_* handlers, manages device
state and sync keys, encodes responses. No direct Turba/Kronolith/IMP calls --
all data access goes through Horde_ActiveSync_Driver_Base.

Key areas: Request/, Message/, State/, Wbxml/, Collections,
SyncCache, Connector/, Folder/, Imap/, Device.php.

horde/core -- Horde groupware backend

Horde_Core_ActiveSync_Driver implements the driver for IMP (mail), Kronolith,
Turba, Nag, and Mnemo. Supporting classes:

Class Role
Horde_Core_ActiveSync_Auth Auth driver wrapper (Basic + optional certificate transparent driver)
Horde_Core_ActiveSync_Connector Registry calls into Horde apps
Horde_Core_ActiveSync_Mail Send / reply / forward
Horde_Core_ActiveSync_Imap_Factory IMAP adapter and folder tree for mail

Entry point

web/horde/rpc.php -> Horde_Rpc_ActiveSync -> injector factories:

  • Horde_Core_Factory_ActiveSyncServer -- builds Horde_ActiveSync, applies global conf['activesync']['version']
  • Horde_Core_Factory_ActiveSyncBackend -- Horde_Core_ActiveSync_Driver
  • Horde_Core_Factory_ActiveSyncState -- SQL or Mongo state storage

EAS requests are sessionless ($session_control = 'None'); each HTTP hit
bootstraps Horde without a web session cookie.

OPTIONS and Autodiscover (v1 XML and v2 JSON) are handled in the RPC
layer before the normal command loop.

Authentication note

Clients send HTTP Basic credentials (or certificates with a transparent auth
driver). Horde_ActiveSync_Credentials normalises usernames -- Autodiscover and
some mobile clients use the email address; getUsernameFromEmail() in the
core driver maps to the Horde account. This is controlled in part by
conf['activesync']['autodiscovery'] (name is historical; used beyond Autodiscover).

See README Protocol version configuration for per-user permissions and the
activesync_device_version hook.

Debugging

  1. Enable ActiveSync logging in Horde administration or conf.php
    (logging.type = perdevice writes one file per device id under the
    configured log path).
  2. Reproduce with a single collection where possible.
  3. Read README Request flow and Client pairing lifecycle to interpret
    SyncKey, FolderSync, and status codes.
  4. Check Broken Client Behavior before
    assuming a server bug.

Deployment log paths and the author's test device id are documented in the
deployment AGENTS.md / project rules -- not repeated here.

Running tests

From a Composer deployment root:

vendor/bin/phpunit -c vendor/horde/activesync/phpunit.xml.dist

Calendar EAS tests: vendor/horde/kronolith/test/Kronolith/Unit/EventActiveSyncTest.php.
See README for bootstrap details and integration fixtures under
vendor/horde/activesync/test/.

Contributing

Update README.md when adding commands, changing negotiation, or altering state
shape. Add a short wiki note only when operators need new config or behaviour
is client-visible.

Bug reports: bugs.horde.org -- include
MS-ASProtocolVersion, DeviceType, User-Agent, and redacted per-device log
excerpts.