@strapi/admin 5.58.0 → 5.59.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 (249) hide show
  1. package/dist/admin/admin/src/StrapiApp.js.map +1 -1
  2. package/dist/admin/admin/src/StrapiApp.mjs.map +1 -1
  3. package/dist/admin/admin/src/components/ConfirmDialog.js +10 -9
  4. package/dist/admin/admin/src/components/ConfirmDialog.js.map +1 -1
  5. package/dist/admin/admin/src/components/ConfirmDialog.mjs +10 -9
  6. package/dist/admin/admin/src/components/ConfirmDialog.mjs.map +1 -1
  7. package/dist/admin/admin/src/components/Filters.js +57 -12
  8. package/dist/admin/admin/src/components/Filters.js.map +1 -1
  9. package/dist/admin/admin/src/components/Filters.mjs +57 -12
  10. package/dist/admin/admin/src/components/Filters.mjs.map +1 -1
  11. package/dist/admin/admin/src/components/Form.js +3 -1
  12. package/dist/admin/admin/src/components/Form.js.map +1 -1
  13. package/dist/admin/admin/src/components/Form.mjs +3 -1
  14. package/dist/admin/admin/src/components/Form.mjs.map +1 -1
  15. package/dist/admin/admin/src/components/FormInputs/Enumeration.js +2 -1
  16. package/dist/admin/admin/src/components/FormInputs/Enumeration.js.map +1 -1
  17. package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs +2 -1
  18. package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs.map +1 -1
  19. package/dist/admin/admin/src/components/LeftMenu.js +5 -1
  20. package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
  21. package/dist/admin/admin/src/components/LeftMenu.mjs +5 -1
  22. package/dist/admin/admin/src/components/LeftMenu.mjs.map +1 -1
  23. package/dist/admin/admin/src/components/PageHelpers.js +2 -1
  24. package/dist/admin/admin/src/components/PageHelpers.js.map +1 -1
  25. package/dist/admin/admin/src/components/PageHelpers.mjs +2 -1
  26. package/dist/admin/admin/src/components/PageHelpers.mjs.map +1 -1
  27. package/dist/admin/admin/src/components/Pagination.js +7 -6
  28. package/dist/admin/admin/src/components/Pagination.js.map +1 -1
  29. package/dist/admin/admin/src/components/Pagination.mjs +7 -6
  30. package/dist/admin/admin/src/components/Pagination.mjs.map +1 -1
  31. package/dist/admin/admin/src/components/RelativeTime.js +2 -1
  32. package/dist/admin/admin/src/components/RelativeTime.js.map +1 -1
  33. package/dist/admin/admin/src/components/RelativeTime.mjs +2 -1
  34. package/dist/admin/admin/src/components/RelativeTime.mjs.map +1 -1
  35. package/dist/admin/admin/src/components/SubNav.js +6 -12
  36. package/dist/admin/admin/src/components/SubNav.js.map +1 -1
  37. package/dist/admin/admin/src/components/SubNav.mjs +7 -13
  38. package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
  39. package/dist/admin/admin/src/components/Table.js +3 -1
  40. package/dist/admin/admin/src/components/Table.js.map +1 -1
  41. package/dist/admin/admin/src/components/Table.mjs +3 -1
  42. package/dist/admin/admin/src/components/Table.mjs.map +1 -1
  43. package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
  44. package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
  45. package/dist/admin/admin/src/components/WidgetRoot.js.map +1 -1
  46. package/dist/admin/admin/src/components/WidgetRoot.mjs.map +1 -1
  47. package/dist/admin/admin/src/constants.js.map +1 -1
  48. package/dist/admin/admin/src/constants.mjs.map +1 -1
  49. package/dist/admin/admin/src/core/apis/Plugin.js.map +1 -1
  50. package/dist/admin/admin/src/core/apis/Plugin.mjs.map +1 -1
  51. package/dist/admin/admin/src/features/Auth.js +2 -1
  52. package/dist/admin/admin/src/features/Auth.js.map +1 -1
  53. package/dist/admin/admin/src/features/Auth.mjs +2 -1
  54. package/dist/admin/admin/src/features/Auth.mjs.map +1 -1
  55. package/dist/admin/admin/src/features/StrapiApp.js.map +1 -1
  56. package/dist/admin/admin/src/features/StrapiApp.mjs.map +1 -1
  57. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  58. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  59. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js.map +1 -1
  60. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs.map +1 -1
  61. package/dist/admin/admin/src/pages/ProfilePage.js +2 -2
  62. package/dist/admin/admin/src/pages/ProfilePage.js.map +1 -1
  63. package/dist/admin/admin/src/pages/ProfilePage.mjs +2 -2
  64. package/dist/admin/admin/src/pages/ProfilePage.mjs.map +1 -1
  65. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
  66. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
  67. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.js +4 -1
  68. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.js.map +1 -1
  69. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.mjs +4 -1
  70. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.mjs.map +1 -1
  71. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js +3 -1
  72. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js.map +1 -1
  73. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.mjs +3 -1
  74. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.mjs.map +1 -1
  75. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenTypeSelect.js +2 -1
  76. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenTypeSelect.js.map +1 -1
  77. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenTypeSelect.mjs +2 -1
  78. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenTypeSelect.mjs.map +1 -1
  79. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.js +6 -5
  80. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.js.map +1 -1
  81. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.mjs +6 -5
  82. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.mjs.map +1 -1
  83. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js +2 -1
  84. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js.map +1 -1
  85. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.mjs +2 -1
  86. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.mjs.map +1 -1
  87. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/transformPermissionsData.js +4 -4
  88. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/transformPermissionsData.js.map +1 -1
  89. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/transformPermissionsData.mjs +4 -4
  90. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/transformPermissionsData.mjs.map +1 -1
  91. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +1 -2
  92. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
  93. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +1 -2
  94. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
  95. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js.map +1 -1
  96. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.mjs.map +1 -1
  97. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.js.map +1 -1
  98. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.mjs.map +1 -1
  99. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js +9 -4
  100. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js.map +1 -1
  101. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.mjs +9 -4
  102. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.mjs.map +1 -1
  103. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.js +15 -9
  104. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.js.map +1 -1
  105. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.mjs +15 -9
  106. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.mjs.map +1 -1
  107. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js +5 -2
  108. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js.map +1 -1
  109. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs +5 -2
  110. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs.map +1 -1
  111. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.js +2 -1
  112. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.js.map +1 -1
  113. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.mjs +2 -1
  114. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.mjs.map +1 -1
  115. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js +2 -1
  116. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js.map +1 -1
  117. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs +2 -1
  118. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs.map +1 -1
  119. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js +2 -1
  120. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js.map +1 -1
  121. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.mjs +2 -1
  122. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.mjs.map +1 -1
  123. package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.js.map +1 -1
  124. package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.mjs.map +1 -1
  125. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js +3 -1
  126. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js.map +1 -1
  127. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.mjs +3 -1
  128. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.mjs.map +1 -1
  129. package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.js.map +1 -1
  130. package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.mjs.map +1 -1
  131. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js.map +1 -1
  132. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.mjs.map +1 -1
  133. package/dist/admin/admin/src/pages/Settings/pages/Users/components/NewUserForm.js.map +1 -1
  134. package/dist/admin/admin/src/pages/Settings/pages/Users/components/NewUserForm.mjs.map +1 -1
  135. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.js +4 -1
  136. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.js.map +1 -1
  137. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.mjs +4 -1
  138. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.mjs.map +1 -1
  139. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js +18 -3
  140. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js.map +1 -1
  141. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.mjs +18 -3
  142. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.mjs.map +1 -1
  143. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.js.map +1 -1
  144. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.mjs.map +1 -1
  145. package/dist/admin/admin/src/router.js.map +1 -1
  146. package/dist/admin/admin/src/router.mjs.map +1 -1
  147. package/dist/admin/admin/src/services/users.js.map +1 -1
  148. package/dist/admin/admin/src/services/users.mjs.map +1 -1
  149. package/dist/admin/admin/src/translations/eu.json.js +1 -1
  150. package/dist/admin/admin/src/translations/eu.json.mjs +1 -1
  151. package/dist/admin/admin/src/utils/cookies.js +7 -6
  152. package/dist/admin/admin/src/utils/cookies.js.map +1 -1
  153. package/dist/admin/admin/src/utils/cookies.mjs +7 -6
  154. package/dist/admin/admin/src/utils/cookies.mjs.map +1 -1
  155. package/dist/admin/admin/tests/utils.js +2 -1
  156. package/dist/admin/admin/tests/utils.js.map +1 -1
  157. package/dist/admin/admin/tests/utils.mjs +2 -1
  158. package/dist/admin/admin/tests/utils.mjs.map +1 -1
  159. package/dist/admin/shared/utils/auth-cookie-path.js +13 -10
  160. package/dist/admin/shared/utils/auth-cookie-path.js.map +1 -1
  161. package/dist/admin/shared/utils/auth-cookie-path.mjs +13 -10
  162. package/dist/admin/shared/utils/auth-cookie-path.mjs.map +1 -1
  163. package/dist/admin/shared/utils/get-project-type.js +3 -3
  164. package/dist/admin/shared/utils/get-project-type.js.map +1 -1
  165. package/dist/admin/shared/utils/get-project-type.mjs +3 -3
  166. package/dist/admin/shared/utils/get-project-type.mjs.map +1 -1
  167. package/dist/admin/src/components/Filters.d.ts +1 -1
  168. package/dist/admin/src/components/Form.d.ts +1 -1
  169. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.d.ts +1 -1
  170. package/dist/admin/src/utils/cookies.d.ts +7 -6
  171. package/dist/ee/server/src/services/seat-enforcement.d.ts.map +1 -1
  172. package/dist/ee/server/src/validation/role.d.ts.map +1 -1
  173. package/dist/server/ee/server/src/audit-logs/utils/csv.js +3 -3
  174. package/dist/server/ee/server/src/audit-logs/utils/csv.js.map +1 -1
  175. package/dist/server/ee/server/src/audit-logs/utils/csv.mjs +3 -3
  176. package/dist/server/ee/server/src/audit-logs/utils/csv.mjs.map +1 -1
  177. package/dist/server/ee/server/src/services/seat-enforcement.js.map +1 -1
  178. package/dist/server/ee/server/src/services/seat-enforcement.mjs.map +1 -1
  179. package/dist/server/ee/server/src/validation/role.js +4 -2
  180. package/dist/server/ee/server/src/validation/role.js.map +1 -1
  181. package/dist/server/ee/server/src/validation/role.mjs +4 -2
  182. package/dist/server/ee/server/src/validation/role.mjs.map +1 -1
  183. package/dist/server/server/src/ai/services/ai.js.map +1 -1
  184. package/dist/server/server/src/ai/services/ai.mjs.map +1 -1
  185. package/dist/server/server/src/controllers/admin.js +11 -12
  186. package/dist/server/server/src/controllers/admin.js.map +1 -1
  187. package/dist/server/server/src/controllers/admin.mjs +11 -12
  188. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  189. package/dist/server/server/src/domain/permission/index.js.map +1 -1
  190. package/dist/server/server/src/domain/permission/index.mjs.map +1 -1
  191. package/dist/server/server/src/services/api-token.js +4 -8
  192. package/dist/server/server/src/services/api-token.js.map +1 -1
  193. package/dist/server/server/src/services/api-token.mjs +4 -8
  194. package/dist/server/server/src/services/api-token.mjs.map +1 -1
  195. package/dist/server/server/src/services/constants.js +4 -0
  196. package/dist/server/server/src/services/constants.js.map +1 -1
  197. package/dist/server/server/src/services/constants.mjs +4 -0
  198. package/dist/server/server/src/services/constants.mjs.map +1 -1
  199. package/dist/server/server/src/services/permission/rename-fields.js.map +1 -1
  200. package/dist/server/server/src/services/permission/rename-fields.mjs.map +1 -1
  201. package/dist/server/server/src/services/permission/sections-builder/handlers.js.map +1 -1
  202. package/dist/server/server/src/services/permission/sections-builder/handlers.mjs.map +1 -1
  203. package/dist/server/server/src/services/role.js +8 -5
  204. package/dist/server/server/src/services/role.js.map +1 -1
  205. package/dist/server/server/src/services/role.mjs +8 -5
  206. package/dist/server/server/src/services/role.mjs.map +1 -1
  207. package/dist/server/server/src/validation/admin-tokens.js +4 -4
  208. package/dist/server/server/src/validation/admin-tokens.js.map +1 -1
  209. package/dist/server/server/src/validation/admin-tokens.mjs +4 -4
  210. package/dist/server/server/src/validation/admin-tokens.mjs.map +1 -1
  211. package/dist/server/server/src/validation/api-tokens.js +4 -4
  212. package/dist/server/server/src/validation/api-tokens.js.map +1 -1
  213. package/dist/server/server/src/validation/api-tokens.mjs +4 -4
  214. package/dist/server/server/src/validation/api-tokens.mjs.map +1 -1
  215. package/dist/server/server/src/validation/role.js +6 -4
  216. package/dist/server/server/src/validation/role.js.map +1 -1
  217. package/dist/server/server/src/validation/role.mjs +6 -4
  218. package/dist/server/server/src/validation/role.mjs.map +1 -1
  219. package/dist/server/server/src/validation/transfer/token.js +4 -4
  220. package/dist/server/server/src/validation/transfer/token.js.map +1 -1
  221. package/dist/server/server/src/validation/transfer/token.mjs +4 -4
  222. package/dist/server/server/src/validation/transfer/token.mjs.map +1 -1
  223. package/dist/server/shared/utils/auth-cookie-path.js +13 -10
  224. package/dist/server/shared/utils/auth-cookie-path.js.map +1 -1
  225. package/dist/server/shared/utils/auth-cookie-path.mjs +13 -10
  226. package/dist/server/shared/utils/auth-cookie-path.mjs.map +1 -1
  227. package/dist/server/shared/utils/get-project-type.js +3 -3
  228. package/dist/server/shared/utils/get-project-type.js.map +1 -1
  229. package/dist/server/shared/utils/get-project-type.mjs +3 -3
  230. package/dist/server/shared/utils/get-project-type.mjs.map +1 -1
  231. package/dist/server/shared/utils/session-auth.js +70 -3
  232. package/dist/server/shared/utils/session-auth.js.map +1 -1
  233. package/dist/server/shared/utils/session-auth.mjs +70 -4
  234. package/dist/server/shared/utils/session-auth.mjs.map +1 -1
  235. package/dist/server/src/ai/services/ai.d.ts.map +1 -1
  236. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  237. package/dist/server/src/domain/permission/index.d.ts.map +1 -1
  238. package/dist/server/src/services/constants.d.ts +2 -0
  239. package/dist/server/src/services/constants.d.ts.map +1 -1
  240. package/dist/server/src/services/permission/rename-fields.d.ts.map +1 -1
  241. package/dist/server/src/services/permission/sections-builder/handlers.d.ts.map +1 -1
  242. package/dist/server/src/services/role.d.ts.map +1 -1
  243. package/dist/server/src/validation/role.d.ts.map +1 -1
  244. package/dist/shared/contracts/transfer.d.ts.map +1 -1
  245. package/dist/shared/utils/auth-cookie-path.d.ts +13 -10
  246. package/dist/shared/utils/auth-cookie-path.d.ts.map +1 -1
  247. package/dist/shared/utils/session-auth.d.ts +16 -0
  248. package/dist/shared/utils/session-auth.d.ts.map +1 -1
  249. package/package.json +7 -7
