imapkit 4.0.2 → 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.
Files changed (485) hide show
  1. package/README.md +32 -19
  2. package/bin/imapkit.js +12 -16
  3. package/dist/cjs/addressparser.d.ts +21 -0
  4. package/dist/cjs/addressparser.js +277 -0
  5. package/dist/cjs/arguments.d.ts +31 -0
  6. package/{lib → dist/cjs}/arguments.js +9 -21
  7. package/dist/cjs/bodystructure.d.ts +25 -0
  8. package/dist/cjs/bodystructure.js +150 -0
  9. package/dist/cjs/cert.d.ts +2 -0
  10. package/dist/cjs/cert.js +7 -0
  11. package/dist/cjs/command-states.d.ts +36 -0
  12. package/dist/cjs/command-states.js +102 -0
  13. package/dist/cjs/commands/append.d.ts +88 -0
  14. package/dist/cjs/commands/append.js +299 -0
  15. package/dist/cjs/commands/capability.d.ts +2 -0
  16. package/dist/cjs/commands/capability.js +44 -0
  17. package/dist/cjs/commands/check.d.ts +2 -0
  18. package/dist/cjs/commands/check.js +28 -0
  19. package/dist/cjs/commands/close.d.ts +2 -0
  20. package/dist/cjs/commands/close.js +35 -0
  21. package/dist/cjs/commands/copy.d.ts +30 -0
  22. package/dist/cjs/commands/copy.js +107 -0
  23. package/dist/cjs/commands/create.d.ts +2 -0
  24. package/dist/cjs/commands/create.js +53 -0
  25. package/dist/cjs/commands/delete.d.ts +2 -0
  26. package/dist/cjs/commands/delete.js +63 -0
  27. package/dist/cjs/commands/examine.d.ts +2 -0
  28. package/dist/cjs/commands/examine.js +19 -0
  29. package/dist/cjs/commands/expunge.d.ts +2 -0
  30. package/dist/cjs/commands/expunge.js +32 -0
  31. package/dist/cjs/commands/fetch.d.ts +23 -0
  32. package/dist/cjs/commands/fetch.js +208 -0
  33. package/dist/cjs/commands/handlers/fetch.d.ts +12 -0
  34. package/dist/cjs/commands/handlers/fetch.js +195 -0
  35. package/dist/cjs/commands/handlers/flags.d.ts +17 -0
  36. package/dist/cjs/commands/handlers/flags.js +39 -0
  37. package/dist/cjs/commands/handlers/search.d.ts +85 -0
  38. package/dist/cjs/commands/handlers/search.js +504 -0
  39. package/dist/cjs/commands/handlers/status.d.ts +34 -0
  40. package/dist/cjs/commands/handlers/status.js +81 -0
  41. package/dist/cjs/commands/handlers/store.d.ts +3 -0
  42. package/dist/cjs/commands/handlers/store.js +117 -0
  43. package/dist/cjs/commands/index.d.ts +2 -0
  44. package/dist/cjs/commands/index.js +61 -0
  45. package/dist/cjs/commands/list.d.ts +2 -0
  46. package/dist/cjs/commands/list.js +86 -0
  47. package/dist/cjs/commands/login.d.ts +2 -0
  48. package/dist/cjs/commands/login.js +62 -0
  49. package/dist/cjs/commands/logout.d.ts +2 -0
  50. package/dist/cjs/commands/logout.js +40 -0
  51. package/dist/cjs/commands/lsub.d.ts +2 -0
  52. package/dist/cjs/commands/lsub.js +79 -0
  53. package/dist/cjs/commands/noop.d.ts +2 -0
  54. package/dist/cjs/commands/noop.js +28 -0
  55. package/dist/cjs/commands/rename.d.ts +2 -0
  56. package/dist/cjs/commands/rename.js +98 -0
  57. package/dist/cjs/commands/search.d.ts +10 -0
  58. package/dist/cjs/commands/search.js +71 -0
  59. package/dist/cjs/commands/select.d.ts +19 -0
  60. package/dist/cjs/commands/select.js +230 -0
  61. package/dist/cjs/commands/status.d.ts +2 -0
  62. package/dist/cjs/commands/status.js +57 -0
  63. package/dist/cjs/commands/store.d.ts +10 -0
  64. package/dist/cjs/commands/store.js +134 -0
  65. package/dist/cjs/commands/subscribe.d.ts +2 -0
  66. package/dist/cjs/commands/subscribe.js +51 -0
  67. package/dist/cjs/commands/uid-copy.d.ts +2 -0
  68. package/dist/cjs/commands/uid-copy.js +19 -0
  69. package/dist/cjs/commands/uid-fetch.d.ts +3 -0
  70. package/dist/cjs/commands/uid-fetch.js +17 -0
  71. package/dist/cjs/commands/uid-search.d.ts +3 -0
  72. package/dist/cjs/commands/uid-search.js +17 -0
  73. package/dist/cjs/commands/uid-store.d.ts +3 -0
  74. package/dist/cjs/commands/uid-store.js +17 -0
  75. package/dist/cjs/commands/unsubscribe.d.ts +2 -0
  76. package/dist/cjs/commands/unsubscribe.js +50 -0
  77. package/dist/cjs/dates.d.ts +64 -0
  78. package/dist/cjs/dates.js +124 -0
  79. package/dist/cjs/deflate-layer.d.ts +83 -0
  80. package/dist/cjs/deflate-layer.js +232 -0
  81. package/dist/cjs/encoded-words.d.ts +15 -0
  82. package/dist/cjs/encoded-words.js +85 -0
  83. package/dist/cjs/envelope.d.ts +33 -0
  84. package/dist/cjs/envelope.js +86 -0
  85. package/dist/cjs/esearch.d.ts +96 -0
  86. package/dist/cjs/esearch.js +190 -0
  87. package/dist/cjs/framing.d.ts +66 -0
  88. package/{lib → dist/cjs}/framing.js +9 -26
  89. package/dist/cjs/index.d.ts +9 -0
  90. package/dist/cjs/index.js +56 -0
  91. package/dist/cjs/list-extensions.d.ts +50 -0
  92. package/dist/cjs/list-extensions.js +35 -0
  93. package/dist/cjs/load-plugins.d.ts +21 -0
  94. package/dist/cjs/load-plugins.js +89 -0
  95. package/dist/cjs/mailbox-name.d.ts +26 -0
  96. package/dist/cjs/mailbox-name.js +127 -0
  97. package/dist/cjs/mimeparser.d.ts +137 -0
  98. package/dist/cjs/mimeparser.js +727 -0
  99. package/dist/cjs/mock-client.d.ts +39 -0
  100. package/dist/cjs/mock-client.js +236 -0
  101. package/dist/cjs/numbers.d.ts +28 -0
  102. package/dist/cjs/numbers.js +52 -0
  103. package/dist/cjs/package.json +3 -0
  104. package/dist/cjs/plugins/acl.d.ts +2 -0
  105. package/dist/cjs/plugins/acl.js +888 -0
  106. package/dist/cjs/plugins/appendlimit.d.ts +16 -0
  107. package/dist/cjs/plugins/appendlimit.js +87 -0
  108. package/dist/cjs/plugins/auth-plain.d.ts +2 -0
  109. package/dist/cjs/plugins/auth-plain.js +89 -0
  110. package/dist/cjs/plugins/binary.d.ts +30 -0
  111. package/dist/cjs/plugins/binary.js +247 -0
  112. package/dist/cjs/plugins/catenate.d.ts +14 -0
  113. package/dist/cjs/plugins/catenate.js +250 -0
  114. package/dist/cjs/plugins/compress.d.ts +7 -0
  115. package/dist/cjs/plugins/compress.js +79 -0
  116. package/dist/cjs/plugins/condstore.d.ts +5 -0
  117. package/dist/cjs/plugins/condstore.js +492 -0
  118. package/dist/cjs/plugins/context-search.d.ts +8 -0
  119. package/dist/cjs/plugins/context-search.js +304 -0
  120. package/dist/cjs/plugins/context-sort.d.ts +6 -0
  121. package/dist/cjs/plugins/context-sort.js +32 -0
  122. package/dist/cjs/plugins/create-special-use.d.ts +7 -0
  123. package/dist/cjs/plugins/create-special-use.js +101 -0
  124. package/dist/cjs/plugins/enable.d.ts +23 -0
  125. package/dist/cjs/plugins/enable.js +127 -0
  126. package/dist/cjs/plugins/esearch.d.ts +6 -0
  127. package/dist/cjs/plugins/esearch.js +142 -0
  128. package/dist/cjs/plugins/esort.d.ts +6 -0
  129. package/dist/cjs/plugins/esort.js +60 -0
  130. package/dist/cjs/plugins/id.d.ts +5 -0
  131. package/dist/cjs/plugins/id.js +123 -0
  132. package/dist/cjs/plugins/idle.d.ts +5 -0
  133. package/dist/cjs/plugins/idle.js +85 -0
  134. package/dist/cjs/plugins/imap4rev2.d.ts +6 -0
  135. package/dist/cjs/plugins/imap4rev2.js +184 -0
  136. package/dist/cjs/plugins/index.d.ts +2 -0
  137. package/dist/cjs/plugins/index.js +119 -0
  138. package/dist/cjs/plugins/list-extended.d.ts +2 -0
  139. package/dist/cjs/plugins/list-extended.js +235 -0
  140. package/dist/cjs/plugins/list-status.d.ts +6 -0
  141. package/dist/cjs/plugins/list-status.js +42 -0
  142. package/dist/cjs/plugins/literalminus.d.ts +8 -0
  143. package/dist/cjs/plugins/literalminus.js +32 -0
  144. package/dist/cjs/plugins/literalplus.d.ts +6 -0
  145. package/dist/cjs/plugins/literalplus.js +30 -0
  146. package/dist/cjs/plugins/logindisabled.d.ts +5 -0
  147. package/dist/cjs/plugins/logindisabled.js +54 -0
  148. package/dist/cjs/plugins/messagelimit.d.ts +19 -0
  149. package/dist/cjs/plugins/messagelimit.js +227 -0
  150. package/dist/cjs/plugins/metadata-server.d.ts +7 -0
  151. package/dist/cjs/plugins/metadata-server.js +24 -0
  152. package/dist/cjs/plugins/metadata.d.ts +11 -0
  153. package/dist/cjs/plugins/metadata.js +436 -0
  154. package/dist/cjs/plugins/move.d.ts +11 -0
  155. package/dist/cjs/plugins/move.js +96 -0
  156. package/dist/cjs/plugins/multiappend.d.ts +12 -0
  157. package/dist/cjs/plugins/multiappend.js +38 -0
  158. package/dist/cjs/plugins/multisearch.d.ts +6 -0
  159. package/dist/cjs/plugins/multisearch.js +263 -0
  160. package/dist/cjs/plugins/namespace.d.ts +5 -0
  161. package/dist/cjs/plugins/namespace.js +57 -0
  162. package/dist/cjs/plugins/notify.d.ts +2 -0
  163. package/dist/cjs/plugins/notify.js +628 -0
  164. package/dist/cjs/plugins/oauthbearer.d.ts +32 -0
  165. package/dist/cjs/plugins/oauthbearer.js +202 -0
  166. package/dist/cjs/plugins/objectid.d.ts +23 -0
  167. package/dist/cjs/plugins/objectid.js +221 -0
  168. package/dist/cjs/plugins/partial.d.ts +6 -0
  169. package/dist/cjs/plugins/partial.js +78 -0
  170. package/dist/cjs/plugins/preview.d.ts +31 -0
  171. package/dist/cjs/plugins/preview.js +378 -0
  172. package/dist/cjs/plugins/qresync.d.ts +11 -0
  173. package/dist/cjs/plugins/qresync.js +473 -0
  174. package/dist/cjs/plugins/quota.d.ts +18 -0
  175. package/dist/cjs/plugins/quota.js +254 -0
  176. package/dist/cjs/plugins/replace.d.ts +14 -0
  177. package/dist/cjs/plugins/replace.js +130 -0
  178. package/dist/cjs/plugins/sasl-ir.d.ts +5 -0
  179. package/dist/cjs/plugins/sasl-ir.js +24 -0
  180. package/dist/cjs/plugins/savedate.d.ts +17 -0
  181. package/dist/cjs/plugins/savedate.js +64 -0
  182. package/dist/cjs/plugins/savelimit.d.ts +10 -0
  183. package/dist/cjs/plugins/savelimit.js +30 -0
  184. package/dist/cjs/plugins/searchres.d.ts +6 -0
  185. package/dist/cjs/plugins/searchres.js +91 -0
  186. package/dist/cjs/plugins/sort-display.d.ts +11 -0
  187. package/dist/cjs/plugins/sort-display.js +37 -0
  188. package/dist/cjs/plugins/sort.d.ts +11 -0
  189. package/dist/cjs/plugins/sort.js +125 -0
  190. package/dist/cjs/plugins/special-use.d.ts +10 -0
  191. package/dist/cjs/plugins/special-use.js +95 -0
  192. package/dist/cjs/plugins/starttls.d.ts +5 -0
  193. package/dist/cjs/plugins/starttls.js +55 -0
  194. package/dist/cjs/plugins/status-size.d.ts +7 -0
  195. package/dist/cjs/plugins/status-size.js +30 -0
  196. package/dist/cjs/plugins/thread-orderedsubject.d.ts +11 -0
  197. package/dist/cjs/plugins/thread-orderedsubject.js +28 -0
  198. package/dist/cjs/plugins/thread-references.d.ts +11 -0
  199. package/dist/cjs/plugins/thread-references.js +28 -0
  200. package/dist/cjs/plugins/uidonly.d.ts +15 -0
  201. package/dist/cjs/plugins/uidonly.js +126 -0
  202. package/dist/cjs/plugins/uidplus.d.ts +15 -0
  203. package/dist/cjs/plugins/uidplus.js +119 -0
  204. package/dist/cjs/plugins/unauthenticate.d.ts +7 -0
  205. package/dist/cjs/plugins/unauthenticate.js +32 -0
  206. package/dist/cjs/plugins/unselect.d.ts +5 -0
  207. package/dist/cjs/plugins/unselect.js +36 -0
  208. package/dist/cjs/plugins/utf8-accept.d.ts +6 -0
  209. package/dist/cjs/plugins/utf8-accept.js +72 -0
  210. package/dist/cjs/plugins/x-gm-ext-1.d.ts +26 -0
  211. package/dist/cjs/plugins/x-gm-ext-1.js +422 -0
  212. package/dist/cjs/plugins/xoauth2.d.ts +2 -0
  213. package/dist/cjs/plugins/xoauth2.js +155 -0
  214. package/dist/cjs/plugins/xtoybird.d.ts +2 -0
  215. package/dist/cjs/plugins/xtoybird.js +236 -0
  216. package/dist/cjs/server.d.ts +876 -0
  217. package/dist/cjs/server.js +2597 -0
  218. package/dist/cjs/smtp-listener.d.ts +13 -0
  219. package/dist/cjs/smtp-listener.js +47 -0
  220. package/dist/cjs/sorting.d.ts +77 -0
  221. package/dist/cjs/sorting.js +290 -0
  222. package/dist/cjs/threading.d.ts +30 -0
  223. package/dist/cjs/threading.js +318 -0
  224. package/dist/cjs/types.d.ts +327 -0
  225. package/dist/cjs/types.js +3 -0
  226. package/dist/cjs/utf8-session.d.ts +17 -0
  227. package/dist/cjs/utf8-session.js +148 -0
  228. package/dist/cjs/vanished.d.ts +21 -0
  229. package/dist/cjs/vanished.js +55 -0
  230. package/dist/esm/addressparser.d.ts +21 -0
  231. package/{lib → dist/esm}/addressparser.js +102 -123
  232. package/dist/esm/arguments.d.ts +31 -0
  233. package/dist/esm/arguments.js +96 -0
  234. package/dist/esm/bodystructure.d.ts +25 -0
  235. package/{lib → dist/esm}/bodystructure.js +17 -33
  236. package/dist/esm/cert.d.ts +2 -0
  237. package/dist/esm/cert.js +4 -0
  238. package/dist/esm/command-states.d.ts +36 -0
  239. package/{lib → dist/esm}/command-states.js +4 -16
  240. package/dist/esm/commands/append.d.ts +88 -0
  241. package/{lib → dist/esm}/commands/append.js +47 -85
  242. package/dist/esm/commands/capability.d.ts +2 -0
  243. package/dist/esm/commands/capability.js +29 -0
  244. package/dist/esm/commands/check.d.ts +2 -0
  245. package/dist/esm/commands/check.js +13 -0
  246. package/dist/esm/commands/close.d.ts +2 -0
  247. package/dist/esm/commands/close.js +20 -0
  248. package/dist/esm/commands/copy.d.ts +30 -0
  249. package/{lib → dist/esm}/commands/copy.js +31 -55
  250. package/dist/esm/commands/create.d.ts +2 -0
  251. package/{lib → dist/esm}/commands/create.js +25 -39
  252. package/dist/esm/commands/delete.d.ts +2 -0
  253. package/{lib → dist/esm}/commands/delete.js +25 -41
  254. package/dist/esm/commands/examine.d.ts +2 -0
  255. package/dist/esm/commands/examine.js +4 -0
  256. package/dist/esm/commands/expunge.d.ts +2 -0
  257. package/dist/esm/commands/expunge.js +17 -0
  258. package/dist/esm/commands/fetch.d.ts +23 -0
  259. package/{lib → dist/esm}/commands/fetch.js +34 -75
  260. package/dist/esm/commands/handlers/fetch.d.ts +12 -0
  261. package/{lib → dist/esm}/commands/handlers/fetch.js +11 -42
  262. package/dist/esm/commands/handlers/flags.d.ts +17 -0
  263. package/{lib → dist/esm}/commands/handlers/flags.js +3 -11
  264. package/dist/esm/commands/handlers/search.d.ts +85 -0
  265. package/{lib → dist/esm}/commands/handlers/search.js +33 -71
  266. package/dist/esm/commands/handlers/status.d.ts +34 -0
  267. package/{lib → dist/esm}/commands/handlers/status.js +1 -9
  268. package/dist/esm/commands/handlers/store.d.ts +3 -0
  269. package/{lib → dist/esm}/commands/handlers/store.js +20 -44
  270. package/dist/esm/commands/index.d.ts +2 -0
  271. package/dist/esm/commands/index.js +55 -0
  272. package/dist/esm/commands/list.d.ts +2 -0
  273. package/dist/esm/commands/list.js +71 -0
  274. package/dist/esm/commands/login.d.ts +2 -0
  275. package/{lib → dist/esm}/commands/login.js +24 -44
  276. package/dist/esm/commands/logout.d.ts +2 -0
  277. package/dist/esm/commands/logout.js +25 -0
  278. package/dist/esm/commands/lsub.d.ts +2 -0
  279. package/dist/esm/commands/lsub.js +64 -0
  280. package/dist/esm/commands/noop.d.ts +2 -0
  281. package/dist/esm/commands/noop.js +13 -0
  282. package/dist/esm/commands/rename.d.ts +2 -0
  283. package/{lib → dist/esm}/commands/rename.js +32 -51
  284. package/dist/esm/commands/search.d.ts +10 -0
  285. package/dist/esm/commands/search.js +54 -0
  286. package/dist/esm/commands/select.d.ts +19 -0
  287. package/dist/esm/commands/select.js +214 -0
  288. package/dist/esm/commands/status.d.ts +2 -0
  289. package/{lib → dist/esm}/commands/status.js +18 -39
  290. package/dist/esm/commands/store.d.ts +10 -0
  291. package/{lib → dist/esm}/commands/store.js +39 -73
  292. package/dist/esm/commands/subscribe.d.ts +2 -0
  293. package/{lib → dist/esm}/commands/subscribe.js +22 -39
  294. package/dist/esm/commands/uid-copy.d.ts +2 -0
  295. package/dist/esm/commands/uid-copy.js +4 -0
  296. package/dist/esm/commands/uid-fetch.d.ts +3 -0
  297. package/dist/esm/commands/uid-fetch.js +3 -0
  298. package/dist/esm/commands/uid-search.d.ts +3 -0
  299. package/dist/esm/commands/uid-search.js +3 -0
  300. package/dist/esm/commands/uid-store.d.ts +3 -0
  301. package/dist/esm/commands/uid-store.js +3 -0
  302. package/dist/esm/commands/unsubscribe.d.ts +2 -0
  303. package/{lib → dist/esm}/commands/unsubscribe.js +22 -37
  304. package/dist/esm/dates.d.ts +64 -0
  305. package/{lib → dist/esm}/dates.js +6 -14
  306. package/dist/esm/deflate-layer.d.ts +83 -0
  307. package/{lib → dist/esm}/deflate-layer.js +9 -26
  308. package/dist/esm/encoded-words.d.ts +15 -0
  309. package/{lib → dist/esm}/encoded-words.js +9 -25
  310. package/dist/esm/envelope.d.ts +33 -0
  311. package/{lib → dist/esm}/envelope.js +8 -19
  312. package/dist/esm/esearch.d.ts +96 -0
  313. package/{lib → dist/esm}/esearch.js +12 -39
  314. package/dist/esm/framing.d.ts +66 -0
  315. package/dist/esm/framing.js +82 -0
  316. package/dist/esm/index.d.ts +9 -0
  317. package/dist/esm/index.js +6 -0
  318. package/dist/esm/list-extensions.d.ts +50 -0
  319. package/{lib → dist/esm}/list-extensions.js +1 -4
  320. package/dist/esm/load-plugins.d.ts +21 -0
  321. package/{lib → dist/esm}/load-plugins.js +9 -43
  322. package/dist/esm/mailbox-name.d.ts +26 -0
  323. package/{lib → dist/esm}/mailbox-name.js +5 -26
  324. package/dist/esm/mimeparser.d.ts +137 -0
  325. package/{lib → dist/esm}/mimeparser.js +74 -152
  326. package/dist/esm/mock-client.d.ts +39 -0
  327. package/{lib → dist/esm}/mock-client.js +26 -40
  328. package/dist/esm/numbers.d.ts +28 -0
  329. package/{lib → dist/esm}/numbers.js +1 -8
  330. package/dist/esm/package.json +3 -0
  331. package/dist/esm/plugins/acl.d.ts +2 -0
  332. package/{lib → dist/esm}/plugins/acl.js +146 -240
  333. package/dist/esm/plugins/appendlimit.d.ts +16 -0
  334. package/{lib → dist/esm}/plugins/appendlimit.js +5 -16
  335. package/dist/esm/plugins/auth-plain.d.ts +2 -0
  336. package/{lib → dist/esm}/plugins/auth-plain.js +11 -31
  337. package/dist/esm/plugins/binary.d.ts +30 -0
  338. package/{lib → dist/esm}/plugins/binary.js +17 -43
  339. package/dist/esm/plugins/catenate.d.ts +14 -0
  340. package/{lib → dist/esm}/plugins/catenate.js +19 -40
  341. package/dist/esm/plugins/compress.d.ts +7 -0
  342. package/dist/esm/plugins/compress.js +61 -0
  343. package/dist/esm/plugins/condstore.d.ts +5 -0
  344. package/{lib → dist/esm}/plugins/condstore.js +66 -152
  345. package/dist/esm/plugins/context-search.d.ts +8 -0
  346. package/{lib → dist/esm}/plugins/context-search.js +53 -88
  347. package/dist/esm/plugins/context-sort.d.ts +6 -0
  348. package/{lib → dist/esm}/plugins/context-sort.js +4 -9
  349. package/dist/esm/plugins/create-special-use.d.ts +7 -0
  350. package/{lib → dist/esm}/plugins/create-special-use.js +33 -55
  351. package/dist/esm/plugins/enable.d.ts +23 -0
  352. package/dist/esm/plugins/enable.js +111 -0
  353. package/dist/esm/plugins/esearch.d.ts +6 -0
  354. package/{lib → dist/esm}/plugins/esearch.js +13 -42
  355. package/dist/esm/plugins/esort.d.ts +6 -0
  356. package/{lib → dist/esm}/plugins/esort.js +7 -25
  357. package/dist/esm/plugins/id.d.ts +5 -0
  358. package/dist/esm/plugins/id.js +108 -0
  359. package/dist/esm/plugins/idle.d.ts +5 -0
  360. package/dist/esm/plugins/idle.js +70 -0
  361. package/dist/esm/plugins/imap4rev2.d.ts +6 -0
  362. package/{lib → dist/esm}/plugins/imap4rev2.js +24 -60
  363. package/dist/esm/plugins/index.d.ts +2 -0
  364. package/dist/esm/plugins/index.js +113 -0
  365. package/dist/esm/plugins/list-extended.d.ts +2 -0
  366. package/{lib → dist/esm}/plugins/list-extended.js +28 -66
  367. package/dist/esm/plugins/list-status.d.ts +6 -0
  368. package/{lib → dist/esm}/plugins/list-status.js +5 -12
  369. package/dist/esm/plugins/literalminus.d.ts +8 -0
  370. package/{lib → dist/esm}/plugins/literalminus.js +2 -5
  371. package/dist/esm/plugins/literalplus.d.ts +6 -0
  372. package/{lib → dist/esm}/plugins/literalplus.js +2 -5
  373. package/dist/esm/plugins/logindisabled.d.ts +5 -0
  374. package/dist/esm/plugins/logindisabled.js +39 -0
  375. package/dist/esm/plugins/messagelimit.d.ts +19 -0
  376. package/{lib → dist/esm}/plugins/messagelimit.js +18 -41
  377. package/dist/esm/plugins/metadata-server.d.ts +7 -0
  378. package/{lib → dist/esm}/plugins/metadata-server.js +3 -7
  379. package/dist/esm/plugins/metadata.d.ts +11 -0
  380. package/dist/esm/plugins/metadata.js +421 -0
  381. package/dist/esm/plugins/move.d.ts +11 -0
  382. package/{lib → dist/esm}/plugins/move.js +37 -66
  383. package/dist/esm/plugins/multiappend.d.ts +12 -0
  384. package/{lib → dist/esm}/plugins/multiappend.js +2 -5
  385. package/dist/esm/plugins/multisearch.d.ts +6 -0
  386. package/{lib → dist/esm}/plugins/multisearch.js +24 -48
  387. package/dist/esm/plugins/namespace.d.ts +5 -0
  388. package/dist/esm/plugins/namespace.js +42 -0
  389. package/dist/esm/plugins/notify.d.ts +2 -0
  390. package/{lib → dist/esm}/plugins/notify.js +90 -134
  391. package/dist/esm/plugins/oauthbearer.d.ts +32 -0
  392. package/{lib → dist/esm}/plugins/oauthbearer.js +18 -48
  393. package/dist/esm/plugins/objectid.d.ts +23 -0
  394. package/{lib → dist/esm}/plugins/objectid.js +21 -58
  395. package/dist/esm/plugins/partial.d.ts +6 -0
  396. package/{lib → dist/esm}/plugins/partial.js +7 -15
  397. package/dist/esm/plugins/preview.d.ts +31 -0
  398. package/{lib → dist/esm}/plugins/preview.js +28 -66
  399. package/dist/esm/plugins/qresync.d.ts +11 -0
  400. package/{lib → dist/esm}/plugins/qresync.js +64 -134
  401. package/dist/esm/plugins/quota.d.ts +18 -0
  402. package/{lib → dist/esm}/plugins/quota.js +89 -135
  403. package/dist/esm/plugins/replace.d.ts +14 -0
  404. package/{lib → dist/esm}/plugins/replace.js +21 -51
  405. package/dist/esm/plugins/sasl-ir.d.ts +5 -0
  406. package/{lib → dist/esm}/plugins/sasl-ir.js +3 -6
  407. package/dist/esm/plugins/savedate.d.ts +17 -0
  408. package/{lib → dist/esm}/plugins/savedate.js +5 -15
  409. package/dist/esm/plugins/savelimit.d.ts +10 -0
  410. package/{lib → dist/esm}/plugins/savelimit.js +3 -6
  411. package/dist/esm/plugins/searchres.d.ts +6 -0
  412. package/{lib → dist/esm}/plugins/searchres.js +13 -22
  413. package/dist/esm/plugins/sort-display.d.ts +11 -0
  414. package/{lib → dist/esm}/plugins/sort-display.js +6 -10
  415. package/dist/esm/plugins/sort.d.ts +11 -0
  416. package/{lib → dist/esm}/plugins/sort.js +24 -46
  417. package/dist/esm/plugins/special-use.d.ts +10 -0
  418. package/{lib → dist/esm}/plugins/special-use.js +9 -24
  419. package/dist/esm/plugins/starttls.d.ts +5 -0
  420. package/{lib → dist/esm}/plugins/starttls.js +20 -37
  421. package/dist/esm/plugins/status-size.d.ts +7 -0
  422. package/{lib → dist/esm}/plugins/status-size.js +4 -11
  423. package/dist/esm/plugins/thread-orderedsubject.d.ts +11 -0
  424. package/{lib → dist/esm}/plugins/thread-orderedsubject.js +3 -6
  425. package/dist/esm/plugins/thread-references.d.ts +11 -0
  426. package/{lib → dist/esm}/plugins/thread-references.js +3 -6
  427. package/dist/esm/plugins/uidonly.d.ts +15 -0
  428. package/{lib → dist/esm}/plugins/uidonly.js +11 -35
  429. package/dist/esm/plugins/uidplus.d.ts +15 -0
  430. package/{lib → dist/esm}/plugins/uidplus.js +25 -45
  431. package/dist/esm/plugins/unauthenticate.d.ts +7 -0
  432. package/dist/esm/plugins/unauthenticate.js +17 -0
  433. package/dist/esm/plugins/unselect.d.ts +5 -0
  434. package/dist/esm/plugins/unselect.js +21 -0
  435. package/dist/esm/plugins/utf8-accept.d.ts +6 -0
  436. package/{lib → dist/esm}/plugins/utf8-accept.js +10 -21
  437. package/dist/esm/plugins/x-gm-ext-1.d.ts +26 -0
  438. package/{lib → dist/esm}/plugins/x-gm-ext-1.js +48 -100
  439. package/dist/esm/plugins/xoauth2.d.ts +2 -0
  440. package/dist/esm/plugins/xoauth2.js +140 -0
  441. package/dist/esm/plugins/xtoybird.d.ts +2 -0
  442. package/dist/esm/plugins/xtoybird.js +218 -0
  443. package/dist/esm/server.d.ts +876 -0
  444. package/dist/esm/server.js +2543 -0
  445. package/dist/esm/smtp-listener.d.ts +13 -0
  446. package/{lib → dist/esm}/smtp-listener.js +5 -12
  447. package/dist/esm/sorting.d.ts +77 -0
  448. package/{lib → dist/esm}/sorting.js +40 -53
  449. package/dist/esm/threading.d.ts +30 -0
  450. package/{lib → dist/esm}/threading.js +29 -70
  451. package/dist/esm/types.d.ts +327 -0
  452. package/dist/esm/types.js +2 -0
  453. package/dist/esm/utf8-session.d.ts +17 -0
  454. package/{lib → dist/esm}/utf8-session.js +15 -25
  455. package/dist/esm/vanished.d.ts +21 -0
  456. package/{lib → dist/esm}/vanished.js +16 -21
  457. package/dist/plugin-help.json +298 -0
  458. package/package.json +54 -11
  459. package/lib/commands/capability.js +0 -47
  460. package/lib/commands/check.js +0 -21
  461. package/lib/commands/close.js +0 -30
  462. package/lib/commands/examine.js +0 -7
  463. package/lib/commands/expunge.js +0 -27
  464. package/lib/commands/list.js +0 -100
  465. package/lib/commands/logout.js +0 -41
  466. package/lib/commands/lsub.js +0 -87
  467. package/lib/commands/noop.js +0 -21
  468. package/lib/commands/search.js +0 -76
  469. package/lib/commands/select.js +0 -289
  470. package/lib/commands/uid copy.js +0 -7
  471. package/lib/commands/uid fetch.js +0 -5
  472. package/lib/commands/uid search.js +0 -5
  473. package/lib/commands/uid store.js +0 -5
  474. package/lib/plugins/compress.js +0 -76
  475. package/lib/plugins/enable.js +0 -155
  476. package/lib/plugins/id.js +0 -138
  477. package/lib/plugins/idle.js +0 -105
  478. package/lib/plugins/logindisabled.js +0 -50
  479. package/lib/plugins/metadata.js +0 -475
  480. package/lib/plugins/namespace.js +0 -67
  481. package/lib/plugins/unauthenticate.js +0 -28
  482. package/lib/plugins/unselect.js +0 -36
  483. package/lib/plugins/xoauth2.js +0 -188
  484. package/lib/plugins/xtoybird.js +0 -282
  485. package/lib/server.js +0 -2880
