Broken Client Behavior
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).
Terminology: multiplex
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 0** -- native per-folder sync; Horde exposes each Turba book, Kronolith calendar, Nag list, and Mnemo folder as its own collection.
- Non-zero bitmask -- Horde combines the flagged types into one collection.
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.
Client detection
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.
Multiplex sniffing (Horde 6)
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.
Horde 6 fixes that looked like client bugs
|| 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.
Device quirks
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 ||
Ghosted fields
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.
Protocol workarounds
Autodiscover
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.
Provisioning
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.
Ping
Explicit folder lists before sync keys exist: ignore unknown collections or restore cached pingable set (iOS, Outlook).
FolderSync / FolderCreate
BlackBerry -- empty ServerEntryId accepted.
Sync
Missing sync key on SyncCommands -- ignored. Empty ServerEntryId on modify/remove -- accepted/skipped. FOLDERSYNC_REQUIRED loop -- capped at five, then escalate.
MeetingResponse
Outlook -- wrong folder (calendar vs mailbox) -> retry INBOX once.
MoveItems
Outlook 2013 -- suppress duplicate ADD after move.
Contacts: birthdays
normalizePoomContactsDates() per client: iOS >= 5 midnight UTC; Android stock 08:00 UTC; Samsung/Gmail midnight UTC; BlackBerry 11:00 UTC.
Attachments
Malformed AirSyncBase FileReference / Location elements filtered before backends.
Modern clients summary
|| 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.
Legacy (archive only)
Windows Phone 8.x, PocketPC, Android < 4.4, iOS 4.x -- sniffing rules kept for old device records; not tested on Horde 6.
Not worked around
Persistent KEYMISMATCH ignore, SMS stub, Outlook Regenerate=1, truncated calendar overwrite on iOS.
Reporting bugs
Per-device log + MS-ASProtocolVersion + DeviceType + User-Agent + multiplex bitmask -> bugs.horde.org (redacted).