@@ -1,17 +1,20 @@
1
1
  /**
2
- * Path attribute of the admin auth (access) token cookie, configurable
3
- * through `admin.auth.cookie.path` so multiple Strapi instances on the same
4
- * parent domain can keep separate cookies (e.g. `/strapi-de/admin`).
2
+ * Validates the Path attribute of the admin auth cookies. The path is
3
+ * configurable through `admin.auth.cookie.path` so multiple Strapi instances
4
+ * on the same parent domain can keep separate cookies (e.g. `/strapi-de/admin`).
5
5
  *
6
6
  * Browser-safe single source for both sides of the handoff: the admin panel
7
- * cannot read server config, so the build transports the config value into
8
- * the bundle through the internal `STRAPI_ADMIN_AUTH_COOKIE_PATH` variable
9
- * (see create-build-context.ts in @strapi/strapi); the server resolves the
10
- * same config at runtime. Changing the path requires an admin rebuild, like
11
- * any other admin config change.
7
+ * cannot read server config, so the build transports the access cookie path
8
+ * into the bundle through the internal `STRAPI_ADMIN_AUTH_COOKIE_PATH`
9
+ * variable (see create-build-context.ts in @strapi/strapi); the server
10
+ * resolves the same config at runtime. Changing the path requires an admin
11
+ * rebuild, like any other admin config change.
12
12
  *
13
- * Defaults to `/admin` to match the refresh-cookie path used by
14
- * `getRefreshCookieOptions`.
13
+ * The callers pick the value to validate (see session-auth.ts). When
14
+ * `admin.auth.cookie.path` is unset, the access cookie follows the path the
15
+ * panel is served from (`admin.url`) and the refresh cookie follows the admin
16
+ * API (`/admin`), each behind any `server.url` subpath.
17
+ * `DEFAULT_AUTH_COOKIE_PATH` is only the fallback for a missing or invalid value.
15
18
  */ const DEFAULT_AUTH_COOKIE_PATH = '/admin';
16
19
  const isValidCookiePath = (path)=>{
17
20
  if (!path.startsWith('/')) {
@@ -1 +1 @@
1
- {"version":3,"file":"auth-cookie-path.mjs","sources":["../../../../shared/utils/auth-cookie-path.ts"],"sourcesContent":["/**\n * Path attribute of the admin auth (access) token cookie, configurable\n * through `admin.auth.cookie.path` so multiple Strapi instances on the same\n * parent domain can keep separate cookies (e.g. `/strapi-de/admin`).\n *\n * Browser-safe single source for both sides of the handoff: the admin panel\n * cannot read server config, so the build transports the config value into\n * the bundle through the internal `STRAPI_ADMIN_AUTH_COOKIE_PATH` variable\n * (see create-build-context.ts in @strapi/strapi); the server resolves the\n * same config at runtime. Changing the path requires an admin rebuild, like\n * any other admin config change.\n *\n * Defaults to `/admin` to match the refresh-cookie path used by\n * `getRefreshCookieOptions`.\n */\nexport const DEFAULT_AUTH_COOKIE_PATH = '/admin';\n\nconst isValidCookiePath = (path: string): boolean => {\n if (!path.startsWith('/')) {\n return false;\n }\n\n // RFC 6265 path-av: any CHAR except CTLs or \";\".\n // eslint-disable-next-line no-control-regex -- CTL chars are exactly what RFC 6265 forbids\n return !/[\\x00-\\x1F\\x7F;]/.test(path);\n};\n\nexport const resolveAuthCookiePath = (\n configuredPath?: string,\n warn: (message: string) => void = console.warn\n): string => {\n const cookiePath = (configuredPath || '').trim();\n\n if (!cookiePath) {\n return DEFAULT_AUTH_COOKIE_PATH;\n }\n\n if (!isValidCookiePath(cookiePath)) {\n warn(\n `Ignoring invalid admin auth cookie path \"${cookiePath}\" (must be an absolute path without \";\"); using \"${DEFAULT_AUTH_COOKIE_PATH}\" instead.`\n );\n return DEFAULT_AUTH_COOKIE_PATH;\n }\n\n return cookiePath;\n};\n"],"names":["DEFAULT_AUTH_COOKIE_PATH","isValidCookiePath","path","startsWith","test","resolveAuthCookiePath","configuredPath","warn","console","cookiePath","trim"],"mappings":"AAAA;;;;;;;;;;;;;;IAeO,MAAMA,wBAAAA,GAA2B;AAExC,MAAMC,oBAAoB,CAACC,IAAAA,GAAAA;AACzB,IAAA,IAAI,CAACA,IAAAA,CAAKC,UAAU,CAAC,GAAA,CAAA,EAAM;QACzB,OAAO,KAAA;AACT,IAAA;;;IAIA,OAAO,CAAC,kBAAA,CAAmBC,IAAI,CAACF,IAAAA,CAAAA;AAClC,CAAA;MAEaG,qBAAAA,GAAwB,CACnCC,cAAAA,EACAC,IAAAA,GAAkCC,QAAQD,IAAI,GAAA;AAE9C,IAAA,MAAME,aAAa,CAACH,cAAAA,IAAkB,EAAC,EAAGI,IAAI,EAAA;AAE9C,IAAA,IAAI,CAACD,UAAAA,EAAY;QACf,OAAOT,wBAAAA;AACT,IAAA;IAEA,IAAI,CAACC,kBAAkBQ,UAAAA,CAAAA,EAAa;QAClCF,IAAAA,CACE,CAAC,yCAAyC,EAAEE,UAAAA,CAAW,iDAAiD,EAAET,wBAAAA,CAAyB,UAAU,CAAC,CAAA;QAEhJ,OAAOA,wBAAAA;AACT,IAAA;IAEA,OAAOS,UAAAA;AACT;;;;"}
1
+ {"version":3,"file":"auth-cookie-path.mjs","sources":["../../../../shared/utils/auth-cookie-path.ts"],"sourcesContent":["/**\n * Validates the Path attribute of the admin auth cookies. The path is\n * configurable through `admin.auth.cookie.path` so multiple Strapi instances\n * on the same parent domain can keep separate cookies (e.g. `/strapi-de/admin`).\n *\n * Browser-safe single source for both sides of the handoff: the admin panel\n * cannot read server config, so the build transports the access cookie path\n * into the bundle through the internal `STRAPI_ADMIN_AUTH_COOKIE_PATH`\n * variable (see create-build-context.ts in @strapi/strapi); the server\n * resolves the same config at runtime. Changing the path requires an admin\n * rebuild, like any other admin config change.\n *\n * The callers pick the value to validate (see session-auth.ts). When\n * `admin.auth.cookie.path` is unset, the access cookie follows the path the\n * panel is served from (`admin.url`) and the refresh cookie follows the admin\n * API (`/admin`), each behind any `server.url` subpath.\n * `DEFAULT_AUTH_COOKIE_PATH` is only the fallback for a missing or invalid value.\n */\nexport const DEFAULT_AUTH_COOKIE_PATH = '/admin';\n\nconst isValidCookiePath = (path: string): boolean => {\n if (!path.startsWith('/')) {\n return false;\n }\n\n // RFC 6265 path-av: any CHAR except CTLs or \";\".\n // eslint-disable-next-line no-control-regex -- CTL chars are exactly what RFC 6265 forbids\n return !/[\\x00-\\x1F\\x7F;]/.test(path);\n};\n\nexport const resolveAuthCookiePath = (\n configuredPath?: string,\n warn: (message: string) => void = console.warn\n): string => {\n const cookiePath = (configuredPath || '').trim();\n\n if (!cookiePath) {\n return DEFAULT_AUTH_COOKIE_PATH;\n }\n\n if (!isValidCookiePath(cookiePath)) {\n warn(\n `Ignoring invalid admin auth cookie path \"${cookiePath}\" (must be an absolute path without \";\"); using \"${DEFAULT_AUTH_COOKIE_PATH}\" instead.`\n );\n return DEFAULT_AUTH_COOKIE_PATH;\n }\n\n return cookiePath;\n};\n"],"names":["DEFAULT_AUTH_COOKIE_PATH","isValidCookiePath","path","startsWith","test","resolveAuthCookiePath","configuredPath","warn","console","cookiePath","trim"],"mappings":"AAAA;;;;;;;;;;;;;;;;;IAkBO,MAAMA,wBAAAA,GAA2B;AAExC,MAAMC,oBAAoB,CAACC,IAAAA,GAAAA;AACzB,IAAA,IAAI,CAACA,IAAAA,CAAKC,UAAU,CAAC,GAAA,CAAA,EAAM;QACzB,OAAO,KAAA;AACT,IAAA;;;IAIA,OAAO,CAAC,kBAAA,CAAmBC,IAAI,CAACF,IAAAA,CAAAA;AAClC,CAAA;MAEaG,qBAAAA,GAAwB,CACnCC,cAAAA,EACAC,IAAAA,GAAkCC,QAAQD,IAAI,GAAA;AAE9C,IAAA,MAAME,aAAa,CAACH,cAAAA,IAAkB,EAAC,EAAGI,IAAI,EAAA;AAE9C,IAAA,IAAI,CAACD,UAAAA,EAAY;QACf,OAAOT,wBAAAA;AACT,IAAA;IAEA,IAAI,CAACC,kBAAkBQ,UAAAA,CAAAA,EAAa;QAClCF,IAAAA,CACE,CAAC,yCAAyC,EAAEE,UAAAA,CAAW,iDAAiD,EAAET,wBAAAA,CAAyB,UAAU,CAAC,CAAA;QAEhJ,OAAOA,wBAAAA;AACT,IAAA;IAEA,OAAOS,UAAAA;AACT;;;;"}
@@ -25,11 +25,11 @@
25
25
  };
26
26
  // The statuses a license can be in once it has been read. `none` (never licensed) is left out
27
27
  // on purpose, and so is a missing status, which a mixed-version install can produce.
28
- const LICENSED_STATUSES = [
28
+ const LICENSED_STATUSES = new Set([
29
29
  'active',
30
30
  'expired',
31
31
  'unknown'
32
- ];
32
+ ]);
33
33
  /**
34
34
  * Resolves the plan a license was issued for, including one that has lapsed or can no longer
35
35
  * be read, so Support links, the Plan card and the debug dump can still name it. It unlocks
@@ -40,7 +40,7 @@ const LICENSED_STATUSES = [
40
40
  * type is stored, and with no price id `getProjectType` would fall through to Enterprise, so
41
41
  * both conditions are required. Every caller that derives a plan should go through here.
42
42
  */ const getLicensedPlan = ({ licenseStatus, type, planPriceId })=>getProjectType({
43
- isEE: Boolean(type) && LICENSED_STATUSES.includes(licenseStatus ?? ''),
43
+ isEE: Boolean(type) && LICENSED_STATUSES.has(licenseStatus ?? ''),
44
44
  planPriceId: planPriceId ?? undefined
45
45
  });
46
46
 
@@ -1 +1 @@
1
- {"version":3,"file":"get-project-type.js","sources":["../../../../shared/utils/get-project-type.ts"],"sourcesContent":["type ProjectType = 'Community' | 'Growth' | 'Enterprise';\n\n/**\n * Resolves the plan label from the license information returned by the\n * `/admin/project-type` endpoint (browser) or `strapi.ee` (server).\n *\n * This labels the edition that is running: it follows `isEE`, so a lapsed license reads\n * Community. Browser tracking and NPS report this label and the startup table applies the same\n * rule; server metrics also label the running edition, but never say Growth. For the plan a\n * license was issued for, lapsed or not (the Plan card, the Support card and the debug dump),\n * use `getLicensedPlan` below.\n *\n * The label is intentionally limited to three values:\n * - `Community` when there is no license (Community Edition).\n * - `Growth` when the licensed plan price id contains \"growth\".\n * - `Enterprise` for any other licensed plan.\n */\nconst getProjectType = ({\n isEE,\n planPriceId,\n}: {\n isEE: boolean;\n planPriceId?: string;\n}): ProjectType => {\n if (!isEE) {\n return 'Community';\n }\n\n if (planPriceId?.toLowerCase().includes('growth')) {\n return 'Growth';\n }\n\n return 'Enterprise';\n};\n\n// The statuses a license can be in once it has been read. `none` (never licensed) is left out\n// on purpose, and so is a missing status, which a mixed-version install can produce.\nconst LICENSED_STATUSES: readonly string[] = ['active', 'expired', 'unknown'];\n\n/**\n * Resolves the plan a license was issued for, including one that has lapsed or can no longer\n * be read, so Support links, the Plan card and the debug dump can still name it. It unlocks\n * nothing: feature gating stays on `isEE`.\n *\n * A plan is only reported when a type was verified at some point (live, or retained once the\n * license lapsed) AND the status is licensed. A corrupt license file sets `unknown` before any\n * type is stored, and with no price id `getProjectType` would fall through to Enterprise, so\n * both conditions are required. Every caller that derives a plan should go through here.\n */\nconst getLicensedPlan = ({\n licenseStatus,\n type,\n planPriceId,\n}: {\n licenseStatus: string | null | undefined;\n type: string | null | undefined;\n planPriceId?: string | null;\n}): ProjectType =>\n getProjectType({\n isEE: Boolean(type) && LICENSED_STATUSES.includes(licenseStatus ?? ''),\n planPriceId: planPriceId ?? undefined,\n });\n\nexport { getLicensedPlan, getProjectType };\nexport type { ProjectType };\n"],"names":["getProjectType","isEE","planPriceId","toLowerCase","includes","LICENSED_STATUSES","getLicensedPlan","licenseStatus","type","Boolean","undefined"],"mappings":";;AAEA;;;;;;;;;;;;;;AAcC,UACKA,cAAAA,GAAiB,CAAC,EACtBC,IAAI,EACJC,WAAW,EAIZ,GAAA;AACC,IAAA,IAAI,CAACD,IAAAA,EAAM;QACT,OAAO,WAAA;AACT,IAAA;IAEA,IAAIC,WAAAA,EAAaC,WAAAA,EAAAA,CAAcC,QAAAA,CAAS,QAAA,CAAA,EAAW;QACjD,OAAO,QAAA;AACT,IAAA;IAEA,OAAO,YAAA;AACT;AAEA;AACA;AACA,MAAMC,iBAAAA,GAAuC;AAAC,IAAA,QAAA;AAAU,IAAA,SAAA;AAAW,IAAA;AAAU,CAAA;AAE7E;;;;;;;;;IAUA,MAAMC,eAAAA,GAAkB,CAAC,EACvBC,aAAa,EACbC,IAAI,EACJN,WAAW,EAKZ,GACCF,cAAAA,CAAe;AACbC,QAAAA,IAAAA,EAAMQ,OAAAA,CAAQD,IAAAA,CAAAA,IAASH,iBAAAA,CAAkBD,QAAQ,CAACG,aAAAA,IAAiB,EAAA,CAAA;AACnEL,QAAAA,WAAAA,EAAaA,WAAAA,IAAeQ;AAC9B,KAAA;;;;;"}
1
+ {"version":3,"file":"get-project-type.js","sources":["../../../../shared/utils/get-project-type.ts"],"sourcesContent":["type ProjectType = 'Community' | 'Growth' | 'Enterprise';\n\n/**\n * Resolves the plan label from the license information returned by the\n * `/admin/project-type` endpoint (browser) or `strapi.ee` (server).\n *\n * This labels the edition that is running: it follows `isEE`, so a lapsed license reads\n * Community. Browser tracking and NPS report this label and the startup table applies the same\n * rule; server metrics also label the running edition, but never say Growth. For the plan a\n * license was issued for, lapsed or not (the Plan card, the Support card and the debug dump),\n * use `getLicensedPlan` below.\n *\n * The label is intentionally limited to three values:\n * - `Community` when there is no license (Community Edition).\n * - `Growth` when the licensed plan price id contains \"growth\".\n * - `Enterprise` for any other licensed plan.\n */\nconst getProjectType = ({\n isEE,\n planPriceId,\n}: {\n isEE: boolean;\n planPriceId?: string;\n}): ProjectType => {\n if (!isEE) {\n return 'Community';\n }\n\n if (planPriceId?.toLowerCase().includes('growth')) {\n return 'Growth';\n }\n\n return 'Enterprise';\n};\n\n// The statuses a license can be in once it has been read. `none` (never licensed) is left out\n// on purpose, and so is a missing status, which a mixed-version install can produce.\nconst LICENSED_STATUSES: ReadonlySet<string> = new Set(['active', 'expired', 'unknown']);\n\n/**\n * Resolves the plan a license was issued for, including one that has lapsed or can no longer\n * be read, so Support links, the Plan card and the debug dump can still name it. It unlocks\n * nothing: feature gating stays on `isEE`.\n *\n * A plan is only reported when a type was verified at some point (live, or retained once the\n * license lapsed) AND the status is licensed. A corrupt license file sets `unknown` before any\n * type is stored, and with no price id `getProjectType` would fall through to Enterprise, so\n * both conditions are required. Every caller that derives a plan should go through here.\n */\nconst getLicensedPlan = ({\n licenseStatus,\n type,\n planPriceId,\n}: {\n licenseStatus: string | null | undefined;\n type: string | null | undefined;\n planPriceId?: string | null;\n}): ProjectType =>\n getProjectType({\n isEE: Boolean(type) && LICENSED_STATUSES.has(licenseStatus ?? ''),\n planPriceId: planPriceId ?? undefined,\n });\n\nexport { getLicensedPlan, getProjectType };\nexport type { ProjectType };\n"],"names":["getProjectType","isEE","planPriceId","toLowerCase","includes","LICENSED_STATUSES","Set","getLicensedPlan","licenseStatus","type","Boolean","has","undefined"],"mappings":";;AAEA;;;;;;;;;;;;;;AAcC,UACKA,cAAAA,GAAiB,CAAC,EACtBC,IAAI,EACJC,WAAW,EAIZ,GAAA;AACC,IAAA,IAAI,CAACD,IAAAA,EAAM;QACT,OAAO,WAAA;AACT,IAAA;IAEA,IAAIC,WAAAA,EAAaC,WAAAA,EAAAA,CAAcC,QAAAA,CAAS,QAAA,CAAA,EAAW;QACjD,OAAO,QAAA;AACT,IAAA;IAEA,OAAO,YAAA;AACT;AAEA;AACA;AACA,MAAMC,iBAAAA,GAAyC,IAAIC,GAAAA,CAAI;AAAC,IAAA,QAAA;AAAU,IAAA,SAAA;AAAW,IAAA;AAAU,CAAA,CAAA;AAEvF;;;;;;;;;IAUA,MAAMC,eAAAA,GAAkB,CAAC,EACvBC,aAAa,EACbC,IAAI,EACJP,WAAW,EAKZ,GACCF,cAAAA,CAAe;AACbC,QAAAA,IAAAA,EAAMS,OAAAA,CAAQD,IAAAA,CAAAA,IAASJ,iBAAAA,CAAkBM,GAAG,CAACH,aAAAA,IAAiB,EAAA,CAAA;AAC9DN,QAAAA,WAAAA,EAAaA,WAAAA,IAAeU;AAC9B,KAAA;;;;;"}
@@ -23,11 +23,11 @@
23
23
  };
