Skip to content

Commit

Permalink
feat(api/auth/agent-connect/callback): filter access
Browse files Browse the repository at this point in the history
  • Loading branch information
rmonnier9 committed Oct 9, 2024
1 parent 43741b6 commit 3f7afde
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 1 deletion.
24 changes: 24 additions & 0 deletions pages/api/auth/agent-connect/callback.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import { agentConnectAuthenticate } from '#clients/authentication/agent-connect/strategy';
import { HttpForbiddenError } from '#clients/exceptions';
import { clientUniteLegaleRechercheEntreprise } from '#clients/recherche-entreprise/siren';
import { isServicePublic } from '#models/core/types';
import { Exception } from '#models/exceptions';
import { getAgent } from '#models/user/agent';
import { isAgentScope } from '#models/user/scopes';
import { extractSirenFromSiret } from '#utils/helpers';
import { logFatalErrorInSentry } from '#utils/sentry';
import { cleanPathFrom, getPathFrom, setAgentSession } from '#utils/session';
import withSession from '#utils/session/with-session';
Expand All @@ -10,6 +14,26 @@ export default withSession(async function callbackRoute(req, res) {
try {
const userInfo = await agentConnectAuthenticate(req);
const agent = await getAgent(userInfo);

const isWhitelisted = agent.scopes.some((scope) => isAgentScope(scope));
const { isMCP } = agent;

if (!isWhitelisted && isMCP) {
const siren = extractSirenFromSiret(agent.siret);
const uniteLegale = await clientUniteLegaleRechercheEntreprise(siren, 0);

const isNotServicePublic = !isServicePublic(uniteLegale);
// TODO filter base on uniteLegal if it's not a service public for sure
const couldBeServicePublic = true;

if (isNotServicePublic) {
if (couldBeServicePublic) {
return res.redirect('/connexion/habilitation-requise');
} else {
return res.redirect('/connexion/echec-autorisation-requise');
}
}
}
const session = req.session;
await setAgentSession(agent, session);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { ReactElement } from 'react';
import connexionRefusedPicture from '#components-ui/illustrations/connexion-refused';
import { LayoutConnexion } from '#components/layouts/layout-connexion';
import Meta from '#components/meta/meta-client';
import constants from '#models/constants';
import { NextPageWithLayout } from 'pages/_app';
import { ReactElement } from 'react';

const ConnexionFailure: NextPageWithLayout = () => (
<>
Expand Down
40 changes: 40 additions & 0 deletions pages/connexion/habilitation-requise.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { ReactElement } from 'react';
import connexionRefusedPicture from '#components-ui/illustrations/connexion-refused';
import { LayoutConnexion } from '#components/layouts/layout-connexion';
import Meta from '#components/meta/meta-client';
import { NextPageWithLayout } from 'pages/_app';

const ConnexionFailure: NextPageWithLayout = () => (
<>
<Meta
title="Vous n’êtes pas autorisé(e) à accéder à cette partie du site"
noIndex={true}
/>
<h1>Vous n’êtes pas autorisé(e) à accéder à cette partie du site</h1>
<p>
Votre compte ProConnect doit être reconnu comme agent public pour être
utilisé sur ce site.
</p>
<p>
Vous êtes agent(e) du service public et souhaitez que votre compte soit
reconnu en tant qu’agent public&nbsp;:{' '}
<a
href="https://www.demarches-simplifiees.fr/commencer/7991f7ad-97d9-4bf5-a326-ae37cc858081"
target="_blank"
rel="noopener noreferrer"
>
remplissez ce formulaire
</a>
.
</p>
<a href="/">← Retourner au moteur de recherche</a>
</>
);

ConnexionFailure.getLayout = function getLayout(page: ReactElement) {
return (
<LayoutConnexion img={connexionRefusedPicture}>{page}</LayoutConnexion>
);
};

export default ConnexionFailure;

0 comments on commit 3f7afde

Please sign in to comment.