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,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = renameCommand;
|
|
4
|
+
function renameCommand(connection, parsed, data, callback) {
|
|
5
|
+
if (!parsed.attributes ||
|
|
6
|
+
parsed.attributes.length !== 2 ||
|
|
7
|
+
!parsed.attributes[0] ||
|
|
8
|
+
['STRING', 'LITERAL', 'ATOM'].indexOf(parsed.attributes[0].type) < 0 ||
|
|
9
|
+
!parsed.attributes[1] ||
|
|
10
|
+
['STRING', 'LITERAL', 'ATOM'].indexOf(parsed.attributes[1].type) < 0) {
|
|
11
|
+
connection.send({
|
|
12
|
+
tag: parsed.tag,
|
|
13
|
+
command: 'BAD',
|
|
14
|
+
attributes: [
|
|
15
|
+
{
|
|
16
|
+
type: 'TEXT',
|
|
17
|
+
value: 'RENAME expects mailbox source and destination names'
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}, 'INVALID COMMAND', parsed, data);
|
|
21
|
+
return callback();
|
|
22
|
+
}
|
|
23
|
+
const source = parsed.attributes[0].value;
|
|
24
|
+
const destination = parsed.attributes[1].value;
|
|
25
|
+
const server = connection.server;
|
|
26
|
+
const mailbox = server.getMailbox(source);
|
|
27
|
+
const target = server.getMailbox(destination);
|
|
28
|
+
const sendError = (code, message) => {
|
|
29
|
+
connection.sendStatus(parsed, data, 'NO', message, code, 'RENAME FAILED');
|
|
30
|
+
return callback();
|
|
31
|
+
};
|
|
32
|
+
// check everything that can be checked up front, so that a failed RENAME never loses the source
|
|
33
|
+
if (!mailbox || mailbox.flags.indexOf('\\Noselect') >= 0) {
|
|
34
|
+
return sendError('NONEXISTENT', 'Mailbox does not exist');
|
|
35
|
+
}
|
|
36
|
+
if (target && target.flags.indexOf('\\Noselect') < 0) {
|
|
37
|
+
return sendError('ALREADYEXISTS', 'Mailbox already exists');
|
|
38
|
+
}
|
|
39
|
+
const separator = server.getSeparator(mailbox);
|
|
40
|
+
if (destination.substr(0, mailbox.path.length + separator.length) === mailbox.path + separator) {
|
|
41
|
+
return sendError('CANNOT', 'Can not move a mailbox into itself');
|
|
42
|
+
}
|
|
43
|
+
const oldPath = mailbox.path;
|
|
44
|
+
let newPath;
|
|
45
|
+
try {
|
|
46
|
+
if (source.toUpperCase() === 'INBOX') {
|
|
47
|
+
// Renaming INBOX moves its messages to the new mailbox and leaves INBOX empty (RFC 3501 section 6.3.5)
|
|
48
|
+
const newMailbox = server.createMailbox(destination);
|
|
49
|
+
newPath = newMailbox.path;
|
|
50
|
+
mailbox.messages.forEach((message) => {
|
|
51
|
+
server.copyMessage(newMailbox, message);
|
|
52
|
+
});
|
|
53
|
+
connection.expungeSpecificMessages(mailbox, () => true);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
server.deleteMailbox(source, true);
|
|
57
|
+
try {
|
|
58
|
+
server.createMailbox(destination, mailbox);
|
|
59
|
+
}
|
|
60
|
+
catch (E) {
|
|
61
|
+
// put the source mailbox back where it was
|
|
62
|
+
server.createMailbox(source, mailbox);
|
|
63
|
+
server.indexFolders();
|
|
64
|
+
throw E;
|
|
65
|
+
}
|
|
66
|
+
server.indexFolders();
|
|
67
|
+
newPath = mailbox.path;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
const E = err;
|
|
72
|
+
return sendError(E.code, E.message);
|
|
73
|
+
}
|
|
74
|
+
server.mailboxChanged('rename', newPath, { oldPath });
|
|
75
|
+
connection.send({
|
|
76
|
+
tag: parsed.tag,
|
|
77
|
+
command: 'OK',
|
|
78
|
+
attributes: [
|
|
79
|
+
{
|
|
80
|
+
type: 'TEXT',
|
|
81
|
+
value: 'RENAME completed'
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
}, 'RENAME', parsed, data, mailbox);
|
|
85
|
+
return callback();
|
|
86
|
+
}
|
|
87
|
+
{
|
|
88
|
+
const defaultExport = exports.default;
|
|
89
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
90
|
+
for (const key of Object.keys(exports)) {
|
|
91
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
92
|
+
defaultExport[key] = exports[key];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
96
|
+
module.exports = defaultExport;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Callback, IMAPConnection, ParsedCommand } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Shared implementation of SEARCH and UID SEARCH
|
|
4
|
+
*
|
|
5
|
+
* @param {Boolean} isUid If true, the response lists UIDs instead of sequence numbers
|
|
6
|
+
*/
|
|
7
|
+
declare function processSearch(isUid: boolean, connection: IMAPConnection, parsed: ParsedCommand, data: string, callback: Callback): void;
|
|
8
|
+
declare const searchCommand: (connection: IMAPConnection, parsed: ParsedCommand, data: string, callback: Callback) => void;
|
|
9
|
+
export default searchCommand;
|
|
10
|
+
export { processSearch };
|
|
@@ -0,0 +1,71 @@
|
|
|
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.processSearch = processSearch;
|
|
7
|
+
const search_js_1 = __importDefault(require("./handlers/search.js"));
|
|
8
|
+
const search_js_2 = require("./handlers/search.js");
|
|
9
|
+
/**
|
|
10
|
+
* Shared implementation of SEARCH and UID SEARCH
|
|
11
|
+
*
|
|
12
|
+
* @param {Boolean} isUid If true, the response lists UIDs instead of sequence numbers
|
|
13
|
+
*/
|
|
14
|
+
function processSearch(isUid, connection, parsed, data, callback) {
|
|
15
|
+
const command = isUid ? 'UID SEARCH' : 'SEARCH';
|
|
16
|
+
if (!parsed.attributes || !parsed.attributes.length) {
|
|
17
|
+
connection.send({
|
|
18
|
+
tag: parsed.tag,
|
|
19
|
+
command: 'BAD',
|
|
20
|
+
attributes: [
|
|
21
|
+
{
|
|
22
|
+
type: 'TEXT',
|
|
23
|
+
value: command + ' expects search criteria, empty query given'
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}, command + ' FAILED', parsed, data);
|
|
27
|
+
return callback();
|
|
28
|
+
}
|
|
29
|
+
let searchResult;
|
|
30
|
+
try {
|
|
31
|
+
searchResult = (0, search_js_1.default)(connection, connection.getSessionMessages(), (0, search_js_2.criteriaValues)(parsed.attributes));
|
|
32
|
+
}
|
|
33
|
+
catch (E) {
|
|
34
|
+
(0, search_js_2.sendSearchError)(connection, parsed, data, E, command + ' FAILED');
|
|
35
|
+
return callback();
|
|
36
|
+
}
|
|
37
|
+
// RFC 3501 7.2.5: the SEARCH response is sent even when nothing matched. Plugins get the
|
|
38
|
+
// search result, so they can extend the response or replace it (e.g. ESEARCH)
|
|
39
|
+
connection.send({
|
|
40
|
+
tag: '*',
|
|
41
|
+
command: 'SEARCH',
|
|
42
|
+
attributes: searchResult.list.map(item => {
|
|
43
|
+
return isUid ? item.uid : searchResult.numbers[item.uid];
|
|
44
|
+
})
|
|
45
|
+
}, command, parsed, data, searchResult);
|
|
46
|
+
connection.send({
|
|
47
|
+
tag: parsed.tag,
|
|
48
|
+
command: 'OK',
|
|
49
|
+
attributes: [
|
|
50
|
+
{
|
|
51
|
+
type: 'TEXT',
|
|
52
|
+
value: command + ' completed'
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
}, command, parsed, data);
|
|
56
|
+
return callback();
|
|
57
|
+
}
|
|
58
|
+
const searchCommand = (connection, parsed, data, callback) => processSearch(false, connection, parsed, data, callback);
|
|
59
|
+
exports.default = searchCommand;
|
|
60
|
+
{
|
|
61
|
+
const defaultExport = exports.default;
|
|
62
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
63
|
+
for (const key of Object.keys(exports)) {
|
|
64
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
65
|
+
defaultExport[key] = exports[key];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
69
|
+
module.exports = defaultExport;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Callback, IMAPConnection, ParsedCommand } from '../types.js';
|
|
2
|
+
export default function selectCommand(connection: IMAPConnection, parsed: ParsedCommand, data: string, callback: Callback): void;
|
|
3
|
+
/**
|
|
4
|
+
* Starts a SELECT or EXAMINE, also one that is going to fail: ENABLE is not allowed once a mailbox has been selected
|
|
5
|
+
* (RFC 5161 section 3.1), and the selected mailbox gets closed. CLOSED marks where the responses for the new mailbox
|
|
6
|
+
* start (RFC 7162 section 3.2.11, RFC 9051 sections 6.3.2 and 7.1)
|
|
7
|
+
*
|
|
8
|
+
* @param {Object} connection IMAP connection
|
|
9
|
+
* @param {Object} parsed Parsed command
|
|
10
|
+
* @param {String} data Raw command
|
|
11
|
+
*/
|
|
12
|
+
declare function beginSelect(connection: IMAPConnection, parsed: ParsedCommand, data: string): void;
|
|
13
|
+
/**
|
|
14
|
+
* Shared implementation of SELECT and EXAMINE
|
|
15
|
+
*
|
|
16
|
+
* @param {Boolean} readOnly If true, the mailbox is opened read-only (EXAMINE)
|
|
17
|
+
*/
|
|
18
|
+
declare function selectMailbox(connection: IMAPConnection, parsed: ParsedCommand, data: string, callback: Callback, readOnly: boolean): void;
|
|
19
|
+
export { selectMailbox, beginSelect };
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = selectCommand;
|
|
4
|
+
exports.selectMailbox = selectMailbox;
|
|
5
|
+
exports.beginSelect = beginSelect;
|
|
6
|
+
function selectCommand(connection, parsed, data, callback) {
|
|
7
|
+
return selectMailbox(connection, parsed, data, callback, false);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Starts a SELECT or EXAMINE, also one that is going to fail: ENABLE is not allowed once a mailbox has been selected
|
|
11
|
+
* (RFC 5161 section 3.1), and the selected mailbox gets closed. CLOSED marks where the responses for the new mailbox
|
|
12
|
+
* start (RFC 7162 section 3.2.11, RFC 9051 sections 6.3.2 and 7.1)
|
|
13
|
+
*
|
|
14
|
+
* @param {Object} connection IMAP connection
|
|
15
|
+
* @param {Object} parsed Parsed command
|
|
16
|
+
* @param {String} data Raw command
|
|
17
|
+
*/
|
|
18
|
+
function beginSelect(connection, parsed, data) {
|
|
19
|
+
connection.everSelected = true;
|
|
20
|
+
if (connection.state === 'Selected' && connection.server.closedChecks.some(check => check(connection))) {
|
|
21
|
+
connection.send({
|
|
22
|
+
tag: '*',
|
|
23
|
+
command: 'OK',
|
|
24
|
+
attributes: [
|
|
25
|
+
{ type: 'SECTION', section: [{ type: 'ATOM', value: 'CLOSED' }] },
|
|
26
|
+
{ type: 'TEXT', value: 'Previous mailbox closed' }
|
|
27
|
+
]
|
|
28
|
+
}, 'CLOSED', parsed, data);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Shared implementation of SELECT and EXAMINE
|
|
33
|
+
*
|
|
34
|
+
* @param {Boolean} readOnly If true, the mailbox is opened read-only (EXAMINE)
|
|
35
|
+
*/
|
|
36
|
+
function selectMailbox(connection, parsed, data, callback, readOnly) {
|
|
37
|
+
const command = readOnly ? 'EXAMINE' : 'SELECT';
|
|
38
|
+
if (!parsed.attributes || parsed.attributes.length !== 1 || !parsed.attributes[0] || ['STRING', 'LITERAL', 'ATOM'].indexOf(parsed.attributes[0].type) < 0) {
|
|
39
|
+
connection.send({
|
|
40
|
+
tag: parsed.tag,
|
|
41
|
+
command: 'BAD',
|
|
42
|
+
attributes: [
|
|
43
|
+
{
|
|
44
|
+
type: 'TEXT',
|
|
45
|
+
value: command + ' expects 1 mailbox argument'
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}, 'INVALID COMMAND', parsed, data);
|
|
49
|
+
return callback();
|
|
50
|
+
}
|
|
51
|
+
const path = parsed.attributes[0].value;
|
|
52
|
+
beginSelect(connection, parsed, data);
|
|
53
|
+
const mailbox = connection.server.getMailbox(path);
|
|
54
|
+
if (!mailbox || mailbox.flags.indexOf('\\Noselect') >= 0) {
|
|
55
|
+
// a failed SELECT leaves no mailbox selected (RFC 3501 section 6.3.1)
|
|
56
|
+
connection.closeMailbox();
|
|
57
|
+
connection.sendStatus(parsed, data, 'NO', 'Mailbox does not exist', 'NONEXISTENT', command + ' FAILED');
|
|
58
|
+
return callback();
|
|
59
|
+
}
|
|
60
|
+
connection.state = 'Selected';
|
|
61
|
+
connection.selectedMailbox = mailbox;
|
|
62
|
+
connection.readOnly = readOnly;
|
|
63
|
+
connection.notificationQueue = [];
|
|
64
|
+
// \Recent is a session flag: a read-write session takes over the messages
|
|
65
|
+
// that no other session has seen yet (RFC 3501 section 2.3.2)
|
|
66
|
+
const recent = new Set();
|
|
67
|
+
connection.recent = recent;
|
|
68
|
+
mailbox.messages.forEach((message) => {
|
|
69
|
+
if (message.recent) {
|
|
70
|
+
recent.add(message);
|
|
71
|
+
if (!readOnly) {
|
|
72
|
+
delete message.recent;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
const status = connection.server.getStatus(mailbox);
|
|
77
|
+
const permanentFlags = status.permanentFlags.map((flag) => {
|
|
78
|
+
return {
|
|
79
|
+
type: 'ATOM',
|
|
80
|
+
value: flag
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
connection.send({
|
|
84
|
+
tag: '*',
|
|
85
|
+
command: 'FLAGS',
|
|
86
|
+
attributes: [permanentFlags]
|
|
87
|
+
}, command + ' FLAGS', parsed, data);
|
|
88
|
+
if (mailbox.allowPermanentFlags) {
|
|
89
|
+
permanentFlags.push({
|
|
90
|
+
type: 'TEXT',
|
|
91
|
+
value: '\\*'
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
connection.send({
|
|
95
|
+
tag: '*',
|
|
96
|
+
command: 'OK',
|
|
97
|
+
attributes: [
|
|
98
|
+
{
|
|
99
|
+
type: 'SECTION',
|
|
100
|
+
section: [
|
|
101
|
+
{
|
|
102
|
+
type: 'ATOM',
|
|
103
|
+
value: 'PERMANENTFLAGS'
|
|
104
|
+
},
|
|
105
|
+
// nothing can be changed in a read-only mailbox
|
|
106
|
+
readOnly ? [] : permanentFlags
|
|
107
|
+
]
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
type: 'TEXT',
|
|
111
|
+
value: readOnly ? 'No permanent flags permitted' : 'Flags permitted'
|
|
112
|
+
}
|
|
113
|
+
]
|
|
114
|
+
}, command + ' PERMANENTFLAGS', parsed, data);
|
|
115
|
+
connection.send({
|
|
116
|
+
tag: '*',
|
|
117
|
+
attributes: [
|
|
118
|
+
mailbox.messages.length,
|
|
119
|
+
{
|
|
120
|
+
type: 'ATOM',
|
|
121
|
+
value: 'EXISTS'
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
}, command + ' EXISTS', parsed, data);
|
|
125
|
+
connection.send({
|
|
126
|
+
tag: '*',
|
|
127
|
+
attributes: [
|
|
128
|
+
connection.recent.size,
|
|
129
|
+
{
|
|
130
|
+
type: 'ATOM',
|
|
131
|
+
value: 'RECENT'
|
|
132
|
+
}
|
|
133
|
+
]
|
|
134
|
+
}, command + ' RECENT', parsed, data);
|
|
135
|
+
const firstUnseen = mailbox.messages.findIndex((message) => message.flags.indexOf('\\Seen') < 0);
|
|
136
|
+
if (firstUnseen >= 0) {
|
|
137
|
+
connection.send({
|
|
138
|
+
tag: '*',
|
|
139
|
+
command: 'OK',
|
|
140
|
+
attributes: [
|
|
141
|
+
{
|
|
142
|
+
type: 'SECTION',
|
|
143
|
+
section: [
|
|
144
|
+
{
|
|
145
|
+
type: 'ATOM',
|
|
146
|
+
value: 'UNSEEN'
|
|
147
|
+
},
|
|
148
|
+
firstUnseen + 1
|
|
149
|
+
]
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'TEXT',
|
|
153
|
+
value: 'First unseen message'
|
|
154
|
+
}
|
|
155
|
+
]
|
|
156
|
+
}, command + ' UNSEEN', parsed, data);
|
|
157
|
+
}
|
|
158
|
+
connection.send({
|
|
159
|
+
tag: '*',
|
|
160
|
+
command: 'OK',
|
|
161
|
+
attributes: [
|
|
162
|
+
{
|
|
163
|
+
type: 'SECTION',
|
|
164
|
+
section: [
|
|
165
|
+
{
|
|
166
|
+
type: 'ATOM',
|
|
167
|
+
value: 'UIDVALIDITY'
|
|
168
|
+
},
|
|
169
|
+
mailbox.uidvalidity
|
|
170
|
+
]
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
type: 'TEXT',
|
|
174
|
+
value: 'UIDs valid'
|
|
175
|
+
}
|
|
176
|
+
]
|
|
177
|
+
}, command + ' UIDVALIDITY', parsed, data);
|
|
178
|
+
connection.send({
|
|
179
|
+
tag: '*',
|
|
180
|
+
command: 'OK',
|
|
181
|
+
attributes: [
|
|
182
|
+
{
|
|
183
|
+
type: 'SECTION',
|
|
184
|
+
section: [
|
|
185
|
+
{
|
|
186
|
+
type: 'ATOM',
|
|
187
|
+
value: 'UIDNEXT'
|
|
188
|
+
},
|
|
189
|
+
mailbox.uidnext
|
|
190
|
+
]
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: 'TEXT',
|
|
194
|
+
value: 'Predicted next UID'
|
|
195
|
+
}
|
|
196
|
+
]
|
|
197
|
+
}, command + ' UIDNEXT', parsed, data);
|
|
198
|
+
connection.send({
|
|
199
|
+
tag: parsed.tag,
|
|
200
|
+
command: 'OK',
|
|
201
|
+
attributes: [
|
|
202
|
+
{
|
|
203
|
+
type: 'SECTION',
|
|
204
|
+
section: [
|
|
205
|
+
{
|
|
206
|
+
type: 'ATOM',
|
|
207
|
+
value: readOnly ? 'READ-ONLY' : 'READ-WRITE'
|
|
208
|
+
}
|
|
209
|
+
]
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
type: 'TEXT',
|
|
213
|
+
value: 'Completed'
|
|
214
|
+
}
|
|
215
|
+
]
|
|
216
|
+
}, command, parsed, data);
|
|
217
|
+
return callback();
|
|
218
|
+
}
|
|
219
|
+
{
|
|
220
|
+
const defaultExport = exports.default;
|
|
221
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
222
|
+
for (const key of Object.keys(exports)) {
|
|
223
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
224
|
+
defaultExport[key] = exports[key];
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
228
|
+
module.exports = defaultExport;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = statusCommand;
|
|
4
|
+
const status_js_1 = require("./handlers/status.js");
|
|
5
|
+
function statusCommand(connection, parsed, data, callback) {
|
|
6
|
+
if (!parsed.attributes ||
|
|
7
|
+
parsed.attributes.length !== 2 ||
|
|
8
|
+
!parsed.attributes[0] ||
|
|
9
|
+
['STRING', 'LITERAL', 'ATOM'].indexOf(parsed.attributes[0].type) < 0 ||
|
|
10
|
+
!Array.isArray(parsed.attributes[1]) ||
|
|
11
|
+
!parsed.attributes[1].length) {
|
|
12
|
+
connection.send({
|
|
13
|
+
tag: parsed.tag,
|
|
14
|
+
command: 'BAD',
|
|
15
|
+
attributes: [
|
|
16
|
+
{
|
|
17
|
+
type: 'TEXT',
|
|
18
|
+
value: 'STATUS expects mailbox argument and a list of status items'
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}, 'INVALID COMMAND', parsed, data);
|
|
22
|
+
return callback();
|
|
23
|
+
}
|
|
24
|
+
const path = parsed.attributes[0].value;
|
|
25
|
+
// invalid arguments are BAD even for a mailbox that does not exist
|
|
26
|
+
let items;
|
|
27
|
+
try {
|
|
28
|
+
items = (0, status_js_1.parseStatusItems)(connection.server, parsed.attributes[1], connection);
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
connection.sendStatus(parsed, data, 'BAD', err.message, false, 'STATUS FAILED');
|
|
32
|
+
return callback();
|
|
33
|
+
}
|
|
34
|
+
const mailbox = connection.server.getMailbox(path);
|
|
35
|
+
if (!mailbox || mailbox.flags.indexOf('\\Noselect') >= 0) {
|
|
36
|
+
connection.sendStatus(parsed, data, 'NO', 'Mailbox does not exist', 'NONEXISTENT', 'STATUS FAILED');
|
|
37
|
+
return callback();
|
|
38
|
+
}
|
|
39
|
+
(0, status_js_1.sendStatus)(connection, path, mailbox, items, parsed, data);
|
|
40
|
+
// RFC 3501 section 6.3.10 and RFC 9051 section 6.3.11: STATUS SHOULD NOT be used on the selected mailbox. It
|
|
41
|
+
// works, but the client gets the CLIENTBUG response code (RFC 5530 section 3) like RFC 9051 section 7.1 shows
|
|
42
|
+
const clientBug = connection.state === 'Selected' && connection.selectedMailbox === mailbox;
|
|
43
|
+
connection.sendStatus(parsed, data, 'OK', clientBug ? 'Status completed, STATUS SHOULD NOT be used on the selected mailbox' : 'Status completed', clientBug && 'CLIENTBUG');
|
|
44
|
+
return callback();
|
|
45
|
+
}
|
|
46
|
+
{
|
|
47
|
+
const defaultExport = exports.default;
|
|
48
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
49
|
+
for (const key of Object.keys(exports)) {
|
|
50
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
51
|
+
defaultExport[key] = exports[key];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
55
|
+
module.exports = defaultExport;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Callback, IMAPConnection, ParsedCommand } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Shared implementation of STORE and UID STORE
|
|
4
|
+
*
|
|
5
|
+
* @param {Boolean} isUid If true, the sequence set lists UIDs
|
|
6
|
+
*/
|
|
7
|
+
declare function processStore(isUid: boolean, connection: IMAPConnection, parsed: ParsedCommand, data: string, callback: Callback): void;
|
|
8
|
+
declare const storeCommand: (connection: IMAPConnection, parsed: ParsedCommand, data: string, callback: Callback) => void;
|
|
9
|
+
export default storeCommand;
|
|
10
|
+
export { processStore };
|
|
@@ -0,0 +1,134 @@
|
|
|
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.processStore = processStore;
|
|
7
|
+
const store_js_1 = __importDefault(require("./handlers/store.js"));
|
|
8
|
+
const arguments_js_1 = require("../arguments.js");
|
|
9
|
+
/**
|
|
10
|
+
* Returns the handler of a STORE data item, plugins first
|
|
11
|
+
*
|
|
12
|
+
* @param {Object} connection IMAP connection
|
|
13
|
+
* @param {String} name Data item name, e.g. "+FLAGS.SILENT"
|
|
14
|
+
* @return {Function|undefined} handler
|
|
15
|
+
*/
|
|
16
|
+
function getStoreHandler(connection, name) {
|
|
17
|
+
name = String(name).toUpperCase();
|
|
18
|
+
return connection.server.storeHandlers[name] || store_js_1.default[name];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Shared implementation of STORE and UID STORE
|
|
22
|
+
*
|
|
23
|
+
* @param {Boolean} isUid If true, the sequence set lists UIDs
|
|
24
|
+
*/
|
|
25
|
+
function processStore(isUid, connection, parsed, data, callback) {
|
|
26
|
+
const command = isUid ? 'UID STORE' : 'STORE';
|
|
27
|
+
// a store handler with `astringValues` takes astrings, like the labels of X-GM-LABELS: these can be literals,
|
|
28
|
+
// and NIL is a name there. Flags are atoms (RFC 3501 section 9: flag-list)
|
|
29
|
+
const itemArgument = parsed.attributes && parsed.attributes[1];
|
|
30
|
+
const itemHandler = (0, arguments_js_1.isAtom)(itemArgument) && getStoreHandler(connection, itemArgument.value);
|
|
31
|
+
const astringValues = !!(itemHandler && itemHandler.astringValues);
|
|
32
|
+
const valueTypes = astringValues ? ['ATOM', 'STRING', 'LITERAL'] : ['ATOM', 'STRING'];
|
|
33
|
+
if (astringValues) {
|
|
34
|
+
(0, arguments_js_1.restoreNilAtoms)(parsed, data, (path) => path[0] === 2);
|
|
35
|
+
}
|
|
36
|
+
if (!parsed.attributes ||
|
|
37
|
+
parsed.attributes.length !== 3 ||
|
|
38
|
+
!parsed.attributes[0] ||
|
|
39
|
+
['ATOM', 'SEQUENCE'].indexOf(parsed.attributes[0].type) < 0 ||
|
|
40
|
+
!parsed.attributes[1] ||
|
|
41
|
+
['ATOM'].indexOf(parsed.attributes[1].type) < 0 ||
|
|
42
|
+
!parsed.attributes[2] ||
|
|
43
|
+
!(valueTypes.indexOf(parsed.attributes[2].type) >= 0 || Array.isArray(parsed.attributes[2]))) {
|
|
44
|
+
connection.send({
|
|
45
|
+
tag: parsed.tag,
|
|
46
|
+
command: 'BAD',
|
|
47
|
+
attributes: [
|
|
48
|
+
{
|
|
49
|
+
type: 'TEXT',
|
|
50
|
+
value: command + ' expects sequence set, item name and item value'
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
}, 'INVALID COMMAND', parsed, data);
|
|
54
|
+
return callback();
|
|
55
|
+
}
|
|
56
|
+
// A mailbox opened with EXAMINE is read-only (RFC 3501 6.3.2), so its flags can not be changed
|
|
57
|
+
if (connection.refuseReadOnly(parsed, data, command + ' FAILED')) {
|
|
58
|
+
return callback();
|
|
59
|
+
}
|
|
60
|
+
const range = connection.limitRange(parsed, connection.getCommandRange(parsed.attributes[0].value, isUid));
|
|
61
|
+
const itemName = (parsed.attributes[1].value || '').toUpperCase();
|
|
62
|
+
const itemValue = [].concat(parsed.attributes[2] || []);
|
|
63
|
+
const affected = [];
|
|
64
|
+
// if the sequence set includes a message that another session expunged without this session being told yet
|
|
65
|
+
let hasExpunged = false;
|
|
66
|
+
try {
|
|
67
|
+
itemValue.forEach((item, i) => {
|
|
68
|
+
if (!item || valueTypes.indexOf(item.type) < 0) {
|
|
69
|
+
throw new Error('Invalid item value #' + (i + 1));
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
const handler = itemHandler || getStoreHandler(connection, itemName);
|
|
73
|
+
if (!handler) {
|
|
74
|
+
throw new Error('Invalid STORE argument ' + itemName);
|
|
75
|
+
}
|
|
76
|
+
range.forEach(rangeMessage => {
|
|
77
|
+
if (rangeMessage[1].ghost) {
|
|
78
|
+
// RFC 2180 section 4.2: the flags of an expunged message are not stored
|
|
79
|
+
hasExpunged = true;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
for (let i = 0, len = connection.server.storeFilters.length; i < len; i++) {
|
|
83
|
+
if (!connection.server.storeFilters[i](connection, rangeMessage[1], parsed, rangeMessage[0])) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
handler(connection, rangeMessage[1], itemValue, rangeMessage[0], parsed, data);
|
|
88
|
+
affected.push(rangeMessage[1]);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
const E = err;
|
|
93
|
+
connection.send({
|
|
94
|
+
tag: parsed.tag,
|
|
95
|
+
command: 'BAD',
|
|
96
|
+
attributes: [
|
|
97
|
+
{
|
|
98
|
+
type: 'TEXT',
|
|
99
|
+
value: E.message
|
|
100
|
+
}
|
|
101
|
+
]
|
|
102
|
+
}, command + ' FAILED', parsed, data);
|
|
103
|
+
return callback();
|
|
104
|
+
}
|
|
105
|
+
// RFC 2180 sections 4.2.2 and 4.2.3: when the set includes expunged messages, the others are stored and get
|
|
106
|
+
// their FETCH responses, and the tagged NO tells the client to issue NOOP. With .SILENT the result is OK as
|
|
107
|
+
// long as the other messages were stored (section 4.2.1)
|
|
108
|
+
const failed = hasExpunged && !/\.SILENT$/.test(itemName);
|
|
109
|
+
connection.send({
|
|
110
|
+
tag: parsed.tag,
|
|
111
|
+
command: failed ? 'NO' : 'OK',
|
|
112
|
+
attributes: [].concat(failed ? { type: 'SECTION', section: [{ type: 'ATOM', value: 'EXPUNGEISSUED' }] } : [], {
|
|
113
|
+
type: 'TEXT',
|
|
114
|
+
value: failed ? 'Some of the messages no longer exist' : command + ' completed'
|
|
115
|
+
})
|
|
116
|
+
}, command + (failed ? ' FAILED' : ' COMPLETE'), parsed, data, affected);
|
|
117
|
+
// other sessions that have the mailbox selected learn about the new flags (RFC 3501 section 5.2)
|
|
118
|
+
connection.notifyFlagChanges(affected);
|
|
119
|
+
callback();
|
|
120
|
+
}
|
|
121
|
+
const storeCommand = (connection, parsed, data, callback) => processStore(false, connection, parsed, data, callback);
|
|
122
|
+
exports.default = storeCommand;
|
|
123
|
+
{
|
|
124
|
+
const defaultExport = exports.default;
|
|
125
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
126
|
+
for (const key of Object.keys(exports)) {
|
|
127
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
128
|
+
defaultExport[key] = exports[key];
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
132
|
+
module.exports = defaultExport;
|
|
133
|
+
}
|
|
134
|
+
}
|