24
24
  // The statuses a license can be in once it has been read. `none` (never licensed) is left out
25
25
  // on purpose, and so is a missing status, which a mixed-version install can produce.
26
- const LICENSED_STATUSES = [
26
+ const LICENSED_STATUSES = new Set([
27
27
  'active',
28
28
  'expired',
29
29
  'unknown'
30
- ];
30
+ ]);
31
31
  /**
32
32
  * Resolves the plan a license was issued for, including one that has lapsed or can no longer
33
33
  * be read, so Support links, the Plan card and the debug dump can still name it. It unlocks
@@ -38,7 +38,7 @@ const LICENSED_STATUSES = [
38
38
  * type is stored, and with no price id `getProjectType` would fall through to Enterprise, so
39
39
  * both conditions are required. Every caller that derives a plan should go through here.
40
40
  */ const getLicensedPlan = ({ licenseStatus, type, planPriceId })=>getProjectType({
41
- isEE: Boolean(type) && LICENSED_STATUSES.includes(licenseStatus ?? ''),
41
+ isEE: Boolean(type) && LICENSED_STATUSES.has(licenseStatus ?? ''),
42
42
  planPriceId: planPriceId ?? undefined
43
43
  });
44
44
 
@@ -1 +1 @@
1
- {"version":3,"file":"get-project-type.mjs","sources":["../../../../shared/utils/get-project-type.ts"],"sourcesContent":["type ProjectType = 'Community' | 'Growth' | 'Enterprise';\n\n/**\n * Resolves the plan label from the license information returned by the\n * `/admin/project-type` endpoint (browser) or `strapi.ee` (server).\n *\n * This labels the edition that is running: it follows `isEE`, so a lapsed license reads\n * Community. Browser tracking and NPS report this label and the startup table applies the same\n * rule; server metrics also label the running edition, but never say Growth. For the plan a\n * license was issued for, lapsed or not (the Plan card, the Support card and the debug dump),\n * use `getLicensedPlan` below.\n *\n * The label is intentionally limited to three values:\n * - `Community` when there is no license (Community Edition).\n * - `Growth` when the licensed plan price id contains \"growth\".\n * - `Enterprise` for any other licensed plan.\n */\nconst getProjectType = ({\n isEE,\n planPriceId,\n}: {\n isEE: boolean;\n planPriceId?: string;\n}): ProjectType => {\n if (!isEE) {\n return 'Community';\n }\n\n if (planPriceId?.toLowerCase().includes('growth')) {\n return 'Growth';\n }\n\n return 'Enterprise';\n};\n\n// The statuses a license can be in once it has been read. `none` (never licensed) is left out\n// on purpose, and so is a missing status, which a mixed-version install can produce.\nconst LICENSED_STATUSES: readonly string[] = ['active', 'expired', 'unknown'];\n\n/**\n * Resolves the plan a license was issued for, including one that has lapsed or can no longer\n * be read, so Support links, the Plan card and the debug dump can still name it. It unlocks\n * nothing: feature gating stays on `isEE`.\n *\n * A plan is only reported when a type was verified at some point (live, or retained once the\n * license lapsed) AND the status is licensed. A corrupt license file sets `unknown` before any\n * type is stored, and with no price id `getProjectType` would fall through to Enterprise, so\n * both conditions are required. Every caller that derives a plan should go through here.\n */\nconst getLicensedPlan = ({\n licenseStatus,\n type,\n planPriceId,\n}: {\n licenseStatus: string | null | undefined;\n type: string | null | undefined;\n planPriceId?: string | null;\n}): ProjectType =>\n getProjectType({\n isEE: Boolean(type) && LICENSED_STATUSES.includes(licenseStatus ?? ''),\n planPriceId: planPriceId ?? undefined,\n });\n\nexport { getLicensedPlan, getProjectType };\nexport type { ProjectType };\n"],"names":["getProjectType","isEE","planPriceId","toLowerCase","includes","LICENSED_STATUSES","getLicensedPlan","licenseStatus","type","Boolean","undefined"],"mappings":"AAEA;;;;;;;;;;;;;;AAcC,UACKA,cAAAA,GAAiB,CAAC,EACtBC,IAAI,EACJC,WAAW,EAIZ,GAAA;AACC,IAAA,IAAI,CAACD,IAAAA,EAAM;QACT,OAAO,WAAA;AACT,IAAA;IAEA,IAAIC,WAAAA,EAAaC,WAAAA,EAAAA,CAAcC,QAAAA,CAAS,QAAA,CAAA,EAAW;QACjD,OAAO,QAAA;AACT,IAAA;IAEA,OAAO,YAAA;AACT;AAEA;AACA;AACA,MAAMC,iBAAAA,GAAuC;AAAC,IAAA,QAAA;AAAU,IAAA,SAAA;AAAW,IAAA;AAAU,CAAA;AAE7E;;;;;;;;;IAUA,MAAMC,eAAAA,GAAkB,CAAC,EACvBC,aAAa,EACbC,IAAI,EACJN,WAAW,EAKZ,GACCF,cAAAA,CAAe;AACbC,QAAAA,IAAAA,EAAMQ,OAAAA,CAAQD,IAAAA,CAAAA,IAASH,iBAAAA,CAAkBD,QAAQ,CAACG,aAAAA,IAAiB,EAAA,CAAA;AACnEL,QAAAA,WAAAA,EAAaA,WAAAA,IAAeQ;AAC9B,KAAA;;;;"}
1
+ {"version":3,"file":"get-project-type.mjs","sources":["../../../../shared/utils/get-project-type.ts"],"sourcesContent":["type ProjectType = 'Community' | 'Growth' | 'Enterprise';\n\n/**\n * Resolves the plan label from the license information returned by the\n * `/admin/project-type` endpoint (browser) or `strapi.ee` (server).\n *\n * This labels the edition that is running: it follows `isEE`, so a lapsed license reads\n * Community. Browser tracking and NPS report this label and the startup table applies the same\n * rule; server metrics also label the running edition, but never say Growth. For the plan a\n * license was issued for, lapsed or not (the Plan card, the Support card and the debug dump),\n * use `getLicensedPlan` below.\n *\n * The label is intentionally limited to three values:\n * - `Community` when there is no license (Community Edition).\n * - `Growth` when the licensed plan price id contains \"growth\".\n * - `Enterprise` for any other licensed plan.\n */\nconst getProjectType = ({\n isEE,\n planPriceId,\n}: {\n isEE: boolean;\n planPriceId?: string;\n}): ProjectType => {\n if (!isEE) {\n return 'Community';\n }\n\n if (planPriceId?.toLowerCase().includes('growth')) {\n return 'Growth';\n }\n\n return 'Enterprise';\n};\n\n// The statuses a license can be in once it has been read. `none` (never licensed) is left out\n// on purpose, and so is a missing status, which a mixed-version install can produce.\nconst LICENSED_STATUSES: ReadonlySet<string> = new Set(['active', 'expired', 'unknown']);\n\n/**\n * Resolves the plan a license was issued for, including one that has lapsed or can no longer\n * be read, so Support links, the Plan card and the debug dump can still name it. It unlocks\n * nothing: feature gating stays on `isEE`.\n *\n * A plan is only reported when a type was verified at some point (live, or retained once the\n * license lapsed) AND the status is licensed. A corrupt license file sets `unknown` before any\n * type is stored, and with no price id `getProjectType` would fall through to Enterprise, so\n * both conditions are required. Every caller that derives a plan should go through here.\n */\nconst getLicensedPlan = ({\n licenseStatus,\n type,\n planPriceId,\n}: {\n licenseStatus: string | null | undefined;\n type: string | null | undefined;\n planPriceId?: string | null;\n}): ProjectType =>\n getProjectType({\n isEE: Boolean(type) && LICENSED_STATUSES.has(licenseStatus ?? ''),\n planPriceId: planPriceId ?? undefined,\n });\n\nexport { getLicensedPlan, getProjectType };\nexport type { ProjectType };\n"],"names":["getProjectType","isEE","planPriceId","toLowerCase","includes","LICENSED_STATUSES","Set","getLicensedPlan","licenseStatus","type","Boolean","has","undefined"],"mappings":"AAEA;;;;;;;;;;;;;;AAcC,UACKA,cAAAA,GAAiB,CAAC,EACtBC,IAAI,EACJC,WAAW,EAIZ,GAAA;AACC,IAAA,IAAI,CAACD,IAAAA,EAAM;QACT,OAAO,WAAA;AACT,IAAA;IAEA,IAAIC,WAAAA,EAAaC,WAAAA,EAAAA,CAAcC,QAAAA,CAAS,QAAA,CAAA,EAAW;QACjD,OAAO,QAAA;AACT,IAAA;IAEA,OAAO,YAAA;AACT;AAEA;AACA;AACA,MAAMC,iBAAAA,GAAyC,IAAIC,GAAAA,CAAI;AAAC,IAAA,QAAA;AAAU,IAAA,SAAA;AAAW,IAAA;AAAU,CAAA,CAAA;AAEvF;;;;;;;;;IAUA,MAAMC,eAAAA,GAAkB,CAAC,EACvBC,aAAa,EACbC,IAAI,EACJP,WAAW,EAKZ,GACCF,cAAAA,CAAe;AACbC,QAAAA,IAAAA,EAAMS,OAAAA,CAAQD,IAAAA,CAAAA,IAASJ,iBAAAA,CAAkBM,GAAG,CAACH,aAAAA,IAAiB,EAAA,CAAA;AAC9DN,QAAAA,WAAAA,EAAaA,WAAAA,IAAeU;AAC9B,KAAA;;;;"}
@@ -23,9 +23,75 @@ const getAccessCookieName = ()=>{
23
23
  const configured = strapi.config.get('admin.auth.cookie.name');
24
24
  return authCookieName.resolveAuthCookieName(configured, warnViaStrapiLog);
25
25
  };
