6.0.0-RC7
6/28/26

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