@strapi/plugin-users-permissions 4.20.5 → 5.0.0-alpha.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 (108) hide show
  1. package/admin/src/components/FormModal/index.jsx +1 -2
  2. package/admin/src/components/Permissions/reducer.js +1 -1
  3. package/admin/src/components/UsersPermissions/reducer.js +1 -1
  4. package/admin/src/index.js +14 -30
  5. package/admin/src/pages/AdvancedSettings/index.jsx +69 -107
  6. package/admin/src/pages/AdvancedSettings/utils/layout.js +20 -35
  7. package/admin/src/pages/AdvancedSettings/utils/schema.js +5 -2
  8. package/admin/src/pages/EmailTemplates/components/EmailForm.jsx +47 -74
  9. package/admin/src/pages/EmailTemplates/index.jsx +22 -50
  10. package/admin/src/pages/EmailTemplates/utils/schema.js +18 -6
  11. package/admin/src/pages/Providers/index.jsx +91 -96
  12. package/admin/src/pages/Providers/utils/forms.js +11 -11
  13. package/admin/src/pages/Roles/constants.js +3 -3
  14. package/admin/src/pages/Roles/hooks/usePlugins.js +5 -4
  15. package/admin/src/pages/Roles/index.jsx +9 -18
  16. package/admin/src/pages/Roles/pages/CreatePage.jsx +21 -28
  17. package/admin/src/pages/Roles/pages/EditPage.jsx +23 -40
  18. package/admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx +23 -27
  19. package/admin/src/pages/Roles/pages/ListPage/index.jsx +42 -38
  20. package/admin/src/pages/Roles/pages/ListPage/utils/api.js +6 -6
  21. package/admin/src/translations/en.json +1 -1
  22. package/dist/_chunks/EditViewPage-xYzUSAwS-5mOQ_-nB.mjs +84370 -0
  23. package/dist/_chunks/EditViewPage-xYzUSAwS-5mOQ_-nB.mjs.map +1 -0
  24. package/dist/_chunks/EditViewPage-xYzUSAwS-wpHlxdkC.js +84398 -0
  25. package/dist/_chunks/EditViewPage-xYzUSAwS-wpHlxdkC.js.map +1 -0
  26. package/dist/_chunks/Helmet-d9JljxUo.js +1010 -0
  27. package/dist/_chunks/Helmet-d9JljxUo.js.map +1 -0
  28. package/dist/_chunks/Helmet-kyJ1Zklj.mjs +1008 -0
  29. package/dist/_chunks/Helmet-kyJ1Zklj.mjs.map +1 -0
  30. package/dist/_chunks/ListViewPage-xOVa04T_-elahT0e9.js +1618 -0
  31. package/dist/_chunks/ListViewPage-xOVa04T_-elahT0e9.js.map +1 -0
  32. package/dist/_chunks/ListViewPage-xOVa04T_-lbfb219V.mjs +1595 -0
  33. package/dist/_chunks/ListViewPage-xOVa04T_-lbfb219V.mjs.map +1 -0
  34. package/dist/_chunks/ReviewWorkflowsColumn-FDxVKdto-IWfB3WVH.mjs +33 -0
  35. package/dist/_chunks/ReviewWorkflowsColumn-FDxVKdto-IWfB3WVH.mjs.map +1 -0
  36. package/dist/_chunks/ReviewWorkflowsColumn-FDxVKdto-m8hslkeI.js +33 -0
  37. package/dist/_chunks/ReviewWorkflowsColumn-FDxVKdto-m8hslkeI.js.map +1 -0
  38. package/dist/_chunks/constants-WjN6I3sL-7e3gpx4b.mjs +190 -0
  39. package/dist/_chunks/constants-WjN6I3sL-7e3gpx4b.mjs.map +1 -0
  40. package/dist/_chunks/constants-WjN6I3sL-cDZPE6ED.js +209 -0
  41. package/dist/_chunks/constants-WjN6I3sL-cDZPE6ED.js.map +1 -0
  42. package/dist/_chunks/{en-m608rMZx.js → en-TaNIVnDO.js} +2 -2
  43. package/dist/_chunks/en-TaNIVnDO.js.map +1 -0
  44. package/dist/_chunks/{en-CE3wEy_c.mjs → en-jvJ-d-Qq.mjs} +2 -2
  45. package/dist/_chunks/en-jvJ-d-Qq.mjs.map +1 -0
  46. package/dist/_chunks/{index-iNtwnT3f.mjs → index-53jX2hhF.mjs} +26 -34
  47. package/dist/_chunks/index-53jX2hhF.mjs.map +1 -0
  48. package/dist/_chunks/index-5ZvCaCyY-06DLg5eU.mjs +16421 -0
  49. package/dist/_chunks/index-5ZvCaCyY-06DLg5eU.mjs.map +1 -0
  50. package/dist/_chunks/index-5ZvCaCyY-JgYo3Jws.js +16446 -0
  51. package/dist/_chunks/index-5ZvCaCyY-JgYo3Jws.js.map +1 -0
  52. package/dist/_chunks/{index-rryiT0-Z.mjs → index-A3oJlPcE.mjs} +111 -108
  53. package/dist/_chunks/index-A3oJlPcE.mjs.map +1 -0
  54. package/dist/_chunks/{index-XqdaO5WZ.js → index-MEUac_4V.js} +124 -122
  55. package/dist/_chunks/index-MEUac_4V.js.map +1 -0
  56. package/dist/_chunks/index-N-GcFWtg.mjs +261 -0
  57. package/dist/_chunks/index-N-GcFWtg.mjs.map +1 -0
  58. package/dist/_chunks/{index-O9AAUvyy.js → index-TJUxOCtJ.js} +26 -34
  59. package/dist/_chunks/index-TJUxOCtJ.js.map +1 -0
  60. package/dist/_chunks/{index-6Kdo3KXv.js → index-VgvlwVA7.js} +106 -147
  61. package/dist/_chunks/index-VgvlwVA7.js.map +1 -0
  62. package/dist/_chunks/{index-1uupZmu0.js → index-bRuKnVcH.js} +39 -32
  63. package/dist/_chunks/index-bRuKnVcH.js.map +1 -0
  64. package/dist/_chunks/{index-ethhTEkj.mjs → index-ee_14Ldw.mjs} +36 -29
  65. package/dist/_chunks/index-ee_14Ldw.mjs.map +1 -0
  66. package/dist/_chunks/index-mzJ2Vb5u.js +280 -0
  67. package/dist/_chunks/index-mzJ2Vb5u.js.map +1 -0
  68. package/dist/_chunks/{index-a9oKDd3C.mjs → index-vXywiVeM.mjs} +101 -142
  69. package/dist/_chunks/index-vXywiVeM.mjs.map +1 -0
  70. package/dist/_chunks/useSyncRbac-Kt8Li0Yf-Z54sMEPM.mjs +39 -0
  71. package/dist/_chunks/useSyncRbac-Kt8Li0Yf-Z54sMEPM.mjs.map +1 -0
  72. package/dist/_chunks/useSyncRbac-Kt8Li0Yf-h8HqtZ6y.js +57 -0
  73. package/dist/_chunks/useSyncRbac-Kt8Li0Yf-h8HqtZ6y.js.map +1 -0
  74. package/dist/admin/index.js +1 -1
  75. package/dist/admin/index.mjs +1 -1
  76. package/dist/style.css +84 -0
  77. package/package.json +13 -13
  78. package/server/bootstrap/grant-config.js +9 -0
  79. package/server/bootstrap/index.js +2 -39
  80. package/server/content-types/user/index.js +0 -1
  81. package/server/controllers/auth.js +24 -53
  82. package/server/controllers/content-manager-user.js +24 -28
  83. package/server/controllers/role.js +1 -1
  84. package/server/controllers/user.js +5 -5
  85. package/server/middlewares/rateLimit.js +1 -1
  86. package/server/register.js +1 -1
  87. package/server/services/jwt.js +3 -3
  88. package/server/services/permission.js +3 -7
  89. package/server/services/providers-registry.js +15 -0
  90. package/server/services/providers.js +10 -5
  91. package/server/services/role.js +15 -13
  92. package/server/services/user.js +28 -14
  93. package/server/services/users-permissions.js +12 -10
  94. package/server/utils/sanitize/sanitizers.js +2 -2
  95. package/dist/_chunks/en-CE3wEy_c.mjs.map +0 -1
  96. package/dist/_chunks/en-m608rMZx.js.map +0 -1
  97. package/dist/_chunks/index-1uupZmu0.js.map +0 -1
  98. package/dist/_chunks/index-6Kdo3KXv.js.map +0 -1
  99. package/dist/_chunks/index-O9AAUvyy.js.map +0 -1
  100. package/dist/_chunks/index-Un-J-cxQ.js +0 -320
  101. package/dist/_chunks/index-Un-J-cxQ.js.map +0 -1
  102. package/dist/_chunks/index-X0yw_GgN.mjs +0 -301
  103. package/dist/_chunks/index-X0yw_GgN.mjs.map +0 -1
  104. package/dist/_chunks/index-XqdaO5WZ.js.map +0 -1
  105. package/dist/_chunks/index-a9oKDd3C.mjs.map +0 -1
  106. package/dist/_chunks/index-ethhTEkj.mjs.map +0 -1
  107. package/dist/_chunks/index-iNtwnT3f.mjs.map +0 -1
  108. package/dist/_chunks/index-rryiT0-Z.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-vXywiVeM.mjs","sources":["../../admin/src/pages/EmailTemplates/utils/schema.js","../../admin/src/pages/EmailTemplates/components/EmailForm.jsx","../../admin/src/pages/EmailTemplates/components/EmailTable.jsx","../../admin/src/pages/EmailTemplates/index.jsx"],"sourcesContent":["import { translatedErrors } from '@strapi/strapi/admin';\nimport * as yup from 'yup';\n\nconst schema = yup.object().shape({\n options: yup\n .object()\n .shape({\n from: yup\n .object()\n .shape({\n name: yup.string().required({\n id: translatedErrors.required.id,\n defaultMessage: 'This field is required',\n }),\n email: yup.string().email(translatedErrors.email).required({\n id: translatedErrors.required.id,\n defaultMessage: 'This field is required',\n }),\n })\n .required(),\n response_email: yup.string().email(translatedErrors.email),\n object: yup.string().required({\n id: translatedErrors.required.id,\n defaultMessage: 'This field is required',\n }),\n message: yup.string().required({\n id: translatedErrors.required.id,\n defaultMessage: 'This field is required',\n }),\n })\n .required(translatedErrors.required.id),\n});\n\nexport default schema;\n","import React from 'react';\n\nimport {\n Button,\n Grid,\n GridItem,\n ModalBody,\n ModalFooter,\n ModalHeader,\n ModalLayout,\n} from '@strapi/design-system';\nimport { Breadcrumbs, Crumb } from '@strapi/design-system/v2';\nimport { Form, InputRenderer } from '@strapi/strapi/admin';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils';\nimport schema from '../utils/schema';\n\nconst EmailForm = ({ template, onToggle, onSubmit }) => {\n const { formatMessage } = useIntl();\n\n return (\n <ModalLayout\n onClose={onToggle}\n labelledBy={`${formatMessage({\n id: getTrad('PopUpForm.header.edit.email-templates'),\n defaultMessage: 'Edit email template',\n })}, ${formatMessage({ id: getTrad(template.display), defaultMessage: template.display })}`}\n >\n <ModalHeader>\n <Breadcrumbs\n label={`${formatMessage({\n id: getTrad('PopUpForm.header.edit.email-templates'),\n defaultMessage: 'Edit email template',\n })}, ${formatMessage({\n id: getTrad(template.display),\n defaultMessage: template.display,\n })}`}\n >\n <Crumb>\n {formatMessage({\n id: getTrad('PopUpForm.header.edit.email-templates'),\n defaultMessage: 'Edit email template',\n })}\n </Crumb>\n <Crumb isCurrent>\n {formatMessage({ id: getTrad(template.display), defaultMessage: template.display })}\n </Crumb>\n </Breadcrumbs>\n </ModalHeader>\n <Form onSubmit={onSubmit} initialValues={template} validationSchema={schema}>\n {({ isSubmitting }) => {\n return (\n <>\n <ModalBody>\n <Grid gap={5}>\n {[\n {\n label: formatMessage({\n id: getTrad('PopUpForm.Email.options.from.name.label'),\n defaultMessage: 'Shipper name',\n }),\n name: 'options.from.name',\n size: 6,\n type: 'string',\n },\n {\n label: formatMessage({\n id: getTrad('PopUpForm.Email.options.from.email.label'),\n defaultMessage: 'Shipper email',\n }),\n name: 'options.from.email',\n size: 6,\n type: 'string',\n },\n {\n label: formatMessage({\n id: getTrad('PopUpForm.Email.options.response_email.label'),\n defaultMessage: 'Response email',\n }),\n name: 'options.response_email',\n size: 6,\n type: 'string',\n },\n {\n label: formatMessage({\n id: getTrad('PopUpForm.Email.options.object.label'),\n defaultMessage: 'Subject',\n }),\n name: 'options.object',\n size: 6,\n type: 'string',\n },\n {\n label: formatMessage({\n id: getTrad('PopUpForm.Email.options.message.label'),\n defaultMessage: 'Message',\n }),\n name: 'options.message',\n size: 12,\n type: 'text',\n },\n ].map(({ size, ...field }) => (\n <GridItem key={field.name} col={size}>\n <InputRenderer {...field} />\n </GridItem>\n ))}\n </Grid>\n </ModalBody>\n <ModalFooter\n startActions={\n <Button onClick={onToggle} variant=\"tertiary\">\n Cancel\n </Button>\n }\n endActions={\n <Button loading={isSubmitting} type=\"submit\">\n Finish\n </Button>\n }\n />\n </>\n );\n }}\n </Form>\n </ModalLayout>\n );\n};\n\nEmailForm.propTypes = {\n template: PropTypes.shape({\n display: PropTypes.string,\n icon: PropTypes.string,\n options: PropTypes.shape({\n from: PropTypes.shape({\n name: PropTypes.string,\n email: PropTypes.string,\n }),\n message: PropTypes.string,\n object: PropTypes.string,\n response_email: PropTypes.string,\n }),\n }).isRequired,\n onSubmit: PropTypes.func.isRequired,\n onToggle: PropTypes.func.isRequired,\n};\n\nexport default EmailForm;\n","import React from 'react';\n\nimport {\n Icon,\n IconButton,\n Table,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { onRowClick, stopPropagation } from '@strapi/helper-plugin';\nimport { Check, Pencil, Refresh } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils';\n\nconst EmailTable = ({ canUpdate, onEditClick }) => {\n const { formatMessage } = useIntl();\n\n return (\n <Table colCount={3} rowCount={3}>\n <Thead>\n <Tr>\n <Th width=\"1%\">\n <VisuallyHidden>\n {formatMessage({\n id: getTrad('Email.template.table.icon.label'),\n defaultMessage: 'icon',\n })}\n </VisuallyHidden>\n </Th>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('Email.template.table.name.label'),\n defaultMessage: 'name',\n })}\n </Typography>\n </Th>\n <Th width=\"1%\">\n <VisuallyHidden>\n {formatMessage({\n id: getTrad('Email.template.table.action.label'),\n defaultMessage: 'action',\n })}\n </VisuallyHidden>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n <Tr {...onRowClick({ fn: () => onEditClick('reset_password') })}>\n <Td>\n <Icon>\n <Refresh\n aria-label={formatMessage({\n id: 'global.reset-password',\n defaultMessage: 'Reset password',\n })}\n />\n </Icon>\n </Td>\n <Td>\n <Typography>\n {formatMessage({\n id: 'global.reset-password',\n defaultMessage: 'Reset password',\n })}\n </Typography>\n </Td>\n <Td {...stopPropagation}>\n <IconButton\n onClick={() => onEditClick('reset_password')}\n label={formatMessage({\n id: getTrad('Email.template.form.edit.label'),\n defaultMessage: 'Edit a template',\n })}\n noBorder\n icon={canUpdate && <Pencil />}\n />\n </Td>\n </Tr>\n <Tr {...onRowClick({ fn: () => onEditClick('email_confirmation') })}>\n <Td>\n <Icon>\n <Check\n aria-label={formatMessage({\n id: getTrad('Email.template.email_confirmation'),\n defaultMessage: 'Email address confirmation',\n })}\n />\n </Icon>\n </Td>\n <Td>\n <Typography>\n {formatMessage({\n id: getTrad('Email.template.email_confirmation'),\n defaultMessage: 'Email address confirmation',\n })}\n </Typography>\n </Td>\n <Td {...stopPropagation}>\n <IconButton\n onClick={() => onEditClick('email_confirmation')}\n label={formatMessage({\n id: getTrad('Email.template.form.edit.label'),\n defaultMessage: 'Edit a template',\n })}\n noBorder\n icon={canUpdate && <Pencil />}\n />\n </Td>\n </Tr>\n </Tbody>\n </Table>\n );\n};\n\nEmailTable.propTypes = {\n canUpdate: PropTypes.bool.isRequired,\n onEditClick: PropTypes.func.isRequired,\n};\n\nexport default EmailTable;\n","import * as React from 'react';\n\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { ContentLayout, HeaderLayout, Main, useNotifyAT } from '@strapi/design-system';\nimport { useFetchClient, useFocusWhenNavigate, useRBAC } from '@strapi/helper-plugin';\nimport { Page, useAPIErrorHandler, useNotification } from '@strapi/strapi/admin';\nimport { Helmet } from 'react-helmet';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQuery, useQueryClient } from 'react-query';\n\nimport { PERMISSIONS } from '../../constants';\nimport { getTrad } from '../../utils';\n\nimport EmailForm from './components/EmailForm';\nimport EmailTable from './components/EmailTable';\n\nconst ProtectedEmailTemplatesPage = () => (\n <Page.Protect permissions={PERMISSIONS.readEmailTemplates}>\n <EmailTemplatesPage />\n </Page.Protect>\n);\nconst EmailTemplatesPage = () => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { notifyStatus } = useNotifyAT();\n const { toggleNotification } = useNotification();\n const queryClient = useQueryClient();\n const { get, put } = useFetchClient();\n const { formatAPIError } = useAPIErrorHandler();\n\n useFocusWhenNavigate();\n\n const [isModalOpen, setIsModalOpen] = React.useState(false);\n const [templateToEdit, setTemplateToEdit] = React.useState(null);\n\n const {\n isLoading: isLoadingForPermissions,\n allowedActions: { canUpdate },\n } = useRBAC({ update: PERMISSIONS.updateEmailTemplates });\n\n const { isLoading: isLoadingData, data } = useQuery(\n ['users-permissions', 'email-templates'],\n async () => {\n const { data } = await get('/users-permissions/email-templates');\n\n return data;\n },\n {\n onSuccess() {\n notifyStatus(\n formatMessage({\n id: getTrad('Email.template.data.loaded'),\n defaultMessage: 'Email templates has been loaded',\n })\n );\n },\n onError(error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n },\n }\n );\n\n const isLoading = isLoadingForPermissions || isLoadingData;\n\n const handleToggle = () => {\n setIsModalOpen((prev) => !prev);\n };\n\n const handleEditClick = (template) => {\n setTemplateToEdit(template);\n handleToggle();\n };\n\n const submitMutation = useMutation(\n (body) => put('/users-permissions/email-templates', { 'email-templates': body }),\n {\n async onSuccess() {\n await queryClient.invalidateQueries(['users-permissions', 'email-templates']);\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'notification.success.saved', defaultMessage: 'Saved' }),\n });\n\n trackUsage('didEditEmailTemplates');\n\n handleToggle();\n },\n onError(error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n },\n refetchActive: true,\n }\n );\n\n const handleSubmit = (body) => {\n trackUsage('willEditEmailTemplates');\n\n const editedTemplates = { ...data, [templateToEdit]: body };\n submitMutation.mutate(editedTemplates);\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <Main aria-busy={submitMutation.isLoading}>\n <Helmet\n title={formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: formatMessage({\n id: getTrad('HeaderNav.link.emailTemplates'),\n defaultMessage: 'Email templates',\n }),\n }\n )}\n />\n <HeaderLayout\n title={formatMessage({\n id: getTrad('HeaderNav.link.emailTemplates'),\n defaultMessage: 'Email templates',\n })}\n />\n <ContentLayout>\n <EmailTable onEditClick={handleEditClick} canUpdate={canUpdate} />\n {isModalOpen && (\n <EmailForm\n template={data[templateToEdit]}\n onToggle={handleToggle}\n onSubmit={handleSubmit}\n />\n )}\n </ContentLayout>\n </Main>\n );\n};\n\nexport { ProtectedEmailTemplatesPage, EmailTemplatesPage };\n"],"names":["data","Helmet"],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import * as React from "react";
2
+ import { ab as useTypedDispatch, a5 as useTypedSelector, ac as setPermissions, ad as resetPermissions } from "./index-5ZvCaCyY-06DLg5eU.mjs";
3
+ const useSyncRbac = (collectionTypeUID, query, containerName = "listView") => {
4
+ const [isLoading, setIsLoading] = React.useState(true);
5
+ const dispatch = useTypedDispatch();
6
+ const collectionTypesRelatedPermissions = useTypedSelector(
7
+ (state) => state.rbacProvider.collectionTypesRelatedPermissions
8
+ );
9
+ const relatedPermissions = collectionTypesRelatedPermissions[collectionTypeUID];
10
+ React.useEffect(() => {
11
+ setIsLoading(true);
12
+ if (relatedPermissions) {
13
+ dispatch(
14
+ setPermissions({
15
+ permissions: relatedPermissions,
16
+ __meta__: {
17
+ plugins: query ? query.plugins : void 0,
18
+ containerName
19
+ }
20
+ })
21
+ );
22
+ }
23
+ setIsLoading(false);
24
+ return () => {
25
+ dispatch(resetPermissions());
26
+ };
27
+ }, [relatedPermissions, dispatch, query, containerName]);
28
+ const permissions = useTypedSelector((state) => state["content-manager"].rbac.permissions);
29
+ const isPermissionMismatch = permissions && permissions.some((permission) => permission.subject !== collectionTypeUID) ? true : false;
30
+ return {
31
+ isLoading,
32
+ isError: !isLoading && isPermissionMismatch,
33
+ permissions
34
+ };
35
+ };
36
+ export {
37
+ useSyncRbac as u
38
+ };
39
+ //# sourceMappingURL=useSyncRbac-Kt8Li0Yf-Z54sMEPM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSyncRbac-Kt8Li0Yf-Z54sMEPM.mjs","sources":["../../../../core/admin/dist/_chunks/useSyncRbac-Kt8Li0Yf.mjs"],"sourcesContent":["import * as React from \"react\";\nimport { r as useTypedDispatch, q as useTypedSelector, aG as setPermissions, aH as resetPermissions } from \"./index-5ZvCaCyY.mjs\";\nconst useSyncRbac = (collectionTypeUID, query, containerName = \"listView\") => {\n const [isLoading, setIsLoading] = React.useState(true);\n const dispatch = useTypedDispatch();\n const collectionTypesRelatedPermissions = useTypedSelector(\n (state) => state.rbacProvider.collectionTypesRelatedPermissions\n );\n const relatedPermissions = collectionTypesRelatedPermissions[collectionTypeUID];\n React.useEffect(() => {\n setIsLoading(true);\n if (relatedPermissions) {\n dispatch(\n setPermissions({\n permissions: relatedPermissions,\n __meta__: {\n plugins: query ? query.plugins : void 0,\n containerName\n }\n })\n );\n }\n setIsLoading(false);\n return () => {\n dispatch(resetPermissions());\n };\n }, [relatedPermissions, dispatch, query, containerName]);\n const permissions = useTypedSelector((state) => state[\"content-manager\"].rbac.permissions);\n const isPermissionMismatch = permissions && permissions.some((permission) => permission.subject !== collectionTypeUID) ? true : false;\n return {\n isLoading,\n isError: !isLoading && isPermissionMismatch,\n permissions\n };\n};\nexport {\n useSyncRbac as u\n};\n//# sourceMappingURL=useSyncRbac-Kt8Li0Yf.mjs.map\n"],"names":[],"mappings":";;AAEK,MAAC,cAAc,CAAC,mBAAmB,OAAO,gBAAgB,eAAe;AAC5E,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,IAAI;AACrD,QAAM,WAAW;AACjB,QAAM,oCAAoC;AAAA,IACxC,CAAC,UAAU,MAAM,aAAa;AAAA,EAClC;AACE,QAAM,qBAAqB,kCAAkC,iBAAiB;AAC9E,QAAM,UAAU,MAAM;AACpB,iBAAa,IAAI;AACjB,QAAI,oBAAoB;AACtB;AAAA,QACE,eAAe;AAAA,UACb,aAAa;AAAA,UACb,UAAU;AAAA,YACR,SAAS,QAAQ,MAAM,UAAU;AAAA,YACjC;AAAA,UACD;AAAA,QACX,CAAS;AAAA,MACT;AAAA,IACK;AACD,iBAAa,KAAK;AAClB,WAAO,MAAM;AACX,eAAS,iBAAgB,CAAE;AAAA,IACjC;AAAA,EACG,GAAE,CAAC,oBAAoB,UAAU,OAAO,aAAa,CAAC;AACvD,QAAM,cAAc,iBAAiB,CAAC,UAAU,MAAM,iBAAiB,EAAE,KAAK,WAAW;AACzF,QAAM,uBAAuB,eAAe,YAAY,KAAK,CAAC,eAAe,WAAW,YAAY,iBAAiB,IAAI,OAAO;AAChI,SAAO;AAAA,IACL;AAAA,IACA,SAAS,CAAC,aAAa;AAAA,IACvB;AAAA,EACJ;AACA;"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ const React = require("react");
3
+ const index5ZvCaCyY = require("./index-5ZvCaCyY-JgYo3Jws.js");
4
+ function _interopNamespace(e) {
5
+ if (e && e.__esModule)
6
+ return e;
7
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
8
+ if (e) {
9
+ for (const k in e) {
10
+ if (k !== "default") {
11
+ const d = Object.getOwnPropertyDescriptor(e, k);
12
+ Object.defineProperty(n, k, d.get ? d : {
13
+ enumerable: true,
14
+ get: () => e[k]
15
+ });
16
+ }
17
+ }
18
+ }
19
+ n.default = e;
20
+ return Object.freeze(n);
21
+ }
22
+ const React__namespace = /* @__PURE__ */ _interopNamespace(React);
23
+ const useSyncRbac = (collectionTypeUID, query, containerName = "listView") => {
24
+ const [isLoading, setIsLoading] = React__namespace.useState(true);
25
+ const dispatch = index5ZvCaCyY.useTypedDispatch();
26
+ const collectionTypesRelatedPermissions = index5ZvCaCyY.useTypedSelector(
27
+ (state) => state.rbacProvider.collectionTypesRelatedPermissions
28
+ );
29
+ const relatedPermissions = collectionTypesRelatedPermissions[collectionTypeUID];
30
+ React__namespace.useEffect(() => {
31
+ setIsLoading(true);
32
+ if (relatedPermissions) {
33
+ dispatch(
34
+ index5ZvCaCyY.setPermissions({
35
+ permissions: relatedPermissions,
36
+ __meta__: {
37
+ plugins: query ? query.plugins : void 0,
38
+ containerName
39
+ }
40
+ })
41
+ );
42
+ }
43
+ setIsLoading(false);
44
+ return () => {
45
+ dispatch(index5ZvCaCyY.resetPermissions());
46
+ };
47
+ }, [relatedPermissions, dispatch, query, containerName]);
48
+ const permissions = index5ZvCaCyY.useTypedSelector((state) => state["content-manager"].rbac.permissions);
49
+ const isPermissionMismatch = permissions && permissions.some((permission) => permission.subject !== collectionTypeUID) ? true : false;
50
+ return {
51
+ isLoading,
52
+ isError: !isLoading && isPermissionMismatch,
53
+ permissions
54
+ };
55
+ };
56
+ exports.useSyncRbac = useSyncRbac;
57
+ //# sourceMappingURL=useSyncRbac-Kt8Li0Yf-h8HqtZ6y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSyncRbac-Kt8Li0Yf-h8HqtZ6y.js","sources":["../../../../core/admin/dist/_chunks/useSyncRbac-Kt8Li0Yf.mjs"],"sourcesContent":["import * as React from \"react\";\nimport { r as useTypedDispatch, q as useTypedSelector, aG as setPermissions, aH as resetPermissions } from \"./index-5ZvCaCyY.mjs\";\nconst useSyncRbac = (collectionTypeUID, query, containerName = \"listView\") => {\n const [isLoading, setIsLoading] = React.useState(true);\n const dispatch = useTypedDispatch();\n const collectionTypesRelatedPermissions = useTypedSelector(\n (state) => state.rbacProvider.collectionTypesRelatedPermissions\n );\n const relatedPermissions = collectionTypesRelatedPermissions[collectionTypeUID];\n React.useEffect(() => {\n setIsLoading(true);\n if (relatedPermissions) {\n dispatch(\n setPermissions({\n permissions: relatedPermissions,\n __meta__: {\n plugins: query ? query.plugins : void 0,\n containerName\n }\n })\n );\n }\n setIsLoading(false);\n return () => {\n dispatch(resetPermissions());\n };\n }, [relatedPermissions, dispatch, query, containerName]);\n const permissions = useTypedSelector((state) => state[\"content-manager\"].rbac.permissions);\n const isPermissionMismatch = permissions && permissions.some((permission) => permission.subject !== collectionTypeUID) ? true : false;\n return {\n isLoading,\n isError: !isLoading && isPermissionMismatch,\n permissions\n };\n};\nexport {\n useSyncRbac as u\n};\n//# sourceMappingURL=useSyncRbac-Kt8Li0Yf.mjs.map\n"],"names":["React","useTypedDispatch","useTypedSelector","setPermissions","resetPermissions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAEK,MAAC,cAAc,CAAC,mBAAmB,OAAO,gBAAgB,eAAe;AAC5E,QAAM,CAAC,WAAW,YAAY,IAAIA,iBAAM,SAAS,IAAI;AACrD,QAAM,WAAWC,cAAAA;AACjB,QAAM,oCAAoCC,cAAgB;AAAA,IACxD,CAAC,UAAU,MAAM,aAAa;AAAA,EAClC;AACE,QAAM,qBAAqB,kCAAkC,iBAAiB;AAC9EF,mBAAM,UAAU,MAAM;AACpB,iBAAa,IAAI;AACjB,QAAI,oBAAoB;AACtB;AAAA,QACEG,6BAAe;AAAA,UACb,aAAa;AAAA,UACb,UAAU;AAAA,YACR,SAAS,QAAQ,MAAM,UAAU;AAAA,YACjC;AAAA,UACD;AAAA,QACX,CAAS;AAAA,MACT;AAAA,IACK;AACD,iBAAa,KAAK;AAClB,WAAO,MAAM;AACX,eAASC,cAAgB,iBAAA,CAAE;AAAA,IACjC;AAAA,EACG,GAAE,CAAC,oBAAoB,UAAU,OAAO,aAAa,CAAC;AACvD,QAAM,cAAcF,cAAgB,iBAAC,CAAC,UAAU,MAAM,iBAAiB,EAAE,KAAK,WAAW;AACzF,QAAM,uBAAuB,eAAe,YAAY,KAAK,CAAC,eAAe,WAAW,YAAY,iBAAiB,IAAI,OAAO;AAChI,SAAO;AAAA,IACL;AAAA,IACA,SAAS,CAAC,aAAa;AAAA,IACvB;AAAA,EACJ;AACA;;"}
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- const index = require("../_chunks/index-O9AAUvyy.js");
2
+ const index = require("../_chunks/index-TJUxOCtJ.js");
3
3
  require("@strapi/helper-plugin");
4
4
  module.exports = index.index;
5
5
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- import { i } from "../_chunks/index-iNtwnT3f.mjs";
1
+ import { i } from "../_chunks/index-53jX2hhF.mjs";
2
2
  import "@strapi/helper-plugin";
3
3
  export {
4
4
  i as default
package/dist/style.css ADDED
@@ -0,0 +1,84 @@
1
+ /*
2
+
3
+ Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums@gmail.com>
4
+
5
+ */
6
+
7
+ .hljs {
8
+ display: block;
9
+ overflow-x: auto;
10
+ padding: 0.5em;
11
+ background: #002b36;
12
+ color: #839496;
13
+ }
14
+
15
+ .hljs-comment,
16
+ .hljs-quote {
17
+ color: #586e75;
18
+ }
19
+
20
+ /* Solarized Green */
21
+ .hljs-keyword,
22
+ .hljs-selector-tag,
23
+ .hljs-addition {
24
+ color: #859900;
25
+ }
26
+
27
+ /* Solarized Cyan */
28
+ .hljs-number,
29
+ .hljs-string,
30
+ .hljs-meta .hljs-meta-string,
31
+ .hljs-literal,
32
+ .hljs-doctag,
33
+ .hljs-regexp {
34
+ color: #2aa198;
35
+ }
36
+
37
+ /* Solarized Blue */
38
+ .hljs-title,
39
+ .hljs-section,
40
+ .hljs-name,
41
+ .hljs-selector-id,
42
+ .hljs-selector-class {
43
+ color: #268bd2;
44
+ }
45
+
46
+ /* Solarized Yellow */
47
+ .hljs-attribute,
48
+ .hljs-attr,
49
+ .hljs-variable,
50
+ .hljs-template-variable,
51
+ .hljs-class .hljs-title,
52
+ .hljs-type {
53
+ color: #b58900;
54
+ }
55
+
56
+ /* Solarized Orange */
57
+ .hljs-symbol,
58
+ .hljs-bullet,
59
+ .hljs-subst,
60
+ .hljs-meta,
61
+ .hljs-meta .hljs-keyword,
62
+ .hljs-selector-attr,
63
+ .hljs-selector-pseudo,
64
+ .hljs-link {
65
+ color: #cb4b16;
66
+ }
67
+
68
+ /* Solarized Red */
69
+ .hljs-built_in,
70
+ .hljs-deletion {
71
+ color: #dc322f;
72
+ }
73
+
74
+ .hljs-formula {
75
+ background: #073642;
76
+ }
77
+
78
+ .hljs-emphasis {
79
+ font-style: italic;
80
+ }
81
+
82
+ .hljs-strong {
83
+ font-weight: bold;
84
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/plugin-users-permissions",
3
- "version": "4.20.5",
3
+ "version": "5.0.0-alpha.0",
4
4
  "description": "Protect your API with a full-authentication process based on JWT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -47,13 +47,13 @@
47
47
  },
48
48
  "dependencies": {
49
49
  "@strapi/design-system": "1.16.0",
50
- "@strapi/helper-plugin": "4.20.5",
50
+ "@strapi/helper-plugin": "5.0.0-alpha.0",
51
51
  "@strapi/icons": "1.16.0",
52
- "@strapi/utils": "4.20.5",
52
+ "@strapi/utils": "5.0.0-alpha.0",
53
53
  "bcryptjs": "2.4.3",
54
- "formik": "2.4.0",
54
+ "formik": "2.4.5",
55
55
  "grant-koa": "5.4.8",
56
- "immer": "9.0.19",
56
+ "immer": "9.0.21",
57
57
  "jsonwebtoken": "9.0.0",
58
58
  "jwk-to-pem": "2.0.5",
59
59
  "koa": "2.13.4",
@@ -61,29 +61,29 @@
61
61
  "lodash": "4.17.21",
62
62
  "prop-types": "^15.8.1",
63
63
  "purest": "4.0.2",
64
- "react-intl": "6.4.1",
64
+ "react-intl": "6.6.2",
65
65
  "react-query": "3.39.3",
66
- "react-redux": "8.1.1",
66
+ "react-redux": "8.1.3",
67
67
  "url-join": "4.0.1",
68
68
  "yup": "0.32.9"
69
69
  },
70
70
  "devDependencies": {
71
- "@strapi/pack-up": "4.20.5",
72
- "@strapi/strapi": "4.20.5",
71
+ "@strapi/pack-up": "5.0.0-alpha.0",
72
+ "@strapi/strapi": "5.0.0-alpha.0",
73
73
  "@testing-library/dom": "9.2.0",
74
74
  "@testing-library/react": "14.0.0",
75
75
  "@testing-library/user-event": "14.4.3",
76
76
  "msw": "1.3.0",
77
77
  "react": "^18.2.0",
78
78
  "react-dom": "^18.2.0",
79
- "react-router-dom": "5.3.4",
80
- "styled-components": "5.3.3"
79
+ "react-router-dom": "6.22.3",
80
+ "styled-components": "5.3.11"
81
81
  },
82
82
  "peerDependencies": {
83
83
  "@strapi/strapi": "^4.0.0",
84
84
  "react": "^17.0.0 || ^18.0.0",
85
85
  "react-dom": "^17.0.0 || ^18.0.0",
86
- "react-router-dom": "^5.2.0",
86
+ "react-router-dom": "^6.0.0",
87
87
  "styled-components": "^5.2.1"
88
88
  },
89
89
  "engines": {
@@ -97,5 +97,5 @@
97
97
  "required": true,
98
98
  "kind": "plugin"
99
99
  },
100
- "gitHead": "7a2a86e65faa175172945f55afe1b0f299fe98cc"
100
+ "gitHead": "ceeb3f383cbaf51eeaa373750a27a2880a10f727"
101
101
  }
@@ -128,4 +128,13 @@ module.exports = (baseURL) => ({
128
128
  callback: `${baseURL}/patreon/callback`,
129
129
  scope: ['identity', 'identity[email]'],
130
130
  },
131
+ keycloak: {
132
+ enabled: false,
133
+ icon: '',
134
+ key: '',
135
+ secret: '',
136
+ subdomain: 'myKeycloakProvider.com/realms/myrealm',
137
+ callback: `${baseURL}/keycloak/callback`,
138
+ scope: ['openid', 'email', 'profile'],
139
+ },
131
140
  });
