View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0006241 | SOGo | SOPE | public | 2026-08-30 23:10 | 2026-09-01 13:56 |
| Reporter | swallowtail | Assigned To | qhivert | ||
| Priority | normal | Severity | major | Reproducibility | always |
| Status | assigned | Resolution | open | ||
| Platform | Server | OS | Red Hat | OS Version | 10 |
| Product Version | 5.12.10 | ||||
| Summary | 0006241: fetchVanished: misses an expunged highest UID when using UID FETCH 1:* against Cyrus IMAP 3.8 | ||||
| Description | I updated from Cyrus IMAP 3.0.7 on RHEL 8 to 3.8.3 on RHEL 10 over the weekend. SOGo runs on a separate RHEL 9 server. Symptom: Environment:
After expunging the mailbox's highest live UID, Cyrus 3.8 resolves This differs from Cyrus 3.0.7. Its Direct reproduction after expunging the highest UID: UID FETCH 1:* (UID) (CHANGEDSINCE <previous-modseq> VANISHED) does not return the expunged UID, while both of these do: UID FETCH 1:<UIDNEXT-1> (UID) (CHANGEDSINCE <previous-modseq> VANISHED) Proposed one-line fix: diff
The full UID range avoids Validation: we packaged this change in a local fix. A disposable message was confirmed visible in SOGo, Nine and Samsung before deletion. SOGo deleted it; Cyrus reported the allocated UID absent, no live | ||||
| Steps To Reproduce | See above | ||||
| Tags | No tags attached. | ||||
|
sope_patch.txt (875 bytes)
--- a/sope-mime/NGImap4/NGImap4Client.m
+++ b/sope-mime/NGImap4/NGImap4Client.m
@@ -1254,8 +1254,14 @@ static NSMutableDictionary *namespaces;
pool = [[NSAutoreleasePool alloc] init];
+ /*
+ * Do not use "*" as the upper UID bound here. RFC-compliant servers may
+ * resolve it to the highest message still present, which excludes an
+ * expunged message when that message had the mailbox's highest UID. The
+ * complete legal UID range ensures VANISHED reports that deletion.
+ */
cmd = [NSString stringWithFormat:
- @"UID FETCH 1:* (UID) (CHANGEDSINCE %llu VANISHED)",
+ @"UID FETCH 1:4294967295 (UID) (CHANGEDSINCE %llu VANISHED)",
(unsigned long long)_modseq];
fetchres = [self processCommand:cmd];
result = [[self->normer normalizeFetchResponse:fetchres] retain]; |
|
|
Hello! |
|
|
I searched here, missed that at github! Yes, agree. |
|
|
I note from the linked PR's link to Cyrus that Cyrus are fixing the underlying cause in 3.13.x... but addressing it in SOPE will allow for older versions of Cyrus to not break mail sync across multiple devices. |
|
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2026-08-30 23:10 | swallowtail | New Issue | |
| 2026-08-30 23:10 | swallowtail | File Added: sope_patch.txt | |
| 2026-09-01 08:02 | qhivert | Note Added: 0018533 | |
| 2026-09-01 08:03 | qhivert | Assigned To | => qhivert |
| 2026-09-01 08:03 | qhivert | Status | new => feedback |
| 2026-09-01 13:51 | swallowtail | Note Added: 0018534 | |
| 2026-09-01 13:51 | swallowtail | Status | feedback => assigned |
| 2026-09-01 13:56 | swallowtail | Note Added: 0018535 |