@strapi/admin 5.43.0 → 5.45.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 (384) hide show
  1. package/dist/admin/admin/src/StrapiApp.js +17 -4
  2. package/dist/admin/admin/src/StrapiApp.js.map +1 -1
  3. package/dist/admin/admin/src/StrapiApp.mjs +18 -5
  4. package/dist/admin/admin/src/StrapiApp.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/Form.js +18 -8
  6. package/dist/admin/admin/src/components/Form.js.map +1 -1
  7. package/dist/admin/admin/src/components/Form.mjs +18 -8
  8. package/dist/admin/admin/src/components/Form.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/Layouts/Layout.js +1 -0
  10. package/dist/admin/admin/src/components/Layouts/Layout.js.map +1 -1
  11. package/dist/admin/admin/src/components/Layouts/Layout.mjs +1 -0
  12. package/dist/admin/admin/src/components/Layouts/Layout.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/Table.js.map +1 -1
  14. package/dist/admin/admin/src/components/Table.mjs.map +1 -1
  15. package/dist/admin/admin/src/components/Widgets.js +52 -0
  16. package/dist/admin/admin/src/components/Widgets.js.map +1 -1
  17. package/dist/admin/admin/src/components/Widgets.mjs +54 -3
  18. package/dist/admin/admin/src/components/Widgets.mjs.map +1 -1
  19. package/dist/admin/admin/src/constants.js +49 -0
  20. package/dist/admin/admin/src/constants.js.map +1 -1
  21. package/dist/admin/admin/src/constants.mjs +49 -0
  22. package/dist/admin/admin/src/constants.mjs.map +1 -1
  23. package/dist/admin/admin/src/core/apis/router.js +4 -4
  24. package/dist/admin/admin/src/core/apis/router.js.map +1 -1
  25. package/dist/admin/admin/src/core/apis/router.mjs +4 -4
  26. package/dist/admin/admin/src/core/apis/router.mjs.map +1 -1
  27. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  28. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  29. package/dist/admin/admin/src/pages/Settings/{pages/ApiTokens/EditView/components → components/Tokens}/FormApiTokenContainer.js +48 -11
  30. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.js.map +1 -0
  31. package/dist/admin/admin/src/pages/Settings/{pages/ApiTokens/EditView/components → components/Tokens}/FormApiTokenContainer.mjs +49 -12
  32. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.mjs.map +1 -0
  33. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js +1 -1
  34. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js.map +1 -1
  35. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs +1 -1
  36. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs.map +1 -1
  37. package/dist/admin/admin/src/pages/Settings/components/Tokens/LifeSpanInput.js +1 -1
  38. package/dist/admin/admin/src/pages/Settings/components/Tokens/LifeSpanInput.js.map +1 -1
  39. package/dist/admin/admin/src/pages/Settings/components/Tokens/LifeSpanInput.mjs +1 -1
  40. package/dist/admin/admin/src/pages/Settings/components/Tokens/LifeSpanInput.mjs.map +1 -1
  41. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js +21 -1
  42. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js.map +1 -1
  43. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.mjs +21 -1
  44. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.mjs.map +1 -1
  45. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js +1 -1
  46. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js.map +1 -1
  47. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.mjs +1 -1
  48. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.mjs.map +1 -1
  49. package/dist/admin/admin/src/pages/Settings/components/Tokens/constants.js +33 -0
  50. package/dist/admin/admin/src/pages/Settings/components/Tokens/constants.js.map +1 -1
  51. package/dist/admin/admin/src/pages/Settings/components/Tokens/constants.mjs +14 -1
  52. package/dist/admin/admin/src/pages/Settings/components/Tokens/constants.mjs.map +1 -1
  53. package/dist/admin/admin/src/pages/Settings/{pages/ApiTokens/EditView → components/Tokens}/utils/getDateOfExpiration.js +1 -1
  54. package/dist/admin/admin/src/pages/Settings/components/Tokens/utils/getDateOfExpiration.js.map +1 -0
  55. package/dist/admin/admin/src/pages/Settings/{pages/ApiTokens/EditView → components/Tokens}/utils/getDateOfExpiration.mjs +1 -1
  56. package/dist/admin/admin/src/pages/Settings/components/Tokens/utils/getDateOfExpiration.mjs.map +1 -0
  57. package/dist/admin/admin/src/pages/Settings/constants.js +182 -151
  58. package/dist/admin/admin/src/pages/Settings/constants.js.map +1 -1
  59. package/dist/admin/admin/src/pages/Settings/constants.mjs +182 -151
  60. package/dist/admin/admin/src/pages/Settings/constants.mjs.map +1 -1
  61. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/CreateView.js +17 -0
  62. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/CreateView.js.map +1 -0
  63. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/CreateView.mjs +15 -0
  64. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/CreateView.mjs.map +1 -0
  65. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.js +314 -0
  66. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.js.map +1 -0
  67. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.mjs +292 -0
  68. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.mjs.map +1 -0
  69. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.js +70 -0
  70. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.js.map +1 -0
  71. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.mjs +49 -0
  72. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.mjs.map +1 -0
  73. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/ListView.js +254 -0
  74. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/ListView.js.map +1 -0
  75. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/ListView.mjs +231 -0
  76. package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/ListView.mjs.map +1 -0
  77. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js +42 -33
  78. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js.map +1 -1
  79. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.mjs +43 -34
  80. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.mjs.map +1 -1
  81. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js +3 -2
  82. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js.map +1 -1
  83. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs +3 -2
  84. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs.map +1 -1
  85. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js +23 -12
  86. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js.map +1 -1
  87. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.mjs +23 -12
  88. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.mjs.map +1 -1
  89. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.js +124 -35
  90. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.js.map +1 -1
  91. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.mjs +126 -37
  92. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.mjs.map +1 -1
  93. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js +24 -9
  94. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js.map +1 -1
  95. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs +24 -9
  96. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs.map +1 -1
  97. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.js +5 -3
  98. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.js.map +1 -1
  99. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.mjs +5 -3
  100. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.mjs.map +1 -1
  101. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js +171 -36
  102. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js.map +1 -1
  103. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs +172 -37
  104. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs.map +1 -1
  105. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js +5 -3
  106. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js.map +1 -1
  107. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.mjs +5 -3
  108. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.mjs.map +1 -1
  109. package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.js +59 -1
  110. package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.js.map +1 -1
  111. package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.mjs +40 -1
  112. package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.mjs.map +1 -1
  113. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/createPermissionChecker.js +89 -0
  114. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/createPermissionChecker.js.map +1 -0
  115. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/createPermissionChecker.mjs +86 -0
  116. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/createPermissionChecker.mjs.map +1 -0
  117. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/updateValues.js +35 -9
  118. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/updateValues.js.map +1 -1
  119. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/updateValues.mjs +35 -10
  120. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/updateValues.mjs.map +1 -1
  121. package/dist/admin/admin/src/render.js +6 -3
  122. package/dist/admin/admin/src/render.js.map +1 -1
  123. package/dist/admin/admin/src/render.mjs +6 -3
  124. package/dist/admin/admin/src/render.mjs.map +1 -1
  125. package/dist/admin/admin/src/router.js +4 -4
  126. package/dist/admin/admin/src/router.js.map +1 -1
  127. package/dist/admin/admin/src/router.mjs +1 -1
  128. package/dist/admin/admin/src/router.mjs.map +1 -1
  129. package/dist/admin/admin/src/services/apiTokens.js +85 -2
  130. package/dist/admin/admin/src/services/apiTokens.js.map +1 -1
  131. package/dist/admin/admin/src/services/apiTokens.mjs +80 -3
  132. package/dist/admin/admin/src/services/apiTokens.mjs.map +1 -1
  133. package/dist/admin/admin/src/translations/ar.json.js +4 -1
  134. package/dist/admin/admin/src/translations/ar.json.js.map +1 -1
  135. package/dist/admin/admin/src/translations/ar.json.mjs +4 -1
  136. package/dist/admin/admin/src/translations/ar.json.mjs.map +1 -1
  137. package/dist/admin/admin/src/translations/cs.json.js +736 -13
  138. package/dist/admin/admin/src/translations/cs.json.js.map +1 -1
  139. package/dist/admin/admin/src/translations/cs.json.mjs +728 -14
  140. package/dist/admin/admin/src/translations/cs.json.mjs.map +1 -1
  141. package/dist/admin/admin/src/translations/de.json.js +4 -1
  142. package/dist/admin/admin/src/translations/de.json.js.map +1 -1
  143. package/dist/admin/admin/src/translations/de.json.mjs +4 -1
  144. package/dist/admin/admin/src/translations/de.json.mjs.map +1 -1
  145. package/dist/admin/admin/src/translations/en.json.js +20 -2
  146. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  147. package/dist/admin/admin/src/translations/en.json.mjs +20 -2
  148. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  149. package/dist/admin/admin/src/translations/es.json.js +4 -1
  150. package/dist/admin/admin/src/translations/es.json.js.map +1 -1
  151. package/dist/admin/admin/src/translations/es.json.mjs +4 -1
  152. package/dist/admin/admin/src/translations/es.json.mjs.map +1 -1
  153. package/dist/admin/admin/src/translations/fr.json.js +4 -1
  154. package/dist/admin/admin/src/translations/fr.json.js.map +1 -1
  155. package/dist/admin/admin/src/translations/fr.json.mjs +4 -1
  156. package/dist/admin/admin/src/translations/fr.json.mjs.map +1 -1
  157. package/dist/admin/admin/src/translations/it.json.js +4 -1
  158. package/dist/admin/admin/src/translations/it.json.js.map +1 -1
  159. package/dist/admin/admin/src/translations/it.json.mjs +4 -1
  160. package/dist/admin/admin/src/translations/it.json.mjs.map +1 -1
  161. package/dist/admin/admin/src/translations/ru.json.js +32 -19
  162. package/dist/admin/admin/src/translations/ru.json.js.map +1 -1
  163. package/dist/admin/admin/src/translations/ru.json.mjs +32 -19
  164. package/dist/admin/admin/src/translations/ru.json.mjs.map +1 -1
  165. package/dist/admin/admin/src/translations/zh-Hans.json.js +4 -1
  166. package/dist/admin/admin/src/translations/zh-Hans.json.js.map +1 -1
  167. package/dist/admin/admin/src/translations/zh-Hans.json.mjs +4 -1
  168. package/dist/admin/admin/src/translations/zh-Hans.json.mjs.map +1 -1
  169. package/dist/admin/admin/src/utils/getFetchClient.js +33 -4
  170. package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
  171. package/dist/admin/admin/src/utils/getFetchClient.mjs +33 -4
  172. package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
  173. package/dist/admin/admin/tests/server.js +99 -21
  174. package/dist/admin/admin/tests/server.js.map +1 -1
  175. package/dist/admin/admin/tests/server.mjs +99 -21
  176. package/dist/admin/admin/tests/server.mjs.map +1 -1
  177. package/dist/admin/src/components/Widgets.d.ts +2 -1
  178. package/dist/admin/src/constants.d.ts +26 -0
  179. package/dist/admin/src/core/apis/router.d.ts +1 -1
  180. package/dist/admin/src/features/Tracking.d.ts +2 -1
  181. package/dist/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.d.ts +24 -0
  182. package/dist/admin/src/pages/Settings/components/Tokens/Table.d.ts +2 -1
  183. package/dist/admin/src/pages/Settings/components/Tokens/constants.d.ts +17 -0
  184. package/dist/admin/src/pages/Settings/constants.d.ts +1 -1
  185. package/dist/admin/src/pages/Settings/pages/AdminTokens/CreateView.d.ts +1 -0
  186. package/dist/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.d.ts +2 -0
  187. package/dist/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.d.ts +13 -0
  188. package/dist/admin/src/pages/Settings/pages/AdminTokens/ListView.d.ts +2 -0
  189. package/dist/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.d.ts +4 -3
  190. package/dist/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.d.ts +3 -1
  191. package/dist/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.d.ts +1 -0
  192. package/dist/admin/src/pages/Settings/pages/Roles/components/Permissions.d.ts +5 -0
  193. package/dist/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.d.ts +8 -7
  194. package/dist/admin/src/pages/Settings/pages/Roles/utils/createPermissionChecker.d.ts +27 -0
  195. package/dist/admin/src/pages/Settings/pages/Roles/utils/updateValues.d.ts +8 -2
  196. package/dist/admin/src/services/apiTokens.d.ts +5 -2
  197. package/dist/admin/src/types/permissions.d.ts +1 -1
  198. package/dist/admin/src/utils/getFetchClient.d.ts +14 -1
  199. package/dist/server/server/src/bootstrap.js +37 -5
  200. package/dist/server/server/src/bootstrap.js.map +1 -1
  201. package/dist/server/server/src/bootstrap.mjs +37 -5
  202. package/dist/server/server/src/bootstrap.mjs.map +1 -1
  203. package/dist/server/server/src/config/admin-actions.js +48 -0
  204. package/dist/server/server/src/config/admin-actions.js.map +1 -1
  205. package/dist/server/server/src/config/admin-actions.mjs +48 -0
  206. package/dist/server/server/src/config/admin-actions.mjs.map +1 -1
  207. package/dist/server/server/src/content-types/Permission.js +10 -1
  208. package/dist/server/server/src/content-types/Permission.js.map +1 -1
  209. package/dist/server/server/src/content-types/Permission.mjs +10 -1
  210. package/dist/server/server/src/content-types/Permission.mjs.map +1 -1
  211. package/dist/server/server/src/content-types/User.js +8 -0
  212. package/dist/server/server/src/content-types/User.js.map +1 -1
  213. package/dist/server/server/src/content-types/User.mjs +8 -0
  214. package/dist/server/server/src/content-types/User.mjs.map +1 -1
  215. package/dist/server/server/src/content-types/api-token.js +27 -1
  216. package/dist/server/server/src/content-types/api-token.js.map +1 -1
  217. package/dist/server/server/src/content-types/api-token.mjs +27 -1
  218. package/dist/server/server/src/content-types/api-token.mjs.map +1 -1
  219. package/dist/server/server/src/controllers/admin-token.js +194 -0
  220. package/dist/server/server/src/controllers/admin-token.js.map +1 -0
  221. package/dist/server/server/src/controllers/admin-token.mjs +192 -0
  222. package/dist/server/server/src/controllers/admin-token.mjs.map +1 -0
  223. package/dist/server/server/src/controllers/api-token.js +48 -47
  224. package/dist/server/server/src/controllers/api-token.js.map +1 -1
  225. package/dist/server/server/src/controllers/api-token.mjs +48 -47
  226. package/dist/server/server/src/controllers/api-token.mjs.map +1 -1
  227. package/dist/server/server/src/controllers/index.js +2 -0
  228. package/dist/server/server/src/controllers/index.js.map +1 -1
  229. package/dist/server/server/src/controllers/index.mjs +2 -0
  230. package/dist/server/server/src/controllers/index.mjs.map +1 -1
  231. package/dist/server/server/src/domain/permission/index.js +2 -1
  232. package/dist/server/server/src/domain/permission/index.js.map +1 -1
  233. package/dist/server/server/src/domain/permission/index.mjs +2 -1
  234. package/dist/server/server/src/domain/permission/index.mjs.map +1 -1
  235. package/dist/server/server/src/policies/index.js +2 -0
  236. package/dist/server/server/src/policies/index.js.map +1 -1
  237. package/dist/server/server/src/policies/index.mjs +2 -0
  238. package/dist/server/server/src/policies/index.mjs.map +1 -1
  239. package/dist/server/server/src/policies/isAdminTokensEnabled.js +16 -0
  240. package/dist/server/server/src/policies/isAdminTokensEnabled.js.map +1 -0
  241. package/dist/server/server/src/policies/isAdminTokensEnabled.mjs +14 -0
  242. package/dist/server/server/src/policies/isAdminTokensEnabled.mjs.map +1 -0
  243. package/dist/server/server/src/register.js +4 -2
  244. package/dist/server/server/src/register.js.map +1 -1
  245. package/dist/server/server/src/register.mjs +4 -2
  246. package/dist/server/server/src/register.mjs.map +1 -1
  247. package/dist/server/server/src/routes/admin-tokens.js +140 -0
  248. package/dist/server/server/src/routes/admin-tokens.js.map +1 -0
  249. package/dist/server/server/src/routes/admin-tokens.mjs +138 -0
  250. package/dist/server/server/src/routes/admin-tokens.mjs.map +1 -0
  251. package/dist/server/server/src/routes/index.js +2 -0
  252. package/dist/server/server/src/routes/index.js.map +1 -1
  253. package/dist/server/server/src/routes/index.mjs +2 -0
  254. package/dist/server/server/src/routes/index.mjs.map +1 -1
  255. package/dist/server/server/src/services/api-token.js +805 -101
  256. package/dist/server/server/src/services/api-token.js.map +1 -1
  257. package/dist/server/server/src/services/api-token.mjs +800 -101
  258. package/dist/server/server/src/services/api-token.mjs.map +1 -1
  259. package/dist/server/server/src/services/constants.js +2 -0
  260. package/dist/server/server/src/services/constants.js.map +1 -1
  261. package/dist/server/server/src/services/constants.mjs +2 -0
  262. package/dist/server/server/src/services/constants.mjs.map +1 -1
  263. package/dist/server/server/src/services/homepage.js +1 -1
  264. package/dist/server/server/src/services/homepage.js.map +1 -1
  265. package/dist/server/server/src/services/homepage.mjs +1 -1
  266. package/dist/server/server/src/services/homepage.mjs.map +1 -1
  267. package/dist/server/server/src/services/index.js +2 -1
  268. package/dist/server/server/src/services/index.js.map +1 -1
  269. package/dist/server/server/src/services/index.mjs +3 -2
  270. package/dist/server/server/src/services/index.mjs.map +1 -1
  271. package/dist/server/server/src/services/permission/engine.js +6 -0
  272. package/dist/server/server/src/services/permission/engine.js.map +1 -1
  273. package/dist/server/server/src/services/permission/engine.mjs +6 -0
  274. package/dist/server/server/src/services/permission/engine.mjs.map +1 -1
  275. package/dist/server/server/src/services/permission/queries.js +11 -2
  276. package/dist/server/server/src/services/permission/queries.js.map +1 -1
  277. package/dist/server/server/src/services/permission/queries.mjs +12 -3
  278. package/dist/server/server/src/services/permission/queries.mjs.map +1 -1
  279. package/dist/server/server/src/services/role.js +3 -0
  280. package/dist/server/server/src/services/role.js.map +1 -1
  281. package/dist/server/server/src/services/role.mjs +3 -0
  282. package/dist/server/server/src/services/role.mjs.map +1 -1
  283. package/dist/server/server/src/strategies/admin-token.js +110 -0
  284. package/dist/server/server/src/strategies/admin-token.js.map +1 -0
  285. package/dist/server/server/src/strategies/admin-token.mjs +104 -0
  286. package/dist/server/server/src/strategies/admin-token.mjs.map +1 -0
  287. package/dist/server/server/src/strategies/api-token-utils.js +56 -0
  288. package/dist/server/server/src/strategies/api-token-utils.js.map +1 -0
  289. package/dist/server/server/src/strategies/api-token-utils.mjs +52 -0
  290. package/dist/server/server/src/strategies/api-token-utils.mjs.map +1 -0
  291. package/dist/server/server/src/strategies/content-api-token.js +104 -0
  292. package/dist/server/server/src/strategies/content-api-token.js.map +1 -0
  293. package/dist/server/server/src/strategies/content-api-token.mjs +98 -0
  294. package/dist/server/server/src/strategies/content-api-token.mjs.map +1 -0
  295. package/dist/server/server/src/validation/admin-tokens.js +28 -0
  296. package/dist/server/server/src/validation/admin-tokens.js.map +1 -0
  297. package/dist/server/server/src/validation/admin-tokens.mjs +25 -0
  298. package/dist/server/server/src/validation/admin-tokens.mjs.map +1 -0
  299. package/dist/server/server/src/validation/api-tokens.js +5 -2
  300. package/dist/server/server/src/validation/api-tokens.js.map +1 -1
  301. package/dist/server/server/src/validation/api-tokens.mjs +5 -2
  302. package/dist/server/server/src/validation/api-tokens.mjs.map +1 -1
  303. package/dist/server/server/src/validation/project-settings.js +15 -16
  304. package/dist/server/server/src/validation/project-settings.js.map +1 -1
  305. package/dist/server/server/src/validation/project-settings.mjs +4 -5
  306. package/dist/server/server/src/validation/project-settings.mjs.map +1 -1
  307. package/dist/server/src/bootstrap.d.ts.map +1 -1
  308. package/dist/server/src/config/admin-actions.d.ts.map +1 -1
  309. package/dist/server/src/content-types/Permission.d.ts +9 -0
  310. package/dist/server/src/content-types/Permission.d.ts.map +1 -1
  311. package/dist/server/src/content-types/User.d.ts +8 -0
  312. package/dist/server/src/content-types/User.d.ts.map +1 -1
  313. package/dist/server/src/content-types/api-token.d.ts +23 -0
  314. package/dist/server/src/content-types/api-token.d.ts.map +1 -1
  315. package/dist/server/src/content-types/index.d.ts +40 -0
  316. package/dist/server/src/content-types/index.d.ts.map +1 -1
  317. package/dist/server/src/controllers/admin-token.d.ts +12 -0
  318. package/dist/server/src/controllers/admin-token.d.ts.map +1 -0
  319. package/dist/server/src/controllers/api-token.d.ts +0 -1
  320. package/dist/server/src/controllers/api-token.d.ts.map +1 -1
  321. package/dist/server/src/controllers/index.d.ts +9 -1
  322. package/dist/server/src/controllers/index.d.ts.map +1 -1
  323. package/dist/server/src/domain/permission/index.d.ts.map +1 -1
  324. package/dist/server/src/index.d.ts +56 -2
  325. package/dist/server/src/index.d.ts.map +1 -1
  326. package/dist/server/src/policies/index.d.ts +5 -0
  327. package/dist/server/src/policies/index.d.ts.map +1 -1
  328. package/dist/server/src/policies/isAdminTokensEnabled.d.ts +7 -0
  329. package/dist/server/src/policies/isAdminTokensEnabled.d.ts.map +1 -0
  330. package/dist/server/src/register.d.ts.map +1 -1
  331. package/dist/server/src/routes/admin-tokens.d.ts +15 -0
  332. package/dist/server/src/routes/admin-tokens.d.ts.map +1 -0
  333. package/dist/server/src/routes/index.d.ts.map +1 -1
  334. package/dist/server/src/services/api-token.d.ts +136 -12
  335. package/dist/server/src/services/api-token.d.ts.map +1 -1
  336. package/dist/server/src/services/constants.d.ts +13 -11
  337. package/dist/server/src/services/constants.d.ts.map +1 -1
  338. package/dist/server/src/services/index.d.ts +2 -2
  339. package/dist/server/src/services/index.d.ts.map +1 -1
  340. package/dist/server/src/services/permission/engine.d.ts +5 -0
  341. package/dist/server/src/services/permission/engine.d.ts.map +1 -1
  342. package/dist/server/src/services/permission/queries.d.ts.map +1 -1
  343. package/dist/server/src/services/permission.d.ts +1 -0
  344. package/dist/server/src/services/permission.d.ts.map +1 -1
  345. package/dist/server/src/services/role.d.ts.map +1 -1
  346. package/dist/server/src/strategies/admin-token.d.ts +51 -0
  347. package/dist/server/src/strategies/admin-token.d.ts.map +1 -0
  348. package/dist/server/src/strategies/api-token-utils.d.ts +13 -0
  349. package/dist/server/src/strategies/api-token-utils.d.ts.map +1 -0
  350. package/dist/server/src/strategies/{api-token.d.ts → content-api-token.d.ts} +10 -11
  351. package/dist/server/src/strategies/content-api-token.d.ts.map +1 -0
  352. package/dist/server/src/strategies/index.d.ts +2 -1
  353. package/dist/server/src/strategies/index.d.ts.map +1 -1
  354. package/dist/server/src/validation/admin-tokens.d.ts +75 -0
  355. package/dist/server/src/validation/admin-tokens.d.ts.map +1 -0
  356. package/dist/server/src/validation/api-tokens.d.ts +4 -2
  357. package/dist/server/src/validation/api-tokens.d.ts.map +1 -1
  358. package/dist/server/src/validation/project-settings.d.ts +10 -10
  359. package/dist/server/src/validation/project-settings.d.ts.map +1 -1
  360. package/dist/shared/contracts/admin-token.d.ts +122 -0
  361. package/dist/shared/contracts/admin-token.d.ts.map +1 -0
  362. package/dist/shared/contracts/api-token.d.ts +6 -95
  363. package/dist/shared/contracts/api-token.d.ts.map +1 -1
  364. package/dist/shared/contracts/content-api-token.d.ts +97 -0
  365. package/dist/shared/contracts/content-api-token.d.ts.map +1 -0
  366. package/dist/shared/contracts/shared.d.ts +1 -0
  367. package/dist/shared/contracts/shared.d.ts.map +1 -1
  368. package/package.json +10 -10
  369. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/FormApiTokenContainer.js.map +0 -1
  370. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/FormApiTokenContainer.mjs.map +0 -1
  371. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/constants.js +0 -37
  372. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/constants.js.map +0 -1
  373. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/constants.mjs +0 -16
  374. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/constants.mjs.map +0 -1
  375. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/getDateOfExpiration.js.map +0 -1
  376. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/getDateOfExpiration.mjs.map +0 -1
  377. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/FormApiTokenContainer.d.ts +0 -20
  378. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/constants.d.ts +0 -17
  379. package/dist/server/server/src/strategies/api-token.js +0 -144
  380. package/dist/server/server/src/strategies/api-token.js.map +0 -1
  381. package/dist/server/server/src/strategies/api-token.mjs +0 -138
  382. package/dist/server/server/src/strategies/api-token.mjs.map +0 -1
  383. package/dist/server/src/strategies/api-token.d.ts.map +0 -1
  384. /package/dist/admin/src/pages/Settings/{pages/ApiTokens/EditView → components/Tokens}/utils/getDateOfExpiration.d.ts +0 -0
