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 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).