@@ -10,12 +10,9 @@
10
10
  const crypto = require('crypto');
11
11
  const _ = require('lodash');
12
12
  const urljoin = require('url-join');
13
- const { isArray } = require('lodash/fp');
14
13
  const { getService } = require('../utils');
15
14
  const getGrantConfig = require('./grant-config');
16
-
17
15
  const usersPermissionsActions = require('./users-permissions-actions');
18
- const userSchema = require('../content-types/user');
19
16
 
20
17
  const initGrant = async (pluginStore) => {
21
18
  const apiPrefix = strapi.config.get('api.rest.prefix');
@@ -99,27 +96,6 @@ const initAdvancedOptions = async (pluginStore) => {
99
96
  }
100
97
  };
101
98
 
102
- const userSchemaAdditions = () => {
103
- const defaultSchema = Object.keys(userSchema.attributes);
104
- const currentSchema = Object.keys(
105
- strapi.contentTypes['plugin::users-permissions.user'].attributes
106
- );
107
-
108
- // Some dynamic fields may not have been initialized yet, so we need to ignore them
109
- // TODO: we should have a global method for finding these
110
- const ignoreDiffs = [
111
- 'createdBy',
112
- 'createdAt',
113
- 'updatedBy',
114
- 'updatedAt',
115
- 'publishedAt',
116
- 'strapi_stage',
117
- 'strapi_assignee',
118
- ];
119
-
120
- return currentSchema.filter((key) => !(ignoreDiffs.includes(key) || defaultSchema.includes(key)));
121
- };
122
-
123
99
  module.exports = async ({ strapi }) => {
124
100
  const pluginStore = strapi.store({ type: 'plugin', name: 'users-permissions' });
125
101
 
@@ -133,7 +109,7 @@ module.exports = async ({ strapi }) => {
133
109
 
134
110
  await getService('users-permissions').initialize();
135
111
 
136
- if (!strapi.config.get('plugin.users-permissions.jwtSecret')) {
112
+ if (!strapi.config.get('plugin::users-permissions.jwtSecret')) {
137
113
  if (process.env.NODE_ENV !== 'development') {
138
114
  throw new Error(
139
115
  `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')\`).
@@ -143,7 +119,7 @@ For security reasons, prefer storing the secret in an environment variable and r
143
119
 
144
120
  const jwtSecret = crypto.randomBytes(16).toString('base64');
145
121
 
146
- strapi.config.set('plugin.users-permissions.jwtSecret', jwtSecret);
122
+ strapi.config.set('plugin::users-permissions.jwtSecret', jwtSecret);
147
123
 
148
124
  if (!process.env.JWT_SECRET) {
149
125
  const envPath = process.env.ENV_PATH || '.env';
@@ -153,17 +129,4 @@ For security reasons, prefer storing the secret in an environment variable and r
153
129
  );
154
130
  }
155
131
  }
156
-
157
- // TODO v5: Remove this block of code and default allowedFields to empty array
158
- if (!isArray(strapi.config.get('plugin.users-permissions.register.allowedFields'))) {
159
- const modifications = userSchemaAdditions();
160
- if (modifications.length > 0) {
161
- // if there is a potential vulnerability, show a warning
162
- strapi.log.warn(
163
- `Users-permissions registration has defaulted to accepting the following additional user fields during registration: ${modifications.join(
164
- ','
165
- )}`
166
- );
167
- }
168
- }
169
132
  };
@@ -12,7 +12,6 @@ module.exports = {
12
12
  displayName: 'User',
13
13
  },
14
14
  options: {
15
- draftAndPublish: false,
16
15
  timestamps: true,
17
16
  },
18
17
  attributes: {
@@ -11,9 +11,6 @@ const crypto = require('crypto');
11
11
  const _ = require('lodash');
12
12
  const { concat, compact, isArray } = require('lodash/fp');
13
13
  const utils = require('@strapi/utils');
14
- const {
15
- contentTypes: { getNonWritableAttributes },
16
- } = require('@strapi/utils');
17
14
  const { getService } = require('../utils');
18
15
  const {
19
16
  validateCallbackBody,
@@ -25,7 +22,7 @@ const {
25
22
  validateChangePasswordBody,
26
23
  } = require('./validation/auth');
27
24
 
28
- const { getAbsoluteAdminUrl, getAbsoluteServerUrl, sanitize } = utils;
25
+ const { sanitize } = utils;
29
26
  const { ApplicationError, ValidationError, ForbiddenError } = utils.errors;
30
27
 
31
28
  const sanitizeUser = (user, ctx) => {
@@ -55,7 +52,7 @@ module.exports = {
55
52
  const { identifier } = params;
56
53
 
57
54
  // Check if the user exists.
58
- const user = await strapi.query('plugin::users-permissions.user').findOne({
55
+ const user = await strapi.db.query('plugin::users-permissions.user').findOne({
59
56
  where: {
60
57
  provider,
61
58
  $or: [{ email: identifier.toLowerCase() }, { username: identifier }],
@@ -120,10 +117,9 @@ module.exports = {
120
117
 
121
118
  const { currentPassword, password } = await validateChangePasswordBody(ctx.request.body);
122
119
 
123
- const user = await strapi.entityService.findOne(
124
- 'plugin::users-permissions.user',
125
- ctx.state.user.id
126
- );
120
+ const user = await strapi.db
121
+ .query('plugin::users-permissions.user')
122
+ .findOne({ where: { id: ctx.state.user.id } });
127
123
 
128
124
  const validPassword = await getService('user').validatePassword(currentPassword, user.password);
129
125
 
@@ -152,7 +148,7 @@ module.exports = {
152
148
  throw new ValidationError('Passwords do not match');
153
149
  }
154
150
 
155
- const user = await strapi
151
+ const user = await strapi.db
156
152
  .query('plugin::users-permissions.user')
157
153
  .findOne({ where: { resetPasswordToken: code } });
158
154
 
@@ -219,7 +215,7 @@ module.exports = {
219
215
  const advancedSettings = await pluginStore.get({ key: 'advanced' });
220
216
 
221
217
  // Find the user by email.
222
- const user = await strapi
218
+ const user = await strapi.db
223
219
  .query('plugin::users-permissions.user')
224
220
  .findOne({ where: { email: email.toLowerCase() } });
225
221
 
@@ -237,8 +233,8 @@ module.exports = {
237
233
  resetPasswordSettings.message,
238
234
  {
239
235
  URL: advancedSettings.email_reset_password,
240
- SERVER_URL: getAbsoluteServerUrl(strapi.config),
241
- ADMIN_URL: getAbsoluteAdminUrl(strapi.config),
236
+ SERVER_URL: strapi.config.get('server.absoluteUrl'),
237
+ ADMIN_URL: strapi.config.get('admin.absoluteUrl'),
242
238
  USER: userInfo,
243
239
  TOKEN: resetPasswordToken,
244
240
  }
@@ -281,47 +277,22 @@ module.exports = {
281
277
  throw new ApplicationError('Register action is currently disabled');
282
278
  }
283
279
 
284
- const { register } = strapi.config.get('plugin.users-permissions');
280
+ const { register } = strapi.config.get('plugin::users-permissions');
285
281
  const alwaysAllowedKeys = ['username', 'password', 'email'];
286
- const userModel = strapi.contentTypes['plugin::users-permissions.user'];
287
- const { attributes } = userModel;
288
-
289
- const nonWritable = getNonWritableAttributes(userModel);
290
282
 
283
+ // Note that we intentionally do not filter allowedFields to allow a project to explicitly accept private or other Strapi field on registration
291
284
  const allowedKeys = compact(
292
- concat(
293
- alwaysAllowedKeys,
294
- isArray(register?.allowedFields)
295
- ? // Note that we do not filter allowedFields in case a user explicitly chooses to allow a private or otherwise omitted field on registration
296
- register.allowedFields // if null or undefined, compact will remove it
297
- : // to prevent breaking changes, if allowedFields is not set in config, we only remove private and known dangerous user schema fields
298
- // TODO V5: allowedFields defaults to [] when undefined and remove this case
299
- Object.keys(attributes).filter(
300
- (key) =>
301
- !nonWritable.includes(key) &&
302
- !attributes[key].private &&
303
- ![
304
- // many of these are included in nonWritable, but we'll list them again to be safe and since we're removing this code in v5 anyway
305
- // Strapi user schema fields
306
- 'confirmed',
307
- 'blocked',
308
- 'confirmationToken',
309
- 'resetPasswordToken',
310
- 'provider',
311
- 'id',
312
- 'role',
313
- // other Strapi fields that might be added
314
- 'createdAt',
315
- 'updatedAt',
316
- 'createdBy',
317
- 'updatedBy',
318
- 'publishedAt', // d&p
319
- 'strapi_reviewWorkflows_stage', // review workflows
320
- ].includes(key)
321
- )
322
- )
285
+ concat(alwaysAllowedKeys, isArray(register?.allowedFields) ? register.allowedFields : [])
323
286
  );
324
287
 
288
+ // Check if there are any keys in requestBody that are not in allowedKeys
289
+ const invalidKeys = Object.keys(ctx.request.body).filter((key) => !allowedKeys.includes(key));
290
+
291
+ if (invalidKeys.length > 0) {
292
+ // If there are invalid keys, throw an error
293
+ throw new ValidationError(`Invalid parameters: ${invalidKeys.join(', ')}`);
294
+ }
295
+
325
296
  const params = {
326
297
  ..._.pick(ctx.request.body, allowedKeys),
327
298
  provider: 'local',
@@ -329,7 +300,7 @@ module.exports = {
329
300
 
330
301
  await validateRegisterBody(params);
331
302
 
332
- const role = await strapi
303
+ const role = await strapi.db
333
304
  .query('plugin::users-permissions.role')
334
305
  .findOne({ where: { type: settings.default_role } });
335
306
 
@@ -348,7 +319,7 @@ module.exports = {
348
319
  ],
349
320
  };
350
321
 
351
- const conflictingUserCount = await strapi.query('plugin::users-permissions.user').count({
322
+ const conflictingUserCount = await strapi.db.query('plugin::users-permissions.user').count({
352
323
  where: { ...identifierFilter, provider },
353
324
  });
354
325
 
@@ -357,7 +328,7 @@ module.exports = {
357
328
  }
358
329
 
359
330
  if (settings.unique_email) {
360
- const conflictingUserCount = await strapi.query('plugin::users-permissions.user').count({
331
+ const conflictingUserCount = await strapi.db.query('plugin::users-permissions.user').count({
361
332
  where: { ...identifierFilter },
362
333
  });
363
334
 
@@ -427,7 +398,7 @@ module.exports = {
427
398
  async sendEmailConfirmation(ctx) {
428
399
  const { email } = await validateSendEmailConfirmationBody(ctx.request.body);
429
400
 
430
- const user = await strapi.query('plugin::users-permissions.user').findOne({
401
+ const user = await strapi.db.query('plugin::users-permissions.user').findOne({
431
402
  where: { email: email.toLowerCase() },
432
403
  });
433
404