mirror of
https://github.com/bulwarkmail/webmail.git
synced 2026-10-31 16:13:15 +00:00
Adds an "Attachment" condition field (is present / of type <ext>) backed by the RFC 5703 Sieve mime extension, matching the filename in both Content-Disposition and Content-Type headers so real-world senders that only put the name in Content-Type (Microsoft SMTPSVC, etc.) are caught. Users type extensions (pdf, doc) not MIME types. Also makes each text condition accept comma-separated multiple values emitted as a Sieve string list (OR within the condition), so "(domain1 OR domain2) AND attachment pdf/xml" is expressible in one rule. value is now string | string[] (single-value rules stay strings -> backward compatible). New filter locale keys in all 17 locales.
84 lines
2.2 KiB
TypeScript
84 lines
2.2 KiB
TypeScript
export interface SieveScript {
|
|
id: string;
|
|
name: string;
|
|
blobId: string;
|
|
isActive: boolean;
|
|
}
|
|
|
|
export interface SieveCapabilities {
|
|
implementation: string;
|
|
maxSizeScript: number;
|
|
sieveExtensions: string[];
|
|
notificationMethods: string[];
|
|
externalLists: string[];
|
|
}
|
|
|
|
export type FilterConditionField =
|
|
| 'from' | 'to' | 'cc' | 'subject' | 'header' | 'size' | 'body'
|
|
| 'attachment';
|
|
|
|
export type FilterComparator =
|
|
| 'contains' | 'not_contains'
|
|
| 'is' | 'not_is'
|
|
| 'starts_with' | 'ends_with'
|
|
| 'matches'
|
|
| 'greater_than' | 'less_than'
|
|
// For field === 'attachment':
|
|
// has_any → message has any attachment (Content-Disposition: attachment)
|
|
// has_type → message has an attachment whose Content-Type matches `value`
|
|
// (substring match, e.g. "application/pdf" or "image/")
|
|
| 'has_any' | 'has_type';
|
|
|
|
export type FilterActionType =
|
|
| 'move' | 'copy' | 'forward'
|
|
| 'mark_read' | 'star' | 'add_label'
|
|
| 'discard' | 'reject' | 'keep' | 'stop';
|
|
|
|
export interface FilterCondition {
|
|
field: FilterConditionField;
|
|
comparator: FilterComparator;
|
|
/**
|
|
* Match value. Use a string array for OR-within-condition semantics
|
|
* (e.g. `["@domain1.com", "@domain2.com"]` matches mail from either).
|
|
* Sieve emits the array as a list literal which the implementation
|
|
* treats as "matches any item". Use a plain string for single-value
|
|
* conditions; existing single-value rules continue to work unchanged.
|
|
*
|
|
* Not supported for: size (numeric), has_any (no value).
|
|
*/
|
|
value: string | string[];
|
|
headerName?: string;
|
|
}
|
|
|
|
export interface FilterAction {
|
|
type: FilterActionType;
|
|
value?: string;
|
|
}
|
|
|
|
export type FilterOrigin = 'bulwark' | 'external' | 'opaque';
|
|
|
|
export interface FilterRule {
|
|
id: string;
|
|
name: string;
|
|
enabled: boolean;
|
|
matchType: 'all' | 'any';
|
|
conditions: FilterCondition[];
|
|
actions: FilterAction[];
|
|
stopProcessing: boolean;
|
|
origin?: FilterOrigin;
|
|
originLabel?: string;
|
|
rawBlock?: string;
|
|
}
|
|
|
|
export interface VacationSieveConfig {
|
|
isEnabled: boolean;
|
|
subject: string;
|
|
textBody: string;
|
|
}
|
|
|
|
export interface FilterMetadata {
|
|
version: 1;
|
|
rules: FilterRule[];
|
|
vacation?: VacationSieveConfig;
|
|
}
|