@hartl-services/medusa-base 2.6.1 → 2.7.0

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 (148) hide show
  1. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/ImageSettingInput.d.ts +3 -2
  2. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/ImageSettingInput.js +4 -4
  3. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginActionsSection.js +4 -4
  4. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginBreadcrumb.d.ts +16 -0
  5. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginBreadcrumb.js +25 -0
  6. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginDetailPage.js +1 -1
  7. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginFeatureSections.d.ts +5 -4
  8. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginFeatureSections.js +8 -5
  9. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginFeaturesCard.d.ts +4 -4
  10. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginFeaturesCard.js +24 -27
  11. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginFeaturesSettingsPage.d.ts +2 -2
  12. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginFeaturesSettingsPage.js +9 -9
  13. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginHubCard.d.ts +5 -1
  14. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginHubCard.js +11 -15
  15. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginPageShell.d.ts +10 -4
  16. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginPageShell.js +10 -5
  17. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginSettingsForm.d.ts +0 -1
  18. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginSettingsForm.js +73 -26
  19. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginStatusChips.d.ts +5 -1
  20. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/PluginStatusChips.js +8 -6
  21. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/ShopMasterDataBanner.d.ts +11 -0
  22. package/.medusa/server/src/admin/admin-components/features/plugin-features/components/ShopMasterDataBanner.js +15 -0
  23. package/.medusa/server/src/admin/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.d.ts +36 -5
  24. package/.medusa/server/src/admin/admin-components/features/plugin-features/hooks/usePluginFeatures.d.ts +144 -20
  25. package/.medusa/server/src/admin/admin-components/features/plugin-features/hooks/usePluginSettingsForm.d.ts +36 -5
  26. package/.medusa/server/src/admin/admin-components/features/plugin-features/hooks/usePluginSwitch.d.ts +15 -0
  27. package/.medusa/server/src/admin/admin-components/features/plugin-features/hooks/usePluginSwitch.js +66 -0
  28. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/plugin-features-admin-client.d.ts +144 -20
  29. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/plugin-view.d.ts +49 -0
  30. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/plugin-view.js +72 -0
  31. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/settings-draft.d.ts +1 -12
  32. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/settings-draft.js +4 -20
  33. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/settings-layout.d.ts +43 -0
  34. package/.medusa/server/src/admin/admin-components/features/plugin-features/lib/settings-layout.js +66 -0
  35. package/.medusa/server/src/admin/admin-components/i18n/texts.d.ts +22 -2
  36. package/.medusa/server/src/admin/admin-components/i18n/texts.js +29 -7
  37. package/.medusa/server/src/admin/admin-components/index.d.ts +12 -0
  38. package/.medusa/server/src/admin/admin-components/index.js +11 -0
  39. package/.medusa/server/src/admin/admin-components/shared/ui/AdminPageHeader.d.ts +22 -0
  40. package/.medusa/server/src/admin/admin-components/shared/ui/AdminPageHeader.js +8 -0
  41. package/.medusa/server/src/admin/admin-components/shared/ui/AdminSection.d.ts +26 -0
  42. package/.medusa/server/src/admin/admin-components/shared/ui/AdminSection.js +12 -0
  43. package/.medusa/server/src/admin/admin-components/shared/ui/BreadcrumbTrail.d.ts +23 -0
  44. package/.medusa/server/src/admin/admin-components/shared/ui/BreadcrumbTrail.js +20 -0
  45. package/.medusa/server/src/admin/admin-components/shared/ui/FileDropField.d.ts +21 -0
  46. package/.medusa/server/src/admin/admin-components/shared/ui/FileDropField.js +33 -0
  47. package/.medusa/server/src/admin/admin-components/shared/ui/FocusModalShell.d.ts +27 -0
  48. package/.medusa/server/src/admin/admin-components/shared/ui/FocusModalShell.js +13 -0
  49. package/.medusa/server/src/admin/admin-components/shared/ui/InfoTooltip.d.ts +13 -0
  50. package/.medusa/server/src/admin/admin-components/shared/ui/InfoTooltip.js +8 -0
  51. package/.medusa/server/src/admin/admin-components/shared/ui/MultiSelectDropdown.d.ts +22 -0
  52. package/.medusa/server/src/admin/admin-components/shared/ui/MultiSelectDropdown.js +14 -0
  53. package/.medusa/server/src/admin/admin-components/shared/ui/PluginIcon.d.ts +10 -0
  54. package/.medusa/server/src/admin/admin-components/shared/ui/PluginIcon.js +10 -0
  55. package/.medusa/server/src/admin/admin-components/shared/ui/SwitchRow.d.ts +27 -0
  56. package/.medusa/server/src/admin/admin-components/shared/ui/SwitchRow.js +15 -0
  57. package/.medusa/server/src/admin/admin-components/shared/ui/WidgetHeader.d.ts +15 -0
  58. package/.medusa/server/src/admin/admin-components/shared/ui/WidgetHeader.js +8 -0
  59. package/.medusa/server/src/admin/admin-components/shared/ui/file-drop.d.ts +13 -0
  60. package/.medusa/server/src/admin/admin-components/shared/ui/file-drop.js +16 -0
  61. package/.medusa/server/src/admin/admin-components/shared/ui/multi-select.d.ts +13 -0
  62. package/.medusa/server/src/admin/admin-components/shared/ui/multi-select.js +11 -0
  63. package/.medusa/server/src/admin/admin-components/shared/ui/plugin-icon.d.ts +12 -0
  64. package/.medusa/server/src/admin/admin-components/shared/ui/plugin-icon.js +29 -0
  65. package/.medusa/server/src/admin/index.js +3118 -2020
  66. package/.medusa/server/src/admin/index.mjs +3121 -2023
  67. package/.medusa/server/src/api/admin-first-login-password-policy.js +56 -0
  68. package/.medusa/server/src/api/answer-actor-type-casing-not-found.js +26 -0
  69. package/.medusa/server/src/api/answer-code-provider-route-not-found.js +34 -0
  70. package/.medusa/server/src/api/code-account-password-routes.js +92 -0
  71. package/.medusa/server/src/api/middlewares.js +82 -17
  72. package/.medusa/server/src/api/password-policy.js +55 -10
  73. package/.medusa/server/src/api/require-login-code-customer-email.js +40 -0
  74. package/.medusa/server/src/api/store/customer-auth/login-code/route.js +17 -0
  75. package/.medusa/server/src/api/store/customer-auth/password-policy/route.js +19 -0
  76. package/.medusa/server/src/customer-auth/application/prepare-code-account-password-reset.js +111 -0
  77. package/.medusa/server/src/customer-auth/application/request-login-code.js +145 -0
  78. package/.medusa/server/src/customer-auth/customer-auth-methods-snapshot.js +55 -0
  79. package/.medusa/server/src/customer-auth/customer-password-policy.js +40 -0
  80. package/.medusa/server/src/customer-auth/domain/account-linking.js +53 -0
  81. package/.medusa/server/src/customer-auth/domain/auth-methods.js +32 -0
  82. package/.medusa/server/src/customer-auth/domain/login-code.js +39 -0
  83. package/.medusa/server/src/customer-auth/login-code-accounts.js +146 -0
  84. package/.medusa/server/src/customer-auth/login-code-state.js +139 -0
  85. package/.medusa/server/src/customer-auth/plugin-features.js +80 -0
  86. package/.medusa/server/src/customer-auth/remove-provider-identity.js +18 -0
  87. package/.medusa/server/src/customer-auth/start-customer-auth-methods.js +20 -0
  88. package/.medusa/server/src/documents/plugin-features.js +8 -2
  89. package/.medusa/server/src/email/application/deliver-ephemeral-auth-mail.js +186 -0
  90. package/.medusa/server/src/email/application/deliver-login-code.js +89 -0
  91. package/.medusa/server/src/email/application/handle-customer-verification-event.js +29 -168
  92. package/.medusa/server/src/email/application/handle-password-reset-event.js +27 -166
  93. package/.medusa/server/src/email/customer-verification-snapshot.js +20 -108
  94. package/.medusa/server/src/email/domain/business-keys.js +15 -2
  95. package/.medusa/server/src/email/plugin-features.js +8 -3
  96. package/.medusa/server/src/email/rendering/default-templates.js +2 -1
  97. package/.medusa/server/src/email/templates/blocks/dynamic-blocks.js +19 -1
  98. package/.medusa/server/src/email/templates/defaults/documents.js +7 -1
  99. package/.medusa/server/src/email/templates/defaults/subjects.js +3 -1
  100. package/.medusa/server/src/email/templates/defaults/texts.js +5 -2
  101. package/.medusa/server/src/email/templates/render.js +2 -1
  102. package/.medusa/server/src/email/templates/sample-data.js +2 -1
  103. package/.medusa/server/src/email/templates/validate.js +8 -3
  104. package/.medusa/server/src/email/types/email-kinds.js +4 -2
  105. package/.medusa/server/src/email/types/template-data.js +9 -1
  106. package/.medusa/server/src/modules/customer-auth/index.js +14 -0
  107. package/.medusa/server/src/modules/customer-auth/service.js +35 -0
  108. package/.medusa/server/src/modules/email/migrations/Migration20261010090000.js +20 -0
  109. package/.medusa/server/src/modules/plugin-features/domain/plugin-settings.js +4 -1
  110. package/.medusa/server/src/modules/plugin-features/service.js +26 -1
  111. package/.medusa/server/src/providers/email-otp/index.js +8 -0
  112. package/.medusa/server/src/providers/email-otp/service.js +96 -0
  113. package/.medusa/server/src/public/descriptor.js +117 -5
  114. package/.medusa/server/src/public/effective-features.js +22 -1
  115. package/.medusa/server/src/public/index.js +4 -2
  116. package/.medusa/server/src/public/plugin-icons.js +28 -0
  117. package/.medusa/server/src/public/shop-master-data.js +33 -14
  118. package/.medusa/server/src/shared/lib/index.js +2 -1
  119. package/.medusa/server/src/shared/lib/refreshing-snapshot.js +122 -0
  120. package/.medusa/server/src/shop-config/build-food-shop-config.js +38 -1
  121. package/README.md +436 -87
  122. package/dist/customer-auth/customer-auth-methods-snapshot.d.ts +25 -0
  123. package/dist/customer-auth/customer-auth-methods-snapshot.js +54 -0
  124. package/dist/customer-auth/domain/auth-methods.d.ts +16 -0
  125. package/dist/customer-auth/domain/auth-methods.js +31 -0
  126. package/dist/customer-auth/plugin-features.d.ts +2 -0
  127. package/dist/customer-auth/plugin-features.js +79 -0
  128. package/dist/email/customer-verification-snapshot.d.ts +3 -15
  129. package/dist/email/customer-verification-snapshot.js +19 -107
  130. package/dist/email/types/email-kinds.d.ts +4 -3
  131. package/dist/email/types/email-kinds.js +3 -1
  132. package/dist/email/types/template-data.d.ts +8 -0
  133. package/dist/email/types/template-data.js +8 -0
  134. package/dist/public/descriptor.js +116 -4
  135. package/dist/public/effective-features.d.ts +10 -0
  136. package/dist/public/effective-features.js +21 -0
  137. package/dist/public/index.d.ts +2 -1
  138. package/dist/public/index.js +3 -1
  139. package/dist/public/plugin-icons.d.ts +7 -0
  140. package/dist/public/plugin-icons.js +27 -0
  141. package/dist/public/shop-master-data.js +32 -13
  142. package/dist/public/types.d.ts +63 -1
  143. package/dist/shared/lib/index.d.ts +1 -0
  144. package/dist/shared/lib/index.js +1 -0
  145. package/dist/shared/lib/refreshing-snapshot.d.ts +52 -0
  146. package/dist/shared/lib/refreshing-snapshot.js +121 -0
  147. package/dist/shop-config/build-food-shop-config.js +37 -0
  148. package/package.json +8 -3
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.enforceAdminPasswordOnFirstLogin = 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
+ const password_policy_2 = require("./password-policy");
7
+ /**
8
+ * An `emailpass` identity is shared by all actor types: somebody invited as an
9
+ * Admin could first register through `/auth/customer/emailpass/register`
10
+ * (customer minimum, possibly 8 characters), then log in at
11
+ * `/auth/user/emailpass` and accept the invite with that token, which binds
12
+ * the weak password to an Admin. So the first Admin login of an identity that
13
+ * has no Admin yet (`app_metadata.user_id` unset) must meet
14
+ * `ADMIN_PASSWORD_POLICY`; the login of an identity that already belongs to an
15
+ * Admin is never checked, so older passwords keep working. An unknown address
16
+ * or a body without strings goes on to Medusa, which rejects it itself.
17
+ * Runs for POST and GET (the core handler reads the body on both) and decides
18
+ * on the decoded, lowercased params, like `enforcePasswordPolicy`.
19
+ *
20
+ * Remaining limit: the other direction is not closed. A customer could
21
+ * register through the Admin path with 15 characters and no composition rules
22
+ * although the shop asks for more; that only weakens their own password.
23
+ */
24
+ const enforceAdminPasswordOnFirstLogin = async (req, _res, next) => {
25
+ if ((0, password_policy_2.decodedRouteParam)(req, "actor_type") !== "user" ||
26
+ (0, password_policy_2.decodedRouteParam)(req, "auth_provider") !== "emailpass") {
27
+ next();
28
+ return;
29
+ }
30
+ const { email, password } = (req.body ?? {});
31
+ if (typeof email !== "string" || typeof password !== "string") {
32
+ next();
33
+ return;
34
+ }
35
+ const message = (0, password_policy_1.unmetPasswordRulesMessage)(password_policy_1.ADMIN_PASSWORD_POLICY, password);
36
+ if (!message) {
37
+ next();
38
+ return;
39
+ }
40
+ const auth = req.scope.resolve(utils_1.Modules.AUTH);
41
+ const [providerIdentity] = await auth.listProviderIdentities({ provider: "emailpass", entity_id: email }, { select: ["id", "auth_identity_id"], take: 1 });
42
+ if (!providerIdentity?.auth_identity_id) {
43
+ next();
44
+ return;
45
+ }
46
+ const authIdentity = await auth.retrieveAuthIdentity(providerIdentity.auth_identity_id, { select: ["id", "app_metadata"] });
47
+ const userId = authIdentity.app_metadata
48
+ ?.user_id;
49
+ if (typeof userId === "string" && userId) {
50
+ next();
51
+ return;
52
+ }
53
+ next(new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, message));
54
+ };
55
+ exports.enforceAdminPasswordOnFirstLogin = enforceAdminPasswordOnFirstLogin;
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4tZmlyc3QtbG9naW4tcGFzc3dvcmQtcG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS9hZG1pbi1maXJzdC1sb2dpbi1wYXNzd29yZC1wb2xpY3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBTUEscURBQWdFO0FBQ2hFLCtHQUdrRjtBQUVsRix1REFBcUQ7QUFFckQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSSxNQUFNLGdDQUFnQyxHQUFHLEtBQUssRUFDbkQsR0FBa0IsRUFDbEIsSUFBb0IsRUFDcEIsSUFBd0IsRUFDVCxFQUFFO0lBQ2pCLElBQ0UsSUFBQSxtQ0FBaUIsRUFBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLEtBQUssTUFBTTtRQUMvQyxJQUFBLG1DQUFpQixFQUFDLEdBQUcsRUFBRSxlQUFlLENBQUMsS0FBSyxXQUFXLEVBQ3ZELENBQUM7UUFDRCxJQUFJLEVBQUUsQ0FBQTtRQUNOLE9BQU07SUFDUixDQUFDO0lBQ0QsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUcxQyxDQUFBO0lBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUQsSUFBSSxFQUFFLENBQUE7UUFDTixPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLElBQUEsMkNBQXlCLEVBQUMsdUNBQXFCLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDMUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsSUFBSSxFQUFFLENBQUE7UUFDTixPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFxQixlQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDaEUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQzFELEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQzNDLEVBQUUsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUNoRCxDQUFBO0lBQ0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLENBQUM7UUFDeEMsSUFBSSxFQUFFLENBQUE7UUFDTixPQUFNO0lBQ1IsQ0FBQztJQUNELE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUNsRCxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFDakMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLEVBQUUsQ0FDbkMsQ0FBQTtJQUNELE1BQU0sTUFBTSxHQUFJLFlBQVksQ0FBQyxZQUE2QztRQUN4RSxFQUFFLE9BQU8sQ0FBQTtJQUNYLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3pDLElBQUksRUFBRSxDQUFBO1FBQ04sT0FBTTtJQUNSLENBQUM7SUFDRCxJQUFJLENBQUMsSUFBSSxtQkFBVyxDQUFDLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO0FBQ2hFLENBQUMsQ0FBQTtBQS9DWSxRQUFBLGdDQUFnQyxvQ0ErQzVDIn0=
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.answerActorTypeCasingNotFound = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const KNOWN_ACTOR_TYPES = new Set(["customer", "user"]);
6
+ /**
7
+ * Medusa's `authMethodsPerActor` is keyed by the exact actor type, but
8
+ * Express routes `/auth/Customer/...` to the same handlers with the actor type
9
+ * "Customer", which has no allowlist and so may use every provider (also
10
+ * `emailpass` while the shop switched it off for customers). A known actor
11
+ * type spelled in another letter case therefore answers 404 for every
12
+ * `/auth/:actor_type/:auth_provider[/...]` route. Any other value (`token`,
13
+ * `session`, `verification`, `mfa`, ...) passes untouched: only a value that
14
+ * differs from `customer` or `user` in letter case alone is refused. No
15
+ * `methods` on the matcher, so it runs before Medusa's own handlers.
16
+ */
17
+ const answerActorTypeCasingNotFound = (req, _res, next) => {
18
+ const actorType = String(req.params?.actor_type ?? "");
19
+ if (KNOWN_ACTOR_TYPES.has(actorType.toLowerCase()) && !KNOWN_ACTOR_TYPES.has(actorType)) {
20
+ next(new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Not Found"));
21
+ return;
22
+ }
23
+ next();
24
+ };
25
+ exports.answerActorTypeCasingNotFound = answerActorTypeCasingNotFound;
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5zd2VyLWFjdG9yLXR5cGUtY2FzaW5nLW5vdC1mb3VuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcGkvYW5zd2VyLWFjdG9yLXR5cGUtY2FzaW5nLW5vdC1mb3VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSxxREFBdUQ7QUFFdkQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO0FBRXZEOzs7Ozs7Ozs7O0dBVUc7QUFDSSxNQUFNLDZCQUE2QixHQUFHLENBQzNDLEdBQWtCLEVBQ2xCLElBQW9CLEVBQ3BCLElBQXdCLEVBQ2xCLEVBQUU7SUFDUixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLENBQUE7SUFDdEQsSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUN4RixJQUFJLENBQUMsSUFBSSxtQkFBVyxDQUFDLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBQy9ELE9BQU07SUFDUixDQUFDO0lBQ0QsSUFBSSxFQUFFLENBQUE7QUFDUixDQUFDLENBQUE7QUFYWSxRQUFBLDZCQUE2QixpQ0FXekMifQ==
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.answerCodeProviderRouteNotFound = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const customer_auth_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/customer-auth");
6
+ const UNSUPPORTED_ACTIONS = new Set([
7
+ "register",
8
+ "update",
9
+ "reset-password",
10
+ "callback",
11
+ ]);
12
+ /**
13
+ * The `email-otp` auth provider only logs in: Medusa's other
14
+ * `/auth/:actor_type/:auth_provider/*` routes (register, update,
15
+ * reset-password, callback) would only call provider methods it does not
16
+ * implement, and `reset-password` would even create a reset token row for a
17
+ * code identity before failing. Registered without `methods` on
18
+ * `/auth/:actor_type/:auth_provider/:action`, so it runs before the core
19
+ * handlers for every method. It compares the decoded params, because Express
20
+ * matches literal path segments against the raw path: a literal
21
+ * `/email-otp/` matcher would miss `/email%2Dotp/`, which the core route
22
+ * still decodes to `email-otp`.
23
+ */
24
+ const answerCodeProviderRouteNotFound = (req, _res, next) => {
25
+ const provider = String(req.params.auth_provider ?? "").toLowerCase();
26
+ const action = String(req.params.action ?? "").toLowerCase();
27
+ if (provider === customer_auth_1.EMAIL_OTP_AUTH_PROVIDER && UNSUPPORTED_ACTIONS.has(action)) {
28
+ next(new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Not Found"));
29
+ return;
30
+ }
31
+ next();
32
+ };
33
+ exports.answerCodeProviderRouteNotFound = answerCodeProviderRouteNotFound;
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5zd2VyLWNvZGUtcHJvdmlkZXItcm91dGUtbm90LWZvdW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS9hbnN3ZXItY29kZS1wcm92aWRlci1yb3V0ZS1ub3QtZm91bmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EscURBQXVEO0FBQ3ZELDJHQUFpSDtBQUVqSCxNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ2xDLFVBQVU7SUFDVixRQUFRO0lBQ1IsZ0JBQWdCO0lBQ2hCLFVBQVU7Q0FDWCxDQUFDLENBQUE7QUFFRjs7Ozs7Ozs7Ozs7R0FXRztBQUNJLE1BQU0sK0JBQStCLEdBQUcsQ0FDN0MsR0FBa0IsRUFDbEIsSUFBb0IsRUFDcEIsSUFBd0IsRUFDbEIsRUFBRTtJQUNSLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNyRSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDNUQsSUFBSSxRQUFRLEtBQUssdUNBQXVCLElBQUksbUJBQW1CLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDNUUsSUFBSSxDQUFDLElBQUksbUJBQVcsQ0FBQyxtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQTtRQUMvRCxPQUFNO0lBQ1IsQ0FBQztJQUNELElBQUksRUFBRSxDQUFBO0FBQ1IsQ0FBQyxDQUFBO0FBWlksUUFBQSwrQkFBK0IsbUNBWTNDIn0=
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rejectRegistrationForExistingCustomerAccount = exports.prepareCodeAccountPasswordResetRoute = exports.EXISTING_CUSTOMER_ACCOUNT_MESSAGE = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const customer_auth_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/customer-auth");
6
+ const prepare_code_account_password_reset_1 = require("../customer-auth/application/prepare-code-account-password-reset");
7
+ const auth_methods_1 = require("../customer-auth/domain/auth-methods");
8
+ const login_code_accounts_1 = require("../customer-auth/login-code-accounts");
9
+ const plugin_features_1 = require("../customer-auth/plugin-features");
10
+ const enforcement_1 = require("../public/enforcement");
11
+ const password_policy_1 = require("./password-policy");
12
+ exports.EXISTING_CUSTOMER_ACCOUNT_MESSAGE = "Zu dieser E-Mail-Adresse gibt es bereits ein Kundenkonto. Melde dich an oder setze über „Passwort vergessen?“ ein Passwort.";
13
+ /** Whether the request is `<method> /auth/customer/emailpass/<action>` (decoded, any letter case). */
14
+ const isCustomerPasswordRoute = (req, method, action) => req.method === method &&
15
+ (0, password_policy_1.decodedRouteParam)(req, "actor_type") === "customer" &&
16
+ (0, password_policy_1.decodedRouteParam)(req, "auth_provider") === auth_methods_1.EMAIL_PASSWORD_AUTH_PROVIDER &&
17
+ (0, password_policy_1.decodedRouteParam)(req, "action") === action;
18
+ const isEmailPasswordEnabled = (container) => (0, enforcement_1.isPluginFeatureEnabled)(container, plugin_features_1.customerAuthPluginFeatures, customer_auth_1.CUSTOMER_AUTH_FEATURES.emailPassword);
19
+ /** Class only: the message of an error can carry the address. */
20
+ const warnFailSafe = (container, what, error) => {
21
+ try {
22
+ container
23
+ .resolve(utils_1.ContainerRegistrationKeys.LOGGER)
24
+ .warn(`${what} (${error instanceof Error ? error.name : "unknown error"}); the request goes on unchanged.`);
25
+ }
26
+ catch {
27
+ // A broken logger must not turn into a failed request.
28
+ }
29
+ };
30
+ /**
31
+ * `POST /auth/customer/emailpass/reset-password` for an account that so far
32
+ * only used codes (see `prepareCodeAccountPasswordReset`): gives it the
33
+ * password identity Medusa's reset flow needs and rewrites the identifier to
34
+ * the spelling Medusa has to look up. Only while `email_password` is on. Fail
35
+ * safe: whatever goes wrong here, the request continues unchanged (Medusa
36
+ * answers 201 for unknown identifiers anyway). No `methods` on the matcher
37
+ * (`/auth/:actor_type/:auth_provider/:action`), so it runs before the core
38
+ * validators and decides on the decoded, lowercased params.
39
+ */
40
+ const prepareCodeAccountPasswordResetRoute = async (req, _res, next) => {
41
+ const body = req.body;
42
+ if (!isCustomerPasswordRoute(req, "POST", "reset-password") ||
43
+ typeof body?.identifier !== "string") {
44
+ next();
45
+ return;
46
+ }
47
+ try {
48
+ if (await isEmailPasswordEnabled(req.scope)) {
49
+ const identifier = await (0, prepare_code_account_password_reset_1.prepareCodeAccountPasswordReset)(req.scope, body.identifier);
50
+ if (identifier) {
51
+ body.identifier = identifier;
52
+ }
53
+ }
54
+ }
55
+ catch (error) {
56
+ warnFailSafe(req.scope, "The password reset of a code account could not be prepared", error);
57
+ }
58
+ next();
59
+ };
60
+ exports.prepareCodeAccountPasswordResetRoute = prepareCodeAccountPasswordResetRoute;
61
+ /**
62
+ * `POST /auth/customer/emailpass/register` for an address that already has a
63
+ * customer account (a password account, or one that only used codes): 400 with
64
+ * a pointer to "Passwort vergessen". A new password identity beside a code
65
+ * account would only be a customer-less orphan Medusa cannot use (its own
66
+ * answer for an existing password account is the same refusal, so the
67
+ * existence of an account is not new information). Only while `email_password`
68
+ * is on; fail safe like the reset preparation.
69
+ */
70
+ const rejectRegistrationForExistingCustomerAccount = async (req, _res, next) => {
71
+ const email = req.body?.email;
72
+ if (!isCustomerPasswordRoute(req, "POST", "register") || typeof email !== "string") {
73
+ next();
74
+ return;
75
+ }
76
+ let exists = false;
77
+ try {
78
+ exists =
79
+ (await isEmailPasswordEnabled(req.scope)) &&
80
+ (await (0, login_code_accounts_1.hasCustomerAccountIdentity)(req.scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION), (0, customer_auth_1.normalizeLoginEmail)(email)));
81
+ }
82
+ catch (error) {
83
+ warnFailSafe(req.scope, "The registration could not be checked for an existing account", error);
84
+ }
85
+ if (exists) {
86
+ next(new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, exports.EXISTING_CUSTOMER_ACCOUNT_MESSAGE));
87
+ return;
88
+ }
89
+ next();
90
+ };
91
+ exports.rejectRegistrationForExistingCustomerAccount = rejectRegistrationForExistingCustomerAccount;
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1hY2NvdW50LXBhc3N3b3JkLXJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcGkvY29kZS1hY2NvdW50LXBhc3N3b3JkLXJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFNQSxxREFBa0Y7QUFDbEYsMkdBR2dGO0FBRWhGLDBIQUFrSDtBQUNsSCx1RUFBbUY7QUFDbkYsOEVBQWlGO0FBRWpGLHNFQUE2RTtBQUM3RSx1REFBOEQ7QUFDOUQsdURBQXFEO0FBRXhDLFFBQUEsaUNBQWlDLEdBQzVDLDZIQUE2SCxDQUFBO0FBRS9ILHNHQUFzRztBQUN0RyxNQUFNLHVCQUF1QixHQUFHLENBQzlCLEdBQWtCLEVBQ2xCLE1BQWMsRUFDZCxNQUFjLEVBQ0wsRUFBRSxDQUNYLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTTtJQUNyQixJQUFBLG1DQUFpQixFQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsS0FBSyxVQUFVO0lBQ25ELElBQUEsbUNBQWlCLEVBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBQyxLQUFLLDJDQUE0QjtJQUN4RSxJQUFBLG1DQUFpQixFQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsS0FBSyxNQUFNLENBQUE7QUFFN0MsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLFNBQTBCLEVBQW9CLEVBQUUsQ0FDOUUsSUFBQSxvQ0FBc0IsRUFDcEIsU0FBUyxFQUNULDRDQUEwQixFQUMxQixzQ0FBc0IsQ0FBQyxhQUFhLENBQ3JDLENBQUE7QUFFSCxpRUFBaUU7QUFDakUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxTQUEwQixFQUFFLElBQVksRUFBRSxLQUFjLEVBQUUsRUFBRTtJQUNoRixJQUFJLENBQUM7UUFDSCxTQUFTO2FBQ04sT0FBTyxDQUFTLGlDQUF5QixDQUFDLE1BQU0sQ0FBQzthQUNqRCxJQUFJLENBQ0gsR0FBRyxJQUFJLEtBQUssS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxD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
@@ -4,18 +4,26 @@ const http_1 = require("@medusajs/framework/http");
4
4
  const plugin_features_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/plugin-features");
