@mavogel/awscdk-rootmail 0.1.20 → 0.1.21

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 (35) hide show
  1. package/.jsii +8 -8
  2. package/lib/rootmail.js +1 -1
  3. package/lib/ses-receive.js +1 -1
  4. package/node_modules/@aws-sdk/client-cloudwatch-logs/dist-cjs/index.js +1 -1
  5. package/node_modules/@aws-sdk/client-cloudwatch-logs/package.json +1 -1
  6. package/node_modules/@aws-sdk/client-route-53/dist-cjs/index.js +1 -1
  7. package/node_modules/@aws-sdk/client-route-53/package.json +1 -1
  8. package/node_modules/@aws-sdk/client-s3/dist-cjs/index.js +1 -1
  9. package/node_modules/@aws-sdk/client-s3/package.json +2 -2
  10. package/node_modules/@aws-sdk/client-ses/dist-cjs/index.js +1 -1
  11. package/node_modules/@aws-sdk/client-ses/package.json +1 -1
  12. package/node_modules/@aws-sdk/client-ssm/dist-cjs/index.js +1 -1
  13. package/node_modules/@aws-sdk/client-ssm/package.json +1 -1
  14. package/node_modules/@zone-eu/mailsplit/package.json +4 -4
  15. package/node_modules/libbase64/.github/VULNERABILITY_REPORT.yml +75 -0
  16. package/node_modules/libbase64/CHANGELOG.md +7 -0
  17. package/node_modules/libbase64/SECURITY.md +147 -0
  18. package/node_modules/libbase64/lib/libbase64.js +19 -7
  19. package/node_modules/libbase64/package.json +1 -1
  20. package/node_modules/libmime/CHANGELOG.md +7 -0
  21. package/node_modules/libmime/package.json +2 -2
  22. package/node_modules/mailparser/.release-please-manifest.json +1 -1
  23. package/node_modules/mailparser/CHANGELOG.md +7 -0
  24. package/node_modules/mailparser/SECURITY.md +120 -44
  25. package/node_modules/mailparser/package.json +5 -5
  26. package/node_modules/nodemailer/CHANGELOG.md +7 -0
  27. package/node_modules/nodemailer/SECURITY.md +105 -29
  28. package/node_modules/nodemailer/dist/cjs/fetch/index.js +16 -10
  29. package/node_modules/nodemailer/dist/cjs/package-info.d.ts +1 -1
  30. package/node_modules/nodemailer/dist/cjs/package-info.js +1 -1
  31. package/node_modules/nodemailer/dist/esm/fetch/index.js +16 -10
  32. package/node_modules/nodemailer/dist/esm/package-info.d.ts +1 -1
  33. package/node_modules/nodemailer/dist/esm/package-info.js +1 -1
  34. package/node_modules/nodemailer/package.json +6 -6
  35. package/package.json +7 -7
package/.jsii CHANGED
@@ -8,13 +8,13 @@
8
8
  ]
9
9
  },
10
10
  "bundled": {
11
- "@aws-sdk/client-cloudwatch-logs": "^3.1151.0",
12
- "@aws-sdk/client-route-53": "^3.1151.0",
13
- "@aws-sdk/client-s3": "^3.1151.0",
14
- "@aws-sdk/client-ses": "^3.1151.0",
15
- "@aws-sdk/client-ssm": "^3.1151.0",
11
+ "@aws-sdk/client-cloudwatch-logs": "^3.1152.0",
12
+ "@aws-sdk/client-route-53": "^3.1152.0",
13
+ "@aws-sdk/client-s3": "^3.1152.0",
14
+ "@aws-sdk/client-ses": "^3.1152.0",
15
+ "@aws-sdk/client-ssm": "^3.1152.0",
16
16
  "cdk-nag": "^3.0.1",
17
- "mailparser": "^3.9.38",
17
+ "mailparser": "^3.9.39",
18
18
  "uuid": "^14.0.3"
19
19
  },
20
20
  "dependencies": {
@@ -9620,6 +9620,6 @@
9620
9620
  "symbolId": "src/ses-receive:SESReceiveProps"
9621
9621
  }
9622
9622
  },
9623
- "version": "0.1.20",
9624
- "fingerprint": "SXVPnty43T2jFSDUY4TbDYNrxUTXzDBEf+im0KvlE3Q="
9623
+ "version": "0.1.21",
9624
+ "fingerprint": "B8+T8BHS/1ZL9hQ+6HZrufVgi5O/f3zYXERuO93gpcs="
9625
9625
  }
package/lib/rootmail.js CHANGED
@@ -11,7 +11,7 @@ const ses_receive_1 = require("./ses-receive");
11
11
  * Rootmail construct
12
12
  */
13
13
  class Rootmail extends constructs_1.Construct {
14
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@mavogel/awscdk-rootmail.Rootmail", version: "0.1.20" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@mavogel/awscdk-rootmail.Rootmail", version: "0.1.21" };
15
15
  /**
16
16
  * The name parameter in SSM to store the domain name server.
17
17
  */
