From 78d1e6207458a064c9b193dfad3d655613ebb340 Mon Sep 17 00:00:00 2001 From: Laurin Weger <59744144+Laurin-W@users.noreply.github.com> Date: Tue, 1 Oct 2024 18:39:22 +0200 Subject: [PATCH 1/3] Allow legacy signature service to start without `actorsKeyPairsDir` setting --- src/middleware/packages/crypto/signature/keypair.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/middleware/packages/crypto/signature/keypair.js b/src/middleware/packages/crypto/signature/keypair.js index 79e1dd458..f09baf6ba 100644 --- a/src/middleware/packages/crypto/signature/keypair.js +++ b/src/middleware/packages/crypto/signature/keypair.js @@ -19,10 +19,10 @@ const SignatureService = { actorsKeyPairsDir: null }, async created() { - if (!this.settings.actorsKeyPairsDir) { - throw new Error('You must set the actorsKeyPairsDir setting in the signature service'); - } else if (!fs.existsSync(this.settings.actorsKeyPairsDir)) { + if (this.settings.actorsKeyPairsDir && !fs.existsSync(this.settings.actorsKeyPairsDir)) { throw new Error(`The actorsKeyPairsDir (${this.settings.actorsKeyPairsDir}) does not exist! Please create it.`); + } else { + this.logger.info("The actorsKeyPairsDir is not set. The legacy service will call the new service's actions."); } }, async started() { From 62b54757e5ce6e7c522031d29e2497cc5b6bc8e3 Mon Sep 17 00:00:00 2001 From: Laurin Weger <59744144+Laurin-W@users.noreply.github.com> Date: Thu, 10 Oct 2024 18:22:43 +0200 Subject: [PATCH 2/3] fix: Login/SignupForm invalidation --- .../packages/auth-provider/dist/index.cjs.js | 341 +++++++++-------- .../auth-provider/dist/index.cjs.js.map | 2 +- .../packages/auth-provider/dist/index.d.ts | 10 +- .../auth-provider/dist/index.d.ts.map | 2 +- .../packages/auth-provider/dist/index.es.js | 343 ++++++++++-------- .../auth-provider/dist/index.es.js.map | 2 +- .../packages/auth-provider/package.json | 3 +- .../components/LocalLoginPage/LoginForm.js | 150 +++++--- .../components/LocalLoginPage/SignupForm.js | 239 ++++++------ 9 files changed, 614 insertions(+), 478 deletions(-) diff --git a/src/frontend/packages/auth-provider/dist/index.cjs.js b/src/frontend/packages/auth-provider/dist/index.cjs.js index bc0891c37..b766be283 100644 --- a/src/frontend/packages/auth-provider/dist/index.cjs.js +++ b/src/frontend/packages/auth-provider/dist/index.cjs.js @@ -20,6 +20,7 @@ var $4Uj5b$muimaterialstyles = require("@mui/material/styles"); var $4Uj5b$reactrouterdom = require("react-router-dom"); var $4Uj5b$muiiconsmaterialLock = require("@mui/icons-material/Lock"); var $4Uj5b$speakingurl = require("speakingurl"); +var $4Uj5b$reacthookform = require("react-hook-form"); var $4Uj5b$muistyles = require("@mui/styles"); var $4Uj5b$muiiconsmaterialAccountCircle = require("@mui/icons-material/AccountCircle"); var $4Uj5b$lodashisEqual = require("lodash/isEqual"); @@ -1506,6 +1507,7 @@ var $0af8eee27f6a6e9f$export$2e2bcd8739ae039 = $0af8eee27f6a6e9f$var$SsoLoginPag + const $19e4629c708b7a3e$var$useSignup = ()=>{ const authProvider = (0, $4Uj5b$reactadmin.useAuthProvider)(); return (0, $4Uj5b$react.useCallback)((params = {})=>authProvider.signup(params), [ @@ -1660,8 +1662,16 @@ function $edfec7f9e9fd7881$export$2e2bcd8739ae039({ scorer: scorer = (0, $d1ca1e const [searchParams] = (0, $4Uj5b$reactrouterdom.useSearchParams)(); const redirectTo = searchParams.get("redirect") || "/"; const [locale] = (0, $4Uj5b$reactadmin.useLocaleState)(); - const [password, setPassword] = (0, $4Uj5b$react.useState)(""); - const submit = (0, $4Uj5b$react.useCallback)(async (values)=>{ + const methods = (0, $4Uj5b$reacthookform.useForm)({ + defaultValues: { + username: "", + email: searchParams.get("email") || "", + password: "" + } + }); + const { handleSubmit: handleSubmit, register: register, formState: { errors: errors, isSubmitting: isSubmitting }, watch: watch, reset: reset } = methods; + const password = watch("password"); + const onSubmit = async (values)=>{ try { setLoading(true); await signup({ @@ -1674,120 +1684,128 @@ function $edfec7f9e9fd7881$export$2e2bcd8739ae039({ scorer: scorer = (0, $d1ca1e }, delayBeforeRedirect); } catch (error) { setLoading(false); + // Reset form to current values to ensure consistency... + reset(values, { + keepValues: true + }); notify(typeof error === "string" ? error : typeof error === "undefined" || !error.message ? "ra.auth.sign_in_error" : error.message, { type: "warning", _: typeof error === "string" ? error : error && error.message ? error.message : undefined }); } - }, [ - setLoading, - signup, - additionalSignupValues, - redirectTo, - notify, - onSignup - ]); - return /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $4Uj5b$reactadmin.Form), { - onSubmit: submit, - noValidate: true, - defaultValues: { - email: searchParams.get("email") - }, - children: /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsxs)((0, $4Uj5b$muimaterial.CardContent), { - children: [ - /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $4Uj5b$reactadmin.TextInput), { - autoFocus: true, - source: "username", - label: translate("auth.input.username"), - autoComplete: "username", - fullWidth: true, - disabled: loading, - validate: [ - (0, $4Uj5b$reactadmin.required)(), - (0, $4Uj5b$reactadmin.minLength)(2) - ], - format: (value)=>value ? (0, ($parcel$interopDefault($4Uj5b$speakingurl)))(value, { - lang: locale || "fr", - separator: "_", - custom: [ - ".", - "-", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9" - ] - }) : "" - }), - /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $4Uj5b$reactadmin.TextInput), { - source: "email", - label: translate("auth.input.email"), - autoComplete: "email", - fullWidth: true, - disabled: loading || searchParams.has("email") && searchParams.has("force-email"), - validate: [ - (0, $4Uj5b$reactadmin.required)(), - (0, $4Uj5b$reactadmin.email)() - ] - }), - passwordScorer && password && !(searchParams.has("email") && searchParams.has("force-email")) && /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsxs)((0, $4Uj5b$reactjsxruntime.Fragment), { - children: [ - /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsxs)((0, $4Uj5b$muimaterial.Typography), { - variant: "caption", - style: { - marginBottom: 3 + }; + const formatUsername = (value)=>{ + return value ? (0, ($parcel$interopDefault($4Uj5b$speakingurl)))(value, { + lang: locale || "fr", + separator: "_", + custom: [ + ".", + "-", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" + ] + }) : ""; + }; + return /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $4Uj5b$reacthookform.FormProvider), { + ...methods, + children: /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)("form", { + onSubmit: handleSubmit(onSubmit), + noValidate: true, + children: /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsxs)((0, $4Uj5b$muimaterial.CardContent), { + children: [ + /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $4Uj5b$muimaterial.TextField), { + ...register("username", { + required: translate("ra.validation.required"), + minLength: { + value: 2, + message: translate("ra.validation.minLength", { + min: 2 + }) }, - children: [ - translate("auth.input.password_strength"), - ":", - " " - ] + setValueAs: formatUsername }), - /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $edfec7f9e9fd7881$export$2e2bcd8739ae039), { - password: password, - scorer: passwordScorer, - sx: { - width: "100%" + label: translate("auth.input.username"), + error: !!errors.username, + helperText: translate(errors.username?.message), + fullWidth: true, + disabled: loading, + margin: "normal" + }), + /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $4Uj5b$muimaterial.TextField), { + ...register("email", { + required: translate("ra.validation.required"), + pattern: { + value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i, + message: translate("ra.validation.email") } - }) - ] - }), - /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $4Uj5b$reactadmin.TextInput), { - source: "password", - type: "password", - value: password, - onChange: (e)=>setPassword(e.target.value), - label: translate("ra.auth.password"), - autoComplete: "new-password", - fullWidth: true, - disabled: loading || searchParams.has("email") && searchParams.has("force-email"), - validate: [ - (0, $4Uj5b$reactadmin.required)(), - (0, $eab41bc89667b2c6$export$2e2bcd8739ae039)(passwordScorer) - ] - }), - /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $4Uj5b$muimaterial.Button), { - variant: "contained", - type: "submit", - color: "primary", - disabled: loading, - fullWidth: true, - children: translate("auth.action.signup") - }) - ] + }), + label: translate("auth.input.email"), + error: !!errors.email, + autoComplete: "email", + helperText: translate(errors.email?.message), + fullWidth: true, + disabled: loading || searchParams.has("email") && searchParams.has("force-email") + }), + passwordScorer && password && !(searchParams.has("email") && searchParams.has("force-email")) && /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsxs)((0, $4Uj5b$reactjsxruntime.Fragment), { + children: [ + /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsxs)((0, $4Uj5b$muimaterial.Typography), { + variant: "caption", + style: { + marginBottom: 3 + }, + children: [ + translate("auth.input.password_strength"), + ":", + " " + ] + }), + /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $edfec7f9e9fd7881$export$2e2bcd8739ae039), { + password: password, + scorer: passwordScorer, + sx: { + width: "100%" + } + }) + ] + }), + /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $4Uj5b$muimaterial.TextField), { + ...register("password", { + required: translate("ra.validation.required"), + validate: (value)=>(0, $eab41bc89667b2c6$export$2e2bcd8739ae039)(passwordScorer)(value) + }), + type: "password", + value: password, + label: translate("ra.auth.password"), + error: !!errors.password, + helperText: translate(errors.password?.message), + autoComplete: "new-password", + fullWidth: true, + disabled: loading || searchParams.has("email") && searchParams.has("force-email") + }), + /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $4Uj5b$muimaterial.Button), { + variant: "contained", + type: "submit", + color: "primary", + disabled: loading || isSubmitting, + fullWidth: true, + sx: { + mt: 2 + }, + children: translate("auth.action.signup") + }) + ] + }) }) }); }; -$5f70c240e5b0340c$var$SignupForm.defaultValues = { - redirectTo: "/", - additionalSignupValues: {} -}; var $5f70c240e5b0340c$export$2e2bcd8739ae039 = $5f70c240e5b0340c$var$SignupForm; @@ -1803,7 +1821,14 @@ const $8a2df01c9f2675bb$var$LoginForm = ({ onLogin: onLogin, allowUsername: allo const notify = (0, $4Uj5b$reactadmin.useNotify)(); const [searchParams] = (0, $4Uj5b$reactrouterdom.useSearchParams)(); const redirectTo = searchParams.get("redirect") || "/"; - const submit = (0, $4Uj5b$react.useCallback)(async (values)=>{ + const methods = (0, $4Uj5b$reacthookform.useForm)({ + defaultValues: { + username: searchParams.get("email") || "", + password: "" + } + }); + const { handleSubmit: handleSubmit, register: register, formState: { errors: errors, isSubmitting: isSubmitting }, reset: reset } = methods; + const onSubmit = async (values)=>{ try { setLoading(true); await login(values); @@ -1811,6 +1836,10 @@ const $8a2df01c9f2675bb$var$LoginForm = ({ onLogin: onLogin, allowUsername: allo else window.location.href = redirectTo; } catch (error) { setLoading(false); + // Reset form to current values to ensure consistency + reset(values, { + keepValues: true + }); notify(typeof error === "string" ? error : typeof error === "undefined" || !error.message ? "ra.auth.sign_in_error" : error.message, { type: "warning", messageArgs: { @@ -1818,53 +1847,59 @@ const $8a2df01c9f2675bb$var$LoginForm = ({ onLogin: onLogin, allowUsername: allo } }); } - }, [ - setLoading, - login, - redirectTo, - notify, - onLogin - ]); - return /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $4Uj5b$reactadmin.Form), { - onSubmit: submit, - noValidate: true, - defaultValues: { - username: searchParams.get("email") - }, - children: /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsxs)((0, $4Uj5b$muimaterial.CardContent), { - children: [ - /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $4Uj5b$reactadmin.TextInput), { - source: "username", - label: translate(allowUsername ? "auth.input.username_or_email" : "auth.input.email"), - autoComplete: "email", - fullWidth: true, - disabled: loading || searchParams.has("email") && searchParams.has("force-email"), - format: (value)=>value ? value.toLowerCase() : "", - validate: allowUsername ? [ - (0, $4Uj5b$reactadmin.required)() - ] : [ - (0, $4Uj5b$reactadmin.required)(), - (0, $4Uj5b$reactadmin.email)() - ] - }), - /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $4Uj5b$reactadmin.TextInput), { - source: "password", - type: "password", - label: translate("ra.auth.password"), - autoComplete: "current-password", - fullWidth: true, - disabled: loading || searchParams.has("email") && searchParams.has("force-email"), - validate: (0, $4Uj5b$reactadmin.required)() - }), - /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $4Uj5b$muimaterial.Button), { - variant: "contained", - type: "submit", - color: "primary", - disabled: loading, - fullWidth: true, - children: translate("auth.action.login") - }) - ] + }; + return /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $4Uj5b$reacthookform.FormProvider), { + ...methods, + children: /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)("form", { + onSubmit: handleSubmit(onSubmit), + noValidate: true, + children: /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsxs)((0, $4Uj5b$muimaterial.CardContent), { + children: [ + /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $4Uj5b$muimaterial.TextField), { + ...register("username", { + required: translate("ra.validation.required"), + validate: (value)=>{ + if (!allowUsername) { + const validationRes = (0, $4Uj5b$reactadmin.email)()(value); + return validationRes.message ?? validationRes ?? true; + } + return true; + }, + setValueAs: (value)=>value.toLowerCase() + }), + label: translate(allowUsername ? "auth.input.username_or_email" : "auth.input.email"), + error: !!errors.username, + helperText: translate(errors.username?.message), + autoComplete: "email", + fullWidth: true, + disabled: loading || searchParams.has("email") && searchParams.has("force-email"), + margin: "normal" + }), + /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $4Uj5b$muimaterial.TextField), { + ...register("password", { + required: translate("ra.validation.required") + }), + type: "password", + label: translate("ra.auth.password"), + error: !!errors.password, + helperText: translate(errors.password?.message), + autoComplete: "current-password", + fullWidth: true, + disabled: loading || searchParams.has("email") && searchParams.has("force-email") + }), + /*#__PURE__*/ (0, $4Uj5b$reactjsxruntime.jsx)((0, $4Uj5b$muimaterial.Button), { + variant: "contained", + type: "submit", + color: "primary", + disabled: loading || isSubmitting, + fullWidth: true, + sx: { + mt: 2 + }, + children: translate("auth.action.login") + }) + ] + }) }) }); }; diff --git a/src/frontend/packages/auth-provider/dist/index.cjs.js.map b/src/frontend/packages/auth-provider/dist/index.cjs.js.map index 198a6e57d..5dd50c7ce 100644 --- a/src/frontend/packages/auth-provider/dist/index.cjs.js.map +++ b/src/frontend/packages/auth-provider/dist/index.cjs.js.map @@ -1 +1 @@ -{"mappings":"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","sources":["packages/auth-provider/src/index.ts","packages/auth-provider/src/authProvider.js","packages/auth-provider/src/utils.js","packages/auth-provider/src/crud/create/CreateWithPermissions.js","packages/auth-provider/src/hooks/useCheckPermissions.ts","packages/auth-provider/src/constants.ts","packages/auth-provider/src/crud/edit/EditWithPermissions.js","packages/auth-provider/src/crud/edit/EditActionsWithPermissions.tsx","packages/auth-provider/src/components/PermissionsButton/PermissionsButton.js","packages/auth-provider/src/components/PermissionsButton/PermissionsDialog.js","packages/auth-provider/src/components/PermissionsButton/AddPermissionsForm.js","packages/auth-provider/src/components/PermissionsButton/EditPermissionsForm.js","packages/auth-provider/src/components/PermissionsButton/AgentItem.js","packages/auth-provider/src/components/PermissionsButton/AgentIcon.js","packages/auth-provider/src/hooks/useAgents.js","packages/auth-provider/src/crud/edit/EditToolbarWithPermissions.tsx","packages/auth-provider/src/crud/edit/DeleteButtonWithPermissions.js","packages/auth-provider/src/crud/edit/EditButtonWithPermissions.js","packages/auth-provider/src/crud/list/ListWithPermissions.js","packages/auth-provider/src/crud/list/ListActionsWithPermissions.js","packages/auth-provider/src/crud/show/ShowWithPermissions.js","packages/auth-provider/src/crud/show/ShowActionsWithPermissions.tsx","packages/auth-provider/src/components/AuthDialog.js","packages/auth-provider/src/components/SsoLoginPage.js","packages/auth-provider/src/components/LocalLoginPage/LocalLoginPage.js","packages/auth-provider/src/components/LocalLoginPage/SignupForm.js","packages/auth-provider/src/hooks/useSignup.js","packages/auth-provider/src/components/LocalLoginPage/validatePasswordStrength.js","packages/auth-provider/src/passwordScorer.js","packages/auth-provider/src/components/LocalLoginPage/PasswordStrengthIndicator.js","packages/auth-provider/src/components/LocalLoginPage/ColorGradientProgressBar.js","packages/auth-provider/src/components/LocalLoginPage/LoginForm.js","packages/auth-provider/src/components/LocalLoginPage/NewPasswordForm.js","packages/auth-provider/src/components/LocalLoginPage/ResetPasswordForm.js","packages/auth-provider/src/components/LocalLoginPage/SimpleBox.js","packages/auth-provider/src/components/LocalLoginPage/getSearchParamsRest.js","packages/auth-provider/src/components/ResourceWithPermissions.js","packages/auth-provider/src/components/UserMenu.js","packages/auth-provider/src/hooks/useCheckAuthenticated.js","packages/auth-provider/src/hooks/usePermissionsWithRefetch.js","packages/auth-provider/src/messages/english.js","packages/auth-provider/src/messages/french.js"],"sourcesContent":["export { default as authProvider } from './authProvider';\n\n// Create\nexport { default as CreateWithPermissions } from './crud/create/CreateWithPermissions';\n\n// Edit\nexport { default as EditWithPermissions } from './crud/edit/EditWithPermissions';\nexport { default as EditActionsWithPermissions } from './crud/edit/EditActionsWithPermissions';\nexport { default as EditToolbarWithPermissions } from './crud/edit/EditToolbarWithPermissions';\nexport { default as EditButtonWithPermissions } from './crud/edit/EditButtonWithPermissions';\nexport { default as DeleteButtonWithPermissions } from './crud/edit/DeleteButtonWithPermissions';\n\n// List\nexport { default as ListWithPermissions } from './crud/list/ListWithPermissions';\nexport { default as ListActionsWithPermissions } from './crud/list/ListActionsWithPermissions';\n\n// Show\nexport { default as ShowWithPermissions } from './crud/show/ShowWithPermissions';\nexport { default as ShowActionsWithPermissions } from './crud/show/ShowActionsWithPermissions';\n\nexport { default as PermissionsButton } from './components/PermissionsButton/PermissionsButton';\nexport { default as AuthDialog } from './components/AuthDialog';\nexport { default as SsoLoginPage, default as LoginPage } from './components/SsoLoginPage';\nexport { default as LocalLoginPage } from './components/LocalLoginPage/LocalLoginPage';\nexport { default as ResourceWithPermissions } from './components/ResourceWithPermissions';\nexport { default as UserMenu } from './components/UserMenu';\n\nexport { default as useAgents } from './hooks/useAgents';\nexport { default as useCheckAuthenticated } from './hooks/useCheckAuthenticated';\nexport { default as useCheckPermissions } from './hooks/useCheckPermissions';\nexport { default as usePermissionsWithRefetch } from './hooks/usePermissionsWithRefetch';\nexport { default as useSignup } from './hooks/useSignup';\n\n// Password scoring\nexport { default as PasswordStrengthIndicator } from './components/LocalLoginPage/PasswordStrengthIndicator';\nexport { default as validatePasswordStrength } from './components/LocalLoginPage/validatePasswordStrength';\nexport {\n defaultScorer as defaultPasswordScorer,\n defaultOptions as defaultPasswordScorerOptions,\n createPasswordScorer\n} from './passwordScorer';\n\nexport { default as englishMessages } from './messages/english';\nexport { default as frenchMessages } from './messages/french';\n","import jwtDecode from 'jwt-decode';\nimport urlJoin from 'url-join';\nimport * as oauth from 'oauth4webapi';\nimport { defaultToArray, getAclUri, getAclContext, getAuthServerUrl } from './utils';\n\nconst AUTH_TYPE_SSO = 'sso';\nconst AUTH_TYPE_LOCAL = 'local';\nconst AUTH_TYPE_POD = 'pod';\nconst AUTH_TYPE_SOLID_OIDC = 'solid-oidc';\n\nconst authProvider = ({\n dataProvider,\n authType,\n allowAnonymous = true,\n checkUser,\n checkPermissions = false,\n clientId\n}) => {\n if (![AUTH_TYPE_SSO, AUTH_TYPE_LOCAL, AUTH_TYPE_POD, AUTH_TYPE_SOLID_OIDC].includes(authType))\n throw new Error('The authType parameter is missing from the auth provider');\n if (authType === AUTH_TYPE_SOLID_OIDC && !clientId)\n throw new Error('The clientId parameter is required for solid-oidc authentication');\n const callCheckUser = async webId => {\n if (checkUser) {\n try {\n const { json: userData } = await dataProvider.fetch(webId);\n if (!userData) throw new Error('auth.message.unable_to_fetch_user_data');\n if (checkUser(userData) === false) throw new Error('auth.message.user_not_allowed_to_login');\n } catch (e) {\n localStorage.removeItem('token');\n throw e;\n }\n }\n };\n return {\n login: async params => {\n if (authType === AUTH_TYPE_SOLID_OIDC) {\n let { webId, issuer, redirect = '/', isSignup = false } = params;\n\n if (webId && !issuer) {\n // Find issuer from webId\n const { json: userData } = await dataProvider.fetch(webId);\n if (!userData) throw new Error('auth.message.unable_to_fetch_user_data');\n if (!userData['solid:oidcIssuer']) throw new Error('auth.message.no_associated_oidc_issuer');\n issuer = userData?.['solid:oidcIssuer'];\n }\n\n const as = await oauth\n .discoveryRequest(new URL(issuer))\n .then(response => oauth.processDiscoveryResponse(new URL(issuer), response))\n .catch(() => {\n throw new Error('auth.message.unreachable_auth_server');\n });\n\n const codeVerifier = oauth.generateRandomCodeVerifier();\n const codeChallenge = await oauth.calculatePKCECodeChallenge(codeVerifier);\n const codeChallengeMethod = 'S256';\n\n // Save to use on handleCallback method\n localStorage.setItem('code_verifier', codeVerifier);\n localStorage.setItem('redirect', redirect);\n\n const authorizationUrl = new URL(as.authorization_endpoint);\n authorizationUrl.searchParams.set('response_type', 'code');\n authorizationUrl.searchParams.set('client_id', clientId);\n authorizationUrl.searchParams.set('code_challenge', codeChallenge);\n authorizationUrl.searchParams.set('code_challenge_method', codeChallengeMethod);\n authorizationUrl.searchParams.set('redirect_uri', `${window.location.origin}/auth-callback`);\n authorizationUrl.searchParams.set('scope', 'openid webid offline_access');\n authorizationUrl.searchParams.set('is_signup', isSignup);\n\n window.location = authorizationUrl;\n } else if (authType === AUTH_TYPE_LOCAL) {\n const { username, password } = params;\n const authServerUrl = await getAuthServerUrl(dataProvider);\n let token, webId;\n\n try {\n ({\n json: { token, webId }\n } = await dataProvider.fetch(urlJoin(authServerUrl, 'auth/login'), {\n method: 'POST',\n body: JSON.stringify({\n username: username.trim(),\n password: password.trim()\n }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n }));\n } catch (e) {\n throw new Error('ra.auth.sign_in_error');\n }\n\n // Set token now as it is required for refreshConfig\n localStorage.setItem('token', token);\n await dataProvider.refreshConfig();\n\n await callCheckUser(webId);\n } else if (authType === AUTH_TYPE_SSO) {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n let redirectUrl = `${new URL(window.location.href).origin}/login?login=true`;\n if (params.redirect) redirectUrl += `&redirect=${encodeURIComponent(params.redirect)}`;\n window.location.href = urlJoin(authServerUrl, `auth?redirectUrl=${encodeURIComponent(redirectUrl)}`);\n }\n },\n handleCallback: async () => {\n const { searchParams } = new URL(window.location);\n\n if (authType === AUTH_TYPE_SOLID_OIDC) {\n const issuer = new URL(searchParams.get('iss'));\n const as = await oauth\n .discoveryRequest(issuer)\n .then(response => oauth.processDiscoveryResponse(issuer, response));\n\n const client = {\n client_id: clientId,\n token_endpoint_auth_method: 'none' // We don't have a client secret\n };\n\n const currentUrl = new URL(window.location.href);\n const params = oauth.validateAuthResponse(as, client, currentUrl, oauth.expectNoState);\n if (oauth.isOAuth2Error(params)) {\n throw new Error(`OAuth error: ${params.error} (${params.error_description})`);\n }\n\n // Retrieve data set during login\n const codeVerifier = localStorage.getItem('code_verifier');\n const redirect = localStorage.getItem('redirect');\n\n const response = await oauth.authorizationCodeGrantRequest(\n as,\n client,\n params,\n `${window.location.origin}/auth-callback`,\n codeVerifier\n );\n\n const result = await oauth.processAuthorizationCodeOpenIDResponse(as, client, response);\n if (oauth.isOAuth2Error(result)) {\n throw new Error(`OAuth error: ${params.error} (${params.error_description})`);\n }\n\n // Until DPoP is implemented, use the ID token to log into local Pod\n // And the proxy endpoint to log into remote Pods\n localStorage.setItem('token', result.id_token);\n\n // Remove we don't need it anymore\n localStorage.removeItem('code_verifier');\n localStorage.removeItem('redirect');\n\n // Reload to ensure the dataServer config is reset\n window.location.href = redirect || '/';\n } else {\n const token = searchParams.get('token');\n if (!token) throw new Error('auth.message.no_token_returned');\n\n let webId;\n try {\n ({ webId } = jwtDecode(token));\n } catch (e) {\n throw new Error('auth.message.invalid_token_returned');\n }\n\n localStorage.setItem('token', token);\n await dataProvider.refreshConfig();\n\n await callCheckUser(webId);\n }\n },\n signup: async params => {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n if (authType === AUTH_TYPE_LOCAL) {\n const { username, email, password, domain, ...profileData } = params;\n let token, webId;\n\n try {\n ({\n json: { token, webId }\n } = await dataProvider.fetch(urlJoin(authServerUrl, 'auth/signup'), {\n method: 'POST',\n body: JSON.stringify({\n username: username?.trim(),\n email: email.trim(),\n password: password.trim(),\n ...profileData\n }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n }));\n } catch (e) {\n if (e.message === 'email.already.exists') {\n throw new Error('auth.message.user_email_exist');\n } else if (e.message === 'username.already.exists') {\n throw new Error('auth.message.username_exist');\n } else if (e.message === 'username.invalid') {\n throw new Error('auth.message.username_invalid');\n } else {\n throw new Error('auth.message.signup_error');\n }\n }\n\n localStorage.setItem('token', token);\n await dataProvider.refreshConfig();\n\n await callCheckUser(webId);\n\n return webId;\n } else {\n const redirectUrl = `${new URL(window.location.href).origin}/login?login=true`;\n window.location.href = urlJoin(authServerUrl, `auth?redirectUrl=${encodeURIComponent(redirectUrl)}`);\n }\n },\n logout: async params => {\n const { redirectUrl } = params || {};\n switch (authType) {\n case AUTH_TYPE_LOCAL: {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n\n // Delete token but also any other value in local storage\n localStorage.clear();\n\n let result = {};\n\n try {\n result = await dataProvider.fetch(urlJoin(authServerUrl, '.well-known/openid-configuration'));\n } catch (e) {\n // Do nothing if it fails\n }\n\n if (result.status === 200 && result.json) {\n // Redirect to OIDC endpoint if it exists\n window.location.href = result.json.end_session_endpoint;\n } else {\n // Reload to ensure the dataServer config is reset\n window.location.reload();\n window.location.href = '/';\n }\n\n break;\n }\n\n case AUTH_TYPE_SSO: {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n const baseUrl = new URL(window.location.href).origin;\n return urlJoin(\n authServerUrl,\n `auth/logout?redirectUrl=${encodeURIComponent(`${urlJoin(baseUrl, 'login')}?logout=true`)}`\n );\n }\n\n case AUTH_TYPE_POD: {\n const token = localStorage.getItem('token');\n if (token) {\n const { webId } = jwtDecode(token);\n // Delete token but also any other value in local storage\n localStorage.clear();\n // Redirect to the POD provider\n return `${urlJoin(webId, 'openApp')}?type=${encodeURIComponent(\n 'http://activitypods.org/ns/core#FrontAppRegistration'\n )}`;\n }\n break;\n }\n\n case AUTH_TYPE_SOLID_OIDC: {\n const token = localStorage.getItem('token');\n if (token) {\n const { webid: webId } = jwtDecode(token); // Not webId !!\n\n // Delete token but also any other value in local storage\n localStorage.clear();\n\n if (redirectUrl) {\n return redirectUrl;\n } else {\n // We don't need the token to fetch the WebID since it is public\n const { json: userData } = await dataProvider.fetch(webId);\n\n // Redirect to the Pod provider\n return userData?.['solid:oidcIssuer'] || new URL(webId).origin;\n }\n } else {\n return redirectUrl;\n }\n }\n\n default:\n break;\n }\n },\n checkAuth: async () => {\n const token = localStorage.getItem('token');\n if (!token && !allowAnonymous) throw new Error();\n },\n checkUser: userData => {\n if (checkUser) {\n return checkUser(userData);\n }\n return true;\n },\n checkError: error => {\n // We want to disconnect only with INVALID_TOKEN errors\n if (error.status === 401 && error.body && error.body.type === 'INVALID_TOKEN') {\n localStorage.removeItem('token');\n return Promise.reject();\n } else {\n // Other error code (404, 500, etc): no need to log out\n return Promise.resolve();\n }\n },\n getPermissions: async uri => {\n if (!checkPermissions) return;\n\n // React-admin calls getPermissions with an empty object on every page refresh\n // It also passes an object `{ params: { route: 'dashboard' } }` on the Dashboard\n // Ignore all this until we found a way to bypass these redundant calls\n if (typeof uri === 'object') return;\n\n if (!uri || !uri.startsWith('http'))\n throw new Error('The first parameter passed to getPermissions must be an URL');\n\n const aclUri = getAclUri(uri);\n\n try {\n const { json } = await dataProvider.fetch(aclUri);\n return json['@graph'];\n } catch (e) {\n console.warn(`Could not fetch ACL URI ${uri}`);\n return [];\n }\n },\n addPermission: async (uri, agentId, predicate, mode) => {\n if (!uri || !uri.startsWith('http'))\n throw new Error('The first parameter passed to addPermission must be an URL');\n\n const aclUri = getAclUri(uri);\n\n const authorization = {\n '@id': `#${mode.replace('acl:', '')}`,\n '@type': 'acl:Authorization',\n [predicate]: agentId,\n 'acl:accessTo': uri,\n 'acl:mode': mode\n };\n\n await dataProvider.fetch(aclUri, {\n method: 'PATCH',\n body: JSON.stringify({\n '@context': getAclContext(aclUri),\n '@graph': [authorization]\n })\n });\n },\n removePermission: async (uri, agentId, predicate, mode) => {\n if (!uri || !uri.startsWith('http'))\n throw new Error('The first parameter passed to removePermission must be an URL');\n\n const aclUri = getAclUri(uri);\n\n // Fetch current permissions\n const { json } = await dataProvider.fetch(aclUri);\n\n const updatedPermissions = json['@graph']\n .filter(authorization => !authorization['@id'].includes('#Default'))\n .map(authorization => {\n const modes = defaultToArray(authorization['acl:mode']);\n let agents = defaultToArray(authorization[predicate]);\n if (mode && modes.includes(mode) && agents && agents.includes(agentId)) {\n agents = agents.filter(agent => agent !== agentId);\n }\n return { ...authorization, [predicate]: agents };\n });\n\n await dataProvider.fetch(aclUri, {\n method: 'PUT',\n body: JSON.stringify({\n '@context': getAclContext(aclUri),\n '@graph': updatedPermissions\n })\n });\n },\n getIdentity: async () => {\n const token = localStorage.getItem('token');\n if (token) {\n const payload = jwtDecode(token);\n\n // Backend-generated tokens use webId but Solid-OIDC tokens use webid\n const webId = authType === AUTH_TYPE_SOLID_OIDC ? payload.webid : payload.webId;\n\n if (!webId) {\n // If webId is not set, it is probably because we have ActivityPods v1 tokens and we need to disconnect\n localStorage.removeItem('token');\n window.location.href = '/login';\n throw new Error('No webId found on provided token !');\n }\n\n const { json: webIdData } = await dataProvider.fetch(webId);\n const { json: profileData } = webIdData.url ? await dataProvider.fetch(webIdData.url) : {};\n\n return {\n id: webId,\n fullName:\n profileData?.['vcard:given-name'] ||\n profileData?.['pair:label'] ||\n webIdData['foaf:name'] ||\n webIdData['pair:label'],\n profileData,\n webIdData\n };\n }\n },\n resetPassword: async params => {\n const { email } = params;\n const authServerUrl = await getAuthServerUrl(dataProvider);\n try {\n await dataProvider.fetch(urlJoin(authServerUrl, 'auth/reset_password'), {\n method: 'POST',\n body: JSON.stringify({ email: email.trim() }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n });\n } catch (e) {\n if (e.message === 'email.not.exists') {\n throw new Error('auth.message.user_email_not_found');\n } else {\n throw new Error('auth.notification.reset_password_error');\n }\n }\n },\n setNewPassword: async params => {\n const { email, token, password } = params;\n const authServerUrl = await getAuthServerUrl(dataProvider);\n try {\n await dataProvider.fetch(urlJoin(authServerUrl, 'auth/new_password'), {\n method: 'POST',\n body: JSON.stringify({ email: email.trim(), token, password }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n });\n } catch (e) {\n if (e.message === 'email.not.exists') {\n throw new Error('auth.message.user_email_not_found');\n } else {\n throw new Error('auth.notification.new_password_error');\n }\n }\n },\n getAccountSettings: async params => {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n try {\n const { json } = await dataProvider.fetch(urlJoin(authServerUrl, 'auth/account'));\n return json;\n } catch (e) {\n throw new Error('auth.notification.get_settings_error');\n }\n },\n updateAccountSettings: async params => {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n try {\n const { email, currentPassword, newPassword } = params;\n\n await dataProvider.fetch(urlJoin(authServerUrl, 'auth/account'), {\n method: 'POST',\n body: JSON.stringify({\n currentPassword,\n email: email?.trim(),\n newPassword\n }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n });\n } catch (e) {\n if (e.message === 'auth.account.invalid_password') {\n throw new Error('auth.notification.invalid_password');\n }\n\n throw new Error('auth.notification.update_settings_error');\n }\n }\n };\n};\n\nexport default authProvider;\n","import urlJoin from 'url-join';\n\nexport const defaultToArray = value => (!value ? undefined : Array.isArray(value) ? value : [value]);\n\n// Transform the URI to the one used to find the ACL\n// To be compatible with all servers, we should do a HEAD request to the resource URI\nexport const getAclUri = resourceUri => {\n const parsedUrl = new URL(resourceUri);\n return urlJoin(parsedUrl.origin, '_acl', parsedUrl.pathname);\n};\n\nexport const getAclContext = baseUri => ({\n '@base': baseUri,\n acl: 'http://www.w3.org/ns/auth/acl#',\n foaf: 'http://xmlns.com/foaf/0.1/',\n 'acl:agent': { '@type': '@id' },\n 'acl:agentGroup': { '@type': '@id' },\n 'acl:agentClass': { '@type': '@id' },\n 'acl:mode': { '@type': '@id' },\n 'acl:accessTo': { '@type': '@id' }\n});\n\nexport const getAuthServerUrl = async dataProvider => {\n const dataServers = await dataProvider.getDataServers();\n const authServer = Object.values(dataServers).find(server => server.authServer === true);\n if (!authServer) throw new Error('Could not find a server with authServer: true. Check your dataServers config.');\n // If the server is a Pod provider, return the root URL instead of https://domain.com/user/data\n return authServer.pod ? new URL(authServer.baseUrl).origin : authServer.baseUrl;\n};\n\nexport const delay = async t => new Promise(resolve => setTimeout(resolve, t));\n","import React from 'react';\nimport { Create, CreateActions, useResourceContext } from 'react-admin';\nimport { useCreateContainerUri } from '@semapps/semantic-data-provider';\nimport useCheckPermissions from '../../hooks/useCheckPermissions';\n\nconst CreateWithPermissions = props => {\n const resource = useResourceContext();\n const createContainerUri = useCreateContainerUri()(resource);\n useCheckPermissions(createContainerUri, 'create');\n return ;\n};\n\nCreateWithPermissions.defaultProps = {\n actions: \n};\n\nexport default CreateWithPermissions;\n","import { useEffect } from 'react';\nimport { usePermissions, useRedirect, useNotify } from 'react-admin';\nimport { rights, forbiddenErrors } from '../constants';\nimport { Permissions } from '../types';\n\nconst useCheckPermissions = (uri: string, mode: keyof typeof rights, redirectUrl: string = '/') => {\n const { permissions } = usePermissions(uri);\n const notify = useNotify();\n const redirect = useRedirect();\n\n useEffect(() => {\n if (permissions && !permissions.some(p => rights[mode].includes(p['acl:mode']))) {\n notify(forbiddenErrors[mode], { type: 'error' });\n redirect(redirectUrl);\n }\n }, [permissions, redirect, notify]);\n\n return permissions;\n};\n\nexport default useCheckPermissions;\n","import { AclClass, AclMode } from './types';\n\nexport const ACL_READ: AclMode = 'acl:Read';\nexport const ACL_APPEND: AclMode = 'acl:Append';\nexport const ACL_WRITE: AclMode = 'acl:Write';\nexport const ACL_CONTROL: AclMode = 'acl:Control';\n\nexport const USER_AGENT = 'acl:agent';\nexport const GROUP_AGENT = 'acl:agentGroup';\nexport const CLASS_AGENT = 'acl:agentClass';\n\nexport const ANONYMOUS_AGENT: AclClass = 'foaf:Agent';\nexport const AUTHENTICATED_AGENT: AclClass = 'acl:AuthenticatedAgent';\n\nexport const rightsToShow: AclMode[] = [ACL_READ, ACL_APPEND, ACL_WRITE, ACL_CONTROL];\nexport const rightsToList: AclMode[] = [ACL_READ, ACL_APPEND, ACL_WRITE, ACL_CONTROL];\nexport const rightsToCreate: AclMode[] = [ACL_APPEND, ACL_WRITE, ACL_CONTROL];\nexport const rightsToEdit: AclMode[] = [ACL_APPEND, ACL_WRITE, ACL_CONTROL];\nexport const rightsToDelete: AclMode[] = [ACL_WRITE, ACL_CONTROL];\nexport const rightsToControl: AclMode[] = [ACL_CONTROL];\n\nexport const rights = {\n show: rightsToShow,\n list: rightsToList,\n create: rightsToCreate,\n edit: rightsToEdit,\n delete: rightsToDelete,\n control: rightsToControl\n};\n\nexport const forbiddenErrors = {\n show: 'auth.message.resource_show_forbidden',\n edit: 'auth.message.resource_edit_forbidden',\n delete: 'auth.message.resource_delete_forbidden',\n control: 'auth.message.resource_control_forbidden',\n list: 'auth.message.container_list_forbidden',\n create: 'auth.message.container_create_forbidden'\n};\n\nexport const resourceRightsLabels = {\n [ACL_READ]: 'auth.right.resource.read',\n [ACL_APPEND]: 'auth.right.resource.append',\n [ACL_WRITE]: 'auth.right.resource.write',\n [ACL_CONTROL]: 'auth.right.resource.control'\n};\n\nexport const containerRightsLabels = {\n [ACL_READ]: 'auth.right.container.read',\n [ACL_WRITE]: 'auth.right.container.write',\n [ACL_CONTROL]: 'auth.right.container.control'\n};\n","import React from 'react';\nimport { Edit, useGetRecordId } from 'react-admin';\nimport EditActionsWithPermissions from './EditActionsWithPermissions';\nimport EditToolbarWithPermissions from './EditToolbarWithPermissions';\nimport useCheckPermissions from '../../hooks/useCheckPermissions';\n\nconst EditWithPermissions = props => {\n const recordId = useGetRecordId();\n useCheckPermissions(recordId, 'edit');\n return (\n \n {React.cloneElement(props.children, {\n toolbar: ,\n // Allow to override toolbar\n ...props.children.props\n })}\n \n );\n};\n\nEditWithPermissions.defaultProps = {\n actions: \n};\n\nexport default EditWithPermissions;\n","import React from 'react';\nimport {\n ShowButton,\n ListButton,\n TopToolbar,\n usePermissions,\n useResourceDefinition,\n useRecordContext,\n useResourceContext\n} from 'react-admin';\nimport { useCreateContainerUri } from '@semapps/semantic-data-provider';\nimport PermissionsButton from '../../components/PermissionsButton/PermissionsButton';\nimport { rightsToControl, rightsToList, rightsToShow } from '../../constants';\nimport { Permissions } from '../../types';\n\nconst EditActionsWithPermissions = () => {\n const { hasList, hasShow } = useResourceDefinition();\n const record = useRecordContext();\n const { permissions } = usePermissions(record?.id);\n\n const resource = useResourceContext();\n const containerUri = useCreateContainerUri()(resource);\n const { permissions: containerPermissions } = usePermissions(containerUri);\n\n return (\n \n {hasList && containerPermissions && containerPermissions.some(p => rightsToList.includes(p['acl:mode'])) && (\n \n )}\n {hasShow && permissions && permissions.some(p => rightsToShow.includes(p['acl:mode'])) && }\n {permissions && permissions.some(p => rightsToControl.includes(p['acl:mode'])) && }\n \n );\n};\n\nexport default EditActionsWithPermissions;\n","import React, { useState } from 'react';\nimport { Button, useRecordContext, useResourceContext } from 'react-admin';\nimport ShareIcon from '@mui/icons-material/Share';\nimport { useCreateContainer } from '@semapps/semantic-data-provider';\nimport PermissionsDialog from './PermissionsDialog';\n\nconst PermissionsButton = ({ isContainer }) => {\n const record = useRecordContext();\n const resource = useResourceContext();\n const [showDialog, setShowDialog] = useState(false);\n const createContainer = useCreateContainer(resource);\n const uri = isContainer ? createContainer : record.id || record['@id'];\n return (\n <>\n \n setShowDialog(false)} />\n \n );\n};\n\nPermissionsButton.defaultProps = {\n isContainer: false\n};\n\nexport default PermissionsButton;\n","import React from 'react';\nimport { Button, useTranslate } from 'react-admin';\nimport { Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport AddPermissionsForm from './AddPermissionsForm';\nimport EditPermissionsForm from './EditPermissionsForm';\nimport useAgents from '../../hooks/useAgents';\n\nconst useStyles = makeStyles(() => ({\n title: {\n paddingBottom: 8\n },\n actions: {\n padding: 15\n },\n addForm: {\n paddingTop: 0\n },\n listForm: {\n paddingTop: 0,\n paddingBottom: 0,\n paddingRight: 0,\n maxHeight: 210\n }\n}));\n\nconst PermissionsDialog = ({ open, onClose, uri, isContainer }) => {\n const classes = useStyles();\n const translate = useTranslate();\n const { agents, addPermission, removePermission } = useAgents(uri);\n\n return (\n \n \n {translate(isContainer ? 'auth.dialog.container_permissions' : 'auth.dialog.resource_permissions')}\n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default PermissionsDialog;\n","import React, { useEffect, useState } from 'react';\nimport { useGetList, useTranslate } from 'react-admin';\nimport { TextField, List, ListItem, ListItemAvatar, ListItemText, Avatar } from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport PersonIcon from '@mui/icons-material/Person';\nimport { USER_AGENT, ACL_READ } from '../../constants';\n\nconst useStyles = makeStyles(() => ({\n list: {\n padding: 0,\n width: '100%'\n },\n option: {\n padding: 0\n }\n}));\n\nconst AddPermissionsForm = ({ agents, addPermission }) => {\n const classes = useStyles();\n const translate = useTranslate();\n const [value, setValue] = useState(null);\n const [inputValue, setInputValue] = useState('');\n const [options, setOptions] = useState([]);\n\n const { data } = useGetList(\n 'Person',\n {\n pagination: { page: 1, perPage: 100 },\n sort: { field: 'pair:label', order: 'ASC' },\n filter: { q: inputValue }\n },\n {\n enabled: inputValue.length > 0\n }\n );\n\n useEffect(() => {\n setOptions(data?.length > 0 ? Object.values(data) : []);\n }, [data]);\n\n return (\n option['pair:label']}\n // Do not return agents which have already been added\n filterOptions={x => x.filter(agent => !Object.keys(agents).includes(agent.id))}\n options={options}\n noOptionsText={translate('ra.navigation.no_results')}\n autoComplete\n blurOnSelect\n clearOnBlur\n disableClearable\n value={value}\n onChange={(event, record) => {\n addPermission(record.id || record['@id'], USER_AGENT, ACL_READ);\n setValue(null);\n setInputValue('');\n setOptions([]);\n }}\n onInputChange={(event, newInputValue) => {\n setInputValue(newInputValue);\n }}\n renderInput={params => (\n \n )}\n renderOption={(props, option) => (\n \n \n \n \n \n \n \n \n \n \n )}\n />\n );\n};\n\nexport default AddPermissionsForm;\n","import React from 'react';\nimport { List } from '@mui/material';\nimport { styled } from '@mui/system';\nimport AgentItem from './AgentItem';\n\nconst StyledList = styled(List)(({ theme }) => ({\n width: '100%',\n maxWidth: '100%',\n backgroundColor: theme.palette.background.paper\n}));\n\nconst EditPermissionsForm = ({ isContainer, agents, addPermission, removePermission }) => {\n return (\n \n {Object.entries(agents).map(([agentId, agent]) => (\n \n ))}\n \n );\n};\n\nexport default EditPermissionsForm;\n","import React, { useState, useEffect } from 'react';\nimport { useDataProvider, useTranslate, Loading, Error } from 'react-admin';\nimport {\n Avatar,\n ListItem,\n ListItemIcon,\n ListItemAvatar,\n ListItemText,\n ListItemSecondaryAction,\n IconButton,\n Menu,\n MenuItem\n} from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport EditIcon from '@mui/icons-material/Edit';\nimport CheckIcon from '@mui/icons-material/Check';\nimport { GROUP_AGENT, USER_AGENT, ANONYMOUS_AGENT, resourceRightsLabels, containerRightsLabels } from '../../constants';\nimport AgentIcon from './AgentIcon';\n\nconst useStyles = makeStyles(() => ({\n listItem: {\n paddingLeft: 4,\n paddingRight: 36\n },\n primaryText: {\n width: '30%',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n },\n secondaryText: {\n textAlign: 'center',\n width: '60%',\n fontStyle: 'italic',\n color: 'grey'\n }\n}));\n\nconst AgentItem = ({ isContainer, agent, addPermission, removePermission }) => {\n const classes = useStyles();\n const translate = useTranslate();\n const dataProvider = useDataProvider();\n const [anchorEl, setAnchorEl] = React.useState(null);\n const [user, setUser] = useState();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState();\n\n useEffect(() => {\n if (agent.predicate === USER_AGENT) {\n dataProvider\n .getOne('Person', { id: agent.id })\n .then(({ data }) => {\n setUser(data);\n setLoading(false);\n })\n .catch(error => {\n setError(error);\n setLoading(false);\n });\n } else {\n setLoading(false);\n }\n }, [agent.id, agent.predicate]);\n\n // For now, do not display groups\n if (agent.predicate === GROUP_AGENT) return null;\n\n const openMenu = event => setAnchorEl(event.currentTarget);\n const closeMenu = () => setAnchorEl(null);\n\n const labels = isContainer ? containerRightsLabels : resourceRightsLabels;\n\n if (loading) return ;\n if (error) return ;\n\n return (\n \n \n \n \n \n \n \n translate(labels[p])).join(', ')}\n />\n \n \n \n \n \n {Object.entries(labels).map(([rightKey, rightLabel]) => {\n const hasPermission = agent.permissions && agent.permissions.includes(rightKey);\n return (\n {\n if (hasPermission) {\n removePermission(agent.id, agent.predicate, rightKey);\n } else {\n addPermission(agent.id, agent.predicate, rightKey);\n }\n closeMenu();\n }}\n >\n {hasPermission ? : null}\n \n \n );\n })}\n \n \n \n );\n};\n\nexport default AgentItem;\n","import React from 'react';\nimport PublicIcon from '@mui/icons-material/Public';\nimport VpnLockIcon from '@mui/icons-material/VpnLock';\nimport PersonIcon from '@mui/icons-material/Person';\nimport GroupIcon from '@mui/icons-material/Group';\nimport { CLASS_AGENT, GROUP_AGENT, USER_AGENT, ANONYMOUS_AGENT } from '../../constants';\n\nconst AgentIcon = ({ agent }) => {\n switch (agent.predicate) {\n case CLASS_AGENT:\n return agent.id === ANONYMOUS_AGENT ? : ;\n case USER_AGENT:\n return ;\n case GROUP_AGENT:\n return ;\n default:\n throw new Error(`Unknown agent predicate: ${agent.predicate}`);\n }\n};\n\nexport default AgentIcon;\n","import { useEffect, useCallback, useState } from 'react';\nimport { usePermissions, useAuthProvider } from 'react-admin';\nimport { defaultToArray } from '../utils';\nimport { CLASS_AGENT, GROUP_AGENT, USER_AGENT, ANONYMOUS_AGENT, AUTHENTICATED_AGENT } from '../constants';\n\nconst useAgents = uri => {\n const { permissions } = usePermissions(uri);\n const authProvider = useAuthProvider();\n const [agents, setAgents] = useState({});\n\n // Format list of authorized agents, based on the permissions returned for the resource\n useEffect(() => {\n const result = {\n [ANONYMOUS_AGENT]: {\n id: ANONYMOUS_AGENT,\n predicate: CLASS_AGENT,\n permissions: []\n },\n [AUTHENTICATED_AGENT]: {\n id: AUTHENTICATED_AGENT,\n predicate: CLASS_AGENT,\n permissions: []\n }\n };\n\n const appendPermission = (agentId, predicate, mode) => {\n if (result[agentId]) {\n result[agentId].permissions.push(mode);\n } else {\n result[agentId] = {\n id: agentId,\n predicate,\n permissions: [mode]\n };\n }\n };\n\n if (permissions) {\n for (const p of permissions) {\n if (p[CLASS_AGENT]) {\n defaultToArray(p[CLASS_AGENT]).forEach(agentId => appendPermission(agentId, CLASS_AGENT, p['acl:mode']));\n }\n if (p[USER_AGENT]) {\n defaultToArray(p[USER_AGENT]).forEach(userUri => appendPermission(userUri, USER_AGENT, p['acl:mode']));\n }\n if (p[GROUP_AGENT]) {\n defaultToArray(p[GROUP_AGENT]).forEach(groupUri => appendPermission(groupUri, GROUP_AGENT, p['acl:mode']));\n }\n }\n setAgents(result);\n }\n }, [permissions]);\n\n const addPermission = useCallback(\n (agentId, predicate, mode) => {\n const prevAgents = { ...agents };\n setAgents({\n ...agents,\n [agentId]: {\n id: agentId,\n predicate,\n permissions: agents[agentId] ? [...agents[agentId]?.permissions, mode] : [mode]\n }\n });\n authProvider.addPermission(uri, agentId, predicate, mode).catch(e => {\n // If there was an error, revert the optimistic update\n setAgents(prevAgents);\n });\n },\n [agents, setAgents, uri, authProvider]\n );\n\n const removePermission = useCallback(\n (agentId, predicate, mode) => {\n const prevAgents = { ...agents };\n setAgents(\n Object.fromEntries(\n Object.entries(agents)\n .map(([key, agent]) => {\n if (agent.id === agentId) {\n agent.permissions = agent.permissions.filter(m => m !== mode);\n }\n return [key, agent];\n })\n // Remove agents if they have no permissions (except if they are class agents)\n .filter(([_, agent]) => agent.predicate === CLASS_AGENT || agent.permissions.length > 0)\n )\n );\n authProvider.removePermission(uri, agentId, predicate, mode).catch(e => {\n // If there was an error, revert the optimistic update\n setAgents(prevAgents);\n });\n },\n [agents, setAgents, uri, authProvider]\n );\n\n return { agents, addPermission, removePermission };\n};\n\nexport default useAgents;\n","import React from 'react';\nimport { SaveButton, Toolbar, ToolbarProps } from 'react-admin';\nimport { styled } from '@mui/material/styles';\nimport DeleteButtonWithPermissions from './DeleteButtonWithPermissions';\n\nconst StyledToolbar = styled(Toolbar)(() => ({\n flex: 1,\n display: 'flex',\n justifyContent: 'space-between'\n}));\n\nconst EditToolbarWithPermissions: React.FunctionComponent = props => (\n \n \n \n \n);\n\nexport default EditToolbarWithPermissions;\n","import React from 'react';\nimport { DeleteButton, useGetRecordId, usePermissions } from 'react-admin';\nimport { rightsToDelete } from '../../constants';\n\nconst DeleteButtonWithPermissions = props => {\n const recordId = useGetRecordId();\n const { permissions, isLoading } = usePermissions(recordId);\n if (!isLoading && permissions?.some(p => rightsToDelete.includes(p['acl:mode']))) {\n return ;\n }\n return null;\n};\n\nexport default DeleteButtonWithPermissions;\n","import React from 'react';\nimport { EditButton, useGetRecordId, usePermissions } from 'react-admin';\nimport { rightsToEdit } from '../../constants';\n\nconst EditButtonWithPermissions = props => {\n const recordId = useGetRecordId();\n const { permissions, isLoading } = usePermissions(recordId);\n if (!isLoading && permissions?.some(p => rightsToEdit.includes(p['acl:mode']))) {\n return ;\n }\n return null;\n};\n\nexport default EditButtonWithPermissions;\n","import React from 'react';\nimport { List } from 'react-admin';\nimport ListActionsWithPermissions from './ListActionsWithPermissions';\n\nconst ListWithPermissions = props => ;\n\nListWithPermissions.defaultProps = {\n actions: \n};\n\nexport default ListWithPermissions;\n","import React from 'react';\nimport {\n CreateButton,\n ExportButton,\n useResourceDefinition,\n TopToolbar,\n usePermissions,\n useResourceContext\n} from 'react-admin';\nimport { useMediaQuery } from '@mui/material';\nimport { useCreateContainer } from '@semapps/semantic-data-provider';\nimport PermissionsButton from '../../components/PermissionsButton/PermissionsButton';\nimport { rightsToCreate, rightsToControl } from '../../constants';\n\n// Do not show Export and Refresh buttons on mobile\nconst ListActionsWithPermissions = ({\n bulkActions,\n sort,\n displayedFilters,\n exporter,\n filters,\n filterValues,\n onUnselectItems,\n selectedIds,\n showFilter,\n total\n}) => {\n const resource = useResourceContext();\n const xs = useMediaQuery(theme => theme.breakpoints.down('xs'));\n const resourceDefinition = useResourceDefinition();\n const createContainerUri = useCreateContainer(resource);\n const { permissions } = usePermissions(createContainerUri);\n return (\n \n {filters &&\n React.cloneElement(filters, {\n showFilter,\n displayedFilters,\n filterValues,\n context: 'button'\n })}\n {resourceDefinition.hasCreate && permissions && permissions.some(p => rightsToCreate.includes(p['acl:mode'])) && (\n \n )}\n {permissions && permissions.some(p => rightsToControl.includes(p['acl:mode'])) && (\n \n )}\n {!xs && exporter !== false && (\n \n )}\n {bulkActions &&\n React.cloneElement(bulkActions, {\n filterValues,\n selectedIds,\n onUnselectItems\n })}\n \n );\n};\n\nexport default ListActionsWithPermissions;\n","import React from 'react';\nimport { Show, useGetRecordId } from 'react-admin';\nimport ShowActionsWithPermissions from './ShowActionsWithPermissions';\nimport useCheckPermissions from '../../hooks/useCheckPermissions';\n\nconst ShowWithPermissions = props => {\n const recordId = useGetRecordId();\n useCheckPermissions(recordId, 'show');\n return ;\n};\n\nShowWithPermissions.defaultProps = {\n actions: \n};\n\nexport default ShowWithPermissions;\n","import React from 'react';\nimport {\n EditButton,\n ListButton,\n TopToolbar,\n usePermissions,\n useResourceDefinition,\n useRecordContext,\n useResourceContext\n} from 'react-admin';\nimport { useCreateContainerUri } from '@semapps/semantic-data-provider';\nimport PermissionsButton from '../../components/PermissionsButton/PermissionsButton';\nimport { rightsToControl, rightsToEdit, rightsToList } from '../../constants';\nimport { Permissions } from '../../types';\n\nconst ShowActionsWithPermissions = () => {\n const { hasList, hasEdit } = useResourceDefinition();\n const record = useRecordContext();\n const { permissions } = usePermissions(record?.id);\n\n const resource = useResourceContext();\n const containerUri = useCreateContainerUri()(resource);\n const { permissions: containerPermissions } = usePermissions(containerUri);\n\n return (\n \n {hasList && containerPermissions && containerPermissions.some(p => rightsToList.includes(p['acl:mode'])) && (\n \n )}\n {hasEdit && permissions && permissions.some(p => rightsToEdit.includes(p['acl:mode'])) && }\n {permissions && permissions.some(p => rightsToControl.includes(p['acl:mode'])) && }\n \n );\n};\n\nexport default ShowActionsWithPermissions;\n","import React from 'react';\nimport { useLogin, useTranslate } from 'react-admin';\nimport { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from '@mui/material';\n\nconst AuthDialog = ({ open, onClose, title, message, redirect, ...rest }) => {\n const login = useLogin();\n const translate = useTranslate();\n return (\n \n {translate(title)}\n \n {translate(message)}\n \n \n \n login({ redirect: redirect || window.location.pathname + window.location.search })}\n color=\"primary\"\n variant=\"contained\"\n >\n {translate('auth.action.login')}\n \n \n \n );\n};\n\nAuthDialog.defaultProps = {\n title: 'auth.dialog.login_required',\n message: 'auth.message.login_to_continue'\n};\n\nexport default AuthDialog;\n","import React, { useRef, useEffect } from 'react';\nimport jwtDecode from 'jwt-decode';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport { useDataProvider, useAuthProvider, useLogin, useGetIdentity, useNotify } from 'react-admin';\nimport { Card, Avatar, Typography, Button, CardActions } from '@mui/material';\nimport { styled } from '@mui/material/styles';\nimport LockIcon from '@mui/icons-material/Lock';\n\nconst delay = async t => new Promise(resolve => setTimeout(resolve, t));\n\n// Inspired from https://github.com/marmelab/react-admin/blob/master/packages/ra-ui-materialui/src/auth/Login.tsx\nconst SsoLoginPage = ({ children, backgroundImage, buttons, userResource, propertiesExist, text, ...rest }) => {\n const containerRef = useRef();\n let backgroundImageLoaded = false;\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const { data: identity, isLoading } = useGetIdentity();\n\n const notify = useNotify();\n const login = useLogin();\n const dataProvider = useDataProvider();\n const authProvider = useAuthProvider();\n\n useEffect(() => {\n if (!isLoading && identity?.id) {\n // Already authenticated, redirect to the home page\n navigate(searchParams.get('redirect') || '/');\n }\n }, [identity, isLoading, navigate, searchParams]);\n\n useEffect(() => {\n (async () => {\n if (searchParams.has('login')) {\n if (searchParams.has('error')) {\n if (searchParams.get('error') === 'registration.not-allowed') {\n notify('auth.message.user_email_not_found', { type: 'error' });\n } else {\n notify('auth.message.bad_request', { type: 'error', messageArgs: { error: searchParams.get('error') } });\n }\n } else if (searchParams.has('token')) {\n const token = searchParams.get('token');\n const { webId } = jwtDecode(token);\n\n localStorage.setItem('token', token);\n\n let userData;\n ({ data: userData } = await dataProvider.getOne(userResource, { id: webId }));\n\n if (propertiesExist.length > 0) {\n let allPropertiesExist = propertiesExist.every(p => userData[p]);\n while (!allPropertiesExist) {\n console.log('Waiting for all properties to have been created', propertiesExist);\n await delay(500);\n ({ data: userData } = await dataProvider.getOne(userResource, { id: webId }));\n allPropertiesExist = propertiesExist.every(p => userData[p]);\n }\n }\n\n if (!authProvider.checkUser(userData)) {\n localStorage.removeItem('token');\n notify('auth.message.user_not_allowed_to_login', { type: 'error' });\n navigate.replace('/login');\n } else if (searchParams.has('redirect')) {\n notify('auth.message.user_connected', { type: 'info' });\n window.location.href = searchParams.get('redirect');\n } else if (searchParams.has('new') && searchParams.get('new') === 'true') {\n notify('auth.message.new_user_created', { type: 'info' });\n window.location.href = `/${userResource}/${encodeURIComponent(webId)}`;\n } else {\n notify('auth.message.user_connected', { type: 'info' });\n window.location.href = '/';\n }\n }\n }\n\n if (searchParams.has('logout')) {\n // Delete token and any other value in local storage\n localStorage.clear();\n notify('auth.message.user_disconnected', { type: 'info' });\n navigate('/');\n }\n })();\n }, [searchParams, navigate, notify, userResource]);\n\n const updateBackgroundImage = () => {\n if (!backgroundImageLoaded && containerRef.current) {\n containerRef.current.style.backgroundImage = `url(${backgroundImage})`;\n backgroundImageLoaded = true;\n }\n };\n\n // Load background image asynchronously to speed up time to interactive\n const lazyLoadBackgroundImage = () => {\n if (backgroundImage) {\n const img = new Image();\n img.onload = updateBackgroundImage;\n img.src = backgroundImage;\n }\n };\n\n useEffect(() => {\n if (!backgroundImageLoaded) {\n lazyLoadBackgroundImage();\n }\n });\n\n if (isLoading) return null;\n\n return (\n \n \n
\n \n \n \n
\n {text && {text}}\n {buttons?.map((button, i) => (\n \n {React.cloneElement(button, {\n fullWidth: true,\n variant: 'outlined',\n type: 'submit',\n onClick: () => login({}, '/login')\n })}\n \n ))}\n
\n
\n );\n};\n\nconst PREFIX = 'SsoLoginPage';\n\nexport const SsoLoginPageClasses = {\n card: `${PREFIX}-card`,\n avatar: `${PREFIX}-avatar`,\n icon: `${PREFIX}-icon`,\n switch: `${PREFIX}-switch`\n};\n\nconst Root = styled('div', {\n name: PREFIX,\n overridesResolver: (props, styles) => styles.root\n})(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n minHeight: '100vh',\n height: '1px',\n alignItems: 'center',\n justifyContent: 'flex-start',\n backgroundRepeat: 'no-repeat',\n backgroundSize: 'cover',\n backgroundImage: 'radial-gradient(circle at 50% 14em, #313264 0%, #00023b 60%, #00023b 100%)',\n [`& .${SsoLoginPageClasses.card}`]: {\n minWidth: 300,\n marginTop: '6em'\n },\n [`& .${SsoLoginPageClasses.avatar}`]: {\n margin: '1em',\n display: 'flex',\n justifyContent: 'center'\n },\n [`& .${SsoLoginPageClasses.icon}`]: {\n backgroundColor: theme.palette.secondary[500]\n },\n [`& .${SsoLoginPageClasses.switch}`]: {\n marginBottom: '1em',\n display: 'flex',\n justifyContent: 'center'\n }\n}));\n\nSsoLoginPage.defaultProps = {\n propertiesExist: [],\n // TODO deprecate this\n buttons: [],\n userResource: 'Person'\n};\n\nexport default SsoLoginPage;\n","import { useEffect, useMemo } from 'react';\nimport { Link, useSearchParams } from 'react-router-dom';\nimport { useTranslate, useGetIdentity } from 'react-admin';\nimport { Box, Card, Typography } from '@mui/material';\nimport LockIcon from '@mui/icons-material/Lock';\nimport SignupForm from './SignupForm';\nimport LoginForm from './LoginForm';\nimport NewPasswordForm from './NewPasswordForm';\nimport ResetPasswordForm from './ResetPasswordForm';\nimport SimpleBox from './SimpleBox';\nimport { defaultScorer } from '../../passwordScorer';\nimport getSearchParamsRest from './getSearchParamsRest';\n\n/**\n * @param {object} props Props\n * @param {boolean} props.hasSignup If to show signup form.\n * @param {boolean} props.allowUsername Indicates, if login is allowed with username (instead of email).\n * @param {function} props.onLogin Optional function to call when login is completed\n * @param {function} props.onSignup Optional function to call when signup is completed\n * @param {object} props.additionalSignupValues\n * @param {object} props.passwordScorer Scorer to evaluate and indicate password strength.\n * Set to `null` or `false`, if you don't want password strength checks. Default is\n * passwordStrength's `defaultScorer`.\n * @returns\n */\nconst LocalLoginPage = ({\n hasSignup,\n allowUsername,\n onLogin,\n onSignup,\n additionalSignupValues,\n passwordScorer = defaultScorer\n}) => {\n const translate = useTranslate();\n const [searchParams] = useSearchParams();\n const isSignup = hasSignup && searchParams.has('signup');\n const isResetPassword = searchParams.has('reset_password');\n const isNewPassword = searchParams.has('new_password');\n const isLogin = !isSignup && !isResetPassword && !isNewPassword;\n const redirectTo = searchParams.get('redirect') || '/';\n const { data: identity, isLoading } = useGetIdentity();\n\n useEffect(() => {\n (async () => {\n if (!isLoading && identity?.id) {\n if (onLogin) {\n onLogin(redirectTo);\n } else {\n window.location.href = redirectTo;\n }\n }\n })();\n }, [identity, isLoading, redirectTo, onLogin]);\n\n const [title, text] = useMemo(() => {\n if (isSignup) {\n return ['auth.action.signup', 'auth.helper.signup'];\n }\n if (isLogin) {\n return ['auth.action.login', 'auth.helper.login'];\n }\n if (isResetPassword) {\n return ['auth.action.reset_password', 'auth.helper.reset_password'];\n }\n if (isNewPassword) {\n return ['auth.action.set_new_password', 'auth.helper.set_new_password'];\n }\n }, [isSignup, isLogin, isResetPassword, isNewPassword]);\n\n if (isLoading || identity?.id) return null;\n\n return (\n }>\n \n {isLogin && }\n {isSignup && (\n \n )}\n {isResetPassword && }\n {isNewPassword && }\n \n {(isSignup || isResetPassword) && (\n \n {translate('auth.action.login')}\n \n )}\n {isLogin && (\n <>\n {hasSignup && (\n
\n \n {translate('auth.action.signup')}\n \n
\n )}\n
\n \n {translate('auth.action.reset_password')}\n \n
\n \n )}\n
\n
\n
\n );\n};\n\nLocalLoginPage.defaultProps = {\n hasSignup: true,\n allowUsername: false,\n additionalSignupValues: {}\n};\n\nexport default LocalLoginPage;\n","import React, { useCallback, useState } from 'react';\nimport createSlug from 'speakingurl';\nimport {\n Form,\n useTranslate,\n useNotify,\n useSafeSetState,\n TextInput,\n minLength,\n required,\n email,\n useLocaleState\n} from 'react-admin';\nimport { useSearchParams } from 'react-router-dom';\nimport { Button, CardContent, Typography } from '@mui/material';\nimport useSignup from '../../hooks/useSignup';\nimport validatePasswordStrength from './validatePasswordStrength';\nimport PasswordStrengthIndicator from './PasswordStrengthIndicator';\nimport { defaultScorer } from '../../passwordScorer';\n\n/**\n * @param {function} props.onSignup Optional function to call when signup is completed\n * @param {object} props.additionalSignupValues\n * @param {number} delayBeforeRedirect\n * @param {object} passwordScorer Scorer to evaluate and indicate password strength.\n * Set to `null` or `false`, if you don't want password strength checks. Default is\n * passwordStrength's `defaultScorer`.\n * @returns\n */\nconst SignupForm = ({ passwordScorer = defaultScorer, onSignup, additionalSignupValues, delayBeforeRedirect = 0 }) => {\n const [loading, setLoading] = useSafeSetState(false);\n const signup = useSignup();\n const translate = useTranslate();\n const notify = useNotify();\n const [searchParams] = useSearchParams();\n const redirectTo = searchParams.get('redirect') || '/';\n const [locale] = useLocaleState();\n const [password, setPassword] = useState('');\n\n const submit = useCallback(\n async values => {\n try {\n setLoading(true);\n await signup({\n ...values,\n ...additionalSignupValues\n });\n setTimeout(() => {\n if (onSignup) {\n onSignup(redirectTo);\n } else {\n window.location.href = redirectTo;\n }\n }, delayBeforeRedirect);\n } catch (error) {\n setLoading(false);\n notify(\n typeof error === 'string'\n ? error\n : typeof error === 'undefined' || !error.message\n ? 'ra.auth.sign_in_error'\n : error.message,\n {\n type: 'warning',\n _: typeof error === 'string' ? error : error && error.message ? error.message : undefined\n }\n );\n }\n },\n [setLoading, signup, additionalSignupValues, redirectTo, notify, onSignup]\n );\n\n return (\n
\n \n \n value\n ? createSlug(value, {\n lang: locale || 'fr',\n separator: '_',\n custom: ['.', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']\n })\n : ''\n }\n />\n \n {passwordScorer && password && !(searchParams.has('email') && searchParams.has('force-email')) && (\n <>\n \n {translate('auth.input.password_strength')}:{' '}\n \n \n \n )}\n setPassword(e.target.value)}\n label={translate('ra.auth.password')}\n autoComplete=\"new-password\"\n fullWidth\n disabled={loading || (searchParams.has('email') && searchParams.has('force-email'))}\n validate={[required(), validatePasswordStrength(passwordScorer)]}\n />\n \n \n
\n );\n};\n\nSignupForm.defaultValues = {\n redirectTo: '/',\n additionalSignupValues: {}\n};\n\nexport default SignupForm;\n","import { useCallback } from 'react';\nimport { useAuthProvider } from 'react-admin';\n\nconst useSignup = () => {\n const authProvider = useAuthProvider();\n\n return useCallback((params = {}) => authProvider.signup(params), [authProvider]);\n};\n\nexport default useSignup;\n","import { defaultScorer } from '../../passwordScorer';\n\nconst validatePasswordStrength = (scorer = defaultScorer) => value => {\n if (!scorer) return undefined;\n const strength = scorer.scoreFn(value);\n if (strength < scorer.minRequiredScore) {\n return 'auth.input.password_too_weak';\n }\n return undefined;\n};\n\nexport default validatePasswordStrength;\n","// Inspired by https://github.com/bartlomiejzuber/password-strength-score\n\n/**\n * @typedef PasswordStrengthOptions\n * @property {number} isVeryLongLength - Required characters for a very long password (default: 12)\n * @property {number} isLongLength - Required characters for a long password (default: 6)\n * @property {number} isVeryLongScore - Score for a very long password (default: 2.5)\n * @property {number} isLongScore - Score for a long password (default: 1.5)\n * @property {number} uppercaseScore - Score for a password with uppercase letters (default: 1)\n * @property {number} lowercaseScore - Score for a password with lowercase letters (default: 1)\n * @property {number} numbersScore - Score for a password with numbers (default: 1)\n * @property {number} nonAlphanumericsScore - Score for a password without non-alphanumeric characters (default: 1)\n */\n\n/** @type {PasswordStrengthOptions} */\nexport const defaultOptions = {\n isVeryLongLength: 14,\n isLongLength: 8,\n isLongScore: 2,\n isVeryLongScore: 4,\n uppercaseScore: 1,\n lowercaseScore: 1,\n numbersScore: 1,\n nonAlphanumericsScore: 1\n};\n\n/**\n *\n * @param {string} password Password text.\n * @param {PasswordStrengthOptions} options Password options.\n * @returns {number} The password strength score.\n */\nexport const passwordStrength = (password, options) => {\n if (!password) {\n return 0;\n }\n\n const mergedOptions = { ...defaultOptions, ...options };\n\n const longScore = (password.length >= mergedOptions.isLongLength && mergedOptions.isLongScore) || 0;\n const veryLongScore = (password.length >= mergedOptions.isVeryLongLength && mergedOptions.isVeryLongScore) || 0;\n const lowercaseScore = (/[a-z]/.test(password) && mergedOptions.lowercaseScore) || 0;\n const uppercaseScore = (/[A-Z]/.test(password) && mergedOptions.uppercaseScore) || 0;\n const numbersScore = (/\\d/.test(password) && mergedOptions.numbersScore) || 0;\n const nonalphasScore = (/\\W/.test(password) && mergedOptions.nonAlphanumericsScore) || 0;\n\n return uppercaseScore + lowercaseScore + numbersScore + nonalphasScore + longScore + veryLongScore;\n};\n\nexport const createPasswordScorer = (options = defaultOptions, minRequiredScore = 5) => {\n const mergedOptions = { ...defaultOptions, ...options };\n\n return {\n scoreFn: password => passwordStrength(password, mergedOptions),\n minRequiredScore,\n maxScore:\n mergedOptions.uppercaseScore +\n mergedOptions.lowercaseScore +\n mergedOptions.numbersScore +\n mergedOptions.nonAlphanumericsScore +\n mergedOptions.isLongScore +\n mergedOptions.isVeryLongScore\n };\n};\n\nexport const defaultScorer = createPasswordScorer(defaultOptions, 5);\n","import React from 'react';\nimport ColorGradientProgressBar from './ColorGradientProgressBar';\nimport { defaultScorer } from '../../passwordScorer';\n\nexport default function PasswordStrengthIndicator({ scorer = defaultScorer, password, ...restProps }) {\n const strength = scorer.scoreFn(password);\n return ;\n}\n","import React from 'react';\nimport { LinearProgress } from '@mui/material';\nimport { withStyles } from '@mui/styles';\n\n/**\n * @typedef {object} Color\n * @property {number} red\n * @property {number} green\n * @property {number} blue\n */\n\n/**\n * Calculate a rgb-color from a gradient between `color1` and `color2`\n * @param {number} fade - Indicates the fade between `color1` and `color2` in the range [0, 1].\n * @param {Color} color1\n * @param {Color} color2\n * @returns {string} `` `rgb(${red}, ${green}, ${blue})` ``\n */\nconst colorGradient = (fade, color1, color2) => {\n const diffRed = color2.red - color1.red;\n const diffGreen = color2.green - color1.green;\n const diffBlue = color2.blue - color1.blue;\n\n const gradient = {\n red: Math.floor(color1.red + diffRed * fade),\n green: Math.floor(color1.green + diffGreen * fade),\n blue: Math.floor(color1.blue + diffBlue * fade)\n };\n\n return `rgb(${gradient.red},${gradient.green},${gradient.blue})`;\n};\n\n/**\n * A progress bar that changes its color between its min an max value.\n * @param {object} props\n * @param {Color} [props.badColor] - default: `#FF4047`\n * @param {Color} [props.goodColor] - default: `#00FF6E`\n * @param {number} props.maxVal\n * @param {number} props.minVal\n * @param {number} props.currentVal\n */\nexport default function ColorGradientProgressBar(props) {\n const { minVal, maxVal, currentVal, badColor, goodColor, ...restProps } = props;\n\n const color1 = badColor || { red: 0xff, green: 0x40, blue: 0x47 };\n const color2 = goodColor || { red: 0x00, green: 0xff, blue: 0x6e };\n\n const fade = Math.max(0, Math.min(1, (currentVal - minVal) / (maxVal - minVal)));\n const currentColor = colorGradient(fade, color1, color2);\n\n const StyledLinearProgress = withStyles({\n colorPrimary: {\n backgroundColor: 'black' // '#e0e0e0'\n },\n barColorPrimary: {\n backgroundColor: currentColor\n }\n })(LinearProgress);\n\n return ;\n}\n","import React, { useCallback } from 'react';\nimport { Form, useTranslate, useNotify, useSafeSetState, TextInput, required, email, useLogin } from 'react-admin';\nimport { useSearchParams } from 'react-router-dom';\nimport { Button, CardContent } from '@mui/material';\n\nconst LoginForm = ({ onLogin, allowUsername }) => {\n const [loading, setLoading] = useSafeSetState(false);\n const login = useLogin();\n const translate = useTranslate();\n const notify = useNotify();\n const [searchParams] = useSearchParams();\n const redirectTo = searchParams.get('redirect') || '/';\n\n const submit = useCallback(\n async values => {\n try {\n setLoading(true);\n await login(values);\n if (onLogin) {\n onLogin(redirectTo);\n } else {\n window.location.href = redirectTo;\n }\n } catch (error) {\n setLoading(false);\n notify(\n typeof error === 'string'\n ? error\n : typeof error === 'undefined' || !error.message\n ? 'ra.auth.sign_in_error'\n : error.message,\n {\n type: 'warning',\n messageArgs: {\n _: typeof error === 'string' ? error : error && error.message ? error.message : undefined\n }\n }\n );\n }\n },\n [setLoading, login, redirectTo, notify, onLogin]\n );\n\n return (\n
\n \n (value ? value.toLowerCase() : '')}\n validate={allowUsername ? [required()] : [required(), email()]}\n />\n \n \n \n
\n );\n};\n\nLoginForm.defaultValues = {\n allowUsername: false\n};\n\nexport default LoginForm;\n","import React, { useState } from 'react';\nimport { Form, useTranslate, useNotify, useSafeSetState, useAuthProvider, TextInput, required } from 'react-admin';\nimport { useLocation } from 'react-router-dom';\nimport { Button, CardContent, Typography } from '@mui/material';\nimport PasswordStrengthIndicator from './PasswordStrengthIndicator';\nimport validatePasswordStrength from './validatePasswordStrength';\nimport { defaultScorer } from '../../passwordScorer';\n\nconst samePassword = (value, allValues) => {\n if (value && value !== allValues.password) {\n return 'Mot de passe différent du premier';\n }\n};\n\n/**\n *\n * @param {string} redirectTo\n * @param {Object} passwordScorer Scorer to evaluate and indicate password strength.\n * Set to `null` or `false`, if you don't want password strength checks. Default is\n * passwordStrength's `defaultScorer`.\n * @returns\n */\nconst NewPasswordForm = ({ redirectTo, passwordScorer = defaultScorer }) => {\n const location = useLocation();\n const searchParams = new URLSearchParams(location.search);\n const token = searchParams.get('token');\n\n const [loading, setLoading] = useSafeSetState(false);\n const authProvider = useAuthProvider();\n\n const translate = useTranslate();\n const notify = useNotify();\n\n const [newPassword, setNewPassword] = useState('');\n\n const submit = values => {\n setLoading(true);\n authProvider\n .setNewPassword({ ...values, token })\n .then(() => {\n setTimeout(() => {\n const url = new URL('/login', window.location.origin);\n if (redirectTo) url.searchParams.append('redirect', redirectTo);\n url.searchParams.append('email', values.email);\n window.location.href = url.toString();\n setLoading(false);\n }, 2000);\n notify('auth.notification.password_changed', { type: 'info' });\n })\n .catch(error => {\n setLoading(false);\n notify(\n typeof error === 'string'\n ? error\n : typeof error === 'undefined' || !error.message\n ? 'auth.notification.reset_password_error'\n : error.message,\n {\n type: 'warning',\n messageArgs: {\n _: typeof error === 'string' ? error : error && error.message ? error.message : undefined\n }\n }\n );\n });\n };\n\n return (\n
\n \n (value ? value.toLowerCase() : '')}\n />\n {passwordScorer && (\n <>\n \n {translate('auth.input.password_strength')}:{' '}\n \n\n \n \n )}\n setNewPassword(e.target.value)}\n />\n \n \n \n
\n );\n};\n\nexport default NewPasswordForm;\n","import React from 'react';\nimport { Form, TextInput, required, useTranslate, useNotify, useSafeSetState, useAuthProvider } from 'react-admin';\nimport { Button, CardContent } from '@mui/material';\n\nconst ResetPasswordForm = () => {\n const [loading, setLoading] = useSafeSetState(false);\n const authProvider = useAuthProvider();\n const translate = useTranslate();\n const notify = useNotify();\n\n const submit = values => {\n setLoading(true);\n authProvider\n .resetPassword({ ...values })\n .then(res => {\n setLoading(false);\n notify('auth.notification.reset_password_submitted', { type: 'info' });\n })\n .catch(error => {\n setLoading(false);\n notify(\n typeof error === 'string'\n ? error\n : typeof error === 'undefined' || !error.message\n ? 'auth.notification.reset_password_error'\n : error.message,\n {\n type: 'warning',\n messageArgs: {\n _: typeof error === 'string' ? error : error && error.message ? error.message : undefined\n }\n }\n );\n });\n };\n\n return (\n
\n \n (value ? value.toLowerCase() : '')}\n />\n \n \n
\n );\n};\n\nexport default ResetPasswordForm;\n","import React from 'react';\nimport { Box, Card, Typography } from '@mui/material';\nimport { Notification } from 'react-admin';\nimport makeStyles from '@mui/styles/makeStyles';\n\nconst useStyles = makeStyles(theme => ({\n '@global': {\n body: {\n backgroundColor: theme.palette.secondary.main\n }\n },\n root: {\n backgroundColor: theme.palette.secondary.main,\n [theme.breakpoints.down('sm')]: {\n padding: '1em'\n }\n },\n card: {\n width: '100%',\n maxWidth: 450,\n marginTop: '6em'\n },\n icon: {\n marginTop: 5,\n marginRight: 5\n },\n title: {\n [theme.breakpoints.down('sm')]: {\n fontWeight: 'bold',\n marginTop: 12\n }\n }\n}));\n\nconst SimpleBox = ({ title, icon, text, children }) => {\n const classes = useStyles();\n return (\n \n \n \n {icon && React.cloneElement(icon, { fontSize: 'large', className: classes.icon })}\n \n {title}\n \n \n \n {text}\n \n {children}\n \n \n \n );\n};\n\nexport default SimpleBox;\n","const USED_SEARCH_PARAMS = ['signup', 'reset_password', 'new_password', 'email', 'force-email'];\n\nconst getSearchParamsRest = searchParams => {\n const rest = [];\n for (const [key, value] of searchParams.entries()) {\n if (!USED_SEARCH_PARAMS.includes(key)) {\n rest.push(`${key}=${encodeURIComponent(value)}`);\n }\n }\n return rest.length > 0 ? rest.join('&') : '';\n};\n\nexport default getSearchParamsRest;\n","import React from 'react';\nimport { Resource, usePermissions } from 'react-admin';\nimport { useCreateContainer } from '@semapps/semantic-data-provider';\nimport { rightsToCreate } from '../constants';\n\n// Not used for now. The ListWithPermissions component will handle the conditional display of the Create button.\nconst ResourceWithPermission = ({ name, create, ...rest }) => {\n const createContainer = useCreateContainer(name);\n const { permissions } = usePermissions(createContainer);\n return (\n rightsToCreate.includes(p['acl:mode'])) ? create : undefined}\n // Requesting permissions to list container is too long, we will avoid that for now\n // list={permissions && permissions.some(p => rightsToList.includes(p['acl:mode'])) ? list : undefined}\n />\n );\n};\n\nexport default ResourceWithPermission;\n","import React, { forwardRef, useCallback } from 'react';\nimport { Logout, UserMenu as RaUserMenu, useGetIdentity, useTranslate, useUserMenu } from 'react-admin';\nimport { MenuItem, ListItemIcon, ListItemText } from '@mui/material';\nimport AccountCircleIcon from '@mui/icons-material/AccountCircle';\nimport EditIcon from '@mui/icons-material/Edit';\nimport { useNavigate } from 'react-router-dom';\n\n// It's important to pass the ref to allow Material UI to manage the keyboard navigation\nconst UserMenuItem = forwardRef(({ label, icon, to, ...rest }, ref) => {\n const { onClose } = useUserMenu();\n const translate = useTranslate();\n const navigate = useNavigate();\n const onClick = useCallback(() => {\n navigate(to);\n onClose();\n }, [to, onClose, navigate]);\n return (\n \n {icon && {React.cloneElement(icon, { fontSize: 'small' })}}\n {translate(label)}\n \n );\n});\n\nconst UserMenu = ({ logout, profileResource, ...otherProps }) => {\n const { data: identity } = useGetIdentity();\n return (\n \n {identity && identity.id !== ''\n ? [\n }\n to={`/${profileResource}/${encodeURIComponent(identity?.profileData?.id || identity.id)}/show`}\n />,\n }\n to={`/${profileResource}/${encodeURIComponent(identity?.profileData?.id || identity.id)}`}\n />,\n React.cloneElement(logout, { key: 'logout' })\n ]\n : [\n ,\n \n ]}\n \n );\n};\n\nUserMenu.defaultProps = {\n logout: ,\n profileResource: 'Person'\n};\n\nexport default UserMenu;\n","import { useEffect } from 'react';\nimport { useGetIdentity, useNotify, useRedirect } from 'react-admin';\nimport { useLocation } from 'react-router-dom';\n\nconst useCheckAuthenticated = message => {\n const { data: identity, isLoading } = useGetIdentity();\n const notify = useNotify();\n const redirect = useRedirect();\n const location = useLocation();\n\n useEffect(() => {\n if (!isLoading && !identity?.id) {\n notify(message || 'ra.auth.auth_check_error', { type: 'error' });\n redirect(`/login?redirect=${encodeURIComponent(location.pathname + location.search)}`);\n }\n }, [isLoading, identity, redirect, notify, location]);\n\n return { identity, isLoading };\n};\n\nexport default useCheckAuthenticated;\n","import { useEffect, useCallback } from 'react';\nimport isEqual from 'lodash/isEqual';\nimport { useGetPermissions, useSafeSetState } from 'react-admin';\n\nconst emptyParams = {};\n\n// keep a cache of already fetched permissions to initialize state for new\n// components and avoid a useless rerender if the permissions haven't changed\nconst alreadyFetchedPermissions = { '{}': undefined };\n\n// Fork of usePermissionsOptimized, with a refetch option\nconst usePermissionsWithRefetch = (params = emptyParams) => {\n const key = JSON.stringify(params);\n const [state, setState] = useSafeSetState({\n permissions: alreadyFetchedPermissions[key]\n });\n const getPermissions = useGetPermissions();\n\n const fetchPermissions = useCallback(\n () =>\n getPermissions(params)\n .then(permissions => {\n if (!isEqual(permissions, state.permissions)) {\n alreadyFetchedPermissions[key] = permissions;\n setState({ permissions });\n }\n })\n .catch(error => {\n setState({\n error\n });\n }),\n [key, params, getPermissions]\n );\n\n useEffect(() => {\n fetchPermissions();\n }, [key]);\n\n return { ...state, refetch: fetchPermissions };\n};\n\nexport default usePermissionsWithRefetch;\n","const englishMessages = {\n auth: {\n dialog: {\n container_permissions: 'Container permissions',\n resource_permissions: 'Resource permissions',\n login_required: 'Login required'\n },\n action: {\n submit: 'Submit',\n permissions: 'Permissions',\n signup: 'Signup',\n reset_password: 'Reset password',\n set_new_password: 'Set new password',\n logout: 'Logout',\n login: 'Login',\n view_my_profile: 'View my profile',\n edit_my_profile: 'Edit my profile'\n },\n right: {\n resource: {\n read: 'Read',\n append: 'Append',\n write: 'Write',\n control: 'Control'\n },\n container: {\n read: 'List',\n append: 'Add',\n write: 'Add',\n control: 'Control'\n }\n },\n agent: {\n anonymous: 'All users',\n authenticated: 'Connected users'\n },\n input: {\n agent_select: 'Add an user...',\n name: 'Surname',\n username: 'User ID',\n email: 'Email address',\n username_or_email: 'User ID or email address',\n current_password: 'Current password',\n new_password: 'New password',\n confirm_new_password: 'Confirm new password',\n password_strength: 'Password strength',\n password_too_weak: 'Password too weak. Increase length or add special characters.'\n },\n helper: {\n login: 'Sign in to your account',\n signup: 'Create your account',\n reset_password: 'Enter your email address below and we will send you a link to reset your password',\n set_new_password: 'Please enter your email address and a new password below'\n },\n message: {\n resource_show_forbidden: 'You are not allowed to view this resource',\n resource_edit_forbidden: 'You are not allowed to edit this resource',\n resource_delete_forbidden: 'You are not allowed to delete this resource',\n resource_control_forbidden: 'You are not allowed to control this resource',\n container_create_forbidden: 'You are not allowed to create new resource',\n container_list_forbidden: 'You are not allowed to list these resources',\n unable_to_fetch_user_data: 'Unable to fetch user data',\n no_token_returned: 'No token returned',\n no_associated_oidc_issuer: 'No OIDC issuer associated with the provided WebID',\n invalid_token_returned: 'Invalid token returned',\n signup_error: 'Account registration failed',\n user_not_allowed_to_login: 'You are not allowed to login with this account',\n user_email_not_found: 'No account found with this email address',\n user_email_exist: 'An account already exist with this email address',\n username_exist: 'An account already exist with this user ID',\n username_invalid: 'This username is invalid. Only lowercase characters, numbers, dots and hyphens are authorized',\n new_user_created: 'Your account has been successfully created',\n user_connected: 'You are now connected',\n user_disconnected: 'You are now disconnected',\n bad_request: 'Bad request (Error message returned by the server: %{error})',\n account_settings_updated: 'Your account settings have been successfully updated',\n login_to_continue: 'Please login to continue',\n choose_pod_provider:\n 'Please choose a Pod provider in the list below. All application data will be saved on your Pod.',\n unreachable_auth_server: 'The authentication server cannot be reached'\n },\n notification: {\n reset_password_submitted: 'An email has been sent with reset password instructions',\n reset_password_error: 'An error occurred',\n password_changed: 'Password changed successfully',\n new_password_error: 'An error occurred',\n invalid_password: 'Invalid password',\n get_settings_error: 'An error occurred',\n update_settings_error: 'An error occurred'\n }\n }\n};\n\nexport default englishMessages;\n","const frenchMessages = {\n auth: {\n dialog: {\n container_permissions: 'Permissions sur le container',\n resource_permissions: 'Permissions sur la ressource',\n login_required: 'Connexion requise'\n },\n action: {\n submit: 'Soumettre',\n permissions: 'Permissions',\n signup: \"S'inscrire\",\n reset_password: 'Mot de passe oublié ?',\n set_new_password: 'Définir le mot de passe',\n logout: 'Se déconnecter',\n login: 'Se connecter',\n view_my_profile: 'Voir mon profil',\n edit_my_profile: 'Éditer mon profil'\n },\n right: {\n resource: {\n read: 'Lire',\n append: 'Enrichir',\n write: 'Modifier',\n control: 'Administrer'\n },\n container: {\n read: 'Lister',\n append: 'Ajouter',\n write: 'Ajouter',\n control: 'Administrer'\n }\n },\n agent: {\n anonymous: 'Tous les utilisateurs',\n authenticated: 'Utilisateurs connectés'\n },\n input: {\n agent_select: 'Ajouter un utilisateur...',\n name: 'Prénom',\n username: 'Identifiant unique',\n email: 'Adresse e-mail',\n username_or_email: 'Identifiant ou adresse e-mail',\n current_password: 'Mot de passe actuel',\n new_password: 'Nouveau mot de passe',\n confirm_new_password: 'Confirmer le nouveau mot de passe',\n password_strength: 'Force du mot de passe',\n password_too_weak: 'Mot de passe trop faible. Augmenter la longueur ou ajouter des caractères spéciaux.'\n },\n helper: {\n login: 'Connectez-vous à votre compte.',\n signup: 'Créez votre compte',\n reset_password:\n 'Entrez votre adresse mail ci-dessous et nous vous enverrons un lien pour réinitialiser votre mot de passe',\n set_new_password: 'Veuillez entrer votre adresse mail et un nouveau mot de passe ci-dessous'\n },\n message: {\n resource_show_forbidden: \"Vous n'avez pas la permission de voir cette ressource\",\n resource_edit_forbidden: \"Vous n'avez pas la permission d'éditer cette ressource\",\n resource_delete_forbidden: \"Vous n'avez pas la permission d'effacer cette ressource\",\n resource_control_forbidden: \"Vous n'avez pas la permission d'administrer cette ressource\",\n container_create_forbidden: \"Vous n'avez pas la permission de créer des ressources\",\n container_list_forbidden: \"Vous n'avez pas la permission de voir ces ressources\",\n unable_to_fetch_user_data: 'Impossible de récupérer les données du profil',\n no_token_returned: 'Aucun token a été retourné',\n no_associated_oidc_issuer: 'Aucun serveur de connexion associé avec le WebID fourni',\n invalid_token_returned: 'Token invalide',\n signup_error: \"L'inscription a échoué\",\n user_not_allowed_to_login: \"Vous n'avez pas le droit de vous connecter avec ce compte\",\n user_email_not_found: 'Aucun compte trouvé avec cette adresse mail',\n user_email_exist: 'Un compte existe déjà avec cette adresse mail',\n username_exist: 'Un compte existe déjà avec cet identifiant',\n username_invalid:\n \"Cet identifiant n'est pas valide. Seuls les lettres minuscules, les chiffres, les points et les tirets sont autorisés\",\n new_user_created: 'Votre compte a été créé avec succès',\n user_connected: 'Vous êtes maintenant connecté',\n user_disconnected: 'Vous êtes maintenant déconnecté',\n bad_request: \"Requête erronée (Message d'erreur renvoyé par le serveur: %{error})\",\n account_settings_updated: 'Les paramètres de votre compte ont été mis à jour avec succès',\n login_to_continue: 'Veuillez vous connecter pour continuer',\n choose_pod_provider:\n \"Veuillez choisir un fournisseur de Pods dans la liste ci-dessous. Toutes les données de l'application seront enregistrées sur votre Pod.\",\n unreachable_auth_server: 'Le serveur de connexion ne peut être atteint'\n },\n notification: {\n reset_password_submitted: 'Un e-mail a été envoyé avec les instructions de réinitialisation du mot de passe',\n reset_password_error: \"Une erreur s'est produite\",\n password_changed: 'Le mot de passe a été changé avec succès',\n new_password_error: \"Une erreur s'est produite\",\n invalid_password: 'Mot de passe incorrect',\n get_settings_error: \"Une erreur s'est produite\",\n update_settings_error: \"Une erreur s'est produite\"\n }\n }\n};\n\nexport default frenchMessages;\n"],"names":[],"version":3,"file":"index.cjs.js.map"} \ No newline at end of file +{"mappings":"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","sources":["packages/auth-provider/src/index.ts","packages/auth-provider/src/authProvider.js","packages/auth-provider/src/utils.js","packages/auth-provider/src/crud/create/CreateWithPermissions.js","packages/auth-provider/src/hooks/useCheckPermissions.ts","packages/auth-provider/src/constants.ts","packages/auth-provider/src/crud/edit/EditWithPermissions.js","packages/auth-provider/src/crud/edit/EditActionsWithPermissions.tsx","packages/auth-provider/src/components/PermissionsButton/PermissionsButton.js","packages/auth-provider/src/components/PermissionsButton/PermissionsDialog.js","packages/auth-provider/src/components/PermissionsButton/AddPermissionsForm.js","packages/auth-provider/src/components/PermissionsButton/EditPermissionsForm.js","packages/auth-provider/src/components/PermissionsButton/AgentItem.js","packages/auth-provider/src/components/PermissionsButton/AgentIcon.js","packages/auth-provider/src/hooks/useAgents.js","packages/auth-provider/src/crud/edit/EditToolbarWithPermissions.tsx","packages/auth-provider/src/crud/edit/DeleteButtonWithPermissions.js","packages/auth-provider/src/crud/edit/EditButtonWithPermissions.js","packages/auth-provider/src/crud/list/ListWithPermissions.js","packages/auth-provider/src/crud/list/ListActionsWithPermissions.js","packages/auth-provider/src/crud/show/ShowWithPermissions.js","packages/auth-provider/src/crud/show/ShowActionsWithPermissions.tsx","packages/auth-provider/src/components/AuthDialog.js","packages/auth-provider/src/components/SsoLoginPage.js","packages/auth-provider/src/components/LocalLoginPage/LocalLoginPage.js","packages/auth-provider/src/components/LocalLoginPage/SignupForm.js","packages/auth-provider/src/hooks/useSignup.js","packages/auth-provider/src/components/LocalLoginPage/validatePasswordStrength.js","packages/auth-provider/src/passwordScorer.js","packages/auth-provider/src/components/LocalLoginPage/PasswordStrengthIndicator.js","packages/auth-provider/src/components/LocalLoginPage/ColorGradientProgressBar.js","packages/auth-provider/src/components/LocalLoginPage/LoginForm.js","packages/auth-provider/src/components/LocalLoginPage/NewPasswordForm.js","packages/auth-provider/src/components/LocalLoginPage/ResetPasswordForm.js","packages/auth-provider/src/components/LocalLoginPage/SimpleBox.js","packages/auth-provider/src/components/LocalLoginPage/getSearchParamsRest.js","packages/auth-provider/src/components/ResourceWithPermissions.js","packages/auth-provider/src/components/UserMenu.js","packages/auth-provider/src/hooks/useCheckAuthenticated.js","packages/auth-provider/src/hooks/usePermissionsWithRefetch.js","packages/auth-provider/src/messages/english.js","packages/auth-provider/src/messages/french.js"],"sourcesContent":["export { default as authProvider } from './authProvider';\n\n// Create\nexport { default as CreateWithPermissions } from './crud/create/CreateWithPermissions';\n\n// Edit\nexport { default as EditWithPermissions } from './crud/edit/EditWithPermissions';\nexport { default as EditActionsWithPermissions } from './crud/edit/EditActionsWithPermissions';\nexport { default as EditToolbarWithPermissions } from './crud/edit/EditToolbarWithPermissions';\nexport { default as EditButtonWithPermissions } from './crud/edit/EditButtonWithPermissions';\nexport { default as DeleteButtonWithPermissions } from './crud/edit/DeleteButtonWithPermissions';\n\n// List\nexport { default as ListWithPermissions } from './crud/list/ListWithPermissions';\nexport { default as ListActionsWithPermissions } from './crud/list/ListActionsWithPermissions';\n\n// Show\nexport { default as ShowWithPermissions } from './crud/show/ShowWithPermissions';\nexport { default as ShowActionsWithPermissions } from './crud/show/ShowActionsWithPermissions';\n\nexport { default as PermissionsButton } from './components/PermissionsButton/PermissionsButton';\nexport { default as AuthDialog } from './components/AuthDialog';\nexport { default as SsoLoginPage, default as LoginPage } from './components/SsoLoginPage';\nexport { default as LocalLoginPage } from './components/LocalLoginPage/LocalLoginPage';\nexport { default as ResourceWithPermissions } from './components/ResourceWithPermissions';\nexport { default as UserMenu } from './components/UserMenu';\n\nexport { default as useAgents } from './hooks/useAgents';\nexport { default as useCheckAuthenticated } from './hooks/useCheckAuthenticated';\nexport { default as useCheckPermissions } from './hooks/useCheckPermissions';\nexport { default as usePermissionsWithRefetch } from './hooks/usePermissionsWithRefetch';\nexport { default as useSignup } from './hooks/useSignup';\n\n// Password scoring\nexport { default as PasswordStrengthIndicator } from './components/LocalLoginPage/PasswordStrengthIndicator';\nexport { default as validatePasswordStrength } from './components/LocalLoginPage/validatePasswordStrength';\nexport {\n defaultScorer as defaultPasswordScorer,\n defaultOptions as defaultPasswordScorerOptions,\n createPasswordScorer\n} from './passwordScorer';\n\nexport { default as englishMessages } from './messages/english';\nexport { default as frenchMessages } from './messages/french';\n","import jwtDecode from 'jwt-decode';\nimport urlJoin from 'url-join';\nimport * as oauth from 'oauth4webapi';\nimport { defaultToArray, getAclUri, getAclContext, getAuthServerUrl } from './utils';\n\nconst AUTH_TYPE_SSO = 'sso';\nconst AUTH_TYPE_LOCAL = 'local';\nconst AUTH_TYPE_POD = 'pod';\nconst AUTH_TYPE_SOLID_OIDC = 'solid-oidc';\n\nconst authProvider = ({\n dataProvider,\n authType,\n allowAnonymous = true,\n checkUser,\n checkPermissions = false,\n clientId\n}) => {\n if (![AUTH_TYPE_SSO, AUTH_TYPE_LOCAL, AUTH_TYPE_POD, AUTH_TYPE_SOLID_OIDC].includes(authType))\n throw new Error('The authType parameter is missing from the auth provider');\n if (authType === AUTH_TYPE_SOLID_OIDC && !clientId)\n throw new Error('The clientId parameter is required for solid-oidc authentication');\n const callCheckUser = async webId => {\n if (checkUser) {\n try {\n const { json: userData } = await dataProvider.fetch(webId);\n if (!userData) throw new Error('auth.message.unable_to_fetch_user_data');\n if (checkUser(userData) === false) throw new Error('auth.message.user_not_allowed_to_login');\n } catch (e) {\n localStorage.removeItem('token');\n throw e;\n }\n }\n };\n return {\n login: async params => {\n if (authType === AUTH_TYPE_SOLID_OIDC) {\n let { webId, issuer, redirect = '/', isSignup = false } = params;\n\n if (webId && !issuer) {\n // Find issuer from webId\n const { json: userData } = await dataProvider.fetch(webId);\n if (!userData) throw new Error('auth.message.unable_to_fetch_user_data');\n if (!userData['solid:oidcIssuer']) throw new Error('auth.message.no_associated_oidc_issuer');\n issuer = userData?.['solid:oidcIssuer'];\n }\n\n const as = await oauth\n .discoveryRequest(new URL(issuer))\n .then(response => oauth.processDiscoveryResponse(new URL(issuer), response))\n .catch(() => {\n throw new Error('auth.message.unreachable_auth_server');\n });\n\n const codeVerifier = oauth.generateRandomCodeVerifier();\n const codeChallenge = await oauth.calculatePKCECodeChallenge(codeVerifier);\n const codeChallengeMethod = 'S256';\n\n // Save to use on handleCallback method\n localStorage.setItem('code_verifier', codeVerifier);\n localStorage.setItem('redirect', redirect);\n\n const authorizationUrl = new URL(as.authorization_endpoint);\n authorizationUrl.searchParams.set('response_type', 'code');\n authorizationUrl.searchParams.set('client_id', clientId);\n authorizationUrl.searchParams.set('code_challenge', codeChallenge);\n authorizationUrl.searchParams.set('code_challenge_method', codeChallengeMethod);\n authorizationUrl.searchParams.set('redirect_uri', `${window.location.origin}/auth-callback`);\n authorizationUrl.searchParams.set('scope', 'openid webid offline_access');\n authorizationUrl.searchParams.set('is_signup', isSignup);\n\n window.location = authorizationUrl;\n } else if (authType === AUTH_TYPE_LOCAL) {\n const { username, password } = params;\n const authServerUrl = await getAuthServerUrl(dataProvider);\n let token, webId;\n\n try {\n ({\n json: { token, webId }\n } = await dataProvider.fetch(urlJoin(authServerUrl, 'auth/login'), {\n method: 'POST',\n body: JSON.stringify({\n username: username.trim(),\n password: password.trim()\n }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n }));\n } catch (e) {\n throw new Error('ra.auth.sign_in_error');\n }\n\n // Set token now as it is required for refreshConfig\n localStorage.setItem('token', token);\n await dataProvider.refreshConfig();\n\n await callCheckUser(webId);\n } else if (authType === AUTH_TYPE_SSO) {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n let redirectUrl = `${new URL(window.location.href).origin}/login?login=true`;\n if (params.redirect) redirectUrl += `&redirect=${encodeURIComponent(params.redirect)}`;\n window.location.href = urlJoin(authServerUrl, `auth?redirectUrl=${encodeURIComponent(redirectUrl)}`);\n }\n },\n handleCallback: async () => {\n const { searchParams } = new URL(window.location);\n\n if (authType === AUTH_TYPE_SOLID_OIDC) {\n const issuer = new URL(searchParams.get('iss'));\n const as = await oauth\n .discoveryRequest(issuer)\n .then(response => oauth.processDiscoveryResponse(issuer, response));\n\n const client = {\n client_id: clientId,\n token_endpoint_auth_method: 'none' // We don't have a client secret\n };\n\n const currentUrl = new URL(window.location.href);\n const params = oauth.validateAuthResponse(as, client, currentUrl, oauth.expectNoState);\n if (oauth.isOAuth2Error(params)) {\n throw new Error(`OAuth error: ${params.error} (${params.error_description})`);\n }\n\n // Retrieve data set during login\n const codeVerifier = localStorage.getItem('code_verifier');\n const redirect = localStorage.getItem('redirect');\n\n const response = await oauth.authorizationCodeGrantRequest(\n as,\n client,\n params,\n `${window.location.origin}/auth-callback`,\n codeVerifier\n );\n\n const result = await oauth.processAuthorizationCodeOpenIDResponse(as, client, response);\n if (oauth.isOAuth2Error(result)) {\n throw new Error(`OAuth error: ${params.error} (${params.error_description})`);\n }\n\n // Until DPoP is implemented, use the ID token to log into local Pod\n // And the proxy endpoint to log into remote Pods\n localStorage.setItem('token', result.id_token);\n\n // Remove we don't need it anymore\n localStorage.removeItem('code_verifier');\n localStorage.removeItem('redirect');\n\n // Reload to ensure the dataServer config is reset\n window.location.href = redirect || '/';\n } else {\n const token = searchParams.get('token');\n if (!token) throw new Error('auth.message.no_token_returned');\n\n let webId;\n try {\n ({ webId } = jwtDecode(token));\n } catch (e) {\n throw new Error('auth.message.invalid_token_returned');\n }\n\n localStorage.setItem('token', token);\n await dataProvider.refreshConfig();\n\n await callCheckUser(webId);\n }\n },\n signup: async params => {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n if (authType === AUTH_TYPE_LOCAL) {\n const { username, email, password, domain, ...profileData } = params;\n let token, webId;\n\n try {\n ({\n json: { token, webId }\n } = await dataProvider.fetch(urlJoin(authServerUrl, 'auth/signup'), {\n method: 'POST',\n body: JSON.stringify({\n username: username?.trim(),\n email: email.trim(),\n password: password.trim(),\n ...profileData\n }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n }));\n } catch (e) {\n if (e.message === 'email.already.exists') {\n throw new Error('auth.message.user_email_exist');\n } else if (e.message === 'username.already.exists') {\n throw new Error('auth.message.username_exist');\n } else if (e.message === 'username.invalid') {\n throw new Error('auth.message.username_invalid');\n } else {\n throw new Error('auth.message.signup_error');\n }\n }\n\n localStorage.setItem('token', token);\n await dataProvider.refreshConfig();\n\n await callCheckUser(webId);\n\n return webId;\n } else {\n const redirectUrl = `${new URL(window.location.href).origin}/login?login=true`;\n window.location.href = urlJoin(authServerUrl, `auth?redirectUrl=${encodeURIComponent(redirectUrl)}`);\n }\n },\n logout: async params => {\n const { redirectUrl } = params || {};\n switch (authType) {\n case AUTH_TYPE_LOCAL: {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n\n // Delete token but also any other value in local storage\n localStorage.clear();\n\n let result = {};\n\n try {\n result = await dataProvider.fetch(urlJoin(authServerUrl, '.well-known/openid-configuration'));\n } catch (e) {\n // Do nothing if it fails\n }\n\n if (result.status === 200 && result.json) {\n // Redirect to OIDC endpoint if it exists\n window.location.href = result.json.end_session_endpoint;\n } else {\n // Reload to ensure the dataServer config is reset\n window.location.reload();\n window.location.href = '/';\n }\n\n break;\n }\n\n case AUTH_TYPE_SSO: {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n const baseUrl = new URL(window.location.href).origin;\n return urlJoin(\n authServerUrl,\n `auth/logout?redirectUrl=${encodeURIComponent(`${urlJoin(baseUrl, 'login')}?logout=true`)}`\n );\n }\n\n case AUTH_TYPE_POD: {\n const token = localStorage.getItem('token');\n if (token) {\n const { webId } = jwtDecode(token);\n // Delete token but also any other value in local storage\n localStorage.clear();\n // Redirect to the POD provider\n return `${urlJoin(webId, 'openApp')}?type=${encodeURIComponent(\n 'http://activitypods.org/ns/core#FrontAppRegistration'\n )}`;\n }\n break;\n }\n\n case AUTH_TYPE_SOLID_OIDC: {\n const token = localStorage.getItem('token');\n if (token) {\n const { webid: webId } = jwtDecode(token); // Not webId !!\n\n // Delete token but also any other value in local storage\n localStorage.clear();\n\n if (redirectUrl) {\n return redirectUrl;\n } else {\n // We don't need the token to fetch the WebID since it is public\n const { json: userData } = await dataProvider.fetch(webId);\n\n // Redirect to the Pod provider\n return userData?.['solid:oidcIssuer'] || new URL(webId).origin;\n }\n } else {\n return redirectUrl;\n }\n }\n\n default:\n break;\n }\n },\n checkAuth: async () => {\n const token = localStorage.getItem('token');\n if (!token && !allowAnonymous) throw new Error();\n },\n checkUser: userData => {\n if (checkUser) {\n return checkUser(userData);\n }\n return true;\n },\n checkError: error => {\n // We want to disconnect only with INVALID_TOKEN errors\n if (error.status === 401 && error.body && error.body.type === 'INVALID_TOKEN') {\n localStorage.removeItem('token');\n return Promise.reject();\n } else {\n // Other error code (404, 500, etc): no need to log out\n return Promise.resolve();\n }\n },\n getPermissions: async uri => {\n if (!checkPermissions) return;\n\n // React-admin calls getPermissions with an empty object on every page refresh\n // It also passes an object `{ params: { route: 'dashboard' } }` on the Dashboard\n // Ignore all this until we found a way to bypass these redundant calls\n if (typeof uri === 'object') return;\n\n if (!uri || !uri.startsWith('http'))\n throw new Error('The first parameter passed to getPermissions must be an URL');\n\n const aclUri = getAclUri(uri);\n\n try {\n const { json } = await dataProvider.fetch(aclUri);\n return json['@graph'];\n } catch (e) {\n console.warn(`Could not fetch ACL URI ${uri}`);\n return [];\n }\n },\n addPermission: async (uri, agentId, predicate, mode) => {\n if (!uri || !uri.startsWith('http'))\n throw new Error('The first parameter passed to addPermission must be an URL');\n\n const aclUri = getAclUri(uri);\n\n const authorization = {\n '@id': `#${mode.replace('acl:', '')}`,\n '@type': 'acl:Authorization',\n [predicate]: agentId,\n 'acl:accessTo': uri,\n 'acl:mode': mode\n };\n\n await dataProvider.fetch(aclUri, {\n method: 'PATCH',\n body: JSON.stringify({\n '@context': getAclContext(aclUri),\n '@graph': [authorization]\n })\n });\n },\n removePermission: async (uri, agentId, predicate, mode) => {\n if (!uri || !uri.startsWith('http'))\n throw new Error('The first parameter passed to removePermission must be an URL');\n\n const aclUri = getAclUri(uri);\n\n // Fetch current permissions\n const { json } = await dataProvider.fetch(aclUri);\n\n const updatedPermissions = json['@graph']\n .filter(authorization => !authorization['@id'].includes('#Default'))\n .map(authorization => {\n const modes = defaultToArray(authorization['acl:mode']);\n let agents = defaultToArray(authorization[predicate]);\n if (mode && modes.includes(mode) && agents && agents.includes(agentId)) {\n agents = agents.filter(agent => agent !== agentId);\n }\n return { ...authorization, [predicate]: agents };\n });\n\n await dataProvider.fetch(aclUri, {\n method: 'PUT',\n body: JSON.stringify({\n '@context': getAclContext(aclUri),\n '@graph': updatedPermissions\n })\n });\n },\n getIdentity: async () => {\n const token = localStorage.getItem('token');\n if (token) {\n const payload = jwtDecode(token);\n\n // Backend-generated tokens use webId but Solid-OIDC tokens use webid\n const webId = authType === AUTH_TYPE_SOLID_OIDC ? payload.webid : payload.webId;\n\n if (!webId) {\n // If webId is not set, it is probably because we have ActivityPods v1 tokens and we need to disconnect\n localStorage.removeItem('token');\n window.location.href = '/login';\n throw new Error('No webId found on provided token !');\n }\n\n const { json: webIdData } = await dataProvider.fetch(webId);\n const { json: profileData } = webIdData.url ? await dataProvider.fetch(webIdData.url) : {};\n\n return {\n id: webId,\n fullName:\n profileData?.['vcard:given-name'] ||\n profileData?.['pair:label'] ||\n webIdData['foaf:name'] ||\n webIdData['pair:label'],\n profileData,\n webIdData\n };\n }\n },\n resetPassword: async params => {\n const { email } = params;\n const authServerUrl = await getAuthServerUrl(dataProvider);\n try {\n await dataProvider.fetch(urlJoin(authServerUrl, 'auth/reset_password'), {\n method: 'POST',\n body: JSON.stringify({ email: email.trim() }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n });\n } catch (e) {\n if (e.message === 'email.not.exists') {\n throw new Error('auth.message.user_email_not_found');\n } else {\n throw new Error('auth.notification.reset_password_error');\n }\n }\n },\n setNewPassword: async params => {\n const { email, token, password } = params;\n const authServerUrl = await getAuthServerUrl(dataProvider);\n try {\n await dataProvider.fetch(urlJoin(authServerUrl, 'auth/new_password'), {\n method: 'POST',\n body: JSON.stringify({ email: email.trim(), token, password }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n });\n } catch (e) {\n if (e.message === 'email.not.exists') {\n throw new Error('auth.message.user_email_not_found');\n } else {\n throw new Error('auth.notification.new_password_error');\n }\n }\n },\n getAccountSettings: async params => {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n try {\n const { json } = await dataProvider.fetch(urlJoin(authServerUrl, 'auth/account'));\n return json;\n } catch (e) {\n throw new Error('auth.notification.get_settings_error');\n }\n },\n updateAccountSettings: async params => {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n try {\n const { email, currentPassword, newPassword } = params;\n\n await dataProvider.fetch(urlJoin(authServerUrl, 'auth/account'), {\n method: 'POST',\n body: JSON.stringify({\n currentPassword,\n email: email?.trim(),\n newPassword\n }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n });\n } catch (e) {\n if (e.message === 'auth.account.invalid_password') {\n throw new Error('auth.notification.invalid_password');\n }\n\n throw new Error('auth.notification.update_settings_error');\n }\n }\n };\n};\n\nexport default authProvider;\n","import urlJoin from 'url-join';\n\nexport const defaultToArray = value => (!value ? undefined : Array.isArray(value) ? value : [value]);\n\n// Transform the URI to the one used to find the ACL\n// To be compatible with all servers, we should do a HEAD request to the resource URI\nexport const getAclUri = resourceUri => {\n const parsedUrl = new URL(resourceUri);\n return urlJoin(parsedUrl.origin, '_acl', parsedUrl.pathname);\n};\n\nexport const getAclContext = baseUri => ({\n '@base': baseUri,\n acl: 'http://www.w3.org/ns/auth/acl#',\n foaf: 'http://xmlns.com/foaf/0.1/',\n 'acl:agent': { '@type': '@id' },\n 'acl:agentGroup': { '@type': '@id' },\n 'acl:agentClass': { '@type': '@id' },\n 'acl:mode': { '@type': '@id' },\n 'acl:accessTo': { '@type': '@id' }\n});\n\nexport const getAuthServerUrl = async dataProvider => {\n const dataServers = await dataProvider.getDataServers();\n const authServer = Object.values(dataServers).find(server => server.authServer === true);\n if (!authServer) throw new Error('Could not find a server with authServer: true. Check your dataServers config.');\n // If the server is a Pod provider, return the root URL instead of https://domain.com/user/data\n return authServer.pod ? new URL(authServer.baseUrl).origin : authServer.baseUrl;\n};\n\nexport const delay = async t => new Promise(resolve => setTimeout(resolve, t));\n","import React from 'react';\nimport { Create, CreateActions, useResourceContext } from 'react-admin';\nimport { useCreateContainerUri } from '@semapps/semantic-data-provider';\nimport useCheckPermissions from '../../hooks/useCheckPermissions';\n\nconst CreateWithPermissions = props => {\n const resource = useResourceContext();\n const createContainerUri = useCreateContainerUri()(resource);\n useCheckPermissions(createContainerUri, 'create');\n return ;\n};\n\nCreateWithPermissions.defaultProps = {\n actions: \n};\n\nexport default CreateWithPermissions;\n","import { useEffect } from 'react';\nimport { usePermissions, useRedirect, useNotify } from 'react-admin';\nimport { rights, forbiddenErrors } from '../constants';\nimport { Permissions } from '../types';\n\nconst useCheckPermissions = (uri: string, mode: keyof typeof rights, redirectUrl: string = '/') => {\n const { permissions } = usePermissions(uri);\n const notify = useNotify();\n const redirect = useRedirect();\n\n useEffect(() => {\n if (permissions && !permissions.some(p => rights[mode].includes(p['acl:mode']))) {\n notify(forbiddenErrors[mode], { type: 'error' });\n redirect(redirectUrl);\n }\n }, [permissions, redirect, notify]);\n\n return permissions;\n};\n\nexport default useCheckPermissions;\n","import { AclClass, AclMode } from './types';\n\nexport const ACL_READ: AclMode = 'acl:Read';\nexport const ACL_APPEND: AclMode = 'acl:Append';\nexport const ACL_WRITE: AclMode = 'acl:Write';\nexport const ACL_CONTROL: AclMode = 'acl:Control';\n\nexport const USER_AGENT = 'acl:agent';\nexport const GROUP_AGENT = 'acl:agentGroup';\nexport const CLASS_AGENT = 'acl:agentClass';\n\nexport const ANONYMOUS_AGENT: AclClass = 'foaf:Agent';\nexport const AUTHENTICATED_AGENT: AclClass = 'acl:AuthenticatedAgent';\n\nexport const rightsToShow: AclMode[] = [ACL_READ, ACL_APPEND, ACL_WRITE, ACL_CONTROL];\nexport const rightsToList: AclMode[] = [ACL_READ, ACL_APPEND, ACL_WRITE, ACL_CONTROL];\nexport const rightsToCreate: AclMode[] = [ACL_APPEND, ACL_WRITE, ACL_CONTROL];\nexport const rightsToEdit: AclMode[] = [ACL_APPEND, ACL_WRITE, ACL_CONTROL];\nexport const rightsToDelete: AclMode[] = [ACL_WRITE, ACL_CONTROL];\nexport const rightsToControl: AclMode[] = [ACL_CONTROL];\n\nexport const rights = {\n show: rightsToShow,\n list: rightsToList,\n create: rightsToCreate,\n edit: rightsToEdit,\n delete: rightsToDelete,\n control: rightsToControl\n};\n\nexport const forbiddenErrors = {\n show: 'auth.message.resource_show_forbidden',\n edit: 'auth.message.resource_edit_forbidden',\n delete: 'auth.message.resource_delete_forbidden',\n control: 'auth.message.resource_control_forbidden',\n list: 'auth.message.container_list_forbidden',\n create: 'auth.message.container_create_forbidden'\n};\n\nexport const resourceRightsLabels = {\n [ACL_READ]: 'auth.right.resource.read',\n [ACL_APPEND]: 'auth.right.resource.append',\n [ACL_WRITE]: 'auth.right.resource.write',\n [ACL_CONTROL]: 'auth.right.resource.control'\n};\n\nexport const containerRightsLabels = {\n [ACL_READ]: 'auth.right.container.read',\n [ACL_WRITE]: 'auth.right.container.write',\n [ACL_CONTROL]: 'auth.right.container.control'\n};\n","import React from 'react';\nimport { Edit, useGetRecordId } from 'react-admin';\nimport EditActionsWithPermissions from './EditActionsWithPermissions';\nimport EditToolbarWithPermissions from './EditToolbarWithPermissions';\nimport useCheckPermissions from '../../hooks/useCheckPermissions';\n\nconst EditWithPermissions = props => {\n const recordId = useGetRecordId();\n useCheckPermissions(recordId, 'edit');\n return (\n \n {React.cloneElement(props.children, {\n toolbar: ,\n // Allow to override toolbar\n ...props.children.props\n })}\n \n );\n};\n\nEditWithPermissions.defaultProps = {\n actions: \n};\n\nexport default EditWithPermissions;\n","import React from 'react';\nimport {\n ShowButton,\n ListButton,\n TopToolbar,\n usePermissions,\n useResourceDefinition,\n useRecordContext,\n useResourceContext\n} from 'react-admin';\nimport { useCreateContainerUri } from '@semapps/semantic-data-provider';\nimport PermissionsButton from '../../components/PermissionsButton/PermissionsButton';\nimport { rightsToControl, rightsToList, rightsToShow } from '../../constants';\nimport { Permissions } from '../../types';\n\nconst EditActionsWithPermissions = () => {\n const { hasList, hasShow } = useResourceDefinition();\n const record = useRecordContext();\n const { permissions } = usePermissions(record?.id);\n\n const resource = useResourceContext();\n const containerUri = useCreateContainerUri()(resource);\n const { permissions: containerPermissions } = usePermissions(containerUri);\n\n return (\n \n {hasList && containerPermissions && containerPermissions.some(p => rightsToList.includes(p['acl:mode'])) && (\n \n )}\n {hasShow && permissions && permissions.some(p => rightsToShow.includes(p['acl:mode'])) && }\n {permissions && permissions.some(p => rightsToControl.includes(p['acl:mode'])) && }\n \n );\n};\n\nexport default EditActionsWithPermissions;\n","import React, { useState } from 'react';\nimport { Button, useRecordContext, useResourceContext } from 'react-admin';\nimport ShareIcon from '@mui/icons-material/Share';\nimport { useCreateContainer } from '@semapps/semantic-data-provider';\nimport PermissionsDialog from './PermissionsDialog';\n\nconst PermissionsButton = ({ isContainer }) => {\n const record = useRecordContext();\n const resource = useResourceContext();\n const [showDialog, setShowDialog] = useState(false);\n const createContainer = useCreateContainer(resource);\n const uri = isContainer ? createContainer : record.id || record['@id'];\n return (\n <>\n \n setShowDialog(false)} />\n \n );\n};\n\nPermissionsButton.defaultProps = {\n isContainer: false\n};\n\nexport default PermissionsButton;\n","import React from 'react';\nimport { Button, useTranslate } from 'react-admin';\nimport { Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport AddPermissionsForm from './AddPermissionsForm';\nimport EditPermissionsForm from './EditPermissionsForm';\nimport useAgents from '../../hooks/useAgents';\n\nconst useStyles = makeStyles(() => ({\n title: {\n paddingBottom: 8\n },\n actions: {\n padding: 15\n },\n addForm: {\n paddingTop: 0\n },\n listForm: {\n paddingTop: 0,\n paddingBottom: 0,\n paddingRight: 0,\n maxHeight: 210\n }\n}));\n\nconst PermissionsDialog = ({ open, onClose, uri, isContainer }) => {\n const classes = useStyles();\n const translate = useTranslate();\n const { agents, addPermission, removePermission } = useAgents(uri);\n\n return (\n \n \n {translate(isContainer ? 'auth.dialog.container_permissions' : 'auth.dialog.resource_permissions')}\n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default PermissionsDialog;\n","import React, { useEffect, useState } from 'react';\nimport { useGetList, useTranslate } from 'react-admin';\nimport { TextField, List, ListItem, ListItemAvatar, ListItemText, Avatar } from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport PersonIcon from '@mui/icons-material/Person';\nimport { USER_AGENT, ACL_READ } from '../../constants';\n\nconst useStyles = makeStyles(() => ({\n list: {\n padding: 0,\n width: '100%'\n },\n option: {\n padding: 0\n }\n}));\n\nconst AddPermissionsForm = ({ agents, addPermission }) => {\n const classes = useStyles();\n const translate = useTranslate();\n const [value, setValue] = useState(null);\n const [inputValue, setInputValue] = useState('');\n const [options, setOptions] = useState([]);\n\n const { data } = useGetList(\n 'Person',\n {\n pagination: { page: 1, perPage: 100 },\n sort: { field: 'pair:label', order: 'ASC' },\n filter: { q: inputValue }\n },\n {\n enabled: inputValue.length > 0\n }\n );\n\n useEffect(() => {\n setOptions(data?.length > 0 ? Object.values(data) : []);\n }, [data]);\n\n return (\n option['pair:label']}\n // Do not return agents which have already been added\n filterOptions={x => x.filter(agent => !Object.keys(agents).includes(agent.id))}\n options={options}\n noOptionsText={translate('ra.navigation.no_results')}\n autoComplete\n blurOnSelect\n clearOnBlur\n disableClearable\n value={value}\n onChange={(event, record) => {\n addPermission(record.id || record['@id'], USER_AGENT, ACL_READ);\n setValue(null);\n setInputValue('');\n setOptions([]);\n }}\n onInputChange={(event, newInputValue) => {\n setInputValue(newInputValue);\n }}\n renderInput={params => (\n \n )}\n renderOption={(props, option) => (\n \n \n \n \n \n \n \n \n \n \n )}\n />\n );\n};\n\nexport default AddPermissionsForm;\n","import React from 'react';\nimport { List } from '@mui/material';\nimport { styled } from '@mui/system';\nimport AgentItem from './AgentItem';\n\nconst StyledList = styled(List)(({ theme }) => ({\n width: '100%',\n maxWidth: '100%',\n backgroundColor: theme.palette.background.paper\n}));\n\nconst EditPermissionsForm = ({ isContainer, agents, addPermission, removePermission }) => {\n return (\n \n {Object.entries(agents).map(([agentId, agent]) => (\n \n ))}\n \n );\n};\n\nexport default EditPermissionsForm;\n","import React, { useState, useEffect } from 'react';\nimport { useDataProvider, useTranslate, Loading, Error } from 'react-admin';\nimport {\n Avatar,\n ListItem,\n ListItemIcon,\n ListItemAvatar,\n ListItemText,\n ListItemSecondaryAction,\n IconButton,\n Menu,\n MenuItem\n} from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport EditIcon from '@mui/icons-material/Edit';\nimport CheckIcon from '@mui/icons-material/Check';\nimport { GROUP_AGENT, USER_AGENT, ANONYMOUS_AGENT, resourceRightsLabels, containerRightsLabels } from '../../constants';\nimport AgentIcon from './AgentIcon';\n\nconst useStyles = makeStyles(() => ({\n listItem: {\n paddingLeft: 4,\n paddingRight: 36\n },\n primaryText: {\n width: '30%',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n },\n secondaryText: {\n textAlign: 'center',\n width: '60%',\n fontStyle: 'italic',\n color: 'grey'\n }\n}));\n\nconst AgentItem = ({ isContainer, agent, addPermission, removePermission }) => {\n const classes = useStyles();\n const translate = useTranslate();\n const dataProvider = useDataProvider();\n const [anchorEl, setAnchorEl] = React.useState(null);\n const [user, setUser] = useState();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState();\n\n useEffect(() => {\n if (agent.predicate === USER_AGENT) {\n dataProvider\n .getOne('Person', { id: agent.id })\n .then(({ data }) => {\n setUser(data);\n setLoading(false);\n })\n .catch(error => {\n setError(error);\n setLoading(false);\n });\n } else {\n setLoading(false);\n }\n }, [agent.id, agent.predicate]);\n\n // For now, do not display groups\n if (agent.predicate === GROUP_AGENT) return null;\n\n const openMenu = event => setAnchorEl(event.currentTarget);\n const closeMenu = () => setAnchorEl(null);\n\n const labels = isContainer ? containerRightsLabels : resourceRightsLabels;\n\n if (loading) return ;\n if (error) return ;\n\n return (\n \n \n \n \n \n \n \n translate(labels[p])).join(', ')}\n />\n \n \n \n \n \n {Object.entries(labels).map(([rightKey, rightLabel]) => {\n const hasPermission = agent.permissions && agent.permissions.includes(rightKey);\n return (\n {\n if (hasPermission) {\n removePermission(agent.id, agent.predicate, rightKey);\n } else {\n addPermission(agent.id, agent.predicate, rightKey);\n }\n closeMenu();\n }}\n >\n {hasPermission ? : null}\n \n \n );\n })}\n \n \n \n );\n};\n\nexport default AgentItem;\n","import React from 'react';\nimport PublicIcon from '@mui/icons-material/Public';\nimport VpnLockIcon from '@mui/icons-material/VpnLock';\nimport PersonIcon from '@mui/icons-material/Person';\nimport GroupIcon from '@mui/icons-material/Group';\nimport { CLASS_AGENT, GROUP_AGENT, USER_AGENT, ANONYMOUS_AGENT } from '../../constants';\n\nconst AgentIcon = ({ agent }) => {\n switch (agent.predicate) {\n case CLASS_AGENT:\n return agent.id === ANONYMOUS_AGENT ? : ;\n case USER_AGENT:\n return ;\n case GROUP_AGENT:\n return ;\n default:\n throw new Error(`Unknown agent predicate: ${agent.predicate}`);\n }\n};\n\nexport default AgentIcon;\n","import { useEffect, useCallback, useState } from 'react';\nimport { usePermissions, useAuthProvider } from 'react-admin';\nimport { defaultToArray } from '../utils';\nimport { CLASS_AGENT, GROUP_AGENT, USER_AGENT, ANONYMOUS_AGENT, AUTHENTICATED_AGENT } from '../constants';\n\nconst useAgents = uri => {\n const { permissions } = usePermissions(uri);\n const authProvider = useAuthProvider();\n const [agents, setAgents] = useState({});\n\n // Format list of authorized agents, based on the permissions returned for the resource\n useEffect(() => {\n const result = {\n [ANONYMOUS_AGENT]: {\n id: ANONYMOUS_AGENT,\n predicate: CLASS_AGENT,\n permissions: []\n },\n [AUTHENTICATED_AGENT]: {\n id: AUTHENTICATED_AGENT,\n predicate: CLASS_AGENT,\n permissions: []\n }\n };\n\n const appendPermission = (agentId, predicate, mode) => {\n if (result[agentId]) {\n result[agentId].permissions.push(mode);\n } else {\n result[agentId] = {\n id: agentId,\n predicate,\n permissions: [mode]\n };\n }\n };\n\n if (permissions) {\n for (const p of permissions) {\n if (p[CLASS_AGENT]) {\n defaultToArray(p[CLASS_AGENT]).forEach(agentId => appendPermission(agentId, CLASS_AGENT, p['acl:mode']));\n }\n if (p[USER_AGENT]) {\n defaultToArray(p[USER_AGENT]).forEach(userUri => appendPermission(userUri, USER_AGENT, p['acl:mode']));\n }\n if (p[GROUP_AGENT]) {\n defaultToArray(p[GROUP_AGENT]).forEach(groupUri => appendPermission(groupUri, GROUP_AGENT, p['acl:mode']));\n }\n }\n setAgents(result);\n }\n }, [permissions]);\n\n const addPermission = useCallback(\n (agentId, predicate, mode) => {\n const prevAgents = { ...agents };\n setAgents({\n ...agents,\n [agentId]: {\n id: agentId,\n predicate,\n permissions: agents[agentId] ? [...agents[agentId]?.permissions, mode] : [mode]\n }\n });\n authProvider.addPermission(uri, agentId, predicate, mode).catch(e => {\n // If there was an error, revert the optimistic update\n setAgents(prevAgents);\n });\n },\n [agents, setAgents, uri, authProvider]\n );\n\n const removePermission = useCallback(\n (agentId, predicate, mode) => {\n const prevAgents = { ...agents };\n setAgents(\n Object.fromEntries(\n Object.entries(agents)\n .map(([key, agent]) => {\n if (agent.id === agentId) {\n agent.permissions = agent.permissions.filter(m => m !== mode);\n }\n return [key, agent];\n })\n // Remove agents if they have no permissions (except if they are class agents)\n .filter(([_, agent]) => agent.predicate === CLASS_AGENT || agent.permissions.length > 0)\n )\n );\n authProvider.removePermission(uri, agentId, predicate, mode).catch(e => {\n // If there was an error, revert the optimistic update\n setAgents(prevAgents);\n });\n },\n [agents, setAgents, uri, authProvider]\n );\n\n return { agents, addPermission, removePermission };\n};\n\nexport default useAgents;\n","import React from 'react';\nimport { SaveButton, Toolbar, ToolbarProps } from 'react-admin';\nimport { styled } from '@mui/material/styles';\nimport DeleteButtonWithPermissions from './DeleteButtonWithPermissions';\n\nconst StyledToolbar = styled(Toolbar)(() => ({\n flex: 1,\n display: 'flex',\n justifyContent: 'space-between'\n}));\n\nconst EditToolbarWithPermissions: React.FunctionComponent = props => (\n \n \n \n \n);\n\nexport default EditToolbarWithPermissions;\n","import React from 'react';\nimport { DeleteButton, useGetRecordId, usePermissions } from 'react-admin';\nimport { rightsToDelete } from '../../constants';\n\nconst DeleteButtonWithPermissions = props => {\n const recordId = useGetRecordId();\n const { permissions, isLoading } = usePermissions(recordId);\n if (!isLoading && permissions?.some(p => rightsToDelete.includes(p['acl:mode']))) {\n return ;\n }\n return null;\n};\n\nexport default DeleteButtonWithPermissions;\n","import React from 'react';\nimport { EditButton, useGetRecordId, usePermissions } from 'react-admin';\nimport { rightsToEdit } from '../../constants';\n\nconst EditButtonWithPermissions = props => {\n const recordId = useGetRecordId();\n const { permissions, isLoading } = usePermissions(recordId);\n if (!isLoading && permissions?.some(p => rightsToEdit.includes(p['acl:mode']))) {\n return ;\n }\n return null;\n};\n\nexport default EditButtonWithPermissions;\n","import React from 'react';\nimport { List } from 'react-admin';\nimport ListActionsWithPermissions from './ListActionsWithPermissions';\n\nconst ListWithPermissions = props => ;\n\nListWithPermissions.defaultProps = {\n actions: \n};\n\nexport default ListWithPermissions;\n","import React from 'react';\nimport {\n CreateButton,\n ExportButton,\n useResourceDefinition,\n TopToolbar,\n usePermissions,\n useResourceContext\n} from 'react-admin';\nimport { useMediaQuery } from '@mui/material';\nimport { useCreateContainer } from '@semapps/semantic-data-provider';\nimport PermissionsButton from '../../components/PermissionsButton/PermissionsButton';\nimport { rightsToCreate, rightsToControl } from '../../constants';\n\n// Do not show Export and Refresh buttons on mobile\nconst ListActionsWithPermissions = ({\n bulkActions,\n sort,\n displayedFilters,\n exporter,\n filters,\n filterValues,\n onUnselectItems,\n selectedIds,\n showFilter,\n total\n}) => {\n const resource = useResourceContext();\n const xs = useMediaQuery(theme => theme.breakpoints.down('xs'));\n const resourceDefinition = useResourceDefinition();\n const createContainerUri = useCreateContainer(resource);\n const { permissions } = usePermissions(createContainerUri);\n return (\n \n {filters &&\n React.cloneElement(filters, {\n showFilter,\n displayedFilters,\n filterValues,\n context: 'button'\n })}\n {resourceDefinition.hasCreate && permissions && permissions.some(p => rightsToCreate.includes(p['acl:mode'])) && (\n \n )}\n {permissions && permissions.some(p => rightsToControl.includes(p['acl:mode'])) && (\n \n )}\n {!xs && exporter !== false && (\n \n )}\n {bulkActions &&\n React.cloneElement(bulkActions, {\n filterValues,\n selectedIds,\n onUnselectItems\n })}\n \n );\n};\n\nexport default ListActionsWithPermissions;\n","import React from 'react';\nimport { Show, useGetRecordId } from 'react-admin';\nimport ShowActionsWithPermissions from './ShowActionsWithPermissions';\nimport useCheckPermissions from '../../hooks/useCheckPermissions';\n\nconst ShowWithPermissions = props => {\n const recordId = useGetRecordId();\n useCheckPermissions(recordId, 'show');\n return ;\n};\n\nShowWithPermissions.defaultProps = {\n actions: \n};\n\nexport default ShowWithPermissions;\n","import React from 'react';\nimport {\n EditButton,\n ListButton,\n TopToolbar,\n usePermissions,\n useResourceDefinition,\n useRecordContext,\n useResourceContext\n} from 'react-admin';\nimport { useCreateContainerUri } from '@semapps/semantic-data-provider';\nimport PermissionsButton from '../../components/PermissionsButton/PermissionsButton';\nimport { rightsToControl, rightsToEdit, rightsToList } from '../../constants';\nimport { Permissions } from '../../types';\n\nconst ShowActionsWithPermissions = () => {\n const { hasList, hasEdit } = useResourceDefinition();\n const record = useRecordContext();\n const { permissions } = usePermissions(record?.id);\n\n const resource = useResourceContext();\n const containerUri = useCreateContainerUri()(resource);\n const { permissions: containerPermissions } = usePermissions(containerUri);\n\n return (\n \n {hasList && containerPermissions && containerPermissions.some(p => rightsToList.includes(p['acl:mode'])) && (\n \n )}\n {hasEdit && permissions && permissions.some(p => rightsToEdit.includes(p['acl:mode'])) && }\n {permissions && permissions.some(p => rightsToControl.includes(p['acl:mode'])) && }\n \n );\n};\n\nexport default ShowActionsWithPermissions;\n","import React from 'react';\nimport { useLogin, useTranslate } from 'react-admin';\nimport { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from '@mui/material';\n\nconst AuthDialog = ({ open, onClose, title, message, redirect, ...rest }) => {\n const login = useLogin();\n const translate = useTranslate();\n return (\n \n {translate(title)}\n \n {translate(message)}\n \n \n \n login({ redirect: redirect || window.location.pathname + window.location.search })}\n color=\"primary\"\n variant=\"contained\"\n >\n {translate('auth.action.login')}\n \n \n \n );\n};\n\nAuthDialog.defaultProps = {\n title: 'auth.dialog.login_required',\n message: 'auth.message.login_to_continue'\n};\n\nexport default AuthDialog;\n","import React, { useRef, useEffect } from 'react';\nimport jwtDecode from 'jwt-decode';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport { useDataProvider, useAuthProvider, useLogin, useGetIdentity, useNotify } from 'react-admin';\nimport { Card, Avatar, Typography, Button, CardActions } from '@mui/material';\nimport { styled } from '@mui/material/styles';\nimport LockIcon from '@mui/icons-material/Lock';\n\nconst delay = async t => new Promise(resolve => setTimeout(resolve, t));\n\n// Inspired from https://github.com/marmelab/react-admin/blob/master/packages/ra-ui-materialui/src/auth/Login.tsx\nconst SsoLoginPage = ({ children, backgroundImage, buttons, userResource, propertiesExist, text, ...rest }) => {\n const containerRef = useRef();\n let backgroundImageLoaded = false;\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const { data: identity, isLoading } = useGetIdentity();\n\n const notify = useNotify();\n const login = useLogin();\n const dataProvider = useDataProvider();\n const authProvider = useAuthProvider();\n\n useEffect(() => {\n if (!isLoading && identity?.id) {\n // Already authenticated, redirect to the home page\n navigate(searchParams.get('redirect') || '/');\n }\n }, [identity, isLoading, navigate, searchParams]);\n\n useEffect(() => {\n (async () => {\n if (searchParams.has('login')) {\n if (searchParams.has('error')) {\n if (searchParams.get('error') === 'registration.not-allowed') {\n notify('auth.message.user_email_not_found', { type: 'error' });\n } else {\n notify('auth.message.bad_request', { type: 'error', messageArgs: { error: searchParams.get('error') } });\n }\n } else if (searchParams.has('token')) {\n const token = searchParams.get('token');\n const { webId } = jwtDecode(token);\n\n localStorage.setItem('token', token);\n\n let userData;\n ({ data: userData } = await dataProvider.getOne(userResource, { id: webId }));\n\n if (propertiesExist.length > 0) {\n let allPropertiesExist = propertiesExist.every(p => userData[p]);\n while (!allPropertiesExist) {\n console.log('Waiting for all properties to have been created', propertiesExist);\n await delay(500);\n ({ data: userData } = await dataProvider.getOne(userResource, { id: webId }));\n allPropertiesExist = propertiesExist.every(p => userData[p]);\n }\n }\n\n if (!authProvider.checkUser(userData)) {\n localStorage.removeItem('token');\n notify('auth.message.user_not_allowed_to_login', { type: 'error' });\n navigate.replace('/login');\n } else if (searchParams.has('redirect')) {\n notify('auth.message.user_connected', { type: 'info' });\n window.location.href = searchParams.get('redirect');\n } else if (searchParams.has('new') && searchParams.get('new') === 'true') {\n notify('auth.message.new_user_created', { type: 'info' });\n window.location.href = `/${userResource}/${encodeURIComponent(webId)}`;\n } else {\n notify('auth.message.user_connected', { type: 'info' });\n window.location.href = '/';\n }\n }\n }\n\n if (searchParams.has('logout')) {\n // Delete token and any other value in local storage\n localStorage.clear();\n notify('auth.message.user_disconnected', { type: 'info' });\n navigate('/');\n }\n })();\n }, [searchParams, navigate, notify, userResource]);\n\n const updateBackgroundImage = () => {\n if (!backgroundImageLoaded && containerRef.current) {\n containerRef.current.style.backgroundImage = `url(${backgroundImage})`;\n backgroundImageLoaded = true;\n }\n };\n\n // Load background image asynchronously to speed up time to interactive\n const lazyLoadBackgroundImage = () => {\n if (backgroundImage) {\n const img = new Image();\n img.onload = updateBackgroundImage;\n img.src = backgroundImage;\n }\n };\n\n useEffect(() => {\n if (!backgroundImageLoaded) {\n lazyLoadBackgroundImage();\n }\n });\n\n if (isLoading) return null;\n\n return (\n \n \n
\n \n \n \n
\n {text && {text}}\n {buttons?.map((button, i) => (\n \n {React.cloneElement(button, {\n fullWidth: true,\n variant: 'outlined',\n type: 'submit',\n onClick: () => login({}, '/login')\n })}\n \n ))}\n
\n
\n );\n};\n\nconst PREFIX = 'SsoLoginPage';\n\nexport const SsoLoginPageClasses = {\n card: `${PREFIX}-card`,\n avatar: `${PREFIX}-avatar`,\n icon: `${PREFIX}-icon`,\n switch: `${PREFIX}-switch`\n};\n\nconst Root = styled('div', {\n name: PREFIX,\n overridesResolver: (props, styles) => styles.root\n})(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n minHeight: '100vh',\n height: '1px',\n alignItems: 'center',\n justifyContent: 'flex-start',\n backgroundRepeat: 'no-repeat',\n backgroundSize: 'cover',\n backgroundImage: 'radial-gradient(circle at 50% 14em, #313264 0%, #00023b 60%, #00023b 100%)',\n [`& .${SsoLoginPageClasses.card}`]: {\n minWidth: 300,\n marginTop: '6em'\n },\n [`& .${SsoLoginPageClasses.avatar}`]: {\n margin: '1em',\n display: 'flex',\n justifyContent: 'center'\n },\n [`& .${SsoLoginPageClasses.icon}`]: {\n backgroundColor: theme.palette.secondary[500]\n },\n [`& .${SsoLoginPageClasses.switch}`]: {\n marginBottom: '1em',\n display: 'flex',\n justifyContent: 'center'\n }\n}));\n\nSsoLoginPage.defaultProps = {\n propertiesExist: [],\n // TODO deprecate this\n buttons: [],\n userResource: 'Person'\n};\n\nexport default SsoLoginPage;\n","import { useEffect, useMemo } from 'react';\nimport { Link, useSearchParams } from 'react-router-dom';\nimport { useTranslate, useGetIdentity } from 'react-admin';\nimport { Box, Card, Typography } from '@mui/material';\nimport LockIcon from '@mui/icons-material/Lock';\nimport SignupForm from './SignupForm';\nimport LoginForm from './LoginForm';\nimport NewPasswordForm from './NewPasswordForm';\nimport ResetPasswordForm from './ResetPasswordForm';\nimport SimpleBox from './SimpleBox';\nimport { defaultScorer } from '../../passwordScorer';\nimport getSearchParamsRest from './getSearchParamsRest';\n\n/**\n * @param {object} props Props\n * @param {boolean} props.hasSignup If to show signup form.\n * @param {boolean} props.allowUsername Indicates, if login is allowed with username (instead of email).\n * @param {function} props.onLogin Optional function to call when login is completed\n * @param {function} props.onSignup Optional function to call when signup is completed\n * @param {object} props.additionalSignupValues\n * @param {object} props.passwordScorer Scorer to evaluate and indicate password strength.\n * Set to `null` or `false`, if you don't want password strength checks. Default is\n * passwordStrength's `defaultScorer`.\n * @returns\n */\nconst LocalLoginPage = ({\n hasSignup,\n allowUsername,\n onLogin,\n onSignup,\n additionalSignupValues,\n passwordScorer = defaultScorer\n}) => {\n const translate = useTranslate();\n const [searchParams] = useSearchParams();\n const isSignup = hasSignup && searchParams.has('signup');\n const isResetPassword = searchParams.has('reset_password');\n const isNewPassword = searchParams.has('new_password');\n const isLogin = !isSignup && !isResetPassword && !isNewPassword;\n const redirectTo = searchParams.get('redirect') || '/';\n const { data: identity, isLoading } = useGetIdentity();\n\n useEffect(() => {\n (async () => {\n if (!isLoading && identity?.id) {\n if (onLogin) {\n onLogin(redirectTo);\n } else {\n window.location.href = redirectTo;\n }\n }\n })();\n }, [identity, isLoading, redirectTo, onLogin]);\n\n const [title, text] = useMemo(() => {\n if (isSignup) {\n return ['auth.action.signup', 'auth.helper.signup'];\n }\n if (isLogin) {\n return ['auth.action.login', 'auth.helper.login'];\n }\n if (isResetPassword) {\n return ['auth.action.reset_password', 'auth.helper.reset_password'];\n }\n if (isNewPassword) {\n return ['auth.action.set_new_password', 'auth.helper.set_new_password'];\n }\n }, [isSignup, isLogin, isResetPassword, isNewPassword]);\n\n if (isLoading || identity?.id) return null;\n\n return (\n }>\n \n {isLogin && }\n {isSignup && (\n \n )}\n {isResetPassword && }\n {isNewPassword && }\n \n {(isSignup || isResetPassword) && (\n \n {translate('auth.action.login')}\n \n )}\n {isLogin && (\n <>\n {hasSignup && (\n
\n \n {translate('auth.action.signup')}\n \n
\n )}\n
\n \n {translate('auth.action.reset_password')}\n \n
\n \n )}\n
\n
\n
\n );\n};\n\nLocalLoginPage.defaultProps = {\n hasSignup: true,\n allowUsername: false,\n additionalSignupValues: {}\n};\n\nexport default LocalLoginPage;\n","import React from 'react';\nimport { useForm, FormProvider } from 'react-hook-form';\nimport createSlug from 'speakingurl';\nimport { useTranslate, useNotify, useSafeSetState, useLocaleState } from 'react-admin';\nimport { useSearchParams } from 'react-router-dom';\nimport { Button, CardContent, TextField, Typography } from '@mui/material';\nimport useSignup from '../../hooks/useSignup';\nimport validatePasswordStrength from './validatePasswordStrength';\nimport PasswordStrengthIndicator from './PasswordStrengthIndicator';\nimport { defaultScorer } from '../../passwordScorer';\n\n/**\n * @param {function} props.onSignup Optional function to call when signup is completed\n * @param {object} props.additionalSignupValues\n * @param {number} delayBeforeRedirect\n * @param {object} passwordScorer Scorer to evaluate and indicate password strength.\n * Set to `null` or `false`, if you don't want password strength checks. Default is\n * passwordStrength's `defaultScorer`.\n * @returns\n */\nconst SignupForm = ({ passwordScorer = defaultScorer, onSignup, additionalSignupValues, delayBeforeRedirect = 0 }) => {\n const [loading, setLoading] = useSafeSetState(false);\n const signup = useSignup();\n const translate = useTranslate();\n const notify = useNotify();\n const [searchParams] = useSearchParams();\n const redirectTo = searchParams.get('redirect') || '/';\n const [locale] = useLocaleState();\n\n const methods = useForm({\n defaultValues: {\n username: '',\n email: searchParams.get('email') || '',\n password: ''\n }\n });\n\n const {\n handleSubmit,\n register,\n formState: { errors, isSubmitting },\n watch,\n reset\n } = methods;\n\n const password = watch('password');\n\n const onSubmit = async values => {\n try {\n setLoading(true);\n await signup({\n ...values,\n ...additionalSignupValues\n });\n setTimeout(() => {\n if (onSignup) {\n onSignup(redirectTo);\n } else {\n window.location.href = redirectTo;\n }\n }, delayBeforeRedirect);\n } catch (error) {\n setLoading(false);\n // Reset form to current values to ensure consistency...\n reset(values, { keepValues: true });\n notify(\n typeof error === 'string'\n ? error\n : typeof error === 'undefined' || !error.message\n ? 'ra.auth.sign_in_error'\n : error.message,\n {\n type: 'warning',\n _: typeof error === 'string' ? error : error && error.message ? error.message : undefined\n }\n );\n }\n };\n\n const formatUsername = value => {\n return value\n ? createSlug(value, {\n lang: locale || 'fr',\n separator: '_',\n custom: ['.', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']\n })\n : '';\n };\n\n return (\n \n
\n \n \n\n \n\n {passwordScorer && password && !(searchParams.has('email') && searchParams.has('force-email')) && (\n <>\n \n {translate('auth.input.password_strength')}:{' '}\n \n \n \n )}\n\n validatePasswordStrength(passwordScorer)(value)\n })}\n type=\"password\"\n value={password}\n label={translate('ra.auth.password')}\n error={!!errors.password}\n helperText={translate(errors.password?.message)}\n autoComplete=\"new-password\"\n fullWidth\n disabled={loading || (searchParams.has('email') && searchParams.has('force-email'))}\n />\n\n \n {translate('auth.action.signup')}\n \n \n
\n
\n );\n};\n\nexport default SignupForm;\n","import { useCallback } from 'react';\nimport { useAuthProvider } from 'react-admin';\n\nconst useSignup = () => {\n const authProvider = useAuthProvider();\n\n return useCallback((params = {}) => authProvider.signup(params), [authProvider]);\n};\n\nexport default useSignup;\n","import { defaultScorer } from '../../passwordScorer';\n\nconst validatePasswordStrength = (scorer = defaultScorer) => value => {\n if (!scorer) return undefined;\n const strength = scorer.scoreFn(value);\n if (strength < scorer.minRequiredScore) {\n return 'auth.input.password_too_weak';\n }\n return undefined;\n};\n\nexport default validatePasswordStrength;\n","// Inspired by https://github.com/bartlomiejzuber/password-strength-score\n\n/**\n * @typedef PasswordStrengthOptions\n * @property {number} isVeryLongLength - Required characters for a very long password (default: 12)\n * @property {number} isLongLength - Required characters for a long password (default: 6)\n * @property {number} isVeryLongScore - Score for a very long password (default: 2.5)\n * @property {number} isLongScore - Score for a long password (default: 1.5)\n * @property {number} uppercaseScore - Score for a password with uppercase letters (default: 1)\n * @property {number} lowercaseScore - Score for a password with lowercase letters (default: 1)\n * @property {number} numbersScore - Score for a password with numbers (default: 1)\n * @property {number} nonAlphanumericsScore - Score for a password without non-alphanumeric characters (default: 1)\n */\n\n/** @type {PasswordStrengthOptions} */\nexport const defaultOptions = {\n isVeryLongLength: 14,\n isLongLength: 8,\n isLongScore: 2,\n isVeryLongScore: 4,\n uppercaseScore: 1,\n lowercaseScore: 1,\n numbersScore: 1,\n nonAlphanumericsScore: 1\n};\n\n/**\n *\n * @param {string} password Password text.\n * @param {PasswordStrengthOptions} options Password options.\n * @returns {number} The password strength score.\n */\nexport const passwordStrength = (password, options) => {\n if (!password) {\n return 0;\n }\n\n const mergedOptions = { ...defaultOptions, ...options };\n\n const longScore = (password.length >= mergedOptions.isLongLength && mergedOptions.isLongScore) || 0;\n const veryLongScore = (password.length >= mergedOptions.isVeryLongLength && mergedOptions.isVeryLongScore) || 0;\n const lowercaseScore = (/[a-z]/.test(password) && mergedOptions.lowercaseScore) || 0;\n const uppercaseScore = (/[A-Z]/.test(password) && mergedOptions.uppercaseScore) || 0;\n const numbersScore = (/\\d/.test(password) && mergedOptions.numbersScore) || 0;\n const nonalphasScore = (/\\W/.test(password) && mergedOptions.nonAlphanumericsScore) || 0;\n\n return uppercaseScore + lowercaseScore + numbersScore + nonalphasScore + longScore + veryLongScore;\n};\n\nexport const createPasswordScorer = (options = defaultOptions, minRequiredScore = 5) => {\n const mergedOptions = { ...defaultOptions, ...options };\n\n return {\n scoreFn: password => passwordStrength(password, mergedOptions),\n minRequiredScore,\n maxScore:\n mergedOptions.uppercaseScore +\n mergedOptions.lowercaseScore +\n mergedOptions.numbersScore +\n mergedOptions.nonAlphanumericsScore +\n mergedOptions.isLongScore +\n mergedOptions.isVeryLongScore\n };\n};\n\nexport const defaultScorer = createPasswordScorer(defaultOptions, 5);\n","import React from 'react';\nimport ColorGradientProgressBar from './ColorGradientProgressBar';\nimport { defaultScorer } from '../../passwordScorer';\n\nexport default function PasswordStrengthIndicator({ scorer = defaultScorer, password, ...restProps }) {\n const strength = scorer.scoreFn(password);\n return ;\n}\n","import React from 'react';\nimport { LinearProgress } from '@mui/material';\nimport { withStyles } from '@mui/styles';\n\n/**\n * @typedef {object} Color\n * @property {number} red\n * @property {number} green\n * @property {number} blue\n */\n\n/**\n * Calculate a rgb-color from a gradient between `color1` and `color2`\n * @param {number} fade - Indicates the fade between `color1` and `color2` in the range [0, 1].\n * @param {Color} color1\n * @param {Color} color2\n * @returns {string} `` `rgb(${red}, ${green}, ${blue})` ``\n */\nconst colorGradient = (fade, color1, color2) => {\n const diffRed = color2.red - color1.red;\n const diffGreen = color2.green - color1.green;\n const diffBlue = color2.blue - color1.blue;\n\n const gradient = {\n red: Math.floor(color1.red + diffRed * fade),\n green: Math.floor(color1.green + diffGreen * fade),\n blue: Math.floor(color1.blue + diffBlue * fade)\n };\n\n return `rgb(${gradient.red},${gradient.green},${gradient.blue})`;\n};\n\n/**\n * A progress bar that changes its color between its min an max value.\n * @param {object} props\n * @param {Color} [props.badColor] - default: `#FF4047`\n * @param {Color} [props.goodColor] - default: `#00FF6E`\n * @param {number} props.maxVal\n * @param {number} props.minVal\n * @param {number} props.currentVal\n */\nexport default function ColorGradientProgressBar(props) {\n const { minVal, maxVal, currentVal, badColor, goodColor, ...restProps } = props;\n\n const color1 = badColor || { red: 0xff, green: 0x40, blue: 0x47 };\n const color2 = goodColor || { red: 0x00, green: 0xff, blue: 0x6e };\n\n const fade = Math.max(0, Math.min(1, (currentVal - minVal) / (maxVal - minVal)));\n const currentColor = colorGradient(fade, color1, color2);\n\n const StyledLinearProgress = withStyles({\n colorPrimary: {\n backgroundColor: 'black' // '#e0e0e0'\n },\n barColorPrimary: {\n backgroundColor: currentColor\n }\n })(LinearProgress);\n\n return ;\n}\n","import { useForm, FormProvider } from 'react-hook-form';\nimport { useTranslate, useNotify, useSafeSetState, useLogin, email } from 'react-admin';\nimport { useSearchParams } from 'react-router-dom';\nimport { Button, CardContent, TextField } from '@mui/material';\n\nconst LoginForm = ({ onLogin, allowUsername }) => {\n const [loading, setLoading] = useSafeSetState(false);\n const login = useLogin();\n const translate = useTranslate();\n const notify = useNotify();\n const [searchParams] = useSearchParams();\n const redirectTo = searchParams.get('redirect') || '/';\n\n const methods = useForm({\n defaultValues: {\n username: searchParams.get('email') || '',\n password: ''\n }\n });\n\n const {\n handleSubmit,\n register,\n formState: { errors, isSubmitting },\n reset\n } = methods;\n\n const onSubmit = async values => {\n try {\n setLoading(true);\n await login(values);\n if (onLogin) {\n onLogin(redirectTo);\n } else {\n window.location.href = redirectTo;\n }\n } catch (error) {\n setLoading(false);\n // Reset form to current values to ensure consistency\n reset(values, { keepValues: true });\n notify(\n typeof error === 'string'\n ? error\n : typeof error === 'undefined' || !error.message\n ? 'ra.auth.sign_in_error'\n : error.message,\n {\n type: 'warning',\n messageArgs: {\n _: typeof error === 'string' ? error : error && error.message ? error.message : undefined\n }\n }\n );\n }\n };\n\n return (\n \n
\n \n {\n if (!allowUsername) {\n const validationRes = email()(value);\n return validationRes.message ?? validationRes ?? true;\n }\n return true;\n },\n setValueAs: value => value.toLowerCase()\n })}\n label={translate(allowUsername ? 'auth.input.username_or_email' : 'auth.input.email')}\n error={!!errors.username}\n helperText={translate(errors.username?.message)}\n autoComplete=\"email\"\n fullWidth\n disabled={loading || (searchParams.has('email') && searchParams.has('force-email'))}\n margin=\"normal\"\n />\n\n \n\n \n {translate('auth.action.login')}\n \n \n
\n
\n );\n};\n\nLoginForm.defaultValues = {\n allowUsername: false\n};\n\nexport default LoginForm;\n","import React, { useState } from 'react';\nimport { Form, useTranslate, useNotify, useSafeSetState, useAuthProvider, TextInput, required } from 'react-admin';\nimport { useLocation } from 'react-router-dom';\nimport { Button, CardContent, Typography } from '@mui/material';\nimport PasswordStrengthIndicator from './PasswordStrengthIndicator';\nimport validatePasswordStrength from './validatePasswordStrength';\nimport { defaultScorer } from '../../passwordScorer';\n\nconst samePassword = (value, allValues) => {\n if (value && value !== allValues.password) {\n return 'Mot de passe différent du premier';\n }\n};\n\n/**\n *\n * @param {string} redirectTo\n * @param {Object} passwordScorer Scorer to evaluate and indicate password strength.\n * Set to `null` or `false`, if you don't want password strength checks. Default is\n * passwordStrength's `defaultScorer`.\n * @returns\n */\nconst NewPasswordForm = ({ redirectTo, passwordScorer = defaultScorer }) => {\n const location = useLocation();\n const searchParams = new URLSearchParams(location.search);\n const token = searchParams.get('token');\n\n const [loading, setLoading] = useSafeSetState(false);\n const authProvider = useAuthProvider();\n\n const translate = useTranslate();\n const notify = useNotify();\n\n const [newPassword, setNewPassword] = useState('');\n\n const submit = values => {\n setLoading(true);\n authProvider\n .setNewPassword({ ...values, token })\n .then(() => {\n setTimeout(() => {\n const url = new URL('/login', window.location.origin);\n if (redirectTo) url.searchParams.append('redirect', redirectTo);\n url.searchParams.append('email', values.email);\n window.location.href = url.toString();\n setLoading(false);\n }, 2000);\n notify('auth.notification.password_changed', { type: 'info' });\n })\n .catch(error => {\n setLoading(false);\n notify(\n typeof error === 'string'\n ? error\n : typeof error === 'undefined' || !error.message\n ? 'auth.notification.reset_password_error'\n : error.message,\n {\n type: 'warning',\n messageArgs: {\n _: typeof error === 'string' ? error : error && error.message ? error.message : undefined\n }\n }\n );\n });\n };\n\n return (\n
\n \n (value ? value.toLowerCase() : '')}\n />\n {passwordScorer && (\n <>\n \n {translate('auth.input.password_strength')}:{' '}\n \n\n \n \n )}\n setNewPassword(e.target.value)}\n />\n \n \n \n
\n );\n};\n\nexport default NewPasswordForm;\n","import React from 'react';\nimport { Form, TextInput, required, useTranslate, useNotify, useSafeSetState, useAuthProvider } from 'react-admin';\nimport { Button, CardContent } from '@mui/material';\n\nconst ResetPasswordForm = () => {\n const [loading, setLoading] = useSafeSetState(false);\n const authProvider = useAuthProvider();\n const translate = useTranslate();\n const notify = useNotify();\n\n const submit = values => {\n setLoading(true);\n authProvider\n .resetPassword({ ...values })\n .then(res => {\n setLoading(false);\n notify('auth.notification.reset_password_submitted', { type: 'info' });\n })\n .catch(error => {\n setLoading(false);\n notify(\n typeof error === 'string'\n ? error\n : typeof error === 'undefined' || !error.message\n ? 'auth.notification.reset_password_error'\n : error.message,\n {\n type: 'warning',\n messageArgs: {\n _: typeof error === 'string' ? error : error && error.message ? error.message : undefined\n }\n }\n );\n });\n };\n\n return (\n
\n \n (value ? value.toLowerCase() : '')}\n />\n \n \n
\n );\n};\n\nexport default ResetPasswordForm;\n","import React from 'react';\nimport { Box, Card, Typography } from '@mui/material';\nimport { Notification } from 'react-admin';\nimport makeStyles from '@mui/styles/makeStyles';\n\nconst useStyles = makeStyles(theme => ({\n '@global': {\n body: {\n backgroundColor: theme.palette.secondary.main\n }\n },\n root: {\n backgroundColor: theme.palette.secondary.main,\n [theme.breakpoints.down('sm')]: {\n padding: '1em'\n }\n },\n card: {\n width: '100%',\n maxWidth: 450,\n marginTop: '6em'\n },\n icon: {\n marginTop: 5,\n marginRight: 5\n },\n title: {\n [theme.breakpoints.down('sm')]: {\n fontWeight: 'bold',\n marginTop: 12\n }\n }\n}));\n\nconst SimpleBox = ({ title, icon, text, children }) => {\n const classes = useStyles();\n return (\n \n \n \n {icon && React.cloneElement(icon, { fontSize: 'large', className: classes.icon })}\n \n {title}\n \n \n \n {text}\n \n {children}\n \n \n \n );\n};\n\nexport default SimpleBox;\n","const USED_SEARCH_PARAMS = ['signup', 'reset_password', 'new_password', 'email', 'force-email'];\n\nconst getSearchParamsRest = searchParams => {\n const rest = [];\n for (const [key, value] of searchParams.entries()) {\n if (!USED_SEARCH_PARAMS.includes(key)) {\n rest.push(`${key}=${encodeURIComponent(value)}`);\n }\n }\n return rest.length > 0 ? rest.join('&') : '';\n};\n\nexport default getSearchParamsRest;\n","import React from 'react';\nimport { Resource, usePermissions } from 'react-admin';\nimport { useCreateContainer } from '@semapps/semantic-data-provider';\nimport { rightsToCreate } from '../constants';\n\n// Not used for now. The ListWithPermissions component will handle the conditional display of the Create button.\nconst ResourceWithPermission = ({ name, create, ...rest }) => {\n const createContainer = useCreateContainer(name);\n const { permissions } = usePermissions(createContainer);\n return (\n rightsToCreate.includes(p['acl:mode'])) ? create : undefined}\n // Requesting permissions to list container is too long, we will avoid that for now\n // list={permissions && permissions.some(p => rightsToList.includes(p['acl:mode'])) ? list : undefined}\n />\n );\n};\n\nexport default ResourceWithPermission;\n","import React, { forwardRef, useCallback } from 'react';\nimport { Logout, UserMenu as RaUserMenu, useGetIdentity, useTranslate, useUserMenu } from 'react-admin';\nimport { MenuItem, ListItemIcon, ListItemText } from '@mui/material';\nimport AccountCircleIcon from '@mui/icons-material/AccountCircle';\nimport EditIcon from '@mui/icons-material/Edit';\nimport { useNavigate } from 'react-router-dom';\n\n// It's important to pass the ref to allow Material UI to manage the keyboard navigation\nconst UserMenuItem = forwardRef(({ label, icon, to, ...rest }, ref) => {\n const { onClose } = useUserMenu();\n const translate = useTranslate();\n const navigate = useNavigate();\n const onClick = useCallback(() => {\n navigate(to);\n onClose();\n }, [to, onClose, navigate]);\n return (\n \n {icon && {React.cloneElement(icon, { fontSize: 'small' })}}\n {translate(label)}\n \n );\n});\n\nconst UserMenu = ({ logout, profileResource, ...otherProps }) => {\n const { data: identity } = useGetIdentity();\n return (\n \n {identity && identity.id !== ''\n ? [\n }\n to={`/${profileResource}/${encodeURIComponent(identity?.profileData?.id || identity.id)}/show`}\n />,\n }\n to={`/${profileResource}/${encodeURIComponent(identity?.profileData?.id || identity.id)}`}\n />,\n React.cloneElement(logout, { key: 'logout' })\n ]\n : [\n ,\n \n ]}\n \n );\n};\n\nUserMenu.defaultProps = {\n logout: ,\n profileResource: 'Person'\n};\n\nexport default UserMenu;\n","import { useEffect } from 'react';\nimport { useGetIdentity, useNotify, useRedirect } from 'react-admin';\nimport { useLocation } from 'react-router-dom';\n\nconst useCheckAuthenticated = message => {\n const { data: identity, isLoading } = useGetIdentity();\n const notify = useNotify();\n const redirect = useRedirect();\n const location = useLocation();\n\n useEffect(() => {\n if (!isLoading && !identity?.id) {\n notify(message || 'ra.auth.auth_check_error', { type: 'error' });\n redirect(`/login?redirect=${encodeURIComponent(location.pathname + location.search)}`);\n }\n }, [isLoading, identity, redirect, notify, location]);\n\n return { identity, isLoading };\n};\n\nexport default useCheckAuthenticated;\n","import { useEffect, useCallback } from 'react';\nimport isEqual from 'lodash/isEqual';\nimport { useGetPermissions, useSafeSetState } from 'react-admin';\n\nconst emptyParams = {};\n\n// keep a cache of already fetched permissions to initialize state for new\n// components and avoid a useless rerender if the permissions haven't changed\nconst alreadyFetchedPermissions = { '{}': undefined };\n\n// Fork of usePermissionsOptimized, with a refetch option\nconst usePermissionsWithRefetch = (params = emptyParams) => {\n const key = JSON.stringify(params);\n const [state, setState] = useSafeSetState({\n permissions: alreadyFetchedPermissions[key]\n });\n const getPermissions = useGetPermissions();\n\n const fetchPermissions = useCallback(\n () =>\n getPermissions(params)\n .then(permissions => {\n if (!isEqual(permissions, state.permissions)) {\n alreadyFetchedPermissions[key] = permissions;\n setState({ permissions });\n }\n })\n .catch(error => {\n setState({\n error\n });\n }),\n [key, params, getPermissions]\n );\n\n useEffect(() => {\n fetchPermissions();\n }, [key]);\n\n return { ...state, refetch: fetchPermissions };\n};\n\nexport default usePermissionsWithRefetch;\n","const englishMessages = {\n auth: {\n dialog: {\n container_permissions: 'Container permissions',\n resource_permissions: 'Resource permissions',\n login_required: 'Login required'\n },\n action: {\n submit: 'Submit',\n permissions: 'Permissions',\n signup: 'Signup',\n reset_password: 'Reset password',\n set_new_password: 'Set new password',\n logout: 'Logout',\n login: 'Login',\n view_my_profile: 'View my profile',\n edit_my_profile: 'Edit my profile'\n },\n right: {\n resource: {\n read: 'Read',\n append: 'Append',\n write: 'Write',\n control: 'Control'\n },\n container: {\n read: 'List',\n append: 'Add',\n write: 'Add',\n control: 'Control'\n }\n },\n agent: {\n anonymous: 'All users',\n authenticated: 'Connected users'\n },\n input: {\n agent_select: 'Add an user...',\n name: 'Surname',\n username: 'User ID',\n email: 'Email address',\n username_or_email: 'User ID or email address',\n current_password: 'Current password',\n new_password: 'New password',\n confirm_new_password: 'Confirm new password',\n password_strength: 'Password strength',\n password_too_weak: 'Password too weak. Increase length or add special characters.'\n },\n helper: {\n login: 'Sign in to your account',\n signup: 'Create your account',\n reset_password: 'Enter your email address below and we will send you a link to reset your password',\n set_new_password: 'Please enter your email address and a new password below'\n },\n message: {\n resource_show_forbidden: 'You are not allowed to view this resource',\n resource_edit_forbidden: 'You are not allowed to edit this resource',\n resource_delete_forbidden: 'You are not allowed to delete this resource',\n resource_control_forbidden: 'You are not allowed to control this resource',\n container_create_forbidden: 'You are not allowed to create new resource',\n container_list_forbidden: 'You are not allowed to list these resources',\n unable_to_fetch_user_data: 'Unable to fetch user data',\n no_token_returned: 'No token returned',\n no_associated_oidc_issuer: 'No OIDC issuer associated with the provided WebID',\n invalid_token_returned: 'Invalid token returned',\n signup_error: 'Account registration failed',\n user_not_allowed_to_login: 'You are not allowed to login with this account',\n user_email_not_found: 'No account found with this email address',\n user_email_exist: 'An account already exist with this email address',\n username_exist: 'An account already exist with this user ID',\n username_invalid: 'This username is invalid. Only lowercase characters, numbers, dots and hyphens are authorized',\n new_user_created: 'Your account has been successfully created',\n user_connected: 'You are now connected',\n user_disconnected: 'You are now disconnected',\n bad_request: 'Bad request (Error message returned by the server: %{error})',\n account_settings_updated: 'Your account settings have been successfully updated',\n login_to_continue: 'Please login to continue',\n choose_pod_provider:\n 'Please choose a Pod provider in the list below. All application data will be saved on your Pod.',\n unreachable_auth_server: 'The authentication server cannot be reached'\n },\n notification: {\n reset_password_submitted: 'An email has been sent with reset password instructions',\n reset_password_error: 'An error occurred',\n password_changed: 'Password changed successfully',\n new_password_error: 'An error occurred',\n invalid_password: 'Invalid password',\n get_settings_error: 'An error occurred',\n update_settings_error: 'An error occurred'\n }\n }\n};\n\nexport default englishMessages;\n","const frenchMessages = {\n auth: {\n dialog: {\n container_permissions: 'Permissions sur le container',\n resource_permissions: 'Permissions sur la ressource',\n login_required: 'Connexion requise'\n },\n action: {\n submit: 'Soumettre',\n permissions: 'Permissions',\n signup: \"S'inscrire\",\n reset_password: 'Mot de passe oublié ?',\n set_new_password: 'Définir le mot de passe',\n logout: 'Se déconnecter',\n login: 'Se connecter',\n view_my_profile: 'Voir mon profil',\n edit_my_profile: 'Éditer mon profil'\n },\n right: {\n resource: {\n read: 'Lire',\n append: 'Enrichir',\n write: 'Modifier',\n control: 'Administrer'\n },\n container: {\n read: 'Lister',\n append: 'Ajouter',\n write: 'Ajouter',\n control: 'Administrer'\n }\n },\n agent: {\n anonymous: 'Tous les utilisateurs',\n authenticated: 'Utilisateurs connectés'\n },\n input: {\n agent_select: 'Ajouter un utilisateur...',\n name: 'Prénom',\n username: 'Identifiant unique',\n email: 'Adresse e-mail',\n username_or_email: 'Identifiant ou adresse e-mail',\n current_password: 'Mot de passe actuel',\n new_password: 'Nouveau mot de passe',\n confirm_new_password: 'Confirmer le nouveau mot de passe',\n password_strength: 'Force du mot de passe',\n password_too_weak: 'Mot de passe trop faible. Augmenter la longueur ou ajouter des caractères spéciaux.'\n },\n helper: {\n login: 'Connectez-vous à votre compte.',\n signup: 'Créez votre compte',\n reset_password:\n 'Entrez votre adresse mail ci-dessous et nous vous enverrons un lien pour réinitialiser votre mot de passe',\n set_new_password: 'Veuillez entrer votre adresse mail et un nouveau mot de passe ci-dessous'\n },\n message: {\n resource_show_forbidden: \"Vous n'avez pas la permission de voir cette ressource\",\n resource_edit_forbidden: \"Vous n'avez pas la permission d'éditer cette ressource\",\n resource_delete_forbidden: \"Vous n'avez pas la permission d'effacer cette ressource\",\n resource_control_forbidden: \"Vous n'avez pas la permission d'administrer cette ressource\",\n container_create_forbidden: \"Vous n'avez pas la permission de créer des ressources\",\n container_list_forbidden: \"Vous n'avez pas la permission de voir ces ressources\",\n unable_to_fetch_user_data: 'Impossible de récupérer les données du profil',\n no_token_returned: 'Aucun token a été retourné',\n no_associated_oidc_issuer: 'Aucun serveur de connexion associé avec le WebID fourni',\n invalid_token_returned: 'Token invalide',\n signup_error: \"L'inscription a échoué\",\n user_not_allowed_to_login: \"Vous n'avez pas le droit de vous connecter avec ce compte\",\n user_email_not_found: 'Aucun compte trouvé avec cette adresse mail',\n user_email_exist: 'Un compte existe déjà avec cette adresse mail',\n username_exist: 'Un compte existe déjà avec cet identifiant',\n username_invalid:\n \"Cet identifiant n'est pas valide. Seuls les lettres minuscules, les chiffres, les points et les tirets sont autorisés\",\n new_user_created: 'Votre compte a été créé avec succès',\n user_connected: 'Vous êtes maintenant connecté',\n user_disconnected: 'Vous êtes maintenant déconnecté',\n bad_request: \"Requête erronée (Message d'erreur renvoyé par le serveur: %{error})\",\n account_settings_updated: 'Les paramètres de votre compte ont été mis à jour avec succès',\n login_to_continue: 'Veuillez vous connecter pour continuer',\n choose_pod_provider:\n \"Veuillez choisir un fournisseur de Pods dans la liste ci-dessous. Toutes les données de l'application seront enregistrées sur votre Pod.\",\n unreachable_auth_server: 'Le serveur de connexion ne peut être atteint'\n },\n notification: {\n reset_password_submitted: 'Un e-mail a été envoyé avec les instructions de réinitialisation du mot de passe',\n reset_password_error: \"Une erreur s'est produite\",\n password_changed: 'Le mot de passe a été changé avec succès',\n new_password_error: \"Une erreur s'est produite\",\n invalid_password: 'Mot de passe incorrect',\n get_settings_error: \"Une erreur s'est produite\",\n update_settings_error: \"Une erreur s'est produite\"\n }\n }\n};\n\nexport default frenchMessages;\n"],"names":[],"version":3,"file":"index.cjs.js.map"} \ No newline at end of file diff --git a/src/frontend/packages/auth-provider/dist/index.d.ts b/src/frontend/packages/auth-provider/dist/index.d.ts index 72382e6d5..cf4e79c90 100644 --- a/src/frontend/packages/auth-provider/dist/index.d.ts +++ b/src/frontend/packages/auth-provider/dist/index.d.ts @@ -89,8 +89,8 @@ declare namespace CreateWithPermissions { let actions: import('react/jsx-runtime').JSX.Element; } } -export function useAgents(uri: any): { - agents: {}; +export const useAgents: (uri: any) => { + agents: Record; addPermission: (agentId: any, predicate: any, mode: any) => void; removePermission: (agentId: any, predicate: any, mode: any) => void; }; @@ -279,12 +279,6 @@ export function PasswordStrengthIndicator({ | undefined; password: any; }): import('react/jsx-runtime').JSX.Element; -declare namespace SignupForm { - namespace defaultValues { - let redirectTo: string; - let additionalSignupValues: {}; - } -} declare namespace LoginForm { namespace defaultValues { let allowUsername: boolean; diff --git a/src/frontend/packages/auth-provider/dist/index.d.ts.map b/src/frontend/packages/auth-provider/dist/index.d.ts.map index a90d58d85..cd3c75fe8 100644 --- a/src/frontend/packages/auth-provider/dist/index.d.ts.map +++ b/src/frontend/packages/auth-provider/dist/index.d.ts.map @@ -1 +1 @@ -{"mappings":";;ACUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4cC;ACtdD,eAAsB,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,aAAa,CAAC;AAE9E,8DAA8D;AAC9D,gBAAuB,YAAY,GAAG,wBAAwB,CAAC;AAE/D,sBAAsB;IACpB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;CACrB,GAAG,CACA;IACE,2BAA2B;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GACD;IACE,0BAA0B;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB,CACJ,CAAC;AAEF,sBAAsB,cAAc,GAAG;IACrC,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,uBAAuB,cAAc,GAAG;IACtC,6BAA6B;IAC7B,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,uBAAuB,cAAc,GAAG;IACtC,gBAAgB,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAAC;CACzC,CAAC;AAEF,kBAAkB,cAAc,GAAG,eAAe,GAAG,eAAe,CAAC;AAErE,mBAA0B,UAAU,EAAE,CAAC;AChBvC,QAAO,MAAM;;;;;;;CAOZ,CAAC;ACvBF,OAAA,MAAM,2BAA4B,MAAM,QAAQ,MAAM,aAAa,gBAAe,MAAM,4BAavF,CAAC;ACbF,2FAKC;;;;;;AKLD;;;;EA4FC;AE3FD;;4CAcC;;;;;;ACLD,OAAA,MAAM,yEAkBL,CAAC;AC7BF,wGAOC;ACAD,OAAA,MAAM,4BAA4B,MAAM,iBAAiB,CAAC,YAAY,CAKrE,CAAC;ACVF,yFAYC;;;;;;ACdD,sGAOC;ACID;;;;;;;;;;;4CA2CC;ACtDD,yFAAwD;;;;;;ACWxD,OAAA,MAAM,yEAkBL,CAAC;AC5BF,yFAIC;;;;;;ACLD;;;;;;;4CAqBC;;;;;;;;;;;;;;ACdD;;;;;;;;mDAuHC;;;;;;;;AC/HD,kDAIC;ACLD;;;;;;;;;;GAUG;AAEH,sCAAsC;AACtC,2CADW,uBAAuB,CAUhC;AAyBK;;;;EAcN;;IAVY,+CAAqD;;;;;;;;sBAjDpD,MAAM;;;;kBACN,MAAM;;;;qBACN,MAAM;;;;iBACN,MAAM;;;;oBACN,MAAM;;;;oBACN,MAAM;;;;kBACN,MAAM;;;;2BACN,MAAM;;ACTpB;;;;+DAOC;AELD;;;;;;;;4CAGC;;;;;;;;;;;;AOgBD;;;;;;;;;;;GAWG;AACH;IAV0B,SAAS,EAAxB,OAAO;IACQ,aAAa,EAA5B,OAAO;IACS,OAAO;IACP,QAAQ;IACV,sBAAsB,EAApC,MAAM;IACQ,cAAc,EAA5B,MAAM;mDA4FhB;;;;;;;;ACpHD;;;;4CAYC;ACWD;;;;4CA0BC;;;;;;;ACnDD;;;EAcC;ACPD;;;EA6BC","sources":["packages/auth-provider/src/src/utils.js","packages/auth-provider/src/src/authProvider.js","packages/auth-provider/src/src/types.ts","packages/auth-provider/src/src/constants.ts","packages/auth-provider/src/src/hooks/useCheckPermissions.ts","packages/auth-provider/src/src/crud/create/CreateWithPermissions.js","packages/auth-provider/src/src/components/PermissionsButton/AddPermissionsForm.js","packages/auth-provider/src/src/components/PermissionsButton/AgentIcon.js","packages/auth-provider/src/src/components/PermissionsButton/AgentItem.js","packages/auth-provider/src/src/components/PermissionsButton/EditPermissionsForm.js","packages/auth-provider/src/src/hooks/useAgents.js","packages/auth-provider/src/src/components/PermissionsButton/PermissionsDialog.js","packages/auth-provider/src/src/components/PermissionsButton/PermissionsButton.js","packages/auth-provider/src/src/crud/edit/EditActionsWithPermissions.tsx","packages/auth-provider/src/src/crud/edit/DeleteButtonWithPermissions.js","packages/auth-provider/src/src/crud/edit/EditToolbarWithPermissions.tsx","packages/auth-provider/src/src/crud/edit/EditWithPermissions.js","packages/auth-provider/src/src/crud/edit/EditButtonWithPermissions.js","packages/auth-provider/src/src/crud/list/ListActionsWithPermissions.js","packages/auth-provider/src/src/crud/list/ListWithPermissions.js","packages/auth-provider/src/src/crud/show/ShowActionsWithPermissions.tsx","packages/auth-provider/src/src/crud/show/ShowWithPermissions.js","packages/auth-provider/src/src/components/AuthDialog.js","packages/auth-provider/src/src/components/SsoLoginPage.js","packages/auth-provider/src/src/hooks/useSignup.js","packages/auth-provider/src/src/passwordScorer.js","packages/auth-provider/src/src/components/LocalLoginPage/validatePasswordStrength.js","packages/auth-provider/src/src/components/LocalLoginPage/ColorGradientProgressBar.js","packages/auth-provider/src/src/components/LocalLoginPage/PasswordStrengthIndicator.js","packages/auth-provider/src/src/components/LocalLoginPage/SignupForm.js","packages/auth-provider/src/src/components/LocalLoginPage/LoginForm.js","packages/auth-provider/src/src/components/LocalLoginPage/NewPasswordForm.js","packages/auth-provider/src/src/components/LocalLoginPage/ResetPasswordForm.js","packages/auth-provider/src/src/components/LocalLoginPage/SimpleBox.js","packages/auth-provider/src/src/components/LocalLoginPage/getSearchParamsRest.js","packages/auth-provider/src/src/components/LocalLoginPage/LocalLoginPage.js","packages/auth-provider/src/src/components/ResourceWithPermissions.js","packages/auth-provider/src/src/components/UserMenu.js","packages/auth-provider/src/src/hooks/useCheckAuthenticated.js","packages/auth-provider/src/src/hooks/usePermissionsWithRefetch.js","packages/auth-provider/src/src/messages/english.js","packages/auth-provider/src/src/messages/french.js","packages/auth-provider/src/src/index.ts","packages/auth-provider/src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"export { default as authProvider } from './authProvider';\n\n// Create\nexport { default as CreateWithPermissions } from './crud/create/CreateWithPermissions';\n\n// Edit\nexport { default as EditWithPermissions } from './crud/edit/EditWithPermissions';\nexport { default as EditActionsWithPermissions } from './crud/edit/EditActionsWithPermissions';\nexport { default as EditToolbarWithPermissions } from './crud/edit/EditToolbarWithPermissions';\nexport { default as EditButtonWithPermissions } from './crud/edit/EditButtonWithPermissions';\nexport { default as DeleteButtonWithPermissions } from './crud/edit/DeleteButtonWithPermissions';\n\n// List\nexport { default as ListWithPermissions } from './crud/list/ListWithPermissions';\nexport { default as ListActionsWithPermissions } from './crud/list/ListActionsWithPermissions';\n\n// Show\nexport { default as ShowWithPermissions } from './crud/show/ShowWithPermissions';\nexport { default as ShowActionsWithPermissions } from './crud/show/ShowActionsWithPermissions';\n\nexport { default as PermissionsButton } from './components/PermissionsButton/PermissionsButton';\nexport { default as AuthDialog } from './components/AuthDialog';\nexport { default as SsoLoginPage, default as LoginPage } from './components/SsoLoginPage';\nexport { default as LocalLoginPage } from './components/LocalLoginPage/LocalLoginPage';\nexport { default as ResourceWithPermissions } from './components/ResourceWithPermissions';\nexport { default as UserMenu } from './components/UserMenu';\n\nexport { default as useAgents } from './hooks/useAgents';\nexport { default as useCheckAuthenticated } from './hooks/useCheckAuthenticated';\nexport { default as useCheckPermissions } from './hooks/useCheckPermissions';\nexport { default as usePermissionsWithRefetch } from './hooks/usePermissionsWithRefetch';\nexport { default as useSignup } from './hooks/useSignup';\n\n// Password scoring\nexport { default as PasswordStrengthIndicator } from './components/LocalLoginPage/PasswordStrengthIndicator';\nexport { default as validatePasswordStrength } from './components/LocalLoginPage/validatePasswordStrength';\nexport {\n defaultScorer as defaultPasswordScorer,\n defaultOptions as defaultPasswordScorerOptions,\n createPasswordScorer\n} from './passwordScorer';\n\nexport { default as englishMessages } from './messages/english';\nexport { default as frenchMessages } from './messages/french';\n"],"names":[],"version":3,"file":"index.d.ts.map"} \ No newline at end of file +{"mappings":";;ACUA;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2cC;ACrdD,eAAsB,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,aAAa,CAAC;AAE9E,8DAA8D;AAC9D,gBAAuB,YAAY,GAAG,wBAAwB,CAAC;AAE/D,sBAAsB;IACpB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,mBAAmB,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;CACrB,GAAG,CACA;IACE,2BAA2B;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GACD;IACE,0BAA0B;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB,CACJ,CAAC;AAEF,sBAAsB,cAAc,GAAG;IACrC,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,uBAAuB,cAAc,GAAG;IACtC,6BAA6B;IAC7B,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,uBAAuB,cAAc,GAAG;IACtC,gBAAgB,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAAC;CACzC,CAAC;AAEF,kBAAkB,cAAc,GAAG,eAAe,GAAG,eAAe,CAAC;AAErE,mBAA0B,UAAU,EAAE,CAAC;AChBvC,QAAO,MAAM;;;;;;;CAOZ,CAAC;ACvBF,OAAA,MAAM,2BAA4B,MAAM,QAAQ,MAAM,aAAa,gBAAe,MAAM,4BAavF,CAAC;ACbF,2FAKC;;;;;;AKJD,OAAA,MAAM;;;;CA6FL,CAAC;AE7FF;;4CAcC;;;;;;ACLD,OAAA,MAAM,yEAkBL,CAAC;AC7BF,wGAOC;ACAD,OAAA,MAAM,4BAA4B,MAAM,iBAAiB,CAAC,YAAY,CAKrE,CAAC;ACVF,yFAYC;;;;;;ACdD,sGAOC;ACID;;;;;;;;;;;4CA2CC;ACtDD,yFAAwD;;;;;;ACWxD,OAAA,MAAM,yEAkBL,CAAC;AC5BF,yFAIC;;;;;;ACLD;;;;;;;4CAqBC;;;;;;;;;;;;;;ACdD;;;;;;;;mDAuHC;;;;;;;;AC/HD,kDAIC;ACLD;;;;;;;;;;GAUG;AAEH,sCAAsC;AACtC,2CADW,uBAAuB,CAUhC;AAyBK;;;;EAcN;;IAVY,+CAAqD;;;;;;;;sBAjDpD,MAAM;;;;kBACN,MAAM;;;;qBACN,MAAM;;;;iBACN,MAAM;;;;oBACN,MAAM;;;;oBACN,MAAM;;;;kBACN,MAAM;;;;2BACN,MAAM;;ACTpB;;;;+DAOC;AELD;;;;;;;;4CAGC;;;;;;AOMD;;;;;;;;;;;GAWG;AACH;IAV0B,SAAS,EAAxB,OAAO;IACQ,aAAa,EAA5B,OAAO;IACS,OAAO;IACP,QAAQ;IACV,sBAAsB,EAApC,MAAM;IACQ,cAAc,EAA5B,MAAM;mDA2FhB;;;;;;;;ACzGD;;;;4CAYC;ACWD;;;;4CA0BC;;;;;;;ACnDD;;;EAcC;ACPD;;;EA6BC","sources":["packages/auth-provider/src/src/utils.js","packages/auth-provider/src/src/authProvider.js","packages/auth-provider/src/src/types.ts","packages/auth-provider/src/src/constants.ts","packages/auth-provider/src/src/hooks/useCheckPermissions.ts","packages/auth-provider/src/src/crud/create/CreateWithPermissions.js","packages/auth-provider/src/src/components/PermissionsButton/AddPermissionsForm.js","packages/auth-provider/src/src/components/PermissionsButton/AgentIcon.js","packages/auth-provider/src/src/components/PermissionsButton/AgentItem.js","packages/auth-provider/src/src/components/PermissionsButton/EditPermissionsForm.js","packages/auth-provider/src/src/hooks/useAgents.ts","packages/auth-provider/src/src/components/PermissionsButton/PermissionsDialog.js","packages/auth-provider/src/src/components/PermissionsButton/PermissionsButton.js","packages/auth-provider/src/src/crud/edit/EditActionsWithPermissions.tsx","packages/auth-provider/src/src/crud/edit/DeleteButtonWithPermissions.js","packages/auth-provider/src/src/crud/edit/EditToolbarWithPermissions.tsx","packages/auth-provider/src/src/crud/edit/EditWithPermissions.js","packages/auth-provider/src/src/crud/edit/EditButtonWithPermissions.js","packages/auth-provider/src/src/crud/list/ListActionsWithPermissions.js","packages/auth-provider/src/src/crud/list/ListWithPermissions.js","packages/auth-provider/src/src/crud/show/ShowActionsWithPermissions.tsx","packages/auth-provider/src/src/crud/show/ShowWithPermissions.js","packages/auth-provider/src/src/components/AuthDialog.js","packages/auth-provider/src/src/components/SsoLoginPage.js","packages/auth-provider/src/src/hooks/useSignup.js","packages/auth-provider/src/src/passwordScorer.js","packages/auth-provider/src/src/components/LocalLoginPage/validatePasswordStrength.js","packages/auth-provider/src/src/components/LocalLoginPage/ColorGradientProgressBar.js","packages/auth-provider/src/src/components/LocalLoginPage/PasswordStrengthIndicator.js","packages/auth-provider/src/src/components/LocalLoginPage/SignupForm.js","packages/auth-provider/src/src/components/LocalLoginPage/LoginForm.js","packages/auth-provider/src/src/components/LocalLoginPage/NewPasswordForm.js","packages/auth-provider/src/src/components/LocalLoginPage/ResetPasswordForm.js","packages/auth-provider/src/src/components/LocalLoginPage/SimpleBox.js","packages/auth-provider/src/src/components/LocalLoginPage/getSearchParamsRest.js","packages/auth-provider/src/src/components/LocalLoginPage/LocalLoginPage.js","packages/auth-provider/src/src/components/ResourceWithPermissions.js","packages/auth-provider/src/src/components/UserMenu.js","packages/auth-provider/src/src/hooks/useCheckAuthenticated.js","packages/auth-provider/src/src/hooks/usePermissionsWithRefetch.js","packages/auth-provider/src/src/messages/english.js","packages/auth-provider/src/src/messages/french.js","packages/auth-provider/src/src/index.ts","packages/auth-provider/src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"export { default as authProvider } from './authProvider';\n\n// Create\nexport { default as CreateWithPermissions } from './crud/create/CreateWithPermissions';\n\n// Edit\nexport { default as EditWithPermissions } from './crud/edit/EditWithPermissions';\nexport { default as EditActionsWithPermissions } from './crud/edit/EditActionsWithPermissions';\nexport { default as EditToolbarWithPermissions } from './crud/edit/EditToolbarWithPermissions';\nexport { default as EditButtonWithPermissions } from './crud/edit/EditButtonWithPermissions';\nexport { default as DeleteButtonWithPermissions } from './crud/edit/DeleteButtonWithPermissions';\n\n// List\nexport { default as ListWithPermissions } from './crud/list/ListWithPermissions';\nexport { default as ListActionsWithPermissions } from './crud/list/ListActionsWithPermissions';\n\n// Show\nexport { default as ShowWithPermissions } from './crud/show/ShowWithPermissions';\nexport { default as ShowActionsWithPermissions } from './crud/show/ShowActionsWithPermissions';\n\nexport { default as PermissionsButton } from './components/PermissionsButton/PermissionsButton';\nexport { default as AuthDialog } from './components/AuthDialog';\nexport { default as SsoLoginPage, default as LoginPage } from './components/SsoLoginPage';\nexport { default as LocalLoginPage } from './components/LocalLoginPage/LocalLoginPage';\nexport { default as ResourceWithPermissions } from './components/ResourceWithPermissions';\nexport { default as UserMenu } from './components/UserMenu';\n\nexport { default as useAgents } from './hooks/useAgents';\nexport { default as useCheckAuthenticated } from './hooks/useCheckAuthenticated';\nexport { default as useCheckPermissions } from './hooks/useCheckPermissions';\nexport { default as usePermissionsWithRefetch } from './hooks/usePermissionsWithRefetch';\nexport { default as useSignup } from './hooks/useSignup';\n\n// Password scoring\nexport { default as PasswordStrengthIndicator } from './components/LocalLoginPage/PasswordStrengthIndicator';\nexport { default as validatePasswordStrength } from './components/LocalLoginPage/validatePasswordStrength';\nexport {\n defaultScorer as defaultPasswordScorer,\n defaultOptions as defaultPasswordScorerOptions,\n createPasswordScorer\n} from './passwordScorer';\n\nexport { default as englishMessages } from './messages/english';\nexport { default as frenchMessages } from './messages/french';\n"],"names":[],"version":3,"file":"index.d.ts.map"} \ No newline at end of file diff --git a/src/frontend/packages/auth-provider/dist/index.es.js b/src/frontend/packages/auth-provider/dist/index.es.js index 77a48cfbd..dccf1ddb6 100644 --- a/src/frontend/packages/auth-provider/dist/index.es.js +++ b/src/frontend/packages/auth-provider/dist/index.es.js @@ -3,7 +3,7 @@ import $1obPJ$urljoin from "url-join"; import {discoveryRequest as $1obPJ$discoveryRequest, processDiscoveryResponse as $1obPJ$processDiscoveryResponse, generateRandomCodeVerifier as $1obPJ$generateRandomCodeVerifier, calculatePKCECodeChallenge as $1obPJ$calculatePKCECodeChallenge, validateAuthResponse as $1obPJ$validateAuthResponse, expectNoState as $1obPJ$expectNoState, isOAuth2Error as $1obPJ$isOAuth2Error, authorizationCodeGrantRequest as $1obPJ$authorizationCodeGrantRequest, processAuthorizationCodeOpenIDResponse as $1obPJ$processAuthorizationCodeOpenIDResponse} from "oauth4webapi"; import {jsx as $1obPJ$jsx, jsxs as $1obPJ$jsxs, Fragment as $1obPJ$Fragment} from "react/jsx-runtime"; import $1obPJ$react, {useEffect as $1obPJ$useEffect, useState as $1obPJ$useState, useCallback as $1obPJ$useCallback, useRef as $1obPJ$useRef, useMemo as $1obPJ$useMemo, forwardRef as $1obPJ$forwardRef} from "react"; -import {useResourceContext as $1obPJ$useResourceContext, Create as $1obPJ$Create, CreateActions as $1obPJ$CreateActions, usePermissions as $1obPJ$usePermissions, useNotify as $1obPJ$useNotify, useRedirect as $1obPJ$useRedirect, useGetRecordId as $1obPJ$useGetRecordId, Edit as $1obPJ$Edit, useResourceDefinition as $1obPJ$useResourceDefinition, useRecordContext as $1obPJ$useRecordContext, TopToolbar as $1obPJ$TopToolbar, ListButton as $1obPJ$ListButton, ShowButton as $1obPJ$ShowButton, Button as $1obPJ$Button, useTranslate as $1obPJ$useTranslate, useGetList as $1obPJ$useGetList, useDataProvider as $1obPJ$useDataProvider, Loading as $1obPJ$Loading, Error as $1obPJ$Error, useAuthProvider as $1obPJ$useAuthProvider, Toolbar as $1obPJ$Toolbar, SaveButton as $1obPJ$SaveButton, DeleteButton as $1obPJ$DeleteButton, EditButton as $1obPJ$EditButton, List as $1obPJ$List1, CreateButton as $1obPJ$CreateButton, ExportButton as $1obPJ$ExportButton, Show as $1obPJ$Show, useLogin as $1obPJ$useLogin, useGetIdentity as $1obPJ$useGetIdentity, useSafeSetState as $1obPJ$useSafeSetState, useLocaleState as $1obPJ$useLocaleState, Form as $1obPJ$Form, TextInput as $1obPJ$TextInput, required as $1obPJ$required, minLength as $1obPJ$minLength, email as $1obPJ$email, Notification as $1obPJ$Notification, Resource as $1obPJ$Resource, useUserMenu as $1obPJ$useUserMenu, UserMenu as $1obPJ$UserMenu, Logout as $1obPJ$Logout, useGetPermissions as $1obPJ$useGetPermissions} from "react-admin"; +import {useResourceContext as $1obPJ$useResourceContext, Create as $1obPJ$Create, CreateActions as $1obPJ$CreateActions, usePermissions as $1obPJ$usePermissions, useNotify as $1obPJ$useNotify, useRedirect as $1obPJ$useRedirect, useGetRecordId as $1obPJ$useGetRecordId, Edit as $1obPJ$Edit, useResourceDefinition as $1obPJ$useResourceDefinition, useRecordContext as $1obPJ$useRecordContext, TopToolbar as $1obPJ$TopToolbar, ListButton as $1obPJ$ListButton, ShowButton as $1obPJ$ShowButton, Button as $1obPJ$Button, useTranslate as $1obPJ$useTranslate, useGetList as $1obPJ$useGetList, useDataProvider as $1obPJ$useDataProvider, Loading as $1obPJ$Loading, Error as $1obPJ$Error, useAuthProvider as $1obPJ$useAuthProvider, Toolbar as $1obPJ$Toolbar, SaveButton as $1obPJ$SaveButton, DeleteButton as $1obPJ$DeleteButton, EditButton as $1obPJ$EditButton, List as $1obPJ$List1, CreateButton as $1obPJ$CreateButton, ExportButton as $1obPJ$ExportButton, Show as $1obPJ$Show, useLogin as $1obPJ$useLogin, useGetIdentity as $1obPJ$useGetIdentity, useSafeSetState as $1obPJ$useSafeSetState, useLocaleState as $1obPJ$useLocaleState, email as $1obPJ$email, Form as $1obPJ$Form, TextInput as $1obPJ$TextInput, required as $1obPJ$required, Notification as $1obPJ$Notification, Resource as $1obPJ$Resource, useUserMenu as $1obPJ$useUserMenu, UserMenu as $1obPJ$UserMenu, Logout as $1obPJ$Logout, useGetPermissions as $1obPJ$useGetPermissions} from "react-admin"; import {useCreateContainerUri as $1obPJ$useCreateContainerUri, useCreateContainer as $1obPJ$useCreateContainer} from "@semapps/semantic-data-provider"; import $1obPJ$muiiconsmaterialShare from "@mui/icons-material/Share"; import {Dialog as $1obPJ$Dialog, DialogTitle as $1obPJ$DialogTitle, DialogContent as $1obPJ$DialogContent, DialogActions as $1obPJ$DialogActions, TextField as $1obPJ$TextField, List as $1obPJ$List, ListItem as $1obPJ$ListItem, ListItemAvatar as $1obPJ$ListItemAvatar, Avatar as $1obPJ$Avatar, ListItemText as $1obPJ$ListItemText, ListItemSecondaryAction as $1obPJ$ListItemSecondaryAction, IconButton as $1obPJ$IconButton, Menu as $1obPJ$Menu, MenuItem as $1obPJ$MenuItem, ListItemIcon as $1obPJ$ListItemIcon, useMediaQuery as $1obPJ$useMediaQuery, DialogContentText as $1obPJ$DialogContentText, Button as $1obPJ$Button1, Card as $1obPJ$Card, Typography as $1obPJ$Typography, CardActions as $1obPJ$CardActions, Box as $1obPJ$Box, CardContent as $1obPJ$CardContent, LinearProgress as $1obPJ$LinearProgress} from "@mui/material"; @@ -20,6 +20,7 @@ import {styled as $1obPJ$styled1} from "@mui/material/styles"; import {useNavigate as $1obPJ$useNavigate, useSearchParams as $1obPJ$useSearchParams, Link as $1obPJ$Link, useLocation as $1obPJ$useLocation} from "react-router-dom"; import $1obPJ$muiiconsmaterialLock from "@mui/icons-material/Lock"; import $1obPJ$speakingurl from "speakingurl"; +import {useForm as $1obPJ$useForm, FormProvider as $1obPJ$FormProvider} from "react-hook-form"; import {withStyles as $1obPJ$withStyles} from "@mui/styles"; import $1obPJ$muiiconsmaterialAccountCircle from "@mui/icons-material/AccountCircle"; import $1obPJ$lodashisEqual from "lodash/isEqual"; @@ -1467,6 +1468,7 @@ var $479961b7e298304b$export$2e2bcd8739ae039 = $479961b7e298304b$var$SsoLoginPag + const $fb967e2c34f56644$var$useSignup = ()=>{ const authProvider = (0, $1obPJ$useAuthProvider)(); return (0, $1obPJ$useCallback)((params = {})=>authProvider.signup(params), [ @@ -1621,8 +1623,16 @@ function $a8046307c9dfa483$export$2e2bcd8739ae039({ scorer: scorer = (0, $646d64 const [searchParams] = (0, $1obPJ$useSearchParams)(); const redirectTo = searchParams.get("redirect") || "/"; const [locale] = (0, $1obPJ$useLocaleState)(); - const [password, setPassword] = (0, $1obPJ$useState)(""); - const submit = (0, $1obPJ$useCallback)(async (values)=>{ + const methods = (0, $1obPJ$useForm)({ + defaultValues: { + username: "", + email: searchParams.get("email") || "", + password: "" + } + }); + const { handleSubmit: handleSubmit, register: register, formState: { errors: errors, isSubmitting: isSubmitting }, watch: watch, reset: reset } = methods; + const password = watch("password"); + const onSubmit = async (values)=>{ try { setLoading(true); await signup({ @@ -1635,120 +1645,128 @@ function $a8046307c9dfa483$export$2e2bcd8739ae039({ scorer: scorer = (0, $646d64 }, delayBeforeRedirect); } catch (error) { setLoading(false); + // Reset form to current values to ensure consistency... + reset(values, { + keepValues: true + }); notify(typeof error === "string" ? error : typeof error === "undefined" || !error.message ? "ra.auth.sign_in_error" : error.message, { type: "warning", _: typeof error === "string" ? error : error && error.message ? error.message : undefined }); } - }, [ - setLoading, - signup, - additionalSignupValues, - redirectTo, - notify, - onSignup - ]); - return /*#__PURE__*/ (0, $1obPJ$jsx)((0, $1obPJ$Form), { - onSubmit: submit, - noValidate: true, - defaultValues: { - email: searchParams.get("email") - }, - children: /*#__PURE__*/ (0, $1obPJ$jsxs)((0, $1obPJ$CardContent), { - children: [ - /*#__PURE__*/ (0, $1obPJ$jsx)((0, $1obPJ$TextInput), { - autoFocus: true, - source: "username", - label: translate("auth.input.username"), - autoComplete: "username", - fullWidth: true, - disabled: loading, - validate: [ - (0, $1obPJ$required)(), - (0, $1obPJ$minLength)(2) - ], - format: (value)=>value ? (0, $1obPJ$speakingurl)(value, { - lang: locale || "fr", - separator: "_", - custom: [ - ".", - "-", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9" - ] - }) : "" - }), - /*#__PURE__*/ (0, $1obPJ$jsx)((0, $1obPJ$TextInput), { - source: "email", - label: translate("auth.input.email"), - autoComplete: "email", - fullWidth: true, - disabled: loading || searchParams.has("email") && searchParams.has("force-email"), - validate: [ - (0, $1obPJ$required)(), - (0, $1obPJ$email)() - ] - }), - passwordScorer && password && !(searchParams.has("email") && searchParams.has("force-email")) && /*#__PURE__*/ (0, $1obPJ$jsxs)((0, $1obPJ$Fragment), { - children: [ - /*#__PURE__*/ (0, $1obPJ$jsxs)((0, $1obPJ$Typography), { - variant: "caption", - style: { - marginBottom: 3 + }; + const formatUsername = (value)=>{ + return value ? (0, $1obPJ$speakingurl)(value, { + lang: locale || "fr", + separator: "_", + custom: [ + ".", + "-", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" + ] + }) : ""; + }; + return /*#__PURE__*/ (0, $1obPJ$jsx)((0, $1obPJ$FormProvider), { + ...methods, + children: /*#__PURE__*/ (0, $1obPJ$jsx)("form", { + onSubmit: handleSubmit(onSubmit), + noValidate: true, + children: /*#__PURE__*/ (0, $1obPJ$jsxs)((0, $1obPJ$CardContent), { + children: [ + /*#__PURE__*/ (0, $1obPJ$jsx)((0, $1obPJ$TextField), { + ...register("username", { + required: translate("ra.validation.required"), + minLength: { + value: 2, + message: translate("ra.validation.minLength", { + min: 2 + }) }, - children: [ - translate("auth.input.password_strength"), - ":", - " " - ] + setValueAs: formatUsername }), - /*#__PURE__*/ (0, $1obPJ$jsx)((0, $a8046307c9dfa483$export$2e2bcd8739ae039), { - password: password, - scorer: passwordScorer, - sx: { - width: "100%" + label: translate("auth.input.username"), + error: !!errors.username, + helperText: translate(errors.username?.message), + fullWidth: true, + disabled: loading, + margin: "normal" + }), + /*#__PURE__*/ (0, $1obPJ$jsx)((0, $1obPJ$TextField), { + ...register("email", { + required: translate("ra.validation.required"), + pattern: { + value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i, + message: translate("ra.validation.email") } - }) - ] - }), - /*#__PURE__*/ (0, $1obPJ$jsx)((0, $1obPJ$TextInput), { - source: "password", - type: "password", - value: password, - onChange: (e)=>setPassword(e.target.value), - label: translate("ra.auth.password"), - autoComplete: "new-password", - fullWidth: true, - disabled: loading || searchParams.has("email") && searchParams.has("force-email"), - validate: [ - (0, $1obPJ$required)(), - (0, $7a0bbe6824860dfe$export$2e2bcd8739ae039)(passwordScorer) - ] - }), - /*#__PURE__*/ (0, $1obPJ$jsx)((0, $1obPJ$Button1), { - variant: "contained", - type: "submit", - color: "primary", - disabled: loading, - fullWidth: true, - children: translate("auth.action.signup") - }) - ] + }), + label: translate("auth.input.email"), + error: !!errors.email, + autoComplete: "email", + helperText: translate(errors.email?.message), + fullWidth: true, + disabled: loading || searchParams.has("email") && searchParams.has("force-email") + }), + passwordScorer && password && !(searchParams.has("email") && searchParams.has("force-email")) && /*#__PURE__*/ (0, $1obPJ$jsxs)((0, $1obPJ$Fragment), { + children: [ + /*#__PURE__*/ (0, $1obPJ$jsxs)((0, $1obPJ$Typography), { + variant: "caption", + style: { + marginBottom: 3 + }, + children: [ + translate("auth.input.password_strength"), + ":", + " " + ] + }), + /*#__PURE__*/ (0, $1obPJ$jsx)((0, $a8046307c9dfa483$export$2e2bcd8739ae039), { + password: password, + scorer: passwordScorer, + sx: { + width: "100%" + } + }) + ] + }), + /*#__PURE__*/ (0, $1obPJ$jsx)((0, $1obPJ$TextField), { + ...register("password", { + required: translate("ra.validation.required"), + validate: (value)=>(0, $7a0bbe6824860dfe$export$2e2bcd8739ae039)(passwordScorer)(value) + }), + type: "password", + value: password, + label: translate("ra.auth.password"), + error: !!errors.password, + helperText: translate(errors.password?.message), + autoComplete: "new-password", + fullWidth: true, + disabled: loading || searchParams.has("email") && searchParams.has("force-email") + }), + /*#__PURE__*/ (0, $1obPJ$jsx)((0, $1obPJ$Button1), { + variant: "contained", + type: "submit", + color: "primary", + disabled: loading || isSubmitting, + fullWidth: true, + sx: { + mt: 2 + }, + children: translate("auth.action.signup") + }) + ] + }) }) }); }; -$e011da92680cf1fe$var$SignupForm.defaultValues = { - redirectTo: "/", - additionalSignupValues: {} -}; var $e011da92680cf1fe$export$2e2bcd8739ae039 = $e011da92680cf1fe$var$SignupForm; @@ -1764,7 +1782,14 @@ const $e2a34b2d647a5391$var$LoginForm = ({ onLogin: onLogin, allowUsername: allo const notify = (0, $1obPJ$useNotify)(); const [searchParams] = (0, $1obPJ$useSearchParams)(); const redirectTo = searchParams.get("redirect") || "/"; - const submit = (0, $1obPJ$useCallback)(async (values)=>{ + const methods = (0, $1obPJ$useForm)({ + defaultValues: { + username: searchParams.get("email") || "", + password: "" + } + }); + const { handleSubmit: handleSubmit, register: register, formState: { errors: errors, isSubmitting: isSubmitting }, reset: reset } = methods; + const onSubmit = async (values)=>{ try { setLoading(true); await login(values); @@ -1772,6 +1797,10 @@ const $e2a34b2d647a5391$var$LoginForm = ({ onLogin: onLogin, allowUsername: allo else window.location.href = redirectTo; } catch (error) { setLoading(false); + // Reset form to current values to ensure consistency + reset(values, { + keepValues: true + }); notify(typeof error === "string" ? error : typeof error === "undefined" || !error.message ? "ra.auth.sign_in_error" : error.message, { type: "warning", messageArgs: { @@ -1779,53 +1808,59 @@ const $e2a34b2d647a5391$var$LoginForm = ({ onLogin: onLogin, allowUsername: allo } }); } - }, [ - setLoading, - login, - redirectTo, - notify, - onLogin - ]); - return /*#__PURE__*/ (0, $1obPJ$jsx)((0, $1obPJ$Form), { - onSubmit: submit, - noValidate: true, - defaultValues: { - username: searchParams.get("email") - }, - children: /*#__PURE__*/ (0, $1obPJ$jsxs)((0, $1obPJ$CardContent), { - children: [ - /*#__PURE__*/ (0, $1obPJ$jsx)((0, $1obPJ$TextInput), { - source: "username", - label: translate(allowUsername ? "auth.input.username_or_email" : "auth.input.email"), - autoComplete: "email", - fullWidth: true, - disabled: loading || searchParams.has("email") && searchParams.has("force-email"), - format: (value)=>value ? value.toLowerCase() : "", - validate: allowUsername ? [ - (0, $1obPJ$required)() - ] : [ - (0, $1obPJ$required)(), - (0, $1obPJ$email)() - ] - }), - /*#__PURE__*/ (0, $1obPJ$jsx)((0, $1obPJ$TextInput), { - source: "password", - type: "password", - label: translate("ra.auth.password"), - autoComplete: "current-password", - fullWidth: true, - disabled: loading || searchParams.has("email") && searchParams.has("force-email"), - validate: (0, $1obPJ$required)() - }), - /*#__PURE__*/ (0, $1obPJ$jsx)((0, $1obPJ$Button1), { - variant: "contained", - type: "submit", - color: "primary", - disabled: loading, - fullWidth: true, - children: translate("auth.action.login") - }) - ] + }; + return /*#__PURE__*/ (0, $1obPJ$jsx)((0, $1obPJ$FormProvider), { + ...methods, + children: /*#__PURE__*/ (0, $1obPJ$jsx)("form", { + onSubmit: handleSubmit(onSubmit), + noValidate: true, + children: /*#__PURE__*/ (0, $1obPJ$jsxs)((0, $1obPJ$CardContent), { + children: [ + /*#__PURE__*/ (0, $1obPJ$jsx)((0, $1obPJ$TextField), { + ...register("username", { + required: translate("ra.validation.required"), + validate: (value)=>{ + if (!allowUsername) { + const validationRes = (0, $1obPJ$email)()(value); + return validationRes.message ?? validationRes ?? true; + } + return true; + }, + setValueAs: (value)=>value.toLowerCase() + }), + label: translate(allowUsername ? "auth.input.username_or_email" : "auth.input.email"), + error: !!errors.username, + helperText: translate(errors.username?.message), + autoComplete: "email", + fullWidth: true, + disabled: loading || searchParams.has("email") && searchParams.has("force-email"), + margin: "normal" + }), + /*#__PURE__*/ (0, $1obPJ$jsx)((0, $1obPJ$TextField), { + ...register("password", { + required: translate("ra.validation.required") + }), + type: "password", + label: translate("ra.auth.password"), + error: !!errors.password, + helperText: translate(errors.password?.message), + autoComplete: "current-password", + fullWidth: true, + disabled: loading || searchParams.has("email") && searchParams.has("force-email") + }), + /*#__PURE__*/ (0, $1obPJ$jsx)((0, $1obPJ$Button1), { + variant: "contained", + type: "submit", + color: "primary", + disabled: loading || isSubmitting, + fullWidth: true, + sx: { + mt: 2 + }, + children: translate("auth.action.login") + }) + ] + }) }) }); }; diff --git a/src/frontend/packages/auth-provider/dist/index.es.js.map b/src/frontend/packages/auth-provider/dist/index.es.js.map index b5849f04b..756c9aa47 100644 --- a/src/frontend/packages/auth-provider/dist/index.es.js.map +++ b/src/frontend/packages/auth-provider/dist/index.es.js.map @@ -1 +1 @@ -{"mappings":"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","sources":["packages/auth-provider/src/index.ts","packages/auth-provider/src/authProvider.js","packages/auth-provider/src/utils.js","packages/auth-provider/src/crud/create/CreateWithPermissions.js","packages/auth-provider/src/hooks/useCheckPermissions.ts","packages/auth-provider/src/constants.ts","packages/auth-provider/src/crud/edit/EditWithPermissions.js","packages/auth-provider/src/crud/edit/EditActionsWithPermissions.tsx","packages/auth-provider/src/components/PermissionsButton/PermissionsButton.js","packages/auth-provider/src/components/PermissionsButton/PermissionsDialog.js","packages/auth-provider/src/components/PermissionsButton/AddPermissionsForm.js","packages/auth-provider/src/components/PermissionsButton/EditPermissionsForm.js","packages/auth-provider/src/components/PermissionsButton/AgentItem.js","packages/auth-provider/src/components/PermissionsButton/AgentIcon.js","packages/auth-provider/src/hooks/useAgents.js","packages/auth-provider/src/crud/edit/EditToolbarWithPermissions.tsx","packages/auth-provider/src/crud/edit/DeleteButtonWithPermissions.js","packages/auth-provider/src/crud/edit/EditButtonWithPermissions.js","packages/auth-provider/src/crud/list/ListWithPermissions.js","packages/auth-provider/src/crud/list/ListActionsWithPermissions.js","packages/auth-provider/src/crud/show/ShowWithPermissions.js","packages/auth-provider/src/crud/show/ShowActionsWithPermissions.tsx","packages/auth-provider/src/components/AuthDialog.js","packages/auth-provider/src/components/SsoLoginPage.js","packages/auth-provider/src/components/LocalLoginPage/LocalLoginPage.js","packages/auth-provider/src/components/LocalLoginPage/SignupForm.js","packages/auth-provider/src/hooks/useSignup.js","packages/auth-provider/src/components/LocalLoginPage/validatePasswordStrength.js","packages/auth-provider/src/passwordScorer.js","packages/auth-provider/src/components/LocalLoginPage/PasswordStrengthIndicator.js","packages/auth-provider/src/components/LocalLoginPage/ColorGradientProgressBar.js","packages/auth-provider/src/components/LocalLoginPage/LoginForm.js","packages/auth-provider/src/components/LocalLoginPage/NewPasswordForm.js","packages/auth-provider/src/components/LocalLoginPage/ResetPasswordForm.js","packages/auth-provider/src/components/LocalLoginPage/SimpleBox.js","packages/auth-provider/src/components/LocalLoginPage/getSearchParamsRest.js","packages/auth-provider/src/components/ResourceWithPermissions.js","packages/auth-provider/src/components/UserMenu.js","packages/auth-provider/src/hooks/useCheckAuthenticated.js","packages/auth-provider/src/hooks/usePermissionsWithRefetch.js","packages/auth-provider/src/messages/english.js","packages/auth-provider/src/messages/french.js"],"sourcesContent":["export { default as authProvider } from './authProvider';\n\n// Create\nexport { default as CreateWithPermissions } from './crud/create/CreateWithPermissions';\n\n// Edit\nexport { default as EditWithPermissions } from './crud/edit/EditWithPermissions';\nexport { default as EditActionsWithPermissions } from './crud/edit/EditActionsWithPermissions';\nexport { default as EditToolbarWithPermissions } from './crud/edit/EditToolbarWithPermissions';\nexport { default as EditButtonWithPermissions } from './crud/edit/EditButtonWithPermissions';\nexport { default as DeleteButtonWithPermissions } from './crud/edit/DeleteButtonWithPermissions';\n\n// List\nexport { default as ListWithPermissions } from './crud/list/ListWithPermissions';\nexport { default as ListActionsWithPermissions } from './crud/list/ListActionsWithPermissions';\n\n// Show\nexport { default as ShowWithPermissions } from './crud/show/ShowWithPermissions';\nexport { default as ShowActionsWithPermissions } from './crud/show/ShowActionsWithPermissions';\n\nexport { default as PermissionsButton } from './components/PermissionsButton/PermissionsButton';\nexport { default as AuthDialog } from './components/AuthDialog';\nexport { default as SsoLoginPage, default as LoginPage } from './components/SsoLoginPage';\nexport { default as LocalLoginPage } from './components/LocalLoginPage/LocalLoginPage';\nexport { default as ResourceWithPermissions } from './components/ResourceWithPermissions';\nexport { default as UserMenu } from './components/UserMenu';\n\nexport { default as useAgents } from './hooks/useAgents';\nexport { default as useCheckAuthenticated } from './hooks/useCheckAuthenticated';\nexport { default as useCheckPermissions } from './hooks/useCheckPermissions';\nexport { default as usePermissionsWithRefetch } from './hooks/usePermissionsWithRefetch';\nexport { default as useSignup } from './hooks/useSignup';\n\n// Password scoring\nexport { default as PasswordStrengthIndicator } from './components/LocalLoginPage/PasswordStrengthIndicator';\nexport { default as validatePasswordStrength } from './components/LocalLoginPage/validatePasswordStrength';\nexport {\n defaultScorer as defaultPasswordScorer,\n defaultOptions as defaultPasswordScorerOptions,\n createPasswordScorer\n} from './passwordScorer';\n\nexport { default as englishMessages } from './messages/english';\nexport { default as frenchMessages } from './messages/french';\n","import jwtDecode from 'jwt-decode';\nimport urlJoin from 'url-join';\nimport * as oauth from 'oauth4webapi';\nimport { defaultToArray, getAclUri, getAclContext, getAuthServerUrl } from './utils';\n\nconst AUTH_TYPE_SSO = 'sso';\nconst AUTH_TYPE_LOCAL = 'local';\nconst AUTH_TYPE_POD = 'pod';\nconst AUTH_TYPE_SOLID_OIDC = 'solid-oidc';\n\nconst authProvider = ({\n dataProvider,\n authType,\n allowAnonymous = true,\n checkUser,\n checkPermissions = false,\n clientId\n}) => {\n if (![AUTH_TYPE_SSO, AUTH_TYPE_LOCAL, AUTH_TYPE_POD, AUTH_TYPE_SOLID_OIDC].includes(authType))\n throw new Error('The authType parameter is missing from the auth provider');\n if (authType === AUTH_TYPE_SOLID_OIDC && !clientId)\n throw new Error('The clientId parameter is required for solid-oidc authentication');\n const callCheckUser = async webId => {\n if (checkUser) {\n try {\n const { json: userData } = await dataProvider.fetch(webId);\n if (!userData) throw new Error('auth.message.unable_to_fetch_user_data');\n if (checkUser(userData) === false) throw new Error('auth.message.user_not_allowed_to_login');\n } catch (e) {\n localStorage.removeItem('token');\n throw e;\n }\n }\n };\n return {\n login: async params => {\n if (authType === AUTH_TYPE_SOLID_OIDC) {\n let { webId, issuer, redirect = '/', isSignup = false } = params;\n\n if (webId && !issuer) {\n // Find issuer from webId\n const { json: userData } = await dataProvider.fetch(webId);\n if (!userData) throw new Error('auth.message.unable_to_fetch_user_data');\n if (!userData['solid:oidcIssuer']) throw new Error('auth.message.no_associated_oidc_issuer');\n issuer = userData?.['solid:oidcIssuer'];\n }\n\n const as = await oauth\n .discoveryRequest(new URL(issuer))\n .then(response => oauth.processDiscoveryResponse(new URL(issuer), response))\n .catch(() => {\n throw new Error('auth.message.unreachable_auth_server');\n });\n\n const codeVerifier = oauth.generateRandomCodeVerifier();\n const codeChallenge = await oauth.calculatePKCECodeChallenge(codeVerifier);\n const codeChallengeMethod = 'S256';\n\n // Save to use on handleCallback method\n localStorage.setItem('code_verifier', codeVerifier);\n localStorage.setItem('redirect', redirect);\n\n const authorizationUrl = new URL(as.authorization_endpoint);\n authorizationUrl.searchParams.set('response_type', 'code');\n authorizationUrl.searchParams.set('client_id', clientId);\n authorizationUrl.searchParams.set('code_challenge', codeChallenge);\n authorizationUrl.searchParams.set('code_challenge_method', codeChallengeMethod);\n authorizationUrl.searchParams.set('redirect_uri', `${window.location.origin}/auth-callback`);\n authorizationUrl.searchParams.set('scope', 'openid webid offline_access');\n authorizationUrl.searchParams.set('is_signup', isSignup);\n\n window.location = authorizationUrl;\n } else if (authType === AUTH_TYPE_LOCAL) {\n const { username, password } = params;\n const authServerUrl = await getAuthServerUrl(dataProvider);\n let token, webId;\n\n try {\n ({\n json: { token, webId }\n } = await dataProvider.fetch(urlJoin(authServerUrl, 'auth/login'), {\n method: 'POST',\n body: JSON.stringify({\n username: username.trim(),\n password: password.trim()\n }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n }));\n } catch (e) {\n throw new Error('ra.auth.sign_in_error');\n }\n\n // Set token now as it is required for refreshConfig\n localStorage.setItem('token', token);\n await dataProvider.refreshConfig();\n\n await callCheckUser(webId);\n } else if (authType === AUTH_TYPE_SSO) {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n let redirectUrl = `${new URL(window.location.href).origin}/login?login=true`;\n if (params.redirect) redirectUrl += `&redirect=${encodeURIComponent(params.redirect)}`;\n window.location.href = urlJoin(authServerUrl, `auth?redirectUrl=${encodeURIComponent(redirectUrl)}`);\n }\n },\n handleCallback: async () => {\n const { searchParams } = new URL(window.location);\n\n if (authType === AUTH_TYPE_SOLID_OIDC) {\n const issuer = new URL(searchParams.get('iss'));\n const as = await oauth\n .discoveryRequest(issuer)\n .then(response => oauth.processDiscoveryResponse(issuer, response));\n\n const client = {\n client_id: clientId,\n token_endpoint_auth_method: 'none' // We don't have a client secret\n };\n\n const currentUrl = new URL(window.location.href);\n const params = oauth.validateAuthResponse(as, client, currentUrl, oauth.expectNoState);\n if (oauth.isOAuth2Error(params)) {\n throw new Error(`OAuth error: ${params.error} (${params.error_description})`);\n }\n\n // Retrieve data set during login\n const codeVerifier = localStorage.getItem('code_verifier');\n const redirect = localStorage.getItem('redirect');\n\n const response = await oauth.authorizationCodeGrantRequest(\n as,\n client,\n params,\n `${window.location.origin}/auth-callback`,\n codeVerifier\n );\n\n const result = await oauth.processAuthorizationCodeOpenIDResponse(as, client, response);\n if (oauth.isOAuth2Error(result)) {\n throw new Error(`OAuth error: ${params.error} (${params.error_description})`);\n }\n\n // Until DPoP is implemented, use the ID token to log into local Pod\n // And the proxy endpoint to log into remote Pods\n localStorage.setItem('token', result.id_token);\n\n // Remove we don't need it anymore\n localStorage.removeItem('code_verifier');\n localStorage.removeItem('redirect');\n\n // Reload to ensure the dataServer config is reset\n window.location.href = redirect || '/';\n } else {\n const token = searchParams.get('token');\n if (!token) throw new Error('auth.message.no_token_returned');\n\n let webId;\n try {\n ({ webId } = jwtDecode(token));\n } catch (e) {\n throw new Error('auth.message.invalid_token_returned');\n }\n\n localStorage.setItem('token', token);\n await dataProvider.refreshConfig();\n\n await callCheckUser(webId);\n }\n },\n signup: async params => {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n if (authType === AUTH_TYPE_LOCAL) {\n const { username, email, password, domain, ...profileData } = params;\n let token, webId;\n\n try {\n ({\n json: { token, webId }\n } = await dataProvider.fetch(urlJoin(authServerUrl, 'auth/signup'), {\n method: 'POST',\n body: JSON.stringify({\n username: username?.trim(),\n email: email.trim(),\n password: password.trim(),\n ...profileData\n }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n }));\n } catch (e) {\n if (e.message === 'email.already.exists') {\n throw new Error('auth.message.user_email_exist');\n } else if (e.message === 'username.already.exists') {\n throw new Error('auth.message.username_exist');\n } else if (e.message === 'username.invalid') {\n throw new Error('auth.message.username_invalid');\n } else {\n throw new Error('auth.message.signup_error');\n }\n }\n\n localStorage.setItem('token', token);\n await dataProvider.refreshConfig();\n\n await callCheckUser(webId);\n\n return webId;\n } else {\n const redirectUrl = `${new URL(window.location.href).origin}/login?login=true`;\n window.location.href = urlJoin(authServerUrl, `auth?redirectUrl=${encodeURIComponent(redirectUrl)}`);\n }\n },\n logout: async params => {\n const { redirectUrl } = params || {};\n switch (authType) {\n case AUTH_TYPE_LOCAL: {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n\n // Delete token but also any other value in local storage\n localStorage.clear();\n\n let result = {};\n\n try {\n result = await dataProvider.fetch(urlJoin(authServerUrl, '.well-known/openid-configuration'));\n } catch (e) {\n // Do nothing if it fails\n }\n\n if (result.status === 200 && result.json) {\n // Redirect to OIDC endpoint if it exists\n window.location.href = result.json.end_session_endpoint;\n } else {\n // Reload to ensure the dataServer config is reset\n window.location.reload();\n window.location.href = '/';\n }\n\n break;\n }\n\n case AUTH_TYPE_SSO: {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n const baseUrl = new URL(window.location.href).origin;\n return urlJoin(\n authServerUrl,\n `auth/logout?redirectUrl=${encodeURIComponent(`${urlJoin(baseUrl, 'login')}?logout=true`)}`\n );\n }\n\n case AUTH_TYPE_POD: {\n const token = localStorage.getItem('token');\n if (token) {\n const { webId } = jwtDecode(token);\n // Delete token but also any other value in local storage\n localStorage.clear();\n // Redirect to the POD provider\n return `${urlJoin(webId, 'openApp')}?type=${encodeURIComponent(\n 'http://activitypods.org/ns/core#FrontAppRegistration'\n )}`;\n }\n break;\n }\n\n case AUTH_TYPE_SOLID_OIDC: {\n const token = localStorage.getItem('token');\n if (token) {\n const { webid: webId } = jwtDecode(token); // Not webId !!\n\n // Delete token but also any other value in local storage\n localStorage.clear();\n\n if (redirectUrl) {\n return redirectUrl;\n } else {\n // We don't need the token to fetch the WebID since it is public\n const { json: userData } = await dataProvider.fetch(webId);\n\n // Redirect to the Pod provider\n return userData?.['solid:oidcIssuer'] || new URL(webId).origin;\n }\n } else {\n return redirectUrl;\n }\n }\n\n default:\n break;\n }\n },\n checkAuth: async () => {\n const token = localStorage.getItem('token');\n if (!token && !allowAnonymous) throw new Error();\n },\n checkUser: userData => {\n if (checkUser) {\n return checkUser(userData);\n }\n return true;\n },\n checkError: error => {\n // We want to disconnect only with INVALID_TOKEN errors\n if (error.status === 401 && error.body && error.body.type === 'INVALID_TOKEN') {\n localStorage.removeItem('token');\n return Promise.reject();\n } else {\n // Other error code (404, 500, etc): no need to log out\n return Promise.resolve();\n }\n },\n getPermissions: async uri => {\n if (!checkPermissions) return;\n\n // React-admin calls getPermissions with an empty object on every page refresh\n // It also passes an object `{ params: { route: 'dashboard' } }` on the Dashboard\n // Ignore all this until we found a way to bypass these redundant calls\n if (typeof uri === 'object') return;\n\n if (!uri || !uri.startsWith('http'))\n throw new Error('The first parameter passed to getPermissions must be an URL');\n\n const aclUri = getAclUri(uri);\n\n try {\n const { json } = await dataProvider.fetch(aclUri);\n return json['@graph'];\n } catch (e) {\n console.warn(`Could not fetch ACL URI ${uri}`);\n return [];\n }\n },\n addPermission: async (uri, agentId, predicate, mode) => {\n if (!uri || !uri.startsWith('http'))\n throw new Error('The first parameter passed to addPermission must be an URL');\n\n const aclUri = getAclUri(uri);\n\n const authorization = {\n '@id': `#${mode.replace('acl:', '')}`,\n '@type': 'acl:Authorization',\n [predicate]: agentId,\n 'acl:accessTo': uri,\n 'acl:mode': mode\n };\n\n await dataProvider.fetch(aclUri, {\n method: 'PATCH',\n body: JSON.stringify({\n '@context': getAclContext(aclUri),\n '@graph': [authorization]\n })\n });\n },\n removePermission: async (uri, agentId, predicate, mode) => {\n if (!uri || !uri.startsWith('http'))\n throw new Error('The first parameter passed to removePermission must be an URL');\n\n const aclUri = getAclUri(uri);\n\n // Fetch current permissions\n const { json } = await dataProvider.fetch(aclUri);\n\n const updatedPermissions = json['@graph']\n .filter(authorization => !authorization['@id'].includes('#Default'))\n .map(authorization => {\n const modes = defaultToArray(authorization['acl:mode']);\n let agents = defaultToArray(authorization[predicate]);\n if (mode && modes.includes(mode) && agents && agents.includes(agentId)) {\n agents = agents.filter(agent => agent !== agentId);\n }\n return { ...authorization, [predicate]: agents };\n });\n\n await dataProvider.fetch(aclUri, {\n method: 'PUT',\n body: JSON.stringify({\n '@context': getAclContext(aclUri),\n '@graph': updatedPermissions\n })\n });\n },\n getIdentity: async () => {\n const token = localStorage.getItem('token');\n if (token) {\n const payload = jwtDecode(token);\n\n // Backend-generated tokens use webId but Solid-OIDC tokens use webid\n const webId = authType === AUTH_TYPE_SOLID_OIDC ? payload.webid : payload.webId;\n\n if (!webId) {\n // If webId is not set, it is probably because we have ActivityPods v1 tokens and we need to disconnect\n localStorage.removeItem('token');\n window.location.href = '/login';\n throw new Error('No webId found on provided token !');\n }\n\n const { json: webIdData } = await dataProvider.fetch(webId);\n const { json: profileData } = webIdData.url ? await dataProvider.fetch(webIdData.url) : {};\n\n return {\n id: webId,\n fullName:\n profileData?.['vcard:given-name'] ||\n profileData?.['pair:label'] ||\n webIdData['foaf:name'] ||\n webIdData['pair:label'],\n profileData,\n webIdData\n };\n }\n },\n resetPassword: async params => {\n const { email } = params;\n const authServerUrl = await getAuthServerUrl(dataProvider);\n try {\n await dataProvider.fetch(urlJoin(authServerUrl, 'auth/reset_password'), {\n method: 'POST',\n body: JSON.stringify({ email: email.trim() }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n });\n } catch (e) {\n if (e.message === 'email.not.exists') {\n throw new Error('auth.message.user_email_not_found');\n } else {\n throw new Error('auth.notification.reset_password_error');\n }\n }\n },\n setNewPassword: async params => {\n const { email, token, password } = params;\n const authServerUrl = await getAuthServerUrl(dataProvider);\n try {\n await dataProvider.fetch(urlJoin(authServerUrl, 'auth/new_password'), {\n method: 'POST',\n body: JSON.stringify({ email: email.trim(), token, password }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n });\n } catch (e) {\n if (e.message === 'email.not.exists') {\n throw new Error('auth.message.user_email_not_found');\n } else {\n throw new Error('auth.notification.new_password_error');\n }\n }\n },\n getAccountSettings: async params => {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n try {\n const { json } = await dataProvider.fetch(urlJoin(authServerUrl, 'auth/account'));\n return json;\n } catch (e) {\n throw new Error('auth.notification.get_settings_error');\n }\n },\n updateAccountSettings: async params => {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n try {\n const { email, currentPassword, newPassword } = params;\n\n await dataProvider.fetch(urlJoin(authServerUrl, 'auth/account'), {\n method: 'POST',\n body: JSON.stringify({\n currentPassword,\n email: email?.trim(),\n newPassword\n }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n });\n } catch (e) {\n if (e.message === 'auth.account.invalid_password') {\n throw new Error('auth.notification.invalid_password');\n }\n\n throw new Error('auth.notification.update_settings_error');\n }\n }\n };\n};\n\nexport default authProvider;\n","import urlJoin from 'url-join';\n\nexport const defaultToArray = value => (!value ? undefined : Array.isArray(value) ? value : [value]);\n\n// Transform the URI to the one used to find the ACL\n// To be compatible with all servers, we should do a HEAD request to the resource URI\nexport const getAclUri = resourceUri => {\n const parsedUrl = new URL(resourceUri);\n return urlJoin(parsedUrl.origin, '_acl', parsedUrl.pathname);\n};\n\nexport const getAclContext = baseUri => ({\n '@base': baseUri,\n acl: 'http://www.w3.org/ns/auth/acl#',\n foaf: 'http://xmlns.com/foaf/0.1/',\n 'acl:agent': { '@type': '@id' },\n 'acl:agentGroup': { '@type': '@id' },\n 'acl:agentClass': { '@type': '@id' },\n 'acl:mode': { '@type': '@id' },\n 'acl:accessTo': { '@type': '@id' }\n});\n\nexport const getAuthServerUrl = async dataProvider => {\n const dataServers = await dataProvider.getDataServers();\n const authServer = Object.values(dataServers).find(server => server.authServer === true);\n if (!authServer) throw new Error('Could not find a server with authServer: true. Check your dataServers config.');\n // If the server is a Pod provider, return the root URL instead of https://domain.com/user/data\n return authServer.pod ? new URL(authServer.baseUrl).origin : authServer.baseUrl;\n};\n\nexport const delay = async t => new Promise(resolve => setTimeout(resolve, t));\n","import React from 'react';\nimport { Create, CreateActions, useResourceContext } from 'react-admin';\nimport { useCreateContainerUri } from '@semapps/semantic-data-provider';\nimport useCheckPermissions from '../../hooks/useCheckPermissions';\n\nconst CreateWithPermissions = props => {\n const resource = useResourceContext();\n const createContainerUri = useCreateContainerUri()(resource);\n useCheckPermissions(createContainerUri, 'create');\n return ;\n};\n\nCreateWithPermissions.defaultProps = {\n actions: \n};\n\nexport default CreateWithPermissions;\n","import { useEffect } from 'react';\nimport { usePermissions, useRedirect, useNotify } from 'react-admin';\nimport { rights, forbiddenErrors } from '../constants';\nimport { Permissions } from '../types';\n\nconst useCheckPermissions = (uri: string, mode: keyof typeof rights, redirectUrl: string = '/') => {\n const { permissions } = usePermissions(uri);\n const notify = useNotify();\n const redirect = useRedirect();\n\n useEffect(() => {\n if (permissions && !permissions.some(p => rights[mode].includes(p['acl:mode']))) {\n notify(forbiddenErrors[mode], { type: 'error' });\n redirect(redirectUrl);\n }\n }, [permissions, redirect, notify]);\n\n return permissions;\n};\n\nexport default useCheckPermissions;\n","import { AclClass, AclMode } from './types';\n\nexport const ACL_READ: AclMode = 'acl:Read';\nexport const ACL_APPEND: AclMode = 'acl:Append';\nexport const ACL_WRITE: AclMode = 'acl:Write';\nexport const ACL_CONTROL: AclMode = 'acl:Control';\n\nexport const USER_AGENT = 'acl:agent';\nexport const GROUP_AGENT = 'acl:agentGroup';\nexport const CLASS_AGENT = 'acl:agentClass';\n\nexport const ANONYMOUS_AGENT: AclClass = 'foaf:Agent';\nexport const AUTHENTICATED_AGENT: AclClass = 'acl:AuthenticatedAgent';\n\nexport const rightsToShow: AclMode[] = [ACL_READ, ACL_APPEND, ACL_WRITE, ACL_CONTROL];\nexport const rightsToList: AclMode[] = [ACL_READ, ACL_APPEND, ACL_WRITE, ACL_CONTROL];\nexport const rightsToCreate: AclMode[] = [ACL_APPEND, ACL_WRITE, ACL_CONTROL];\nexport const rightsToEdit: AclMode[] = [ACL_APPEND, ACL_WRITE, ACL_CONTROL];\nexport const rightsToDelete: AclMode[] = [ACL_WRITE, ACL_CONTROL];\nexport const rightsToControl: AclMode[] = [ACL_CONTROL];\n\nexport const rights = {\n show: rightsToShow,\n list: rightsToList,\n create: rightsToCreate,\n edit: rightsToEdit,\n delete: rightsToDelete,\n control: rightsToControl\n};\n\nexport const forbiddenErrors = {\n show: 'auth.message.resource_show_forbidden',\n edit: 'auth.message.resource_edit_forbidden',\n delete: 'auth.message.resource_delete_forbidden',\n control: 'auth.message.resource_control_forbidden',\n list: 'auth.message.container_list_forbidden',\n create: 'auth.message.container_create_forbidden'\n};\n\nexport const resourceRightsLabels = {\n [ACL_READ]: 'auth.right.resource.read',\n [ACL_APPEND]: 'auth.right.resource.append',\n [ACL_WRITE]: 'auth.right.resource.write',\n [ACL_CONTROL]: 'auth.right.resource.control'\n};\n\nexport const containerRightsLabels = {\n [ACL_READ]: 'auth.right.container.read',\n [ACL_WRITE]: 'auth.right.container.write',\n [ACL_CONTROL]: 'auth.right.container.control'\n};\n","import React from 'react';\nimport { Edit, useGetRecordId } from 'react-admin';\nimport EditActionsWithPermissions from './EditActionsWithPermissions';\nimport EditToolbarWithPermissions from './EditToolbarWithPermissions';\nimport useCheckPermissions from '../../hooks/useCheckPermissions';\n\nconst EditWithPermissions = props => {\n const recordId = useGetRecordId();\n useCheckPermissions(recordId, 'edit');\n return (\n \n {React.cloneElement(props.children, {\n toolbar: ,\n // Allow to override toolbar\n ...props.children.props\n })}\n \n );\n};\n\nEditWithPermissions.defaultProps = {\n actions: \n};\n\nexport default EditWithPermissions;\n","import React from 'react';\nimport {\n ShowButton,\n ListButton,\n TopToolbar,\n usePermissions,\n useResourceDefinition,\n useRecordContext,\n useResourceContext\n} from 'react-admin';\nimport { useCreateContainerUri } from '@semapps/semantic-data-provider';\nimport PermissionsButton from '../../components/PermissionsButton/PermissionsButton';\nimport { rightsToControl, rightsToList, rightsToShow } from '../../constants';\nimport { Permissions } from '../../types';\n\nconst EditActionsWithPermissions = () => {\n const { hasList, hasShow } = useResourceDefinition();\n const record = useRecordContext();\n const { permissions } = usePermissions(record?.id);\n\n const resource = useResourceContext();\n const containerUri = useCreateContainerUri()(resource);\n const { permissions: containerPermissions } = usePermissions(containerUri);\n\n return (\n \n {hasList && containerPermissions && containerPermissions.some(p => rightsToList.includes(p['acl:mode'])) && (\n \n )}\n {hasShow && permissions && permissions.some(p => rightsToShow.includes(p['acl:mode'])) && }\n {permissions && permissions.some(p => rightsToControl.includes(p['acl:mode'])) && }\n \n );\n};\n\nexport default EditActionsWithPermissions;\n","import React, { useState } from 'react';\nimport { Button, useRecordContext, useResourceContext } from 'react-admin';\nimport ShareIcon from '@mui/icons-material/Share';\nimport { useCreateContainer } from '@semapps/semantic-data-provider';\nimport PermissionsDialog from './PermissionsDialog';\n\nconst PermissionsButton = ({ isContainer }) => {\n const record = useRecordContext();\n const resource = useResourceContext();\n const [showDialog, setShowDialog] = useState(false);\n const createContainer = useCreateContainer(resource);\n const uri = isContainer ? createContainer : record.id || record['@id'];\n return (\n <>\n \n setShowDialog(false)} />\n \n );\n};\n\nPermissionsButton.defaultProps = {\n isContainer: false\n};\n\nexport default PermissionsButton;\n","import React from 'react';\nimport { Button, useTranslate } from 'react-admin';\nimport { Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport AddPermissionsForm from './AddPermissionsForm';\nimport EditPermissionsForm from './EditPermissionsForm';\nimport useAgents from '../../hooks/useAgents';\n\nconst useStyles = makeStyles(() => ({\n title: {\n paddingBottom: 8\n },\n actions: {\n padding: 15\n },\n addForm: {\n paddingTop: 0\n },\n listForm: {\n paddingTop: 0,\n paddingBottom: 0,\n paddingRight: 0,\n maxHeight: 210\n }\n}));\n\nconst PermissionsDialog = ({ open, onClose, uri, isContainer }) => {\n const classes = useStyles();\n const translate = useTranslate();\n const { agents, addPermission, removePermission } = useAgents(uri);\n\n return (\n \n \n {translate(isContainer ? 'auth.dialog.container_permissions' : 'auth.dialog.resource_permissions')}\n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default PermissionsDialog;\n","import React, { useEffect, useState } from 'react';\nimport { useGetList, useTranslate } from 'react-admin';\nimport { TextField, List, ListItem, ListItemAvatar, ListItemText, Avatar } from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport PersonIcon from '@mui/icons-material/Person';\nimport { USER_AGENT, ACL_READ } from '../../constants';\n\nconst useStyles = makeStyles(() => ({\n list: {\n padding: 0,\n width: '100%'\n },\n option: {\n padding: 0\n }\n}));\n\nconst AddPermissionsForm = ({ agents, addPermission }) => {\n const classes = useStyles();\n const translate = useTranslate();\n const [value, setValue] = useState(null);\n const [inputValue, setInputValue] = useState('');\n const [options, setOptions] = useState([]);\n\n const { data } = useGetList(\n 'Person',\n {\n pagination: { page: 1, perPage: 100 },\n sort: { field: 'pair:label', order: 'ASC' },\n filter: { q: inputValue }\n },\n {\n enabled: inputValue.length > 0\n }\n );\n\n useEffect(() => {\n setOptions(data?.length > 0 ? Object.values(data) : []);\n }, [data]);\n\n return (\n option['pair:label']}\n // Do not return agents which have already been added\n filterOptions={x => x.filter(agent => !Object.keys(agents).includes(agent.id))}\n options={options}\n noOptionsText={translate('ra.navigation.no_results')}\n autoComplete\n blurOnSelect\n clearOnBlur\n disableClearable\n value={value}\n onChange={(event, record) => {\n addPermission(record.id || record['@id'], USER_AGENT, ACL_READ);\n setValue(null);\n setInputValue('');\n setOptions([]);\n }}\n onInputChange={(event, newInputValue) => {\n setInputValue(newInputValue);\n }}\n renderInput={params => (\n \n )}\n renderOption={(props, option) => (\n \n \n \n \n \n \n \n \n \n \n )}\n />\n );\n};\n\nexport default AddPermissionsForm;\n","import React from 'react';\nimport { List } from '@mui/material';\nimport { styled } from '@mui/system';\nimport AgentItem from './AgentItem';\n\nconst StyledList = styled(List)(({ theme }) => ({\n width: '100%',\n maxWidth: '100%',\n backgroundColor: theme.palette.background.paper\n}));\n\nconst EditPermissionsForm = ({ isContainer, agents, addPermission, removePermission }) => {\n return (\n \n {Object.entries(agents).map(([agentId, agent]) => (\n \n ))}\n \n );\n};\n\nexport default EditPermissionsForm;\n","import React, { useState, useEffect } from 'react';\nimport { useDataProvider, useTranslate, Loading, Error } from 'react-admin';\nimport {\n Avatar,\n ListItem,\n ListItemIcon,\n ListItemAvatar,\n ListItemText,\n ListItemSecondaryAction,\n IconButton,\n Menu,\n MenuItem\n} from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport EditIcon from '@mui/icons-material/Edit';\nimport CheckIcon from '@mui/icons-material/Check';\nimport { GROUP_AGENT, USER_AGENT, ANONYMOUS_AGENT, resourceRightsLabels, containerRightsLabels } from '../../constants';\nimport AgentIcon from './AgentIcon';\n\nconst useStyles = makeStyles(() => ({\n listItem: {\n paddingLeft: 4,\n paddingRight: 36\n },\n primaryText: {\n width: '30%',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n },\n secondaryText: {\n textAlign: 'center',\n width: '60%',\n fontStyle: 'italic',\n color: 'grey'\n }\n}));\n\nconst AgentItem = ({ isContainer, agent, addPermission, removePermission }) => {\n const classes = useStyles();\n const translate = useTranslate();\n const dataProvider = useDataProvider();\n const [anchorEl, setAnchorEl] = React.useState(null);\n const [user, setUser] = useState();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState();\n\n useEffect(() => {\n if (agent.predicate === USER_AGENT) {\n dataProvider\n .getOne('Person', { id: agent.id })\n .then(({ data }) => {\n setUser(data);\n setLoading(false);\n })\n .catch(error => {\n setError(error);\n setLoading(false);\n });\n } else {\n setLoading(false);\n }\n }, [agent.id, agent.predicate]);\n\n // For now, do not display groups\n if (agent.predicate === GROUP_AGENT) return null;\n\n const openMenu = event => setAnchorEl(event.currentTarget);\n const closeMenu = () => setAnchorEl(null);\n\n const labels = isContainer ? containerRightsLabels : resourceRightsLabels;\n\n if (loading) return ;\n if (error) return ;\n\n return (\n \n \n \n \n \n \n \n translate(labels[p])).join(', ')}\n />\n \n \n \n \n \n {Object.entries(labels).map(([rightKey, rightLabel]) => {\n const hasPermission = agent.permissions && agent.permissions.includes(rightKey);\n return (\n {\n if (hasPermission) {\n removePermission(agent.id, agent.predicate, rightKey);\n } else {\n addPermission(agent.id, agent.predicate, rightKey);\n }\n closeMenu();\n }}\n >\n {hasPermission ? : null}\n \n \n );\n })}\n \n \n \n );\n};\n\nexport default AgentItem;\n","import React from 'react';\nimport PublicIcon from '@mui/icons-material/Public';\nimport VpnLockIcon from '@mui/icons-material/VpnLock';\nimport PersonIcon from '@mui/icons-material/Person';\nimport GroupIcon from '@mui/icons-material/Group';\nimport { CLASS_AGENT, GROUP_AGENT, USER_AGENT, ANONYMOUS_AGENT } from '../../constants';\n\nconst AgentIcon = ({ agent }) => {\n switch (agent.predicate) {\n case CLASS_AGENT:\n return agent.id === ANONYMOUS_AGENT ? : ;\n case USER_AGENT:\n return ;\n case GROUP_AGENT:\n return ;\n default:\n throw new Error(`Unknown agent predicate: ${agent.predicate}`);\n }\n};\n\nexport default AgentIcon;\n","import { useEffect, useCallback, useState } from 'react';\nimport { usePermissions, useAuthProvider } from 'react-admin';\nimport { defaultToArray } from '../utils';\nimport { CLASS_AGENT, GROUP_AGENT, USER_AGENT, ANONYMOUS_AGENT, AUTHENTICATED_AGENT } from '../constants';\n\nconst useAgents = uri => {\n const { permissions } = usePermissions(uri);\n const authProvider = useAuthProvider();\n const [agents, setAgents] = useState({});\n\n // Format list of authorized agents, based on the permissions returned for the resource\n useEffect(() => {\n const result = {\n [ANONYMOUS_AGENT]: {\n id: ANONYMOUS_AGENT,\n predicate: CLASS_AGENT,\n permissions: []\n },\n [AUTHENTICATED_AGENT]: {\n id: AUTHENTICATED_AGENT,\n predicate: CLASS_AGENT,\n permissions: []\n }\n };\n\n const appendPermission = (agentId, predicate, mode) => {\n if (result[agentId]) {\n result[agentId].permissions.push(mode);\n } else {\n result[agentId] = {\n id: agentId,\n predicate,\n permissions: [mode]\n };\n }\n };\n\n if (permissions) {\n for (const p of permissions) {\n if (p[CLASS_AGENT]) {\n defaultToArray(p[CLASS_AGENT]).forEach(agentId => appendPermission(agentId, CLASS_AGENT, p['acl:mode']));\n }\n if (p[USER_AGENT]) {\n defaultToArray(p[USER_AGENT]).forEach(userUri => appendPermission(userUri, USER_AGENT, p['acl:mode']));\n }\n if (p[GROUP_AGENT]) {\n defaultToArray(p[GROUP_AGENT]).forEach(groupUri => appendPermission(groupUri, GROUP_AGENT, p['acl:mode']));\n }\n }\n setAgents(result);\n }\n }, [permissions]);\n\n const addPermission = useCallback(\n (agentId, predicate, mode) => {\n const prevAgents = { ...agents };\n setAgents({\n ...agents,\n [agentId]: {\n id: agentId,\n predicate,\n permissions: agents[agentId] ? [...agents[agentId]?.permissions, mode] : [mode]\n }\n });\n authProvider.addPermission(uri, agentId, predicate, mode).catch(e => {\n // If there was an error, revert the optimistic update\n setAgents(prevAgents);\n });\n },\n [agents, setAgents, uri, authProvider]\n );\n\n const removePermission = useCallback(\n (agentId, predicate, mode) => {\n const prevAgents = { ...agents };\n setAgents(\n Object.fromEntries(\n Object.entries(agents)\n .map(([key, agent]) => {\n if (agent.id === agentId) {\n agent.permissions = agent.permissions.filter(m => m !== mode);\n }\n return [key, agent];\n })\n // Remove agents if they have no permissions (except if they are class agents)\n .filter(([_, agent]) => agent.predicate === CLASS_AGENT || agent.permissions.length > 0)\n )\n );\n authProvider.removePermission(uri, agentId, predicate, mode).catch(e => {\n // If there was an error, revert the optimistic update\n setAgents(prevAgents);\n });\n },\n [agents, setAgents, uri, authProvider]\n );\n\n return { agents, addPermission, removePermission };\n};\n\nexport default useAgents;\n","import React from 'react';\nimport { SaveButton, Toolbar, ToolbarProps } from 'react-admin';\nimport { styled } from '@mui/material/styles';\nimport DeleteButtonWithPermissions from './DeleteButtonWithPermissions';\n\nconst StyledToolbar = styled(Toolbar)(() => ({\n flex: 1,\n display: 'flex',\n justifyContent: 'space-between'\n}));\n\nconst EditToolbarWithPermissions: React.FunctionComponent = props => (\n \n \n \n \n);\n\nexport default EditToolbarWithPermissions;\n","import React from 'react';\nimport { DeleteButton, useGetRecordId, usePermissions } from 'react-admin';\nimport { rightsToDelete } from '../../constants';\n\nconst DeleteButtonWithPermissions = props => {\n const recordId = useGetRecordId();\n const { permissions, isLoading } = usePermissions(recordId);\n if (!isLoading && permissions?.some(p => rightsToDelete.includes(p['acl:mode']))) {\n return ;\n }\n return null;\n};\n\nexport default DeleteButtonWithPermissions;\n","import React from 'react';\nimport { EditButton, useGetRecordId, usePermissions } from 'react-admin';\nimport { rightsToEdit } from '../../constants';\n\nconst EditButtonWithPermissions = props => {\n const recordId = useGetRecordId();\n const { permissions, isLoading } = usePermissions(recordId);\n if (!isLoading && permissions?.some(p => rightsToEdit.includes(p['acl:mode']))) {\n return ;\n }\n return null;\n};\n\nexport default EditButtonWithPermissions;\n","import React from 'react';\nimport { List } from 'react-admin';\nimport ListActionsWithPermissions from './ListActionsWithPermissions';\n\nconst ListWithPermissions = props => ;\n\nListWithPermissions.defaultProps = {\n actions: \n};\n\nexport default ListWithPermissions;\n","import React from 'react';\nimport {\n CreateButton,\n ExportButton,\n useResourceDefinition,\n TopToolbar,\n usePermissions,\n useResourceContext\n} from 'react-admin';\nimport { useMediaQuery } from '@mui/material';\nimport { useCreateContainer } from '@semapps/semantic-data-provider';\nimport PermissionsButton from '../../components/PermissionsButton/PermissionsButton';\nimport { rightsToCreate, rightsToControl } from '../../constants';\n\n// Do not show Export and Refresh buttons on mobile\nconst ListActionsWithPermissions = ({\n bulkActions,\n sort,\n displayedFilters,\n exporter,\n filters,\n filterValues,\n onUnselectItems,\n selectedIds,\n showFilter,\n total\n}) => {\n const resource = useResourceContext();\n const xs = useMediaQuery(theme => theme.breakpoints.down('xs'));\n const resourceDefinition = useResourceDefinition();\n const createContainerUri = useCreateContainer(resource);\n const { permissions } = usePermissions(createContainerUri);\n return (\n \n {filters &&\n React.cloneElement(filters, {\n showFilter,\n displayedFilters,\n filterValues,\n context: 'button'\n })}\n {resourceDefinition.hasCreate && permissions && permissions.some(p => rightsToCreate.includes(p['acl:mode'])) && (\n \n )}\n {permissions && permissions.some(p => rightsToControl.includes(p['acl:mode'])) && (\n \n )}\n {!xs && exporter !== false && (\n \n )}\n {bulkActions &&\n React.cloneElement(bulkActions, {\n filterValues,\n selectedIds,\n onUnselectItems\n })}\n \n );\n};\n\nexport default ListActionsWithPermissions;\n","import React from 'react';\nimport { Show, useGetRecordId } from 'react-admin';\nimport ShowActionsWithPermissions from './ShowActionsWithPermissions';\nimport useCheckPermissions from '../../hooks/useCheckPermissions';\n\nconst ShowWithPermissions = props => {\n const recordId = useGetRecordId();\n useCheckPermissions(recordId, 'show');\n return ;\n};\n\nShowWithPermissions.defaultProps = {\n actions: \n};\n\nexport default ShowWithPermissions;\n","import React from 'react';\nimport {\n EditButton,\n ListButton,\n TopToolbar,\n usePermissions,\n useResourceDefinition,\n useRecordContext,\n useResourceContext\n} from 'react-admin';\nimport { useCreateContainerUri } from '@semapps/semantic-data-provider';\nimport PermissionsButton from '../../components/PermissionsButton/PermissionsButton';\nimport { rightsToControl, rightsToEdit, rightsToList } from '../../constants';\nimport { Permissions } from '../../types';\n\nconst ShowActionsWithPermissions = () => {\n const { hasList, hasEdit } = useResourceDefinition();\n const record = useRecordContext();\n const { permissions } = usePermissions(record?.id);\n\n const resource = useResourceContext();\n const containerUri = useCreateContainerUri()(resource);\n const { permissions: containerPermissions } = usePermissions(containerUri);\n\n return (\n \n {hasList && containerPermissions && containerPermissions.some(p => rightsToList.includes(p['acl:mode'])) && (\n \n )}\n {hasEdit && permissions && permissions.some(p => rightsToEdit.includes(p['acl:mode'])) && }\n {permissions && permissions.some(p => rightsToControl.includes(p['acl:mode'])) && }\n \n );\n};\n\nexport default ShowActionsWithPermissions;\n","import React from 'react';\nimport { useLogin, useTranslate } from 'react-admin';\nimport { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from '@mui/material';\n\nconst AuthDialog = ({ open, onClose, title, message, redirect, ...rest }) => {\n const login = useLogin();\n const translate = useTranslate();\n return (\n \n {translate(title)}\n \n {translate(message)}\n \n \n \n login({ redirect: redirect || window.location.pathname + window.location.search })}\n color=\"primary\"\n variant=\"contained\"\n >\n {translate('auth.action.login')}\n \n \n \n );\n};\n\nAuthDialog.defaultProps = {\n title: 'auth.dialog.login_required',\n message: 'auth.message.login_to_continue'\n};\n\nexport default AuthDialog;\n","import React, { useRef, useEffect } from 'react';\nimport jwtDecode from 'jwt-decode';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport { useDataProvider, useAuthProvider, useLogin, useGetIdentity, useNotify } from 'react-admin';\nimport { Card, Avatar, Typography, Button, CardActions } from '@mui/material';\nimport { styled } from '@mui/material/styles';\nimport LockIcon from '@mui/icons-material/Lock';\n\nconst delay = async t => new Promise(resolve => setTimeout(resolve, t));\n\n// Inspired from https://github.com/marmelab/react-admin/blob/master/packages/ra-ui-materialui/src/auth/Login.tsx\nconst SsoLoginPage = ({ children, backgroundImage, buttons, userResource, propertiesExist, text, ...rest }) => {\n const containerRef = useRef();\n let backgroundImageLoaded = false;\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const { data: identity, isLoading } = useGetIdentity();\n\n const notify = useNotify();\n const login = useLogin();\n const dataProvider = useDataProvider();\n const authProvider = useAuthProvider();\n\n useEffect(() => {\n if (!isLoading && identity?.id) {\n // Already authenticated, redirect to the home page\n navigate(searchParams.get('redirect') || '/');\n }\n }, [identity, isLoading, navigate, searchParams]);\n\n useEffect(() => {\n (async () => {\n if (searchParams.has('login')) {\n if (searchParams.has('error')) {\n if (searchParams.get('error') === 'registration.not-allowed') {\n notify('auth.message.user_email_not_found', { type: 'error' });\n } else {\n notify('auth.message.bad_request', { type: 'error', messageArgs: { error: searchParams.get('error') } });\n }\n } else if (searchParams.has('token')) {\n const token = searchParams.get('token');\n const { webId } = jwtDecode(token);\n\n localStorage.setItem('token', token);\n\n let userData;\n ({ data: userData } = await dataProvider.getOne(userResource, { id: webId }));\n\n if (propertiesExist.length > 0) {\n let allPropertiesExist = propertiesExist.every(p => userData[p]);\n while (!allPropertiesExist) {\n console.log('Waiting for all properties to have been created', propertiesExist);\n await delay(500);\n ({ data: userData } = await dataProvider.getOne(userResource, { id: webId }));\n allPropertiesExist = propertiesExist.every(p => userData[p]);\n }\n }\n\n if (!authProvider.checkUser(userData)) {\n localStorage.removeItem('token');\n notify('auth.message.user_not_allowed_to_login', { type: 'error' });\n navigate.replace('/login');\n } else if (searchParams.has('redirect')) {\n notify('auth.message.user_connected', { type: 'info' });\n window.location.href = searchParams.get('redirect');\n } else if (searchParams.has('new') && searchParams.get('new') === 'true') {\n notify('auth.message.new_user_created', { type: 'info' });\n window.location.href = `/${userResource}/${encodeURIComponent(webId)}`;\n } else {\n notify('auth.message.user_connected', { type: 'info' });\n window.location.href = '/';\n }\n }\n }\n\n if (searchParams.has('logout')) {\n // Delete token and any other value in local storage\n localStorage.clear();\n notify('auth.message.user_disconnected', { type: 'info' });\n navigate('/');\n }\n })();\n }, [searchParams, navigate, notify, userResource]);\n\n const updateBackgroundImage = () => {\n if (!backgroundImageLoaded && containerRef.current) {\n containerRef.current.style.backgroundImage = `url(${backgroundImage})`;\n backgroundImageLoaded = true;\n }\n };\n\n // Load background image asynchronously to speed up time to interactive\n const lazyLoadBackgroundImage = () => {\n if (backgroundImage) {\n const img = new Image();\n img.onload = updateBackgroundImage;\n img.src = backgroundImage;\n }\n };\n\n useEffect(() => {\n if (!backgroundImageLoaded) {\n lazyLoadBackgroundImage();\n }\n });\n\n if (isLoading) return null;\n\n return (\n \n \n
\n \n \n \n
\n {text && {text}}\n {buttons?.map((button, i) => (\n \n {React.cloneElement(button, {\n fullWidth: true,\n variant: 'outlined',\n type: 'submit',\n onClick: () => login({}, '/login')\n })}\n \n ))}\n
\n
\n );\n};\n\nconst PREFIX = 'SsoLoginPage';\n\nexport const SsoLoginPageClasses = {\n card: `${PREFIX}-card`,\n avatar: `${PREFIX}-avatar`,\n icon: `${PREFIX}-icon`,\n switch: `${PREFIX}-switch`\n};\n\nconst Root = styled('div', {\n name: PREFIX,\n overridesResolver: (props, styles) => styles.root\n})(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n minHeight: '100vh',\n height: '1px',\n alignItems: 'center',\n justifyContent: 'flex-start',\n backgroundRepeat: 'no-repeat',\n backgroundSize: 'cover',\n backgroundImage: 'radial-gradient(circle at 50% 14em, #313264 0%, #00023b 60%, #00023b 100%)',\n [`& .${SsoLoginPageClasses.card}`]: {\n minWidth: 300,\n marginTop: '6em'\n },\n [`& .${SsoLoginPageClasses.avatar}`]: {\n margin: '1em',\n display: 'flex',\n justifyContent: 'center'\n },\n [`& .${SsoLoginPageClasses.icon}`]: {\n backgroundColor: theme.palette.secondary[500]\n },\n [`& .${SsoLoginPageClasses.switch}`]: {\n marginBottom: '1em',\n display: 'flex',\n justifyContent: 'center'\n }\n}));\n\nSsoLoginPage.defaultProps = {\n propertiesExist: [],\n // TODO deprecate this\n buttons: [],\n userResource: 'Person'\n};\n\nexport default SsoLoginPage;\n","import { useEffect, useMemo } from 'react';\nimport { Link, useSearchParams } from 'react-router-dom';\nimport { useTranslate, useGetIdentity } from 'react-admin';\nimport { Box, Card, Typography } from '@mui/material';\nimport LockIcon from '@mui/icons-material/Lock';\nimport SignupForm from './SignupForm';\nimport LoginForm from './LoginForm';\nimport NewPasswordForm from './NewPasswordForm';\nimport ResetPasswordForm from './ResetPasswordForm';\nimport SimpleBox from './SimpleBox';\nimport { defaultScorer } from '../../passwordScorer';\nimport getSearchParamsRest from './getSearchParamsRest';\n\n/**\n * @param {object} props Props\n * @param {boolean} props.hasSignup If to show signup form.\n * @param {boolean} props.allowUsername Indicates, if login is allowed with username (instead of email).\n * @param {function} props.onLogin Optional function to call when login is completed\n * @param {function} props.onSignup Optional function to call when signup is completed\n * @param {object} props.additionalSignupValues\n * @param {object} props.passwordScorer Scorer to evaluate and indicate password strength.\n * Set to `null` or `false`, if you don't want password strength checks. Default is\n * passwordStrength's `defaultScorer`.\n * @returns\n */\nconst LocalLoginPage = ({\n hasSignup,\n allowUsername,\n onLogin,\n onSignup,\n additionalSignupValues,\n passwordScorer = defaultScorer\n}) => {\n const translate = useTranslate();\n const [searchParams] = useSearchParams();\n const isSignup = hasSignup && searchParams.has('signup');\n const isResetPassword = searchParams.has('reset_password');\n const isNewPassword = searchParams.has('new_password');\n const isLogin = !isSignup && !isResetPassword && !isNewPassword;\n const redirectTo = searchParams.get('redirect') || '/';\n const { data: identity, isLoading } = useGetIdentity();\n\n useEffect(() => {\n (async () => {\n if (!isLoading && identity?.id) {\n if (onLogin) {\n onLogin(redirectTo);\n } else {\n window.location.href = redirectTo;\n }\n }\n })();\n }, [identity, isLoading, redirectTo, onLogin]);\n\n const [title, text] = useMemo(() => {\n if (isSignup) {\n return ['auth.action.signup', 'auth.helper.signup'];\n }\n if (isLogin) {\n return ['auth.action.login', 'auth.helper.login'];\n }\n if (isResetPassword) {\n return ['auth.action.reset_password', 'auth.helper.reset_password'];\n }\n if (isNewPassword) {\n return ['auth.action.set_new_password', 'auth.helper.set_new_password'];\n }\n }, [isSignup, isLogin, isResetPassword, isNewPassword]);\n\n if (isLoading || identity?.id) return null;\n\n return (\n }>\n \n {isLogin && }\n {isSignup && (\n \n )}\n {isResetPassword && }\n {isNewPassword && }\n \n {(isSignup || isResetPassword) && (\n \n {translate('auth.action.login')}\n \n )}\n {isLogin && (\n <>\n {hasSignup && (\n
\n \n {translate('auth.action.signup')}\n \n
\n )}\n
\n \n {translate('auth.action.reset_password')}\n \n
\n \n )}\n
\n
\n
\n );\n};\n\nLocalLoginPage.defaultProps = {\n hasSignup: true,\n allowUsername: false,\n additionalSignupValues: {}\n};\n\nexport default LocalLoginPage;\n","import React, { useCallback, useState } from 'react';\nimport createSlug from 'speakingurl';\nimport {\n Form,\n useTranslate,\n useNotify,\n useSafeSetState,\n TextInput,\n minLength,\n required,\n email,\n useLocaleState\n} from 'react-admin';\nimport { useSearchParams } from 'react-router-dom';\nimport { Button, CardContent, Typography } from '@mui/material';\nimport useSignup from '../../hooks/useSignup';\nimport validatePasswordStrength from './validatePasswordStrength';\nimport PasswordStrengthIndicator from './PasswordStrengthIndicator';\nimport { defaultScorer } from '../../passwordScorer';\n\n/**\n * @param {function} props.onSignup Optional function to call when signup is completed\n * @param {object} props.additionalSignupValues\n * @param {number} delayBeforeRedirect\n * @param {object} passwordScorer Scorer to evaluate and indicate password strength.\n * Set to `null` or `false`, if you don't want password strength checks. Default is\n * passwordStrength's `defaultScorer`.\n * @returns\n */\nconst SignupForm = ({ passwordScorer = defaultScorer, onSignup, additionalSignupValues, delayBeforeRedirect = 0 }) => {\n const [loading, setLoading] = useSafeSetState(false);\n const signup = useSignup();\n const translate = useTranslate();\n const notify = useNotify();\n const [searchParams] = useSearchParams();\n const redirectTo = searchParams.get('redirect') || '/';\n const [locale] = useLocaleState();\n const [password, setPassword] = useState('');\n\n const submit = useCallback(\n async values => {\n try {\n setLoading(true);\n await signup({\n ...values,\n ...additionalSignupValues\n });\n setTimeout(() => {\n if (onSignup) {\n onSignup(redirectTo);\n } else {\n window.location.href = redirectTo;\n }\n }, delayBeforeRedirect);\n } catch (error) {\n setLoading(false);\n notify(\n typeof error === 'string'\n ? error\n : typeof error === 'undefined' || !error.message\n ? 'ra.auth.sign_in_error'\n : error.message,\n {\n type: 'warning',\n _: typeof error === 'string' ? error : error && error.message ? error.message : undefined\n }\n );\n }\n },\n [setLoading, signup, additionalSignupValues, redirectTo, notify, onSignup]\n );\n\n return (\n
\n \n \n value\n ? createSlug(value, {\n lang: locale || 'fr',\n separator: '_',\n custom: ['.', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']\n })\n : ''\n }\n />\n \n {passwordScorer && password && !(searchParams.has('email') && searchParams.has('force-email')) && (\n <>\n \n {translate('auth.input.password_strength')}:{' '}\n \n \n \n )}\n setPassword(e.target.value)}\n label={translate('ra.auth.password')}\n autoComplete=\"new-password\"\n fullWidth\n disabled={loading || (searchParams.has('email') && searchParams.has('force-email'))}\n validate={[required(), validatePasswordStrength(passwordScorer)]}\n />\n \n \n
\n );\n};\n\nSignupForm.defaultValues = {\n redirectTo: '/',\n additionalSignupValues: {}\n};\n\nexport default SignupForm;\n","import { useCallback } from 'react';\nimport { useAuthProvider } from 'react-admin';\n\nconst useSignup = () => {\n const authProvider = useAuthProvider();\n\n return useCallback((params = {}) => authProvider.signup(params), [authProvider]);\n};\n\nexport default useSignup;\n","import { defaultScorer } from '../../passwordScorer';\n\nconst validatePasswordStrength = (scorer = defaultScorer) => value => {\n if (!scorer) return undefined;\n const strength = scorer.scoreFn(value);\n if (strength < scorer.minRequiredScore) {\n return 'auth.input.password_too_weak';\n }\n return undefined;\n};\n\nexport default validatePasswordStrength;\n","// Inspired by https://github.com/bartlomiejzuber/password-strength-score\n\n/**\n * @typedef PasswordStrengthOptions\n * @property {number} isVeryLongLength - Required characters for a very long password (default: 12)\n * @property {number} isLongLength - Required characters for a long password (default: 6)\n * @property {number} isVeryLongScore - Score for a very long password (default: 2.5)\n * @property {number} isLongScore - Score for a long password (default: 1.5)\n * @property {number} uppercaseScore - Score for a password with uppercase letters (default: 1)\n * @property {number} lowercaseScore - Score for a password with lowercase letters (default: 1)\n * @property {number} numbersScore - Score for a password with numbers (default: 1)\n * @property {number} nonAlphanumericsScore - Score for a password without non-alphanumeric characters (default: 1)\n */\n\n/** @type {PasswordStrengthOptions} */\nexport const defaultOptions = {\n isVeryLongLength: 14,\n isLongLength: 8,\n isLongScore: 2,\n isVeryLongScore: 4,\n uppercaseScore: 1,\n lowercaseScore: 1,\n numbersScore: 1,\n nonAlphanumericsScore: 1\n};\n\n/**\n *\n * @param {string} password Password text.\n * @param {PasswordStrengthOptions} options Password options.\n * @returns {number} The password strength score.\n */\nexport const passwordStrength = (password, options) => {\n if (!password) {\n return 0;\n }\n\n const mergedOptions = { ...defaultOptions, ...options };\n\n const longScore = (password.length >= mergedOptions.isLongLength && mergedOptions.isLongScore) || 0;\n const veryLongScore = (password.length >= mergedOptions.isVeryLongLength && mergedOptions.isVeryLongScore) || 0;\n const lowercaseScore = (/[a-z]/.test(password) && mergedOptions.lowercaseScore) || 0;\n const uppercaseScore = (/[A-Z]/.test(password) && mergedOptions.uppercaseScore) || 0;\n const numbersScore = (/\\d/.test(password) && mergedOptions.numbersScore) || 0;\n const nonalphasScore = (/\\W/.test(password) && mergedOptions.nonAlphanumericsScore) || 0;\n\n return uppercaseScore + lowercaseScore + numbersScore + nonalphasScore + longScore + veryLongScore;\n};\n\nexport const createPasswordScorer = (options = defaultOptions, minRequiredScore = 5) => {\n const mergedOptions = { ...defaultOptions, ...options };\n\n return {\n scoreFn: password => passwordStrength(password, mergedOptions),\n minRequiredScore,\n maxScore:\n mergedOptions.uppercaseScore +\n mergedOptions.lowercaseScore +\n mergedOptions.numbersScore +\n mergedOptions.nonAlphanumericsScore +\n mergedOptions.isLongScore +\n mergedOptions.isVeryLongScore\n };\n};\n\nexport const defaultScorer = createPasswordScorer(defaultOptions, 5);\n","import React from 'react';\nimport ColorGradientProgressBar from './ColorGradientProgressBar';\nimport { defaultScorer } from '../../passwordScorer';\n\nexport default function PasswordStrengthIndicator({ scorer = defaultScorer, password, ...restProps }) {\n const strength = scorer.scoreFn(password);\n return ;\n}\n","import React from 'react';\nimport { LinearProgress } from '@mui/material';\nimport { withStyles } from '@mui/styles';\n\n/**\n * @typedef {object} Color\n * @property {number} red\n * @property {number} green\n * @property {number} blue\n */\n\n/**\n * Calculate a rgb-color from a gradient between `color1` and `color2`\n * @param {number} fade - Indicates the fade between `color1` and `color2` in the range [0, 1].\n * @param {Color} color1\n * @param {Color} color2\n * @returns {string} `` `rgb(${red}, ${green}, ${blue})` ``\n */\nconst colorGradient = (fade, color1, color2) => {\n const diffRed = color2.red - color1.red;\n const diffGreen = color2.green - color1.green;\n const diffBlue = color2.blue - color1.blue;\n\n const gradient = {\n red: Math.floor(color1.red + diffRed * fade),\n green: Math.floor(color1.green + diffGreen * fade),\n blue: Math.floor(color1.blue + diffBlue * fade)\n };\n\n return `rgb(${gradient.red},${gradient.green},${gradient.blue})`;\n};\n\n/**\n * A progress bar that changes its color between its min an max value.\n * @param {object} props\n * @param {Color} [props.badColor] - default: `#FF4047`\n * @param {Color} [props.goodColor] - default: `#00FF6E`\n * @param {number} props.maxVal\n * @param {number} props.minVal\n * @param {number} props.currentVal\n */\nexport default function ColorGradientProgressBar(props) {\n const { minVal, maxVal, currentVal, badColor, goodColor, ...restProps } = props;\n\n const color1 = badColor || { red: 0xff, green: 0x40, blue: 0x47 };\n const color2 = goodColor || { red: 0x00, green: 0xff, blue: 0x6e };\n\n const fade = Math.max(0, Math.min(1, (currentVal - minVal) / (maxVal - minVal)));\n const currentColor = colorGradient(fade, color1, color2);\n\n const StyledLinearProgress = withStyles({\n colorPrimary: {\n backgroundColor: 'black' // '#e0e0e0'\n },\n barColorPrimary: {\n backgroundColor: currentColor\n }\n })(LinearProgress);\n\n return ;\n}\n","import React, { useCallback } from 'react';\nimport { Form, useTranslate, useNotify, useSafeSetState, TextInput, required, email, useLogin } from 'react-admin';\nimport { useSearchParams } from 'react-router-dom';\nimport { Button, CardContent } from '@mui/material';\n\nconst LoginForm = ({ onLogin, allowUsername }) => {\n const [loading, setLoading] = useSafeSetState(false);\n const login = useLogin();\n const translate = useTranslate();\n const notify = useNotify();\n const [searchParams] = useSearchParams();\n const redirectTo = searchParams.get('redirect') || '/';\n\n const submit = useCallback(\n async values => {\n try {\n setLoading(true);\n await login(values);\n if (onLogin) {\n onLogin(redirectTo);\n } else {\n window.location.href = redirectTo;\n }\n } catch (error) {\n setLoading(false);\n notify(\n typeof error === 'string'\n ? error\n : typeof error === 'undefined' || !error.message\n ? 'ra.auth.sign_in_error'\n : error.message,\n {\n type: 'warning',\n messageArgs: {\n _: typeof error === 'string' ? error : error && error.message ? error.message : undefined\n }\n }\n );\n }\n },\n [setLoading, login, redirectTo, notify, onLogin]\n );\n\n return (\n
\n \n (value ? value.toLowerCase() : '')}\n validate={allowUsername ? [required()] : [required(), email()]}\n />\n \n \n \n
\n );\n};\n\nLoginForm.defaultValues = {\n allowUsername: false\n};\n\nexport default LoginForm;\n","import React, { useState } from 'react';\nimport { Form, useTranslate, useNotify, useSafeSetState, useAuthProvider, TextInput, required } from 'react-admin';\nimport { useLocation } from 'react-router-dom';\nimport { Button, CardContent, Typography } from '@mui/material';\nimport PasswordStrengthIndicator from './PasswordStrengthIndicator';\nimport validatePasswordStrength from './validatePasswordStrength';\nimport { defaultScorer } from '../../passwordScorer';\n\nconst samePassword = (value, allValues) => {\n if (value && value !== allValues.password) {\n return 'Mot de passe différent du premier';\n }\n};\n\n/**\n *\n * @param {string} redirectTo\n * @param {Object} passwordScorer Scorer to evaluate and indicate password strength.\n * Set to `null` or `false`, if you don't want password strength checks. Default is\n * passwordStrength's `defaultScorer`.\n * @returns\n */\nconst NewPasswordForm = ({ redirectTo, passwordScorer = defaultScorer }) => {\n const location = useLocation();\n const searchParams = new URLSearchParams(location.search);\n const token = searchParams.get('token');\n\n const [loading, setLoading] = useSafeSetState(false);\n const authProvider = useAuthProvider();\n\n const translate = useTranslate();\n const notify = useNotify();\n\n const [newPassword, setNewPassword] = useState('');\n\n const submit = values => {\n setLoading(true);\n authProvider\n .setNewPassword({ ...values, token })\n .then(() => {\n setTimeout(() => {\n const url = new URL('/login', window.location.origin);\n if (redirectTo) url.searchParams.append('redirect', redirectTo);\n url.searchParams.append('email', values.email);\n window.location.href = url.toString();\n setLoading(false);\n }, 2000);\n notify('auth.notification.password_changed', { type: 'info' });\n })\n .catch(error => {\n setLoading(false);\n notify(\n typeof error === 'string'\n ? error\n : typeof error === 'undefined' || !error.message\n ? 'auth.notification.reset_password_error'\n : error.message,\n {\n type: 'warning',\n messageArgs: {\n _: typeof error === 'string' ? error : error && error.message ? error.message : undefined\n }\n }\n );\n });\n };\n\n return (\n
\n \n (value ? value.toLowerCase() : '')}\n />\n {passwordScorer && (\n <>\n \n {translate('auth.input.password_strength')}:{' '}\n \n\n \n \n )}\n setNewPassword(e.target.value)}\n />\n \n \n \n
\n );\n};\n\nexport default NewPasswordForm;\n","import React from 'react';\nimport { Form, TextInput, required, useTranslate, useNotify, useSafeSetState, useAuthProvider } from 'react-admin';\nimport { Button, CardContent } from '@mui/material';\n\nconst ResetPasswordForm = () => {\n const [loading, setLoading] = useSafeSetState(false);\n const authProvider = useAuthProvider();\n const translate = useTranslate();\n const notify = useNotify();\n\n const submit = values => {\n setLoading(true);\n authProvider\n .resetPassword({ ...values })\n .then(res => {\n setLoading(false);\n notify('auth.notification.reset_password_submitted', { type: 'info' });\n })\n .catch(error => {\n setLoading(false);\n notify(\n typeof error === 'string'\n ? error\n : typeof error === 'undefined' || !error.message\n ? 'auth.notification.reset_password_error'\n : error.message,\n {\n type: 'warning',\n messageArgs: {\n _: typeof error === 'string' ? error : error && error.message ? error.message : undefined\n }\n }\n );\n });\n };\n\n return (\n
\n \n (value ? value.toLowerCase() : '')}\n />\n \n \n
\n );\n};\n\nexport default ResetPasswordForm;\n","import React from 'react';\nimport { Box, Card, Typography } from '@mui/material';\nimport { Notification } from 'react-admin';\nimport makeStyles from '@mui/styles/makeStyles';\n\nconst useStyles = makeStyles(theme => ({\n '@global': {\n body: {\n backgroundColor: theme.palette.secondary.main\n }\n },\n root: {\n backgroundColor: theme.palette.secondary.main,\n [theme.breakpoints.down('sm')]: {\n padding: '1em'\n }\n },\n card: {\n width: '100%',\n maxWidth: 450,\n marginTop: '6em'\n },\n icon: {\n marginTop: 5,\n marginRight: 5\n },\n title: {\n [theme.breakpoints.down('sm')]: {\n fontWeight: 'bold',\n marginTop: 12\n }\n }\n}));\n\nconst SimpleBox = ({ title, icon, text, children }) => {\n const classes = useStyles();\n return (\n \n \n \n {icon && React.cloneElement(icon, { fontSize: 'large', className: classes.icon })}\n \n {title}\n \n \n \n {text}\n \n {children}\n \n \n \n );\n};\n\nexport default SimpleBox;\n","const USED_SEARCH_PARAMS = ['signup', 'reset_password', 'new_password', 'email', 'force-email'];\n\nconst getSearchParamsRest = searchParams => {\n const rest = [];\n for (const [key, value] of searchParams.entries()) {\n if (!USED_SEARCH_PARAMS.includes(key)) {\n rest.push(`${key}=${encodeURIComponent(value)}`);\n }\n }\n return rest.length > 0 ? rest.join('&') : '';\n};\n\nexport default getSearchParamsRest;\n","import React from 'react';\nimport { Resource, usePermissions } from 'react-admin';\nimport { useCreateContainer } from '@semapps/semantic-data-provider';\nimport { rightsToCreate } from '../constants';\n\n// Not used for now. The ListWithPermissions component will handle the conditional display of the Create button.\nconst ResourceWithPermission = ({ name, create, ...rest }) => {\n const createContainer = useCreateContainer(name);\n const { permissions } = usePermissions(createContainer);\n return (\n rightsToCreate.includes(p['acl:mode'])) ? create : undefined}\n // Requesting permissions to list container is too long, we will avoid that for now\n // list={permissions && permissions.some(p => rightsToList.includes(p['acl:mode'])) ? list : undefined}\n />\n );\n};\n\nexport default ResourceWithPermission;\n","import React, { forwardRef, useCallback } from 'react';\nimport { Logout, UserMenu as RaUserMenu, useGetIdentity, useTranslate, useUserMenu } from 'react-admin';\nimport { MenuItem, ListItemIcon, ListItemText } from '@mui/material';\nimport AccountCircleIcon from '@mui/icons-material/AccountCircle';\nimport EditIcon from '@mui/icons-material/Edit';\nimport { useNavigate } from 'react-router-dom';\n\n// It's important to pass the ref to allow Material UI to manage the keyboard navigation\nconst UserMenuItem = forwardRef(({ label, icon, to, ...rest }, ref) => {\n const { onClose } = useUserMenu();\n const translate = useTranslate();\n const navigate = useNavigate();\n const onClick = useCallback(() => {\n navigate(to);\n onClose();\n }, [to, onClose, navigate]);\n return (\n \n {icon && {React.cloneElement(icon, { fontSize: 'small' })}}\n {translate(label)}\n \n );\n});\n\nconst UserMenu = ({ logout, profileResource, ...otherProps }) => {\n const { data: identity } = useGetIdentity();\n return (\n \n {identity && identity.id !== ''\n ? [\n }\n to={`/${profileResource}/${encodeURIComponent(identity?.profileData?.id || identity.id)}/show`}\n />,\n }\n to={`/${profileResource}/${encodeURIComponent(identity?.profileData?.id || identity.id)}`}\n />,\n React.cloneElement(logout, { key: 'logout' })\n ]\n : [\n ,\n \n ]}\n \n );\n};\n\nUserMenu.defaultProps = {\n logout: ,\n profileResource: 'Person'\n};\n\nexport default UserMenu;\n","import { useEffect } from 'react';\nimport { useGetIdentity, useNotify, useRedirect } from 'react-admin';\nimport { useLocation } from 'react-router-dom';\n\nconst useCheckAuthenticated = message => {\n const { data: identity, isLoading } = useGetIdentity();\n const notify = useNotify();\n const redirect = useRedirect();\n const location = useLocation();\n\n useEffect(() => {\n if (!isLoading && !identity?.id) {\n notify(message || 'ra.auth.auth_check_error', { type: 'error' });\n redirect(`/login?redirect=${encodeURIComponent(location.pathname + location.search)}`);\n }\n }, [isLoading, identity, redirect, notify, location]);\n\n return { identity, isLoading };\n};\n\nexport default useCheckAuthenticated;\n","import { useEffect, useCallback } from 'react';\nimport isEqual from 'lodash/isEqual';\nimport { useGetPermissions, useSafeSetState } from 'react-admin';\n\nconst emptyParams = {};\n\n// keep a cache of already fetched permissions to initialize state for new\n// components and avoid a useless rerender if the permissions haven't changed\nconst alreadyFetchedPermissions = { '{}': undefined };\n\n// Fork of usePermissionsOptimized, with a refetch option\nconst usePermissionsWithRefetch = (params = emptyParams) => {\n const key = JSON.stringify(params);\n const [state, setState] = useSafeSetState({\n permissions: alreadyFetchedPermissions[key]\n });\n const getPermissions = useGetPermissions();\n\n const fetchPermissions = useCallback(\n () =>\n getPermissions(params)\n .then(permissions => {\n if (!isEqual(permissions, state.permissions)) {\n alreadyFetchedPermissions[key] = permissions;\n setState({ permissions });\n }\n })\n .catch(error => {\n setState({\n error\n });\n }),\n [key, params, getPermissions]\n );\n\n useEffect(() => {\n fetchPermissions();\n }, [key]);\n\n return { ...state, refetch: fetchPermissions };\n};\n\nexport default usePermissionsWithRefetch;\n","const englishMessages = {\n auth: {\n dialog: {\n container_permissions: 'Container permissions',\n resource_permissions: 'Resource permissions',\n login_required: 'Login required'\n },\n action: {\n submit: 'Submit',\n permissions: 'Permissions',\n signup: 'Signup',\n reset_password: 'Reset password',\n set_new_password: 'Set new password',\n logout: 'Logout',\n login: 'Login',\n view_my_profile: 'View my profile',\n edit_my_profile: 'Edit my profile'\n },\n right: {\n resource: {\n read: 'Read',\n append: 'Append',\n write: 'Write',\n control: 'Control'\n },\n container: {\n read: 'List',\n append: 'Add',\n write: 'Add',\n control: 'Control'\n }\n },\n agent: {\n anonymous: 'All users',\n authenticated: 'Connected users'\n },\n input: {\n agent_select: 'Add an user...',\n name: 'Surname',\n username: 'User ID',\n email: 'Email address',\n username_or_email: 'User ID or email address',\n current_password: 'Current password',\n new_password: 'New password',\n confirm_new_password: 'Confirm new password',\n password_strength: 'Password strength',\n password_too_weak: 'Password too weak. Increase length or add special characters.'\n },\n helper: {\n login: 'Sign in to your account',\n signup: 'Create your account',\n reset_password: 'Enter your email address below and we will send you a link to reset your password',\n set_new_password: 'Please enter your email address and a new password below'\n },\n message: {\n resource_show_forbidden: 'You are not allowed to view this resource',\n resource_edit_forbidden: 'You are not allowed to edit this resource',\n resource_delete_forbidden: 'You are not allowed to delete this resource',\n resource_control_forbidden: 'You are not allowed to control this resource',\n container_create_forbidden: 'You are not allowed to create new resource',\n container_list_forbidden: 'You are not allowed to list these resources',\n unable_to_fetch_user_data: 'Unable to fetch user data',\n no_token_returned: 'No token returned',\n no_associated_oidc_issuer: 'No OIDC issuer associated with the provided WebID',\n invalid_token_returned: 'Invalid token returned',\n signup_error: 'Account registration failed',\n user_not_allowed_to_login: 'You are not allowed to login with this account',\n user_email_not_found: 'No account found with this email address',\n user_email_exist: 'An account already exist with this email address',\n username_exist: 'An account already exist with this user ID',\n username_invalid: 'This username is invalid. Only lowercase characters, numbers, dots and hyphens are authorized',\n new_user_created: 'Your account has been successfully created',\n user_connected: 'You are now connected',\n user_disconnected: 'You are now disconnected',\n bad_request: 'Bad request (Error message returned by the server: %{error})',\n account_settings_updated: 'Your account settings have been successfully updated',\n login_to_continue: 'Please login to continue',\n choose_pod_provider:\n 'Please choose a Pod provider in the list below. All application data will be saved on your Pod.',\n unreachable_auth_server: 'The authentication server cannot be reached'\n },\n notification: {\n reset_password_submitted: 'An email has been sent with reset password instructions',\n reset_password_error: 'An error occurred',\n password_changed: 'Password changed successfully',\n new_password_error: 'An error occurred',\n invalid_password: 'Invalid password',\n get_settings_error: 'An error occurred',\n update_settings_error: 'An error occurred'\n }\n }\n};\n\nexport default englishMessages;\n","const frenchMessages = {\n auth: {\n dialog: {\n container_permissions: 'Permissions sur le container',\n resource_permissions: 'Permissions sur la ressource',\n login_required: 'Connexion requise'\n },\n action: {\n submit: 'Soumettre',\n permissions: 'Permissions',\n signup: \"S'inscrire\",\n reset_password: 'Mot de passe oublié ?',\n set_new_password: 'Définir le mot de passe',\n logout: 'Se déconnecter',\n login: 'Se connecter',\n view_my_profile: 'Voir mon profil',\n edit_my_profile: 'Éditer mon profil'\n },\n right: {\n resource: {\n read: 'Lire',\n append: 'Enrichir',\n write: 'Modifier',\n control: 'Administrer'\n },\n container: {\n read: 'Lister',\n append: 'Ajouter',\n write: 'Ajouter',\n control: 'Administrer'\n }\n },\n agent: {\n anonymous: 'Tous les utilisateurs',\n authenticated: 'Utilisateurs connectés'\n },\n input: {\n agent_select: 'Ajouter un utilisateur...',\n name: 'Prénom',\n username: 'Identifiant unique',\n email: 'Adresse e-mail',\n username_or_email: 'Identifiant ou adresse e-mail',\n current_password: 'Mot de passe actuel',\n new_password: 'Nouveau mot de passe',\n confirm_new_password: 'Confirmer le nouveau mot de passe',\n password_strength: 'Force du mot de passe',\n password_too_weak: 'Mot de passe trop faible. Augmenter la longueur ou ajouter des caractères spéciaux.'\n },\n helper: {\n login: 'Connectez-vous à votre compte.',\n signup: 'Créez votre compte',\n reset_password:\n 'Entrez votre adresse mail ci-dessous et nous vous enverrons un lien pour réinitialiser votre mot de passe',\n set_new_password: 'Veuillez entrer votre adresse mail et un nouveau mot de passe ci-dessous'\n },\n message: {\n resource_show_forbidden: \"Vous n'avez pas la permission de voir cette ressource\",\n resource_edit_forbidden: \"Vous n'avez pas la permission d'éditer cette ressource\",\n resource_delete_forbidden: \"Vous n'avez pas la permission d'effacer cette ressource\",\n resource_control_forbidden: \"Vous n'avez pas la permission d'administrer cette ressource\",\n container_create_forbidden: \"Vous n'avez pas la permission de créer des ressources\",\n container_list_forbidden: \"Vous n'avez pas la permission de voir ces ressources\",\n unable_to_fetch_user_data: 'Impossible de récupérer les données du profil',\n no_token_returned: 'Aucun token a été retourné',\n no_associated_oidc_issuer: 'Aucun serveur de connexion associé avec le WebID fourni',\n invalid_token_returned: 'Token invalide',\n signup_error: \"L'inscription a échoué\",\n user_not_allowed_to_login: \"Vous n'avez pas le droit de vous connecter avec ce compte\",\n user_email_not_found: 'Aucun compte trouvé avec cette adresse mail',\n user_email_exist: 'Un compte existe déjà avec cette adresse mail',\n username_exist: 'Un compte existe déjà avec cet identifiant',\n username_invalid:\n \"Cet identifiant n'est pas valide. Seuls les lettres minuscules, les chiffres, les points et les tirets sont autorisés\",\n new_user_created: 'Votre compte a été créé avec succès',\n user_connected: 'Vous êtes maintenant connecté',\n user_disconnected: 'Vous êtes maintenant déconnecté',\n bad_request: \"Requête erronée (Message d'erreur renvoyé par le serveur: %{error})\",\n account_settings_updated: 'Les paramètres de votre compte ont été mis à jour avec succès',\n login_to_continue: 'Veuillez vous connecter pour continuer',\n choose_pod_provider:\n \"Veuillez choisir un fournisseur de Pods dans la liste ci-dessous. Toutes les données de l'application seront enregistrées sur votre Pod.\",\n unreachable_auth_server: 'Le serveur de connexion ne peut être atteint'\n },\n notification: {\n reset_password_submitted: 'Un e-mail a été envoyé avec les instructions de réinitialisation du mot de passe',\n reset_password_error: \"Une erreur s'est produite\",\n password_changed: 'Le mot de passe a été changé avec succès',\n new_password_error: \"Une erreur s'est produite\",\n invalid_password: 'Mot de passe incorrect',\n get_settings_error: \"Une erreur s'est produite\",\n update_settings_error: \"Une erreur s'est produite\"\n }\n }\n};\n\nexport default frenchMessages;\n"],"names":[],"version":3,"file":"index.es.js.map"} \ No newline at end of file +{"mappings":"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","sources":["packages/auth-provider/src/index.ts","packages/auth-provider/src/authProvider.js","packages/auth-provider/src/utils.js","packages/auth-provider/src/crud/create/CreateWithPermissions.js","packages/auth-provider/src/hooks/useCheckPermissions.ts","packages/auth-provider/src/constants.ts","packages/auth-provider/src/crud/edit/EditWithPermissions.js","packages/auth-provider/src/crud/edit/EditActionsWithPermissions.tsx","packages/auth-provider/src/components/PermissionsButton/PermissionsButton.js","packages/auth-provider/src/components/PermissionsButton/PermissionsDialog.js","packages/auth-provider/src/components/PermissionsButton/AddPermissionsForm.js","packages/auth-provider/src/components/PermissionsButton/EditPermissionsForm.js","packages/auth-provider/src/components/PermissionsButton/AgentItem.js","packages/auth-provider/src/components/PermissionsButton/AgentIcon.js","packages/auth-provider/src/hooks/useAgents.js","packages/auth-provider/src/crud/edit/EditToolbarWithPermissions.tsx","packages/auth-provider/src/crud/edit/DeleteButtonWithPermissions.js","packages/auth-provider/src/crud/edit/EditButtonWithPermissions.js","packages/auth-provider/src/crud/list/ListWithPermissions.js","packages/auth-provider/src/crud/list/ListActionsWithPermissions.js","packages/auth-provider/src/crud/show/ShowWithPermissions.js","packages/auth-provider/src/crud/show/ShowActionsWithPermissions.tsx","packages/auth-provider/src/components/AuthDialog.js","packages/auth-provider/src/components/SsoLoginPage.js","packages/auth-provider/src/components/LocalLoginPage/LocalLoginPage.js","packages/auth-provider/src/components/LocalLoginPage/SignupForm.js","packages/auth-provider/src/hooks/useSignup.js","packages/auth-provider/src/components/LocalLoginPage/validatePasswordStrength.js","packages/auth-provider/src/passwordScorer.js","packages/auth-provider/src/components/LocalLoginPage/PasswordStrengthIndicator.js","packages/auth-provider/src/components/LocalLoginPage/ColorGradientProgressBar.js","packages/auth-provider/src/components/LocalLoginPage/LoginForm.js","packages/auth-provider/src/components/LocalLoginPage/NewPasswordForm.js","packages/auth-provider/src/components/LocalLoginPage/ResetPasswordForm.js","packages/auth-provider/src/components/LocalLoginPage/SimpleBox.js","packages/auth-provider/src/components/LocalLoginPage/getSearchParamsRest.js","packages/auth-provider/src/components/ResourceWithPermissions.js","packages/auth-provider/src/components/UserMenu.js","packages/auth-provider/src/hooks/useCheckAuthenticated.js","packages/auth-provider/src/hooks/usePermissionsWithRefetch.js","packages/auth-provider/src/messages/english.js","packages/auth-provider/src/messages/french.js"],"sourcesContent":["export { default as authProvider } from './authProvider';\n\n// Create\nexport { default as CreateWithPermissions } from './crud/create/CreateWithPermissions';\n\n// Edit\nexport { default as EditWithPermissions } from './crud/edit/EditWithPermissions';\nexport { default as EditActionsWithPermissions } from './crud/edit/EditActionsWithPermissions';\nexport { default as EditToolbarWithPermissions } from './crud/edit/EditToolbarWithPermissions';\nexport { default as EditButtonWithPermissions } from './crud/edit/EditButtonWithPermissions';\nexport { default as DeleteButtonWithPermissions } from './crud/edit/DeleteButtonWithPermissions';\n\n// List\nexport { default as ListWithPermissions } from './crud/list/ListWithPermissions';\nexport { default as ListActionsWithPermissions } from './crud/list/ListActionsWithPermissions';\n\n// Show\nexport { default as ShowWithPermissions } from './crud/show/ShowWithPermissions';\nexport { default as ShowActionsWithPermissions } from './crud/show/ShowActionsWithPermissions';\n\nexport { default as PermissionsButton } from './components/PermissionsButton/PermissionsButton';\nexport { default as AuthDialog } from './components/AuthDialog';\nexport { default as SsoLoginPage, default as LoginPage } from './components/SsoLoginPage';\nexport { default as LocalLoginPage } from './components/LocalLoginPage/LocalLoginPage';\nexport { default as ResourceWithPermissions } from './components/ResourceWithPermissions';\nexport { default as UserMenu } from './components/UserMenu';\n\nexport { default as useAgents } from './hooks/useAgents';\nexport { default as useCheckAuthenticated } from './hooks/useCheckAuthenticated';\nexport { default as useCheckPermissions } from './hooks/useCheckPermissions';\nexport { default as usePermissionsWithRefetch } from './hooks/usePermissionsWithRefetch';\nexport { default as useSignup } from './hooks/useSignup';\n\n// Password scoring\nexport { default as PasswordStrengthIndicator } from './components/LocalLoginPage/PasswordStrengthIndicator';\nexport { default as validatePasswordStrength } from './components/LocalLoginPage/validatePasswordStrength';\nexport {\n defaultScorer as defaultPasswordScorer,\n defaultOptions as defaultPasswordScorerOptions,\n createPasswordScorer\n} from './passwordScorer';\n\nexport { default as englishMessages } from './messages/english';\nexport { default as frenchMessages } from './messages/french';\n","import jwtDecode from 'jwt-decode';\nimport urlJoin from 'url-join';\nimport * as oauth from 'oauth4webapi';\nimport { defaultToArray, getAclUri, getAclContext, getAuthServerUrl } from './utils';\n\nconst AUTH_TYPE_SSO = 'sso';\nconst AUTH_TYPE_LOCAL = 'local';\nconst AUTH_TYPE_POD = 'pod';\nconst AUTH_TYPE_SOLID_OIDC = 'solid-oidc';\n\nconst authProvider = ({\n dataProvider,\n authType,\n allowAnonymous = true,\n checkUser,\n checkPermissions = false,\n clientId\n}) => {\n if (![AUTH_TYPE_SSO, AUTH_TYPE_LOCAL, AUTH_TYPE_POD, AUTH_TYPE_SOLID_OIDC].includes(authType))\n throw new Error('The authType parameter is missing from the auth provider');\n if (authType === AUTH_TYPE_SOLID_OIDC && !clientId)\n throw new Error('The clientId parameter is required for solid-oidc authentication');\n const callCheckUser = async webId => {\n if (checkUser) {\n try {\n const { json: userData } = await dataProvider.fetch(webId);\n if (!userData) throw new Error('auth.message.unable_to_fetch_user_data');\n if (checkUser(userData) === false) throw new Error('auth.message.user_not_allowed_to_login');\n } catch (e) {\n localStorage.removeItem('token');\n throw e;\n }\n }\n };\n return {\n login: async params => {\n if (authType === AUTH_TYPE_SOLID_OIDC) {\n let { webId, issuer, redirect = '/', isSignup = false } = params;\n\n if (webId && !issuer) {\n // Find issuer from webId\n const { json: userData } = await dataProvider.fetch(webId);\n if (!userData) throw new Error('auth.message.unable_to_fetch_user_data');\n if (!userData['solid:oidcIssuer']) throw new Error('auth.message.no_associated_oidc_issuer');\n issuer = userData?.['solid:oidcIssuer'];\n }\n\n const as = await oauth\n .discoveryRequest(new URL(issuer))\n .then(response => oauth.processDiscoveryResponse(new URL(issuer), response))\n .catch(() => {\n throw new Error('auth.message.unreachable_auth_server');\n });\n\n const codeVerifier = oauth.generateRandomCodeVerifier();\n const codeChallenge = await oauth.calculatePKCECodeChallenge(codeVerifier);\n const codeChallengeMethod = 'S256';\n\n // Save to use on handleCallback method\n localStorage.setItem('code_verifier', codeVerifier);\n localStorage.setItem('redirect', redirect);\n\n const authorizationUrl = new URL(as.authorization_endpoint);\n authorizationUrl.searchParams.set('response_type', 'code');\n authorizationUrl.searchParams.set('client_id', clientId);\n authorizationUrl.searchParams.set('code_challenge', codeChallenge);\n authorizationUrl.searchParams.set('code_challenge_method', codeChallengeMethod);\n authorizationUrl.searchParams.set('redirect_uri', `${window.location.origin}/auth-callback`);\n authorizationUrl.searchParams.set('scope', 'openid webid offline_access');\n authorizationUrl.searchParams.set('is_signup', isSignup);\n\n window.location = authorizationUrl;\n } else if (authType === AUTH_TYPE_LOCAL) {\n const { username, password } = params;\n const authServerUrl = await getAuthServerUrl(dataProvider);\n let token, webId;\n\n try {\n ({\n json: { token, webId }\n } = await dataProvider.fetch(urlJoin(authServerUrl, 'auth/login'), {\n method: 'POST',\n body: JSON.stringify({\n username: username.trim(),\n password: password.trim()\n }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n }));\n } catch (e) {\n throw new Error('ra.auth.sign_in_error');\n }\n\n // Set token now as it is required for refreshConfig\n localStorage.setItem('token', token);\n await dataProvider.refreshConfig();\n\n await callCheckUser(webId);\n } else if (authType === AUTH_TYPE_SSO) {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n let redirectUrl = `${new URL(window.location.href).origin}/login?login=true`;\n if (params.redirect) redirectUrl += `&redirect=${encodeURIComponent(params.redirect)}`;\n window.location.href = urlJoin(authServerUrl, `auth?redirectUrl=${encodeURIComponent(redirectUrl)}`);\n }\n },\n handleCallback: async () => {\n const { searchParams } = new URL(window.location);\n\n if (authType === AUTH_TYPE_SOLID_OIDC) {\n const issuer = new URL(searchParams.get('iss'));\n const as = await oauth\n .discoveryRequest(issuer)\n .then(response => oauth.processDiscoveryResponse(issuer, response));\n\n const client = {\n client_id: clientId,\n token_endpoint_auth_method: 'none' // We don't have a client secret\n };\n\n const currentUrl = new URL(window.location.href);\n const params = oauth.validateAuthResponse(as, client, currentUrl, oauth.expectNoState);\n if (oauth.isOAuth2Error(params)) {\n throw new Error(`OAuth error: ${params.error} (${params.error_description})`);\n }\n\n // Retrieve data set during login\n const codeVerifier = localStorage.getItem('code_verifier');\n const redirect = localStorage.getItem('redirect');\n\n const response = await oauth.authorizationCodeGrantRequest(\n as,\n client,\n params,\n `${window.location.origin}/auth-callback`,\n codeVerifier\n );\n\n const result = await oauth.processAuthorizationCodeOpenIDResponse(as, client, response);\n if (oauth.isOAuth2Error(result)) {\n throw new Error(`OAuth error: ${params.error} (${params.error_description})`);\n }\n\n // Until DPoP is implemented, use the ID token to log into local Pod\n // And the proxy endpoint to log into remote Pods\n localStorage.setItem('token', result.id_token);\n\n // Remove we don't need it anymore\n localStorage.removeItem('code_verifier');\n localStorage.removeItem('redirect');\n\n // Reload to ensure the dataServer config is reset\n window.location.href = redirect || '/';\n } else {\n const token = searchParams.get('token');\n if (!token) throw new Error('auth.message.no_token_returned');\n\n let webId;\n try {\n ({ webId } = jwtDecode(token));\n } catch (e) {\n throw new Error('auth.message.invalid_token_returned');\n }\n\n localStorage.setItem('token', token);\n await dataProvider.refreshConfig();\n\n await callCheckUser(webId);\n }\n },\n signup: async params => {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n if (authType === AUTH_TYPE_LOCAL) {\n const { username, email, password, domain, ...profileData } = params;\n let token, webId;\n\n try {\n ({\n json: { token, webId }\n } = await dataProvider.fetch(urlJoin(authServerUrl, 'auth/signup'), {\n method: 'POST',\n body: JSON.stringify({\n username: username?.trim(),\n email: email.trim(),\n password: password.trim(),\n ...profileData\n }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n }));\n } catch (e) {\n if (e.message === 'email.already.exists') {\n throw new Error('auth.message.user_email_exist');\n } else if (e.message === 'username.already.exists') {\n throw new Error('auth.message.username_exist');\n } else if (e.message === 'username.invalid') {\n throw new Error('auth.message.username_invalid');\n } else {\n throw new Error('auth.message.signup_error');\n }\n }\n\n localStorage.setItem('token', token);\n await dataProvider.refreshConfig();\n\n await callCheckUser(webId);\n\n return webId;\n } else {\n const redirectUrl = `${new URL(window.location.href).origin}/login?login=true`;\n window.location.href = urlJoin(authServerUrl, `auth?redirectUrl=${encodeURIComponent(redirectUrl)}`);\n }\n },\n logout: async params => {\n const { redirectUrl } = params || {};\n switch (authType) {\n case AUTH_TYPE_LOCAL: {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n\n // Delete token but also any other value in local storage\n localStorage.clear();\n\n let result = {};\n\n try {\n result = await dataProvider.fetch(urlJoin(authServerUrl, '.well-known/openid-configuration'));\n } catch (e) {\n // Do nothing if it fails\n }\n\n if (result.status === 200 && result.json) {\n // Redirect to OIDC endpoint if it exists\n window.location.href = result.json.end_session_endpoint;\n } else {\n // Reload to ensure the dataServer config is reset\n window.location.reload();\n window.location.href = '/';\n }\n\n break;\n }\n\n case AUTH_TYPE_SSO: {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n const baseUrl = new URL(window.location.href).origin;\n return urlJoin(\n authServerUrl,\n `auth/logout?redirectUrl=${encodeURIComponent(`${urlJoin(baseUrl, 'login')}?logout=true`)}`\n );\n }\n\n case AUTH_TYPE_POD: {\n const token = localStorage.getItem('token');\n if (token) {\n const { webId } = jwtDecode(token);\n // Delete token but also any other value in local storage\n localStorage.clear();\n // Redirect to the POD provider\n return `${urlJoin(webId, 'openApp')}?type=${encodeURIComponent(\n 'http://activitypods.org/ns/core#FrontAppRegistration'\n )}`;\n }\n break;\n }\n\n case AUTH_TYPE_SOLID_OIDC: {\n const token = localStorage.getItem('token');\n if (token) {\n const { webid: webId } = jwtDecode(token); // Not webId !!\n\n // Delete token but also any other value in local storage\n localStorage.clear();\n\n if (redirectUrl) {\n return redirectUrl;\n } else {\n // We don't need the token to fetch the WebID since it is public\n const { json: userData } = await dataProvider.fetch(webId);\n\n // Redirect to the Pod provider\n return userData?.['solid:oidcIssuer'] || new URL(webId).origin;\n }\n } else {\n return redirectUrl;\n }\n }\n\n default:\n break;\n }\n },\n checkAuth: async () => {\n const token = localStorage.getItem('token');\n if (!token && !allowAnonymous) throw new Error();\n },\n checkUser: userData => {\n if (checkUser) {\n return checkUser(userData);\n }\n return true;\n },\n checkError: error => {\n // We want to disconnect only with INVALID_TOKEN errors\n if (error.status === 401 && error.body && error.body.type === 'INVALID_TOKEN') {\n localStorage.removeItem('token');\n return Promise.reject();\n } else {\n // Other error code (404, 500, etc): no need to log out\n return Promise.resolve();\n }\n },\n getPermissions: async uri => {\n if (!checkPermissions) return;\n\n // React-admin calls getPermissions with an empty object on every page refresh\n // It also passes an object `{ params: { route: 'dashboard' } }` on the Dashboard\n // Ignore all this until we found a way to bypass these redundant calls\n if (typeof uri === 'object') return;\n\n if (!uri || !uri.startsWith('http'))\n throw new Error('The first parameter passed to getPermissions must be an URL');\n\n const aclUri = getAclUri(uri);\n\n try {\n const { json } = await dataProvider.fetch(aclUri);\n return json['@graph'];\n } catch (e) {\n console.warn(`Could not fetch ACL URI ${uri}`);\n return [];\n }\n },\n addPermission: async (uri, agentId, predicate, mode) => {\n if (!uri || !uri.startsWith('http'))\n throw new Error('The first parameter passed to addPermission must be an URL');\n\n const aclUri = getAclUri(uri);\n\n const authorization = {\n '@id': `#${mode.replace('acl:', '')}`,\n '@type': 'acl:Authorization',\n [predicate]: agentId,\n 'acl:accessTo': uri,\n 'acl:mode': mode\n };\n\n await dataProvider.fetch(aclUri, {\n method: 'PATCH',\n body: JSON.stringify({\n '@context': getAclContext(aclUri),\n '@graph': [authorization]\n })\n });\n },\n removePermission: async (uri, agentId, predicate, mode) => {\n if (!uri || !uri.startsWith('http'))\n throw new Error('The first parameter passed to removePermission must be an URL');\n\n const aclUri = getAclUri(uri);\n\n // Fetch current permissions\n const { json } = await dataProvider.fetch(aclUri);\n\n const updatedPermissions = json['@graph']\n .filter(authorization => !authorization['@id'].includes('#Default'))\n .map(authorization => {\n const modes = defaultToArray(authorization['acl:mode']);\n let agents = defaultToArray(authorization[predicate]);\n if (mode && modes.includes(mode) && agents && agents.includes(agentId)) {\n agents = agents.filter(agent => agent !== agentId);\n }\n return { ...authorization, [predicate]: agents };\n });\n\n await dataProvider.fetch(aclUri, {\n method: 'PUT',\n body: JSON.stringify({\n '@context': getAclContext(aclUri),\n '@graph': updatedPermissions\n })\n });\n },\n getIdentity: async () => {\n const token = localStorage.getItem('token');\n if (token) {\n const payload = jwtDecode(token);\n\n // Backend-generated tokens use webId but Solid-OIDC tokens use webid\n const webId = authType === AUTH_TYPE_SOLID_OIDC ? payload.webid : payload.webId;\n\n if (!webId) {\n // If webId is not set, it is probably because we have ActivityPods v1 tokens and we need to disconnect\n localStorage.removeItem('token');\n window.location.href = '/login';\n throw new Error('No webId found on provided token !');\n }\n\n const { json: webIdData } = await dataProvider.fetch(webId);\n const { json: profileData } = webIdData.url ? await dataProvider.fetch(webIdData.url) : {};\n\n return {\n id: webId,\n fullName:\n profileData?.['vcard:given-name'] ||\n profileData?.['pair:label'] ||\n webIdData['foaf:name'] ||\n webIdData['pair:label'],\n profileData,\n webIdData\n };\n }\n },\n resetPassword: async params => {\n const { email } = params;\n const authServerUrl = await getAuthServerUrl(dataProvider);\n try {\n await dataProvider.fetch(urlJoin(authServerUrl, 'auth/reset_password'), {\n method: 'POST',\n body: JSON.stringify({ email: email.trim() }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n });\n } catch (e) {\n if (e.message === 'email.not.exists') {\n throw new Error('auth.message.user_email_not_found');\n } else {\n throw new Error('auth.notification.reset_password_error');\n }\n }\n },\n setNewPassword: async params => {\n const { email, token, password } = params;\n const authServerUrl = await getAuthServerUrl(dataProvider);\n try {\n await dataProvider.fetch(urlJoin(authServerUrl, 'auth/new_password'), {\n method: 'POST',\n body: JSON.stringify({ email: email.trim(), token, password }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n });\n } catch (e) {\n if (e.message === 'email.not.exists') {\n throw new Error('auth.message.user_email_not_found');\n } else {\n throw new Error('auth.notification.new_password_error');\n }\n }\n },\n getAccountSettings: async params => {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n try {\n const { json } = await dataProvider.fetch(urlJoin(authServerUrl, 'auth/account'));\n return json;\n } catch (e) {\n throw new Error('auth.notification.get_settings_error');\n }\n },\n updateAccountSettings: async params => {\n const authServerUrl = await getAuthServerUrl(dataProvider);\n try {\n const { email, currentPassword, newPassword } = params;\n\n await dataProvider.fetch(urlJoin(authServerUrl, 'auth/account'), {\n method: 'POST',\n body: JSON.stringify({\n currentPassword,\n email: email?.trim(),\n newPassword\n }),\n headers: new Headers({ 'Content-Type': 'application/json' })\n });\n } catch (e) {\n if (e.message === 'auth.account.invalid_password') {\n throw new Error('auth.notification.invalid_password');\n }\n\n throw new Error('auth.notification.update_settings_error');\n }\n }\n };\n};\n\nexport default authProvider;\n","import urlJoin from 'url-join';\n\nexport const defaultToArray = value => (!value ? undefined : Array.isArray(value) ? value : [value]);\n\n// Transform the URI to the one used to find the ACL\n// To be compatible with all servers, we should do a HEAD request to the resource URI\nexport const getAclUri = resourceUri => {\n const parsedUrl = new URL(resourceUri);\n return urlJoin(parsedUrl.origin, '_acl', parsedUrl.pathname);\n};\n\nexport const getAclContext = baseUri => ({\n '@base': baseUri,\n acl: 'http://www.w3.org/ns/auth/acl#',\n foaf: 'http://xmlns.com/foaf/0.1/',\n 'acl:agent': { '@type': '@id' },\n 'acl:agentGroup': { '@type': '@id' },\n 'acl:agentClass': { '@type': '@id' },\n 'acl:mode': { '@type': '@id' },\n 'acl:accessTo': { '@type': '@id' }\n});\n\nexport const getAuthServerUrl = async dataProvider => {\n const dataServers = await dataProvider.getDataServers();\n const authServer = Object.values(dataServers).find(server => server.authServer === true);\n if (!authServer) throw new Error('Could not find a server with authServer: true. Check your dataServers config.');\n // If the server is a Pod provider, return the root URL instead of https://domain.com/user/data\n return authServer.pod ? new URL(authServer.baseUrl).origin : authServer.baseUrl;\n};\n\nexport const delay = async t => new Promise(resolve => setTimeout(resolve, t));\n","import React from 'react';\nimport { Create, CreateActions, useResourceContext } from 'react-admin';\nimport { useCreateContainerUri } from '@semapps/semantic-data-provider';\nimport useCheckPermissions from '../../hooks/useCheckPermissions';\n\nconst CreateWithPermissions = props => {\n const resource = useResourceContext();\n const createContainerUri = useCreateContainerUri()(resource);\n useCheckPermissions(createContainerUri, 'create');\n return ;\n};\n\nCreateWithPermissions.defaultProps = {\n actions: \n};\n\nexport default CreateWithPermissions;\n","import { useEffect } from 'react';\nimport { usePermissions, useRedirect, useNotify } from 'react-admin';\nimport { rights, forbiddenErrors } from '../constants';\nimport { Permissions } from '../types';\n\nconst useCheckPermissions = (uri: string, mode: keyof typeof rights, redirectUrl: string = '/') => {\n const { permissions } = usePermissions(uri);\n const notify = useNotify();\n const redirect = useRedirect();\n\n useEffect(() => {\n if (permissions && !permissions.some(p => rights[mode].includes(p['acl:mode']))) {\n notify(forbiddenErrors[mode], { type: 'error' });\n redirect(redirectUrl);\n }\n }, [permissions, redirect, notify]);\n\n return permissions;\n};\n\nexport default useCheckPermissions;\n","import { AclClass, AclMode } from './types';\n\nexport const ACL_READ: AclMode = 'acl:Read';\nexport const ACL_APPEND: AclMode = 'acl:Append';\nexport const ACL_WRITE: AclMode = 'acl:Write';\nexport const ACL_CONTROL: AclMode = 'acl:Control';\n\nexport const USER_AGENT = 'acl:agent';\nexport const GROUP_AGENT = 'acl:agentGroup';\nexport const CLASS_AGENT = 'acl:agentClass';\n\nexport const ANONYMOUS_AGENT: AclClass = 'foaf:Agent';\nexport const AUTHENTICATED_AGENT: AclClass = 'acl:AuthenticatedAgent';\n\nexport const rightsToShow: AclMode[] = [ACL_READ, ACL_APPEND, ACL_WRITE, ACL_CONTROL];\nexport const rightsToList: AclMode[] = [ACL_READ, ACL_APPEND, ACL_WRITE, ACL_CONTROL];\nexport const rightsToCreate: AclMode[] = [ACL_APPEND, ACL_WRITE, ACL_CONTROL];\nexport const rightsToEdit: AclMode[] = [ACL_APPEND, ACL_WRITE, ACL_CONTROL];\nexport const rightsToDelete: AclMode[] = [ACL_WRITE, ACL_CONTROL];\nexport const rightsToControl: AclMode[] = [ACL_CONTROL];\n\nexport const rights = {\n show: rightsToShow,\n list: rightsToList,\n create: rightsToCreate,\n edit: rightsToEdit,\n delete: rightsToDelete,\n control: rightsToControl\n};\n\nexport const forbiddenErrors = {\n show: 'auth.message.resource_show_forbidden',\n edit: 'auth.message.resource_edit_forbidden',\n delete: 'auth.message.resource_delete_forbidden',\n control: 'auth.message.resource_control_forbidden',\n list: 'auth.message.container_list_forbidden',\n create: 'auth.message.container_create_forbidden'\n};\n\nexport const resourceRightsLabels = {\n [ACL_READ]: 'auth.right.resource.read',\n [ACL_APPEND]: 'auth.right.resource.append',\n [ACL_WRITE]: 'auth.right.resource.write',\n [ACL_CONTROL]: 'auth.right.resource.control'\n};\n\nexport const containerRightsLabels = {\n [ACL_READ]: 'auth.right.container.read',\n [ACL_WRITE]: 'auth.right.container.write',\n [ACL_CONTROL]: 'auth.right.container.control'\n};\n","import React from 'react';\nimport { Edit, useGetRecordId } from 'react-admin';\nimport EditActionsWithPermissions from './EditActionsWithPermissions';\nimport EditToolbarWithPermissions from './EditToolbarWithPermissions';\nimport useCheckPermissions from '../../hooks/useCheckPermissions';\n\nconst EditWithPermissions = props => {\n const recordId = useGetRecordId();\n useCheckPermissions(recordId, 'edit');\n return (\n \n {React.cloneElement(props.children, {\n toolbar: ,\n // Allow to override toolbar\n ...props.children.props\n })}\n \n );\n};\n\nEditWithPermissions.defaultProps = {\n actions: \n};\n\nexport default EditWithPermissions;\n","import React from 'react';\nimport {\n ShowButton,\n ListButton,\n TopToolbar,\n usePermissions,\n useResourceDefinition,\n useRecordContext,\n useResourceContext\n} from 'react-admin';\nimport { useCreateContainerUri } from '@semapps/semantic-data-provider';\nimport PermissionsButton from '../../components/PermissionsButton/PermissionsButton';\nimport { rightsToControl, rightsToList, rightsToShow } from '../../constants';\nimport { Permissions } from '../../types';\n\nconst EditActionsWithPermissions = () => {\n const { hasList, hasShow } = useResourceDefinition();\n const record = useRecordContext();\n const { permissions } = usePermissions(record?.id);\n\n const resource = useResourceContext();\n const containerUri = useCreateContainerUri()(resource);\n const { permissions: containerPermissions } = usePermissions(containerUri);\n\n return (\n \n {hasList && containerPermissions && containerPermissions.some(p => rightsToList.includes(p['acl:mode'])) && (\n \n )}\n {hasShow && permissions && permissions.some(p => rightsToShow.includes(p['acl:mode'])) && }\n {permissions && permissions.some(p => rightsToControl.includes(p['acl:mode'])) && }\n \n );\n};\n\nexport default EditActionsWithPermissions;\n","import React, { useState } from 'react';\nimport { Button, useRecordContext, useResourceContext } from 'react-admin';\nimport ShareIcon from '@mui/icons-material/Share';\nimport { useCreateContainer } from '@semapps/semantic-data-provider';\nimport PermissionsDialog from './PermissionsDialog';\n\nconst PermissionsButton = ({ isContainer }) => {\n const record = useRecordContext();\n const resource = useResourceContext();\n const [showDialog, setShowDialog] = useState(false);\n const createContainer = useCreateContainer(resource);\n const uri = isContainer ? createContainer : record.id || record['@id'];\n return (\n <>\n \n setShowDialog(false)} />\n \n );\n};\n\nPermissionsButton.defaultProps = {\n isContainer: false\n};\n\nexport default PermissionsButton;\n","import React from 'react';\nimport { Button, useTranslate } from 'react-admin';\nimport { Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport AddPermissionsForm from './AddPermissionsForm';\nimport EditPermissionsForm from './EditPermissionsForm';\nimport useAgents from '../../hooks/useAgents';\n\nconst useStyles = makeStyles(() => ({\n title: {\n paddingBottom: 8\n },\n actions: {\n padding: 15\n },\n addForm: {\n paddingTop: 0\n },\n listForm: {\n paddingTop: 0,\n paddingBottom: 0,\n paddingRight: 0,\n maxHeight: 210\n }\n}));\n\nconst PermissionsDialog = ({ open, onClose, uri, isContainer }) => {\n const classes = useStyles();\n const translate = useTranslate();\n const { agents, addPermission, removePermission } = useAgents(uri);\n\n return (\n \n \n {translate(isContainer ? 'auth.dialog.container_permissions' : 'auth.dialog.resource_permissions')}\n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default PermissionsDialog;\n","import React, { useEffect, useState } from 'react';\nimport { useGetList, useTranslate } from 'react-admin';\nimport { TextField, List, ListItem, ListItemAvatar, ListItemText, Avatar } from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport PersonIcon from '@mui/icons-material/Person';\nimport { USER_AGENT, ACL_READ } from '../../constants';\n\nconst useStyles = makeStyles(() => ({\n list: {\n padding: 0,\n width: '100%'\n },\n option: {\n padding: 0\n }\n}));\n\nconst AddPermissionsForm = ({ agents, addPermission }) => {\n const classes = useStyles();\n const translate = useTranslate();\n const [value, setValue] = useState(null);\n const [inputValue, setInputValue] = useState('');\n const [options, setOptions] = useState([]);\n\n const { data } = useGetList(\n 'Person',\n {\n pagination: { page: 1, perPage: 100 },\n sort: { field: 'pair:label', order: 'ASC' },\n filter: { q: inputValue }\n },\n {\n enabled: inputValue.length > 0\n }\n );\n\n useEffect(() => {\n setOptions(data?.length > 0 ? Object.values(data) : []);\n }, [data]);\n\n return (\n option['pair:label']}\n // Do not return agents which have already been added\n filterOptions={x => x.filter(agent => !Object.keys(agents).includes(agent.id))}\n options={options}\n noOptionsText={translate('ra.navigation.no_results')}\n autoComplete\n blurOnSelect\n clearOnBlur\n disableClearable\n value={value}\n onChange={(event, record) => {\n addPermission(record.id || record['@id'], USER_AGENT, ACL_READ);\n setValue(null);\n setInputValue('');\n setOptions([]);\n }}\n onInputChange={(event, newInputValue) => {\n setInputValue(newInputValue);\n }}\n renderInput={params => (\n \n )}\n renderOption={(props, option) => (\n \n \n \n \n \n \n \n \n \n \n )}\n />\n );\n};\n\nexport default AddPermissionsForm;\n","import React from 'react';\nimport { List } from '@mui/material';\nimport { styled } from '@mui/system';\nimport AgentItem from './AgentItem';\n\nconst StyledList = styled(List)(({ theme }) => ({\n width: '100%',\n maxWidth: '100%',\n backgroundColor: theme.palette.background.paper\n}));\n\nconst EditPermissionsForm = ({ isContainer, agents, addPermission, removePermission }) => {\n return (\n \n {Object.entries(agents).map(([agentId, agent]) => (\n \n ))}\n \n );\n};\n\nexport default EditPermissionsForm;\n","import React, { useState, useEffect } from 'react';\nimport { useDataProvider, useTranslate, Loading, Error } from 'react-admin';\nimport {\n Avatar,\n ListItem,\n ListItemIcon,\n ListItemAvatar,\n ListItemText,\n ListItemSecondaryAction,\n IconButton,\n Menu,\n MenuItem\n} from '@mui/material';\nimport makeStyles from '@mui/styles/makeStyles';\nimport EditIcon from '@mui/icons-material/Edit';\nimport CheckIcon from '@mui/icons-material/Check';\nimport { GROUP_AGENT, USER_AGENT, ANONYMOUS_AGENT, resourceRightsLabels, containerRightsLabels } from '../../constants';\nimport AgentIcon from './AgentIcon';\n\nconst useStyles = makeStyles(() => ({\n listItem: {\n paddingLeft: 4,\n paddingRight: 36\n },\n primaryText: {\n width: '30%',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n },\n secondaryText: {\n textAlign: 'center',\n width: '60%',\n fontStyle: 'italic',\n color: 'grey'\n }\n}));\n\nconst AgentItem = ({ isContainer, agent, addPermission, removePermission }) => {\n const classes = useStyles();\n const translate = useTranslate();\n const dataProvider = useDataProvider();\n const [anchorEl, setAnchorEl] = React.useState(null);\n const [user, setUser] = useState();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState();\n\n useEffect(() => {\n if (agent.predicate === USER_AGENT) {\n dataProvider\n .getOne('Person', { id: agent.id })\n .then(({ data }) => {\n setUser(data);\n setLoading(false);\n })\n .catch(error => {\n setError(error);\n setLoading(false);\n });\n } else {\n setLoading(false);\n }\n }, [agent.id, agent.predicate]);\n\n // For now, do not display groups\n if (agent.predicate === GROUP_AGENT) return null;\n\n const openMenu = event => setAnchorEl(event.currentTarget);\n const closeMenu = () => setAnchorEl(null);\n\n const labels = isContainer ? containerRightsLabels : resourceRightsLabels;\n\n if (loading) return ;\n if (error) return ;\n\n return (\n \n \n \n \n \n \n \n translate(labels[p])).join(', ')}\n />\n \n \n \n \n \n {Object.entries(labels).map(([rightKey, rightLabel]) => {\n const hasPermission = agent.permissions && agent.permissions.includes(rightKey);\n return (\n {\n if (hasPermission) {\n removePermission(agent.id, agent.predicate, rightKey);\n } else {\n addPermission(agent.id, agent.predicate, rightKey);\n }\n closeMenu();\n }}\n >\n {hasPermission ? : null}\n \n \n );\n })}\n \n \n \n );\n};\n\nexport default AgentItem;\n","import React from 'react';\nimport PublicIcon from '@mui/icons-material/Public';\nimport VpnLockIcon from '@mui/icons-material/VpnLock';\nimport PersonIcon from '@mui/icons-material/Person';\nimport GroupIcon from '@mui/icons-material/Group';\nimport { CLASS_AGENT, GROUP_AGENT, USER_AGENT, ANONYMOUS_AGENT } from '../../constants';\n\nconst AgentIcon = ({ agent }) => {\n switch (agent.predicate) {\n case CLASS_AGENT:\n return agent.id === ANONYMOUS_AGENT ? : ;\n case USER_AGENT:\n return ;\n case GROUP_AGENT:\n return ;\n default:\n throw new Error(`Unknown agent predicate: ${agent.predicate}`);\n }\n};\n\nexport default AgentIcon;\n","import { useEffect, useCallback, useState } from 'react';\nimport { usePermissions, useAuthProvider } from 'react-admin';\nimport { defaultToArray } from '../utils';\nimport { CLASS_AGENT, GROUP_AGENT, USER_AGENT, ANONYMOUS_AGENT, AUTHENTICATED_AGENT } from '../constants';\n\nconst useAgents = uri => {\n const { permissions } = usePermissions(uri);\n const authProvider = useAuthProvider();\n const [agents, setAgents] = useState({});\n\n // Format list of authorized agents, based on the permissions returned for the resource\n useEffect(() => {\n const result = {\n [ANONYMOUS_AGENT]: {\n id: ANONYMOUS_AGENT,\n predicate: CLASS_AGENT,\n permissions: []\n },\n [AUTHENTICATED_AGENT]: {\n id: AUTHENTICATED_AGENT,\n predicate: CLASS_AGENT,\n permissions: []\n }\n };\n\n const appendPermission = (agentId, predicate, mode) => {\n if (result[agentId]) {\n result[agentId].permissions.push(mode);\n } else {\n result[agentId] = {\n id: agentId,\n predicate,\n permissions: [mode]\n };\n }\n };\n\n if (permissions) {\n for (const p of permissions) {\n if (p[CLASS_AGENT]) {\n defaultToArray(p[CLASS_AGENT]).forEach(agentId => appendPermission(agentId, CLASS_AGENT, p['acl:mode']));\n }\n if (p[USER_AGENT]) {\n defaultToArray(p[USER_AGENT]).forEach(userUri => appendPermission(userUri, USER_AGENT, p['acl:mode']));\n }\n if (p[GROUP_AGENT]) {\n defaultToArray(p[GROUP_AGENT]).forEach(groupUri => appendPermission(groupUri, GROUP_AGENT, p['acl:mode']));\n }\n }\n setAgents(result);\n }\n }, [permissions]);\n\n const addPermission = useCallback(\n (agentId, predicate, mode) => {\n const prevAgents = { ...agents };\n setAgents({\n ...agents,\n [agentId]: {\n id: agentId,\n predicate,\n permissions: agents[agentId] ? [...agents[agentId]?.permissions, mode] : [mode]\n }\n });\n authProvider.addPermission(uri, agentId, predicate, mode).catch(e => {\n // If there was an error, revert the optimistic update\n setAgents(prevAgents);\n });\n },\n [agents, setAgents, uri, authProvider]\n );\n\n const removePermission = useCallback(\n (agentId, predicate, mode) => {\n const prevAgents = { ...agents };\n setAgents(\n Object.fromEntries(\n Object.entries(agents)\n .map(([key, agent]) => {\n if (agent.id === agentId) {\n agent.permissions = agent.permissions.filter(m => m !== mode);\n }\n return [key, agent];\n })\n // Remove agents if they have no permissions (except if they are class agents)\n .filter(([_, agent]) => agent.predicate === CLASS_AGENT || agent.permissions.length > 0)\n )\n );\n authProvider.removePermission(uri, agentId, predicate, mode).catch(e => {\n // If there was an error, revert the optimistic update\n setAgents(prevAgents);\n });\n },\n [agents, setAgents, uri, authProvider]\n );\n\n return { agents, addPermission, removePermission };\n};\n\nexport default useAgents;\n","import React from 'react';\nimport { SaveButton, Toolbar, ToolbarProps } from 'react-admin';\nimport { styled } from '@mui/material/styles';\nimport DeleteButtonWithPermissions from './DeleteButtonWithPermissions';\n\nconst StyledToolbar = styled(Toolbar)(() => ({\n flex: 1,\n display: 'flex',\n justifyContent: 'space-between'\n}));\n\nconst EditToolbarWithPermissions: React.FunctionComponent = props => (\n \n \n \n \n);\n\nexport default EditToolbarWithPermissions;\n","import React from 'react';\nimport { DeleteButton, useGetRecordId, usePermissions } from 'react-admin';\nimport { rightsToDelete } from '../../constants';\n\nconst DeleteButtonWithPermissions = props => {\n const recordId = useGetRecordId();\n const { permissions, isLoading } = usePermissions(recordId);\n if (!isLoading && permissions?.some(p => rightsToDelete.includes(p['acl:mode']))) {\n return ;\n }\n return null;\n};\n\nexport default DeleteButtonWithPermissions;\n","import React from 'react';\nimport { EditButton, useGetRecordId, usePermissions } from 'react-admin';\nimport { rightsToEdit } from '../../constants';\n\nconst EditButtonWithPermissions = props => {\n const recordId = useGetRecordId();\n const { permissions, isLoading } = usePermissions(recordId);\n if (!isLoading && permissions?.some(p => rightsToEdit.includes(p['acl:mode']))) {\n return ;\n }\n return null;\n};\n\nexport default EditButtonWithPermissions;\n","import React from 'react';\nimport { List } from 'react-admin';\nimport ListActionsWithPermissions from './ListActionsWithPermissions';\n\nconst ListWithPermissions = props => ;\n\nListWithPermissions.defaultProps = {\n actions: \n};\n\nexport default ListWithPermissions;\n","import React from 'react';\nimport {\n CreateButton,\n ExportButton,\n useResourceDefinition,\n TopToolbar,\n usePermissions,\n useResourceContext\n} from 'react-admin';\nimport { useMediaQuery } from '@mui/material';\nimport { useCreateContainer } from '@semapps/semantic-data-provider';\nimport PermissionsButton from '../../components/PermissionsButton/PermissionsButton';\nimport { rightsToCreate, rightsToControl } from '../../constants';\n\n// Do not show Export and Refresh buttons on mobile\nconst ListActionsWithPermissions = ({\n bulkActions,\n sort,\n displayedFilters,\n exporter,\n filters,\n filterValues,\n onUnselectItems,\n selectedIds,\n showFilter,\n total\n}) => {\n const resource = useResourceContext();\n const xs = useMediaQuery(theme => theme.breakpoints.down('xs'));\n const resourceDefinition = useResourceDefinition();\n const createContainerUri = useCreateContainer(resource);\n const { permissions } = usePermissions(createContainerUri);\n return (\n \n {filters &&\n React.cloneElement(filters, {\n showFilter,\n displayedFilters,\n filterValues,\n context: 'button'\n })}\n {resourceDefinition.hasCreate && permissions && permissions.some(p => rightsToCreate.includes(p['acl:mode'])) && (\n \n )}\n {permissions && permissions.some(p => rightsToControl.includes(p['acl:mode'])) && (\n \n )}\n {!xs && exporter !== false && (\n \n )}\n {bulkActions &&\n React.cloneElement(bulkActions, {\n filterValues,\n selectedIds,\n onUnselectItems\n })}\n \n );\n};\n\nexport default ListActionsWithPermissions;\n","import React from 'react';\nimport { Show, useGetRecordId } from 'react-admin';\nimport ShowActionsWithPermissions from './ShowActionsWithPermissions';\nimport useCheckPermissions from '../../hooks/useCheckPermissions';\n\nconst ShowWithPermissions = props => {\n const recordId = useGetRecordId();\n useCheckPermissions(recordId, 'show');\n return ;\n};\n\nShowWithPermissions.defaultProps = {\n actions: \n};\n\nexport default ShowWithPermissions;\n","import React from 'react';\nimport {\n EditButton,\n ListButton,\n TopToolbar,\n usePermissions,\n useResourceDefinition,\n useRecordContext,\n useResourceContext\n} from 'react-admin';\nimport { useCreateContainerUri } from '@semapps/semantic-data-provider';\nimport PermissionsButton from '../../components/PermissionsButton/PermissionsButton';\nimport { rightsToControl, rightsToEdit, rightsToList } from '../../constants';\nimport { Permissions } from '../../types';\n\nconst ShowActionsWithPermissions = () => {\n const { hasList, hasEdit } = useResourceDefinition();\n const record = useRecordContext();\n const { permissions } = usePermissions(record?.id);\n\n const resource = useResourceContext();\n const containerUri = useCreateContainerUri()(resource);\n const { permissions: containerPermissions } = usePermissions(containerUri);\n\n return (\n \n {hasList && containerPermissions && containerPermissions.some(p => rightsToList.includes(p['acl:mode'])) && (\n \n )}\n {hasEdit && permissions && permissions.some(p => rightsToEdit.includes(p['acl:mode'])) && }\n {permissions && permissions.some(p => rightsToControl.includes(p['acl:mode'])) && }\n \n );\n};\n\nexport default ShowActionsWithPermissions;\n","import React from 'react';\nimport { useLogin, useTranslate } from 'react-admin';\nimport { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from '@mui/material';\n\nconst AuthDialog = ({ open, onClose, title, message, redirect, ...rest }) => {\n const login = useLogin();\n const translate = useTranslate();\n return (\n \n {translate(title)}\n \n {translate(message)}\n \n \n \n login({ redirect: redirect || window.location.pathname + window.location.search })}\n color=\"primary\"\n variant=\"contained\"\n >\n {translate('auth.action.login')}\n \n \n \n );\n};\n\nAuthDialog.defaultProps = {\n title: 'auth.dialog.login_required',\n message: 'auth.message.login_to_continue'\n};\n\nexport default AuthDialog;\n","import React, { useRef, useEffect } from 'react';\nimport jwtDecode from 'jwt-decode';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport { useDataProvider, useAuthProvider, useLogin, useGetIdentity, useNotify } from 'react-admin';\nimport { Card, Avatar, Typography, Button, CardActions } from '@mui/material';\nimport { styled } from '@mui/material/styles';\nimport LockIcon from '@mui/icons-material/Lock';\n\nconst delay = async t => new Promise(resolve => setTimeout(resolve, t));\n\n// Inspired from https://github.com/marmelab/react-admin/blob/master/packages/ra-ui-materialui/src/auth/Login.tsx\nconst SsoLoginPage = ({ children, backgroundImage, buttons, userResource, propertiesExist, text, ...rest }) => {\n const containerRef = useRef();\n let backgroundImageLoaded = false;\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const { data: identity, isLoading } = useGetIdentity();\n\n const notify = useNotify();\n const login = useLogin();\n const dataProvider = useDataProvider();\n const authProvider = useAuthProvider();\n\n useEffect(() => {\n if (!isLoading && identity?.id) {\n // Already authenticated, redirect to the home page\n navigate(searchParams.get('redirect') || '/');\n }\n }, [identity, isLoading, navigate, searchParams]);\n\n useEffect(() => {\n (async () => {\n if (searchParams.has('login')) {\n if (searchParams.has('error')) {\n if (searchParams.get('error') === 'registration.not-allowed') {\n notify('auth.message.user_email_not_found', { type: 'error' });\n } else {\n notify('auth.message.bad_request', { type: 'error', messageArgs: { error: searchParams.get('error') } });\n }\n } else if (searchParams.has('token')) {\n const token = searchParams.get('token');\n const { webId } = jwtDecode(token);\n\n localStorage.setItem('token', token);\n\n let userData;\n ({ data: userData } = await dataProvider.getOne(userResource, { id: webId }));\n\n if (propertiesExist.length > 0) {\n let allPropertiesExist = propertiesExist.every(p => userData[p]);\n while (!allPropertiesExist) {\n console.log('Waiting for all properties to have been created', propertiesExist);\n await delay(500);\n ({ data: userData } = await dataProvider.getOne(userResource, { id: webId }));\n allPropertiesExist = propertiesExist.every(p => userData[p]);\n }\n }\n\n if (!authProvider.checkUser(userData)) {\n localStorage.removeItem('token');\n notify('auth.message.user_not_allowed_to_login', { type: 'error' });\n navigate.replace('/login');\n } else if (searchParams.has('redirect')) {\n notify('auth.message.user_connected', { type: 'info' });\n window.location.href = searchParams.get('redirect');\n } else if (searchParams.has('new') && searchParams.get('new') === 'true') {\n notify('auth.message.new_user_created', { type: 'info' });\n window.location.href = `/${userResource}/${encodeURIComponent(webId)}`;\n } else {\n notify('auth.message.user_connected', { type: 'info' });\n window.location.href = '/';\n }\n }\n }\n\n if (searchParams.has('logout')) {\n // Delete token and any other value in local storage\n localStorage.clear();\n notify('auth.message.user_disconnected', { type: 'info' });\n navigate('/');\n }\n })();\n }, [searchParams, navigate, notify, userResource]);\n\n const updateBackgroundImage = () => {\n if (!backgroundImageLoaded && containerRef.current) {\n containerRef.current.style.backgroundImage = `url(${backgroundImage})`;\n backgroundImageLoaded = true;\n }\n };\n\n // Load background image asynchronously to speed up time to interactive\n const lazyLoadBackgroundImage = () => {\n if (backgroundImage) {\n const img = new Image();\n img.onload = updateBackgroundImage;\n img.src = backgroundImage;\n }\n };\n\n useEffect(() => {\n if (!backgroundImageLoaded) {\n lazyLoadBackgroundImage();\n }\n });\n\n if (isLoading) return null;\n\n return (\n \n \n
\n \n \n \n
\n {text && {text}}\n {buttons?.map((button, i) => (\n \n {React.cloneElement(button, {\n fullWidth: true,\n variant: 'outlined',\n type: 'submit',\n onClick: () => login({}, '/login')\n })}\n \n ))}\n
\n
\n );\n};\n\nconst PREFIX = 'SsoLoginPage';\n\nexport const SsoLoginPageClasses = {\n card: `${PREFIX}-card`,\n avatar: `${PREFIX}-avatar`,\n icon: `${PREFIX}-icon`,\n switch: `${PREFIX}-switch`\n};\n\nconst Root = styled('div', {\n name: PREFIX,\n overridesResolver: (props, styles) => styles.root\n})(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n minHeight: '100vh',\n height: '1px',\n alignItems: 'center',\n justifyContent: 'flex-start',\n backgroundRepeat: 'no-repeat',\n backgroundSize: 'cover',\n backgroundImage: 'radial-gradient(circle at 50% 14em, #313264 0%, #00023b 60%, #00023b 100%)',\n [`& .${SsoLoginPageClasses.card}`]: {\n minWidth: 300,\n marginTop: '6em'\n },\n [`& .${SsoLoginPageClasses.avatar}`]: {\n margin: '1em',\n display: 'flex',\n justifyContent: 'center'\n },\n [`& .${SsoLoginPageClasses.icon}`]: {\n backgroundColor: theme.palette.secondary[500]\n },\n [`& .${SsoLoginPageClasses.switch}`]: {\n marginBottom: '1em',\n display: 'flex',\n justifyContent: 'center'\n }\n}));\n\nSsoLoginPage.defaultProps = {\n propertiesExist: [],\n // TODO deprecate this\n buttons: [],\n userResource: 'Person'\n};\n\nexport default SsoLoginPage;\n","import { useEffect, useMemo } from 'react';\nimport { Link, useSearchParams } from 'react-router-dom';\nimport { useTranslate, useGetIdentity } from 'react-admin';\nimport { Box, Card, Typography } from '@mui/material';\nimport LockIcon from '@mui/icons-material/Lock';\nimport SignupForm from './SignupForm';\nimport LoginForm from './LoginForm';\nimport NewPasswordForm from './NewPasswordForm';\nimport ResetPasswordForm from './ResetPasswordForm';\nimport SimpleBox from './SimpleBox';\nimport { defaultScorer } from '../../passwordScorer';\nimport getSearchParamsRest from './getSearchParamsRest';\n\n/**\n * @param {object} props Props\n * @param {boolean} props.hasSignup If to show signup form.\n * @param {boolean} props.allowUsername Indicates, if login is allowed with username (instead of email).\n * @param {function} props.onLogin Optional function to call when login is completed\n * @param {function} props.onSignup Optional function to call when signup is completed\n * @param {object} props.additionalSignupValues\n * @param {object} props.passwordScorer Scorer to evaluate and indicate password strength.\n * Set to `null` or `false`, if you don't want password strength checks. Default is\n * passwordStrength's `defaultScorer`.\n * @returns\n */\nconst LocalLoginPage = ({\n hasSignup,\n allowUsername,\n onLogin,\n onSignup,\n additionalSignupValues,\n passwordScorer = defaultScorer\n}) => {\n const translate = useTranslate();\n const [searchParams] = useSearchParams();\n const isSignup = hasSignup && searchParams.has('signup');\n const isResetPassword = searchParams.has('reset_password');\n const isNewPassword = searchParams.has('new_password');\n const isLogin = !isSignup && !isResetPassword && !isNewPassword;\n const redirectTo = searchParams.get('redirect') || '/';\n const { data: identity, isLoading } = useGetIdentity();\n\n useEffect(() => {\n (async () => {\n if (!isLoading && identity?.id) {\n if (onLogin) {\n onLogin(redirectTo);\n } else {\n window.location.href = redirectTo;\n }\n }\n })();\n }, [identity, isLoading, redirectTo, onLogin]);\n\n const [title, text] = useMemo(() => {\n if (isSignup) {\n return ['auth.action.signup', 'auth.helper.signup'];\n }\n if (isLogin) {\n return ['auth.action.login', 'auth.helper.login'];\n }\n if (isResetPassword) {\n return ['auth.action.reset_password', 'auth.helper.reset_password'];\n }\n if (isNewPassword) {\n return ['auth.action.set_new_password', 'auth.helper.set_new_password'];\n }\n }, [isSignup, isLogin, isResetPassword, isNewPassword]);\n\n if (isLoading || identity?.id) return null;\n\n return (\n }>\n \n {isLogin && }\n {isSignup && (\n \n )}\n {isResetPassword && }\n {isNewPassword && }\n \n {(isSignup || isResetPassword) && (\n \n {translate('auth.action.login')}\n \n )}\n {isLogin && (\n <>\n {hasSignup && (\n
\n \n {translate('auth.action.signup')}\n \n
\n )}\n
\n \n {translate('auth.action.reset_password')}\n \n
\n \n )}\n
\n
\n
\n );\n};\n\nLocalLoginPage.defaultProps = {\n hasSignup: true,\n allowUsername: false,\n additionalSignupValues: {}\n};\n\nexport default LocalLoginPage;\n","import React from 'react';\nimport { useForm, FormProvider } from 'react-hook-form';\nimport createSlug from 'speakingurl';\nimport { useTranslate, useNotify, useSafeSetState, useLocaleState } from 'react-admin';\nimport { useSearchParams } from 'react-router-dom';\nimport { Button, CardContent, TextField, Typography } from '@mui/material';\nimport useSignup from '../../hooks/useSignup';\nimport validatePasswordStrength from './validatePasswordStrength';\nimport PasswordStrengthIndicator from './PasswordStrengthIndicator';\nimport { defaultScorer } from '../../passwordScorer';\n\n/**\n * @param {function} props.onSignup Optional function to call when signup is completed\n * @param {object} props.additionalSignupValues\n * @param {number} delayBeforeRedirect\n * @param {object} passwordScorer Scorer to evaluate and indicate password strength.\n * Set to `null` or `false`, if you don't want password strength checks. Default is\n * passwordStrength's `defaultScorer`.\n * @returns\n */\nconst SignupForm = ({ passwordScorer = defaultScorer, onSignup, additionalSignupValues, delayBeforeRedirect = 0 }) => {\n const [loading, setLoading] = useSafeSetState(false);\n const signup = useSignup();\n const translate = useTranslate();\n const notify = useNotify();\n const [searchParams] = useSearchParams();\n const redirectTo = searchParams.get('redirect') || '/';\n const [locale] = useLocaleState();\n\n const methods = useForm({\n defaultValues: {\n username: '',\n email: searchParams.get('email') || '',\n password: ''\n }\n });\n\n const {\n handleSubmit,\n register,\n formState: { errors, isSubmitting },\n watch,\n reset\n } = methods;\n\n const password = watch('password');\n\n const onSubmit = async values => {\n try {\n setLoading(true);\n await signup({\n ...values,\n ...additionalSignupValues\n });\n setTimeout(() => {\n if (onSignup) {\n onSignup(redirectTo);\n } else {\n window.location.href = redirectTo;\n }\n }, delayBeforeRedirect);\n } catch (error) {\n setLoading(false);\n // Reset form to current values to ensure consistency...\n reset(values, { keepValues: true });\n notify(\n typeof error === 'string'\n ? error\n : typeof error === 'undefined' || !error.message\n ? 'ra.auth.sign_in_error'\n : error.message,\n {\n type: 'warning',\n _: typeof error === 'string' ? error : error && error.message ? error.message : undefined\n }\n );\n }\n };\n\n const formatUsername = value => {\n return value\n ? createSlug(value, {\n lang: locale || 'fr',\n separator: '_',\n custom: ['.', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']\n })\n : '';\n };\n\n return (\n \n
\n \n \n\n \n\n {passwordScorer && password && !(searchParams.has('email') && searchParams.has('force-email')) && (\n <>\n \n {translate('auth.input.password_strength')}:{' '}\n \n \n \n )}\n\n validatePasswordStrength(passwordScorer)(value)\n })}\n type=\"password\"\n value={password}\n label={translate('ra.auth.password')}\n error={!!errors.password}\n helperText={translate(errors.password?.message)}\n autoComplete=\"new-password\"\n fullWidth\n disabled={loading || (searchParams.has('email') && searchParams.has('force-email'))}\n />\n\n \n {translate('auth.action.signup')}\n \n \n
\n
\n );\n};\n\nexport default SignupForm;\n","import { useCallback } from 'react';\nimport { useAuthProvider } from 'react-admin';\n\nconst useSignup = () => {\n const authProvider = useAuthProvider();\n\n return useCallback((params = {}) => authProvider.signup(params), [authProvider]);\n};\n\nexport default useSignup;\n","import { defaultScorer } from '../../passwordScorer';\n\nconst validatePasswordStrength = (scorer = defaultScorer) => value => {\n if (!scorer) return undefined;\n const strength = scorer.scoreFn(value);\n if (strength < scorer.minRequiredScore) {\n return 'auth.input.password_too_weak';\n }\n return undefined;\n};\n\nexport default validatePasswordStrength;\n","// Inspired by https://github.com/bartlomiejzuber/password-strength-score\n\n/**\n * @typedef PasswordStrengthOptions\n * @property {number} isVeryLongLength - Required characters for a very long password (default: 12)\n * @property {number} isLongLength - Required characters for a long password (default: 6)\n * @property {number} isVeryLongScore - Score for a very long password (default: 2.5)\n * @property {number} isLongScore - Score for a long password (default: 1.5)\n * @property {number} uppercaseScore - Score for a password with uppercase letters (default: 1)\n * @property {number} lowercaseScore - Score for a password with lowercase letters (default: 1)\n * @property {number} numbersScore - Score for a password with numbers (default: 1)\n * @property {number} nonAlphanumericsScore - Score for a password without non-alphanumeric characters (default: 1)\n */\n\n/** @type {PasswordStrengthOptions} */\nexport const defaultOptions = {\n isVeryLongLength: 14,\n isLongLength: 8,\n isLongScore: 2,\n isVeryLongScore: 4,\n uppercaseScore: 1,\n lowercaseScore: 1,\n numbersScore: 1,\n nonAlphanumericsScore: 1\n};\n\n/**\n *\n * @param {string} password Password text.\n * @param {PasswordStrengthOptions} options Password options.\n * @returns {number} The password strength score.\n */\nexport const passwordStrength = (password, options) => {\n if (!password) {\n return 0;\n }\n\n const mergedOptions = { ...defaultOptions, ...options };\n\n const longScore = (password.length >= mergedOptions.isLongLength && mergedOptions.isLongScore) || 0;\n const veryLongScore = (password.length >= mergedOptions.isVeryLongLength && mergedOptions.isVeryLongScore) || 0;\n const lowercaseScore = (/[a-z]/.test(password) && mergedOptions.lowercaseScore) || 0;\n const uppercaseScore = (/[A-Z]/.test(password) && mergedOptions.uppercaseScore) || 0;\n const numbersScore = (/\\d/.test(password) && mergedOptions.numbersScore) || 0;\n const nonalphasScore = (/\\W/.test(password) && mergedOptions.nonAlphanumericsScore) || 0;\n\n return uppercaseScore + lowercaseScore + numbersScore + nonalphasScore + longScore + veryLongScore;\n};\n\nexport const createPasswordScorer = (options = defaultOptions, minRequiredScore = 5) => {\n const mergedOptions = { ...defaultOptions, ...options };\n\n return {\n scoreFn: password => passwordStrength(password, mergedOptions),\n minRequiredScore,\n maxScore:\n mergedOptions.uppercaseScore +\n mergedOptions.lowercaseScore +\n mergedOptions.numbersScore +\n mergedOptions.nonAlphanumericsScore +\n mergedOptions.isLongScore +\n mergedOptions.isVeryLongScore\n };\n};\n\nexport const defaultScorer = createPasswordScorer(defaultOptions, 5);\n","import React from 'react';\nimport ColorGradientProgressBar from './ColorGradientProgressBar';\nimport { defaultScorer } from '../../passwordScorer';\n\nexport default function PasswordStrengthIndicator({ scorer = defaultScorer, password, ...restProps }) {\n const strength = scorer.scoreFn(password);\n return ;\n}\n","import React from 'react';\nimport { LinearProgress } from '@mui/material';\nimport { withStyles } from '@mui/styles';\n\n/**\n * @typedef {object} Color\n * @property {number} red\n * @property {number} green\n * @property {number} blue\n */\n\n/**\n * Calculate a rgb-color from a gradient between `color1` and `color2`\n * @param {number} fade - Indicates the fade between `color1` and `color2` in the range [0, 1].\n * @param {Color} color1\n * @param {Color} color2\n * @returns {string} `` `rgb(${red}, ${green}, ${blue})` ``\n */\nconst colorGradient = (fade, color1, color2) => {\n const diffRed = color2.red - color1.red;\n const diffGreen = color2.green - color1.green;\n const diffBlue = color2.blue - color1.blue;\n\n const gradient = {\n red: Math.floor(color1.red + diffRed * fade),\n green: Math.floor(color1.green + diffGreen * fade),\n blue: Math.floor(color1.blue + diffBlue * fade)\n };\n\n return `rgb(${gradient.red},${gradient.green},${gradient.blue})`;\n};\n\n/**\n * A progress bar that changes its color between its min an max value.\n * @param {object} props\n * @param {Color} [props.badColor] - default: `#FF4047`\n * @param {Color} [props.goodColor] - default: `#00FF6E`\n * @param {number} props.maxVal\n * @param {number} props.minVal\n * @param {number} props.currentVal\n */\nexport default function ColorGradientProgressBar(props) {\n const { minVal, maxVal, currentVal, badColor, goodColor, ...restProps } = props;\n\n const color1 = badColor || { red: 0xff, green: 0x40, blue: 0x47 };\n const color2 = goodColor || { red: 0x00, green: 0xff, blue: 0x6e };\n\n const fade = Math.max(0, Math.min(1, (currentVal - minVal) / (maxVal - minVal)));\n const currentColor = colorGradient(fade, color1, color2);\n\n const StyledLinearProgress = withStyles({\n colorPrimary: {\n backgroundColor: 'black' // '#e0e0e0'\n },\n barColorPrimary: {\n backgroundColor: currentColor\n }\n })(LinearProgress);\n\n return ;\n}\n","import { useForm, FormProvider } from 'react-hook-form';\nimport { useTranslate, useNotify, useSafeSetState, useLogin, email } from 'react-admin';\nimport { useSearchParams } from 'react-router-dom';\nimport { Button, CardContent, TextField } from '@mui/material';\n\nconst LoginForm = ({ onLogin, allowUsername }) => {\n const [loading, setLoading] = useSafeSetState(false);\n const login = useLogin();\n const translate = useTranslate();\n const notify = useNotify();\n const [searchParams] = useSearchParams();\n const redirectTo = searchParams.get('redirect') || '/';\n\n const methods = useForm({\n defaultValues: {\n username: searchParams.get('email') || '',\n password: ''\n }\n });\n\n const {\n handleSubmit,\n register,\n formState: { errors, isSubmitting },\n reset\n } = methods;\n\n const onSubmit = async values => {\n try {\n setLoading(true);\n await login(values);\n if (onLogin) {\n onLogin(redirectTo);\n } else {\n window.location.href = redirectTo;\n }\n } catch (error) {\n setLoading(false);\n // Reset form to current values to ensure consistency\n reset(values, { keepValues: true });\n notify(\n typeof error === 'string'\n ? error\n : typeof error === 'undefined' || !error.message\n ? 'ra.auth.sign_in_error'\n : error.message,\n {\n type: 'warning',\n messageArgs: {\n _: typeof error === 'string' ? error : error && error.message ? error.message : undefined\n }\n }\n );\n }\n };\n\n return (\n \n
\n \n {\n if (!allowUsername) {\n const validationRes = email()(value);\n return validationRes.message ?? validationRes ?? true;\n }\n return true;\n },\n setValueAs: value => value.toLowerCase()\n })}\n label={translate(allowUsername ? 'auth.input.username_or_email' : 'auth.input.email')}\n error={!!errors.username}\n helperText={translate(errors.username?.message)}\n autoComplete=\"email\"\n fullWidth\n disabled={loading || (searchParams.has('email') && searchParams.has('force-email'))}\n margin=\"normal\"\n />\n\n \n\n \n {translate('auth.action.login')}\n \n \n
\n
\n );\n};\n\nLoginForm.defaultValues = {\n allowUsername: false\n};\n\nexport default LoginForm;\n","import React, { useState } from 'react';\nimport { Form, useTranslate, useNotify, useSafeSetState, useAuthProvider, TextInput, required } from 'react-admin';\nimport { useLocation } from 'react-router-dom';\nimport { Button, CardContent, Typography } from '@mui/material';\nimport PasswordStrengthIndicator from './PasswordStrengthIndicator';\nimport validatePasswordStrength from './validatePasswordStrength';\nimport { defaultScorer } from '../../passwordScorer';\n\nconst samePassword = (value, allValues) => {\n if (value && value !== allValues.password) {\n return 'Mot de passe différent du premier';\n }\n};\n\n/**\n *\n * @param {string} redirectTo\n * @param {Object} passwordScorer Scorer to evaluate and indicate password strength.\n * Set to `null` or `false`, if you don't want password strength checks. Default is\n * passwordStrength's `defaultScorer`.\n * @returns\n */\nconst NewPasswordForm = ({ redirectTo, passwordScorer = defaultScorer }) => {\n const location = useLocation();\n const searchParams = new URLSearchParams(location.search);\n const token = searchParams.get('token');\n\n const [loading, setLoading] = useSafeSetState(false);\n const authProvider = useAuthProvider();\n\n const translate = useTranslate();\n const notify = useNotify();\n\n const [newPassword, setNewPassword] = useState('');\n\n const submit = values => {\n setLoading(true);\n authProvider\n .setNewPassword({ ...values, token })\n .then(() => {\n setTimeout(() => {\n const url = new URL('/login', window.location.origin);\n if (redirectTo) url.searchParams.append('redirect', redirectTo);\n url.searchParams.append('email', values.email);\n window.location.href = url.toString();\n setLoading(false);\n }, 2000);\n notify('auth.notification.password_changed', { type: 'info' });\n })\n .catch(error => {\n setLoading(false);\n notify(\n typeof error === 'string'\n ? error\n : typeof error === 'undefined' || !error.message\n ? 'auth.notification.reset_password_error'\n : error.message,\n {\n type: 'warning',\n messageArgs: {\n _: typeof error === 'string' ? error : error && error.message ? error.message : undefined\n }\n }\n );\n });\n };\n\n return (\n
\n \n (value ? value.toLowerCase() : '')}\n />\n {passwordScorer && (\n <>\n \n {translate('auth.input.password_strength')}:{' '}\n \n\n \n \n )}\n setNewPassword(e.target.value)}\n />\n \n \n \n
\n );\n};\n\nexport default NewPasswordForm;\n","import React from 'react';\nimport { Form, TextInput, required, useTranslate, useNotify, useSafeSetState, useAuthProvider } from 'react-admin';\nimport { Button, CardContent } from '@mui/material';\n\nconst ResetPasswordForm = () => {\n const [loading, setLoading] = useSafeSetState(false);\n const authProvider = useAuthProvider();\n const translate = useTranslate();\n const notify = useNotify();\n\n const submit = values => {\n setLoading(true);\n authProvider\n .resetPassword({ ...values })\n .then(res => {\n setLoading(false);\n notify('auth.notification.reset_password_submitted', { type: 'info' });\n })\n .catch(error => {\n setLoading(false);\n notify(\n typeof error === 'string'\n ? error\n : typeof error === 'undefined' || !error.message\n ? 'auth.notification.reset_password_error'\n : error.message,\n {\n type: 'warning',\n messageArgs: {\n _: typeof error === 'string' ? error : error && error.message ? error.message : undefined\n }\n }\n );\n });\n };\n\n return (\n
\n \n (value ? value.toLowerCase() : '')}\n />\n \n \n
\n );\n};\n\nexport default ResetPasswordForm;\n","import React from 'react';\nimport { Box, Card, Typography } from '@mui/material';\nimport { Notification } from 'react-admin';\nimport makeStyles from '@mui/styles/makeStyles';\n\nconst useStyles = makeStyles(theme => ({\n '@global': {\n body: {\n backgroundColor: theme.palette.secondary.main\n }\n },\n root: {\n backgroundColor: theme.palette.secondary.main,\n [theme.breakpoints.down('sm')]: {\n padding: '1em'\n }\n },\n card: {\n width: '100%',\n maxWidth: 450,\n marginTop: '6em'\n },\n icon: {\n marginTop: 5,\n marginRight: 5\n },\n title: {\n [theme.breakpoints.down('sm')]: {\n fontWeight: 'bold',\n marginTop: 12\n }\n }\n}));\n\nconst SimpleBox = ({ title, icon, text, children }) => {\n const classes = useStyles();\n return (\n \n \n \n {icon && React.cloneElement(icon, { fontSize: 'large', className: classes.icon })}\n \n {title}\n \n \n \n {text}\n \n {children}\n \n \n \n );\n};\n\nexport default SimpleBox;\n","const USED_SEARCH_PARAMS = ['signup', 'reset_password', 'new_password', 'email', 'force-email'];\n\nconst getSearchParamsRest = searchParams => {\n const rest = [];\n for (const [key, value] of searchParams.entries()) {\n if (!USED_SEARCH_PARAMS.includes(key)) {\n rest.push(`${key}=${encodeURIComponent(value)}`);\n }\n }\n return rest.length > 0 ? rest.join('&') : '';\n};\n\nexport default getSearchParamsRest;\n","import React from 'react';\nimport { Resource, usePermissions } from 'react-admin';\nimport { useCreateContainer } from '@semapps/semantic-data-provider';\nimport { rightsToCreate } from '../constants';\n\n// Not used for now. The ListWithPermissions component will handle the conditional display of the Create button.\nconst ResourceWithPermission = ({ name, create, ...rest }) => {\n const createContainer = useCreateContainer(name);\n const { permissions } = usePermissions(createContainer);\n return (\n rightsToCreate.includes(p['acl:mode'])) ? create : undefined}\n // Requesting permissions to list container is too long, we will avoid that for now\n // list={permissions && permissions.some(p => rightsToList.includes(p['acl:mode'])) ? list : undefined}\n />\n );\n};\n\nexport default ResourceWithPermission;\n","import React, { forwardRef, useCallback } from 'react';\nimport { Logout, UserMenu as RaUserMenu, useGetIdentity, useTranslate, useUserMenu } from 'react-admin';\nimport { MenuItem, ListItemIcon, ListItemText } from '@mui/material';\nimport AccountCircleIcon from '@mui/icons-material/AccountCircle';\nimport EditIcon from '@mui/icons-material/Edit';\nimport { useNavigate } from 'react-router-dom';\n\n// It's important to pass the ref to allow Material UI to manage the keyboard navigation\nconst UserMenuItem = forwardRef(({ label, icon, to, ...rest }, ref) => {\n const { onClose } = useUserMenu();\n const translate = useTranslate();\n const navigate = useNavigate();\n const onClick = useCallback(() => {\n navigate(to);\n onClose();\n }, [to, onClose, navigate]);\n return (\n \n {icon && {React.cloneElement(icon, { fontSize: 'small' })}}\n {translate(label)}\n \n );\n});\n\nconst UserMenu = ({ logout, profileResource, ...otherProps }) => {\n const { data: identity } = useGetIdentity();\n return (\n \n {identity && identity.id !== ''\n ? [\n }\n to={`/${profileResource}/${encodeURIComponent(identity?.profileData?.id || identity.id)}/show`}\n />,\n }\n to={`/${profileResource}/${encodeURIComponent(identity?.profileData?.id || identity.id)}`}\n />,\n React.cloneElement(logout, { key: 'logout' })\n ]\n : [\n ,\n \n ]}\n \n );\n};\n\nUserMenu.defaultProps = {\n logout: ,\n profileResource: 'Person'\n};\n\nexport default UserMenu;\n","import { useEffect } from 'react';\nimport { useGetIdentity, useNotify, useRedirect } from 'react-admin';\nimport { useLocation } from 'react-router-dom';\n\nconst useCheckAuthenticated = message => {\n const { data: identity, isLoading } = useGetIdentity();\n const notify = useNotify();\n const redirect = useRedirect();\n const location = useLocation();\n\n useEffect(() => {\n if (!isLoading && !identity?.id) {\n notify(message || 'ra.auth.auth_check_error', { type: 'error' });\n redirect(`/login?redirect=${encodeURIComponent(location.pathname + location.search)}`);\n }\n }, [isLoading, identity, redirect, notify, location]);\n\n return { identity, isLoading };\n};\n\nexport default useCheckAuthenticated;\n","import { useEffect, useCallback } from 'react';\nimport isEqual from 'lodash/isEqual';\nimport { useGetPermissions, useSafeSetState } from 'react-admin';\n\nconst emptyParams = {};\n\n// keep a cache of already fetched permissions to initialize state for new\n// components and avoid a useless rerender if the permissions haven't changed\nconst alreadyFetchedPermissions = { '{}': undefined };\n\n// Fork of usePermissionsOptimized, with a refetch option\nconst usePermissionsWithRefetch = (params = emptyParams) => {\n const key = JSON.stringify(params);\n const [state, setState] = useSafeSetState({\n permissions: alreadyFetchedPermissions[key]\n });\n const getPermissions = useGetPermissions();\n\n const fetchPermissions = useCallback(\n () =>\n getPermissions(params)\n .then(permissions => {\n if (!isEqual(permissions, state.permissions)) {\n alreadyFetchedPermissions[key] = permissions;\n setState({ permissions });\n }\n })\n .catch(error => {\n setState({\n error\n });\n }),\n [key, params, getPermissions]\n );\n\n useEffect(() => {\n fetchPermissions();\n }, [key]);\n\n return { ...state, refetch: fetchPermissions };\n};\n\nexport default usePermissionsWithRefetch;\n","const englishMessages = {\n auth: {\n dialog: {\n container_permissions: 'Container permissions',\n resource_permissions: 'Resource permissions',\n login_required: 'Login required'\n },\n action: {\n submit: 'Submit',\n permissions: 'Permissions',\n signup: 'Signup',\n reset_password: 'Reset password',\n set_new_password: 'Set new password',\n logout: 'Logout',\n login: 'Login',\n view_my_profile: 'View my profile',\n edit_my_profile: 'Edit my profile'\n },\n right: {\n resource: {\n read: 'Read',\n append: 'Append',\n write: 'Write',\n control: 'Control'\n },\n container: {\n read: 'List',\n append: 'Add',\n write: 'Add',\n control: 'Control'\n }\n },\n agent: {\n anonymous: 'All users',\n authenticated: 'Connected users'\n },\n input: {\n agent_select: 'Add an user...',\n name: 'Surname',\n username: 'User ID',\n email: 'Email address',\n username_or_email: 'User ID or email address',\n current_password: 'Current password',\n new_password: 'New password',\n confirm_new_password: 'Confirm new password',\n password_strength: 'Password strength',\n password_too_weak: 'Password too weak. Increase length or add special characters.'\n },\n helper: {\n login: 'Sign in to your account',\n signup: 'Create your account',\n reset_password: 'Enter your email address below and we will send you a link to reset your password',\n set_new_password: 'Please enter your email address and a new password below'\n },\n message: {\n resource_show_forbidden: 'You are not allowed to view this resource',\n resource_edit_forbidden: 'You are not allowed to edit this resource',\n resource_delete_forbidden: 'You are not allowed to delete this resource',\n resource_control_forbidden: 'You are not allowed to control this resource',\n container_create_forbidden: 'You are not allowed to create new resource',\n container_list_forbidden: 'You are not allowed to list these resources',\n unable_to_fetch_user_data: 'Unable to fetch user data',\n no_token_returned: 'No token returned',\n no_associated_oidc_issuer: 'No OIDC issuer associated with the provided WebID',\n invalid_token_returned: 'Invalid token returned',\n signup_error: 'Account registration failed',\n user_not_allowed_to_login: 'You are not allowed to login with this account',\n user_email_not_found: 'No account found with this email address',\n user_email_exist: 'An account already exist with this email address',\n username_exist: 'An account already exist with this user ID',\n username_invalid: 'This username is invalid. Only lowercase characters, numbers, dots and hyphens are authorized',\n new_user_created: 'Your account has been successfully created',\n user_connected: 'You are now connected',\n user_disconnected: 'You are now disconnected',\n bad_request: 'Bad request (Error message returned by the server: %{error})',\n account_settings_updated: 'Your account settings have been successfully updated',\n login_to_continue: 'Please login to continue',\n choose_pod_provider:\n 'Please choose a Pod provider in the list below. All application data will be saved on your Pod.',\n unreachable_auth_server: 'The authentication server cannot be reached'\n },\n notification: {\n reset_password_submitted: 'An email has been sent with reset password instructions',\n reset_password_error: 'An error occurred',\n password_changed: 'Password changed successfully',\n new_password_error: 'An error occurred',\n invalid_password: 'Invalid password',\n get_settings_error: 'An error occurred',\n update_settings_error: 'An error occurred'\n }\n }\n};\n\nexport default englishMessages;\n","const frenchMessages = {\n auth: {\n dialog: {\n container_permissions: 'Permissions sur le container',\n resource_permissions: 'Permissions sur la ressource',\n login_required: 'Connexion requise'\n },\n action: {\n submit: 'Soumettre',\n permissions: 'Permissions',\n signup: \"S'inscrire\",\n reset_password: 'Mot de passe oublié ?',\n set_new_password: 'Définir le mot de passe',\n logout: 'Se déconnecter',\n login: 'Se connecter',\n view_my_profile: 'Voir mon profil',\n edit_my_profile: 'Éditer mon profil'\n },\n right: {\n resource: {\n read: 'Lire',\n append: 'Enrichir',\n write: 'Modifier',\n control: 'Administrer'\n },\n container: {\n read: 'Lister',\n append: 'Ajouter',\n write: 'Ajouter',\n control: 'Administrer'\n }\n },\n agent: {\n anonymous: 'Tous les utilisateurs',\n authenticated: 'Utilisateurs connectés'\n },\n input: {\n agent_select: 'Ajouter un utilisateur...',\n name: 'Prénom',\n username: 'Identifiant unique',\n email: 'Adresse e-mail',\n username_or_email: 'Identifiant ou adresse e-mail',\n current_password: 'Mot de passe actuel',\n new_password: 'Nouveau mot de passe',\n confirm_new_password: 'Confirmer le nouveau mot de passe',\n password_strength: 'Force du mot de passe',\n password_too_weak: 'Mot de passe trop faible. Augmenter la longueur ou ajouter des caractères spéciaux.'\n },\n helper: {\n login: 'Connectez-vous à votre compte.',\n signup: 'Créez votre compte',\n reset_password:\n 'Entrez votre adresse mail ci-dessous et nous vous enverrons un lien pour réinitialiser votre mot de passe',\n set_new_password: 'Veuillez entrer votre adresse mail et un nouveau mot de passe ci-dessous'\n },\n message: {\n resource_show_forbidden: \"Vous n'avez pas la permission de voir cette ressource\",\n resource_edit_forbidden: \"Vous n'avez pas la permission d'éditer cette ressource\",\n resource_delete_forbidden: \"Vous n'avez pas la permission d'effacer cette ressource\",\n resource_control_forbidden: \"Vous n'avez pas la permission d'administrer cette ressource\",\n container_create_forbidden: \"Vous n'avez pas la permission de créer des ressources\",\n container_list_forbidden: \"Vous n'avez pas la permission de voir ces ressources\",\n unable_to_fetch_user_data: 'Impossible de récupérer les données du profil',\n no_token_returned: 'Aucun token a été retourné',\n no_associated_oidc_issuer: 'Aucun serveur de connexion associé avec le WebID fourni',\n invalid_token_returned: 'Token invalide',\n signup_error: \"L'inscription a échoué\",\n user_not_allowed_to_login: \"Vous n'avez pas le droit de vous connecter avec ce compte\",\n user_email_not_found: 'Aucun compte trouvé avec cette adresse mail',\n user_email_exist: 'Un compte existe déjà avec cette adresse mail',\n username_exist: 'Un compte existe déjà avec cet identifiant',\n username_invalid:\n \"Cet identifiant n'est pas valide. Seuls les lettres minuscules, les chiffres, les points et les tirets sont autorisés\",\n new_user_created: 'Votre compte a été créé avec succès',\n user_connected: 'Vous êtes maintenant connecté',\n user_disconnected: 'Vous êtes maintenant déconnecté',\n bad_request: \"Requête erronée (Message d'erreur renvoyé par le serveur: %{error})\",\n account_settings_updated: 'Les paramètres de votre compte ont été mis à jour avec succès',\n login_to_continue: 'Veuillez vous connecter pour continuer',\n choose_pod_provider:\n \"Veuillez choisir un fournisseur de Pods dans la liste ci-dessous. Toutes les données de l'application seront enregistrées sur votre Pod.\",\n unreachable_auth_server: 'Le serveur de connexion ne peut être atteint'\n },\n notification: {\n reset_password_submitted: 'Un e-mail a été envoyé avec les instructions de réinitialisation du mot de passe',\n reset_password_error: \"Une erreur s'est produite\",\n password_changed: 'Le mot de passe a été changé avec succès',\n new_password_error: \"Une erreur s'est produite\",\n invalid_password: 'Mot de passe incorrect',\n get_settings_error: \"Une erreur s'est produite\",\n update_settings_error: \"Une erreur s'est produite\"\n }\n }\n};\n\nexport default frenchMessages;\n"],"names":[],"version":3,"file":"index.es.js.map"} \ No newline at end of file diff --git a/src/frontend/packages/auth-provider/package.json b/src/frontend/packages/auth-provider/package.json index a7c60ad95..4dcccb3f3 100644 --- a/src/frontend/packages/auth-provider/package.json +++ b/src/frontend/packages/auth-provider/package.json @@ -30,7 +30,8 @@ "@mui/system": "^5.13.1", "react": "^18.2.0", "react-admin": "^4.11.0", - "react-router-dom": "^6.1.0" + "react-router-dom": "^6.1.0", + "react-hook-form": "^7.49.2" }, "publishConfig": { "access": "public" diff --git a/src/frontend/packages/auth-provider/src/components/LocalLoginPage/LoginForm.js b/src/frontend/packages/auth-provider/src/components/LocalLoginPage/LoginForm.js index 6b5b21cdd..7e045b620 100644 --- a/src/frontend/packages/auth-provider/src/components/LocalLoginPage/LoginForm.js +++ b/src/frontend/packages/auth-provider/src/components/LocalLoginPage/LoginForm.js @@ -1,7 +1,7 @@ -import React, { useCallback } from 'react'; -import { Form, useTranslate, useNotify, useSafeSetState, TextInput, required, email, useLogin } from 'react-admin'; +import { useForm, FormProvider } from 'react-hook-form'; +import { useTranslate, useNotify, useSafeSetState, useLogin, email } from 'react-admin'; import { useSearchParams } from 'react-router-dom'; -import { Button, CardContent } from '@mui/material'; +import { Button, CardContent, TextField } from '@mui/material'; const LoginForm = ({ onLogin, allowUsername }) => { const [loading, setLoading] = useSafeSetState(false); @@ -11,62 +11,100 @@ const LoginForm = ({ onLogin, allowUsername }) => { const [searchParams] = useSearchParams(); const redirectTo = searchParams.get('redirect') || '/'; - const submit = useCallback( - async values => { - try { - setLoading(true); - await login(values); - if (onLogin) { - onLogin(redirectTo); - } else { - window.location.href = redirectTo; - } - } catch (error) { - setLoading(false); - notify( - typeof error === 'string' - ? error - : typeof error === 'undefined' || !error.message - ? 'ra.auth.sign_in_error' - : error.message, - { - type: 'warning', - messageArgs: { - _: typeof error === 'string' ? error : error && error.message ? error.message : undefined - } - } - ); + const methods = useForm({ + defaultValues: { + username: searchParams.get('email') || '', + password: '' + } + }); + + const { + handleSubmit, + register, + formState: { errors, isSubmitting }, + reset + } = methods; + + const onSubmit = async values => { + try { + setLoading(true); + await login(values); + if (onLogin) { + onLogin(redirectTo); + } else { + window.location.href = redirectTo; } - }, - [setLoading, login, redirectTo, notify, onLogin] - ); + } catch (error) { + setLoading(false); + // Reset form to current values to ensure consistency + reset(values, { keepValues: true }); + notify( + typeof error === 'string' + ? error + : typeof error === 'undefined' || !error.message + ? 'ra.auth.sign_in_error' + : error.message, + { + type: 'warning', + messageArgs: { + _: typeof error === 'string' ? error : error && error.message ? error.message : undefined + } + } + ); + } + }; return ( -
- - (value ? value.toLowerCase() : '')} - validate={allowUsername ? [required()] : [required(), email()]} - /> - - - -
+ +
+ + { + if (!allowUsername) { + const validationRes = email()(value); + return validationRes.message ?? validationRes ?? true; + } + return true; + }, + setValueAs: value => value.toLowerCase() + })} + label={translate(allowUsername ? 'auth.input.username_or_email' : 'auth.input.email')} + error={!!errors.username} + helperText={translate(errors.username?.message)} + autoComplete="email" + fullWidth + disabled={loading || (searchParams.has('email') && searchParams.has('force-email'))} + margin="normal" + /> + + + + + +
+
); }; diff --git a/src/frontend/packages/auth-provider/src/components/LocalLoginPage/SignupForm.js b/src/frontend/packages/auth-provider/src/components/LocalLoginPage/SignupForm.js index 2cacbcb68..2ddef48a2 100644 --- a/src/frontend/packages/auth-provider/src/components/LocalLoginPage/SignupForm.js +++ b/src/frontend/packages/auth-provider/src/components/LocalLoginPage/SignupForm.js @@ -1,18 +1,9 @@ -import React, { useCallback, useState } from 'react'; +import React from 'react'; +import { useForm, FormProvider } from 'react-hook-form'; import createSlug from 'speakingurl'; -import { - Form, - useTranslate, - useNotify, - useSafeSetState, - TextInput, - minLength, - required, - email, - useLocaleState -} from 'react-admin'; +import { useTranslate, useNotify, useSafeSetState, useLocaleState } from 'react-admin'; import { useSearchParams } from 'react-router-dom'; -import { Button, CardContent, Typography } from '@mui/material'; +import { Button, CardContent, TextField, Typography } from '@mui/material'; import useSignup from '../../hooks/useSignup'; import validatePasswordStrength from './validatePasswordStrength'; import PasswordStrengthIndicator from './PasswordStrengthIndicator'; @@ -35,100 +26,142 @@ const SignupForm = ({ passwordScorer = defaultScorer, onSignup, additionalSignup const [searchParams] = useSearchParams(); const redirectTo = searchParams.get('redirect') || '/'; const [locale] = useLocaleState(); - const [password, setPassword] = useState(''); - const submit = useCallback( - async values => { - try { - setLoading(true); - await signup({ - ...values, - ...additionalSignupValues - }); - setTimeout(() => { - if (onSignup) { - onSignup(redirectTo); - } else { - window.location.href = redirectTo; - } - }, delayBeforeRedirect); - } catch (error) { - setLoading(false); - notify( - typeof error === 'string' - ? error - : typeof error === 'undefined' || !error.message - ? 'ra.auth.sign_in_error' - : error.message, - { - type: 'warning', - _: typeof error === 'string' ? error : error && error.message ? error.message : undefined - } - ); - } - }, - [setLoading, signup, additionalSignupValues, redirectTo, notify, onSignup] - ); + const methods = useForm({ + defaultValues: { + username: '', + email: searchParams.get('email') || '', + password: '' + } + }); + + const { + handleSubmit, + register, + formState: { errors, isSubmitting }, + watch, + reset + } = methods; + + const password = watch('password'); + + const onSubmit = async values => { + try { + setLoading(true); + await signup({ + ...values, + ...additionalSignupValues + }); + setTimeout(() => { + if (onSignup) { + onSignup(redirectTo); + } else { + window.location.href = redirectTo; + } + }, delayBeforeRedirect); + } catch (error) { + setLoading(false); + // Reset form to current values to ensure consistency... + reset(values, { keepValues: true }); + notify( + typeof error === 'string' + ? error + : typeof error === 'undefined' || !error.message + ? 'ra.auth.sign_in_error' + : error.message, + { + type: 'warning', + _: typeof error === 'string' ? error : error && error.message ? error.message : undefined + } + ); + } + }; + + const formatUsername = value => { + return value + ? createSlug(value, { + lang: locale || 'fr', + separator: '_', + custom: ['.', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] + }) + : ''; + }; return ( -
- - - value - ? createSlug(value, { - lang: locale || 'fr', - separator: '_', - custom: ['.', '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] - }) - : '' - } - /> - - {passwordScorer && password && !(searchParams.has('email') && searchParams.has('force-email')) && ( - <> - - {translate('auth.input.password_strength')}:{' '} - - - - )} - setPassword(e.target.value)} - label={translate('ra.auth.password')} - autoComplete="new-password" - fullWidth - disabled={loading || (searchParams.has('email') && searchParams.has('force-email'))} - validate={[required(), validatePasswordStrength(passwordScorer)]} - /> - - -
- ); -}; + +
+ + + + + + {passwordScorer && password && !(searchParams.has('email') && searchParams.has('force-email')) && ( + <> + + {translate('auth.input.password_strength')}:{' '} + + + + )} -SignupForm.defaultValues = { - redirectTo: '/', - additionalSignupValues: {} + validatePasswordStrength(passwordScorer)(value) + })} + type="password" + value={password} + label={translate('ra.auth.password')} + error={!!errors.password} + helperText={translate(errors.password?.message)} + autoComplete="new-password" + fullWidth + disabled={loading || (searchParams.has('email') && searchParams.has('force-email'))} + /> + + + +
+
+ ); }; export default SignupForm; From 2eea4893e4c4795e703ebfdd19bc0e16f55d2979 Mon Sep 17 00:00:00 2001 From: Laurin Weger <59744144+Laurin-W@users.noreply.github.com> Date: Fri, 11 Oct 2024 12:30:58 +0200 Subject: [PATCH 3/3] chore: add caching for context.json --- src/middleware/packages/jsonld/service.js | 9 ++++++--- src/middleware/packages/jsonld/services/api/index.js | 11 ++++++++++- website/docs/middleware/jsonld/index.md | 11 ++++++----- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/middleware/packages/jsonld/service.js b/src/middleware/packages/jsonld/service.js index 6b3c7f27d..c729938f3 100644 --- a/src/middleware/packages/jsonld/service.js +++ b/src/middleware/packages/jsonld/service.js @@ -9,11 +9,13 @@ module.exports = { settings: { baseUri: null, localContextPath: '.well-known/context.jsonld', - cachedContextFiles: [] + cachedContextFiles: [], + /** Indicate that the context.jsonld may be cached by the browser for the given amount of seconds. @default 21600 */ + cacheFor: 21600 }, dependencies: ['ontologies'], async created() { - const { baseUri, localContextPath, cachedContextFiles } = this.settings; + const { baseUri, localContextPath, cachedContextFiles, cacheFor } = this.settings; if (!baseUri || !localContextPath) { throw new Error('The baseUri and localContextPath settings are required'); @@ -50,7 +52,8 @@ module.exports = { this.broker.createService({ mixins: [JsonLdApiService], settings: { - localContextPath + localContextPath, + cacheFor } }); } diff --git a/src/middleware/packages/jsonld/services/api/index.js b/src/middleware/packages/jsonld/services/api/index.js index 408f9a0ed..129b8bbf0 100644 --- a/src/middleware/packages/jsonld/services/api/index.js +++ b/src/middleware/packages/jsonld/services/api/index.js @@ -1,7 +1,9 @@ module.exports = { name: 'jsonld.api', settings: { - localContextPath: null + localContextPath: null, + /** Indicate that the context may be cached by the browser for the given amount of seconds. @default 21600 */ + cacheFor: 21600 }, dependencies: ['api'], async started() { @@ -21,6 +23,13 @@ module.exports = { actions: { async getContext(ctx) { ctx.meta.$responseType = 'application/ld+json'; + if (this.settings.cacheFor) { + // Consider context fresh for `this.settings.cacheFor` seconds. + ctx.meta.$responseHeaders = { + ...ctx.meta.$responseHeaders, + 'Cache-Control': `public, max-age=${this.settings.cacheFor}` + }; + } return await ctx.call('jsonld.context.getLocal'); } } diff --git a/website/docs/middleware/jsonld/index.md b/website/docs/middleware/jsonld/index.md index 2dbe70be1..0f9b93982 100644 --- a/website/docs/middleware/jsonld/index.md +++ b/website/docs/middleware/jsonld/index.md @@ -51,8 +51,9 @@ module.exports = { ## Service settings -| Property | Type | Default | Description | -| -------------------- | ---------- | ----------------------------- | -------------------------------------------------------------- | -| `baseUri` | `String` | **required** | Base URL of the server. | -| `localContextPath` | `String` | "/.well-known/context.jsonld" | Path of the automatically generated local JSON-LD context file | -| `cachedContextFiles` | `[Object]` | | Context files to put in cache on start (see example above) | +| Property | Type | Default | Description | +| -------------------- | ---------- | ----------------------------- | -------------------------------------------------------------------------------------------------------------- | +| `baseUri` | `String` | **required** | Base URL of the server. | +| `localContextPath` | `String` | "/.well-known/context.jsonld" | Path of the automatically generated local JSON-LD context file | +| `cacheFor` | `number` | 21600 (6 hours) | `Cache-Control: public, max-age=` header for api responses in seconds. Set to `null`, to deactivate. | +| `cachedContextFiles` | `[Object]` | | Context files to put in cache on start (see example above) |