5
5
  const documents_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/documents");
6
6
  const email_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/email");
7
+ const customer_auth_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/customer-auth");
7
8
  const customer_verification_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/customer-verification");
8
9
  const files_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/files");
9
- const plugin_features_2 = require("../documents/plugin-features");
10
- const plugin_features_3 = require("../email/plugin-features");
10
+ const plugin_features_2 = require("../customer-auth/plugin-features");
11
+ const plugin_features_3 = require("../documents/plugin-features");
12
+ const plugin_features_4 = require("../email/plugin-features");
11
13
  const customer_verification_request_throttle_1 = require("./customer-verification-request-throttle");
14
+ const answer_code_provider_route_not_found_1 = require("./answer-code-provider-route-not-found");
15
+ const answer_actor_type_casing_not_found_1 = require("./answer-actor-type-casing-not-found");
16
+ const admin_first_login_password_policy_1 = require("./admin-first-login-password-policy");
17
+ const code_account_password_routes_1 = require("./code-account-password-routes");
12
18
  const password_policy_1 = require("./password-policy");
19
+ const require_login_code_customer_email_1 = require("./require-login-code-customer-email");
13
20
  const public_1 = require("../public");
14
21
  /**
15
22
  * Feature-toggle gate for the Documents routes (see `pluginFeatureGate`): a
16
23
  * disabled feature answers 404 for the route and everything below it.
17
24
  */