@@ -0,0 +1,24 @@
1
+ import * as React from 'react';
2
+ import { FormikErrors } from 'formik';
3
+ import type { ApiToken, ContentApiApiToken } from '../../../../../../shared/contracts/api-token';
4
+ interface FormApiTokenContainerProps {
5
+ errors?: FormikErrors<Pick<ContentApiApiToken, 'name' | 'description' | 'lifespan' | 'type'>>;
6
+ onChange: ({ target: { name, value } }: {
7
+ target: {
8
+ name: string;
9
+ value: string;
10
+ };
11
+ }) => void;
12
+ canEditInputs: boolean;
13
+ values?: Partial<Pick<ContentApiApiToken, 'name' | 'description' | 'lifespan' | 'type'>>;
14
+ isCreating: boolean;
15
+ apiToken?: null | Partial<ApiToken>;
16
+ kind: 'admin' | 'content-api';
17
+ onDispatch: React.Dispatch<{
18
+ type: any;
19
+ value?: unknown;
20
+ }>;
21
+ setHasChangedPermissions: (hasChanged: boolean) => void;
22
+ }
23
+ export declare const FormApiTokenContainer: ({ errors, onChange, canEditInputs, isCreating, values, apiToken, kind, onDispatch, setHasChangedPermissions, }: FormApiTokenContainerProps) => import("react/jsx-runtime").JSX.Element;
24
+ export {};
@@ -11,7 +11,8 @@ interface TableProps extends Pick<TableImpl.Props<SanitizedTransferToken | ApiTo
11
11
  };
