@strapi/plugin-users-permissions 5.8.1 → 5.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/.eslintignore +2 -1
  2. package/admin/src/components/BoundRoute/index.jsx +1 -1
  3. package/admin/src/components/FormModal/Input/index.jsx +1 -1
  4. package/admin/src/components/FormModal/index.jsx +1 -1
  5. package/admin/src/components/Policies/index.jsx +1 -1
  6. package/admin/src/index.js +2 -2
  7. package/admin/src/pages/AdvancedSettings/index.jsx +1 -1
  8. package/admin/src/pages/EmailTemplates/components/EmailForm.jsx +1 -1
  9. package/admin/src/pages/EmailTemplates/components/EmailTable.jsx +1 -1
  10. package/admin/src/pages/Roles/index.jsx +1 -1
  11. package/admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx +1 -1
  12. package/admin/src/pluginId.js +2 -2
  13. package/dist/admin/chunks/ar-BJwjobLp.js +45 -0
  14. package/dist/admin/chunks/ar-BJwjobLp.js.map +1 -0
  15. package/dist/admin/chunks/ar-G6bUGuUb.mjs +43 -0
  16. package/dist/admin/chunks/ar-G6bUGuUb.mjs.map +1 -0
  17. package/dist/admin/chunks/cs-Bu59JqhG.mjs +49 -0
  18. package/dist/admin/chunks/cs-Bu59JqhG.mjs.map +1 -0
  19. package/dist/admin/chunks/cs-uS_SIEo8.js +51 -0
  20. package/dist/admin/chunks/cs-uS_SIEo8.js.map +1 -0
  21. package/dist/admin/chunks/de-7MVMrqqI.js +63 -0
  22. package/dist/admin/chunks/de-7MVMrqqI.js.map +1 -0
  23. package/dist/admin/chunks/de-B81A69_5.mjs +61 -0
  24. package/dist/admin/chunks/de-B81A69_5.mjs.map +1 -0
  25. package/dist/admin/chunks/dk-BaelzvBE.mjs +85 -0
  26. package/dist/admin/chunks/dk-BaelzvBE.mjs.map +1 -0
  27. package/dist/admin/chunks/dk-DwCLGmy9.js +87 -0
  28. package/dist/admin/chunks/dk-DwCLGmy9.js.map +1 -0
  29. package/dist/admin/chunks/en-BhgCBe7M.mjs +85 -0
  30. package/dist/admin/chunks/en-BhgCBe7M.mjs.map +1 -0
  31. package/dist/admin/chunks/en-DwQjkHi_.js +87 -0
  32. package/dist/admin/chunks/en-DwQjkHi_.js.map +1 -0
  33. package/dist/admin/chunks/es-B0wXmvRj.mjs +85 -0
  34. package/dist/admin/chunks/es-B0wXmvRj.mjs.map +1 -0
  35. package/dist/admin/chunks/es-BOJOedG5.js +87 -0
  36. package/dist/admin/chunks/es-BOJOedG5.js.map +1 -0
  37. package/dist/admin/chunks/fr-BDNWCNs0.js +51 -0
  38. package/dist/admin/chunks/fr-BDNWCNs0.js.map +1 -0
  39. package/dist/admin/chunks/fr-CGYvGUXg.mjs +49 -0
  40. package/dist/admin/chunks/fr-CGYvGUXg.mjs.map +1 -0
  41. package/dist/admin/chunks/id-CNzbwFjA.mjs +61 -0
  42. package/dist/admin/chunks/id-CNzbwFjA.mjs.map +1 -0
  43. package/dist/admin/chunks/id-UqUPykHZ.js +63 -0
  44. package/dist/admin/chunks/id-UqUPykHZ.js.map +1 -0
  45. package/dist/admin/chunks/index-B-Z_z_qb.mjs +213 -0
  46. package/dist/admin/chunks/index-B-Z_z_qb.mjs.map +1 -0
  47. package/dist/admin/chunks/index-B2MJiSOD.mjs +279 -0
  48. package/dist/admin/chunks/index-B2MJiSOD.mjs.map +1 -0
  49. package/dist/admin/chunks/index-BPiDUOGt.js +471 -0
  50. package/dist/admin/chunks/index-BPiDUOGt.js.map +1 -0
  51. package/dist/admin/chunks/index-BtYUb_br.js +741 -0
  52. package/dist/admin/chunks/index-BtYUb_br.js.map +1 -0
  53. package/dist/admin/chunks/index-COXjHxFm.mjs +718 -0
  54. package/dist/admin/chunks/index-COXjHxFm.mjs.map +1 -0
  55. package/dist/admin/chunks/index-CkYplz_3.js +301 -0
  56. package/dist/admin/chunks/index-CkYplz_3.js.map +1 -0
  57. package/dist/admin/chunks/index-Cu2GvTiT.mjs +1516 -0
  58. package/dist/admin/chunks/index-Cu2GvTiT.mjs.map +1 -0
  59. package/dist/admin/chunks/index-D01zzG9y.js +1537 -0
  60. package/dist/admin/chunks/index-D01zzG9y.js.map +1 -0
  61. package/dist/admin/chunks/index-DAclA-0k.js +217 -0
  62. package/dist/admin/chunks/index-DAclA-0k.js.map +1 -0
  63. package/dist/admin/chunks/index-DVNIct2-.mjs +448 -0
  64. package/dist/admin/chunks/index-DVNIct2-.mjs.map +1 -0
  65. package/dist/admin/chunks/it-B2H2foTf.mjs +61 -0
  66. package/dist/admin/chunks/it-B2H2foTf.mjs.map +1 -0
  67. package/dist/admin/chunks/it-D5VuyoLU.js +63 -0
  68. package/dist/admin/chunks/it-D5VuyoLU.js.map +1 -0
  69. package/dist/admin/chunks/ja-C0z9d7L9.mjs +47 -0
  70. package/dist/admin/chunks/ja-C0z9d7L9.mjs.map +1 -0
  71. package/dist/admin/chunks/ja-MpqVsCgs.js +49 -0
  72. package/dist/admin/chunks/ja-MpqVsCgs.js.map +1 -0
  73. package/dist/admin/chunks/ko-Bm-grPSc.js +87 -0
  74. package/dist/admin/chunks/ko-Bm-grPSc.js.map +1 -0
  75. package/dist/admin/chunks/ko-CzUgzpeS.mjs +85 -0
  76. package/dist/admin/chunks/ko-CzUgzpeS.mjs.map +1 -0
  77. package/dist/admin/chunks/ms-CCacxjim.mjs +48 -0
  78. package/dist/admin/chunks/ms-CCacxjim.mjs.map +1 -0
  79. package/dist/admin/chunks/ms-D7eyBD5H.js +50 -0
  80. package/dist/admin/chunks/ms-D7eyBD5H.js.map +1 -0
  81. package/dist/admin/chunks/nl-BIOwAQtI.js +49 -0
  82. package/dist/admin/chunks/nl-BIOwAQtI.js.map +1 -0
  83. package/dist/admin/chunks/nl-DDC3nZW-.mjs +47 -0
  84. package/dist/admin/chunks/nl-DDC3nZW-.mjs.map +1 -0
  85. package/dist/admin/chunks/pl-D5BeNrg_.js +87 -0
  86. package/dist/admin/chunks/pl-D5BeNrg_.js.map +1 -0
  87. package/dist/admin/chunks/pl-XkS463rN.mjs +85 -0
  88. package/dist/admin/chunks/pl-XkS463rN.mjs.map +1 -0
  89. package/dist/admin/chunks/pt-BR-8cC7z8Km.mjs +43 -0
  90. package/dist/admin/chunks/pt-BR-8cC7z8Km.mjs.map +1 -0
  91. package/dist/admin/chunks/pt-BR-DxPBzQGx.js +45 -0
  92. package/dist/admin/chunks/pt-BR-DxPBzQGx.js.map +1 -0
  93. package/dist/admin/chunks/pt-DQpEvio8.mjs +47 -0
  94. package/dist/admin/chunks/pt-DQpEvio8.mjs.map +1 -0
  95. package/dist/admin/chunks/pt-kkCwzNvH.js +49 -0
  96. package/dist/admin/chunks/pt-kkCwzNvH.js.map +1 -0
  97. package/dist/admin/chunks/ru-BQ0gHmp3.js +87 -0
  98. package/dist/admin/chunks/ru-BQ0gHmp3.js.map +1 -0
  99. package/dist/admin/chunks/ru-nzL_7Mhg.mjs +85 -0
  100. package/dist/admin/chunks/ru-nzL_7Mhg.mjs.map +1 -0
  101. package/dist/admin/chunks/sk-Ddxc_tZA.mjs +49 -0
  102. package/dist/admin/chunks/sk-Ddxc_tZA.mjs.map +1 -0
  103. package/dist/admin/chunks/sk-nVwAPdYC.js +51 -0
  104. package/dist/admin/chunks/sk-nVwAPdYC.js.map +1 -0
  105. package/dist/admin/chunks/sv-BDfk2A-F.js +87 -0
  106. package/dist/admin/chunks/sv-BDfk2A-F.js.map +1 -0
  107. package/dist/admin/chunks/sv-By3RYpMG.mjs +85 -0
  108. package/dist/admin/chunks/sv-By3RYpMG.mjs.map +1 -0
  109. package/dist/admin/chunks/th-BtTtpHe2.js +61 -0
  110. package/dist/admin/chunks/th-BtTtpHe2.js.map +1 -0
  111. package/dist/admin/chunks/th-COl50vqb.mjs +59 -0
  112. package/dist/admin/chunks/th-COl50vqb.mjs.map +1 -0
  113. package/dist/admin/chunks/tr-80SJU6jg.mjs +84 -0
  114. package/dist/admin/chunks/tr-80SJU6jg.mjs.map +1 -0
  115. package/dist/admin/chunks/tr-Di-Nf7cT.js +86 -0
  116. package/dist/admin/chunks/tr-Di-Nf7cT.js.map +1 -0
  117. package/dist/admin/chunks/uk-CggQOx1l.js +50 -0
  118. package/dist/admin/chunks/uk-CggQOx1l.js.map +1 -0
  119. package/dist/admin/chunks/uk-D8JHuzch.mjs +48 -0
  120. package/dist/admin/chunks/uk-D8JHuzch.mjs.map +1 -0
  121. package/dist/admin/chunks/vi-69AF03Iv.mjs +49 -0
  122. package/dist/admin/chunks/vi-69AF03Iv.mjs.map +1 -0
  123. package/dist/admin/chunks/vi-D9cCsHsU.js +51 -0
  124. package/dist/admin/chunks/vi-D9cCsHsU.js.map +1 -0
  125. package/dist/admin/chunks/zh-BzSkqxo-.mjs +85 -0
  126. package/dist/admin/chunks/zh-BzSkqxo-.mjs.map +1 -0
  127. package/dist/admin/chunks/zh-BzWgJEzz.js +87 -0
  128. package/dist/admin/chunks/zh-BzWgJEzz.js.map +1 -0
  129. package/dist/admin/chunks/zh-Hans-CKqQbpsM.js +87 -0
  130. package/dist/admin/chunks/zh-Hans-CKqQbpsM.js.map +1 -0
  131. package/dist/admin/chunks/zh-Hans-DmDcSsp7.mjs +85 -0
  132. package/dist/admin/chunks/zh-Hans-DmDcSsp7.mjs.map +1 -0
  133. package/dist/admin/index.js +6 -2
  134. package/dist/admin/index.js.map +1 -1
  135. package/dist/admin/index.mjs +1 -4
  136. package/dist/admin/index.mjs.map +1 -1
  137. package/dist/server/index.js +4739 -0
  138. package/dist/server/index.js.map +1 -0
  139. package/dist/server/index.mjs +4737 -0
  140. package/dist/server/index.mjs.map +1 -0
  141. package/package.json +12 -11
  142. package/rollup.config.mjs +52 -0
  143. package/server/controllers/auth.js +1 -1
  144. package/server/register.js +1 -1
  145. package/dist/_chunks/ar-BguGUqwK.js +0 -44
  146. package/dist/_chunks/ar-BguGUqwK.js.map +0 -1
  147. package/dist/_chunks/ar-CK8BRRXB.mjs +0 -44
  148. package/dist/_chunks/ar-CK8BRRXB.mjs.map +0 -1
  149. package/dist/_chunks/cs-BVigMk0l.mjs +0 -50
  150. package/dist/_chunks/cs-BVigMk0l.mjs.map +0 -1
  151. package/dist/_chunks/cs-BW8-K_GY.js +0 -50
  152. package/dist/_chunks/cs-BW8-K_GY.js.map +0 -1
  153. package/dist/_chunks/de-BKUdRFI4.mjs +0 -62
  154. package/dist/_chunks/de-BKUdRFI4.mjs.map +0 -1
  155. package/dist/_chunks/de-owXpVluI.js +0 -62
  156. package/dist/_chunks/de-owXpVluI.js.map +0 -1
  157. package/dist/_chunks/dk-BQiTK50l.mjs +0 -86
  158. package/dist/_chunks/dk-BQiTK50l.mjs.map +0 -1
  159. package/dist/_chunks/dk-LXAnbuBk.js +0 -86
  160. package/dist/_chunks/dk-LXAnbuBk.js.map +0 -1
  161. package/dist/_chunks/en-DOHtPf-2.mjs +0 -86
  162. package/dist/_chunks/en-DOHtPf-2.mjs.map +0 -1
  163. package/dist/_chunks/en-MHo5mcsU.js +0 -86
  164. package/dist/_chunks/en-MHo5mcsU.js.map +0 -1
  165. package/dist/_chunks/es-BwLCLXAQ.js +0 -86
  166. package/dist/_chunks/es-BwLCLXAQ.js.map +0 -1
  167. package/dist/_chunks/es-DNgOVMjD.mjs +0 -86
  168. package/dist/_chunks/es-DNgOVMjD.mjs.map +0 -1
  169. package/dist/_chunks/fr-DkgRugiU.mjs +0 -50
  170. package/dist/_chunks/fr-DkgRugiU.mjs.map +0 -1
  171. package/dist/_chunks/fr-DkhpSjjm.js +0 -50
  172. package/dist/_chunks/fr-DkhpSjjm.js.map +0 -1
  173. package/dist/_chunks/id-BTemOeTZ.js +0 -62
  174. package/dist/_chunks/id-BTemOeTZ.js.map +0 -1
  175. package/dist/_chunks/id-BdEsvnaF.mjs +0 -62
  176. package/dist/_chunks/id-BdEsvnaF.mjs.map +0 -1
  177. package/dist/_chunks/index-BTHHxmwk.js +0 -1171
  178. package/dist/_chunks/index-BTHHxmwk.js.map +0 -1
  179. package/dist/_chunks/index-BofAESft.mjs +0 -344
  180. package/dist/_chunks/index-BofAESft.mjs.map +0 -1
  181. package/dist/_chunks/index-C7gxFU5j.mjs +0 -1142
  182. package/dist/_chunks/index-C7gxFU5j.mjs.map +0 -1
  183. package/dist/_chunks/index-CbjVCXNg.js +0 -280
  184. package/dist/_chunks/index-CbjVCXNg.js.map +0 -1
  185. package/dist/_chunks/index-D9po3ROT.mjs +0 -253
  186. package/dist/_chunks/index-D9po3ROT.mjs.map +0 -1
  187. package/dist/_chunks/index-DoNaXvrg-C5aV1Jb8.js +0 -11116
  188. package/dist/_chunks/index-DoNaXvrg-C5aV1Jb8.js.map +0 -1
  189. package/dist/_chunks/index-DoNaXvrg-Cmh4INWh.mjs +0 -11093
  190. package/dist/_chunks/index-DoNaXvrg-Cmh4INWh.mjs.map +0 -1
  191. package/dist/_chunks/index-QG0i5P9s.js +0 -365
  192. package/dist/_chunks/index-QG0i5P9s.js.map +0 -1
  193. package/dist/_chunks/index-SFaVaUin.mjs +0 -617
  194. package/dist/_chunks/index-SFaVaUin.mjs.map +0 -1
  195. package/dist/_chunks/index-bRFDK-8h.js +0 -639
  196. package/dist/_chunks/index-bRFDK-8h.js.map +0 -1
  197. package/dist/_chunks/index-ff4qC8sY.mjs +0 -262
  198. package/dist/_chunks/index-ff4qC8sY.mjs.map +0 -1
  199. package/dist/_chunks/index-hEmhAD3A.js +0 -252
  200. package/dist/_chunks/index-hEmhAD3A.js.map +0 -1
  201. package/dist/_chunks/it-B-rv0E24.mjs +0 -62
  202. package/dist/_chunks/it-B-rv0E24.mjs.map +0 -1
  203. package/dist/_chunks/it-D1rH6V6_.js +0 -62
  204. package/dist/_chunks/it-D1rH6V6_.js.map +0 -1
  205. package/dist/_chunks/ja-C8K-VBPD.mjs +0 -48
  206. package/dist/_chunks/ja-C8K-VBPD.mjs.map +0 -1
  207. package/dist/_chunks/ja-DqShgTMf.js +0 -48
  208. package/dist/_chunks/ja-DqShgTMf.js.map +0 -1
  209. package/dist/_chunks/ko-B9DGEPWH.js +0 -86
  210. package/dist/_chunks/ko-B9DGEPWH.js.map +0 -1
  211. package/dist/_chunks/ko-Busb0wIY.mjs +0 -86
  212. package/dist/_chunks/ko-Busb0wIY.mjs.map +0 -1
  213. package/dist/_chunks/ms-ByvsQjRt.mjs +0 -49
  214. package/dist/_chunks/ms-ByvsQjRt.mjs.map +0 -1
  215. package/dist/_chunks/ms-CPBU3LWf.js +0 -49
  216. package/dist/_chunks/ms-CPBU3LWf.js.map +0 -1
  217. package/dist/_chunks/nl-5qO8Rpcy.mjs +0 -48
  218. package/dist/_chunks/nl-5qO8Rpcy.mjs.map +0 -1
  219. package/dist/_chunks/nl-CwNB6YoO.js +0 -48
  220. package/dist/_chunks/nl-CwNB6YoO.js.map +0 -1
  221. package/dist/_chunks/pl-BdIzifBE.mjs +0 -86
  222. package/dist/_chunks/pl-BdIzifBE.mjs.map +0 -1
  223. package/dist/_chunks/pl-Do9UD69f.js +0 -86
  224. package/dist/_chunks/pl-Do9UD69f.js.map +0 -1
  225. package/dist/_chunks/pt-BIO24ioG.mjs +0 -48
  226. package/dist/_chunks/pt-BIO24ioG.mjs.map +0 -1
  227. package/dist/_chunks/pt-BR-D7dZhxuP.js +0 -44
  228. package/dist/_chunks/pt-BR-D7dZhxuP.js.map +0 -1
  229. package/dist/_chunks/pt-BR-f0p23AQZ.mjs +0 -44
  230. package/dist/_chunks/pt-BR-f0p23AQZ.mjs.map +0 -1
  231. package/dist/_chunks/pt-fdvyOnUp.js +0 -48
  232. package/dist/_chunks/pt-fdvyOnUp.js.map +0 -1
  233. package/dist/_chunks/ru-C94rjPGA.js +0 -86
  234. package/dist/_chunks/ru-C94rjPGA.js.map +0 -1
  235. package/dist/_chunks/ru-VWy-IB7K.mjs +0 -86
  236. package/dist/_chunks/ru-VWy-IB7K.mjs.map +0 -1
  237. package/dist/_chunks/sk-BABEhykl.js +0 -50
  238. package/dist/_chunks/sk-BABEhykl.js.map +0 -1
  239. package/dist/_chunks/sk-B_LIcepm.mjs +0 -50
  240. package/dist/_chunks/sk-B_LIcepm.mjs.map +0 -1
  241. package/dist/_chunks/sv-ABLKOokl.mjs +0 -86
  242. package/dist/_chunks/sv-ABLKOokl.mjs.map +0 -1
  243. package/dist/_chunks/sv-Be43LhA9.js +0 -86
  244. package/dist/_chunks/sv-Be43LhA9.js.map +0 -1
  245. package/dist/_chunks/th-DKyP7ueR.mjs +0 -60
  246. package/dist/_chunks/th-DKyP7ueR.mjs.map +0 -1
  247. package/dist/_chunks/th-DgVhVLhL.js +0 -60
  248. package/dist/_chunks/th-DgVhVLhL.js.map +0 -1
  249. package/dist/_chunks/tr-B_idhkEs.js +0 -85
  250. package/dist/_chunks/tr-B_idhkEs.js.map +0 -1
  251. package/dist/_chunks/tr-qa1Q5UjC.mjs +0 -85
  252. package/dist/_chunks/tr-qa1Q5UjC.mjs.map +0 -1
  253. package/dist/_chunks/uk-BmRqbeQc.mjs +0 -49
  254. package/dist/_chunks/uk-BmRqbeQc.mjs.map +0 -1
  255. package/dist/_chunks/uk-LHOivnhP.js +0 -49
  256. package/dist/_chunks/uk-LHOivnhP.js.map +0 -1
  257. package/dist/_chunks/vi-CdVRdKDw.js +0 -50
  258. package/dist/_chunks/vi-CdVRdKDw.js.map +0 -1
  259. package/dist/_chunks/vi-HW-EdMea.mjs +0 -50
  260. package/dist/_chunks/vi-HW-EdMea.mjs.map +0 -1
  261. package/dist/_chunks/zh-5hKkVPA4.mjs +0 -86
  262. package/dist/_chunks/zh-5hKkVPA4.mjs.map +0 -1
  263. package/dist/_chunks/zh-Cuq8gMnF.js +0 -86
  264. package/dist/_chunks/zh-Cuq8gMnF.js.map +0 -1
  265. package/dist/_chunks/zh-Hans-BHilK-yc.mjs +0 -86
  266. package/dist/_chunks/zh-Hans-BHilK-yc.mjs.map +0 -1
  267. package/dist/_chunks/zh-Hans-GQDMKtY4.js +0 -86
  268. package/dist/_chunks/zh-Hans-GQDMKtY4.js.map +0 -1
  269. package/packup.config.ts +0 -22