18
- const documentsGate = (0, public_1.pluginFeatureGate)(plugin_features_2.documentsPluginFeatures);
25
+ const documentsGate = (0, public_1.pluginFeatureGate)(plugin_features_3.documentsPluginFeatures);
26
+ const customerAuthGate = (0, public_1.pluginFeatureGate)(plugin_features_2.customerAuthPluginFeatures);
19
27
  // Authentication: Medusa authenticates every /admin route (actor "user";
20
28
  // bearer, session or secret API key) before plugin middlewares run
21
29
  // (framework 2.19.0 http/router.js), so no second `authenticate` here.
@@ -57,7 +65,7 @@ exports.default = (0, http_1.defineMiddlewares)({
57
65
  // confirmation switch below, which belongs to `order_mails`.
58
66
  {
59
67
  matcher: "/admin/email",
60
- middlewares: [(0, public_1.requirePluginFeature)(plugin_features_3.emailPluginFeatures)],
68
+ middlewares: [(0, public_1.requirePluginFeature)(plugin_features_4.emailPluginFeatures)],
61
69
  },
62
70
  {
63
71
  matcher: "/admin/email/messages",
@@ -174,7 +182,7 @@ exports.default = (0, http_1.defineMiddlewares)({
174
182
  // see workflows/hooks/draft-order-confirmation-default.ts).
175
183
  {
176
184
  matcher: "/admin/draft-orders/:id/order-confirmation",
177
- middlewares: [(0, public_1.requirePluginFeature)(plugin_features_3.emailPluginFeatures, "order_mails")],
185
+ middlewares: [(0, public_1.requirePluginFeature)(plugin_features_4.emailPluginFeatures, "order_mails")],
178
186
  },
179
187
  {
180
188
  matcher: "/admin/draft-orders/:id/order-confirmation",
@@ -190,7 +198,7 @@ exports.default = (0, http_1.defineMiddlewares)({
190
198
  {
191
199
  matcher: "/store/customer-verification",
192
200
  middlewares: [
193
- (0, public_1.requirePluginFeature)(plugin_features_3.emailPluginFeatures, "account_mails", "customer_verification"),
201
+ (0, public_1.requirePluginFeature)(plugin_features_4.emailPluginFeatures, "account_mails", "customer_verification"),
194
202
  ],
195
203
  },
196
204
  {
@@ -211,19 +219,76 @@ exports.default = (0, http_1.defineMiddlewares)({
211
219
  customer_verification_request_throttle_1.throttleCustomerVerificationRequest,
212
220
  ],
213
221
  },
214
- // Password policy for customers and Admin users: registration (sign-up
215
- // and Admin invite) and the password reset. Without `methods` the entry
216
- // is an `app.use` prefix match that runs before Medusa's method-specific
217
- // entries, so a rejected password never consumes the single-use reset
218
- // token (Medusa's `validateToken` deletes it on the update route). Both
219
- // paths only exist for POST.
222
+ // --- Kunden-Login ---------------------------------------------------
223
+ // The code request answers 404 while `email_otp` is off. The gate has no
224
+ // `methods`, so it runs before the method-specific entry below. Public
225
+ // by design (the customer has no token yet); the 60 s limit per address
226
+ // and the uniform 202 answer live in the use case.
227
+ customerAuthGate("/store/customer-auth/login-code", customer_auth_1.CUSTOMER_AUTH_FEATURES.emailOtp),
220
228
  {
221
- matcher: "/auth/:actor_type/emailpass/register",
222
- middlewares: [password_policy_1.enforcePasswordPolicy],
229
+ matcher: "/store/customer-auth/login-code",
230
+ methods: ["POST"],
231
+ middlewares: [(0, http_1.validateAndTransformBody)(customer_auth_1.RequestLoginCodeSchema)],
232
+ },
233
+ // The password rules customers have to meet (shown by the storefront at
234
+ // registration and reset); 404 while `email_password` is off. Public.
235
+ customerAuthGate("/store/customer-auth/password-policy", customer_auth_1.CUSTOMER_AUTH_FEATURES.emailPassword),
236
+ // A code-login token may only create the customer of the address it was
237
+ // issued for (see the middleware). Medusa's own entry for this matcher
238
+ // runs first (core routes load before plugin routes); authentication is
239
+ // repeated so the check never depends on that order.
240
+ {
241
+ matcher: "/store/customers",
242
+ methods: ["POST"],
243
+ middlewares: [
244
+ (0, http_1.authenticate)("customer", ["session", "bearer"], {
245
+ allowUnregistered: true,
246
+ }),
247
+ require_login_code_customer_email_1.requireLoginCodeCustomerEmail,
248
+ ],
249
+ },
250
+ // A known actor type in another letter case (`/auth/Customer/...`) would
251
+ // reach Medusa's handlers without the allowlist of `customer`: 404. No
252
+ // `methods` (prefix match), decided on the decoded param; `token`,
253
+ // `session`, `verification` and `mfa` are none of the two and pass.
254
+ {
255
+ matcher: "/auth/:actor_type/:auth_provider",
256
+ middlewares: [answer_actor_type_casing_not_found_1.answerActorTypeCasingNotFound],
257
+ },
258
+ // The `/auth/:actor_type/:auth_provider/:action` entry below has no
259
+ // `methods`, so it is an `app.use` prefix match that runs before Medusa's
260
+ // own handlers and validators (`validateToken` deletes the single-use
261
+ // reset token on the update route, so a rejected password has to be
262
+ // refused before it). Every middleware in it decides on the decoded,
263
+ // lowercased params itself: Express matches literal path segments against
264
+ // the raw path, so a literal `/emailpass/register` or `/email-otp/`
265
+ // matcher would miss `/email%70ass/register` or `/email%2Dotp/`, which the
266
+ // core route still decodes.
267
+ // - The code login provider has no register, update, reset-password or
268
+ // callback: those routes answer 404 for every actor type and method.
269
+ // - Registering a password for an address that already has a customer
270
+ // account is refused (see the middleware).
271
+ // - A password reset for an account that only used codes gets the
272
+ // password identity Medusa's reset flow needs.
273
+ // - Password policy (customers: `customer_auth` settings, Admin users:
274
+ // fixed 15 characters) for the registration (sign-up and Admin invite)
275
+ // and the password update of the reset.
276
+ {
277
+ matcher: "/auth/:actor_type/:auth_provider/:action",
278
+ middlewares: [
279
+ answer_code_provider_route_not_found_1.answerCodeProviderRouteNotFound,
280
+ code_account_password_routes_1.rejectRegistrationForExistingCustomerAccount,
281
+ code_account_password_routes_1.prepareCodeAccountPasswordResetRoute,
282
+ password_policy_1.enforcePasswordPolicy,
283
+ ],
223
284
  },
285
+ // First Admin login of an identity that has no Admin yet: the password
286
+ // must meet the Admin rules (see the middleware). Login is exact-path
287
+ // (`POST` and `GET`), the check runs before the core handler.
224
288
  {
225
- matcher: "/auth/:actor_type/emailpass/update",
226
- middlewares: [password_policy_1.enforcePasswordPolicy],
289
+ matcher: "/auth/:actor_type/:auth_provider",
290
+ methods: ["POST", "GET"],
291
+ middlewares: [admin_first_login_password_policy_1.enforceAdminPasswordOnFirstLogin],
227
292
  },
228
293
  // --- Dokumente ------------------------------------------------------
229
294
  // Feature-toggle gates (see plugin-features.ts). They cover every
@@ -320,4 +385,4 @@ exports.default = (0, http_1.defineMiddlewares)({
320
385
  },
321
386
  ],
322
387
  });
323
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBS2lDO0FBQ2pDLCtHQUtrRjtBQUNsRixtR0FHNEU7QUFDNUUsMkZBWXdFO0FBQ3hFLDJIQUFrSTtBQUNsSSwyRkFBdUg7QUFFdkgsa0VBQXNFO0FBQ3RFLDhEQUE4RDtBQUM5RCxxR0FBOEY7QUFDOUYsdURBQXlEO0FBQ3pELHNDQUFtRTtBQUVuRTs7O0dBR0c7QUFDSCxNQUFNLGFBQWEsR0FBRyxJQUFBLDBCQUFpQixFQUFDLHlDQUF1QixDQUFDLENBQUE7QUFFaEUseUVBQXlFO0FBQ3pFLG1FQUFtRTtBQUNuRSx1RUFBdUU7QUFDdkUsMkVBQTJFO0FBQzNFLDBFQUEwRTtBQUMxRSx1Q0FBdUM7QUFDdkMsa0JBQWUsSUFBQSx3QkFBaUIsRUFBQztJQUMvQixNQUFNLEVBQUU7UUFDTjtZQUNFLE9BQU8sRUFBRSx3QkFBd0I7WUFDakMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2pCLFdBQVcsRUFBRSxDQUFDLElBQUEsK0JBQXdCLEVBQUMsNENBQTBCLENBQUMsQ0FBQztTQUNwRTtRQUNEO1lBQ0UsT0FBTyxFQUFFLDZDQUE2QztZQUN0RCxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDakIsV0FBVyxFQUFFLENBQUMsSUFBQSwrQkFBd0IsRUFBQyw0Q0FBMEIsQ0FBQyxDQUFDO1NBQ3BFO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsd0RBQXdEO1lBQ2pFLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNqQixXQUFXLEVBQUUsQ0FBQyxJQUFBLCtCQUF3QixFQUFDLHVDQUFxQixDQUFDLENBQUM7U0FDL0Q7UUFDRDtZQUNFLE9BQU8sRUFBRSw2REFBNkQ7WUFDdEUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hCLFdBQVcsRUFBRTtnQkFDWCxJQUFB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
388
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBS2lDO0FBQ2pDLCtHQUtrRjtBQUNsRixtR0FHNEU7QUFDNUUsMkZBWXdFO0FBQ3hFLDJHQUdnRjtBQUNoRiwySEFBa0k7QUFDbEksMkZBQXVIO0FBRXZILHNFQUE2RTtBQUM3RSxrRUFBc0U7QUFDdEUsOERBQThEO0FBQzlELHFHQUE4RjtBQUM5RixpR0FBd0Y7QUFDeEYsNkZBQW9GO0FBQ3BGLDJGQUFzRjtBQUN0RixpRkFHdUM7QUFDdkMsdURBQXlEO0FBQ3pELDJGQUFtRjtBQUNuRixzQ0FBbUU7QUFFbkU7OztHQUdHO0FBQ0gsTUFBTSxhQUFhLEdBQUcsSUFBQSwwQkFBaUIsRUFBQyx5Q0FBdUIsQ0FBQyxDQUFBO0FBQ2hFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSwwQkFBaUIsRUFBQyw0Q0FBMEIsQ0FBQyxDQUFBO0FBRXRFLHlFQUF5RTtBQUN6RSxtRUFBbUU7QUFDbkUsdUVBQXVFO0FBQ3ZFLDJFQUEyRTtBQUMzRSwwRUFBMEU7QUFDMUUsdUNBQXVDO0FBQ3ZDLGtCQUFlLElBQUEsd0JBQWlCLEVBQUM7SUFDL0IsTUFBTSxFQUFFO1FBQ047WUFDRSxPQUFPLEVBQUUsd0JBQXdCO1lBQ2pDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNqQixXQUFXLEVBQUUsQ0FBQyxJQUFBLCtCQUF3QixFQUFDLDRDQUEwQixDQUFDLENBQUM7U0FDcEU7UUFDRDtZQUNFLE9BQU8sRUFBRSw2Q0FBNkM7WUFDdEQsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2pCLFdBQVcsRUFBRSxDQUFDLElBQUEsK0JBQXdCLEVBQUMsNENBQTBCLENBQUMsQ0FBQztTQUNwRTtRQUNEO1lBQ0UsT0FBTyxFQUFFLHdEQUF3RDtZQUNqRSxPQUFPLEVBQUUsQ0FBQyxNQUFNLENB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
@@ -1,23 +1,68 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.enforcePasswordPolicy = void 0;
3
+ exports.enforcePasswordPolicy = exports.passwordPolicyFor = exports.decodedRouteParam = void 0;
4
4
  const utils_1 = require("@medusajs/framework/utils");
5
5
  const password_policy_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/password-policy");
6
+ const customer_password_policy_1 = require("../customer-auth/customer-password-policy");
7
+ /** Medusa's password provider; its routes are the ones the policy guards. */
8
+ const EMAIL_PASSWORD_PROVIDER = "emailpass";
9
+ const POLICY_ACTIONS = new Set(["register", "update"]);
10
+ /** A route param as Express decoded it, lowercased (Express matches case-insensitively). */
11
+ const decodedRouteParam = (req, name) => String(req.params?.[name] ?? "").toLowerCase();
12
+ exports.decodedRouteParam = decodedRouteParam;
13
+ /**
14
+ * Policy of the actor: the settings-based rules for customers, the fixed
15
+ * Admin rules for every other actor type. A failed settings read falls back
16
+ * to the default policy (and is logged) instead of blocking registrations.
17
+ */
18
+ const passwordPolicyFor = async (req) => {
19
+ if ((0, exports.decodedRouteParam)(req, "actor_type") !== "customer") {
20
+ return password_policy_1.ADMIN_PASSWORD_POLICY;
21
+ }
22
+ try {
23
+ return await (0, customer_password_policy_1.resolveCustomerPasswordPolicy)(req.scope);
24
+ }
25
+ catch (error) {
26
+ req.scope
27
+ .resolve(utils_1.ContainerRegistrationKeys.LOGGER)
28
+ .warn(`Customer password policy could not be read, using the default: ${error instanceof Error ? error.message : String(error)}`);
29
+ return password_policy_1.DEFAULT_CUSTOMER_PASSWORD_POLICY;
30
+ }
31
+ };
32
+ exports.passwordPolicyFor = passwordPolicyFor;
6
33
  /**
7
34
  * 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.
35
+ * actor type) and rejects a password that breaks the actor's rules with 400
36
+ * `invalid_data` and one message naming the unmet rules. Customers follow the
37
+ * `customer_auth` settings; every other actor (Admin users) the fixed
38
+ * `ADMIN_PASSWORD_POLICY`. A body without a string password goes on to Medusa
39
+ * unchanged, which answers it itself (register) or changes nothing (update).
40
+ * Login is never checked, so older passwords keep working.
41
+ *
42
+ * Registered without `methods` on `/auth/:actor_type/:auth_provider/:action`
43
+ * and deciding on the decoded, lowercased params: Express matches literal path
44
+ * segments against the raw path, so literal `/emailpass/register` matchers
45
+ * would miss `/email%70ass/register`, which Medusa's core route still decodes
46
+ * to `emailpass` (and `Customer` is an actor type of its own to Express, but
47
+ * not to this policy).
13
48
  */
14
- const enforcePasswordPolicy = (req, _res, next) => {
49
+ const enforcePasswordPolicy = async (req, _res, next) => {
50
+ if ((0, exports.decodedRouteParam)(req, "auth_provider") !== EMAIL_PASSWORD_PROVIDER ||
51
+ !POLICY_ACTIONS.has((0, exports.decodedRouteParam)(req, "action"))) {
52
+ next();
53
+ return;
54
+ }
15
55
  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.`));
56
+ if (typeof password !== "string") {
57
+ next();
58
+ return;
59
+ }
60
+ const message = (0, password_policy_1.unmetPasswordRulesMessage)(await (0, exports.passwordPolicyFor)(req), password);
61
+ if (message) {
62
+ next(new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, message));
18
63
  return;
19
64
  }
20
65
  next();
21
66
  };
22
67
  exports.enforcePasswordPolicy = enforcePasswordPolicy;
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtcG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS9wYXNzd29yZC1wb2xpY3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EscURBQXVEO0FBQ3ZELCtHQUdrRjtBQUVsRjs7Ozs7OztHQU9HO0FBQ0ksTUFBTSxxQkFBcUIsR0FBRyxDQUNuQyxHQUFrQixFQUNsQixJQUFvQixFQUNwQixJQUF3QixFQUNsQixFQUFFO0lBQ1IsTUFBTSxRQUFRLEdBQUksR0FBRyxDQUFDLElBQTJDLEVBQUUsUUFBUSxDQUFBO0lBQzNFLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBQSxzQ0FBb0IsRUFBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3BFLElBQUksQ0FDRixJQUFJLG1CQUFXLENBQ2IsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixnQ0FBZ0MscUNBQW1CLHFCQUFxQixDQUN6RSxDQUNGLENBQUE7UUFDRCxPQUFNO0lBQ1IsQ0FBQztJQUNELElBQUksRUFBRSxDQUFBO0FBQ1IsQ0FBQyxDQUFBO0FBaEJZLFFBQUEscUJBQXFCLHlCQWdCakMifQ==
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtcG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS9wYXNzd29yZC1wb2xpY3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EscURBQWtGO0FBQ2xGLCtHQUtrRjtBQUVsRix3RkFBeUY7QUFFekYsNkVBQTZFO0FBQzdFLE1BQU0sdUJBQXVCLEdBQUcsV0FBVyxDQUFBO0FBQzNDLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7QUFFdEQsNEZBQTRGO0FBQ3JGLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxHQUFrQixFQUFFLElBQVksRUFBVSxFQUFFLENBQzVFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7QUFEbkMsUUFBQSxpQkFBaUIscUJBQ2tCO0FBRWhEOzs7O0dBSUc7QUFDSSxNQUFNLGlCQUFpQixHQUFHLEtBQUssRUFDcEMsR0FBa0IsRUFDZSxFQUFFO0lBQ25DLElBQUksSUFBQSx5QkFBaUIsRUFBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDeEQsT0FBTyx1Q0FBcUIsQ0FBQTtJQUM5QixDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLElBQUEsd0RBQTZCLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3ZELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsR0FBRyxDQUFDLEtBQUs7YUFDTixPQUFPLENBQ04saUNBQXlCLENBQUMsTUFBTSxDQUNqQzthQUNBLElBQUksQ0FDSCxrRUFDRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUN2RCxFQUFFLENBQ0gsQ0FBQTtRQUNILE9BQU8sa0RBQWdDLENBQUE7SUFDekMsQ0FBQztBQUNILENBQUMsQ0FBQTtBQXBCWSxRQUFBLGlCQUFpQixxQkFvQjdCO0FBRUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0ksTUFBTSxxQkFBcUIsR0FBRyxLQUFLLEVBQ3hDLEdBQWtCLEVBQ2xCLElBQW9CLEVBQ3BCLElBQXdCLEVBQ1QsRUFBRTtJQUNqQixJQUNFLElBQUEseUJBQWlCLEVBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBQyxLQUFLLHVCQUF1QjtRQUNuRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBQSx5QkFBaUIsRUFBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFDckQsQ0FBQztRQUNELElBQUksRUFBRSxDQUFBO1FBQ04sT0FBTTtJQUNSLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBSSxHQUFHLENBQUMsSUFBMkMsRUFBRSxRQUFRLENBQUE7SUFDM0UsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNqQyxJQUFJLEVBQUUsQ0FBQTtRQUNOLE9BQU07SUFDUixDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsSUFBQSwyQ0FBeUIsRUFDdkMsTUFBTSxJQUFBLHlCQUFpQixFQUFDLEdBQUcsQ0FBQyxFQUM1QixRQUFRLENBQ1QsQ0FBQTtJQUNELElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixJQUFJLENBQUMsSUFBSSxtQkFBVyxDQUFDLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBQzlELE9BQU07SUFDUixDQUFDO0lBQ0QsSUFBSSxFQUFFLENBQUE7QUFDUixDQUFDLENBQUE7QUEzQlksUUFBQSxxQkFBcUIseUJBMkJqQyJ9
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requireLoginCodeCustomerEmail = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const customer_auth_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/customer-auth");
6
+ const MISMATCH_MESSAGE = "Die E-Mail-Adresse des Kontos muss der Adresse entsprechen, für die der Anmeldecode angefordert wurde.";
7
+ /**
8
+ * `POST /store/customers` with a code-login token: the customer's e-mail
9
+ * address must be the address the code was sent to. Medusa takes the address
10
+ * from the request body unchecked, so without this a token obtained for
11
+ * `attacker@example.com` could create a customer for `victim@example.com`,
12
+ * which the victim's later code login would then be linked to. Other tokens
13
+ * (password login) are not affected. The address is read from the validated
14
+ * body when the core validator already ran, else from the raw body.
15
+ */
16
+ const requireLoginCodeCustomerEmail = async (req, _res, next) => {
17
+ const authContext = req.auth_context;
18
+ if (authContext?.auth_provider !== customer_auth_1.EMAIL_OTP_AUTH_PROVIDER) {
19
+ return next();
20
+ }
21
+ const body = req.validatedBody ?? req.body;
22
+ const email = typeof body === "object" && body !== null
23
+ ? body.email
24
+ : undefined;
25
+ const auth = req.scope.resolve(utils_1.Modules.AUTH);
26
+ const [providerIdentity] = authContext.auth_identity_id
27
+ ? await auth.listProviderIdentities({
28
+ auth_identity_id: authContext.auth_identity_id,
29
+ provider: customer_auth_1.EMAIL_OTP_AUTH_PROVIDER,
30
+ }, { select: ["id", "entity_id"], take: 1 })
31
+ : [];
32
+ if (typeof email !== "string" ||
33
+ !providerIdentity ||
34
+ (0, customer_auth_1.normalizeLoginEmail)(email) !== providerIdentity.entity_id) {
35
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, MISMATCH_MESSAGE);
36
+ }
37
+ next();
38
+ };
39
+ exports.requireLoginCodeCustomerEmail = requireLoginCodeCustomerEmail;
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWlyZS1sb2dpbi1jb2RlLWN1c3RvbWVyLWVtYWlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS9yZXF1aXJlLWxvZ2luLWNvZGUtY3VzdG9tZXItZW1haWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBTUEscURBQWdFO0FBQ2hFLDJHQUdnRjtBQUVoRixNQUFNLGdCQUFnQixHQUNwQix3R0FBd0csQ0FBQTtBQUUxRzs7Ozs7Ozs7R0FRRztBQUNJLE1BQU0sNkJBQTZCLEdBQUcsS0FBSyxFQUNoRCxHQUErQixFQUMvQixJQUFvQixFQUNwQixJQUF3QixFQUNULEVBQUU7SUFDakIsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQTtJQUNwQyxJQUFJLFdBQVcsRUFBRSxhQUFhLEtBQUssdUNBQXVCLEVBQUUsQ0FBQztRQUMzRCxPQUFPLElBQUksRUFBRSxDQUFBO0lBQ2YsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFJLEdBQW1DLENBQUMsYUFBYSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUE7SUFDM0UsTUFBTSxLQUFLLEdBQ1QsT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxJQUFJO1FBQ3ZDLENBQUMsQ0FBRSxJQUE0QixDQUFDLEtBQUs7UUFDckMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNmLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFxQixlQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDaEUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsV0FBVyxDQUFDLGdCQUFnQjtRQUNyRCxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQy9CO1lBQ0UsZ0JBQWdCLEVBQUUsV0FBVyxDQUFDLGdCQUFnQjtZQUM5QyxRQUFRLEVBQUUsdUNBQXVCO1NBQ2xDLEVBQ0QsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUN6QztRQUNILENBQUMsQ0FBQyxFQUFFLENBQUE7SUFFTixJQUNFLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsQ0FBQyxnQkFBZ0I7UUFDakIsSUFBQSxtQ0FBbUIsRUFBQyxLQUFLLENBQUMsS0FBSyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQ3pELENBQUM7UUFDRCxNQUFNLElBQUksbUJBQVcsQ0FBQyxtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtJQUN6RSxDQUFDO0lBQ0QsSUFBSSxFQUFFLENBQUE7QUFDUixDQUFDLENBQUE7QUFsQ1ksUUFBQSw2QkFBNkIsaUNBa0N6QyJ9
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = void 0;
4
+ const request_login_code_1 = require("../../../../customer-auth/application/request-login-code");
5
+ /**
6
+ * Always 202 `{ accepted: true }`, whether or not a code was sent (new,
7
+ * existing, ambiguous or too recently asked address). The answer goes out
8
+ * before any lookup, so every address takes equally long; the work runs
9
+ * detached and logs its own failures (it never rejects). 404 while the
10
+ * `email_otp` feature is off (gate in `api/middlewares.ts`).
11
+ */
12
+ const POST = async (req, res) => {
13
+ res.status(202).json({ accepted: true });
14
+ void (0, request_login_code_1.requestLoginCode)(req.scope, req.validatedBody.email);
15
+ };
16
+ exports.POST = POST;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVyLWF1dGgvbG9naW4tY29kZS9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFNQSxpR0FBMkY7QUFFM0Y7Ozs7OztHQU1HO0FBQ0ksTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUN2QixHQUFvQyxFQUNwQyxHQUE2QyxFQUM3QyxFQUFFO0lBQ0YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUN4QyxLQUFLLElBQUEscUNBQWdCLEVBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzNELENBQUMsQ0FBQTtBQU5ZLFFBQUEsSUFBSSxRQU1oQiJ9
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GET = void 0;
4
+ const customer_auth_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/customer-auth");
5
+ const customer_password_policy_1 = require("../../../../customer-auth/customer-password-policy");
6
+ const wire_response_1 = require("../../../../shared/lib/wire-response");
7
+ /**
8
+ * The password rules customers have to meet at registration and password
9
+ * reset, so the storefront can show them. Public (publishable key only).
10
+ * 404 while the `email_password` feature is off (gate in
11
+ * `api/middlewares.ts`).
12
+ */
13
+ const GET = async (req, res) => {
14
+ res.json((0, wire_response_1.toWireResponse)(customer_auth_1.PasswordPolicyResponseSchema, {
15
+ password_policy: await (0, customer_password_policy_1.resolveCustomerPasswordPolicy)(req.scope),
16
+ }));
17
+ };
18
+ exports.GET = GET;
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVyLWF1dGgvcGFzc3dvcmQtcG9saWN5L3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJHQUFzSDtBQUd0SCxpR0FBa0c7QUFDbEcsd0VBQXFFO0FBRXJFOzs7OztHQUtHO0FBQ0ksTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUN0QixHQUFrQixFQUNsQixHQUEyQyxFQUMzQyxFQUFFO0lBQ0YsR0FBRyxDQUFDLElBQUksQ0FDTixJQUFBLDhCQUFjLEVBQUMsNENBQTRCLEVBQUU7UUFDM0MsZUFBZSxFQUFFLE1BQU0sSUFBQSx3REFBNkIsRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDO0tBQ2hFLENBQUMsQ0FDSCxDQUFBO0FBQ0gsQ0FBQyxDQUFBO0FBVFksUUFBQSxHQUFHLE9BU2YifQ==