@@ -11,7 +11,7 @@ const ses_receipt_ruleset_activation_1 = require("./ses-receipt-ruleset-activati
11
11
  * SES Receive construct
12
12
  */
13
13
  class SESReceive extends constructs_1.Construct {
14
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@mavogel/awscdk-rootmail.SESReceive", version: "0.1.20" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@mavogel/awscdk-rootmail.SESReceive", version: "0.1.21" };
15
15
  constructor(scope, id, props) {
16
16
  super(scope, id);
17
17
  const filteredEmailSubjects = props.filteredEmailSubjects || [];
@@ -70,7 +70,7 @@ const commonParams = {
70
70
  UseDualStack: { type: "builtInParams", name: "useDualstackEndpoint" },
71
71
  };
72
72
 
73
- var version = "3.1150.0";
73
+ var version = "3.1151.0";
74
74
  var packageInfo = {
75
75
  version: version};
76
76
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws-sdk/client-cloudwatch-logs",
3
- "version": "3.1151.0",
3
+ "version": "3.1152.0",
4
4
  "description": "AWS SDK for JavaScript Cloudwatch Logs Client for Node.js, Browser and React Native",
5
5
  "homepage": "https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-cloudwatch-logs",
6
6
  "license": "Apache-2.0",
@@ -70,7 +70,7 @@ const commonParams = {
70
70
  UseDualStack: { type: "builtInParams", name: "useDualstackEndpoint" },
71
71
  };
72
72
 
73
- var version = "3.1150.0";
73
+ var version = "3.1151.0";
74
74
  var packageInfo = {
75
75
  version: version};
76
76
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws-sdk/client-route-53",
3
- "version": "3.1151.0",
3
+ "version": "3.1152.0",
4
4
  "description": "AWS SDK for JavaScript Route 53 Client for Node.js, Browser and React Native",
5
5
  "homepage": "https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-route-53",
6
6
  "license": "Apache-2.0",
@@ -4779,7 +4779,7 @@ var WriteGetObjectResponse$ = [9, n0, _WGOR,
4779
4779
  class CreateSessionCommand extends command(_ep4, _mw0, "CreateSession", CreateSession$) {
4780
4780
  }
4781
4781
 
4782
- var version = "3.1150.0";
4782
+ var version = "3.1151.0";
4783
4783
  var packageInfo = {
4784
4784
  version: version};
4785
4785
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws-sdk/client-s3",
3
- "version": "3.1151.0",
3
+ "version": "3.1152.0",
4
4
  "description": "AWS SDK for JavaScript S3 Client for Node.js, Browser and React Native",
5
5
  "homepage": "https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-s3",
6
6
  "license": "Apache-2.0",
@@ -67,7 +67,7 @@
67
67
  "tslib": "^2.6.2"
68
68
  },
69
69
  "devDependencies": {
70
- "@aws-sdk/signature-v4-crt": "3.1151.0",
70
+ "@aws-sdk/signature-v4-crt": "3.1152.0",
71
71
  "@smithy/snapshot-testing": "^2.3.2",
72
72
  "@tsconfig/node20": "20.1.8",
73
73
  "@types/node": "^20.14.8",
@@ -69,7 +69,7 @@ const commonParams = {
69
69
  UseDualStack: { type: "builtInParams", name: "useDualstackEndpoint" },
70
70
  };
71
71
 
72
- var version = "3.1150.0";
72
+ var version = "3.1151.0";
73
73
  var packageInfo = {
74
74
  version: version};
75
75
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws-sdk/client-ses",
3
- "version": "3.1151.0",
3
+ "version": "3.1152.0",
4
4
  "description": "AWS SDK for JavaScript Ses Client for Node.js, Browser and React Native",
5
5
  "homepage": "https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-ses",
6
6
  "license": "Apache-2.0",
@@ -69,7 +69,7 @@ const commonParams = {
69
69
  UseDualStack: { type: "builtInParams", name: "useDualstackEndpoint" },
70
70
  };
71
71
 
72
- var version = "3.1150.0";
72
+ var version = "3.1151.0";
73
73
  var packageInfo = {
74
74
  version: version};
75
75
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws-sdk/client-ssm",
3
- "version": "3.1151.0",
3
+ "version": "3.1152.0",
4
4
  "description": "AWS SDK for JavaScript Ssm Client for Node.js, Browser and React Native",
5
5
  "homepage": "https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-ssm",
6
6
  "license": "Apache-2.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zone-eu/mailsplit",
3
- "version": "5.4.20",
3
+ "version": "5.4.21",
4
4
  "description": "Split email messages into an object stream",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -15,8 +15,8 @@
15
15
  "author": "Andris Reinman",
16
16
  "license": "(MIT OR EUPL-1.1+)",
17
17
  "dependencies": {
18
- "libbase64": "1.3.2",
19
- "libmime": "5.4.7",
18
+ "libbase64": "1.3.3",
19
+ "libmime": "5.4.8",
20
20
  "libqp": "2.1.2"
21
21
  },
22
22
  "devDependencies": {
@@ -25,7 +25,7 @@
25
25
  "@types/grunt": "0.4.32",
26
26
  "@types/libmime": "5.3.0",
27
27
  "@types/libqp": "1.1.3",
28
- "@types/node": "26.6.4",
28
+ "@types/node": "26.6.5",
29
29
  "eslint": "8.29.0",
30
30
  "eslint-config-nodemailer": "1.2.0",
31
31
  "eslint-config-prettier": "9.1.0",
@@ -0,0 +1,75 @@
1
+ name: "libbase64 security vulnerability report"
2
+ description: "Report an exploitable security vulnerability in libbase64"
3
+
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Before reporting, read our
9
+ [Security Policy](https://github.com/nodemailer/libbase64/security/policy).
10
+
11
+ Reports must demonstrate a credible security impact.
12
+ Technically valid bugs without a realistic attack
13
+ scenario belong in the regular issue tracker.
14
+
15
+ - type: textarea
16
+ id: summary
17
+ attributes:
18
+ label: Vulnerability summary
19
+ description: Describe the vulnerability and affected versions.
20
+ validations:
21
+ required: true
22
+
23
+ - type: textarea
24
+ id: attacker
25
+ attributes:
26
+ label: Attacker capabilities
27
+ description: |
28
+ What can an attacker control without already having
29
+ privileged access to the application or its configuration?
30
+ validations:
31
+ required: true
32
+ min_length: 100
33
+
34
+ - type: textarea
35
+ id: exploit
36
+ attributes:
37
+ label: Realistic exploitation scenario
38
+ description: |
39
+ Describe how this can be exploited in a real application.
40
+ Explain the prerequisites and security boundary crossed.
41
+ validations:
42
+ required: true
43
+ min_length: 150
44
+
45
+ - type: textarea
46
+ id: poc
47
+ attributes:
48
+ label: Proof of concept
49
+ description: Provide reproducible steps or working code.
50
+ validations:
51
+ required: true
52
+
53
+ - type: textarea
54
+ id: impact
55
+ attributes:
56
+ label: Security impact
57
+ description: |
58
+ What can the attacker achieve? Who is affected?
59
+ Explain why this is a security vulnerability rather
60
+ than an ordinary bug.
61
+ validations:
62
+ required: true
63
+ min_length: 100
64
+
65
+ - type: checkboxes
66
+ id: confirmation
67
+ attributes:
68
+ label: Reporting requirements
69
+ options:
70
+ - label: I have read the Security Policy.
71
+ required: true
72
+ - label: I have verified the finding against a supported version.
73
+ required: true
74
+ - label: I have described a credible attacker-controlled scenario.
75
+ required: true
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.3.3](https://github.com/nodemailer/libbase64/compare/v1.3.2...v1.3.3) (2026-10-14)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **decoder:** decode padded segments into one buffer instead of a Buffer per segment ([0c01914](https://github.com/nodemailer/libbase64/commit/0c0191457e343769e8b68adb4052d71fa267abd1))
9
+
3
10
  ## [1.3.2](https://github.com/nodemailer/libbase64/compare/v1.3.1...v1.3.2) (2026-10-04)
4
11
 
5
12
 
@@ -0,0 +1,147 @@
1
+ # Security Policy
2
+
3
+ libbase64 encodes and decodes base64 strings and streams, with line wrapping for
4
+ MIME. It is used to decode untrusted email content. We welcome responsible
5
+ reports of vulnerabilities that present a credible security risk to users.
6
+ Please distinguish security vulnerabilities from ordinary bugs, unusual edge
7
+ cases, and hardening suggestions.
8
+
9
+ ## Supported Versions
10
+
11
+ Security fixes are released only against the latest major version. We do not
12
+ backport patches to older majors, so upgrading to the current release line is
13
+ the supported way to receive security updates.
14
+
15
+ | Version | Supported |
16
+ | ------- | ------------------ |
17
+ | 1.x | :white_check_mark: |
18
+ | < 1.0 | :x: |
19
+
20
+ If you are on an older major, please upgrade. See [CHANGELOG.md](CHANGELOG.md)
21
+ before updating.
22
+
23
+ ## What Qualifies as a Security Vulnerability
24
+
25
+ A security report should identify a realistic way for an attacker to cross a
26
+ security boundary in a supported version of libbase64. Unexpected behavior, a
27
+ failing test, or a technically correct proof of concept is not sufficient on its
28
+ own to establish security impact.
29
+
30
+ In particular, explain:
31
+
32
+ - **Attacker capabilities:** Who is the attacker, and what inputs, systems, or
33
+ responses can they control _without_ already having the privileges or secrets
34
+ they are trying to gain?
35
+ - **Attack path:** How does attacker-controlled input reach the affected code
36
+ through a supported public API or a realistic application integration?
37
+ - **Prerequisites:** What configuration and user actions are required? If the
38
+ attack depends on unusual options or deliberately malformed input, explain why
39
+ those conditions could arise in a real application.
40
+ - **Impact:** What confidentiality, integrity, or availability boundary is
41
+ crossed, and what can the attacker achieve as a result?
42
+
43
+ A vulnerability involving an optional or less common feature can still qualify
44
+ if these conditions are met. Conversely, the existence of a defensive check in
45
+ the code does not, by itself, establish that every bypass of that check has a
46
+ realistic security impact.
47
+
48
+ ## Reporting a Vulnerability
49
+
50
+ **Do not disclose suspected exploitable vulnerabilities through public GitHub
51
+ issues, pull requests, or discussions before coordinating with the
52
+ maintainers.**
53
+
54
+ Report privately through one of the following channels:
55
+
56
+ 1. **GitHub Security Advisories (preferred):**
57
+ <https://github.com/nodemailer/libbase64/security/advisories/new>.
58
+ 2. **Email:** **andris@reinman.eu**. Encrypt sensitive details if possible (PGP
59
+ key fingerprint `5D952A46E1D8C931F6364E01DC6C83F4D584D364`).
60
+
61
+ ### Required Information
62
+
63
+ Please provide enough information to evaluate both the defect and its security
64
+ impact. Reports should include:
65
+
66
+ 1. The affected libbase64 version or commit, Node.js version, and relevant
67
+ configuration.
68
+ 2. A concise description of the issue and the affected public API or code path.
69
+ 3. A minimal, tested reproduction, including steps to run it, expected behavior,
70
+ and observed behavior.
71
+ 4. A concrete threat model: attacker control, prerequisites, trust boundary, and
72
+ resulting impact. Clearly distinguish what your reproduction proves from what
73
+ you believe might be possible.
74
+ 5. An explanation of why the issue affects real deployments beyond a
75
+ deliberately constructed test setup, where this is not obvious.
76
+
77
+ A suggested fix is welcome but does not replace an explanation of
78
+ exploitability. A complete real-world exploit is not always necessary, but the
79
+ report must make a credible security impact clear.
80
+
81
+ ### Reports That May Be Treated as Ordinary Bugs
82
+
83
+ The following generally do **not** qualify for private security handling unless
84
+ you can demonstrate an additional, meaningful security boundary crossing:
85
+
86
+ - Issues that require the attacker to control trusted application code,
87
+ administrator-only configuration, or the secret they supposedly extract.
88
+ - Problems caused solely by application-level misuse, exposed credentials, or
89
+ insecure deployment choices outside libbase64's control.
90
+ - Contrived proof-of-concept setups where the tester controls both sides of a
91
+ request, without explaining how a separate attacker could trigger the issue.
92
+ - Parser quirks, unexpected behavior, and bypasses of internal checks with no
93
+ demonstrated security impact.
94
+ - Speculative findings based only on static analysis or an automated tool's
95
+ assessment, without a verified reproduction and credible attack scenario.
96
+
97
+ These may still be valid bugs and may be considered through the normal issue
98
+ tracker. Please coordinate before making any potentially exploitable details
99
+ public. Classification as a bug does not guarantee a fix or a particular
100
+ priority.
101
+
102
+ ### Automated and AI-Assisted Reports
103
+
104
+ Automated analysis and AI tools are welcome as research aids, but the person
105
+ submitting a report is responsible for verifying its claims. **Do not submit
106
+ bulk, unverified, or speculative AI-generated findings.** Test each finding
107
+ against a supported release and establish the actual security impact. Reports
108
+ that do not meet the requirements above may be closed without further
109
+ investigation or individual feedback; they can be resubmitted with stronger
110
+ evidence.
111
+
112
+ ## Triage and Disclosure
113
+
114
+ libbase64 is maintained by a single person, and there is **no guaranteed
115
+ response or resolution time**. Reports are prioritized based on demonstrated
116
+ impact, exploitability, affected usage, and available maintenance resources.
117
+
118
+ A private report does not automatically become a security advisory. Confirmed
119
+ vulnerabilities may be fixed and disclosed through GitHub Security Advisories;
120
+ other findings may be closed, deferred, or handled as ordinary bugs. Please do
121
+ not disclose details of an unresolved, potentially exploitable issue publicly
122
+ without coordinating with the maintainers.
123
+
124
+ ## CVEs and Credit
125
+
126
+ We do not request or manage CVE identifiers. A report being acknowledged, a bug
127
+ being fixed, or a pull request being merged does **not** mean that libbase64 has
128
+ confirmed a security vulnerability or endorsed a CVE assignment. We do not
129
+ guarantee advisories, CVE identifiers, or public credit for reports. For
130
+ confirmed vulnerabilities disclosed through an advisory, substantive reporters
131
+ may be credited if they wish.
132
+
133
+ ## Scope
134
+
135
+ In scope: the libbase64 source in this repository: the encoder and decoder
136
+ functions and their stream variants. Of particular interest are inputs that
137
+ crash the process, corrupt output beyond the malformed input, or consume
138
+ resources out of proportion to their size.
139
+
140
+ Out of scope:
141
+
142
+ - Resource consumption that is proportional to a legitimately large input.
143
+ - Vulnerabilities in your own application code, including how it handles decoded
144
+ data.
145
+ - Social-engineering reports.
146
+
147
+ Thank you for helping keep libbase64 and its users safe.
@@ -28,17 +28,29 @@ function decode(str) {
28
28
  str = str || '';
29
29
 
30
30
  // Buffer.from() stops decoding at the first padding char, so input made of several
31
- // padded segments (eg. every line padded on its own) is decoded segment by segment
31
+ // padded segments (eg. every line padded on its own) is decoded segment by segment.
32
+ // Segments are found with indexOf and written into one buffer: splitting the input and
33
+ // keeping a Buffer per segment cost memory per segment, tens of times the input size
34
+ // for a body that pads every line.
32
35
  if (typeof str === 'string') {
33
36
  let padPos = str.indexOf('=');
34
- if (padPos >= 0 && /[a-zA-Z0-9+/\-_]/.test(str.substr(padPos))) {
35
- let parts = [];
36
- for (let segment of str.split(/[=]+/)) {
37
- if (segment) {
38
- parts.push(Buffer.from(segment, 'base64'));
37
+ if (padPos >= 0 && /[a-zA-Z0-9+/\-_]/.test(str.slice(padPos))) {
38
+ // a segment of n characters decodes to at most n * 3 / 4 bytes
39
+ let output = Buffer.alloc(Math.floor((str.length * 3) / 4));
40
+ let length = 0;
41
+ let start = 0;
42
+ while (start <= str.length) {
43
+ let end = str.indexOf('=', start);
44
+ if (end < 0) {
45
+ end = str.length;
39
46
  }
47
+ if (end > start) {
48
+ length += output.write(str.substring(start, end), length, 'base64');
49
+ }
50
+ start = end + 1;
40
51
  }
41
- return Buffer.concat(parts);
52
+ // copied out so the result does not keep the oversized buffer alive
53
+ return Buffer.from(output.subarray(0, length));
42
54
  }
43
55
  }
44
56
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "libbase64",
3
- "version": "1.3.2",
3
+ "version": "1.3.3",
4
4
  "description": "Encode and decode base64 encoded strings",
5
5
  "main": "lib/libbase64.js",
6
6
  "scripts": {
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [5.4.8](https://github.com/nodemailer/libmime/compare/v5.4.7...v5.4.8) (2026-10-14)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **deps:** update libbase64 to 1.3.3 ([4fa88fb](https://github.com/nodemailer/libmime/commit/4fa88fb0c6ff1f4a06bd67b53bf4bad2b1a6f5c2))
9
+
3
10
  ## [5.4.7](https://github.com/nodemailer/libmime/compare/v5.4.6...v5.4.7) (2026-10-04)
4
11
 
5
12
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "libmime",
3
3
  "description": "Encode and decode quoted printable and base64 strings",
4
- "version": "5.4.7",
4
+ "version": "5.4.8",
5
5
  "main": "lib/libmime.js",
6
6
  "files": [
7
7
  "lib",
@@ -26,7 +26,7 @@
26
26
  "dependencies": {
27
27
  "encoding-japanese": "2.4.0",
28
28
  "iconv-lite": "0.7.3",
29
- "libbase64": "1.3.2",
29
+ "libbase64": "1.3.3",
30
30
  "libqp": "2.1.2"
31
31
  },
32
32
  "devDependencies": {
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "3.9.38"
2
+ ".": "3.9.39"
3
3
  }
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [3.9.39](https://github.com/nodemailer/mailparser/compare/v3.9.38...v3.9.39) (2026-10-14)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **deps:** update nodemailer to 10.1.1, libmime to 5.4.8 and mailsplit to 5.4.21 ([43ddf3e](https://github.com/nodemailer/mailparser/commit/43ddf3e9214b2a14b20319d1679ffe001a3a6889))
9
+
3
10
  ## [3.9.38](https://github.com/nodemailer/mailparser/compare/v3.9.37...v3.9.38) (2026-10-10)
4
11
 
5
12
 
@@ -3,21 +3,24 @@
3
3
  mailparser is an email parsing library for Node.js. It is routinely pointed at
4
4
  untrusted, adversarial, and malformed messages, so parser robustness is a
5
5
  security concern: a crafted message should never be able to crash the host
6
- process, exhaust memory or CPU, pollute prototypes, or leak data across parses.
7
- We take security reports seriously and aim to respond quickly.
6
+ process, exhaust memory or CPU through amplification, pollute prototypes, or
7
+ leak data across parses. We welcome responsible reports of vulnerabilities that
8
+ present a credible security risk to users. Please distinguish security
9
+ vulnerabilities from ordinary bugs, unusual edge cases, and hardening
10
+ suggestions.
8
11
 
9
12
  ## Supported Versions
10
13
 
11
- Security fixes are released only against the latest version. We do not backport
12
- patches to older releases - upgrading to the current 3.x release line is the
13
- supported way to receive security updates.
14
+ Security fixes are released only against the latest major version. We do not
15
+ backport patches to older majors, so upgrading to the current release line is
16
+ the supported way to receive security updates.
14
17
 
15
18
  | Version | Supported |
16
19
  | ------- | ------------------ |
17
20
  | 3.x | :white_check_mark: |
18
21
  | < 3.0 | :x: |
19
22
 
20
- If you are on an older version, please upgrade. See the release notes at
23
+ If you are on an older major, please upgrade. See the release notes at
21
24
  <https://github.com/nodemailer/mailparser/releases> before updating.
22
25
 
23
26
  > [!NOTE]
@@ -26,51 +29,126 @@ If you are on an older version, please upgrade. See the release notes at
26
29
  > [PostalMime](https://github.com/postalsys/postal-mime), which works in both
27
30
  > Node.js and browser environments.
28
31
 
29
- ## Reporting a Vulnerability
32
+ ## What Qualifies as a Security Vulnerability
30
33
 
31
- **Please do not report security vulnerabilities through public GitHub issues,
32
- pull requests, or discussions.**
34
+ A security report should identify a realistic way for an attacker to cross a
35
+ security boundary in a supported version of mailparser. Unexpected behavior, a
36
+ failing test, or a technically correct proof of concept is not sufficient on its
37
+ own to establish security impact.
33
38
 
34
- Report privately through one of the following channels:
39
+ In particular, explain:
35
40
 
36
- 1. **GitHub Security Advisories (preferred).** Open a private report at
37
- <https://github.com/nodemailer/mailparser/security/advisories/new>. This keeps
38
- the discussion private until a fix is published and lets us credit you.
39
- 2. **Email.** Send details to **andris@postalsys.com** (the contact listed in
40
- [`SECURITY.txt`](SECURITY.txt)). Encrypt sensitive details if possible - our
41
- PGP key fingerprint is `5D952A46E1D8C931F6364E01DC6C83F4D584D364`.
41
+ - **Attacker capabilities:** Who is the attacker, and what inputs, systems, or
42
+ responses can they control _without_ already having the privileges or secrets
43
+ they are trying to gain?
44
+ - **Attack path:** How does attacker-controlled input reach the affected code
45
+ through a supported public API or a realistic application integration?
46
+ - **Prerequisites:** What configuration and user actions are required? If the
47
+ attack depends on unusual options or deliberately malformed input, explain why
48
+ those conditions could arise in a real application.
49
+ - **Impact:** What confidentiality, integrity, or availability boundary is
50
+ crossed, and what can the attacker achieve as a result?
42
51
 
43
- When reporting, please include as much of the following as you can:
52
+ A vulnerability involving an optional or less common feature can still qualify
53
+ if these conditions are met. Conversely, the existence of a defensive check in
54
+ the code does not, by itself, establish that every bypass of that check has a
55
+ realistic security impact.
44
56
 
45
- - The affected version(s) and environment (mailparser version, Node.js version,
46
- OS).
47
- - A clear description of the issue and its impact (e.g. denial of service via
48
- CPU or memory exhaustion, ReDoS, prototype pollution, unhandled exception that
49
- crashes the process, information disclosure between parses).
50
- - A minimal proof of concept - ideally the raw `.eml` sample or a short script
51
- that reproduces the issue.
52
- - Any suggested remediation, if you have one.
57
+ ## Reporting a Vulnerability
53
58
 
54
- We are a small team, so there is no guaranteed response time - sometimes reports
55
- are handled within hours, sometimes they take longer. Accepted issues are fixed
56
- in a new release and coordinated through a GitHub Security Advisory, and
57
- reporters who wish to be named are credited.
59
+ **Do not disclose suspected exploitable vulnerabilities through public GitHub
60
+ issues, pull requests, or discussions before coordinating with the
61
+ maintainers.**
58
62
 
59
- ## CVEs
63
+ Report privately through one of the following channels:
60
64
 
61
- We track and disclose vulnerabilities through GitHub Security Advisories. We do
62
- not request or manage CVE identifiers ourselves. If you need a CVE assigned for a
63
- reported issue, please request one yourself - for example, through GitHub's own
64
- CVE request flow on the published advisory, or another CNA.
65
+ 1. **GitHub Security Advisories (preferred):**
66
+ <https://github.com/nodemailer/mailparser/security/advisories/new>.
67
+ 2. **Email:** **andris@postalsys.com**, as listed in
68
+ [`SECURITY.txt`](SECURITY.txt). Encrypt sensitive details if possible.
69
+
70
+ ### Required Information
71
+
72
+ Please provide enough information to evaluate both the defect and its security
73
+ impact. Reports should include:
74
+
75
+ 1. The affected mailparser version or commit, Node.js version, and relevant
76
+ configuration.
77
+ 2. A concise description of the issue and the affected public API or code path
78
+ (`MailParser` or `simpleParser`. The raw `.eml` sample that triggers the
79
+ issue is the most useful reproduction).
80
+ 3. A minimal, tested reproduction, including steps to run it, expected behavior,
81
+ and observed behavior.
82
+ 4. A concrete threat model: attacker control, prerequisites, trust boundary, and
83
+ resulting impact. Clearly distinguish what your reproduction proves from what
84
+ you believe might be possible.
85
+ 5. An explanation of why the issue affects real deployments beyond a
86
+ deliberately constructed test setup, where this is not obvious.
87
+
88
+ A suggested fix is welcome but does not replace an explanation of
89
+ exploitability. A complete real-world exploit is not always necessary, but the
90
+ report must make a credible security impact clear.
91
+
92
+ ### Reports That May Be Treated as Ordinary Bugs
93
+
94
+ The following generally do **not** qualify for private security handling unless
95
+ you can demonstrate an additional, meaningful security boundary crossing:
96
+
97
+ - Issues that require the attacker to control trusted application code,
98
+ administrator-only configuration, or the secret they supposedly extract.
99
+ - Problems caused solely by application-level misuse, exposed credentials, or
100
+ insecure deployment choices outside mailparser's control.
101
+ - Contrived proof-of-concept setups where the tester controls both sides of a
102
+ request, without explaining how a separate attacker could trigger the issue.
103
+ - Parser quirks, unexpected behavior, and bypasses of internal checks with no
104
+ demonstrated security impact.
105
+ - Speculative findings based only on static analysis or an automated tool's
106
+ assessment, without a verified reproduction and credible attack scenario.
107
+
108
+ These may still be valid bugs and may be considered through the normal issue
109
+ tracker. Please coordinate before making any potentially exploitable details
110
+ public. Classification as a bug does not guarantee a fix or a particular
111
+ priority.
112
+
113
+ ### Automated and AI-Assisted Reports
114
+
115
+ Automated analysis and AI tools are welcome as research aids, but the person
116
+ submitting a report is responsible for verifying its claims. **Do not submit
117
+ bulk, unverified, or speculative AI-generated findings.** Test each finding
118
+ against a supported release and establish the actual security impact. Reports
119
+ that do not meet the requirements above may be closed without further
120
+ investigation or individual feedback; they can be resubmitted with stronger
121
+ evidence.
122
+
123
+ ## Triage and Disclosure
124
+
125
+ mailparser is maintained by a small team, and there is **no guaranteed response
126
+ or resolution time**. Reports are prioritized based on demonstrated impact,
127
+ exploitability, affected usage, and available maintenance resources.
128
+
129
+ A private report does not automatically become a security advisory. Confirmed
130
+ vulnerabilities may be fixed and disclosed through GitHub Security Advisories;
131
+ other findings may be closed, deferred, or handled as ordinary bugs. Please do
132
+ not disclose details of an unresolved, potentially exploitable issue publicly
133
+ without coordinating with the maintainers.
134
+
135
+ ## CVEs and Credit
136
+
137
+ We do not request or manage CVE identifiers. A report being acknowledged, a bug
138
+ being fixed, or a pull request being merged does **not** mean that mailparser
139
+ has confirmed a security vulnerability or endorsed a CVE assignment. We do not
140
+ guarantee advisories, CVE identifiers, or public credit for reports. For
141
+ confirmed vulnerabilities disclosed through an advisory, substantive reporters
142
+ may be credited if they wish.
65
143
 
66
144
  ## Scope
67
145
 
68
- In scope: the mailparser library source in this repository - the streaming MIME
146
+ In scope: the mailparser library source in this repository: the streaming MIME
69
147
  parser (`MailParser`), the convenience parser (`simpleParser`), header and
70
- address decoding, charset/transfer-encoding handling, and attachment and HTML/
71
- text extraction. Of particular interest are inputs that cause unbounded resource
72
- consumption, catastrophic regular-expression backtracking, prototype pollution,
73
- or process crashes.
148
+ address decoding, charset and transfer-encoding handling, and attachment and
149
+ HTML/text extraction. Of particular interest are small crafted inputs that cause
150
+ amplified resource consumption, catastrophic regular-expression backtracking,
151
+ prototype pollution, or process crashes.
74
152
 
75
153
  Out of scope:
76
154
 
@@ -78,13 +156,11 @@ Out of scope:
78
156
  Parsed email content is attacker-controlled data; you must sanitize and escape
79
157
  it before rendering, storing, or executing it. In particular, the `html` field
80
158
  is not sanitized for safe display in a browser.
81
- - Vulnerabilities in third-party dependencies that are already tracked and fixed
82
- upstream - report those to the respective project (we will still bump the
83
- dependency once a fix is available).
84
- - Issues that require an already-compromised host or a malicious local
85
- environment.
86
159
  - Resource consumption that is proportional to a legitimately large input (for
87
160
  example, parsing a genuine 100MB message uses memory) rather than amplified by
88
161
  a crafted small input.
162
+ - Vulnerabilities in third-party dependencies that are already tracked upstream
163
+ (we will still bump the dependency once a fix is available).
164
+ - Social-engineering reports.
89
165
 
90
166
  Thank you for helping keep mailparser and its users safe.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mailparser",
3
- "version": "3.9.38",
3
+ "version": "3.9.39",
4
4
  "description": "Parse e-mails",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -22,10 +22,10 @@
22
22
  "he": "1.2.0",
23
23
  "html-to-text": "10.0.1",
24
24
  "iconv-lite": "0.7.3",
25
- "libmime": "5.4.7",
25
+ "libmime": "5.4.8",
26
26
  "linkify-it": "5.0.2",
27
- "@zone-eu/mailsplit": "5.4.20",
28
- "nodemailer": "10.1.0",
27
+ "@zone-eu/mailsplit": "5.4.21",
28
+ "nodemailer": "10.1.1",
29
29
  "punycode.js": "2.3.1",
30
30
  "tlds": "1.261.0"
31
31
  },
@@ -41,7 +41,7 @@
41
41
  "grunt-contrib-nodeunit": "5.0.0",
42
42
  "grunt-eslint": "27.0.0",
43
43
  "iconv": "3.0.1",
44
- "prettier": "3.9.9",
44
+ "prettier": "3.9.10",
45
45
  "random-message": "1.1.0"
46
46
  },
47
47
  "repository": {
@@ -1,5 +1,12 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## [10.1.1](https://github.com/nodemailer/nodemailer/compare/v10.1.0...v10.1.1) (2026-10-14)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **fetch:** strip credentials on any cross-origin redirect ([a15360c](https://github.com/nodemailer/nodemailer/commit/a15360cd2cd12e4670e96ab0b7290e8c862391cf))
9
+
3
10
  ## [10.1.0](https://github.com/nodemailer/nodemailer/compare/v10.0.16...v10.1.0) (2026-10-10)
4
11
 
5
12
 
@@ -1,7 +1,9 @@
1
1
  # Security Policy
2
2
 
3
- Nodemailer is a widely deployed, zero-dependency e-mail library. We take security
4
- reports seriously and aim to respond quickly.
3
+ Nodemailer is a widely deployed, zero-dependency email library. We welcome
4
+ responsible reports of vulnerabilities that present a credible security risk to
5
+ users. Please distinguish security vulnerabilities from ordinary bugs, unusual
6
+ edge cases, and hardening suggestions.
5
7
 
6
8
  ## Supported Versions
7
9
 
@@ -17,45 +19,119 @@ the supported way to receive security updates.
17
19
  If you are on an older major, please upgrade. See the migration notes at
18
20
  <https://nodemailer.com/> before updating.
19
21
 
20
- ## Reporting a Vulnerability
22
+ ## What Qualifies as a Security Vulnerability
21
23
 
22
- **Please do not report security vulnerabilities through public GitHub issues,
23
- pull requests, or discussions.**
24
+ A security report should identify a realistic way for an attacker to cross a
25
+ security boundary in a supported version of Nodemailer. Unexpected behavior,
26
+ a failing test, or a technically correct proof of concept is not sufficient on
27
+ its own to establish security impact.
24
28
 
25
- Report privately through one of the following channels:
29
+ In particular, explain:
26
30
 
27
- 1. **GitHub Security Advisories (preferred).** Open a private report at
28
- <https://github.com/nodemailer/nodemailer/security/advisories/new>. This keeps
29
- the discussion private until a fix is published and lets us credit you.
30
- 2. **Email.** Send details to **andris@reinman.eu** (the contact listed in
31
- [`SECURITY.txt`](SECURITY.txt)). Encrypt sensitive details if possible.
31
+ - **Attacker capabilities:** Who is the attacker, and what inputs, systems, or
32
+ responses can they control _without_ already having the privileges or secrets
33
+ they are trying to gain?
34
+ - **Attack path:** How does attacker-controlled input reach the affected code
35
+ through a supported Nodemailer API or a realistic application integration?
36
+ - **Prerequisites:** What configuration and user actions are required? If the
37
+ attack depends on unusual options or deliberately malformed input, explain
38
+ why those conditions could arise in a real application.
39
+ - **Impact:** What confidentiality, integrity, or availability boundary is
40
+ crossed, and what can the attacker achieve as a result?
32
41
 
33
- When reporting, please include as much of the following as you can:
42
+ A vulnerability involving an optional or less common feature can still qualify
43
+ if these conditions are met. Conversely, the existence of a defensive check in
44
+ the code does not, by itself, establish that every bypass of that check has a
45
+ realistic security impact.
34
46
 
35
- - The affected version(s) and environment (Node.js version, OS).
36
- - The component involved (e.g. SMTP connection, address parsing, MIME/header
37
- generation, DKIM).
38
- - A clear description of the issue and its impact (e.g. header/SMTP command
39
- injection, information disclosure, DoS).
40
- - A minimal proof of concept or reproduction steps.
41
- - Any suggested remediation, if you have one.
47
+ ## Reporting a Vulnerability
42
48
 
43
- Nodemailer is maintained by a single person, so there is no guaranteed response
44
- time: sometimes reports are handled within hours, sometimes they take longer.
45
- Accepted issues are fixed in a new release and coordinated through a GitHub
46
- Security Advisory, and reporters who wish to be named are credited.
49
+ **Do not disclose suspected exploitable vulnerabilities through public GitHub
50
+ issues, pull requests, or discussions before coordinating with the maintainer.**
47
51
 
48
- ## CVEs
52
+ Report privately through one of the following channels:
49
53
 
50
- We track and disclose vulnerabilities through GitHub Security Advisories. We do
51
- not request or manage CVE identifiers ourselves. If you need a CVE assigned for a
52
- reported issue, please request one yourself, for example through GitHub's own
53
- CVE request flow on the published advisory, or another CNA.
54
+ 1. **GitHub Security Advisories (preferred):**
55
+ <https://github.com/nodemailer/nodemailer/security/advisories/new>.
56
+ 2. **Email:** **andris@reinman.eu**, as listed in
57
+ [`SECURITY.txt`](SECURITY.txt). Encrypt sensitive details if possible.
58
+
59
+ ### Required Information
60
+
61
+ Please provide enough information to evaluate both the defect and its security
62
+ impact. Reports should include:
63
+
64
+ 1. The affected Nodemailer version or commit, Node.js version, and relevant
65
+ configuration.
66
+ 2. A concise description of the issue and the affected public API or code path.
67
+ 3. A minimal, tested reproduction, including steps to run it, expected behavior,
68
+ and observed behavior.
69
+ 4. A concrete threat model: attacker control, prerequisites, trust boundary, and
70
+ resulting impact. Clearly distinguish what your reproduction proves from what
71
+ you believe might be possible.
72
+ 5. An explanation of why the issue affects applications beyond a deliberately
73
+ constructed test setup, where this is not obvious.
74
+
75
+ A suggested fix is welcome but does not replace an explanation of exploitability.
76
+ A complete real-world exploit is not always necessary, but the report must make
77
+ a credible security impact clear.
78
+
79
+ ### Reports That May Be Treated as Ordinary Bugs
80
+
81
+ The following generally do **not** qualify for private security handling unless
82
+ you can demonstrate an additional, meaningful security boundary crossing:
83
+
84
+ - Issues that require the attacker to control trusted application code,
85
+ administrator-only configuration, or the secret they supposedly extract.
86
+ - Problems caused solely by application-level misuse, exposed credentials, or
87
+ insecure deployment choices outside Nodemailer's control.
88
+ - Contrived proof-of-concept setups where the tester controls both sides of a
89
+ request, without explaining how a separate attacker could trigger the issue.
90
+ - Parser quirks, unexpected behavior, and bypasses of internal checks with no
91
+ demonstrated security impact.
92
+ - Speculative findings based only on static analysis or an automated tool's
93
+ assessment, without a verified reproduction and credible attack scenario.
94
+
95
+ These may still be valid bugs and may be considered through the normal issue
96
+ tracker. Please coordinate before making any potentially exploitable details
97
+ public. Classification as a bug does not guarantee a fix or a particular
98
+ priority.
99
+
100
+ ### Automated and AI-Assisted Reports
101
+
102
+ Automated analysis and AI tools are welcome as research aids, but the person
103
+ submitting a report is responsible for verifying its claims. **Do not submit
104
+ bulk, unverified, or speculative AI-generated findings.** Test each finding
105
+ against a supported release and establish the actual security impact. Reports
106
+ that do not meet the requirements above may be closed without further
107
+ investigation or individual feedback; they can be resubmitted with stronger
108
+ evidence.
109
+
110
+ ## Triage and Disclosure
111
+
112
+ Nodemailer is maintained by a single person, and there is **no guaranteed
113
+ response or resolution time**. Reports are prioritized based on demonstrated
114
+ impact, exploitability, affected usage, and available maintenance resources.
115
+
116
+ A private report does not automatically become a security advisory. Confirmed
117
+ vulnerabilities may be fixed and disclosed through GitHub Security Advisories;
118
+ other findings may be closed, deferred, or handled as ordinary bugs. Please do
119
+ not disclose details of an unresolved, potentially exploitable issue publicly
120
+ without coordinating with the maintainer.
121
+
122
+ ## CVEs and Credit
123
+
124
+ We do not request or manage CVE identifiers. A report being acknowledged, a bug
125
+ being fixed, or a pull request being merged does **not** mean that Nodemailer
126
+ has confirmed a security vulnerability or endorsed a CVE assignment. We do not
127
+ guarantee advisories, CVE identifiers, or public credit for reports. For
128
+ confirmed vulnerabilities disclosed through an advisory, substantive reporters
129
+ may be credited if they wish.
54
130
 
55
131
  ## Scope
56
132
 
57
133
  In scope: the `nodemailer` package source in this repository: message and MIME
58
- generation, SMTP/LMTP client behaviour, address parsing, header handling, DKIM
134
+ generation, SMTP/LMTP client behavior, address parsing, header handling, DKIM
59
135
  signing, and the bundled transports.
60
136
 
61
137
  Out of scope: vulnerabilities in your own application code, misconfiguration of
@@ -116,6 +116,10 @@ function parseFetchUrl(url) {
116
116
  }
117
117
  return parsed;
118
118
  }
119
+ // the port a request to the URL goes to, explicit or the default of its scheme
120
+ function fetchPort(parsed) {
121
+ return parsed.port ? Number(parsed.port) : parsed.protocol === 'https:' ? 443 : 80;
122
+ }
119
123
  function nmfetch(url, options) {
120
124
  options = options || {};
121
125
  options.fetchRes = options.fetchRes || new node_stream_1.PassThrough();
@@ -232,7 +236,7 @@ function nmfetch(url, options) {
232
236
  method,
233
237
  host: parsed.hostname,
234
238
  path: parsed.path,
235
- port: parsed.port ? parsed.port : parsed.protocol === 'https:' ? 443 : 80,
239
+ port: fetchPort(parsed),
236
240
  headers,
237
241
  // Validate TLS certificates by default. Callers that genuinely need to
238
242
  // reach a self-signed/internal host opt out explicitly with
@@ -334,17 +338,19 @@ function nmfetch(url, options) {
334
338
  // the shared fetchRes once it times out. Callers listen with req.once().
335
339
  return fail(new Error('Unsupported protocol for URL ' + redirectUrl), redirectUrl);
336
340
  }
337
- // Do not forward credentials when the redirect leaves the original
338
- // security context: a different host, or a downgrade from https to
339
- // http (which would otherwise put them on the wire in cleartext).
340
- // Strip sensitive request headers so an attacker who controls the
341
- // redirect target cannot harvest them.
342
- const crossHost = redirectParsed.hostname !== parsed.hostname;
343
- const downgrade = parsed.protocol === 'https:' && redirectParsed.protocol === 'http:';
344
- if (options.headers && (crossHost || downgrade)) {
341
+ // Do not forward credentials when the redirect leaves the origin: a different
342
+ // scheme, host or port is a different security context (an https to http
343
+ // downgrade would also put them on the wire in cleartext). Strip sensitive
344
+ // request headers so an attacker who controls the redirect target cannot
345
+ // harvest them.
346
+ const crossOrigin = redirectParsed.protocol !== parsed.protocol ||
347
+ redirectParsed.hostname !== parsed.hostname ||
348
+ fetchPort(redirectParsed) !== fetchPort(parsed);
349
+ if (options.headers && crossOrigin) {
345
350
  const sensitive = ['authorization', 'cookie', 'proxy-authorization'];
346
351
  Object.keys(options.headers).forEach(key => {
347
- if (sensitive.includes(key.toLowerCase())) {
352
+ // normalized the way the request headers are built above, a padded name is sent too
353
+ if (sensitive.includes(key.toLowerCase().trim())) {
348
354
  delete options.headers[key];
349
355
  }
350
356
  });
@@ -1,3 +1,3 @@
1
1
  export declare const name = "nodemailer";
2
- export declare const version = "10.1.0";
2
+ export declare const version = "10.1.1";
3
3
  export declare const homepage = "https://nodemailer.com/";
@@ -3,5 +3,5 @@
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.homepage = exports.version = exports.name = void 0;
5
5
  exports.name = 'nodemailer';
6
- exports.version = '10.1.0';
6
+ exports.version = '10.1.1';
7
7
  exports.homepage = 'https://nodemailer.com/';
@@ -78,6 +78,10 @@ function parseFetchUrl(url) {
78
78
  }
79
79
  return parsed;
80
80
  }
81
+ // the port a request to the URL goes to, explicit or the default of its scheme
82
+ function fetchPort(parsed) {
83
+ return parsed.port ? Number(parsed.port) : parsed.protocol === 'https:' ? 443 : 80;
84
+ }
81
85
  function nmfetch(url, options) {
82
86
  options = options || {};
83
87
  options.fetchRes = options.fetchRes || new PassThrough();
@@ -194,7 +198,7 @@ function nmfetch(url, options) {
194
198
  method,
195
199
  host: parsed.hostname,
196
200
  path: parsed.path,
197
- port: parsed.port ? parsed.port : parsed.protocol === 'https:' ? 443 : 80,
201
+ port: fetchPort(parsed),
198
202
  headers,
199
203
  // Validate TLS certificates by default. Callers that genuinely need to
200
204
  // reach a self-signed/internal host opt out explicitly with
@@ -296,17 +300,19 @@ function nmfetch(url, options) {
296
300
  // the shared fetchRes once it times out. Callers listen with req.once().
297
301
  return fail(new Error('Unsupported protocol for URL ' + redirectUrl), redirectUrl);
298
302
  }
299
- // Do not forward credentials when the redirect leaves the original
300
- // security context: a different host, or a downgrade from https to
301
- // http (which would otherwise put them on the wire in cleartext).
302
- // Strip sensitive request headers so an attacker who controls the
303
- // redirect target cannot harvest them.
304
- const crossHost = redirectParsed.hostname !== parsed.hostname;
305
- const downgrade = parsed.protocol === 'https:' && redirectParsed.protocol === 'http:';
306
- if (options.headers && (crossHost || downgrade)) {
303
+ // Do not forward credentials when the redirect leaves the origin: a different
304
+ // scheme, host or port is a different security context (an https to http
305
+ // downgrade would also put them on the wire in cleartext). Strip sensitive
306
+ // request headers so an attacker who controls the redirect target cannot
307
+ // harvest them.
308
+ const crossOrigin = redirectParsed.protocol !== parsed.protocol ||
309
+ redirectParsed.hostname !== parsed.hostname ||
310
+ fetchPort(redirectParsed) !== fetchPort(parsed);
311
+ if (options.headers && crossOrigin) {
307
312
  const sensitive = ['authorization', 'cookie', 'proxy-authorization'];
308
313
  Object.keys(options.headers).forEach(key => {
309
- if (sensitive.includes(key.toLowerCase())) {
314
+ // normalized the way the request headers are built above, a padded name is sent too
315
+ if (sensitive.includes(key.toLowerCase().trim())) {
310
316
  delete options.headers[key];
311
317
  }
312
318
  });
@@ -1,3 +1,3 @@
1
1
  export declare const name = "nodemailer";
2
- export declare const version = "10.1.0";
2
+ export declare const version = "10.1.1";
3
3
  export declare const homepage = "https://nodemailer.com/";
@@ -1,4 +1,4 @@
1
1
  // Generated by scripts/build.js from package.json. Do not edit by hand.
2
2
  export const name = 'nodemailer';
3
- export const version = '10.1.0';
3
+ export const version = '10.1.1';
4
4
  export const homepage = 'https://nodemailer.com/';
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodemailer",
3
- "version": "10.1.0",
3
+ "version": "10.1.1",
4
4
  "description": "Easy as cake e-mail sending from your Node.js applications",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/nodemailer.js",
@@ -151,7 +151,7 @@
151
151
  },
152
152
  "homepage": "https://nodemailer.com/",
153
153
  "devDependencies": {
154
- "@aws-sdk/client-sesv2": "3.1146.0",
154
+ "@aws-sdk/client-sesv2": "3.1151.0",
155
155
  "@types/node": "20.19.43",
156
156
  "bunyan": "1.8.15",
157
157
  "c8": "12.0.0",
@@ -161,14 +161,14 @@
161
161
  "libbase64": "1.3.2",
162
162
  "libmime": "5.4.7",
163
163
  "libqp": "2.1.2",
164
- "mailauth": "7.1.1",
165
- "prettier": "3.9.9",
164
+ "mailauth": "7.3.0",
165
+ "prettier": "3.9.10",
166
166
  "proxy": "1.0.2",
167
167
  "proxy-test-server": "1.0.0",
168
- "smtp-server": "3.19.17",
168
+ "smtp-server": "3.19.21",
169
169
  "tsx": "4.23.15",
170
170
  "typescript": "6.0.3",
171
- "typescript-eslint": "8.71.1"
171
+ "typescript-eslint": "8.71.2"
172
172
  },
173
173
  "engines": {
174
174
  "node": ">=20.0.0"
package/package.json CHANGED
@@ -79,15 +79,15 @@
79
79
  "constructs": "^10.5.1"
80
80
  },
81
81
  "dependencies": {
82
- "@aws-sdk/client-cloudwatch-logs": "^3.1151.0",
83
- "@aws-sdk/client-route-53": "^3.1151.0",
84
- "@aws-sdk/client-s3": "^3.1151.0",
85
- "@aws-sdk/client-ses": "^3.1151.0",
86
- "@aws-sdk/client-ssm": "^3.1151.0",
82
+ "@aws-sdk/client-cloudwatch-logs": "^3.1152.0",
83
+ "@aws-sdk/client-route-53": "^3.1152.0",
84
+ "@aws-sdk/client-s3": "^3.1152.0",
85
+ "@aws-sdk/client-ses": "^3.1152.0",
86
+ "@aws-sdk/client-ssm": "^3.1152.0",
87
87
  "@mavogel/mvc-projen": "^0.0.60",
88
88
  "cdk-nag": "^3.0.1",
89
89
  "constructs": "^10.5.1",
90
- "mailparser": "^3.9.38",
90
+ "mailparser": "^3.9.39",
91
91
  "uuid": "^14.0.3"
92
92
  },
93
93
  "bundledDependencies": [
@@ -122,7 +122,7 @@
122
122
  "publishConfig": {
123
123
  "access": "public"
124
124
  },
125
- "version": "0.1.20",
125
+ "version": "0.1.21",
126
126
  "jest": {
127
127
  "coverageProvider": "v8",
128
128
  "transformIgnorePatterns": [