imapkit 4.0.3 → 4.1.1
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 +271 -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 +106 -133
- 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 +55 -12
- package/lib/commands/capability.js +0 -47
- package/lib/commands/check.js +0 -21
- package/lib/commands/close.js +0 -30
- package/lib/commands/examine.js +0 -7
- package/lib/commands/expunge.js +0 -27
- package/lib/commands/list.js +0 -100
- package/lib/commands/logout.js +0 -41
- package/lib/commands/lsub.js +0 -87
- package/lib/commands/noop.js +0 -21
- package/lib/commands/search.js +0 -76
- package/lib/commands/select.js +0 -289
- package/lib/commands/uid copy.js +0 -7
- package/lib/commands/uid fetch.js +0 -5
- package/lib/commands/uid search.js +0 -5
- package/lib/commands/uid store.js +0 -5
- package/lib/plugins/compress.js +0 -76
- package/lib/plugins/enable.js +0 -155
- package/lib/plugins/id.js +0 -138
- package/lib/plugins/idle.js +0 -105
- package/lib/plugins/logindisabled.js +0 -50
- package/lib/plugins/metadata.js +0 -475
- package/lib/plugins/namespace.js +0 -67
- package/lib/plugins/unauthenticate.js +0 -28
- package/lib/plugins/unselect.js +0 -36
- package/lib/plugins/xoauth2.js +0 -188
- package/lib/plugins/xtoybird.js +0 -282
- package/lib/server.js +0 -2880
|
@@ -1,31 +1,23 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* @help Adds CONTEXT=SEARCH [RFC5267] capability, loads ESEARCH as well
|
|
5
3
|
* @help SEARCH RETURN (UPDATE) sends ADDTO and REMOVEFROM updates as the result changes, until CANCELUPDATE or the mailbox is closed
|
|
6
4
|
* @help SEARCH RETURN (PARTIAL 1:100) returns a window of the results, the CONTEXT hint is accepted and ignored
|
|
7
5
|
* @help Server option "maxSearchContexts" (default 10) limits the updating contexts of a session, above it NOUPDATE is sent
|
|
8
6
|
*/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const { states } = require('../command-states');
|
|
13
|
-
|
|
7
|
+
import esearch from './esearch.js';
|
|
8
|
+
import { buildCorrelator, registerPartialOption, toSequenceSet, toOrderedSet } from '../esearch.js';
|
|
9
|
+
import { states } from '../command-states.js';
|
|
14
10
|
const DEFAULT_MAX_CONTEXTS = 10;
|
|
15
|
-
|
|
16
11
|
// commands that close the selected mailbox, updates cease with them (RFC 5267 section 4.3)
|
|
17
12
|
const CLOSING_COMMANDS = new Set(['SELECT', 'EXAMINE', 'CLOSE', 'UNSELECT']);
|
|
18
|
-
|
|
19
13
|
// searching commands that can create updating contexts, SORT and UID SORT only with CONTEXT=SORT (see the ESORT plugin)
|
|
20
14
|
const SEARCHING_COMMANDS = new Set(['SEARCH', 'UID SEARCH', 'SORT', 'UID SORT']);
|
|
21
|
-
|
|
22
|
-
const getContexts = connection => {
|
|
15
|
+
const getContexts = (connection) => {
|
|
23
16
|
if (!connection.searchContexts) {
|
|
24
17
|
connection.searchContexts = new Map();
|
|
25
18
|
}
|
|
26
19
|
return connection.searchContexts;
|
|
27
20
|
};
|
|
28
|
-
|
|
29
21
|
/**
|
|
30
22
|
* Groups updates of one kind into context position and result set pairs (RFC 5267 sections 4.3.3 and
|
|
31
23
|
* 4.3.4). Updates of a searching command all use position 0 and form one set in mailbox order. Updates of
|
|
@@ -43,7 +35,8 @@ const groupUpdates = (updates, isRemoval) => {
|
|
|
43
35
|
const next = last && (isRemoval || !position ? last.position : last.position + last.values.length);
|
|
44
36
|
if (last && position === next) {
|
|
45
37
|
last.values.push(value);
|
|
46
|
-
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
47
40
|
groups.push({ position, values: [value] });
|
|
48
41
|
}
|
|
49
42
|
});
|
|
@@ -54,7 +47,6 @@ const groupUpdates = (updates, isRemoval) => {
|
|
|
54
47
|
});
|
|
55
48
|
return payload;
|
|
56
49
|
};
|
|
57
|
-
|
|
58
50
|
/**
|
|
59
51
|
* Sends ADDTO and REMOVEFROM updates of a context (RFC 5267 sections 4.3.3 and 4.3.4)
|
|
60
52
|
*
|
|
@@ -76,12 +68,11 @@ const sendUpdate = (connection, context, removed, added) => {
|
|
|
76
68
|
}
|
|
77
69
|
connection.send({ tag: '*', command: 'ESEARCH', attributes }, 'ESEARCH UPDATE', null, null, context);
|
|
78
70
|
};
|
|
79
|
-
|
|
80
71
|
/**
|
|
81
72
|
* Checks every updating context against the selected mailbox as the session sees it, and sends the
|
|
82
73
|
* changes. Expunged messages are handled when their EXPUNGE response is sent
|
|
83
74
|
*/
|
|
84
|
-
const checkContexts = connection => {
|
|
75
|
+
const checkContexts = (connection) => {
|
|
85
76
|
const contexts = connection.searchContexts;
|
|
86
77
|
const mailbox = connection.selectedMailbox;
|
|
87
78
|
const messages = mailbox ? mailbox.messages : [];
|
|
@@ -92,32 +83,34 @@ const checkContexts = connection => {
|
|
|
92
83
|
return;
|
|
93
84
|
}
|
|
94
85
|
const matching = messages.filter((message, i) => context.matches(message, i + 1));
|
|
95
|
-
|
|
86
|
+
// only messages of the mailbox get a value
|
|
87
|
+
const getValue = (message) => (context.isUid ? message.uid : numbers.get(message));
|
|
96
88
|
const current = new Set(matching);
|
|
97
89
|
const removed = [];
|
|
98
90
|
const added = [];
|
|
99
|
-
|
|
100
91
|
if (!context.compare) {
|
|
101
92
|
// a searching command, positions are 0 (RFC 5267 section 4.3.3)
|
|
102
|
-
context.results.forEach(message => {
|
|
93
|
+
context.results.forEach((message) => {
|
|
103
94
|
// a message that is gone without an EXPUNGE response for this session is just dropped
|
|
104
95
|
if (!current.has(message) && numbers.has(message)) {
|
|
105
96
|
removed.push([0, getValue(message)]);
|
|
106
97
|
}
|
|
107
98
|
});
|
|
108
|
-
matching.forEach(message => {
|
|
99
|
+
matching.forEach((message) => {
|
|
109
100
|
if (!context.results.has(message)) {
|
|
110
101
|
added.push([0, getValue(message)]);
|
|
111
102
|
}
|
|
112
103
|
});
|
|
113
|
-
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
114
106
|
// a sorting command. The sort values of a message do not change, so the results that stay keep their order.
|
|
115
107
|
// Removals are counted on the list as it shrinks, insertions in ascending order of their final position
|
|
116
108
|
let kept = 0;
|
|
117
|
-
context.order.forEach(message => {
|
|
109
|
+
context.order.forEach((message) => {
|
|
118
110
|
if (current.has(message)) {
|
|
119
111
|
kept++;
|
|
120
|
-
}
|
|
112
|
+
}
|
|
113
|
+
else if (numbers.has(message)) {
|
|
121
114
|
removed.push([kept + 1, getValue(message)]);
|
|
122
115
|
}
|
|
123
116
|
});
|
|
@@ -128,14 +121,12 @@ const checkContexts = connection => {
|
|
|
128
121
|
}
|
|
129
122
|
});
|
|
130
123
|
}
|
|
131
|
-
|
|
132
124
|
context.results = current;
|
|
133
125
|
if (removed.length || added.length) {
|
|
134
126
|
sendUpdate(connection, context, removed, added);
|
|
135
127
|
}
|
|
136
128
|
});
|
|
137
129
|
};
|
|
138
|
-
|
|
139
130
|
/**
|
|
140
131
|
* Removes expunged messages from the contexts that hold them, with one REMOVEFROM update per context
|
|
141
132
|
*
|
|
@@ -144,7 +135,7 @@ const checkContexts = connection => {
|
|
|
144
135
|
* @param {Number} seq Sequence number of the EXPUNGE response for a single message, null when there is none (VANISHED)
|
|
145
136
|
*/
|
|
146
137
|
const removeExpunged = (connection, messages, seq) => {
|
|
147
|
-
connection.searchContexts.forEach(context => {
|
|
138
|
+
connection.searchContexts.forEach((context) => {
|
|
148
139
|
if (context.mailbox !== connection.selectedMailbox) {
|
|
149
140
|
return;
|
|
150
141
|
}
|
|
@@ -167,34 +158,24 @@ const removeExpunged = (connection, messages, seq) => {
|
|
|
167
158
|
}
|
|
168
159
|
});
|
|
169
160
|
};
|
|
170
|
-
|
|
171
|
-
module.exports = function (server) {
|
|
161
|
+
export default function contextSearchPlugin(server) {
|
|
172
162
|
// CONTEXT=SORT loads this plugin as well, so it may be called twice
|
|
173
163
|
if (server.addSearchContext) {
|
|
174
164
|
return;
|
|
175
165
|
}
|
|
176
|
-
|
|
177
166
|
// the result options of CONTEXT=SEARCH extend the extended SEARCH command (RFC 5267 section 4.1)
|
|
178
167
|
esearch(server);
|
|
179
|
-
|
|
180
168
|
server.registerCapability('CONTEXT=SEARCH');
|
|
181
|
-
|
|
182
169
|
const maxContexts = Math.max(Number(server.options.maxSearchContexts) || DEFAULT_MAX_CONTEXTS, 1);
|
|
183
|
-
|
|
184
170
|
// RFC 5267 section 4.2: the server MAY ignore the CONTEXT hint
|
|
185
171
|
server.searchReturnOptions.set('CONTEXT', { hint: true });
|
|
186
172
|
// RFC 5267 section 4.3: UPDATE has no data of its own, but the ESEARCH response is still sent
|
|
187
173
|
server.searchReturnOptions.set('UPDATE', { data: false, response: true, once: true });
|
|
188
174
|
// RFC 5267 section 4.4
|
|
189
175
|
registerPartialOption(server);
|
|
190
|
-
|
|
191
176
|
// RFC 5267 section 4.3: UPDATE with the tag of an earlier searching command that still has an updating
|
|
192
177
|
// context SHALL be rejected with BAD
|
|
193
|
-
server.searchReturnChecks.push(
|
|
194
|
-
(options, connection, parsed) =>
|
|
195
|
-
options.has('UPDATE') && getContexts(connection).has(parsed.tag) && 'Tag ' + parsed.tag + ' is already in use by an updating search'
|
|
196
|
-
);
|
|
197
|
-
|
|
178
|
+
server.searchReturnChecks.push((options, connection, parsed) => options.has('UPDATE') && getContexts(connection).has(parsed.tag) && 'Tag ' + parsed.tag + ' is already in use by an updating search');
|
|
198
179
|
/**
|
|
199
180
|
* Creates an updating context once a searching command with UPDATE has completed. Also used by
|
|
200
181
|
* CONTEXT=SORT and by the ESEARCH command of MULTISEARCH
|
|
@@ -211,25 +192,20 @@ module.exports = function (server) {
|
|
|
211
192
|
const contexts = getContexts(connection);
|
|
212
193
|
if (contexts.size >= maxContexts) {
|
|
213
194
|
// RFC 5267 section 4.3.1: an untagged NO with NOUPDATE, the other result options are still honoured
|
|
214
|
-
connection.send(
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
},
|
|
229
|
-
'NOUPDATE',
|
|
230
|
-
parsed,
|
|
231
|
-
data
|
|
232
|
-
);
|
|
195
|
+
connection.send({
|
|
196
|
+
tag: '*',
|
|
197
|
+
command: 'NO',
|
|
198
|
+
attributes: [
|
|
199
|
+
{
|
|
200
|
+
type: 'SECTION',
|
|
201
|
+
section: [
|
|
202
|
+
{ type: 'ATOM', value: 'NOUPDATE' },
|
|
203
|
+
{ type: 'STRING', value: parsed.tag }
|
|
204
|
+
]
|
|
205
|
+
},
|
|
206
|
+
{ type: 'TEXT', value: 'Too many updating contexts' }
|
|
207
|
+
]
|
|
208
|
+
}, 'NOUPDATE', parsed, data);
|
|
233
209
|
return;
|
|
234
210
|
}
|
|
235
211
|
contexts.set(parsed.tag, {
|
|
@@ -243,36 +219,29 @@ module.exports = function (server) {
|
|
|
243
219
|
correlatorMailbox: correlatorMailbox || null
|
|
244
220
|
});
|
|
245
221
|
};
|
|
246
|
-
|
|
247
222
|
// RFC 5267 section 4.3.5: command-select =/ "CANCELUPDATE" 1*(SP quoted)
|
|
248
|
-
server.setCommandHandler(
|
|
249
|
-
|
|
250
|
-
(
|
|
251
|
-
|
|
252
|
-
if (!tags.length || tags.some(tag => !tag || tag.type !== 'STRING')) {
|
|
253
|
-
connection.sendStatus(parsed, data, 'BAD', 'CANCELUPDATE expects one or more quoted tags', false, 'CANCELUPDATE FAILED');
|
|
254
|
-
return callback();
|
|
255
|
-
}
|
|
256
|
-
const contexts = getContexts(connection);
|
|
257
|
-
const unknown = tags.find(tag => !contexts.has(tag.value));
|
|
258
|
-
if (unknown) {
|
|
259
|
-
// nothing is cancelled when a tag has no updating context
|
|
260
|
-
connection.sendStatus(parsed, data, 'NO', 'Unknown tag', false, 'CANCELUPDATE FAILED');
|
|
261
|
-
return callback();
|
|
262
|
-
}
|
|
263
|
-
tags.forEach(tag => contexts.delete(tag.value));
|
|
264
|
-
connection.sendStatus(parsed, data, 'OK', 'Updates cancelled', false, 'CANCELUPDATE');
|
|
223
|
+
server.setCommandHandler('CANCELUPDATE', (connection, parsed, data, callback) => {
|
|
224
|
+
const tags = parsed.attributes || [];
|
|
225
|
+
if (!tags.length || tags.some(tag => !tag || tag.type !== 'STRING')) {
|
|
226
|
+
connection.sendStatus(parsed, data, 'BAD', 'CANCELUPDATE expects one or more quoted tags', false, 'CANCELUPDATE FAILED');
|
|
265
227
|
return callback();
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
228
|
+
}
|
|
229
|
+
const contexts = getContexts(connection);
|
|
230
|
+
const unknown = tags.find(tag => !contexts.has(tag.value));
|
|
231
|
+
if (unknown) {
|
|
232
|
+
// nothing is cancelled when a tag has no updating context
|
|
233
|
+
connection.sendStatus(parsed, data, 'NO', 'Unknown tag', false, 'CANCELUPDATE FAILED');
|
|
234
|
+
return callback();
|
|
235
|
+
}
|
|
236
|
+
tags.forEach(tag => contexts.delete(tag.value));
|
|
237
|
+
connection.sendStatus(parsed, data, 'OK', 'Updates cancelled', false, 'CANCELUPDATE');
|
|
238
|
+
return callback();
|
|
239
|
+
}, { states: states.SELECTED });
|
|
270
240
|
// UNAUTHENTICATE (RFC 8437) closes the mailbox, so the updates end
|
|
271
|
-
server.resetHandlers.push(connection => {
|
|
241
|
+
server.resetHandlers.push((connection) => {
|
|
272
242
|
connection.searchContexts = null;
|
|
273
243
|
});
|
|
274
|
-
|
|
275
|
-
server.connectionHandlers.push(connection => {
|
|
244
|
+
server.connectionHandlers.push((connection) => {
|
|
276
245
|
// Notifications from other sessions (and this one) are flushed here. Once none are pending, the session
|
|
277
246
|
// knows the current message list, so new matches can be reported after their EXISTS and FETCH responses
|
|
278
247
|
// (RFC 5267 section 4.3.2). A command that closes the mailbox gets no updates, its tagged response ends them
|
|
@@ -285,7 +254,6 @@ module.exports = function (server) {
|
|
|
285
254
|
}
|
|
286
255
|
};
|
|
287
256
|
});
|
|
288
|
-
|
|
289
257
|
server.outputHandlers.push((connection, response, description, parsed, data, extra) => {
|
|
290
258
|
// RFC 5267 section 4.3.4: REMOVEFROM for an expunged message MUST be sent before the EXPUNGE response. After
|
|
291
259
|
// ENABLE QRESYNC a VANISHED response reports the expunged messages (RFC 7162 section 3.2.10), it has no sequence
|
|
@@ -295,22 +263,19 @@ module.exports = function (server) {
|
|
|
295
263
|
removeExpunged(connection, expunged, response.message ? response.attributes[0] : null);
|
|
296
264
|
return;
|
|
297
265
|
}
|
|
298
|
-
|
|
299
266
|
if (!parsed) {
|
|
300
267
|
return;
|
|
301
268
|
}
|
|
302
269
|
const command = (parsed.command || '').toUpperCase();
|
|
303
|
-
|
|
304
270
|
if (response.tag === parsed.tag && CLOSING_COMMANDS.has(command)) {
|
|
305
271
|
connection.searchContexts = null;
|
|
306
272
|
return;
|
|
307
273
|
}
|
|
308
|
-
|
|
309
274
|
if (!SEARCHING_COMMANDS.has(command) || !parsed.searchReturn || !parsed.searchReturn.has('UPDATE')) {
|
|
310
275
|
return;
|
|
311
276
|
}
|
|
312
277
|
// the full search result, the context is created when the command succeeded
|
|
313
|
-
if (response.tag === '*' && command.endsWith(response.command) && description === command && extra && Array.isArray(extra.list)) {
|
|
278
|
+
if (response.tag === '*' && command.endsWith(String(response.command)) && description === command && extra && Array.isArray(extra.list)) {
|
|
314
279
|
parsed.contextResult = extra;
|
|
315
280
|
return;
|
|
316
281
|
}
|
|
@@ -318,4 +283,4 @@ module.exports = function (server) {
|
|
|
318
283
|
server.addSearchContext(connection, parsed, data, parsed.contextResult, command.startsWith('UID '));
|
|
319
284
|
}
|
|
320
285
|
});
|
|
321
|
-
}
|
|
286
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @help Adds CONTEXT=SORT [RFC5267] capability, loads ESORT and CONTEXT=SEARCH as well
|
|
3
|
+
* @help SORT RETURN (UPDATE) sends ADDTO and REMOVEFROM updates with context positions in sort order, PARTIAL and CONTEXT work for SORT too
|
|
4
|
+
*/
|
|
5
|
+
import type { IMAPServer } from '../types.js';
|
|
6
|
+
export default function contextSortPlugin(server: IMAPServer): void;
|
|
@@ -1,19 +1,14 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* @help Adds CONTEXT=SORT [RFC5267] capability, loads ESORT and CONTEXT=SEARCH as well
|
|
5
3
|
* @help SORT RETURN (UPDATE) sends ADDTO and REMOVEFROM updates with context positions in sort order, PARTIAL and CONTEXT work for SORT too
|
|
6
4
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
module.exports = function (server) {
|
|
5
|
+
import esort from './esort.js';
|
|
6
|
+
import contextSearch from './context-search.js';
|
|
7
|
+
export default function contextSortPlugin(server) {
|
|
12
8
|
// RFC 5267 section 4.1: CONTEXT=SORT means SORT and the extended SORT syntax of section 3. The updating
|
|
13
9
|
// contexts are shared with CONTEXT=SEARCH, so that is loaded (and advertised) as well
|
|
14
10
|
esort(server);
|
|
15
11
|
contextSearch(server);
|
|
16
|
-
|
|
17
12
|
server.registerCapability('CONTEXT=SORT');
|
|
18
13
|
server.contextSort = true;
|
|
19
|
-
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { IMAPServer } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* @help Enables CREATE-SPECIAL-USE [RFC6154] capability
|
|
4
|
+
* @help Allowed special flags can be set with server
|
|
5
|
+
* @help option "special-use"
|
|
6
|
+
*/
|
|
7
|
+
export default function createSpecialUsePlugin(server: IMAPServer): void;
|
|
@@ -1,18 +1,13 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* @help Enables CREATE-SPECIAL-USE [RFC6154] capability
|
|
5
3
|
* @help Allowed special flags can be set with server
|
|
6
4
|
* @help option "special-use"
|
|
7
5
|
*/
|
|
8
|
-
|
|
9
|
-
module.exports = function (server) {
|
|
6
|
+
export default function createSpecialUsePlugin(server) {
|
|
10
7
|
// Register capability
|
|
11
8
|
server.registerCapability('CREATE-SPECIAL-USE');
|
|
12
|
-
|
|
13
9
|
const createHandler = server.getCommandHandler('CREATE');
|
|
14
10
|
const allowedList = [].concat(server.options['special-use'] || ['\\Archive', '\\Drafts', '\\Flagged', '\\Junk', '\\Sent', '\\Trash']);
|
|
15
|
-
|
|
16
11
|
server.setCommandHandler('CREATE', (connection, parsed, data, callback) => {
|
|
17
12
|
let i;
|
|
18
13
|
let len;
|
|
@@ -20,71 +15,57 @@ module.exports = function (server) {
|
|
|
20
15
|
const mailboxSpecialUse = [];
|
|
21
16
|
if (parsed.attributes && Array.isArray(parsed.attributes[1])) {
|
|
22
17
|
for (i = 0; i < parsed.attributes[1].length; i += 2) {
|
|
23
|
-
if (
|
|
24
|
-
parsed.attributes[1][i] &&
|
|
18
|
+
if (parsed.attributes[1][i] &&
|
|
25
19
|
parsed.attributes[1][i].type === 'ATOM' &&
|
|
26
20
|
parsed.attributes[1][i].value.toUpperCase() === 'USE' &&
|
|
27
|
-
Array.isArray(parsed.attributes[1][i + 1])
|
|
28
|
-
) {
|
|
21
|
+
Array.isArray(parsed.attributes[1][i + 1])) {
|
|
29
22
|
specialUseList = parsed.attributes[1][i + 1];
|
|
30
23
|
parsed.attributes[1].splice(i, 2);
|
|
31
24
|
i -= 2;
|
|
32
25
|
}
|
|
33
26
|
}
|
|
34
|
-
|
|
35
27
|
// Remove extra arguments if no members were left
|
|
36
28
|
if (!parsed.attributes[1].length) {
|
|
37
29
|
parsed.attributes.splice(1, 1);
|
|
38
30
|
}
|
|
39
31
|
}
|
|
40
|
-
|
|
41
32
|
if (specialUseList) {
|
|
42
33
|
for (i = 0, len = specialUseList.length; i < len; i++) {
|
|
43
34
|
if (['ATOM', 'STRING', 'LITERAL'].indexOf(specialUseList[i].type) < 0) {
|
|
44
|
-
connection.send(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
},
|
|
55
|
-
'CREATE-SPECIAL-USE FAILED',
|
|
56
|
-
parsed,
|
|
57
|
-
data
|
|
58
|
-
);
|
|
35
|
+
connection.send({
|
|
36
|
+
tag: parsed.tag,
|
|
37
|
+
command: 'BAD',
|
|
38
|
+
attributes: [
|
|
39
|
+
{
|
|
40
|
+
type: 'TEXT',
|
|
41
|
+
value: 'Invalid syntax for special use flag #' + (i + 1)
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}, 'CREATE-SPECIAL-USE FAILED', parsed, data);
|
|
59
45
|
return callback();
|
|
60
46
|
}
|
|
61
47
|
// attribute names are case-insensitive, store the canonical form
|
|
62
48
|
const specialUse = allowedList.find(value => value.toLowerCase() === String(specialUseList[i].value).toLowerCase());
|
|
63
49
|
if (!specialUse) {
|
|
64
|
-
connection.send(
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
},
|
|
84
|
-
'CREATE-SPECIAL-USE FAILED',
|
|
85
|
-
parsed,
|
|
86
|
-
data
|
|
87
|
-
);
|
|
50
|
+
connection.send({
|
|
51
|
+
tag: parsed.tag,
|
|
52
|
+
command: 'NO',
|
|
53
|
+
attributes: [
|
|
54
|
+
{
|
|
55
|
+
type: 'SECTION',
|
|
56
|
+
section: [
|
|
57
|
+
{
|
|
58
|
+
type: 'ATOM',
|
|
59
|
+
value: 'USEATTR'
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
type: 'TEXT',
|
|
65
|
+
value: specialUseList[i].value + ' not supported'
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
}, 'CREATE-SPECIAL-USE FAILED', parsed, data);
|
|
88
69
|
return callback();
|
|
89
70
|
}
|
|
90
71
|
if (mailboxSpecialUse.indexOf(specialUse) < 0) {
|
|
@@ -92,17 +73,14 @@ module.exports = function (server) {
|
|
|
92
73
|
}
|
|
93
74
|
}
|
|
94
75
|
}
|
|
95
|
-
|
|
96
76
|
if (mailboxSpecialUse.length) {
|
|
97
77
|
parsed.mailboxSpecialUse = mailboxSpecialUse;
|
|
98
78
|
}
|
|
99
|
-
|
|
100
79
|
createHandler(connection, parsed, data, callback);
|
|
101
80
|
});
|
|
102
|
-
|
|
103
81
|
server.outputHandlers.push((connection, response, description, parsed, data, folder) => {
|
|
104
82
|
if (description === 'CREATE' && folder && parsed.mailboxSpecialUse) {
|
|
105
83
|
folder['special-use'] = parsed.mailboxSpecialUse;
|
|
106
84
|
}
|
|
107
85
|
});
|
|
108
|
-
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { IMAPConnection, IMAPServer } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* @help Adds ENABLE capability [RFC5161]
|
|
4
|
+
* @help Plugins that can be enabled (eg. CONDSTORE)
|
|
5
|
+
* @help can be loaded in any order
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Makes an extension available for ENABLE. Plugins call it whether the ENABLE plugin is loaded before or after them
|
|
9
|
+
*
|
|
10
|
+
* @param {Object} server IMAPServer instance
|
|
11
|
+
* @param {String} name Capability name in the spelling it is advertised in, e.g. "IMAP4rev2"
|
|
12
|
+
*/
|
|
13
|
+
declare function registerEnable(server: IMAPServer, name: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* Checks if a session has enabled an extension with ENABLE. UNAUTHENTICATE clears the list (RFC 8437 section 4.1)
|
|
16
|
+
*
|
|
17
|
+
* @param {Object} connection IMAP connection
|
|
18
|
+
* @param {String} name Capability name in the spelling it was registered with, see registerEnable
|
|
19
|
+
* @return {Boolean} true if the extension is enabled
|
|
20
|
+
*/
|
|
21
|
+
declare function isEnabled(connection: IMAPConnection, name: string): boolean;
|
|
22
|
+
export default function enablePlugin(server: IMAPServer): void;
|
|
23
|
+
export { registerEnable, isEnabled };
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { states } from '../command-states.js';
|
|
2
|
+
/**
|
|
3
|
+
* @help Adds ENABLE capability [RFC5161]
|
|
4
|
+
* @help Plugins that can be enabled (eg. CONDSTORE)
|
|
5
|
+
* @help can be loaded in any order
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Makes an extension available for ENABLE. Plugins call it whether the ENABLE plugin is loaded before or after them
|
|
9
|
+
*
|
|
10
|
+
* @param {Object} server IMAPServer instance
|
|
11
|
+
* @param {String} name Capability name in the spelling it is advertised in, e.g. "IMAP4rev2"
|
|
12
|
+
*/
|
|
13
|
+
function registerEnable(server, name) {
|
|
14
|
+
server.enableAvailable = server.enableAvailable || [];
|
|
15
|
+
if (server.enableAvailable.indexOf(name) < 0) {
|
|
16
|
+
server.enableAvailable.push(name);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Checks if a session has enabled an extension with ENABLE. UNAUTHENTICATE clears the list (RFC 8437 section 4.1)
|
|
21
|
+
*
|
|
22
|
+
* @param {Object} connection IMAP connection
|
|
23
|
+
* @param {String} name Capability name in the spelling it was registered with, see registerEnable
|
|
24
|
+
* @return {Boolean} true if the extension is enabled
|
|
25
|
+
*/
|
|
26
|
+
function isEnabled(connection, name) {
|
|
27
|
+
return !!connection.enabled && connection.enabled.indexOf(name) >= 0;
|
|
28
|
+
}
|
|
29
|
+
export default function enablePlugin(server) {
|
|
30
|
+
server.registerCapability('ENABLE');
|
|
31
|
+
// Shared with plugins that can be enabled, these might be loaded before or after this one
|
|
32
|
+
server.enableAvailable = server.enableAvailable || [];
|
|
33
|
+
server.connectionHandlers.push((connection) => {
|
|
34
|
+
connection.enabled = connection.enabled || [];
|
|
35
|
+
});
|
|
36
|
+
// RFC 8437 section 4.1: extensions enabled with ENABLE cease to be enabled after UNAUTHENTICATE
|
|
37
|
+
server.resetHandlers.push((connection) => {
|
|
38
|
+
connection.enabled = [];
|
|
39
|
+
});
|
|
40
|
+
server.setCommandHandler('ENABLE', (connection, parsed, data, callback) => {
|
|
41
|
+
let capability;
|
|
42
|
+
let i;
|
|
43
|
+
let len;
|
|
44
|
+
// RFC 5161 section 3.1: "Clients MUST NOT issue ENABLE once they SELECT/EXAMINE a mailbox".
|
|
45
|
+
// Servers do not have to check this, ImapKit does to catch the client bug.
|
|
46
|
+
if (connection.everSelected) {
|
|
47
|
+
connection.sendStatus(parsed, data, 'BAD', 'ENABLE is not allowed after SELECT or EXAMINE');
|
|
48
|
+
return callback();
|
|
49
|
+
}
|
|
50
|
+
if (!parsed.attributes) {
|
|
51
|
+
connection.send({
|
|
52
|
+
tag: parsed.tag,
|
|
53
|
+
command: 'BAD',
|
|
54
|
+
attributes: [
|
|
55
|
+
{
|
|
56
|
+
type: 'TEXT',
|
|
57
|
+
value: 'ENABLE expects capability list'
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
}, 'INVALID COMMAND', parsed, data);
|
|
61
|
+
return callback();
|
|
62
|
+
}
|
|
63
|
+
for (i = 0, len = parsed.attributes.length; i < len; i++) {
|
|
64
|
+
if (!parsed.attributes[i] || parsed.attributes[i].type !== 'ATOM') {
|
|
65
|
+
connection.send({
|
|
66
|
+
tag: parsed.tag,
|
|
67
|
+
command: 'BAD',
|
|
68
|
+
attributes: [
|
|
69
|
+
{
|
|
70
|
+
type: 'TEXT',
|
|
71
|
+
value: 'Attribute nr ' + (i + 1) + ' is not an ATOM'
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
}, 'INVALID COMMAND', parsed, data);
|
|
75
|
+
return callback();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// The ENABLED response lists only the extensions enabled by this command
|
|
79
|
+
// Capability names are matched case-insensitively and listed in the spelling the server advertises them
|
|
80
|
+
// (`server.enableAvailable`), e.g. "IMAP4rev2", so plugins look them up in `connection.enabled` by that name
|
|
81
|
+
const enabled = [];
|
|
82
|
+
for (i = 0, len = parsed.attributes.length; i < len; i++) {
|
|
83
|
+
const requested = parsed.attributes[i].value.toUpperCase();
|
|
84
|
+
capability = server.enableAvailable.find((name) => name.toUpperCase() === requested);
|
|
85
|
+
if (capability && connection.enabled.indexOf(capability) < 0) {
|
|
86
|
+
connection.enabled.push(capability);
|
|
87
|
+
enabled.push(capability);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
connection.send({
|
|
91
|
+
tag: '*',
|
|
92
|
+
command: 'ENABLED',
|
|
93
|
+
attributes: enabled.map(capability => ({
|
|
94
|
+
type: 'ATOM',
|
|
95
|
+
value: capability
|
|
96
|
+
}))
|
|
97
|
+
}, 'ENABLED', parsed, data, enabled);
|
|
98
|
+
connection.send({
|
|
99
|
+
tag: parsed.tag,
|
|
100
|
+
command: 'OK',
|
|
101
|
+
attributes: [
|
|
102
|
+
{
|
|
103
|
+
type: 'TEXT',
|
|
104
|
+
value: 'ENABLE completed'
|
|
105
|
+
}
|
|
106
|
+
]
|
|
107
|
+
}, 'ENABLE', parsed, data);
|
|
108
|
+
return callback();
|
|
109
|
+
}, { states: states.AUTHENTICATED });
|
|
110
|
+
}
|
|
111
|
+
export { registerEnable, isEnabled };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @help Adds ESEARCH [RFC4731] capability
|
|
3
|
+
* @help SEARCH and UID SEARCH take the RETURN (MIN MAX ALL COUNT) result options and answer with ESEARCH
|
|
4
|
+
*/
|
|
5
|
+
import type { IMAPServer } from '../types.js';
|
|
6
|
+
export default function esearchPlugin(server: IMAPServer): void;
|