@nocobase/plugin-workflow-mailer 2.4.0-alpha.1 → 2.4.0-alpha.11

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 (187) hide show
  1. package/dist/externalVersion.js +6 -6
  2. package/dist/node_modules/joi/dist/joi-browser.min.js +1 -1
  3. package/dist/node_modules/joi/lib/index.js +1 -1
  4. package/dist/node_modules/joi/lib/messages.js +35 -6
  5. package/dist/node_modules/joi/lib/types/keys.js +18 -1
  6. package/dist/node_modules/joi/lib/types/link.js +18 -2
  7. package/dist/node_modules/joi/lib/types/string.js +2 -2
  8. package/dist/node_modules/joi/package.json +1 -1
  9. package/dist/node_modules/nodemailer/dist/cjs/addressparser/index.d.ts +59 -0
  10. package/dist/node_modules/nodemailer/dist/cjs/addressparser/index.js +790 -0
  11. package/dist/node_modules/nodemailer/dist/cjs/base64/index.d.ts +36 -0
  12. package/dist/node_modules/nodemailer/dist/cjs/base64/index.js +119 -0
  13. package/dist/node_modules/nodemailer/dist/cjs/dkim/index.d.ts +52 -0
  14. package/dist/node_modules/nodemailer/dist/cjs/dkim/index.js +228 -0
  15. package/dist/node_modules/nodemailer/dist/cjs/dkim/message-parser.d.ts +48 -0
  16. package/dist/node_modules/nodemailer/dist/cjs/dkim/message-parser.js +180 -0
  17. package/dist/node_modules/nodemailer/dist/cjs/dkim/relaxed-body.d.ts +36 -0
  18. package/dist/node_modules/nodemailer/dist/cjs/dkim/relaxed-body.js +148 -0
  19. package/dist/node_modules/nodemailer/dist/cjs/dkim/sign.d.ts +52 -0
  20. package/dist/node_modules/nodemailer/dist/cjs/dkim/sign.js +165 -0
  21. package/dist/node_modules/nodemailer/dist/cjs/errors.d.ts +96 -0
  22. package/dist/node_modules/nodemailer/dist/cjs/errors.js +70 -0
  23. package/dist/node_modules/nodemailer/dist/cjs/fetch/cookies.d.ts +107 -0
  24. package/dist/node_modules/nodemailer/dist/cjs/fetch/cookies.js +282 -0
  25. package/dist/node_modules/nodemailer/dist/cjs/fetch/index.d.ts +65 -0
  26. package/dist/node_modules/nodemailer/dist/cjs/fetch/index.js +384 -0
  27. package/dist/node_modules/nodemailer/dist/cjs/json-transport/index.d.ts +64 -0
  28. package/dist/node_modules/nodemailer/dist/cjs/json-transport/index.js +99 -0
  29. package/dist/node_modules/nodemailer/dist/cjs/mail-composer/index.d.ts +174 -0
  30. package/dist/node_modules/nodemailer/dist/cjs/mail-composer/index.js +613 -0
  31. package/dist/node_modules/nodemailer/dist/cjs/mailer/index.d.ts +237 -0
  32. package/dist/node_modules/nodemailer/dist/cjs/mailer/index.js +415 -0
  33. package/dist/node_modules/nodemailer/dist/cjs/mailer/mail-message.d.ts +97 -0
  34. package/dist/node_modules/nodemailer/dist/cjs/mailer/mail-message.js +342 -0
  35. package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/index.d.ts +161 -0
  36. package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/index.js +787 -0
  37. package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/mime-types.d.ts +2 -0
  38. package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/mime-types.js +2103 -0
  39. package/dist/node_modules/nodemailer/dist/cjs/mime-node/index.d.ts +333 -0
  40. package/dist/node_modules/nodemailer/dist/cjs/mime-node/index.js +1493 -0
  41. package/dist/node_modules/nodemailer/dist/cjs/mime-node/last-newline.d.ts +5 -0
  42. package/dist/node_modules/nodemailer/dist/cjs/mime-node/last-newline.js +32 -0
  43. package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-unix.d.ts +9 -0
  44. package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-unix.js +40 -0
  45. package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-windows.d.ts +10 -0
  46. package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-windows.js +47 -0
  47. package/dist/node_modules/nodemailer/dist/cjs/nodemailer.d.ts +124 -0
  48. package/dist/node_modules/nodemailer/dist/cjs/nodemailer.js +1 -0
  49. package/dist/node_modules/nodemailer/dist/cjs/package-info.d.ts +3 -0
  50. package/dist/node_modules/nodemailer/dist/cjs/package-info.js +7 -0
  51. package/dist/node_modules/nodemailer/dist/cjs/package.json +3 -0
  52. package/dist/node_modules/nodemailer/dist/cjs/punycode/index.d.ts +73 -0
  53. package/dist/node_modules/nodemailer/{lib → dist/cjs}/punycode/index.js +63 -112
  54. package/dist/node_modules/nodemailer/dist/cjs/qp/index.d.ts +32 -0
  55. package/dist/node_modules/nodemailer/dist/cjs/qp/index.js +207 -0
  56. package/dist/node_modules/nodemailer/dist/cjs/sendmail-transport/index.d.ts +69 -0
  57. package/dist/node_modules/nodemailer/dist/cjs/sendmail-transport/index.js +210 -0
  58. package/dist/node_modules/nodemailer/dist/cjs/ses-transport/index.d.ts +112 -0
  59. package/dist/node_modules/nodemailer/dist/cjs/ses-transport/index.js +252 -0
  60. package/dist/node_modules/nodemailer/dist/cjs/shared/index.d.ts +260 -0
  61. package/dist/node_modules/nodemailer/dist/cjs/shared/index.js +680 -0
  62. package/dist/node_modules/nodemailer/dist/cjs/shared/objects.d.ts +23 -0
  63. package/dist/node_modules/nodemailer/dist/cjs/shared/objects.js +43 -0
  64. package/dist/node_modules/nodemailer/dist/cjs/shared/url.d.ts +21 -0
  65. package/dist/node_modules/nodemailer/dist/cjs/shared/url.js +255 -0
  66. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/data-stream.d.ts +15 -0
  67. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/data-stream.js +108 -0
  68. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/http-proxy-client.d.ts +47 -0
  69. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/http-proxy-client.js +189 -0
  70. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/index.d.ts +416 -0
  71. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/index.js +1837 -0
  72. package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/index.d.ts +133 -0
  73. package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/index.js +569 -0
  74. package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/pool-resource.d.ts +62 -0
  75. package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/pool-resource.js +257 -0
  76. package/dist/node_modules/nodemailer/dist/cjs/smtp-transport/index.d.ts +156 -0
  77. package/dist/node_modules/nodemailer/dist/cjs/smtp-transport/index.js +371 -0
  78. package/dist/node_modules/nodemailer/dist/cjs/stream-transport/index.d.ts +65 -0
  79. package/dist/node_modules/nodemailer/dist/cjs/stream-transport/index.js +146 -0
  80. package/dist/node_modules/nodemailer/dist/cjs/well-known/index.d.ts +35 -0
  81. package/dist/node_modules/nodemailer/dist/cjs/well-known/index.js +41 -0
  82. package/dist/node_modules/nodemailer/dist/cjs/well-known/services.d.ts +2 -0
  83. package/dist/node_modules/nodemailer/dist/cjs/well-known/services.js +674 -0
  84. package/dist/node_modules/nodemailer/dist/cjs/xoauth2/index.d.ts +201 -0
  85. package/dist/node_modules/nodemailer/dist/cjs/xoauth2/index.js +426 -0
  86. package/dist/node_modules/nodemailer/dist/esm/addressparser/index.d.ts +59 -0
  87. package/dist/node_modules/nodemailer/dist/esm/addressparser/index.js +786 -0
  88. package/dist/node_modules/nodemailer/dist/esm/base64/index.d.ts +36 -0
  89. package/dist/node_modules/nodemailer/{lib → dist/esm}/base64/index.js +39 -68
  90. package/dist/node_modules/nodemailer/dist/esm/dkim/index.d.ts +52 -0
  91. package/dist/node_modules/nodemailer/{lib → dist/esm}/dkim/index.js +62 -92
  92. package/dist/node_modules/nodemailer/dist/esm/dkim/message-parser.d.ts +48 -0
  93. package/dist/node_modules/nodemailer/dist/esm/dkim/message-parser.js +176 -0
  94. package/dist/node_modules/nodemailer/dist/esm/dkim/relaxed-body.d.ts +36 -0
  95. package/dist/node_modules/nodemailer/dist/esm/dkim/relaxed-body.js +141 -0
  96. package/dist/node_modules/nodemailer/dist/esm/dkim/sign.d.ts +52 -0
  97. package/dist/node_modules/nodemailer/dist/esm/dkim/sign.js +125 -0
  98. package/dist/node_modules/nodemailer/dist/esm/errors.d.ts +96 -0
  99. package/dist/node_modules/nodemailer/dist/esm/errors.js +67 -0
  100. package/dist/node_modules/nodemailer/dist/esm/fetch/cookies.d.ts +107 -0
  101. package/dist/node_modules/nodemailer/dist/esm/fetch/cookies.js +242 -0
  102. package/dist/node_modules/nodemailer/dist/esm/fetch/index.d.ts +65 -0
  103. package/dist/node_modules/nodemailer/dist/esm/fetch/index.js +344 -0
  104. package/dist/node_modules/nodemailer/dist/esm/json-transport/index.d.ts +64 -0
  105. package/dist/node_modules/nodemailer/dist/esm/json-transport/index.js +62 -0
  106. package/dist/node_modules/nodemailer/dist/esm/mail-composer/index.d.ts +174 -0
  107. package/dist/node_modules/nodemailer/{lib → dist/esm}/mail-composer/index.js +283 -275
  108. package/dist/node_modules/nodemailer/dist/esm/mailer/index.d.ts +237 -0
  109. package/dist/node_modules/nodemailer/{lib → dist/esm}/mailer/index.js +151 -205
  110. package/dist/node_modules/nodemailer/dist/esm/mailer/mail-message.d.ts +97 -0
  111. package/dist/node_modules/nodemailer/{lib → dist/esm}/mailer/mail-message.js +111 -125
  112. package/dist/node_modules/nodemailer/dist/esm/mime-funcs/index.d.ts +161 -0
  113. package/dist/node_modules/nodemailer/dist/esm/mime-funcs/index.js +738 -0
  114. package/dist/node_modules/nodemailer/dist/esm/mime-funcs/mime-types.d.ts +2 -0
  115. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-funcs/mime-types.js +43 -49
  116. package/dist/node_modules/nodemailer/dist/esm/mime-node/index.d.ts +333 -0
  117. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/index.js +576 -437
  118. package/dist/node_modules/nodemailer/dist/esm/mime-node/last-newline.d.ts +5 -0
  119. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/last-newline.js +4 -10
  120. package/dist/node_modules/nodemailer/dist/esm/mime-node/le-unix.d.ts +9 -0
  121. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/le-unix.js +7 -15
  122. package/dist/node_modules/nodemailer/dist/esm/mime-node/le-windows.d.ts +10 -0
  123. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/le-windows.js +6 -16
  124. package/dist/node_modules/nodemailer/dist/esm/nodemailer.d.ts +124 -0
  125. package/dist/node_modules/nodemailer/dist/esm/nodemailer.js +166 -0
  126. package/dist/node_modules/nodemailer/dist/esm/package-info.d.ts +3 -0
  127. package/dist/node_modules/nodemailer/dist/esm/package-info.js +4 -0
  128. package/dist/node_modules/nodemailer/dist/esm/package.json +3 -0
  129. package/dist/node_modules/nodemailer/dist/esm/punycode/index.d.ts +73 -0
  130. package/dist/node_modules/nodemailer/dist/esm/punycode/index.js +405 -0
  131. package/dist/node_modules/nodemailer/dist/esm/qp/index.d.ts +32 -0
  132. package/dist/node_modules/nodemailer/{lib → dist/esm}/qp/index.js +59 -77
  133. package/dist/node_modules/nodemailer/dist/esm/sendmail-transport/index.d.ts +69 -0
  134. package/dist/node_modules/nodemailer/dist/esm/sendmail-transport/index.js +170 -0
  135. package/dist/node_modules/nodemailer/dist/esm/ses-transport/index.d.ts +112 -0
  136. package/dist/node_modules/nodemailer/dist/esm/ses-transport/index.js +212 -0
  137. package/dist/node_modules/nodemailer/dist/esm/shared/index.d.ts +260 -0
  138. package/dist/node_modules/nodemailer/dist/esm/shared/index.js +631 -0
  139. package/dist/node_modules/nodemailer/dist/esm/shared/objects.d.ts +23 -0
  140. package/dist/node_modules/nodemailer/dist/esm/shared/objects.js +38 -0
  141. package/dist/node_modules/nodemailer/dist/esm/shared/url.d.ts +21 -0
  142. package/dist/node_modules/nodemailer/dist/esm/shared/url.js +214 -0
  143. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/data-stream.d.ts +15 -0
  144. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/data-stream.js +103 -0
  145. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/http-proxy-client.d.ts +47 -0
  146. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/http-proxy-client.js +149 -0
  147. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/index.d.ts +416 -0
  148. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/index.js +1797 -0
  149. package/dist/node_modules/nodemailer/dist/esm/smtp-pool/index.d.ts +133 -0
  150. package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-pool/index.js +195 -314
  151. package/dist/node_modules/nodemailer/dist/esm/smtp-pool/pool-resource.d.ts +62 -0
  152. package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-pool/pool-resource.js +70 -107
  153. package/dist/node_modules/nodemailer/dist/esm/smtp-transport/index.d.ts +156 -0
  154. package/dist/node_modules/nodemailer/dist/esm/smtp-transport/index.js +331 -0
  155. package/dist/node_modules/nodemailer/dist/esm/stream-transport/index.d.ts +65 -0
  156. package/dist/node_modules/nodemailer/dist/esm/stream-transport/index.js +106 -0
  157. package/dist/node_modules/nodemailer/dist/esm/well-known/index.d.ts +35 -0
  158. package/dist/node_modules/nodemailer/{lib → dist/esm}/well-known/index.js +12 -23
  159. package/dist/node_modules/nodemailer/dist/esm/well-known/services.d.ts +2 -0
  160. package/dist/node_modules/nodemailer/dist/esm/well-known/services.js +671 -0
  161. package/dist/node_modules/nodemailer/dist/esm/xoauth2/index.d.ts +201 -0
  162. package/dist/node_modules/nodemailer/dist/esm/xoauth2/index.js +386 -0
  163. package/dist/node_modules/nodemailer/dist/well-known/services.json +640 -0
  164. package/dist/node_modules/nodemailer/package.json +1 -1
  165. package/package.json +4 -4
  166. package/dist/node_modules/nodemailer/.gitattributes +0 -6
  167. package/dist/node_modules/nodemailer/.ncurc.js +0 -7
  168. package/dist/node_modules/nodemailer/.prettierrc.js +0 -8
  169. package/dist/node_modules/nodemailer/lib/addressparser/index.js +0 -313
  170. package/dist/node_modules/nodemailer/lib/dkim/message-parser.js +0 -155
  171. package/dist/node_modules/nodemailer/lib/dkim/relaxed-body.js +0 -154
  172. package/dist/node_modules/nodemailer/lib/dkim/sign.js +0 -117
  173. package/dist/node_modules/nodemailer/lib/fetch/cookies.js +0 -281
  174. package/dist/node_modules/nodemailer/lib/fetch/index.js +0 -274
  175. package/dist/node_modules/nodemailer/lib/json-transport/index.js +0 -82
  176. package/dist/node_modules/nodemailer/lib/mime-funcs/index.js +0 -625
  177. package/dist/node_modules/nodemailer/lib/nodemailer.js +0 -1
  178. package/dist/node_modules/nodemailer/lib/sendmail-transport/index.js +0 -210
  179. package/dist/node_modules/nodemailer/lib/ses-transport/index.js +0 -349
  180. package/dist/node_modules/nodemailer/lib/shared/index.js +0 -688
  181. package/dist/node_modules/nodemailer/lib/smtp-connection/data-stream.js +0 -108
  182. package/dist/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +0 -143
  183. package/dist/node_modules/nodemailer/lib/smtp-connection/index.js +0 -1825
  184. package/dist/node_modules/nodemailer/lib/smtp-transport/index.js +0 -416
  185. package/dist/node_modules/nodemailer/lib/stream-transport/index.js +0 -135
  186. package/dist/node_modules/nodemailer/lib/well-known/services.json +0 -343
  187. package/dist/node_modules/nodemailer/lib/xoauth2/index.js +0 -376
