mirror of
https://github.com/bulwarkmail/webmail.git
synced 2026-10-31 16:13:15 +00:00
Stalwart 1.0 reads a text filter value that starts and ends with a quote as one exact phrase, and a value ending in `*` as one prefix over the whole string, not split into words and capped at 16 bytes. Every search path sent the typed input as one `text` value, so on 1.0 `"annual report" 2024 "draft"` became a single four-word phrase and `project budg*` a prefix containing a space: both found nothing. `"Q3 planning" budget` lost its phrase on every version. `splitSearchText` (`lib/jmap/search-utils.ts`) now sends each quoted phrase and each `word*` as a condition of its own, ANDed with the rest. The remaining words stay one condition, so a query without quotes or stars goes out as before. Outer single quotes are stripped from that part, since 1.0 reads them as a phrase too. The split applies to: - the search bar, tag views, cross-account and all-folders search; - advanced search, including the from/to/subject/body fields; - contact search; - global search for mail, contacts and calendar. `inMailbox` and the calendar bounds sit next to the text conditions in one AND, with one key per condition: Stalwart rejects an operator that also carries property keys, and 1.0 allows only one AND group when it expands recurrences. SearchSnippet/get switches the whole request to exact matching once a term is quoted, which marks nothing for a phrase ANDed with other words, so the snippet filter unquotes phrases. On 1.0 and on external search backends each phrase is now a real phrase. The 0.16 built-in index reads it as an AND of its words, without stemming. The dev mock and the demo client now evaluate AND filters and quoted phrases, so they keep working with the new shapes.