imapkit 4.0.3 → 4.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -19
- package/bin/imapkit.js +12 -16
- package/dist/cjs/addressparser.d.ts +21 -0
- package/dist/cjs/addressparser.js +271 -0
- package/dist/cjs/arguments.d.ts +31 -0
- package/{lib → dist/cjs}/arguments.js +9 -21
- package/dist/cjs/bodystructure.d.ts +25 -0
- package/dist/cjs/bodystructure.js +150 -0
- package/dist/cjs/cert.d.ts +2 -0
- package/dist/cjs/cert.js +7 -0
- package/dist/cjs/command-states.d.ts +36 -0
- package/dist/cjs/command-states.js +102 -0
- package/dist/cjs/commands/append.d.ts +88 -0
- package/dist/cjs/commands/append.js +299 -0
- package/dist/cjs/commands/capability.d.ts +2 -0
- package/dist/cjs/commands/capability.js +44 -0
- package/dist/cjs/commands/check.d.ts +2 -0
- package/dist/cjs/commands/check.js +28 -0
- package/dist/cjs/commands/close.d.ts +2 -0
- package/dist/cjs/commands/close.js +35 -0
- package/dist/cjs/commands/copy.d.ts +30 -0
- package/dist/cjs/commands/copy.js +107 -0
- package/dist/cjs/commands/create.d.ts +2 -0
- package/dist/cjs/commands/create.js +53 -0
- package/dist/cjs/commands/delete.d.ts +2 -0
- package/dist/cjs/commands/delete.js +63 -0
- package/dist/cjs/commands/examine.d.ts +2 -0
- package/dist/cjs/commands/examine.js +19 -0
- package/dist/cjs/commands/expunge.d.ts +2 -0
- package/dist/cjs/commands/expunge.js +32 -0
- package/dist/cjs/commands/fetch.d.ts +23 -0
- package/dist/cjs/commands/fetch.js +208 -0
- package/dist/cjs/commands/handlers/fetch.d.ts +12 -0
- package/dist/cjs/commands/handlers/fetch.js +195 -0
- package/dist/cjs/commands/handlers/flags.d.ts +17 -0
- package/dist/cjs/commands/handlers/flags.js +39 -0
- package/dist/cjs/commands/handlers/search.d.ts +85 -0
- package/dist/cjs/commands/handlers/search.js +504 -0
- package/dist/cjs/commands/handlers/status.d.ts +34 -0
- package/dist/cjs/commands/handlers/status.js +81 -0
- package/dist/cjs/commands/handlers/store.d.ts +3 -0
- package/dist/cjs/commands/handlers/store.js +117 -0
- package/dist/cjs/commands/index.d.ts +2 -0
- package/dist/cjs/commands/index.js +61 -0
- package/dist/cjs/commands/list.d.ts +2 -0
- package/dist/cjs/commands/list.js +86 -0
- package/dist/cjs/commands/login.d.ts +2 -0
- package/dist/cjs/commands/login.js +62 -0
- package/dist/cjs/commands/logout.d.ts +2 -0
- package/dist/cjs/commands/logout.js +40 -0
- package/dist/cjs/commands/lsub.d.ts +2 -0
- package/dist/cjs/commands/lsub.js +79 -0
- package/dist/cjs/commands/noop.d.ts +2 -0
- package/dist/cjs/commands/noop.js +28 -0
- package/dist/cjs/commands/rename.d.ts +2 -0
- package/dist/cjs/commands/rename.js +98 -0
- package/dist/cjs/commands/search.d.ts +10 -0
- package/dist/cjs/commands/search.js +71 -0
- package/dist/cjs/commands/select.d.ts +19 -0
- package/dist/cjs/commands/select.js +230 -0
- package/dist/cjs/commands/status.d.ts +2 -0
- package/dist/cjs/commands/status.js +57 -0
- package/dist/cjs/commands/store.d.ts +10 -0
- package/dist/cjs/commands/store.js +134 -0
- package/dist/cjs/commands/subscribe.d.ts +2 -0
- package/dist/cjs/commands/subscribe.js +51 -0
- package/dist/cjs/commands/uid-copy.d.ts +2 -0
- package/dist/cjs/commands/uid-copy.js +19 -0
- package/dist/cjs/commands/uid-fetch.d.ts +3 -0
- package/dist/cjs/commands/uid-fetch.js +17 -0
- package/dist/cjs/commands/uid-search.d.ts +3 -0
- package/dist/cjs/commands/uid-search.js +17 -0
- package/dist/cjs/commands/uid-store.d.ts +3 -0
- package/dist/cjs/commands/uid-store.js +17 -0
- package/dist/cjs/commands/unsubscribe.d.ts +2 -0
- package/dist/cjs/commands/unsubscribe.js +50 -0
- package/dist/cjs/dates.d.ts +64 -0
- package/dist/cjs/dates.js +124 -0
- package/dist/cjs/deflate-layer.d.ts +83 -0
- package/dist/cjs/deflate-layer.js +232 -0
- package/dist/cjs/encoded-words.d.ts +15 -0
- package/dist/cjs/encoded-words.js +85 -0
- package/dist/cjs/envelope.d.ts +33 -0
- package/dist/cjs/envelope.js +86 -0
- package/dist/cjs/esearch.d.ts +96 -0
- package/dist/cjs/esearch.js +190 -0
- package/dist/cjs/framing.d.ts +66 -0
- package/{lib → dist/cjs}/framing.js +9 -26
- package/dist/cjs/index.d.ts +9 -0
- package/dist/cjs/index.js +56 -0
- package/dist/cjs/list-extensions.d.ts +50 -0
- package/dist/cjs/list-extensions.js +35 -0
- package/dist/cjs/load-plugins.d.ts +21 -0
- package/dist/cjs/load-plugins.js +89 -0
- package/dist/cjs/mailbox-name.d.ts +26 -0
- package/dist/cjs/mailbox-name.js +127 -0
- package/dist/cjs/mimeparser.d.ts +137 -0
- package/dist/cjs/mimeparser.js +727 -0
- package/dist/cjs/mock-client.d.ts +39 -0
- package/dist/cjs/mock-client.js +236 -0
- package/dist/cjs/numbers.d.ts +28 -0
- package/dist/cjs/numbers.js +52 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/plugins/acl.d.ts +2 -0
- package/dist/cjs/plugins/acl.js +888 -0
- package/dist/cjs/plugins/appendlimit.d.ts +16 -0
- package/dist/cjs/plugins/appendlimit.js +87 -0
- package/dist/cjs/plugins/auth-plain.d.ts +2 -0
- package/dist/cjs/plugins/auth-plain.js +89 -0
- package/dist/cjs/plugins/binary.d.ts +30 -0
- package/dist/cjs/plugins/binary.js +247 -0
- package/dist/cjs/plugins/catenate.d.ts +14 -0
- package/dist/cjs/plugins/catenate.js +250 -0
- package/dist/cjs/plugins/compress.d.ts +7 -0
- package/dist/cjs/plugins/compress.js +79 -0
- package/dist/cjs/plugins/condstore.d.ts +5 -0
- package/dist/cjs/plugins/condstore.js +492 -0
- package/dist/cjs/plugins/context-search.d.ts +8 -0
- package/dist/cjs/plugins/context-search.js +304 -0
- package/dist/cjs/plugins/context-sort.d.ts +6 -0
- package/dist/cjs/plugins/context-sort.js +32 -0
- package/dist/cjs/plugins/create-special-use.d.ts +7 -0
- package/dist/cjs/plugins/create-special-use.js +101 -0
- package/dist/cjs/plugins/enable.d.ts +23 -0
- package/dist/cjs/plugins/enable.js +127 -0
- package/dist/cjs/plugins/esearch.d.ts +6 -0
- package/dist/cjs/plugins/esearch.js +142 -0
- package/dist/cjs/plugins/esort.d.ts +6 -0
- package/dist/cjs/plugins/esort.js +60 -0
- package/dist/cjs/plugins/id.d.ts +5 -0
- package/dist/cjs/plugins/id.js +123 -0
- package/dist/cjs/plugins/idle.d.ts +5 -0
- package/dist/cjs/plugins/idle.js +85 -0
- package/dist/cjs/plugins/imap4rev2.d.ts +6 -0
- package/dist/cjs/plugins/imap4rev2.js +184 -0
- package/dist/cjs/plugins/index.d.ts +2 -0
- package/dist/cjs/plugins/index.js +119 -0
- package/dist/cjs/plugins/list-extended.d.ts +2 -0
- package/dist/cjs/plugins/list-extended.js +235 -0
- package/dist/cjs/plugins/list-status.d.ts +6 -0
- package/dist/cjs/plugins/list-status.js +42 -0
- package/dist/cjs/plugins/literalminus.d.ts +8 -0
- package/dist/cjs/plugins/literalminus.js +32 -0
- package/dist/cjs/plugins/literalplus.d.ts +6 -0
- package/dist/cjs/plugins/literalplus.js +30 -0
- package/dist/cjs/plugins/logindisabled.d.ts +5 -0
- package/dist/cjs/plugins/logindisabled.js +54 -0
- package/dist/cjs/plugins/messagelimit.d.ts +19 -0
- package/dist/cjs/plugins/messagelimit.js +227 -0
- package/dist/cjs/plugins/metadata-server.d.ts +7 -0
- package/dist/cjs/plugins/metadata-server.js +24 -0
- package/dist/cjs/plugins/metadata.d.ts +11 -0
- package/dist/cjs/plugins/metadata.js +436 -0
- package/dist/cjs/plugins/move.d.ts +11 -0
- package/dist/cjs/plugins/move.js +96 -0
- package/dist/cjs/plugins/multiappend.d.ts +12 -0
- package/dist/cjs/plugins/multiappend.js +38 -0
- package/dist/cjs/plugins/multisearch.d.ts +6 -0
- package/dist/cjs/plugins/multisearch.js +263 -0
- package/dist/cjs/plugins/namespace.d.ts +5 -0
- package/dist/cjs/plugins/namespace.js +57 -0
- package/dist/cjs/plugins/notify.d.ts +2 -0
- package/dist/cjs/plugins/notify.js +628 -0
- package/dist/cjs/plugins/oauthbearer.d.ts +32 -0
- package/dist/cjs/plugins/oauthbearer.js +202 -0
- package/dist/cjs/plugins/objectid.d.ts +23 -0
- package/dist/cjs/plugins/objectid.js +221 -0
- package/dist/cjs/plugins/partial.d.ts +6 -0
- package/dist/cjs/plugins/partial.js +78 -0
- package/dist/cjs/plugins/preview.d.ts +31 -0
- package/dist/cjs/plugins/preview.js +378 -0
- package/dist/cjs/plugins/qresync.d.ts +11 -0
- package/dist/cjs/plugins/qresync.js +473 -0
- package/dist/cjs/plugins/quota.d.ts +18 -0
- package/dist/cjs/plugins/quota.js +254 -0
- package/dist/cjs/plugins/replace.d.ts +14 -0
- package/dist/cjs/plugins/replace.js +130 -0
- package/dist/cjs/plugins/sasl-ir.d.ts +5 -0
- package/dist/cjs/plugins/sasl-ir.js +24 -0
- package/dist/cjs/plugins/savedate.d.ts +17 -0
- package/dist/cjs/plugins/savedate.js +64 -0
- package/dist/cjs/plugins/savelimit.d.ts +10 -0
- package/dist/cjs/plugins/savelimit.js +30 -0
- package/dist/cjs/plugins/searchres.d.ts +6 -0
- package/dist/cjs/plugins/searchres.js +91 -0
- package/dist/cjs/plugins/sort-display.d.ts +11 -0
- package/dist/cjs/plugins/sort-display.js +37 -0
- package/dist/cjs/plugins/sort.d.ts +11 -0
- package/dist/cjs/plugins/sort.js +125 -0
- package/dist/cjs/plugins/special-use.d.ts +10 -0
- package/dist/cjs/plugins/special-use.js +95 -0
- package/dist/cjs/plugins/starttls.d.ts +5 -0
- package/dist/cjs/plugins/starttls.js +55 -0
- package/dist/cjs/plugins/status-size.d.ts +7 -0
- package/dist/cjs/plugins/status-size.js +30 -0
- package/dist/cjs/plugins/thread-orderedsubject.d.ts +11 -0
- package/dist/cjs/plugins/thread-orderedsubject.js +28 -0
- package/dist/cjs/plugins/thread-references.d.ts +11 -0
- package/dist/cjs/plugins/thread-references.js +28 -0
- package/dist/cjs/plugins/uidonly.d.ts +15 -0
- package/dist/cjs/plugins/uidonly.js +126 -0
- package/dist/cjs/plugins/uidplus.d.ts +15 -0
- package/dist/cjs/plugins/uidplus.js +119 -0
- package/dist/cjs/plugins/unauthenticate.d.ts +7 -0
- package/dist/cjs/plugins/unauthenticate.js +32 -0
- package/dist/cjs/plugins/unselect.d.ts +5 -0
- package/dist/cjs/plugins/unselect.js +36 -0
- package/dist/cjs/plugins/utf8-accept.d.ts +6 -0
- package/dist/cjs/plugins/utf8-accept.js +72 -0
- package/dist/cjs/plugins/x-gm-ext-1.d.ts +26 -0
- package/dist/cjs/plugins/x-gm-ext-1.js +422 -0
- package/dist/cjs/plugins/xoauth2.d.ts +2 -0
- package/dist/cjs/plugins/xoauth2.js +155 -0
- package/dist/cjs/plugins/xtoybird.d.ts +2 -0
- package/dist/cjs/plugins/xtoybird.js +236 -0
- package/dist/cjs/server.d.ts +876 -0
- package/dist/cjs/server.js +2597 -0
- package/dist/cjs/smtp-listener.d.ts +13 -0
- package/dist/cjs/smtp-listener.js +47 -0
- package/dist/cjs/sorting.d.ts +77 -0
- package/dist/cjs/sorting.js +290 -0
- package/dist/cjs/threading.d.ts +30 -0
- package/dist/cjs/threading.js +318 -0
- package/dist/cjs/types.d.ts +327 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/utf8-session.d.ts +17 -0
- package/dist/cjs/utf8-session.js +148 -0
- package/dist/cjs/vanished.d.ts +21 -0
- package/dist/cjs/vanished.js +55 -0
- package/dist/esm/addressparser.d.ts +21 -0
- package/{lib → dist/esm}/addressparser.js +106 -133
- package/dist/esm/arguments.d.ts +31 -0
- package/dist/esm/arguments.js +96 -0
- package/dist/esm/bodystructure.d.ts +25 -0
- package/{lib → dist/esm}/bodystructure.js +17 -33
- package/dist/esm/cert.d.ts +2 -0
- package/dist/esm/cert.js +4 -0
- package/dist/esm/command-states.d.ts +36 -0
- package/{lib → dist/esm}/command-states.js +4 -16
- package/dist/esm/commands/append.d.ts +88 -0
- package/{lib → dist/esm}/commands/append.js +47 -85
- package/dist/esm/commands/capability.d.ts +2 -0
- package/dist/esm/commands/capability.js +29 -0
- package/dist/esm/commands/check.d.ts +2 -0
- package/dist/esm/commands/check.js +13 -0
- package/dist/esm/commands/close.d.ts +2 -0
- package/dist/esm/commands/close.js +20 -0
- package/dist/esm/commands/copy.d.ts +30 -0
- package/{lib → dist/esm}/commands/copy.js +31 -55
- package/dist/esm/commands/create.d.ts +2 -0
- package/{lib → dist/esm}/commands/create.js +25 -39
- package/dist/esm/commands/delete.d.ts +2 -0
- package/{lib → dist/esm}/commands/delete.js +25 -41
- package/dist/esm/commands/examine.d.ts +2 -0
- package/dist/esm/commands/examine.js +4 -0
- package/dist/esm/commands/expunge.d.ts +2 -0
- package/dist/esm/commands/expunge.js +17 -0
- package/dist/esm/commands/fetch.d.ts +23 -0
- package/{lib → dist/esm}/commands/fetch.js +33 -74
- package/dist/esm/commands/handlers/fetch.d.ts +12 -0
- package/{lib → dist/esm}/commands/handlers/fetch.js +11 -42
- package/dist/esm/commands/handlers/flags.d.ts +17 -0
- package/{lib → dist/esm}/commands/handlers/flags.js +3 -11
- package/dist/esm/commands/handlers/search.d.ts +85 -0
- package/{lib → dist/esm}/commands/handlers/search.js +33 -71
- package/dist/esm/commands/handlers/status.d.ts +34 -0
- package/{lib → dist/esm}/commands/handlers/status.js +1 -9
- package/dist/esm/commands/handlers/store.d.ts +3 -0
- package/{lib → dist/esm}/commands/handlers/store.js +20 -44
- package/dist/esm/commands/index.d.ts +2 -0
- package/dist/esm/commands/index.js +55 -0
- package/dist/esm/commands/list.d.ts +2 -0
- package/dist/esm/commands/list.js +71 -0
- package/dist/esm/commands/login.d.ts +2 -0
- package/{lib → dist/esm}/commands/login.js +24 -44
- package/dist/esm/commands/logout.d.ts +2 -0
- package/dist/esm/commands/logout.js +25 -0
- package/dist/esm/commands/lsub.d.ts +2 -0
- package/dist/esm/commands/lsub.js +64 -0
- package/dist/esm/commands/noop.d.ts +2 -0
- package/dist/esm/commands/noop.js +13 -0
- package/dist/esm/commands/rename.d.ts +2 -0
- package/{lib → dist/esm}/commands/rename.js +32 -51
- package/dist/esm/commands/search.d.ts +10 -0
- package/dist/esm/commands/search.js +54 -0
- package/dist/esm/commands/select.d.ts +19 -0
- package/dist/esm/commands/select.js +214 -0
- package/dist/esm/commands/status.d.ts +2 -0
- package/{lib → dist/esm}/commands/status.js +18 -39
- package/dist/esm/commands/store.d.ts +10 -0
- package/{lib → dist/esm}/commands/store.js +39 -73
- package/dist/esm/commands/subscribe.d.ts +2 -0
- package/{lib → dist/esm}/commands/subscribe.js +22 -39
- package/dist/esm/commands/uid-copy.d.ts +2 -0
- package/dist/esm/commands/uid-copy.js +4 -0
- package/dist/esm/commands/uid-fetch.d.ts +3 -0
- package/dist/esm/commands/uid-fetch.js +3 -0
- package/dist/esm/commands/uid-search.d.ts +3 -0
- package/dist/esm/commands/uid-search.js +3 -0
- package/dist/esm/commands/uid-store.d.ts +3 -0
- package/dist/esm/commands/uid-store.js +3 -0
- package/dist/esm/commands/unsubscribe.d.ts +2 -0
- package/{lib → dist/esm}/commands/unsubscribe.js +22 -37
- package/dist/esm/dates.d.ts +64 -0
- package/{lib → dist/esm}/dates.js +6 -14
- package/dist/esm/deflate-layer.d.ts +83 -0
- package/{lib → dist/esm}/deflate-layer.js +9 -26
- package/dist/esm/encoded-words.d.ts +15 -0
- package/{lib → dist/esm}/encoded-words.js +9 -25
- package/dist/esm/envelope.d.ts +33 -0
- package/{lib → dist/esm}/envelope.js +8 -19
- package/dist/esm/esearch.d.ts +96 -0
- package/{lib → dist/esm}/esearch.js +12 -39
- package/dist/esm/framing.d.ts +66 -0
- package/dist/esm/framing.js +82 -0
- package/dist/esm/index.d.ts +9 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/list-extensions.d.ts +50 -0
- package/{lib → dist/esm}/list-extensions.js +1 -4
- package/dist/esm/load-plugins.d.ts +21 -0
- package/{lib → dist/esm}/load-plugins.js +9 -43
- package/dist/esm/mailbox-name.d.ts +26 -0
- package/{lib → dist/esm}/mailbox-name.js +5 -26
- package/dist/esm/mimeparser.d.ts +137 -0
- package/{lib → dist/esm}/mimeparser.js +74 -152
- package/dist/esm/mock-client.d.ts +39 -0
- package/{lib → dist/esm}/mock-client.js +26 -40
- package/dist/esm/numbers.d.ts +28 -0
- package/{lib → dist/esm}/numbers.js +1 -8
- package/dist/esm/package.json +3 -0
- package/dist/esm/plugins/acl.d.ts +2 -0
- package/{lib → dist/esm}/plugins/acl.js +146 -240
- package/dist/esm/plugins/appendlimit.d.ts +16 -0
- package/{lib → dist/esm}/plugins/appendlimit.js +5 -16
- package/dist/esm/plugins/auth-plain.d.ts +2 -0
- package/{lib → dist/esm}/plugins/auth-plain.js +11 -31
- package/dist/esm/plugins/binary.d.ts +30 -0
- package/{lib → dist/esm}/plugins/binary.js +17 -43
- package/dist/esm/plugins/catenate.d.ts +14 -0
- package/{lib → dist/esm}/plugins/catenate.js +19 -40
- package/dist/esm/plugins/compress.d.ts +7 -0
- package/dist/esm/plugins/compress.js +61 -0
- package/dist/esm/plugins/condstore.d.ts +5 -0
- package/{lib → dist/esm}/plugins/condstore.js +66 -152
- package/dist/esm/plugins/context-search.d.ts +8 -0
- package/{lib → dist/esm}/plugins/context-search.js +53 -88
- package/dist/esm/plugins/context-sort.d.ts +6 -0
- package/{lib → dist/esm}/plugins/context-sort.js +4 -9
- package/dist/esm/plugins/create-special-use.d.ts +7 -0
- package/{lib → dist/esm}/plugins/create-special-use.js +33 -55
- package/dist/esm/plugins/enable.d.ts +23 -0
- package/dist/esm/plugins/enable.js +111 -0
- package/dist/esm/plugins/esearch.d.ts +6 -0
- package/{lib → dist/esm}/plugins/esearch.js +13 -42
- package/dist/esm/plugins/esort.d.ts +6 -0
- package/{lib → dist/esm}/plugins/esort.js +7 -25
- package/dist/esm/plugins/id.d.ts +5 -0
- package/dist/esm/plugins/id.js +108 -0
- package/dist/esm/plugins/idle.d.ts +5 -0
- package/dist/esm/plugins/idle.js +70 -0
- package/dist/esm/plugins/imap4rev2.d.ts +6 -0
- package/{lib → dist/esm}/plugins/imap4rev2.js +24 -60
- package/dist/esm/plugins/index.d.ts +2 -0
- package/dist/esm/plugins/index.js +113 -0
- package/dist/esm/plugins/list-extended.d.ts +2 -0
- package/{lib → dist/esm}/plugins/list-extended.js +28 -66
- package/dist/esm/plugins/list-status.d.ts +6 -0
- package/{lib → dist/esm}/plugins/list-status.js +5 -12
- package/dist/esm/plugins/literalminus.d.ts +8 -0
- package/{lib → dist/esm}/plugins/literalminus.js +2 -5
- package/dist/esm/plugins/literalplus.d.ts +6 -0
- package/{lib → dist/esm}/plugins/literalplus.js +2 -5
- package/dist/esm/plugins/logindisabled.d.ts +5 -0
- package/dist/esm/plugins/logindisabled.js +39 -0
- package/dist/esm/plugins/messagelimit.d.ts +19 -0
- package/{lib → dist/esm}/plugins/messagelimit.js +18 -41
- package/dist/esm/plugins/metadata-server.d.ts +7 -0
- package/{lib → dist/esm}/plugins/metadata-server.js +3 -7
- package/dist/esm/plugins/metadata.d.ts +11 -0
- package/dist/esm/plugins/metadata.js +421 -0
- package/dist/esm/plugins/move.d.ts +11 -0
- package/{lib → dist/esm}/plugins/move.js +37 -66
- package/dist/esm/plugins/multiappend.d.ts +12 -0
- package/{lib → dist/esm}/plugins/multiappend.js +2 -5
- package/dist/esm/plugins/multisearch.d.ts +6 -0
- package/{lib → dist/esm}/plugins/multisearch.js +24 -48
- package/dist/esm/plugins/namespace.d.ts +5 -0
- package/dist/esm/plugins/namespace.js +42 -0
- package/dist/esm/plugins/notify.d.ts +2 -0
- package/{lib → dist/esm}/plugins/notify.js +90 -134
- package/dist/esm/plugins/oauthbearer.d.ts +32 -0
- package/{lib → dist/esm}/plugins/oauthbearer.js +18 -48
- package/dist/esm/plugins/objectid.d.ts +23 -0
- package/{lib → dist/esm}/plugins/objectid.js +21 -58
- package/dist/esm/plugins/partial.d.ts +6 -0
- package/{lib → dist/esm}/plugins/partial.js +7 -15
- package/dist/esm/plugins/preview.d.ts +31 -0
- package/{lib → dist/esm}/plugins/preview.js +28 -66
- package/dist/esm/plugins/qresync.d.ts +11 -0
- package/{lib → dist/esm}/plugins/qresync.js +64 -134
- package/dist/esm/plugins/quota.d.ts +18 -0
- package/{lib → dist/esm}/plugins/quota.js +89 -135
- package/dist/esm/plugins/replace.d.ts +14 -0
- package/{lib → dist/esm}/plugins/replace.js +21 -51
- package/dist/esm/plugins/sasl-ir.d.ts +5 -0
- package/{lib → dist/esm}/plugins/sasl-ir.js +3 -6
- package/dist/esm/plugins/savedate.d.ts +17 -0
- package/{lib → dist/esm}/plugins/savedate.js +5 -15
- package/dist/esm/plugins/savelimit.d.ts +10 -0
- package/{lib → dist/esm}/plugins/savelimit.js +3 -6
- package/dist/esm/plugins/searchres.d.ts +6 -0
- package/{lib → dist/esm}/plugins/searchres.js +13 -22
- package/dist/esm/plugins/sort-display.d.ts +11 -0
- package/{lib → dist/esm}/plugins/sort-display.js +6 -10
- package/dist/esm/plugins/sort.d.ts +11 -0
- package/{lib → dist/esm}/plugins/sort.js +24 -46
- package/dist/esm/plugins/special-use.d.ts +10 -0
- package/{lib → dist/esm}/plugins/special-use.js +9 -24
- package/dist/esm/plugins/starttls.d.ts +5 -0
- package/{lib → dist/esm}/plugins/starttls.js +20 -37
- package/dist/esm/plugins/status-size.d.ts +7 -0
- package/{lib → dist/esm}/plugins/status-size.js +4 -11
- package/dist/esm/plugins/thread-orderedsubject.d.ts +11 -0
- package/{lib → dist/esm}/plugins/thread-orderedsubject.js +3 -6
- package/dist/esm/plugins/thread-references.d.ts +11 -0
- package/{lib → dist/esm}/plugins/thread-references.js +3 -6
- package/dist/esm/plugins/uidonly.d.ts +15 -0
- package/{lib → dist/esm}/plugins/uidonly.js +11 -35
- package/dist/esm/plugins/uidplus.d.ts +15 -0
- package/{lib → dist/esm}/plugins/uidplus.js +25 -45
- package/dist/esm/plugins/unauthenticate.d.ts +7 -0
- package/dist/esm/plugins/unauthenticate.js +17 -0
- package/dist/esm/plugins/unselect.d.ts +5 -0
- package/dist/esm/plugins/unselect.js +21 -0
- package/dist/esm/plugins/utf8-accept.d.ts +6 -0
- package/{lib → dist/esm}/plugins/utf8-accept.js +10 -21
- package/dist/esm/plugins/x-gm-ext-1.d.ts +26 -0
- package/{lib → dist/esm}/plugins/x-gm-ext-1.js +48 -100
- package/dist/esm/plugins/xoauth2.d.ts +2 -0
- package/dist/esm/plugins/xoauth2.js +140 -0
- package/dist/esm/plugins/xtoybird.d.ts +2 -0
- package/dist/esm/plugins/xtoybird.js +218 -0
- package/dist/esm/server.d.ts +876 -0
- package/dist/esm/server.js +2543 -0
- package/dist/esm/smtp-listener.d.ts +13 -0
- package/{lib → dist/esm}/smtp-listener.js +5 -12
- package/dist/esm/sorting.d.ts +77 -0
- package/{lib → dist/esm}/sorting.js +40 -53
- package/dist/esm/threading.d.ts +30 -0
- package/{lib → dist/esm}/threading.js +29 -70
- package/dist/esm/types.d.ts +327 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/utf8-session.d.ts +17 -0
- package/{lib → dist/esm}/utf8-session.js +15 -25
- package/dist/esm/vanished.d.ts +21 -0
- package/{lib → dist/esm}/vanished.js +16 -21
- package/dist/plugin-help.json +298 -0
- package/package.json +55 -12
- package/lib/commands/capability.js +0 -47
- package/lib/commands/check.js +0 -21
- package/lib/commands/close.js +0 -30
- package/lib/commands/examine.js +0 -7
- package/lib/commands/expunge.js +0 -27
- package/lib/commands/list.js +0 -100
- package/lib/commands/logout.js +0 -41
- package/lib/commands/lsub.js +0 -87
- package/lib/commands/noop.js +0 -21
- package/lib/commands/search.js +0 -76
- package/lib/commands/select.js +0 -289
- package/lib/commands/uid copy.js +0 -7
- package/lib/commands/uid fetch.js +0 -5
- package/lib/commands/uid search.js +0 -5
- package/lib/commands/uid store.js +0 -5
- package/lib/plugins/compress.js +0 -76
- package/lib/plugins/enable.js +0 -155
- package/lib/plugins/id.js +0 -138
- package/lib/plugins/idle.js +0 -105
- package/lib/plugins/logindisabled.js +0 -50
- package/lib/plugins/metadata.js +0 -475
- package/lib/plugins/namespace.js +0 -67
- package/lib/plugins/unauthenticate.js +0 -28
- package/lib/plugins/unselect.js +0 -36
- package/lib/plugins/xoauth2.js +0 -188
- package/lib/plugins/xtoybird.js +0 -282
- package/lib/server.js +0 -2880
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { Attribute, IMAPConnection, IMAPError, IMAPServer, Message, MessageRange, ParsedCommand } from '../../types.js';
|
|
2
|
+
/** The type of a search key argument: a type name, or a function that parses the value and throws for an invalid one */
|
|
3
|
+
export type SearchArgumentType = string | ((value: string) => any);
|
|
4
|
+
/** The argument types of a search key, or a function that decides them from the criteria that follow the key */
|
|
5
|
+
export type SearchKeyTypes = SearchArgumentType[] | ((list: Attribute[]) => SearchArgumentType[]);
|
|
6
|
+
/** A node of the query tree that the search builds from the criteria */
|
|
7
|
+
export interface SearchNode {
|
|
8
|
+
key: string;
|
|
9
|
+
args: any[];
|
|
10
|
+
/** the messages of a sequence set (`_SEQ`) or a UID set */
|
|
11
|
+
set?: Set<Message> | undefined;
|
|
12
|
+
/** the lower cased string to look for */
|
|
13
|
+
needle?: string | undefined;
|
|
14
|
+
}
|
|
15
|
+
/** Resolves a sequence set of the criteria */
|
|
16
|
+
export type RangeResolver = (range: string, isUid: boolean) => MessageRange;
|
|
17
|
+
/** The result of a search */
|
|
18
|
+
export interface SearchResult {
|
|
19
|
+
/** the matching messages */
|
|
20
|
+
list: Message[];
|
|
21
|
+
/** sequence numbers by UID */
|
|
22
|
+
numbers: Record<number, number>;
|
|
23
|
+
/** the search keys used in the criteria, other than sequence sets */
|
|
24
|
+
keys: Set<string>;
|
|
25
|
+
/** checks a message against the same criteria later */
|
|
26
|
+
matches: (message: Message, index: number) => boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Creates an error that is reported to the client as BAD
|
|
30
|
+
*/
|
|
31
|
+
declare function badError(message: string): IMAPError;
|
|
32
|
+
/**
|
|
33
|
+
* Date of a date-time value, disregarding time and timezone, as a comparable YYYY-MM-DD string,
|
|
34
|
+
* or false when it can not be parsed
|
|
35
|
+
*
|
|
36
|
+
* @param {String} dateTime Date-time value, e.g. "14-Sep-2013 21:22:28 -0300"
|
|
37
|
+
* @return {String|Boolean} date or false
|
|
38
|
+
*/
|
|
39
|
+
declare function getDateKey(dateTime: string): string | false;
|
|
40
|
+
/**
|
|
41
|
+
* Converts the parsed search criteria of a command to the values the search takes, parenthesized lists stay nested
|
|
42
|
+
*
|
|
43
|
+
* @param {Array} attributes Parsed arguments
|
|
44
|
+
* @return {Array} values
|
|
45
|
+
* @throws {Error} BAD error for an argument that can not be a search key or its value
|
|
46
|
+
*/
|
|
47
|
+
declare function criteriaValues(attributes: Attribute[]): any[];
|
|
48
|
+
/**
|
|
49
|
+
* Answers a failed search with NO, or BAD for `err.imapResponse` "BAD": the BADCHARSET response code with the
|
|
50
|
+
* supported charsets (RFC 3501 section 7.1, RFC 5256 section 3), or the response code a search limit set
|
|
51
|
+
* (`err.responseCode`), and the text
|
|
52
|
+
*
|
|
53
|
+
* @param {Object} connection IMAP connection
|
|
54
|
+
* @param {Object} parsed Parsed command
|
|
55
|
+
* @param {String} data Raw command
|
|
56
|
+
* @param {Error} err Search error
|
|
57
|
+
* @param {String} description Description for output handlers
|
|
58
|
+
*/
|
|
59
|
+
declare function sendSearchError(connection: IMAPConnection, parsed: ParsedCommand, data: string, err: IMAPError, description: string): void;
|
|
60
|
+
/**
|
|
61
|
+
* Checks if SEARCH criteria refer to messages by sequence number (RFC 3501 section 5.5), that is,
|
|
62
|
+
* if a sequence set is used as a search key. Arguments of search keys, like the UID set of UID
|
|
63
|
+
* or a string that looks like a number, are not search keys.
|
|
64
|
+
*
|
|
65
|
+
* @param {Object} server IMAP server
|
|
66
|
+
* @param {Array} attributes Parsed SEARCH arguments, nested lists are arrays
|
|
67
|
+
* @return {Boolean} true if a sequence set key occurs
|
|
68
|
+
*/
|
|
69
|
+
declare function hasSequenceSetKey(server: IMAPServer, attributes: Attribute[]): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Searches messages. Errors thrown for the client are answered with BAD when `imapResponse` is "BAD",
|
|
72
|
+
* otherwise NO. SORT and THREAD send `responseCode` (a list of atoms) as the response code
|
|
73
|
+
*
|
|
74
|
+
* @param {Object} connection IMAP connection
|
|
75
|
+
* @param {Array} messageSource Messages of the selected mailbox, as the session sees them
|
|
76
|
+
* @param {Array} params Search criteria: strings, and arrays for parenthesized lists
|
|
77
|
+
* @param {Function} [getMessageRange] Resolves the sequence sets of the criteria, `(range, isUid)`, defaults to
|
|
78
|
+
* the selected mailbox of the connection. Used to search a mailbox that is not selected
|
|
79
|
+
* @return {Object} `{ list, numbers, keys, matches }`, the matching messages, the sequence numbers by UID,
|
|
80
|
+
* the set of search keys used in the criteria and a `matches(message, index)` function that checks
|
|
81
|
+
* a message against the same criteria later. Sequence sets in the criteria stay as they were resolved
|
|
82
|
+
* now, they are not evaluated again
|
|
83
|
+
*/
|
|
84
|
+
export default function searchHandlers(connection: IMAPConnection, messageSource: Message[], params: any, getMessageRange?: RangeResolver | null): SearchResult;
|
|
85
|
+
export { hasSequenceSetKey, getDateKey, badError, criteriaValues, sendSearchError };
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const { MAX_NUMBER, MAX_NUMBER64, isNumber } = require('../../numbers');
|
|
7
|
-
const { decodeHeader, decodeUtf8 } = require('../../encoded-words');
|
|
8
|
-
|
|
1
|
+
import { isUtf8 } from 'node:buffer';
|
|
2
|
+
import { getMessageData, render } from '../../mimeparser.js';
|
|
3
|
+
import { monthIndex, dateKey, parseDateTime, parseHeaderDate } from '../../dates.js';
|
|
4
|
+
import { MAX_NUMBER, MAX_NUMBER64, isNumber } from '../../numbers.js';
|
|
5
|
+
import { decodeHeader, decodeUtf8 } from '../../encoded-words.js';
|
|
9
6
|
// RFC 3501 6.4.4 search keys and their arguments
|
|
10
7
|
const searchKeys = {
|
|
11
8
|
ALL: [],
|
|
@@ -44,10 +41,8 @@ const searchKeys = {
|
|
|
44
41
|
UNKEYWORD: ['string'],
|
|
45
42
|
UNSEEN: []
|
|
46
43
|
};
|
|
47
|
-
|
|
48
44
|
// Charsets accepted for the CHARSET argument (RFC 3501 6.4.4: US-ASCII must be supported)
|
|
49
45
|
const charsets = ['US-ASCII', 'UTF-8'];
|
|
50
|
-
|
|
51
46
|
/**
|
|
52
47
|
* Creates an error that is reported to the client as BAD
|
|
53
48
|
*/
|
|
@@ -56,7 +51,6 @@ function badError(message) {
|
|
|
56
51
|
err.imapResponse = 'BAD';
|
|
57
52
|
return err;
|
|
58
53
|
}
|
|
59
|
-
|
|
60
54
|
/**
|
|
61
55
|
* Parses an RFC 3501 date argument (date-day "-" date-month "-" date-year) to a comparable YYYY-MM-DD string
|
|
62
56
|
*/
|
|
@@ -68,7 +62,6 @@ function parseQueryDate(value) {
|
|
|
68
62
|
}
|
|
69
63
|
return date;
|
|
70
64
|
}
|
|
71
|
-
|
|
72
65
|
/**
|
|
73
66
|
* Date of a date-time value, disregarding time and timezone, as a comparable YYYY-MM-DD string,
|
|
74
67
|
* or false when it can not be parsed
|
|
@@ -80,14 +73,12 @@ function getDateKey(dateTime) {
|
|
|
80
73
|
const date = parseDateTime(dateTime);
|
|
81
74
|
return date ? dateKey(date.day, date.month, date.year) : false;
|
|
82
75
|
}
|
|
83
|
-
|
|
84
76
|
/**
|
|
85
77
|
* Date of the internal date of a message, disregarding time and timezone, or false when it can not be parsed
|
|
86
78
|
*/
|
|
87
79
|
function getInternalDate(message) {
|
|
88
80
|
return getDateKey(message.internaldate);
|
|
89
81
|
}
|
|
90
|
-
|
|
91
82
|
/**
|
|
92
83
|
* Date of the Date header of a message, disregarding time and timezone (RFC 3501 section 6.4.4, unlike the
|
|
93
84
|
* sent date of SORT it is not adjusted to UTC). Falls back to the internal date
|
|
@@ -96,7 +87,6 @@ function getSentDate(message) {
|
|
|
96
87
|
const date = parseHeaderDate(getMessageData(message).tree.parsedHeader.date);
|
|
97
88
|
return date ? dateKey(date.day, date.month, date.year) : getInternalDate(message);
|
|
98
89
|
}
|
|
99
|
-
|
|
100
90
|
/**
|
|
101
91
|
* Converts the parsed search criteria of a command to the values the search takes, parenthesized lists stay nested
|
|
102
92
|
*
|
|
@@ -116,7 +106,6 @@ function criteriaValues(attributes) {
|
|
|
116
106
|
};
|
|
117
107
|
return attributes.map(convert);
|
|
118
108
|
}
|
|
119
|
-
|
|
120
109
|
/**
|
|
121
110
|
* Answers a failed search with NO, or BAD for `err.imapResponse` "BAD": the BADCHARSET response code with the
|
|
122
111
|
* supported charsets (RFC 3501 section 7.1, RFC 5256 section 3), or the response code a search limit set
|
|
@@ -133,15 +122,15 @@ function sendSearchError(connection, parsed, data, err, description) {
|
|
|
133
122
|
if (err.code === 'BADCHARSET') {
|
|
134
123
|
attributes.push({
|
|
135
124
|
type: 'SECTION',
|
|
136
|
-
section: [{ type: 'ATOM', value: 'BADCHARSET' }, err.charsets.map(value => ({ type: 'ATOM', value }))]
|
|
125
|
+
section: [{ type: 'ATOM', value: 'BADCHARSET' }, err.charsets.map((value) => ({ type: 'ATOM', value }))]
|
|
137
126
|
});
|
|
138
|
-
}
|
|
139
|
-
|
|
127
|
+
}
|
|
128
|
+
else if (err.responseCode) {
|
|
129
|
+
attributes.push({ type: 'SECTION', section: err.responseCode.map((value) => ({ type: 'ATOM', value: String(value) })) });
|
|
140
130
|
}
|
|
141
131
|
attributes.push({ type: 'TEXT', value: err.message });
|
|
142
132
|
connection.send({ tag: parsed.tag, command: err.imapResponse === 'BAD' ? 'BAD' : 'NO', attributes }, description, parsed, data);
|
|
143
133
|
}
|
|
144
|
-
|
|
145
134
|
/**
|
|
146
135
|
* Lower cases ASCII letters only, so that 8-bit octets in binary strings stay intact. RFC 9051
|
|
147
136
|
* section 6.4.4 asks for case insensitive matching only within the ASCII range
|
|
@@ -149,7 +138,6 @@ function sendSearchError(connection, parsed, data, err, description) {
|
|
|
149
138
|
function asciiLowerCase(str) {
|
|
150
139
|
return str.replace(/[A-Z]+/g, chars => chars.toLowerCase());
|
|
151
140
|
}
|
|
152
|
-
|
|
153
141
|
/**
|
|
154
142
|
* Checks if a string contains another one, ignoring ASCII case
|
|
155
143
|
*
|
|
@@ -159,7 +147,6 @@ function asciiLowerCase(str) {
|
|
|
159
147
|
function contains(haystack, needle) {
|
|
160
148
|
return asciiLowerCase(haystack).indexOf(needle) >= 0;
|
|
161
149
|
}
|
|
162
|
-
|
|
163
150
|
/**
|
|
164
151
|
* Returns the search keys with the types of their arguments, including the keys that plugins
|
|
165
152
|
* define in `server.searchHandlers`. If a plugin handler takes more than 3 params
|
|
@@ -182,7 +169,6 @@ function getSearchKeys(server) {
|
|
|
182
169
|
});
|
|
183
170
|
return keys;
|
|
184
171
|
}
|
|
185
|
-
|
|
186
172
|
/**
|
|
187
173
|
* Checks if SEARCH criteria refer to messages by sequence number (RFC 3501 section 5.5), that is,
|
|
188
174
|
* if a sequence set is used as a search key. Arguments of search keys, like the UID set of UID
|
|
@@ -194,7 +180,7 @@ function getSearchKeys(server) {
|
|
|
194
180
|
*/
|
|
195
181
|
function hasSequenceSetKey(server, attributes) {
|
|
196
182
|
const keys = getSearchKeys(server);
|
|
197
|
-
const walk = list => {
|
|
183
|
+
const walk = (list) => {
|
|
198
184
|
// arguments of the previous key that are values, not keys
|
|
199
185
|
let skip = 0;
|
|
200
186
|
return list.some((item, i) => {
|
|
@@ -209,14 +195,16 @@ function hasSequenceSetKey(server, attributes) {
|
|
|
209
195
|
const key = value.toUpperCase();
|
|
210
196
|
if (key === 'CHARSET' && i === 0) {
|
|
211
197
|
skip = 1;
|
|
212
|
-
}
|
|
198
|
+
}
|
|
199
|
+
else if (Object.hasOwn(keys, key)) {
|
|
213
200
|
// NOT and OR take keys as arguments, these are checked as keys
|
|
214
201
|
let types = keys[key];
|
|
215
202
|
if (typeof types === 'function') {
|
|
216
203
|
types = types(list.slice(i + 1).map(next => (Array.isArray(next) ? next : ((next && next.value) || '').toString())));
|
|
217
204
|
}
|
|
218
|
-
skip = types.filter(type => type !== 'key').length;
|
|
219
|
-
}
|
|
205
|
+
skip = types.filter((type) => type !== 'key').length;
|
|
206
|
+
}
|
|
207
|
+
else if (/^[\d*][\d*,:]*$/.test(value)) {
|
|
220
208
|
return true;
|
|
221
209
|
}
|
|
222
210
|
return false;
|
|
@@ -224,7 +212,6 @@ function hasSequenceSetKey(server, attributes) {
|
|
|
224
212
|
};
|
|
225
213
|
return walk([].concat(attributes || []));
|
|
226
214
|
}
|
|
227
|
-
|
|
228
215
|
/**
|
|
229
216
|
* Searches messages. Errors thrown for the client are answered with BAD when `imapResponse` is "BAD",
|
|
230
217
|
* otherwise NO. SORT and THREAD send `responseCode` (a list of atoms) as the response code
|
|
@@ -239,21 +226,18 @@ function hasSequenceSetKey(server, attributes) {
|
|
|
239
226
|
* a message against the same criteria later. Sequence sets in the criteria stay as they were resolved
|
|
240
227
|
* now, they are not evaluated again
|
|
241
228
|
*/
|
|
242
|
-
|
|
229
|
+
export default function searchHandlers(connection, messageSource, params, getMessageRange) {
|
|
243
230
|
const resolveRange = getMessageRange || ((range, isUid) => connection.getMessageRange(range, isUid));
|
|
244
231
|
const numbers = {};
|
|
245
232
|
// search keys used in the criteria, other than sequence sets
|
|
246
233
|
const usedKeys = new Set();
|
|
247
234
|
const keys = getSearchKeys(connection.server);
|
|
248
235
|
const pluginHandlers = connection.server.searchHandlers;
|
|
249
|
-
|
|
250
236
|
params = [].concat(params || []);
|
|
251
|
-
|
|
252
237
|
// IMAP4rev1 search strings are US-ASCII unless a CHARSET is given (RFC 3501 6.4.4). A plugin can
|
|
253
238
|
// fix the charset of a session with connection.searchCharset, e.g. UTF-8 after ENABLE UTF8=ACCEPT,
|
|
254
239
|
// or change the default with connection.defaultSearchCharset (IMAP4rev2 assumes UTF-8, RFC 9051 6.4.4)
|
|
255
240
|
let searchCharset = connection.searchCharset || connection.defaultSearchCharset || 'US-ASCII';
|
|
256
|
-
|
|
257
241
|
if (typeof params[0] === 'string' && params[0].toUpperCase() === 'CHARSET') {
|
|
258
242
|
if (connection.searchCharset) {
|
|
259
243
|
// RFC 9755 section 3: a CHARSET conflicts with the charset of the session
|
|
@@ -273,7 +257,6 @@ module.exports = function (connection, messageSource, params, getMessageRange) {
|
|
|
273
257
|
}
|
|
274
258
|
searchCharset = charset.toUpperCase();
|
|
275
259
|
}
|
|
276
|
-
|
|
277
260
|
// strings must be valid in the declared charset, a client must not send 8-bit text as US-ASCII
|
|
278
261
|
const checkString = (key, value) => {
|
|
279
262
|
if (searchCharset === 'US-ASCII' && /[\u0080-\u00ff]/.test(value)) {
|
|
@@ -284,49 +267,42 @@ module.exports = function (connection, messageSource, params, getMessageRange) {
|
|
|
284
267
|
}
|
|
285
268
|
return value;
|
|
286
269
|
};
|
|
287
|
-
|
|
288
270
|
if (!params.length) {
|
|
289
271
|
throw badError('SEARCH expects search criteria, empty query given');
|
|
290
272
|
}
|
|
291
|
-
|
|
292
273
|
// Parses one search key and its arguments from a list of criteria into a node of the query tree
|
|
293
|
-
const parseKey = list => {
|
|
274
|
+
const parseKey = (list) => {
|
|
294
275
|
if (!list.length) {
|
|
295
276
|
throw badError('Unexpected end of search criteria');
|
|
296
277
|
}
|
|
297
|
-
|
|
298
278
|
const param = list.shift();
|
|
299
|
-
|
|
300
279
|
if (Array.isArray(param)) {
|
|
301
280
|
// a parenthesized list of keys that all must match
|
|
302
281
|
return { key: 'AND', args: parseList([].concat(param)) };
|
|
303
282
|
}
|
|
304
|
-
|
|
305
283
|
const key = param.toUpperCase();
|
|
306
|
-
|
|
307
284
|
// a plugin can remove keys from a session, e.g. NEW, OLD and RECENT are not in the IMAP4rev2 grammar
|
|
308
285
|
if (!Object.prototype.hasOwnProperty.call(keys, key) || (connection.disabledSearchKeys && connection.disabledSearchKeys.has(key))) {
|
|
309
286
|
// a sequence set, plugins may support other forms of it than numbers
|
|
310
287
|
let range;
|
|
311
288
|
try {
|
|
312
289
|
range = resolveRange(param, false);
|
|
313
|
-
}
|
|
290
|
+
}
|
|
291
|
+
catch (E) {
|
|
314
292
|
throw /^[\d,:*]+$/.test(param) ? E : badError('Invalid search key ' + param);
|
|
315
293
|
}
|
|
316
294
|
return { key: '_SEQ', args: [range] };
|
|
317
295
|
}
|
|
318
|
-
|
|
319
296
|
usedKeys.add(key);
|
|
320
|
-
const
|
|
321
|
-
const
|
|
297
|
+
const keyTypes = keys[key];
|
|
298
|
+
const types = typeof keyTypes === 'function' ? keyTypes(list) : keyTypes;
|
|
299
|
+
const args = types.map((type) => {
|
|
322
300
|
if (type === 'key') {
|
|
323
301
|
return parseKey(list);
|
|
324
302
|
}
|
|
325
|
-
|
|
326
303
|
if (!list.length || typeof list[0] !== 'string') {
|
|
327
304
|
throw badError(key + ' expects ' + types.length + ' argument' + (types.length > 1 ? 's' : ''));
|
|
328
305
|
}
|
|
329
|
-
|
|
330
306
|
const value = list.shift();
|
|
331
307
|
if (typeof type === 'function') {
|
|
332
308
|
return type(value);
|
|
@@ -350,11 +326,9 @@ module.exports = function (connection, messageSource, params, getMessageRange) {
|
|
|
350
326
|
return checkString(key, value);
|
|
351
327
|
}
|
|
352
328
|
});
|
|
353
|
-
|
|
354
329
|
return { key, args };
|
|
355
330
|
};
|
|
356
|
-
|
|
357
|
-
const parseList = list => {
|
|
331
|
+
const parseList = (list) => {
|
|
358
332
|
if (!list.length) {
|
|
359
333
|
throw badError('Empty search criteria list');
|
|
360
334
|
}
|
|
@@ -364,12 +338,10 @@ module.exports = function (connection, messageSource, params, getMessageRange) {
|
|
|
364
338
|
}
|
|
365
339
|
return nodes;
|
|
366
340
|
};
|
|
367
|
-
|
|
368
341
|
const query = { key: 'AND', args: parseList(params) };
|
|
369
|
-
|
|
370
342
|
// a sequence set argument resolves to [number, message] pairs, turn these into a lookup set
|
|
371
|
-
const toMessageSet = range => new Set(range.map(item => item[1]));
|
|
372
|
-
const prepare = node => {
|
|
343
|
+
const toMessageSet = (range) => new Set(range.map(item => item[1]));
|
|
344
|
+
const prepare = (node) => {
|
|
373
345
|
if (node.key === '_SEQ' || node.key === 'UID') {
|
|
374
346
|
node.set = toMessageSet(node.args[0]);
|
|
375
347
|
}
|
|
@@ -378,40 +350,38 @@ module.exports = function (connection, messageSource, params, getMessageRange) {
|
|
|
378
350
|
// decoded too (RFC 9051 section 6.4.4)
|
|
379
351
|
if (['BODY', 'TEXT'].indexOf(node.key) >= 0) {
|
|
380
352
|
node.needle = asciiLowerCase(node.args[0]);
|
|
381
|
-
}
|
|
353
|
+
}
|
|
354
|
+
else if (['BCC', 'CC', 'FROM', 'HEADER', 'SUBJECT', 'TO'].indexOf(node.key) >= 0) {
|
|
382
355
|
node.needle = asciiLowerCase(decodeUtf8(node.args[node.key === 'HEADER' ? 1 : 0]));
|
|
383
356
|
}
|
|
384
|
-
node.args.forEach(arg => {
|
|
357
|
+
node.args.forEach((arg) => {
|
|
385
358
|
if (arg && typeof arg === 'object' && arg.key) {
|
|
386
359
|
prepare(arg);
|
|
387
360
|
}
|
|
388
361
|
});
|
|
389
362
|
};
|
|
390
363
|
prepare(query);
|
|
391
|
-
|
|
392
364
|
const hasFlag = (message, flag) => message.flags.indexOf(flag) >= 0;
|
|
393
|
-
|
|
394
365
|
// compares the unfolded values of the header lines with that name, after decoding their encoded
|
|
395
366
|
// words. RFC 3501 and RFC 9051 section 6.4.4: [MIME-HDRS] strings in headers MUST be decoded before comparing text
|
|
396
367
|
const matchHeader = (message, name, needle) => {
|
|
397
368
|
name = name.toLowerCase();
|
|
398
|
-
return (getMessageData(message).tree.header || []).some(line => {
|
|
369
|
+
return (getMessageData(message).tree.header || []).some((line) => {
|
|
399
370
|
const colon = line.indexOf(':');
|
|
400
371
|
const lineName = (colon < 0 ? line : line.substr(0, colon)).trim().toLowerCase();
|
|
401
372
|
const value = colon < 0 ? '' : line.substr(colon + 1).replace(/\r?\n(?=[ \t])/g, '');
|
|
402
373
|
return lineName === name && contains(decodeHeader(value), needle);
|
|
403
374
|
});
|
|
404
375
|
};
|
|
405
|
-
|
|
406
376
|
const matches = (node, message, index) => {
|
|
407
377
|
const args = node.args;
|
|
408
378
|
if (Object.prototype.hasOwnProperty.call(pluginHandlers, node.key)) {
|
|
409
379
|
// plugin defined search key, which may also override a built-in one
|
|
410
|
-
return !!pluginHandlers[node.key]
|
|
380
|
+
return !!pluginHandlers[node.key](connection, message, index, ...args);
|
|
411
381
|
}
|
|
412
382
|
switch (node.key) {
|
|
413
383
|
case 'AND':
|
|
414
|
-
return args.every(arg => matches(arg, message, index));
|
|
384
|
+
return args.every((arg) => matches(arg, message, index));
|
|
415
385
|
case '_SEQ':
|
|
416
386
|
case 'UID':
|
|
417
387
|
return node.set.has(message);
|
|
@@ -492,11 +462,9 @@ module.exports = function (connection, messageSource, params, getMessageRange) {
|
|
|
492
462
|
return false;
|
|
493
463
|
}
|
|
494
464
|
};
|
|
495
|
-
|
|
496
465
|
// plugins can narrow down the messages that are looked at (server.searchLimits), sequence numbers stay as they are
|
|
497
466
|
const searched = connection.server.searchLimits.reduce((messages, limit) => limit(connection, messages, query) || messages, messageSource);
|
|
498
467
|
const searchedSet = searched !== messageSource && new Set(searched);
|
|
499
|
-
|
|
500
468
|
const list = [];
|
|
501
469
|
messageSource.forEach((message, i) => {
|
|
502
470
|
if (searchedSet && !searchedSet.has(message)) {
|
|
@@ -507,17 +475,11 @@ module.exports = function (connection, messageSource, params, getMessageRange) {
|
|
|
507
475
|
list.push(message);
|
|
508
476
|
}
|
|
509
477
|
});
|
|
510
|
-
|
|
511
478
|
return {
|
|
512
479
|
list,
|
|
513
480
|
numbers,
|
|
514
481
|
keys: usedKeys,
|
|
515
482
|
matches: (message, index) => matches(query, message, index)
|
|
516
483
|
};
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
module.exports.hasSequenceSetKey = hasSequenceSetKey;
|
|
520
|
-
module.exports.getDateKey = getDateKey;
|
|
521
|
-
module.exports.badError = badError;
|
|
522
|
-
module.exports.criteriaValues = criteriaValues;
|
|
523
|
-
module.exports.sendSearchError = sendSearchError;
|
|
484
|
+
}
|
|
485
|
+
export { hasSequenceSetKey, getDateKey, badError, criteriaValues, sendSearchError };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Attribute, IMAPConnection, IMAPResponse, IMAPServer, Mailbox, ParsedCommand } from '../../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validates a list of STATUS data item names (RFC 3501 section 9, "(" status-att *(SP status-att) ")")
|
|
4
|
+
*
|
|
5
|
+
* @param {Object} server IMAPServer instance
|
|
6
|
+
* @param {Array} list Parsed list of status items
|
|
7
|
+
* @param {Object} [connection] IMAP connection, its `disabledStatusItems` set lists items the session can not use,
|
|
8
|
+
* `addedStatusItems` the items only this session can use (DELETED after ENABLE IMAP4rev2)
|
|
9
|
+
* @return {Array} upper case item names
|
|
10
|
+
* @throws {Error} if the list is empty or has an invalid item, the message is for the BAD response
|
|
11
|
+
*/
|
|
12
|
+
declare function parseStatusItems(server: IMAPServer, list: Attribute, connection?: IMAPConnection | null): string[];
|
|
13
|
+
/**
|
|
14
|
+
* Sends an untagged STATUS response
|
|
15
|
+
*
|
|
16
|
+
* @param {Object} connection IMAPConnection instance
|
|
17
|
+
* @param {String} path Storage name of the mailbox
|
|
18
|
+
* @param {Object} mailbox Mailbox object
|
|
19
|
+
* @param {Array} items Upper case item names from parseStatusItems
|
|
20
|
+
* @param {Object} parsed Parsed command
|
|
21
|
+
* @param {Object} data Command data
|
|
22
|
+
*/
|
|
23
|
+
declare function sendStatus(connection: IMAPConnection, path: string, mailbox: Mailbox, items: string[], parsed: ParsedCommand, data: string): void;
|
|
24
|
+
/**
|
|
25
|
+
* Builds an untagged STATUS response
|
|
26
|
+
*
|
|
27
|
+
* @param {Object} connection IMAPConnection instance
|
|
28
|
+
* @param {String} path Storage name of the mailbox
|
|
29
|
+
* @param {Object} mailbox Mailbox object
|
|
30
|
+
* @param {Array} items Upper case item names
|
|
31
|
+
* @return {Object} STATUS response
|
|
32
|
+
*/
|
|
33
|
+
declare function statusResponse(connection: IMAPConnection, path: string, mailbox: Mailbox, items: string[]): IMAPResponse;
|
|
34
|
+
export { parseStatusItems, sendStatus, statusResponse };
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* STATUS data items, shared by the STATUS command and the STATUS return option of LIST (LIST-STATUS,
|
|
5
3
|
* RFC 5819). A STATUS item can only be requested when it is listed in `server.allowedStatus`.
|
|
6
4
|
* Plugins add their items to `server.statusHandlers` (consulted before the built-in items) and to
|
|
7
5
|
* `server.allowedStatus`.
|
|
8
6
|
*/
|
|
9
|
-
|
|
10
7
|
const statusHandlers = {
|
|
11
8
|
MESSAGES: (connection, mailbox) => mailbox.messages.length,
|
|
12
9
|
RECENT: (connection, mailbox, status) => status.recent,
|
|
@@ -16,9 +13,7 @@ const statusHandlers = {
|
|
|
16
13
|
// RFC 9051 section 6.3.11. Not in RFC 3501, QUOTA lists it in allowedStatus, IMAP4rev2 allows it per session
|
|
17
14
|
DELETED: (connection, mailbox, status) => status.flags['\\Deleted'] || 0
|
|
18
15
|
};
|
|
19
|
-
|
|
20
16
|
// RFC 3501 section 9 atom = 1*ATOM-CHAR
|
|
21
|
-
|
|
22
17
|
/**
|
|
23
18
|
* Validates a list of STATUS data item names (RFC 3501 section 9, "(" status-att *(SP status-att) ")")
|
|
24
19
|
*
|
|
@@ -43,7 +38,6 @@ function parseStatusItems(server, list, connection) {
|
|
|
43
38
|
return name;
|
|
44
39
|
});
|
|
45
40
|
}
|
|
46
|
-
|
|
47
41
|
/**
|
|
48
42
|
* Sends an untagged STATUS response
|
|
49
43
|
*
|
|
@@ -57,7 +51,6 @@ function parseStatusItems(server, list, connection) {
|
|
|
57
51
|
function sendStatus(connection, path, mailbox, items, parsed, data) {
|
|
58
52
|
connection.send(statusResponse(connection, path, mailbox, items), 'STATUS', parsed, data);
|
|
59
53
|
}
|
|
60
|
-
|
|
61
54
|
/**
|
|
62
55
|
* Builds an untagged STATUS response
|
|
63
56
|
*
|
|
@@ -81,5 +74,4 @@ function statusResponse(connection, path, mailbox, items) {
|
|
|
81
74
|
attributes: [{ type: 'MAILBOX', value: path }, list]
|
|
82
75
|
};
|
|
83
76
|
}
|
|
84
|
-
|
|
85
|
-
module.exports = { parseStatusItems, sendStatus, statusResponse };
|
|
77
|
+
export { parseStatusItems, sendStatus, statusResponse };
|
|
@@ -1,52 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const { normalizeSystemFlag, checkSystemFlags } = require('./flags');
|
|
4
|
-
|
|
1
|
+
import { normalizeSystemFlag, checkSystemFlags } from './flags.js';
|
|
5
2
|
const storeHandlers = {};
|
|
6
|
-
|
|
7
|
-
module.exports = storeHandlers;
|
|
8
|
-
|
|
3
|
+
export default storeHandlers;
|
|
9
4
|
function setFlags(connection, message, flags) {
|
|
5
|
+
// STORE runs in the Selected state
|
|
6
|
+
const mailbox = connection.selectedMailbox;
|
|
10
7
|
const messageFlags = [];
|
|
11
8
|
[].concat(flags).forEach(flag => {
|
|
12
9
|
flag = normalizeSystemFlag(typeof flag === 'string' ? flag : String(flag.value || ''));
|
|
13
10
|
checkSystemFlags(connection, flag);
|
|
14
|
-
|
|
15
11
|
// Ignore if it is not in allowed list and only permament flags are allowed to use
|
|
16
|
-
if (
|
|
12
|
+
if (mailbox.permanentFlags.indexOf(flag) < 0 && !mailbox.allowPermanentFlags) {
|
|
17
13
|
return;
|
|
18
14
|
}
|
|
19
|
-
|
|
20
15
|
if (messageFlags.indexOf(flag) < 0) {
|
|
21
16
|
messageFlags.push(flag);
|
|
22
17
|
}
|
|
23
18
|
});
|
|
24
19
|
message.flags = messageFlags;
|
|
25
|
-
connection.server.rememberFlags(
|
|
20
|
+
connection.server.rememberFlags(mailbox, messageFlags);
|
|
26
21
|
}
|
|
27
|
-
|
|
28
22
|
function addFlags(connection, message, flags) {
|
|
23
|
+
const mailbox = connection.selectedMailbox;
|
|
29
24
|
[].concat(flags).forEach(flag => {
|
|
30
25
|
flag = normalizeSystemFlag(typeof flag === 'string' ? flag : String(flag.value || ''));
|
|
31
26
|
checkSystemFlags(connection, flag);
|
|
32
|
-
|
|
33
27
|
// Ignore if it is not in allowed list and only permament flags are allowed to use
|
|
34
|
-
if (
|
|
28
|
+
if (mailbox.permanentFlags.indexOf(flag) < 0 && !mailbox.allowPermanentFlags) {
|
|
35
29
|
return;
|
|
36
30
|
}
|
|
37
|
-
|
|
38
31
|
if (message.flags.indexOf(flag) < 0) {
|
|
39
32
|
message.flags.push(flag);
|
|
40
33
|
}
|
|
41
34
|
});
|
|
42
|
-
connection.server.rememberFlags(
|
|
35
|
+
connection.server.rememberFlags(mailbox, message.flags);
|
|
43
36
|
}
|
|
44
|
-
|
|
45
37
|
function removeFlags(connection, message, flags) {
|
|
46
38
|
[].concat(flags).forEach(flag => {
|
|
47
39
|
flag = normalizeSystemFlag(typeof flag === 'string' ? flag : String(flag.value || ''));
|
|
48
40
|
checkSystemFlags(connection, flag);
|
|
49
|
-
|
|
50
41
|
if (message.flags.indexOf(flag) >= 0) {
|
|
51
42
|
for (let i = 0; i < message.flags.length; i++) {
|
|
52
43
|
if (message.flags[i] === flag) {
|
|
@@ -57,7 +48,6 @@ function removeFlags(connection, message, flags) {
|
|
|
57
48
|
}
|
|
58
49
|
});
|
|
59
50
|
}
|
|
60
|
-
|
|
61
51
|
function sendUpdate(connection, parsed, data, index, message) {
|
|
62
52
|
const resp = [
|
|
63
53
|
{
|
|
@@ -71,7 +61,6 @@ function sendUpdate(connection, parsed, data, index, message) {
|
|
|
71
61
|
};
|
|
72
62
|
})
|
|
73
63
|
];
|
|
74
|
-
|
|
75
64
|
if ((parsed.command || '').toUpperCase() === 'UID STORE') {
|
|
76
65
|
resp.push({
|
|
77
66
|
type: 'ATOM',
|
|
@@ -79,49 +68,36 @@ function sendUpdate(connection, parsed, data, index, message) {
|
|
|
79
68
|
});
|
|
80
69
|
resp.push(message.uid);
|
|
81
70
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
]
|
|
94
|
-
},
|
|
95
|
-
'FLAG UPDATE',
|
|
96
|
-
parsed,
|
|
97
|
-
data,
|
|
98
|
-
message
|
|
99
|
-
);
|
|
71
|
+
connection.send({
|
|
72
|
+
tag: '*',
|
|
73
|
+
attributes: [
|
|
74
|
+
index,
|
|
75
|
+
{
|
|
76
|
+
type: 'ATOM',
|
|
77
|
+
value: 'FETCH'
|
|
78
|
+
},
|
|
79
|
+
resp
|
|
80
|
+
]
|
|
81
|
+
}, 'FLAG UPDATE', parsed, data, message);
|
|
100
82
|
}
|
|
101
|
-
|
|
102
83
|
storeHandlers.FLAGS = function (connection, message, flags, index, parsed, data) {
|
|
103
84
|
setFlags(connection, message, flags);
|
|
104
85
|
sendUpdate(connection, parsed, data, index, message);
|
|
105
86
|
};
|
|
106
|
-
|
|
107
87
|
storeHandlers['+FLAGS'] = function (connection, message, flags, index, parsed, data) {
|
|
108
88
|
addFlags(connection, message, flags);
|
|
109
89
|
sendUpdate(connection, parsed, data, index, message);
|
|
110
90
|
};
|
|
111
|
-
|
|
112
91
|
storeHandlers['-FLAGS'] = function (connection, message, flags, index, parsed, data) {
|
|
113
92
|
removeFlags(connection, message, flags);
|
|
114
93
|
sendUpdate(connection, parsed, data, index, message);
|
|
115
94
|
};
|
|
116
|
-
|
|
117
95
|
storeHandlers['FLAGS.SILENT'] = function (connection, message, flags) {
|
|
118
96
|
setFlags(connection, message, flags);
|
|
119
97
|
};
|
|
120
|
-
|
|
121
98
|
storeHandlers['+FLAGS.SILENT'] = function (connection, message, flags) {
|
|
122
99
|
addFlags(connection, message, flags);
|
|
123
100
|
};
|
|
124
|
-
|
|
125
101
|
storeHandlers['-FLAGS.SILENT'] = function (connection, message, flags) {
|
|
126
102
|
removeFlags(connection, message, flags);
|
|
127
103
|
};
|