Horde.org wiki path: ActiveSync/BrokenClientBehavior
ActiveSync clients often violate MS-AS* rules. Horde detects known patterns and compensates in horde/activesync so sync stays stable.
This page documents server-side workarounds in Horde 6 / ActiveSync 3.x. For symptoms and operator troubleshooting, see Known Issues. For setup and logging, see ActiveSync.
Aligned with vendor/horde/activesync 3.0.0-RC (June 2026).
In Horde, multiplex means the server must merge several PIM sources (address books, calendars, task lists, notes folders) into one ActiveSync collection because the client cannot sync them separately.
Bitmask flags: contacts 1, calendar 2, tasks 4, notes 8 (combinable, e.g. 13 = contacts + tasks + notes).
iOS / iPadOS use bitmask **0**: Mail, Calendars, Reminders, and Notes all support multiple server folders without server-side merging.
Horde_ActiveSync_Device derives client type and OS version from DeviceType, User-Agent, and optional Settings:OS / Settings:Model. Third-party apps may not identify themselves reliably -- check per-device logs and the device record in Horde administration.
Automatic rules in _sniffMultiplex() -- **0** unless noted:
| Client | Bitmask | Notes |
|---|---|---|
| iOS / iPadOS | **0** | Full multi-folder support. Stale MULTIPLEX_NOTES from old pairings is cleared on reconnect. |
Gmail (Android-Mail UA) |
**0** | Stock client on current Android (Android-Mail/7.5+ tested). |
| Nine, TouchDown | **0** | Third-party Android clients with full folder support. |
| Android stock >= 4.4 | 13 (contacts + tasks + notes) | Per-calendar folders OK. |
| Android stock < 4.4 | 15 (all types) | Legacy. |
| Samsung native, HTCOnemini2 | 15 | Sniffed by deviceType when OS version missing. |
Outlook (Outlook/15.0, Outlook/16.0 UA) |
1 (contacts) | Calendars and tasks per-folder. Other Outlook UA strings -> **0**. |
| Unrecognized | **0** | Assumes standards-compliant client. |
Override: Forced Multiplexed Bitmask on the device record (disables auto-sniffing).
iOS Notes: protocol supports multiple collections; folder management is still easier from the Horde web UI than in the app.
| Symptom | Server-side fix |
|---|---|
| iOS mail Ping loops | PING watermark separate from IMAP SYNC MODSEQ |
Endless FOLDERSYNC_REQUIRED |
Loop guard -- escalate after five ignored status-12 responses |
Mysterious KEYMISMATCH |
Corrupt sync_data rejected/repaired on load and save |
| Stale iOS Notes multiplex flag | Cleared for iOS on device access |
Defensive Ping/FolderSync ordering workarounds below remain for odd clients.
Horde_ActiveSync_Device::hasQuirk():
| Quirk | Clients | Effect |
|---|---|---|
QUIRK_NEEDS_SUPPORTED_PICTURE_TAG |
iOS 4.x | Legacy -- ghost Picture when SUPPORTED absent |
QUIRK_INCORRECTLY_SENDS_EMPTY_PICTURE_TAG |
iOS >= 8.2 | Ignore empty Picture on edit (photo wipe) |
QUIRK_SUPPORTS_TNEF |
Outlook | TNEF attachments passed through undecoded |
Per MS-ASCMD: empty SUPPORTED -> all ghostable fields ghosted; missing SUPPORTED -> none ghosted. Horde special-cases contact Picture via quirks above. Calendar body/subject always ghost when omitted.
Broken Android auth: email as HTTP Basic username, no XML body -> Horde reads PHP_AUTH_USER, assumes 2006 mobilesync schemas. v2 JSON without Protocol= defaults to ActiveSync.
Outlook 2013+ -- non-provisionable (no ItemSettings); connects under Force policy. TestActiveSyncConnectivity exempt. Old Android (EAS <= 1.2 UA) -- not enforced. PROVISIONING_LOOSE -- allows broken handshakes.
Explicit folder lists before sync keys exist: ignore unknown collections or restore cached pingable set (iOS, Outlook).
BlackBerry -- empty ServerEntryId accepted.
Missing sync key on SyncCommands -- ignored. Empty ServerEntryId on modify/remove -- accepted/skipped. FOLDERSYNC_REQUIRED loop -- capped at five, then escalate.
Outlook -- wrong folder (calendar vs mailbox) -> retry INBOX once.
Outlook 2013 -- suppress duplicate ADD after move.
normalizePoomContactsDates() per client: iOS >= 5 midnight UTC; Android stock 08:00 UTC; Samsung/Gmail midnight UTC; BlackBerry 11:00 UTC.
Malformed AirSyncBase FileReference / Location elements filtered before backends.
| Client | Special casing |
|---|---|
| iOS 16.x | None for multiplex; EAS 16.0/16.1, instance calendar, Find, propose-new-time when negotiated |
| Gmail / Android-Mail | None for multiplex |
| Outlook desktop | Contacts bitmask 1 if UA matches; TNEF; provisioning exempt |
| Samsung Exchange | Full multiplex bitmask 15 |
Open issues on modern iOS (truncated calendar bodies, task recurrence) -> Known Issues.
Windows Phone 8.x, PocketPC, Android < 4.4, iOS 4.x -- sniffing rules kept for old device records; not tested on Horde 6.
Persistent KEYMISMATCH ignore, SMS stub, Outlook Regenerate=1, truncated calendar overwrite on iOS.
Per-device log + MS-ASProtocolVersion + DeviceType + User-Agent + multiplex bitmask -> bugs.horde.org (redacted).