12
12
  tokens: SanitizedTransferToken[] | ApiToken[];
13
13
  tokenType: 'api-token' | 'transfer-token';
14
+ showOwner?: boolean;
14
15
  }
15
- declare const Table: ({ permissions, headers, isLoading, tokens, onConfirmDelete, tokenType, }: TableProps) => import("react/jsx-runtime").JSX.Element;
16
+ declare const Table: ({ permissions, headers, isLoading, tokens, onConfirmDelete, tokenType, showOwner, }: TableProps) => import("react/jsx-runtime").JSX.Element;
16
17
  export { Table };
17
18
  export type { TableProps };
@@ -1,2 +1,19 @@
1
+ import * as yup from 'yup';
1
2
  export declare const API_TOKEN_TYPE = "api-token";
2
3
  export declare const TRANSFER_TOKEN_TYPE = "transfer-token";
4
+ export declare const apiTokenInformationSchema: yup.default<import("yup/lib/object").Assign<import("yup/lib/object").ObjectShape, {
5
+ name: import("yup/lib/string").RequiredStringSchema<string | undefined, Record<string, any>>;
6
+ type: yup.default<string | undefined, Record<string, any>, string | undefined>;
7
+ description: yup.default<string | null | undefined, Record<string, any>, string | null | undefined>;
8
+ lifespan: import("yup/lib/number").DefinedNumberSchema<number | null | undefined, Record<string, any>>;
9
+ }>, Record<string, any>, import("yup/lib/object").TypeOfShape<import("yup/lib/object").Assign<import("yup/lib/object").ObjectShape, {
10
+ name: import("yup/lib/string").RequiredStringSchema<string | undefined, Record<string, any>>;
11
+ type: yup.default<string | undefined, Record<string, any>, string | undefined>;
12
+ description: yup.default<string | null | undefined, Record<string, any>, string | null | undefined>;
13
+ lifespan: import("yup/lib/number").DefinedNumberSchema<number | null | undefined, Record<string, any>>;
14
+ }>>, import("yup/lib/object").AssertsShape<import("yup/lib/object").Assign<import("yup/lib/object").ObjectShape, {
15
+ name: import("yup/lib/string").RequiredStringSchema<string | undefined, Record<string, any>>;
16
+ type: yup.default<string | undefined, Record<string, any>, string | undefined>;
17
+ description: yup.default<string | null | undefined, Record<string, any>, string | null | undefined>;
18
+ lifespan: import("yup/lib/number").DefinedNumberSchema<number | null | undefined, Record<string, any>>;
19
+ }>>>;
@@ -1,2 +1,2 @@
1
1
  import type { RouteObject } from 'react-router-dom';
