@strapi/plugin-users-permissions 0.0.0-next.e6eaa3d0563c85f80fd88b258df70a55c057096e → 0.0.0-next.e8d8fc824d0f6a695b2a9ebaa4680ed21c3645ca

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 (250) hide show
  1. package/LICENSE +18 -3
  2. package/admin/src/components/BoundRoute/index.jsx +2 -2
  3. package/admin/src/components/FormModal/Input/index.jsx +32 -31
  4. package/admin/src/components/FormModal/index.jsx +57 -68
  5. package/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.jsx +4 -3
  6. package/admin/src/components/Permissions/PermissionRow/SubCategory.jsx +13 -22
  7. package/admin/src/components/Permissions/index.jsx +27 -35
  8. package/admin/src/components/Permissions/reducer.js +1 -1
  9. package/admin/src/components/Policies/index.jsx +7 -5
  10. package/admin/src/components/UsersPermissions/index.jsx +15 -7
  11. package/admin/src/components/UsersPermissions/reducer.js +1 -1
  12. package/admin/src/index.js +15 -32
  13. package/admin/src/pages/AdvancedSettings/index.jsx +83 -128
  14. package/admin/src/pages/AdvancedSettings/utils/layout.js +20 -35
  15. package/admin/src/pages/AdvancedSettings/utils/schema.js +5 -2
  16. package/admin/src/pages/EmailTemplates/components/EmailForm.jsx +119 -139
  17. package/admin/src/pages/EmailTemplates/components/EmailTable.jsx +20 -17
  18. package/admin/src/pages/EmailTemplates/index.jsx +36 -62
  19. package/admin/src/pages/EmailTemplates/utils/schema.js +18 -6
  20. package/admin/src/pages/Providers/index.jsx +98 -113
  21. package/admin/src/pages/Providers/utils/forms.js +23 -11
  22. package/admin/src/pages/Roles/constants.js +3 -3
  23. package/admin/src/pages/Roles/hooks/usePlugins.js +4 -4
  24. package/admin/src/pages/Roles/index.jsx +9 -18
  25. package/admin/src/pages/Roles/pages/CreatePage.jsx +53 -58
  26. package/admin/src/pages/Roles/pages/EditPage.jsx +63 -68
  27. package/admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx +27 -31
  28. package/admin/src/pages/Roles/pages/ListPage/index.jsx +79 -55
  29. package/admin/src/translations/en.json +1 -1
  30. package/admin/src/utils/prefixPluginTranslations.js +13 -0
  31. package/dist/_chunks/{ar-t5qTFaAD.js → ar-BguGUqwK.js} +1 -1
  32. package/dist/_chunks/ar-BguGUqwK.js.map +1 -0
  33. package/dist/_chunks/{ar-MvD8Ghac.mjs → ar-CK8BRRXB.mjs} +1 -1
  34. package/dist/_chunks/ar-CK8BRRXB.mjs.map +1 -0
  35. package/dist/_chunks/{cs-BMuXwxA1.mjs → cs-BVigMk0l.mjs} +1 -1
  36. package/dist/_chunks/cs-BVigMk0l.mjs.map +1 -0
  37. package/dist/_chunks/{cs-I8N4u-Sd.js → cs-BW8-K_GY.js} +1 -1
  38. package/dist/_chunks/cs-BW8-K_GY.js.map +1 -0
  39. package/dist/_chunks/{de-zs2qqc0W.mjs → de-BKUdRFI4.mjs} +1 -1
  40. package/dist/_chunks/de-BKUdRFI4.mjs.map +1 -0
  41. package/dist/_chunks/{de-YTjtq89K.js → de-owXpVluI.js} +1 -1
  42. package/dist/_chunks/de-owXpVluI.js.map +1 -0
  43. package/dist/_chunks/{dk-HctVBMsG.mjs → dk-BQiTK50l.mjs} +1 -1
  44. package/dist/_chunks/dk-BQiTK50l.mjs.map +1 -0
  45. package/dist/_chunks/{dk-TF-dWjzl.js → dk-LXAnbuBk.js} +1 -1
  46. package/dist/_chunks/dk-LXAnbuBk.js.map +1 -0
  47. package/dist/_chunks/{en-CE3wEy_c.mjs → en-DOHtPf-2.mjs} +2 -2
  48. package/dist/_chunks/en-DOHtPf-2.mjs.map +1 -0
  49. package/dist/_chunks/{en-m608rMZx.js → en-MHo5mcsU.js} +2 -2
  50. package/dist/_chunks/en-MHo5mcsU.js.map +1 -0
  51. package/dist/_chunks/{es-XBQsB8_9.js → es-BwLCLXAQ.js} +1 -1
  52. package/dist/_chunks/es-BwLCLXAQ.js.map +1 -0
  53. package/dist/_chunks/{es-9381tih_.mjs → es-DNgOVMjD.mjs} +1 -1
  54. package/dist/_chunks/es-DNgOVMjD.mjs.map +1 -0
  55. package/dist/_chunks/{fr-CMSc77If.mjs → fr-DkgRugiU.mjs} +1 -1
  56. package/dist/_chunks/fr-DkgRugiU.mjs.map +1 -0
  57. package/dist/_chunks/{fr-6cz3U-IF.js → fr-DkhpSjjm.js} +1 -1
  58. package/dist/_chunks/fr-DkhpSjjm.js.map +1 -0
  59. package/dist/_chunks/{id-RJ934rq-.js → id-BTemOeTZ.js} +1 -1
  60. package/dist/_chunks/id-BTemOeTZ.js.map +1 -0
  61. package/dist/_chunks/{id-SDuyIkZa.mjs → id-BdEsvnaF.mjs} +1 -1
  62. package/dist/_chunks/id-BdEsvnaF.mjs.map +1 -0
  63. package/dist/_chunks/index-BP1KkpZq.js +280 -0
  64. package/dist/_chunks/index-BP1KkpZq.js.map +1 -0
  65. package/dist/_chunks/index-BnvtBuUS.js +365 -0
  66. package/dist/_chunks/index-BnvtBuUS.js.map +1 -0
  67. package/dist/_chunks/{index-YkMqn-9t.js → index-BphRo4l2.js} +56 -53
  68. package/dist/_chunks/index-BphRo4l2.js.map +1 -0
  69. package/dist/_chunks/index-C_5QiATG.mjs +344 -0
  70. package/dist/_chunks/index-C_5QiATG.mjs.map +1 -0
  71. package/dist/_chunks/index-Cn5HftCc-CvJvlZwK.js +11113 -0
  72. package/dist/_chunks/index-Cn5HftCc-CvJvlZwK.js.map +1 -0
  73. package/dist/_chunks/index-Cn5HftCc-Dku5eOkP.mjs +11090 -0
  74. package/dist/_chunks/index-Cn5HftCc-Dku5eOkP.mjs.map +1 -0
  75. package/dist/_chunks/{index-l_QWM0NZ.mjs → index-Cxhs260c.mjs} +239 -256
  76. package/dist/_chunks/index-Cxhs260c.mjs.map +1 -0
  77. package/dist/_chunks/index-D4Ge_-Bp.mjs +262 -0
  78. package/dist/_chunks/index-D4Ge_-Bp.mjs.map +1 -0
  79. package/dist/_chunks/{index-5-krOCaE.mjs → index-D5yExFYc.mjs} +55 -52
  80. package/dist/_chunks/index-D5yExFYc.mjs.map +1 -0
  81. package/dist/_chunks/{index-wiA9qAAp.mjs → index-D_J3MMcj.mjs} +105 -103
  82. package/dist/_chunks/index-D_J3MMcj.mjs.map +1 -0
  83. package/dist/_chunks/{index-dnfs8wOQ.js → index-DoogNdMf.js} +109 -108
  84. package/dist/_chunks/index-DoogNdMf.js.map +1 -0
  85. package/dist/_chunks/{index-Aq7T7skI.js → index-iJPHXbGD.js} +256 -276
  86. package/dist/_chunks/index-iJPHXbGD.js.map +1 -0
  87. package/dist/_chunks/{it-bvH7DgQo.mjs → it-B-rv0E24.mjs} +1 -1
  88. package/dist/_chunks/it-B-rv0E24.mjs.map +1 -0
  89. package/dist/_chunks/{it-YhZOlM2X.js → it-D1rH6V6_.js} +1 -1
  90. package/dist/_chunks/it-D1rH6V6_.js.map +1 -0
  91. package/dist/_chunks/{ja-o_-JPvQv.mjs → ja-C8K-VBPD.mjs} +1 -1
  92. package/dist/_chunks/ja-C8K-VBPD.mjs.map +1 -0
  93. package/dist/_chunks/{ja-xssHUXFv.js → ja-DqShgTMf.js} +1 -1
  94. package/dist/_chunks/ja-DqShgTMf.js.map +1 -0
  95. package/dist/_chunks/{ko-C3mHUSJa.js → ko-B9DGEPWH.js} +1 -1
  96. package/dist/_chunks/ko-B9DGEPWH.js.map +1 -0
  97. package/dist/_chunks/{ko-XJbPSez_.mjs → ko-Busb0wIY.mjs} +1 -1
  98. package/dist/_chunks/ko-Busb0wIY.mjs.map +1 -0
  99. package/dist/_chunks/{ms-II5Ea73J.mjs → ms-ByvsQjRt.mjs} +1 -1
  100. package/dist/_chunks/ms-ByvsQjRt.mjs.map +1 -0
  101. package/dist/_chunks/{ms-d0hfg65Z.js → ms-CPBU3LWf.js} +1 -1
  102. package/dist/_chunks/ms-CPBU3LWf.js.map +1 -0
  103. package/dist/_chunks/{nl-vEy6TN0K.mjs → nl-5qO8Rpcy.mjs} +1 -1
  104. package/dist/_chunks/nl-5qO8Rpcy.mjs.map +1 -0
  105. package/dist/_chunks/{nl-TA7TfK_5.js → nl-CwNB6YoO.js} +1 -1
  106. package/dist/_chunks/nl-CwNB6YoO.js.map +1 -0
  107. package/dist/_chunks/{pl-2VowaFGt.mjs → pl-BdIzifBE.mjs} +1 -1
  108. package/dist/_chunks/pl-BdIzifBE.mjs.map +1 -0
  109. package/dist/_chunks/{pl-0pUL9hdA.js → pl-Do9UD69f.js} +1 -1
  110. package/dist/_chunks/pl-Do9UD69f.js.map +1 -0
  111. package/dist/_chunks/{pt-Rf9W51IO.mjs → pt-BIO24ioG.mjs} +1 -1
  112. package/dist/_chunks/pt-BIO24ioG.mjs.map +1 -0
  113. package/dist/_chunks/{pt-BR-WNOhafR4.js → pt-BR-D7dZhxuP.js} +1 -1
  114. package/dist/_chunks/pt-BR-D7dZhxuP.js.map +1 -0
  115. package/dist/_chunks/{pt-BR-sS1Xp3Jt.mjs → pt-BR-f0p23AQZ.mjs} +1 -1
  116. package/dist/_chunks/pt-BR-f0p23AQZ.mjs.map +1 -0
  117. package/dist/_chunks/{pt-guNR9Gax.js → pt-fdvyOnUp.js} +1 -1
  118. package/dist/_chunks/pt-fdvyOnUp.js.map +1 -0
  119. package/dist/_chunks/{ru-X3BMXDds.js → ru-C94rjPGA.js} +1 -1
  120. package/dist/_chunks/ru-C94rjPGA.js.map +1 -0
  121. package/dist/_chunks/{ru-qKHnd5or.mjs → ru-VWy-IB7K.mjs} +1 -1
  122. package/dist/_chunks/ru-VWy-IB7K.mjs.map +1 -0
  123. package/dist/_chunks/{sk-NWPw1oTN.js → sk-BABEhykl.js} +1 -1
  124. package/dist/_chunks/sk-BABEhykl.js.map +1 -0
  125. package/dist/_chunks/{sk-_Ryr-eTT.mjs → sk-B_LIcepm.mjs} +1 -1
  126. package/dist/_chunks/sk-B_LIcepm.mjs.map +1 -0
  127. package/dist/_chunks/{sv-BqzScFXS.mjs → sv-ABLKOokl.mjs} +1 -1
  128. package/dist/_chunks/sv-ABLKOokl.mjs.map +1 -0
  129. package/dist/_chunks/{sv-76NnbB__.js → sv-Be43LhA9.js} +1 -1
  130. package/dist/_chunks/sv-Be43LhA9.js.map +1 -0
  131. package/dist/_chunks/{th-WsknMEpq.mjs → th-DKyP7ueR.mjs} +1 -1
  132. package/dist/_chunks/th-DKyP7ueR.mjs.map +1 -0
  133. package/dist/_chunks/{th-cbppX21D.js → th-DgVhVLhL.js} +1 -1
  134. package/dist/_chunks/th-DgVhVLhL.js.map +1 -0
  135. package/dist/_chunks/{tr-6mm_Fmz7.js → tr-B_idhkEs.js} +1 -1
  136. package/dist/_chunks/tr-B_idhkEs.js.map +1 -0
  137. package/dist/_chunks/{tr-_DB1F1GW.mjs → tr-qa1Q5UjC.mjs} +1 -1
  138. package/dist/_chunks/tr-qa1Q5UjC.mjs.map +1 -0
  139. package/dist/_chunks/{uk-yxMSQAwI.mjs → uk-BmRqbeQc.mjs} +1 -1
  140. package/dist/_chunks/uk-BmRqbeQc.mjs.map +1 -0
  141. package/dist/_chunks/{uk-sI2I1ogF.js → uk-LHOivnhP.js} +1 -1
  142. package/dist/_chunks/uk-LHOivnhP.js.map +1 -0
  143. package/dist/_chunks/{vi-A3zJxaiI.js → vi-CdVRdKDw.js} +1 -1
  144. package/dist/_chunks/vi-CdVRdKDw.js.map +1 -0
  145. package/dist/_chunks/{vi-xY0zCW3d.mjs → vi-HW-EdMea.mjs} +1 -1
  146. package/dist/_chunks/vi-HW-EdMea.mjs.map +1 -0
  147. package/dist/_chunks/{zh-OFeldzbX.mjs → zh-5hKkVPA4.mjs} +1 -1
  148. package/dist/_chunks/zh-5hKkVPA4.mjs.map +1 -0
  149. package/dist/_chunks/{zh-72SpmFXa.js → zh-Cuq8gMnF.js} +1 -1
  150. package/dist/_chunks/zh-Cuq8gMnF.js.map +1 -0
  151. package/dist/_chunks/{zh-Hans-E84cu4kP.mjs → zh-Hans-BHilK-yc.mjs} +1 -1
  152. package/dist/_chunks/zh-Hans-BHilK-yc.mjs.map +1 -0
  153. package/dist/_chunks/{zh-Hans-ArWWtyP4.js → zh-Hans-GQDMKtY4.js} +1 -1
  154. package/dist/_chunks/zh-Hans-GQDMKtY4.js.map +1 -0
  155. package/dist/admin/index.js +1 -2
  156. package/dist/admin/index.js.map +1 -1
  157. package/dist/admin/index.mjs +1 -2
  158. package/dist/admin/index.mjs.map +1 -1
  159. package/package.json +27 -28
  160. package/server/bootstrap/index.js +18 -51
  161. package/server/bootstrap/users-permissions-actions.js +6 -0
  162. package/server/config.js +29 -0
  163. package/server/content-types/user/index.js +0 -1
  164. package/server/controllers/auth.js +62 -63
  165. package/server/controllers/content-manager-user.js +28 -30
  166. package/server/controllers/role.js +17 -4
  167. package/server/controllers/user.js +8 -9
  168. package/server/controllers/validation/auth.js +81 -25
  169. package/server/graphql/types/index.js +1 -0
  170. package/server/graphql/types/me.js +1 -0
  171. package/server/graphql/types/user-input.js +20 -0
  172. package/server/middlewares/rateLimit.js +1 -1
  173. package/server/register.js +1 -1
  174. package/server/services/jwt.js +3 -3
  175. package/server/services/permission.js +3 -7
  176. package/server/services/providers-registry.js +469 -261
  177. package/server/services/providers.js +10 -5
  178. package/server/services/role.js +15 -13
  179. package/server/services/user.js +56 -19
  180. package/server/services/users-permissions.js +15 -13
  181. package/server/utils/index.d.ts +2 -1
  182. package/server/utils/sanitize/sanitizers.js +7 -3
  183. package/server/utils/sanitize/visitors/remove-user-relation-from-role-entities.js +2 -2
  184. package/admin/src/pages/Roles/pages/ListPage/utils/api.js +0 -30
  185. package/dist/_chunks/ar-MvD8Ghac.mjs.map +0 -1
  186. package/dist/_chunks/ar-t5qTFaAD.js.map +0 -1
  187. package/dist/_chunks/cs-BMuXwxA1.mjs.map +0 -1
  188. package/dist/_chunks/cs-I8N4u-Sd.js.map +0 -1
  189. package/dist/_chunks/de-YTjtq89K.js.map +0 -1
  190. package/dist/_chunks/de-zs2qqc0W.mjs.map +0 -1
  191. package/dist/_chunks/dk-HctVBMsG.mjs.map +0 -1
  192. package/dist/_chunks/dk-TF-dWjzl.js.map +0 -1
  193. package/dist/_chunks/en-CE3wEy_c.mjs.map +0 -1
  194. package/dist/_chunks/en-m608rMZx.js.map +0 -1
  195. package/dist/_chunks/es-9381tih_.mjs.map +0 -1
  196. package/dist/_chunks/es-XBQsB8_9.js.map +0 -1
  197. package/dist/_chunks/fr-6cz3U-IF.js.map +0 -1
  198. package/dist/_chunks/fr-CMSc77If.mjs.map +0 -1
  199. package/dist/_chunks/id-RJ934rq-.js.map +0 -1
  200. package/dist/_chunks/id-SDuyIkZa.mjs.map +0 -1
  201. package/dist/_chunks/index-5-krOCaE.mjs.map +0 -1
  202. package/dist/_chunks/index-Aq7T7skI.js.map +0 -1
  203. package/dist/_chunks/index-LN8gSFZ3.mjs +0 -385
  204. package/dist/_chunks/index-LN8gSFZ3.mjs.map +0 -1
  205. package/dist/_chunks/index-RWAJu_-T.js +0 -407
  206. package/dist/_chunks/index-RWAJu_-T.js.map +0 -1
  207. package/dist/_chunks/index-SICvbeQf.mjs +0 -301
  208. package/dist/_chunks/index-SICvbeQf.mjs.map +0 -1
  209. package/dist/_chunks/index-YkMqn-9t.js.map +0 -1
  210. package/dist/_chunks/index-_wwOOuf_.js +0 -320
  211. package/dist/_chunks/index-_wwOOuf_.js.map +0 -1
  212. package/dist/_chunks/index-dnfs8wOQ.js.map +0 -1
  213. package/dist/_chunks/index-l_QWM0NZ.mjs.map +0 -1
  214. package/dist/_chunks/index-wiA9qAAp.mjs.map +0 -1
  215. package/dist/_chunks/it-YhZOlM2X.js.map +0 -1
  216. package/dist/_chunks/it-bvH7DgQo.mjs.map +0 -1
  217. package/dist/_chunks/ja-o_-JPvQv.mjs.map +0 -1
  218. package/dist/_chunks/ja-xssHUXFv.js.map +0 -1
  219. package/dist/_chunks/ko-C3mHUSJa.js.map +0 -1
  220. package/dist/_chunks/ko-XJbPSez_.mjs.map +0 -1
  221. package/dist/_chunks/ms-II5Ea73J.mjs.map +0 -1
  222. package/dist/_chunks/ms-d0hfg65Z.js.map +0 -1
  223. package/dist/_chunks/nl-TA7TfK_5.js.map +0 -1
  224. package/dist/_chunks/nl-vEy6TN0K.mjs.map +0 -1
  225. package/dist/_chunks/pl-0pUL9hdA.js.map +0 -1
  226. package/dist/_chunks/pl-2VowaFGt.mjs.map +0 -1
  227. package/dist/_chunks/pt-BR-WNOhafR4.js.map +0 -1
  228. package/dist/_chunks/pt-BR-sS1Xp3Jt.mjs.map +0 -1
  229. package/dist/_chunks/pt-Rf9W51IO.mjs.map +0 -1
  230. package/dist/_chunks/pt-guNR9Gax.js.map +0 -1
  231. package/dist/_chunks/ru-X3BMXDds.js.map +0 -1
  232. package/dist/_chunks/ru-qKHnd5or.mjs.map +0 -1
  233. package/dist/_chunks/sk-NWPw1oTN.js.map +0 -1
  234. package/dist/_chunks/sk-_Ryr-eTT.mjs.map +0 -1
  235. package/dist/_chunks/sv-76NnbB__.js.map +0 -1
  236. package/dist/_chunks/sv-BqzScFXS.mjs.map +0 -1
  237. package/dist/_chunks/th-WsknMEpq.mjs.map +0 -1
  238. package/dist/_chunks/th-cbppX21D.js.map +0 -1
  239. package/dist/_chunks/tr-6mm_Fmz7.js.map +0 -1
  240. package/dist/_chunks/tr-_DB1F1GW.mjs.map +0 -1
  241. package/dist/_chunks/uk-sI2I1ogF.js.map +0 -1
  242. package/dist/_chunks/uk-yxMSQAwI.mjs.map +0 -1
  243. package/dist/_chunks/vi-A3zJxaiI.js.map +0 -1
  244. package/dist/_chunks/vi-xY0zCW3d.mjs.map +0 -1
  245. package/dist/_chunks/zh-72SpmFXa.js.map +0 -1
  246. package/dist/_chunks/zh-Hans-ArWWtyP4.js.map +0 -1
  247. package/dist/_chunks/zh-Hans-E84cu4kP.mjs.map +0 -1
  248. package/dist/_chunks/zh-OFeldzbX.mjs.map +0 -1
  249. package/server/bootstrap/grant-config.js +0 -131
  250. package/strapi-server.js +0 -3