@@ -0,0 +1,631 @@
1
+ /* eslint no-console: 0 */
2
+ import * as urllib from './url.js';
3
+ import util from 'node:util';
4
+ import fs from 'node:fs';
5
+ import nmfetch from '../fetch/index.js';
6
+ import * as errors from '../errors.js';
7
+ import { isProtoKey, copyOwnKeys } from './objects.js';
8
+ import dns from 'node:dns';
9
+ import net from 'node:net';
10
+ import os from 'node:os';
11
+ // re-exported for the callers that already depend on this module, see ./objects
12
+ export { isProtoKey, copyOwnKeys };
13
+ const DNS_TTL = 5 * 60 * 1000;
14
+ const CACHE_CLEANUP_INTERVAL = 30 * 1000; // Minimum 30 seconds between cleanups
15
+ const MAX_CACHE_SIZE = 1000; // Maximum number of entries in cache
16
+ let lastCacheCleanup = 0;
17
+ /** @internal */
18
+ export const _lastCacheCleanup = () => lastCacheCleanup;
19
+ /** @internal */
20
+ export const _resetCacheCleanup = () => {
21
+ lastCacheCleanup = 0;
22
+ };
23
+ export let networkInterfaces;
24
+ try {
25
+ networkInterfaces = os.networkInterfaces();
26
+ }
27
+ catch (_err) {
28
+ // fails on some systems
29
+ }
30
+ const isFamilySupported = (family, allowInternal) => {
31
+ const addresses = Object.values(networkInterfaces || {}).flat();
32
+ if (!addresses.length) {
33
+ // hope for the best. Runtimes without an interface table (Cloudflare
34
+ // Workers) report an empty object rather than throwing
35
+ return true;
36
+ }
37
+ return addresses.filter(i => !i.internal || allowInternal).some(i => i.family === 'IPv' + family || i.family === family);
38
+ };
39
+ const resolve = (family, hostname, options, callback) => {
40
+ options = options || {};
41
+ if (!isFamilySupported(family, options.allowInternalNetworkInterfaces)) {
42
+ return callback(null, []);
43
+ }
44
+ const dnsResolver = dns.Resolver ? new dns.Resolver(options) : dns;
45
+ dnsResolver['resolve' + family](hostname, (err, addresses) => {
46
+ if (err) {
47
+ switch (err.code) {
48
+ case dns.NODATA:
49
+ case dns.NOTFOUND:
50
+ case dns.NOTIMP:
51
+ case dns.SERVFAIL:
52
+ case dns.CONNREFUSED:
53
+ case dns.REFUSED:
54
+ case 'EAI_AGAIN':
55
+ return callback(null, []);
56
+ }
57
+ return callback(err);
58
+ }
59
+ return callback(null, Array.isArray(addresses) ? addresses : [].concat(addresses || []));
60
+ });
61
+ };
62
+ export const dnsCache = new Map();
63
+ const formatDNSValue = (value, extra) => {
64
+ if (!value) {
65
+ return Object.assign({}, extra || {});
66
+ }
67
+ const addresses = value.addresses || [];
68
+ // Select a random address from available addresses, or null if none
69
+ const host = addresses.length > 0 ? addresses[Math.floor(Math.random() * addresses.length)] : null;
70
+ return Object.assign({
71
+ host,
72
+ // Include all addresses for connection fallback support
73
+ _addresses: addresses
74
+ }, extra || {});
75
+ };
76
+ export const resolveHostname = (options, callback) => {
77
+ options = options || {};
78
+ if (!options.host && options.servername) {
79
+ options.host = options.servername;
80
+ }
81
+ if (!options.host || net.isIP(options.host)) {
82
+ // nothing to do here
83
+ const value = {
84
+ addresses: [options.host]
85
+ };
86
+ return callback(null, formatDNSValue(value, {
87
+ servername: options.servername || false,
88
+ cached: false
89
+ }));
90
+ }
91
+ const host = options.host;
92
+ // The TLS server name belongs to the connection asking, not to the host it resolves. The
93
+ // cache is shared by every transport of the process and keyed by host alone, so a server
94
+ // name stored in it would be the one of whichever transport resolved the host first, and a
95
+ // later transport with its own tls.servername would present and verify that name instead
96
+ const servername = options.servername || host;
97
+ let cached;
98
+ if (dnsCache.has(options.host)) {
99
+ cached = dnsCache.get(options.host);
100
+ // Lazy cleanup with time throttling
101
+ const now = Date.now();
102
+ if (now - lastCacheCleanup > CACHE_CLEANUP_INTERVAL) {
103
+ lastCacheCleanup = now;
104
+ // Clean up expired entries
105
+ for (const [host, entry] of dnsCache.entries()) {
106
+ if (entry.expires && entry.expires < now) {
107
+ dnsCache.delete(host);
108
+ }
109
+ }
110
+ // If cache is still too large, remove oldest entries
111
+ if (dnsCache.size > MAX_CACHE_SIZE) {
112
+ const toDelete = Math.floor(MAX_CACHE_SIZE * 0.1); // Remove 10% of entries
113
+ const keys = Array.from(dnsCache.keys()).slice(0, toDelete);
114
+ keys.forEach(key => dnsCache.delete(key));
115
+ }
116
+ }
117
+ if (!cached.expires || cached.expires >= now) {
118
+ return callback(null, formatDNSValue(cached.value, {
119
+ servername,
120
+ cached: true
121
+ }));
122
+ }
123
+ }
124
+ // Resolve both IPv4 and IPv6 addresses for fallback support
125
+ let ipv4Addresses = [];
126
+ let ipv6Addresses = [];
127
+ let ipv4Error = null;
128
+ let ipv6Error = null;
129
+ resolve(4, options.host, options, (err, addresses) => {
130
+ if (err) {
131
+ ipv4Error = err;
132
+ }
133
+ else {
134
+ ipv4Addresses = addresses || [];
135
+ }
136
+ resolve(6, host, options, (err, addresses) => {
137
+ if (err) {
138
+ ipv6Error = err;
139
+ }
140
+ else {
141
+ ipv6Addresses = addresses || [];
142
+ }
143
+ // Combine addresses: IPv4 first, then IPv6
144
+ const allAddresses = ipv4Addresses.concat(ipv6Addresses);
145
+ if (allAddresses.length) {
146
+ const value = {
147
+ addresses: allAddresses
148
+ };
149
+ dnsCache.set(host, {
150
+ value,
151
+ expires: Date.now() + (options.dnsTtl || DNS_TTL)
152
+ });
153
+ return callback(null, formatDNSValue(value, {
154
+ servername,
155
+ cached: false
156
+ }));
157
+ }
158
+ // No addresses from resolve4/resolve6, try dns.lookup as fallback
159
+ if (ipv4Error && ipv6Error) {
160
+ // Both resolvers had errors
161
+ if (cached) {
162
+ dnsCache.set(host, {
163
+ value: cached.value,
164
+ expires: Date.now() + (options.dnsTtl || DNS_TTL)
165
+ });
166
+ return callback(null, formatDNSValue(cached.value, {
167
+ servername,
168
+ cached: true,
169
+ error: ipv4Error
170
+ }));
171
+ }
172
+ }
173
+ try {
174
+ dns.lookup(host, { all: true }, (err, addresses) => {
175
+ if (err) {
176
+ if (cached) {
177
+ dnsCache.set(host, {
178
+ value: cached.value,
179
+ expires: Date.now() + (options.dnsTtl || DNS_TTL)
180
+ });
181
+ return callback(null, formatDNSValue(cached.value, {
182
+ servername,
183
+ cached: true,
184
+ error: err
185
+ }));
186
+ }
187
+ return callback(err);
188
+ }
189
+ // Get all supported addresses from dns.lookup
190
+ const supportedAddresses = addresses
191
+ ? addresses.filter(addr => isFamilySupported(addr.family)).map(addr => addr.address)
192
+ : [];
193
+ if (addresses && addresses.length && !supportedAddresses.length) {
194
+ // there are addresses but none can be used
195
+ console.warn(`Failed to resolve IPv${addresses[0].family} addresses with current network`);
196
+ }
197
+ if (!supportedAddresses.length && cached) {
198
+ // nothing was found, fallback to cached value
199
+ return callback(null, formatDNSValue(cached.value, {
200
+ servername,
201
+ cached: true
202
+ }));
203
+ }
204
+ const value = {
205
+ addresses: supportedAddresses.length ? supportedAddresses : [host]
206
+ };
207
+ dnsCache.set(host, {
208
+ value,
209
+ expires: Date.now() + (options.dnsTtl || DNS_TTL)
210
+ });
211
+ return callback(null, formatDNSValue(value, {
212
+ servername,
213
+ cached: false
214
+ }));
215
+ });
216
+ }
217
+ catch (lookupErr) {
218
+ if (cached) {
219
+ dnsCache.set(host, {
220
+ value: cached.value,
221
+ expires: Date.now() + (options.dnsTtl || DNS_TTL)
222
+ });
223
+ return callback(null, formatDNSValue(cached.value, {
224
+ servername,
225
+ cached: true,
226
+ error: lookupErr
227
+ }));
228
+ }
229
+ return callback(ipv4Error || ipv6Error || lookupErr);
230
+ }
231
+ });
232
+ });
233
+ };
234
+ /**
235
+ * Parses connection url to a structured configuration object
236
+ *
237
+ * @param str Connection url
238
+ * @return Configuration object
239
+ */
240
+ export const parseConnectionUrl = (str) => {
241
+ str = str || '';
242
+ const options = {};
243
+ const url = urllib.parse(str, true);
244
+ switch (url.protocol) {
245
+ case 'smtp:':
246
+ options.secure = false;
247
+ break;
248
+ case 'smtps:':
249
+ options.secure = true;
250
+ break;
251
+ case 'direct:':
252
+ options.direct = true;
253
+ break;
254
+ }
255
+ if (!isNaN(url.port) && Number(url.port)) {
256
+ options.port = Number(url.port);
257
+ }
258
+ if (url.hostname) {
259
+ options.host = url.hostname;
260
+ }
261
+ if (url.username || url.password) {
262
+ options.auth = {
263
+ user: url.username || '',
264
+ pass: url.password || ''
265
+ };
266
+ }
267
+ Object.keys(url.query || {}).forEach(key => {
268
+ let obj = options;
269
+ let lKey = key;
270
+ let value = url.query[key];
271
+ if (!isNaN(value)) {
272
+ value = Number(value);
273
+ }
274
+ switch (value) {
275
+ case 'true':
276
+ value = true;
277
+ break;
278
+ case 'false':
279
+ value = false;
280
+ break;
281
+ }
282
+ // tls is nested object
283
+ if (key.indexOf('tls.') === 0) {
284
+ lKey = key.substr(4);
285
+ if (!options.tls) {
286
+ options.tls = {};
287
+ }
288
+ obj = options.tls;
289
+ }
290
+ else if (key.indexOf('.') >= 0) {
291
+ // ignore nested properties besides tls
292
+ return;
293
+ }
294
+ // `in` already keeps "__proto__" out, but only as a side effect of it being an
295
+ // Object.prototype member. Say it, so the protection survives a change to the check
296
+ if (!isProtoKey(lKey) && !(lKey in obj)) {
297
+ obj[lKey] = value;
298
+ }
299
+ });
300
+ return options;
301
+ };
302
+ /** @internal */
303
+ export const _logFunc = (logger, level, defaults, data, message, ...args) => {
304
+ const entry = Object.assign({}, defaults || {}, data || {});
305
+ delete entry.level;
306
+ let logLevel = level;
307
+ if (typeof logger[logLevel] !== 'function') {
308
+ // Provided logger does not implement this level. Fall back to a
309
+ // lower-severity handler instead of throwing.
310
+ logLevel = ['info', 'debug', 'log', 'trace', 'warn', 'error'].find(name => typeof logger[name] === 'function');
311
+ }
312
+ if (logLevel) {
313
+ logger[logLevel](entry, message, ...args);
314
+ }
315
+ };
316
+ /**
317
+ * Returns a bunyan-compatible logger interface. Uses either provided logger or
318
+ * creates a default console logger
319
+ *
320
+ * @param [options] Options object that might include 'logger' value
321
+ * @param [defaults] Fields merged into every log entry, overridden by the fields of the entry itself
322
+ * @return bunyan compatible logger
323
+ */
324
+ export const getLogger = (options, defaults) => {
325
+ options = options || {};
326
+ const response = {};
327
+ const levels = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];
328
+ if (!options.logger) {
329
+ // use vanity logger
330
+ levels.forEach(level => {
331
+ response[level] = () => false;
332
+ });
333
+ return response;
334
+ }
335
+ const logger = options.logger === true ? createDefaultLogger(levels) : options.logger;
336
+ levels.forEach(level => {
337
+ response[level] = (...args) => {
338
+ // the bunyan forms: a data object first, or the message alone
339
+ const data = typeof args[0] === 'string' ? undefined : args.shift();
340
+ _logFunc(logger, level, defaults, data, ...args);
341
+ };
342
+ });
343
+ return response;
344
+ };
345
+ /**
346
+ * Wrapper for creating a callback that either resolves or rejects a promise
347
+ * based on input
348
+ *
349
+ * @param resolve Function to run if callback is called
350
+ * @param reject Function to run if callback ends with an error
351
+ */
352
+ export const callbackPromise = (resolve, reject) => function (...args) {
353
+ const err = args.shift();
354
+ if (err) {
355
+ reject(err);
356
+ }
357
+ else {
358
+ resolve(...args);
359
+ }
360
+ };
361
+ export const parseDataURI = (uri) => {
362
+ if (typeof uri !== 'string') {
363
+ return null;
364
+ }
365
+ // Early return for non-data URIs to avoid unnecessary processing
366
+ if (!uri.startsWith('data:')) {
367
+ return null;
368
+ }
369
+ // Find the first comma safely - this prevents ReDoS
370
+ const commaPos = uri.indexOf(',');
371
+ if (commaPos === -1) {
372
+ return null;
373
+ }
374
+ const data = uri.substring(commaPos + 1);
375
+ const metaStr = uri.substring('data:'.length, commaPos);
376
+ let encoding;
377
+ const metaEntries = metaStr.split(';');
378
+ if (metaEntries.length > 0) {
379
+ const lastEntry = metaEntries[metaEntries.length - 1].toLowerCase().trim();
380
+ // Only recognize valid encoding types to prevent manipulation
381
+ if (['base64', 'utf8', 'utf-8'].includes(lastEntry) && lastEntry.indexOf('=') === -1) {
382
+ encoding = lastEntry;
383
+ metaEntries.pop();
384
+ }
385
+ }
386
+ const contentType = metaEntries.length > 0 ? metaEntries.shift() : 'application/octet-stream';
387
+ const params = {};
388
+ for (let i = 0; i < metaEntries.length; i++) {
389
+ const entry = metaEntries[i];
390
+ const sepPos = entry.indexOf('=');
391
+ if (sepPos > 0) {
392
+ // Ensure there's a key before the '='
393
+ const key = entry.substring(0, sepPos).trim();
394
+ const value = entry.substring(sepPos + 1).trim();
395
+ if (key && !isProtoKey(key)) {
396
+ params[key] = value;
397
+ }
398
+ }
399
+ }
400
+ // Decode data based on encoding with proper error handling
401
+ let bufferData;
402
+ try {
403
+ if (encoding === 'base64') {
404
+ bufferData = Buffer.from(data, 'base64');
405
+ }
406
+ else {
407
+ try {
408
+ bufferData = Buffer.from(decodeURIComponent(data));
409
+ }
410
+ catch (_decodeError) {
411
+ bufferData = Buffer.from(data);
412
+ }
413
+ }
414
+ }
415
+ catch (_bufferError) {
416
+ bufferData = Buffer.alloc(0);
417
+ }
418
+ return {
419
+ data: bufferData,
420
+ encoding: encoding || null,
421
+ contentType: contentType || 'application/octet-stream',
422
+ params
423
+ };
424
+ };
425
+ export function resolveContent(data, key, options, callback) {
426
+ // options is optional; support the legacy resolveContent(data, key, callback) signature
427
+ if (!callback && typeof options === 'function') {
428
+ callback = options;
429
+ options = false;
430
+ }
431
+ options = options || {};
432
+ let promise;
433
+ if (!callback) {
434
+ promise = new Promise((resolve, reject) => {
435
+ callback = callbackPromise(resolve, reject);
436
+ });
437
+ }
438
+ resolveContentValue(data, key, options, callback);
439
+ return promise;
440
+ }
441
+ function resolveContentValue(data, key, options, callback) {
442
+ let content = (data && data[key] && data[key].content) || data[key];
443
+ const encoding = ((typeof data[key] === 'object' && data[key].encoding) || 'utf8')
444
+ .toString()
445
+ .toLowerCase()
446
+ .replace(/[-_\s]/g, '');
447
+ if (!content) {
448
+ return callback(null, content);
449
+ }
450
+ if (typeof content === 'object') {
451
+ if (typeof content.pipe === 'function') {
452
+ return resolveStream(content, (err, value) => {
453
+ if (err) {
454
+ return callback(err);
455
+ }
456
+ // we can't stream twice the same content, so we need
457
+ // to replace the stream object with the streaming result
458
+ if (data[key].content) {
459
+ data[key].content = value;
460
+ }
461
+ else {
462
+ data[key] = value;
463
+ }
464
+ callback(null, value);
465
+ });
466
+ }
467
+ else if (/^data:/i.test(content.path || content.href)) {
468
+ const parsedDataUri = parseDataURI(content.path || content.href);
469
+ return callback(null, parsedDataUri && parsedDataUri.data ? parsedDataUri.data : Buffer.alloc(0));
470
+ }
471
+ else if (content.href || /^https?:\/\//i.test(content.path)) {
472
+ // An href is always a URL, and so is a path that looks like one. Let nmfetch
473
+ // decide whether it is fetchable, it validates the parsed URL. Testing the raw
474
+ // string here instead would let a file: href fall through to the "return as is"
475
+ // default below and travel on inside the resolved message.
476
+ const url = content.href || content.path;
477
+ if (options.disableUrlAccess) {
478
+ setImmediate(() => {
479
+ const err = new Error('Url access rejected for ' + url);
480
+ err.code = errors.EURLACCESS;
481
+ callback(err);
482
+ });
483
+ return;
484
+ }
485
+ return resolveStream(nmfetch(url, { headers: content.httpHeaders, tls: content.tls }), callback);
486
+ }
487
+ else if (content.path) {
488
+ if (options.disableFileAccess) {
489
+ setImmediate(() => {
490
+ const err = new Error('File access rejected for ' + content.path);
491
+ err.code = errors.EFILEACCESS;
492
+ callback(err);
493
+ });
494
+ return;
495
+ }
496
+ return resolveStream(fs.createReadStream(content.path), callback);
497
+ }
498
+ }
499
+ if (typeof data[key].content === 'string' && !['utf8', 'usascii', 'ascii'].includes(encoding)) {
500
+ content = Buffer.from(data[key].content, encoding);
501
+ }
502
+ // default action, return as is
503
+ setImmediate(() => callback(null, content));
504
+ }
505
+ /**
506
+ * Copies properties from source objects to target objects
507
+ */
508
+ export const assign = function (...args) {
509
+ const target = args.shift() || {};
510
+ args.forEach(source => {
511
+ Object.keys(source || {}).forEach(key => {
512
+ if (isProtoKey(key)) {
513
+ return;
514
+ }
515
+ if (['tls', 'auth'].includes(key) &&
516
+ source[key] &&
517
+ typeof source[key] === 'object') {
518
+ // tls and auth are special keys that need to be enumerated separately
519
+ // other objects are passed as is. Enumerating is a copy of user supplied
520
+ // keys just like the loop above, so it gets the same treatment
521
+ target[key] = copyOwnKeys(target[key] || {}, source[key]);
522
+ }
523
+ else {
524
+ target[key] = source[key];
525
+ }
526
+ });
527
+ });
528
+ return target;
529
+ };
530
+ export const encodeXText = (str) => {
531
+ // ! 0x21
532
+ // + 0x2B
533
+ // = 0x3D
534
+ // ~ 0x7E
535
+ if (!/[^\x21-\x2A\x2C-\x3C\x3E-\x7E]/.test(str)) {
536
+ return str;
537
+ }
538
+ const buf = Buffer.from(str);
539
+ let result = '';
540
+ for (let i = 0, len = buf.length; i < len; i++) {
541
+ const c = buf[i];
542
+ if (c < 0x21 || c > 0x7e || c === 0x2b || c === 0x3d) {
543
+ result += '+' + (c < 0x10 ? '0' : '') + c.toString(16).toUpperCase();
544
+ }
545
+ else {
546
+ result += String.fromCharCode(c);
547
+ }
548
+ }
549
+ return result;
550
+ };
551
+ /**
552
+ * Streams a stream value into a Buffer
553
+ *
554
+ * @param stream Readable stream
555
+ * @param callback Callback function with (err, value)
556
+ */
557
+ function resolveStream(stream, callback) {
558
+ let responded = false;
559
+ const chunks = [];
560
+ let chunklen = 0;
561
+ stream.on('error', err => {
562
+ if (responded) {
563
+ return;
564
+ }
565
+ responded = true;
566
+ callback(err);
567
+ });
568
+ stream.on('readable', () => {
569
+ let chunk;
570
+ while ((chunk = stream.read()) !== null) {
571
+ chunks.push(chunk);
572
+ chunklen += chunk.length;
573
+ }
574
+ });
575
+ stream.on('end', () => {
576
+ if (responded) {
577
+ return;
578
+ }
579
+ responded = true;
580
+ let value;
581
+ try {
582
+ value = Buffer.concat(chunks, chunklen);
583
+ }
584
+ catch (E) {
585
+ return callback(E);
586
+ }
587
+ callback(null, value);
588
+ });
589
+ }
590
+ /**
591
+ * Generates a bunyan-like logger that prints to console
592
+ *
593
+ * @returns Bunyan logger instance
594
+ */
595
+ function createDefaultLogger(levels) {
596
+ const levelMaxLen = levels.reduce((max, level) => Math.max(max, level.length), 0);
597
+ const levelNames = new Map();
598
+ levels.forEach(level => {
599
+ let levelName = level.toUpperCase();
600
+ if (levelName.length < levelMaxLen) {
601
+ levelName += ' '.repeat(levelMaxLen - levelName.length);
602
+ }
603
+ levelNames.set(level, levelName);
604
+ });
605
+ const print = (level, entry, message, ...args) => {
606
+ let prefix = '';
607
+ if (entry) {
608
+ if (entry.tnx === 'server') {
609
+ prefix = 'S: ';
610
+ }
611
+ else if (entry.tnx === 'client') {
612
+ prefix = 'C: ';
613
+ }
614
+ if (entry.sid) {
615
+ prefix = '[' + entry.sid + '] ' + prefix;
616
+ }
617
+ if (entry.cid) {
618
+ prefix = '[#' + entry.cid + '] ' + prefix;
619
+ }
620
+ }
621
+ message = util.format(message, ...args);
622
+ message.split(/\r?\n/).forEach((line) => {
623
+ console.log('[%s] %s %s', new Date().toISOString().substr(0, 19).replace(/T/, ' '), levelNames.get(level), prefix + line);
624
+ });
625
+ };
626
+ const logger = {};
627
+ levels.forEach(level => {
628
+ logger[level] = print.bind(null, level);
629
+ });
630
+ return logger;
631
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Detects a key that can not be copied onto a plain object with `target[key] = value`.
3
+ *
4
+ * "__proto__" is the only one: assigning it runs the inherited setter and replaces the
5
+ * prototype of the target instead of adding a property to it, so a caller can smuggle
6
+ * values past validation that only inspects own keys. JSON.parse produces such a key
7
+ * where an object literal can not. "constructor" and "prototype" have no such setter and
8
+ * become ordinary own properties, so dropping them would only discard legitimate values.
9
+ *
10
+ * @param key Key to check
11
+ * @returns true if the key must not be copied
12
+ */
13
+ export declare const isProtoKey: (key: string) => boolean;
14
+ /**
15
+ * Copies own enumerable keys from a source object to a target object. Every copy that
16
+ * walks the keys of user supplied data goes through here, see isProtoKey.
17
+ *
18
+ * @param target Object to copy the keys to
19
+ * @param source Object to copy the keys from
20
+ * @param [skip] Optional predicate, return true to leave a key out
21
+ * @returns The target object
22
+ */
23
+ export declare const copyOwnKeys: <T extends object>(target: T, source: object | null | undefined, skip?: (key: string) => boolean) => T;
@@ -0,0 +1,38 @@
1
+ // Safe copying of objects whose keys come from the caller.
2
+ //
3
+ // This lives in its own leaf module, like ./url.ts, so that every layer can reach it.
4
+ // src/shared/index.ts imports src/fetch, so src/fetch can not import src/shared back,
5
+ // and src/mime-funcs is a leaf that would otherwise pull in dns/net/os/fs for a string
6
+ // comparison. src/shared/index.ts re-exports both functions for the callers that already
7
+ // depend on it.
8
+ /**
9
+ * Detects a key that can not be copied onto a plain object with `target[key] = value`.
10
+ *
11
+ * "__proto__" is the only one: assigning it runs the inherited setter and replaces the
12
+ * prototype of the target instead of adding a property to it, so a caller can smuggle
13
+ * values past validation that only inspects own keys. JSON.parse produces such a key
14
+ * where an object literal can not. "constructor" and "prototype" have no such setter and
15
+ * become ordinary own properties, so dropping them would only discard legitimate values.
16
+ *
17
+ * @param key Key to check
18
+ * @returns true if the key must not be copied
19
+ */
20
+ export const isProtoKey = (key) => key === '__proto__';
21
+ /**
22
+ * Copies own enumerable keys from a source object to a target object. Every copy that
23
+ * walks the keys of user supplied data goes through here, see isProtoKey.
24
+ *
25
+ * @param target Object to copy the keys to
26
+ * @param source Object to copy the keys from
27
+ * @param [skip] Optional predicate, return true to leave a key out
28
+ * @returns The target object
29
+ */
30
+ export const copyOwnKeys = (target, source, skip) => {
31
+ Object.keys(source || {}).forEach(key => {
32
+ if (isProtoKey(key) || (skip && skip(key))) {
33
+ return;
34
+ }
35
+ target[key] = source[key];
36
+ });
37
+ return target;
38
+ };