2
- export declare const ROUTES_CE: RouteObject[];
2
+ export declare const ROUTES_CE: () => RouteObject[];
@@ -0,0 +1 @@
1
+ export declare const ProtectedCreateView: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ export declare const EditView: () => import("react/jsx-runtime").JSX.Element;
2
+ export declare const ProtectedEditView: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,13 @@
1
+ import * as React from 'react';
2
+ import { PermissionsAPI } from '../../../Roles/components/Permissions';
3
+ import type { Permission } from '../../../../../../../../shared/contracts/shared';
4
+ import type { Data } from '@strapi/types';
5
+ export interface AdminPermissionsProps {
6
+ disabled?: boolean;
7
+ initialAdminPermissions: Permission[];
8
+ /** Undefined in create mode. */
9
+ tokenId?: string;
10
+ /** The owner's user id. Undefined in create mode, user can only create a token for themselves. */
11
+ ownerUserId?: Data.ID | null;
12
+ }
13
+ export declare const AdminPermissions: React.ForwardRefExoticComponent<AdminPermissionsProps & React.RefAttributes<PermissionsAPI>>;
@@ -0,0 +1,2 @@
1
+ export declare const ListView: () => import("react/jsx-runtime").JSX.Element;
2
+ export declare const ProtectedListView: () => import("react/jsx-runtime").JSX.Element;
@@ -1,5 +1,5 @@
1
1
  import { Action, SubjectProperty } from '../../../../../../../shared/contracts/permissions';
