[commits] [Wiki] changed: ActiveSync/BrokenClientBehavior
Wiki
wikiguest at horde.org
Thu Jun 25 09:19:28 UTC 2026
tdannhauer Thu, 25 Jun 2026 09:19:28 +0000
Modified page: https://wiki.horde.org/ActiveSync/BrokenClientBehavior
New Revision: 11
Change log: H6 Update
@@ -1,35 +1,131 @@
-# Known broken ActiveSync client behavior
+# Broken Client Behavior
-Many clients do not follow the published [ActiveSync](ActiveSync)
protocol specification. In fact, even some of Microsoft's products are
guilty of this. Horde\_ActiveSync attempts to work around those issues
that are possible to do so. This page attempts to document some of
these idiosyncrasies that we are not \(yet?\) able to workaround. Some
broken behavior seems to be wide spread, and are documented in the
*General* section. More specific behavior is documented in client
specific sections.
+Horde.org wiki path:
[ActiveSync/BrokenClientBehavior](ActiveSync/BrokenClientBehavior)
+ActiveSync clients often violate
[MS-AS*](https://learn.microsoft.com/en-us/openspecs/exchange_server_protocols/ms-aswslp) rules. Horde detects known patterns and compensates in `horde/activesync` so sync stays
stable.
-## General
-### The sending of STATUS\_FOLDERSYNC\_REQUIRED \(12\) is ignored by
a large number of clients.
+This page documents **server-side workarounds** in Horde 6 /
ActiveSync 3.x. For symptoms and operator troubleshooting, see [Known
Issues](ActiveSync/KnownIssues). For setup and logging, see
[ActiveSync](ActiveSync).
+Aligned with `vendor/horde/activesync` 3.0.0-RC \(June 2026\).
-This status code is issued in response to a SYNC request when the
server is unable to locate the folder data in the hierarchy cache.
I.e., the folder looks to no longer exist. This can happen when
something causes the server stored state to disappear \(like when
explicitly removing a device from the server\) or when something
corrupts the stored data. This is supposed to trigger the client to
issue a FOLDERSYNC request to freshen the hierarchy cache. Some
clients will continue to issue the exact same SYNC request in response
to this status code, causing a sync loop. Other clients will
accurately issue the FOLDERSYNC request, but fail to update their
local cache. Outlook 2013 does this. On receiving new FOLDERSYNC
responses, it continues to issue SYNC requests on the old folderids
\(though it DOES reset the synckey, so **something** is happening in
the client, just not the correct something\).
+## Terminology: multiplex
-Typically, the only way to resolve this issue is to remove the
account from the client and recreate it from scratch.
+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.
-## Outlook 2013
-### Duplicate email items due to broken MOVEITEMS request
handling.\(Worked around as of Horde\_ActiveSync 2.16.3\)
+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.
-When moving email items from one folder to another, or deleting them,
Outlook does not follow the specification for handling the move, which
leads to duplicate email items being present in the destination
folder. There are two issues interacting here that cause this. The
first, is that Outlook moves the local item on its own, without
waiting for the DELETE and ADD commands to be issued from the server.
Instead, it reassigns the existing email the new UID received in the
MOVEITEMS response. Secondly, when it receives the ADD command for the
new email in the destination folder, it fails to treat this command as
an UPDATE command as the specification says you must when an ADD
command is received for an already existing UID.
+## Client detection
-### Reminders reappear after being dismissed
+`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\)
-If you experience reappearing calendar reminders after you have
dismissed them permanently, you can start Outlook with the parameter
***/cleanreminders*** to clear the internal list of reminders in
Outlook.
-Simply press **WINDOWS+R** and then enter ***outlook.exe /cleanreminders***
-If you still get the reappearing reminders you could also set the
next reminder to **0 minutes before start** in the reminder popup
dialog, as that will force Outlook to present the next reminder for
that event/appointment right on time. You could also disable all
reminders in the Outlook options menu, if you do not need that
functionality at all.
+Automatic rules in `_sniffMultiplex()` -- **0** unless noted:
-## Android 4.4 KitKat
-### Broken attachment handling.
+| 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\).
-Android versions 4.4.0 through 4.4.2 have many issues regarding email
synchronization. The largest of which is the inability to download
attachments. Attempting to do so normally results in force closing of
the Email application. This issue cannot be worked around in code, but
is fixed in Android 4.4.3.
+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](ActiveSync/KnownIssues).
+
+## 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](http://bugs.horde.org/queue/sync) \(redacted\).
More information about the commits
mailing list