@strapi/plugin-users-permissions 4.20.4 → 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.
- package/admin/src/components/FormModal/index.jsx +1 -2
- package/admin/src/components/Permissions/reducer.js +1 -1
- package/admin/src/components/UsersPermissions/reducer.js +1 -1
- package/admin/src/index.js +14 -30
- package/admin/src/pages/AdvancedSettings/index.jsx +69 -107
- package/admin/src/pages/AdvancedSettings/utils/layout.js +20 -35
- package/admin/src/pages/AdvancedSettings/utils/schema.js +5 -2
- package/admin/src/pages/EmailTemplates/components/EmailForm.jsx +47 -74
- package/admin/src/pages/EmailTemplates/index.jsx +22 -50
- package/admin/src/pages/EmailTemplates/utils/schema.js +18 -6
- package/admin/src/pages/Providers/index.jsx +91 -96
- package/admin/src/pages/Providers/utils/forms.js +11 -11
- package/admin/src/pages/Roles/constants.js +3 -3
- package/admin/src/pages/Roles/hooks/usePlugins.js +5 -4
- package/admin/src/pages/Roles/index.jsx +9 -18
- package/admin/src/pages/Roles/pages/CreatePage.jsx +21 -28
- package/admin/src/pages/Roles/pages/EditPage.jsx +23 -40
- package/admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx +23 -27
- package/admin/src/pages/Roles/pages/ListPage/index.jsx +42 -38
- package/admin/src/pages/Roles/pages/ListPage/utils/api.js +6 -6
- package/admin/src/translations/en.json +1 -1
- package/dist/_chunks/EditViewPage-xYzUSAwS-5mOQ_-nB.mjs +84370 -0
- package/dist/_chunks/EditViewPage-xYzUSAwS-5mOQ_-nB.mjs.map +1 -0
- package/dist/_chunks/EditViewPage-xYzUSAwS-wpHlxdkC.js +84398 -0
- package/dist/_chunks/EditViewPage-xYzUSAwS-wpHlxdkC.js.map +1 -0
- package/dist/_chunks/Helmet-d9JljxUo.js +1010 -0
- package/dist/_chunks/Helmet-d9JljxUo.js.map +1 -0
- package/dist/_chunks/Helmet-kyJ1Zklj.mjs +1008 -0
- package/dist/_chunks/Helmet-kyJ1Zklj.mjs.map +1 -0
- package/dist/_chunks/ListViewPage-xOVa04T_-elahT0e9.js +1618 -0
- package/dist/_chunks/ListViewPage-xOVa04T_-elahT0e9.js.map +1 -0
- package/dist/_chunks/ListViewPage-xOVa04T_-lbfb219V.mjs +1595 -0
- package/dist/_chunks/ListViewPage-xOVa04T_-lbfb219V.mjs.map +1 -0
- package/dist/_chunks/ReviewWorkflowsColumn-FDxVKdto-IWfB3WVH.mjs +33 -0
- package/dist/_chunks/ReviewWorkflowsColumn-FDxVKdto-IWfB3WVH.mjs.map +1 -0
- package/dist/_chunks/ReviewWorkflowsColumn-FDxVKdto-m8hslkeI.js +33 -0
- package/dist/_chunks/ReviewWorkflowsColumn-FDxVKdto-m8hslkeI.js.map +1 -0
- package/dist/_chunks/constants-WjN6I3sL-7e3gpx4b.mjs +190 -0
- package/dist/_chunks/constants-WjN6I3sL-7e3gpx4b.mjs.map +1 -0
- package/dist/_chunks/constants-WjN6I3sL-cDZPE6ED.js +209 -0
- package/dist/_chunks/constants-WjN6I3sL-cDZPE6ED.js.map +1 -0
- package/dist/_chunks/{en-m608rMZx.js → en-TaNIVnDO.js} +2 -2
- package/dist/_chunks/en-TaNIVnDO.js.map +1 -0
- package/dist/_chunks/{en-CE3wEy_c.mjs → en-jvJ-d-Qq.mjs} +2 -2
- package/dist/_chunks/en-jvJ-d-Qq.mjs.map +1 -0
- package/dist/_chunks/{index-BWyhWRPa.mjs → index-53jX2hhF.mjs} +28 -36
- package/dist/_chunks/index-53jX2hhF.mjs.map +1 -0
- package/dist/_chunks/index-5ZvCaCyY-06DLg5eU.mjs +16421 -0
- package/dist/_chunks/index-5ZvCaCyY-06DLg5eU.mjs.map +1 -0
- package/dist/_chunks/index-5ZvCaCyY-JgYo3Jws.js +16446 -0
- package/dist/_chunks/index-5ZvCaCyY-JgYo3Jws.js.map +1 -0
- package/dist/_chunks/{index-kKUYoIsq.mjs → index-A3oJlPcE.mjs} +111 -108
- package/dist/_chunks/index-A3oJlPcE.mjs.map +1 -0
- package/dist/_chunks/{index-MfP0ffb0.js → index-MEUac_4V.js} +124 -122
- package/dist/_chunks/index-MEUac_4V.js.map +1 -0
- package/dist/_chunks/index-N-GcFWtg.mjs +261 -0
- package/dist/_chunks/index-N-GcFWtg.mjs.map +1 -0
- package/dist/_chunks/{index-tUo88Kqt.js → index-TJUxOCtJ.js} +28 -36
- package/dist/_chunks/index-TJUxOCtJ.js.map +1 -0
- package/dist/_chunks/{index-sarofNNK.js → index-VgvlwVA7.js} +106 -147
- package/dist/_chunks/index-VgvlwVA7.js.map +1 -0
- package/dist/_chunks/{index-KmMoN4sr.js → index-bRuKnVcH.js} +39 -32
- package/dist/_chunks/index-bRuKnVcH.js.map +1 -0
- package/dist/_chunks/{index-FETf_nGC.mjs → index-ee_14Ldw.mjs} +36 -29
- package/dist/_chunks/index-ee_14Ldw.mjs.map +1 -0
- package/dist/_chunks/index-mzJ2Vb5u.js +280 -0
- package/dist/_chunks/index-mzJ2Vb5u.js.map +1 -0
- package/dist/_chunks/{index-xHL-7Hse.mjs → index-vXywiVeM.mjs} +101 -142
- package/dist/_chunks/index-vXywiVeM.mjs.map +1 -0
- package/dist/_chunks/useSyncRbac-Kt8Li0Yf-Z54sMEPM.mjs +39 -0
- package/dist/_chunks/useSyncRbac-Kt8Li0Yf-Z54sMEPM.mjs.map +1 -0
- package/dist/_chunks/useSyncRbac-Kt8Li0Yf-h8HqtZ6y.js +57 -0
- package/dist/_chunks/useSyncRbac-Kt8Li0Yf-h8HqtZ6y.js.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/style.css +84 -0
- package/package.json +15 -15
- package/server/bootstrap/grant-config.js +9 -0
- package/server/bootstrap/index.js +2 -39
- package/server/content-types/user/index.js +0 -1
- package/server/controllers/auth.js +24 -53
- package/server/controllers/content-manager-user.js +24 -28
- package/server/controllers/role.js +1 -1
- package/server/controllers/user.js +5 -5
- package/server/middlewares/rateLimit.js +1 -1
- package/server/register.js +1 -1
- package/server/services/jwt.js +3 -3
- package/server/services/permission.js +3 -7
- package/server/services/providers-registry.js +15 -0
- package/server/services/providers.js +10 -5
- package/server/services/role.js +15 -13
- package/server/services/user.js +28 -14
- package/server/services/users-permissions.js +12 -10
- package/server/utils/sanitize/sanitizers.js +2 -2
- package/dist/_chunks/en-CE3wEy_c.mjs.map +0 -1
- package/dist/_chunks/en-m608rMZx.js.map +0 -1
- package/dist/_chunks/index-4W1jrPVd.js +0 -320
- package/dist/_chunks/index-4W1jrPVd.js.map +0 -1
- package/dist/_chunks/index-BWyhWRPa.mjs.map +0 -1
- package/dist/_chunks/index-FETf_nGC.mjs.map +0 -1
- package/dist/_chunks/index-H0k1w1px.mjs +0 -301
- package/dist/_chunks/index-H0k1w1px.mjs.map +0 -1
- package/dist/_chunks/index-KmMoN4sr.js.map +0 -1
- package/dist/_chunks/index-MfP0ffb0.js.map +0 -1
- package/dist/_chunks/index-kKUYoIsq.mjs.map +0 -1
- package/dist/_chunks/index-sarofNNK.js.map +0 -1
- package/dist/_chunks/index-tUo88Kqt.js.map +0 -1
- package/dist/_chunks/index-xHL-7Hse.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;;"}
|
package/dist/admin/index.js
CHANGED
package/dist/admin/index.mjs
CHANGED
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": "
|
|
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",
|
|
@@ -46,14 +46,14 @@
|
|
|
46
46
|
"watch": "pack-up watch"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@strapi/design-system": "1.
|
|
50
|
-
"@strapi/helper-plugin": "
|
|
51
|
-
"@strapi/icons": "1.
|
|
52
|
-
"@strapi/utils": "
|
|
49
|
+
"@strapi/design-system": "1.16.0",
|
|
50
|
+
"@strapi/helper-plugin": "5.0.0-alpha.0",
|
|
51
|
+
"@strapi/icons": "1.16.0",
|
|
52
|
+
"@strapi/utils": "5.0.0-alpha.0",
|
|
53
53
|
"bcryptjs": "2.4.3",
|
|
54
|
-
"formik": "2.4.
|
|
54
|
+
"formik": "2.4.5",
|
|
55
55
|
"grant-koa": "5.4.8",
|
|
56
|
-
"immer": "9.0.
|
|
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.
|
|
64
|
+
"react-intl": "6.6.2",
|
|
65
65
|
"react-query": "3.39.3",
|
|
66
|
-
"react-redux": "8.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": "
|
|
72
|
-
"@strapi/strapi": "
|
|
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": "
|
|
80
|
-
"styled-components": "5.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": "^
|
|
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": "
|
|
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
|
|
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
|
|
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
|
};
|
|
@@ -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 {
|
|
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.
|
|
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:
|
|
241
|
-
ADMIN_URL:
|
|
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
|
|
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
|
|