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