@bobfrankston/mailx 1.0.30 → 1.0.32
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/bin/mailx.js +20 -5
- package/client/styles/layout.css +12 -7
- package/launcher/builder/postinstall.js +7 -7
- package/package.json +4 -4
- package/packages/mailx-send/mailsend/node_modules/.package-lock.json +0 -49
- package/packages/mailx-send/mailsend/node_modules/@types/node/LICENSE +0 -21
- package/packages/mailx-send/mailsend/node_modules/@types/node/README.md +0 -15
- package/packages/mailx-send/mailsend/node_modules/@types/node/assert/strict.d.ts +0 -111
- package/packages/mailx-send/mailsend/node_modules/@types/node/assert.d.ts +0 -1078
- package/packages/mailx-send/mailsend/node_modules/@types/node/async_hooks.d.ts +0 -603
- package/packages/mailx-send/mailsend/node_modules/@types/node/buffer.buffer.d.ts +0 -472
- package/packages/mailx-send/mailsend/node_modules/@types/node/buffer.d.ts +0 -1934
- package/packages/mailx-send/mailsend/node_modules/@types/node/child_process.d.ts +0 -1476
- package/packages/mailx-send/mailsend/node_modules/@types/node/cluster.d.ts +0 -578
- package/packages/mailx-send/mailsend/node_modules/@types/node/compatibility/disposable.d.ts +0 -14
- package/packages/mailx-send/mailsend/node_modules/@types/node/compatibility/index.d.ts +0 -9
- package/packages/mailx-send/mailsend/node_modules/@types/node/compatibility/indexable.d.ts +0 -20
- package/packages/mailx-send/mailsend/node_modules/@types/node/compatibility/iterators.d.ts +0 -20
- package/packages/mailx-send/mailsend/node_modules/@types/node/console.d.ts +0 -452
- package/packages/mailx-send/mailsend/node_modules/@types/node/constants.d.ts +0 -21
- package/packages/mailx-send/mailsend/node_modules/@types/node/crypto.d.ts +0 -4545
- package/packages/mailx-send/mailsend/node_modules/@types/node/dgram.d.ts +0 -600
- package/packages/mailx-send/mailsend/node_modules/@types/node/diagnostics_channel.d.ts +0 -578
- package/packages/mailx-send/mailsend/node_modules/@types/node/dns/promises.d.ts +0 -503
- package/packages/mailx-send/mailsend/node_modules/@types/node/dns.d.ts +0 -923
- package/packages/mailx-send/mailsend/node_modules/@types/node/domain.d.ts +0 -170
- package/packages/mailx-send/mailsend/node_modules/@types/node/events.d.ts +0 -976
- package/packages/mailx-send/mailsend/node_modules/@types/node/fs/promises.d.ts +0 -1295
- package/packages/mailx-send/mailsend/node_modules/@types/node/fs.d.ts +0 -4461
- package/packages/mailx-send/mailsend/node_modules/@types/node/globals.d.ts +0 -172
- package/packages/mailx-send/mailsend/node_modules/@types/node/globals.typedarray.d.ts +0 -38
- package/packages/mailx-send/mailsend/node_modules/@types/node/http.d.ts +0 -2089
- package/packages/mailx-send/mailsend/node_modules/@types/node/http2.d.ts +0 -2644
- package/packages/mailx-send/mailsend/node_modules/@types/node/https.d.ts +0 -579
- package/packages/mailx-send/mailsend/node_modules/@types/node/index.d.ts +0 -97
- package/packages/mailx-send/mailsend/node_modules/@types/node/inspector.d.ts +0 -253
- package/packages/mailx-send/mailsend/node_modules/@types/node/inspector.generated.d.ts +0 -4052
- package/packages/mailx-send/mailsend/node_modules/@types/node/module.d.ts +0 -891
- package/packages/mailx-send/mailsend/node_modules/@types/node/net.d.ts +0 -1057
- package/packages/mailx-send/mailsend/node_modules/@types/node/os.d.ts +0 -506
- package/packages/mailx-send/mailsend/node_modules/@types/node/package.json +0 -145
- package/packages/mailx-send/mailsend/node_modules/@types/node/path.d.ts +0 -200
- package/packages/mailx-send/mailsend/node_modules/@types/node/perf_hooks.d.ts +0 -968
- package/packages/mailx-send/mailsend/node_modules/@types/node/process.d.ts +0 -2084
- package/packages/mailx-send/mailsend/node_modules/@types/node/punycode.d.ts +0 -117
- package/packages/mailx-send/mailsend/node_modules/@types/node/querystring.d.ts +0 -152
- package/packages/mailx-send/mailsend/node_modules/@types/node/readline/promises.d.ts +0 -161
- package/packages/mailx-send/mailsend/node_modules/@types/node/readline.d.ts +0 -594
- package/packages/mailx-send/mailsend/node_modules/@types/node/repl.d.ts +0 -428
- package/packages/mailx-send/mailsend/node_modules/@types/node/sea.d.ts +0 -153
- package/packages/mailx-send/mailsend/node_modules/@types/node/sqlite.d.ts +0 -721
- package/packages/mailx-send/mailsend/node_modules/@types/node/stream/consumers.d.ts +0 -38
- package/packages/mailx-send/mailsend/node_modules/@types/node/stream/promises.d.ts +0 -90
- package/packages/mailx-send/mailsend/node_modules/@types/node/stream/web.d.ts +0 -622
- package/packages/mailx-send/mailsend/node_modules/@types/node/stream.d.ts +0 -1664
- package/packages/mailx-send/mailsend/node_modules/@types/node/string_decoder.d.ts +0 -67
- package/packages/mailx-send/mailsend/node_modules/@types/node/test.d.ts +0 -2163
- package/packages/mailx-send/mailsend/node_modules/@types/node/timers/promises.d.ts +0 -108
- package/packages/mailx-send/mailsend/node_modules/@types/node/timers.d.ts +0 -287
- package/packages/mailx-send/mailsend/node_modules/@types/node/tls.d.ts +0 -1319
- package/packages/mailx-send/mailsend/node_modules/@types/node/trace_events.d.ts +0 -197
- package/packages/mailx-send/mailsend/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +0 -468
- package/packages/mailx-send/mailsend/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +0 -34
- package/packages/mailx-send/mailsend/node_modules/@types/node/ts5.6/index.d.ts +0 -97
- package/packages/mailx-send/mailsend/node_modules/@types/node/tty.d.ts +0 -208
- package/packages/mailx-send/mailsend/node_modules/@types/node/url.d.ts +0 -984
- package/packages/mailx-send/mailsend/node_modules/@types/node/util.d.ts +0 -2606
- package/packages/mailx-send/mailsend/node_modules/@types/node/v8.d.ts +0 -920
- package/packages/mailx-send/mailsend/node_modules/@types/node/vm.d.ts +0 -1000
- package/packages/mailx-send/mailsend/node_modules/@types/node/wasi.d.ts +0 -181
- package/packages/mailx-send/mailsend/node_modules/@types/node/web-globals/abortcontroller.d.ts +0 -34
- package/packages/mailx-send/mailsend/node_modules/@types/node/web-globals/domexception.d.ts +0 -68
- package/packages/mailx-send/mailsend/node_modules/@types/node/web-globals/events.d.ts +0 -97
- package/packages/mailx-send/mailsend/node_modules/@types/node/web-globals/fetch.d.ts +0 -55
- package/packages/mailx-send/mailsend/node_modules/@types/node/web-globals/navigator.d.ts +0 -22
- package/packages/mailx-send/mailsend/node_modules/@types/node/web-globals/storage.d.ts +0 -24
- package/packages/mailx-send/mailsend/node_modules/@types/node/worker_threads.d.ts +0 -784
- package/packages/mailx-send/mailsend/node_modules/@types/node/zlib.d.ts +0 -747
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/LICENSE +0 -21
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/README.md +0 -15
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/index.d.ts +0 -82
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/addressparser/index.d.ts +0 -31
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/base64/index.d.ts +0 -22
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/dkim/index.d.ts +0 -45
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/dkim/message-parser.d.ts +0 -75
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/dkim/relaxed-body.d.ts +0 -75
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/dkim/sign.d.ts +0 -21
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/fetch/cookies.d.ts +0 -54
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/fetch/index.d.ts +0 -38
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/json-transport/index.d.ts +0 -53
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mail-composer/index.d.ts +0 -25
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mailer/index.d.ts +0 -283
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mailer/mail-message.d.ts +0 -32
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mime-funcs/index.d.ts +0 -87
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mime-funcs/mime-types.d.ts +0 -2
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mime-node/index.d.ts +0 -224
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/mime-node/last-newline.d.ts +0 -9
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/qp/index.d.ts +0 -23
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/sendmail-transport/index.d.ts +0 -53
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/sendmail-transport/le-unix.d.ts +0 -7
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/sendmail-transport/le-windows.d.ts +0 -7
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/ses-transport/index.d.ts +0 -146
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/shared/index.d.ts +0 -58
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/smtp-connection/data-stream.d.ts +0 -11
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/smtp-connection/http-proxy-client.d.ts +0 -16
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/smtp-connection/index.d.ts +0 -270
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/smtp-pool/index.d.ts +0 -93
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/smtp-pool/pool-resource.d.ts +0 -66
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/smtp-transport/index.d.ts +0 -115
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/stream-transport/index.d.ts +0 -59
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/well-known/index.d.ts +0 -6
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/lib/xoauth2/index.d.ts +0 -114
- package/packages/mailx-send/mailsend/node_modules/@types/nodemailer/package.json +0 -38
- package/packages/mailx-send/mailsend/node_modules/nodemailer/.ncurc.js +0 -9
- package/packages/mailx-send/mailsend/node_modules/nodemailer/.prettierignore +0 -8
- package/packages/mailx-send/mailsend/node_modules/nodemailer/.prettierrc +0 -12
- package/packages/mailx-send/mailsend/node_modules/nodemailer/.prettierrc.js +0 -10
- package/packages/mailx-send/mailsend/node_modules/nodemailer/.release-please-config.json +0 -9
- package/packages/mailx-send/mailsend/node_modules/nodemailer/LICENSE +0 -16
- package/packages/mailx-send/mailsend/node_modules/nodemailer/README.md +0 -86
- package/packages/mailx-send/mailsend/node_modules/nodemailer/SECURITY.txt +0 -22
- package/packages/mailx-send/mailsend/node_modules/nodemailer/eslint.config.js +0 -88
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/addressparser/index.js +0 -383
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/base64/index.js +0 -139
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/dkim/index.js +0 -253
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/dkim/message-parser.js +0 -155
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/dkim/relaxed-body.js +0 -154
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/dkim/sign.js +0 -117
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/fetch/cookies.js +0 -281
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/fetch/index.js +0 -280
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/json-transport/index.js +0 -82
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mail-composer/index.js +0 -629
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mailer/index.js +0 -441
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mailer/mail-message.js +0 -316
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mime-funcs/index.js +0 -625
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mime-funcs/mime-types.js +0 -2113
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mime-node/index.js +0 -1316
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mime-node/last-newline.js +0 -33
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mime-node/le-unix.js +0 -43
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/mime-node/le-windows.js +0 -52
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/nodemailer.js +0 -157
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/punycode/index.js +0 -460
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/qp/index.js +0 -227
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/sendmail-transport/index.js +0 -210
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/ses-transport/index.js +0 -234
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/shared/index.js +0 -754
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/smtp-connection/data-stream.js +0 -108
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +0 -143
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/smtp-connection/index.js +0 -1870
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/smtp-pool/index.js +0 -652
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/smtp-pool/pool-resource.js +0 -259
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/smtp-transport/index.js +0 -421
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/stream-transport/index.js +0 -135
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/well-known/index.js +0 -47
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/well-known/services.json +0 -611
- package/packages/mailx-send/mailsend/node_modules/nodemailer/lib/xoauth2/index.js +0 -427
- package/packages/mailx-send/mailsend/node_modules/nodemailer/package.json +0 -47
- package/packages/mailx-send/mailsend/node_modules/undici-types/LICENSE +0 -21
- package/packages/mailx-send/mailsend/node_modules/undici-types/README.md +0 -6
- package/packages/mailx-send/mailsend/node_modules/undici-types/agent.d.ts +0 -31
- package/packages/mailx-send/mailsend/node_modules/undici-types/api.d.ts +0 -43
- package/packages/mailx-send/mailsend/node_modules/undici-types/balanced-pool.d.ts +0 -29
- package/packages/mailx-send/mailsend/node_modules/undici-types/cache.d.ts +0 -36
- package/packages/mailx-send/mailsend/node_modules/undici-types/client.d.ts +0 -108
- package/packages/mailx-send/mailsend/node_modules/undici-types/connector.d.ts +0 -34
- package/packages/mailx-send/mailsend/node_modules/undici-types/content-type.d.ts +0 -21
- package/packages/mailx-send/mailsend/node_modules/undici-types/cookies.d.ts +0 -28
- package/packages/mailx-send/mailsend/node_modules/undici-types/diagnostics-channel.d.ts +0 -66
- package/packages/mailx-send/mailsend/node_modules/undici-types/dispatcher.d.ts +0 -256
- package/packages/mailx-send/mailsend/node_modules/undici-types/env-http-proxy-agent.d.ts +0 -21
- package/packages/mailx-send/mailsend/node_modules/undici-types/errors.d.ts +0 -149
- package/packages/mailx-send/mailsend/node_modules/undici-types/eventsource.d.ts +0 -61
- package/packages/mailx-send/mailsend/node_modules/undici-types/fetch.d.ts +0 -209
- package/packages/mailx-send/mailsend/node_modules/undici-types/file.d.ts +0 -39
- package/packages/mailx-send/mailsend/node_modules/undici-types/filereader.d.ts +0 -54
- package/packages/mailx-send/mailsend/node_modules/undici-types/formdata.d.ts +0 -108
- package/packages/mailx-send/mailsend/node_modules/undici-types/global-dispatcher.d.ts +0 -9
- package/packages/mailx-send/mailsend/node_modules/undici-types/global-origin.d.ts +0 -7
- package/packages/mailx-send/mailsend/node_modules/undici-types/handlers.d.ts +0 -15
- package/packages/mailx-send/mailsend/node_modules/undici-types/header.d.ts +0 -4
- package/packages/mailx-send/mailsend/node_modules/undici-types/index.d.ts +0 -71
- package/packages/mailx-send/mailsend/node_modules/undici-types/interceptors.d.ts +0 -17
- package/packages/mailx-send/mailsend/node_modules/undici-types/mock-agent.d.ts +0 -50
- package/packages/mailx-send/mailsend/node_modules/undici-types/mock-client.d.ts +0 -25
- package/packages/mailx-send/mailsend/node_modules/undici-types/mock-errors.d.ts +0 -12
- package/packages/mailx-send/mailsend/node_modules/undici-types/mock-interceptor.d.ts +0 -93
- package/packages/mailx-send/mailsend/node_modules/undici-types/mock-pool.d.ts +0 -25
- package/packages/mailx-send/mailsend/node_modules/undici-types/package.json +0 -55
- package/packages/mailx-send/mailsend/node_modules/undici-types/patch.d.ts +0 -33
- package/packages/mailx-send/mailsend/node_modules/undici-types/pool-stats.d.ts +0 -19
- package/packages/mailx-send/mailsend/node_modules/undici-types/pool.d.ts +0 -39
- package/packages/mailx-send/mailsend/node_modules/undici-types/proxy-agent.d.ts +0 -28
- package/packages/mailx-send/mailsend/node_modules/undici-types/readable.d.ts +0 -65
- package/packages/mailx-send/mailsend/node_modules/undici-types/retry-agent.d.ts +0 -8
- package/packages/mailx-send/mailsend/node_modules/undici-types/retry-handler.d.ts +0 -116
- package/packages/mailx-send/mailsend/node_modules/undici-types/util.d.ts +0 -18
- package/packages/mailx-send/mailsend/node_modules/undici-types/webidl.d.ts +0 -228
- package/packages/mailx-send/mailsend/node_modules/undici-types/websocket.d.ts +0 -150
- package/packages/mailx-send/node_modules/.package-lock.json +0 -49
- package/packages/mailx-send/node_modules/@types/node/LICENSE +0 -21
- package/packages/mailx-send/node_modules/@types/node/README.md +0 -15
- package/packages/mailx-send/node_modules/@types/node/assert/strict.d.ts +0 -111
- package/packages/mailx-send/node_modules/@types/node/assert.d.ts +0 -1078
- package/packages/mailx-send/node_modules/@types/node/async_hooks.d.ts +0 -603
- package/packages/mailx-send/node_modules/@types/node/buffer.buffer.d.ts +0 -472
- package/packages/mailx-send/node_modules/@types/node/buffer.d.ts +0 -1934
- package/packages/mailx-send/node_modules/@types/node/child_process.d.ts +0 -1476
- package/packages/mailx-send/node_modules/@types/node/cluster.d.ts +0 -578
- package/packages/mailx-send/node_modules/@types/node/compatibility/disposable.d.ts +0 -14
- package/packages/mailx-send/node_modules/@types/node/compatibility/index.d.ts +0 -9
- package/packages/mailx-send/node_modules/@types/node/compatibility/indexable.d.ts +0 -20
- package/packages/mailx-send/node_modules/@types/node/compatibility/iterators.d.ts +0 -20
- package/packages/mailx-send/node_modules/@types/node/console.d.ts +0 -452
- package/packages/mailx-send/node_modules/@types/node/constants.d.ts +0 -21
- package/packages/mailx-send/node_modules/@types/node/crypto.d.ts +0 -4545
- package/packages/mailx-send/node_modules/@types/node/dgram.d.ts +0 -600
- package/packages/mailx-send/node_modules/@types/node/diagnostics_channel.d.ts +0 -578
- package/packages/mailx-send/node_modules/@types/node/dns/promises.d.ts +0 -503
- package/packages/mailx-send/node_modules/@types/node/dns.d.ts +0 -923
- package/packages/mailx-send/node_modules/@types/node/domain.d.ts +0 -170
- package/packages/mailx-send/node_modules/@types/node/events.d.ts +0 -976
- package/packages/mailx-send/node_modules/@types/node/fs/promises.d.ts +0 -1295
- package/packages/mailx-send/node_modules/@types/node/fs.d.ts +0 -4461
- package/packages/mailx-send/node_modules/@types/node/globals.d.ts +0 -172
- package/packages/mailx-send/node_modules/@types/node/globals.typedarray.d.ts +0 -38
- package/packages/mailx-send/node_modules/@types/node/http.d.ts +0 -2089
- package/packages/mailx-send/node_modules/@types/node/http2.d.ts +0 -2644
- package/packages/mailx-send/node_modules/@types/node/https.d.ts +0 -579
- package/packages/mailx-send/node_modules/@types/node/index.d.ts +0 -97
- package/packages/mailx-send/node_modules/@types/node/inspector.d.ts +0 -253
- package/packages/mailx-send/node_modules/@types/node/inspector.generated.d.ts +0 -4052
- package/packages/mailx-send/node_modules/@types/node/module.d.ts +0 -891
- package/packages/mailx-send/node_modules/@types/node/net.d.ts +0 -1057
- package/packages/mailx-send/node_modules/@types/node/os.d.ts +0 -506
- package/packages/mailx-send/node_modules/@types/node/package.json +0 -145
- package/packages/mailx-send/node_modules/@types/node/path.d.ts +0 -200
- package/packages/mailx-send/node_modules/@types/node/perf_hooks.d.ts +0 -968
- package/packages/mailx-send/node_modules/@types/node/process.d.ts +0 -2084
- package/packages/mailx-send/node_modules/@types/node/punycode.d.ts +0 -117
- package/packages/mailx-send/node_modules/@types/node/querystring.d.ts +0 -152
- package/packages/mailx-send/node_modules/@types/node/readline/promises.d.ts +0 -161
- package/packages/mailx-send/node_modules/@types/node/readline.d.ts +0 -594
- package/packages/mailx-send/node_modules/@types/node/repl.d.ts +0 -428
- package/packages/mailx-send/node_modules/@types/node/sea.d.ts +0 -153
- package/packages/mailx-send/node_modules/@types/node/sqlite.d.ts +0 -721
- package/packages/mailx-send/node_modules/@types/node/stream/consumers.d.ts +0 -38
- package/packages/mailx-send/node_modules/@types/node/stream/promises.d.ts +0 -90
- package/packages/mailx-send/node_modules/@types/node/stream/web.d.ts +0 -622
- package/packages/mailx-send/node_modules/@types/node/stream.d.ts +0 -1664
- package/packages/mailx-send/node_modules/@types/node/string_decoder.d.ts +0 -67
- package/packages/mailx-send/node_modules/@types/node/test.d.ts +0 -2163
- package/packages/mailx-send/node_modules/@types/node/timers/promises.d.ts +0 -108
- package/packages/mailx-send/node_modules/@types/node/timers.d.ts +0 -287
- package/packages/mailx-send/node_modules/@types/node/tls.d.ts +0 -1319
- package/packages/mailx-send/node_modules/@types/node/trace_events.d.ts +0 -197
- package/packages/mailx-send/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +0 -468
- package/packages/mailx-send/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +0 -34
- package/packages/mailx-send/node_modules/@types/node/ts5.6/index.d.ts +0 -97
- package/packages/mailx-send/node_modules/@types/node/tty.d.ts +0 -208
- package/packages/mailx-send/node_modules/@types/node/url.d.ts +0 -984
- package/packages/mailx-send/node_modules/@types/node/util.d.ts +0 -2606
- package/packages/mailx-send/node_modules/@types/node/v8.d.ts +0 -920
- package/packages/mailx-send/node_modules/@types/node/vm.d.ts +0 -1000
- package/packages/mailx-send/node_modules/@types/node/wasi.d.ts +0 -181
- package/packages/mailx-send/node_modules/@types/node/web-globals/abortcontroller.d.ts +0 -34
- package/packages/mailx-send/node_modules/@types/node/web-globals/domexception.d.ts +0 -68
- package/packages/mailx-send/node_modules/@types/node/web-globals/events.d.ts +0 -97
- package/packages/mailx-send/node_modules/@types/node/web-globals/fetch.d.ts +0 -55
- package/packages/mailx-send/node_modules/@types/node/web-globals/navigator.d.ts +0 -22
- package/packages/mailx-send/node_modules/@types/node/web-globals/storage.d.ts +0 -24
- package/packages/mailx-send/node_modules/@types/node/worker_threads.d.ts +0 -784
- package/packages/mailx-send/node_modules/@types/node/zlib.d.ts +0 -747
- package/packages/mailx-send/node_modules/undici-types/LICENSE +0 -21
- package/packages/mailx-send/node_modules/undici-types/README.md +0 -6
- package/packages/mailx-send/node_modules/undici-types/agent.d.ts +0 -31
- package/packages/mailx-send/node_modules/undici-types/api.d.ts +0 -43
- package/packages/mailx-send/node_modules/undici-types/balanced-pool.d.ts +0 -29
- package/packages/mailx-send/node_modules/undici-types/cache.d.ts +0 -36
- package/packages/mailx-send/node_modules/undici-types/client.d.ts +0 -108
- package/packages/mailx-send/node_modules/undici-types/connector.d.ts +0 -34
- package/packages/mailx-send/node_modules/undici-types/content-type.d.ts +0 -21
- package/packages/mailx-send/node_modules/undici-types/cookies.d.ts +0 -28
- package/packages/mailx-send/node_modules/undici-types/diagnostics-channel.d.ts +0 -66
- package/packages/mailx-send/node_modules/undici-types/dispatcher.d.ts +0 -256
- package/packages/mailx-send/node_modules/undici-types/env-http-proxy-agent.d.ts +0 -21
- package/packages/mailx-send/node_modules/undici-types/errors.d.ts +0 -149
- package/packages/mailx-send/node_modules/undici-types/eventsource.d.ts +0 -61
- package/packages/mailx-send/node_modules/undici-types/fetch.d.ts +0 -209
- package/packages/mailx-send/node_modules/undici-types/file.d.ts +0 -39
- package/packages/mailx-send/node_modules/undici-types/filereader.d.ts +0 -54
- package/packages/mailx-send/node_modules/undici-types/formdata.d.ts +0 -108
- package/packages/mailx-send/node_modules/undici-types/global-dispatcher.d.ts +0 -9
- package/packages/mailx-send/node_modules/undici-types/global-origin.d.ts +0 -7
- package/packages/mailx-send/node_modules/undici-types/handlers.d.ts +0 -15
- package/packages/mailx-send/node_modules/undici-types/header.d.ts +0 -4
- package/packages/mailx-send/node_modules/undici-types/index.d.ts +0 -71
- package/packages/mailx-send/node_modules/undici-types/interceptors.d.ts +0 -17
- package/packages/mailx-send/node_modules/undici-types/mock-agent.d.ts +0 -50
- package/packages/mailx-send/node_modules/undici-types/mock-client.d.ts +0 -25
- package/packages/mailx-send/node_modules/undici-types/mock-errors.d.ts +0 -12
- package/packages/mailx-send/node_modules/undici-types/mock-interceptor.d.ts +0 -93
- package/packages/mailx-send/node_modules/undici-types/mock-pool.d.ts +0 -25
- package/packages/mailx-send/node_modules/undici-types/package.json +0 -55
- package/packages/mailx-send/node_modules/undici-types/patch.d.ts +0 -33
- package/packages/mailx-send/node_modules/undici-types/pool-stats.d.ts +0 -19
- package/packages/mailx-send/node_modules/undici-types/pool.d.ts +0 -39
- package/packages/mailx-send/node_modules/undici-types/proxy-agent.d.ts +0 -28
- package/packages/mailx-send/node_modules/undici-types/readable.d.ts +0 -65
- package/packages/mailx-send/node_modules/undici-types/retry-agent.d.ts +0 -8
- package/packages/mailx-send/node_modules/undici-types/retry-handler.d.ts +0 -116
- package/packages/mailx-send/node_modules/undici-types/util.d.ts +0 -18
- package/packages/mailx-send/node_modules/undici-types/webidl.d.ts +0 -228
- package/packages/mailx-send/node_modules/undici-types/websocket.d.ts +0 -150
|
@@ -1,253 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// FIXME:
|
|
4
|
-
// replace this Transform mess with a method that pipes input argument to output argument
|
|
5
|
-
|
|
6
|
-
const MessageParser = require('./message-parser');
|
|
7
|
-
const RelaxedBody = require('./relaxed-body');
|
|
8
|
-
const sign = require('./sign');
|
|
9
|
-
const PassThrough = require('stream').PassThrough;
|
|
10
|
-
const fs = require('fs');
|
|
11
|
-
const path = require('path');
|
|
12
|
-
const crypto = require('crypto');
|
|
13
|
-
|
|
14
|
-
const DKIM_ALGO = 'sha256';
|
|
15
|
-
const MAX_MESSAGE_SIZE = 2 * 1024 * 1024; // buffer messages larger than this to disk
|
|
16
|
-
|
|
17
|
-
/*
|
|
18
|
-
// Usage:
|
|
19
|
-
|
|
20
|
-
let dkim = new DKIM({
|
|
21
|
-
domainName: 'example.com',
|
|
22
|
-
keySelector: 'key-selector',
|
|
23
|
-
privateKey,
|
|
24
|
-
cacheDir: '/tmp'
|
|
25
|
-
});
|
|
26
|
-
dkim.sign(input).pipe(process.stdout);
|
|
27
|
-
|
|
28
|
-
// Where inputStream is a rfc822 message (either a stream, string or Buffer)
|
|
29
|
-
// and outputStream is a DKIM signed rfc822 message
|
|
30
|
-
*/
|
|
31
|
-
|
|
32
|
-
class DKIMSigner {
|
|
33
|
-
constructor(options, keys, input, output) {
|
|
34
|
-
this.options = options || {};
|
|
35
|
-
this.keys = keys;
|
|
36
|
-
|
|
37
|
-
this.cacheTreshold = Number(this.options.cacheTreshold) || MAX_MESSAGE_SIZE;
|
|
38
|
-
this.hashAlgo = this.options.hashAlgo || DKIM_ALGO;
|
|
39
|
-
|
|
40
|
-
this.cacheDir = this.options.cacheDir || false;
|
|
41
|
-
|
|
42
|
-
this.chunks = [];
|
|
43
|
-
this.chunklen = 0;
|
|
44
|
-
this.readPos = 0;
|
|
45
|
-
this.cachePath = this.cacheDir
|
|
46
|
-
? path.join(this.cacheDir, 'message.' + Date.now() + '-' + crypto.randomBytes(14).toString('hex'))
|
|
47
|
-
: false;
|
|
48
|
-
this.cache = false;
|
|
49
|
-
|
|
50
|
-
this.headers = false;
|
|
51
|
-
this.bodyHash = false;
|
|
52
|
-
this.parser = false;
|
|
53
|
-
this.relaxedBody = false;
|
|
54
|
-
|
|
55
|
-
this.input = input;
|
|
56
|
-
this.output = output;
|
|
57
|
-
this.output.usingCache = false;
|
|
58
|
-
|
|
59
|
-
this.hasErrored = false;
|
|
60
|
-
|
|
61
|
-
this.input.on('error', err => {
|
|
62
|
-
this.hasErrored = true;
|
|
63
|
-
this.cleanup();
|
|
64
|
-
output.emit('error', err);
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
cleanup() {
|
|
69
|
-
if (!this.cache || !this.cachePath) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
fs.unlink(this.cachePath, () => false);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
createReadCache() {
|
|
76
|
-
// pipe remainings to cache file
|
|
77
|
-
this.cache = fs.createReadStream(this.cachePath);
|
|
78
|
-
this.cache.once('error', err => {
|
|
79
|
-
this.cleanup();
|
|
80
|
-
this.output.emit('error', err);
|
|
81
|
-
});
|
|
82
|
-
this.cache.once('close', () => {
|
|
83
|
-
this.cleanup();
|
|
84
|
-
});
|
|
85
|
-
this.cache.pipe(this.output);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
sendNextChunk() {
|
|
89
|
-
if (this.hasErrored) {
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (this.readPos >= this.chunks.length) {
|
|
94
|
-
if (!this.cache) {
|
|
95
|
-
return this.output.end();
|
|
96
|
-
}
|
|
97
|
-
return this.createReadCache();
|
|
98
|
-
}
|
|
99
|
-
let chunk = this.chunks[this.readPos++];
|
|
100
|
-
if (this.output.write(chunk) === false) {
|
|
101
|
-
return this.output.once('drain', () => {
|
|
102
|
-
this.sendNextChunk();
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
setImmediate(() => this.sendNextChunk());
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
sendSignedOutput() {
|
|
109
|
-
let keyPos = 0;
|
|
110
|
-
let signNextKey = () => {
|
|
111
|
-
if (keyPos >= this.keys.length) {
|
|
112
|
-
this.output.write(this.parser.rawHeaders);
|
|
113
|
-
return setImmediate(() => this.sendNextChunk());
|
|
114
|
-
}
|
|
115
|
-
let key = this.keys[keyPos++];
|
|
116
|
-
let dkimField = sign(this.headers, this.hashAlgo, this.bodyHash, {
|
|
117
|
-
domainName: key.domainName,
|
|
118
|
-
keySelector: key.keySelector,
|
|
119
|
-
privateKey: key.privateKey,
|
|
120
|
-
headerFieldNames: this.options.headerFieldNames,
|
|
121
|
-
skipFields: this.options.skipFields
|
|
122
|
-
});
|
|
123
|
-
if (dkimField) {
|
|
124
|
-
this.output.write(Buffer.from(dkimField + '\r\n'));
|
|
125
|
-
}
|
|
126
|
-
return setImmediate(signNextKey);
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
if (this.bodyHash && this.headers) {
|
|
130
|
-
return signNextKey();
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
this.output.write(this.parser.rawHeaders);
|
|
134
|
-
this.sendNextChunk();
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
createWriteCache() {
|
|
138
|
-
this.output.usingCache = true;
|
|
139
|
-
// pipe remainings to cache file
|
|
140
|
-
this.cache = fs.createWriteStream(this.cachePath);
|
|
141
|
-
this.cache.once('error', err => {
|
|
142
|
-
this.cleanup();
|
|
143
|
-
// drain input
|
|
144
|
-
this.relaxedBody.unpipe(this.cache);
|
|
145
|
-
this.relaxedBody.on('readable', () => {
|
|
146
|
-
while (this.relaxedBody.read() !== null) {
|
|
147
|
-
// do nothing
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
this.hasErrored = true;
|
|
151
|
-
// emit error
|
|
152
|
-
this.output.emit('error', err);
|
|
153
|
-
});
|
|
154
|
-
this.cache.once('close', () => {
|
|
155
|
-
this.sendSignedOutput();
|
|
156
|
-
});
|
|
157
|
-
this.relaxedBody.removeAllListeners('readable');
|
|
158
|
-
this.relaxedBody.pipe(this.cache);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
signStream() {
|
|
162
|
-
this.parser = new MessageParser();
|
|
163
|
-
this.relaxedBody = new RelaxedBody({
|
|
164
|
-
hashAlgo: this.hashAlgo
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
this.parser.on('headers', value => {
|
|
168
|
-
this.headers = value;
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
this.relaxedBody.on('hash', value => {
|
|
172
|
-
this.bodyHash = value;
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
this.relaxedBody.on('readable', () => {
|
|
176
|
-
let chunk;
|
|
177
|
-
if (this.cache) {
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
while ((chunk = this.relaxedBody.read()) !== null) {
|
|
181
|
-
this.chunks.push(chunk);
|
|
182
|
-
this.chunklen += chunk.length;
|
|
183
|
-
if (this.chunklen >= this.cacheTreshold && this.cachePath) {
|
|
184
|
-
return this.createWriteCache();
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
this.relaxedBody.on('end', () => {
|
|
190
|
-
if (this.cache) {
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
this.sendSignedOutput();
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
this.parser.pipe(this.relaxedBody);
|
|
197
|
-
setImmediate(() => this.input.pipe(this.parser));
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
class DKIM {
|
|
202
|
-
constructor(options) {
|
|
203
|
-
this.options = options || {};
|
|
204
|
-
this.keys = [].concat(
|
|
205
|
-
this.options.keys || {
|
|
206
|
-
domainName: options.domainName,
|
|
207
|
-
keySelector: options.keySelector,
|
|
208
|
-
privateKey: options.privateKey
|
|
209
|
-
}
|
|
210
|
-
);
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
sign(input, extraOptions) {
|
|
214
|
-
let output = new PassThrough();
|
|
215
|
-
let inputStream = input;
|
|
216
|
-
let writeValue = false;
|
|
217
|
-
|
|
218
|
-
if (Buffer.isBuffer(input)) {
|
|
219
|
-
writeValue = input;
|
|
220
|
-
inputStream = new PassThrough();
|
|
221
|
-
} else if (typeof input === 'string') {
|
|
222
|
-
writeValue = Buffer.from(input);
|
|
223
|
-
inputStream = new PassThrough();
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
let options = this.options;
|
|
227
|
-
if (extraOptions && Object.keys(extraOptions).length) {
|
|
228
|
-
options = {};
|
|
229
|
-
Object.keys(this.options || {}).forEach(key => {
|
|
230
|
-
options[key] = this.options[key];
|
|
231
|
-
});
|
|
232
|
-
Object.keys(extraOptions || {}).forEach(key => {
|
|
233
|
-
if (!(key in options)) {
|
|
234
|
-
options[key] = extraOptions[key];
|
|
235
|
-
}
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
let signer = new DKIMSigner(options, this.keys, inputStream, output);
|
|
240
|
-
setImmediate(() => {
|
|
241
|
-
signer.signStream();
|
|
242
|
-
if (writeValue) {
|
|
243
|
-
setImmediate(() => {
|
|
244
|
-
inputStream.end(writeValue);
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
return output;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
module.exports = DKIM;
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const Transform = require('stream').Transform;
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* MessageParser instance is a transform stream that separates message headers
|
|
7
|
-
* from the rest of the body. Headers are emitted with the 'headers' event. Message
|
|
8
|
-
* body is passed on as the resulting stream.
|
|
9
|
-
*/
|
|
10
|
-
class MessageParser extends Transform {
|
|
11
|
-
constructor(options) {
|
|
12
|
-
super(options);
|
|
13
|
-
this.lastBytes = Buffer.alloc(4);
|
|
14
|
-
this.headersParsed = false;
|
|
15
|
-
this.headerBytes = 0;
|
|
16
|
-
this.headerChunks = [];
|
|
17
|
-
this.rawHeaders = false;
|
|
18
|
-
this.bodySize = 0;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Keeps count of the last 4 bytes in order to detect line breaks on chunk boundaries
|
|
23
|
-
*
|
|
24
|
-
* @param {Buffer} data Next data chunk from the stream
|
|
25
|
-
*/
|
|
26
|
-
updateLastBytes(data) {
|
|
27
|
-
let lblen = this.lastBytes.length;
|
|
28
|
-
let nblen = Math.min(data.length, lblen);
|
|
29
|
-
|
|
30
|
-
// shift existing bytes
|
|
31
|
-
for (let i = 0, len = lblen - nblen; i < len; i++) {
|
|
32
|
-
this.lastBytes[i] = this.lastBytes[i + nblen];
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// add new bytes
|
|
36
|
-
for (let i = 1; i <= nblen; i++) {
|
|
37
|
-
this.lastBytes[lblen - i] = data[data.length - i];
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Finds and removes message headers from the remaining body. We want to keep
|
|
43
|
-
* headers separated until final delivery to be able to modify these
|
|
44
|
-
*
|
|
45
|
-
* @param {Buffer} data Next chunk of data
|
|
46
|
-
* @return {Boolean} Returns true if headers are already found or false otherwise
|
|
47
|
-
*/
|
|
48
|
-
checkHeaders(data) {
|
|
49
|
-
if (this.headersParsed) {
|
|
50
|
-
return true;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
let lblen = this.lastBytes.length;
|
|
54
|
-
let headerPos = 0;
|
|
55
|
-
this.curLinePos = 0;
|
|
56
|
-
for (let i = 0, len = this.lastBytes.length + data.length; i < len; i++) {
|
|
57
|
-
let chr;
|
|
58
|
-
if (i < lblen) {
|
|
59
|
-
chr = this.lastBytes[i];
|
|
60
|
-
} else {
|
|
61
|
-
chr = data[i - lblen];
|
|
62
|
-
}
|
|
63
|
-
if (chr === 0x0a && i) {
|
|
64
|
-
let pr1 = i - 1 < lblen ? this.lastBytes[i - 1] : data[i - 1 - lblen];
|
|
65
|
-
let pr2 = i > 1 ? (i - 2 < lblen ? this.lastBytes[i - 2] : data[i - 2 - lblen]) : false;
|
|
66
|
-
if (pr1 === 0x0a) {
|
|
67
|
-
this.headersParsed = true;
|
|
68
|
-
headerPos = i - lblen + 1;
|
|
69
|
-
this.headerBytes += headerPos;
|
|
70
|
-
break;
|
|
71
|
-
} else if (pr1 === 0x0d && pr2 === 0x0a) {
|
|
72
|
-
this.headersParsed = true;
|
|
73
|
-
headerPos = i - lblen + 1;
|
|
74
|
-
this.headerBytes += headerPos;
|
|
75
|
-
break;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
if (this.headersParsed) {
|
|
81
|
-
this.headerChunks.push(data.slice(0, headerPos));
|
|
82
|
-
this.rawHeaders = Buffer.concat(this.headerChunks, this.headerBytes);
|
|
83
|
-
this.headerChunks = null;
|
|
84
|
-
this.emit('headers', this.parseHeaders());
|
|
85
|
-
if (data.length - 1 > headerPos) {
|
|
86
|
-
let chunk = data.slice(headerPos);
|
|
87
|
-
this.bodySize += chunk.length;
|
|
88
|
-
// this would be the first chunk of data sent downstream
|
|
89
|
-
setImmediate(() => this.push(chunk));
|
|
90
|
-
}
|
|
91
|
-
return false;
|
|
92
|
-
} else {
|
|
93
|
-
this.headerBytes += data.length;
|
|
94
|
-
this.headerChunks.push(data);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// store last 4 bytes to catch header break
|
|
98
|
-
this.updateLastBytes(data);
|
|
99
|
-
|
|
100
|
-
return false;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
_transform(chunk, encoding, callback) {
|
|
104
|
-
if (!chunk || !chunk.length) {
|
|
105
|
-
return callback();
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (typeof chunk === 'string') {
|
|
109
|
-
chunk = Buffer.from(chunk, encoding);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
let headersFound;
|
|
113
|
-
|
|
114
|
-
try {
|
|
115
|
-
headersFound = this.checkHeaders(chunk);
|
|
116
|
-
} catch (E) {
|
|
117
|
-
return callback(E);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
if (headersFound) {
|
|
121
|
-
this.bodySize += chunk.length;
|
|
122
|
-
this.push(chunk);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
setImmediate(callback);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
_flush(callback) {
|
|
129
|
-
if (this.headerChunks) {
|
|
130
|
-
let chunk = Buffer.concat(this.headerChunks, this.headerBytes);
|
|
131
|
-
this.bodySize += chunk.length;
|
|
132
|
-
this.push(chunk);
|
|
133
|
-
this.headerChunks = null;
|
|
134
|
-
}
|
|
135
|
-
callback();
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
parseHeaders() {
|
|
139
|
-
let lines = (this.rawHeaders || '').toString().split(/\r?\n/);
|
|
140
|
-
for (let i = lines.length - 1; i > 0; i--) {
|
|
141
|
-
if (/^\s/.test(lines[i])) {
|
|
142
|
-
lines[i - 1] += '\n' + lines[i];
|
|
143
|
-
lines.splice(i, 1);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
return lines
|
|
147
|
-
.filter(line => line.trim())
|
|
148
|
-
.map(line => ({
|
|
149
|
-
key: line.substr(0, line.indexOf(':')).trim().toLowerCase(),
|
|
150
|
-
line
|
|
151
|
-
}));
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
module.exports = MessageParser;
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// streams through a message body and calculates relaxed body hash
|
|
4
|
-
|
|
5
|
-
const Transform = require('stream').Transform;
|
|
6
|
-
const crypto = require('crypto');
|
|
7
|
-
|
|
8
|
-
class RelaxedBody extends Transform {
|
|
9
|
-
constructor(options) {
|
|
10
|
-
super();
|
|
11
|
-
options = options || {};
|
|
12
|
-
this.chunkBuffer = [];
|
|
13
|
-
this.chunkBufferLen = 0;
|
|
14
|
-
this.bodyHash = crypto.createHash(options.hashAlgo || 'sha1');
|
|
15
|
-
this.remainder = '';
|
|
16
|
-
this.byteLength = 0;
|
|
17
|
-
|
|
18
|
-
this.debug = options.debug;
|
|
19
|
-
this._debugBody = options.debug ? [] : false;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
updateHash(chunk) {
|
|
23
|
-
let bodyStr;
|
|
24
|
-
|
|
25
|
-
// find next remainder
|
|
26
|
-
let nextRemainder = '';
|
|
27
|
-
|
|
28
|
-
// This crux finds and removes the spaces from the last line and the newline characters after the last non-empty line
|
|
29
|
-
// If we get another chunk that does not match this description then we can restore the previously processed data
|
|
30
|
-
let state = 'file';
|
|
31
|
-
for (let i = chunk.length - 1; i >= 0; i--) {
|
|
32
|
-
let c = chunk[i];
|
|
33
|
-
|
|
34
|
-
if (state === 'file' && (c === 0x0a || c === 0x0d)) {
|
|
35
|
-
// do nothing, found \n or \r at the end of chunk, stil end of file
|
|
36
|
-
} else if (state === 'file' && (c === 0x09 || c === 0x20)) {
|
|
37
|
-
// switch to line ending mode, this is the last non-empty line
|
|
38
|
-
state = 'line';
|
|
39
|
-
} else if (state === 'line' && (c === 0x09 || c === 0x20)) {
|
|
40
|
-
// do nothing, found ' ' or \t at the end of line, keep processing the last non-empty line
|
|
41
|
-
} else if (state === 'file' || state === 'line') {
|
|
42
|
-
// non line/file ending character found, switch to body mode
|
|
43
|
-
state = 'body';
|
|
44
|
-
if (i === chunk.length - 1) {
|
|
45
|
-
// final char is not part of line end or file end, so do nothing
|
|
46
|
-
break;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
if (i === 0) {
|
|
51
|
-
// reached to the beginning of the chunk, check if it is still about the ending
|
|
52
|
-
// and if the remainder also matches
|
|
53
|
-
if (
|
|
54
|
-
(state === 'file' && (!this.remainder || /[\r\n]$/.test(this.remainder))) ||
|
|
55
|
-
(state === 'line' && (!this.remainder || /[ \t]$/.test(this.remainder)))
|
|
56
|
-
) {
|
|
57
|
-
// keep everything
|
|
58
|
-
this.remainder += chunk.toString('binary');
|
|
59
|
-
return;
|
|
60
|
-
} else if (state === 'line' || state === 'file') {
|
|
61
|
-
// process existing remainder as normal line but store the current chunk
|
|
62
|
-
nextRemainder = chunk.toString('binary');
|
|
63
|
-
chunk = false;
|
|
64
|
-
break;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (state !== 'body') {
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// reached first non ending byte
|
|
73
|
-
nextRemainder = chunk.slice(i + 1).toString('binary');
|
|
74
|
-
chunk = chunk.slice(0, i + 1);
|
|
75
|
-
break;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
let needsFixing = !!this.remainder;
|
|
79
|
-
if (chunk && !needsFixing) {
|
|
80
|
-
// check if we even need to change anything
|
|
81
|
-
for (let i = 0, len = chunk.length; i < len; i++) {
|
|
82
|
-
if (i && chunk[i] === 0x0a && chunk[i - 1] !== 0x0d) {
|
|
83
|
-
// missing \r before \n
|
|
84
|
-
needsFixing = true;
|
|
85
|
-
break;
|
|
86
|
-
} else if (i && chunk[i] === 0x0d && chunk[i - 1] === 0x20) {
|
|
87
|
-
// trailing WSP found
|
|
88
|
-
needsFixing = true;
|
|
89
|
-
break;
|
|
90
|
-
} else if (i && chunk[i] === 0x20 && chunk[i - 1] === 0x20) {
|
|
91
|
-
// multiple spaces found, needs to be replaced with just one
|
|
92
|
-
needsFixing = true;
|
|
93
|
-
break;
|
|
94
|
-
} else if (chunk[i] === 0x09) {
|
|
95
|
-
// TAB found, needs to be replaced with a space
|
|
96
|
-
needsFixing = true;
|
|
97
|
-
break;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
if (needsFixing) {
|
|
103
|
-
bodyStr = this.remainder + (chunk ? chunk.toString('binary') : '');
|
|
104
|
-
this.remainder = nextRemainder;
|
|
105
|
-
bodyStr = bodyStr
|
|
106
|
-
.replace(/\r?\n/g, '\n') // use js line endings
|
|
107
|
-
.replace(/[ \t]*$/gm, '') // remove line endings, rtrim
|
|
108
|
-
.replace(/[ \t]+/gm, ' ') // single spaces
|
|
109
|
-
.replace(/\n/g, '\r\n'); // restore rfc822 line endings
|
|
110
|
-
chunk = Buffer.from(bodyStr, 'binary');
|
|
111
|
-
} else if (nextRemainder) {
|
|
112
|
-
this.remainder = nextRemainder;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
if (this.debug) {
|
|
116
|
-
this._debugBody.push(chunk);
|
|
117
|
-
}
|
|
118
|
-
this.bodyHash.update(chunk);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
_transform(chunk, encoding, callback) {
|
|
122
|
-
if (!chunk || !chunk.length) {
|
|
123
|
-
return callback();
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
if (typeof chunk === 'string') {
|
|
127
|
-
chunk = Buffer.from(chunk, encoding);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
this.updateHash(chunk);
|
|
131
|
-
|
|
132
|
-
this.byteLength += chunk.length;
|
|
133
|
-
this.push(chunk);
|
|
134
|
-
callback();
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
_flush(callback) {
|
|
138
|
-
// generate final hash and emit it
|
|
139
|
-
if (/[\r\n]$/.test(this.remainder) && this.byteLength > 2) {
|
|
140
|
-
// add terminating line end
|
|
141
|
-
this.bodyHash.update(Buffer.from('\r\n'));
|
|
142
|
-
}
|
|
143
|
-
if (!this.byteLength) {
|
|
144
|
-
// emit empty line buffer to keep the stream flowing
|
|
145
|
-
this.push(Buffer.from('\r\n'));
|
|
146
|
-
// this.bodyHash.update(Buffer.from('\r\n'));
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
this.emit('hash', this.bodyHash.digest('base64'), this.debug ? Buffer.concat(this._debugBody) : false);
|
|
150
|
-
callback();
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
module.exports = RelaxedBody;
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const punycode = require('../punycode');
|
|
4
|
-
const mimeFuncs = require('../mime-funcs');
|
|
5
|
-
const crypto = require('crypto');
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Returns DKIM signature header line
|
|
9
|
-
*
|
|
10
|
-
* @param {Object} headers Parsed headers object from MessageParser
|
|
11
|
-
* @param {String} bodyHash Base64 encoded hash of the message
|
|
12
|
-
* @param {Object} options DKIM options
|
|
13
|
-
* @param {String} options.domainName Domain name to be signed for
|
|
14
|
-
* @param {String} options.keySelector DKIM key selector to use
|
|
15
|
-
* @param {String} options.privateKey DKIM private key to use
|
|
16
|
-
* @return {String} Complete header line
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
module.exports = (headers, hashAlgo, bodyHash, options) => {
|
|
20
|
-
options = options || {};
|
|
21
|
-
|
|
22
|
-
// all listed fields from RFC4871 #5.5
|
|
23
|
-
let defaultFieldNames =
|
|
24
|
-
'From:Sender:Reply-To:Subject:Date:Message-ID:To:' +
|
|
25
|
-
'Cc:MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID:' +
|
|
26
|
-
'Content-Description:Resent-Date:Resent-From:Resent-Sender:' +
|
|
27
|
-
'Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:' +
|
|
28
|
-
'List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post:' +
|
|
29
|
-
'List-Owner:List-Archive';
|
|
30
|
-
|
|
31
|
-
let fieldNames = options.headerFieldNames || defaultFieldNames;
|
|
32
|
-
|
|
33
|
-
let canonicalizedHeaderData = relaxedHeaders(headers, fieldNames, options.skipFields);
|
|
34
|
-
let dkimHeader = generateDKIMHeader(options.domainName, options.keySelector, canonicalizedHeaderData.fieldNames, hashAlgo, bodyHash);
|
|
35
|
-
|
|
36
|
-
let signer, signature;
|
|
37
|
-
|
|
38
|
-
canonicalizedHeaderData.headers += 'dkim-signature:' + relaxedHeaderLine(dkimHeader);
|
|
39
|
-
|
|
40
|
-
signer = crypto.createSign(('rsa-' + hashAlgo).toUpperCase());
|
|
41
|
-
signer.update(canonicalizedHeaderData.headers);
|
|
42
|
-
try {
|
|
43
|
-
signature = signer.sign(options.privateKey, 'base64');
|
|
44
|
-
} catch (_E) {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return dkimHeader + signature.replace(/(^.{73}|.{75}(?!\r?\n|\r))/g, '$&\r\n ').trim();
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
module.exports.relaxedHeaders = relaxedHeaders;
|
|
52
|
-
|
|
53
|
-
function generateDKIMHeader(domainName, keySelector, fieldNames, hashAlgo, bodyHash) {
|
|
54
|
-
let dkim = [
|
|
55
|
-
'v=1',
|
|
56
|
-
'a=rsa-' + hashAlgo,
|
|
57
|
-
'c=relaxed/relaxed',
|
|
58
|
-
'd=' + punycode.toASCII(domainName),
|
|
59
|
-
'q=dns/txt',
|
|
60
|
-
's=' + keySelector,
|
|
61
|
-
'bh=' + bodyHash,
|
|
62
|
-
'h=' + fieldNames
|
|
63
|
-
].join('; ');
|
|
64
|
-
|
|
65
|
-
return mimeFuncs.foldLines('DKIM-Signature: ' + dkim, 76) + ';\r\n b=';
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function relaxedHeaders(headers, fieldNames, skipFields) {
|
|
69
|
-
let includedFields = new Set();
|
|
70
|
-
let skip = new Set();
|
|
71
|
-
let headerFields = new Map();
|
|
72
|
-
|
|
73
|
-
(skipFields || '')
|
|
74
|
-
.toLowerCase()
|
|
75
|
-
.split(':')
|
|
76
|
-
.forEach(field => {
|
|
77
|
-
skip.add(field.trim());
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
(fieldNames || '')
|
|
81
|
-
.toLowerCase()
|
|
82
|
-
.split(':')
|
|
83
|
-
.filter(field => !skip.has(field.trim()))
|
|
84
|
-
.forEach(field => {
|
|
85
|
-
includedFields.add(field.trim());
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
for (let i = headers.length - 1; i >= 0; i--) {
|
|
89
|
-
let line = headers[i];
|
|
90
|
-
// only include the first value from bottom to top
|
|
91
|
-
if (includedFields.has(line.key) && !headerFields.has(line.key)) {
|
|
92
|
-
headerFields.set(line.key, relaxedHeaderLine(line.line));
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
let headersList = [];
|
|
97
|
-
let fields = [];
|
|
98
|
-
includedFields.forEach(field => {
|
|
99
|
-
if (headerFields.has(field)) {
|
|
100
|
-
fields.push(field);
|
|
101
|
-
headersList.push(field + ':' + headerFields.get(field));
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
return {
|
|
106
|
-
headers: headersList.join('\r\n') + '\r\n',
|
|
107
|
-
fieldNames: fields.join(':')
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function relaxedHeaderLine(line) {
|
|
112
|
-
return line
|
|
113
|
-
.substr(line.indexOf(':') + 1)
|
|
114
|
-
.replace(/\r?\n/g, '')
|
|
115
|
-
.replace(/\s+/g, ' ')
|
|
116
|
-
.trim();
|
|
117
|
-
}
|