@@ -0,0 +1,4737 @@
1
+ import require$$0$1 from 'fs';
2
+ import require$$1$1 from 'path';
3
+ import require$$0 from 'lodash/fp';
4
+ import require$$1 from '@strapi/utils';
5
+ import require$$0$2 from 'crypto';
6
+ import require$$0$3 from 'lodash';
7
+ import require$$3 from 'koa2-ratelimit';
8
+ import require$$1$2 from 'jsonwebtoken';
9
+ import require$$2 from 'url-join';
10
+ import require$$1$3 from 'bcryptjs';
11
+ import require$$0$4 from 'assert';
12
+ import require$$3$1 from 'jwk-to-pem';
13
+ import require$$4 from 'purest';
14
+ import require$$6 from 'grant';
15
+
16
+ function getDefaultExportFromCjs (x) {
17
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
18
+ }
19
+
20
+ var removeUserRelationFromRoleEntities;
21
+ var hasRequiredRemoveUserRelationFromRoleEntities;
22
+ function requireRemoveUserRelationFromRoleEntities() {
23
+ if (hasRequiredRemoveUserRelationFromRoleEntities) return removeUserRelationFromRoleEntities;
24
+ hasRequiredRemoveUserRelationFromRoleEntities = 1;
25
+ removeUserRelationFromRoleEntities = ({ schema, key, attribute }, { remove })=>{
26
+ if (attribute?.type === 'relation' && attribute?.target === 'plugin::users-permissions.user' && schema.uid === 'plugin::users-permissions.role') {
27
+ remove(key);
28
+ }
29
+ };
30
+ return removeUserRelationFromRoleEntities;
31
+ }
32
+
33
+ var visitors;
34
+ var hasRequiredVisitors;
35
+ function requireVisitors() {
36
+ if (hasRequiredVisitors) return visitors;
37
+ hasRequiredVisitors = 1;
38
+ visitors = {
39
+ removeUserRelationFromRoleEntities: requireRemoveUserRelationFromRoleEntities()
40
+ };
41
+ return visitors;
42
+ }
43
+
44
+ var sanitizers;
45
+ var hasRequiredSanitizers;
46
+ function requireSanitizers() {
47
+ if (hasRequiredSanitizers) return sanitizers;
48
+ hasRequiredSanitizers = 1;
49
+ const { curry } = require$$0;
50
+ const { traverseEntity, async } = require$$1;
51
+ const { removeUserRelationFromRoleEntities } = requireVisitors();
52
+ const sanitizeUserRelationFromRoleEntities = curry((schema, entity)=>{
53
+ return traverseEntity(removeUserRelationFromRoleEntities, {
54
+ schema,
55
+ getModel: strapi.getModel.bind(strapi)
56
+ }, entity);
57
+ });
58
+ const defaultSanitizeOutput = curry((schema, entity)=>{
59
+ return async.pipe(sanitizeUserRelationFromRoleEntities(schema))(entity);
60
+ });
61
+ sanitizers = {
62
+ sanitizeUserRelationFromRoleEntities,
63
+ defaultSanitizeOutput
64
+ };
65
+ return sanitizers;
66
+ }
67
+
68
+ var sanitize;
69
+ var hasRequiredSanitize;
70
+ function requireSanitize() {
71
+ if (hasRequiredSanitize) return sanitize;
72
+ hasRequiredSanitize = 1;
73
+ const visitors = requireVisitors();
74
+ const sanitizers = requireSanitizers();
75
+ sanitize = {
76
+ sanitizers,
77
+ visitors
78
+ };
79
+ return sanitize;
80
+ }
81
+
82
+ var utils$1;
83
+ var hasRequiredUtils$1;
84
+ function requireUtils$1() {
85
+ if (hasRequiredUtils$1) return utils$1;
86
+ hasRequiredUtils$1 = 1;
87
+ const sanitize = requireSanitize();
88
+ const getService = (name)=>{
89
+ return strapi.plugin('users-permissions').service(name);
90
+ };
91
+ utils$1 = {
92
+ getService,
93
+ sanitize
94
+ };
95
+ return utils$1;
96
+ }
97
+
98
+ var usersPermissions$1;
99
+ var hasRequiredUsersPermissions$1;
100
+ function requireUsersPermissions$1() {
101
+ if (hasRequiredUsersPermissions$1) return usersPermissions$1;
102
+ hasRequiredUsersPermissions$1 = 1;
103
+ const { castArray, map, every, pipe } = require$$0;
104
+ const { ForbiddenError, UnauthorizedError } = require$$1.errors;
105
+ const { getService } = requireUtils$1();
106
+ const getAdvancedSettings = ()=>{
107
+ return strapi.store({
108
+ type: 'plugin',
109
+ name: 'users-permissions'
110
+ }).get({
111
+ key: 'advanced'
112
+ });
113
+ };
114
+ const authenticate = async (ctx)=>{
115
+ try {
116
+ const token = await getService('jwt').getToken(ctx);
117
+ if (token) {
118
+ const { id } = token;
119
+ // Invalid token
120
+ if (id === undefined) {
121
+ return {
122
+ authenticated: false
123
+ };
124
+ }
125
+ const user = await getService('user').fetchAuthenticatedUser(id);
126
+ // No user associated to the token
127
+ if (!user) {
128
+ return {
129
+ error: 'Invalid credentials'
130
+ };
131
+ }
132
+ const advancedSettings = await getAdvancedSettings();
133
+ // User not confirmed
134
+ if (advancedSettings.email_confirmation && !user.confirmed) {
135
+ return {
136
+ error: 'Invalid credentials'
137
+ };
138
+ }
139
+ // User blocked
140
+ if (user.blocked) {
141
+ return {
142
+ error: 'Invalid credentials'
143
+ };
144
+ }
145
+ // Fetch user's permissions
146
+ const permissions = await Promise.resolve(user.role.id).then(getService('permission').findRolePermissions).then(map(getService('permission').toContentAPIPermission));
147
+ // Generate an ability (content API engine) based on the given permissions
148
+ const ability = await strapi.contentAPI.permissions.engine.generateAbility(permissions);
149
+ ctx.state.user = user;
150
+ return {
151
+ authenticated: true,
152
+ credentials: user,
153
+ ability
154
+ };
155
+ }
156
+ const publicPermissions = await getService('permission').findPublicPermissions().then(map(getService('permission').toContentAPIPermission));
157
+ if (publicPermissions.length === 0) {
158
+ return {
159
+ authenticated: false
160
+ };
161
+ }
162
+ const ability = await strapi.contentAPI.permissions.engine.generateAbility(publicPermissions);
163
+ return {
164
+ authenticated: true,
165
+ credentials: null,
166
+ ability
167
+ };
168
+ } catch (err) {
169
+ return {
170
+ authenticated: false
171
+ };
172
+ }
173
+ };
174
+ const verify = async (auth, config)=>{
175
+ const { credentials: user, ability } = auth;
176
+ if (!config.scope) {
177
+ if (!user) {
178
+ // A non authenticated user cannot access routes that do not have a scope
179
+ throw new UnauthorizedError();
180
+ } else {
181
+ // An authenticated user can access non scoped routes
182
+ return;
183
+ }
184
+ }
185
+ // If no ability have been generated, then consider auth is missing
186
+ if (!ability) {
187
+ throw new UnauthorizedError();
188
+ }
189
+ const isAllowed = pipe(// Make sure we're dealing with an array
190
+ castArray, // Transform the scope array into an action array
191
+ every((scope)=>ability.can(scope)))(config.scope);
192
+ if (!isAllowed) {
193
+ throw new ForbiddenError();
194
+ }
195
+ };
196
+ usersPermissions$1 = {
197
+ name: 'users-permissions',
198
+ authenticate,
199
+ verify
200
+ };
201
+ return usersPermissions$1;
202
+ }
203
+
204
+ var me$1;
205
+ var hasRequiredMe$1;
206
+ function requireMe$1() {
207
+ if (hasRequiredMe$1) return me$1;
208
+ hasRequiredMe$1 = 1;
209
+ me$1 = ({ nexus })=>{
210
+ return nexus.objectType({
211
+ name: 'UsersPermissionsMe',
212
+ definition (t) {
213
+ t.nonNull.id('id');
214
+ t.nonNull.id('documentId');
215
+ t.nonNull.string('username');
216
+ t.string('email');
217
+ t.boolean('confirmed');
218
+ t.boolean('blocked');
219
+ t.field('role', {
220
+ type: 'UsersPermissionsMeRole'
221
+ });
222
+ }
223
+ });
224
+ };
225
+ return me$1;
226
+ }
227
+
228
+ var meRole;
229
+ var hasRequiredMeRole;
230
+ function requireMeRole() {
231
+ if (hasRequiredMeRole) return meRole;
232
+ hasRequiredMeRole = 1;
233
+ meRole = ({ nexus })=>{
234
+ return nexus.objectType({
235
+ name: 'UsersPermissionsMeRole',
236
+ definition (t) {
237
+ t.nonNull.id('id');
238
+ t.nonNull.string('name');
239
+ t.string('description');
240
+ t.string('type');
241
+ }
242
+ });
243
+ };
244
+ return meRole;
245
+ }
246
+
247
+ var registerInput;
248
+ var hasRequiredRegisterInput;
249
+ function requireRegisterInput() {
250
+ if (hasRequiredRegisterInput) return registerInput;
251
+ hasRequiredRegisterInput = 1;
252
+ registerInput = ({ nexus })=>{
253
+ return nexus.inputObjectType({
254
+ name: 'UsersPermissionsRegisterInput',
255
+ definition (t) {
256
+ t.nonNull.string('username');
257
+ t.nonNull.string('email');
258
+ t.nonNull.string('password');
259
+ }
260
+ });
261
+ };
262
+ return registerInput;
263
+ }
264
+
265
+ var loginInput;
266
+ var hasRequiredLoginInput;
267
+ function requireLoginInput() {
268
+ if (hasRequiredLoginInput) return loginInput;
269
+ hasRequiredLoginInput = 1;
270
+ loginInput = ({ nexus })=>{
271
+ return nexus.inputObjectType({
272
+ name: 'UsersPermissionsLoginInput',
273
+ definition (t) {
274
+ t.nonNull.string('identifier');
275
+ t.nonNull.string('password');
276
+ t.nonNull.string('provider', {
277
+ default: 'local'
278
+ });
279
+ }
280
+ });
281
+ };
282
+ return loginInput;
283
+ }
284
+
285
+ var passwordPayload;
286
+ var hasRequiredPasswordPayload;
287
+ function requirePasswordPayload() {
288
+ if (hasRequiredPasswordPayload) return passwordPayload;
289
+ hasRequiredPasswordPayload = 1;
290
+ passwordPayload = ({ nexus })=>{
291
+ return nexus.objectType({
292
+ name: 'UsersPermissionsPasswordPayload',
293
+ definition (t) {
294
+ t.nonNull.boolean('ok');
295
+ }
296
+ });
297
+ };
298
+ return passwordPayload;
299
+ }
300
+
301
+ var loginPayload;
302
+ var hasRequiredLoginPayload;
303
+ function requireLoginPayload() {
304
+ if (hasRequiredLoginPayload) return loginPayload;
305
+ hasRequiredLoginPayload = 1;
306
+ loginPayload = ({ nexus })=>{
307
+ return nexus.objectType({
308
+ name: 'UsersPermissionsLoginPayload',
309
+ definition (t) {
310
+ t.string('jwt');
311
+ t.nonNull.field('user', {
312
+ type: 'UsersPermissionsMe'
313
+ });
314
+ }
315
+ });
316
+ };
317
+ return loginPayload;
318
+ }
319
+
320
+ var createRolePayload;
321
+ var hasRequiredCreateRolePayload;
322
+ function requireCreateRolePayload() {
323
+ if (hasRequiredCreateRolePayload) return createRolePayload;
324
+ hasRequiredCreateRolePayload = 1;
325
+ createRolePayload = ({ nexus })=>{
326
+ return nexus.objectType({
327
+ name: 'UsersPermissionsCreateRolePayload',
328
+ definition (t) {
329
+ t.nonNull.boolean('ok');
330
+ }
331
+ });
332
+ };
333
+ return createRolePayload;
334
+ }
335
+
336
+ var updateRolePayload;
337
+ var hasRequiredUpdateRolePayload;
338
+ function requireUpdateRolePayload() {
339
+ if (hasRequiredUpdateRolePayload) return updateRolePayload;
340
+ hasRequiredUpdateRolePayload = 1;
341
+ updateRolePayload = ({ nexus })=>{
342
+ return nexus.objectType({
343
+ name: 'UsersPermissionsUpdateRolePayload',
344
+ definition (t) {
345
+ t.nonNull.boolean('ok');
346
+ }
347
+ });
348
+ };
349
+ return updateRolePayload;
350
+ }
351
+
352
+ var deleteRolePayload;
353
+ var hasRequiredDeleteRolePayload;
354
+ function requireDeleteRolePayload() {
355
+ if (hasRequiredDeleteRolePayload) return deleteRolePayload;
356
+ hasRequiredDeleteRolePayload = 1;
357
+ deleteRolePayload = ({ nexus })=>{
358
+ return nexus.objectType({
359
+ name: 'UsersPermissionsDeleteRolePayload',
360
+ definition (t) {
361
+ t.nonNull.boolean('ok');
362
+ }
363
+ });
364
+ };
365
+ return deleteRolePayload;
366
+ }
367
+
368
+ var userInput;
369
+ var hasRequiredUserInput;
370
+ function requireUserInput() {
371
+ if (hasRequiredUserInput) return userInput;
372
+ hasRequiredUserInput = 1;
373
+ const usersPermissionsUserUID = 'plugin::users-permissions.user';
374
+ userInput = ({ nexus, strapi })=>{
375
+ const { getContentTypeInputName } = strapi.plugin('graphql').service('utils').naming;
376
+ const userContentType = strapi.getModel(usersPermissionsUserUID);
377
+ const userInputName = getContentTypeInputName(userContentType);
378
+ return nexus.extendInputType({
379
+ type: userInputName,
380
+ definition (t) {
381
+ // Manually add the private password field back to the data
382
+ // input type as it is used for CRUD operations on users
383
+ t.string('password');
384
+ }
385
+ });
386
+ };
387
+ return userInput;
388
+ }
389
+
390
+ var types;
391
+ var hasRequiredTypes;
392
+ function requireTypes() {
393
+ if (hasRequiredTypes) return types;
394
+ hasRequiredTypes = 1;
395
+ const typesFactories = [
396
+ requireMe$1(),
397
+ requireMeRole(),
398
+ requireRegisterInput(),
399
+ requireLoginInput(),
400
+ requirePasswordPayload(),
401
+ requireLoginPayload(),
402
+ requireCreateRolePayload(),
403
+ requireUpdateRolePayload(),
404
+ requireDeleteRolePayload(),
405
+ requireUserInput()
406
+ ];
407
+ /**
408
+ * @param {object} context
409
+ * @param {object} context.nexus
410
+ * @param {object} context.strapi
411
+ * @return {any[]}
412
+ */ types = (context)=>typesFactories.map((factory)=>factory(context));
413
+ return types;
414
+ }
415
+
416
+ var me;
417
+ var hasRequiredMe;
418
+ function requireMe() {
419
+ if (hasRequiredMe) return me;
420
+ hasRequiredMe = 1;
421
+ me = ()=>({
422
+ type: 'UsersPermissionsMe',
423
+ args: {},
424
+ resolve (parent, args, context) {
425
+ const { user } = context.state;
426
+ if (!user) {
427
+ throw new Error('Authentication requested');
428
+ }
429
+ return user;
430
+ }
431
+ });
432
+ return me;
433
+ }
434
+
435
+ var queries;
436
+ var hasRequiredQueries;
437
+ function requireQueries() {
438
+ if (hasRequiredQueries) return queries;
439
+ hasRequiredQueries = 1;
440
+ const me = requireMe();
441
+ queries = ({ nexus })=>{
442
+ return nexus.extendType({
443
+ type: 'Query',
444
+ definition (t) {
445
+ t.field('me', me({
446
+ nexus
447
+ }));
448
+ }
449
+ });
450
+ };
451
+ return queries;
452
+ }
453
+
454
+ var createRole;
455
+ var hasRequiredCreateRole;
456
+ function requireCreateRole() {
457
+ if (hasRequiredCreateRole) return createRole;
458
+ hasRequiredCreateRole = 1;
459
+ const { toPlainObject } = require$$0;
460
+ const usersPermissionsRoleUID = 'plugin::users-permissions.role';
461
+ createRole = ({ nexus, strapi })=>{
462
+ const { getContentTypeInputName } = strapi.plugin('graphql').service('utils').naming;
463
+ const { nonNull } = nexus;
464
+ const roleContentType = strapi.getModel(usersPermissionsRoleUID);
465
+ const roleInputName = getContentTypeInputName(roleContentType);
466
+ return {
467
+ type: 'UsersPermissionsCreateRolePayload',
468
+ args: {
469
+ data: nonNull(roleInputName)
470
+ },
471
+ description: 'Create a new role',
472
+ async resolve (parent, args, context) {
473
+ const { koaContext } = context;
474
+ koaContext.request.body = toPlainObject(args.data);
475
+ await strapi.plugin('users-permissions').controller('role').createRole(koaContext);
476
+ return {
477
+ ok: true
478
+ };
479
+ }
480
+ };
481
+ };
482
+ return createRole;
483
+ }
484
+
485
+ var updateRole;
486
+ var hasRequiredUpdateRole;
487
+ function requireUpdateRole() {
488
+ if (hasRequiredUpdateRole) return updateRole;
489
+ hasRequiredUpdateRole = 1;
490
+ const usersPermissionsRoleUID = 'plugin::users-permissions.role';
491
+ updateRole = ({ nexus, strapi })=>{
492
+ const { getContentTypeInputName } = strapi.plugin('graphql').service('utils').naming;
493
+ const { nonNull } = nexus;
494
+ const roleContentType = strapi.getModel(usersPermissionsRoleUID);
495
+ const roleInputName = getContentTypeInputName(roleContentType);
496
+ return {
497
+ type: 'UsersPermissionsUpdateRolePayload',
498
+ args: {
499
+ id: nonNull('ID'),
500
+ data: nonNull(roleInputName)
501
+ },
502
+ description: 'Update an existing role',
503
+ async resolve (parent, args, context) {
504
+ const { koaContext } = context;
505
+ koaContext.params = {
506
+ role: args.id
507
+ };
508
+ koaContext.request.body = args.data;
509
+ koaContext.request.body.role = args.id;
510
+ await strapi.plugin('users-permissions').controller('role').updateRole(koaContext);
511
+ return {
512
+ ok: true
513
+ };
514
+ }
515
+ };
516
+ };
517
+ return updateRole;
518
+ }
519
+
520
+ var deleteRole;
521
+ var hasRequiredDeleteRole;
522
+ function requireDeleteRole() {
523
+ if (hasRequiredDeleteRole) return deleteRole;
524
+ hasRequiredDeleteRole = 1;
525
+ deleteRole = ({ nexus, strapi })=>{
526
+ const { nonNull } = nexus;
527
+ return {
528
+ type: 'UsersPermissionsDeleteRolePayload',
529
+ args: {
530
+ id: nonNull('ID')
531
+ },
532
+ description: 'Delete an existing role',
533
+ async resolve (parent, args, context) {
534
+ const { koaContext } = context;
535
+ koaContext.params = {
536
+ role: args.id
537
+ };
538
+ await strapi.plugin('users-permissions').controller('role').deleteRole(koaContext);
539
+ return {
540
+ ok: true
541
+ };
542
+ }
543
+ };
544
+ };
545
+ return deleteRole;
546
+ }
547
+
548
+ var utils;
549
+ var hasRequiredUtils;
550
+ function requireUtils() {
551
+ if (hasRequiredUtils) return utils;
552
+ hasRequiredUtils = 1;
553
+ const { getOr } = require$$0;
554
+ /**
555
+ * Throws an ApolloError if context body contains a bad request
556
+ * @param contextBody - body of the context object given to the resolver
557
+ * @throws ApolloError if the body is a bad request
558
+ */ function checkBadRequest(contextBody) {
559
+ const statusCode = getOr(200, 'statusCode', contextBody);
560
+ if (statusCode !== 200) {
561
+ const errorMessage = getOr('Bad Request', 'error', contextBody);
562
+ const exception = new Error(errorMessage);
563
+ exception.code = statusCode || 400;
564
+ exception.data = contextBody;
565
+ throw exception;
566
+ }
567
+ }
568
+ utils = {
569
+ checkBadRequest
570
+ };
571
+ return utils;
572
+ }
573
+
574
+ var createUser;
575
+ var hasRequiredCreateUser;
576
+ function requireCreateUser() {
577
+ if (hasRequiredCreateUser) return createUser;
578
+ hasRequiredCreateUser = 1;
579
+ const { toPlainObject } = require$$0;
580
+ const { checkBadRequest } = requireUtils();
581
+ const usersPermissionsUserUID = 'plugin::users-permissions.user';
582
+ createUser = ({ nexus, strapi })=>{
583
+ const { nonNull } = nexus;
584
+ const { getContentTypeInputName, getEntityResponseName } = strapi.plugin('graphql').service('utils').naming;
585
+ const userContentType = strapi.getModel(usersPermissionsUserUID);
586
+ const userInputName = getContentTypeInputName(userContentType);
587
+ const responseName = getEntityResponseName(userContentType);
588
+ return {
589
+ type: nonNull(responseName),
590
+ args: {
591
+ data: nonNull(userInputName)
592
+ },
593
+ description: 'Create a new user',
594
+ async resolve (parent, args, context) {
595
+ const { koaContext } = context;
596
+ koaContext.params = {};
597
+ koaContext.request.body = toPlainObject(args.data);
598
+ await strapi.plugin('users-permissions').controller('user').create(koaContext);
599
+ checkBadRequest(koaContext.body);
600
+ return {
601
+ value: koaContext.body,
602
+ info: {
603
+ args,
604
+ resourceUID: 'plugin::users-permissions.user'
605
+ }
606
+ };
607
+ }
608
+ };
609
+ };
610
+ return createUser;
611
+ }
612
+
613
+ var updateUser;
614
+ var hasRequiredUpdateUser;
615
+ function requireUpdateUser() {
616
+ if (hasRequiredUpdateUser) return updateUser;
617
+ hasRequiredUpdateUser = 1;
618
+ const { toPlainObject } = require$$0;
619
+ const { checkBadRequest } = requireUtils();
620
+ const usersPermissionsUserUID = 'plugin::users-permissions.user';
621
+ updateUser = ({ nexus, strapi })=>{
622
+ const { nonNull } = nexus;
623
+ const { getContentTypeInputName, getEntityResponseName } = strapi.plugin('graphql').service('utils').naming;
624
+ const userContentType = strapi.getModel(usersPermissionsUserUID);
625
+ const userInputName = getContentTypeInputName(userContentType);
626
+ const responseName = getEntityResponseName(userContentType);
627
+ return {
628
+ type: nonNull(responseName),
629
+ args: {
630
+ id: nonNull('ID'),
631
+ data: nonNull(userInputName)
632
+ },
633
+ description: 'Update an existing user',
634
+ async resolve (parent, args, context) {
635
+ const { koaContext } = context;
636
+ koaContext.params = {
637
+ id: args.id
638
+ };
639
+ koaContext.request.body = toPlainObject(args.data);
640
+ await strapi.plugin('users-permissions').controller('user').update(koaContext);
641
+ checkBadRequest(koaContext.body);
642
+ return {
643
+ value: koaContext.body,
644
+ info: {
645
+ args,
646
+ resourceUID: 'plugin::users-permissions.user'
647
+ }
648
+ };
649
+ }
650
+ };
651
+ };
652
+ return updateUser;
653
+ }
654
+
655
+ var deleteUser;
656
+ var hasRequiredDeleteUser;
657
+ function requireDeleteUser() {
658
+ if (hasRequiredDeleteUser) return deleteUser;
659
+ hasRequiredDeleteUser = 1;
660
+ const { checkBadRequest } = requireUtils();
661
+ const usersPermissionsUserUID = 'plugin::users-permissions.user';
662
+ deleteUser = ({ nexus, strapi })=>{
663
+ const { nonNull } = nexus;
664
+ const { getEntityResponseName } = strapi.plugin('graphql').service('utils').naming;
665
+ const userContentType = strapi.getModel(usersPermissionsUserUID);
666
+ const responseName = getEntityResponseName(userContentType);
667
+ return {
668
+ type: nonNull(responseName),
669
+ args: {
670
+ id: nonNull('ID')
671
+ },
672
+ description: 'Delete an existing user',
673
+ async resolve (parent, args, context) {
674
+ const { koaContext } = context;
675
+ koaContext.params = {
676
+ id: args.id
677
+ };
678
+ await strapi.plugin('users-permissions').controller('user').destroy(koaContext);
679
+ checkBadRequest(koaContext.body);
680
+ return {
681
+ value: koaContext.body,
682
+ info: {
683
+ args,
684
+ resourceUID: 'plugin::users-permissions.user'
685
+ }
686
+ };
687
+ }
688
+ };
689
+ };
690
+ return deleteUser;
691
+ }
692
+
693
+ var login;
694
+ var hasRequiredLogin;
695
+ function requireLogin() {
696
+ if (hasRequiredLogin) return login;
697
+ hasRequiredLogin = 1;
698
+ const { toPlainObject } = require$$0;
699
+ const { checkBadRequest } = requireUtils();
700
+ login = ({ nexus, strapi })=>{
701
+ const { nonNull } = nexus;
702
+ return {
703
+ type: nonNull('UsersPermissionsLoginPayload'),
704
+ args: {
705
+ input: nonNull('UsersPermissionsLoginInput')
706
+ },
707
+ async resolve (parent, args, context) {
708
+ const { koaContext } = context;
709
+ koaContext.params = {
710
+ provider: args.input.provider
711
+ };
712
+ koaContext.request.body = toPlainObject(args.input);
713
+ await strapi.plugin('users-permissions').controller('auth').callback(koaContext);
714
+ const output = koaContext.body;
715
+ checkBadRequest(output);
716
+ return {
717
+ user: output.user || output,
718
+ jwt: output.jwt
719
+ };
720
+ }
721
+ };
722
+ };
723
+ return login;
724
+ }
725
+
726
+ var register$1;
727
+ var hasRequiredRegister$1;
728
+ function requireRegister$1() {
729
+ if (hasRequiredRegister$1) return register$1;
730
+ hasRequiredRegister$1 = 1;
731
+ const { toPlainObject } = require$$0;
732
+ const { checkBadRequest } = requireUtils();
733
+ register$1 = ({ nexus, strapi })=>{
734
+ const { nonNull } = nexus;
735
+ return {
736
+ type: nonNull('UsersPermissionsLoginPayload'),
737
+ args: {
738
+ input: nonNull('UsersPermissionsRegisterInput')
739
+ },
740
+ description: 'Register a user',
741
+ async resolve (parent, args, context) {
742
+ const { koaContext } = context;
743
+ koaContext.request.body = toPlainObject(args.input);
744
+ await strapi.plugin('users-permissions').controller('auth').register(koaContext);
745
+ const output = koaContext.body;
746
+ checkBadRequest(output);
747
+ return {
748
+ user: output.user || output,
749
+ jwt: output.jwt
750
+ };
751
+ }
752
+ };
753
+ };
754
+ return register$1;
755
+ }
756
+
757
+ var forgotPassword;
758
+ var hasRequiredForgotPassword;
759
+ function requireForgotPassword() {
760
+ if (hasRequiredForgotPassword) return forgotPassword;
761
+ hasRequiredForgotPassword = 1;
762
+ const { toPlainObject } = require$$0;
763
+ const { checkBadRequest } = requireUtils();
764
+ forgotPassword = ({ nexus, strapi })=>{
765
+ const { nonNull } = nexus;
766
+ return {
767
+ type: 'UsersPermissionsPasswordPayload',
768
+ args: {
769
+ email: nonNull('String')
770
+ },
771
+ description: 'Request a reset password token',
772
+ async resolve (parent, args, context) {
773
+ const { koaContext } = context;
774
+ koaContext.request.body = toPlainObject(args);
775
+ await strapi.plugin('users-permissions').controller('auth').forgotPassword(koaContext);
776
+ const output = koaContext.body;
777
+ checkBadRequest(output);
778
+ return {
779
+ ok: output.ok || output
780
+ };
781
+ }
782
+ };
783
+ };
784
+ return forgotPassword;
785
+ }
786
+
787
+ var resetPassword;
788
+ var hasRequiredResetPassword;
789
+ function requireResetPassword() {
790
+ if (hasRequiredResetPassword) return resetPassword;
791
+ hasRequiredResetPassword = 1;
792
+ const { toPlainObject } = require$$0;
793
+ const { checkBadRequest } = requireUtils();
794
+ resetPassword = ({ nexus, strapi })=>{
795
+ const { nonNull } = nexus;
796
+ return {
797
+ type: 'UsersPermissionsLoginPayload',
798
+ args: {
799
+ password: nonNull('String'),
800
+ passwordConfirmation: nonNull('String'),
801
+ code: nonNull('String')
802
+ },
803
+ description: 'Reset user password. Confirm with a code (resetToken from forgotPassword)',
804
+ async resolve (parent, args, context) {
805
+ const { koaContext } = context;
806
+ koaContext.request.body = toPlainObject(args);
807
+ await strapi.plugin('users-permissions').controller('auth').resetPassword(koaContext);
808
+ const output = koaContext.body;
809
+ checkBadRequest(output);
810
+ return {
811
+ user: output.user || output,
812
+ jwt: output.jwt
813
+ };
814
+ }
815
+ };
816
+ };
817
+ return resetPassword;
818
+ }
819
+
820
+ var changePassword;
821
+ var hasRequiredChangePassword;
822
+ function requireChangePassword() {
823
+ if (hasRequiredChangePassword) return changePassword;
824
+ hasRequiredChangePassword = 1;
825
+ const { toPlainObject } = require$$0;
826
+ const { checkBadRequest } = requireUtils();
827
+ changePassword = ({ nexus, strapi })=>{
828
+ const { nonNull } = nexus;
829
+ return {
830
+ type: 'UsersPermissionsLoginPayload',
831
+ args: {
832
+ currentPassword: nonNull('String'),
833
+ password: nonNull('String'),
834
+ passwordConfirmation: nonNull('String')
835
+ },
836
+ description: 'Change user password. Confirm with the current password.',
837
+ async resolve (parent, args, context) {
838
+ const { koaContext } = context;
839
+ koaContext.request.body = toPlainObject(args);
840
+ await strapi.plugin('users-permissions').controller('auth').changePassword(koaContext);
841
+ const output = koaContext.body;
842
+ checkBadRequest(output);
843
+ return {
844
+ user: output.user || output,
845
+ jwt: output.jwt
846
+ };
847
+ }
848
+ };
849
+ };
850
+ return changePassword;
851
+ }
852
+
853
+ var emailConfirmation;
854
+ var hasRequiredEmailConfirmation;
855
+ function requireEmailConfirmation() {
856
+ if (hasRequiredEmailConfirmation) return emailConfirmation;
857
+ hasRequiredEmailConfirmation = 1;
858
+ const { toPlainObject } = require$$0;
859
+ const { checkBadRequest } = requireUtils();
860
+ emailConfirmation = ({ nexus, strapi })=>{
861
+ const { nonNull } = nexus;
862
+ return {
863
+ type: 'UsersPermissionsLoginPayload',
864
+ args: {
865
+ confirmation: nonNull('String')
866
+ },
867
+ description: 'Confirm an email users email address',
868
+ async resolve (parent, args, context) {
869
+ const { koaContext } = context;
870
+ koaContext.query = toPlainObject(args);
871
+ await strapi.plugin('users-permissions').controller('auth').emailConfirmation(koaContext, null, true);
872
+ const output = koaContext.body;
873
+ checkBadRequest(output);
874
+ return {
875
+ user: output.user || output,
876
+ jwt: output.jwt
877
+ };
878
+ }
879
+ };
880
+ };
881
+ return emailConfirmation;
882
+ }
883
+
884
+ var mutations;
885
+ var hasRequiredMutations;
886
+ function requireMutations() {
887
+ if (hasRequiredMutations) return mutations;
888
+ hasRequiredMutations = 1;
889
+ const userUID = 'plugin::users-permissions.user';
890
+ const roleUID = 'plugin::users-permissions.role';
891
+ mutations = (context)=>{
892
+ const { nexus, strapi } = context;
893
+ const { naming } = strapi.plugin('graphql').service('utils');
894
+ const user = strapi.getModel(userUID);
895
+ const role = strapi.getModel(roleUID);
896
+ const mutations = {
897
+ // CRUD (user & role)
898
+ [naming.getCreateMutationTypeName(role)]: requireCreateRole(),
899
+ [naming.getUpdateMutationTypeName(role)]: requireUpdateRole(),
900
+ [naming.getDeleteMutationTypeName(role)]: requireDeleteRole(),
901
+ [naming.getCreateMutationTypeName(user)]: requireCreateUser(),
902
+ [naming.getUpdateMutationTypeName(user)]: requireUpdateUser(),
903
+ [naming.getDeleteMutationTypeName(user)]: requireDeleteUser(),
904
+ // Other mutations
905
+ login: requireLogin(),
906
+ register: requireRegister$1(),
907
+ forgotPassword: requireForgotPassword(),
908
+ resetPassword: requireResetPassword(),
909
+ changePassword: requireChangePassword(),
910
+ emailConfirmation: requireEmailConfirmation()
911
+ };
912
+ return nexus.extendType({
913
+ type: 'Mutation',
914
+ definition (t) {
915
+ for (const [name, getConfig] of Object.entries(mutations)){
916
+ const config = getConfig(context);
917
+ t.field(name, config);
918
+ }
919
+ }
920
+ });
921
+ };
922
+ return mutations;
923
+ }
924
+
925
+ var resolversConfigs;
926
+ var hasRequiredResolversConfigs;
927
+ function requireResolversConfigs() {
928
+ if (hasRequiredResolversConfigs) return resolversConfigs;
929
+ hasRequiredResolversConfigs = 1;
930
+ const userUID = 'plugin::users-permissions.user';
931
+ const roleUID = 'plugin::users-permissions.role';
932
+ resolversConfigs = ({ strapi })=>{
933
+ const { naming } = strapi.plugin('graphql').service('utils');
934
+ const user = strapi.getModel(userUID);
935
+ const role = strapi.getModel(roleUID);
936
+ const createRole = naming.getCreateMutationTypeName(role);
937
+ const updateRole = naming.getUpdateMutationTypeName(role);
938
+ const deleteRole = naming.getDeleteMutationTypeName(role);
939
+ const createUser = naming.getCreateMutationTypeName(user);
940
+ const updateUser = naming.getUpdateMutationTypeName(user);
941
+ const deleteUser = naming.getDeleteMutationTypeName(user);
942
+ return {
943
+ // Disabled auth for some operations
944
+ 'Mutation.login': {
945
+ auth: false
946
+ },
947
+ 'Mutation.register': {
948
+ auth: false
949
+ },
950
+ 'Mutation.forgotPassword': {
951
+ auth: false
952
+ },
953
+ 'Mutation.resetPassword': {
954
+ auth: false
955
+ },
956
+ 'Mutation.emailConfirmation': {
957
+ auth: false
958
+ },
959
+ 'Mutation.changePassword': {
960
+ auth: {
961
+ scope: 'plugin::users-permissions.auth.changePassword'
962
+ }
963
+ },
964
+ // Scoped auth for replaced CRUD operations
965
+ // Role
966
+ [`Mutation.${createRole}`]: {
967
+ auth: {
968
+ scope: [
969
+ `${roleUID}.createRole`
970
+ ]
971
+ }
972
+ },
973
+ [`Mutation.${updateRole}`]: {
974
+ auth: {
975
+ scope: [
976
+ `${roleUID}.updateRole`
977
+ ]
978
+ }
979
+ },
980
+ [`Mutation.${deleteRole}`]: {
981
+ auth: {
982
+ scope: [
983
+ `${roleUID}.deleteRole`
984
+ ]
985
+ }
986
+ },
987
+ // User
988
+ [`Mutation.${createUser}`]: {
989
+ auth: {
990
+ scope: [
991
+ `${userUID}.create`
992
+ ]
993
+ }
994
+ },
995
+ [`Mutation.${updateUser}`]: {
996
+ auth: {
997
+ scope: [
998
+ `${userUID}.update`
999
+ ]
1000
+ }
1001
+ },
1002
+ [`Mutation.${deleteUser}`]: {
1003
+ auth: {
1004
+ scope: [
1005
+ `${userUID}.destroy`
1006
+ ]
1007
+ }
1008
+ }
1009
+ };
1010
+ };
1011
+ return resolversConfigs;
1012
+ }
1013
+
1014
+ var graphql;
1015
+ var hasRequiredGraphql;
1016
+ function requireGraphql() {
1017
+ if (hasRequiredGraphql) return graphql;
1018
+ hasRequiredGraphql = 1;
1019
+ const getTypes = requireTypes();
1020
+ const getQueries = requireQueries();
1021
+ const getMutations = requireMutations();
1022
+ const getResolversConfig = requireResolversConfigs();
1023
+ graphql = ({ strapi })=>{
1024
+ const { config: graphQLConfig } = strapi.plugin('graphql');
1025
+ const extensionService = strapi.plugin('graphql').service('extension');
1026
+ const isShadowCRUDEnabled = graphQLConfig('shadowCRUD', true);
1027
+ if (!isShadowCRUDEnabled) {
1028
+ return;
1029
+ }
1030
+ // Disable Permissions queries & mutations but allow the
1031
+ // type to be used/selected in filters or nested resolvers
1032
+ extensionService.shadowCRUD('plugin::users-permissions.permission').disableQueries().disableMutations();
1033
+ // Disable User & Role's Create/Update/Delete actions so they can be replaced
1034
+ const actionsToDisable = [
1035
+ 'create',
1036
+ 'update',
1037
+ 'delete'
1038
+ ];
1039
+ extensionService.shadowCRUD('plugin::users-permissions.user').disableActions(actionsToDisable);
1040
+ extensionService.shadowCRUD('plugin::users-permissions.role').disableActions(actionsToDisable);
1041
+ // Register new types & resolvers config
1042
+ extensionService.use(({ nexus })=>{
1043
+ const types = getTypes({
1044
+ strapi,
1045
+ nexus
1046
+ });
1047
+ const queries = getQueries({
1048
+ strapi,
1049
+ nexus
1050
+ });
1051
+ const mutations = getMutations({
1052
+ strapi,
1053
+ nexus
1054
+ });
1055
+ const resolversConfig = getResolversConfig({
1056
+ strapi
1057
+ });
1058
+ return {
1059
+ types: [
1060
+ types,
1061
+ queries,
1062
+ mutations
1063
+ ],
1064
+ resolversConfig
1065
+ };
1066
+ });
1067
+ };
1068
+ return graphql;
1069
+ }
1070
+
1071
+ var register;
1072
+ var hasRequiredRegister;
1073
+ function requireRegister() {
1074
+ if (hasRequiredRegister) return register;
1075
+ hasRequiredRegister = 1;
1076
+ const fs = require$$0$1;
1077
+ const path = require$$1$1;
1078
+ const authStrategy = requireUsersPermissions$1();
1079
+ const sanitizers = requireSanitizers();
1080
+ register = ({ strapi })=>{
1081
+ strapi.get('auth').register('content-api', authStrategy);
1082
+ strapi.sanitizers.add('content-api.output', sanitizers.defaultSanitizeOutput);
1083
+ if (strapi.plugin('graphql')) {
1084
+ requireGraphql()({
1085
+ strapi
1086
+ });
1087
+ }
1088
+ if (strapi.plugin('documentation')) {
1089
+ const specPath = path.join(__dirname, '../../documentation/content-api.yaml');
1090
+ const spec = fs.readFileSync(specPath, 'utf8');
1091
+ strapi.plugin('documentation').service('override').registerOverride(spec, {
1092
+ pluginOrigin: 'users-permissions',
1093
+ excludeFromGeneration: [
1094
+ 'users-permissions'
1095
+ ]
1096
+ });
1097
+ }
1098
+ };
1099
+ return register;
1100
+ }
1101
+
1102
+ var usersPermissionsActions;
1103
+ var hasRequiredUsersPermissionsActions;
1104
+ function requireUsersPermissionsActions() {
1105
+ if (hasRequiredUsersPermissionsActions) return usersPermissionsActions;
1106
+ hasRequiredUsersPermissionsActions = 1;
1107
+ usersPermissionsActions = {
1108
+ actions: [
1109
+ {
1110
+ // Roles
1111
+ section: 'plugins',
1112
+ displayName: 'Create',
1113
+ uid: 'roles.create',
1114
+ subCategory: 'roles',
1115
+ pluginName: 'users-permissions'
1116
+ },
1117
+ {
1118
+ section: 'plugins',
1119
+ displayName: 'Read',
1120
+ uid: 'roles.read',
1121
+ subCategory: 'roles',
1122
+ pluginName: 'users-permissions',
1123
+ aliases: [
1124
+ {
1125
+ actionId: 'plugin::content-manager.explorer.read',
1126
+ subjects: [
1127
+ 'plugin::users-permissions.role'
1128
+ ]
1129
+ }
1130
+ ]
1131
+ },
1132
+ {
1133
+ section: 'plugins',
1134
+ displayName: 'Update',
1135
+ uid: 'roles.update',
1136
+ subCategory: 'roles',
1137
+ pluginName: 'users-permissions'
1138
+ },
1139
+ {
1140
+ section: 'plugins',
1141
+ displayName: 'Delete',
1142
+ uid: 'roles.delete',
1143
+ subCategory: 'roles',
1144
+ pluginName: 'users-permissions'
1145
+ },
1146
+ {
1147
+ // providers
1148
+ section: 'plugins',
1149
+ displayName: 'Read',
1150
+ uid: 'providers.read',
1151
+ subCategory: 'providers',
1152
+ pluginName: 'users-permissions'
1153
+ },
1154
+ {
1155
+ section: 'plugins',
1156
+ displayName: 'Edit',
1157
+ uid: 'providers.update',
1158
+ subCategory: 'providers',
1159
+ pluginName: 'users-permissions'
1160
+ },
1161
+ {
1162
+ // emailTemplates
1163
+ section: 'plugins',
1164
+ displayName: 'Read',
1165
+ uid: 'email-templates.read',
1166
+ subCategory: 'emailTemplates',
1167
+ pluginName: 'users-permissions'
1168
+ },
1169
+ {
1170
+ section: 'plugins',
1171
+ displayName: 'Edit',
1172
+ uid: 'email-templates.update',
1173
+ subCategory: 'emailTemplates',
1174
+ pluginName: 'users-permissions'
1175
+ },
1176
+ {
1177
+ // advancedSettings
1178
+ section: 'plugins',
1179
+ displayName: 'Read',
1180
+ uid: 'advanced-settings.read',
1181
+ subCategory: 'advancedSettings',
1182
+ pluginName: 'users-permissions'
1183
+ },
1184
+ {
1185
+ section: 'plugins',
1186
+ displayName: 'Edit',
1187
+ uid: 'advanced-settings.update',
1188
+ subCategory: 'advancedSettings',
1189
+ pluginName: 'users-permissions'
1190
+ }
1191
+ ]
1192
+ };
1193
+ return usersPermissionsActions;
1194
+ }
1195
+
1196
+ var bootstrap;
1197
+ var hasRequiredBootstrap;
1198
+ function requireBootstrap() {
1199
+ if (hasRequiredBootstrap) return bootstrap;
1200
+ hasRequiredBootstrap = 1;
1201
+ /**
1202
+ * An asynchronous bootstrap function that runs before
1203
+ * your application gets started.
1204
+ *
1205
+ * This gives you an opportunity to set up your data model,
1206
+ * run jobs, or perform some special logic.
1207
+ */ const crypto = require$$0$2;
1208
+ const _ = require$$0$3;
1209
+ const { getService } = requireUtils$1();
1210
+ const usersPermissionsActions = requireUsersPermissionsActions();
1211
+ const initGrant = async (pluginStore)=>{
1212
+ const allProviders = getService('providers-registry').getAll();
1213
+ const grantConfig = Object.entries(allProviders).reduce((acc, [name, provider])=>{
1214
+ const { icon, enabled, grantConfig } = provider;
1215
+ acc[name] = {
1216
+ icon,
1217
+ enabled,
1218
+ ...grantConfig
1219
+ };
1220
+ return acc;
1221
+ }, {});
1222
+ const prevGrantConfig = await pluginStore.get({
1223
+ key: 'grant'
1224
+ }) || {};
1225
+ if (!prevGrantConfig || !_.isEqual(prevGrantConfig, grantConfig)) {
1226
+ // merge with the previous provider config.
1227
+ _.keys(grantConfig).forEach((key)=>{
1228
+ if (key in prevGrantConfig) {
1229
+ grantConfig[key] = _.merge(grantConfig[key], prevGrantConfig[key]);
1230
+ }
1231
+ });
1232
+ await pluginStore.set({
1233
+ key: 'grant',
1234
+ value: grantConfig
1235
+ });
1236
+ }
1237
+ };
1238
+ const initEmails = async (pluginStore)=>{
1239
+ if (!await pluginStore.get({
1240
+ key: 'email'
1241
+ })) {
1242
+ const value = {
1243
+ reset_password: {
1244
+ display: 'Email.template.reset_password',
1245
+ icon: 'sync',
1246
+ options: {
1247
+ from: {
1248
+ name: 'Administration Panel',
1249
+ email: 'no-reply@strapi.io'
1250
+ },
1251
+ response_email: '',
1252
+ object: 'Reset password',
1253
+ message: `<p>We heard that you lost your password. Sorry about that!</p>
1254
+
1255
+ <p>But don’t worry! You can use the following link to reset your password:</p>
1256
+ <p><%= URL %>?code=<%= TOKEN %></p>
1257
+
1258
+ <p>Thanks.</p>`
1259
+ }
1260
+ },
1261
+ email_confirmation: {
1262
+ display: 'Email.template.email_confirmation',
1263
+ icon: 'check-square',
1264
+ options: {
1265
+ from: {
1266
+ name: 'Administration Panel',
1267
+ email: 'no-reply@strapi.io'
1268
+ },
1269
+ response_email: '',
1270
+ object: 'Account confirmation',
1271
+ message: `<p>Thank you for registering!</p>
1272
+
1273
+ <p>You have to confirm your email address. Please click on the link below.</p>
1274
+
1275
+ <p><%= URL %>?confirmation=<%= CODE %></p>
1276
+
1277
+ <p>Thanks.</p>`
1278
+ }
1279
+ }
1280
+ };
1281
+ await pluginStore.set({
1282
+ key: 'email',
1283
+ value
1284
+ });
1285
+ }
1286
+ };
1287
+ const initAdvancedOptions = async (pluginStore)=>{
1288
+ if (!await pluginStore.get({
1289
+ key: 'advanced'
1290
+ })) {
1291
+ const value = {
1292
+ unique_email: true,
1293
+ allow_register: true,
1294
+ email_confirmation: false,
1295
+ email_reset_password: null,
1296
+ email_confirmation_redirection: null,
1297
+ default_role: 'authenticated'
1298
+ };
1299
+ await pluginStore.set({
1300
+ key: 'advanced',
1301
+ value
1302
+ });
1303
+ }
1304
+ };
1305
+ bootstrap = async ({ strapi })=>{
1306
+ const pluginStore = strapi.store({
1307
+ type: 'plugin',
1308
+ name: 'users-permissions'
1309
+ });
1310
+ await initGrant(pluginStore);
1311
+ await initEmails(pluginStore);
1312
+ await initAdvancedOptions(pluginStore);
1313
+ await strapi.service('admin::permission').actionProvider.registerMany(usersPermissionsActions.actions);
1314
+ await getService('users-permissions').initialize();
1315
+ if (!strapi.config.get('plugin::users-permissions.jwtSecret')) {
1316
+ if (process.env.NODE_ENV !== 'development') {
1317
+ throw new Error(`Missing jwtSecret. Please, set configuration variable "jwtSecret" for the users-permissions plugin in config/plugins.js (ex: you can generate one using Node with \`crypto.randomBytes(16).toString('base64')\`).
1318
+ For security reasons, prefer storing the secret in an environment variable and read it in config/plugins.js. See https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/configurations/optional/environment.html#configuration-using-environment-variables.`);
1319
+ }
1320
+ const jwtSecret = crypto.randomBytes(16).toString('base64');
1321
+ strapi.config.set('plugin::users-permissions.jwtSecret', jwtSecret);
1322
+ if (!process.env.JWT_SECRET) {
1323
+ const envPath = process.env.ENV_PATH || '.env';
1324
+ strapi.fs.appendFile(envPath, `JWT_SECRET=${jwtSecret}\n`);
1325
+ strapi.log.info(`The Users & Permissions plugin automatically generated a jwt secret and stored it in ${envPath} under the name JWT_SECRET.`);
1326
+ }
1327
+ }
1328
+ };
1329
+ return bootstrap;
1330
+ }
1331
+
1332
+ var permission$1;
1333
+ var hasRequiredPermission$1;
1334
+ function requirePermission$1() {
1335
+ if (hasRequiredPermission$1) return permission$1;
1336
+ hasRequiredPermission$1 = 1;
1337
+ permission$1 = {
1338
+ collectionName: 'up_permissions',
1339
+ info: {
1340
+ name: 'permission',
1341
+ description: '',
1342
+ singularName: 'permission',
1343
+ pluralName: 'permissions',
1344
+ displayName: 'Permission'
1345
+ },
1346
+ pluginOptions: {
1347
+ 'content-manager': {
1348
+ visible: false
1349
+ },
1350
+ 'content-type-builder': {
1351
+ visible: false
1352
+ }
1353
+ },
1354
+ attributes: {
1355
+ action: {
1356
+ type: 'string',
1357
+ required: true,
1358
+ configurable: false
1359
+ },
1360
+ role: {
1361
+ type: 'relation',
1362
+ relation: 'manyToOne',
1363
+ target: 'plugin::users-permissions.role',
1364
+ inversedBy: 'permissions',
1365
+ configurable: false
1366
+ }
1367
+ }
1368
+ };
1369
+ return permission$1;
1370
+ }
1371
+
1372
+ var role$4;
1373
+ var hasRequiredRole$4;
1374
+ function requireRole$4() {
1375
+ if (hasRequiredRole$4) return role$4;
1376
+ hasRequiredRole$4 = 1;
1377
+ role$4 = {
1378
+ collectionName: 'up_roles',
1379
+ info: {
1380
+ name: 'role',
1381
+ description: '',
1382
+ singularName: 'role',
1383
+ pluralName: 'roles',
1384
+ displayName: 'Role'
1385
+ },
1386
+ pluginOptions: {
1387
+ 'content-manager': {
1388
+ visible: false
1389
+ },
1390
+ 'content-type-builder': {
1391
+ visible: false
1392
+ }
1393
+ },
1394
+ attributes: {
1395
+ name: {
1396
+ type: 'string',
1397
+ minLength: 3,
1398
+ required: true,
1399
+ configurable: false
1400
+ },
1401
+ description: {
1402
+ type: 'string',
1403
+ configurable: false
1404
+ },
1405
+ type: {
1406
+ type: 'string',
1407
+ unique: true,
1408
+ configurable: false
1409
+ },
1410
+ permissions: {
1411
+ type: 'relation',
1412
+ relation: 'oneToMany',
1413
+ target: 'plugin::users-permissions.permission',
1414
+ mappedBy: 'role',
1415
+ configurable: false
1416
+ },
1417
+ users: {
1418
+ type: 'relation',
1419
+ relation: 'oneToMany',
1420
+ target: 'plugin::users-permissions.user',
1421
+ mappedBy: 'role',
1422
+ configurable: false
1423
+ }
1424
+ }
1425
+ };
1426
+ return role$4;
1427
+ }
1428
+
1429
+ var schemaConfig;
1430
+ var hasRequiredSchemaConfig;
1431
+ function requireSchemaConfig() {
1432
+ if (hasRequiredSchemaConfig) return schemaConfig;
1433
+ hasRequiredSchemaConfig = 1;
1434
+ schemaConfig = {
1435
+ attributes: {
1436
+ resetPasswordToken: {
1437
+ hidden: true
1438
+ },
1439
+ confirmationToken: {
1440
+ hidden: true
1441
+ },
1442
+ provider: {
1443
+ hidden: true
1444
+ }
1445
+ }
1446
+ };
1447
+ return schemaConfig;
1448
+ }
1449
+
1450
+ var user$4;
1451
+ var hasRequiredUser$4;
1452
+ function requireUser$4() {
1453
+ if (hasRequiredUser$4) return user$4;
1454
+ hasRequiredUser$4 = 1;
1455
+ const schemaConfig = requireSchemaConfig();
1456
+ user$4 = {
1457
+ collectionName: 'up_users',
1458
+ info: {
1459
+ name: 'user',
1460
+ description: '',
1461
+ singularName: 'user',
1462
+ pluralName: 'users',
1463
+ displayName: 'User'
1464
+ },
1465
+ options: {
1466
+ timestamps: true
1467
+ },
1468
+ attributes: {
1469
+ username: {
1470
+ type: 'string',
1471
+ minLength: 3,
1472
+ unique: true,
1473
+ configurable: false,
1474
+ required: true
1475
+ },
1476
+ email: {
1477
+ type: 'email',
1478
+ minLength: 6,
1479
+ configurable: false,
1480
+ required: true
1481
+ },
1482
+ provider: {
1483
+ type: 'string',
1484
+ configurable: false
1485
+ },
1486
+ password: {
1487
+ type: 'password',
1488
+ minLength: 6,
1489
+ configurable: false,
1490
+ private: true,
1491
+ searchable: false
1492
+ },
1493
+ resetPasswordToken: {
1494
+ type: 'string',
1495
+ configurable: false,
1496
+ private: true,
1497
+ searchable: false
1498
+ },
1499
+ confirmationToken: {
1500
+ type: 'string',
1501
+ configurable: false,
1502
+ private: true,
1503
+ searchable: false
1504
+ },
1505
+ confirmed: {
1506
+ type: 'boolean',
1507
+ default: false,
1508
+ configurable: false
1509
+ },
1510
+ blocked: {
1511
+ type: 'boolean',
1512
+ default: false,
1513
+ configurable: false
1514
+ },
1515
+ role: {
1516
+ type: 'relation',
1517
+ relation: 'manyToOne',
1518
+ target: 'plugin::users-permissions.role',
1519
+ inversedBy: 'users',
1520
+ configurable: false
1521
+ }
1522
+ },
1523
+ config: schemaConfig
1524
+ };
1525
+ return user$4;
1526
+ }
1527
+
1528
+ var contentTypes;
1529
+ var hasRequiredContentTypes;
1530
+ function requireContentTypes() {
1531
+ if (hasRequiredContentTypes) return contentTypes;
1532
+ hasRequiredContentTypes = 1;
1533
+ const permission = requirePermission$1();
1534
+ const role = requireRole$4();
1535
+ const user = requireUser$4();
1536
+ contentTypes = {
1537
+ permission: {
1538
+ schema: permission
1539
+ },
1540
+ role: {
1541
+ schema: role
1542
+ },
1543
+ user: {
1544
+ schema: user
1545
+ }
1546
+ };
1547
+ return contentTypes;
1548
+ }
1549
+
1550
+ var rateLimit;
1551
+ var hasRequiredRateLimit;
1552
+ function requireRateLimit() {
1553
+ if (hasRequiredRateLimit) return rateLimit;
1554
+ hasRequiredRateLimit = 1;
1555
+ const path = require$$1$1;
1556
+ const utils = require$$1;
1557
+ const { isString, has, toLower } = require$$0;
1558
+ const { RateLimitError } = utils.errors;
1559
+ rateLimit = (config, { strapi })=>async (ctx, next)=>{
1560
+ let rateLimitConfig = strapi.config.get('plugin::users-permissions.ratelimit');
1561
+ if (!rateLimitConfig) {
1562
+ rateLimitConfig = {
1563
+ enabled: true
1564
+ };
1565
+ }
1566
+ if (!has('enabled', rateLimitConfig)) {
1567
+ rateLimitConfig.enabled = true;
1568
+ }
1569
+ if (rateLimitConfig.enabled === true) {
1570
+ const rateLimit = require$$3.RateLimit;
1571
+ const userIdentifier = toLower(ctx.request.body.email) || 'unknownIdentifier';
1572
+ const requestPath = isString(ctx.request.path) ? toLower(path.normalize(ctx.request.path)) : 'invalidPath';
1573
+ const loadConfig = {
1574
+ interval: {
1575
+ min: 5
1576
+ },
1577
+ max: 5,
1578
+ prefixKey: `${userIdentifier}:${requestPath}:${ctx.request.ip}`,
1579
+ handler () {
1580
+ throw new RateLimitError();
1581
+ },
1582
+ ...rateLimitConfig,
1583
+ ...config
1584
+ };
1585
+ return rateLimit.middleware(loadConfig)(ctx, next);
1586
+ }
1587
+ return next();
1588
+ };
1589
+ return rateLimit;
1590
+ }
1591
+
1592
+ var middlewares;
1593
+ var hasRequiredMiddlewares;
1594
+ function requireMiddlewares() {
1595
+ if (hasRequiredMiddlewares) return middlewares;
1596
+ hasRequiredMiddlewares = 1;
1597
+ const rateLimit = requireRateLimit();
1598
+ middlewares = {
1599
+ rateLimit
1600
+ };
1601
+ return middlewares;
1602
+ }
1603
+
1604
+ var jwt_1;
1605
+ var hasRequiredJwt;
1606
+ function requireJwt() {
1607
+ if (hasRequiredJwt) return jwt_1;
1608
+ hasRequiredJwt = 1;
1609
+ /**
1610
+ * Jwt.js service
1611
+ *
1612
+ * @description: A set of functions similar to controller's actions to avoid code duplication.
1613
+ */ const _ = require$$0$3;
1614
+ const jwt = require$$1$2;
1615
+ jwt_1 = ({ strapi })=>({
1616
+ getToken (ctx) {
1617
+ let token;
1618
+ if (ctx.request && ctx.request.header && ctx.request.header.authorization) {
1619
+ const parts = ctx.request.header.authorization.split(/\s+/);
1620
+ if (parts[0].toLowerCase() !== 'bearer' || parts.length !== 2) {
1621
+ return null;
1622
+ }
1623
+ token = parts[1];
1624
+ } else {
1625
+ return null;
1626
+ }
1627
+ return this.verify(token);
1628
+ },
1629
+ issue (payload, jwtOptions = {}) {
1630
+ _.defaults(jwtOptions, strapi.config.get('plugin::users-permissions.jwt'));
1631
+ return jwt.sign(_.clone(payload.toJSON ? payload.toJSON() : payload), strapi.config.get('plugin::users-permissions.jwtSecret'), jwtOptions);
1632
+ },
1633
+ verify (token) {
1634
+ return new Promise((resolve, reject)=>{
1635
+ jwt.verify(token, strapi.config.get('plugin::users-permissions.jwtSecret'), {}, (err, tokenPayload = {})=>{
1636
+ if (err) {
1637
+ return reject(new Error('Invalid token.'));
1638
+ }
1639
+ resolve(tokenPayload);
1640
+ });
1641
+ });
1642
+ }
1643
+ });
1644
+ return jwt_1;
1645
+ }
1646
+
1647
+ var providers;
1648
+ var hasRequiredProviders;
1649
+ function requireProviders() {
1650
+ if (hasRequiredProviders) return providers;
1651
+ hasRequiredProviders = 1;
1652
+ /**
1653
+ * Module dependencies
1654
+ */ // Public node modules.
1655
+ const _ = require$$0$3;
1656
+ const urlJoin = require$$2;
1657
+ const { getService } = requireUtils$1();
1658
+ providers = ({ strapi })=>{
1659
+ /**
1660
+ * Helper to get profiles
1661
+ *
1662
+ * @param {String} provider
1663
+ */ const getProfile = async (provider, query)=>{
1664
+ const accessToken = query.access_token || query.code || query.oauth_token;
1665
+ const providers = await strapi.store({
1666
+ type: 'plugin',
1667
+ name: 'users-permissions',
1668
+ key: 'grant'
1669
+ }).get();
1670
+ return getService('providers-registry').run({
1671
+ provider,
1672
+ query,
1673
+ accessToken,
1674
+ providers
1675
+ });
1676
+ };
1677
+ /**
1678
+ * Connect thanks to a third-party provider.
1679
+ *
1680
+ *
1681
+ * @param {String} provider
1682
+ * @param {String} accessToken
1683
+ *
1684
+ * @return {*}
1685
+ */ const connect = async (provider, query)=>{
1686
+ const accessToken = query.access_token || query.code || query.oauth_token;
1687
+ if (!accessToken) {
1688
+ throw new Error('No access_token.');
1689
+ }
1690
+ // Get the profile.
1691
+ const profile = await getProfile(provider, query);
1692
+ const email = _.toLower(profile.email);
1693
+ // We need at least the mail.
1694
+ if (!email) {
1695
+ throw new Error('Email was not available.');
1696
+ }
1697
+ const users = await strapi.db.query('plugin::users-permissions.user').findMany({
1698
+ where: {
1699
+ email
1700
+ }
1701
+ });
1702
+ const advancedSettings = await strapi.store({
1703
+ type: 'plugin',
1704
+ name: 'users-permissions',
1705
+ key: 'advanced'
1706
+ }).get();
1707
+ const user = _.find(users, {
1708
+ provider
1709
+ });
1710
+ if (_.isEmpty(user) && !advancedSettings.allow_register) {
1711
+ throw new Error('Register action is actually not available.');
1712
+ }
1713
+ if (!_.isEmpty(user)) {
1714
+ return user;
1715
+ }
1716
+ if (users.length && advancedSettings.unique_email) {
1717
+ throw new Error('Email is already taken.');
1718
+ }
1719
+ // Retrieve default role.
1720
+ const defaultRole = await strapi.db.query('plugin::users-permissions.role').findOne({
1721
+ where: {
1722
+ type: advancedSettings.default_role
1723
+ }
1724
+ });
1725
+ // Create the new user.
1726
+ const newUser = {
1727
+ ...profile,
1728
+ email,
1729
+ provider,
1730
+ role: defaultRole.id,
1731
+ confirmed: true
1732
+ };
1733
+ const createdUser = await strapi.db.query('plugin::users-permissions.user').create({
1734
+ data: newUser
1735
+ });
1736
+ return createdUser;
1737
+ };
1738
+ const buildRedirectUri = (provider = '')=>{
1739
+ const apiPrefix = strapi.config.get('api.rest.prefix');
1740
+ return urlJoin(strapi.config.get('server.absoluteUrl'), apiPrefix, 'connect', provider, 'callback');
1741
+ };
1742
+ return {
1743
+ connect,
1744
+ buildRedirectUri
1745
+ };
1746
+ };
1747
+ return providers;
1748
+ }
1749
+
1750
+ var user$3;
1751
+ var hasRequiredUser$3;
1752
+ function requireUser$3() {
1753
+ if (hasRequiredUser$3) return user$3;
1754
+ hasRequiredUser$3 = 1;
1755
+ /**
1756
+ * User.js service
1757
+ *
1758
+ * @description: A set of functions similar to controller's actions to avoid code duplication.
1759
+ */ const crypto = require$$0$2;
1760
+ const bcrypt = require$$1$3;
1761
+ const urlJoin = require$$2;
1762
+ const { sanitize } = require$$1;
1763
+ const { toNumber, getOr } = require$$0;
1764
+ const { getService } = requireUtils$1();
1765
+ const USER_MODEL_UID = 'plugin::users-permissions.user';
1766
+ user$3 = ({ strapi })=>({
1767
+ /**
1768
+ * Promise to count users
1769
+ *
1770
+ * @return {Promise}
1771
+ */ count (params) {
1772
+ return strapi.db.query(USER_MODEL_UID).count({
1773
+ where: params
1774
+ });
1775
+ },
1776
+ /**
1777
+ * Hashes password fields in the provided values object if they are present.
1778
+ * It checks each key in the values object against the model's attributes and
1779
+ * hashes it if the attribute type is 'password',
1780
+ *
1781
+ * @param {object} values - The object containing the fields to be hashed.
1782
+ * @return {object} The values object with hashed password fields if they were present.
1783
+ */ async ensureHashedPasswords (values) {
1784
+ const attributes = strapi.getModel(USER_MODEL_UID).attributes;
1785
+ for(const key in values){
1786
+ if (attributes[key] && attributes[key].type === 'password') {
1787
+ // Check if a custom encryption.rounds has been set on the password attribute
1788
+ const rounds = toNumber(getOr(10, 'encryption.rounds', attributes[key]));
1789
+ values[key] = await bcrypt.hash(values[key], rounds);
1790
+ }
1791
+ }
1792
+ return values;
1793
+ },
1794
+ /**
1795
+ * Promise to add a/an user.
1796
+ * @return {Promise}
1797
+ */ async add (values) {
1798
+ return strapi.db.query(USER_MODEL_UID).create({
1799
+ data: await this.ensureHashedPasswords(values),
1800
+ populate: [
1801
+ 'role'
1802
+ ]
1803
+ });
1804
+ },
1805
+ /**
1806
+ * Promise to edit a/an user.
1807
+ * @param {string} userId
1808
+ * @param {object} params
1809
+ * @return {Promise}
1810
+ */ async edit (userId, params = {}) {
1811
+ return strapi.db.query(USER_MODEL_UID).update({
1812
+ where: {
1813
+ id: userId
1814
+ },
1815
+ data: await this.ensureHashedPasswords(params),
1816
+ populate: [
1817
+ 'role'
1818
+ ]
1819
+ });
1820
+ },
1821
+ /**
1822
+ * Promise to fetch a/an user.
1823
+ * @return {Promise}
1824
+ */ fetch (id, params) {
1825
+ const query = strapi.get('query-params').transform(USER_MODEL_UID, params ?? {});
1826
+ return strapi.db.query(USER_MODEL_UID).findOne({
1827
+ ...query,
1828
+ where: {
1829
+ $and: [
1830
+ {
1831
+ id
1832
+ },
1833
+ query.where || {}
1834
+ ]
1835
+ }
1836
+ });
1837
+ },
1838
+ /**
1839
+ * Promise to fetch authenticated user.
1840
+ * @return {Promise}
1841
+ */ fetchAuthenticatedUser (id) {
1842
+ return strapi.db.query(USER_MODEL_UID).findOne({
1843
+ where: {
1844
+ id
1845
+ },
1846
+ populate: [
1847
+ 'role'
1848
+ ]
1849
+ });
1850
+ },
1851
+ /**
1852
+ * Promise to fetch all users.
1853
+ * @return {Promise}
1854
+ */ fetchAll (params) {
1855
+ const query = strapi.get('query-params').transform(USER_MODEL_UID, params ?? {});
1856
+ return strapi.db.query(USER_MODEL_UID).findMany(query);
1857
+ },
1858
+ /**
1859
+ * Promise to remove a/an user.
1860
+ * @return {Promise}
1861
+ */ async remove (params) {
1862
+ return strapi.db.query(USER_MODEL_UID).delete({
1863
+ where: params
1864
+ });
1865
+ },
1866
+ validatePassword (password, hash) {
1867
+ return bcrypt.compare(password, hash);
1868
+ },
1869
+ async sendConfirmationEmail (user) {
1870
+ const userPermissionService = getService('users-permissions');
1871
+ const pluginStore = await strapi.store({
1872
+ type: 'plugin',
1873
+ name: 'users-permissions'
1874
+ });
1875
+ const userSchema = strapi.getModel(USER_MODEL_UID);
1876
+ const settings = await pluginStore.get({
1877
+ key: 'email'
1878
+ }).then((storeEmail)=>storeEmail.email_confirmation.options);
1879
+ // Sanitize the template's user information
1880
+ const sanitizedUserInfo = await sanitize.sanitizers.defaultSanitizeOutput({
1881
+ schema: userSchema,
1882
+ getModel: strapi.getModel.bind(strapi)
1883
+ }, user);
1884
+ const confirmationToken = crypto.randomBytes(20).toString('hex');
1885
+ await this.edit(user.id, {
1886
+ confirmationToken
1887
+ });
1888
+ const apiPrefix = strapi.config.get('api.rest.prefix');
1889
+ try {
1890
+ settings.message = await userPermissionService.template(settings.message, {
1891
+ URL: urlJoin(strapi.config.get('server.absoluteUrl'), apiPrefix, '/auth/email-confirmation'),
1892
+ SERVER_URL: strapi.config.get('server.absoluteUrl'),
1893
+ ADMIN_URL: strapi.config.get('admin.absoluteUrl'),
1894
+ USER: sanitizedUserInfo,
1895
+ CODE: confirmationToken
1896
+ });
1897
+ settings.object = await userPermissionService.template(settings.object, {
1898
+ USER: sanitizedUserInfo
1899
+ });
1900
+ } catch {
1901
+ strapi.log.error('[plugin::users-permissions.sendConfirmationEmail]: Failed to generate a template for "user confirmation email". Please make sure your email template is valid and does not contain invalid characters or patterns');
1902
+ return;
1903
+ }
1904
+ // Send an email to the user.
1905
+ await strapi.plugin('email').service('email').send({
1906
+ to: user.email,
1907
+ from: settings.from.email && settings.from.name ? `${settings.from.name} <${settings.from.email}>` : undefined,
1908
+ replyTo: settings.response_email,
1909
+ subject: settings.object,
1910
+ text: settings.message,
1911
+ html: settings.message
1912
+ });
1913
+ }
1914
+ });
1915
+ return user$3;
1916
+ }
1917
+
1918
+ var role$3;
1919
+ var hasRequiredRole$3;
1920
+ function requireRole$3() {
1921
+ if (hasRequiredRole$3) return role$3;
1922
+ hasRequiredRole$3 = 1;
1923
+ const _ = require$$0$3;
1924
+ const { NotFoundError } = require$$1.errors;
1925
+ const { getService } = requireUtils$1();
1926
+ role$3 = ({ strapi })=>({
1927
+ async createRole (params) {
1928
+ if (!params.type) {
1929
+ params.type = _.snakeCase(_.deburr(_.toLower(params.name)));
1930
+ }
1931
+ const role = await strapi.db.query('plugin::users-permissions.role').create({
1932
+ data: _.omit(params, [
1933
+ 'users',
1934
+ 'permissions'
1935
+ ])
1936
+ });
1937
+ const createPromises = _.flatMap(params.permissions, (type, typeName)=>{
1938
+ return _.flatMap(type.controllers, (controller, controllerName)=>{
1939
+ return _.reduce(controller, (acc, action, actionName)=>{
1940
+ const { enabled/* policy */ } = action;
1941
+ if (enabled) {
1942
+ const actionID = `${typeName}.${controllerName}.${actionName}`;
1943
+ acc.push(strapi.db.query('plugin::users-permissions.permission').create({
1944
+ data: {
1945
+ action: actionID,
1946
+ role: role.id
1947
+ }
1948
+ }));
1949
+ }
1950
+ return acc;
1951
+ }, []);
1952
+ });
1953
+ });
1954
+ await Promise.all(createPromises);
1955
+ },
1956
+ async findOne (roleID) {
1957
+ const role = await strapi.db.query('plugin::users-permissions.role').findOne({
1958
+ where: {
1959
+ id: roleID
1960
+ },
1961
+ populate: [
1962
+ 'permissions'
1963
+ ]
1964
+ });
1965
+ if (!role) {
1966
+ throw new NotFoundError('Role not found');
1967
+ }
1968
+ const allActions = getService('users-permissions').getActions();
1969
+ // Group by `type`.
1970
+ role.permissions.forEach((permission)=>{
1971
+ const [type, controller, action] = permission.action.split('.');
1972
+ _.set(allActions, `${type}.controllers.${controller}.${action}`, {
1973
+ enabled: true,
1974
+ policy: ''
1975
+ });
1976
+ });
1977
+ return {
1978
+ ...role,
1979
+ permissions: allActions
1980
+ };
1981
+ },
1982
+ async find () {
1983
+ const roles = await strapi.db.query('plugin::users-permissions.role').findMany({
1984
+ sort: [
1985
+ 'name'
1986
+ ]
1987
+ });
1988
+ for (const role of roles){
1989
+ role.nb_users = await strapi.db.query('plugin::users-permissions.user').count({
1990
+ where: {
1991
+ role: {
1992
+ id: role.id
1993
+ }
1994
+ }
1995
+ });
1996
+ }
1997
+ return roles;
1998
+ },
1999
+ async updateRole (roleID, data) {
2000
+ const role = await strapi.db.query('plugin::users-permissions.role').findOne({
2001
+ where: {
2002
+ id: roleID
2003
+ },
2004
+ populate: [
2005
+ 'permissions'
2006
+ ]
2007
+ });
2008
+ if (!role) {
2009
+ throw new NotFoundError('Role not found');
2010
+ }
2011
+ await strapi.db.query('plugin::users-permissions.role').update({
2012
+ where: {
2013
+ id: roleID
2014
+ },
2015
+ data: _.pick(data, [
2016
+ 'name',
2017
+ 'description'
2018
+ ])
2019
+ });
2020
+ const { permissions } = data;
2021
+ const newActions = _.flatMap(permissions, (type, typeName)=>{
2022
+ return _.flatMap(type.controllers, (controller, controllerName)=>{
2023
+ return _.reduce(controller, (acc, action, actionName)=>{
2024
+ const { enabled/* policy */ } = action;
2025
+ if (enabled) {
2026
+ acc.push(`${typeName}.${controllerName}.${actionName}`);
2027
+ }
2028
+ return acc;
2029
+ }, []);
2030
+ });
2031
+ });
2032
+ const oldActions = role.permissions.map(({ action })=>action);
2033
+ const toDelete = role.permissions.reduce((acc, permission)=>{
2034
+ if (!newActions.includes(permission.action)) {
2035
+ acc.push(permission);
2036
+ }
2037
+ return acc;
2038
+ }, []);
2039
+ const toCreate = newActions.filter((action)=>!oldActions.includes(action)).map((action)=>({
2040
+ action,
2041
+ role: role.id
2042
+ }));
2043
+ await Promise.all(toDelete.map((permission)=>strapi.db.query('plugin::users-permissions.permission').delete({
2044
+ where: {
2045
+ id: permission.id
2046
+ }
2047
+ })));
2048
+ await Promise.all(toCreate.map((permissionInfo)=>strapi.db.query('plugin::users-permissions.permission').create({
2049
+ data: permissionInfo
2050
+ })));
2051
+ },
2052
+ async deleteRole (roleID, publicRoleID) {
2053
+ const role = await strapi.db.query('plugin::users-permissions.role').findOne({
2054
+ where: {
2055
+ id: roleID
2056
+ },
2057
+ populate: [
2058
+ 'users',
2059
+ 'permissions'
2060
+ ]
2061
+ });
2062
+ if (!role) {
2063
+ throw new NotFoundError('Role not found');
2064
+ }
2065
+ // Move users to guest role.
2066
+ await Promise.all(role.users.map((user)=>{
2067
+ return strapi.db.query('plugin::users-permissions.user').update({
2068
+ where: {
2069
+ id: user.id
2070
+ },
2071
+ data: {
2072
+ role: publicRoleID
2073
+ }
2074
+ });
2075
+ }));
2076
+ // Remove permissions related to this role.
2077
+ // TODO: use delete many
2078
+ await Promise.all(role.permissions.map((permission)=>{
2079
+ return strapi.db.query('plugin::users-permissions.permission').delete({
2080
+ where: {
2081
+ id: permission.id
2082
+ }
2083
+ });
2084
+ }));
2085
+ // Delete the role.
2086
+ await strapi.db.query('plugin::users-permissions.role').delete({
2087
+ where: {
2088
+ id: roleID
2089
+ }
2090
+ });
2091
+ }
2092
+ });
2093
+ return role$3;
2094
+ }
2095
+
2096
+ var usersPermissions;
2097
+ var hasRequiredUsersPermissions;
2098
+ function requireUsersPermissions() {
2099
+ if (hasRequiredUsersPermissions) return usersPermissions;
2100
+ hasRequiredUsersPermissions = 1;
2101
+ const _ = require$$0$3;
2102
+ const { filter, map, pipe, prop } = require$$0;
2103
+ const urlJoin = require$$2;
2104
+ const { template: { createStrictInterpolationRegExp }, errors, objects } = require$$1;
2105
+ const { getService } = requireUtils$1();
2106
+ const DEFAULT_PERMISSIONS = [
2107
+ {
2108
+ action: 'plugin::users-permissions.auth.callback',
2109
+ roleType: 'public'
2110
+ },
2111
+ {
2112
+ action: 'plugin::users-permissions.auth.connect',
2113
+ roleType: 'public'
2114
+ },
2115
+ {
2116
+ action: 'plugin::users-permissions.auth.forgotPassword',
2117
+ roleType: 'public'
2118
+ },
2119
+ {
2120
+ action: 'plugin::users-permissions.auth.resetPassword',
2121
+ roleType: 'public'
2122
+ },
2123
+ {
2124
+ action: 'plugin::users-permissions.auth.register',
2125
+ roleType: 'public'
2126
+ },
2127
+ {
2128
+ action: 'plugin::users-permissions.auth.emailConfirmation',
2129
+ roleType: 'public'
2130
+ },
2131
+ {
2132
+ action: 'plugin::users-permissions.auth.sendEmailConfirmation',
2133
+ roleType: 'public'
2134
+ },
2135
+ {
2136
+ action: 'plugin::users-permissions.user.me',
2137
+ roleType: 'authenticated'
2138
+ },
2139
+ {
2140
+ action: 'plugin::users-permissions.auth.changePassword',
2141
+ roleType: 'authenticated'
2142
+ }
2143
+ ];
2144
+ const transformRoutePrefixFor = (pluginName)=>(route)=>{
2145
+ const prefix = route.config && route.config.prefix;
2146
+ const path = prefix !== undefined ? `${prefix}${route.path}` : `/${pluginName}${route.path}`;
2147
+ return {
2148
+ ...route,
2149
+ path
2150
+ };
2151
+ };
2152
+ usersPermissions = ({ strapi })=>({
2153
+ getActions ({ defaultEnable = false } = {}) {
2154
+ const actionMap = {};
2155
+ const isContentApi = (action)=>{
2156
+ if (!_.has(action, Symbol.for('__type__'))) {
2157
+ return false;
2158
+ }
2159
+ return action[Symbol.for('__type__')].includes('content-api');
2160
+ };
2161
+ _.forEach(strapi.apis, (api, apiName)=>{
2162
+ const controllers = _.reduce(api.controllers, (acc, controller, controllerName)=>{
2163
+ const contentApiActions = _.pickBy(controller, isContentApi);
2164
+ if (_.isEmpty(contentApiActions)) {
2165
+ return acc;
2166
+ }
2167
+ acc[controllerName] = _.mapValues(contentApiActions, ()=>{
2168
+ return {
2169
+ enabled: defaultEnable,
2170
+ policy: ''
2171
+ };
2172
+ });
2173
+ return acc;
2174
+ }, {});
2175
+ if (!_.isEmpty(controllers)) {
2176
+ actionMap[`api::${apiName}`] = {
2177
+ controllers
2178
+ };
2179
+ }
2180
+ });
2181
+ _.forEach(strapi.plugins, (plugin, pluginName)=>{
2182
+ const controllers = _.reduce(plugin.controllers, (acc, controller, controllerName)=>{
2183
+ const contentApiActions = _.pickBy(controller, isContentApi);
2184
+ if (_.isEmpty(contentApiActions)) {
2185
+ return acc;
2186
+ }
2187
+ acc[controllerName] = _.mapValues(contentApiActions, ()=>{
2188
+ return {
2189
+ enabled: defaultEnable,
2190
+ policy: ''
2191
+ };
2192
+ });
2193
+ return acc;
2194
+ }, {});
2195
+ if (!_.isEmpty(controllers)) {
2196
+ actionMap[`plugin::${pluginName}`] = {
2197
+ controllers
2198
+ };
2199
+ }
2200
+ });
2201
+ return actionMap;
2202
+ },
2203
+ async getRoutes () {
2204
+ const routesMap = {};
2205
+ _.forEach(strapi.apis, (api, apiName)=>{
2206
+ const routes = _.flatMap(api.routes, (route)=>{
2207
+ if (_.has(route, 'routes')) {
2208
+ return route.routes;
2209
+ }
2210
+ return route;
2211
+ }).filter((route)=>route.info.type === 'content-api');
2212
+ if (routes.length === 0) {
2213
+ return;
2214
+ }
2215
+ const apiPrefix = strapi.config.get('api.rest.prefix');
2216
+ routesMap[`api::${apiName}`] = routes.map((route)=>({
2217
+ ...route,
2218
+ path: urlJoin(apiPrefix, route.path)
2219
+ }));
2220
+ });
2221
+ _.forEach(strapi.plugins, (plugin, pluginName)=>{
2222
+ const transformPrefix = transformRoutePrefixFor(pluginName);
2223
+ const routes = _.flatMap(plugin.routes, (route)=>{
2224
+ if (_.has(route, 'routes')) {
2225
+ return route.routes.map(transformPrefix);
2226
+ }
2227
+ return transformPrefix(route);
2228
+ }).filter((route)=>route.info.type === 'content-api');
2229
+ if (routes.length === 0) {
2230
+ return;
2231
+ }
2232
+ const apiPrefix = strapi.config.get('api.rest.prefix');
2233
+ routesMap[`plugin::${pluginName}`] = routes.map((route)=>({
2234
+ ...route,
2235
+ path: urlJoin(apiPrefix, route.path)
2236
+ }));
2237
+ });
2238
+ return routesMap;
2239
+ },
2240
+ async syncPermissions () {
2241
+ const roles = await strapi.db.query('plugin::users-permissions.role').findMany();
2242
+ const dbPermissions = await strapi.db.query('plugin::users-permissions.permission').findMany();
2243
+ const permissionsFoundInDB = _.uniq(_.map(dbPermissions, 'action'));
2244
+ const appActions = _.flatMap(strapi.apis, (api, apiName)=>{
2245
+ return _.flatMap(api.controllers, (controller, controllerName)=>{
2246
+ return _.keys(controller).map((actionName)=>{
2247
+ return `api::${apiName}.${controllerName}.${actionName}`;
2248
+ });
2249
+ });
2250
+ });
2251
+ const pluginsActions = _.flatMap(strapi.plugins, (plugin, pluginName)=>{
2252
+ return _.flatMap(plugin.controllers, (controller, controllerName)=>{
2253
+ return _.keys(controller).map((actionName)=>{
2254
+ return `plugin::${pluginName}.${controllerName}.${actionName}`;
2255
+ });
2256
+ });
2257
+ });
2258
+ const allActions = [
2259
+ ...appActions,
2260
+ ...pluginsActions
2261
+ ];
2262
+ const toDelete = _.difference(permissionsFoundInDB, allActions);
2263
+ await Promise.all(toDelete.map((action)=>{
2264
+ return strapi.db.query('plugin::users-permissions.permission').delete({
2265
+ where: {
2266
+ action
2267
+ }
2268
+ });
2269
+ }));
2270
+ if (permissionsFoundInDB.length === 0) {
2271
+ // create default permissions
2272
+ for (const role of roles){
2273
+ const toCreate = pipe(filter(({ roleType })=>roleType === role.type || roleType === null), map(prop('action')))(DEFAULT_PERMISSIONS);
2274
+ await Promise.all(toCreate.map((action)=>{
2275
+ return strapi.db.query('plugin::users-permissions.permission').create({
2276
+ data: {
2277
+ action,
2278
+ role: role.id
2279
+ }
2280
+ });
2281
+ }));
2282
+ }
2283
+ }
2284
+ },
2285
+ async initialize () {
2286
+ const roleCount = await strapi.db.query('plugin::users-permissions.role').count();
2287
+ if (roleCount === 0) {
2288
+ await strapi.db.query('plugin::users-permissions.role').create({
2289
+ data: {
2290
+ name: 'Authenticated',
2291
+ description: 'Default role given to authenticated user.',
2292
+ type: 'authenticated'
2293
+ }
2294
+ });
2295
+ await strapi.db.query('plugin::users-permissions.role').create({
2296
+ data: {
2297
+ name: 'Public',
2298
+ description: 'Default role given to unauthenticated user.',
2299
+ type: 'public'
2300
+ }
2301
+ });
2302
+ }
2303
+ return getService('users-permissions').syncPermissions();
2304
+ },
2305
+ async updateUserRole (user, role) {
2306
+ return strapi.db.query('plugin::users-permissions.user').update({
2307
+ where: {
2308
+ id: user.id
2309
+ },
2310
+ data: {
2311
+ role
2312
+ }
2313
+ });
2314
+ },
2315
+ template (layout, data) {
2316
+ const allowedTemplateVariables = objects.keysDeep(data);
2317
+ // Create a strict interpolation RegExp based on possible variable names
2318
+ const interpolate = createStrictInterpolationRegExp(allowedTemplateVariables, 'g');
2319
+ try {
2320
+ return _.template(layout, {
2321
+ interpolate,
2322
+ evaluate: false,
2323
+ escape: false
2324
+ })(data);
2325
+ } catch (e) {
2326
+ throw new errors.ApplicationError('Invalid email template');
2327
+ }
2328
+ }
2329
+ });
2330
+ return usersPermissions;
2331
+ }
2332
+
2333
+ var providersRegistry;
2334
+ var hasRequiredProvidersRegistry;
2335
+ function requireProvidersRegistry() {
2336
+ if (hasRequiredProvidersRegistry) return providersRegistry;
2337
+ hasRequiredProvidersRegistry = 1;
2338
+ const { strict: assert } = require$$0$4;
2339
+ const jwt = require$$1$2;
2340
+ const urljoin = require$$2;
2341
+ const jwkToPem = require$$3$1;
2342
+ const getCognitoPayload = async ({ idToken, jwksUrl, purest })=>{
2343
+ const { header: { kid }, payload } = jwt.decode(idToken, {
2344
+ complete: true
2345
+ });
2346
+ if (!payload || !kid) {
2347
+ throw new Error('The provided token is not valid');
2348
+ }
2349
+ const config = {
2350
+ cognito: {
2351
+ discovery: {
2352
+ origin: jwksUrl.origin,
2353
+ path: jwksUrl.pathname
2354
+ }
2355
+ }
2356
+ };
2357
+ try {
2358
+ const cognito = purest({
2359
+ provider: 'cognito',
2360
+ config
2361
+ });
2362
+ // get the JSON Web Key (JWK) for the user pool
2363
+ const { body: jwk } = await cognito('discovery').request();
2364
+ // Get the key with the same Key ID as the provided token
2365
+ const key = jwk.keys.find(({ kid: jwkKid })=>jwkKid === kid);
2366
+ const pem = jwkToPem(key);
2367
+ // https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html
2368
+ const decodedToken = await new Promise((resolve, reject)=>{
2369
+ jwt.verify(idToken, pem, {
2370
+ algorithms: [
2371
+ 'RS256'
2372
+ ]
2373
+ }, (err, decodedToken)=>{
2374
+ if (err) {
2375
+ reject();
2376
+ }
2377
+ resolve(decodedToken);
2378
+ });
2379
+ });
2380
+ return decodedToken;
2381
+ } catch (err) {
2382
+ throw new Error('There was an error verifying the token');
2383
+ }
2384
+ };
2385
+ const initProviders = ({ baseURL, purest })=>({
2386
+ email: {
2387
+ enabled: true,
2388
+ icon: 'envelope',
2389
+ grantConfig: {}
2390
+ },
2391
+ discord: {
2392
+ enabled: false,
2393
+ icon: 'discord',
2394
+ grantConfig: {
2395
+ key: '',
2396
+ secret: '',
2397
+ callbackUrl: `${baseURL}/discord/callback`,
2398
+ scope: [
2399
+ 'identify',
2400
+ 'email'
2401
+ ]
2402
+ },
2403
+ async authCallback ({ accessToken }) {
2404
+ const discord = purest({
2405
+ provider: 'discord'
2406
+ });
2407
+ return discord.get('users/@me').auth(accessToken).request().then(({ body })=>{
2408
+ // Combine username and discriminator (if discriminator exists and not equal to 0)
2409
+ const username = body.discriminator && body.discriminator !== '0' ? `${body.username}#${body.discriminator}` : body.username;
2410
+ return {
2411
+ username,
2412
+ email: body.email
2413
+ };
2414
+ });
2415
+ }
2416
+ },
2417
+ facebook: {
2418
+ enabled: false,
2419
+ icon: 'facebook-square',
2420
+ grantConfig: {
2421
+ key: '',
2422
+ secret: '',
2423
+ callbackUrl: `${baseURL}/facebook/callback`,
2424
+ scope: [
2425
+ 'email'
2426
+ ]
2427
+ },
2428
+ async authCallback ({ accessToken }) {
2429
+ const facebook = purest({
2430
+ provider: 'facebook'
2431
+ });
2432
+ return facebook.get('me').auth(accessToken).qs({
2433
+ fields: 'name,email'
2434
+ }).request().then(({ body })=>({
2435
+ username: body.name,
2436
+ email: body.email
2437
+ }));
2438
+ }
2439
+ },
2440
+ google: {
2441
+ enabled: false,
2442
+ icon: 'google',
2443
+ grantConfig: {
2444
+ key: '',
2445
+ secret: '',
2446
+ callbackUrl: `${baseURL}/google/callback`,
2447
+ scope: [
2448
+ 'email'
2449
+ ]
2450
+ },
2451
+ async authCallback ({ accessToken }) {
2452
+ const google = purest({
2453
+ provider: 'google'
2454
+ });
2455
+ return google.query('oauth').get('tokeninfo').qs({
2456
+ accessToken
2457
+ }).request().then(({ body })=>({
2458
+ username: body.email.split('@')[0],
2459
+ email: body.email
2460
+ }));
2461
+ }
2462
+ },
2463
+ github: {
2464
+ enabled: false,
2465
+ icon: 'github',
2466
+ grantConfig: {
2467
+ key: '',
2468
+ secret: '',
2469
+ callbackUrl: `${baseURL}/github/callback`,
2470
+ scope: [
2471
+ 'user',
2472
+ 'user:email'
2473
+ ]
2474
+ },
2475
+ async authCallback ({ accessToken }) {
2476
+ const github = purest({
2477
+ provider: 'github',
2478
+ defaults: {
2479
+ headers: {
2480
+ 'user-agent': 'strapi'
2481
+ }
2482
+ }
2483
+ });
2484
+ const { body: userBody } = await github.get('user').auth(accessToken).request();
2485
+ // This is the public email on the github profile
2486
+ if (userBody.email) {
2487
+ return {
2488
+ username: userBody.login,
2489
+ email: userBody.email
2490
+ };
2491
+ }
2492
+ // Get the email with Github's user/emails API
2493
+ const { body: emailBody } = await github.get('user/emails').auth(accessToken).request();
2494
+ return {
2495
+ username: userBody.login,
2496
+ email: Array.isArray(emailBody) ? emailBody.find((email)=>email.primary === true).email : null
2497
+ };
2498
+ }
2499
+ },
2500
+ microsoft: {
2501
+ enabled: false,
2502
+ icon: 'windows',
2503
+ grantConfig: {
2504
+ key: '',
2505
+ secret: '',
2506
+ callbackUrl: `${baseURL}/microsoft/callback`,
2507
+ scope: [
2508
+ 'user.read'
2509
+ ]
2510
+ },
2511
+ async authCallback ({ accessToken }) {
2512
+ const microsoft = purest({
2513
+ provider: 'microsoft'
2514
+ });
2515
+ return microsoft.get('me').auth(accessToken).request().then(({ body })=>({
2516
+ username: body.userPrincipalName,
2517
+ email: body.userPrincipalName
2518
+ }));
2519
+ }
2520
+ },
2521
+ twitter: {
2522
+ enabled: false,
2523
+ icon: 'twitter',
2524
+ grantConfig: {
2525
+ key: '',
2526
+ secret: '',
2527
+ callbackUrl: `${baseURL}/twitter/callback`
2528
+ },
2529
+ async authCallback ({ accessToken, query, providers }) {
2530
+ const twitter = purest({
2531
+ provider: 'twitter',
2532
+ defaults: {
2533
+ oauth: {
2534
+ consumer_key: providers.twitter.key,
2535
+ consumer_secret: providers.twitter.secret
2536
+ }
2537
+ }
2538
+ });
2539
+ return twitter.get('account/verify_credentials').auth(accessToken, query.access_secret).qs({
2540
+ screen_name: query['raw[screen_name]'],
2541
+ include_email: 'true'
2542
+ }).request().then(({ body })=>({
2543
+ username: body.screen_name,
2544
+ email: body.email
2545
+ }));
2546
+ }
2547
+ },
2548
+ instagram: {
2549
+ enabled: false,
2550
+ icon: 'instagram',
2551
+ grantConfig: {
2552
+ key: '',
2553
+ secret: '',
2554
+ callbackUrl: `${baseURL}/instagram/callback`,
2555
+ scope: [
2556
+ 'user_profile'
2557
+ ]
2558
+ },
2559
+ async authCallback ({ accessToken }) {
2560
+ const instagram = purest({
2561
+ provider: 'instagram'
2562
+ });
2563
+ return instagram.get('me').auth(accessToken).qs({
2564
+ fields: 'id,username'
2565
+ }).request().then(({ body })=>({
2566
+ username: body.username,
2567
+ email: `${body.username}@strapi.io`
2568
+ }));
2569
+ }
2570
+ },
2571
+ vk: {
2572
+ enabled: false,
2573
+ icon: 'vk',
2574
+ grantConfig: {
2575
+ key: '',
2576
+ secret: '',
2577
+ callbackUrl: `${baseURL}/vk/callback`,
2578
+ scope: [
2579
+ 'email'
2580
+ ]
2581
+ },
2582
+ async authCallback ({ accessToken, query }) {
2583
+ const vk = purest({
2584
+ provider: 'vk'
2585
+ });
2586
+ return vk.get('users').auth(accessToken).qs({
2587
+ id: query.raw.user_id,
2588
+ v: '5.122'
2589
+ }).request().then(({ body })=>({
2590
+ username: `${body.response[0].last_name} ${body.response[0].first_name}`,
2591
+ email: query.raw.email
2592
+ }));
2593
+ }
2594
+ },
2595
+ twitch: {
2596
+ enabled: false,
2597
+ icon: 'twitch',
2598
+ grantConfig: {
2599
+ key: '',
2600
+ secret: '',
2601
+ callbackUrl: `${baseURL}/twitch/callback`,
2602
+ scope: [
2603
+ 'user:read:email'
2604
+ ]
2605
+ },
2606
+ async authCallback ({ accessToken, providers }) {
2607
+ const twitch = purest({
2608
+ provider: 'twitch',
2609
+ config: {
2610
+ twitch: {
2611
+ default: {
2612
+ origin: 'https://api.twitch.tv',
2613
+ path: 'helix/{path}',
2614
+ headers: {
2615
+ Authorization: 'Bearer {auth}',
2616
+ 'Client-Id': '{auth}'
2617
+ }
2618
+ }
2619
+ }
2620
+ }
2621
+ });
2622
+ return twitch.get('users').auth(accessToken, providers.twitch.key).request().then(({ body })=>({
2623
+ username: body.data[0].login,
2624
+ email: body.data[0].email
2625
+ }));
2626
+ }
2627
+ },
2628
+ linkedin: {
2629
+ enabled: false,
2630
+ icon: 'linkedin',
2631
+ grantConfig: {
2632
+ key: '',
2633
+ secret: '',
2634
+ callbackUrl: `${baseURL}/linkedin/callback`,
2635
+ scope: [
2636
+ 'r_liteprofile',
2637
+ 'r_emailaddress'
2638
+ ]
2639
+ },
2640
+ async authCallback ({ accessToken }) {
2641
+ const linkedIn = purest({
2642
+ provider: 'linkedin'
2643
+ });
2644
+ const { body: { localizedFirstName } } = await linkedIn.get('me').auth(accessToken).request();
2645
+ const { body: { elements } } = await linkedIn.get('emailAddress?q=members&projection=(elements*(handle~))').auth(accessToken).request();
2646
+ const email = elements[0]['handle~'];
2647
+ return {
2648
+ username: localizedFirstName,
2649
+ email: email.emailAddress
2650
+ };
2651
+ }
2652
+ },
2653
+ cognito: {
2654
+ enabled: false,
2655
+ icon: 'aws',
2656
+ grantConfig: {
2657
+ key: '',
2658
+ secret: '',
2659
+ subdomain: 'my.subdomain.com',
2660
+ callback: `${baseURL}/cognito/callback`,
2661
+ scope: [
2662
+ 'email',
2663
+ 'openid',
2664
+ 'profile'
2665
+ ]
2666
+ },
2667
+ async authCallback ({ query, providers }) {
2668
+ const jwksUrl = new URL(providers.cognito.jwksurl);
2669
+ const idToken = query.id_token;
2670
+ const tokenPayload = await getCognitoPayload({
2671
+ idToken,
2672
+ jwksUrl,
2673
+ purest
2674
+ });
2675
+ return {
2676
+ username: tokenPayload['cognito:username'],
2677
+ email: tokenPayload.email
2678
+ };
2679
+ }
2680
+ },
2681
+ reddit: {
2682
+ enabled: false,
2683
+ icon: 'reddit',
2684
+ grantConfig: {
2685
+ key: '',
2686
+ secret: '',
2687
+ callback: `${baseURL}/reddit/callback`,
2688
+ scope: [
2689
+ 'identity'
2690
+ ]
2691
+ },
2692
+ async authCallback ({ accessToken }) {
2693
+ const reddit = purest({
2694
+ provider: 'reddit',
2695
+ config: {
2696
+ reddit: {
2697
+ default: {
2698
+ origin: 'https://oauth.reddit.com',
2699
+ path: 'api/{version}/{path}',
2700
+ version: 'v1',
2701
+ headers: {
2702
+ Authorization: 'Bearer {auth}',
2703
+ 'user-agent': 'strapi'
2704
+ }
2705
+ }
2706
+ }
2707
+ }
2708
+ });
2709
+ return reddit.get('me').auth(accessToken).request().then(({ body })=>({
2710
+ username: body.name,
2711
+ email: `${body.name}@strapi.io`
2712
+ }));
2713
+ }
2714
+ },
2715
+ auth0: {
2716
+ enabled: false,
2717
+ icon: '',
2718
+ grantConfig: {
2719
+ key: '',
2720
+ secret: '',
2721
+ subdomain: 'my-tenant.eu',
2722
+ callback: `${baseURL}/auth0/callback`,
2723
+ scope: [
2724
+ 'openid',
2725
+ 'email',
2726
+ 'profile'
2727
+ ]
2728
+ },
2729
+ async authCallback ({ accessToken, providers }) {
2730
+ const auth0 = purest({
2731
+ provider: 'auth0'
2732
+ });
2733
+ return auth0.get('userinfo').subdomain(providers.auth0.subdomain).auth(accessToken).request().then(({ body })=>{
2734
+ const username = body.username || body.nickname || body.name || body.email.split('@')[0];
2735
+ const email = body.email || `${username.replace(/\s+/g, '.')}@strapi.io`;
2736
+ return {
2737
+ username,
2738
+ email
2739
+ };
2740
+ });
2741
+ }
2742
+ },
2743
+ cas: {
2744
+ enabled: false,
2745
+ icon: 'book',
2746
+ grantConfig: {
2747
+ key: '',
2748
+ secret: '',
2749
+ callback: `${baseURL}/cas/callback`,
2750
+ scope: [
2751
+ 'openid email'
2752
+ ],
2753
+ subdomain: 'my.subdomain.com/cas'
2754
+ },
2755
+ async authCallback ({ accessToken, providers }) {
2756
+ const cas = purest({
2757
+ provider: 'cas'
2758
+ });
2759
+ return cas.get('oidc/profile').subdomain(providers.cas.subdomain).auth(accessToken).request().then(({ body })=>{
2760
+ // CAS attribute may be in body.attributes or "FLAT", depending on CAS config
2761
+ const username = body.attributes ? body.attributes.strapiusername || body.id || body.sub : body.strapiusername || body.id || body.sub;
2762
+ const email = body.attributes ? body.attributes.strapiemail || body.attributes.email : body.strapiemail || body.email;
2763
+ if (!username || !email) {
2764
+ strapi.log.warn(`CAS Response Body did not contain required attributes: ${JSON.stringify(body)}`);
2765
+ }
2766
+ return {
2767
+ username,
2768
+ email
2769
+ };
2770
+ });
2771
+ }
2772
+ },
2773
+ patreon: {
2774
+ enabled: false,
2775
+ icon: '',
2776
+ grantConfig: {
2777
+ key: '',
2778
+ secret: '',
2779
+ callback: `${baseURL}/patreon/callback`,
2780
+ scope: [
2781
+ 'identity',
2782
+ 'identity[email]'
2783
+ ]
2784
+ },
2785
+ async authCallback ({ accessToken }) {
2786
+ const patreon = purest({
2787
+ provider: 'patreon',
2788
+ config: {
2789
+ patreon: {
2790
+ default: {
2791
+ origin: 'https://www.patreon.com',
2792
+ path: 'api/oauth2/{path}',
2793
+ headers: {
2794
+ authorization: 'Bearer {auth}'
2795
+ }
2796
+ }
2797
+ }
2798
+ }
2799
+ });
2800
+ return patreon.get('v2/identity').auth(accessToken).qs(new URLSearchParams({
2801
+ 'fields[user]': 'full_name,email'
2802
+ }).toString()).request().then(({ body })=>{
2803
+ const patreonData = body.data.attributes;
2804
+ return {
2805
+ username: patreonData.full_name,
2806
+ email: patreonData.email
2807
+ };
2808
+ });
2809
+ }
2810
+ },
2811
+ keycloak: {
2812
+ enabled: false,
2813
+ icon: '',
2814
+ grantConfig: {
2815
+ key: '',
2816
+ secret: '',
2817
+ subdomain: 'myKeycloakProvider.com/realms/myrealm',
2818
+ callback: `${baseURL}/keycloak/callback`,
2819
+ scope: [
2820
+ 'openid',
2821
+ 'email',
2822
+ 'profile'
2823
+ ]
2824
+ },
2825
+ async authCallback ({ accessToken, providers }) {
2826
+ const keycloak = purest({
2827
+ provider: 'keycloak'
2828
+ });
2829
+ return keycloak.subdomain(providers.keycloak.subdomain).get('protocol/openid-connect/userinfo').auth(accessToken).request().then(({ body })=>{
2830
+ return {
2831
+ username: body.preferred_username,
2832
+ email: body.email
2833
+ };
2834
+ });
2835
+ }
2836
+ }
2837
+ });
2838
+ providersRegistry = ()=>{
2839
+ const purest = require$$4;
2840
+ const apiPrefix = strapi.config.get('api.rest.prefix');
2841
+ const baseURL = urljoin(strapi.config.server.url, apiPrefix, 'auth');
2842
+ const authProviders = initProviders({
2843
+ baseURL,
2844
+ purest
2845
+ });
2846
+ /**
2847
+ * @public
2848
+ */ return {
2849
+ getAll () {
2850
+ return authProviders;
2851
+ },
2852
+ get (name) {
2853
+ return authProviders[name];
2854
+ },
2855
+ add (name, config) {
2856
+ authProviders[name] = config;
2857
+ },
2858
+ remove (name) {
2859
+ delete authProviders[name];
2860
+ },
2861
+ /**
2862
+ * @internal
2863
+ */ async run ({ provider, accessToken, query, providers }) {
2864
+ const authProvider = authProviders[provider];
2865
+ assert(authProvider, 'Unknown auth provider');
2866
+ return authProvider.authCallback({
2867
+ accessToken,
2868
+ query,
2869
+ providers,
2870
+ purest
2871
+ });
2872
+ }
2873
+ };
2874
+ };
2875
+ return providersRegistry;
2876
+ }
2877
+
2878
+ var permission;
2879
+ var hasRequiredPermission;
2880
+ function requirePermission() {
2881
+ if (hasRequiredPermission) return permission;
2882
+ hasRequiredPermission = 1;
2883
+ const PUBLIC_ROLE_FILTER = {
2884
+ role: {
2885
+ type: 'public'
2886
+ }
2887
+ };
2888
+ permission = ({ strapi })=>({
2889
+ /**
2890
+ * Find permissions associated to a specific role ID
2891
+ *
2892
+ * @param {number} roleID
2893
+ *
2894
+ * @return {object[]}
2895
+ */ async findRolePermissions (roleID) {
2896
+ return strapi.db.query('plugin::users-permissions.role').load({
2897
+ id: roleID
2898
+ }, 'permissions');
2899
+ },
2900
+ /**
2901
+ * Find permissions for the public role
2902
+ *
2903
+ * @return {object[]}
2904
+ */ async findPublicPermissions () {
2905
+ return strapi.db.query('plugin::users-permissions.permission').findMany({
2906
+ where: PUBLIC_ROLE_FILTER
2907
+ });
2908
+ },
2909
+ /**
2910
+ * Transform a Users-Permissions' action into a content API one
2911
+ *
2912
+ * @param {object} permission
2913
+ * @param {string} permission.action
2914
+ *
2915
+ * @return {{ action: string }}
2916
+ */ toContentAPIPermission (permission) {
2917
+ const { action } = permission;
2918
+ return {
2919
+ action
2920
+ };
2921
+ }
2922
+ });
2923
+ return permission;
2924
+ }
2925
+
2926
+ var services;
2927
+ var hasRequiredServices;
2928
+ function requireServices() {
2929
+ if (hasRequiredServices) return services;
2930
+ hasRequiredServices = 1;
2931
+ const jwt = requireJwt();
2932
+ const providers = requireProviders();
2933
+ const user = requireUser$3();
2934
+ const role = requireRole$3();
2935
+ const usersPermissions = requireUsersPermissions();
2936
+ const providersRegistry = requireProvidersRegistry();
2937
+ const permission = requirePermission();
2938
+ services = {
2939
+ jwt,
2940
+ providers,
2941
+ 'providers-registry': providersRegistry,
2942
+ role,
2943
+ user,
2944
+ 'users-permissions': usersPermissions,
2945
+ permission
2946
+ };
2947
+ return services;
2948
+ }
2949
+
2950
+ var permissions$2;
2951
+ var hasRequiredPermissions$2;
2952
+ function requirePermissions$2() {
2953
+ if (hasRequiredPermissions$2) return permissions$2;
2954
+ hasRequiredPermissions$2 = 1;
2955
+ permissions$2 = [
2956
+ {
2957
+ method: 'GET',
2958
+ path: '/permissions',
2959
+ handler: 'permissions.getPermissions'
2960
+ },
2961
+ {
2962
+ method: 'GET',
2963
+ path: '/policies',
2964
+ handler: 'permissions.getPolicies'
2965
+ },
2966
+ {
2967
+ method: 'GET',
2968
+ path: '/routes',
2969
+ handler: 'permissions.getRoutes'
2970
+ }
2971
+ ];
2972
+ return permissions$2;
2973
+ }
2974
+
2975
+ var settings$1;
2976
+ var hasRequiredSettings$1;
2977
+ function requireSettings$1() {
2978
+ if (hasRequiredSettings$1) return settings$1;
2979
+ hasRequiredSettings$1 = 1;
2980
+ settings$1 = [
2981
+ {
2982
+ method: 'GET',
2983
+ path: '/email-templates',
2984
+ handler: 'settings.getEmailTemplate',
2985
+ config: {
2986
+ policies: [
2987
+ {
2988
+ name: 'admin::hasPermissions',
2989
+ config: {
2990
+ actions: [
2991
+ 'plugin::users-permissions.email-templates.read'
2992
+ ]
2993
+ }
2994
+ }
2995
+ ]
2996
+ }
2997
+ },
2998
+ {
2999
+ method: 'PUT',
3000
+ path: '/email-templates',
3001
+ handler: 'settings.updateEmailTemplate',
3002
+ config: {
3003
+ policies: [
3004
+ {
3005
+ name: 'admin::hasPermissions',
3006
+ config: {
3007
+ actions: [
3008
+ 'plugin::users-permissions.email-templates.update'
3009
+ ]
3010
+ }
3011
+ }
3012
+ ]
3013
+ }
3014
+ },
3015
+ {
3016
+ method: 'GET',
3017
+ path: '/advanced',
3018
+ handler: 'settings.getAdvancedSettings',
3019
+ config: {
3020
+ policies: [
3021
+ {
3022
+ name: 'admin::hasPermissions',
3023
+ config: {
3024
+ actions: [
3025
+ 'plugin::users-permissions.advanced-settings.read'
3026
+ ]
3027
+ }
3028
+ }
3029
+ ]
3030
+ }
3031
+ },
3032
+ {
3033
+ method: 'PUT',
3034
+ path: '/advanced',
3035
+ handler: 'settings.updateAdvancedSettings',
3036
+ config: {
3037
+ policies: [
3038
+ {
3039
+ name: 'admin::hasPermissions',
3040
+ config: {
3041
+ actions: [
3042
+ 'plugin::users-permissions.advanced-settings.update'
3043
+ ]
3044
+ }
3045
+ }
3046
+ ]
3047
+ }
3048
+ },
3049
+ {
3050
+ method: 'GET',
3051
+ path: '/providers',
3052
+ handler: 'settings.getProviders',
3053
+ config: {
3054
+ policies: [
3055
+ {
3056
+ name: 'admin::hasPermissions',
3057
+ config: {
3058
+ actions: [
3059
+ 'plugin::users-permissions.providers.read'
3060
+ ]
3061
+ }
3062
+ }
3063
+ ]
3064
+ }
3065
+ },
3066
+ {
3067
+ method: 'PUT',
3068
+ path: '/providers',
3069
+ handler: 'settings.updateProviders',
3070
+ config: {
3071
+ policies: [
3072
+ {
3073
+ name: 'admin::hasPermissions',
3074
+ config: {
3075
+ actions: [
3076
+ 'plugin::users-permissions.providers.update'
3077
+ ]
3078
+ }
3079
+ }
3080
+ ]
3081
+ }
3082
+ }
3083
+ ];
3084
+ return settings$1;
3085
+ }
3086
+
3087
+ var role$2;
3088
+ var hasRequiredRole$2;
3089
+ function requireRole$2() {
3090
+ if (hasRequiredRole$2) return role$2;
3091
+ hasRequiredRole$2 = 1;
3092
+ role$2 = [
3093
+ {
3094
+ method: 'GET',
3095
+ path: '/roles/:id',
3096
+ handler: 'role.findOne',
3097
+ config: {
3098
+ policies: [
3099
+ {
3100
+ name: 'admin::hasPermissions',
3101
+ config: {
3102
+ actions: [
3103
+ 'plugin::users-permissions.roles.read'
3104
+ ]
3105
+ }
3106
+ }
3107
+ ]
3108
+ }
3109
+ },
3110
+ {
3111
+ method: 'GET',
3112
+ path: '/roles',
3113
+ handler: 'role.find',
3114
+ config: {
3115
+ policies: [
3116
+ {
3117
+ name: 'admin::hasPermissions',
3118
+ config: {
3119
+ actions: [
3120
+ 'plugin::users-permissions.roles.read'
3121
+ ]
3122
+ }
3123
+ }
3124
+ ]
3125
+ }
3126
+ },
3127
+ {
3128
+ method: 'POST',
3129
+ path: '/roles',
3130
+ handler: 'role.createRole',
3131
+ config: {
3132
+ policies: [
3133
+ {
3134
+ name: 'admin::hasPermissions',
3135
+ config: {
3136
+ actions: [
3137
+ 'plugin::users-permissions.roles.create'
3138
+ ]
3139
+ }
3140
+ }
3141
+ ]
3142
+ }
3143
+ },
3144
+ {
3145
+ method: 'PUT',
3146
+ path: '/roles/:role',
3147
+ handler: 'role.updateRole',
3148
+ config: {
3149
+ policies: [
3150
+ {
3151
+ name: 'admin::hasPermissions',
3152
+ config: {
3153
+ actions: [
3154
+ 'plugin::users-permissions.roles.update'
3155
+ ]
3156
+ }
3157
+ }
3158
+ ]
3159
+ }
3160
+ },
3161
+ {
3162
+ method: 'DELETE',
3163
+ path: '/roles/:role',
3164
+ handler: 'role.deleteRole',
3165
+ config: {
3166
+ policies: [
3167
+ {
3168
+ name: 'admin::hasPermissions',
3169
+ config: {
3170
+ actions: [
3171
+ 'plugin::users-permissions.roles.delete'
3172
+ ]
3173
+ }
3174
+ }
3175
+ ]
3176
+ }
3177
+ }
3178
+ ];
3179
+ return role$2;
3180
+ }
3181
+
3182
+ var admin;
3183
+ var hasRequiredAdmin;
3184
+ function requireAdmin() {
3185
+ if (hasRequiredAdmin) return admin;
3186
+ hasRequiredAdmin = 1;
3187
+ const permissionsRoutes = requirePermissions$2();
3188
+ const settingsRoutes = requireSettings$1();
3189
+ const roleRoutes = requireRole$2();
3190
+ admin = {
3191
+ type: 'admin',
3192
+ routes: [
3193
+ ...roleRoutes,
3194
+ ...settingsRoutes,
3195
+ ...permissionsRoutes
3196
+ ]
3197
+ };
3198
+ return admin;
3199
+ }
3200
+
3201
+ var auth$2;
3202
+ var hasRequiredAuth$2;
3203
+ function requireAuth$2() {
3204
+ if (hasRequiredAuth$2) return auth$2;
3205
+ hasRequiredAuth$2 = 1;
3206
+ auth$2 = [
3207
+ {
3208
+ method: 'GET',
3209
+ path: '/connect/(.*)',
3210
+ handler: 'auth.connect',
3211
+ config: {
3212
+ middlewares: [
3213
+ 'plugin::users-permissions.rateLimit'
3214
+ ],
3215
+ prefix: ''
3216
+ }
3217
+ },
3218
+ {
3219
+ method: 'POST',
3220
+ path: '/auth/local',
3221
+ handler: 'auth.callback',
3222
+ config: {
3223
+ middlewares: [
3224
+ 'plugin::users-permissions.rateLimit'
3225
+ ],
3226
+ prefix: ''
3227
+ }
3228
+ },
3229
+ {
3230
+ method: 'POST',
3231
+ path: '/auth/local/register',
3232
+ handler: 'auth.register',
3233
+ config: {
3234
+ middlewares: [
3235
+ 'plugin::users-permissions.rateLimit'
3236
+ ],
3237
+ prefix: ''
3238
+ }
3239
+ },
3240
+ {
3241
+ method: 'GET',
3242
+ path: '/auth/:provider/callback',
3243
+ handler: 'auth.callback',
3244
+ config: {
3245
+ prefix: ''
3246
+ }
3247
+ },
3248
+ {
3249
+ method: 'POST',
3250
+ path: '/auth/forgot-password',
3251
+ handler: 'auth.forgotPassword',
3252
+ config: {
3253
+ middlewares: [
3254
+ 'plugin::users-permissions.rateLimit'
3255
+ ],
3256
+ prefix: ''
3257
+ }
3258
+ },
3259
+ {
3260
+ method: 'POST',
3261
+ path: '/auth/reset-password',
3262
+ handler: 'auth.resetPassword',
3263
+ config: {
3264
+ middlewares: [
3265
+ 'plugin::users-permissions.rateLimit'
3266
+ ],
3267
+ prefix: ''
3268
+ }
3269
+ },
3270
+ {
3271
+ method: 'GET',
3272
+ path: '/auth/email-confirmation',
3273
+ handler: 'auth.emailConfirmation',
3274
+ config: {
3275
+ prefix: ''
3276
+ }
3277
+ },
3278
+ {
3279
+ method: 'POST',
3280
+ path: '/auth/send-email-confirmation',
3281
+ handler: 'auth.sendEmailConfirmation',
3282
+ config: {
3283
+ prefix: ''
3284
+ }
3285
+ },
3286
+ {
3287
+ method: 'POST',
3288
+ path: '/auth/change-password',
3289
+ handler: 'auth.changePassword',
3290
+ config: {
3291
+ middlewares: [
3292
+ 'plugin::users-permissions.rateLimit'
3293
+ ],
3294
+ prefix: ''
3295
+ }
3296
+ }
3297
+ ];
3298
+ return auth$2;
3299
+ }
3300
+
3301
+ var user$2;
3302
+ var hasRequiredUser$2;
3303
+ function requireUser$2() {
3304
+ if (hasRequiredUser$2) return user$2;
3305
+ hasRequiredUser$2 = 1;
3306
+ user$2 = [
3307
+ {
3308
+ method: 'GET',
3309
+ path: '/users/count',
3310
+ handler: 'user.count',
3311
+ config: {
3312
+ prefix: ''
3313
+ }
3314
+ },
3315
+ {
3316
+ method: 'GET',
3317
+ path: '/users',
3318
+ handler: 'user.find',
3319
+ config: {
3320
+ prefix: ''
3321
+ }
3322
+ },
3323
+ {
3324
+ method: 'GET',
3325
+ path: '/users/me',
3326
+ handler: 'user.me',
3327
+ config: {
3328
+ prefix: ''
3329
+ }
3330
+ },
3331
+ {
3332
+ method: 'GET',
3333
+ path: '/users/:id',
3334
+ handler: 'user.findOne',
3335
+ config: {
3336
+ prefix: ''
3337
+ }
3338
+ },
3339
+ {
3340
+ method: 'POST',
3341
+ path: '/users',
3342
+ handler: 'user.create',
3343
+ config: {
3344
+ prefix: ''
3345
+ }
3346
+ },
3347
+ {
3348
+ method: 'PUT',
3349
+ path: '/users/:id',
3350
+ handler: 'user.update',
3351
+ config: {
3352
+ prefix: ''
3353
+ }
3354
+ },
3355
+ {
3356
+ method: 'DELETE',
3357
+ path: '/users/:id',
3358
+ handler: 'user.destroy',
3359
+ config: {
3360
+ prefix: ''
3361
+ }
3362
+ }
3363
+ ];
3364
+ return user$2;
3365
+ }
3366
+
3367
+ var role$1;
3368
+ var hasRequiredRole$1;
3369
+ function requireRole$1() {
3370
+ if (hasRequiredRole$1) return role$1;
3371
+ hasRequiredRole$1 = 1;
3372
+ role$1 = [
3373
+ {
3374
+ method: 'GET',
3375
+ path: '/roles/:id',
3376
+ handler: 'role.findOne'
3377
+ },
3378
+ {
3379
+ method: 'GET',
3380
+ path: '/roles',
3381
+ handler: 'role.find'
3382
+ },
3383
+ {
3384
+ method: 'POST',
3385
+ path: '/roles',
3386
+ handler: 'role.createRole'
3387
+ },
3388
+ {
3389
+ method: 'PUT',
3390
+ path: '/roles/:role',
3391
+ handler: 'role.updateRole'
3392
+ },
3393
+ {
3394
+ method: 'DELETE',
3395
+ path: '/roles/:role',
3396
+ handler: 'role.deleteRole'
3397
+ }
3398
+ ];
3399
+ return role$1;
3400
+ }
3401
+
3402
+ var permissions$1;
3403
+ var hasRequiredPermissions$1;
3404
+ function requirePermissions$1() {
3405
+ if (hasRequiredPermissions$1) return permissions$1;
3406
+ hasRequiredPermissions$1 = 1;
3407
+ permissions$1 = [
3408
+ {
3409
+ method: 'GET',
3410
+ path: '/permissions',
3411
+ handler: 'permissions.getPermissions'
3412
+ }
3413
+ ];
3414
+ return permissions$1;
3415
+ }
3416
+
3417
+ var contentApi;
3418
+ var hasRequiredContentApi;
3419
+ function requireContentApi() {
3420
+ if (hasRequiredContentApi) return contentApi;
3421
+ hasRequiredContentApi = 1;
3422
+ const authRoutes = requireAuth$2();
3423
+ const userRoutes = requireUser$2();
3424
+ const roleRoutes = requireRole$1();
3425
+ const permissionsRoutes = requirePermissions$1();
3426
+ contentApi = {
3427
+ type: 'content-api',
3428
+ routes: [
3429
+ ...authRoutes,
3430
+ ...userRoutes,
3431
+ ...roleRoutes,
3432
+ ...permissionsRoutes
3433
+ ]
3434
+ };
3435
+ return contentApi;
3436
+ }
3437
+
3438
+ var routes;
3439
+ var hasRequiredRoutes;
3440
+ function requireRoutes() {
3441
+ if (hasRequiredRoutes) return routes;
3442
+ hasRequiredRoutes = 1;
3443
+ routes = {
3444
+ admin: requireAdmin(),
3445
+ 'content-api': requireContentApi()
3446
+ };
3447
+ return routes;
3448
+ }
3449
+
3450
+ var auth$1;
3451
+ var hasRequiredAuth$1;
3452
+ function requireAuth$1() {
3453
+ if (hasRequiredAuth$1) return auth$1;
3454
+ hasRequiredAuth$1 = 1;
3455
+ const { yup, validateYupSchema } = require$$1;
3456
+ const callbackSchema = yup.object({
3457
+ identifier: yup.string().required(),
3458
+ password: yup.string().required()
3459
+ });
3460
+ const createRegisterSchema = (config)=>yup.object({
3461
+ email: yup.string().email().required(),
3462
+ username: yup.string().required(),
3463
+ password: yup.string().required().test(async function(value) {
3464
+ if (typeof config?.validatePassword === 'function') {
3465
+ try {
3466
+ const isValid = await config.validatePassword(value);
3467
+ if (!isValid) {
3468
+ return this.createError({
3469
+ message: 'Password validation failed.'
3470
+ });
3471
+ }
3472
+ } catch (error) {
3473
+ return this.createError({
3474
+ message: error.message || 'An error occurred.'
3475
+ });
3476
+ }
3477
+ }
3478
+ return true;
3479
+ })
3480
+ });
3481
+ const sendEmailConfirmationSchema = yup.object({
3482
+ email: yup.string().email().required()
3483
+ });
3484
+ const validateEmailConfirmationSchema = yup.object({
3485
+ confirmation: yup.string().required()
3486
+ });
3487
+ const forgotPasswordSchema = yup.object({
3488
+ email: yup.string().email().required()
3489
+ }).noUnknown();
3490
+ const createResetPasswordSchema = (config)=>yup.object({
3491
+ password: yup.string().required().test(async function(value) {
3492
+ if (typeof config?.validatePassword === 'function') {
3493
+ try {
3494
+ const isValid = await config.validatePassword(value);
3495
+ if (!isValid) {
3496
+ return this.createError({
3497
+ message: 'Password validation failed.'
3498
+ });
3499
+ }
3500
+ } catch (error) {
3501
+ return this.createError({
3502
+ message: error.message || 'An error occurred.'
3503
+ });
3504
+ }
3505
+ }
3506
+ return true;
3507
+ }),
3508
+ passwordConfirmation: yup.string().required().oneOf([
3509
+ yup.ref('password')
3510
+ ], 'Passwords do not match'),
3511
+ code: yup.string().required()
3512
+ }).noUnknown();
3513
+ const createChangePasswordSchema = (config)=>yup.object({
3514
+ password: yup.string().required().test(async function(value) {
3515
+ if (typeof config?.validatePassword === 'function') {
3516
+ try {
3517
+ const isValid = await config.validatePassword(value);
3518
+ if (!isValid) {
3519
+ return this.createError({
3520
+ message: 'Password validation failed.'
3521
+ });
3522
+ }
3523
+ } catch (error) {
3524
+ return this.createError({
3525
+ message: error.message || 'An error occurred.'
3526
+ });
3527
+ }
3528
+ }
3529
+ return true;
3530
+ }),
3531
+ passwordConfirmation: yup.string().required().oneOf([
3532
+ yup.ref('password')
3533
+ ], 'Passwords do not match'),
3534
+ currentPassword: yup.string().required()
3535
+ }).noUnknown();
3536
+ auth$1 = {
3537
+ validateCallbackBody: validateYupSchema(callbackSchema),
3538
+ validateRegisterBody: (payload, config)=>validateYupSchema(createRegisterSchema(config))(payload),
3539
+ validateSendEmailConfirmationBody: validateYupSchema(sendEmailConfirmationSchema),
3540
+ validateEmailConfirmationBody: validateYupSchema(validateEmailConfirmationSchema),
3541
+ validateForgotPasswordBody: validateYupSchema(forgotPasswordSchema),
3542
+ validateResetPasswordBody: (payload, config)=>validateYupSchema(createResetPasswordSchema(config))(payload),
3543
+ validateChangePasswordBody: (payload, config)=>validateYupSchema(createChangePasswordSchema(config))(payload)
3544
+ };
3545
+ return auth$1;
3546
+ }
3547
+
3548
+ var auth;
3549
+ var hasRequiredAuth;
3550
+ function requireAuth() {
3551
+ if (hasRequiredAuth) return auth;
3552
+ hasRequiredAuth = 1;
3553
+ /**
3554
+ * Auth.js controller
3555
+ *
3556
+ * @description: A set of functions called "actions" for managing `Auth`.
3557
+ */ /* eslint-disable no-useless-escape */ const crypto = require$$0$2;
3558
+ const _ = require$$0$3;
3559
+ const { concat, compact, isArray } = require$$0;
3560
+ const utils = require$$1;
3561
+ const { getService } = requireUtils$1();
3562
+ const { validateCallbackBody, validateRegisterBody, validateSendEmailConfirmationBody, validateForgotPasswordBody, validateResetPasswordBody, validateEmailConfirmationBody, validateChangePasswordBody } = requireAuth$1();
3563
+ const { ApplicationError, ValidationError, ForbiddenError } = utils.errors;
3564
+ const sanitizeUser = (user, ctx)=>{
3565
+ const { auth } = ctx.state;
3566
+ const userSchema = strapi.getModel('plugin::users-permissions.user');
3567
+ return strapi.contentAPI.sanitize.output(user, userSchema, {
3568
+ auth
3569
+ });
3570
+ };
3571
+ auth = ({ strapi: strapi1 })=>({
3572
+ async callback (ctx) {
3573
+ const provider = ctx.params.provider || 'local';
3574
+ const params = ctx.request.body;
3575
+ const store = strapi1.store({
3576
+ type: 'plugin',
3577
+ name: 'users-permissions'
3578
+ });
3579
+ const grantSettings = await store.get({
3580
+ key: 'grant'
3581
+ });
3582
+ const grantProvider = provider === 'local' ? 'email' : provider;
3583
+ if (!_.get(grantSettings, [
3584
+ grantProvider,
3585
+ 'enabled'
3586
+ ])) {
3587
+ throw new ApplicationError('This provider is disabled');
3588
+ }
3589
+ if (provider === 'local') {
3590
+ await validateCallbackBody(params);
3591
+ const { identifier } = params;
3592
+ // Check if the user exists.
3593
+ const user = await strapi1.db.query('plugin::users-permissions.user').findOne({
3594
+ where: {
3595
+ provider,
3596
+ $or: [
3597
+ {
3598
+ email: identifier.toLowerCase()
3599
+ },
3600
+ {
3601
+ username: identifier
3602
+ }
3603
+ ]
3604
+ }
3605
+ });
3606
+ if (!user) {
3607
+ throw new ValidationError('Invalid identifier or password');
3608
+ }
3609
+ if (!user.password) {
3610
+ throw new ValidationError('Invalid identifier or password');
3611
+ }
3612
+ const validPassword = await getService('user').validatePassword(params.password, user.password);
3613
+ if (!validPassword) {
3614
+ throw new ValidationError('Invalid identifier or password');
3615
+ }
3616
+ const advancedSettings = await store.get({
3617
+ key: 'advanced'
3618
+ });
3619
+ const requiresConfirmation = _.get(advancedSettings, 'email_confirmation');
3620
+ if (requiresConfirmation && user.confirmed !== true) {
3621
+ throw new ApplicationError('Your account email is not confirmed');
3622
+ }
3623
+ if (user.blocked === true) {
3624
+ throw new ApplicationError('Your account has been blocked by an administrator');
3625
+ }
3626
+ return ctx.send({
3627
+ jwt: getService('jwt').issue({
3628
+ id: user.id
3629
+ }),
3630
+ user: await sanitizeUser(user, ctx)
3631
+ });
3632
+ }
3633
+ // Connect the user with the third-party provider.
3634
+ try {
3635
+ const user = await getService('providers').connect(provider, ctx.query);
3636
+ if (user.blocked) {
3637
+ throw new ForbiddenError('Your account has been blocked by an administrator');
3638
+ }
3639
+ return ctx.send({
3640
+ jwt: getService('jwt').issue({
3641
+ id: user.id
3642
+ }),
3643
+ user: await sanitizeUser(user, ctx)
3644
+ });
3645
+ } catch (error) {
3646
+ throw new ApplicationError(error.message);
3647
+ }
3648
+ },
3649
+ async changePassword (ctx) {
3650
+ if (!ctx.state.user) {
3651
+ throw new ApplicationError('You must be authenticated to reset your password');
3652
+ }
3653
+ const validations = strapi1.config.get('plugin::users-permissions.validationRules');
3654
+ const { currentPassword, password } = await validateChangePasswordBody(ctx.request.body, validations);
3655
+ const user = await strapi1.db.query('plugin::users-permissions.user').findOne({
3656
+ where: {
3657
+ id: ctx.state.user.id
3658
+ }
3659
+ });
3660
+ const validPassword = await getService('user').validatePassword(currentPassword, user.password);
3661
+ if (!validPassword) {
3662
+ throw new ValidationError('The provided current password is invalid');
3663
+ }
3664
+ if (currentPassword === password) {
3665
+ throw new ValidationError('Your new password must be different than your current password');
3666
+ }
3667
+ await getService('user').edit(user.id, {
3668
+ password
3669
+ });
3670
+ ctx.send({
3671
+ jwt: getService('jwt').issue({
3672
+ id: user.id
3673
+ }),
3674
+ user: await sanitizeUser(user, ctx)
3675
+ });
3676
+ },
3677
+ async resetPassword (ctx) {
3678
+ const validations = strapi1.config.get('plugin::users-permissions.validationRules');
3679
+ const { password, passwordConfirmation, code } = await validateResetPasswordBody(ctx.request.body, validations);
3680
+ if (password !== passwordConfirmation) {
3681
+ throw new ValidationError('Passwords do not match');
3682
+ }
3683
+ const user = await strapi1.db.query('plugin::users-permissions.user').findOne({
3684
+ where: {
3685
+ resetPasswordToken: code
3686
+ }
3687
+ });
3688
+ if (!user) {
3689
+ throw new ValidationError('Incorrect code provided');
3690
+ }
3691
+ await getService('user').edit(user.id, {
3692
+ resetPasswordToken: null,
3693
+ password
3694
+ });
3695
+ // Update the user.
3696
+ ctx.send({
3697
+ jwt: getService('jwt').issue({
3698
+ id: user.id
3699
+ }),
3700
+ user: await sanitizeUser(user, ctx)
3701
+ });
3702
+ },
3703
+ async connect (ctx, next) {
3704
+ const grant = require$$6.koa();
3705
+ const providers = await strapi1.store({
3706
+ type: 'plugin',
3707
+ name: 'users-permissions',
3708
+ key: 'grant'
3709
+ }).get();
3710
+ const apiPrefix = strapi1.config.get('api.rest.prefix');
3711
+ const grantConfig = {
3712
+ defaults: {
3713
+ prefix: `${apiPrefix}/connect`
3714
+ },
3715
+ ...providers
3716
+ };
3717
+ const [requestPath] = ctx.request.url.split('?');
3718
+ const provider = requestPath.split('/connect/')[1].split('/')[0];
3719
+ if (!_.get(grantConfig[provider], 'enabled')) {
3720
+ throw new ApplicationError('This provider is disabled');
3721
+ }
3722
+ if (!strapi1.config.server.url.startsWith('http')) {
3723
+ strapi1.log.warn('You are using a third party provider for login. Make sure to set an absolute url in config/server.js. More info here: https://docs.strapi.io/developer-docs/latest/plugins/users-permissions.html#setting-up-the-server-url');
3724
+ }
3725
+ // Ability to pass OAuth callback dynamically
3726
+ const queryCustomCallback = _.get(ctx, 'query.callback');
3727
+ const dynamicSessionCallback = _.get(ctx, 'session.grant.dynamic.callback');
3728
+ const customCallback = queryCustomCallback ?? dynamicSessionCallback;
3729
+ // The custom callback is validated to make sure it's not redirecting to an unwanted actor.
3730
+ if (customCallback !== undefined) {
3731
+ try {
3732
+ // We're extracting the callback validator from the plugin config since it can be user-customized
3733
+ const { validate: validateCallback } = strapi1.plugin('users-permissions').config('callback');
3734
+ await validateCallback(customCallback, grantConfig[provider]);
3735
+ grantConfig[provider].callback = customCallback;
3736
+ } catch (e) {
3737
+ throw new ValidationError('Invalid callback URL provided', {
3738
+ callback: customCallback
3739
+ });
3740
+ }
3741
+ }
3742
+ // Build a valid redirect URI for the current provider
3743
+ grantConfig[provider].redirect_uri = getService('providers').buildRedirectUri(provider);
3744
+ return grant(grantConfig)(ctx, next);
3745
+ },
3746
+ async forgotPassword (ctx) {
3747
+ const { email } = await validateForgotPasswordBody(ctx.request.body);
3748
+ const pluginStore = await strapi1.store({
3749
+ type: 'plugin',
3750
+ name: 'users-permissions'
3751
+ });
3752
+ const emailSettings = await pluginStore.get({
3753
+ key: 'email'
3754
+ });
3755
+ const advancedSettings = await pluginStore.get({
3756
+ key: 'advanced'
3757
+ });
3758
+ // Find the user by email.
3759
+ const user = await strapi1.db.query('plugin::users-permissions.user').findOne({
3760
+ where: {
3761
+ email: email.toLowerCase()
3762
+ }
3763
+ });
3764
+ if (!user || user.blocked) {
3765
+ return ctx.send({
3766
+ ok: true
3767
+ });
3768
+ }
3769
+ // Generate random token.
3770
+ const userInfo = await sanitizeUser(user, ctx);
3771
+ const resetPasswordToken = crypto.randomBytes(64).toString('hex');
3772
+ const resetPasswordSettings = _.get(emailSettings, 'reset_password.options', {});
3773
+ const emailBody = await getService('users-permissions').template(resetPasswordSettings.message, {
3774
+ URL: advancedSettings.email_reset_password,
3775
+ SERVER_URL: strapi1.config.get('server.absoluteUrl'),
3776
+ ADMIN_URL: strapi1.config.get('admin.absoluteUrl'),
3777
+ USER: userInfo,
3778
+ TOKEN: resetPasswordToken
3779
+ });
3780
+ const emailObject = await getService('users-permissions').template(resetPasswordSettings.object, {
3781
+ USER: userInfo
3782
+ });
3783
+ const emailToSend = {
3784
+ to: user.email,
3785
+ from: resetPasswordSettings.from.email || resetPasswordSettings.from.name ? `${resetPasswordSettings.from.name} <${resetPasswordSettings.from.email}>` : undefined,
3786
+ replyTo: resetPasswordSettings.response_email,
3787
+ subject: emailObject,
3788
+ text: emailBody,
3789
+ html: emailBody
3790
+ };
3791
+ // NOTE: Update the user before sending the email so an Admin can generate the link if the email fails
3792
+ await getService('user').edit(user.id, {
3793
+ resetPasswordToken
3794
+ });
3795
+ // Send an email to the user.
3796
+ await strapi1.plugin('email').service('email').send(emailToSend);
3797
+ ctx.send({
3798
+ ok: true
3799
+ });
3800
+ },
3801
+ async register (ctx) {
3802
+ const pluginStore = await strapi1.store({
3803
+ type: 'plugin',
3804
+ name: 'users-permissions'
3805
+ });
3806
+ const settings = await pluginStore.get({
3807
+ key: 'advanced'
3808
+ });
3809
+ if (!settings.allow_register) {
3810
+ throw new ApplicationError('Register action is currently disabled');
3811
+ }
3812
+ const { register } = strapi1.config.get('plugin::users-permissions');
3813
+ const alwaysAllowedKeys = [
3814
+ 'username',
3815
+ 'password',
3816
+ 'email'
3817
+ ];
3818
+ // Note that we intentionally do not filter allowedFields to allow a project to explicitly accept private or other Strapi field on registration
3819
+ const allowedKeys = compact(concat(alwaysAllowedKeys, isArray(register?.allowedFields) ? register.allowedFields : []));
3820
+ // Check if there are any keys in requestBody that are not in allowedKeys
3821
+ const invalidKeys = Object.keys(ctx.request.body).filter((key)=>!allowedKeys.includes(key));
3822
+ if (invalidKeys.length > 0) {
3823
+ // If there are invalid keys, throw an error
3824
+ throw new ValidationError(`Invalid parameters: ${invalidKeys.join(', ')}`);
3825
+ }
3826
+ const params = {
3827
+ ..._.pick(ctx.request.body, allowedKeys),
3828
+ provider: 'local'
3829
+ };
3830
+ const validations = strapi1.config.get('plugin::users-permissions.validationRules');
3831
+ await validateRegisterBody(params, validations);
3832
+ const role = await strapi1.db.query('plugin::users-permissions.role').findOne({
3833
+ where: {
3834
+ type: settings.default_role
3835
+ }
3836
+ });
3837
+ if (!role) {
3838
+ throw new ApplicationError('Impossible to find the default role');
3839
+ }
3840
+ const { email, username, provider } = params;
3841
+ const identifierFilter = {
3842
+ $or: [
3843
+ {
3844
+ email: email.toLowerCase()
3845
+ },
3846
+ {
3847
+ username: email.toLowerCase()
3848
+ },
3849
+ {
3850
+ username
3851
+ },
3852
+ {
3853
+ email: username
3854
+ }
3855
+ ]
3856
+ };
3857
+ const conflictingUserCount = await strapi1.db.query('plugin::users-permissions.user').count({
3858
+ where: {
3859
+ ...identifierFilter,
3860
+ provider
3861
+ }
3862
+ });
3863
+ if (conflictingUserCount > 0) {
3864
+ throw new ApplicationError('Email or Username are already taken');
3865
+ }
3866
+ if (settings.unique_email) {
3867
+ const conflictingUserCount = await strapi1.db.query('plugin::users-permissions.user').count({
3868
+ where: {
3869
+ ...identifierFilter
3870
+ }
3871
+ });
3872
+ if (conflictingUserCount > 0) {
3873
+ throw new ApplicationError('Email or Username are already taken');
3874
+ }
3875
+ }
3876
+ const newUser = {
3877
+ ...params,
3878
+ role: role.id,
3879
+ email: email.toLowerCase(),
3880
+ username,
3881
+ confirmed: !settings.email_confirmation
3882
+ };
3883
+ const user = await getService('user').add(newUser);
3884
+ const sanitizedUser = await sanitizeUser(user, ctx);
3885
+ if (settings.email_confirmation) {
3886
+ try {
3887
+ await getService('user').sendConfirmationEmail(sanitizedUser);
3888
+ } catch (err) {
3889
+ strapi1.log.error(err);
3890
+ throw new ApplicationError('Error sending confirmation email');
3891
+ }
3892
+ return ctx.send({
3893
+ user: sanitizedUser
3894
+ });
3895
+ }
3896
+ const jwt = getService('jwt').issue(_.pick(user, [
3897
+ 'id'
3898
+ ]));
3899
+ return ctx.send({
3900
+ jwt,
3901
+ user: sanitizedUser
3902
+ });
3903
+ },
3904
+ async emailConfirmation (ctx, next, returnUser) {
3905
+ const { confirmation: confirmationToken } = await validateEmailConfirmationBody(ctx.query);
3906
+ const userService = getService('user');
3907
+ const jwtService = getService('jwt');
3908
+ const [user] = await userService.fetchAll({
3909
+ filters: {
3910
+ confirmationToken
3911
+ }
3912
+ });
3913
+ if (!user) {
3914
+ throw new ValidationError('Invalid token');
3915
+ }
3916
+ await userService.edit(user.id, {
3917
+ confirmed: true,
3918
+ confirmationToken: null
3919
+ });
3920
+ if (returnUser) {
3921
+ ctx.send({
3922
+ jwt: jwtService.issue({
3923
+ id: user.id
3924
+ }),
3925
+ user: await sanitizeUser(user, ctx)
3926
+ });
3927
+ } else {
3928
+ const settings = await strapi1.store({
3929
+ type: 'plugin',
3930
+ name: 'users-permissions',
3931
+ key: 'advanced'
3932
+ }).get();
3933
+ ctx.redirect(settings.email_confirmation_redirection || '/');
3934
+ }
3935
+ },
3936
+ async sendEmailConfirmation (ctx) {
3937
+ const { email } = await validateSendEmailConfirmationBody(ctx.request.body);
3938
+ const user = await strapi1.db.query('plugin::users-permissions.user').findOne({
3939
+ where: {
3940
+ email: email.toLowerCase()
3941
+ }
3942
+ });
3943
+ if (!user) {
3944
+ return ctx.send({
3945
+ email,
3946
+ sent: true
3947
+ });
3948
+ }
3949
+ if (user.confirmed) {
3950
+ throw new ApplicationError('Already confirmed');
3951
+ }
3952
+ if (user.blocked) {
3953
+ throw new ApplicationError('User blocked');
3954
+ }
3955
+ await getService('user').sendConfirmationEmail(user);
3956
+ ctx.send({
3957
+ email: user.email,
3958
+ sent: true
3959
+ });
3960
+ }
3961
+ });
3962
+ return auth;
3963
+ }
3964
+
3965
+ var user$1;
3966
+ var hasRequiredUser$1;
3967
+ function requireUser$1() {
3968
+ if (hasRequiredUser$1) return user$1;
3969
+ hasRequiredUser$1 = 1;
3970
+ const { yup, validateYupSchema } = require$$1;
3971
+ const deleteRoleSchema = yup.object().shape({
3972
+ role: yup.strapiID().required()
3973
+ });
3974
+ const createUserBodySchema = yup.object().shape({
3975
+ email: yup.string().email().required(),
3976
+ username: yup.string().min(1).required(),
3977
+ password: yup.string().min(1).required(),
3978
+ role: yup.lazy((value)=>typeof value === 'object' ? yup.object().shape({
3979
+ connect: yup.array().of(yup.object().shape({
3980
+ id: yup.strapiID().required()
3981
+ })).min(1, 'Users must have a role').required()
3982
+ }).required() : yup.strapiID().required())
3983
+ });
3984
+ const updateUserBodySchema = yup.object().shape({
3985
+ email: yup.string().email().min(1),
3986
+ username: yup.string().min(1),
3987
+ password: yup.string().min(1),
3988
+ role: yup.lazy((value)=>typeof value === 'object' ? yup.object().shape({
3989
+ connect: yup.array().of(yup.object().shape({
3990
+ id: yup.strapiID().required()
3991
+ })).required(),
3992
+ disconnect: yup.array().test('CheckDisconnect', 'Cannot remove role', function test(disconnectValue) {
3993
+ if (value.connect.length === 0 && disconnectValue.length > 0) {
3994
+ return false;
3995
+ }
3996
+ return true;
3997
+ }).required()
3998
+ }) : yup.strapiID())
3999
+ });
4000
+ user$1 = {
4001
+ validateCreateUserBody: validateYupSchema(createUserBodySchema),
4002
+ validateUpdateUserBody: validateYupSchema(updateUserBodySchema),
4003
+ validateDeleteRoleBody: validateYupSchema(deleteRoleSchema)
4004
+ };
4005
+ return user$1;
4006
+ }
4007
+
4008
+ var user;
4009
+ var hasRequiredUser;
4010
+ function requireUser() {
4011
+ if (hasRequiredUser) return user;
4012
+ hasRequiredUser = 1;
4013
+ /**
4014
+ * User.js controller
4015
+ *
4016
+ * @description: A set of functions called "actions" for managing `User`.
4017
+ */ const _ = require$$0$3;
4018
+ const utils = require$$1;
4019
+ const { getService } = requireUtils$1();
4020
+ const { validateCreateUserBody, validateUpdateUserBody } = requireUser$1();
4021
+ const { ApplicationError, ValidationError, NotFoundError } = utils.errors;
4022
+ const sanitizeOutput = async (user, ctx)=>{
4023
+ const schema = strapi.getModel('plugin::users-permissions.user');
4024
+ const { auth } = ctx.state;
4025
+ return strapi.contentAPI.sanitize.output(user, schema, {
4026
+ auth
4027
+ });
4028
+ };
4029
+ const validateQuery = async (query, ctx)=>{
4030
+ const schema = strapi.getModel('plugin::users-permissions.user');
4031
+ const { auth } = ctx.state;
4032
+ return strapi.contentAPI.validate.query(query, schema, {
4033
+ auth
4034
+ });
4035
+ };
4036
+ const sanitizeQuery = async (query, ctx)=>{
4037
+ const schema = strapi.getModel('plugin::users-permissions.user');
4038
+ const { auth } = ctx.state;
4039
+ return strapi.contentAPI.sanitize.query(query, schema, {
4040
+ auth
4041
+ });
4042
+ };
4043
+ user = {
4044
+ /**
4045
+ * Create a/an user record.
4046
+ * @return {Object}
4047
+ */ async create (ctx) {
4048
+ const advanced = await strapi.store({
4049
+ type: 'plugin',
4050
+ name: 'users-permissions',
4051
+ key: 'advanced'
4052
+ }).get();
4053
+ await validateCreateUserBody(ctx.request.body);
4054
+ const { email, username, role } = ctx.request.body;
4055
+ const userWithSameUsername = await strapi.db.query('plugin::users-permissions.user').findOne({
4056
+ where: {
4057
+ username
4058
+ }
4059
+ });
4060
+ if (userWithSameUsername) {
4061
+ if (!email) throw new ApplicationError('Username already taken');
4062
+ }
4063
+ if (advanced.unique_email) {
4064
+ const userWithSameEmail = await strapi.db.query('plugin::users-permissions.user').findOne({
4065
+ where: {
4066
+ email: email.toLowerCase()
4067
+ }
4068
+ });
4069
+ if (userWithSameEmail) {
4070
+ throw new ApplicationError('Email already taken');
4071
+ }
4072
+ }
4073
+ const user = {
4074
+ ...ctx.request.body,
4075
+ email: email.toLowerCase(),
4076
+ provider: 'local'
4077
+ };
4078
+ if (!role) {
4079
+ const defaultRole = await strapi.db.query('plugin::users-permissions.role').findOne({
4080
+ where: {
4081
+ type: advanced.default_role
4082
+ }
4083
+ });
4084
+ user.role = defaultRole.id;
4085
+ }
4086
+ try {
4087
+ const data = await getService('user').add(user);
4088
+ const sanitizedData = await sanitizeOutput(data, ctx);
4089
+ ctx.created(sanitizedData);
4090
+ } catch (error) {
4091
+ throw new ApplicationError(error.message);
4092
+ }
4093
+ },
4094
+ /**
4095
+ * Update a/an user record.
4096
+ * @return {Object}
4097
+ */ async update (ctx) {
4098
+ const advancedConfigs = await strapi.store({
4099
+ type: 'plugin',
4100
+ name: 'users-permissions',
4101
+ key: 'advanced'
4102
+ }).get();
4103
+ const { id } = ctx.params;
4104
+ const { email, username, password } = ctx.request.body;
4105
+ const user = await getService('user').fetch(id);
4106
+ if (!user) {
4107
+ throw new NotFoundError(`User not found`);
4108
+ }
4109
+ await validateUpdateUserBody(ctx.request.body);
4110
+ if (user.provider === 'local' && _.has(ctx.request.body, 'password') && !password) {
4111
+ throw new ValidationError('password.notNull');
4112
+ }
4113
+ if (_.has(ctx.request.body, 'username')) {
4114
+ const userWithSameUsername = await strapi.db.query('plugin::users-permissions.user').findOne({
4115
+ where: {
4116
+ username
4117
+ }
4118
+ });
4119
+ if (userWithSameUsername && _.toString(userWithSameUsername.id) !== _.toString(id)) {
4120
+ throw new ApplicationError('Username already taken');
4121
+ }
4122
+ }
4123
+ if (_.has(ctx.request.body, 'email') && advancedConfigs.unique_email) {
4124
+ const userWithSameEmail = await strapi.db.query('plugin::users-permissions.user').findOne({
4125
+ where: {
4126
+ email: email.toLowerCase()
4127
+ }
4128
+ });
4129
+ if (userWithSameEmail && _.toString(userWithSameEmail.id) !== _.toString(id)) {
4130
+ throw new ApplicationError('Email already taken');
4131
+ }
4132
+ ctx.request.body.email = ctx.request.body.email.toLowerCase();
4133
+ }
4134
+ const updateData = {
4135
+ ...ctx.request.body
4136
+ };
4137
+ const data = await getService('user').edit(user.id, updateData);
4138
+ const sanitizedData = await sanitizeOutput(data, ctx);
4139
+ ctx.send(sanitizedData);
4140
+ },
4141
+ /**
4142
+ * Retrieve user records.
4143
+ * @return {Object|Array}
4144
+ */ async find (ctx) {
4145
+ await validateQuery(ctx.query, ctx);
4146
+ const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);
4147
+ const users = await getService('user').fetchAll(sanitizedQuery);
4148
+ ctx.body = await Promise.all(users.map((user)=>sanitizeOutput(user, ctx)));
4149
+ },
4150
+ /**
4151
+ * Retrieve a user record.
4152
+ * @return {Object}
4153
+ */ async findOne (ctx) {
4154
+ const { id } = ctx.params;
4155
+ await validateQuery(ctx.query, ctx);
4156
+ const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);
4157
+ let data = await getService('user').fetch(id, sanitizedQuery);
4158
+ if (data) {
4159
+ data = await sanitizeOutput(data, ctx);
4160
+ }
4161
+ ctx.body = data;
4162
+ },
4163
+ /**
4164
+ * Retrieve user count.
4165
+ * @return {Number}
4166
+ */ async count (ctx) {
4167
+ await validateQuery(ctx.query, ctx);
4168
+ const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);
4169
+ ctx.body = await getService('user').count(sanitizedQuery);
4170
+ },
4171
+ /**
4172
+ * Destroy a/an user record.
4173
+ * @return {Object}
4174
+ */ async destroy (ctx) {
4175
+ const { id } = ctx.params;
4176
+ const data = await getService('user').remove({
4177
+ id
4178
+ });
4179
+ const sanitizedUser = await sanitizeOutput(data, ctx);
4180
+ ctx.send(sanitizedUser);
4181
+ },
4182
+ /**
4183
+ * Retrieve authenticated user.
4184
+ * @return {Object|Array}
4185
+ */ async me (ctx) {
4186
+ const authUser = ctx.state.user;
4187
+ const { query } = ctx;
4188
+ if (!authUser) {
4189
+ return ctx.unauthorized();
4190
+ }
4191
+ await validateQuery(query, ctx);
4192
+ const sanitizedQuery = await sanitizeQuery(query, ctx);
4193
+ const user = await getService('user').fetch(authUser.id, sanitizedQuery);
4194
+ ctx.body = await sanitizeOutput(user, ctx);
4195
+ }
4196
+ };
4197
+ return user;
4198
+ }
4199
+
4200
+ var role;
4201
+ var hasRequiredRole;
4202
+ function requireRole() {
4203
+ if (hasRequiredRole) return role;
4204
+ hasRequiredRole = 1;
4205
+ const _ = require$$0$3;
4206
+ const { async, errors } = require$$1;
4207
+ const { getService } = requireUtils$1();
4208
+ const { validateDeleteRoleBody } = requireUser$1();
4209
+ const { ApplicationError, ValidationError } = errors;
4210
+ const sanitizeOutput = async (role)=>{
4211
+ const { sanitizeLocalizationFields } = strapi.plugin('i18n').service('sanitize');
4212
+ const schema = strapi.getModel('plugin::users-permissions.role');
4213
+ return async.pipe(sanitizeLocalizationFields(schema))(role);
4214
+ };
4215
+ role = {
4216
+ /**
4217
+ * Default action.
4218
+ *
4219
+ * @return {Object}
4220
+ */ async createRole (ctx) {
4221
+ if (_.isEmpty(ctx.request.body)) {
4222
+ throw new ValidationError('Request body cannot be empty');
4223
+ }
4224
+ await getService('role').createRole(ctx.request.body);
4225
+ ctx.send({
4226
+ ok: true
4227
+ });
4228
+ },
4229
+ async findOne (ctx) {
4230
+ const { id } = ctx.params;
4231
+ const role = await getService('role').findOne(id);
4232
+ if (!role) {
4233
+ return ctx.notFound();
4234
+ }
4235
+ const safeRole = await sanitizeOutput(role);
4236
+ ctx.send({
4237
+ role: safeRole
4238
+ });
4239
+ },
4240
+ async find (ctx) {
4241
+ const roles = await getService('role').find();
4242
+ const safeRoles = await Promise.all(roles.map(sanitizeOutput));
4243
+ ctx.send({
4244
+ roles: safeRoles
4245
+ });
4246
+ },
4247
+ async updateRole (ctx) {
4248
+ const roleID = ctx.params.role;
4249
+ if (_.isEmpty(ctx.request.body)) {
4250
+ throw new ValidationError('Request body cannot be empty');
4251
+ }
4252
+ await getService('role').updateRole(roleID, ctx.request.body);
4253
+ ctx.send({
4254
+ ok: true
4255
+ });
4256
+ },
4257
+ async deleteRole (ctx) {
4258
+ const roleID = ctx.params.role;
4259
+ if (!roleID) {
4260
+ await validateDeleteRoleBody(ctx.params);
4261
+ }
4262
+ // Fetch public role.
4263
+ const publicRole = await strapi.db.query('plugin::users-permissions.role').findOne({
4264
+ where: {
4265
+ type: 'public'
4266
+ }
4267
+ });
4268
+ const publicRoleID = publicRole.id;
4269
+ // Prevent from removing the public role.
4270
+ if (roleID.toString() === publicRoleID.toString()) {
4271
+ throw new ApplicationError('Cannot delete public role');
4272
+ }
4273
+ await getService('role').deleteRole(roleID, publicRoleID);
4274
+ ctx.send({
4275
+ ok: true
4276
+ });
4277
+ }
4278
+ };
4279
+ return role;
4280
+ }
4281
+
4282
+ var permissions;
4283
+ var hasRequiredPermissions;
4284
+ function requirePermissions() {
4285
+ if (hasRequiredPermissions) return permissions;
4286
+ hasRequiredPermissions = 1;
4287
+ const _ = require$$0$3;
4288
+ const { getService } = requireUtils$1();
4289
+ permissions = {
4290
+ async getPermissions (ctx) {
4291
+ const permissions = await getService('users-permissions').getActions();
4292
+ ctx.send({
4293
+ permissions
4294
+ });
4295
+ },
4296
+ async getPolicies (ctx) {
4297
+ const policies = _.keys(strapi.plugin('users-permissions').policies);
4298
+ ctx.send({
4299
+ policies: _.without(policies, 'permissions')
4300
+ });
4301
+ },
4302
+ async getRoutes (ctx) {
4303
+ const routes = await getService('users-permissions').getRoutes();
4304
+ ctx.send({
4305
+ routes
4306
+ });
4307
+ }
4308
+ };
4309
+ return permissions;
4310
+ }
4311
+
4312
+ var emailTemplate;
4313
+ var hasRequiredEmailTemplate;
4314
+ function requireEmailTemplate() {
4315
+ if (hasRequiredEmailTemplate) return emailTemplate;
4316
+ hasRequiredEmailTemplate = 1;
4317
+ const { trim } = require$$0;
4318
+ const { template: { createLooseInterpolationRegExp, createStrictInterpolationRegExp } } = require$$1;
4319
+ const invalidPatternsRegexes = [
4320
+ // Ignore "evaluation" patterns: <% ... %>
4321
+ /<%[^=]([\s\S]*?)%>/m,
4322
+ // Ignore basic string interpolations
4323
+ /\${([^{}]*)}/m
4324
+ ];
4325
+ const authorizedKeys = [
4326
+ 'URL',
4327
+ 'ADMIN_URL',
4328
+ 'SERVER_URL',
4329
+ 'CODE',
4330
+ 'USER',
4331
+ 'USER.email',
4332
+ 'USER.username',
4333
+ 'TOKEN'
4334
+ ];
4335
+ const matchAll = (pattern, src)=>{
4336
+ const matches = [];
4337
+ let match;
4338
+ const regexPatternWithGlobal = RegExp(pattern, 'g');
4339
+ // eslint-disable-next-line no-cond-assign
4340
+ while(match = regexPatternWithGlobal.exec(src)){
4341
+ const [, group] = match;
4342
+ matches.push(trim(group));
4343
+ }
4344
+ return matches;
4345
+ };
4346
+ const isValidEmailTemplate = (template)=>{
4347
+ // Check for known invalid patterns
4348
+ for (const reg of invalidPatternsRegexes){
4349
+ if (reg.test(template)) {
4350
+ return false;
4351
+ }
4352
+ }
4353
+ const interpolation = {
4354
+ // Strict interpolation pattern to match only valid groups
4355
+ strict: createStrictInterpolationRegExp(authorizedKeys),
4356
+ // Weak interpolation pattern to match as many group as possible.
4357
+ loose: createLooseInterpolationRegExp()
4358
+ };
4359
+ // Compute both strict & loose matches
4360
+ const strictMatches = matchAll(interpolation.strict, template);
4361
+ const looseMatches = matchAll(interpolation.loose, template);
4362
+ // If we have more matches with the loose RegExp than with the strict one,
4363
+ // then it means that at least one of the interpolation group is invalid
4364
+ // Note: In the future, if we wanted to give more details for error formatting
4365
+ // purposes, we could return the difference between the two arrays
4366
+ if (looseMatches.length > strictMatches.length) {
4367
+ return false;
4368
+ }
4369
+ return true;
4370
+ };
4371
+ emailTemplate = {
4372
+ isValidEmailTemplate
4373
+ };
4374
+ return emailTemplate;
4375
+ }
4376
+
4377
+ var settings;
4378
+ var hasRequiredSettings;
4379
+ function requireSettings() {
4380
+ if (hasRequiredSettings) return settings;
4381
+ hasRequiredSettings = 1;
4382
+ const _ = require$$0$3;
4383
+ const { ValidationError } = require$$1.errors;
4384
+ const { getService } = requireUtils$1();
4385
+ const { isValidEmailTemplate } = requireEmailTemplate();
4386
+ settings = {
4387
+ async getEmailTemplate (ctx) {
4388
+ ctx.send(await strapi.store({
4389
+ type: 'plugin',
4390
+ name: 'users-permissions',
4391
+ key: 'email'
4392
+ }).get());
4393
+ },
4394
+ async updateEmailTemplate (ctx) {
4395
+ if (_.isEmpty(ctx.request.body)) {
4396
+ throw new ValidationError('Request body cannot be empty');
4397
+ }
4398
+ const emailTemplates = ctx.request.body['email-templates'];
4399
+ for (const key of Object.keys(emailTemplates)){
4400
+ const template = emailTemplates[key].options.message;
4401
+ if (!isValidEmailTemplate(template)) {
4402
+ throw new ValidationError('Invalid template');
4403
+ }
4404
+ }
4405
+ await strapi.store({
4406
+ type: 'plugin',
4407
+ name: 'users-permissions',
4408
+ key: 'email'
4409
+ }).set({
4410
+ value: emailTemplates
4411
+ });
4412
+ ctx.send({
4413
+ ok: true
4414
+ });
4415
+ },
4416
+ async getAdvancedSettings (ctx) {
4417
+ const settings = await strapi.store({
4418
+ type: 'plugin',
4419
+ name: 'users-permissions',
4420
+ key: 'advanced'
4421
+ }).get();
4422
+ const roles = await getService('role').find();
4423
+ ctx.send({
4424
+ settings,
4425
+ roles
4426
+ });
4427
+ },
4428
+ async updateAdvancedSettings (ctx) {
4429
+ if (_.isEmpty(ctx.request.body)) {
4430
+ throw new ValidationError('Request body cannot be empty');
4431
+ }
4432
+ await strapi.store({
4433
+ type: 'plugin',
4434
+ name: 'users-permissions',
4435
+ key: 'advanced'
4436
+ }).set({
4437
+ value: ctx.request.body
4438
+ });
4439
+ ctx.send({
4440
+ ok: true
4441
+ });
4442
+ },
4443
+ async getProviders (ctx) {
4444
+ const providers = await strapi.store({
4445
+ type: 'plugin',
4446
+ name: 'users-permissions',
4447
+ key: 'grant'
4448
+ }).get();
4449
+ for(const provider in providers){
4450
+ if (provider !== 'email') {
4451
+ providers[provider].redirectUri = strapi.plugin('users-permissions').service('providers').buildRedirectUri(provider);
4452
+ }
4453
+ }
4454
+ ctx.send(providers);
4455
+ },
4456
+ async updateProviders (ctx) {
4457
+ if (_.isEmpty(ctx.request.body)) {
4458
+ throw new ValidationError('Request body cannot be empty');
4459
+ }
4460
+ await strapi.store({
4461
+ type: 'plugin',
4462
+ name: 'users-permissions',
4463
+ key: 'grant'
4464
+ }).set({
4465
+ value: ctx.request.body.providers
4466
+ });
4467
+ ctx.send({
4468
+ ok: true
4469
+ });
4470
+ }
4471
+ };
4472
+ return settings;
4473
+ }
4474
+
4475
+ var contentManagerUser;
4476
+ var hasRequiredContentManagerUser;
4477
+ function requireContentManagerUser() {
4478
+ if (hasRequiredContentManagerUser) return contentManagerUser;
4479
+ hasRequiredContentManagerUser = 1;
4480
+ const _ = require$$0$3;
4481
+ const { contentTypes: contentTypesUtils } = require$$1;
4482
+ const { ApplicationError, ValidationError, NotFoundError, ForbiddenError } = require$$1.errors;
4483
+ const { validateCreateUserBody, validateUpdateUserBody } = requireUser$1();
4484
+ const { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = contentTypesUtils.constants;
4485
+ const userModel = 'plugin::users-permissions.user';
4486
+ const ACTIONS = {
4487
+ read: 'plugin::content-manager.explorer.read',
4488
+ create: 'plugin::content-manager.explorer.create',
4489
+ edit: 'plugin::content-manager.explorer.update',
4490
+ delete: 'plugin::content-manager.explorer.delete'
4491
+ };
4492
+ const findEntityAndCheckPermissions = async (ability, action, model, id)=>{
4493
+ const doc = await strapi.service('plugin::content-manager.document-manager').findOne(id, model, {
4494
+ populate: [
4495
+ `${CREATED_BY_ATTRIBUTE}.roles`
4496
+ ]
4497
+ });
4498
+ if (_.isNil(doc)) {
4499
+ throw new NotFoundError();
4500
+ }
4501
+ const pm = strapi.service('admin::permission').createPermissionsManager({
4502
+ ability,
4503
+ action,
4504
+ model
4505
+ });
4506
+ if (pm.ability.cannot(pm.action, pm.toSubject(doc))) {
4507
+ throw new ForbiddenError();
4508
+ }
4509
+ const docWithoutCreatorRoles = _.omit(doc, `${CREATED_BY_ATTRIBUTE}.roles`);
4510
+ return {
4511
+ pm,
4512
+ doc: docWithoutCreatorRoles
4513
+ };
4514
+ };
4515
+ contentManagerUser = {
4516
+ /**
4517
+ * Create a/an user record.
4518
+ * @return {Object}
4519
+ */ async create (ctx) {
4520
+ const { body } = ctx.request;
4521
+ const { user: admin, userAbility } = ctx.state;
4522
+ const { email, username } = body;
4523
+ const pm = strapi.service('admin::permission').createPermissionsManager({
4524
+ ability: userAbility,
4525
+ action: ACTIONS.create,
4526
+ model: userModel
4527
+ });
4528
+ if (!pm.isAllowed) {
4529
+ return ctx.forbidden();
4530
+ }
4531
+ const sanitizedBody = await pm.pickPermittedFieldsOf(body, {
4532
+ subject: userModel
4533
+ });
4534
+ const advanced = await strapi.store({
4535
+ type: 'plugin',
4536
+ name: 'users-permissions',
4537
+ key: 'advanced'
4538
+ }).get();
4539
+ await validateCreateUserBody(ctx.request.body);
4540
+ const userWithSameUsername = await strapi.db.query('plugin::users-permissions.user').findOne({
4541
+ where: {
4542
+ username
4543
+ }
4544
+ });
4545
+ if (userWithSameUsername) {
4546
+ throw new ApplicationError('Username already taken');
4547
+ }
4548
+ if (advanced.unique_email) {
4549
+ const userWithSameEmail = await strapi.db.query('plugin::users-permissions.user').findOne({
4550
+ where: {
4551
+ email: email.toLowerCase()
4552
+ }
4553
+ });
4554
+ if (userWithSameEmail) {
4555
+ throw new ApplicationError('Email already taken');
4556
+ }
4557
+ }
4558
+ const user = {
4559
+ ...sanitizedBody,
4560
+ provider: 'local',
4561
+ [CREATED_BY_ATTRIBUTE]: admin.id,
4562
+ [UPDATED_BY_ATTRIBUTE]: admin.id
4563
+ };
4564
+ user.email = _.toLower(user.email);
4565
+ try {
4566
+ const data = await strapi.service('plugin::content-manager.document-manager').create(userModel, {
4567
+ data: user
4568
+ });
4569
+ const sanitizedData = await pm.sanitizeOutput(data, {
4570
+ action: ACTIONS.read
4571
+ });
4572
+ ctx.created(sanitizedData);
4573
+ } catch (error) {
4574
+ throw new ApplicationError(error.message);
4575
+ }
4576
+ },
4577
+ /**
4578
+ * Update a/an user record.
4579
+ * @return {Object}
4580
+ */ async update (ctx) {
4581
+ const { id: documentId } = ctx.params;
4582
+ const { body } = ctx.request;
4583
+ const { user: admin, userAbility } = ctx.state;
4584
+ const advancedConfigs = await strapi.store({
4585
+ type: 'plugin',
4586
+ name: 'users-permissions',
4587
+ key: 'advanced'
4588
+ }).get();
4589
+ const { email, username, password } = body;
4590
+ const { pm, doc } = await findEntityAndCheckPermissions(userAbility, ACTIONS.edit, userModel, documentId);
4591
+ const user = doc;
4592
+ await validateUpdateUserBody(ctx.request.body);
4593
+ if (_.has(body, 'password') && !password && user.provider === 'local') {
4594
+ throw new ValidationError('password.notNull');
4595
+ }
4596
+ if (_.has(body, 'username')) {
4597
+ const userWithSameUsername = await strapi.db.query('plugin::users-permissions.user').findOne({
4598
+ where: {
4599
+ username
4600
+ }
4601
+ });
4602
+ if (userWithSameUsername && _.toString(userWithSameUsername.id) !== _.toString(user.id)) {
4603
+ throw new ApplicationError('Username already taken');
4604
+ }
4605
+ }
4606
+ if (_.has(body, 'email') && advancedConfigs.unique_email) {
4607
+ const userWithSameEmail = await strapi.db.query('plugin::users-permissions.user').findOne({
4608
+ where: {
4609
+ email: _.toLower(email)
4610
+ }
4611
+ });
4612
+ if (userWithSameEmail && _.toString(userWithSameEmail.id) !== _.toString(user.id)) {
4613
+ throw new ApplicationError('Email already taken');
4614
+ }
4615
+ body.email = _.toLower(body.email);
4616
+ }
4617
+ const sanitizedData = await pm.pickPermittedFieldsOf(body, {
4618
+ subject: pm.toSubject(user)
4619
+ });
4620
+ const updateData = _.omit({
4621
+ ...sanitizedData,
4622
+ updatedBy: admin.id
4623
+ }, 'createdBy');
4624
+ const data = await strapi.service('plugin::content-manager.document-manager').update(documentId, userModel, {
4625
+ data: updateData
4626
+ });
4627
+ ctx.body = await pm.sanitizeOutput(data, {
4628
+ action: ACTIONS.read
4629
+ });
4630
+ }
4631
+ };
4632
+ return contentManagerUser;
4633
+ }
4634
+
4635
+ var controllers;
4636
+ var hasRequiredControllers;
4637
+ function requireControllers() {
4638
+ if (hasRequiredControllers) return controllers;
4639
+ hasRequiredControllers = 1;
4640
+ const auth = requireAuth();
4641
+ const user = requireUser();
4642
+ const role = requireRole();
4643
+ const permissions = requirePermissions();
4644
+ const settings = requireSettings();
4645
+ const contentmanageruser = requireContentManagerUser();
4646
+ controllers = {
4647
+ auth,
4648
+ user,
4649
+ role,
4650
+ permissions,
4651
+ settings,
4652
+ contentmanageruser
4653
+ };
4654
+ return controllers;
4655
+ }
4656
+
4657
+ var config;
4658
+ var hasRequiredConfig;
4659
+ function requireConfig() {
4660
+ if (hasRequiredConfig) return config;
4661
+ hasRequiredConfig = 1;
4662
+ config = {
4663
+ default: ({ env })=>({
4664
+ jwtSecret: env('JWT_SECRET'),
4665
+ jwt: {
4666
+ expiresIn: '30d'
4667
+ },
4668
+ ratelimit: {
4669
+ interval: 60000,
4670
+ max: 10
4671
+ },
4672
+ layout: {
4673
+ user: {
4674
+ actions: {
4675
+ create: 'contentManagerUser.create',
4676
+ update: 'contentManagerUser.update'
4677
+ }
4678
+ }
4679
+ },
4680
+ callback: {
4681
+ validate (callback, provider) {
4682
+ let uCallback;
4683
+ let uProviderCallback;
4684
+ try {
4685
+ uCallback = new URL(callback);
4686
+ uProviderCallback = new URL(provider.callback);
4687
+ } catch {
4688
+ throw new Error('The callback is not a valid URL');
4689
+ }
4690
+ // Make sure the different origin matches
4691
+ if (uCallback.origin !== uProviderCallback.origin) {
4692
+ throw new Error(`Forbidden callback provided: origins don't match. Please verify your config.`);
4693
+ }
4694
+ // Make sure the different pathname matches
4695
+ if (uCallback.pathname !== uProviderCallback.pathname) {
4696
+ throw new Error(`Forbidden callback provided: pathname don't match. Please verify your config.`);
4697
+ }
4698
+ // NOTE: We're not checking the search parameters on purpose to allow passing different states
4699
+ }
4700
+ }
4701
+ }),
4702
+ validator () {}
4703
+ };
4704
+ return config;
4705
+ }
4706
+
4707
+ var server;
4708
+ var hasRequiredServer;
4709
+ function requireServer() {
4710
+ if (hasRequiredServer) return server;
4711
+ hasRequiredServer = 1;
4712
+ const register = requireRegister();
4713
+ const bootstrap = requireBootstrap();
4714
+ const contentTypes = requireContentTypes();
4715
+ const middlewares = requireMiddlewares();
4716
+ const services = requireServices();
4717
+ const routes = requireRoutes();
4718
+ const controllers = requireControllers();
4719
+ const config = requireConfig();
4720
+ server = ()=>({
4721
+ register,
4722
+ bootstrap,
4723
+ config,
4724
+ routes,
4725
+ controllers,
4726
+ contentTypes,
4727
+ middlewares,
4728
+ services
4729
+ });
4730
+ return server;
4731
+ }
4732
+
4733
+ var serverExports = requireServer();
4734
+ var index = /*@__PURE__*/ getDefaultExportFromCjs(serverExports);
4735
+
4736
+ export { index as default };
4737
+ //# sourceMappingURL=index.mjs.map