@hartl-services/medusa-base 2.1.0 → 2.2.1
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/.medusa/server/src/api/middlewares.js +16 -1
- package/.medusa/server/src/api/password-policy.js +23 -0
- package/.medusa/server/src/email/config/index.js +7 -4
- package/.medusa/server/src/email/domain/sender.js +28 -0
- package/.medusa/server/src/providers/smtp/service.js +4 -4
- package/README.md +29 -1
- package/dist/email/config/index.js +6 -3
- package/dist/email/domain/sender.d.ts +12 -0
- package/dist/email/domain/sender.js +27 -0
- package/package.json +2 -2
|
@@ -9,6 +9,7 @@ const files_1 = require("@hartl-services/medusa-food-supplements-contracts/schem
|
|
|
9
9
|
const plugin_features_2 = require("../documents/plugin-features");
|
|
10
10
|
const plugin_features_3 = require("../email/plugin-features");
|
|
11
11
|
const customer_verification_request_throttle_1 = require("./customer-verification-request-throttle");
|
|
12
|
+
const password_policy_1 = require("./password-policy");
|
|
12
13
|
const public_1 = require("../public");
|
|
13
14
|
/**
|
|
14
15
|
* Feature-toggle gate for the Documents routes. Without `methods` Medusa
|
|
@@ -138,6 +139,20 @@ exports.default = (0, http_1.defineMiddlewares)({
|
|
|
138
139
|
customer_verification_request_throttle_1.throttleCustomerVerificationRequest,
|
|
139
140
|
],
|
|
140
141
|
},
|
|
142
|
+
// Password policy for customers and Admin users: registration (sign-up
|
|
143
|
+
// and Admin invite) and the password reset. Without `methods` the entry
|
|
144
|
+
// is an `app.use` prefix match that runs before Medusa's method-specific
|
|
145
|
+
// entries, so a rejected password never consumes the single-use reset
|
|
146
|
+
// token (Medusa's `validateToken` deletes it on the update route). Both
|
|
147
|
+
// paths only exist for POST.
|
|
148
|
+
{
|
|
149
|
+
matcher: "/auth/:actor_type/emailpass/register",
|
|
150
|
+
middlewares: [password_policy_1.enforcePasswordPolicy],
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
matcher: "/auth/:actor_type/emailpass/update",
|
|
154
|
+
middlewares: [password_policy_1.enforcePasswordPolicy],
|
|
155
|
+
},
|
|
141
156
|
// --- Dokumente ------------------------------------------------------
|
|
142
157
|
// Feature-toggle gates (see plugin-features.ts). They cover every
|
|
143
158
|
// Documents route and nothing else; subscribers and jobs check the
|
|
@@ -233,4 +248,4 @@ exports.default = (0, http_1.defineMiddlewares)({
|
|
|
233
248
|
},
|
|
234
249
|
],
|
|
235
250
|
});
|
|
236
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
251
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBS2lDO0FBQ2pDLCtHQUtrRjtBQUNsRixtR0FHNEU7QUFDNUUsMkZBS3dFO0FBQ3hFLDJIQUFrSTtBQUNsSSwyRkFBdUg7QUFFdkgsa0VBR3FDO0FBQ3JDLDhEQUE4RDtBQUM5RCxxR0FBOEY7QUFDOUYsdURBQXlEO0FBQ3pELHNDQUFnRDtBQUVoRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLGFBQWEsR0FBRyxDQUFDLE9BQWUsRUFBRSxHQUFHLElBQTJCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUUsT0FBTztJQUNQLFdBQVcsRUFBRSxDQUFDLElBQUEsNkJBQW9CLEVBQUMseUNBQXVCLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztDQUN0RSxDQUFDLENBQUE7QUFFRix5RUFBeUU7QUFDekUsbUVBQW1FO0FBQ25FLHVFQUF1RTtBQUN2RSwyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLHVDQUF1QztBQUN2QyxrQkFBZSxJQUFBLHdCQUFpQixFQUFDO0lBQy9CLE1BQU0sRUFBRTtRQUNOO1lBQ0UsT0FBTyxFQUFFLHdCQUF3QjtZQUNqQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDakIsV0FBVyxFQUFFLENBQUMsSUFBQSwrQkFBd0IsRUFBQyw0Q0FBMEIsQ0FBQyxDQUFDO1NBQ3BFO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsNkNBQTZDO1lBQ3RELE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNqQixXQUFXLEVBQUUsQ0FBQyxJQUFBLCtCQUF3QixFQUFDLDRDQUEwQixDQUFDLENBQUM7U0FDcEU7UUFDRDtZQUNFLE9BQU8sRUFBRSx3REFBd0Q7WUFDakUsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2pCLFdBQVcsRUFBRSxDQUFDLElBQUEsK0JBQXdCLEVB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
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.enforcePasswordPolicy = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const password_policy_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/password-policy");
|
|
6
|
+
/**
|
|
7
|
+
* Runs before Medusa's `emailpass` register and password-update routes (every
|
|
8
|
+
* actor type, so customers and Admin users) and rejects a password shorter
|
|
9
|
+
* than `PASSWORD_MIN_LENGTH` with 400 `invalid_data`. A body without a string
|
|
10
|
+
* password goes on to Medusa unchanged, which answers it itself (register) or
|
|
11
|
+
* changes nothing (update). Login is never checked, so older, shorter
|
|
12
|
+
* passwords keep working.
|
|
13
|
+
*/
|
|
14
|
+
const enforcePasswordPolicy = (req, _res, next) => {
|
|
15
|
+
const password = req.body?.password;
|
|
16
|
+
if (typeof password === "string" && !(0, password_policy_1.isPasswordLongEnough)(password)) {
|
|
17
|
+
next(new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Das Passwort muss mindestens ${password_policy_1.PASSWORD_MIN_LENGTH} Zeichen lang sein.`));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
next();
|
|
21
|
+
};
|
|
22
|
+
exports.enforcePasswordPolicy = enforcePasswordPolicy;
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtcG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS9wYXNzd29yZC1wb2xpY3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EscURBQXVEO0FBQ3ZELCtHQUdrRjtBQUVsRjs7Ozs7OztHQU9HO0FBQ0ksTUFBTSxxQkFBcUIsR0FBRyxDQUNuQyxHQUFrQixFQUNsQixJQUFvQixFQUNwQixJQUF3QixFQUNsQixFQUFFO0lBQ1IsTUFBTSxRQUFRLEdBQUksR0FBRyxDQUFDLElBQTJDLEVBQUUsUUFBUSxDQUFBO0lBQzNFLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBQSxzQ0FBb0IsRUFBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3BFLElBQUksQ0FDRixJQUFJLG1CQUFXLENBQ2IsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixnQ0FBZ0MscUNBQW1CLHFCQUFxQixDQUN6RSxDQUNGLENBQUE7UUFDRCxPQUFNO0lBQ1IsQ0FBQztJQUNELElBQUksRUFBRSxDQUFBO0FBQ1IsQ0FBQyxDQUFBO0FBaEJZLFFBQUEscUJBQXFCLHlCQWdCakMifQ==
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.resolveSmtp = exports.SMTP_BUILD_PLACEHOLDERS = exports.SMTP_ENVIRONMENT_VARIABLES = exports.defineShopEmailConfiguration = exports.createSmtpNotificationModuleConfig = void 0;
|
|
4
|
+
const sender_1 = require("../domain/sender");
|
|
4
5
|
var notification_module_1 = require("./notification-module");
|
|
5
6
|
Object.defineProperty(exports, "createSmtpNotificationModuleConfig", { enumerable: true, get: function () { return notification_module_1.createSmtpNotificationModuleConfig; } });
|
|
6
7
|
const defineShopEmailConfiguration = (configuration) => configuration;
|
|
@@ -63,11 +64,13 @@ const resolveSmtp = (values, allowInsecure) => {
|
|
|
63
64
|
if (port === undefined) {
|
|
64
65
|
throw new TypeError("SMTP_PORT is required.");
|
|
65
66
|
}
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
// A display name is allowed: "Example GmbH <info@example.com>".
|
|
68
|
+
const sender = (0, sender_1.parseEmailSender)(values.SMTP_FROM);
|
|
69
|
+
if (!sender) {
|
|
70
|
+
throw new TypeError('SMTP_FROM must be an email address, optionally as "Name <address>".');
|
|
68
71
|
}
|
|
69
72
|
const smtp = {
|
|
70
|
-
from:
|
|
73
|
+
from: (0, sender_1.formatEmailSender)(sender),
|
|
71
74
|
host: values.SMTP_HOST,
|
|
72
75
|
password: values.SMTP_PASSWORD,
|
|
73
76
|
port,
|
|
@@ -81,4 +84,4 @@ const resolveSmtp = (values, allowInsecure) => {
|
|
|
81
84
|
return smtp;
|
|
82
85
|
};
|
|
83
86
|
exports.resolveSmtp = resolveSmtp;
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZW1haWwvY29uZmlnL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF1RTtBQU12RSw2REFBMkU7QUFBbEUseUlBQUEsa0NBQWtDLE9BQUE7QUFFcEMsTUFBTSw0QkFBNEIsR0FBRyxDQUcxQyxhQUE0QixFQUNiLEVBQUUsQ0FBQyxhQUFhLENBQUM7QUFKckIsUUFBQSw0QkFBNEIsZ0NBSVA7QUFPckIsUUFBQSwwQkFBMEIsR0FBRztJQUN4QyxXQUFXO0lBQ1gsV0FBVztJQUNYLGFBQWE7SUFDYixXQUFXO0lBQ1gsZUFBZTtJQUNmLFdBQVc7SUFDWCxrQkFBa0I7Q0FDVixDQUFDO0FBRVg7Ozs7R0FJRztBQUNVLFFBQUEsdUJBQXVCLEdBQXFDO0lBQ3ZFLFNBQVMsRUFBRSw2QkFBNkI7SUFDeEMsU0FBUyxFQUFFLG9CQUFvQjtJQUMvQixhQUFhLEVBQUUsZ0JBQWdCO0lBQy9CLFNBQVMsRUFBRSxNQUFNO0lBQ2pCLGdCQUFnQixFQUFFLE9BQU87SUFDekIsV0FBVyxFQUFFLE9BQU87SUFDcEIsU0FBUyxFQUFFLFlBQVk7Q0FDeEIsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHLENBQ3BCLE1BQW9ELEVBQ3BELElBQVksRUFDUSxFQUFFO0lBQ3RCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNuQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDbkMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxZQUFZLEdBQUcsQ0FDbkIsTUFBb0QsRUFDcEQsSUFBWSxFQUNaLE9BQWUsRUFDZixPQUFlLEVBQ0ssRUFBRTtJQUN0QixNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFDLElBQUks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
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatEmailSender = exports.parseEmailSender = void 0;
|
|
4
|
+
const emailAddressPattern = /^[^\s@<>"]+@[^\s@<>"]+\.[^\s@<>"]+$/;
|
|
5
|
+
const namedSenderPattern = /^(.*?)\s*<([^<>]*)>$/;
|
|
6
|
+
/**
|
|
7
|
+
* Reads a sender as either a bare address (`info@example.com`) or with a
|
|
8
|
+
* display name (`Example GmbH <info@example.com>`, the name optionally in
|
|
9
|
+
* double quotes). Returns undefined when the address is not valid.
|
|
10
|
+
*/
|
|
11
|
+
const parseEmailSender = (value) => {
|
|
12
|
+
const trimmed = value.trim();
|
|
13
|
+
const named = namedSenderPattern.exec(trimmed);
|
|
14
|
+
const address = (named ? named[2] : trimmed).trim();
|
|
15
|
+
if (!emailAddressPattern.test(address)) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
const name = named?.[1]
|
|
19
|
+
.trim()
|
|
20
|
+
.replace(/^"(.*)"$/, "$1")
|
|
21
|
+
.trim();
|
|
22
|
+
return name ? { address, name } : { address };
|
|
23
|
+
};
|
|
24
|
+
exports.parseEmailSender = parseEmailSender;
|
|
25
|
+
/** Writes the sender for a mail header, quoting the display name. */
|
|
26
|
+
const formatEmailSender = ({ address, name }) => name ? `"${name.replace(/["\\]/g, "\\$&")}" <${address}>` : address;
|
|
27
|
+
exports.formatEmailSender = formatEmailSender;
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VtYWlsL2RvbWFpbi9zZW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EsTUFBTSxtQkFBbUIsR0FBRyxxQ0FBcUMsQ0FBQztBQUNsRSxNQUFNLGtCQUFrQixHQUFHLHNCQUFzQixDQUFDO0FBRWxEOzs7O0dBSUc7QUFDSSxNQUFNLGdCQUFnQixHQUFHLENBQUMsS0FBYSxFQUEyQixFQUFFO0lBQ3pFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixNQUFNLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0MsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDcEIsSUFBSSxFQUFFO1NBQ04sT0FBTyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUM7U0FDekIsSUFBSSxFQUFFLENBQUM7SUFDVixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDaEQsQ0FBQyxDQUFDO0FBYlcsUUFBQSxnQkFBZ0Isb0JBYTNCO0FBRUYscUVBQXFFO0FBQzlELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQWUsRUFBVSxFQUFFLENBQzFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0FBRHpELFFBQUEsaUJBQWlCLHFCQUN3QyJ9
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.SmtpNotificationService = exports.SMTP_TIMEOUTS = void 0;
|
|
7
7
|
const utils_1 = require("@medusajs/framework/utils");
|
|
8
8
|
const nodemailer_1 = __importDefault(require("nodemailer"));
|
|
9
|
+
const sender_1 = require("../../email/domain/sender");
|
|
9
10
|
const service_1 = require("../../modules/email/service");
|
|
10
11
|
const types_1 = require("./types");
|
|
11
12
|
exports.SMTP_TIMEOUTS = {
|
|
@@ -13,7 +14,6 @@ exports.SMTP_TIMEOUTS = {
|
|
|
13
14
|
greeting: 10_000,
|
|
14
15
|
socket: 30_000,
|
|
15
16
|
};
|
|
16
|
-
const emailAddressPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
17
17
|
const connectionFailureCodes = new Set(["ECONNREFUSED", "EDNS"]);
|
|
18
18
|
const invalidOptions = () => {
|
|
19
19
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid SMTP notification provider options.");
|
|
@@ -111,7 +111,7 @@ class SmtpNotificationService extends utils_1.AbstractNotificationProviderServic
|
|
|
111
111
|
}
|
|
112
112
|
const configuration = smtp;
|
|
113
113
|
if (!isNonEmptyString(configuration.from) ||
|
|
114
|
-
!
|
|
114
|
+
!(0, sender_1.parseEmailSender)(configuration.from) ||
|
|
115
115
|
!isNonEmptyString(configuration.host) ||
|
|
116
116
|
!isNonEmptyString(configuration.password) ||
|
|
117
117
|
!Number.isInteger(configuration.port) ||
|
|
@@ -145,7 +145,7 @@ class SmtpNotificationService extends utils_1.AbstractNotificationProviderServic
|
|
|
145
145
|
filename: attachment.filename,
|
|
146
146
|
};
|
|
147
147
|
});
|
|
148
|
-
const from = notification.from &&
|
|
148
|
+
const from = notification.from && (0, sender_1.parseEmailSender)(notification.from)
|
|
149
149
|
? notification.from
|
|
150
150
|
: this.options_.smtp.from;
|
|
151
151
|
const identity = deliveryIdentity(notification);
|
|
@@ -233,4 +233,4 @@ class SmtpNotificationService extends utils_1.AbstractNotificationProviderServic
|
|
|
233
233
|
}
|
|
234
234
|
exports.SmtpNotificationService = SmtpNotificationService;
|
|
235
235
|
SmtpNotificationService.identifier = "smtp";
|
|
236
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
236
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvc210cC9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLHFEQUltQztBQUNuQyw0REFBb0M7QUFFcEMsc0RBQTZEO0FBQzdELHlEQUFxRTtBQUNyRSxtQ0FNaUI7QUFrQ0osUUFBQSxhQUFhLEdBQUc7SUFDM0IsVUFBVSxFQUFFLE1BQU07SUFDbEIsUUFBUSxFQUFFLE1BQU07SUFDaEIsTUFBTSxFQUFFLE1BQU07Q0FDTixDQUFDO0FBRVgsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBRWpFLE1BQU0sY0FBYyxHQUFHLEdBQVUsRUFBRTtJQUNqQyxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qiw2Q0FBNkMsQ0FDOUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxLQUFjLEVBQW1CLEVBQUUsQ0FDM0QsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUVyRCxNQUFNLGdCQUFnQixHQUFHLENBQ3ZCLFlBQTJELEVBQ2xDLEVBQUU7SUFDM0IsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQztJQUNoRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsWUFBWSxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsQ0FBQztJQUMxRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxjQUFjLEdBQUksWUFBaUMsQ0FBQyxFQUFFLENBQUM7SUFDN0QsSUFDRSxDQUFDLFlBQVk7UUFDYixDQUFDLGdCQUFnQixD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
|
package/README.md
CHANGED
|
@@ -39,6 +39,8 @@ packing lists) and S3 file storage, and the turnkey `medusa-config.ts` preset
|
|
|
39
39
|
- Redirects `GET /` to the admin dashboard and repairs dangling
|
|
40
40
|
`cart_promotion` links (see "Root redirect" and "Cart-promotion link
|
|
41
41
|
repair").
|
|
42
|
+
- Requires passwords of at least 15 characters for customers and Admin users
|
|
43
|
+
(see "Password policy").
|
|
42
44
|
- Exports the shop's `medusa-config.ts` helpers from
|
|
43
45
|
`@hartl-services/medusa-base/config` and Sentry's `register()` from
|
|
44
46
|
`@hartl-services/medusa-base/instrumentation` (see "Config helpers" and
|
|
@@ -695,6 +697,30 @@ reverse-proxy rule. The redirect is temporary on purpose: browsers cache a
|
|
|
695
697
|
should `/` ever get real content. A shop that needs its own `/` defines
|
|
696
698
|
`src/api/route.ts` itself.
|
|
697
699
|
|
|
700
|
+
## Password policy
|
|
701
|
+
|
|
702
|
+
Medusa's `emailpass` provider accepts any non-empty password. The base runs a
|
|
703
|
+
middleware on `POST /auth/:actor_type/emailpass/register` (customer sign-up,
|
|
704
|
+
Admin invite) and `POST /auth/:actor_type/emailpass/update` (password reset)
|
|
705
|
+
and answers a password shorter than 15 characters with
|
|
706
|
+
`400 { type: "invalid_data", message: "Das Passwort muss mindestens 15 Zeichen lang sein." }`.
|
|
707
|
+
It applies to every actor type, so customers and Admin users alike. The check
|
|
708
|
+
runs before Medusa's reset-token check, so a rejected password leaves the
|
|
709
|
+
single-use reset link valid for a second attempt.
|
|
710
|
+
|
|
711
|
+
The rule follows NIST SP 800-63B Rev. 4 for a password that is the only
|
|
712
|
+
factor: at least 15 characters, counted as Unicode code points, and no
|
|
713
|
+
composition rules (digits and special characters are allowed, never required).
|
|
714
|
+
The value and the check come from the Contracts package
|
|
715
|
+
(`schemas/password-policy`: `PASSWORD_MIN_LENGTH`, `isPasswordLongEnough`), so
|
|
716
|
+
a storefront validates its forms with the same rule.
|
|
717
|
+
|
|
718
|
+
Login is not checked, so existing shorter passwords keep working until their
|
|
719
|
+
next reset. Accounts created without HTTP (`medusa user`, seed scripts calling
|
|
720
|
+
the Auth module) are not checked either.
|
|
721
|
+
|
|
722
|
+
Nothing to configure.
|
|
723
|
+
|
|
698
724
|
## Cart-promotion link repair
|
|
699
725
|
|
|
700
726
|
Medusa's `deletePromotionsWorkflow` only soft-deletes a promotion and leaves
|
|
@@ -1352,7 +1378,9 @@ deployment variables:
|
|
|
1352
1378
|
build); otherwise `SMTP_SECURE` or `SMTP_REQUIRE_TLS` must be `true`.
|
|
1353
1379
|
|
|
1354
1380
|
Runtime requires `SMTP_HOST`, `SMTP_PORT`, `SMTP_SECURE`, `SMTP_REQUIRE_TLS`,
|
|
1355
|
-
`SMTP_USER`, `SMTP_PASSWORD`, and `SMTP_FROM`. `
|
|
1381
|
+
`SMTP_USER`, `SMTP_PASSWORD`, and `SMTP_FROM`. `SMTP_FROM` is a bare address
|
|
1382
|
+
or carries the sender's display name: `Example GmbH <info@example.com>` (quote
|
|
1383
|
+
the value in a `.env` file). `SMTP_SECURE=true` selects
|
|
1356
1384
|
implicit TLS; `SMTP_REQUIRE_TLS=true` requires STARTTLS. Outside development
|
|
1357
1385
|
and test, at least one must be true. Certificate verification is never
|
|
1358
1386
|
disabled. Development and test may set both to `false` for an isolated local
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.resolveSmtp = exports.SMTP_BUILD_PLACEHOLDERS = exports.SMTP_ENVIRONMENT_VARIABLES = exports.defineShopEmailConfiguration = exports.createSmtpNotificationModuleConfig = void 0;
|
|
4
|
+
const sender_1 = require("../domain/sender");
|
|
4
5
|
var notification_module_1 = require("./notification-module");
|
|
5
6
|
Object.defineProperty(exports, "createSmtpNotificationModuleConfig", { enumerable: true, get: function () { return notification_module_1.createSmtpNotificationModuleConfig; } });
|
|
6
7
|
const defineShopEmailConfiguration = (configuration) => configuration;
|
|
@@ -63,11 +64,13 @@ const resolveSmtp = (values, allowInsecure) => {
|
|
|
63
64
|
if (port === undefined) {
|
|
64
65
|
throw new TypeError("SMTP_PORT is required.");
|
|
65
66
|
}
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
// A display name is allowed: "Example GmbH <info@example.com>".
|
|
68
|
+
const sender = (0, sender_1.parseEmailSender)(values.SMTP_FROM);
|
|
69
|
+
if (!sender) {
|
|
70
|
+
throw new TypeError('SMTP_FROM must be an email address, optionally as "Name <address>".');
|
|
68
71
|
}
|
|
69
72
|
const smtp = {
|
|
70
|
-
from:
|
|
73
|
+
from: (0, sender_1.formatEmailSender)(sender),
|
|
71
74
|
host: values.SMTP_HOST,
|
|
72
75
|
password: values.SMTP_PASSWORD,
|
|
73
76
|
port,
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type EmailSender = {
|
|
2
|
+
address: string;
|
|
3
|
+
name?: string;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Reads a sender as either a bare address (`info@example.com`) or with a
|
|
7
|
+
* display name (`Example GmbH <info@example.com>`, the name optionally in
|
|
8
|
+
* double quotes). Returns undefined when the address is not valid.
|
|
9
|
+
*/
|
|
10
|
+
export declare const parseEmailSender: (value: string) => EmailSender | undefined;
|
|
11
|
+
/** Writes the sender for a mail header, quoting the display name. */
|
|
12
|
+
export declare const formatEmailSender: ({ address, name }: EmailSender) => string;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatEmailSender = exports.parseEmailSender = void 0;
|
|
4
|
+
const emailAddressPattern = /^[^\s@<>"]+@[^\s@<>"]+\.[^\s@<>"]+$/;
|
|
5
|
+
const namedSenderPattern = /^(.*?)\s*<([^<>]*)>$/;
|
|
6
|
+
/**
|
|
7
|
+
* Reads a sender as either a bare address (`info@example.com`) or with a
|
|
8
|
+
* display name (`Example GmbH <info@example.com>`, the name optionally in
|
|
9
|
+
* double quotes). Returns undefined when the address is not valid.
|
|
10
|
+
*/
|
|
11
|
+
const parseEmailSender = (value) => {
|
|
12
|
+
const trimmed = value.trim();
|
|
13
|
+
const named = namedSenderPattern.exec(trimmed);
|
|
14
|
+
const address = (named ? named[2] : trimmed).trim();
|
|
15
|
+
if (!emailAddressPattern.test(address)) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
const name = named?.[1]
|
|
19
|
+
.trim()
|
|
20
|
+
.replace(/^"(.*)"$/, "$1")
|
|
21
|
+
.trim();
|
|
22
|
+
return name ? { address, name } : { address };
|
|
23
|
+
};
|
|
24
|
+
exports.parseEmailSender = parseEmailSender;
|
|
25
|
+
/** Writes the sender for a mail header, quoting the display name. */
|
|
26
|
+
const formatEmailSender = ({ address, name }) => name ? `"${name.replace(/["\\]/g, "\\$&")}" <${address}>` : address;
|
|
27
|
+
exports.formatEmailSender = formatEmailSender;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hartl-services/medusa-base",
|
|
3
|
-
"version": "2.1
|
|
3
|
+
"version": "2.2.1",
|
|
4
4
|
"description": "Base plugin for Hartl Services Medusa shops: per-plugin feature toggles with a generic Admin settings page, a Store endpoint for storefronts, enforcement helpers, the complete-cart hook composition, the root redirect, cart-promotion link repair, the built-in E-Mail, Documents and S3 file storage modules, config helpers with the turnkey food-shop preset, and the Sentry logger wrapper and instrumentation.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"mime-types": "3.0.1",
|
|
89
89
|
"nodemailer": "6.10.1",
|
|
90
90
|
"ulid": "^2.4.0",
|
|
91
|
-
"@hartl-services/medusa-food-supplements-contracts": "^0.
|
|
91
|
+
"@hartl-services/medusa-food-supplements-contracts": "^0.20.0"
|
|
92
92
|
},
|
|
93
93
|
"devDependencies": {
|
|
94
94
|
"@medusajs/admin-sdk": "2.19.0",
|