mailauth 4.6.7 → 4.6.9

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/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## [4.6.9](https://github.com/postalsys/mailauth/compare/v4.6.8...v4.6.9) (2024-08-22)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **deps:** Removed uuid dependency in favor of crypto.randomUUID() ([0b5d8f5](https://github.com/postalsys/mailauth/commit/0b5d8f5328d0b82f75daea7fdbd74e1e76e8b642))
9
+ * **dkim-relaxed:** Faster DKIM hash calculation for relaxed body if the body contains extremely long lines ([fd8c89e](https://github.com/postalsys/mailauth/commit/fd8c89edd87a114464f99ebf79a1e903a8287876))
10
+
11
+ ## [4.6.8](https://github.com/postalsys/mailauth/compare/v4.6.7...v4.6.8) (2024-06-04)
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ * **dmarc-alignment:** Fixed tldts usage to allow private domains ([cc7dfa8](https://github.com/postalsys/mailauth/commit/cc7dfa8d820c1a4112602340192010354d51cd52))
17
+
3
18
  ## [4.6.7](https://github.com/postalsys/mailauth/compare/v4.6.6...v4.6.7) (2024-05-30)
4
19
 
5
20
 
@@ -122,24 +122,36 @@ class RelaxedHash {
122
122
  this._updateBodyHash(chunk);
123
123
  }
124
124
 
125
+ /**
126
+ * Performs the following modifications for a single line:
127
+ * - Replace all <LF> chars with <CR><LF>
128
+ * - Replace all spaces and tabs with a single space.
129
+ * - Remove trailing whitespace
130
+ * @param {Buffer} line
131
+ * @returns {Buffer} fixed line
132
+ */
125
133
  fixLineBuffer(line) {
126
- let resultLine = [];
134
+ // Allocate maximum expected buffer length
135
+ // If the line is only filled with <LF> bytes then we need 2 times the size of the line
136
+ let lineBuf = Buffer.alloc(line.length * 2);
137
+ // Start processing the line from the end to beginning
138
+ let writePos = lineBuf.length - 1;
127
139
 
128
140
  let nonWspFound = false;
129
141
  let prevWsp = false;
130
142
 
131
143
  for (let i = line.length - 1; i >= 0; i--) {
132
144
  if (line[i] === CHAR_LF) {
133
- resultLine.unshift(line[i]);
145
+ lineBuf[writePos--] = line[i];
134
146
  if (i === 0 || line[i - 1] !== CHAR_CR) {
135
147
  // add missing carriage return
136
- resultLine.unshift(CHAR_CR);
148
+ lineBuf[writePos--] = CHAR_CR;
137
149
  }
138
150
  continue;
139
151
  }
140
152
 
141
153
  if (line[i] === CHAR_CR) {
142
- resultLine.unshift(line[i]);
154
+ lineBuf[writePos--] = line[i];
143
155
  continue;
144
156
  }
145
157
 
@@ -151,19 +163,19 @@ class RelaxedHash {
151
163
  }
152
164
 
153
165
  if (prevWsp) {
154
- resultLine.unshift(CHAR_SPACE);
166
+ lineBuf[writePos--] = CHAR_SPACE;
155
167
  prevWsp = false;
156
168
  }
157
169
 
158
170
  nonWspFound = true;
159
- resultLine.unshift(line[i]);
171
+ lineBuf[writePos--] = line[i];
160
172
  }
161
173
 
162
174
  if (prevWsp && nonWspFound) {
163
- resultLine.unshift(CHAR_SPACE);
175
+ lineBuf[writePos--] = CHAR_SPACE;
164
176
  }
165
177
 
166
- return Buffer.from(resultLine);
178
+ return lineBuf.subarray(writePos + 1);
167
179
  }
168
180
 
169
181
  update(chunk, final) {
@@ -8,7 +8,6 @@ const { generateCanonicalizedHeader } = require('./header');
8
8
  const { getARChain } = require('../arc');
9
9
  const addressparser = require('nodemailer/lib/addressparser');
10
10
  const crypto = require('node:crypto');
11
- const { v4: uuidv4 } = require('uuid');
12
11
  const libmime = require('libmime');
13
12
 
14
13
  class DkimVerifier extends MessageParser {
@@ -333,7 +332,7 @@ class DkimVerifier extends MessageParser {
333
332
  let result = {
334
333
  id: signatureHeader.parsed?.b?.value
335
334
  ? crypto.createHash('sha256').update(Buffer.from(signatureHeader.parsed?.b?.value, 'base64')).digest('hex')
336
- : uuidv4(),
335
+ : crypto.randomUUID(),
337
336
  signingDomain: signatureHeader.signingDomain,
338
337
  selector: signatureHeader.selector,
339
338
  signature: signatureHeader.parsed?.b?.value,
@@ -1,7 +1,8 @@
1
1
  'use strict';
2
2
 
3
- const tldts = require('tldts');
4
3
  const dns = require('node:dns').promises;
4
+ const tldts = require('tldts');
5
+ const { TLDTS_OPTS } = require('../tools');
5
6
 
6
7
  const resolveTxt = async (domain, resolver) => {
7
8
  try {
@@ -33,7 +34,7 @@ const getDmarcRecord = async (domain, resolver) => {
33
34
  let isOrgRecord = false;
34
35
 
35
36
  if (!txt) {
36
- let orgDomain = tldts.getDomain(domain);
37
+ let orgDomain = tldts.getDomain(domain, TLDTS_OPTS);
37
38
  if (orgDomain !== domain) {
38
39
  // try org domain as well
39
40
  txt = await resolveTxt(orgDomain, resolver);
@@ -3,7 +3,7 @@
3
3
  const dns = require('node:dns').promises;
4
4
  const punycode = require('punycode.js');
5
5
  const tldts = require('tldts');
6
- const { formatAuthHeaderRow, getAlignment } = require('../tools');
6
+ const { formatAuthHeaderRow, getAlignment, TLDTS_OPTS } = require('../tools');
7
7
  const getDmarcRecord = require('./get-dmarc-record');
8
8
 
9
9
  const verifyDmarc = async opts => {
@@ -41,7 +41,7 @@ const verifyDmarc = async opts => {
41
41
  return response;
42
42
  };
43
43
 
44
- let orgDomain = tldts.getDomain(domain);
44
+ let orgDomain = tldts.getDomain(domain, TLDTS_OPTS);
45
45
 
46
46
  let status = {
47
47
  result: 'neutral',
package/lib/tools.js CHANGED
@@ -29,6 +29,11 @@ const keyOrderingDKIM = ['v', 'a', 'c', 'd', 'h', 'i', 'l', 'q', 's', 't', 'x',
29
29
  const keyOrderingARC = ['i', 'a', 'c', 'd', 'h', 'l', 'q', 's', 't', 'x', 'z', 'bh', 'b'];
30
30
  const keyOrderingAS = ['i', 'a', 't', 'cv', 'd', 's', 'b'];
31
31
 
32
+ const TLDTS_OPTS = {
33
+ allowIcannDomains: true,
34
+ allowPrivateDomains: true
35
+ };
36
+
32
37
  const writeToStream = async (stream, input, chunkSize) => {
33
38
  chunkSize = chunkSize || 64 * 1024;
34
39
 
@@ -483,7 +488,7 @@ const getAlignment = (fromDomain, domainList, strict) => {
483
488
  if (strict) {
484
489
  fromDomain = formatDomain(fromDomain);
485
490
  for (let entry of domainList) {
486
- let domain = formatDomain(tldts.getDomain(entry.domain) || entry.domain);
491
+ let domain = formatDomain(tldts.getDomain(entry.domain, TLDTS_OPTS) || entry.domain);
487
492
  if (formatDomain(domain) === fromDomain) {
488
493
  return entry;
489
494
  }
@@ -491,9 +496,9 @@ const getAlignment = (fromDomain, domainList, strict) => {
491
496
  }
492
497
 
493
498
  // match org domains
494
- fromDomain = formatDomain(tldts.getDomain(fromDomain) || fromDomain);
499
+ fromDomain = formatDomain(tldts.getDomain(fromDomain, TLDTS_OPTS) || fromDomain);
495
500
  for (let entry of domainList) {
496
- let domain = formatDomain(tldts.getDomain(entry.domain) || entry.domain);
501
+ let domain = formatDomain(tldts.getDomain(entry.domain, TLDTS_OPTS) || entry.domain);
497
502
  if (domain === fromDomain) {
498
503
  return entry;
499
504
  }
@@ -591,5 +596,7 @@ module.exports = {
591
596
 
592
597
  getPtrHostname,
593
598
 
594
- getCurTime
599
+ getCurTime,
600
+
601
+ TLDTS_OPTS
595
602
  };
package/man/mailauth.1 CHANGED
@@ -1,4 +1,4 @@
1
- .TH "MAILAUTH" "1" "May 2024" "v4.6.7" "Mailauth Help"
1
+ .TH "MAILAUTH" "1" "August 2024" "v4.6.9" "Mailauth Help"
2
2
  .SH "NAME"
3
3
  \fBmailauth\fR
4
4
  .QP
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mailauth",
3
- "version": "4.6.7",
3
+ "version": "4.6.9",
4
4
  "description": "Email authentication library for Node.js",
5
5
  "main": "lib/mailauth.js",
6
6
  "scripts": {
@@ -41,20 +41,19 @@
41
41
  "license-report": "6.5.0",
42
42
  "marked": "0.7.0",
43
43
  "marked-man": "0.7.0",
44
- "mbox-reader": "1.1.5",
45
- "mocha": "10.4.0"
44
+ "mbox-reader": "1.2.0",
45
+ "mocha": "10.7.3"
46
46
  },
47
47
  "dependencies": {
48
48
  "@postalsys/vmc": "1.0.8",
49
- "fast-xml-parser": "4.4.0",
49
+ "fast-xml-parser": "4.4.1",
50
50
  "ipaddr.js": "2.2.0",
51
- "joi": "17.13.1",
51
+ "joi": "17.13.3",
52
52
  "libmime": "5.3.5",
53
- "nodemailer": "6.9.13",
53
+ "nodemailer": "6.9.14",
54
54
  "punycode.js": "2.3.1",
55
- "tldts": "6.1.23",
55
+ "tldts": "6.1.40",
56
56
  "undici": "5.28.4",
57
- "uuid": "9.0.1",
58
57
  "yargs": "17.7.2"
59
58
  },
60
59
  "engines": {