imapkit 4.0.3 → 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 +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 +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,299 @@
|
|
|
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.badArgument = void 0;
|
|
7
|
+
exports.default = appendCommand;
|
|
8
|
+
exports.appendError = appendError;
|
|
9
|
+
exports.prepareAppend = prepareAppend;
|
|
10
|
+
exports.storeMessages = storeMessages;
|
|
11
|
+
exports.getPendingTarget = getPendingTarget;
|
|
12
|
+
exports.refuseMissingTarget = refuseMissingTarget;
|
|
13
|
+
const imap_handler_1 = __importDefault(require("imap-handler"));
|
|
14
|
+
const flags_js_1 = require("./handlers/flags.js");
|
|
15
|
+
const arguments_js_1 = require("../arguments.js");
|
|
16
|
+
/**
|
|
17
|
+
* Creates an error that refuses an APPEND like command
|
|
18
|
+
*
|
|
19
|
+
* @param {String} text Human readable text
|
|
20
|
+
* @param {String} [code] Response code, e.g. "TOOBIG"
|
|
21
|
+
* @param {Array} [codeArgs] Arguments of the response code, as response attributes
|
|
22
|
+
* @param {String} [response] "NO" (default) or "BAD"
|
|
23
|
+
* @return {Error} Error object
|
|
24
|
+
*/
|
|
25
|
+
function appendError(text, code, codeArgs, response) {
|
|
26
|
+
const err = new Error(text);
|
|
27
|
+
err.imapResponse = response || 'NO';
|
|
28
|
+
err.responseCode = code || false;
|
|
29
|
+
err.responseCodeArgs = codeArgs || [];
|
|
30
|
+
return err;
|
|
31
|
+
}
|
|
32
|
+
const badArgument = (text) => appendError(text, false, false, 'BAD');
|
|
33
|
+
exports.badArgument = badArgument;
|
|
34
|
+
/**
|
|
35
|
+
* Parses a flag list, flags are atoms, and \Recent or unknown system flags can not be set (RFC 3501 section 9)
|
|
36
|
+
*
|
|
37
|
+
* @param {Object} connection IMAPConnection
|
|
38
|
+
* @param {Array} list Parsed flag list
|
|
39
|
+
* @return {Array} Flags
|
|
40
|
+
*/
|
|
41
|
+
function parseFlags(connection, list) {
|
|
42
|
+
try {
|
|
43
|
+
return list.map(flag => {
|
|
44
|
+
if (!flag || flag.type !== 'ATOM') {
|
|
45
|
+
throw new Error('Invalid flags argument');
|
|
46
|
+
}
|
|
47
|
+
const value = (0, flags_js_1.normalizeSystemFlag)(flag.value);
|
|
48
|
+
(0, flags_js_1.checkSystemFlags)(connection, value);
|
|
49
|
+
return value;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
throw badArgument('Invalid flags argument');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Parses the messages of an APPEND like command. RFC 3502 and RFC 4466 section 3:
|
|
58
|
+
* append-message = [SP flag-list] [SP date-time] SP append-data, where append-data is a literal
|
|
59
|
+
* or an extension (label SP value) from `server.appendDataHandlers`, e.g. CATENATE (RFC 4469)
|
|
60
|
+
*
|
|
61
|
+
* @param {Object} connection IMAPConnection
|
|
62
|
+
* @param {Array} args Parsed arguments after the mailbox name
|
|
63
|
+
* @param {Number} maxMessages Largest number of messages allowed
|
|
64
|
+
* @return {Array} Messages `{ flags, internaldate, raw, resolve, literal8 }`, resolve builds the message source
|
|
65
|
+
* of an append-data extension. Throws a BAD error if the arguments break the grammar
|
|
66
|
+
*/
|
|
67
|
+
function parseMessages(connection, args, maxMessages) {
|
|
68
|
+
const server = connection.server;
|
|
69
|
+
const messages = [];
|
|
70
|
+
for (let i = 0; i < args.length;) {
|
|
71
|
+
const message = { flags: [], internaldate: false, raw: false };
|
|
72
|
+
if (Array.isArray(args[i])) {
|
|
73
|
+
message.flags = parseFlags(connection, args[i++]);
|
|
74
|
+
}
|
|
75
|
+
// date-time is always a quoted string, a literal here is the message
|
|
76
|
+
if (args[i] && args[i].type === 'STRING') {
|
|
77
|
+
if (!server.validateInternalDate(args[i].value)) {
|
|
78
|
+
throw badArgument('Invalid internaldate argument');
|
|
79
|
+
}
|
|
80
|
+
message.internaldate = args[i++].value;
|
|
81
|
+
}
|
|
82
|
+
const appendData = args[i++];
|
|
83
|
+
const label = appendData && appendData.type === 'ATOM' ? String(appendData.value).toUpperCase() : '';
|
|
84
|
+
if (appendData && appendData.type === 'LITERAL') {
|
|
85
|
+
message.raw = appendData.value;
|
|
86
|
+
}
|
|
87
|
+
else if (appendData && appendData.type === 'LITERAL8' && server.appendLiteral8) {
|
|
88
|
+
// RFC 3516 section 4.4: the message as a literal8, server.appendLiteral8 (BINARY) stores it
|
|
89
|
+
message.raw = appendData.value;
|
|
90
|
+
message.literal8 = true;
|
|
91
|
+
}
|
|
92
|
+
else if (label && Object.hasOwn(server.appendDataHandlers, label) && i < args.length) {
|
|
93
|
+
message.resolve = server.appendDataHandlers[label](connection, args[i++]);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
throw badArgument('Invalid message source argument');
|
|
97
|
+
}
|
|
98
|
+
messages.push(message);
|
|
99
|
+
}
|
|
100
|
+
if (!messages.length) {
|
|
101
|
+
throw badArgument('Missing message argument');
|
|
102
|
+
}
|
|
103
|
+
if (messages.length > maxMessages) {
|
|
104
|
+
// only a single message unless MULTIAPPEND is supported (RFC 4466 section 3)
|
|
105
|
+
throw badArgument('Only a single message can be appended');
|
|
106
|
+
}
|
|
107
|
+
return messages;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Sends the response for an error from appendError()
|
|
111
|
+
*
|
|
112
|
+
* @param {Object} connection IMAPConnection
|
|
113
|
+
* @param {Object} parsed Parsed command
|
|
114
|
+
* @param {String} data Raw command
|
|
115
|
+
* @param {Error} err Error object
|
|
116
|
+
* @param {String} description Description of a NO response
|
|
117
|
+
*/
|
|
118
|
+
function sendAppendError(connection, parsed, data, err, description) {
|
|
119
|
+
const attributes = [];
|
|
120
|
+
if (err.responseCode) {
|
|
121
|
+
attributes.push({
|
|
122
|
+
type: 'SECTION',
|
|
123
|
+
section: [{ type: 'ATOM', value: err.responseCode }].concat(err.responseCodeArgs)
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
attributes.push({ type: 'TEXT', value: err.message });
|
|
127
|
+
connection.send({
|
|
128
|
+
tag: parsed.tag,
|
|
129
|
+
command: err.imapResponse,
|
|
130
|
+
attributes
|
|
131
|
+
}, err.imapResponse === 'BAD' ? 'INVALID COMMAND' : description, parsed, data);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Finds the target mailbox name of an APPEND or REPLACE command when a literal of a message (or of a CATENATE TEXT
|
|
135
|
+
* part) is announced. Only the start of the command up to the mailbox argument is parsed, so the data of earlier
|
|
136
|
+
* literals is not parsed again for every message of a MULTIAPPEND
|
|
137
|
+
*
|
|
138
|
+
* @param {Object} connection IMAPConnection
|
|
139
|
+
* @param {String} command Upper case command name
|
|
140
|
+
* @param {String} line Command received so far, up to the literal size marker
|
|
141
|
+
* @return {String|Boolean} storage name of the mailbox, or false if the literal is not a message or the name is not
|
|
142
|
+
* known yet or not valid
|
|
143
|
+
*/
|
|
144
|
+
function getPendingTarget(connection, command, line) {
|
|
145
|
+
const options = connection.server.getCommandOptions(command);
|
|
146
|
+
if (!options.appendMessage) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
const mailboxPosition = options.mailboxArguments[0];
|
|
150
|
+
// the literal of a CATENATE URL is not a message part
|
|
151
|
+
if (/[ (]URL $/i.test(line.slice(-5))) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
// an open CATENATE list is closed for parsing
|
|
155
|
+
const parse = (text) => {
|
|
156
|
+
text = text.replace(/ $/, '');
|
|
157
|
+
for (const suffix of ['', ')']) {
|
|
158
|
+
try {
|
|
159
|
+
const parsed = imap_handler_1.default.parser(text + suffix);
|
|
160
|
+
(0, arguments_js_1.restoreNilAtoms)(parsed, text, (path) => path.length === 1 && path[0] === mailboxPosition);
|
|
161
|
+
return parsed.attributes || [];
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// try the next suffix
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return [];
|
|
168
|
+
};
|
|
169
|
+
// the command up to the first literal, or up to the end of it when that literal is the mailbox name
|
|
170
|
+
const literal = line.match(/(~?)\{(\d+)\+?\}\r\n/);
|
|
171
|
+
let attributes = parse(literal ? line.substr(0, literal.index) : line);
|
|
172
|
+
if (attributes.length <= mailboxPosition && literal && !literal[1]) {
|
|
173
|
+
attributes = parse(line.substr(0, literal.index + literal[0].length + Number(literal[2])));
|
|
174
|
+
}
|
|
175
|
+
// a literal8 can not be a mailbox name, the command handler refuses it
|
|
176
|
+
const pathArg = attributes[mailboxPosition];
|
|
177
|
+
if (!(0, arguments_js_1.isAstring)(pathArg)) {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
return connection.importMailboxName(pathArg.value);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// the command handler refuses the name
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* A literal filter (`server.literalFilters`) that refuses the message of an APPEND or REPLACE to a mailbox that does
|
|
190
|
+
* not exist before the client sends it, by not sending a continuation request (RFC 3502 section 6.3.11 example A004,
|
|
191
|
+
* RFC 3501 section 6.3.11: TRYCREATE). Not while earlier commands are still waiting, these could create the mailbox
|
|
192
|
+
*
|
|
193
|
+
* @param {Object} connection IMAPConnection
|
|
194
|
+
* @param {String} command Upper case command name
|
|
195
|
+
* @param {String} line Command received so far, up to the literal size marker
|
|
196
|
+
* @return {Object|Boolean} `{ command, code, text }` to refuse the literal, or false
|
|
197
|
+
*/
|
|
198
|
+
function refuseMissingTarget(connection, command, line) {
|
|
199
|
+
const path = !connection.isBusy() && getPendingTarget(connection, command, line);
|
|
200
|
+
return path !== false && connection.server.targetRefusal(path);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Prepares the messages of an APPEND like command (APPEND, REPLACE): parses the arguments, checks
|
|
204
|
+
* the target mailbox, builds the message sources and runs `server.appendChecks` through
|
|
205
|
+
* IMAPConnection#checkAppend. Nothing is stored yet, so a failure leaves every mailbox as it was
|
|
206
|
+
* (RFC 3502 section 6.3.11). The error response is sent here.
|
|
207
|
+
*
|
|
208
|
+
* The checks get the built messages (with `raw`) of the whole command and the options as
|
|
209
|
+
* `{ command, replaced }`, `replaced` is the message that REPLACE removes.
|
|
210
|
+
*
|
|
211
|
+
* @param {Object} connection IMAPConnection
|
|
212
|
+
* @param {Object} parsed Parsed command
|
|
213
|
+
* @param {String} data Raw command
|
|
214
|
+
* @param {Object} pathArg Parsed mailbox name argument
|
|
215
|
+
* @param {Array} args Parsed arguments after the mailbox name
|
|
216
|
+
* @param {Object} options `{ command, maxMessages, replaced }`
|
|
217
|
+
* @return {Object|Boolean} `{ mailbox, messages }` or false if an error response was sent
|
|
218
|
+
*/
|
|
219
|
+
function prepareAppend(connection, parsed, data, pathArg, args, options) {
|
|
220
|
+
const description = options.command + ' FAILED';
|
|
221
|
+
const maxMessages = options.maxMessages || (connection.server.multiAppend ? Infinity : 1);
|
|
222
|
+
try {
|
|
223
|
+
if (!pathArg || ['STRING', 'ATOM', 'LITERAL'].indexOf(pathArg.type) < 0) {
|
|
224
|
+
throw badArgument('Invalid mailbox argument');
|
|
225
|
+
}
|
|
226
|
+
const messages = parseMessages(connection, args, maxMessages);
|
|
227
|
+
// getTargetMailbox sends the NO response itself
|
|
228
|
+
const mailbox = connection.getTargetMailbox(pathArg.value, parsed, data, description);
|
|
229
|
+
if (!mailbox) {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
messages.forEach(message => {
|
|
233
|
+
if (message.resolve) {
|
|
234
|
+
message.raw = message.resolve();
|
|
235
|
+
}
|
|
236
|
+
else if (message.literal8) {
|
|
237
|
+
// literal8 is only set when server.appendLiteral8 exists, and then raw holds the literal
|
|
238
|
+
message.raw = connection.server.appendLiteral8(message.raw);
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
// every message source is built now
|
|
242
|
+
const prepared = messages;
|
|
243
|
+
// checkAppend sends the NO response itself
|
|
244
|
+
if (!connection.checkAppend(mailbox, prepared, parsed, data, description, { command: options.command, replaced: options.replaced })) {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
return { mailbox, messages: prepared };
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
const err = error;
|
|
251
|
+
if (!err.imapResponse) {
|
|
252
|
+
throw err;
|
|
253
|
+
}
|
|
254
|
+
sendAppendError(connection, parsed, data, err, description);
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Stores prepared messages. The sessions that have the target mailbox selected get EXISTS updates
|
|
260
|
+
*
|
|
261
|
+
* @param {Object} connection IMAPConnection
|
|
262
|
+
* @param {Object} prepared Result of prepareAppend()
|
|
263
|
+
* @return {Object} `{ mailbox, message, messages }`, message is the last stored message
|
|
264
|
+
*/
|
|
265
|
+
function storeMessages(connection, prepared) {
|
|
266
|
+
const messages = prepared.messages.map(message => connection.server.appendMessage(prepared.mailbox, message.flags, message.internaldate, message.raw).message);
|
|
267
|
+
return { mailbox: prepared.mailbox, message: messages[messages.length - 1], messages };
|
|
268
|
+
}
|
|
269
|
+
function appendCommand(connection, parsed, data, callback) {
|
|
270
|
+
const args = [].concat(parsed.attributes || []);
|
|
271
|
+
const prepared = prepareAppend(connection, parsed, data, args.shift(), args, { command: 'APPEND' });
|
|
272
|
+
if (!prepared) {
|
|
273
|
+
return callback();
|
|
274
|
+
}
|
|
275
|
+
const appendResult = storeMessages(connection, prepared);
|
|
276
|
+
connection.send({
|
|
277
|
+
tag: parsed.tag,
|
|
278
|
+
command: 'OK',
|
|
279
|
+
attributes: [
|
|
280
|
+
{
|
|
281
|
+
type: 'TEXT',
|
|
282
|
+
value: 'APPEND Completed'
|
|
283
|
+
}
|
|
284
|
+
]
|
|
285
|
+
}, 'APPEND', parsed, data, appendResult);
|
|
286
|
+
callback();
|
|
287
|
+
}
|
|
288
|
+
{
|
|
289
|
+
const defaultExport = exports.default;
|
|
290
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
291
|
+
for (const key of Object.keys(exports)) {
|
|
292
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
293
|
+
defaultExport[key] = exports[key];
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
297
|
+
module.exports = defaultExport;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = capabilityCommand;
|
|
4
|
+
function capabilityCommand(connection, parsed, data, callback) {
|
|
5
|
+
const capabilities = ['IMAP4rev1'];
|
|
6
|
+
Object.keys(connection.server.capabilities).forEach(key => {
|
|
7
|
+
if (connection.server.capabilities[key](connection)) {
|
|
8
|
+
capabilities.push(key);
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
connection.send({
|
|
12
|
+
tag: '*',
|
|
13
|
+
command: 'CAPABILITY',
|
|
14
|
+
attributes: capabilities.map(capability => {
|
|
15
|
+
return {
|
|
16
|
+
type: 'TEXT',
|
|
17
|
+
value: capability
|
|
18
|
+
};
|
|
19
|
+
})
|
|
20
|
+
}, 'CAPABILITY LIST', parsed, data, capabilities);
|
|
21
|
+
connection.send({
|
|
22
|
+
tag: parsed.tag,
|
|
23
|
+
command: 'OK',
|
|
24
|
+
attributes: [
|
|
25
|
+
{
|
|
26
|
+
type: 'TEXT',
|
|
27
|
+
value: 'Completed'
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}, 'CAPABILITY COMPLETED', parsed, data, capabilities);
|
|
31
|
+
callback();
|
|
32
|
+
}
|
|
33
|
+
{
|
|
34
|
+
const defaultExport = exports.default;
|
|
35
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
36
|
+
for (const key of Object.keys(exports)) {
|
|
37
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
38
|
+
defaultExport[key] = exports[key];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
42
|
+
module.exports = defaultExport;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = checkCommand;
|
|
4
|
+
function checkCommand(connection, parsed, data, callback) {
|
|
5
|
+
connection.send({
|
|
6
|
+
tag: parsed.tag,
|
|
7
|
+
command: 'OK',
|
|
8
|
+
attributes: [
|
|
9
|
+
{
|
|
10
|
+
type: 'TEXT',
|
|
11
|
+
value: 'Completed'
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}, 'CHECK', parsed, data);
|
|
15
|
+
callback();
|
|
16
|
+
}
|
|
17
|
+
{
|
|
18
|
+
const defaultExport = exports.default;
|
|
19
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
20
|
+
for (const key of Object.keys(exports)) {
|
|
21
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
22
|
+
defaultExport[key] = exports[key];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
26
|
+
module.exports = defaultExport;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = closeCommand;
|
|
4
|
+
function closeCommand(connection, parsed, data, callback) {
|
|
5
|
+
// a read-only mailbox is closed without removing anything
|
|
6
|
+
if (connection.canExpunge()) {
|
|
7
|
+
connection.expungeDeleted(connection.selectedMailbox, true);
|
|
8
|
+
}
|
|
9
|
+
// CLOSE does not send pending EXPUNGE or EXISTS responses (RFC 3501 section 6.4.2)
|
|
10
|
+
connection.notificationQueue = [];
|
|
11
|
+
connection.send({
|
|
12
|
+
tag: parsed.tag,
|
|
13
|
+
command: 'OK',
|
|
14
|
+
attributes: [
|
|
15
|
+
{
|
|
16
|
+
type: 'TEXT',
|
|
17
|
+
value: 'Mailbox closed'
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}, 'CLOSE', parsed, data);
|
|
21
|
+
connection.closeMailbox();
|
|
22
|
+
return callback();
|
|
23
|
+
}
|
|
24
|
+
{
|
|
25
|
+
const defaultExport = exports.default;
|
|
26
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
27
|
+
for (const key of Object.keys(exports)) {
|
|
28
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
29
|
+
defaultExport[key] = exports[key];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
33
|
+
module.exports = defaultExport;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Callback, IMAPConnection, Mailbox, Message, ParsedCommand } from '../types.js';
|
|
2
|
+
/** The result of copyToMailbox(), the extra context of the tagged OK (UIDPLUS) */
|
|
3
|
+
export interface CopyResult {
|
|
4
|
+
mailbox: Mailbox;
|
|
5
|
+
sourceUids: number[];
|
|
6
|
+
targetUids: number[];
|
|
7
|
+
/** the copied source messages */
|
|
8
|
+
messages: Message[];
|
|
9
|
+
}
|
|
10
|
+
export default function copyCommand(connection: IMAPConnection, parsed: ParsedCommand, data: string, callback: Callback): void;
|
|
11
|
+
/**
|
|
12
|
+
* Shared implementation of COPY and UID COPY
|
|
13
|
+
*
|
|
14
|
+
* @param {Boolean} isUid If true, the sequence set holds UID values
|
|
15
|
+
*/
|
|
16
|
+
declare function copyMessages(connection: IMAPConnection, parsed: ParsedCommand, data: string, callback: Callback, isUid: boolean): void;
|
|
17
|
+
/**
|
|
18
|
+
* Copies messages from the selected mailbox to another one, the copy step of COPY and MOVE.
|
|
19
|
+
* Sends a tagged NO and returns false if the target mailbox can not be used.
|
|
20
|
+
*
|
|
21
|
+
* @param {Object} connection IMAP connection
|
|
22
|
+
* @param {Object} parsed Parsed command, with the sequence set and the mailbox name as arguments
|
|
23
|
+
* @param {String} data Raw command
|
|
24
|
+
* @param {Boolean} isUid If true, the sequence set holds UID values
|
|
25
|
+
* @param {String} failDescription Description for the failure response
|
|
26
|
+
* @param {Boolean} [isMove] If true, the messages are moved, the caller expunges them afterwards
|
|
27
|
+
* @return {Object|false} `{ mailbox, sourceUids, targetUids, messages }`, where messages lists the copied source messages
|
|
28
|
+
*/
|
|
29
|
+
declare function copyToMailbox(connection: IMAPConnection, parsed: ParsedCommand, data: string, isUid: boolean, failDescription: string, isMove?: boolean): CopyResult | false;
|
|
30
|
+
export { copyMessages, copyToMailbox };
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = copyCommand;
|
|
4
|
+
exports.copyMessages = copyMessages;
|
|
5
|
+
exports.copyToMailbox = copyToMailbox;
|
|
6
|
+
function copyCommand(connection, parsed, data, callback) {
|
|
7
|
+
return copyMessages(connection, parsed, data, callback, false);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Shared implementation of COPY and UID COPY
|
|
11
|
+
*
|
|
12
|
+
* @param {Boolean} isUid If true, the sequence set holds UID values
|
|
13
|
+
*/
|
|
14
|
+
function copyMessages(connection, parsed, data, callback, isUid) {
|
|
15
|
+
const command = isUid ? 'UID COPY' : 'COPY';
|
|
16
|
+
if (!parsed.attributes ||
|
|
17
|
+
parsed.attributes.length !== 2 ||
|
|
18
|
+
!parsed.attributes[0] ||
|
|
19
|
+
['ATOM', 'SEQUENCE'].indexOf(parsed.attributes[0].type) < 0 ||
|
|
20
|
+
!parsed.attributes[1] ||
|
|
21
|
+
['ATOM', 'STRING', 'LITERAL'].indexOf(parsed.attributes[1].type) < 0) {
|
|
22
|
+
connection.send({
|
|
23
|
+
tag: parsed.tag,
|
|
24
|
+
command: 'BAD',
|
|
25
|
+
attributes: [
|
|
26
|
+
{
|
|
27
|
+
type: 'TEXT',
|
|
28
|
+
value: command + ' expects sequence set and a mailbox name'
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
}, 'INVALID COMMAND', parsed, data);
|
|
32
|
+
return callback();
|
|
33
|
+
}
|
|
34
|
+
const result = copyToMailbox(connection, parsed, data, isUid, command + ' FAIL');
|
|
35
|
+
if (!result) {
|
|
36
|
+
return callback();
|
|
37
|
+
}
|
|
38
|
+
// the result is the extra context info for UIDPLUS
|
|
39
|
+
connection.send({
|
|
40
|
+
tag: parsed.tag,
|
|
41
|
+
command: 'OK',
|
|
42
|
+
attributes: [
|
|
43
|
+
{
|
|
44
|
+
type: 'TEXT',
|
|
45
|
+
value: command + ' Completed'
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}, command, parsed, data, result);
|
|
49
|
+
callback();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Copies messages from the selected mailbox to another one, the copy step of COPY and MOVE.
|
|
53
|
+
* Sends a tagged NO and returns false if the target mailbox can not be used.
|
|
54
|
+
*
|
|
55
|
+
* @param {Object} connection IMAP connection
|
|
56
|
+
* @param {Object} parsed Parsed command, with the sequence set and the mailbox name as arguments
|
|
57
|
+
* @param {String} data Raw command
|
|
58
|
+
* @param {Boolean} isUid If true, the sequence set holds UID values
|
|
59
|
+
* @param {String} failDescription Description for the failure response
|
|
60
|
+
* @param {Boolean} [isMove] If true, the messages are moved, the caller expunges them afterwards
|
|
61
|
+
* @return {Object|false} `{ mailbox, sourceUids, targetUids, messages }`, where messages lists the copied source messages
|
|
62
|
+
*/
|
|
63
|
+
function copyToMailbox(connection, parsed, data, isUid, failDescription, isMove) {
|
|
64
|
+
// the command handler checked the arguments
|
|
65
|
+
const attributes = parsed.attributes;
|
|
66
|
+
const range = connection.limitRange(parsed, connection.getCommandRange(attributes[0].value, isUid));
|
|
67
|
+
const mailbox = connection.getTargetMailbox(attributes[1].value, parsed, data, failDescription);
|
|
68
|
+
if (!mailbox) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
const messages = range.map(rangeMessage => rangeMessage[1]);
|
|
72
|
+
if (messages.some((message) => message.ghost)) {
|
|
73
|
+
// RFC 2180 section 4.4.1: nothing is copied when the set includes a message that another session expunged,
|
|
74
|
+
// the pending EXPUNGE responses go out before the NO
|
|
75
|
+
connection.sendStatus(parsed, data, 'NO', 'Some of the requested messages no longer exist', 'EXPUNGEISSUED', failDescription);
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
if (!connection.checkAppend(mailbox, messages, parsed, data, failDescription, { move: !!isMove, source: connection.selectedMailbox })) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
const sourceUids = [];
|
|
82
|
+
const targetUids = [];
|
|
83
|
+
// a range that is processed from the highest UID down (parsed.highestFirst) is still copied in UID order,
|
|
84
|
+
// so the new UIDs follow the order of the source UIDs (RFC 9738 section 3.1 MOVE example)
|
|
85
|
+
(parsed.highestFirst ? messages.slice().reverse() : messages).forEach((message) => {
|
|
86
|
+
sourceUids.push(message.uid);
|
|
87
|
+
targetUids.push(connection.server.copyMessage(mailbox, message).message.uid);
|
|
88
|
+
});
|
|
89
|
+
return {
|
|
90
|
+
mailbox,
|
|
91
|
+
sourceUids,
|
|
92
|
+
targetUids,
|
|
93
|
+
messages
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
{
|
|
97
|
+
const defaultExport = exports.default;
|
|
98
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
99
|
+
for (const key of Object.keys(exports)) {
|
|
100
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
101
|
+
defaultExport[key] = exports[key];
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
105
|
+
module.exports = defaultExport;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = createCommand;
|
|
4
|
+
function createCommand(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: 'CREATE expects mailbox name'
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
}, 'INVALID COMMAND', parsed, data);
|
|
16
|
+
return callback();
|
|
17
|
+
}
|
|
18
|
+
const path = parsed.attributes[0].value;
|
|
19
|
+
let mailbox;
|
|
20
|
+
try {
|
|
21
|
+
mailbox = connection.server.createMailbox(path);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
const E = err;
|
|
25
|
+
// RFC 5530 response codes, e.g. [ALREADYEXISTS]
|
|
26
|
+
connection.sendStatus(parsed, data, 'NO', E.message, E.code, 'CREATE FAILED');
|
|
27
|
+
return callback();
|
|
28
|
+
}
|
|
29
|
+
connection.server.mailboxChanged('create', mailbox.path);
|
|
30
|
+
connection.send({
|
|
31
|
+
tag: parsed.tag,
|
|
32
|
+
command: 'OK',
|
|
33
|
+
attributes: [
|
|
34
|
+
{
|
|
35
|
+
type: 'TEXT',
|
|
36
|
+
value: 'CREATE completed'
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
}, 'CREATE', parsed, data, mailbox);
|
|
40
|
+
return callback();
|
|
41
|
+
}
|
|
42
|
+
{
|
|
43
|
+
const defaultExport = exports.default;
|
|
44
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
45
|
+
for (const key of Object.keys(exports)) {
|
|
46
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
47
|
+
defaultExport[key] = exports[key];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
51
|
+
module.exports = defaultExport;
|
|
52
|
+
}
|
|
53
|
+
}
|