imapkit 4.0.2 → 4.1.0
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 +277 -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 +102 -123
- 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 +34 -75
- 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 +54 -11
- 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,250 @@
|
|
|
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.default = catenatePlugin;
|
|
7
|
+
const imap_handler_1 = __importDefault(require("imap-handler"));
|
|
8
|
+
const append_js_1 = require("../commands/append.js");
|
|
9
|
+
const fetch_js_1 = __importDefault(require("../commands/handlers/fetch.js"));
|
|
10
|
+
const mimeparser_js_1 = require("../mimeparser.js");
|
|
11
|
+
const mailbox_name_js_1 = require("../mailbox-name.js");
|
|
12
|
+
const numbers_js_1 = require("../numbers.js");
|
|
13
|
+
/**
|
|
14
|
+
* @help Adds CATENATE [RFC4469] and URL-PARTIAL [RFC5550] capabilities
|
|
15
|
+
* @help Only absolute-path URLs are accepted, eg. "/INBOX/;UID=1/;SECTION=1"
|
|
16
|
+
*
|
|
17
|
+
* CATENATE: https://www.rfc-editor.org/rfc/rfc4469
|
|
18
|
+
*
|
|
19
|
+
* APPEND (and REPLACE) can build a message from literals and IMAP URLs of messages or
|
|
20
|
+
* message parts on this server. Only absolute-path URLs are accepted, for example
|
|
21
|
+
* "/INBOX;UIDVALIDITY=1/;UID=2/;SECTION=1.MIME/;PARTIAL=0.100" (RFC 5092). Other URLs,
|
|
22
|
+
* and URLs that do not resolve, fail with NO [BADURL]. A message larger than the
|
|
23
|
+
* literal size limit fails with NO [TOOBIG].
|
|
24
|
+
*/
|
|
25
|
+
function catenatePlugin(server) {
|
|
26
|
+
server.registerCapability('CATENATE');
|
|
27
|
+
// RFC 5550 section 5.7.1: ;PARTIAL= is supported in the URLs of CATENATE
|
|
28
|
+
server.registerCapability('URL-PARTIAL');
|
|
29
|
+
// RFC 4469 section 5: append-data =/ "CATENATE" SP "(" cat-part *(SP cat-part) ")"
|
|
30
|
+
// cat-part = text-literal / url, text-literal = "TEXT" SP literal, url = "URL" SP astring
|
|
31
|
+
server.appendDataHandlers.CATENATE = (connection, list) => {
|
|
32
|
+
if (!Array.isArray(list) || !list.length || list.length % 2) {
|
|
33
|
+
throw (0, append_js_1.badArgument)('CATENATE expects a list of TEXT literals and URLs');
|
|
34
|
+
}
|
|
35
|
+
const parts = [];
|
|
36
|
+
for (let i = 0; i < list.length; i += 2) {
|
|
37
|
+
const label = list[i] && list[i].type === 'ATOM' ? String(list[i].value).toUpperCase() : '';
|
|
38
|
+
const value = list[i + 1];
|
|
39
|
+
if (label === 'TEXT' && value && value.type === 'LITERAL') {
|
|
40
|
+
parts.push({ text: value.value });
|
|
41
|
+
}
|
|
42
|
+
else if (label === 'URL' && value && ['ATOM', 'STRING', 'LITERAL'].indexOf(value.type) >= 0) {
|
|
43
|
+
parts.push({ url: value.value });
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
throw (0, append_js_1.badArgument)('Invalid CATENATE part ' + (i / 2 + 1));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// the message is built once the target mailbox is known to exist
|
|
50
|
+
return () => {
|
|
51
|
+
const maxSize = connection.getMaxLiteralSize();
|
|
52
|
+
let raw = '';
|
|
53
|
+
for (const part of parts) {
|
|
54
|
+
raw += 'text' in part ? part.text : resolveUrl(connection, part.url);
|
|
55
|
+
// RFC 4469 section 4.2: TOOBIG for a message over the server's size limit
|
|
56
|
+
if (raw.length > maxSize) {
|
|
57
|
+
throw (0, append_js_1.appendError)('Catenated message is too large', 'TOOBIG');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return raw;
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// RFC 5092 section 11: bchar (achar / ":" / "@" / "/"), and ";" that starts the URL parameters
|
|
65
|
+
const URL_CHARS = /^[A-Za-z0-9\-._~!$'()*+,&=:@/;%]*$/;
|
|
66
|
+
// RFC 5092 section 11: iabsolute-path = "/" imessagepart, where
|
|
67
|
+
// imessagepart = enc-mailbox [uidvalidity] iuid [isection] [ipartial] (URLAUTH is not supported)
|
|
68
|
+
const MESSAGE_PART = /^\/([^;]+?)(?:;UIDVALIDITY=([^/;]*))?\/;UID=([^/;]*)(?:\/;SECTION=([^/;]*))?(?:\/;PARTIAL=([^/;]*))?$/i;
|
|
69
|
+
/**
|
|
70
|
+
* Creates a BADURL error (RFC 4469 section 4.1). url-resp-text is any TEXT-CHAR except "]", so other
|
|
71
|
+
* octets of an invalid URL are percent-encoded
|
|
72
|
+
*
|
|
73
|
+
* @param {String} url URL as the client sent it
|
|
74
|
+
* @param {String} text Human readable text
|
|
75
|
+
* @return {Error} Error object
|
|
76
|
+
*/
|
|
77
|
+
function badUrl(url, text) {
|
|
78
|
+
if (!url) {
|
|
79
|
+
// url-resp-text can not be empty
|
|
80
|
+
return (0, append_js_1.appendError)(text);
|
|
81
|
+
}
|
|
82
|
+
const value = url.replace(/[^\x20-\x5c\x5e-\x7e]/g, chr => '%' + chr.charCodeAt(0).toString(16).toUpperCase().padStart(2, '0'));
|
|
83
|
+
return (0, append_js_1.appendError)(text, 'BADURL', [{ type: 'TEXT', value }]);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Removes "." and ".." segments from a path (RFC 3986 section 5.2.4), as relative IMAP URLs are
|
|
87
|
+
* resolved by the generic URI rules (RFC 5092 section 7)
|
|
88
|
+
*
|
|
89
|
+
* @param {String} path Path that starts with "/"
|
|
90
|
+
* @return {String} Path without dot segments
|
|
91
|
+
*/
|
|
92
|
+
function removeDotSegments(path) {
|
|
93
|
+
const segments = path.split('/').slice(1);
|
|
94
|
+
const output = [];
|
|
95
|
+
segments.forEach((segment, i) => {
|
|
96
|
+
const last = i === segments.length - 1;
|
|
97
|
+
if (segment === '.' || segment === '..') {
|
|
98
|
+
if (segment === '..') {
|
|
99
|
+
output.pop();
|
|
100
|
+
}
|
|
101
|
+
if (last) {
|
|
102
|
+
output.push('');
|
|
103
|
+
}
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
output.push(segment);
|
|
107
|
+
});
|
|
108
|
+
return '/' + output.join('/');
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Decodes percent-encoded octets
|
|
112
|
+
*
|
|
113
|
+
* @param {String} value Percent-encoded string
|
|
114
|
+
* @return {String} Binary string
|
|
115
|
+
*/
|
|
116
|
+
function percentDecode(value) {
|
|
117
|
+
return value.replace(/%([0-9a-f]{2})/gi, (match, hex) => String.fromCharCode(parseInt(hex, 16)));
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Returns the octets of a message part as BODY.PEEK[<section>] would, or false if the section is
|
|
121
|
+
* invalid or the part does not exist
|
|
122
|
+
*
|
|
123
|
+
* @param {Object} connection IMAPConnection
|
|
124
|
+
* @param {Object} message Message object
|
|
125
|
+
* @param {String} section Decoded section-spec
|
|
126
|
+
* @return {String|Boolean} Section contents
|
|
127
|
+
*/
|
|
128
|
+
function getSection(connection, message, section) {
|
|
129
|
+
if (!section || !/^[\x20-\x7e]+$/.test(section)) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
// reuse the FETCH grammar for section-spec
|
|
133
|
+
let query;
|
|
134
|
+
try {
|
|
135
|
+
const parsed = imap_handler_1.default.parser('X FETCH 1 BODY.PEEK[' + section + ']');
|
|
136
|
+
query = parsed.attributes.length === 2 && !parsed.attributes[1].partial && parsed.attributes[1];
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
if (!query || !query.section || !query.section.length || query.section[0].type !== 'ATOM') {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
// FETCH returns an empty string for a part that does not exist, a URL for it is invalid (RFC 4469 section 4.1)
|
|
145
|
+
const sectionId = String(query.section[0].value).toUpperCase();
|
|
146
|
+
const path = (sectionId.match(/^[1-9]\d*(?:\.[1-9]\d*)*/) || [''])[0];
|
|
147
|
+
if (path) {
|
|
148
|
+
const node = (0, mimeparser_js_1.resolveNode)((0, mimeparser_js_1.getMessageData)(message).tree, path);
|
|
149
|
+
const key = sectionId.substr(path.length + 1);
|
|
150
|
+
// HEADER and TEXT with a part number refer to the message in a message/rfc822 part
|
|
151
|
+
if (!node || (key && key !== 'MIME' && !node.message)) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
return fetch_js_1.default.BODY(connection, message, { section: query.section }).value;
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Returns the octets an IMAP URL refers to. RFC 4469 section 3: only URLs of messages or message
|
|
164
|
+
* parts in the current session are supported, relative to "imap://user@server/". RFC 5092 section 7.2
|
|
165
|
+
* forbids relative-path references, so only absolute-path references ("/" imessagepart) are accepted
|
|
166
|
+
*
|
|
167
|
+
* @param {Object} connection IMAPConnection
|
|
168
|
+
* @param {String} url IMAP URL
|
|
169
|
+
* @return {String} Binary string
|
|
170
|
+
*/
|
|
171
|
+
function resolveUrl(connection, url) {
|
|
172
|
+
if (!url) {
|
|
173
|
+
throw badUrl(url, 'Empty URL does not refer to a message');
|
|
174
|
+
}
|
|
175
|
+
if (/^[a-z][a-z0-9+.-]*:/i.test(url) || url.substr(0, 2) === '//') {
|
|
176
|
+
throw badUrl(url, 'Only absolute-path URLs of this server are supported, e.g. /INBOX/;UID=1');
|
|
177
|
+
}
|
|
178
|
+
if (url.charAt(0) !== '/') {
|
|
179
|
+
throw badUrl(url, 'Relative-path URLs are not allowed (RFC 5092 section 7.2)');
|
|
180
|
+
}
|
|
181
|
+
if (!URL_CHARS.test(url) || /%(?![0-9a-f]{2})/i.test(url)) {
|
|
182
|
+
throw badUrl(url, 'Invalid characters in URL');
|
|
183
|
+
}
|
|
184
|
+
const match = removeDotSegments(url).match(MESSAGE_PART);
|
|
185
|
+
if (!match) {
|
|
186
|
+
throw badUrl(url, 'URL does not refer to a message or a message part');
|
|
187
|
+
}
|
|
188
|
+
const [, encMailbox, uidvalidity, uid, encSection, partial] = match;
|
|
189
|
+
// RFC 5092 section 11: uidvalidity and iuid-only are nz-number values (32-bit, RFC 3501 section 9)
|
|
190
|
+
if ((uidvalidity !== undefined && !(0, numbers_js_1.isNzNumber)(uidvalidity)) || !(0, numbers_js_1.isNzNumber)(uid)) {
|
|
191
|
+
throw badUrl(url, 'Invalid UIDVALIDITY or UID in URL');
|
|
192
|
+
}
|
|
193
|
+
// RFC 5092 section 8: mailbox names are percent-encoded UTF-8
|
|
194
|
+
let name;
|
|
195
|
+
try {
|
|
196
|
+
name = new TextDecoder('utf-8', { fatal: true }).decode(Buffer.from(percentDecode(encMailbox), 'binary'));
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
throw badUrl(url, 'Mailbox name in URL is not valid UTF-8');
|
|
200
|
+
}
|
|
201
|
+
const mailbox = connection.server.getMailbox((0, mailbox_name_js_1.encodeMailboxName)(name));
|
|
202
|
+
if (!mailbox || mailbox.flags.indexOf('\\Noselect') >= 0) {
|
|
203
|
+
throw badUrl(url, 'Mailbox does not exist');
|
|
204
|
+
}
|
|
205
|
+
// plugins can refuse to read the mailbox, e.g. ACL without the "r" right
|
|
206
|
+
for (const check of connection.server.urlAccessChecks) {
|
|
207
|
+
const refusal = check(connection, mailbox, url);
|
|
208
|
+
if (refusal) {
|
|
209
|
+
throw badUrl(url, refusal.text || 'Permission denied');
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// RFC 5092 section 5: a stale URL behaves as if the mailbox does not exist
|
|
213
|
+
if (uidvalidity !== undefined && Number(uidvalidity) !== mailbox.uidvalidity) {
|
|
214
|
+
throw badUrl(url, 'UIDVALIDITY does not match');
|
|
215
|
+
}
|
|
216
|
+
const message = mailbox.messages.find((item) => item.uid === Number(uid));
|
|
217
|
+
if (!message) {
|
|
218
|
+
throw badUrl(url, 'Message does not exist');
|
|
219
|
+
}
|
|
220
|
+
// RFC 5092 section 6: no section is the whole message, BODY.PEEK[], so \Seen is not set
|
|
221
|
+
let value = message.raw;
|
|
222
|
+
if (encSection !== undefined) {
|
|
223
|
+
value = getSection(connection, message, percentDecode(encSection));
|
|
224
|
+
if (value === false) {
|
|
225
|
+
throw badUrl(url, 'Invalid section or the message part does not exist');
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (partial !== undefined) {
|
|
229
|
+
// RFC 5092 section 11: partial-range = number ["." nz-number], offset and length in octets, both 32-bit
|
|
230
|
+
// (RFC 3501 section 9)
|
|
231
|
+
const range = partial.match(/^(\d+)(?:\.(\d+))?$/);
|
|
232
|
+
if (!range || !(0, numbers_js_1.isNumber)(range[1]) || (range[2] !== undefined && !(0, numbers_js_1.isNzNumber)(range[2]))) {
|
|
233
|
+
throw badUrl(url, 'Invalid partial range');
|
|
234
|
+
}
|
|
235
|
+
value = value.substr(Number(range[1]), range[2] ? Number(range[2]) : undefined);
|
|
236
|
+
}
|
|
237
|
+
return value;
|
|
238
|
+
}
|
|
239
|
+
{
|
|
240
|
+
const defaultExport = exports.default;
|
|
241
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
242
|
+
for (const key of Object.keys(exports)) {
|
|
243
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
244
|
+
defaultExport[key] = exports[key];
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
248
|
+
module.exports = defaultExport;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { IMAPServer } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* @help Adds COMPRESS=DEFLATE [RFC4978] capability
|
|
4
|
+
* @help Raw DEFLATE in both directions after the tagged OK,
|
|
5
|
+
* @help every burst of responses ends with a sync flush
|
|
6
|
+
*/
|
|
7
|
+
export default function compressPlugin(server: IMAPServer): void;
|
|
@@ -0,0 +1,79 @@
|
|
|
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.default = compressPlugin;
|
|
7
|
+
const command_states_js_1 = require("../command-states.js");
|
|
8
|
+
const deflate_layer_js_1 = __importDefault(require("../deflate-layer.js"));
|
|
9
|
+
/**
|
|
10
|
+
* @help Adds COMPRESS=DEFLATE [RFC4978] capability
|
|
11
|
+
* @help Raw DEFLATE in both directions after the tagged OK,
|
|
12
|
+
* @help every burst of responses ends with a sync flush
|
|
13
|
+
*/
|
|
14
|
+
function compressPlugin(server) {
|
|
15
|
+
server.registerCapability('COMPRESS=DEFLATE');
|
|
16
|
+
const isActive = (connection) => connection.transport instanceof deflate_layer_js_1.default && connection.transport.active;
|
|
17
|
+
// RFC 8437 section 4.1: after UNAUTHENTICATE the server ends its compression after the CRLF of
|
|
18
|
+
// the OK, and the client after the CRLF of the command, so anything it compressed later is dropped
|
|
19
|
+
server.resetHandlers.push((connection) => {
|
|
20
|
+
if (isActive(connection)) {
|
|
21
|
+
connection.discardInput();
|
|
22
|
+
connection.transport.endInput();
|
|
23
|
+
connection.transport.end();
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
server.setCommandHandler('COMPRESS', (connection, parsed, data, callback) => {
|
|
27
|
+
const args = parsed.attributes || [];
|
|
28
|
+
// RFC 4978 section 5: compress = "COMPRESS" SP algorithm, algorithm = "DEFLATE"
|
|
29
|
+
if (args.length !== 1 || !args[0] || args[0].type !== 'ATOM') {
|
|
30
|
+
connection.sendStatus(parsed, data, 'BAD', 'COMPRESS expects a compression mechanism');
|
|
31
|
+
return callback();
|
|
32
|
+
}
|
|
33
|
+
if (args[0].value.toUpperCase() !== 'DEFLATE') {
|
|
34
|
+
connection.sendStatus(parsed, data, 'BAD', 'Unknown compression mechanism');
|
|
35
|
+
return callback();
|
|
36
|
+
}
|
|
37
|
+
// RFC 4978 section 3: BAD if COMPRESS is already active, NO is for compression by another
|
|
38
|
+
// layer, such as TLS, which ImapKit never negotiates. Dovecot answers NO here
|
|
39
|
+
if (isActive(connection)) {
|
|
40
|
+
connection.sendStatus(parsed, data, 'BAD', 'DEFLATE active via COMPRESS', 'COMPRESSIONACTIVE');
|
|
41
|
+
return callback();
|
|
42
|
+
}
|
|
43
|
+
connection.sendStatus(parsed, data, 'OK', 'DEFLATE active');
|
|
44
|
+
if (connection.transport) {
|
|
45
|
+
// the layer of an earlier session, it passes data on as is since UNAUTHENTICATE
|
|
46
|
+
connection.transport.destroy();
|
|
47
|
+
}
|
|
48
|
+
// compression starts right after the CRLF of the tagged OK
|
|
49
|
+
connection.transport = new deflate_layer_js_1.default({
|
|
50
|
+
// the layer writes only Buffers to the server, strings come from the clients that share it
|
|
51
|
+
writeRaw: (chunk) => connection.writeRaw(chunk),
|
|
52
|
+
onData: (chunk) => connection.onData(chunk),
|
|
53
|
+
onError: (err) => {
|
|
54
|
+
// the input can not be decompressed, so there is nothing left to talk about
|
|
55
|
+
if (connection.options.debug) {
|
|
56
|
+
console.log('COMPRESS error: %s', err.message);
|
|
57
|
+
}
|
|
58
|
+
connection.sendStatus({ tag: '*' }, null, 'BYE', 'Invalid compressed data', false, 'COMPRESS ERROR');
|
|
59
|
+
connection.end();
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
return callback();
|
|
63
|
+
},
|
|
64
|
+
// RFC 4978 section 3: the client MUST NOT send further commands until it has seen the result of COMPRESS.
|
|
65
|
+
// Those commands would be uncompressed, and after an OK the server expects compressed input
|
|
66
|
+
{ states: command_states_js_1.states.AUTHENTICATED, noPipelining: true });
|
|
67
|
+
}
|
|
68
|
+
{
|
|
69
|
+
const defaultExport = exports.default;
|
|
70
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
71
|
+
for (const key of Object.keys(exports)) {
|
|
72
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
73
|
+
defaultExport[key] = exports[key];
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
77
|
+
module.exports = defaultExport;
|
|
78
|
+
}
|
|
79
|
+
}
|