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