Skip to content

Commit

Permalink
[AIDANT][REINITIALISATION MOT DE PASSE] Exécute le lien de réinitiali…
Browse files Browse the repository at this point in the history
…sation du mot de passe une seule et unique fois
  • Loading branch information
bbougon committed Nov 8, 2024
1 parent 7f17da5 commit 4da97b0
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 6 deletions.
26 changes: 20 additions & 6 deletions mon-aide-cyber-api/src/authentification/ServiceUtilisateur.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ import { EntrepotUtilisateur } from './Utilisateur';
import { FournisseurHorloge } from '../infrastructure/horloge/FournisseurHorloge';
import { differenceInMinutes } from 'date-fns';
import { ErreurMAC } from '../domaine/erreurMAC';
import { sommeDeControle } from './sommeDeControle';

type Token = {
identifiant: string;
date: Date;
sommeDeControle: string;
};

type ModificationMotDePasse = {
Expand All @@ -24,12 +26,11 @@ export class ServiceUtilisateur {
modifieMotDePasse(
modificationMotDePasse: ModificationMotDePasse
): Promise<void> {
if (
differenceInMinutes(
FournisseurHorloge.maintenant(),
modificationMotDePasse.token.date
) > VINGT_MINUTES
) {
const lapsDeTemps = differenceInMinutes(
FournisseurHorloge.maintenant(),
modificationMotDePasse.token.date
);
if (lapsDeTemps > VINGT_MINUTES) {
return Promise.reject(
ErreurMAC.cree(
'Réinitialisation mot de passe',
Expand All @@ -42,6 +43,19 @@ export class ServiceUtilisateur {
return this.entrepotUtilisateur
.lis(modificationMotDePasse.token.identifiant)
.then((utilisateur) => {
if (
sommeDeControle(utilisateur.motDePasse) !==
modificationMotDePasse.token.sommeDeControle
) {
return Promise.reject(
ErreurMAC.cree(
'Réinitialisation mot de passe',
new ErreurReinitialisationMotDePasse(
'Le lien de réinitialisation du mot de passe n’est plus valide.'
)
)
);
}
utilisateur.motDePasse = modificationMotDePasse.motDePasse;
return this.entrepotUtilisateur.persiste(utilisateur);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { ServiceDeChiffrement } from '../../securite/ServiceDeChiffrement';
import { adaptateurCorpsMessage } from './adaptateurCorpsMessage';
import { adaptateurEnvironnement } from '../../adaptateurs/adaptateurEnvironnement';
import { FournisseurHorloge } from '../../infrastructure/horloge/FournisseurHorloge';
import { sommeDeControle } from '../sommeDeControle';

export type CommandeReinitialisationMotDePasse = Commande & {
type: 'CommandeReinitialisationMotDePasse';
Expand All @@ -32,6 +33,7 @@ export class CapteurCommandeReinitialisationMotDePasse
JSON.stringify({
identifiant: utilisateur.identifiant,
date: FournisseurHorloge.maintenant(),
sommeDeControle: sommeDeControle(utilisateur.motDePasse),
}),
'binary'
).toString('base64')
Expand Down
4 changes: 4 additions & 0 deletions mon-aide-cyber-api/src/authentification/sommeDeControle.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import crypto from 'crypto';

export const sommeDeControle = (valeur: string) =>
crypto.createHash('sha256').update(valeur).digest('base64');
4 changes: 4 additions & 0 deletions mon-aide-cyber-api/test/api/routesAPIUtilisateur.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,10 @@ describe('le serveur MAC sur les routes /api/utilisateur', () => {
const token = btoa(
JSON.stringify({
identifiant: utilisateur.identifiant,
sommeDeControle: crypto
.createHash('sha256')
.update(utilisateur.motDePasse)
.digest('base64'),
})
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { EntrepotUtilisateurMemoire } from '../../src/infrastructure/entrepots/m
import crypto from 'crypto';
import { add } from 'date-fns';
import { ErreurMAC } from '../../src/domaine/erreurMAC';
import { unUtilisateur } from '../constructeurs/constructeursAidantUtilisateur';

describe('Service utilisateur', () => {
describe('Modification du mot de passe', () => {
Expand All @@ -28,6 +29,38 @@ describe('Service utilisateur', () => {
token: {
identifiant: crypto.randomUUID(),
date: dateGenerationToken,
sommeDeControle: '',
},
})
).rejects.toStrictEqual(
ErreurMAC.cree(
'Réinitialisation mot de passe',
new ErreurReinitialisationMotDePasse(
'Le lien de réinitialisation du mot de passe n’est plus valide.'
)
)
);
});

it('N’est valide qu’une seule et unique fois', async () => {
FournisseurHorlogeDeTest.initialise(new Date());
const utilisateur = unUtilisateur()
.avecUnMotDePasse('nouveau-mot-de-passe')
.construis();
const entrepotUtilisateur = new EntrepotUtilisateurMemoire();
await entrepotUtilisateur.persiste(utilisateur);

expect(
new ServiceUtilisateur(entrepotUtilisateur).modifieMotDePasse({
motDePasse: 'mdp',
confirmationMotDePasse: 'mdp',
token: {
identifiant: utilisateur.identifiant,
date: FournisseurHorloge.maintenant(),
sommeDeControle: crypto
.createHash('sha256')
.update('ancien-mot-de-passe')
.digest('base64'),
},
})
).rejects.toStrictEqual(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { FauxServiceDeChiffrement } from '../../infrastructure/securite/FauxServ
import { adaptateurCorpsMessage } from '../../../src/authentification/reinitialisation-mot-de-passe/adaptateurCorpsMessage';
import { FournisseurHorloge } from '../../../src/infrastructure/horloge/FournisseurHorloge';
import { FournisseurHorlogeDeTest } from '../../infrastructure/horloge/FournisseurHorlogeDeTest';
import { sommeDeControle } from '../../../src/authentification/sommeDeControle';

describe('Capteur de commande de réinitialisation du mot de passe', () => {
beforeEach(() => {
Expand Down Expand Up @@ -36,6 +37,7 @@ describe('Capteur de commande de réinitialisation du mot de passe', () => {
JSON.stringify({
identifiant: utilisateur.identifiant,
date: FournisseurHorloge.maintenant(),
sommeDeControle: sommeDeControle(utilisateur.motDePasse),
}),
'binary'
).toString('base64'),
Expand Down

0 comments on commit 4da97b0

Please sign in to comment.