@@ -0,0 +1,16 @@
1
+ import type { IMAPServer } from '../types.js';
2
+ /**
3
+ * @help Adds APPENDLIMIT [RFC7889] capability
4
+ * @help Server option "appendLimit" sets the limit in octets for all
5
+ * @help mailboxes, a mailbox in storage can set its own "appendLimit"
6
+ * @help (null for no limit)
7
+ *
8
+ * APPENDLIMIT: https://www.rfc-editor.org/rfc/rfc7889
9
+ *
10
+ * The server option "appendLimit" (octets) sets a limit for all mailboxes, advertised as
11
+ * APPENDLIMIT=<n>. A mailbox in the storage can set its own "appendLimit" (a number, or null
12
+ * for no limit), then the capability is a plain APPENDLIMIT and clients read the limits with
13
+ * STATUS (APPENDLIMIT). A larger APPEND or REPLACE fails with NO [TOOBIG], a synchronizing
14
+ * literal is refused before it is sent.
15
+ */
16
+ export default function appendlimitPlugin(server: IMAPServer): void;
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = appendlimitPlugin;
4
+ const append_js_1 = require("../commands/append.js");
5
+ /**
6
+ * @help Adds APPENDLIMIT [RFC7889] capability
7
+ * @help Server option "appendLimit" sets the limit in octets for all
8
+ * @help mailboxes, a mailbox in storage can set its own "appendLimit"
9
+ * @help (null for no limit)
10
+ *
11
+ * APPENDLIMIT: https://www.rfc-editor.org/rfc/rfc7889
12
+ *
13
+ * The server option "appendLimit" (octets) sets a limit for all mailboxes, advertised as
14
+ * APPENDLIMIT=<n>. A mailbox in the storage can set its own "appendLimit" (a number, or null
15
+ * for no limit), then the capability is a plain APPENDLIMIT and clients read the limits with
16
+ * STATUS (APPENDLIMIT). A larger APPEND or REPLACE fails with NO [TOOBIG], a synchronizing
17
+ * literal is refused before it is sent.
18
+ */
19
+ function appendlimitPlugin(server) {
20
+ const serverLimit = 'appendLimit' in server.options ? server.options.appendLimit : null;
21
+ if (serverLimit !== null && !isValidLimit(serverLimit)) {
22
+ throw new TypeError('Invalid appendLimit option, expecting a non-negative integer');
23
+ }
24
+ const hasOwnLimit = (mailbox) => Object.hasOwn(mailbox, 'appendLimit');
25
+ const hasMailboxLimits = () => Object.values(server.folderCache).some(hasOwnLimit);
26
+ /**
27
+ * @param {Object} mailbox Mailbox object
28
+ * @return {Number|null} limit in octets, null if there is no limit
29
+ */
30
+ const getLimit = (mailbox) => {
31
+ if (!hasOwnLimit(mailbox)) {
32
+ return serverLimit;
33
+ }
34
+ return isValidLimit(mailbox.appendLimit) ? mailbox.appendLimit : null;
35
+ };
36
+ // RFC 7889 section 5: an APPENDLIMIT of 0 means that nothing can be appended
37
+ const isTooBig = (mailbox, size) => {
38
+ const limit = getLimit(mailbox);
39
+ return limit !== null && (size > limit || limit === 0);
40
+ };
41
+ // RFC 7889 section 2: APPENDLIMIT=<n> for the same limit in every mailbox, otherwise a plain
42
+ // APPENDLIMIT and the limits come from STATUS
43
+ if (serverLimit !== null) {
44
+ server.registerCapability('APPENDLIMIT=' + serverLimit, () => !hasMailboxLimits());
45
+ }
46
+ server.registerCapability('APPENDLIMIT', () => serverLimit === null || hasMailboxLimits());
47
+ // RFC 7889 section 4: a message over the limit is refused with TOOBIG
48
+ server.appendChecks.push((connection, mailbox, messages, options) => {
49
+ // COPY and MOVE are not uploads (RFC 7889 section 1)
50
+ if (!options.command) {
51
+ return false;
52
+ }
53
+ if (messages.some(message => isTooBig(mailbox, message.raw.length))) {
54
+ return { code: 'TOOBIG', text: 'Message exceeds the APPENDLIMIT of the mailbox' };
55
+ }
56
+ return false;
57
+ });
58
+ // Refuse the literal of a message that is too large before the client sends it, by not
59
+ // sending a continuation request (RFC 3502 section 6.3.11 example A005)
60
+ server.literalFilters.push((connection, command, line, literalSize) => {
61
+ const path = (0, append_js_1.getPendingTarget)(connection, command, line);
62
+ const mailbox = path !== false && server.getMailbox(path);
63
+ if (mailbox && isTooBig(mailbox, literalSize)) {
64
+ return { command: 'NO', code: 'TOOBIG', text: 'Message exceeds the APPENDLIMIT of the mailbox' };
65
+ }
66
+ return false;
67
+ });
68
+ // RFC 7889 section 3.1: status-att-val =/ "APPENDLIMIT" SP (number / nil)
69
+ server.allowedStatus.push('APPENDLIMIT');
70
+ // also used by the STATUS return option of LIST-STATUS (RFC 7889 section 3.2)
71
+ server.statusHandlers.APPENDLIMIT = (connection, mailbox) => getLimit(mailbox);
72
+ }
73
+ function isValidLimit(value) {
74
+ return Number.isSafeInteger(value) && value >= 0;
75
+ }
76
+ {
77
+ const defaultExport = exports.default;
78
+ if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
79
+ for (const key of Object.keys(exports)) {
80
+ if (key !== 'default' && !(key in defaultExport)) {
81
+ defaultExport[key] = exports[key];
82
+ }
83
+ }
84
+ Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
85
+ module.exports = defaultExport;
86
+ }
87
+ }
@@ -0,0 +1,2 @@
1
+ import type { IMAPServer } from '../types.js';
2
+ export default function authPlainPlugin(server: IMAPServer): void;
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = authPlainPlugin;
4
+ /**
5
+ * @help Adds AUTH=PLAIN capability
6
+ * @help Supports SASL-IR [RFC4959] as well
7
+ */
8
+ const utf8 = new TextDecoder('utf-8', { fatal: true });
9
+ function authPlainPlugin(server) {
10
+ // Register AUTH=PLAIN capability for non authenticated state
11
+ server.registerCapability('AUTH=PLAIN', (connection) => {
12
+ return connection.state === 'Not Authenticated';
13
+ });
14
+ // Validates a base64 encoded "authzid NUL authcid NUL passwd" message (RFC 4616) and logs the user in
15
+ const authenticate = (connection, parsed, data, input) => {
16
+ const decoded = connection.decodeSaslResponse(input);
17
+ if (!decoded) {
18
+ return connection.sendStatus(parsed, data, 'BAD', 'Invalid base64 in SASL response', false, 'AUTHENTICATE PLAIN FAILED');
19
+ }
20
+ // RFC 4616 section 2: the message is UTF-8, user names are unicode strings like the keys of `users`
21
+ let message;
22
+ try {
23
+ message = utf8.decode(decoded);
24
+ }
25
+ catch {
26
+ return connection.sendStatus(parsed, data, 'BAD', 'Invalid UTF-8 in SASL PLAIN message', false, 'AUTHENTICATE PLAIN FAILED');
27
+ }
28
+ const parts = message.split('\x00');
29
+ const authzid = parts[0] || '';
30
+ const username = parts[1] || '';
31
+ const password = parts[2] || '';
32
+ const user = connection.server.getUser(username);
33
+ if (parts.length !== 3 || !user || user.password !== password) {
34
+ // RFC 5530 section 3: unknown user or bad password
35
+ return connection.sendStatus(parsed, data, 'NO', 'Login failed: authentication failure', 'AUTHENTICATIONFAILED', 'AUTHENTICATE PLAIN FAILED');
36
+ }
37
+ if (authzid && authzid !== username) {
38
+ // Acting as another user is not supported, authzid must be empty or the same as authcid. The credentials
39
+ // were fine, so this is AUTHORIZATIONFAILED (RFC 5530 section 3, RFC 9051 section 7.1)
40
+ return connection.sendStatus(parsed, data, 'NO', 'Can not act as ' + authzid, 'AUTHORIZATIONFAILED', 'AUTHENTICATE PLAIN FAILED');
41
+ }
42
+ connection.state = 'Authenticated';
43
+ connection.username = username;
44
+ connection.sendStatus(parsed, data, 'OK', 'User logged in', false, 'AUTHENTICATE PLAIN SUCCESS');
45
+ };
46
+ server.setCommandHandler('AUTHENTICATE PLAIN', (connection, parsed, data, callback) => {
47
+ // If this is the old style api, send + and wait for password
48
+ if (!parsed.attributes) {
49
+ // Temporarily redirect client input to this function
50
+ connection.inputHandler = function (str) {
51
+ // Stop listening to any other user input
52
+ connection.inputHandler = false;
53
+ if (str === '*') {
54
+ // Client cancelled the exchange (RFC 3501 section 6.2.2)
55
+ return connection.sendStatus(parsed, data, 'BAD', 'Authentication cancelled', false, 'AUTHENTICATE PLAIN FAILED');
56
+ }
57
+ authenticate(connection, parsed, data, str);
58
+ };
59
+ // Send an empty continuation request to the client
60
+ connection.write('+ \r\n');
61
+ }
62
+ else if (parsed.attributes.length === 1 &&
63
+ // second argument must be Base64 string as ATOM
64
+ parsed.attributes[0].type === 'ATOM') {
65
+ if (!server.capabilities['SASL-IR'] || !server.capabilities['SASL-IR'](connection)) {
66
+ connection.sendStatus(parsed, data, 'BAD', 'SASL-IR must be enabled to send Initial Response with the request', false, 'AUTHENTICATE PLAIN FAILED');
67
+ return callback();
68
+ }
69
+ authenticate(connection, parsed, data, parsed.attributes[0].value);
70
+ }
71
+ else {
72
+ // Not correct AUTH=PLAIN
73
+ connection.sendStatus(parsed, data, 'BAD', 'Invalid attributes for AUTHENTICATE PLAIN', false, 'AUTHENTICATE PLAIN FAILED');
74
+ }
75
+ return callback();
76
+ });
77
+ }
78
+ {
79
+ const defaultExport = exports.default;
80
+ if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
81
+ for (const key of Object.keys(exports)) {
82
+ if (key !== 'default' && !(key in defaultExport)) {
83
+ defaultExport[key] = exports[key];
84
+ }
85
+ }
86
+ Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
87
+ module.exports = defaultExport;
88
+ }
89
+ }
@@ -0,0 +1,30 @@
1
+ import type { IMAPServer } from '../types.js';
2
+ /**
3
+ * Decodes base64 data. RFC 2045 section 6.8: characters outside the base64 alphabet are ignored, and
4
+ * "=" marks the end of the data
5
+ *
6
+ * @param {String} str Encoded data
7
+ * @return {String} Decoded octets as a binary string
8
+ */
9
+ declare function decodeBase64(str: string): string;
10
+ /**
11
+ * Decodes quoted-printable data (RFC 2045 section 6.7). Trailing white space of a line is removed
12
+ * (rule 3), a line that ends with "=" continues on the next line (rule 5), and an "=" that is not
13
+ * followed by two hex digits is kept as it is, as the RFC suggests for robust implementations
14
+ *
15
+ * @param {String} str Encoded data with CRLF line breaks
16
+ * @return {String} Decoded octets as a binary string
17
+ */
18
+ declare function decodeQuotedPrintable(str: string): string;
19
+ /**
20
+ * Base64 encodes the binary parts of a message that was appended as a literal8, as the IMAP4rev1
21
+ * part of the protocol can not carry them (RFC 3516 sections 4.4 and 6): parts with the binary
22
+ * encoding, and parts with an identity encoding that contain NUL octets anyway. Any other NUL octet
23
+ * (in a header, or in a part with another encoding) can not be stored.
24
+ *
25
+ * @param {String} raw Message as a binary string
26
+ * @return {String} Message to store
27
+ */
28
+ declare function storeBinaryMessage(raw: string): string;
29
+ export default function binaryPlugin(server: IMAPServer): void;
30
+ export { decodeBase64, decodeQuotedPrintable, storeBinaryMessage };
@@ -0,0 +1,247 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = binaryPlugin;
4
+ exports.decodeBase64 = decodeBase64;
5
+ exports.decodeQuotedPrintable = decodeQuotedPrintable;
6
+ exports.storeBinaryMessage = storeBinaryMessage;
7
+ const mimeparser_js_1 = require("../mimeparser.js");
8
+ const fetch_js_1 = require("../commands/handlers/fetch.js");
9
+ const append_js_1 = require("../commands/append.js");
10
+ /**
11
+ * @help Adds BINARY [RFC3516] capability
12
+ *
13
+ * BINARY: https://www.rfc-editor.org/rfc/rfc3516
14
+ *
15
+ * Additional FETCH items:
16
+ * - BINARY[<part>]<<partial>>, BINARY.PEEK[<part>]<<partial>> and BINARY.SIZE[<part>]
17
+ *
18
+ * APPEND (and REPLACE) accept messages as a literal8 (~{n}), binary parts are stored base64 encoded
19
+ */
20
+ // RFC 3516 section 7: section-binary = "[" [section-part] "]", section-part = nz-number *("." nz-number)
21
+ const SECTION_PART = /^[1-9]\d*(?:\.[1-9]\d*)*$/;
22
+ // decoded leaf parts, the tree of a message is replaced when its source changes
23
+ const decodedCache = new WeakMap();
24
+ /**
25
+ * Creates an error that fails a command with NO [UNKNOWN-CTE] (RFC 3516 sections 4.3 and 4.4)
26
+ *
27
+ * @param {String} message Human readable text
28
+ * @return {Error}
29
+ */
30
+ function unknownCte(message) {
31
+ const err = new Error(message);
32
+ err.imapResponse = 'NO';
33
+ err.code = 'UNKNOWN-CTE';
34
+ return err;
35
+ }
36
+ /**
37
+ * Returns the media type of a tree node, e.g. "text/plain"
38
+ */
39
+ function mediaType(node) {
40
+ const contentType = node.parsedHeader['content-type'];
41
+ return ((contentType && contentType.value) || '').toLowerCase();
42
+ }
43
+ /**
44
+ * Returns the lower case content transfer encoding of a node, 7bit if not set (RFC 2045 section 6.1)
45
+ */
46
+ function transferEncoding(node) {
47
+ return (node.parsedHeader['content-transfer-encoding'] || '7bit').toString().trim().toLowerCase();
48
+ }
49
+ /**
50
+ * RFC 9051 section 6.4.5: BINARY applies to leaf body parts only, not to multipart/*, message/rfc822
51
+ * or message/global parts. IMAP4rev1 describes message/global as a basic part (RFC 3501 body-type-basic)
52
+ *
53
+ * @param {Object} node Tree node
54
+ * @param {Boolean} global message/global is not a leaf, see IMAPConnection#messageGlobal
55
+ */
56
+ function isLeaf(node, global) {
57
+ const type = mediaType(node);
58
+ return !node.boundary && !/^multipart\//.test(type) && type !== 'message/rfc822' && (!global || type !== 'message/global');
59
+ }
60
+ /**
61
+ * Decodes base64 data. RFC 2045 section 6.8: characters outside the base64 alphabet are ignored, and
62
+ * "=" marks the end of the data
63
+ *
64
+ * @param {String} str Encoded data
65
+ * @return {String} Decoded octets as a binary string
66
+ */
67
+ function decodeBase64(str) {
68
+ let data = str.replace(/[^A-Za-z0-9+/=]/g, '').split('=')[0];
69
+ if (data.length % 4 === 1) {
70
+ // a single leftover character does not hold a whole octet
71
+ data = data.slice(0, -1);
72
+ }
73
+ return Buffer.from(data, 'base64').toString('binary');
74
+ }
75
+ /**
76
+ * Decodes quoted-printable data (RFC 2045 section 6.7). Trailing white space of a line is removed
77
+ * (rule 3), a line that ends with "=" continues on the next line (rule 5), and an "=" that is not
78
+ * followed by two hex digits is kept as it is, as the RFC suggests for robust implementations
79
+ *
80
+ * @param {String} str Encoded data with CRLF line breaks
81
+ * @return {String} Decoded octets as a binary string
82
+ */
83
+ function decodeQuotedPrintable(str) {
84
+ return str
85
+ .replace(/[ \t]+(?=\r\n|$)/g, '')
86
+ .replace(/=(?:\r\n|$)/g, '')
87
+ .replace(/=([0-9A-Fa-f]{2})/g, (match, hex) => String.fromCharCode(parseInt(hex, 16)));
88
+ }
89
+ /**
90
+ * Returns the content of a BINARY section with the content transfer encoding removed
91
+ *
92
+ * @param {Object} connection IMAP connection
93
+ * @param {Object} message Message object
94
+ * @param {Object} query Parsed fetch item
95
+ * @return {String} Decoded section as a binary string
96
+ */
97
+ function getDecodedSection(connection, message, query) {
98
+ const key = query.value.toUpperCase();
99
+ const section = query.section;
100
+ if (!section) {
101
+ throw new Error(key + ' requires a section');
102
+ }
103
+ if (!section.length) {
104
+ // the grammar allows BINARY[], but the whole message is not a leaf body part
105
+ throw new Error(key + '[] is not allowed, BINARY applies to leaf body parts only (RFC 9051 section 6.4.5)');
106
+ }
107
+ if (section.length !== 1 || section[0].type !== 'ATOM' || !SECTION_PART.test(section[0].value)) {
108
+ throw new Error('Invalid ' + key + ' section, expecting a part number (RFC 3516 section 7)');
109
+ }
110
+ const node = (0, mimeparser_js_1.resolveNode)((0, mimeparser_js_1.getMessageData)(message).tree, section[0].value, connection.messageGlobal);
111
+ if (!node) {
112
+ // like BODY[<section>], a part that does not exist is empty
113
+ return '';
114
+ }
115
+ if (!isLeaf(node, connection.messageGlobal)) {
116
+ throw new Error(key + '[' + section[0].value + '] is not a leaf body part (RFC 9051 section 6.4.5)');
117
+ }
118
+ if (!decodedCache.has(node)) {
119
+ decodedCache.set(node, decodeNode(node));
120
+ }
121
+ return decodedCache.get(node);
122
+ }
123
+ /**
124
+ * Removes the content transfer encoding of a leaf part
125
+ *
126
+ * @param {Object} node Tree node
127
+ * @return {String} Decoded body as a binary string
128
+ */
129
+ function decodeNode(node) {
130
+ const body = (0, mimeparser_js_1.render)(node, true);
131
+ const encoding = transferEncoding(node);
132
+ let decoded;
133
+ if (mimeparser_js_1.IDENTITY_ENCODINGS.includes(encoding)) {
134
+ decoded = body;
135
+ }
136
+ else if (encoding === 'base64') {
137
+ decoded = decodeBase64(body);
138
+ }
139
+ else if (encoding === 'quoted-printable') {
140
+ decoded = decodeQuotedPrintable(body);
141
+ }
142
+ else {
143
+ throw unknownCte('Unknown Content-Transfer-Encoding ' + JSON.stringify(encoding).replace(/[^\x20-\x7e]/g, '?'));
144
+ }
145
+ // RFC 3516 section 6: textual sections are sent with CRLF line breaks
146
+ return /^text\//.test(mediaType(node)) ? (0, mimeparser_js_1.normalizeLineBreaks)(decoded) : decoded;
147
+ }
148
+ /**
149
+ * BINARY[<section>]<<partial>> (RFC 3516 section 4.2)
150
+ */
151
+ function fetchBinary(connection, message, query) {
152
+ // RFC 3516 section 4.2: the range applies to the decoded data
153
+ const value = (0, fetch_js_1.applyPartial)(getDecodedSection(connection, message, query), query.partial);
154
+ // RFC 3516 section 4.3: data without NUL is sent as a string, a literal8 only when it is needed
155
+ return {
156
+ type: value.indexOf('\x00') >= 0 ? 'LITERAL8' : 'LITERAL',
157
+ value
158
+ };
159
+ }
160
+ // BINARY sets \Seen like BODY[<section>] does
161
+ fetchBinary.setsSeen = true;
162
+ /**
163
+ * BINARY.SIZE[<section>] (RFC 3516 section 4.2), the size of the decoded section
164
+ */
165
+ function fetchBinarySize(connection, message, query) {
166
+ if (query.partial) {
167
+ // RFC 3516 section 7: "BINARY.SIZE" section-binary, without a partial
168
+ throw new Error('BINARY.SIZE does not take a partial range');
169
+ }
170
+ return getDecodedSection(connection, message, query).length;
171
+ }
172
+ /**
173
+ * Base64 encodes the binary parts of a message that was appended as a literal8, as the IMAP4rev1
174
+ * part of the protocol can not carry them (RFC 3516 sections 4.4 and 6): parts with the binary
175
+ * encoding, and parts with an identity encoding that contain NUL octets anyway. Any other NUL octet
176
+ * (in a header, or in a part with another encoding) can not be stored.
177
+ *
178
+ * @param {String} raw Message as a binary string
179
+ * @return {String} Message to store
180
+ */
181
+ function storeBinaryMessage(raw) {
182
+ const tree = (0, mimeparser_js_1.parseTree)(raw);
183
+ // returns true if the node or anything in it was converted
184
+ const convert = (node) => {
185
+ if (node.childNodes) {
186
+ // every part is converted, so no short circuit
187
+ return node.childNodes.map(convert).includes(true);
188
+ }
189
+ const message = (0, mimeparser_js_1.embeddedMessage)(node, true);
190
+ if (message) {
191
+ // RFC 2046 section 5.2.1: a message/rfc822 (or message/global) part keeps its identity encoding, its parts are converted
192
+ if (!convert(message)) {
193
+ return false;
194
+ }
195
+ node.body = (0, mimeparser_js_1.render)(message);
196
+ return true;
197
+ }
198
+ const encoding = transferEncoding(node);
199
+ if (!isLeaf(node, true) || !node.body || !(encoding === 'binary' || (mimeparser_js_1.IDENTITY_ENCODINGS.includes(encoding) && node.body.indexOf('\x00') >= 0))) {
200
+ return false;
201
+ }
202
+ // RFC 2045 section 6.8: encoded lines are at most 76 characters long
203
+ node.body = Buffer.from(node.body, 'binary')
204
+ .toString('base64')
205
+ .match(/.{1,76}/g)
206
+ .join('\r\n');
207
+ node.header = node.header.filter((line) => !/^content-transfer-encoding\s*:/i.test(line)).concat('Content-Transfer-Encoding: base64');
208
+ return true;
209
+ };
210
+ const result = convert(tree) ? (0, mimeparser_js_1.render)(tree) : raw;
211
+ if (result.indexOf('\x00') >= 0) {
212
+ throw unknownCte('NUL octets are only allowed in the body of a part with the binary, 7bit or 8bit encoding');
213
+ }
214
+ return result;
215
+ }
216
+ function binaryPlugin(server) {
217
+ server.registerCapability('BINARY');
218
+ // RFC 3516 section 7: literal8 and the BINARY fetch items with a section and a partial range
219
+ server.parserOptions.literal8 = true;
220
+ server.parserOptions.allowSection.push('BINARY', 'BINARY.PEEK', 'BINARY.SIZE');
221
+ server.fetchHandlers.BINARY = fetchBinary;
222
+ // the same without setting \Seen
223
+ server.fetchHandlers['BINARY.PEEK'] = (connection, message, query) => fetchBinary(connection, message, query);
224
+ server.fetchHandlers['BINARY.SIZE'] = fetchBinarySize;
225
+ // RFC 3516 section 4.4: APPEND (and REPLACE, MULTIAPPEND) take a message as a literal8, the commands
226
+ // allow it with the literal8: 'BINARY' option
227
+ server.appendLiteral8 = (raw) => {
228
+ try {
229
+ return storeBinaryMessage(raw);
230
+ }
231
+ catch (err) {
232
+ throw (0, append_js_1.appendError)(err.message, err.code);
233
+ }
234
+ };
235
+ }
236
+ {
237
+ const defaultExport = exports.default;
238
+ if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
239
+ for (const key of Object.keys(exports)) {
240
+ if (key !== 'default' && !(key in defaultExport)) {
241
+ defaultExport[key] = exports[key];
242
+ }
243
+ }
244
+ Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
245
+ module.exports = defaultExport;
246
+ }
247
+ }
@@ -0,0 +1,14 @@
1
+ import type { IMAPServer } from '../types.js';
2
+ /**
3
+ * @help Adds CATENATE [RFC4469] and URL-PARTIAL [RFC5550] capabilities
4
+ * @help Only absolute-path URLs are accepted, eg. "/INBOX/;UID=1/;SECTION=1"
5
+ *
6
+ * CATENATE: https://www.rfc-editor.org/rfc/rfc4469
7
+ *
8
+ * APPEND (and REPLACE) can build a message from literals and IMAP URLs of messages or
9
+ * message parts on this server. Only absolute-path URLs are accepted, for example
10
+ * "/INBOX;UIDVALIDITY=1/;UID=2/;SECTION=1.MIME/;PARTIAL=0.100" (RFC 5092). Other URLs,
11
+ * and URLs that do not resolve, fail with NO [BADURL]. A message larger than the
12
+ * literal size limit fails with NO [TOOBIG].
13
+ */
14
+ export default function catenatePlugin(server: IMAPServer): void;