26
- const getAccessCookiePath = ()=>{
26
+ // The admin API routes are mounted under `/admin` whatever `admin.url` is.
27
+ const ADMIN_API_PREFIX = '/admin';
28
+ const getConfiguredCookiePath = ()=>{
27
29
  const configured = strapi.config.get('admin.auth.cookie.path');
28
- return authCookiePath.resolveAuthCookiePath(configured, warnViaStrapiLog);
30
+ return typeof configured === 'string' && configured.trim() !== '' ? configured : undefined;
31
+ };
32
+ /**
33
+ * Path the browser sees for one of the resolved absolute URLs, so it includes
34
+ * a `server.url` subpath (`admin.path` does not). No trailing slash, except
35
+ * for the root.
36
+ */ const getBrowserPath = (key)=>{
37
+ const absoluteUrl = strapi.config.get(key);
38
+ if (typeof absoluteUrl !== 'string' || absoluteUrl === '') {
39
+ return undefined;
40
+ }
41
+ try {
42
+ return new URL(absoluteUrl).pathname.replace(/\/+$/, '') || '/';
43
+ } catch {
44
+ return undefined;
45
+ }
46
+ };
47
+ /**
48
+ * Path the browser uses for the admin API (`/admin/access-token`,
49
+ * `/admin/login`, `/admin/logout`): `/admin` behind any `server.url` subpath.
50
+ */ const getAdminApiPath = ()=>{
51
+ const serverPath = getBrowserPath('server.absoluteUrl');
52
+ const apiPath = serverPath && serverPath !== '/' ? `${serverPath}${ADMIN_API_PREFIX}` : ADMIN_API_PREFIX;
53
+ return authCookiePath.resolveAuthCookiePath(apiPath, warnViaStrapiLog);
54
+ };
55
+ // RFC 6265 section 5.1.4: whether the browser attaches a cookie scoped to
56
+ // `cookiePath` to a request for `requestPath`.
57
+ const cookiePathMatches = (cookiePath, requestPath)=>{
58
+ if (requestPath === cookiePath) {
59
+ return true;
60
+ }
61
+ return requestPath.startsWith(cookiePath) && (cookiePath.endsWith('/') || requestPath.charAt(cookiePath.length) === '/');
62
+ };
63
+ /**
64
+ * Path of the non-httpOnly access cookie. Only the admin panel reads it,
65
+ * through `document.cookie`, which exposes a cookie only on pages its path
66
+ * matches. So when `admin.auth.cookie.path` is unset it follows the path the
67
+ * browser loads the panel from (`admin.url`, behind any `server.url` subpath).
68
+ * The admin build resolves the same value (create-build-context.ts).
69
+ */ const getAccessCookiePath = ()=>{
70
+ return authCookiePath.resolveAuthCookiePath(getConfiguredCookiePath() ?? getBrowserPath('admin.absoluteUrl'), warnViaStrapiLog);
71
+ };
72
+ const warnedRefreshCookiePaths = new Set();
73
+ /**
74
+ * Path of the httpOnly refresh cookie (and every other cookie built from
75
+ * `getRefreshCookieOptions`). Only the admin API reads it, and the API does not
76
+ * move with `admin.url`, so it follows the API path instead of the panel.
77
+ * `admin.auth.cookie.path` is kept when it covers the API path. Otherwise the
78
+ * browser would never send the cookie to `/admin/access-token` and every
79
+ * session would end when its access token expires, so the API path is used.
80
+ */ const getRefreshCookiePath = ()=>{
81
+ const apiPath = getAdminApiPath();
82
+ const configured = getConfiguredCookiePath();
83
+ if (!configured) {
84
+ return apiPath;
85
+ }
86
+ const configuredPath = authCookiePath.resolveAuthCookiePath(configured, warnViaStrapiLog);
87
+ if (cookiePathMatches(configuredPath, apiPath)) {
88
+ return configuredPath;
89
+ }
90
+ if (!warnedRefreshCookiePaths.has(configuredPath)) {
91
+ warnedRefreshCookiePaths.add(configuredPath);
92
+ strapi.log.warn(`admin.auth.cookie.path "${configuredPath}" does not cover the admin API at "${apiPath}", so the browser would not send the refresh cookie to "${apiPath}/access-token". Using "${apiPath}" for the refresh cookie. The access cookie keeps "${configuredPath}".`);
93
+ }
94
+ return apiPath;
29
95
  };
30
96
  const getAccessCookieDomain = ()=>{
31
97
  const configured = strapi.config.get('admin.auth.cookie.domain') || strapi.config.get('admin.auth.domain');
@@ -39,7 +105,7 @@ const getRefreshCookieOptions = (secureRequest)=>{
39
105
  const configuredSecure = strapi.config.get('admin.auth.cookie.secure');
40
106
  const isProduction = process.env.NODE_ENV === 'production';
41
107
  const domain = getAccessCookieDomain();
42
- const path = getAccessCookiePath();
108
+ const path = getRefreshCookiePath();
43
109
  const sameSite = strapi.config.get('admin.auth.cookie.sameSite') ?? 'lax';
44
110
  let isSecure;
45
111
  if (typeof configuredSecure === 'boolean') {
@@ -141,6 +207,7 @@ exports.getAccessCookieDomain = getAccessCookieDomain;
141
207
  exports.getAccessCookieName = getAccessCookieName;
142
208
  exports.getAccessCookiePath = getAccessCookiePath;
143
209
  exports.getRefreshCookieOptions = getRefreshCookieOptions;
210
+ exports.getRefreshCookiePath = getRefreshCookiePath;
144
211
  exports.getSessionManager = getSessionManager;
145
212
  exports.resolveLogoutDeviceId = resolveLogoutDeviceId;
146
213
  //# sourceMappingURL=session-auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-auth.js","sources":["../../../../shared/utils/session-auth.ts"],"sourcesContent":["import crypto from 'crypto';\nimport type { Context } from 'koa';\nimport type { Modules } from '@strapi/types';\nimport { buildSessionMetadata } from '@strapi/utils';\n\nimport { resolveAuthCookieName } from './auth-cookie-name';\nimport { resolveAuthCookiePath } from './auth-cookie-path';\nimport { resolveAuthCookieDomain } from './auth-cookie-domain';\n\nconst ADMIN_ORIGIN = 'admin';\nconst SESSION_CONTENT_TYPE = 'admin::session';\n\nexport const REFRESH_COOKIE_NAME = 'strapi_admin_refresh';\n\n// The resolvers are browser-shared (also inlined into the admin bundle) so\n// they default to console.warn; on the server, route their warnings through\n// the Strapi logger instead.\nconst warnViaStrapiLog = (message: string): void => {\n strapi.log.warn(message);\n};\n\nexport const getAccessCookieName = (): string => {\n const configured: string | undefined = strapi.config.get('admin.auth.cookie.name');\n return resolveAuthCookieName(configured, warnViaStrapiLog);\n};\n\nexport const getAccessCookiePath = (): string => {\n const configured: string | undefined = strapi.config.get('admin.auth.cookie.path');\n return resolveAuthCookiePath(configured, warnViaStrapiLog);\n};\n\nexport const getAccessCookieDomain = (): string | undefined => {\n const configured: string | undefined =\n strapi.config.get('admin.auth.cookie.domain') || strapi.config.get('admin.auth.domain');\n return resolveAuthCookieDomain(configured, warnViaStrapiLog);\n};\n\nexport const DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN = 30 * 24 * 60 * 60;\nexport const DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN = 14 * 24 * 60 * 60;\nexport const DEFAULT_MAX_SESSION_LIFESPAN = 1 * 24 * 60 * 60;\nexport const DEFAULT_IDLE_SESSION_LIFESPAN = 2 * 60 * 60;\n\nexport const getRefreshCookieOptions = (secureRequest?: boolean) => {\n const configuredSecure = strapi.config.get('admin.auth.cookie.secure');\n const isProduction = process.env.NODE_ENV === 'production';\n\n const domain = getAccessCookieDomain();\n const path = getAccessCookiePath();\n\n const sameSite: boolean | 'lax' | 'strict' | 'none' =\n strapi.config.get('admin.auth.cookie.sameSite') ?? 'lax';\n\n let isSecure: boolean;\n if (typeof configuredSecure === 'boolean') {\n isSecure = configuredSecure;\n } else if (secureRequest !== undefined) {\n isSecure = isProduction && secureRequest;\n } else {\n isSecure = isProduction;\n }\n\n return {\n httpOnly: true,\n secure: isSecure,\n overwrite: true,\n domain,\n path,\n sameSite,\n maxAge: undefined,\n };\n};\n\nconst getLifespansForType = (\n type: 'refresh' | 'session'\n): { idleSeconds: number; maxSeconds: number } => {\n if (type === 'refresh') {\n const idleSeconds = Number(\n strapi.config.get(\n 'admin.auth.sessions.idleRefreshTokenLifespan',\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN\n )\n );\n const maxSeconds = Number(\n strapi.config.get(\n 'admin.auth.sessions.maxRefreshTokenLifespan',\n DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN\n )\n );\n\n return { idleSeconds, maxSeconds };\n }\n\n const idleSeconds = Number(\n strapi.config.get('admin.auth.sessions.idleSessionLifespan', DEFAULT_IDLE_SESSION_LIFESPAN)\n );\n const maxSeconds = Number(\n strapi.config.get('admin.auth.sessions.maxSessionLifespan', DEFAULT_MAX_SESSION_LIFESPAN)\n );\n\n return { idleSeconds, maxSeconds };\n};\n\nexport const buildCookieOptionsWithExpiry = (\n type: 'refresh' | 'session',\n absoluteExpiresAtISO?: string,\n secureRequest?: boolean\n) => {\n const base = getRefreshCookieOptions(secureRequest);\n if (type === 'session') {\n return base;\n }\n\n const { idleSeconds } = getLifespansForType('refresh');\n const now = Date.now();\n const idleExpiry = now + idleSeconds * 1000;\n const absoluteExpiry = absoluteExpiresAtISO\n ? new Date(absoluteExpiresAtISO).getTime()\n : idleExpiry;\n const chosen = new Date(Math.min(idleExpiry, absoluteExpiry));\n\n return { ...base, expires: chosen, maxAge: Math.max(0, chosen.getTime() - now) };\n};\n\nexport const getSessionManager = (): Modules.SessionManager.SessionManagerService | null => {\n const manager = strapi.sessionManager as Modules.SessionManager.SessionManagerService | undefined;\n return manager ?? null;\n};\n\nexport const generateDeviceId = (): string => crypto.randomUUID();\n\nexport const extractDeviceParams = (\n requestBody: unknown\n): { deviceId: string; rememberMe: boolean } => {\n const body = (requestBody ?? {}) as { deviceId?: string; rememberMe?: boolean };\n const deviceId = body.deviceId || generateDeviceId();\n const rememberMe = Boolean(body.rememberMe);\n\n return { deviceId, rememberMe };\n};\n\nexport const buildSessionMetadataFromContext = (ctx: Context) =>\n buildSessionMetadata({\n userAgent: ctx.request.headers['user-agent'],\n });\n\n/**\n * Resolves the device id to use when revoking sessions on logout.\n * SSO assigns deviceId server-side, so the client-provided value may not match\n * the active session row. Prefer the deviceId stored on the session backing\n * the current access token when available.\n *\n * Callers should pass `ctx.state.session.id` from the admin auth strategy and\n * the already-parsed body `deviceId` — the logout route requires authentication,\n * so sessionId is expected to be present.\n */\nexport const resolveLogoutDeviceId = async (\n userId: string,\n sessionId: string | undefined,\n clientDeviceId: string | undefined\n): Promise<string | undefined> => {\n if (!sessionId) {\n strapi.log.debug('resolveLogoutDeviceId: no sessionId; falling back to client deviceId');\n return clientDeviceId;\n }\n\n const session = await strapi.db.query(SESSION_CONTENT_TYPE).findOne({\n where: { sessionId },\n });\n\n if (session?.userId !== userId || session?.origin !== ADMIN_ORIGIN) {\n strapi.log.debug(\n 'resolveLogoutDeviceId: access-token session missing or not owned; falling back to client deviceId'\n );\n return clientDeviceId;\n }\n\n return typeof session.deviceId === 'string' ? session.deviceId : clientDeviceId;\n};\n"],"names":["ADMIN_ORIGIN","SESSION_CONTENT_TYPE","REFRESH_COOKIE_NAME","warnViaStrapiLog","message","strapi","log","warn","getAccessCookieName","configured","config","get","resolveAuthCookieName","getAccessCookiePath","resolveAuthCookiePath","getAccessCookieDomain","resolveAuthCookieDomain","DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN","DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN","DEFAULT_MAX_SESSION_LIFESPAN","DEFAULT_IDLE_SESSION_LIFESPAN","getRefreshCookieOptions","secureRequest","configuredSecure","isProduction","process","env","NODE_ENV","domain","path","sameSite","isSecure","undefined","httpOnly","secure","overwrite","maxAge","getLifespansForType","type","idleSeconds","Number","maxSeconds","buildCookieOptionsWithExpiry","absoluteExpiresAtISO","base","now","Date","idleExpiry","absoluteExpiry","getTime","chosen","Math","min","expires","max","getSessionManager","manager","sessionManager","generateDeviceId","crypto","randomUUID","extractDeviceParams","requestBody","body","deviceId","rememberMe","Boolean","buildSessionMetadataFromContext","ctx","buildSessionMetadata","userAgent","request","headers","resolveLogoutDeviceId","userId","sessionId","clientDeviceId","debug","session","db","query","findOne","where","origin"],"mappings":"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"}
1
+ {"version":3,"file":"session-auth.js","sources":["../../../../shared/utils/session-auth.ts"],"sourcesContent":["import crypto from 'crypto';\nimport type { Context } from 'koa';\nimport type { Modules } from '@strapi/types';\nimport { buildSessionMetadata } from '@strapi/utils';\n\nimport { resolveAuthCookieName } from './auth-cookie-name';\nimport { resolveAuthCookiePath } from './auth-cookie-path';\nimport { resolveAuthCookieDomain } from './auth-cookie-domain';\n\nconst ADMIN_ORIGIN = 'admin';\nconst SESSION_CONTENT_TYPE = 'admin::session';\n\nexport const REFRESH_COOKIE_NAME = 'strapi_admin_refresh';\n\n// The resolvers are browser-shared (also inlined into the admin bundle) so\n// they default to console.warn; on the server, route their warnings through\n// the Strapi logger instead.\nconst warnViaStrapiLog = (message: string): void => {\n strapi.log.warn(message);\n};\n\nexport const getAccessCookieName = (): string => {\n const configured: string | undefined = strapi.config.get('admin.auth.cookie.name');\n return resolveAuthCookieName(configured, warnViaStrapiLog);\n};\n\n// The admin API routes are mounted under `/admin` whatever `admin.url` is.\nconst ADMIN_API_PREFIX = '/admin';\n\nconst getConfiguredCookiePath = (): string | undefined => {\n const configured: unknown = strapi.config.get('admin.auth.cookie.path');\n return typeof configured === 'string' && configured.trim() !== '' ? configured : undefined;\n};\n\n/**\n * Path the browser sees for one of the resolved absolute URLs, so it includes\n * a `server.url` subpath (`admin.path` does not). No trailing slash, except\n * for the root.\n */\nconst getBrowserPath = (key: 'admin.absoluteUrl' | 'server.absoluteUrl'): string | undefined => {\n const absoluteUrl: unknown = strapi.config.get(key);\n if (typeof absoluteUrl !== 'string' || absoluteUrl === '') {\n return undefined;\n }\n\n try {\n return new URL(absoluteUrl).pathname.replace(/\\/+$/, '') || '/';\n } catch {\n return undefined;\n }\n};\n\n/**\n * Path the browser uses for the admin API (`/admin/access-token`,\n * `/admin/login`, `/admin/logout`): `/admin` behind any `server.url` subpath.\n */\nconst getAdminApiPath = (): string => {\n const serverPath = getBrowserPath('server.absoluteUrl');\n const apiPath =\n serverPath && serverPath !== '/' ? `${serverPath}${ADMIN_API_PREFIX}` : ADMIN_API_PREFIX;\n return resolveAuthCookiePath(apiPath, warnViaStrapiLog);\n};\n\n// RFC 6265 section 5.1.4: whether the browser attaches a cookie scoped to\n// `cookiePath` to a request for `requestPath`.\nconst cookiePathMatches = (cookiePath: string, requestPath: string): boolean => {\n if (requestPath === cookiePath) {\n return true;\n }\n\n return (\n requestPath.startsWith(cookiePath) &&\n (cookiePath.endsWith('/') || requestPath.charAt(cookiePath.length) === '/')\n );\n};\n\n/**\n * Path of the non-httpOnly access cookie. Only the admin panel reads it,\n * through `document.cookie`, which exposes a cookie only on pages its path\n * matches. So when `admin.auth.cookie.path` is unset it follows the path the\n * browser loads the panel from (`admin.url`, behind any `server.url` subpath).\n * The admin build resolves the same value (create-build-context.ts).\n */\nexport const getAccessCookiePath = (): string => {\n return resolveAuthCookiePath(\n getConfiguredCookiePath() ?? getBrowserPath('admin.absoluteUrl'),\n warnViaStrapiLog\n );\n};\n\nconst warnedRefreshCookiePaths = new Set<string>();\n\n/**\n * Path of the httpOnly refresh cookie (and every other cookie built from\n * `getRefreshCookieOptions`). Only the admin API reads it, and the API does not\n * move with `admin.url`, so it follows the API path instead of the panel.\n * `admin.auth.cookie.path` is kept when it covers the API path. Otherwise the\n * browser would never send the cookie to `/admin/access-token` and every\n * session would end when its access token expires, so the API path is used.\n */\nexport const getRefreshCookiePath = (): string => {\n const apiPath = getAdminApiPath();\n const configured = getConfiguredCookiePath();\n\n if (!configured) {\n return apiPath;\n }\n\n const configuredPath = resolveAuthCookiePath(configured, warnViaStrapiLog);\n if (cookiePathMatches(configuredPath, apiPath)) {\n return configuredPath;\n }\n\n if (!warnedRefreshCookiePaths.has(configuredPath)) {\n warnedRefreshCookiePaths.add(configuredPath);\n strapi.log.warn(\n `admin.auth.cookie.path \"${configuredPath}\" does not cover the admin API at \"${apiPath}\", so the browser would not send the refresh cookie to \"${apiPath}/access-token\". Using \"${apiPath}\" for the refresh cookie. The access cookie keeps \"${configuredPath}\".`\n );\n }\n\n return apiPath;\n};\n\nexport const getAccessCookieDomain = (): string | undefined => {\n const configured: string | undefined =\n strapi.config.get('admin.auth.cookie.domain') || strapi.config.get('admin.auth.domain');\n return resolveAuthCookieDomain(configured, warnViaStrapiLog);\n};\n\nexport const DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN = 30 * 24 * 60 * 60;\nexport const DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN = 14 * 24 * 60 * 60;\nexport const DEFAULT_MAX_SESSION_LIFESPAN = 1 * 24 * 60 * 60;\nexport const DEFAULT_IDLE_SESSION_LIFESPAN = 2 * 60 * 60;\n\nexport const getRefreshCookieOptions = (secureRequest?: boolean) => {\n const configuredSecure = strapi.config.get('admin.auth.cookie.secure');\n const isProduction = process.env.NODE_ENV === 'production';\n\n const domain = getAccessCookieDomain();\n const path = getRefreshCookiePath();\n\n const sameSite: boolean | 'lax' | 'strict' | 'none' =\n strapi.config.get('admin.auth.cookie.sameSite') ?? 'lax';\n\n let isSecure: boolean;\n if (typeof configuredSecure === 'boolean') {\n isSecure = configuredSecure;\n } else if (secureRequest !== undefined) {\n isSecure = isProduction && secureRequest;\n } else {\n isSecure = isProduction;\n }\n\n return {\n httpOnly: true,\n secure: isSecure,\n overwrite: true,\n domain,\n path,\n sameSite,\n maxAge: undefined,\n };\n};\n\nconst getLifespansForType = (\n type: 'refresh' | 'session'\n): { idleSeconds: number; maxSeconds: number } => {\n if (type === 'refresh') {\n const idleSeconds = Number(\n strapi.config.get(\n 'admin.auth.sessions.idleRefreshTokenLifespan',\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN\n )\n );\n const maxSeconds = Number(\n strapi.config.get(\n 'admin.auth.sessions.maxRefreshTokenLifespan',\n DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN\n )\n );\n\n return { idleSeconds, maxSeconds };\n }\n\n const idleSeconds = Number(\n strapi.config.get('admin.auth.sessions.idleSessionLifespan', DEFAULT_IDLE_SESSION_LIFESPAN)\n );\n const maxSeconds = Number(\n strapi.config.get('admin.auth.sessions.maxSessionLifespan', DEFAULT_MAX_SESSION_LIFESPAN)\n );\n\n return { idleSeconds, maxSeconds };\n};\n\nexport const buildCookieOptionsWithExpiry = (\n type: 'refresh' | 'session',\n absoluteExpiresAtISO?: string,\n secureRequest?: boolean\n) => {\n const base = getRefreshCookieOptions(secureRequest);\n if (type === 'session') {\n return base;\n }\n\n const { idleSeconds } = getLifespansForType('refresh');\n const now = Date.now();\n const idleExpiry = now + idleSeconds * 1000;\n const absoluteExpiry = absoluteExpiresAtISO\n ? new Date(absoluteExpiresAtISO).getTime()\n : idleExpiry;\n const chosen = new Date(Math.min(idleExpiry, absoluteExpiry));\n\n return { ...base, expires: chosen, maxAge: Math.max(0, chosen.getTime() - now) };\n};\n\nexport const getSessionManager = (): Modules.SessionManager.SessionManagerService | null => {\n const manager = strapi.sessionManager as Modules.SessionManager.SessionManagerService | undefined;\n return manager ?? null;\n};\n\nexport const generateDeviceId = (): string => crypto.randomUUID();\n\nexport const extractDeviceParams = (\n requestBody: unknown\n): { deviceId: string; rememberMe: boolean } => {\n const body = (requestBody ?? {}) as { deviceId?: string; rememberMe?: boolean };\n const deviceId = body.deviceId || generateDeviceId();\n const rememberMe = Boolean(body.rememberMe);\n\n return { deviceId, rememberMe };\n};\n\nexport const buildSessionMetadataFromContext = (ctx: Context) =>\n buildSessionMetadata({\n userAgent: ctx.request.headers['user-agent'],\n });\n\n/**\n * Resolves the device id to use when revoking sessions on logout.\n * SSO assigns deviceId server-side, so the client-provided value may not match\n * the active session row. Prefer the deviceId stored on the session backing\n * the current access token when available.\n *\n * Callers should pass `ctx.state.session.id` from the admin auth strategy and\n * the already-parsed body `deviceId` — the logout route requires authentication,\n * so sessionId is expected to be present.\n */\nexport const resolveLogoutDeviceId = async (\n userId: string,\n sessionId: string | undefined,\n clientDeviceId: string | undefined\n): Promise<string | undefined> => {\n if (!sessionId) {\n strapi.log.debug('resolveLogoutDeviceId: no sessionId; falling back to client deviceId');\n return clientDeviceId;\n }\n\n const session = await strapi.db.query(SESSION_CONTENT_TYPE).findOne({\n where: { sessionId },\n });\n\n if (session?.userId !== userId || session?.origin !== ADMIN_ORIGIN) {\n strapi.log.debug(\n 'resolveLogoutDeviceId: access-token session missing or not owned; falling back to client deviceId'\n );\n return clientDeviceId;\n }\n\n return typeof session.deviceId === 'string' ? session.deviceId : clientDeviceId;\n};\n"],"names":["ADMIN_ORIGIN","SESSION_CONTENT_TYPE","REFRESH_COOKIE_NAME","warnViaStrapiLog","message","strapi","log","warn","getAccessCookieName","configured","config","get","resolveAuthCookieName","ADMIN_API_PREFIX","getConfiguredCookiePath","trim","undefined","getBrowserPath","key","absoluteUrl","URL","pathname","replace","getAdminApiPath","serverPath","apiPath","resolveAuthCookiePath","cookiePathMatches","cookiePath","requestPath","startsWith","endsWith","charAt","length","getAccessCookiePath","warnedRefreshCookiePaths","Set","getRefreshCookiePath","configuredPath","has","add","getAccessCookieDomain","resolveAuthCookieDomain","DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN","DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN","DEFAULT_MAX_SESSION_LIFESPAN","DEFAULT_IDLE_SESSION_LIFESPAN","getRefreshCookieOptions","secureRequest","configuredSecure","isProduction","process","env","NODE_ENV","domain","path","sameSite","isSecure","httpOnly","secure","overwrite","maxAge","getLifespansForType","type","idleSeconds","Number","maxSeconds","buildCookieOptionsWithExpiry","absoluteExpiresAtISO","base","now","Date","idleExpiry","absoluteExpiry","getTime","chosen","Math","min","expires","max","getSessionManager","manager","sessionManager","generateDeviceId","crypto","randomUUID","extractDeviceParams","requestBody","body","deviceId","rememberMe","Boolean","buildSessionMetadataFromContext","ctx","buildSessionMetadata","userAgent","request","headers","resolveLogoutDeviceId","userId","sessionId","clientDeviceId","debug","session","db","query","findOne","where","origin"],"mappings":"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"}
@@ -17,9 +17,75 @@ const getAccessCookieName = ()=>{
17
17
  const configured = strapi.config.get('admin.auth.cookie.name');
18
18
  return resolveAuthCookieName(configured, warnViaStrapiLog);
19
19
  };
20
- const getAccessCookiePath = ()=>{
20
+ // The admin API routes are mounted under `/admin` whatever `admin.url` is.
21
+ const ADMIN_API_PREFIX = '/admin';
22
+ const getConfiguredCookiePath = ()=>{
21
23
  const configured = strapi.config.get('admin.auth.cookie.path');
22
- return resolveAuthCookiePath(configured, warnViaStrapiLog);
24
+ return typeof configured === 'string' && configured.trim() !== '' ? configured : undefined;
25
+ };
26
+ /**
27
+ * Path the browser sees for one of the resolved absolute URLs, so it includes
28
+ * a `server.url` subpath (`admin.path` does not). No trailing slash, except
29
+ * for the root.
30
+ */ const getBrowserPath = (key)=>{
31
+ const absoluteUrl = strapi.config.get(key);
32
+ if (typeof absoluteUrl !== 'string' || absoluteUrl === '') {
33
+ return undefined;
34
+ }
35
+ try {
36
+ return new URL(absoluteUrl).pathname.replace(/\/+$/, '') || '/';
37
+ } catch {
38
+ return undefined;
39
+ }
40
+ };
41
+ /**
42
+ * Path the browser uses for the admin API (`/admin/access-token`,
43
+ * `/admin/login`, `/admin/logout`): `/admin` behind any `server.url` subpath.
44
+ */ const getAdminApiPath = ()=>{
45
+ const serverPath = getBrowserPath('server.absoluteUrl');
46
+ const apiPath = serverPath && serverPath !== '/' ? `${serverPath}${ADMIN_API_PREFIX}` : ADMIN_API_PREFIX;
47
+ return resolveAuthCookiePath(apiPath, warnViaStrapiLog);
48
+ };
49
+ // RFC 6265 section 5.1.4: whether the browser attaches a cookie scoped to
50
+ // `cookiePath` to a request for `requestPath`.
51
+ const cookiePathMatches = (cookiePath, requestPath)=>{
52
+ if (requestPath === cookiePath) {
53
+ return true;
54
+ }
55
+ return requestPath.startsWith(cookiePath) && (cookiePath.endsWith('/') || requestPath.charAt(cookiePath.length) === '/');
56
+ };
57
+ /**
58
+ * Path of the non-httpOnly access cookie. Only the admin panel reads it,
59
+ * through `document.cookie`, which exposes a cookie only on pages its path
60
+ * matches. So when `admin.auth.cookie.path` is unset it follows the path the
61
+ * browser loads the panel from (`admin.url`, behind any `server.url` subpath).
62
+ * The admin build resolves the same value (create-build-context.ts).
63
+ */ const getAccessCookiePath = ()=>{
64
+ return resolveAuthCookiePath(getConfiguredCookiePath() ?? getBrowserPath('admin.absoluteUrl'), warnViaStrapiLog);
65
+ };
66
+ const warnedRefreshCookiePaths = new Set();
67
+ /**
68
+ * Path of the httpOnly refresh cookie (and every other cookie built from
69
+ * `getRefreshCookieOptions`). Only the admin API reads it, and the API does not
70
+ * move with `admin.url`, so it follows the API path instead of the panel.
71
+ * `admin.auth.cookie.path` is kept when it covers the API path. Otherwise the
72
+ * browser would never send the cookie to `/admin/access-token` and every
73
+ * session would end when its access token expires, so the API path is used.
74
+ */ const getRefreshCookiePath = ()=>{
75
+ const apiPath = getAdminApiPath();
76
+ const configured = getConfiguredCookiePath();
77
+ if (!configured) {
78
+ return apiPath;
79
+ }
80
+ const configuredPath = resolveAuthCookiePath(configured, warnViaStrapiLog);
81
+ if (cookiePathMatches(configuredPath, apiPath)) {
82
+ return configuredPath;
83
+ }
84
+ if (!warnedRefreshCookiePaths.has(configuredPath)) {
85
+ warnedRefreshCookiePaths.add(configuredPath);
86
+ strapi.log.warn(`admin.auth.cookie.path "${configuredPath}" does not cover the admin API at "${apiPath}", so the browser would not send the refresh cookie to "${apiPath}/access-token". Using "${apiPath}" for the refresh cookie. The access cookie keeps "${configuredPath}".`);
87
+ }
88
+ return apiPath;
23
89
  };
24
90
  const getAccessCookieDomain = ()=>{
25
91
  const configured = strapi.config.get('admin.auth.cookie.domain') || strapi.config.get('admin.auth.domain');
@@ -33,7 +99,7 @@ const getRefreshCookieOptions = (secureRequest)=>{
33
99
  const configuredSecure = strapi.config.get('admin.auth.cookie.secure');
34
100
  const isProduction = process.env.NODE_ENV === 'production';
35
101
  const domain = getAccessCookieDomain();
36
- const path = getAccessCookiePath();
102
+ const path = getRefreshCookiePath();
37
103
  const sameSite = strapi.config.get('admin.auth.cookie.sameSite') ?? 'lax';
38
104
  let isSecure;
39
105
  if (typeof configuredSecure === 'boolean') {
@@ -122,5 +188,5 @@ const buildSessionMetadataFromContext = (ctx)=>buildSessionMetadata({
122
188
  return typeof session.deviceId === 'string' ? session.deviceId : clientDeviceId;
123
189
  };
124
190
 
125
- export { DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN, DEFAULT_IDLE_SESSION_LIFESPAN, DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN, DEFAULT_MAX_SESSION_LIFESPAN, REFRESH_COOKIE_NAME, buildCookieOptionsWithExpiry, buildSessionMetadataFromContext, extractDeviceParams, generateDeviceId, getAccessCookieDomain, getAccessCookieName, getAccessCookiePath, getRefreshCookieOptions, getSessionManager, resolveLogoutDeviceId };
191
+ export { DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN, DEFAULT_IDLE_SESSION_LIFESPAN, DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN, DEFAULT_MAX_SESSION_LIFESPAN, REFRESH_COOKIE_NAME, buildCookieOptionsWithExpiry, buildSessionMetadataFromContext, extractDeviceParams, generateDeviceId, getAccessCookieDomain, getAccessCookieName, getAccessCookiePath, getRefreshCookieOptions, getRefreshCookiePath, getSessionManager, resolveLogoutDeviceId };
126
192
  //# sourceMappingURL=session-auth.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-auth.mjs","sources":["../../../../shared/utils/session-auth.ts"],"sourcesContent":["import crypto from 'crypto';\nimport type { Context } from 'koa';\nimport type { Modules } from '@strapi/types';\nimport { buildSessionMetadata } from '@strapi/utils';\n\nimport { resolveAuthCookieName } from './auth-cookie-name';\nimport { resolveAuthCookiePath } from './auth-cookie-path';\nimport { resolveAuthCookieDomain } from './auth-cookie-domain';\n\nconst ADMIN_ORIGIN = 'admin';\nconst SESSION_CONTENT_TYPE = 'admin::session';\n\nexport const REFRESH_COOKIE_NAME = 'strapi_admin_refresh';\n\n// The resolvers are browser-shared (also inlined into the admin bundle) so\n// they default to console.warn; on the server, route their warnings through\n// the Strapi logger instead.\nconst warnViaStrapiLog = (message: string): void => {\n strapi.log.warn(message);\n};\n\nexport const getAccessCookieName = (): string => {\n const configured: string | undefined = strapi.config.get('admin.auth.cookie.name');\n return resolveAuthCookieName(configured, warnViaStrapiLog);\n};\n\nexport const getAccessCookiePath = (): string => {\n const configured: string | undefined = strapi.config.get('admin.auth.cookie.path');\n return resolveAuthCookiePath(configured, warnViaStrapiLog);\n};\n\nexport const getAccessCookieDomain = (): string | undefined => {\n const configured: string | undefined =\n strapi.config.get('admin.auth.cookie.domain') || strapi.config.get('admin.auth.domain');\n return resolveAuthCookieDomain(configured, warnViaStrapiLog);\n};\n\nexport const DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN = 30 * 24 * 60 * 60;\nexport const DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN = 14 * 24 * 60 * 60;\nexport const DEFAULT_MAX_SESSION_LIFESPAN = 1 * 24 * 60 * 60;\nexport const DEFAULT_IDLE_SESSION_LIFESPAN = 2 * 60 * 60;\n\nexport const getRefreshCookieOptions = (secureRequest?: boolean) => {\n const configuredSecure = strapi.config.get('admin.auth.cookie.secure');\n const isProduction = process.env.NODE_ENV === 'production';\n\n const domain = getAccessCookieDomain();\n const path = getAccessCookiePath();\n\n const sameSite: boolean | 'lax' | 'strict' | 'none' =\n strapi.config.get('admin.auth.cookie.sameSite') ?? 'lax';\n\n let isSecure: boolean;\n if (typeof configuredSecure === 'boolean') {\n isSecure = configuredSecure;\n } else if (secureRequest !== undefined) {\n isSecure = isProduction && secureRequest;\n } else {\n isSecure = isProduction;\n }\n\n return {\n httpOnly: true,\n secure: isSecure,\n overwrite: true,\n domain,\n path,\n sameSite,\n maxAge: undefined,\n };\n};\n\nconst getLifespansForType = (\n type: 'refresh' | 'session'\n): { idleSeconds: number; maxSeconds: number } => {\n if (type === 'refresh') {\n const idleSeconds = Number(\n strapi.config.get(\n 'admin.auth.sessions.idleRefreshTokenLifespan',\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN\n )\n );\n const maxSeconds = Number(\n strapi.config.get(\n 'admin.auth.sessions.maxRefreshTokenLifespan',\n DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN\n )\n );\n\n return { idleSeconds, maxSeconds };\n }\n\n const idleSeconds = Number(\n strapi.config.get('admin.auth.sessions.idleSessionLifespan', DEFAULT_IDLE_SESSION_LIFESPAN)\n );\n const maxSeconds = Number(\n strapi.config.get('admin.auth.sessions.maxSessionLifespan', DEFAULT_MAX_SESSION_LIFESPAN)\n );\n\n return { idleSeconds, maxSeconds };\n};\n\nexport const buildCookieOptionsWithExpiry = (\n type: 'refresh' | 'session',\n absoluteExpiresAtISO?: string,\n secureRequest?: boolean\n) => {\n const base = getRefreshCookieOptions(secureRequest);\n if (type === 'session') {\n return base;\n }\n\n const { idleSeconds } = getLifespansForType('refresh');\n const now = Date.now();\n const idleExpiry = now + idleSeconds * 1000;\n const absoluteExpiry = absoluteExpiresAtISO\n ? new Date(absoluteExpiresAtISO).getTime()\n : idleExpiry;\n const chosen = new Date(Math.min(idleExpiry, absoluteExpiry));\n\n return { ...base, expires: chosen, maxAge: Math.max(0, chosen.getTime() - now) };\n};\n\nexport const getSessionManager = (): Modules.SessionManager.SessionManagerService | null => {\n const manager = strapi.sessionManager as Modules.SessionManager.SessionManagerService | undefined;\n return manager ?? null;\n};\n\nexport const generateDeviceId = (): string => crypto.randomUUID();\n\nexport const extractDeviceParams = (\n requestBody: unknown\n): { deviceId: string; rememberMe: boolean } => {\n const body = (requestBody ?? {}) as { deviceId?: string; rememberMe?: boolean };\n const deviceId = body.deviceId || generateDeviceId();\n const rememberMe = Boolean(body.rememberMe);\n\n return { deviceId, rememberMe };\n};\n\nexport const buildSessionMetadataFromContext = (ctx: Context) =>\n buildSessionMetadata({\n userAgent: ctx.request.headers['user-agent'],\n });\n\n/**\n * Resolves the device id to use when revoking sessions on logout.\n * SSO assigns deviceId server-side, so the client-provided value may not match\n * the active session row. Prefer the deviceId stored on the session backing\n * the current access token when available.\n *\n * Callers should pass `ctx.state.session.id` from the admin auth strategy and\n * the already-parsed body `deviceId` — the logout route requires authentication,\n * so sessionId is expected to be present.\n */\nexport const resolveLogoutDeviceId = async (\n userId: string,\n sessionId: string | undefined,\n clientDeviceId: string | undefined\n): Promise<string | undefined> => {\n if (!sessionId) {\n strapi.log.debug('resolveLogoutDeviceId: no sessionId; falling back to client deviceId');\n return clientDeviceId;\n }\n\n const session = await strapi.db.query(SESSION_CONTENT_TYPE).findOne({\n where: { sessionId },\n });\n\n if (session?.userId !== userId || session?.origin !== ADMIN_ORIGIN) {\n strapi.log.debug(\n 'resolveLogoutDeviceId: access-token session missing or not owned; falling back to client deviceId'\n );\n return clientDeviceId;\n }\n\n return typeof session.deviceId === 'string' ? session.deviceId : clientDeviceId;\n};\n"],"names":["ADMIN_ORIGIN","SESSION_CONTENT_TYPE","REFRESH_COOKIE_NAME","warnViaStrapiLog","message","strapi","log","warn","getAccessCookieName","configured","config","get","resolveAuthCookieName","getAccessCookiePath","resolveAuthCookiePath","getAccessCookieDomain","resolveAuthCookieDomain","DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN","DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN","DEFAULT_MAX_SESSION_LIFESPAN","DEFAULT_IDLE_SESSION_LIFESPAN","getRefreshCookieOptions","secureRequest","configuredSecure","isProduction","process","env","NODE_ENV","domain","path","sameSite","isSecure","undefined","httpOnly","secure","overwrite","maxAge","getLifespansForType","type","idleSeconds","Number","maxSeconds","buildCookieOptionsWithExpiry","absoluteExpiresAtISO","base","now","Date","idleExpiry","absoluteExpiry","getTime","chosen","Math","min","expires","max","getSessionManager","manager","sessionManager","generateDeviceId","crypto","randomUUID","extractDeviceParams","requestBody","body","deviceId","rememberMe","Boolean","buildSessionMetadataFromContext","ctx","buildSessionMetadata","userAgent","request","headers","resolveLogoutDeviceId","userId","sessionId","clientDeviceId","debug","session","db","query","findOne","where","origin"],"mappings":";;;;;;AASA,MAAMA,YAAAA,GAAe,OAAA;AACrB,MAAMC,oBAAAA,GAAuB,gBAAA;AAEtB,MAAMC,sBAAsB;AAEnC;AACA;AACA;AACA,MAAMC,mBAAmB,CAACC,OAAAA,GAAAA;IACxBC,MAAAA,CAAOC,GAAG,CAACC,IAAI,CAACH,OAAAA,CAAAA;AAClB,CAAA;MAEaI,mBAAAA,GAAsB,IAAA;AACjC,IAAA,MAAMC,UAAAA,GAAiCJ,MAAAA,CAAOK,MAAM,CAACC,GAAG,CAAC,wBAAA,CAAA;AACzD,IAAA,OAAOC,sBAAsBH,UAAAA,EAAYN,gBAAAA,CAAAA;AAC3C;MAEaU,mBAAAA,GAAsB,IAAA;AACjC,IAAA,MAAMJ,UAAAA,GAAiCJ,MAAAA,CAAOK,MAAM,CAACC,GAAG,CAAC,wBAAA,CAAA;AACzD,IAAA,OAAOG,sBAAsBL,UAAAA,EAAYN,gBAAAA,CAAAA;AAC3C;MAEaY,qBAAAA,GAAwB,IAAA;IACnC,MAAMN,UAAAA,GACJJ,MAAAA,CAAOK,MAAM,CAACC,GAAG,CAAC,0BAAA,CAAA,IAA+BN,MAAAA,CAAOK,MAAM,CAACC,GAAG,CAAC,mBAAA,CAAA;AACrE,IAAA,OAAOK,wBAAwBP,UAAAA,EAAYN,gBAAAA,CAAAA;AAC7C;AAEO,MAAMc,kCAAAA,GAAqC,EAAA,GAAK,EAAA,GAAK,KAAK;AAC1D,MAAMC,mCAAAA,GAAsC,EAAA,GAAK,EAAA,GAAK,KAAK;AAC3D,MAAMC,4BAAAA,GAA+B,CAAA,GAAI,EAAA,GAAK,KAAK;AACnD,MAAMC,6BAAAA,GAAgC,CAAA,GAAI,EAAA,GAAK;AAE/C,MAAMC,0BAA0B,CAACC,aAAAA,GAAAA;AACtC,IAAA,MAAMC,gBAAAA,GAAmBlB,MAAAA,CAAOK,MAAM,CAACC,GAAG,CAAC,0BAAA,CAAA;AAC3C,IAAA,MAAMa,YAAAA,GAAeC,OAAAA,CAAQC,GAAG,CAACC,QAAQ,KAAK,YAAA;AAE9C,IAAA,MAAMC,MAAAA,GAASb,qBAAAA,EAAAA;AACf,IAAA,MAAMc,IAAAA,GAAOhB,mBAAAA,EAAAA;AAEb,IAAA,MAAMiB,WACJzB,MAAAA,CAAOK,MAAM,CAACC,GAAG,CAAC,4BAAA,CAAA,IAAiC,KAAA;IAErD,IAAIoB,QAAAA;IACJ,IAAI,OAAOR,qBAAqB,SAAA,EAAW;QACzCQ,QAAAA,GAAWR,gBAAAA;IACb,CAAA,MAAO,IAAID,kBAAkBU,SAAAA,EAAW;AACtCD,QAAAA,QAAAA,GAAWP,YAAAA,IAAgBF,aAAAA;IAC7B,CAAA,MAAO;QACLS,QAAAA,GAAWP,YAAAA;AACb,IAAA;IAEA,OAAO;QACLS,QAAAA,EAAU,IAAA;QACVC,MAAAA,EAAQH,QAAAA;QACRI,SAAAA,EAAW,IAAA;AACXP,QAAAA,MAAAA;AACAC,QAAAA,IAAAA;AACAC,QAAAA,QAAAA;QACAM,MAAAA,EAAQJ;AACV,KAAA;AACF;AAEA,MAAMK,sBAAsB,CAC1BC,IAAAA,GAAAA;AAEA,IAAwB;AACtB,QAAA,MAAMC,cAAcC,MAAAA,CAClBnC,MAAAA,CAAOK,MAAM,CAACC,GAAG,CACf,8CAAA,EACAO,mCAAAA,CAAAA,CAAAA;AAGJ,QAAA,MAAMuB,aAAaD,MAAAA,CACjBnC,MAAAA,CAAOK,MAAM,CAACC,GAAG,CACf,6CAAA,EACAM,kCAAAA,CAAAA,CAAAA;QAIJ,OAAO;AAAEsB,YAAAA,WAAAA;AAAaE,YAAAA;AAAW,SAAA;AACnC,IAAA;AAUF,CAAA;AAEO,MAAMC,4BAAAA,GAA+B,CAC1CJ,IAAAA,EACAK,oBAAAA,EACArB,aAAAA,GAAAA;AAEA,IAAA,MAAMsB,OAAOvB,uBAAAA,CAAwBC,aAAAA,CAAAA;AACrC,IAAA,IAAIgB,SAAS,SAAA,EAAW;QACtB,OAAOM,IAAAA;AACT,IAAA;AAEA,IAAA,MAAM,EAAEL,WAAW,EAAE,GAAGF,mBAAAA,CAAoB,CAAA;IAC5C,MAAMQ,GAAAA,GAAMC,KAAKD,GAAG,EAAA;IACpB,MAAME,UAAAA,GAAaF,MAAMN,WAAAA,GAAc,IAAA;AACvC,IAAA,MAAMS,iBAAiBL,oBAAAA,GACnB,IAAIG,IAAAA,CAAKH,oBAAAA,CAAAA,CAAsBM,OAAO,EAAA,GACtCF,UAAAA;AACJ,IAAA,MAAMG,SAAS,IAAIJ,IAAAA,CAAKK,IAAAA,CAAKC,GAAG,CAACL,UAAAA,EAAYC,cAAAA,CAAAA,CAAAA;IAE7C,OAAO;AAAE,QAAA,GAAGJ,IAAI;QAAES,OAAAA,EAASH,MAAAA;AAAQd,QAAAA,MAAAA,EAAQe,KAAKG,GAAG,CAAC,CAAA,EAAGJ,MAAAA,CAAOD,OAAO,EAAA,GAAKJ,GAAAA;AAAK,KAAA;AACjF;MAEaU,iBAAAA,GAAoB,IAAA;IAC/B,MAAMC,OAAAA,GAAUnD,OAAOoD,cAAc;AACrC,IAAA,OAAOD,OAAAA,IAAW,IAAA;AACpB;AAEO,MAAME,gBAAAA,GAAmB,IAAcC,MAAAA,CAAOC,UAAU;AAExD,MAAMC,sBAAsB,CACjCC,WAAAA,GAAAA;IAEA,MAAMC,IAAAA,GAAQD,eAAe,EAAC;IAC9B,MAAME,QAAAA,GAAWD,IAAAA,CAAKC,QAAQ,IAAIN,gBAAAA,EAAAA;IAClC,MAAMO,UAAAA,GAAaC,OAAAA,CAAQH,IAAAA,CAAKE,UAAU,CAAA;IAE1C,OAAO;AAAED,QAAAA,QAAAA;AAAUC,QAAAA;AAAW,KAAA;AAChC;AAEO,MAAME,+BAAAA,GAAkC,CAACC,GAAAA,GAC9CC,oBAAAA,CAAqB;AACnBC,QAAAA,SAAAA,EAAWF,GAAAA,CAAIG,OAAO,CAACC,OAAO,CAAC,YAAA;KACjC;AAEF;;;;;;;;;AASC,IACM,MAAMC,qBAAAA,GAAwB,OACnCC,QACAC,SAAAA,EACAC,cAAAA,GAAAA;AAEA,IAAA,IAAI,CAACD,SAAAA,EAAW;QACdtE,MAAAA,CAAOC,GAAG,CAACuE,KAAK,CAAC,sEAAA,CAAA;QACjB,OAAOD,cAAAA;AACT,IAAA;IAEA,MAAME,OAAAA,GAAU,MAAMzE,MAAAA,CAAO0E,EAAE,CAACC,KAAK,CAAC/E,oBAAAA,CAAAA,CAAsBgF,OAAO,CAAC;QAClEC,KAAAA,EAAO;AAAEP,YAAAA;AAAU;AACrB,KAAA,CAAA;AAEA,IAAA,IAAIG,OAAAA,EAASJ,MAAAA,KAAWA,MAAAA,IAAUI,OAAAA,EAASK,WAAWnF,YAAAA,EAAc;QAClEK,MAAAA,CAAOC,GAAG,CAACuE,KAAK,CACd,mGAAA,CAAA;QAEF,OAAOD,cAAAA;AACT,IAAA;AAEA,IAAA,OAAO,OAAOE,OAAAA,CAAQd,QAAQ,KAAK,QAAA,GAAWc,OAAAA,CAAQd,QAAQ,GAAGY,cAAAA;AACnE;;;;"}
1
+ {"version":3,"file":"session-auth.mjs","sources":["../../../../shared/utils/session-auth.ts"],"sourcesContent":["import crypto from 'crypto';\nimport type { Context } from 'koa';\nimport type { Modules } from '@strapi/types';\nimport { buildSessionMetadata } from '@strapi/utils';\n\nimport { resolveAuthCookieName } from './auth-cookie-name';\nimport { resolveAuthCookiePath } from './auth-cookie-path';\nimport { resolveAuthCookieDomain } from './auth-cookie-domain';\n\nconst ADMIN_ORIGIN = 'admin';\nconst SESSION_CONTENT_TYPE = 'admin::session';\n\nexport const REFRESH_COOKIE_NAME = 'strapi_admin_refresh';\n\n// The resolvers are browser-shared (also inlined into the admin bundle) so\n// they default to console.warn; on the server, route their warnings through\n// the Strapi logger instead.\nconst warnViaStrapiLog = (message: string): void => {\n strapi.log.warn(message);\n};\n\nexport const getAccessCookieName = (): string => {\n const configured: string | undefined = strapi.config.get('admin.auth.cookie.name');\n return resolveAuthCookieName(configured, warnViaStrapiLog);\n};\n\n// The admin API routes are mounted under `/admin` whatever `admin.url` is.\nconst ADMIN_API_PREFIX = '/admin';\n\nconst getConfiguredCookiePath = (): string | undefined => {\n const configured: unknown = strapi.config.get('admin.auth.cookie.path');\n return typeof configured === 'string' && configured.trim() !== '' ? configured : undefined;\n};\n\n/**\n * Path the browser sees for one of the resolved absolute URLs, so it includes\n * a `server.url` subpath (`admin.path` does not). No trailing slash, except\n * for the root.\n */\nconst getBrowserPath = (key: 'admin.absoluteUrl' | 'server.absoluteUrl'): string | undefined => {\n const absoluteUrl: unknown = strapi.config.get(key);\n if (typeof absoluteUrl !== 'string' || absoluteUrl === '') {\n return undefined;\n }\n\n try {\n return new URL(absoluteUrl).pathname.replace(/\\/+$/, '') || '/';\n } catch {\n return undefined;\n }\n};\n\n/**\n * Path the browser uses for the admin API (`/admin/access-token`,\n * `/admin/login`, `/admin/logout`): `/admin` behind any `server.url` subpath.\n */\nconst getAdminApiPath = (): string => {\n const serverPath = getBrowserPath('server.absoluteUrl');\n const apiPath =\n serverPath && serverPath !== '/' ? `${serverPath}${ADMIN_API_PREFIX}` : ADMIN_API_PREFIX;\n return resolveAuthCookiePath(apiPath, warnViaStrapiLog);\n};\n\n// RFC 6265 section 5.1.4: whether the browser attaches a cookie scoped to\n// `cookiePath` to a request for `requestPath`.\nconst cookiePathMatches = (cookiePath: string, requestPath: string): boolean => {\n if (requestPath === cookiePath) {\n return true;\n }\n\n return (\n requestPath.startsWith(cookiePath) &&\n (cookiePath.endsWith('/') || requestPath.charAt(cookiePath.length) === '/')\n );\n};\n\n/**\n * Path of the non-httpOnly access cookie. Only the admin panel reads it,\n * through `document.cookie`, which exposes a cookie only on pages its path\n * matches. So when `admin.auth.cookie.path` is unset it follows the path the\n * browser loads the panel from (`admin.url`, behind any `server.url` subpath).\n * The admin build resolves the same value (create-build-context.ts).\n */\nexport const getAccessCookiePath = (): string => {\n return resolveAuthCookiePath(\n getConfiguredCookiePath() ?? getBrowserPath('admin.absoluteUrl'),\n warnViaStrapiLog\n );\n};\n\nconst warnedRefreshCookiePaths = new Set<string>();\n\n/**\n * Path of the httpOnly refresh cookie (and every other cookie built from\n * `getRefreshCookieOptions`). Only the admin API reads it, and the API does not\n * move with `admin.url`, so it follows the API path instead of the panel.\n * `admin.auth.cookie.path` is kept when it covers the API path. Otherwise the\n * browser would never send the cookie to `/admin/access-token` and every\n * session would end when its access token expires, so the API path is used.\n */\nexport const getRefreshCookiePath = (): string => {\n const apiPath = getAdminApiPath();\n const configured = getConfiguredCookiePath();\n\n if (!configured) {\n return apiPath;\n }\n\n const configuredPath = resolveAuthCookiePath(configured, warnViaStrapiLog);\n if (cookiePathMatches(configuredPath, apiPath)) {\n return configuredPath;\n }\n\n if (!warnedRefreshCookiePaths.has(configuredPath)) {\n warnedRefreshCookiePaths.add(configuredPath);\n strapi.log.warn(\n `admin.auth.cookie.path \"${configuredPath}\" does not cover the admin API at \"${apiPath}\", so the browser would not send the refresh cookie to \"${apiPath}/access-token\". Using \"${apiPath}\" for the refresh cookie. The access cookie keeps \"${configuredPath}\".`\n );\n }\n\n return apiPath;\n};\n\nexport const getAccessCookieDomain = (): string | undefined => {\n const configured: string | undefined =\n strapi.config.get('admin.auth.cookie.domain') || strapi.config.get('admin.auth.domain');\n return resolveAuthCookieDomain(configured, warnViaStrapiLog);\n};\n\nexport const DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN = 30 * 24 * 60 * 60;\nexport const DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN = 14 * 24 * 60 * 60;\nexport const DEFAULT_MAX_SESSION_LIFESPAN = 1 * 24 * 60 * 60;\nexport const DEFAULT_IDLE_SESSION_LIFESPAN = 2 * 60 * 60;\n\nexport const getRefreshCookieOptions = (secureRequest?: boolean) => {\n const configuredSecure = strapi.config.get('admin.auth.cookie.secure');\n const isProduction = process.env.NODE_ENV === 'production';\n\n const domain = getAccessCookieDomain();\n const path = getRefreshCookiePath();\n\n const sameSite: boolean | 'lax' | 'strict' | 'none' =\n strapi.config.get('admin.auth.cookie.sameSite') ?? 'lax';\n\n let isSecure: boolean;\n if (typeof configuredSecure === 'boolean') {\n isSecure = configuredSecure;\n } else if (secureRequest !== undefined) {\n isSecure = isProduction && secureRequest;\n } else {\n isSecure = isProduction;\n }\n\n return {\n httpOnly: true,\n secure: isSecure,\n overwrite: true,\n domain,\n path,\n sameSite,\n maxAge: undefined,\n };\n};\n\nconst getLifespansForType = (\n type: 'refresh' | 'session'\n): { idleSeconds: number; maxSeconds: number } => {\n if (type === 'refresh') {\n const idleSeconds = Number(\n strapi.config.get(\n 'admin.auth.sessions.idleRefreshTokenLifespan',\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN\n )\n );\n const maxSeconds = Number(\n strapi.config.get(\n 'admin.auth.sessions.maxRefreshTokenLifespan',\n DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN\n )\n );\n\n return { idleSeconds, maxSeconds };\n }\n\n const idleSeconds = Number(\n strapi.config.get('admin.auth.sessions.idleSessionLifespan', DEFAULT_IDLE_SESSION_LIFESPAN)\n );\n const maxSeconds = Number(\n strapi.config.get('admin.auth.sessions.maxSessionLifespan', DEFAULT_MAX_SESSION_LIFESPAN)\n );\n\n return { idleSeconds, maxSeconds };\n};\n\nexport const buildCookieOptionsWithExpiry = (\n type: 'refresh' | 'session',\n absoluteExpiresAtISO?: string,\n secureRequest?: boolean\n) => {\n const base = getRefreshCookieOptions(secureRequest);\n if (type === 'session') {\n return base;\n }\n\n const { idleSeconds } = getLifespansForType('refresh');\n const now = Date.now();\n const idleExpiry = now + idleSeconds * 1000;\n const absoluteExpiry = absoluteExpiresAtISO\n ? new Date(absoluteExpiresAtISO).getTime()\n : idleExpiry;\n const chosen = new Date(Math.min(idleExpiry, absoluteExpiry));\n\n return { ...base, expires: chosen, maxAge: Math.max(0, chosen.getTime() - now) };\n};\n\nexport const getSessionManager = (): Modules.SessionManager.SessionManagerService | null => {\n const manager = strapi.sessionManager as Modules.SessionManager.SessionManagerService | undefined;\n return manager ?? null;\n};\n\nexport const generateDeviceId = (): string => crypto.randomUUID();\n\nexport const extractDeviceParams = (\n requestBody: unknown\n): { deviceId: string; rememberMe: boolean } => {\n const body = (requestBody ?? {}) as { deviceId?: string; rememberMe?: boolean };\n const deviceId = body.deviceId || generateDeviceId();\n const rememberMe = Boolean(body.rememberMe);\n\n return { deviceId, rememberMe };\n};\n\nexport const buildSessionMetadataFromContext = (ctx: Context) =>\n buildSessionMetadata({\n userAgent: ctx.request.headers['user-agent'],\n });\n\n/**\n * Resolves the device id to use when revoking sessions on logout.\n * SSO assigns deviceId server-side, so the client-provided value may not match\n * the active session row. Prefer the deviceId stored on the session backing\n * the current access token when available.\n *\n * Callers should pass `ctx.state.session.id` from the admin auth strategy and\n * the already-parsed body `deviceId` — the logout route requires authentication,\n * so sessionId is expected to be present.\n */\nexport const resolveLogoutDeviceId = async (\n userId: string,\n sessionId: string | undefined,\n clientDeviceId: string | undefined\n): Promise<string | undefined> => {\n if (!sessionId) {\n strapi.log.debug('resolveLogoutDeviceId: no sessionId; falling back to client deviceId');\n return clientDeviceId;\n }\n\n const session = await strapi.db.query(SESSION_CONTENT_TYPE).findOne({\n where: { sessionId },\n });\n\n if (session?.userId !== userId || session?.origin !== ADMIN_ORIGIN) {\n strapi.log.debug(\n 'resolveLogoutDeviceId: access-token session missing or not owned; falling back to client deviceId'\n );\n return clientDeviceId;\n }\n\n return typeof session.deviceId === 'string' ? session.deviceId : clientDeviceId;\n};\n"],"names":["ADMIN_ORIGIN","SESSION_CONTENT_TYPE","REFRESH_COOKIE_NAME","warnViaStrapiLog","message","strapi","log","warn","getAccessCookieName","configured","config","get","resolveAuthCookieName","ADMIN_API_PREFIX","getConfiguredCookiePath","trim","undefined","getBrowserPath","key","absoluteUrl","URL","pathname","replace","getAdminApiPath","serverPath","apiPath","resolveAuthCookiePath","cookiePathMatches","cookiePath","requestPath","startsWith","endsWith","charAt","length","getAccessCookiePath","warnedRefreshCookiePaths","Set","getRefreshCookiePath","configuredPath","has","add","getAccessCookieDomain","resolveAuthCookieDomain","DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN","DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN","DEFAULT_MAX_SESSION_LIFESPAN","DEFAULT_IDLE_SESSION_LIFESPAN","getRefreshCookieOptions","secureRequest","configuredSecure","isProduction","process","env","NODE_ENV","domain","path","sameSite","isSecure","httpOnly","secure","overwrite","maxAge","getLifespansForType","type","idleSeconds","Number","maxSeconds","buildCookieOptionsWithExpiry","absoluteExpiresAtISO","base","now","Date","idleExpiry","absoluteExpiry","getTime","chosen","Math","min","expires","max","getSessionManager","manager","sessionManager","generateDeviceId","crypto","randomUUID","extractDeviceParams","requestBody","body","deviceId","rememberMe","Boolean","buildSessionMetadataFromContext","ctx","buildSessionMetadata","userAgent","request","headers","resolveLogoutDeviceId","userId","sessionId","clientDeviceId","debug","session","db","query","findOne","where","origin"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../../../../server/src/ai/services/ai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAS1C,QAAA,MAAM,oBAAoB,GAAI,YAAY;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE;uBAkBvC,OAAO;oCAGM,OAAO;mCAKR,OAAO;;;;;;;;;;;4BAiQjB,MAAM;yBACT,MAAM;gCACC,MAAM;kCACJ,OAAO;0BACf,OAAO;8BACH,MAAM;kCACF,MAAM;8BACV,MAAM;4BACR,MAAM;;0BAVE,MAAM;;CA4CzC,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../../../../server/src/ai/services/ai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAS1C,QAAA,MAAM,oBAAoB,GAAI,YAAY;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE;uBAkBvC,OAAO;oCAGM,OAAO;mCAKR,OAAO;;;;;;;;;;;4BAgQjB,MAAM;yBACT,MAAM;gCACC,MAAM;kCACJ,OAAO;0BACf,OAAO;8BACH,MAAM;kCACF,MAAM;8BACV,MAAM;4BACR,MAAM;;0BAVE,MAAM;;CA4CzC,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/admin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAcnC,OAAO,KAAK,EAEV,kBAAkB,EAClB,cAAc,EAOf,MAAM,iCAAiC,CAAC;AAezC;;GAEG;;sBAQuB,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC;;;;;;;;;;+BAmCvB,OAAO;6BAmBT,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;iBA6EnB,OAAO;;;;2BAmCG,OAAO;;;;;;;AA7KtC,wBAuLE"}
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/admin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAcnC,OAAO,KAAK,EAEV,kBAAkB,EAClB,cAAc,EAOf,MAAM,iCAAiC,CAAC;AA0BzC;;GAEG;;sBAQuB,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC;;;;;;;;;;+BAmCvB,OAAO;6BAmBT,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4EnB,OAAO;;;;2BAuBG,OAAO;;;;;;;AAhKtC,wBA0KE"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../server/src/domain/permission/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE,MAAM,MAAM,uBAAuB,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAC1D,UAAU,EACV,kBAAkB,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,IAAI,GAAG,WAAW,GAAG,WAAW,CAChG,CAAC;AAIF,eAAO,MAAM,gBAAgB,UAS5B,CAAC;AACF,eAAO,MAAM,yBAAyB,sFAO5B,CAAC;AAEX,eAAO,MAAM,wBAAwB,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,mBACb,CAAC;AAY9C;;;;;GAKG;AACH,eAAO,MAAM,YAAY,mEAOvB,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,eAAe,mEAK1B,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,WAAW,mEAGvB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GACtB,UAAU,MAAM,EAChB,OAAO,OAAO,EACd,YAAY,UAAU,KACrB,UAEF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,SAAS,MAAM,EACrD,UAAU,SAAS,EACnB,YAAY,UAAU,KACqC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AAEzF;;;GAGG;AACH,eAAO,MAAM,MAAM,GAAI,YAAY,uBAAuB,KACwB,UACjF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,4HAa9B,CAAC;AAEF;;;GAGG;AAEH,iBAAS,YAAY,CAAC,CAAC,SAAS,uBAAuB,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC;AACrF,iBAAS,YAAY,CAAC,CAAC,SAAS,uBAAuB,EAAE,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC;AAWjF,OAAO,EAAE,YAAY,EAAE,CAAC;;;;yBAzCW,uBAAuB,KACwB,UAAU;qBAV7D,SAAS,SAAS,MAAM,YAC3C,SAAS,cACP,UAAU,KACqC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;;;;;kCAxE7C,UAAU,KAAK,mBAAmB;4BAyDjE,MAAM,SACT,OAAO,cACF,UAAU,KACrB,UAAU;;;AA6Db,wBAYE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../server/src/domain/permission/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE,MAAM,MAAM,uBAAuB,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAC1D,UAAU,EACV,kBAAkB,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,IAAI,GAAG,WAAW,GAAG,WAAW,CAChG,CAAC;AAIF,eAAO,MAAM,gBAAgB,UAS5B,CAAC;AACF,eAAO,MAAM,yBAAyB,sFAO5B,CAAC;AAEX,eAAO,MAAM,wBAAwB,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,mBACb,CAAC;AAY9C;;;;;GAKG;AACH,eAAO,MAAM,YAAY,mEAOvB,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,eAAe,mEAK1B,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,WAAW,mEAEvB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GACtB,UAAU,MAAM,EAChB,OAAO,OAAO,EACd,YAAY,UAAU,KACrB,UAEF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,SAAS,MAAM,EACrD,UAAU,SAAS,EACnB,YAAY,UAAU,KACqC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AAEzF;;;GAGG;AACH,eAAO,MAAM,MAAM,GAAI,YAAY,uBAAuB,KACwB,UACjF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,4HAa9B,CAAC;AAEF;;;GAGG;AAEH,iBAAS,YAAY,CAAC,CAAC,SAAS,uBAAuB,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC;AACrF,iBAAS,YAAY,CAAC,CAAC,SAAS,uBAAuB,EAAE,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC;AAWjF,OAAO,EAAE,YAAY,EAAE,CAAC;;;;yBAzCW,uBAAuB,KACwB,UAAU;qBAV7D,SAAS,SAAS,MAAM,YAC3C,SAAS,cACP,UAAU,KACqC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;;;;;kCAvE7C,UAAU,KAAK,mBAAmB;4BAwDjE,MAAM,SACT,OAAO,cACF,UAAU,KACrB,UAAU;;;AA6Db,wBAYE"}
@@ -1,6 +1,7 @@
1
1
  declare const constants: {
2
2
  CONTENT_TYPE_SECTION: string;
3
3
  SUPER_ADMIN_CODE: string;
4
+ ROLE_TEXT_MAX_LENGTH: number;
4
5
  EDITOR_CODE: string;
5
6
  AUTHOR_CODE: string;
6
7
  READ_ACTION: string;
@@ -8,6 +9,7 @@ declare const constants: {
8
9
  UPDATE_ACTION: string;
9
10
  DELETE_ACTION: string;
10
11
  PUBLISH_ACTION: string;
12
+ TOKEN_TEXT_MAX_LENGTH: number;
11
13
  API_TOKEN_TYPE: {
12
14
  READ_ONLY: string;
13
15
  FULL_ACCESS: string;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../server/src/services/constants.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDd,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../server/src/services/constants.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDd,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"rename-fields.d.ts","sourceRoot":"","sources":["../../../../../server/src/services/permission/rename-fields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAU,MAAM,eAAe,CAAC;AAIlD,KAAK,sBAAsB,GAAG,UAAU,CACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,gCAAgC,CAAC,CAC9D,CAAC,CAAC,CAAC,CAAC;AAYL;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,4BAA4B,GAAI,aAE1C;IACD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;CACrB,KAAG,sBA2GH,CAAC"}
1
+ {"version":3,"file":"rename-fields.d.ts","sourceRoot":"","sources":["../../../../../server/src/services/permission/rename-fields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAU,MAAM,eAAe,CAAC;AAIlD,KAAK,sBAAsB,GAAG,UAAU,CACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,gCAAgC,CAAC,CAC9D,CAAC,CAAC,CAAC,CAAC;AAYL;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,4BAA4B,GAAI,aAE1C;IACD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;CACrB,KAAG,sBA0GH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../../../../server/src/services/permission/sections-builder/handlers.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAIrD,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,GAAG,EAAE,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,MAAM,EAAE,CAAC;AAE1C;;;;;;GAMG;AACH,QAAA,MAAM,QAAQ,GAAI,qBAAqB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,kBAAkB,CAAA;CAAE,SAWrF,CAAC;AAEF;;;;;;GAMG;AACH,QAAA,MAAM,OAAO,GAAI,qBAAqB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,kBAAkB,CAAA;CAAE,SAUpF,CAAC;AAEF;;;;;;GAMG;AACH,QAAA,MAAM,gBAAgB,GAAI,sBAGvB;IACD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,mBAAmB,CAAC;CAC9B,SAsBA,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,kBAAkB,GACrB,MAAM,MAAM,MACZ,0CAA0C;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,SA2B1F,CAAC;AA2BJ;;GAEG;AACH,QAAA,MAAM,cAAc,GAAI,qBAAqB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,SAkB5F,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../../../../server/src/services/permission/sections-builder/handlers.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAIrD,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,GAAG,EAAE,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,MAAM,EAAE,CAAC;AAE1C;;;;;;GAMG;AACH,QAAA,MAAM,QAAQ,GAAI,qBAAqB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,kBAAkB,CAAA;CAAE,SAWrF,CAAC;AAEF;;;;;;GAMG;AACH,QAAA,MAAM,OAAO,GAAI,qBAAqB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,kBAAkB,CAAA;CAAE,SAUpF,CAAC;AAEF;;;;;;GAMG;AACH,QAAA,MAAM,gBAAgB,GAAI,sBAGvB;IACD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,mBAAmB,CAAC;CAC9B,SAqBA,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,kBAAkB,GACrB,MAAM,MAAM,MACZ,0CAA0C;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,SA2B1F,CAAC;AA2BJ;;GAEG;AACH,QAAA,MAAM,cAAc,GAAI,qBAAqB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,SAkB5F,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"role.d.ts","sourceRoot":"","sources":["../../../../server/src/services/role.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiB,KAAK,IAAI,UAAU,EAAU,MAAM,eAAe,CAAC;AAC3E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAwBzF,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;;;;;;;;;;;;;;;;mBAHnD,CAAC,SAAS,MAAM,QAAQ,CAAC,KAAG,IAAI,CAAC,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;yBAyBhD,OAAO,CAAC,SAAS,CAAC,KAAG,OAAO,CAAC,SAAS,CAAC;sCA0BhC,OAAO,KAAG,OAAO,CAAC,SAAS,CAAC;oDAWxD,OAAO,KACjB,OAAO,CAAC,uBAAuB,CAAC;6CAeE,OAAO,KAAG,OAAO,CAAC,SAAS,EAAE,CAAC;oCAOtB,GAAG,KAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;qBAiBvD,GAAG,cAAc,OAAO,CAAC,SAAS,CAAC,KAAG,OAAO,CAAC,SAAS,CAAC;sBA4BjD,OAAO,KAAG,OAAO,CAAC,OAAO,CAAC;qBAS3B,GAAG,KAAG,OAAO,CAAC,MAAM,CAAC;wBA2BlB,IAAI,CAAC,EAAE,EAAE,KAAG,OAAO,CAAC,SAAS,EAAE,CAAC;4BAoBlC,IAAI,CAAC,EAAE,KAAG,OAAO,CAAC,MAAM,CAAC;yBAMpC,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;;;;6BAsKlB,IAAI,CAAC,EAAE,eAAe,GAAG;8BAiE9B,SAAS,KAAG,OAAO;gCAhI1C,IAAI,CAAC,EAAE,gBACF,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC,CAAC;;oCArJxB,IAAI,CAAC,EAAE,EAAE;;;;;AA8R5D,wBAuBE"}
1
+ {"version":3,"file":"role.d.ts","sourceRoot":"","sources":["../../../../server/src/services/role.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiB,KAAK,IAAI,UAAU,EAAU,MAAM,eAAe,CAAC;AAC3E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAwBzF,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;;;;;;;;;;;;;;;;mBAHnD,CAAC,SAAS,MAAM,QAAQ,CAAC,KAAG,IAAI,CAAC,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;yBAyBhD,OAAO,CAAC,SAAS,CAAC,KAAG,OAAO,CAAC,SAAS,CAAC;sCAgChC,OAAO,KAAG,OAAO,CAAC,SAAS,CAAC;oDAWxD,OAAO,KACjB,OAAO,CAAC,uBAAuB,CAAC;6CAeE,OAAO,KAAG,OAAO,CAAC,SAAS,EAAE,CAAC;oCAOtB,GAAG,KAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;qBAiBvD,GAAG,cAAc,OAAO,CAAC,SAAS,CAAC,KAAG,OAAO,CAAC,SAAS,CAAC;sBA4BjD,OAAO,KAAG,OAAO,CAAC,OAAO,CAAC;qBAS3B,GAAG,KAAG,OAAO,CAAC,MAAM,CAAC;wBA2BlB,IAAI,CAAC,EAAE,EAAE,KAAG,OAAO,CAAC,SAAS,EAAE,CAAC;4BAoBlC,IAAI,CAAC,EAAE,KAAG,OAAO,CAAC,MAAM,CAAC;yBAMpC,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;;;;6BAwKlB,IAAI,CAAC,EAAE,eAAe,GAAG;8BAiE9B,SAAS,KAAG,OAAO;gCAlI1C,IAAI,CAAC,EAAE,gBACF,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC,CAAC;;oCArJxB,IAAI,CAAC,EAAE,EAAE;;;;;AAgS5D,wBAuBE"}
@@ -1 +1 @@
1
- {"version":3,"file":"role.d.ts","sourceRoot":"","sources":["../../../../server/src/validation/role.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAqB,MAAM,eAAe,CAAC;AA6DvD,eAAO,MAAM,uBAAuB;;;IAAsC,CAAC;AAC3E,eAAO,MAAM,uBAAuB;;;IAAsC,CAAC;AAC3E,eAAO,MAAM,wBAAwB;;IAAuC,CAAC;AAC7E,eAAO,MAAM,uBAAuB,wDAAsC,CAAC;;;;;;;;;;;;;;;AAE3E,wBAKE"}
1
+ {"version":3,"file":"role.d.ts","sourceRoot":"","sources":["../../../../server/src/validation/role.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAqB,MAAM,eAAe,CAAC;AAgEvD,eAAO,MAAM,uBAAuB;;;IAAsC,CAAC;AAC3E,eAAO,MAAM,uBAAuB;;;IAAsC,CAAC;AAC3E,eAAO,MAAM,wBAAwB;;IAAuC,CAAC;AAC7E,eAAO,MAAM,uBAAuB,wDAAsC,CAAC;;;;;;;;;;;;;;;AAE3E,wBAKE"}
@@ -1 +1 @@
1
- {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../../shared/contracts/transfer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../../shared/contracts/transfer.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,20 @@
1
1
  /**
2
- * Path attribute of the admin auth (access) token cookie, configurable
3
- * through `admin.auth.cookie.path` so multiple Strapi instances on the same
4
- * parent domain can keep separate cookies (e.g. `/strapi-de/admin`).
2
+ * Validates the Path attribute of the admin auth cookies. The path is
3
+ * configurable through `admin.auth.cookie.path` so multiple Strapi instances
4
+ * on the same parent domain can keep separate cookies (e.g. `/strapi-de/admin`).
5
5
  *
6
6
  * Browser-safe single source for both sides of the handoff: the admin panel
7
- * cannot read server config, so the build transports the config value into
8
- * the bundle through the internal `STRAPI_ADMIN_AUTH_COOKIE_PATH` variable
9
- * (see create-build-context.ts in @strapi/strapi); the server resolves the
10
- * same config at runtime. Changing the path requires an admin rebuild, like
11
- * any other admin config change.
7
+ * cannot read server config, so the build transports the access cookie path
8
+ * into the bundle through the internal `STRAPI_ADMIN_AUTH_COOKIE_PATH`
9
+ * variable (see create-build-context.ts in @strapi/strapi); the server
10
+ * resolves the same config at runtime. Changing the path requires an admin
11
+ * rebuild, like any other admin config change.
12
12
  *
13
- * Defaults to `/admin` to match the refresh-cookie path used by
14
- * `getRefreshCookieOptions`.
13
+ * The callers pick the value to validate (see session-auth.ts). When
14
+ * `admin.auth.cookie.path` is unset, the access cookie follows the path the
15
+ * panel is served from (`admin.url`) and the refresh cookie follows the admin
16
+ * API (`/admin`), each behind any `server.url` subpath.
17
+ * `DEFAULT_AUTH_COOKIE_PATH` is only the fallback for a missing or invalid value.
15
18
  */
16
19
  export declare const DEFAULT_AUTH_COOKIE_PATH = "/admin";
17
20
  export declare const resolveAuthCookiePath: (configuredPath?: string, warn?: (message: string) => void) => string;