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
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const { isAtom } = require('../arguments');
|
|
5
|
-
const { registerEnable, isEnabled } = require('./enable');
|
|
6
|
-
|
|
1
|
+
import { toVanished } from '../vanished.js';
|
|
2
|
+
import { isAtom } from '../arguments.js';
|
|
3
|
+
import { registerEnable, isEnabled } from './enable.js';
|
|
7
4
|
/**
|
|
8
5
|
* @help Adds UIDONLY [RFC9586] capability, loads ENABLE as well
|
|
9
6
|
* @help After ENABLE UIDONLY: FETCH, STORE, SEARCH, COPY, MOVE, SORT, THREAD, REPLACE and
|
|
@@ -13,17 +10,12 @@ const { registerEnable, isEnabled } = require('./enable');
|
|
|
13
10
|
*
|
|
14
11
|
* UIDONLY: https://www.rfc-editor.org/rfc/rfc9586
|
|
15
12
|
*/
|
|
16
|
-
|
|
17
|
-
module.exports = function (server) {
|
|
13
|
+
export default function uidonlyPlugin(server) {
|
|
18
14
|
server.registerCapability('UIDONLY');
|
|
19
|
-
|
|
20
15
|
registerEnable(server, 'UIDONLY');
|
|
21
|
-
|
|
22
16
|
// UNAUTHENTICATE clears the ENABLEd extensions (RFC 8437 section 4.1)
|
|
23
|
-
const isUidonly = connection => isEnabled(connection, 'UIDONLY');
|
|
24
|
-
|
|
25
|
-
const refuse = text => ({ command: 'BAD', code: 'UIDREQUIRED', text });
|
|
26
|
-
|
|
17
|
+
const isUidonly = (connection) => isEnabled(connection, 'UIDONLY');
|
|
18
|
+
const refuse = (text) => ({ command: 'BAD', code: 'UIDREQUIRED', text });
|
|
27
19
|
// RFC 9586 section 3: once UIDONLY is enabled, message numbers in any argument MUST be answered with a
|
|
28
20
|
// tagged BAD that has the UIDREQUIRED response code
|
|
29
21
|
const getRefusal = (connection, parsed) => {
|
|
@@ -31,45 +23,37 @@ module.exports = function (server) {
|
|
|
31
23
|
const options = server.getCommandOptions(command);
|
|
32
24
|
// the ESEARCH command of MULTISEARCH always returns UIDs (RFC 7377 section 2), like a UID command
|
|
33
25
|
const isUid = /^UID /.test(command) || command === 'ESEARCH';
|
|
34
|
-
|
|
35
26
|
// sections 3.2 and 3.8: FETCH, STORE, SEARCH, COPY, MOVE, SORT and THREAD are prohibited, also REPLACE
|
|
36
27
|
// (RFC 8508), its message argument is a sequence number. These have the sequenceSet or searchCriteria
|
|
37
28
|
// command option
|
|
38
29
|
if (!isUid && (options.sequenceSet !== false || options.searchCriteria !== false)) {
|
|
39
30
|
return refuse(command + ' is not allowed once UIDONLY is enabled, use UID ' + command);
|
|
40
31
|
}
|
|
41
|
-
|
|
42
32
|
// section 3.5: the <sequence set> search key is prohibited, also in UID SORT and UID THREAD
|
|
43
33
|
if (isUid && options.searchCriteria !== false && connection.usesSequenceNumbers(parsed)) {
|
|
44
34
|
return refuse('Message numbers are not allowed in the search criteria once UIDONLY is enabled, use UID <sequence set>');
|
|
45
35
|
}
|
|
46
|
-
|
|
47
36
|
// section 3.7: the fourth QRESYNC parameter (message sequence match data) MUST NOT be used
|
|
48
|
-
if ((command === 'SELECT' || command === 'EXAMINE') &&
|
|
37
|
+
if ((command === 'SELECT' || command === 'EXAMINE') && parsed.attributes && Array.isArray(parsed.attributes[1])) {
|
|
49
38
|
const params = parsed.attributes[1];
|
|
50
|
-
const position = params.findIndex(param => isAtom(param, 'QRESYNC'));
|
|
39
|
+
const position = params.findIndex((param) => isAtom(param, 'QRESYNC'));
|
|
51
40
|
const value = position >= 0 && params[position + 1];
|
|
52
41
|
if (Array.isArray(value) && value.slice(2).some(Array.isArray)) {
|
|
53
42
|
return refuse('QRESYNC message sequence match data is not allowed once UIDONLY is enabled');
|
|
54
43
|
}
|
|
55
44
|
}
|
|
56
|
-
|
|
57
45
|
return false;
|
|
58
46
|
};
|
|
59
|
-
|
|
60
47
|
server.commandChecks.push((connection, parsed) => isUidonly(connection) && getRefusal(connection, parsed));
|
|
61
|
-
|
|
62
48
|
// a prohibited command is refused before its literal is sent, before other checks that would answer NO
|
|
63
49
|
server.literalFilters.unshift((connection, command) => isUidonly(connection) && getRefusal(connection, { command }));
|
|
64
|
-
|
|
65
|
-
server.connectionHandlers.push(connection => {
|
|
50
|
+
server.connectionHandlers.push((connection) => {
|
|
66
51
|
// RFC 3501 section 5.5 is about commands with message numbers, these are all refused with
|
|
67
52
|
// BAD [UIDREQUIRED] once UIDONLY is enabled, as if they had waited
|
|
68
53
|
const isAmbiguous = connection.isAmbiguous;
|
|
69
54
|
connection.isAmbiguous = function (parsed) {
|
|
70
55
|
return !isUidonly(this) && isAmbiguous.call(this, parsed);
|
|
71
56
|
};
|
|
72
|
-
|
|
73
57
|
// RFC 9586 sections 3.4 and 3.6: expunges are announced with VANISHED instead of EXPUNGE, EXISTS and
|
|
74
58
|
// RECENT stay as they are
|
|
75
59
|
const prepareNotifications = connection.prepareNotifications;
|
|
@@ -78,24 +62,20 @@ module.exports = function (server) {
|
|
|
78
62
|
return isUidonly(this) ? toVanished(queue) : queue;
|
|
79
63
|
};
|
|
80
64
|
});
|
|
81
|
-
|
|
82
65
|
// RFC 9586 section 3: the server MUST NOT return message sequence numbers in any response
|
|
83
66
|
const outputHandler = (connection, response, description, parsed, data, extra) => {
|
|
84
67
|
if (!response || response.tag !== '*' || !Array.isArray(response.attributes) || !isUidonly(connection)) {
|
|
85
68
|
return;
|
|
86
69
|
}
|
|
87
70
|
const attributes = response.attributes;
|
|
88
|
-
|
|
89
71
|
// the UNSEEN response code of SELECT and EXAMINE is a message number (RFC 3501 section 7.1)
|
|
90
72
|
if (response.command === 'OK' && attributes[0] && attributes[0].type === 'SECTION' && isAtom(attributes[0].section[0], 'UNSEEN')) {
|
|
91
73
|
response.skipResponse = true;
|
|
92
74
|
return;
|
|
93
75
|
}
|
|
94
|
-
|
|
95
76
|
if (!isAtom(attributes[1], 'FETCH') || !Array.isArray(attributes[2])) {
|
|
96
77
|
return;
|
|
97
78
|
}
|
|
98
|
-
|
|
99
79
|
// section 3.3: uidfetch-resp = uniqueid SP "UIDFETCH" SP msg-att
|
|
100
80
|
// FETCH responses pass their message as `extra`, notifications like the MessageNew FETCH of NOTIFY carry it
|
|
101
81
|
const list = attributes[2];
|
|
@@ -107,7 +87,6 @@ module.exports = function (server) {
|
|
|
107
87
|
response.skipResponse = true;
|
|
108
88
|
return;
|
|
109
89
|
}
|
|
110
|
-
|
|
111
90
|
// the UID data item is only included if the client asked for it, like in the examples of section 3.3
|
|
112
91
|
if (parsed && !('uidonlyKeepUid' in parsed)) {
|
|
113
92
|
parsed.uidonlyKeepUid = requestsUid(parsed);
|
|
@@ -118,12 +97,10 @@ module.exports = function (server) {
|
|
|
118
97
|
}
|
|
119
98
|
response.attributes = [uid, { type: 'ATOM', value: 'UIDFETCH' }, items];
|
|
120
99
|
};
|
|
121
|
-
|
|
122
100
|
// registered once every plugin is loaded, so that the other output handlers see the FETCH responses they
|
|
123
101
|
// know before these are turned into UIDFETCH responses
|
|
124
102
|
server.once('pluginsLoaded', () => server.outputHandlers.push(outputHandler));
|
|
125
|
-
}
|
|
126
|
-
|
|
103
|
+
}
|
|
127
104
|
// Checks if a UID FETCH command lists the UID data item
|
|
128
105
|
function requestsUid(parsed) {
|
|
129
106
|
if (String(parsed.command || '').toUpperCase() !== 'UID FETCH' || !parsed.attributes) {
|
|
@@ -131,5 +108,4 @@ function requestsUid(parsed) {
|
|
|
131
108
|
}
|
|
132
109
|
return [].concat(parsed.attributes[1] || []).some(item => isAtom(item, 'UID'));
|
|
133
110
|
}
|
|
134
|
-
|
|
135
|
-
module.exports.requires = ['ENABLE'];
|
|
111
|
+
uidonlyPlugin.requires = ['ENABLE'];
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { IMAPServer } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* @help Adds UIDPLUS [RFC4315] capability
|
|
4
|
+
*
|
|
5
|
+
* UIDPLUS: http://tools.ietf.org/html/rfc4315
|
|
6
|
+
*
|
|
7
|
+
* Additional commands:
|
|
8
|
+
* - UID EXPUNGE
|
|
9
|
+
*
|
|
10
|
+
* Additional response codes:
|
|
11
|
+
* - APPENDUID (with a UID set for MULTIAPPEND, and in an untagged OK for REPLACE)
|
|
12
|
+
* - COPYUID
|
|
13
|
+
* - Not implemented: UIDNOTSTICKY
|
|
14
|
+
*/
|
|
15
|
+
export default function uidplusPlugin(server: IMAPServer): void;
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const { toSequenceSet } = require('../esearch');
|
|
4
|
-
|
|
1
|
+
import { toSequenceSet } from '../esearch.js';
|
|
5
2
|
/**
|
|
6
3
|
* @help Adds UIDPLUS [RFC4315] capability
|
|
7
4
|
*
|
|
@@ -15,63 +12,47 @@ const { toSequenceSet } = require('../esearch');
|
|
|
15
12
|
* - COPYUID
|
|
16
13
|
* - Not implemented: UIDNOTSTICKY
|
|
17
14
|
*/
|
|
18
|
-
|
|
15
|
+
export default function uidplusPlugin(server) {
|
|
19
16
|
server.registerCapability('UIDPLUS');
|
|
20
|
-
|
|
21
17
|
server.setCommandHandler('UID EXPUNGE', (connection, parsed, data, callback) => {
|
|
22
18
|
if (!parsed.attributes || parsed.attributes.length !== 1 || !parsed.attributes[0] || ['ATOM', 'SEQUENCE'].indexOf(parsed.attributes[0].type) < 0) {
|
|
23
|
-
connection.send(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
},
|
|
34
|
-
'INVALID COMMAND',
|
|
35
|
-
parsed,
|
|
36
|
-
data
|
|
37
|
-
);
|
|
19
|
+
connection.send({
|
|
20
|
+
tag: parsed.tag,
|
|
21
|
+
command: 'BAD',
|
|
22
|
+
attributes: [
|
|
23
|
+
{
|
|
24
|
+
type: 'TEXT',
|
|
25
|
+
value: 'UID EXPUNGE expects uid sequence set'
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}, 'INVALID COMMAND', parsed, data);
|
|
38
29
|
return callback();
|
|
39
30
|
}
|
|
40
|
-
|
|
41
31
|
if (connection.refuseReadOnly(parsed, data, 'UID EXPUNGE FAILED')) {
|
|
42
32
|
return callback();
|
|
43
33
|
}
|
|
44
|
-
|
|
45
34
|
const sequence = parsed.attributes[0].value;
|
|
46
35
|
const range = connection.limitRange(parsed, connection.getMessageRange(sequence, true));
|
|
47
36
|
// Only messages with the \Deleted flag are removed (RFC 4315 section 2.1)
|
|
48
|
-
const rangeMessages = range.map(x => x[1]).filter(message => message.flags.indexOf('\\Deleted') >= 0);
|
|
49
|
-
|
|
37
|
+
const rangeMessages = range.map(x => x[1]).filter((message) => message.flags.indexOf('\\Deleted') >= 0);
|
|
50
38
|
connection.expungeSpecificMessages(connection.selectedMailbox, rangeMessages, false, true, !!parsed.highestFirst);
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
]
|
|
62
|
-
},
|
|
63
|
-
'UID EXPUNGE',
|
|
64
|
-
parsed,
|
|
65
|
-
data
|
|
66
|
-
);
|
|
39
|
+
connection.send({
|
|
40
|
+
tag: parsed.tag,
|
|
41
|
+
command: 'OK',
|
|
42
|
+
attributes: [
|
|
43
|
+
{
|
|
44
|
+
type: 'TEXT',
|
|
45
|
+
value: 'UID EXPUNGE completed'
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}, 'UID EXPUNGE', parsed, data);
|
|
67
49
|
callback();
|
|
68
50
|
});
|
|
69
|
-
|
|
70
51
|
server.outputHandlers.push((connection, response, description, parsed, data, extra) => {
|
|
71
52
|
if (description === 'APPEND' || description === 'REPLACE APPENDUID') {
|
|
72
53
|
// OK [APPENDUID <target-mailbox-uidvalidity> <uid>] APPEND Completed. With MULTIAPPEND the
|
|
73
54
|
// second value is a UID set, but never for a single message (RFC 4315 section 3)
|
|
74
|
-
const uids = extra.messages.map(message => message.uid);
|
|
55
|
+
const uids = extra.messages.map((message) => message.uid);
|
|
75
56
|
response.attributes = [
|
|
76
57
|
{
|
|
77
58
|
type: 'SECTION',
|
|
@@ -89,7 +70,6 @@ module.exports = function (server) {
|
|
|
89
70
|
response.skipResponse = false;
|
|
90
71
|
return;
|
|
91
72
|
}
|
|
92
|
-
|
|
93
73
|
if (description === 'COPY' || description === 'UID COPY' || description === 'MOVE COPYUID' || description === 'UID MOVE COPYUID') {
|
|
94
74
|
// Nothing was copied, an empty COPYUID would break the response grammar
|
|
95
75
|
if (!extra || !extra.sourceUids || !extra.sourceUids.length) {
|
|
@@ -121,4 +101,4 @@ module.exports = function (server) {
|
|
|
121
101
|
return;
|
|
122
102
|
}
|
|
123
103
|
});
|
|
124
|
-
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { IMAPServer } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* @help Adds UNAUTHENTICATE [RFC8437] capability
|
|
4
|
+
* @help Returns to the Not Authenticated state, everything
|
|
5
|
+
* @help but TLS is reset (selected mailbox, ENABLE, COMPRESS)
|
|
6
|
+
*/
|
|
7
|
+
export default function unauthenticatePlugin(server: IMAPServer): void;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { states } from '../command-states.js';
|
|
2
|
+
/**
|
|
3
|
+
* @help Adds UNAUTHENTICATE [RFC8437] capability
|
|
4
|
+
* @help Returns to the Not Authenticated state, everything
|
|
5
|
+
* @help but TLS is reset (selected mailbox, ENABLE, COMPRESS)
|
|
6
|
+
*/
|
|
7
|
+
export default function unauthenticatePlugin(server) {
|
|
8
|
+
server.registerCapability('UNAUTHENTICATE');
|
|
9
|
+
server.setCommandHandler('UNAUTHENTICATE', (connection, parsed, data, callback) => {
|
|
10
|
+
// RFC 8437 section 3: a NO response is not permitted, the reset can not fail here
|
|
11
|
+
connection.sendStatus(parsed, data, 'OK', 'Completed, now in not authenticated state');
|
|
12
|
+
// RFC 8437 sections 3 and 4.1: the mailbox is closed without EXPUNGE responses, ENABLEd
|
|
13
|
+
// extensions and CONDSTORE are turned off, and compression ends after the CRLF of the OK
|
|
14
|
+
connection.resetSession();
|
|
15
|
+
return callback();
|
|
16
|
+
}, { states: states.AUTHENTICATED, noArguments: true });
|
|
17
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { states } from '../command-states.js';
|
|
2
|
+
/**
|
|
3
|
+
* @help Adds UNSELECT [RFC3691] capability
|
|
4
|
+
*/
|
|
5
|
+
export default function unselectPlugin(server) {
|
|
6
|
+
server.registerCapability('UNSELECT');
|
|
7
|
+
server.setCommandHandler('UNSELECT', (connection, parsed, data, callback) => {
|
|
8
|
+
connection.send({
|
|
9
|
+
tag: parsed.tag,
|
|
10
|
+
command: 'OK',
|
|
11
|
+
attributes: [
|
|
12
|
+
{
|
|
13
|
+
type: 'TEXT',
|
|
14
|
+
value: 'Mailbox closed'
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}, 'CLOSE', parsed, data);
|
|
18
|
+
connection.closeMailbox();
|
|
19
|
+
return callback();
|
|
20
|
+
}, { states: states.SELECTED, noArguments: true });
|
|
21
|
+
}
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const { updateSession } = require('../utf8-session');
|
|
4
|
-
const { registerEnable } = require('./enable');
|
|
5
|
-
|
|
1
|
+
import { updateSession } from '../utf8-session.js';
|
|
2
|
+
import { registerEnable } from './enable.js';
|
|
6
3
|
/**
|
|
7
4
|
* @help Adds UTF8=ACCEPT [RFC9755] capability, loads ENABLE as well
|
|
8
5
|
* @help After ENABLE UTF8=ACCEPT mailbox names are UTF-8 instead of
|
|
9
6
|
* @help modified UTF-7 and strings are sent quoted as UTF-8
|
|
10
7
|
*/
|
|
11
|
-
|
|
12
8
|
/**
|
|
13
9
|
* Checks if the header of a message holds 8-bit octets
|
|
14
10
|
*
|
|
@@ -19,21 +15,17 @@ function has8bitHeader(raw) {
|
|
|
19
15
|
const match = raw.match(/\r?\n\r?\n/);
|
|
20
16
|
return /[\x80-\xff]/.test(match ? raw.substr(0, match.index) : raw);
|
|
21
17
|
}
|
|
22
|
-
|
|
23
|
-
module.exports = function (server) {
|
|
18
|
+
export default function utf8AcceptPlugin(server) {
|
|
24
19
|
// RFC 9755 section 3: the client turns UTF-8 support on with ENABLE
|
|
25
20
|
server.registerCapability('UTF8=ACCEPT');
|
|
26
|
-
|
|
27
21
|
registerEnable(server, 'UTF8=ACCEPT');
|
|
28
|
-
|
|
29
22
|
// RFC 9755 section 3: a server that supports UTF8=ACCEPT accepts UTF-8 in quoted strings. Before
|
|
30
23
|
// ENABLE, mailbox names must still be modified UTF-7 and SEARCH needs CHARSET UTF-8 for 8-bit strings.
|
|
31
|
-
// See
|
|
24
|
+
// See src/utf8-session.ts, the session state is shared with IMAP4rev2
|
|
32
25
|
server.utf8Accept = true;
|
|
33
26
|
server.connectionHandlers.push(updateSession);
|
|
34
27
|
// RFC 8437 section 3: UNAUTHENTICATE resets the ENABLEd extensions
|
|
35
28
|
server.resetHandlers.push(updateSession);
|
|
36
|
-
|
|
37
29
|
server.outputHandlers.push((connection, response, description, parsed, data, extra) => {
|
|
38
30
|
if (description === 'ENABLED' && Array.isArray(extra) && extra.indexOf('UTF8=ACCEPT') >= 0) {
|
|
39
31
|
// strings that are valid UTF-8 are sent quoted, mailbox names are UTF-8 in both directions
|
|
@@ -41,7 +33,6 @@ module.exports = function (server) {
|
|
|
41
33
|
updateSession(connection);
|
|
42
34
|
}
|
|
43
35
|
});
|
|
44
|
-
|
|
45
36
|
// RFC 9755 section 4: without ENABLE UTF8=ACCEPT, APPEND MUST be refused with NO
|
|
46
37
|
// if the message header has 8-bit characters
|
|
47
38
|
const appendHandler = server.getCommandHandler('APPEND');
|
|
@@ -49,20 +40,18 @@ module.exports = function (server) {
|
|
|
49
40
|
const args = parsed.attributes || [];
|
|
50
41
|
const raw = args[args.length - 1];
|
|
51
42
|
if (
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
43
|
+
// UTF-8 is on after ENABLE UTF8=ACCEPT, or IMAP4rev2, which permits 8-bit characters in the message
|
|
44
|
+
// (RFC 9051 section 6.3.12) and which RFC 9755 does not extend
|
|
45
|
+
!connection.utf8Enabled &&
|
|
55
46
|
args.length >= 2 &&
|
|
56
47
|
raw &&
|
|
57
48
|
['LITERAL', 'LITERAL8'].indexOf(raw.type) >= 0 &&
|
|
58
|
-
has8bitHeader(raw.value || '')
|
|
59
|
-
) {
|
|
49
|
+
has8bitHeader(raw.value || '')) {
|
|
60
50
|
connection.sendStatus(parsed, data, 'NO', 'Message header has 8-bit characters, ENABLE UTF8=ACCEPT first (RFC 9755 section 4)');
|
|
61
51
|
return callback();
|
|
62
52
|
}
|
|
63
53
|
return appendHandler(connection, parsed, data, callback);
|
|
64
54
|
});
|
|
65
|
-
}
|
|
66
|
-
|
|
55
|
+
}
|
|
67
56
|
// ENABLE UTF8=ACCEPT is the only way to use this extension
|
|
68
|
-
|
|
57
|
+
utf8AcceptPlugin.requires = ['ENABLE'];
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { IMAPServer } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* @help Adds Gmail specific X-GM-EXT-1 capability
|
|
4
|
+
* @help (https://developers.google.com/workspace/gmail/imap/imap-extensions)
|
|
5
|
+
* @help X-GM-MSGID and X-GM-THRID: FETCH and SEARCH. X-GM-THRID is the
|
|
6
|
+
* @help X-GM-MSGID of the message unless storage sets an X-GM-THRID
|
|
7
|
+
* @help value, so every message is its own thread unless the
|
|
8
|
+
* @help fixture groups messages. With OBJECTID, the messages of a
|
|
9
|
+
* @help THREADID share the X-GM-THRID of its first message
|
|
10
|
+
* @help X-GM-LABELS: FETCH, STORE (+/-, .SILENT) and SEARCH. System
|
|
11
|
+
* @help labels are atoms that start with "\" (\Inbox for INBOX, the
|
|
12
|
+
* @help special-use attribute for special-use mailboxes), other labels
|
|
13
|
+
* @help are mailbox names, sent like mailbox names (modified UTF-7, or
|
|
14
|
+
* @help UTF-8 after ENABLE UTF8=ACCEPT, quoted when not atoms). Labels
|
|
15
|
+
* @help have no side effects: the message is not copied to or removed
|
|
16
|
+
* @help from other mailboxes. In SEARCH a label that starts with "\"
|
|
17
|
+
* @help is a system label
|
|
18
|
+
* @help X-GM-RAW: a subset of the Gmail search syntax. Words and "quoted
|
|
19
|
+
* @help phrases" (TEXT), -term, OR, (groups), {any of}, from: to: cc:
|
|
20
|
+
* @help bcc: subject: label: in: (inbox sent drafts trash spam
|
|
21
|
+
* @help anywhere, or a label) is: (read unread starred important)
|
|
22
|
+
* @help larger: smaller: (k and m suffixes) after: before:
|
|
23
|
+
* @help (YYYY/MM/DD) and rfc822msgid:. Other Gmail operators are
|
|
24
|
+
* @help answered with NO
|
|
25
|
+
*/
|
|
26
|
+
export default function xGmExt1Plugin(server: IMAPServer): void;
|