@strapi/plugin-users-permissions 0.0.0-next.de5394e73076ccf7aca1e28dc68894e3c43f8b91 → 0.0.0-next.de7aa8b6d2161b0be06244360caa235b8619d823

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 (680) hide show
  1. package/.eslintignore +2 -2
  2. package/.eslintrc +17 -0
  3. package/LICENSE +18 -3
  4. package/admin/src/components/BoundRoute/{index.js → index.jsx} +3 -3
  5. package/admin/src/components/FormModal/Input/{index.js → index.jsx} +33 -32
  6. package/admin/src/components/FormModal/index.jsx +115 -0
  7. package/admin/src/components/Permissions/PermissionRow/{CheckboxWrapper.js → CheckboxWrapper.jsx} +4 -3
  8. package/admin/src/components/Permissions/PermissionRow/{SubCategory.js → SubCategory.jsx} +13 -22
  9. package/admin/src/components/Permissions/index.jsx +47 -0
  10. package/admin/src/components/Permissions/reducer.js +1 -1
  11. package/admin/src/components/Policies/{index.js → index.jsx} +8 -6
  12. package/admin/src/components/UsersPermissions/{index.js → index.jsx} +15 -7
  13. package/admin/src/components/UsersPermissions/reducer.js +1 -1
  14. package/admin/src/{permissions.js → constants.js} +1 -3
  15. package/admin/src/index.js +26 -54
  16. package/admin/src/pages/AdvancedSettings/index.jsx +214 -0
  17. package/admin/src/pages/AdvancedSettings/utils/layout.js +20 -35
  18. package/admin/src/pages/AdvancedSettings/utils/schema.js +5 -2
  19. package/admin/src/pages/EmailTemplates/components/EmailForm.jsx +156 -0
  20. package/admin/src/pages/EmailTemplates/components/{EmailTable.js → EmailTable.jsx} +21 -18
  21. package/admin/src/pages/EmailTemplates/index.jsx +148 -0
  22. package/admin/src/pages/EmailTemplates/utils/schema.js +18 -6
  23. package/admin/src/pages/Providers/index.jsx +262 -0
  24. package/admin/src/pages/Providers/utils/forms.js +23 -11
  25. package/admin/src/pages/Roles/constants.js +3 -3
  26. package/admin/src/{hooks → pages/Roles/hooks}/usePlugins.js +19 -12
  27. package/admin/src/pages/Roles/index.jsx +24 -0
  28. package/admin/src/pages/Roles/pages/CreatePage.jsx +194 -0
  29. package/admin/src/pages/Roles/pages/EditPage.jsx +215 -0
  30. package/admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx +119 -0
  31. package/admin/src/pages/Roles/{ListPage/index.js → pages/ListPage/index.jsx} +104 -81
  32. package/admin/src/pluginId.js +2 -2
  33. package/admin/src/translations/en.json +1 -1
  34. package/admin/src/translations/uk.json +41 -4
  35. package/admin/src/translations/zh-Hans.json +80 -80
  36. package/admin/src/utils/formatPluginName.js +1 -1
  37. package/admin/src/utils/index.js +0 -1
  38. package/admin/src/utils/prefixPluginTranslations.js +13 -0
  39. package/dist/admin/components/BoundRoute/getMethodColor.js +49 -0
  40. package/dist/admin/components/BoundRoute/getMethodColor.js.map +1 -0
  41. package/dist/admin/components/BoundRoute/getMethodColor.mjs +47 -0
  42. package/dist/admin/components/BoundRoute/getMethodColor.mjs.map +1 -0
  43. package/dist/admin/components/BoundRoute/index.js +98 -0
  44. package/dist/admin/components/BoundRoute/index.js.map +1 -0
  45. package/dist/admin/components/BoundRoute/index.mjs +96 -0
  46. package/dist/admin/components/BoundRoute/index.mjs.map +1 -0
  47. package/dist/admin/components/FormModal/Input/index.js +123 -0
  48. package/dist/admin/components/FormModal/Input/index.js.map +1 -0
  49. package/dist/admin/components/FormModal/Input/index.mjs +121 -0
  50. package/dist/admin/components/FormModal/Input/index.mjs.map +1 -0
  51. package/dist/admin/components/FormModal/index.js +110 -0
  52. package/dist/admin/components/FormModal/index.js.map +1 -0
  53. package/dist/admin/components/FormModal/index.mjs +108 -0
  54. package/dist/admin/components/FormModal/index.mjs.map +1 -0
  55. package/dist/admin/components/Permissions/PermissionRow/CheckboxWrapper.js +33 -0
  56. package/dist/admin/components/Permissions/PermissionRow/CheckboxWrapper.js.map +1 -0
  57. package/dist/admin/components/Permissions/PermissionRow/CheckboxWrapper.mjs +31 -0
  58. package/dist/admin/components/Permissions/PermissionRow/CheckboxWrapper.mjs.map +1 -0
  59. package/dist/admin/components/Permissions/PermissionRow/SubCategory.js +156 -0
  60. package/dist/admin/components/Permissions/PermissionRow/SubCategory.js.map +1 -0
  61. package/dist/admin/components/Permissions/PermissionRow/SubCategory.mjs +154 -0
  62. package/dist/admin/components/Permissions/PermissionRow/SubCategory.mjs.map +1 -0
  63. package/dist/admin/components/Permissions/PermissionRow/index.js +50 -0
  64. package/dist/admin/components/Permissions/PermissionRow/index.js.map +1 -0
  65. package/dist/admin/components/Permissions/PermissionRow/index.mjs +48 -0
  66. package/dist/admin/components/Permissions/PermissionRow/index.mjs.map +1 -0
  67. package/dist/admin/components/Permissions/index.js +52 -0
  68. package/dist/admin/components/Permissions/index.js.map +1 -0
  69. package/dist/admin/components/Permissions/index.mjs +50 -0
  70. package/dist/admin/components/Permissions/index.mjs.map +1 -0
  71. package/dist/admin/components/Permissions/init.js +15 -0
  72. package/dist/admin/components/Permissions/init.js.map +1 -0
  73. package/dist/admin/components/Permissions/init.mjs +13 -0
  74. package/dist/admin/components/Permissions/init.mjs.map +1 -0
  75. package/dist/admin/components/Permissions/reducer.js +34 -0
  76. package/dist/admin/components/Permissions/reducer.js.map +1 -0
  77. package/dist/admin/components/Permissions/reducer.mjs +31 -0
  78. package/dist/admin/components/Permissions/reducer.mjs.map +1 -0
  79. package/dist/admin/components/Policies/index.js +67 -0
  80. package/dist/admin/components/Policies/index.js.map +1 -0
  81. package/dist/admin/components/Policies/index.mjs +65 -0
  82. package/dist/admin/components/Policies/index.mjs.map +1 -0
  83. package/dist/admin/components/UsersPermissions/index.js +115 -0
  84. package/dist/admin/components/UsersPermissions/index.js.map +1 -0
  85. package/dist/admin/components/UsersPermissions/index.mjs +113 -0
  86. package/dist/admin/components/UsersPermissions/index.mjs.map +1 -0
  87. package/dist/admin/components/UsersPermissions/init.js +13 -0
  88. package/dist/admin/components/UsersPermissions/init.js.map +1 -0
  89. package/dist/admin/components/UsersPermissions/init.mjs +11 -0
  90. package/dist/admin/components/UsersPermissions/init.mjs.map +1 -0
  91. package/dist/admin/components/UsersPermissions/reducer.js +73 -0
  92. package/dist/admin/components/UsersPermissions/reducer.js.map +1 -0
  93. package/dist/admin/components/UsersPermissions/reducer.mjs +68 -0
  94. package/dist/admin/components/UsersPermissions/reducer.mjs.map +1 -0
  95. package/dist/admin/constants.js +81 -0
  96. package/dist/admin/constants.js.map +1 -0
  97. package/dist/admin/constants.mjs +79 -0
  98. package/dist/admin/constants.mjs.map +1 -0
  99. package/dist/admin/contexts/UsersPermissionsContext/index.js +23 -0
  100. package/dist/admin/contexts/UsersPermissionsContext/index.js.map +1 -0
  101. package/dist/admin/contexts/UsersPermissionsContext/index.mjs +19 -0
  102. package/dist/admin/contexts/UsersPermissionsContext/index.mjs.map +1 -0
  103. package/dist/admin/index.js +125 -0
  104. package/dist/admin/index.js.map +1 -0
  105. package/dist/admin/index.mjs +121 -0
  106. package/dist/admin/index.mjs.map +1 -0
  107. package/dist/admin/package.json.js +14 -0
  108. package/dist/admin/package.json.js.map +1 -0
  109. package/dist/admin/package.json.mjs +11 -0
  110. package/dist/admin/package.json.mjs.map +1 -0
  111. package/dist/admin/pages/AdvancedSettings/index.js +194 -0
  112. package/dist/admin/pages/AdvancedSettings/index.js.map +1 -0
  113. package/dist/admin/pages/AdvancedSettings/index.mjs +191 -0
  114. package/dist/admin/pages/AdvancedSettings/index.mjs.map +1 -0
  115. package/dist/admin/pages/AdvancedSettings/utils/layout.js +83 -0
  116. package/dist/admin/pages/AdvancedSettings/utils/layout.js.map +1 -0
  117. package/dist/admin/pages/AdvancedSettings/utils/layout.mjs +81 -0
  118. package/dist/admin/pages/AdvancedSettings/utils/layout.mjs.map +1 -0
  119. package/dist/admin/pages/AdvancedSettings/utils/schema.js +40 -0
  120. package/dist/admin/pages/AdvancedSettings/utils/schema.js.map +1 -0
  121. package/dist/admin/pages/AdvancedSettings/utils/schema.mjs +19 -0
  122. package/dist/admin/pages/AdvancedSettings/utils/schema.mjs.map +1 -0
  123. package/dist/admin/pages/EmailTemplates/components/EmailForm.js +171 -0
  124. package/dist/admin/pages/EmailTemplates/components/EmailForm.js.map +1 -0
  125. package/dist/admin/pages/EmailTemplates/components/EmailForm.mjs +169 -0
  126. package/dist/admin/pages/EmailTemplates/components/EmailForm.mjs.map +1 -0
  127. package/dist/admin/pages/EmailTemplates/components/EmailTable.js +145 -0
  128. package/dist/admin/pages/EmailTemplates/components/EmailTable.js.map +1 -0
  129. package/dist/admin/pages/EmailTemplates/components/EmailTable.mjs +143 -0
  130. package/dist/admin/pages/EmailTemplates/components/EmailTable.mjs.map +1 -0
  131. package/dist/admin/pages/EmailTemplates/index.js +157 -0
  132. package/dist/admin/pages/EmailTemplates/index.js.map +1 -0
  133. package/dist/admin/pages/EmailTemplates/index.mjs +135 -0
  134. package/dist/admin/pages/EmailTemplates/index.mjs.map +1 -0
  135. package/dist/admin/pages/EmailTemplates/utils/schema.js +50 -0
  136. package/dist/admin/pages/EmailTemplates/utils/schema.js.map +1 -0
  137. package/dist/admin/pages/EmailTemplates/utils/schema.mjs +29 -0
  138. package/dist/admin/pages/EmailTemplates/utils/schema.mjs.map +1 -0
  139. package/dist/admin/pages/Providers/index.js +278 -0
  140. package/dist/admin/pages/Providers/index.js.map +1 -0
  141. package/dist/admin/pages/Providers/index.mjs +254 -0
  142. package/dist/admin/pages/Providers/index.mjs.map +1 -0
  143. package/dist/admin/pages/Providers/utils/forms.js +281 -0
  144. package/dist/admin/pages/Providers/utils/forms.js.map +1 -0
  145. package/dist/admin/pages/Providers/utils/forms.mjs +260 -0
  146. package/dist/admin/pages/Providers/utils/forms.mjs.map +1 -0
  147. package/dist/admin/pages/Roles/constants.js +31 -0
  148. package/dist/admin/pages/Roles/constants.js.map +1 -0
  149. package/dist/admin/pages/Roles/constants.mjs +10 -0
  150. package/dist/admin/pages/Roles/constants.mjs.map +1 -0
  151. package/dist/admin/pages/Roles/hooks/usePlugins.js +78 -0
  152. package/dist/admin/pages/Roles/hooks/usePlugins.js.map +1 -0
  153. package/dist/admin/pages/Roles/hooks/usePlugins.mjs +76 -0
  154. package/dist/admin/pages/Roles/hooks/usePlugins.mjs.map +1 -0
  155. package/dist/admin/pages/Roles/index.js +35 -0
  156. package/dist/admin/pages/Roles/index.js.map +1 -0
  157. package/dist/admin/pages/Roles/index.mjs +33 -0
  158. package/dist/admin/pages/Roles/index.mjs.map +1 -0
  159. package/dist/admin/pages/Roles/pages/CreatePage.js +225 -0
  160. package/dist/admin/pages/Roles/pages/CreatePage.js.map +1 -0
  161. package/dist/admin/pages/Roles/pages/CreatePage.mjs +203 -0
  162. package/dist/admin/pages/Roles/pages/CreatePage.mjs.map +1 -0
  163. package/dist/admin/pages/Roles/pages/EditPage.js +229 -0
  164. package/dist/admin/pages/Roles/pages/EditPage.js.map +1 -0
  165. package/dist/admin/pages/Roles/pages/EditPage.mjs +207 -0
  166. package/dist/admin/pages/Roles/pages/EditPage.mjs.map +1 -0
  167. package/dist/admin/pages/Roles/pages/ListPage/components/TableBody.js +125 -0
  168. package/dist/admin/pages/Roles/pages/ListPage/components/TableBody.js.map +1 -0
  169. package/dist/admin/pages/Roles/pages/ListPage/components/TableBody.mjs +123 -0
  170. package/dist/admin/pages/Roles/pages/ListPage/components/TableBody.mjs.map +1 -0
  171. package/dist/admin/pages/Roles/pages/ListPage/index.js +237 -0
  172. package/dist/admin/pages/Roles/pages/ListPage/index.js.map +1 -0
  173. package/dist/admin/pages/Roles/pages/ListPage/index.mjs +234 -0
  174. package/dist/admin/pages/Roles/pages/ListPage/index.mjs.map +1 -0
  175. package/dist/admin/pluginId.js +8 -0
  176. package/dist/admin/pluginId.js.map +1 -0
  177. package/dist/admin/pluginId.mjs +6 -0
  178. package/dist/admin/pluginId.mjs.map +1 -0
  179. package/dist/admin/translations/ar.json.js +45 -0
  180. package/dist/admin/translations/ar.json.js.map +1 -0
  181. package/dist/admin/translations/ar.json.mjs +43 -0
  182. package/dist/admin/translations/ar.json.mjs.map +1 -0
  183. package/dist/admin/translations/cs.json.js +51 -0
  184. package/dist/admin/translations/cs.json.js.map +1 -0
  185. package/dist/admin/translations/cs.json.mjs +49 -0
  186. package/dist/admin/translations/cs.json.mjs.map +1 -0
  187. package/dist/admin/translations/de.json.js +63 -0
  188. package/dist/admin/translations/de.json.js.map +1 -0
  189. package/dist/admin/translations/de.json.mjs +61 -0
  190. package/dist/admin/translations/de.json.mjs.map +1 -0
  191. package/dist/admin/translations/dk.json.js +87 -0
  192. package/dist/admin/translations/dk.json.js.map +1 -0
  193. package/dist/admin/translations/dk.json.mjs +85 -0
  194. package/dist/admin/translations/dk.json.mjs.map +1 -0
  195. package/dist/admin/translations/en.json.js +87 -0
  196. package/dist/admin/translations/en.json.js.map +1 -0
  197. package/dist/admin/translations/en.json.mjs +85 -0
  198. package/dist/admin/translations/en.json.mjs.map +1 -0
  199. package/dist/admin/translations/es.json.js +87 -0
  200. package/dist/admin/translations/es.json.js.map +1 -0
  201. package/dist/admin/translations/es.json.mjs +85 -0
  202. package/dist/admin/translations/es.json.mjs.map +1 -0
  203. package/dist/admin/translations/fr.json.js +51 -0
  204. package/dist/admin/translations/fr.json.js.map +1 -0
  205. package/dist/admin/translations/fr.json.mjs +49 -0
  206. package/dist/admin/translations/fr.json.mjs.map +1 -0
  207. package/dist/admin/translations/id.json.js +63 -0
  208. package/dist/admin/translations/id.json.js.map +1 -0
  209. package/dist/admin/translations/id.json.mjs +61 -0
  210. package/dist/admin/translations/id.json.mjs.map +1 -0
  211. package/dist/admin/translations/it.json.js +63 -0
  212. package/dist/admin/translations/it.json.js.map +1 -0
  213. package/dist/admin/translations/it.json.mjs +61 -0
  214. package/dist/admin/translations/it.json.mjs.map +1 -0
  215. package/dist/admin/translations/ja.json.js +49 -0
  216. package/dist/admin/translations/ja.json.js.map +1 -0
  217. package/dist/admin/translations/ja.json.mjs +47 -0
  218. package/dist/admin/translations/ja.json.mjs.map +1 -0
  219. package/dist/admin/translations/ko.json.js +87 -0
  220. package/dist/admin/translations/ko.json.js.map +1 -0
  221. package/dist/admin/translations/ko.json.mjs +85 -0
  222. package/dist/admin/translations/ko.json.mjs.map +1 -0
  223. package/dist/admin/translations/ms.json.js +50 -0
  224. package/dist/admin/translations/ms.json.js.map +1 -0
  225. package/dist/admin/translations/ms.json.mjs +48 -0
  226. package/dist/admin/translations/ms.json.mjs.map +1 -0
  227. package/dist/admin/translations/nl.json.js +49 -0
  228. package/dist/admin/translations/nl.json.js.map +1 -0
  229. package/dist/admin/translations/nl.json.mjs +47 -0
  230. package/dist/admin/translations/nl.json.mjs.map +1 -0
  231. package/dist/admin/translations/pl.json.js +87 -0
  232. package/dist/admin/translations/pl.json.js.map +1 -0
  233. package/dist/admin/translations/pl.json.mjs +85 -0
  234. package/dist/admin/translations/pl.json.mjs.map +1 -0
  235. package/dist/admin/translations/pt-BR.json.js +45 -0
  236. package/dist/admin/translations/pt-BR.json.js.map +1 -0
  237. package/dist/admin/translations/pt-BR.json.mjs +43 -0
  238. package/dist/admin/translations/pt-BR.json.mjs.map +1 -0
  239. package/dist/admin/translations/pt.json.js +49 -0
  240. package/dist/admin/translations/pt.json.js.map +1 -0
  241. package/dist/admin/translations/pt.json.mjs +47 -0
  242. package/dist/admin/translations/pt.json.mjs.map +1 -0
  243. package/dist/admin/translations/ru.json.js +87 -0
  244. package/dist/admin/translations/ru.json.js.map +1 -0
  245. package/dist/admin/translations/ru.json.mjs +85 -0
  246. package/dist/admin/translations/ru.json.mjs.map +1 -0
  247. package/dist/admin/translations/sk.json.js +51 -0
  248. package/dist/admin/translations/sk.json.js.map +1 -0
  249. package/dist/admin/translations/sk.json.mjs +49 -0
  250. package/dist/admin/translations/sk.json.mjs.map +1 -0
  251. package/dist/admin/translations/sv.json.js +87 -0
  252. package/dist/admin/translations/sv.json.js.map +1 -0
  253. package/dist/admin/translations/sv.json.mjs +85 -0
  254. package/dist/admin/translations/sv.json.mjs.map +1 -0
  255. package/dist/admin/translations/th.json.js +61 -0
  256. package/dist/admin/translations/th.json.js.map +1 -0
  257. package/dist/admin/translations/th.json.mjs +59 -0
  258. package/dist/admin/translations/th.json.mjs.map +1 -0
  259. package/dist/admin/translations/tr.json.js +86 -0
  260. package/dist/admin/translations/tr.json.js.map +1 -0
  261. package/dist/admin/translations/tr.json.mjs +84 -0
  262. package/dist/admin/translations/tr.json.mjs.map +1 -0
  263. package/dist/admin/translations/uk.json.js +87 -0
  264. package/dist/admin/translations/uk.json.js.map +1 -0
  265. package/dist/admin/translations/uk.json.mjs +85 -0
  266. package/dist/admin/translations/uk.json.mjs.map +1 -0
  267. package/dist/admin/translations/vi.json.js +51 -0
  268. package/dist/admin/translations/vi.json.js.map +1 -0
  269. package/dist/admin/translations/vi.json.mjs +49 -0
  270. package/dist/admin/translations/vi.json.mjs.map +1 -0
  271. package/dist/admin/translations/zh-Hans.json.js +87 -0
  272. package/dist/admin/translations/zh-Hans.json.js.map +1 -0
  273. package/dist/admin/translations/zh-Hans.json.mjs +85 -0
  274. package/dist/admin/translations/zh-Hans.json.mjs.map +1 -0
  275. package/dist/admin/translations/zh.json.js +87 -0
  276. package/dist/admin/translations/zh.json.js.map +1 -0
  277. package/dist/admin/translations/zh.json.mjs +85 -0
  278. package/dist/admin/translations/zh.json.mjs.map +1 -0
  279. package/dist/admin/utils/cleanPermissions.js +24 -0
  280. package/dist/admin/utils/cleanPermissions.js.map +1 -0
  281. package/dist/admin/utils/cleanPermissions.mjs +22 -0
  282. package/dist/admin/utils/cleanPermissions.mjs.map +1 -0
  283. package/dist/admin/utils/formatPluginName.js +29 -0
  284. package/dist/admin/utils/formatPluginName.js.map +1 -0
  285. package/dist/admin/utils/formatPluginName.mjs +27 -0
  286. package/dist/admin/utils/formatPluginName.mjs.map +1 -0
  287. package/dist/admin/utils/getTrad.js +8 -0
  288. package/dist/admin/utils/getTrad.js.map +1 -0
  289. package/dist/admin/utils/getTrad.mjs +6 -0
  290. package/dist/admin/utils/getTrad.mjs.map +1 -0
  291. package/dist/admin/utils/prefixPluginTranslations.js +11 -0
  292. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -0
  293. package/dist/admin/utils/prefixPluginTranslations.mjs +9 -0
  294. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -0
  295. package/dist/server/_virtual/_commonjsHelpers.js +8 -0
  296. package/dist/server/_virtual/_commonjsHelpers.js.map +1 -0
  297. package/dist/server/_virtual/_commonjsHelpers.mjs +6 -0
  298. package/dist/server/_virtual/_commonjsHelpers.mjs.map +1 -0
  299. package/dist/server/bootstrap/index.js +166 -0
  300. package/dist/server/bootstrap/index.js.map +1 -0
  301. package/dist/server/bootstrap/index.mjs +164 -0
  302. package/dist/server/bootstrap/index.mjs.map +1 -0
  303. package/dist/server/bootstrap/users-permissions-actions.js +98 -0
  304. package/dist/server/bootstrap/users-permissions-actions.js.map +1 -0
  305. package/dist/server/bootstrap/users-permissions-actions.mjs +96 -0
  306. package/dist/server/bootstrap/users-permissions-actions.mjs.map +1 -0
  307. package/dist/server/config.js +70 -0
  308. package/dist/server/config.js.map +1 -0
  309. package/dist/server/config.mjs +68 -0
  310. package/dist/server/config.mjs.map +1 -0
  311. package/dist/server/content-types/index.js +30 -0
  312. package/dist/server/content-types/index.js.map +1 -0
  313. package/dist/server/content-types/index.mjs +28 -0
  314. package/dist/server/content-types/index.mjs.map +1 -0
  315. package/dist/server/content-types/permission/index.js +44 -0
  316. package/dist/server/content-types/permission/index.js.map +1 -0
  317. package/dist/server/content-types/permission/index.mjs +42 -0
  318. package/dist/server/content-types/permission/index.mjs.map +1 -0
  319. package/dist/server/content-types/role/index.js +61 -0
  320. package/dist/server/content-types/role/index.js.map +1 -0
  321. package/dist/server/content-types/role/index.mjs +59 -0
  322. package/dist/server/content-types/role/index.mjs.map +1 -0
  323. package/dist/server/content-types/user/index.js +84 -0
  324. package/dist/server/content-types/user/index.js.map +1 -0
  325. package/dist/server/content-types/user/index.mjs +82 -0
  326. package/dist/server/content-types/user/index.mjs.map +1 -0
  327. package/dist/server/content-types/user/schema-config.js +25 -0
  328. package/dist/server/content-types/user/schema-config.js.map +1 -0
  329. package/dist/server/content-types/user/schema-config.mjs +23 -0
  330. package/dist/server/content-types/user/schema-config.mjs.map +1 -0
  331. package/dist/server/controllers/auth.js +624 -0
  332. package/dist/server/controllers/auth.js.map +1 -0
  333. package/dist/server/controllers/auth.mjs +622 -0
  334. package/dist/server/controllers/auth.mjs.map +1 -0
  335. package/dist/server/controllers/content-manager-user.js +168 -0
  336. package/dist/server/controllers/content-manager-user.js.map +1 -0
  337. package/dist/server/controllers/content-manager-user.mjs +166 -0
  338. package/dist/server/controllers/content-manager-user.mjs.map +1 -0
  339. package/dist/server/controllers/index.js +33 -0
  340. package/dist/server/controllers/index.js.map +1 -0
  341. package/dist/server/controllers/index.mjs +31 -0
  342. package/dist/server/controllers/index.mjs.map +1 -0
  343. package/dist/server/controllers/permissions.js +37 -0
  344. package/dist/server/controllers/permissions.js.map +1 -0
  345. package/dist/server/controllers/permissions.mjs +35 -0
  346. package/dist/server/controllers/permissions.mjs.map +1 -0
  347. package/dist/server/controllers/role.js +91 -0
  348. package/dist/server/controllers/role.js.map +1 -0
  349. package/dist/server/controllers/role.mjs +89 -0
  350. package/dist/server/controllers/role.mjs.map +1 -0
  351. package/dist/server/controllers/settings.js +107 -0
  352. package/dist/server/controllers/settings.js.map +1 -0
  353. package/dist/server/controllers/settings.mjs +105 -0
  354. package/dist/server/controllers/settings.mjs.map +1 -0
  355. package/dist/server/controllers/user.js +201 -0
  356. package/dist/server/controllers/user.js.map +1 -0
  357. package/dist/server/controllers/user.mjs +199 -0
  358. package/dist/server/controllers/user.mjs.map +1 -0
  359. package/dist/server/controllers/validation/auth.js +131 -0
  360. package/dist/server/controllers/validation/auth.js.map +1 -0
  361. package/dist/server/controllers/validation/auth.mjs +129 -0
  362. package/dist/server/controllers/validation/auth.mjs.map +1 -0
  363. package/dist/server/controllers/validation/email-template.js +72 -0
  364. package/dist/server/controllers/validation/email-template.js.map +1 -0
  365. package/dist/server/controllers/validation/email-template.mjs +70 -0
  366. package/dist/server/controllers/validation/email-template.mjs.map +1 -0
  367. package/dist/server/controllers/validation/user.js +54 -0
  368. package/dist/server/controllers/validation/user.js.map +1 -0
  369. package/dist/server/controllers/validation/user.mjs +52 -0
  370. package/dist/server/controllers/validation/user.mjs.map +1 -0
  371. package/dist/server/graphql/index.js +66 -0
  372. package/dist/server/graphql/index.js.map +1 -0
  373. package/dist/server/graphql/index.mjs +64 -0
  374. package/dist/server/graphql/index.mjs.map +1 -0
  375. package/dist/server/graphql/mutations/auth/change-password.js +40 -0
  376. package/dist/server/graphql/mutations/auth/change-password.js.map +1 -0
  377. package/dist/server/graphql/mutations/auth/change-password.mjs +38 -0
  378. package/dist/server/graphql/mutations/auth/change-password.mjs.map +1 -0
  379. package/dist/server/graphql/mutations/auth/email-confirmation.js +38 -0
  380. package/dist/server/graphql/mutations/auth/email-confirmation.js.map +1 -0
  381. package/dist/server/graphql/mutations/auth/email-confirmation.mjs +36 -0
  382. package/dist/server/graphql/mutations/auth/email-confirmation.mjs.map +1 -0
  383. package/dist/server/graphql/mutations/auth/forgot-password.js +37 -0
  384. package/dist/server/graphql/mutations/auth/forgot-password.js.map +1 -0
  385. package/dist/server/graphql/mutations/auth/forgot-password.mjs +35 -0
  386. package/dist/server/graphql/mutations/auth/forgot-password.mjs.map +1 -0
  387. package/dist/server/graphql/mutations/auth/login.js +40 -0
  388. package/dist/server/graphql/mutations/auth/login.js.map +1 -0
  389. package/dist/server/graphql/mutations/auth/login.mjs +38 -0
  390. package/dist/server/graphql/mutations/auth/login.mjs.map +1 -0
  391. package/dist/server/graphql/mutations/auth/register.js +38 -0
  392. package/dist/server/graphql/mutations/auth/register.js.map +1 -0
  393. package/dist/server/graphql/mutations/auth/register.mjs +36 -0
  394. package/dist/server/graphql/mutations/auth/register.mjs.map +1 -0
  395. package/dist/server/graphql/mutations/auth/reset-password.js +40 -0
  396. package/dist/server/graphql/mutations/auth/reset-password.js.map +1 -0
  397. package/dist/server/graphql/mutations/auth/reset-password.mjs +38 -0
  398. package/dist/server/graphql/mutations/auth/reset-password.mjs.map +1 -0
  399. package/dist/server/graphql/mutations/crud/role/create-role.js +37 -0
  400. package/dist/server/graphql/mutations/crud/role/create-role.js.map +1 -0
  401. package/dist/server/graphql/mutations/crud/role/create-role.mjs +35 -0
  402. package/dist/server/graphql/mutations/crud/role/create-role.mjs.map +1 -0
  403. package/dist/server/graphql/mutations/crud/role/delete-role.js +32 -0
  404. package/dist/server/graphql/mutations/crud/role/delete-role.js.map +1 -0
  405. package/dist/server/graphql/mutations/crud/role/delete-role.mjs +30 -0
  406. package/dist/server/graphql/mutations/crud/role/delete-role.mjs.map +1 -0
  407. package/dist/server/graphql/mutations/crud/role/update-role.js +39 -0
  408. package/dist/server/graphql/mutations/crud/role/update-role.js.map +1 -0
  409. package/dist/server/graphql/mutations/crud/role/update-role.mjs +37 -0
  410. package/dist/server/graphql/mutations/crud/role/update-role.mjs.map +1 -0
  411. package/dist/server/graphql/mutations/crud/user/create-user.js +46 -0
  412. package/dist/server/graphql/mutations/crud/user/create-user.js.map +1 -0
  413. package/dist/server/graphql/mutations/crud/user/create-user.mjs +44 -0
  414. package/dist/server/graphql/mutations/crud/user/create-user.mjs.map +1 -0
  415. package/dist/server/graphql/mutations/crud/user/delete-user.js +44 -0
  416. package/dist/server/graphql/mutations/crud/user/delete-user.js.map +1 -0
  417. package/dist/server/graphql/mutations/crud/user/delete-user.mjs +42 -0
  418. package/dist/server/graphql/mutations/crud/user/delete-user.mjs.map +1 -0
  419. package/dist/server/graphql/mutations/crud/user/update-user.js +49 -0
  420. package/dist/server/graphql/mutations/crud/user/update-user.js.map +1 -0
  421. package/dist/server/graphql/mutations/crud/user/update-user.mjs +47 -0
  422. package/dist/server/graphql/mutations/crud/user/update-user.mjs.map +1 -0
  423. package/dist/server/graphql/mutations/index.js +58 -0
  424. package/dist/server/graphql/mutations/index.js.map +1 -0
  425. package/dist/server/graphql/mutations/index.mjs +56 -0
  426. package/dist/server/graphql/mutations/index.mjs.map +1 -0
  427. package/dist/server/graphql/queries/index.js +25 -0
  428. package/dist/server/graphql/queries/index.js.map +1 -0
  429. package/dist/server/graphql/queries/index.mjs +23 -0
  430. package/dist/server/graphql/queries/index.mjs.map +1 -0
  431. package/dist/server/graphql/queries/me.js +23 -0
  432. package/dist/server/graphql/queries/me.js.map +1 -0
  433. package/dist/server/graphql/queries/me.mjs +21 -0
  434. package/dist/server/graphql/queries/me.mjs.map +1 -0
  435. package/dist/server/graphql/resolvers-configs.js +93 -0
  436. package/dist/server/graphql/resolvers-configs.js.map +1 -0
  437. package/dist/server/graphql/resolvers-configs.mjs +91 -0
  438. package/dist/server/graphql/resolvers-configs.mjs.map +1 -0
  439. package/dist/server/graphql/types/create-role-payload.js +20 -0
  440. package/dist/server/graphql/types/create-role-payload.js.map +1 -0
  441. package/dist/server/graphql/types/create-role-payload.mjs +18 -0
  442. package/dist/server/graphql/types/create-role-payload.mjs.map +1 -0
  443. package/dist/server/graphql/types/delete-role-payload.js +20 -0
  444. package/dist/server/graphql/types/delete-role-payload.js.map +1 -0
  445. package/dist/server/graphql/types/delete-role-payload.mjs +18 -0
  446. package/dist/server/graphql/types/delete-role-payload.mjs.map +1 -0
  447. package/dist/server/graphql/types/index.js +41 -0
  448. package/dist/server/graphql/types/index.js.map +1 -0
  449. package/dist/server/graphql/types/index.mjs +39 -0
  450. package/dist/server/graphql/types/index.mjs.map +1 -0
  451. package/dist/server/graphql/types/login-input.js +24 -0
  452. package/dist/server/graphql/types/login-input.js.map +1 -0
  453. package/dist/server/graphql/types/login-input.mjs +22 -0
  454. package/dist/server/graphql/types/login-input.mjs.map +1 -0
  455. package/dist/server/graphql/types/login-payload.js +23 -0
  456. package/dist/server/graphql/types/login-payload.js.map +1 -0
  457. package/dist/server/graphql/types/login-payload.mjs +21 -0
  458. package/dist/server/graphql/types/login-payload.mjs.map +1 -0
  459. package/dist/server/graphql/types/me-role.js +23 -0
  460. package/dist/server/graphql/types/me-role.js.map +1 -0
  461. package/dist/server/graphql/types/me-role.mjs +21 -0
  462. package/dist/server/graphql/types/me-role.mjs.map +1 -0
  463. package/dist/server/graphql/types/me.js +28 -0
  464. package/dist/server/graphql/types/me.js.map +1 -0
  465. package/dist/server/graphql/types/me.mjs +26 -0
  466. package/dist/server/graphql/types/me.mjs.map +1 -0
  467. package/dist/server/graphql/types/password-payload.js +20 -0
  468. package/dist/server/graphql/types/password-payload.js.map +1 -0
  469. package/dist/server/graphql/types/password-payload.mjs +18 -0
  470. package/dist/server/graphql/types/password-payload.mjs.map +1 -0
  471. package/dist/server/graphql/types/register-input.js +22 -0
  472. package/dist/server/graphql/types/register-input.js.map +1 -0
  473. package/dist/server/graphql/types/register-input.mjs +20 -0
  474. package/dist/server/graphql/types/register-input.mjs.map +1 -0
  475. package/dist/server/graphql/types/update-role-payload.js +20 -0
  476. package/dist/server/graphql/types/update-role-payload.js.map +1 -0
  477. package/dist/server/graphql/types/update-role-payload.mjs +18 -0
  478. package/dist/server/graphql/types/update-role-payload.mjs.map +1 -0
  479. package/dist/server/graphql/types/user-input.js +26 -0
  480. package/dist/server/graphql/types/user-input.js.map +1 -0
  481. package/dist/server/graphql/types/user-input.mjs +24 -0
  482. package/dist/server/graphql/types/user-input.mjs.map +1 -0
  483. package/dist/server/graphql/utils.js +32 -0
  484. package/dist/server/graphql/utils.js.map +1 -0
  485. package/dist/server/graphql/utils.mjs +30 -0
  486. package/dist/server/graphql/utils.mjs.map +1 -0
  487. package/dist/server/index.js +10 -0
  488. package/dist/server/index.js.map +1 -0
  489. package/dist/server/index.mjs +8 -0
  490. package/dist/server/index.mjs.map +1 -0
  491. package/dist/server/index2.js +39 -0
  492. package/dist/server/index2.js.map +1 -0
  493. package/dist/server/index2.mjs +37 -0
  494. package/dist/server/index2.mjs.map +1 -0
  495. package/dist/server/middlewares/index.js +18 -0
  496. package/dist/server/middlewares/index.js.map +1 -0
  497. package/dist/server/middlewares/index.mjs +16 -0
  498. package/dist/server/middlewares/index.mjs.map +1 -0
  499. package/dist/server/middlewares/rateLimit.js +51 -0
  500. package/dist/server/middlewares/rateLimit.js.map +1 -0
  501. package/dist/server/middlewares/rateLimit.mjs +49 -0
  502. package/dist/server/middlewares/rateLimit.mjs.map +1 -0
  503. package/dist/server/register.js +41 -0
  504. package/dist/server/register.js.map +1 -0
  505. package/dist/server/register.mjs +39 -0
  506. package/dist/server/register.mjs.map +1 -0
  507. package/dist/server/routes/admin/index.js +27 -0
  508. package/dist/server/routes/admin/index.js.map +1 -0
  509. package/dist/server/routes/admin/index.mjs +25 -0
  510. package/dist/server/routes/admin/index.mjs.map +1 -0
  511. package/dist/server/routes/admin/permissions.js +29 -0
  512. package/dist/server/routes/admin/permissions.js.map +1 -0
  513. package/dist/server/routes/admin/permissions.mjs +27 -0
  514. package/dist/server/routes/admin/permissions.mjs.map +1 -0
  515. package/dist/server/routes/admin/role.js +99 -0
  516. package/dist/server/routes/admin/role.js.map +1 -0
  517. package/dist/server/routes/admin/role.mjs +97 -0
  518. package/dist/server/routes/admin/role.mjs.map +1 -0
  519. package/dist/server/routes/admin/settings.js +116 -0
  520. package/dist/server/routes/admin/settings.js.map +1 -0
  521. package/dist/server/routes/admin/settings.mjs +114 -0
  522. package/dist/server/routes/admin/settings.mjs.map +1 -0
  523. package/dist/server/routes/content-api/auth.js +168 -0
  524. package/dist/server/routes/content-api/auth.js.map +1 -0
  525. package/dist/server/routes/content-api/auth.mjs +166 -0
  526. package/dist/server/routes/content-api/auth.mjs.map +1 -0
  527. package/dist/server/routes/content-api/index.js +32 -0
  528. package/dist/server/routes/content-api/index.js.map +1 -0
  529. package/dist/server/routes/content-api/index.mjs +30 -0
  530. package/dist/server/routes/content-api/index.mjs.map +1 -0
  531. package/dist/server/routes/content-api/permissions.js +26 -0
  532. package/dist/server/routes/content-api/permissions.js.map +1 -0
  533. package/dist/server/routes/content-api/permissions.mjs +24 -0
  534. package/dist/server/routes/content-api/permissions.mjs.map +1 -0
  535. package/dist/server/routes/content-api/role.js +73 -0
  536. package/dist/server/routes/content-api/role.js.map +1 -0
  537. package/dist/server/routes/content-api/role.mjs +71 -0
  538. package/dist/server/routes/content-api/role.mjs.map +1 -0
  539. package/dist/server/routes/content-api/user.js +132 -0
  540. package/dist/server/routes/content-api/user.js.map +1 -0
  541. package/dist/server/routes/content-api/user.mjs +130 -0
  542. package/dist/server/routes/content-api/user.mjs.map +1 -0
  543. package/dist/server/routes/content-api/validation.js +217 -0
  544. package/dist/server/routes/content-api/validation.js.map +1 -0
  545. package/dist/server/routes/content-api/validation.mjs +215 -0
  546. package/dist/server/routes/content-api/validation.mjs.map +1 -0
  547. package/dist/server/routes/index.js +19 -0
  548. package/dist/server/routes/index.js.map +1 -0
  549. package/dist/server/routes/index.mjs +17 -0
  550. package/dist/server/routes/index.mjs.map +1 -0
  551. package/dist/server/services/constants.js +19 -0
  552. package/dist/server/services/constants.js.map +1 -0
  553. package/dist/server/services/constants.mjs +17 -0
  554. package/dist/server/services/constants.mjs.map +1 -0
  555. package/dist/server/services/index.js +36 -0
  556. package/dist/server/services/index.js.map +1 -0
  557. package/dist/server/services/index.mjs +34 -0
  558. package/dist/server/services/index.mjs.map +1 -0
  559. package/dist/server/services/jwt.js +93 -0
  560. package/dist/server/services/jwt.js.map +1 -0
  561. package/dist/server/services/jwt.mjs +91 -0
  562. package/dist/server/services/jwt.mjs.map +1 -0
  563. package/dist/server/services/permission.js +52 -0
  564. package/dist/server/services/permission.js.map +1 -0
  565. package/dist/server/services/permission.mjs +50 -0
  566. package/dist/server/services/permission.mjs.map +1 -0
  567. package/dist/server/services/providers-registry.js +555 -0
  568. package/dist/server/services/providers-registry.js.map +1 -0
  569. package/dist/server/services/providers-registry.mjs +553 -0
  570. package/dist/server/services/providers-registry.mjs.map +1 -0
  571. package/dist/server/services/providers.js +111 -0
  572. package/dist/server/services/providers.js.map +1 -0
  573. package/dist/server/services/providers.mjs +109 -0
  574. package/dist/server/services/providers.mjs.map +1 -0
  575. package/dist/server/services/role.js +186 -0
  576. package/dist/server/services/role.js.map +1 -0
  577. package/dist/server/services/role.mjs +184 -0
  578. package/dist/server/services/role.mjs.map +1 -0
  579. package/dist/server/services/user.js +188 -0
  580. package/dist/server/services/user.js.map +1 -0
  581. package/dist/server/services/user.mjs +186 -0
  582. package/dist/server/services/user.mjs.map +1 -0
  583. package/dist/server/services/users-permissions.js +248 -0
  584. package/dist/server/services/users-permissions.js.map +1 -0
  585. package/dist/server/services/users-permissions.mjs +246 -0
  586. package/dist/server/services/users-permissions.mjs.map +1 -0
  587. package/dist/server/strategies/users-permissions.js +114 -0
  588. package/dist/server/strategies/users-permissions.js.map +1 -0
  589. package/dist/server/strategies/users-permissions.mjs +112 -0
  590. package/dist/server/strategies/users-permissions.mjs.map +1 -0
  591. package/dist/server/utils/index.js +22 -0
  592. package/dist/server/utils/index.js.map +1 -0
  593. package/dist/server/utils/index.mjs +20 -0
  594. package/dist/server/utils/index.mjs.map +1 -0
  595. package/dist/server/utils/sanitize/index.js +21 -0
  596. package/dist/server/utils/sanitize/index.js.map +1 -0
  597. package/dist/server/utils/sanitize/index.mjs +19 -0
  598. package/dist/server/utils/sanitize/index.mjs.map +1 -0
  599. package/dist/server/utils/sanitize/sanitizers.js +32 -0
  600. package/dist/server/utils/sanitize/sanitizers.js.map +1 -0
  601. package/dist/server/utils/sanitize/sanitizers.mjs +30 -0
  602. package/dist/server/utils/sanitize/sanitizers.mjs.map +1 -0
  603. package/dist/server/utils/sanitize/visitors/index.js +17 -0
  604. package/dist/server/utils/sanitize/visitors/index.js.map +1 -0
  605. package/dist/server/utils/sanitize/visitors/index.mjs +15 -0
  606. package/dist/server/utils/sanitize/visitors/index.mjs.map +1 -0
  607. package/dist/server/utils/sanitize/visitors/remove-user-relation-from-role-entities.js +17 -0
  608. package/dist/server/utils/sanitize/visitors/remove-user-relation-from-role-entities.js.map +1 -0
  609. package/dist/server/utils/sanitize/visitors/remove-user-relation-from-role-entities.mjs +15 -0
  610. package/dist/server/utils/sanitize/visitors/remove-user-relation-from-role-entities.mjs.map +1 -0
  611. package/documentation/content-api.yaml +1 -1
  612. package/jest.config.front.js +1 -1
  613. package/package.json +50 -30
  614. package/rollup.config.mjs +19 -0
  615. package/server/bootstrap/index.js +49 -15
  616. package/server/bootstrap/users-permissions-actions.js +6 -0
  617. package/server/config.js +51 -0
  618. package/server/content-types/user/index.js +0 -1
  619. package/server/controllers/auth.js +307 -47
  620. package/server/controllers/content-manager-user.js +31 -34
  621. package/server/controllers/role.js +17 -4
  622. package/server/controllers/user.js +18 -8
  623. package/server/controllers/validation/auth.js +104 -25
  624. package/server/controllers/validation/user.js +12 -1
  625. package/server/graphql/types/index.js +1 -0
  626. package/server/graphql/types/me.js +1 -0
  627. package/server/graphql/types/user-input.js +20 -0
  628. package/server/middlewares/rateLimit.js +41 -21
  629. package/server/register.js +2 -2
  630. package/server/routes/content-api/auth.js +119 -71
  631. package/server/routes/content-api/index.js +11 -4
  632. package/server/routes/content-api/permissions.js +14 -7
  633. package/server/routes/content-api/role.js +57 -27
  634. package/server/routes/content-api/user.js +108 -51
  635. package/server/routes/content-api/validation.js +250 -0
  636. package/server/services/constants.js +9 -0
  637. package/server/services/jwt.js +53 -5
  638. package/server/services/permission.js +3 -7
  639. package/server/services/providers-registry.js +469 -261
  640. package/server/services/providers.js +10 -5
  641. package/server/services/role.js +15 -13
  642. package/server/services/user.js +67 -19
  643. package/server/services/users-permissions.js +19 -15
  644. package/server/utils/index.d.ts +2 -1
  645. package/server/utils/sanitize/sanitizers.js +7 -3
  646. package/server/utils/sanitize/visitors/remove-user-relation-from-role-entities.js +2 -2
  647. package/.eslintrc.js +0 -14
  648. package/admin/src/components/FormModal/index.js +0 -126
  649. package/admin/src/components/Permissions/index.js +0 -57
  650. package/admin/src/hooks/index.js +0 -5
  651. package/admin/src/hooks/useFetchRole/index.js +0 -67
  652. package/admin/src/hooks/useFetchRole/reducer.js +0 -31
  653. package/admin/src/hooks/useForm/index.js +0 -70
  654. package/admin/src/hooks/useForm/reducer.js +0 -40
  655. package/admin/src/hooks/useRolesList/index.js +0 -65
  656. package/admin/src/hooks/useRolesList/init.js +0 -5
  657. package/admin/src/hooks/useRolesList/reducer.js +0 -31
  658. package/admin/src/pages/AdvancedSettings/index.js +0 -246
  659. package/admin/src/pages/AdvancedSettings/utils/api.js +0 -18
  660. package/admin/src/pages/EmailTemplates/components/EmailForm.js +0 -176
  661. package/admin/src/pages/EmailTemplates/index.js +0 -163
  662. package/admin/src/pages/EmailTemplates/utils/api.js +0 -18
  663. package/admin/src/pages/Providers/index.js +0 -275
  664. package/admin/src/pages/Providers/reducer.js +0 -54
  665. package/admin/src/pages/Providers/utils/api.js +0 -26
  666. package/admin/src/pages/Providers/utils/createProvidersArray.js +0 -21
  667. package/admin/src/pages/Roles/CreatePage.js +0 -185
  668. package/admin/src/pages/Roles/EditPage.js +0 -197
  669. package/admin/src/pages/Roles/ListPage/components/TableBody.js +0 -93
  670. package/admin/src/pages/Roles/ListPage/utils/api.js +0 -32
  671. package/admin/src/pages/Roles/ProtectedCreatePage.js +0 -15
  672. package/admin/src/pages/Roles/ProtectedEditPage.js +0 -15
  673. package/admin/src/pages/Roles/ProtectedListPage.js +0 -17
  674. package/admin/src/pages/Roles/index.js +0 -30
  675. package/admin/src/utils/getRequestURL.js +0 -5
  676. package/server/bootstrap/grant-config.js +0 -131
  677. package/strapi-admin.js +0 -3
  678. package/strapi-server.js +0 -3
  679. /package/admin/src/components/Permissions/PermissionRow/{index.js → index.jsx} +0 -0
  680. /package/admin/src/contexts/UsersPermissionsContext/{index.js → index.jsx} +0 -0
