[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