@@ -1,10 +1,19 @@
1
1
  'use strict';
2
2
 
3
3
  const _ = require('lodash');
4
- const { ApplicationError, ValidationError } = require('@strapi/utils').errors;
4
+ const { async, errors } = require('@strapi/utils');
5
5
  const { getService } = require('../utils');
6
6
  const { validateDeleteRoleBody } = require('./validation/user');
7
7
 
8
+ const { ApplicationError, ValidationError } = errors;
9
+
10
+ const sanitizeOutput = async (role) => {
11
+ const { sanitizeLocalizationFields } = strapi.plugin('i18n').service('sanitize');
12
+ const schema = strapi.getModel('plugin::users-permissions.role');
13
+
14
+ return async.pipe(sanitizeLocalizationFields(schema))(role);
15
+ };
16
+
8
17
  module.exports = {
9
18
  /**
10
19
  * Default action.
@@ -30,13 +39,17 @@ module.exports = {
30
39
  return ctx.notFound();
31
40
  }
32
41
 
33
- ctx.send({ role });
42
+ const safeRole = await sanitizeOutput(role);
43
+
44
+ ctx.send({ role: safeRole });
34
45
  },
35
46
 
36
47
  async find(ctx) {
37
48
  const roles = await getService('role').find();
38
49
 
39
- ctx.send({ roles });
50
+ const safeRoles = await Promise.all(roles.map(sanitizeOutput));
51
+
52
+ ctx.send({ roles: safeRoles });
40
53
  },
41
54
 
42
55
  async updateRole(ctx) {
@@ -59,7 +72,7 @@ module.exports = {
59
72
  }
60
73
 
61
74
  // Fetch public role.
62
- const publicRole = await strapi
75
+ const publicRole = await strapi.db
63
76
  .query('plugin::users-permissions.role')
64
77
  .findOne({ where: { type: 'public' } });
65
78
 
@@ -11,28 +11,27 @@ const utils = require('@strapi/utils');
11
11
  const { getService } = require('../utils');
12
12
  const { validateCreateUserBody, validateUpdateUserBody } = require('./validation/user');
13
13
 
14
- const { sanitize, validate } = utils;
15
14
  const { ApplicationError, ValidationError, NotFoundError } = utils.errors;
16
15
 
17
16
  const sanitizeOutput = async (user, ctx) => {
18
17
  const schema = strapi.getModel('plugin::users-permissions.user');
19
18
  const { auth } = ctx.state;
20
19
 
21
- return sanitize.contentAPI.output(user, schema, { auth });
20
+ return strapi.contentAPI.sanitize.output(user, schema, { auth });
22
21
  };
23
22
 
24
23
  const validateQuery = async (query, ctx) => {
25
24
  const schema = strapi.getModel('plugin::users-permissions.user');
26
25
  const { auth } = ctx.state;
27
26
 
28
- return validate.contentAPI.query(query, schema, { auth });
27
+ return strapi.contentAPI.validate.query(query, schema, { auth });
29
28
  };
30
29
 
31
30
  const sanitizeQuery = async (query, ctx) => {
32
31
  const schema = strapi.getModel('plugin::users-permissions.user');
33
32
  const { auth } = ctx.state;
34
33
 
35
- return sanitize.contentAPI.query(query, schema, { auth });
34
+ return strapi.contentAPI.sanitize.query(query, schema, { auth });
36
35
  };
37
36
 
38
37
  module.exports = {
@@ -49,7 +48,7 @@ module.exports = {
49
48
 
50
49
  const { email, username, role } = ctx.request.body;
51
50
 
52
- const userWithSameUsername = await strapi
51
+ const userWithSameUsername = await strapi.db
53
52
  .query('plugin::users-permissions.user')
54
53
  .findOne({ where: { username } });
55
54
 
@@ -58,7 +57,7 @@ module.exports = {
58
57
  }
59
58
 
60
59
  if (advanced.unique_email) {
61
- const userWithSameEmail = await strapi
60
+ const userWithSameEmail = await strapi.db
62
61
  .query('plugin::users-permissions.user')
63
62
  .findOne({ where: { email: email.toLowerCase() } });
64
63
 
@@ -74,7 +73,7 @@ module.exports = {
74
73
  };
75
74
 
76
75
  if (!role) {
77
- const defaultRole = await strapi
76
+ const defaultRole = await strapi.db
78
77
  .query('plugin::users-permissions.role')
79
78
  .findOne({ where: { type: advanced.default_role } });
80
79
 
@@ -115,7 +114,7 @@ module.exports = {
115
114
  }
116
115
 
117
116
  if (_.has(ctx.request.body, 'username')) {
118
- const userWithSameUsername = await strapi
117
+ const userWithSameUsername = await strapi.db
119
118
  .query('plugin::users-permissions.user')
120
119
  .findOne({ where: { username } });
121
120
 
@@ -125,7 +124,7 @@ module.exports = {
125
124
  }
126
125
 
127
126
  if (_.has(ctx.request.body, 'email') && advancedConfigs.unique_email) {
128
- const userWithSameEmail = await strapi
127
+ const userWithSameEmail = await strapi.db
129
128
  .query('plugin::users-permissions.user')
130
129
  .findOne({ where: { email: email.toLowerCase() } });
131
130
 
@@ -7,11 +7,27 @@ const callbackSchema = yup.object({
7
7
  password: yup.string().required(),
8
8
  });
9
9
 
10
- const registerSchema = yup.object({
11
- email: yup.string().email().required(),
12
- username: yup.string().required(),
13
- password: yup.string().required(),
14
- });
10
+ const createRegisterSchema = (config) =>
11
+ yup.object({
12
+ email: yup.string().email().required(),
13
+ username: yup.string().required(),
14
+ password: yup
15
+ .string()
16
+ .required()
17
+ .test(async function (value) {
18
+ if (typeof config?.validatePassword === 'function') {
19
+ try {
20
+ const isValid = await config.validatePassword(value);
21
+ if (!isValid) {
22
+ return this.createError({ message: 'Password validation failed.' });
23
+ }
24
+ } catch (error) {
25
+ return this.createError({ message: error.message || 'An error occurred.' });
26
+ }
27
+ }
28
+ return true;
29
+ }),
30
+ });
15
31
 
16
32
  const sendEmailConfirmationSchema = yup.object({
17
33
  email: yup.string().email().required(),
@@ -27,31 +43,71 @@ const forgotPasswordSchema = yup
27
43
  })
28
44
  .noUnknown();
29
45
 
30
- const resetPasswordSchema = yup
31
- .object({
32
- password: yup.string().required(),
33
- passwordConfirmation: yup.string().required(),
34
- code: yup.string().required(),
35
- })
36
- .noUnknown();
46
+ const createResetPasswordSchema = (config) =>
47
+ yup
48
+ .object({
49
+ password: yup
50
+ .string()
51
+ .required()
52
+ .test(async function (value) {
53
+ if (typeof config?.validatePassword === 'function') {
54
+ try {
55
+ const isValid = await config.validatePassword(value);
56
+ if (!isValid) {
57
+ return this.createError({ message: 'Password validation failed.' });
58
+ }
59
+ } catch (error) {
60
+ return this.createError({ message: error.message || 'An error occurred.' });
61
+ }
62
+ }
63
+ return true;
64
+ }),
37
65
 
38
- const changePasswordSchema = yup
39
- .object({
40
- password: yup.string().required(),
41
- passwordConfirmation: yup
42
- .string()
43
- .required()
44
- .oneOf([yup.ref('password')], 'Passwords do not match'),
45
- currentPassword: yup.string().required(),
46
- })
47
- .noUnknown();
66
+ passwordConfirmation: yup
67
+ .string()
68
+ .required()
69
+ .oneOf([yup.ref('password')], 'Passwords do not match'),
70
+
71
+ code: yup.string().required(),
72
+ })
73
+ .noUnknown();
74
+
75
+ const createChangePasswordSchema = (config) =>
76
+ yup
77
+ .object({
78
+ password: yup
79
+ .string()
80
+ .required()
81
+ .test(async function (value) {
82
+ if (typeof config?.validatePassword === 'function') {
83
+ try {
84
+ const isValid = await config.validatePassword(value);
85
+ if (!isValid) {
86
+ return this.createError({ message: 'Password validation failed.' });
87
+ }
88
+ } catch (error) {
89
+ return this.createError({ message: error.message || 'An error occurred.' });
90
+ }
91
+ }
92
+ return true;
93
+ }),
94
+ passwordConfirmation: yup
95
+ .string()
96
+ .required()
97
+ .oneOf([yup.ref('password')], 'Passwords do not match'),
98
+ currentPassword: yup.string().required(),
99
+ })
100
+ .noUnknown();
48
101
 
49
102
  module.exports = {
50
103
  validateCallbackBody: validateYupSchema(callbackSchema),
51
- validateRegisterBody: validateYupSchema(registerSchema),
104
+ validateRegisterBody: (payload, config) =>
105
+ validateYupSchema(createRegisterSchema(config))(payload),
52
106
  validateSendEmailConfirmationBody: validateYupSchema(sendEmailConfirmationSchema),
53
107
  validateEmailConfirmationBody: validateYupSchema(validateEmailConfirmationSchema),
54
108
  validateForgotPasswordBody: validateYupSchema(forgotPasswordSchema),
55
- validateResetPasswordBody: validateYupSchema(resetPasswordSchema),
56
- validateChangePasswordBody: validateYupSchema(changePasswordSchema),
109
+ validateResetPasswordBody: (payload, config) =>
110
+ validateYupSchema(createResetPasswordSchema(config))(payload),
111
+ validateChangePasswordBody: (payload, config) =>
112
+ validateYupSchema(createChangePasswordSchema(config))(payload),
57
113
  };
@@ -10,6 +10,7 @@ const typesFactories = [
10
10
  require('./create-role-payload'),
11
11
  require('./update-role-payload'),
12
12
  require('./delete-role-payload'),
13
+ require('./user-input'),
13
14
  ];
14
15
 
15
16
  /**
@@ -6,6 +6,7 @@ module.exports = ({ nexus }) => {
6
6
 
7
7
  definition(t) {
8
8
  t.nonNull.id('id');
9
+ t.nonNull.id('documentId');
9
10
  t.nonNull.string('username');
10
11
  t.string('email');
11
12
  t.boolean('confirmed');
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ const usersPermissionsUserUID = 'plugin::users-permissions.user';
4
+
5
+ module.exports = ({ nexus, strapi }) => {
6
+ const { getContentTypeInputName } = strapi.plugin('graphql').service('utils').naming;
7
+
8
+ const userContentType = strapi.getModel(usersPermissionsUserUID);
9
+ const userInputName = getContentTypeInputName(userContentType);
10
+
11
+ return nexus.extendInputType({
12
+ type: userInputName,
13
+
14
+ definition(t) {
15
+ // Manually add the private password field back to the data
16
+ // input type as it is used for CRUD operations on users
17
+ t.string('password');
18
+ },
19
+ });
20
+ };
@@ -9,7 +9,7 @@ const { RateLimitError } = utils.errors;
9
9
  module.exports =
10
10
  (config, { strapi }) =>
11
11
  async (ctx, next) => {
12
- let rateLimitConfig = strapi.config.get('plugin.users-permissions.ratelimit');
12
+ let rateLimitConfig = strapi.config.get('plugin::users-permissions.ratelimit');
13
13
 
14
14
  if (!rateLimitConfig) {
15
15
  rateLimitConfig = {
@@ -7,7 +7,7 @@ const authStrategy = require('./strategies/users-permissions');
7
7
  const sanitizers = require('./utils/sanitize/sanitizers');
8
8
 
9
9
  module.exports = ({ strapi }) => {
10
- strapi.container.get('auth').register('content-api', authStrategy);
10
+ strapi.get('auth').register('content-api', authStrategy);
11
11
  strapi.sanitizers.add('content-api.output', sanitizers.defaultSanitizeOutput);
12
12
 
13
13
  if (strapi.plugin('graphql')) {
@@ -29,10 +29,10 @@ module.exports = ({ strapi }) => ({
29
29
  },
30
30
 
31
31
  issue(payload, jwtOptions = {}) {
32
- _.defaults(jwtOptions, strapi.config.get('plugin.users-permissions.jwt'));
32
+ _.defaults(jwtOptions, strapi.config.get('plugin::users-permissions.jwt'));
33
33
  return jwt.sign(
34
34
  _.clone(payload.toJSON ? payload.toJSON() : payload),
35
- strapi.config.get('plugin.users-permissions.jwtSecret'),
35
+ strapi.config.get('plugin::users-permissions.jwtSecret'),
36
36
  jwtOptions
37
37
  );
38
38
  },
@@ -41,7 +41,7 @@ module.exports = ({ strapi }) => ({
41
41
  return new Promise((resolve, reject) => {
42
42
  jwt.verify(
43
43
  token,
44
- strapi.config.get('plugin.users-permissions.jwtSecret'),
44
+ strapi.config.get('plugin::users-permissions.jwtSecret'),
45
45
  {},
46
46
  (err, tokenPayload = {}) => {
47
47
  if (err) {
@@ -11,11 +11,7 @@ module.exports = ({ strapi }) => ({
11
11
  * @return {object[]}
12
12
  */
13
13
  async findRolePermissions(roleID) {
14
- return strapi.entityService.load(
15
- 'plugin::users-permissions.role',
16
- { id: roleID },
17
- 'permissions'
18
- );
14
+ return strapi.db.query('plugin::users-permissions.role').load({ id: roleID }, 'permissions');
19
15
  },
20
16
 
21
17
  /**
@@ -24,8 +20,8 @@ module.exports = ({ strapi }) => ({
24
20
  * @return {object[]}
25
21
  */
26
22
  async findPublicPermissions() {
27
- return strapi.entityService.findMany('plugin::users-permissions.permission', {
28
- filters: PUBLIC_ROLE_FILTER,
23
+ return strapi.db.query('plugin::users-permissions.permission').findMany({
24
+ where: PUBLIC_ROLE_FILTER,
29
25
  });
30
26
  },
31
27