2
- interface CollapsePropertyMatrixProps extends Pick<ActionRowProps, 'childrenForm' | 'isFormDisabled' | 'label' | 'pathToData' | 'propertyName'> {
2
+ interface CollapsePropertyMatrixProps extends Pick<ActionRowProps, 'childrenForm' | 'isFormDisabled' | 'label' | 'pathToData' | 'propertyName' | 'subject'> {
3
3
  availableActions?: Array<Action & {
4
4
  isDisplayed: boolean;
5
5
  }>;
@@ -9,8 +9,8 @@ interface PropertyAction {
9
9
  actionId: string;
10
10
  isActionRelatedToCurrentProperty: boolean;
11
11
  }
12
- declare const CollapsePropertyMatrix: ({ availableActions, childrenForm, isFormDisabled, label, pathToData, propertyName, }: CollapsePropertyMatrixProps) => import("react/jsx-runtime").JSX.Element;
13
- interface ActionRowProps extends Pick<SubActionRowProps, 'childrenForm' | 'isFormDisabled' | 'propertyActions' | 'propertyName'> {
12
+ declare const CollapsePropertyMatrix: ({ availableActions, childrenForm, isFormDisabled, label, pathToData, propertyName, subject, }: CollapsePropertyMatrixProps) => import("react/jsx-runtime").JSX.Element;
13
+ interface ActionRowProps extends Pick<SubActionRowProps, 'childrenForm' | 'isFormDisabled' | 'propertyActions' | 'propertyName' | 'subject'> {
14
14
  label: string;
15
15
  name: string;
16
16
  required?: boolean;
@@ -24,6 +24,7 @@ interface SubActionRowProps {
24
24
  pathToDataFromActionRow: string;
25
25
  propertyActions: PropertyAction[];
26
26
  propertyName: string;
27
+ subject?: string;
27
28
  recursiveLevel: number;
28
29
  }
29
30
  export { CollapsePropertyMatrix };
@@ -11,9 +11,10 @@ interface ConditionAction extends Pick<ActionRowProps, 'label'> {
11
11
  interface ConditionsModalProps extends Pick<ActionRowProps, 'isFormDisabled'> {
12
12
  actions?: Array<ConditionAction | HiddenCheckboxAction | VisibleCheckboxAction>;
13
13
  headerBreadCrumbs?: string[];
14
+ isReadOnly?: boolean;
14
15
  onClose?: () => void;
15
16
  }
16
- declare const ConditionsModal: ({ actions, headerBreadCrumbs, isFormDisabled, onClose, }: ConditionsModalProps) => import("react/jsx-runtime").JSX.Element;
17
+ declare const ConditionsModal: ({ actions, headerBreadCrumbs, isFormDisabled, isReadOnly, onClose, }: ConditionsModalProps) => import("react/jsx-runtime").JSX.Element;
17
18
  interface ActionRowProps {
18
19
  arrayOfOptionsGroupedByCategory: Array<[
19
20
  string,
@@ -21,6 +22,7 @@ interface ActionRowProps {
21
22
  ]>;
22
23
  isFormDisabled?: boolean;
23
24
  isGrey?: boolean;
25
+ isReadOnly?: boolean;
24
26
  label: string;
25
27
  name: string;
26
28
  onChange?: (name: string, values: Record<string, boolean>) => void;
@@ -13,6 +13,7 @@ interface CollapseProps extends Pick<RowLabelWithCheckboxProps, 'isActive' | 'is
13
13
  isGrey?: boolean;
14
14
  onClickToggle: RowLabelWithCheckboxProps['onClick'];
15
15
  pathToData: string;
16
+ subject: string;
16
17
  }
17
18
  interface VisibleCheckboxAction {
18
19
  actionId: string;
@@ -1,6 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import * as PermissonContracts from '../../../../../../../shared/contracts/permissions';
3
3
  import { Permission } from '../../../../../../../shared/contracts/shared';
4
+ import { Permission as AuthPermission } from '../../../../../features/Auth';
4
5
  import { ConditionForm, Form } from '../utils/forms';
5
6
  import { GenericLayout } from '../utils/layouts';
6
7
  export interface PermissionsAPI {
@@ -15,6 +16,7 @@ interface PermissionsProps {
15
16
  isFormDisabled?: boolean;
16
17
  permissions?: Permission[];
17
18
  layout: PermissonContracts.GetAll.Response['data'];
19
+ userPermissions?: AuthPermission[];
18
20
  }
19
21
  declare const Permissions: React.ForwardRefExoticComponent<PermissionsProps & React.RefAttributes<PermissionsAPI>>;
20
22
  interface PermissionForms {
@@ -38,6 +40,7 @@ interface OnChangeCollectionTypeGlobalActionCheckboxAction {
38
40
  collectionTypeKind: keyof PermissionForms;
39
41
  actionId: string;
40
42
  value: boolean;
43
+ userPermissions?: AuthPermission[];
41
44
  }
42
45
  interface OnChangeCollectionTypeRowLeftCheckboxAction {
43
46
  type: 'ON_CHANGE_COLLECTION_TYPE_ROW_LEFT_CHECKBOX';
@@ -45,10 +48,12 @@ interface OnChangeCollectionTypeRowLeftCheckboxAction {
45
48
  propertyName: string;
46
49
  rowName: string;
47
50
  value: boolean;
51
+ userPermissions?: AuthPermission[];
48
52
  }
49
53
  interface OnChangeConditionsAction {
50
54
  type: 'ON_CHANGE_CONDITIONS';
51
55
  conditions: Record<string, ConditionForm>;
56
+ userPermissions?: AuthPermission[];
52
57
  }
53
58
  export { Permissions };
54
59
  export type { State, OnChangeCollectionTypeRowLeftCheckboxAction, OnChangeConditionsAction, OnChangeCollectionTypeGlobalActionCheckboxAction, };
@@ -1,5 +1,6 @@
1
- /// <reference types="react" />
1
+ import * as React from 'react';
2
2
  import { Condition } from '../../../../../../../shared/contracts/permissions';
3
+ import { Permission as AuthPermission } from '../../../../../features/Auth';
3
4
  import type { OnChangeCollectionTypeGlobalActionCheckboxAction, OnChangeCollectionTypeRowLeftCheckboxAction, OnChangeConditionsAction, State } from '../components/Permissions';
4
5
  export interface PermissionsDataManagerContextValue extends Pick<State, 'modifiedData'> {
5
6
  availableConditions: Condition[];
@@ -18,12 +19,12 @@ export interface PermissionsDataManagerContextValue extends Pick<State, 'modifie
18
19
  };
19
20
  }) => void;
20
21
  onChangeCollectionTypeGlobalActionCheckbox: (collectionTypeKind: OnChangeCollectionTypeGlobalActionCheckboxAction['collectionTypeKind'], actionId: OnChangeCollectionTypeGlobalActionCheckboxAction['actionId'], value: OnChangeCollectionTypeGlobalActionCheckboxAction['value']) => void;
22
+ userPermissions?: AuthPermission[];
23
+ checkUserHasPermission: (action: string, subject?: string | null, field?: string) => boolean;
21
24
  }
22
- declare const PermissionsDataManagerProvider: {
23
- (props: PermissionsDataManagerContextValue & {
24
- children: import("react").ReactNode;
25
- }): JSX.Element;
26
- displayName: string;
27
- };
28
25
  export declare const usePermissionsDataManager: () => PermissionsDataManagerContextValue;
26
+ interface PermissionsDataManagerProviderProps extends Omit<PermissionsDataManagerContextValue, 'checkUserHasPermission'> {
27
+ children: React.ReactNode;
28
+ }
29
+ declare const PermissionsDataManagerProvider: ({ children, userPermissions, availableConditions, modifiedData, onChangeConditions, onChangeSimpleCheckbox, onChangeParentCheckbox, onChangeCollectionTypeLeftActionRowCheckbox, onChangeCollectionTypeGlobalActionCheckbox, }: PermissionsDataManagerProviderProps) => import("react/jsx-runtime").JSX.Element;
29
30
  export { PermissionsDataManagerProvider };
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Utility functions for creating permission checkers used in bulk update operations.
3
+ * These functions encapsulate the logic for validating whether a user has permission
4
+ * to modify specific fields/actions during role and app token editing.
5
+ */
6
+ import type { Permission as AuthPermission } from '../../../../../features/Auth';
7
+ /**
8
+ * Creates a permission checker function for field-level permission validation.
9
+ * Used in bulk update operations to filter which leaves can be modified.
10
+ *
11
+ * @param actionId - The action to check (e.g., 'plugin::content-manager.explorer.create')
12
+ * @param subject - The subject to check (e.g., 'api::article.article'), or null for plugins/settings
13
+ * @param userPermissions - Array of user permissions, or undefined for Role editing mode
14
+ * @returns A checker function that validates if a given path should be allowed,
15
+ * or undefined if in Role editing mode (no restrictions)
16
+ */
17
+ export declare const createFieldPermissionChecker: (actionId: string, subject: string | null, userPermissions: AuthPermission[] | undefined) => ((path: string[]) => boolean) | undefined;
18
+ /**
19
+ * Creates a permission checker for content type operations where the action ID
20
+ * may need to be extracted from the path itself (for content type name checkboxes).
21
+ *
22
+ * @param subject - The subject to check
23
+ * @param actionIdFromContext - The action ID from parent context (may be undefined)
24
+ * @param userPermissions - Array of user permissions, or undefined for Role editing mode
25
+ * @returns A checker function or undefined if in Role editing mode
26
+ */
27
+ export declare const createDynamicActionPermissionChecker: (subject: string | null | undefined, actionIdFromContext: string | undefined, userPermissions: AuthPermission[] | undefined) => ((path: string[]) => boolean) | undefined;
@@ -4,5 +4,11 @@
4
4
  * of an object.
5
5
  * This utility is very helpful when dealing with parent<>children checkboxes
6
6
  */
7
- declare const updateValues: (obj: object, valueToSet: boolean, isFieldUpdate?: boolean) => object;
8
- export { updateValues };
7
+ declare const updateValues: (obj: object, valueToSet: boolean, isFieldUpdate?: boolean) => Record<string, unknown>;
8
+ /**
9
+ * Permission-aware version of updateValues.
10
+ * When permissionChecker is undefined (Role editing), behaves like updateValues.
11
+ * When permissionChecker is provided (Admin Token editing), filters leaf updates based on permissions.
12
+ */
13
+ declare const updateValuesWithPermissions: (obj: object, valueToSet: boolean, permissionChecker?: (path: string[]) => boolean, currentPath?: string[], isFieldUpdate?: boolean) => Record<string, unknown>;
14
+ export { updateValues, updateValuesWithPermissions };
@@ -1,3 +1,6 @@
1
+ import * as AdminToken from '../../../shared/contracts/admin-token';
1
2
  import * as ApiToken from '../../../shared/contracts/api-token';
2
- declare const useGetAPITokensQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<void, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("..").QueryArguments, unknown, import("..").BaseQueryError>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "ApiToken", ApiToken.ApiToken[], "adminApi">>, useGetAPITokenQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<import("@strapi/types/dist/data").ID, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("..").QueryArguments, unknown, import("..").BaseQueryError>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "ApiToken", ApiToken.ApiToken, "adminApi">>, useCreateAPITokenMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<ApiToken.ApiTokenBody, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("..").QueryArguments, unknown, import("..").BaseQueryError>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "ApiToken", ApiToken.ApiToken, "adminApi">>, useDeleteAPITokenMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<import("@strapi/types/dist/data").ID, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("..").QueryArguments, unknown, import("..").BaseQueryError>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "ApiToken", ApiToken.ApiToken, "adminApi">>, useUpdateAPITokenMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<ApiToken.Update.Params & ApiToken.ApiTokenBody, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("..").QueryArguments, unknown, import("..").BaseQueryError>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "ApiToken", ApiToken.ApiToken, "adminApi">>;
3
- export { useGetAPITokensQuery, useGetAPITokenQuery, useCreateAPITokenMutation, useDeleteAPITokenMutation, useUpdateAPITokenMutation, };
3
+ declare const useGetAPITokensQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<void | {}, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("..").QueryArguments, unknown, import("..").BaseQueryError>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "ApiToken", ApiToken.ContentApiApiToken[], "adminApi">>, useGetAPITokenQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<import("@strapi/types/dist/data").ID, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("..").QueryArguments, unknown, import("..").BaseQueryError>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "ApiToken", ApiToken.ContentApiApiToken, "adminApi">>, useCreateAPITokenMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<ApiToken.ContentApiApiTokenBody, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("..").QueryArguments, unknown, import("..").BaseQueryError>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "ApiToken", ApiToken.ContentApiApiToken, "adminApi">>, useDeleteAPITokenMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<import("@strapi/types/dist/data").ID, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("..").QueryArguments, unknown, import("..").BaseQueryError>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "ApiToken", ApiToken.ContentApiApiToken, "adminApi">>, useUpdateAPITokenMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<ApiToken.Update.Params & Partial<ApiToken.ContentApiApiTokenBody>, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("..").QueryArguments, unknown, import("..").BaseQueryError>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "ApiToken", ApiToken.ContentApiApiToken, "adminApi">>, useGetAPITokenOwnerPermissionsQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<string, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("..").QueryArguments, unknown, import("..").BaseQueryError>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "ApiToken", import("../../../shared/contracts/shared").Permission[], "adminApi">>, useGetAdminTokensQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<void, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("..").QueryArguments, unknown, import("..").BaseQueryError>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "ApiToken", AdminToken.AdminApiToken[], "adminApi">>, useGetAdminTokenQuery: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseQuery<import("@reduxjs/toolkit/query").QueryDefinition<import("@strapi/types/dist/data").ID, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("..").QueryArguments, unknown, import("..").BaseQueryError>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "ApiToken", AdminToken.AdminApiToken, "adminApi">>, useCreateAdminTokenMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<Pick<AdminToken.AdminApiToken, "description" | "name" | "lifespan"> & {
4
+ adminPermissions?: Omit<import("../../../shared/contracts/shared").Permission, "id" | "createdAt" | "updatedAt" | "actionParameters">[] | undefined;
5
+ }, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("..").QueryArguments, unknown, import("..").BaseQueryError>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "ApiToken", AdminToken.AdminApiToken, "adminApi">>, useDeleteAdminTokenMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<import("@strapi/types/dist/data").ID, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("..").QueryArguments, unknown, import("..").BaseQueryError>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "ApiToken", AdminToken.AdminApiToken, "adminApi">>, useUpdateAdminTokenMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<AdminToken.Update.Params & Partial<AdminToken.AdminTokenBody>, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("..").QueryArguments, unknown, import("..").BaseQueryError>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "ApiToken", AdminToken.AdminApiToken, "adminApi">>;
6
+ export { useGetAPITokensQuery, useGetAPITokenQuery, useCreateAPITokenMutation, useDeleteAPITokenMutation, useUpdateAPITokenMutation, useGetAPITokenOwnerPermissionsQuery, useGetAdminTokensQuery, useGetAdminTokenQuery, useCreateAdminTokenMutation, useDeleteAdminTokenMutation, useUpdateAdminTokenMutation, };
@@ -1,5 +1,5 @@
1
1
  import type { Permission } from '../features/Auth';
2
- type SettingsPermissions = 'api-tokens' | 'project-settings' | 'roles' | 'transfer-tokens' | 'users' | 'webhooks';
2
+ type SettingsPermissions = 'admin-tokens' | 'api-tokens' | 'project-settings' | 'roles' | 'transfer-tokens' | 'users' | 'webhooks';
3
3
  type EESettingsPermissions = 'auditLogs' | 'review-workflows' | 'sso' | 'releases';
4
4
  type CRUDPermissions = {
5
5
  main?: Permission[];
@@ -36,12 +36,14 @@ declare const attemptTokenRefresh: () => Promise<string>;
36
36
  type FetchResponse<TData = any> = {
37
37
  data: TData;
38
38
  status?: number;
39
+ headers?: Headers;
39
40
  };
40
41
  type FetchOptions = {
41
42
  params?: any;
42
43
  signal?: AbortSignal;
43
44
  headers?: Record<string, string>;
44
45
  validateStatus?: ((status: number) => boolean) | null;
46
+ responseType?: 'json' | 'blob' | 'text' | 'arrayBuffer';
45
47
  };
46
48
  type FetchConfig = {
47
49
  signal?: AbortSignal;
@@ -64,7 +66,18 @@ declare class FetchError extends Error {
64
66
  }
65
67
  declare const isFetchError: (error: unknown) => error is FetchError;
66
68
  type FetchClient = {
67
- get: <TData = any>(url: string, config?: FetchOptions) => Promise<FetchResponse<TData>>;
69
+ get: {
70
+ (url: string, config: FetchOptions & {
71
+ responseType: 'blob';
72
+ }): Promise<FetchResponse<Blob>>;
73
+ (url: string, config: FetchOptions & {
74
+ responseType: 'text';
75
+ }): Promise<FetchResponse<string>>;
76
+ (url: string, config: FetchOptions & {
77
+ responseType: 'arrayBuffer';
78
+ }): Promise<FetchResponse<ArrayBuffer>>;
79
+ <TData = any>(url: string, config?: FetchOptions): Promise<FetchResponse<TData>>;
80
+ };
68
81
  put: <TData = any, TSend = any>(url: string, data?: TSend, config?: FetchOptions) => Promise<FetchResponse<TData>>;
69
82
  post: <TData = any, TSend = any>(url: string, data?: TSend, config?: FetchOptions) => Promise<FetchResponse<TData>>;
70
83
  del: <TData = any>(url: string, config?: FetchOptions) => Promise<FetchResponse<TData>>;
@@ -30,10 +30,42 @@ const registerModelHooks = ()=>{
30
30
  ],
31
31
  afterCreate: sendDidChangeInterfaceLanguage,
32
32
  afterDelete: sendDidChangeInterfaceLanguage,
33
- afterUpdate ({ params }) {
34
- if (params.data.preferedLanguage) {
33
+ async beforeDelete (event) {
34
+ // Delete all admin API tokens owned by this user before the user row is removed
35
+ await index.getService('api-token-admin').deleteTokensForUser(event.params.where.id);
36
+ },
37
+ async afterUpdate (event) {
38
+ if (event.params.data?.preferedLanguage) {
35
39
  sendDidChangeInterfaceLanguage();
36
40
  }
41
+ if (event.params.data?.roles !== undefined) {
42
+ // We re-sync token permissions for all owner users with their role when the user is updated
43
+ await index.getService('api-token-admin').syncPermissionsForUser(event.result.id);
44
+ }
45
+ }
46
+ });
47
+ strapi.db.lifecycles.subscribe({
48
+ models: [
49
+ 'admin::role'
50
+ ],
51
+ // We re-sync token permissions for all owner users with this role when the role is deleted
52
+ async beforeDelete (event) {
53
+ const users = await strapi.db.query('admin::user').findMany({
54
+ where: {
55
+ roles: {
56
+ id: event.params.where.id
57
+ }
58
+ },
59
+ select: [
60
+ 'id'
61
+ ]
62
+ });
63
+ event.state.affectedUserIds = users.map((u)=>u.id);
64
+ },
65
+ async afterDelete (event) {
66
+ for (const userId of event.state.affectedUserIds ?? []){
67
+ await index.getService('api-token-admin').syncPermissionsForUser(userId);
68
+ }
37
69
  }
38
70
  });
39
71
  };
@@ -83,9 +115,9 @@ const syncAPITokensPermissions = async ()=>{
83
115
  * @sideEffects Creates new API tokens in the database if conditions are met.
84
116
  */ const createDefaultAPITokensIfNeeded = async ()=>{
85
117
  const userService = index.getService('user');
86
- const apiTokenService = index.getService('api-token');
118
+ const apiTokenService = index.getService('api-token-content-api');
87
119
  const usersCount = await userService.count();
88
- const apiTokenCount = await apiTokenService.count();
120
+ const apiTokenCount = await apiTokenService.countAll();
89
121
  if (usersCount === 0 && apiTokenCount === 0) {
90
122
  for (const token of constants.DEFAULT_API_TOKENS){
91
123
  await apiTokenService.create(token);
@@ -126,7 +158,7 @@ var bootstrap = (async ({ strapi: strapi1 })=>{
126
158
  const permissionService = index.getService('permission');
127
159
  const userService = index.getService('user');
128
160
  const roleService = index.getService('role');
129
- const apiTokenService = index.getService('api-token');
161
+ const apiTokenService = index.getService('api-token-content-api');
130
162
  const transferService = index.getService('transfer');
131
163
  const tokenService = index.getService('token');
132
164
  await roleService.createRolesIfNoneExist();
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sources":["../../../../server/src/bootstrap.ts"],"sourcesContent":["import { merge, map, difference, uniq } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { getService } from './utils';\nimport { getTokenOptions, expiresInToSeconds } from './services/token';\nimport adminActions from './config/admin-actions';\nimport adminConditions from './config/admin-conditions';\nimport constants from './services/constants';\nimport {\n DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN,\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN,\n DEFAULT_MAX_SESSION_LIFESPAN,\n DEFAULT_IDLE_SESSION_LIFESPAN,\n} from '../../shared/utils/session-auth';\n\nconst defaultAdminAuthSettings = {\n providers: {\n autoRegister: false,\n defaultRole: null,\n ssoLockedRoles: null,\n },\n};\n\nconst registerPermissionActions = async () => {\n await getService('permission').actionProvider.registerMany(adminActions.actions);\n};\n\nconst registerAdminConditions = async () => {\n await getService('permission').conditionProvider.registerMany(adminConditions.conditions);\n};\n\nconst registerModelHooks = () => {\n const { sendDidChangeInterfaceLanguage } = getService('metrics');\n\n strapi.db.lifecycles.subscribe({\n models: ['admin::user'],\n afterCreate: sendDidChangeInterfaceLanguage,\n afterDelete: sendDidChangeInterfaceLanguage,\n afterUpdate({ params }) {\n if (params.data.preferedLanguage) {\n sendDidChangeInterfaceLanguage();\n }\n },\n });\n};\n\nconst syncAuthSettings = async () => {\n const adminStore = await strapi.store({ type: 'core', name: 'admin' });\n const adminAuthSettings = await adminStore.get({ key: 'auth' });\n const newAuthSettings = merge(defaultAdminAuthSettings, adminAuthSettings);\n\n const roleExists = await getService('role').exists({\n id: newAuthSettings.providers.defaultRole,\n });\n\n // Reset the default SSO role if it has been deleted manually\n if (!roleExists) {\n newAuthSettings.providers.defaultRole = null;\n }\n\n await adminStore.set({ key: 'auth', value: newAuthSettings });\n};\n\nconst syncAPITokensPermissions = async () => {\n const validPermissions = strapi.contentAPI.permissions.providers.action.keys();\n const permissionsInDB = await async.pipe(\n strapi.db.query('admin::api-token-permission').findMany,\n map('action')\n )();\n\n const unknownPermissions = uniq(difference(permissionsInDB, validPermissions));\n\n if (unknownPermissions.length > 0) {\n await strapi.db\n .query('admin::api-token-permission')\n .deleteMany({ where: { action: { $in: unknownPermissions } } });\n }\n};\n\n/**\n * Ensures the creation of default API tokens during the app creation.\n *\n * Checks the database for existing users and API tokens:\n * - If there are no users and no API tokens, it creates two default API tokens:\n * 1. A \"Read Only\" API token with permissions for accessing resources.\n * 2. A \"Full Access\" API token with permissions for accessing and modifying resources.\n *\n * @sideEffects Creates new API tokens in the database if conditions are met.\n */\n\nconst createDefaultAPITokensIfNeeded = async () => {\n const userService = getService('user');\n const apiTokenService = getService('api-token');\n\n const usersCount = await userService.count();\n const apiTokenCount = await apiTokenService.count();\n\n if (usersCount === 0 && apiTokenCount === 0) {\n for (const token of constants.DEFAULT_API_TOKENS) {\n await apiTokenService.create(token);\n }\n }\n};\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n // Get the merged token options (includes defaults merged with user config)\n const { options } = getTokenOptions();\n const legacyMaxRefreshFallback =\n expiresInToSeconds(options?.expiresIn) ?? DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN;\n const legacyMaxSessionFallback =\n expiresInToSeconds(options?.expiresIn) ?? DEFAULT_MAX_SESSION_LIFESPAN;\n\n // Warn if using deprecated legacy expiresIn for new session settings\n const hasLegacyExpires = options?.expiresIn != null;\n const hasNewMaxRefresh = strapi.config.get('admin.auth.sessions.maxRefreshTokenLifespan') != null;\n const hasNewMaxSession = strapi.config.get('admin.auth.sessions.maxSessionLifespan') != null;\n\n if (hasLegacyExpires && (!hasNewMaxRefresh || !hasNewMaxSession)) {\n strapi.log.warn(\n 'admin.auth.options.expiresIn is deprecated and will be removed in Strapi 6. Please configure admin.auth.sessions.maxRefreshTokenLifespan and admin.auth.sessions.maxSessionLifespan.'\n );\n }\n\n strapi.sessionManager.defineOrigin('admin', {\n jwtSecret: strapi.config.get('admin.auth.secret'),\n accessTokenLifespan: strapi.config.get('admin.auth.sessions.accessTokenLifespan', 30 * 60),\n maxRefreshTokenLifespan: strapi.config.get(\n 'admin.auth.sessions.maxRefreshTokenLifespan',\n legacyMaxRefreshFallback\n ),\n idleRefreshTokenLifespan: strapi.config.get(\n 'admin.auth.sessions.idleRefreshTokenLifespan',\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN\n ),\n maxSessionLifespan: strapi.config.get(\n 'admin.auth.sessions.maxSessionLifespan',\n legacyMaxSessionFallback\n ),\n idleSessionLifespan: strapi.config.get(\n 'admin.auth.sessions.idleSessionLifespan',\n DEFAULT_IDLE_SESSION_LIFESPAN\n ),\n algorithm: options?.algorithm,\n // Pass through all JWT options (includes privateKey, publicKey, and any other options)\n jwtOptions: options,\n });\n\n const isProduction = process.env.NODE_ENV === 'production';\n const adminCookieSecure = strapi.config.get('admin.auth.cookie.secure');\n if (isProduction && adminCookieSecure === false) {\n strapi.log.warn(\n 'Server is in production mode, but admin.auth.cookie.secure has been set to false. This is not recommended and will allow cookies to be sent over insecure connections.'\n );\n }\n\n await registerAdminConditions();\n await registerPermissionActions();\n registerModelHooks();\n\n const permissionService = getService('permission');\n const userService = getService('user');\n const roleService = getService('role');\n const apiTokenService = getService('api-token');\n const transferService = getService('transfer');\n const tokenService = getService('token');\n\n await roleService.createRolesIfNoneExist();\n await roleService.resetSuperAdminPermissions();\n await roleService.displayWarningIfNoSuperAdmin();\n\n await permissionService.cleanPermissionsInDatabase();\n\n await userService.displayWarningIfUsersDontHaveRole();\n\n await syncAuthSettings();\n await syncAPITokensPermissions();\n\n await getService('metrics').sendUpdateProjectInformation(strapi);\n getService('metrics').startCron(strapi);\n\n apiTokenService.checkSaltIsDefined();\n transferService.token.checkSaltIsDefined();\n tokenService.checkSecretIsDefined();\n\n await createDefaultAPITokensIfNeeded();\n};\n"],"names":["defaultAdminAuthSettings","providers","autoRegister","defaultRole","ssoLockedRoles","registerPermissionActions","getService","actionProvider","registerMany","adminActions","actions","registerAdminConditions","conditionProvider","adminConditions","conditions","registerModelHooks","sendDidChangeInterfaceLanguage","strapi","db","lifecycles","subscribe","models","afterCreate","afterDelete","afterUpdate","params","data","preferedLanguage","syncAuthSettings","adminStore","store","type","name","adminAuthSettings","get","key","newAuthSettings","merge","roleExists","exists","id","set","value","syncAPITokensPermissions","validPermissions","contentAPI","permissions","action","keys","permissionsInDB","async","pipe","query","findMany","map","unknownPermissions","uniq","difference","length","deleteMany","where","$in","createDefaultAPITokensIfNeeded","userService","apiTokenService","usersCount","count","apiTokenCount","token","constants","DEFAULT_API_TOKENS","create","options","getTokenOptions","legacyMaxRefreshFallback","expiresInToSeconds","expiresIn","DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN","legacyMaxSessionFallback","DEFAULT_MAX_SESSION_LIFESPAN","hasLegacyExpires","hasNewMaxRefresh","config","hasNewMaxSession","log","warn","sessionManager","defineOrigin","jwtSecret","accessTokenLifespan","maxRefreshTokenLifespan","idleRefreshTokenLifespan","DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN","maxSessionLifespan","idleSessionLifespan","DEFAULT_IDLE_SESSION_LIFESPAN","algorithm","jwtOptions","isProduction","process","env","NODE_ENV","adminCookieSecure","permissionService","roleService","transferService","tokenService","createRolesIfNoneExist","resetSuperAdminPermissions","displayWarningIfNoSuperAdmin","cleanPermissionsInDatabase","displayWarningIfUsersDontHaveRole","sendUpdateProjectInformation","startCron","checkSaltIsDefined","checkSecretIsDefined"],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap.js","sources":["../../../../server/src/bootstrap.ts"],"sourcesContent":["import { merge, map, difference, uniq } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { getService } from './utils';\nimport { getTokenOptions, expiresInToSeconds } from './services/token';\nimport adminActions from './config/admin-actions';\nimport adminConditions from './config/admin-conditions';\nimport constants from './services/constants';\nimport {\n DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN,\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN,\n DEFAULT_MAX_SESSION_LIFESPAN,\n DEFAULT_IDLE_SESSION_LIFESPAN,\n} from '../../shared/utils/session-auth';\n\nconst defaultAdminAuthSettings = {\n providers: {\n autoRegister: false,\n defaultRole: null,\n ssoLockedRoles: null,\n },\n};\n\nconst registerPermissionActions = async () => {\n await getService('permission').actionProvider.registerMany(adminActions.actions);\n};\n\nconst registerAdminConditions = async () => {\n await getService('permission').conditionProvider.registerMany(adminConditions.conditions);\n};\n\nconst registerModelHooks = () => {\n const { sendDidChangeInterfaceLanguage } = getService('metrics');\n\n strapi.db.lifecycles.subscribe({\n models: ['admin::user'],\n afterCreate: sendDidChangeInterfaceLanguage,\n afterDelete: sendDidChangeInterfaceLanguage,\n async beforeDelete(event) {\n // Delete all admin API tokens owned by this user before the user row is removed\n await getService('api-token-admin').deleteTokensForUser(event.params.where.id);\n },\n async afterUpdate(event) {\n if (event.params.data?.preferedLanguage) {\n sendDidChangeInterfaceLanguage();\n }\n if (event.params.data?.roles !== undefined) {\n // We re-sync token permissions for all owner users with their role when the user is updated\n await getService('api-token-admin').syncPermissionsForUser(event.result.id);\n }\n },\n });\n\n strapi.db.lifecycles.subscribe({\n models: ['admin::role'],\n // We re-sync token permissions for all owner users with this role when the role is deleted\n async beforeDelete(event) {\n const users = await strapi.db.query('admin::user').findMany({\n where: { roles: { id: event.params.where.id } },\n select: ['id'],\n });\n event.state.affectedUserIds = users.map((u: { id: unknown }) => u.id);\n },\n async afterDelete(event) {\n for (const userId of (event.state.affectedUserIds as unknown[]) ?? []) {\n await getService('api-token-admin').syncPermissionsForUser(userId as string | number);\n }\n },\n });\n};\n\nconst syncAuthSettings = async () => {\n const adminStore = await strapi.store({ type: 'core', name: 'admin' });\n const adminAuthSettings = await adminStore.get({ key: 'auth' });\n const newAuthSettings = merge(defaultAdminAuthSettings, adminAuthSettings);\n\n const roleExists = await getService('role').exists({\n id: newAuthSettings.providers.defaultRole,\n });\n\n // Reset the default SSO role if it has been deleted manually\n if (!roleExists) {\n newAuthSettings.providers.defaultRole = null;\n }\n\n await adminStore.set({ key: 'auth', value: newAuthSettings });\n};\n\nconst syncAPITokensPermissions = async () => {\n const validPermissions = strapi.contentAPI.permissions.providers.action.keys();\n const permissionsInDB = await async.pipe(\n strapi.db.query('admin::api-token-permission').findMany,\n map('action')\n )();\n\n const unknownPermissions = uniq(difference(permissionsInDB, validPermissions));\n\n if (unknownPermissions.length > 0) {\n await strapi.db\n .query('admin::api-token-permission')\n .deleteMany({ where: { action: { $in: unknownPermissions } } });\n }\n};\n\n/**\n * Ensures the creation of default API tokens during the app creation.\n *\n * Checks the database for existing users and API tokens:\n * - If there are no users and no API tokens, it creates two default API tokens:\n * 1. A \"Read Only\" API token with permissions for accessing resources.\n * 2. A \"Full Access\" API token with permissions for accessing and modifying resources.\n *\n * @sideEffects Creates new API tokens in the database if conditions are met.\n */\n\nconst createDefaultAPITokensIfNeeded = async () => {\n const userService = getService('user');\n const apiTokenService = getService('api-token-content-api');\n\n const usersCount = await userService.count();\n const apiTokenCount = await apiTokenService.countAll();\n\n if (usersCount === 0 && apiTokenCount === 0) {\n for (const token of constants.DEFAULT_API_TOKENS) {\n await apiTokenService.create(token);\n }\n }\n};\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n // Get the merged token options (includes defaults merged with user config)\n const { options } = getTokenOptions();\n const legacyMaxRefreshFallback =\n expiresInToSeconds(options?.expiresIn) ?? DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN;\n const legacyMaxSessionFallback =\n expiresInToSeconds(options?.expiresIn) ?? DEFAULT_MAX_SESSION_LIFESPAN;\n\n // Warn if using deprecated legacy expiresIn for new session settings\n const hasLegacyExpires = options?.expiresIn != null;\n const hasNewMaxRefresh = strapi.config.get('admin.auth.sessions.maxRefreshTokenLifespan') != null;\n const hasNewMaxSession = strapi.config.get('admin.auth.sessions.maxSessionLifespan') != null;\n\n if (hasLegacyExpires && (!hasNewMaxRefresh || !hasNewMaxSession)) {\n strapi.log.warn(\n 'admin.auth.options.expiresIn is deprecated and will be removed in Strapi 6. Please configure admin.auth.sessions.maxRefreshTokenLifespan and admin.auth.sessions.maxSessionLifespan.'\n );\n }\n\n strapi.sessionManager.defineOrigin('admin', {\n jwtSecret: strapi.config.get('admin.auth.secret'),\n accessTokenLifespan: strapi.config.get('admin.auth.sessions.accessTokenLifespan', 30 * 60),\n maxRefreshTokenLifespan: strapi.config.get(\n 'admin.auth.sessions.maxRefreshTokenLifespan',\n legacyMaxRefreshFallback\n ),\n idleRefreshTokenLifespan: strapi.config.get(\n 'admin.auth.sessions.idleRefreshTokenLifespan',\n DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN\n ),\n maxSessionLifespan: strapi.config.get(\n 'admin.auth.sessions.maxSessionLifespan',\n legacyMaxSessionFallback\n ),\n idleSessionLifespan: strapi.config.get(\n 'admin.auth.sessions.idleSessionLifespan',\n DEFAULT_IDLE_SESSION_LIFESPAN\n ),\n algorithm: options?.algorithm,\n // Pass through all JWT options (includes privateKey, publicKey, and any other options)\n jwtOptions: options,\n });\n\n const isProduction = process.env.NODE_ENV === 'production';\n const adminCookieSecure = strapi.config.get('admin.auth.cookie.secure');\n if (isProduction && adminCookieSecure === false) {\n strapi.log.warn(\n 'Server is in production mode, but admin.auth.cookie.secure has been set to false. This is not recommended and will allow cookies to be sent over insecure connections.'\n );\n }\n\n await registerAdminConditions();\n await registerPermissionActions();\n registerModelHooks();\n\n const permissionService = getService('permission');\n const userService = getService('user');\n const roleService = getService('role');\n const apiTokenService = getService('api-token-content-api');\n const transferService = getService('transfer');\n const tokenService = getService('token');\n\n await roleService.createRolesIfNoneExist();\n await roleService.resetSuperAdminPermissions();\n await roleService.displayWarningIfNoSuperAdmin();\n\n await permissionService.cleanPermissionsInDatabase();\n\n await userService.displayWarningIfUsersDontHaveRole();\n\n await syncAuthSettings();\n await syncAPITokensPermissions();\n\n await getService('metrics').sendUpdateProjectInformation(strapi);\n getService('metrics').startCron(strapi);\n\n apiTokenService.checkSaltIsDefined();\n transferService.token.checkSaltIsDefined();\n tokenService.checkSecretIsDefined();\n\n await createDefaultAPITokensIfNeeded();\n};\n"],"names":["defaultAdminAuthSettings","providers","autoRegister","defaultRole","ssoLockedRoles","registerPermissionActions","getService","actionProvider","registerMany","adminActions","actions","registerAdminConditions","conditionProvider","adminConditions","conditions","registerModelHooks","sendDidChangeInterfaceLanguage","strapi","db","lifecycles","subscribe","models","afterCreate","afterDelete","beforeDelete","event","deleteTokensForUser","params","where","id","afterUpdate","data","preferedLanguage","roles","undefined","syncPermissionsForUser","result","users","query","findMany","select","state","affectedUserIds","map","u","userId","syncAuthSettings","adminStore","store","type","name","adminAuthSettings","get","key","newAuthSettings","merge","roleExists","exists","set","value","syncAPITokensPermissions","validPermissions","contentAPI","permissions","action","keys","permissionsInDB","async","pipe","unknownPermissions","uniq","difference","length","deleteMany","$in","createDefaultAPITokensIfNeeded","userService","apiTokenService","usersCount","count","apiTokenCount","countAll","token","constants","DEFAULT_API_TOKENS","create","options","getTokenOptions","legacyMaxRefreshFallback","expiresInToSeconds","expiresIn","DEFAULT_MAX_REFRESH_TOKEN_LIFESPAN","legacyMaxSessionFallback","DEFAULT_MAX_SESSION_LIFESPAN","hasLegacyExpires","hasNewMaxRefresh","config","hasNewMaxSession","log","warn","sessionManager","defineOrigin","jwtSecret","accessTokenLifespan","maxRefreshTokenLifespan","idleRefreshTokenLifespan","DEFAULT_IDLE_REFRESH_TOKEN_LIFESPAN","maxSessionLifespan","idleSessionLifespan","DEFAULT_IDLE_SESSION_LIFESPAN","algorithm","jwtOptions","isProduction","process","env","NODE_ENV","adminCookieSecure","permissionService","roleService","transferService","tokenService","createRolesIfNoneExist","resetSuperAdminPermissions","displayWarningIfNoSuperAdmin","cleanPermissionsInDatabase","displayWarningIfUsersDontHaveRole","sendUpdateProjectInformation","startCron","checkSaltIsDefined","checkSecretIsDefined"],"mappings":"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"}
@@ -28,10 +28,42 @@ const registerModelHooks = ()=>{
28
28
  ],
29
29
  afterCreate: sendDidChangeInterfaceLanguage,
30
30
  afterDelete: sendDidChangeInterfaceLanguage,
31
- afterUpdate ({ params }) {
32
- if (params.data.preferedLanguage) {
31
+ async beforeDelete (event) {
32
+ // Delete all admin API tokens owned by this user before the user row is removed
33
+ await getService('api-token-admin').deleteTokensForUser(event.params.where.id);
34
+ },
35
+ async afterUpdate (event) {
36
+ if (event.params.data?.preferedLanguage) {
33
37
  sendDidChangeInterfaceLanguage();
34
38
  }
39
+ if (event.params.data?.roles !== undefined) {
40
+ // We re-sync token permissions for all owner users with their role when the user is updated
41
+ await getService('api-token-admin').syncPermissionsForUser(event.result.id);
42
+ }
43
+ }
44
+ });
45
+ strapi.db.lifecycles.subscribe({
46
+ models: [
47
+ 'admin::role'
48
+ ],
49
+ // We re-sync token permissions for all owner users with this role when the role is deleted
50
+ async beforeDelete (event) {
51
+ const users = await strapi.db.query('admin::user').findMany({
52
+ where: {
53
+ roles: {
54
+ id: event.params.where.id
55
+ }
56
+ },
57
+ select: [
58
+ 'id'
59
+ ]
60
+ });
61
+ event.state.affectedUserIds = users.map((u)=>u.id);
62
+ },
63
+ async afterDelete (event) {
64
+ for (const userId of event.state.affectedUserIds ?? []){
65
+ await getService('api-token-admin').syncPermissionsForUser(userId);
66
+ }
35
67
  }
36
68
  });
37
69
  };
@@ -81,9 +113,9 @@ const syncAPITokensPermissions = async ()=>{
81
113
  * @sideEffects Creates new API tokens in the database if conditions are met.
82
114
  */ const createDefaultAPITokensIfNeeded = async ()=>{
83
115
  const userService = getService('user');
84
- const apiTokenService = getService('api-token');
116
+ const apiTokenService = getService('api-token-content-api');
85
117
  const usersCount = await userService.count();
86
- const apiTokenCount = await apiTokenService.count();
118
+ const apiTokenCount = await apiTokenService.countAll();
87
119
  if (usersCount === 0 && apiTokenCount === 0) {
88
120
  for (const token of constants.DEFAULT_API_TOKENS){
89
121
  await apiTokenService.create(token);
@@ -124,7 +156,7 @@ var bootstrap = (async ({ strapi: strapi1 })=>{
124
156
  const permissionService = getService('permission');
125
157
  const userService = getService('user');
126
158
  const roleService = getService('role');
127
- const apiTokenService = getService('api-token');
159
+ const apiTokenService = getService('api-token-content-api');
128
160
  const transferService = getService('transfer');
129
161
  const tokenService = getService('token');
130
162
  await roleService.createRolesIfNoneExist();