@@ -9,6 +9,7 @@
9
9
  /* eslint-disable no-useless-escape */
10
10
  const crypto = require('crypto');
11
11
  const _ = require('lodash');
12
+ const { concat, compact, isArray } = require('lodash/fp');
12
13
  const utils = require('@strapi/utils');
13
14
  const { getService } = require('../utils');
14
15
  const {
@@ -21,17 +22,22 @@ const {
21
22
  validateChangePasswordBody,
22
23
  } = require('./validation/auth');
23
24
 
24
- const { getAbsoluteAdminUrl, getAbsoluteServerUrl, sanitize } = utils;
25
- const { ApplicationError, ValidationError } = utils.errors;
25
+ const { ApplicationError, ValidationError, ForbiddenError } = utils.errors;
26
26
 
27
27
  const sanitizeUser = (user, ctx) => {
28
28
  const { auth } = ctx.state;
29
29
  const userSchema = strapi.getModel('plugin::users-permissions.user');
30
30
 
31
- return sanitize.contentAPI.output(user, userSchema, { auth });
31
+ return strapi.contentAPI.sanitize.output(user, userSchema, { auth });
32
32
  };
33
33
 
34
- module.exports = {
34
+ const extractDeviceId = (requestBody) => {
35
+ const { deviceId } = requestBody || {};
36
+
37
+ return typeof deviceId === 'string' && deviceId.length > 0 ? deviceId : undefined;
38
+ };
39
+
40
+ module.exports = ({ strapi }) => ({
35
41
  async callback(ctx) {
36
42
  const provider = ctx.params.provider || 'local';
37
43
  const params = ctx.request.body;
@@ -51,7 +57,7 @@ module.exports = {
51
57
  const { identifier } = params;
52
58
 
53
59
  // Check if the user exists.
54
- const user = await strapi.query('plugin::users-permissions.user').findOne({
60
+ const user = await strapi.db.query('plugin::users-permissions.user').findOne({
55
61
  where: {
56
62
  provider,
57
63
  $or: [{ email: identifier.toLowerCase() }, { username: identifier }],
@@ -86,6 +92,45 @@ module.exports = {
86
92
  throw new ApplicationError('Your account has been blocked by an administrator');
87
93
  }
88
94
 
95
+ const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');
96
+ if (mode === 'refresh') {
97
+ const deviceId = extractDeviceId(ctx.request.body);
98
+
99
+ const refresh = await strapi
100
+ .sessionManager('users-permissions')
101
+ .generateRefreshToken(String(user.id), deviceId, { type: 'refresh' });
102
+
103
+ const access = await strapi
104
+ .sessionManager('users-permissions')
105
+ .generateAccessToken(refresh.token);
106
+ if ('error' in access) {
107
+ throw new ApplicationError('Invalid credentials');
108
+ }
109
+
110
+ const upSessions = strapi.config.get('plugin::users-permissions.sessions');
111
+ const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';
112
+ if (upSessions?.httpOnly || requestHttpOnly) {
113
+ const cookieName = upSessions.cookie?.name || 'strapi_up_refresh';
114
+ const cookieOptions = {
115
+ httpOnly: true,
116
+ secure: Boolean(upSessions.cookie?.secure),
117
+ sameSite: upSessions.cookie?.sameSite ?? 'lax',
118
+ path: upSessions.cookie?.path ?? '/',
119
+ domain: upSessions.cookie?.domain,
120
+ overwrite: true,
121
+ };
122
+
123
+ ctx.cookies.set(cookieName, refresh.token, cookieOptions);
124
+ return ctx.send({ jwt: access.token, user: await sanitizeUser(user, ctx) });
125
+ }
126
+
127
+ return ctx.send({
128
+ jwt: access.token,
129
+ refreshToken: refresh.token,
130
+ user: await sanitizeUser(user, ctx),
131
+ });
132
+ }
133
+
89
134
  return ctx.send({
90
135
  jwt: getService('jwt').issue({ id: user.id }),
91
136
  user: await sanitizeUser(user, ctx),
@@ -96,6 +141,47 @@ module.exports = {
96
141
  try {
97
142
  const user = await getService('providers').connect(provider, ctx.query);
98
143
 
144
+ if (user.blocked) {
145
+ throw new ForbiddenError('Your account has been blocked by an administrator');
146
+ }
147
+
148
+ const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');
149
+ if (mode === 'refresh') {
150
+ const deviceId = extractDeviceId(ctx.request.body);
151
+
152
+ const refresh = await strapi
153
+ .sessionManager('users-permissions')
154
+ .generateRefreshToken(String(user.id), deviceId, { type: 'refresh' });
155
+
156
+ const access = await strapi
157
+ .sessionManager('users-permissions')
158
+ .generateAccessToken(refresh.token);
159
+ if ('error' in access) {
160
+ throw new ApplicationError('Invalid credentials');
161
+ }
162
+
163
+ const upSessions = strapi.config.get('plugin::users-permissions.sessions');
164
+ const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';
165
+ if (upSessions?.httpOnly || requestHttpOnly) {
166
+ const cookieName = upSessions.cookie?.name || 'strapi_up_refresh';
167
+ const cookieOptions = {
168
+ httpOnly: true,
169
+ secure: Boolean(upSessions.cookie?.secure),
170
+ sameSite: upSessions.cookie?.sameSite ?? 'lax',
171
+ path: upSessions.cookie?.path ?? '/',
172
+ domain: upSessions.cookie?.domain,
173
+ overwrite: true,
174
+ };
175
+ ctx.cookies.set(cookieName, refresh.token, cookieOptions);
176
+ return ctx.send({ jwt: access.token, user: await sanitizeUser(user, ctx) });
177
+ }
178
+ return ctx.send({
179
+ jwt: access.token,
180
+ refreshToken: refresh.token,
181
+ user: await sanitizeUser(user, ctx),
182
+ });
183
+ }
184
+
99
185
  return ctx.send({
100
186
  jwt: getService('jwt').issue({ id: user.id }),
101
187
  user: await sanitizeUser(user, ctx),
@@ -110,13 +196,17 @@ module.exports = {
110
196
  throw new ApplicationError('You must be authenticated to reset your password');
111
197
  }
112
198
 
113
- const { currentPassword, password } = await validateChangePasswordBody(ctx.request.body);
199
+ const validations = strapi.config.get('plugin::users-permissions.validationRules');
114
200
 
115
- const user = await strapi.entityService.findOne(
116
- 'plugin::users-permissions.user',
117
- ctx.state.user.id
201
+ const { currentPassword, password } = await validateChangePasswordBody(
202
+ ctx.request.body,
203
+ validations
118
204
  );
119
205
 
206
+ const user = await strapi.db
207
+ .query('plugin::users-permissions.user')
208
+ .findOne({ where: { id: ctx.state.user.id } });
209
+
120
210
  const validPassword = await getService('user').validatePassword(currentPassword, user.password);
121
211
 
122
212
  if (!validPassword) {
@@ -129,22 +219,55 @@ module.exports = {
129
219
 
130
220
  await getService('user').edit(user.id, { password });
131
221
 
132
- ctx.send({
222
+ const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');
223
+ if (mode === 'refresh') {
224
+ const deviceId = extractDeviceId(ctx.request.body);
225
+
226
+ if (deviceId) {
227
+ // Invalidate sessions: specific device if deviceId provided
228
+ await strapi
229
+ .sessionManager('users-permissions')
230
+ .invalidateRefreshToken(String(user.id), deviceId);
231
+ }
232
+
233
+ const newDeviceId = deviceId || crypto.randomUUID();
234
+ const refresh = await strapi
235
+ .sessionManager('users-permissions')
236
+ .generateRefreshToken(String(user.id), newDeviceId, { type: 'refresh' });
237
+
238
+ const access = await strapi
239
+ .sessionManager('users-permissions')
240
+ .generateAccessToken(refresh.token);
241
+ if ('error' in access) {
242
+ throw new ApplicationError('Invalid credentials');
243
+ }
244
+
245
+ return ctx.send({
246
+ jwt: access.token,
247
+ refreshToken: refresh.token,
248
+ user: await sanitizeUser(user, ctx),
249
+ });
250
+ }
251
+
252
+ return ctx.send({
133
253
  jwt: getService('jwt').issue({ id: user.id }),
134
254
  user: await sanitizeUser(user, ctx),
135
255
  });
136
256
  },
137
257
 
138
258
  async resetPassword(ctx) {
259
+ const validations = strapi.config.get('plugin::users-permissions.validationRules');
260
+
139
261
  const { password, passwordConfirmation, code } = await validateResetPasswordBody(
140
- ctx.request.body
262
+ ctx.request.body,
263
+ validations
141
264
  );
142
265
 
143
266
  if (password !== passwordConfirmation) {
144
267
  throw new ValidationError('Passwords do not match');
145
268
  }
146
269
 
147
- const user = await strapi
270
+ const user = await strapi.db
148
271
  .query('plugin::users-permissions.user')
149
272
  .findOne({ where: { resetPasswordToken: code } });
150
273
 
@@ -157,15 +280,113 @@ module.exports = {
157
280
  password,
158
281
  });
159
282
 
160
- // Update the user.
161
- ctx.send({
283
+ const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');
284
+ if (mode === 'refresh') {
285
+ const deviceId = extractDeviceId(ctx.request.body);
286
+
287
+ if (deviceId) {
288
+ // Invalidate sessions: specific device if deviceId provided
289
+ await strapi
290
+ .sessionManager('users-permissions')
291
+ .invalidateRefreshToken(String(user.id), deviceId);
292
+ }
293
+
294
+ const newDeviceId = deviceId || crypto.randomUUID();
295
+ const refresh = await strapi
296
+ .sessionManager('users-permissions')
297
+ .generateRefreshToken(String(user.id), newDeviceId, { type: 'refresh' });
298
+
299
+ const access = await strapi
300
+ .sessionManager('users-permissions')
301
+ .generateAccessToken(refresh.token);
302
+ if ('error' in access) {
303
+ throw new ApplicationError('Invalid credentials');
304
+ }
305
+
306
+ return ctx.send({
307
+ jwt: access.token,
308
+ refreshToken: refresh.token,
309
+ user: await sanitizeUser(user, ctx),
310
+ });
311
+ }
312
+
313
+ return ctx.send({
162
314
  jwt: getService('jwt').issue({ id: user.id }),
163
315
  user: await sanitizeUser(user, ctx),
164
316
  });
165
317
  },
318
+ async refresh(ctx) {
319
+ const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');
320
+ if (mode !== 'refresh') {
321
+ return ctx.notFound();
322
+ }
323
+
324
+ const { refreshToken } = ctx.request.body || {};
325
+ if (!refreshToken || typeof refreshToken !== 'string') {
326
+ return ctx.badRequest('Missing refresh token');
327
+ }
328
+
329
+ const rotation = await strapi
330
+ .sessionManager('users-permissions')
331
+ .rotateRefreshToken(refreshToken);
332
+ if ('error' in rotation) {
333
+ return ctx.unauthorized('Invalid refresh token');
334
+ }
335
+
336
+ const result = await strapi
337
+ .sessionManager('users-permissions')
338
+ .generateAccessToken(rotation.token);
339
+ if ('error' in result) {
340
+ return ctx.unauthorized('Invalid refresh token');
341
+ }
342
+
343
+ const upSessions = strapi.config.get('plugin::users-permissions.sessions');
344
+ const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';
345
+ if (upSessions?.httpOnly || requestHttpOnly) {
346
+ const cookieName = upSessions.cookie?.name || 'strapi_up_refresh';
347
+ const cookieOptions = {
348
+ httpOnly: true,
349
+ secure: Boolean(upSessions.cookie?.secure),
350
+ sameSite: upSessions.cookie?.sameSite ?? 'lax',
351
+ path: upSessions.cookie?.path ?? '/',
352
+ domain: upSessions.cookie?.domain,
353
+ overwrite: true,
354
+ };
355
+ ctx.cookies.set(cookieName, rotation.token, cookieOptions);
356
+ return ctx.send({ jwt: result.token });
357
+ }
358
+ return ctx.send({ jwt: result.token, refreshToken: rotation.token });
359
+ },
360
+ async logout(ctx) {
361
+ const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');
362
+ if (mode !== 'refresh') {
363
+ return ctx.notFound();
364
+ }
365
+
366
+ // Invalidate all sessions for the authenticated user, or by deviceId if provided
367
+ if (!ctx.state.user) {
368
+ return ctx.unauthorized('Missing authentication');
369
+ }
166
370
 
371
+ const deviceId = extractDeviceId(ctx.request.body);
372
+ try {
373
+ await strapi
374
+ .sessionManager('users-permissions')
375
+ .invalidateRefreshToken(String(ctx.state.user.id), deviceId);
376
+ } catch (err) {
377
+ strapi.log.error('UP logout failed', err);
378
+ }
379
+
380
+ const upSessions = strapi.config.get('plugin::users-permissions.sessions');
381
+ const requestHttpOnly = ctx.request.header['x-strapi-refresh-cookie'] === 'httpOnly';
382
+ if (upSessions?.httpOnly || requestHttpOnly) {
383
+ const cookieName = upSessions.cookie?.name || 'strapi_up_refresh';
384
+ ctx.cookies.set(cookieName, '', { expires: new Date(0) });
385
+ }
386
+ return ctx.send({ ok: true });
387
+ },
167
388
  async connect(ctx, next) {
168
- const grant = require('grant-koa');
389
+ const grant = require('grant').koa();
169
390
 
170
391
  const providers = await strapi
171
392
  .store({ type: 'plugin', name: 'users-permissions', key: 'grant' })
@@ -193,10 +414,28 @@ module.exports = {
193
414
  }
194
415
 
195
416
  // Ability to pass OAuth callback dynamically
196
- grantConfig[provider].callback =
197
- _.get(ctx, 'query.callback') ||
198
- _.get(ctx, 'session.grant.dynamic.callback') ||
199
- grantConfig[provider].callback;
417
+ const queryCustomCallback = _.get(ctx, 'query.callback');
418
+ const dynamicSessionCallback = _.get(ctx, 'session.grant.dynamic.callback');
419
+
420
+ const customCallback = queryCustomCallback ?? dynamicSessionCallback;
421
+
422
+ // The custom callback is validated to make sure it's not redirecting to an unwanted actor.
423
+ if (customCallback !== undefined) {
424
+ try {
425
+ // We're extracting the callback validator from the plugin config since it can be user-customized
426
+ const { validate: validateCallback } = strapi
427
+ .plugin('users-permissions')
428
+ .config('callback');
429
+
430
+ await validateCallback(customCallback, grantConfig[provider]);
431
+
432
+ grantConfig[provider].callback = customCallback;
433
+ } catch (e) {
434
+ throw new ValidationError('Invalid callback URL provided', { callback: customCallback });
435
+ }
436
+ }
437
+
438
+ // Build a valid redirect URI for the current provider
200
439
  grantConfig[provider].redirect_uri = getService('providers').buildRedirectUri(provider);
201
440
 
202
441
  return grant(grantConfig)(ctx, next);
@@ -211,7 +450,7 @@ module.exports = {
211
450
  const advancedSettings = await pluginStore.get({ key: 'advanced' });
212
451
 
213
452
  // Find the user by email.
214
- const user = await strapi
453
+ const user = await strapi.db
215
454
  .query('plugin::users-permissions.user')
216
455
  .findOne({ where: { email: email.toLowerCase() } });
217
456
 
@@ -229,8 +468,8 @@ module.exports = {
229
468
  resetPasswordSettings.message,
230
469
  {
231
470
  URL: advancedSettings.email_reset_password,
232
- SERVER_URL: getAbsoluteServerUrl(strapi.config),
233
- ADMIN_URL: getAbsoluteAdminUrl(strapi.config),
471
+ SERVER_URL: strapi.config.get('server.absoluteUrl'),
472
+ ADMIN_URL: strapi.config.get('admin.absoluteUrl'),
234
473
  USER: userInfo,
235
474
  TOKEN: resetPasswordToken,
236
475
  }
@@ -273,26 +512,32 @@ module.exports = {
273
512
  throw new ApplicationError('Register action is currently disabled');
274
513
  }
275
514
 
515
+ const { register } = strapi.config.get('plugin::users-permissions');
516
+ const alwaysAllowedKeys = ['username', 'password', 'email'];
517
+
518
+ // Note that we intentionally do not filter allowedFields to allow a project to explicitly accept private or other Strapi field on registration
519
+ const allowedKeys = compact(
520
+ concat(alwaysAllowedKeys, isArray(register?.allowedFields) ? register.allowedFields : [])
521
+ );
522
+
523
+ // Check if there are any keys in requestBody that are not in allowedKeys
524
+ const invalidKeys = Object.keys(ctx.request.body).filter((key) => !allowedKeys.includes(key));
525
+
526
+ if (invalidKeys.length > 0) {
527
+ // If there are invalid keys, throw an error
528
+ throw new ValidationError(`Invalid parameters: ${invalidKeys.join(', ')}`);
529
+ }
530
+
276
531
  const params = {
277
- ..._.omit(ctx.request.body, [
278
- 'confirmed',
279
- 'blocked',
280
- 'confirmationToken',
281
- 'resetPasswordToken',
282
- 'provider',
283
- 'id',
284
- 'createdAt',
285
- 'updatedAt',
286
- 'createdBy',
287
- 'updatedBy',
288
- 'role',
289
- ]),
532
+ ..._.pick(ctx.request.body, allowedKeys),
290
533
  provider: 'local',
291
534
  };
292
535
 
293
- await validateRegisterBody(params);
536
+ const validations = strapi.config.get('plugin::users-permissions.validationRules');
537
+
538
+ await validateRegisterBody(params, validations);
294
539
 
295
- const role = await strapi
540
+ const role = await strapi.db
296
541
  .query('plugin::users-permissions.role')
297
542
  .findOne({ where: { type: settings.default_role } });
298
543
 
@@ -311,7 +556,7 @@ module.exports = {
311
556
  ],
312
557
  };
313
558
 
314
- const conflictingUserCount = await strapi.query('plugin::users-permissions.user').count({
559
+ const conflictingUserCount = await strapi.db.query('plugin::users-permissions.user').count({
315
560
  where: { ...identifierFilter, provider },
316
561
  });
317
562
 
@@ -320,7 +565,7 @@ module.exports = {
320
565
  }
321
566
 
322
567
  if (settings.unique_email) {
323
- const conflictingUserCount = await strapi.query('plugin::users-permissions.user').count({
568
+ const conflictingUserCount = await strapi.db.query('plugin::users-permissions.user').count({
324
569
  where: { ...identifierFilter },
325
570
  });
326
571
 
@@ -345,18 +590,33 @@ module.exports = {
345
590
  try {
346
591
  await getService('user').sendConfirmationEmail(sanitizedUser);
347
592
  } catch (err) {
348
- throw new ApplicationError(err.message);
593
+ strapi.log.error(err);
594
+ throw new ApplicationError('Error sending confirmation email');
349
595
  }
350
596
 
351
597
  return ctx.send({ user: sanitizedUser });
352
598
  }
353
599
 
354
- const jwt = getService('jwt').issue(_.pick(user, ['id']));
600
+ const mode = strapi.config.get('plugin::users-permissions.jwtManagement', 'legacy-support');
601
+ if (mode === 'refresh') {
602
+ const deviceId = extractDeviceId(ctx.request.body) || crypto.randomUUID();
355
603
 
356
- return ctx.send({
357
- jwt,
358
- user: sanitizedUser,
359
- });
604
+ const refresh = await strapi
605
+ .sessionManager('users-permissions')
606
+ .generateRefreshToken(String(user.id), deviceId, { type: 'refresh' });
607
+
608
+ const access = await strapi
609
+ .sessionManager('users-permissions')
610
+ .generateAccessToken(refresh.token);
611
+ if ('error' in access) {
612
+ throw new ApplicationError('Invalid credentials');
613
+ }
614
+
615
+ return ctx.send({ jwt: access.token, refreshToken: refresh.token, user: sanitizedUser });
616
+ }
617
+
618
+ const jwt = getService('jwt').issue(_.pick(user, ['id']));
619
+ return ctx.send({ jwt, user: sanitizedUser });
360
620
  },
361
621
 
362
622
  async emailConfirmation(ctx, next, returnUser) {
@@ -390,7 +650,7 @@ module.exports = {
390
650
  async sendEmailConfirmation(ctx) {
391
651
  const { email } = await validateSendEmailConfirmationBody(ctx.request.body);
392
652
 
393
- const user = await strapi.query('plugin::users-permissions.user').findOne({
653
+ const user = await strapi.db.query('plugin::users-permissions.user').findOne({
394
654
  where: { email: email.toLowerCase() },
395
655
  });
396
656
 
@@ -413,4 +673,4 @@ module.exports = {
413
673
  sent: true,
414
674
  });
415
675
  },
416
- };
676
+ });
@@ -2,8 +2,7 @@
2
2
 
3
3
  const _ = require('lodash');
4
4
  const { contentTypes: contentTypesUtils } = require('@strapi/utils');
5
- const { ApplicationError, ValidationError, NotFoundError, ForbiddenError } =
6
- require('@strapi/utils').errors;
5
+ const { ApplicationError, NotFoundError, ForbiddenError } = require('@strapi/utils').errors;
7
6
  const { validateCreateUserBody, validateUpdateUserBody } = require('./validation/user');
8
7
 
9
8
  const { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = contentTypesUtils.constants;
@@ -17,24 +16,25 @@ const ACTIONS = {
17
16
  };
18
17
 
19
18
  const findEntityAndCheckPermissions = async (ability, action, model, id) => {
20
- const entity = await strapi.query(userModel).findOne({
21
- where: { id },
19
+ const doc = await strapi.service('plugin::content-manager.document-manager').findOne(id, model, {
22
20
  populate: [`${CREATED_BY_ATTRIBUTE}.roles`],
23
21
  });
24
22
 
25
- if (_.isNil(entity)) {
23
+ if (_.isNil(doc)) {
26
24
  throw new NotFoundError();
27
25
  }
28
26
 
29
- const pm = strapi.admin.services.permission.createPermissionsManager({ ability, action, model });
27
+ const pm = strapi
28
+ .service('admin::permission')
29
+ .createPermissionsManager({ ability, action, model });
30
30
 
31
- if (pm.ability.cannot(pm.action, pm.toSubject(entity))) {
31
+ if (pm.ability.cannot(pm.action, pm.toSubject(doc))) {
32
32
  throw new ForbiddenError();
33
33
  }
34
34
 
35
- const entityWithoutCreatorRoles = _.omit(entity, `${CREATED_BY_ATTRIBUTE}.roles`);
35
+ const docWithoutCreatorRoles = _.omit(doc, `${CREATED_BY_ATTRIBUTE}.roles`);
36
36
 
37
- return { pm, entity: entityWithoutCreatorRoles };
37
+ return { pm, doc: docWithoutCreatorRoles };
38
38
  };
39
39
 
40
40
  module.exports = {
@@ -48,7 +48,7 @@ module.exports = {
48
48
 
49
49
  const { email, username } = body;
50
50
 
51
- const pm = strapi.admin.services.permission.createPermissionsManager({
51
+ const pm = strapi.service('admin::permission').createPermissionsManager({
52
52
  ability: userAbility,
53
53
  action: ACTIONS.create,
54
54
  model: userModel,
@@ -66,7 +66,7 @@ module.exports = {
66
66
 
67
67
  await validateCreateUserBody(ctx.request.body);
68
68
 
69
- const userWithSameUsername = await strapi
69
+ const userWithSameUsername = await strapi.db
70
70
  .query('plugin::users-permissions.user')
71
71
  .findOne({ where: { username } });
72
72
 
@@ -75,7 +75,7 @@ module.exports = {
75
75
  }
76
76
 
77
77
  if (advanced.unique_email) {
78
- const userWithSameEmail = await strapi
78
+ const userWithSameEmail = await strapi.db
79
79
  .query('plugin::users-permissions.user')
80
80
  .findOne({ where: { email: email.toLowerCase() } });
81
81
 
@@ -93,18 +93,11 @@ module.exports = {
93
93
 
94
94
  user.email = _.toLower(user.email);
95
95
 
96
- if (!user.role) {
97
- const defaultRole = await strapi
98
- .query('plugin::users-permissions.role')
99
- .findOne({ where: { type: advanced.default_role } });
100
-
101
- user.role = defaultRole.id;
102
- }
103
-
104
96
  try {
105
97
  const data = await strapi
106
- .service('plugin::content-manager.entity-manager')
107
- .create(user, userModel);
98
+ .service('plugin::content-manager.document-manager')
99
+ .create(userModel, { data: user });
100
+
108
101
  const sanitizedData = await pm.sanitizeOutput(data, { action: ACTIONS.read });
109
102
 
110
103
  ctx.created(sanitizedData);
@@ -118,7 +111,7 @@ module.exports = {
118
111
  */
119
112
 
120
113
  async update(ctx) {
121
- const { id } = ctx.params;
114
+ const { id: documentId } = ctx.params;
122
115
  const { body } = ctx.request;
123
116
  const { user: admin, userAbility } = ctx.state;
124
117
 
@@ -128,38 +121,40 @@ module.exports = {
128
121
 
129
122
  const { email, username, password } = body;
130
123
 
131
- const { pm, entity } = await findEntityAndCheckPermissions(
124
+ const { pm, doc } = await findEntityAndCheckPermissions(
132
125
  userAbility,
133
126
  ACTIONS.edit,
134
127
  userModel,
135
- id
128
+ documentId
136
129
  );
137
- const user = entity;
130
+
131
+ const user = doc;
138
132
 
139
133
  await validateUpdateUserBody(ctx.request.body);
140
134
 
141
- if (_.has(body, 'password') && !password && user.provider === 'local') {
142
- throw new ValidationError('password.notNull');
135
+ if (_.has(body, 'password') && (password == null || password === '')) {
136
+ delete body.password;
143
137
  }
144
138
 
145
139
  if (_.has(body, 'username')) {
146
- const userWithSameUsername = await strapi
140
+ const userWithSameUsername = await strapi.db
147
141
  .query('plugin::users-permissions.user')
148
142
  .findOne({ where: { username } });
149
143
 
150
- if (userWithSameUsername && _.toString(userWithSameUsername.id) !== _.toString(id)) {
144
+ if (userWithSameUsername && _.toString(userWithSameUsername.id) !== _.toString(user.id)) {
151
145
  throw new ApplicationError('Username already taken');
152
146
  }
153
147
  }
154
148
 
155
149
  if (_.has(body, 'email') && advancedConfigs.unique_email) {
156
- const userWithSameEmail = await strapi
150
+ const userWithSameEmail = await strapi.db
157
151
  .query('plugin::users-permissions.user')
158
152
  .findOne({ where: { email: _.toLower(email) } });
159
153
 
160
- if (userWithSameEmail && _.toString(userWithSameEmail.id) !== _.toString(id)) {
154
+ if (userWithSameEmail && _.toString(userWithSameEmail.id) !== _.toString(user.id)) {
161
155
  throw new ApplicationError('Email already taken');
162
156
  }
157
+
163
158
  body.email = _.toLower(body.email);
164
159
  }
165
160
 
@@ -167,8 +162,10 @@ module.exports = {
167
162
  const updateData = _.omit({ ...sanitizedData, updatedBy: admin.id }, 'createdBy');
168
163
 
169
164
  const data = await strapi
170
- .service('plugin::content-manager.entity-manager')
171
- .update({ id }, updateData, userModel);
165
+ .service('plugin::content-manager.document-manager')
166
+ .update(documentId, userModel, {
167
+ data: updateData,
168
+ });
172
169
 
173
170
  ctx.body = await pm.sanitizeOutput(data, { action: ACTIONS.read });
174
171
  },