View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0006241 | SOGo | SOPE | public | 2026-08-30 23:10 | 2026-08-30 23:10 |
| Reporter | swallowtail | Assigned To | |||
| Priority | normal | Severity | major | Reproducibility | always |
| Status | new | 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]; |
|
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2026-08-30 23:10 | swallowtail | New Issue | |
| 2026-08-30 23:10 | swallowtail | File Added: sope_patch.txt |