Developer documentation for the Horde ActiveSync stack. Horde 6 / ActiveSync 3.x.
| 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.
ActiveSync logic spans two Composer packages in a normal Horde install:
horde/activesync -- protocol engineDecodes 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 backendHorde_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 |
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_DriverHorde_Core_Factory_ActiveSyncState -- SQL or Mongo state storageEAS 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.
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.
conf.phplogging.type = perdevice writes one file per device id under theSyncKey, FolderSync, and status codes.Deployment log paths and the author's test device id are documented in the
deployment AGENTS.md / project rules -- not repeated here.
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/.
FRAMEWORK_6_0Update 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.