Skip to content

Commit

Permalink
[AIDANT][REINITIALISATION MOT DE PASSE] Retourne l’erreur 'Lien expir…
Browse files Browse the repository at this point in the history
…é' au client en cas de token invalide
  • Loading branch information
bbougon committed Nov 12, 2024
1 parent 447f337 commit 81da35f
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 3 deletions.
16 changes: 16 additions & 0 deletions mon-aide-cyber-api/src/api/gestionnaires/erreurs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@ import { ErreurEnvoiEmail } from '../messagerie/Messagerie';
import { ErreurModificationPreferences } from '../aidant/routesAPIAidantPreferences';
import { ErreurModificationProfil } from '../aidant/routesAPIProfil';
import { ErreurCreationEspaceAidant } from '../../espace-aidant/Aidant';
import { ErreurReinitialisationMotDePasse } from '../../authentification/ServiceUtilisateur';

const HTTP_MAUVAISE_REQUETE = 400;
const HTTP_NON_AUTORISE = 401;
const HTTP_ACCES_REFUSE = 403;
const HTTP_NON_TROUVE = 404;
const HTTP_EXPIRE = 419;
const HTTP_NON_TRAITABLE = 422;
const HTTP_ERREUR_SERVEUR = 500;

Expand Down Expand Up @@ -150,6 +152,20 @@ const erreursGerees: Map<
});
},
],
[
'ErreurReinitialisationMotDePasse',
(
erreur: ErreurMAC<ErreurReinitialisationMotDePasse>,
_requete,
_consignateur,
reponse
) => {
construisReponse(reponse, HTTP_EXPIRE, {
...constructeurActionsHATEOAS().actionsPubliques().construis(),
message: erreur.message,
});
},
],
]);

export const gestionnaireErreurGeneralisee = (
Expand Down
9 changes: 7 additions & 2 deletions mon-aide-cyber-api/src/api/routesAPIUtilisateur.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ type CorpsRequeteReinitialiserMotDePasse = core.ParamsDictionary & {
confirmationMotDePasse: string;
};

export type CorpsReponseReinitialiserMotDePasseEnErreur = ReponseHATEOAS & {
message: string;
};

type CorpsRequeteReinitialisationMotDePasse = core.ParamsDictionary & {
email: string;
};
Expand Down Expand Up @@ -116,7 +120,7 @@ export const routesAPIUtilisateur = (configuration: ConfigurationServeur) => {
async (
requete: Request<CorpsRequeteReinitialiserMotDePasse>,
reponse: Response,
_suite: NextFunction
suite: NextFunction
) => {
const resultatsValidation: Result<FieldValidationError> =
validationResult(requete) as Result<FieldValidationError>;
Expand All @@ -138,7 +142,8 @@ export const routesAPIUtilisateur = (configuration: ConfigurationServeur) => {
serviceDeChiffrement.dechiffre(atob(corpsRequete.token))
),
})
.then(() => reponse.status(204).send());
.then(() => reponse.status(204).send())
.catch((erreur) => suite(erreur));
}
);

Expand Down
61 changes: 60 additions & 1 deletion mon-aide-cyber-api/test/api/routesAPIUtilisateur.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,14 @@ import { AdaptateurDeVerificationDeSessionAvecContexteDeTest } from '../adaptate
import { AdaptateurDeVerificationDeSessionDeTest } from '../adaptateurs/AdaptateurDeVerificationDeSessionDeTest';

import { unUtilisateur } from '../constructeurs/constructeursAidantUtilisateur';
import { ReponseReinitialisationMotDePasseEnErreur } from '../../src/api/routesAPIUtilisateur';
import {
CorpsReponseReinitialiserMotDePasseEnErreur,
ReponseReinitialisationMotDePasseEnErreur,
} from '../../src/api/routesAPIUtilisateur';
import crypto from 'crypto';
import { FournisseurHorloge } from '../../src/infrastructure/horloge/FournisseurHorloge';
import { FournisseurHorlogeDeTest } from '../infrastructure/horloge/FournisseurHorlogeDeTest';
import { add } from 'date-fns';

describe('le serveur MAC sur les routes /api/utilisateur', () => {
const testeurMAC = testeurIntegration();
Expand Down Expand Up @@ -208,6 +212,61 @@ describe('le serveur MAC sur les routes /api/utilisateur', () => {
).toStrictEqual('n0uv3eaU-M0D3passe');
});

it('Retourne une erreur', async () => {
FournisseurHorlogeDeTest.initialise(new Date());
const utilisateur = unUtilisateur()
.avecUnMotDePasse('original')
.construis();
await testeurMAC.entrepots.utilisateurs().persiste(utilisateur);
const token = btoa(
JSON.stringify({
identifiant: utilisateur.identifiant,
date: FournisseurHorloge.maintenant(),
sommeDeControle: crypto
.createHash('sha256')
.update(utilisateur.motDePasse)
.digest('base64'),
})
);

FournisseurHorlogeDeTest.initialise(
add(FournisseurHorloge.maintenant(), { minutes: 25 })
);
const reponse = await executeRequete(
donneesServeur.app,
'PATCH',
`/api/utilisateur/reinitialiser-mot-de-passe`,
donneesServeur.portEcoute,
{
motDePasse: 'n0uv3eaU-M0D3passe',
confirmationMotDePasse: 'n0uv3eaU-M0D3passe',
token,
}
);

expect(reponse.statusCode).toBe(419);
expect(
await reponse.json()
).toStrictEqual<CorpsReponseReinitialiserMotDePasseEnErreur>({
message:
'Le lien de réinitialisation du mot de passe n’est plus valide.',
liens: {
'demande-devenir-aidant': {
methode: 'GET',
url: '/api/demandes/devenir-aidant',
},
'demande-etre-aide': {
methode: 'GET',
url: '/api/demandes/etre-aide',
},
'se-connecter': {
methode: 'POST',
url: '/api/token',
},
},
});
});

describe('Lors de la phase de validation', () => {
it('Valide le mot de passe', async () => {
const utilisateur = unUtilisateur()
Expand Down

0 comments on commit 81da35f

Please sign in to comment.