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,113 @@
|
|
|
1
|
+
// Built-in plugins by name (the file name without extension), see load-plugins.ts
|
|
2
|
+
import aclPlugin from './acl.js';
|
|
3
|
+
import appendlimitPlugin from './appendlimit.js';
|
|
4
|
+
import authPlainPlugin from './auth-plain.js';
|
|
5
|
+
import binaryPlugin from './binary.js';
|
|
6
|
+
import catenatePlugin from './catenate.js';
|
|
7
|
+
import compressPlugin from './compress.js';
|
|
8
|
+
import condstorePlugin from './condstore.js';
|
|
9
|
+
import contextSearchPlugin from './context-search.js';
|
|
10
|
+
import contextSortPlugin from './context-sort.js';
|
|
11
|
+
import createSpecialUsePlugin from './create-special-use.js';
|
|
12
|
+
import enablePlugin from './enable.js';
|
|
13
|
+
import esearchPlugin from './esearch.js';
|
|
14
|
+
import esortPlugin from './esort.js';
|
|
15
|
+
import idPlugin from './id.js';
|
|
16
|
+
import idlePlugin from './idle.js';
|
|
17
|
+
import imap4rev2Plugin from './imap4rev2.js';
|
|
18
|
+
import listExtendedPlugin from './list-extended.js';
|
|
19
|
+
import listStatusPlugin from './list-status.js';
|
|
20
|
+
import literalminusPlugin from './literalminus.js';
|
|
21
|
+
import literalplusPlugin from './literalplus.js';
|
|
22
|
+
import logindisabledPlugin from './logindisabled.js';
|
|
23
|
+
import messagelimitPlugin from './messagelimit.js';
|
|
24
|
+
import metadataPlugin from './metadata.js';
|
|
25
|
+
import metadataServerPlugin from './metadata-server.js';
|
|
26
|
+
import movePlugin from './move.js';
|
|
27
|
+
import multiappendPlugin from './multiappend.js';
|
|
28
|
+
import multisearchPlugin from './multisearch.js';
|
|
29
|
+
import namespacePlugin from './namespace.js';
|
|
30
|
+
import notifyPlugin from './notify.js';
|
|
31
|
+
import oauthbearerPlugin from './oauthbearer.js';
|
|
32
|
+
import objectidPlugin from './objectid.js';
|
|
33
|
+
import partialPlugin from './partial.js';
|
|
34
|
+
import previewPlugin from './preview.js';
|
|
35
|
+
import qresyncPlugin from './qresync.js';
|
|
36
|
+
import quotaPlugin from './quota.js';
|
|
37
|
+
import replacePlugin from './replace.js';
|
|
38
|
+
import saslIrPlugin from './sasl-ir.js';
|
|
39
|
+
import savedatePlugin from './savedate.js';
|
|
40
|
+
import savelimitPlugin from './savelimit.js';
|
|
41
|
+
import searchresPlugin from './searchres.js';
|
|
42
|
+
import sortPlugin from './sort.js';
|
|
43
|
+
import sortDisplayPlugin from './sort-display.js';
|
|
44
|
+
import specialUsePlugin from './special-use.js';
|
|
45
|
+
import starttlsPlugin from './starttls.js';
|
|
46
|
+
import statusSizePlugin from './status-size.js';
|
|
47
|
+
import threadOrderedsubjectPlugin from './thread-orderedsubject.js';
|
|
48
|
+
import threadReferencesPlugin from './thread-references.js';
|
|
49
|
+
import uidonlyPlugin from './uidonly.js';
|
|
50
|
+
import uidplusPlugin from './uidplus.js';
|
|
51
|
+
import unauthenticatePlugin from './unauthenticate.js';
|
|
52
|
+
import unselectPlugin from './unselect.js';
|
|
53
|
+
import utf8AcceptPlugin from './utf8-accept.js';
|
|
54
|
+
import xGmExt1Plugin from './x-gm-ext-1.js';
|
|
55
|
+
import xoauth2Plugin from './xoauth2.js';
|
|
56
|
+
import xtoybirdPlugin from './xtoybird.js';
|
|
57
|
+
export const plugins = {
|
|
58
|
+
acl: aclPlugin,
|
|
59
|
+
appendlimit: appendlimitPlugin,
|
|
60
|
+
'auth-plain': authPlainPlugin,
|
|
61
|
+
binary: binaryPlugin,
|
|
62
|
+
catenate: catenatePlugin,
|
|
63
|
+
compress: compressPlugin,
|
|
64
|
+
condstore: condstorePlugin,
|
|
65
|
+
'context-search': contextSearchPlugin,
|
|
66
|
+
'context-sort': contextSortPlugin,
|
|
67
|
+
'create-special-use': createSpecialUsePlugin,
|
|
68
|
+
enable: enablePlugin,
|
|
69
|
+
esearch: esearchPlugin,
|
|
70
|
+
esort: esortPlugin,
|
|
71
|
+
id: idPlugin,
|
|
72
|
+
idle: idlePlugin,
|
|
73
|
+
imap4rev2: imap4rev2Plugin,
|
|
74
|
+
'list-extended': listExtendedPlugin,
|
|
75
|
+
'list-status': listStatusPlugin,
|
|
76
|
+
literalminus: literalminusPlugin,
|
|
77
|
+
literalplus: literalplusPlugin,
|
|
78
|
+
logindisabled: logindisabledPlugin,
|
|
79
|
+
messagelimit: messagelimitPlugin,
|
|
80
|
+
metadata: metadataPlugin,
|
|
81
|
+
'metadata-server': metadataServerPlugin,
|
|
82
|
+
move: movePlugin,
|
|
83
|
+
multiappend: multiappendPlugin,
|
|
84
|
+
multisearch: multisearchPlugin,
|
|
85
|
+
namespace: namespacePlugin,
|
|
86
|
+
notify: notifyPlugin,
|
|
87
|
+
oauthbearer: oauthbearerPlugin,
|
|
88
|
+
objectid: objectidPlugin,
|
|
89
|
+
partial: partialPlugin,
|
|
90
|
+
preview: previewPlugin,
|
|
91
|
+
qresync: qresyncPlugin,
|
|
92
|
+
quota: quotaPlugin,
|
|
93
|
+
replace: replacePlugin,
|
|
94
|
+
'sasl-ir': saslIrPlugin,
|
|
95
|
+
savedate: savedatePlugin,
|
|
96
|
+
savelimit: savelimitPlugin,
|
|
97
|
+
searchres: searchresPlugin,
|
|
98
|
+
sort: sortPlugin,
|
|
99
|
+
'sort-display': sortDisplayPlugin,
|
|
100
|
+
'special-use': specialUsePlugin,
|
|
101
|
+
starttls: starttlsPlugin,
|
|
102
|
+
'status-size': statusSizePlugin,
|
|
103
|
+
'thread-orderedsubject': threadOrderedsubjectPlugin,
|
|
104
|
+
'thread-references': threadReferencesPlugin,
|
|
105
|
+
uidonly: uidonlyPlugin,
|
|
106
|
+
uidplus: uidplusPlugin,
|
|
107
|
+
unauthenticate: unauthenticatePlugin,
|
|
108
|
+
unselect: unselectPlugin,
|
|
109
|
+
'utf8-accept': utf8AcceptPlugin,
|
|
110
|
+
'x-gm-ext-1': xGmExt1Plugin,
|
|
111
|
+
xoauth2: xoauth2Plugin,
|
|
112
|
+
xtoybird: xtoybirdPlugin
|
|
113
|
+
};
|
|
@@ -1,17 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const { isDeepStrictEqual } = require('util');
|
|
4
|
-
const { getListExtensions } = require('../list-extensions');
|
|
5
|
-
|
|
1
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
2
|
+
import { getListExtensions } from '../list-extensions.js';
|
|
6
3
|
/**
|
|
7
4
|
* @help Adds LIST-EXTENDED [RFC5258] capability: selection options
|
|
8
5
|
* @help SUBSCRIBED, REMOTE and RECURSIVEMATCH, return options SUBSCRIBED
|
|
9
6
|
* @help and CHILDREN, multiple mailbox patterns and CHILDINFO.
|
|
10
7
|
* @help \Noselect mailboxes are listed as \NonExistent
|
|
11
8
|
*/
|
|
12
|
-
|
|
13
|
-
const { isAstring } = require('../arguments');
|
|
14
|
-
|
|
9
|
+
import { isAstring } from '../arguments.js';
|
|
15
10
|
/**
|
|
16
11
|
* Checks if a LIST command uses the extended syntax (RFC 5258 section 1): selection options before
|
|
17
12
|
* the reference, a list of patterns, or more than 2 arguments (return options)
|
|
@@ -19,32 +14,27 @@ const { isAstring } = require('../arguments');
|
|
|
19
14
|
* @param {Array} args Command arguments
|
|
20
15
|
* @return {Boolean} true for an extended LIST command
|
|
21
16
|
*/
|
|
22
|
-
const isExtended = args => Array.isArray(args[0]) || Array.isArray(args[1]) || args.length > 2;
|
|
23
|
-
|
|
24
|
-
module.exports = function (server) {
|
|
17
|
+
const isExtended = (args) => Array.isArray(args[0]) || Array.isArray(args[1]) || args.length > 2;
|
|
18
|
+
export default function listExtendedPlugin(server) {
|
|
25
19
|
const extensions = getListExtensions(server);
|
|
26
20
|
if (extensions.enabled) {
|
|
27
21
|
// already loaded by LIST-STATUS
|
|
28
22
|
return;
|
|
29
23
|
}
|
|
30
24
|
extensions.enabled = true;
|
|
31
|
-
|
|
32
25
|
server.registerCapability('LIST-EXTENDED');
|
|
33
|
-
|
|
34
26
|
// RFC 5258 section 3.1. There are no remote mailboxes, so REMOTE changes nothing
|
|
35
27
|
extensions.selectionOptions.SUBSCRIBED = {
|
|
36
28
|
type: 'base',
|
|
37
29
|
returnOption: 'SUBSCRIBED',
|
|
38
30
|
includeNonExistent: true,
|
|
39
|
-
match: folder => !!folder.subscribed
|
|
31
|
+
match: (folder) => !!folder.subscribed
|
|
40
32
|
};
|
|
41
33
|
extensions.selectionOptions.REMOTE = { type: 'independent' };
|
|
42
34
|
extensions.selectionOptions.RECURSIVEMATCH = { type: 'modifier' };
|
|
43
|
-
|
|
44
35
|
// RFC 5258 section 3.2. Children attributes are always returned, so CHILDREN needs no handling
|
|
45
36
|
extensions.returnOptions.SUBSCRIBED = {};
|
|
46
37
|
extensions.returnOptions.CHILDREN = {};
|
|
47
|
-
|
|
48
38
|
/**
|
|
49
39
|
* Parses selection or return options (RFC 5258 section 6, option-extension = tag [SP option-value])
|
|
50
40
|
*
|
|
@@ -62,22 +52,22 @@ module.exports = function (server) {
|
|
|
62
52
|
throw new Error('Invalid ' + kind + ' option');
|
|
63
53
|
}
|
|
64
54
|
const name = item.value.toUpperCase();
|
|
55
|
+
// only return options take a value (parse)
|
|
65
56
|
const option = registry[name];
|
|
66
57
|
if (!option) {
|
|
67
58
|
// RFC 5258 section 3: "A server MUST respond to options it does not recognize with a BAD response"
|
|
68
59
|
throw new Error('Unknown ' + kind + ' option ' + name);
|
|
69
60
|
}
|
|
70
|
-
|
|
71
61
|
let value = true;
|
|
72
62
|
if (option.parse) {
|
|
73
63
|
if (!Array.isArray(list[i + 1])) {
|
|
74
64
|
throw new Error(name + ' ' + kind + ' option requires a value');
|
|
75
65
|
}
|
|
76
66
|
value = option.parse(list[++i], connection);
|
|
77
|
-
}
|
|
67
|
+
}
|
|
68
|
+
else if (Array.isArray(list[i + 1])) {
|
|
78
69
|
throw new Error(name + ' ' + kind + ' option takes no value');
|
|
79
70
|
}
|
|
80
|
-
|
|
81
71
|
// RFC 5258 section 3: a repeated option counts once, so it can not have different values
|
|
82
72
|
if (options.has(name) && !isDeepStrictEqual(options.get(name), value)) {
|
|
83
73
|
throw new Error(name + ' ' + kind + ' option is repeated with a different value');
|
|
@@ -86,7 +76,6 @@ module.exports = function (server) {
|
|
|
86
76
|
}
|
|
87
77
|
return options;
|
|
88
78
|
};
|
|
89
|
-
|
|
90
79
|
/**
|
|
91
80
|
* Parses the arguments of an extended LIST command:
|
|
92
81
|
* list = "LIST" [SP list-select-opts] SP mailbox SP mbox-or-pat [SP list-return-opts]
|
|
@@ -99,26 +88,21 @@ module.exports = function (server) {
|
|
|
99
88
|
let selection = new Map();
|
|
100
89
|
let returns = new Map();
|
|
101
90
|
let pos = 0;
|
|
102
|
-
|
|
103
91
|
if (Array.isArray(args[0])) {
|
|
104
92
|
selection = parseOptions(args[0], extensions.selectionOptions, 'selection', connection);
|
|
105
93
|
pos++;
|
|
106
94
|
}
|
|
107
|
-
|
|
108
95
|
const reference = args[pos];
|
|
109
96
|
let patterns = args[pos + 1];
|
|
110
97
|
const rest = args.slice(pos + 2);
|
|
111
|
-
|
|
112
98
|
if (!isAstring(reference)) {
|
|
113
99
|
throw new Error('LIST expects a reference name');
|
|
114
100
|
}
|
|
115
|
-
|
|
116
101
|
// patterns = "(" list-mailbox *(SP list-mailbox) ")"
|
|
117
102
|
patterns = Array.isArray(patterns) ? patterns : [patterns];
|
|
118
103
|
if (!patterns.length || !patterns.every(isAstring)) {
|
|
119
104
|
throw new Error('LIST expects a mailbox pattern or a list of patterns');
|
|
120
105
|
}
|
|
121
|
-
|
|
122
106
|
// list-return-opts = "RETURN" SP "(" [return-option *(SP return-option)] ")"
|
|
123
107
|
if (rest.length) {
|
|
124
108
|
if (rest.length !== 2 || !rest[0] || rest[0].type !== 'ATOM' || rest[0].value.toUpperCase() !== 'RETURN' || !Array.isArray(rest[1])) {
|
|
@@ -126,13 +110,11 @@ module.exports = function (server) {
|
|
|
126
110
|
}
|
|
127
111
|
returns = parseOptions(rest[1], extensions.returnOptions, 'return', connection);
|
|
128
112
|
}
|
|
129
|
-
|
|
130
113
|
// RFC 5258 section 3.1: RECURSIVEMATCH (any list-select-mod-opt) needs a list-select-base-opt
|
|
131
114
|
const types = [...selection.keys()].map(name => extensions.selectionOptions[name].type);
|
|
132
115
|
if (types.includes('modifier') && !types.includes('base')) {
|
|
133
116
|
throw new Error('RECURSIVEMATCH must be used together with a selection option like SUBSCRIBED');
|
|
134
117
|
}
|
|
135
|
-
|
|
136
118
|
// a selection option implies its return option, eg. SUBSCRIBED
|
|
137
119
|
selection.forEach((value, name) => {
|
|
138
120
|
const implied = extensions.selectionOptions[name].returnOption;
|
|
@@ -140,73 +122,64 @@ module.exports = function (server) {
|
|
|
140
122
|
returns.set(implied, true);
|
|
141
123
|
}
|
|
142
124
|
});
|
|
143
|
-
|
|
144
125
|
return {
|
|
145
126
|
selection,
|
|
146
127
|
reference: reference.value,
|
|
147
128
|
// RFC 5258 section 3: an empty pattern is ignored in an extended LIST command
|
|
148
|
-
patterns: patterns.map(pattern => pattern.value).filter(pattern => pattern),
|
|
129
|
+
patterns: patterns.map(pattern => pattern.value).filter((pattern) => pattern),
|
|
149
130
|
returns
|
|
150
131
|
};
|
|
151
132
|
};
|
|
152
|
-
|
|
153
|
-
const exists = folder => folder.flags.indexOf('\\Noselect') < 0;
|
|
154
|
-
|
|
133
|
+
const exists = (folder) => folder.flags.indexOf('\\Noselect') < 0;
|
|
155
134
|
/**
|
|
156
135
|
* Mailbox attributes for an extended LIST response. \NonExistent replaces \Noselect (RFC 5258
|
|
157
136
|
* section 3, \NonExistent implies \Noselect), children attributes are computed (RFC 5258 section 4),
|
|
158
137
|
* \Subscribed is only listed with the SUBSCRIBED return option (RFC 5258 section 3.2)
|
|
159
138
|
*/
|
|
160
|
-
const getAttributes = (folder, isExisting, hasChildren, returns) =>
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
.map(flag => ({ type: 'ATOM', value: flag }));
|
|
164
|
-
|
|
139
|
+
const getAttributes = (folder, isExisting, hasChildren, returns) => server
|
|
140
|
+
.listAttributes(folder, { exists: isExisting, subscribed: returns.has('SUBSCRIBED') && folder.subscribed, hasChildren })
|
|
141
|
+
.map(flag => ({ type: 'ATOM', value: flag }));
|
|
165
142
|
const listHandler = server.getCommandHandler('LIST');
|
|
166
|
-
|
|
167
143
|
server.setCommandHandler('LIST', (connection, parsed, data, callback) => {
|
|
168
144
|
const args = parsed.attributes || [];
|
|
169
145
|
if (!isExtended(args)) {
|
|
170
146
|
// RFC 3501 LIST
|
|
171
147
|
return listHandler(connection, parsed, data, callback);
|
|
172
148
|
}
|
|
173
|
-
|
|
174
149
|
let request;
|
|
175
150
|
try {
|
|
176
151
|
request = parseArguments(args, connection);
|
|
177
|
-
}
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
178
154
|
connection.sendStatus(parsed, data, 'BAD', err.message, false, 'INVALID COMMAND');
|
|
179
155
|
return callback();
|
|
180
156
|
}
|
|
181
|
-
|
|
182
157
|
const selection = [...request.selection.keys()].map(name => ({ name, ...extensions.selectionOptions[name] }));
|
|
183
158
|
const filters = selection.filter(option => option.match);
|
|
184
159
|
const includeNonExistent = selection.some(option => option.includeNonExistent);
|
|
185
160
|
const recursive = request.selection.has('RECURSIVEMATCH');
|
|
186
161
|
// RFC 5258 section 6: CHILDINFO lists the list-select-base-opt options, always quoted
|
|
187
162
|
const childInfo = selection.filter(option => option.type === 'base').map(option => ({ type: 'STRING', value: option.name }));
|
|
188
|
-
|
|
189
163
|
// does a mailbox satisfy the selection criteria. Without options that means an existing mailbox
|
|
190
|
-
|
|
191
|
-
|
|
164
|
+
// the match functions also get the subscribed names that are not mailboxes
|
|
165
|
+
const matches = (folder) => (includeNonExistent || exists(folder)) && filters.every(option => option.match(folder, connection));
|
|
192
166
|
// RFC 5258 section 3.1: SUBSCRIBED lists subscribed names, also the ones that are not mailboxes
|
|
193
167
|
let folders = server.folderCache;
|
|
194
168
|
if (includeNonExistent) {
|
|
195
169
|
folders = Object.assign(Object.create(null), folders, server.getSubscriptionTree());
|
|
196
170
|
}
|
|
197
|
-
|
|
198
171
|
// RFC 5258 section 3: a mailbox that matches several patterns is listed once
|
|
199
172
|
const candidates = new Set();
|
|
200
|
-
request.patterns.forEach(pattern => {
|
|
201
|
-
server
|
|
173
|
+
request.patterns.forEach((pattern) => {
|
|
174
|
+
server
|
|
175
|
+
.matchFolders(request.reference, pattern, (path) => connection.exportMailboxName(path), folders)
|
|
176
|
+
.forEach(folder => candidates.add(folder));
|
|
202
177
|
});
|
|
203
|
-
|
|
204
178
|
candidates.forEach(folder => {
|
|
205
179
|
const isExisting = exists(folder);
|
|
206
180
|
const isMatch = matches(folder);
|
|
207
181
|
const descendants = server.getDescendants(folder.path, folders);
|
|
208
182
|
const hasChildren = descendants.some(exists);
|
|
209
|
-
|
|
210
183
|
let hasChildInfo = false;
|
|
211
184
|
if (recursive) {
|
|
212
185
|
// RFC 5258 section 3.5: a matching mailbox gets CHILDINFO if a descendant matches as well.
|
|
@@ -214,14 +187,12 @@ module.exports = function (server) {
|
|
|
214
187
|
// listed itself (redundant CHILDINFO SHOULD be suppressed)
|
|
215
188
|
hasChildInfo = descendants.some(descendant => matches(descendant) && (isMatch || !candidates.has(descendant)));
|
|
216
189
|
}
|
|
217
|
-
|
|
218
190
|
// RFC 5258 section 3.5: without selection filters a mailbox that does not exist but has
|
|
219
191
|
// existing descendants is listed as "\NonExistent \HasChildren"
|
|
220
192
|
const listed = isMatch || hasChildInfo || (!filters.length && !isExisting && hasChildren);
|
|
221
193
|
if (!listed) {
|
|
222
194
|
return;
|
|
223
195
|
}
|
|
224
|
-
|
|
225
196
|
const attributes = [
|
|
226
197
|
getAttributes(folder, isExisting, hasChildren, request.returns),
|
|
227
198
|
server.getSeparator(folder),
|
|
@@ -231,19 +202,11 @@ module.exports = function (server) {
|
|
|
231
202
|
// mbox-list-extended = "(" mbox-list-extended-item *(SP mbox-list-extended-item) ")"
|
|
232
203
|
attributes.push([{ type: 'STRING', value: 'CHILDINFO' }, childInfo]);
|
|
233
204
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
attributes
|
|
240
|
-
},
|
|
241
|
-
'LIST ITEM',
|
|
242
|
-
parsed,
|
|
243
|
-
data,
|
|
244
|
-
folder
|
|
245
|
-
);
|
|
246
|
-
|
|
205
|
+
connection.send({
|
|
206
|
+
tag: '*',
|
|
207
|
+
command: 'LIST',
|
|
208
|
+
attributes
|
|
209
|
+
}, 'LIST ITEM', parsed, data, folder);
|
|
247
210
|
request.returns.forEach((value, name) => {
|
|
248
211
|
const option = extensions.returnOptions[name];
|
|
249
212
|
if (option.onItem) {
|
|
@@ -251,8 +214,7 @@ module.exports = function (server) {
|
|
|
251
214
|
}
|
|
252
215
|
});
|
|
253
216
|
});
|
|
254
|
-
|
|
255
217
|
connection.sendStatus(parsed, data, 'OK', 'Completed', false, 'LIST');
|
|
256
218
|
return callback();
|
|
257
219
|
});
|
|
258
|
-
}
|
|
220
|
+
}
|
|
@@ -1,24 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const { parseStatusItems, sendStatus } = require('../commands/handlers/status');
|
|
5
|
-
const listExtended = require('./list-extended');
|
|
6
|
-
|
|
1
|
+
import { getListExtensions } from '../list-extensions.js';
|
|
2
|
+
import { parseStatusItems, sendStatus } from '../commands/handlers/status.js';
|
|
3
|
+
import listExtended from './list-extended.js';
|
|
7
4
|
/**
|
|
8
5
|
* @help Adds LIST-STATUS [RFC5819] capability, the STATUS return option
|
|
9
6
|
* @help of LIST. Loads LIST-EXTENDED as well
|
|
10
7
|
*/
|
|
11
|
-
|
|
12
|
-
module.exports = function (server) {
|
|
8
|
+
export default function listStatusPlugin(server) {
|
|
13
9
|
// the STATUS return option needs the extended LIST syntax (RFC 5819 section 4)
|
|
14
10
|
listExtended(server);
|
|
15
|
-
|
|
16
11
|
server.registerCapability('LIST-STATUS');
|
|
17
|
-
|
|
18
12
|
// status-option = "STATUS" SP "(" status-att *(SP status-att) ")"
|
|
19
13
|
getListExtensions(server).returnOptions.STATUS = {
|
|
20
14
|
parse: (list, connection) => parseStatusItems(server, list, connection),
|
|
21
|
-
|
|
22
15
|
// RFC 5819 section 2: a STATUS response follows the LIST response of every selectable mailbox
|
|
23
16
|
// that matches the selection criteria. Mailboxes listed only for CHILDINFO or as \NonExistent
|
|
24
17
|
// get none. The selected mailbox is no exception (RFC 9051 section 6.3.11)
|
|
@@ -28,4 +21,4 @@ module.exports = function (server) {
|
|
|
28
21
|
}
|
|
29
22
|
}
|
|
30
23
|
};
|
|
31
|
-
}
|
|
24
|
+
}
|
|
@@ -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;
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* @help Enables LITERAL- [RFC7888] capability
|
|
5
3
|
* @help Non-synchronizing literals up to 4096 octets, a larger
|
|
6
4
|
* @help one is dropped and answered with BAD [TOOBIG]
|
|
7
5
|
* @help Can not be loaded with LITERAL+
|
|
8
6
|
*/
|
|
9
|
-
|
|
10
|
-
module.exports = function (server) {
|
|
7
|
+
export default function literalminusPlugin(server) {
|
|
11
8
|
// RFC 7888 section 5: servers MUST NOT advertise both LITERAL+ and LITERAL-
|
|
12
9
|
if (server.capabilities['LITERAL+']) {
|
|
13
10
|
throw new Error('LITERAL- can not be enabled together with LITERAL+');
|
|
@@ -17,4 +14,4 @@ module.exports = function (server) {
|
|
|
17
14
|
server.impliedLiteralMinus = false;
|
|
18
15
|
server.literalPlus = true;
|
|
19
16
|
server.nonSyncLiteralLimit = 4096;
|
|
20
|
-
}
|
|
17
|
+
}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* @help Enables LITERAL+ [RFC7888] capability
|
|
5
3
|
* @help Can not be loaded with LITERAL-
|
|
6
4
|
*/
|
|
7
|
-
|
|
8
|
-
module.exports = function (server) {
|
|
5
|
+
export default function literalplusPlugin(server) {
|
|
9
6
|
// RFC 7888 section 5: servers MUST NOT advertise both LITERAL+ and LITERAL-. IMAP4rev2 adds LITERAL- only
|
|
10
7
|
// when LITERAL+ is not loaded, LITERAL+ replaces it then, as it allows more (RFC 9051 section 4.3)
|
|
11
8
|
if (server.capabilities['LITERAL-'] && !server.impliedLiteralMinus) {
|
|
@@ -15,4 +12,4 @@ module.exports = function (server) {
|
|
|
15
12
|
server.registerCapability('LITERAL+');
|
|
16
13
|
server.literalPlus = true;
|
|
17
14
|
server.nonSyncLiteralLimit = Infinity;
|
|
18
|
-
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @help Disables LOGIN support for unencrypted connections
|
|
3
|
+
*/
|
|
4
|
+
export default function logindisabledPlugin(server) {
|
|
5
|
+
server.registerCapability('LOGINDISABLED', (connection) => {
|
|
6
|
+
return !connection.secureConnection && connection.state === 'Not Authenticated';
|
|
7
|
+
});
|
|
8
|
+
// Retrieve actual LOGIN handler
|
|
9
|
+
// Will be run if conditions are met
|
|
10
|
+
const oldHandler = server.getCommandHandler('LOGIN');
|
|
11
|
+
// Override LOGIN
|
|
12
|
+
server.setCommandHandler('LOGIN', (connection, parsed, data, callback) => {
|
|
13
|
+
// If the connection is unsecure, do not allow LOGIN
|
|
14
|
+
if (!connection.secureConnection) {
|
|
15
|
+
connection.send({
|
|
16
|
+
tag: parsed.tag,
|
|
17
|
+
command: 'NO',
|
|
18
|
+
attributes: [
|
|
19
|
+
{
|
|
20
|
+
type: 'SECTION',
|
|
21
|
+
section: [
|
|
22
|
+
{
|
|
23
|
+
type: 'ATOM',
|
|
24
|
+
value: 'PRIVACYREQUIRED'
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
type: 'TEXT',
|
|
30
|
+
value: 'Run STARTTLS first'
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}, 'LOGIN FAILED', parsed, data);
|
|
34
|
+
return callback();
|
|
35
|
+
}
|
|
36
|
+
// Reroute command to actual LOGIN handler
|
|
37
|
+
oldHandler(connection, parsed, data, callback);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
@@ -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 };
|