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,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Built-in plugins by name (the file name without extension), see load-plugins.ts
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.plugins = void 0;
|
|
8
|
+
const acl_js_1 = __importDefault(require("./acl.js"));
|
|
9
|
+
const appendlimit_js_1 = __importDefault(require("./appendlimit.js"));
|
|
10
|
+
const auth_plain_js_1 = __importDefault(require("./auth-plain.js"));
|
|
11
|
+
const binary_js_1 = __importDefault(require("./binary.js"));
|
|
12
|
+
const catenate_js_1 = __importDefault(require("./catenate.js"));
|
|
13
|
+
const compress_js_1 = __importDefault(require("./compress.js"));
|
|
14
|
+
const condstore_js_1 = __importDefault(require("./condstore.js"));
|
|
15
|
+
const context_search_js_1 = __importDefault(require("./context-search.js"));
|
|
16
|
+
const context_sort_js_1 = __importDefault(require("./context-sort.js"));
|
|
17
|
+
const create_special_use_js_1 = __importDefault(require("./create-special-use.js"));
|
|
18
|
+
const enable_js_1 = __importDefault(require("./enable.js"));
|
|
19
|
+
const esearch_js_1 = __importDefault(require("./esearch.js"));
|
|
20
|
+
const esort_js_1 = __importDefault(require("./esort.js"));
|
|
21
|
+
const id_js_1 = __importDefault(require("./id.js"));
|
|
22
|
+
const idle_js_1 = __importDefault(require("./idle.js"));
|
|
23
|
+
const imap4rev2_js_1 = __importDefault(require("./imap4rev2.js"));
|
|
24
|
+
const list_extended_js_1 = __importDefault(require("./list-extended.js"));
|
|
25
|
+
const list_status_js_1 = __importDefault(require("./list-status.js"));
|
|
26
|
+
const literalminus_js_1 = __importDefault(require("./literalminus.js"));
|
|
27
|
+
const literalplus_js_1 = __importDefault(require("./literalplus.js"));
|
|
28
|
+
const logindisabled_js_1 = __importDefault(require("./logindisabled.js"));
|
|
29
|
+
const messagelimit_js_1 = __importDefault(require("./messagelimit.js"));
|
|
30
|
+
const metadata_js_1 = __importDefault(require("./metadata.js"));
|
|
31
|
+
const metadata_server_js_1 = __importDefault(require("./metadata-server.js"));
|
|
32
|
+
const move_js_1 = __importDefault(require("./move.js"));
|
|
33
|
+
const multiappend_js_1 = __importDefault(require("./multiappend.js"));
|
|
34
|
+
const multisearch_js_1 = __importDefault(require("./multisearch.js"));
|
|
35
|
+
const namespace_js_1 = __importDefault(require("./namespace.js"));
|
|
36
|
+
const notify_js_1 = __importDefault(require("./notify.js"));
|
|
37
|
+
const oauthbearer_js_1 = __importDefault(require("./oauthbearer.js"));
|
|
38
|
+
const objectid_js_1 = __importDefault(require("./objectid.js"));
|
|
39
|
+
const partial_js_1 = __importDefault(require("./partial.js"));
|
|
40
|
+
const preview_js_1 = __importDefault(require("./preview.js"));
|
|
41
|
+
const qresync_js_1 = __importDefault(require("./qresync.js"));
|
|
42
|
+
const quota_js_1 = __importDefault(require("./quota.js"));
|
|
43
|
+
const replace_js_1 = __importDefault(require("./replace.js"));
|
|
44
|
+
const sasl_ir_js_1 = __importDefault(require("./sasl-ir.js"));
|
|
45
|
+
const savedate_js_1 = __importDefault(require("./savedate.js"));
|
|
46
|
+
const savelimit_js_1 = __importDefault(require("./savelimit.js"));
|
|
47
|
+
const searchres_js_1 = __importDefault(require("./searchres.js"));
|
|
48
|
+
const sort_js_1 = __importDefault(require("./sort.js"));
|
|
49
|
+
const sort_display_js_1 = __importDefault(require("./sort-display.js"));
|
|
50
|
+
const special_use_js_1 = __importDefault(require("./special-use.js"));
|
|
51
|
+
const starttls_js_1 = __importDefault(require("./starttls.js"));
|
|
52
|
+
const status_size_js_1 = __importDefault(require("./status-size.js"));
|
|
53
|
+
const thread_orderedsubject_js_1 = __importDefault(require("./thread-orderedsubject.js"));
|
|
54
|
+
const thread_references_js_1 = __importDefault(require("./thread-references.js"));
|
|
55
|
+
const uidonly_js_1 = __importDefault(require("./uidonly.js"));
|
|
56
|
+
const uidplus_js_1 = __importDefault(require("./uidplus.js"));
|
|
57
|
+
const unauthenticate_js_1 = __importDefault(require("./unauthenticate.js"));
|
|
58
|
+
const unselect_js_1 = __importDefault(require("./unselect.js"));
|
|
59
|
+
const utf8_accept_js_1 = __importDefault(require("./utf8-accept.js"));
|
|
60
|
+
const x_gm_ext_1_js_1 = __importDefault(require("./x-gm-ext-1.js"));
|
|
61
|
+
const xoauth2_js_1 = __importDefault(require("./xoauth2.js"));
|
|
62
|
+
const xtoybird_js_1 = __importDefault(require("./xtoybird.js"));
|
|
63
|
+
exports.plugins = {
|
|
64
|
+
acl: acl_js_1.default,
|
|
65
|
+
appendlimit: appendlimit_js_1.default,
|
|
66
|
+
'auth-plain': auth_plain_js_1.default,
|
|
67
|
+
binary: binary_js_1.default,
|
|
68
|
+
catenate: catenate_js_1.default,
|
|
69
|
+
compress: compress_js_1.default,
|
|
70
|
+
condstore: condstore_js_1.default,
|
|
71
|
+
'context-search': context_search_js_1.default,
|
|
72
|
+
'context-sort': context_sort_js_1.default,
|
|
73
|
+
'create-special-use': create_special_use_js_1.default,
|
|
74
|
+
enable: enable_js_1.default,
|
|
75
|
+
esearch: esearch_js_1.default,
|
|
76
|
+
esort: esort_js_1.default,
|
|
77
|
+
id: id_js_1.default,
|
|
78
|
+
idle: idle_js_1.default,
|
|
79
|
+
imap4rev2: imap4rev2_js_1.default,
|
|
80
|
+
'list-extended': list_extended_js_1.default,
|
|
81
|
+
'list-status': list_status_js_1.default,
|
|
82
|
+
literalminus: literalminus_js_1.default,
|
|
83
|
+
literalplus: literalplus_js_1.default,
|
|
84
|
+
logindisabled: logindisabled_js_1.default,
|
|
85
|
+
messagelimit: messagelimit_js_1.default,
|
|
86
|
+
metadata: metadata_js_1.default,
|
|
87
|
+
'metadata-server': metadata_server_js_1.default,
|
|
88
|
+
move: move_js_1.default,
|
|
89
|
+
multiappend: multiappend_js_1.default,
|
|
90
|
+
multisearch: multisearch_js_1.default,
|
|
91
|
+
namespace: namespace_js_1.default,
|
|
92
|
+
notify: notify_js_1.default,
|
|
93
|
+
oauthbearer: oauthbearer_js_1.default,
|
|
94
|
+
objectid: objectid_js_1.default,
|
|
95
|
+
partial: partial_js_1.default,
|
|
96
|
+
preview: preview_js_1.default,
|
|
97
|
+
qresync: qresync_js_1.default,
|
|
98
|
+
quota: quota_js_1.default,
|
|
99
|
+
replace: replace_js_1.default,
|
|
100
|
+
'sasl-ir': sasl_ir_js_1.default,
|
|
101
|
+
savedate: savedate_js_1.default,
|
|
102
|
+
savelimit: savelimit_js_1.default,
|
|
103
|
+
searchres: searchres_js_1.default,
|
|
104
|
+
sort: sort_js_1.default,
|
|
105
|
+
'sort-display': sort_display_js_1.default,
|
|
106
|
+
'special-use': special_use_js_1.default,
|
|
107
|
+
starttls: starttls_js_1.default,
|
|
108
|
+
'status-size': status_size_js_1.default,
|
|
109
|
+
'thread-orderedsubject': thread_orderedsubject_js_1.default,
|
|
110
|
+
'thread-references': thread_references_js_1.default,
|
|
111
|
+
uidonly: uidonly_js_1.default,
|
|
112
|
+
uidplus: uidplus_js_1.default,
|
|
113
|
+
unauthenticate: unauthenticate_js_1.default,
|
|
114
|
+
unselect: unselect_js_1.default,
|
|
115
|
+
'utf8-accept': utf8_accept_js_1.default,
|
|
116
|
+
'x-gm-ext-1': x_gm_ext_1_js_1.default,
|
|
117
|
+
xoauth2: xoauth2_js_1.default,
|
|
118
|
+
xtoybird: xtoybird_js_1.default
|
|
119
|
+
};
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = listExtendedPlugin;
|
|
4
|
+
const node_util_1 = require("node:util");
|
|
5
|
+
const list_extensions_js_1 = require("../list-extensions.js");
|
|
6
|
+
/**
|
|
7
|
+
* @help Adds LIST-EXTENDED [RFC5258] capability: selection options
|
|
8
|
+
* @help SUBSCRIBED, REMOTE and RECURSIVEMATCH, return options SUBSCRIBED
|
|
9
|
+
* @help and CHILDREN, multiple mailbox patterns and CHILDINFO.
|
|
10
|
+
* @help \Noselect mailboxes are listed as \NonExistent
|
|
11
|
+
*/
|
|
12
|
+
const arguments_js_1 = require("../arguments.js");
|
|
13
|
+
/**
|
|
14
|
+
* Checks if a LIST command uses the extended syntax (RFC 5258 section 1): selection options before
|
|
15
|
+
* the reference, a list of patterns, or more than 2 arguments (return options)
|
|
16
|
+
*
|
|
17
|
+
* @param {Array} args Command arguments
|
|
18
|
+
* @return {Boolean} true for an extended LIST command
|
|
19
|
+
*/
|
|
20
|
+
const isExtended = (args) => Array.isArray(args[0]) || Array.isArray(args[1]) || args.length > 2;
|
|
21
|
+
function listExtendedPlugin(server) {
|
|
22
|
+
const extensions = (0, list_extensions_js_1.getListExtensions)(server);
|
|
23
|
+
if (extensions.enabled) {
|
|
24
|
+
// already loaded by LIST-STATUS
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
extensions.enabled = true;
|
|
28
|
+
server.registerCapability('LIST-EXTENDED');
|
|
29
|
+
// RFC 5258 section 3.1. There are no remote mailboxes, so REMOTE changes nothing
|
|
30
|
+
extensions.selectionOptions.SUBSCRIBED = {
|
|
31
|
+
type: 'base',
|
|
32
|
+
returnOption: 'SUBSCRIBED',
|
|
33
|
+
includeNonExistent: true,
|
|
34
|
+
match: (folder) => !!folder.subscribed
|
|
35
|
+
};
|
|
36
|
+
extensions.selectionOptions.REMOTE = { type: 'independent' };
|
|
37
|
+
extensions.selectionOptions.RECURSIVEMATCH = { type: 'modifier' };
|
|
38
|
+
// RFC 5258 section 3.2. Children attributes are always returned, so CHILDREN needs no handling
|
|
39
|
+
extensions.returnOptions.SUBSCRIBED = {};
|
|
40
|
+
extensions.returnOptions.CHILDREN = {};
|
|
41
|
+
/**
|
|
42
|
+
* Parses selection or return options (RFC 5258 section 6, option-extension = tag [SP option-value])
|
|
43
|
+
*
|
|
44
|
+
* @param {Array} list Parsed option list
|
|
45
|
+
* @param {Object} registry Known options
|
|
46
|
+
* @param {String} kind "selection" or "return", for error messages
|
|
47
|
+
* @param {Object} connection IMAPConnection instance
|
|
48
|
+
* @return {Map} option name to value (true for options without a value)
|
|
49
|
+
*/
|
|
50
|
+
const parseOptions = (list, registry, kind, connection) => {
|
|
51
|
+
const options = new Map();
|
|
52
|
+
for (let i = 0; i < list.length; i++) {
|
|
53
|
+
const item = list[i];
|
|
54
|
+
if (!item || item.type !== 'ATOM') {
|
|
55
|
+
throw new Error('Invalid ' + kind + ' option');
|
|
56
|
+
}
|
|
57
|
+
const name = item.value.toUpperCase();
|
|
58
|
+
// only return options take a value (parse)
|
|
59
|
+
const option = registry[name];
|
|
60
|
+
if (!option) {
|
|
61
|
+
// RFC 5258 section 3: "A server MUST respond to options it does not recognize with a BAD response"
|
|
62
|
+
throw new Error('Unknown ' + kind + ' option ' + name);
|
|
63
|
+
}
|
|
64
|
+
let value = true;
|
|
65
|
+
if (option.parse) {
|
|
66
|
+
if (!Array.isArray(list[i + 1])) {
|
|
67
|
+
throw new Error(name + ' ' + kind + ' option requires a value');
|
|
68
|
+
}
|
|
69
|
+
value = option.parse(list[++i], connection);
|
|
70
|
+
}
|
|
71
|
+
else if (Array.isArray(list[i + 1])) {
|
|
72
|
+
throw new Error(name + ' ' + kind + ' option takes no value');
|
|
73
|
+
}
|
|
74
|
+
// RFC 5258 section 3: a repeated option counts once, so it can not have different values
|
|
75
|
+
if (options.has(name) && !(0, node_util_1.isDeepStrictEqual)(options.get(name), value)) {
|
|
76
|
+
throw new Error(name + ' ' + kind + ' option is repeated with a different value');
|
|
77
|
+
}
|
|
78
|
+
options.set(name, value);
|
|
79
|
+
}
|
|
80
|
+
return options;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Parses the arguments of an extended LIST command:
|
|
84
|
+
* list = "LIST" [SP list-select-opts] SP mailbox SP mbox-or-pat [SP list-return-opts]
|
|
85
|
+
*
|
|
86
|
+
* @param {Array} args Command arguments
|
|
87
|
+
* @param {Object} connection IMAPConnection instance
|
|
88
|
+
* @return {Object} `{ selection, reference, patterns, returns }`
|
|
89
|
+
*/
|
|
90
|
+
const parseArguments = (args, connection) => {
|
|
91
|
+
let selection = new Map();
|
|
92
|
+
let returns = new Map();
|
|
93
|
+
let pos = 0;
|
|
94
|
+
if (Array.isArray(args[0])) {
|
|
95
|
+
selection = parseOptions(args[0], extensions.selectionOptions, 'selection', connection);
|
|
96
|
+
pos++;
|
|
97
|
+
}
|
|
98
|
+
const reference = args[pos];
|
|
99
|
+
let patterns = args[pos + 1];
|
|
100
|
+
const rest = args.slice(pos + 2);
|
|
101
|
+
if (!(0, arguments_js_1.isAstring)(reference)) {
|
|
102
|
+
throw new Error('LIST expects a reference name');
|
|
103
|
+
}
|
|
104
|
+
// patterns = "(" list-mailbox *(SP list-mailbox) ")"
|
|
105
|
+
patterns = Array.isArray(patterns) ? patterns : [patterns];
|
|
106
|
+
if (!patterns.length || !patterns.every(arguments_js_1.isAstring)) {
|
|
107
|
+
throw new Error('LIST expects a mailbox pattern or a list of patterns');
|
|
108
|
+
}
|
|
109
|
+
// list-return-opts = "RETURN" SP "(" [return-option *(SP return-option)] ")"
|
|
110
|
+
if (rest.length) {
|
|
111
|
+
if (rest.length !== 2 || !rest[0] || rest[0].type !== 'ATOM' || rest[0].value.toUpperCase() !== 'RETURN' || !Array.isArray(rest[1])) {
|
|
112
|
+
throw new Error('LIST expects RETURN and a list of return options after the patterns');
|
|
113
|
+
}
|
|
114
|
+
returns = parseOptions(rest[1], extensions.returnOptions, 'return', connection);
|
|
115
|
+
}
|
|
116
|
+
// RFC 5258 section 3.1: RECURSIVEMATCH (any list-select-mod-opt) needs a list-select-base-opt
|
|
117
|
+
const types = [...selection.keys()].map(name => extensions.selectionOptions[name].type);
|
|
118
|
+
if (types.includes('modifier') && !types.includes('base')) {
|
|
119
|
+
throw new Error('RECURSIVEMATCH must be used together with a selection option like SUBSCRIBED');
|
|
120
|
+
}
|
|
121
|
+
// a selection option implies its return option, eg. SUBSCRIBED
|
|
122
|
+
selection.forEach((value, name) => {
|
|
123
|
+
const implied = extensions.selectionOptions[name].returnOption;
|
|
124
|
+
if (implied && !returns.has(implied)) {
|
|
125
|
+
returns.set(implied, true);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
return {
|
|
129
|
+
selection,
|
|
130
|
+
reference: reference.value,
|
|
131
|
+
// RFC 5258 section 3: an empty pattern is ignored in an extended LIST command
|
|
132
|
+
patterns: patterns.map(pattern => pattern.value).filter((pattern) => pattern),
|
|
133
|
+
returns
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
const exists = (folder) => folder.flags.indexOf('\\Noselect') < 0;
|
|
137
|
+
/**
|
|
138
|
+
* Mailbox attributes for an extended LIST response. \NonExistent replaces \Noselect (RFC 5258
|
|
139
|
+
* section 3, \NonExistent implies \Noselect), children attributes are computed (RFC 5258 section 4),
|
|
140
|
+
* \Subscribed is only listed with the SUBSCRIBED return option (RFC 5258 section 3.2)
|
|
141
|
+
*/
|
|
142
|
+
const getAttributes = (folder, isExisting, hasChildren, returns) => server
|
|
143
|
+
.listAttributes(folder, { exists: isExisting, subscribed: returns.has('SUBSCRIBED') && folder.subscribed, hasChildren })
|
|
144
|
+
.map(flag => ({ type: 'ATOM', value: flag }));
|
|
145
|
+
const listHandler = server.getCommandHandler('LIST');
|
|
146
|
+
server.setCommandHandler('LIST', (connection, parsed, data, callback) => {
|
|
147
|
+
const args = parsed.attributes || [];
|
|
148
|
+
if (!isExtended(args)) {
|
|
149
|
+
// RFC 3501 LIST
|
|
150
|
+
return listHandler(connection, parsed, data, callback);
|
|
151
|
+
}
|
|
152
|
+
let request;
|
|
153
|
+
try {
|
|
154
|
+
request = parseArguments(args, connection);
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
connection.sendStatus(parsed, data, 'BAD', err.message, false, 'INVALID COMMAND');
|
|
158
|
+
return callback();
|
|
159
|
+
}
|
|
160
|
+
const selection = [...request.selection.keys()].map(name => ({ name, ...extensions.selectionOptions[name] }));
|
|
161
|
+
const filters = selection.filter(option => option.match);
|
|
162
|
+
const includeNonExistent = selection.some(option => option.includeNonExistent);
|
|
163
|
+
const recursive = request.selection.has('RECURSIVEMATCH');
|
|
164
|
+
// RFC 5258 section 6: CHILDINFO lists the list-select-base-opt options, always quoted
|
|
165
|
+
const childInfo = selection.filter(option => option.type === 'base').map(option => ({ type: 'STRING', value: option.name }));
|
|
166
|
+
// does a mailbox satisfy the selection criteria. Without options that means an existing mailbox
|
|
167
|
+
// the match functions also get the subscribed names that are not mailboxes
|
|
168
|
+
const matches = (folder) => (includeNonExistent || exists(folder)) && filters.every(option => option.match(folder, connection));
|
|
169
|
+
// RFC 5258 section 3.1: SUBSCRIBED lists subscribed names, also the ones that are not mailboxes
|
|
170
|
+
let folders = server.folderCache;
|
|
171
|
+
if (includeNonExistent) {
|
|
172
|
+
folders = Object.assign(Object.create(null), folders, server.getSubscriptionTree());
|
|
173
|
+
}
|
|
174
|
+
// RFC 5258 section 3: a mailbox that matches several patterns is listed once
|
|
175
|
+
const candidates = new Set();
|
|
176
|
+
request.patterns.forEach((pattern) => {
|
|
177
|
+
server
|
|
178
|
+
.matchFolders(request.reference, pattern, (path) => connection.exportMailboxName(path), folders)
|
|
179
|
+
.forEach(folder => candidates.add(folder));
|
|
180
|
+
});
|
|
181
|
+
candidates.forEach(folder => {
|
|
182
|
+
const isExisting = exists(folder);
|
|
183
|
+
const isMatch = matches(folder);
|
|
184
|
+
const descendants = server.getDescendants(folder.path, folders);
|
|
185
|
+
const hasChildren = descendants.some(exists);
|
|
186
|
+
let hasChildInfo = false;
|
|
187
|
+
if (recursive) {
|
|
188
|
+
// RFC 5258 section 3.5: a matching mailbox gets CHILDINFO if a descendant matches as well.
|
|
189
|
+
// A mailbox that does not match is only listed for a matching descendant that is not
|
|
190
|
+
// listed itself (redundant CHILDINFO SHOULD be suppressed)
|
|
191
|
+
hasChildInfo = descendants.some(descendant => matches(descendant) && (isMatch || !candidates.has(descendant)));
|
|
192
|
+
}
|
|
193
|
+
// RFC 5258 section 3.5: without selection filters a mailbox that does not exist but has
|
|
194
|
+
// existing descendants is listed as "\NonExistent \HasChildren"
|
|
195
|
+
const listed = isMatch || hasChildInfo || (!filters.length && !isExisting && hasChildren);
|
|
196
|
+
if (!listed) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const attributes = [
|
|
200
|
+
getAttributes(folder, isExisting, hasChildren, request.returns),
|
|
201
|
+
server.getSeparator(folder),
|
|
202
|
+
connection.exportMailboxName(folder.path)
|
|
203
|
+
];
|
|
204
|
+
if (hasChildInfo) {
|
|
205
|
+
// mbox-list-extended = "(" mbox-list-extended-item *(SP mbox-list-extended-item) ")"
|
|
206
|
+
attributes.push([{ type: 'STRING', value: 'CHILDINFO' }, childInfo]);
|
|
207
|
+
}
|
|
208
|
+
connection.send({
|
|
209
|
+
tag: '*',
|
|
210
|
+
command: 'LIST',
|
|
211
|
+
attributes
|
|
212
|
+
}, 'LIST ITEM', parsed, data, folder);
|
|
213
|
+
request.returns.forEach((value, name) => {
|
|
214
|
+
const option = extensions.returnOptions[name];
|
|
215
|
+
if (option.onItem) {
|
|
216
|
+
option.onItem(connection, folder, value, { matched: isMatch, exists: isExisting }, parsed, data);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
connection.sendStatus(parsed, data, 'OK', 'Completed', false, 'LIST');
|
|
221
|
+
return callback();
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
{
|
|
225
|
+
const defaultExport = exports.default;
|
|
226
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
227
|
+
for (const key of Object.keys(exports)) {
|
|
228
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
229
|
+
defaultExport[key] = exports[key];
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
233
|
+
module.exports = defaultExport;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.default = listStatusPlugin;
|
|
7
|
+
const list_extensions_js_1 = require("../list-extensions.js");
|
|
8
|
+
const status_js_1 = require("../commands/handlers/status.js");
|
|
9
|
+
const list_extended_js_1 = __importDefault(require("./list-extended.js"));
|
|
10
|
+
/**
|
|
11
|
+
* @help Adds LIST-STATUS [RFC5819] capability, the STATUS return option
|
|
12
|
+
* @help of LIST. Loads LIST-EXTENDED as well
|
|
13
|
+
*/
|
|
14
|
+
function listStatusPlugin(server) {
|
|
15
|
+
// the STATUS return option needs the extended LIST syntax (RFC 5819 section 4)
|
|
16
|
+
(0, list_extended_js_1.default)(server);
|
|
17
|
+
server.registerCapability('LIST-STATUS');
|
|
18
|
+
// status-option = "STATUS" SP "(" status-att *(SP status-att) ")"
|
|
19
|
+
(0, list_extensions_js_1.getListExtensions)(server).returnOptions.STATUS = {
|
|
20
|
+
parse: (list, connection) => (0, status_js_1.parseStatusItems)(server, list, connection),
|
|
21
|
+
// RFC 5819 section 2: a STATUS response follows the LIST response of every selectable mailbox
|
|
22
|
+
// that matches the selection criteria. Mailboxes listed only for CHILDINFO or as \NonExistent
|
|
23
|
+
// get none. The selected mailbox is no exception (RFC 9051 section 6.3.11)
|
|
24
|
+
onItem: (connection, folder, items, info, parsed, data) => {
|
|
25
|
+
if (info.matched && info.exists) {
|
|
26
|
+
(0, status_js_1.sendStatus)(connection, folder.path, folder, items, parsed, data);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
{
|
|
32
|
+
const defaultExport = exports.default;
|
|
33
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
34
|
+
for (const key of Object.keys(exports)) {
|
|
35
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
36
|
+
defaultExport[key] = exports[key];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
40
|
+
module.exports = defaultExport;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { IMAPServer } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* @help Enables LITERAL- [RFC7888] capability
|
|
4
|
+
* @help Non-synchronizing literals up to 4096 octets, a larger
|
|
5
|
+
* @help one is dropped and answered with BAD [TOOBIG]
|
|
6
|
+
* @help Can not be loaded with LITERAL+
|
|
7
|
+
*/
|
|
8
|
+
export default function literalminusPlugin(server: IMAPServer): void;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = literalminusPlugin;
|
|
4
|
+
/**
|
|
5
|
+
* @help Enables LITERAL- [RFC7888] capability
|
|
6
|
+
* @help Non-synchronizing literals up to 4096 octets, a larger
|
|
7
|
+
* @help one is dropped and answered with BAD [TOOBIG]
|
|
8
|
+
* @help Can not be loaded with LITERAL+
|
|
9
|
+
*/
|
|
10
|
+
function literalminusPlugin(server) {
|
|
11
|
+
// RFC 7888 section 5: servers MUST NOT advertise both LITERAL+ and LITERAL-
|
|
12
|
+
if (server.capabilities['LITERAL+']) {
|
|
13
|
+
throw new Error('LITERAL- can not be enabled together with LITERAL+');
|
|
14
|
+
}
|
|
15
|
+
server.registerCapability('LITERAL-');
|
|
16
|
+
// loaded by name, LITERAL+ can not replace it any more (see IMAP4rev2)
|
|
17
|
+
server.impliedLiteralMinus = false;
|
|
18
|
+
server.literalPlus = true;
|
|
19
|
+
server.nonSyncLiteralLimit = 4096;
|
|
20
|
+
}
|
|
21
|
+
{
|
|
22
|
+
const defaultExport = exports.default;
|
|
23
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
24
|
+
for (const key of Object.keys(exports)) {
|
|
25
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
26
|
+
defaultExport[key] = exports[key];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
30
|
+
module.exports = defaultExport;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = literalplusPlugin;
|
|
4
|
+
/**
|
|
5
|
+
* @help Enables LITERAL+ [RFC7888] capability
|
|
6
|
+
* @help Can not be loaded with LITERAL-
|
|
7
|
+
*/
|
|
8
|
+
function literalplusPlugin(server) {
|
|
9
|
+
// RFC 7888 section 5: servers MUST NOT advertise both LITERAL+ and LITERAL-. IMAP4rev2 adds LITERAL- only
|
|
10
|
+
// when LITERAL+ is not loaded, LITERAL+ replaces it then, as it allows more (RFC 9051 section 4.3)
|
|
11
|
+
if (server.capabilities['LITERAL-'] && !server.impliedLiteralMinus) {
|
|
12
|
+
throw new Error('LITERAL+ can not be enabled together with LITERAL-');
|
|
13
|
+
}
|
|
14
|
+
delete server.capabilities['LITERAL-'];
|
|
15
|
+
server.registerCapability('LITERAL+');
|
|
16
|
+
server.literalPlus = true;
|
|
17
|
+
server.nonSyncLiteralLimit = Infinity;
|
|
18
|
+
}
|
|
19
|
+
{
|
|
20
|
+
const defaultExport = exports.default;
|
|
21
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
22
|
+
for (const key of Object.keys(exports)) {
|
|
23
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
24
|
+
defaultExport[key] = exports[key];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
28
|
+
module.exports = defaultExport;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = logindisabledPlugin;
|
|
4
|
+
/**
|
|
5
|
+
* @help Disables LOGIN support for unencrypted connections
|
|
6
|
+
*/
|
|
7
|
+
function logindisabledPlugin(server) {
|
|
8
|
+
server.registerCapability('LOGINDISABLED', (connection) => {
|
|
9
|
+
return !connection.secureConnection && connection.state === 'Not Authenticated';
|
|
10
|
+
});
|
|
11
|
+
// Retrieve actual LOGIN handler
|
|
12
|
+
// Will be run if conditions are met
|
|
13
|
+
const oldHandler = server.getCommandHandler('LOGIN');
|
|
14
|
+
// Override LOGIN
|
|
15
|
+
server.setCommandHandler('LOGIN', (connection, parsed, data, callback) => {
|
|
16
|
+
// If the connection is unsecure, do not allow LOGIN
|
|
17
|
+
if (!connection.secureConnection) {
|
|
18
|
+
connection.send({
|
|
19
|
+
tag: parsed.tag,
|
|
20
|
+
command: 'NO',
|
|
21
|
+
attributes: [
|
|
22
|
+
{
|
|
23
|
+
type: 'SECTION',
|
|
24
|
+
section: [
|
|
25
|
+
{
|
|
26
|
+
type: 'ATOM',
|
|
27
|
+
value: 'PRIVACYREQUIRED'
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
type: 'TEXT',
|
|
33
|
+
value: 'Run STARTTLS first'
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}, 'LOGIN FAILED', parsed, data);
|
|
37
|
+
return callback();
|
|
38
|
+
}
|
|
39
|
+
// Reroute command to actual LOGIN handler
|
|
40
|
+
oldHandler(connection, parsed, data, callback);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
{
|
|
44
|
+
const defaultExport = exports.default;
|
|
45
|
+
if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
|
|
46
|
+
for (const key of Object.keys(exports)) {
|
|
47
|
+
if (key !== 'default' && !(key in defaultExport)) {
|
|
48
|
+
defaultExport[key] = exports[key];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
|
|
52
|
+
module.exports = defaultExport;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { IMAPServer } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Reads the limit from the "messageLimit" server option
|
|
4
|
+
*
|
|
5
|
+
* @param {Object} server IMAPServer
|
|
6
|
+
* @param {String} name Capability name for the error message
|
|
7
|
+
* @return {Number} limit
|
|
8
|
+
*/
|
|
9
|
+
declare function getLimit(server: IMAPServer, name: string): any;
|
|
10
|
+
/**
|
|
11
|
+
* Refuses COPY and APPEND of more messages than the limit, shared with the SAVELIMIT plugin. COPY and
|
|
12
|
+
* MULTIAPPEND APPEND are atomic, so nothing is copied or appended (RFC 9738 section 3.1)
|
|
13
|
+
*
|
|
14
|
+
* @param {Object} server IMAPServer
|
|
15
|
+
* @param {Number} limit Message limit
|
|
16
|
+
*/
|
|
17
|
+
declare function addSaveLimit(server: IMAPServer, limit: number): void;
|
|
18
|
+
export default function messagelimitPlugin(server: IMAPServer): void;
|
|
19
|
+
export { getLimit, addSaveLimit };
|