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,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = deleteCommand;
|
|
4
|
+
function deleteCommand(connection, parsed, data, callback) {
|
|
5
|
+
if (!parsed.attributes || parsed.attributes.length !== 1 || !parsed.attributes[0] || ['STRING', 'LITERAL', 'ATOM'].indexOf(parsed.attributes[0].type) < 0) {
|
|
6
|
+
connection.send({
|
|
7
|
+
tag: parsed.tag,
|
|
8
|
+
command: 'BAD',
|
|
9
|
+
attributes: [
|
|
10
|
+
{
|
|
11
|
+
type: 'TEXT',
|
|
12
|
+
value: 'DELETE expects mailbox name'
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
}, 'INVALID COMMAND', parsed, data);
|
|
16
|
+
return callback();
|
|
17
|
+
}
|
|
18
|
+
const path = parsed.attributes[0].value;
|
|
19
|
+
const mailbox = connection.server.getMailbox(path);
|
|
20
|
+
if (!mailbox) {
|
|
21
|
+
connection.sendStatus(parsed, data, 'NO', 'Mailbox does not exist', 'NONEXISTENT', 'DELETE FAILED');
|
|
22
|
+
return callback();
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
connection.server.deleteMailbox(path);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
const E = err;
|
|
29
|
+
connection.sendStatus(parsed, data, 'NO', E.message, E.code, 'DELETE FAILED');
|
|
30
|
+
return callback();
|
|
31
|
+
}
|
|
32
|
+
connection.server.mailboxChanged('delete', mailbox.path, { mailbox });
|
|
33
|
+
// RFC 2180 section 3.3: the other sessions that have the mailbox selected are disconnected with an untagged
|
|
34
|
+
// BYE (RFC 2683 section 3.1.2), as they can not be told about the deletion in any other way
|
|
35
|
+
connection.server.connections.forEach(other => {
|
|
36
|
+
if (other !== connection && other.selectedMailbox === mailbox) {
|
|
37
|
+
other.bye('Selected mailbox was deleted', 'MAILBOX DELETED');
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
connection.send({
|
|
41
|
+
tag: parsed.tag,
|
|
42
|
+
command: 'OK',
|
|
43
|
+
attributes: [
|
|
44
|
+
{
|
|
45
|
+
type: 'TEXT',
|
|
46
|
+
value: 'DELETE completed'
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
}, 'DELETE', parsed, data);
|
|
50
|
+
return callback();
|
|
51
|
+
}
|
|
52
|
+
{
|
|
53
|
+
const defaultExport = exports.default;
|
|
54
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
55
|
+
for (const key of Object.keys(exports)) {
|
|
56
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
57
|
+
defaultExport[key] = exports[key];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
61
|
+
module.exports = defaultExport;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = examineCommand;
|
|
4
|
+
const select_js_1 = require("./select.js");
|
|
5
|
+
function examineCommand(connection, parsed, data, callback) {
|
|
6
|
+
return (0, select_js_1.selectMailbox)(connection, parsed, data, callback, true);
|
|
7
|
+
}
|
|
8
|
+
{
|
|
9
|
+
const defaultExport = exports.default;
|
|
10
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
11
|
+
for (const key of Object.keys(exports)) {
|
|
12
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
13
|
+
defaultExport[key] = exports[key];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
17
|
+
module.exports = defaultExport;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = expungeCommand;
|
|
4
|
+
function expungeCommand(connection, parsed, data, callback) {
|
|
5
|
+
if (connection.refuseReadOnly(parsed, data, 'EXPUNGE FAILED')) {
|
|
6
|
+
return callback();
|
|
7
|
+
}
|
|
8
|
+
connection.expungeDeleted(connection.selectedMailbox, false, true);
|
|
9
|
+
connection.send({
|
|
10
|
+
tag: parsed.tag,
|
|
11
|
+
command: 'OK',
|
|
12
|
+
attributes: [
|
|
13
|
+
{
|
|
14
|
+
type: 'TEXT',
|
|
15
|
+
value: 'EXPUNGE Completed'
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
}, 'EXPUNGE', parsed, data);
|
|
19
|
+
callback();
|
|
20
|
+
}
|
|
21
|
+
{
|
|
22
|
+
const defaultExport = exports.default;
|
|
23
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
24
|
+
for (const key of Object.keys(exports)) {
|
|
25
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
26
|
+
defaultExport[key] = exports[key];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
30
|
+
module.exports = defaultExport;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Attribute, Callback, FetchHandler, IMAPConnection, Message, ParsedCommand } from '../types.js';
|
|
2
|
+
declare const macros: Record<string, string[]>;
|
|
3
|
+
/**
|
|
4
|
+
* Builds the data list of a FETCH response for a message, without any side effects like setting \Seen
|
|
5
|
+
*
|
|
6
|
+
* @param {Object} connection IMAP connection
|
|
7
|
+
* @param {Object} message Message object
|
|
8
|
+
* @param {Array} params Fetch items
|
|
9
|
+
* @param {Array} [handlers] Handlers from getHandlers
|
|
10
|
+
* @param {Array} [names] Names from responseNames
|
|
11
|
+
* @return {Array} FETCH data items
|
|
12
|
+
* @throws {Error} for an unknown item or invalid item arguments
|
|
13
|
+
*/
|
|
14
|
+
declare function fetchResponse(connection: IMAPConnection, message: Message, params: Attribute[], handlers?: FetchHandler[], names?: Attribute[]): Attribute[];
|
|
15
|
+
/**
|
|
16
|
+
* Shared implementation of FETCH and UID FETCH
|
|
17
|
+
*
|
|
18
|
+
* @param {Boolean} isUid If true, the sequence set lists UIDs and UID is always included in the response
|
|
19
|
+
*/
|
|
20
|
+
declare function processFetch(isUid: boolean, connection: IMAPConnection, parsed: ParsedCommand, data: string, callback: Callback): void;
|
|
21
|
+
declare const fetchCommand: (connection: IMAPConnection, parsed: ParsedCommand, data: string, callback: Callback) => void;
|
|
22
|
+
export default fetchCommand;
|
|
23
|
+
export { processFetch, macros, fetchResponse };
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.macros = void 0;
|
|
7
|
+
exports.processFetch = processFetch;
|
|
8
|
+
exports.fetchResponse = fetchResponse;
|
|
9
|
+
const fetch_js_1 = __importDefault(require("./handlers/fetch.js"));
|
|
10
|
+
const macros = {
|
|
11
|
+
ALL: ['FLAGS', 'INTERNALDATE', 'RFC822.SIZE', 'ENVELOPE'],
|
|
12
|
+
FAST: ['FLAGS', 'INTERNALDATE', 'RFC822.SIZE'],
|
|
13
|
+
FULL: ['FLAGS', 'INTERNALDATE', 'RFC822.SIZE', 'ENVELOPE', 'BODY']
|
|
14
|
+
};
|
|
15
|
+
exports.macros = macros;
|
|
16
|
+
/**
|
|
17
|
+
* Returns the item names as they appear in a FETCH response, without .PEEK and only with the origin
|
|
18
|
+
* octet of a partial range (RFC 3501 section 7.4.2)
|
|
19
|
+
*
|
|
20
|
+
* @param {Array} params Fetch items
|
|
21
|
+
* @return {Array} names
|
|
22
|
+
*/
|
|
23
|
+
function responseNames(params) {
|
|
24
|
+
return params.map((param) => {
|
|
25
|
+
const name = Object.assign({}, param, { value: param.value.replace(/\.PEEK\b/i, '') });
|
|
26
|
+
if (name.partial) {
|
|
27
|
+
name.partial = name.partial.slice(0, 1);
|
|
28
|
+
}
|
|
29
|
+
return name;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Returns the handlers of fetch items
|
|
34
|
+
*
|
|
35
|
+
* @param {Object} connection IMAP connection
|
|
36
|
+
* @param {Array} params Fetch items
|
|
37
|
+
* @return {Array} handlers
|
|
38
|
+
* @throws {Error} for an unknown item
|
|
39
|
+
*/
|
|
40
|
+
function getHandlers(connection, params) {
|
|
41
|
+
return params.map((param, i) => {
|
|
42
|
+
const key = (param.value || '').toUpperCase();
|
|
43
|
+
const handler = connection.server.fetchHandlers[key] || fetch_js_1.default[key];
|
|
44
|
+
if (!handler) {
|
|
45
|
+
throw new Error('Invalid FETCH argument ' + (key || '#' + (i + 1)));
|
|
46
|
+
}
|
|
47
|
+
return handler;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Builds the data list of a FETCH response for a message, without any side effects like setting \Seen
|
|
52
|
+
*
|
|
53
|
+
* @param {Object} connection IMAP connection
|
|
54
|
+
* @param {Object} message Message object
|
|
55
|
+
* @param {Array} params Fetch items
|
|
56
|
+
* @param {Array} [handlers] Handlers from getHandlers
|
|
57
|
+
* @param {Array} [names] Names from responseNames
|
|
58
|
+
* @return {Array} FETCH data items
|
|
59
|
+
* @throws {Error} for an unknown item or invalid item arguments
|
|
60
|
+
*/
|
|
61
|
+
function fetchResponse(connection, message, params, handlers, names) {
|
|
62
|
+
const itemHandlers = handlers || getHandlers(connection, params);
|
|
63
|
+
const itemNames = names || responseNames(params);
|
|
64
|
+
const response = [];
|
|
65
|
+
params.forEach((param, i) => response.push(itemNames[i], itemHandlers[i](connection, message, param)));
|
|
66
|
+
return response;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Shared implementation of FETCH and UID FETCH
|
|
70
|
+
*
|
|
71
|
+
* @param {Boolean} isUid If true, the sequence set lists UIDs and UID is always included in the response
|
|
72
|
+
*/
|
|
73
|
+
function processFetch(isUid, connection, parsed, data, callback) {
|
|
74
|
+
const command = isUid ? 'UID FETCH' : 'FETCH';
|
|
75
|
+
if (!parsed.attributes ||
|
|
76
|
+
parsed.attributes.length !== 2 ||
|
|
77
|
+
!parsed.attributes[0] ||
|
|
78
|
+
['ATOM', 'SEQUENCE'].indexOf(parsed.attributes[0].type) < 0 ||
|
|
79
|
+
!parsed.attributes[1] ||
|
|
80
|
+
(['ATOM'].indexOf(parsed.attributes[1].type) < 0 && !Array.isArray(parsed.attributes[1]))) {
|
|
81
|
+
connection.send({
|
|
82
|
+
tag: parsed.tag,
|
|
83
|
+
command: 'BAD',
|
|
84
|
+
attributes: [
|
|
85
|
+
{
|
|
86
|
+
type: 'TEXT',
|
|
87
|
+
value: command + ' expects sequence set and message item names'
|
|
88
|
+
}
|
|
89
|
+
]
|
|
90
|
+
}, 'INVALID COMMAND', parsed, data);
|
|
91
|
+
return callback();
|
|
92
|
+
}
|
|
93
|
+
const range = connection.limitRange(parsed, connection.getCommandRange(parsed.attributes[0].value, isUid));
|
|
94
|
+
let params = [].concat(parsed.attributes[1] || []);
|
|
95
|
+
if (parsed.attributes[1].type === 'ATOM' && Object.prototype.hasOwnProperty.call(macros, parsed.attributes[1].value.toUpperCase())) {
|
|
96
|
+
params = macros[parsed.attributes[1].value.toUpperCase()].slice();
|
|
97
|
+
}
|
|
98
|
+
// messages that get \Seen set by this FETCH
|
|
99
|
+
const seen = [];
|
|
100
|
+
// untagged FETCH responses and their messages
|
|
101
|
+
const responses = [];
|
|
102
|
+
const messages = [];
|
|
103
|
+
try {
|
|
104
|
+
let uidExist = false;
|
|
105
|
+
let flagsExist = false;
|
|
106
|
+
let forceSeen = false;
|
|
107
|
+
params.forEach((param, i) => {
|
|
108
|
+
if (!param || (typeof param !== 'string' && param.type !== 'ATOM')) {
|
|
109
|
+
throw new Error('Invalid FETCH argument #' + (i + 1));
|
|
110
|
+
}
|
|
111
|
+
if (typeof param === 'string') {
|
|
112
|
+
param = params[i] = {
|
|
113
|
+
type: 'ATOM',
|
|
114
|
+
value: param
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
const key = param.value.toUpperCase();
|
|
118
|
+
if (key === 'FLAGS') {
|
|
119
|
+
flagsExist = true;
|
|
120
|
+
}
|
|
121
|
+
if (key === 'UID') {
|
|
122
|
+
uidExist = true;
|
|
123
|
+
}
|
|
124
|
+
// RFC 3501 6.4.5: BODY[<section>] and items whose handler is marked with setsSeen set \Seen
|
|
125
|
+
const handler = connection.server.fetchHandlers[key] || fetch_js_1.default[key];
|
|
126
|
+
if (connection.canSetSeen() && ((key === 'BODY' && param.section) || (handler && handler.setsSeen))) {
|
|
127
|
+
forceSeen = true;
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
if (forceSeen && !flagsExist) {
|
|
131
|
+
params.push({
|
|
132
|
+
type: 'ATOM',
|
|
133
|
+
value: 'FLAGS'
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
if (isUid && !uidExist) {
|
|
137
|
+
params.push({
|
|
138
|
+
type: 'ATOM',
|
|
139
|
+
value: 'UID'
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
const handlers = getHandlers(connection, params);
|
|
143
|
+
// item names as they appear in the response
|
|
144
|
+
const names = responseNames(params);
|
|
145
|
+
// nothing is sent before every message is done, so a failing item leaves no partial output
|
|
146
|
+
range.forEach(rangeMessage => {
|
|
147
|
+
for (let i = 0, len = connection.server.fetchFilters.length; i < len; i++) {
|
|
148
|
+
if (!connection.server.fetchFilters[i](connection, rangeMessage[1], parsed, rangeMessage[0])) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (forceSeen && rangeMessage[1].flags.indexOf('\\Seen') < 0) {
|
|
153
|
+
rangeMessage[1].flags.push('\\Seen');
|
|
154
|
+
seen.push(rangeMessage[1]);
|
|
155
|
+
}
|
|
156
|
+
const response = fetchResponse(connection, rangeMessage[1], params, handlers, names);
|
|
157
|
+
messages.push(rangeMessage[1]);
|
|
158
|
+
responses.push({
|
|
159
|
+
tag: '*',
|
|
160
|
+
attributes: [
|
|
161
|
+
rangeMessage[0],
|
|
162
|
+
{
|
|
163
|
+
type: 'ATOM',
|
|
164
|
+
value: 'FETCH'
|
|
165
|
+
},
|
|
166
|
+
response
|
|
167
|
+
]
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
const E = err;
|
|
173
|
+
// the failed FETCH did not set \Seen after all
|
|
174
|
+
seen.forEach(message => connection.server.removeFlag(message.flags, '\\Seen'));
|
|
175
|
+
// a handler can fail with NO and a response code, e.g. NO [UNKNOWN-CTE] (RFC 3516 section 4.3)
|
|
176
|
+
connection.sendStatus(parsed, data, E.imapResponse === 'NO' ? 'NO' : 'BAD', E.message, E.code, command + ' FAILED');
|
|
177
|
+
return callback();
|
|
178
|
+
}
|
|
179
|
+
// the message goes with its response, for output handlers
|
|
180
|
+
responses.forEach((response, i) => connection.send(response, command, parsed, data, messages[i]));
|
|
181
|
+
connection.send({
|
|
182
|
+
tag: parsed.tag,
|
|
183
|
+
command: 'OK',
|
|
184
|
+
attributes: [
|
|
185
|
+
{
|
|
186
|
+
type: 'TEXT',
|
|
187
|
+
value: command + ' Completed'
|
|
188
|
+
}
|
|
189
|
+
]
|
|
190
|
+
}, command, parsed, data);
|
|
191
|
+
// other sessions that have the mailbox selected learn about the new flags (RFC 3501 section 5.2)
|
|
192
|
+
connection.notifyFlagChanges(seen);
|
|
193
|
+
return callback();
|
|
194
|
+
}
|
|
195
|
+
const fetchCommand = (connection, parsed, data, callback) => processFetch(false, connection, parsed, data, callback);
|
|
196
|
+
exports.default = fetchCommand;
|
|
197
|
+
{
|
|
198
|
+
const defaultExport = exports.default;
|
|
199
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
200
|
+
for (const key of Object.keys(exports)) {
|
|
201
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
202
|
+
defaultExport[key] = exports[key];
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
206
|
+
module.exports = defaultExport;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FetchHandler } from '../../types.js';
|
|
2
|
+
declare const fetchHandlers: Record<string, FetchHandler>;
|
|
3
|
+
export default fetchHandlers;
|
|
4
|
+
/**
|
|
5
|
+
* Applies the partial range of a BODY[]<start.length> or BINARY[]<start.length> item
|
|
6
|
+
*
|
|
7
|
+
* @param {String} value Section contents
|
|
8
|
+
* @param {Array} [partial] Parsed partial range
|
|
9
|
+
* @return {String} The requested slice, or the whole value without a range
|
|
10
|
+
*/
|
|
11
|
+
declare function applyPartial(value: string, partial: number[] | null | undefined): string;
|
|
12
|
+
export { applyPartial };
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.applyPartial = applyPartial;
|
|
7
|
+
const mimeparser_js_1 = require("../../mimeparser.js");
|
|
8
|
+
const bodystructure_js_1 = __importDefault(require("../../bodystructure.js"));
|
|
9
|
+
const envelope_js_1 = __importDefault(require("../../envelope.js"));
|
|
10
|
+
const fetchHandlers = {};
|
|
11
|
+
exports.default = fetchHandlers;
|
|
12
|
+
// not an IMAP item, so not enumerable among the handlers
|
|
13
|
+
Object.defineProperty(fetchHandlers, 'applyPartial', { value: applyPartial });
|
|
14
|
+
fetchHandlers.UID = function (connection, message) {
|
|
15
|
+
return message.uid;
|
|
16
|
+
};
|
|
17
|
+
fetchHandlers.FLAGS = function (connection, message) {
|
|
18
|
+
return connection.getFlags(message).map(flag => {
|
|
19
|
+
return {
|
|
20
|
+
type: 'ATOM',
|
|
21
|
+
value: flag
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
fetchHandlers.BODYSTRUCTURE = function (connection, message) {
|
|
26
|
+
return (0, bodystructure_js_1.default)((0, mimeparser_js_1.getMessageData)(message).tree, {
|
|
27
|
+
upperCaseKeys: true,
|
|
28
|
+
skipContentLocation: true,
|
|
29
|
+
messageGlobal: connection.messageGlobal
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
fetchHandlers.ENVELOPE = function (connection, message) {
|
|
33
|
+
return (0, envelope_js_1.default)((0, mimeparser_js_1.getMessageData)(message).tree.parsedHeader);
|
|
34
|
+
};
|
|
35
|
+
fetchHandlers['BODY.PEEK'] = function (connection, message, query) {
|
|
36
|
+
if (!query.section) {
|
|
37
|
+
throw new Error('BODY.PEEK requires ans argument list');
|
|
38
|
+
}
|
|
39
|
+
return fetchHandlers.BODY(connection, message, query);
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Lists the header field names of a HEADER.FIELDS or HEADER.FIELDS.NOT section
|
|
43
|
+
*/
|
|
44
|
+
function getFieldNames(query, key) {
|
|
45
|
+
if (query.section.length !== 2 || !Array.isArray(query.section[1]) || !query.section[1].length) {
|
|
46
|
+
throw new Error(key + ' expects a list of header fields');
|
|
47
|
+
}
|
|
48
|
+
return query.section[1].map((queryKey) => {
|
|
49
|
+
if (['ATOM', 'STRING', 'LITERAL'].indexOf(queryKey.type) < 0) {
|
|
50
|
+
throw new Error('Invalid header field name in list');
|
|
51
|
+
}
|
|
52
|
+
queryKey.type = 'ATOM'; // ensure that literals are not passed back in the response
|
|
53
|
+
return queryKey.value.toUpperCase();
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Returns the contents of a BODY[<section>]
|
|
58
|
+
*
|
|
59
|
+
* @param {Object} data Message data from getMessageData()
|
|
60
|
+
* @param {Object} query Parsed fetch item
|
|
61
|
+
* @param {Boolean} [global] message/global parts encapsulate a message, see IMAPConnection#messageGlobal
|
|
62
|
+
* @return {String} Section contents
|
|
63
|
+
*/
|
|
64
|
+
function getSection(data, query, global) {
|
|
65
|
+
if (!query.section.length) {
|
|
66
|
+
return data.raw;
|
|
67
|
+
}
|
|
68
|
+
if (query.section[0].type !== 'ATOM') {
|
|
69
|
+
throw new Error('Invalid BODY[<section>] identifier' + (query.section[0].value ? ' ' + query.section[0].type : ''));
|
|
70
|
+
}
|
|
71
|
+
// RFC 3501 9: section-part = nz-number *("." nz-number), optionally followed by a section-msgtext
|
|
72
|
+
// (or MIME for a part)
|
|
73
|
+
const match = (query.section[0].value || '')
|
|
74
|
+
.toUpperCase()
|
|
75
|
+
.match(/^((?:[1-9]\d*)(?:\.[1-9]\d*)*)?(?:(?:^|\.)(HEADER|HEADER\.FIELDS|HEADER\.FIELDS\.NOT|TEXT|MIME))?$/);
|
|
76
|
+
if (!match || (match[2] === 'MIME' && !match[1])) {
|
|
77
|
+
throw new Error('Invalid BODY[<section>] identifier ' + query.section[0].value);
|
|
78
|
+
}
|
|
79
|
+
const path = match[1] || '';
|
|
80
|
+
const key = match[2] || '';
|
|
81
|
+
let fields = [];
|
|
82
|
+
if (['HEADER.FIELDS', 'HEADER.FIELDS.NOT'].indexOf(key) >= 0) {
|
|
83
|
+
fields = getFieldNames(query, key);
|
|
84
|
+
}
|
|
85
|
+
else if (query.section.length > 1) {
|
|
86
|
+
throw new Error((key || 'Part number') + ' does not take any arguments');
|
|
87
|
+
}
|
|
88
|
+
// RFC 3501 6.4.5: a part that does not exist is returned as an empty string
|
|
89
|
+
const node = path ? (0, mimeparser_js_1.resolveNode)(data.tree, path, global) : data.tree;
|
|
90
|
+
if (!node) {
|
|
91
|
+
return '';
|
|
92
|
+
}
|
|
93
|
+
// HEADER and TEXT with a part number refer to the encapsulated message of a message/rfc822 part
|
|
94
|
+
// (and message/global in IMAP4rev2, RFC 9051 section 6.4.5.1), not to the part itself
|
|
95
|
+
const message = path ? (0, mimeparser_js_1.embeddedMessage)(node, global) : node;
|
|
96
|
+
switch (key) {
|
|
97
|
+
case '':
|
|
98
|
+
// BODY[1.2.3] is a part without its MIME header
|
|
99
|
+
return (0, mimeparser_js_1.render)(node, true);
|
|
100
|
+
case 'MIME':
|
|
101
|
+
return (0, mimeparser_js_1.headerSection)(node);
|
|
102
|
+
case 'TEXT':
|
|
103
|
+
return message ? (0, mimeparser_js_1.render)(message, true) : '';
|
|
104
|
+
case 'HEADER':
|
|
105
|
+
return message ? (0, mimeparser_js_1.headerSection)(message) : '';
|
|
106
|
+
default: {
|
|
107
|
+
// HEADER.FIELDS and HEADER.FIELDS.NOT
|
|
108
|
+
if (!message) {
|
|
109
|
+
return '';
|
|
110
|
+
}
|
|
111
|
+
const wanted = key === 'HEADER.FIELDS';
|
|
112
|
+
let value = '';
|
|
113
|
+
(message.header || []).forEach((line) => {
|
|
114
|
+
const name = line.split(':')[0].toUpperCase().trim();
|
|
115
|
+
if (fields.indexOf(name) >= 0 === wanted) {
|
|
116
|
+
value += line + '\r\n';
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
return value + '\r\n';
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Applies the partial range of a BODY[]<start.length> or BINARY[]<start.length> item
|
|
125
|
+
*
|
|
126
|
+
* @param {String} value Section contents
|
|
127
|
+
* @param {Array} [partial] Parsed partial range
|
|
128
|
+
* @return {String} The requested slice, or the whole value without a range
|
|
129
|
+
*/
|
|
130
|
+
function applyPartial(value, partial) {
|
|
131
|
+
if (!partial) {
|
|
132
|
+
return value;
|
|
133
|
+
}
|
|
134
|
+
// RFC 3501 9: partial = "<" number "." nz-number ">"
|
|
135
|
+
if (partial.length !== 2 || !(partial[1] > 0)) {
|
|
136
|
+
throw new Error('Invalid partial range, expecting <start.length>');
|
|
137
|
+
}
|
|
138
|
+
return value.substr(partial[0], partial[1]);
|
|
139
|
+
}
|
|
140
|
+
fetchHandlers.BODY = function (connection, message, query) {
|
|
141
|
+
const data = (0, mimeparser_js_1.getMessageData)(message);
|
|
142
|
+
if (!query.section) {
|
|
143
|
+
if (query.partial) {
|
|
144
|
+
throw new Error('BODY without a section does not take a partial range');
|
|
145
|
+
}
|
|
146
|
+
return (0, bodystructure_js_1.default)(data.tree, {
|
|
147
|
+
body: true,
|
|
148
|
+
upperCaseKeys: true,
|
|
149
|
+
messageGlobal: connection.messageGlobal
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
type: 'LITERAL',
|
|
154
|
+
value: applyPartial(getSection(data, query, connection.messageGlobal), query.partial)
|
|
155
|
+
};
|
|
156
|
+
};
|
|
157
|
+
fetchHandlers.INTERNALDATE = function (connection, message) {
|
|
158
|
+
return message.internaldate;
|
|
159
|
+
};
|
|
160
|
+
fetchHandlers.RFC822 = function (connection, message) {
|
|
161
|
+
return {
|
|
162
|
+
type: 'LITERAL',
|
|
163
|
+
value: (0, mimeparser_js_1.getMessageData)(message).raw
|
|
164
|
+
};
|
|
165
|
+
};
|
|
166
|
+
// RFC 3501 6.4.5: RFC822 and RFC822.TEXT set \Seen, RFC822.HEADER is BODY.PEEK[HEADER] and does not
|
|
167
|
+
fetchHandlers.RFC822.setsSeen = true;
|
|
168
|
+
fetchHandlers['RFC822.SIZE'] = function (connection, message) {
|
|
169
|
+
return (0, mimeparser_js_1.getMessageData)(message).raw.length;
|
|
170
|
+
};
|
|
171
|
+
fetchHandlers['RFC822.HEADER'] = function (connection, message) {
|
|
172
|
+
return {
|
|
173
|
+
type: 'LITERAL',
|
|
174
|
+
value: (0, mimeparser_js_1.headerSection)((0, mimeparser_js_1.getMessageData)(message).tree)
|
|
175
|
+
};
|
|
176
|
+
};
|
|
177
|
+
fetchHandlers['RFC822.TEXT'] = function (connection, message) {
|
|
178
|
+
return {
|
|
179
|
+
type: 'LITERAL',
|
|
180
|
+
value: (0, mimeparser_js_1.render)((0, mimeparser_js_1.getMessageData)(message).tree, true)
|
|
181
|
+
};
|
|
182
|
+
};
|
|
183
|
+
fetchHandlers['RFC822.TEXT'].setsSeen = true;
|
|
184
|
+
{
|
|
185
|
+
const defaultExport = exports.default;
|
|
186
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
187
|
+
for (const key of Object.keys(exports)) {
|
|
188
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
189
|
+
defaultExport[key] = exports[key];
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
193
|
+
module.exports = defaultExport;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IMAPConnection } from '../../types.js';
|
|
2
|
+
declare const INVALID_KEYWORD_CHAR: RegExp;
|
|
3
|
+
/**
|
|
4
|
+
* System flags are case-insensitive, so "\seen" becomes "\Seen"
|
|
5
|
+
*
|
|
6
|
+
* @param {String} flag Flag value
|
|
7
|
+
* @return {String} Normalized flag
|
|
8
|
+
*/
|
|
9
|
+
declare function normalizeSystemFlag(flag: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Throws if a flag can not be stored: an unknown system flag (including \Recent) or an invalid keyword
|
|
12
|
+
*
|
|
13
|
+
* @param {Object} connection IMAP connection
|
|
14
|
+
* @param {String} flag Normalized flag value
|
|
15
|
+
*/
|
|
16
|
+
declare function checkSystemFlags(connection: IMAPConnection, flag: string): void;
|
|
17
|
+
export { INVALID_KEYWORD_CHAR, normalizeSystemFlag, checkSystemFlags };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.INVALID_KEYWORD_CHAR = void 0;
|
|
4
|
+
exports.normalizeSystemFlag = normalizeSystemFlag;
|
|
5
|
+
exports.checkSystemFlags = checkSystemFlags;
|
|
6
|
+
// RFC 3501 9: flag-keyword = atom = 1*ATOM-CHAR, so a keyword can not contain atom-specials:
|
|
7
|
+
// "(" / ")" / "{" / SP / CTL / list-wildcards / quoted-specials / resp-specials. 8-bit octets are
|
|
8
|
+
// allowed, the parser accepts them in atoms as well
|
|
9
|
+
// eslint-disable-next-line no-control-regex
|
|
10
|
+
const INVALID_KEYWORD_CHAR = /[\x00-\x1f\x7f (){%*"\\\]]/;
|
|
11
|
+
exports.INVALID_KEYWORD_CHAR = INVALID_KEYWORD_CHAR;
|
|
12
|
+
/**
|
|
13
|
+
* System flags are case-insensitive, so "\seen" becomes "\Seen"
|
|
14
|
+
*
|
|
15
|
+
* @param {String} flag Flag value
|
|
16
|
+
* @return {String} Normalized flag
|
|
17
|
+
*/
|
|
18
|
+
function normalizeSystemFlag(flag) {
|
|
19
|
+
if (flag.charAt(0) === '\\') {
|
|
20
|
+
flag = flag.charAt(0) + flag.charAt(1).toUpperCase() + flag.substr(2).toLowerCase();
|
|
21
|
+
}
|
|
22
|
+
return flag;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Throws if a flag can not be stored: an unknown system flag (including \Recent) or an invalid keyword
|
|
26
|
+
*
|
|
27
|
+
* @param {Object} connection IMAP connection
|
|
28
|
+
* @param {String} flag Normalized flag value
|
|
29
|
+
*/
|
|
30
|
+
function checkSystemFlags(connection, flag) {
|
|
31
|
+
if (flag.charAt(0) === '\\') {
|
|
32
|
+
if (connection.server.systemFlags.indexOf(flag) < 0) {
|
|
33
|
+
throw new Error('Invalid system flag ' + flag);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else if (!flag || INVALID_KEYWORD_CHAR.test(flag)) {
|
|
37
|
+
throw new Error('Invalid flag keyword ' + JSON.stringify(flag));
|
|
38
|
+
}
|
|
39
|
+
}
|