Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MEP: accessibilité suite contre-audit #1242

Merged
merged 10 commits into from
Dec 2, 2024
19 changes: 15 additions & 4 deletions backend/src/http/api/backoffice/gestion-organismes-routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ module.exports = ({ db, configuration, emails, middlewares, logger }) => {
}, { token: 0 }).stream();

let isKairos = organisme => {
let kairos = organisme.sources.find(s => s === 'kairos');
let kairos = organisme.sources && organisme.sources.find(s => s === 'kairos');
return kairos === 'kairos' ? 'oui' : 'non';
};
let isResponsable = organisme => organisme.nbAvisResponsablePasFormateurSiretExact > 0;
Expand Down Expand Up @@ -135,7 +135,7 @@ module.exports = ({ db, configuration, emails, middlewares, logger }) => {

router.put('/api/backoffice/moderateur/organismes/:id/updateCourriel', checkAuth, checkProfile('moderateur'), tryAndCatch(async (req, res) => {

let idNonModifie = (await Joi.validate(req.params, { id: Joi.required() }, { abortEarly: false })).id;
let idNonModifie = (await Joi.validate(req.params, { id: Joi.string().required() }, { abortEarly: false })).id;

let bonId = await recupererIdOrganisme(idNonModifie);

Expand Down Expand Up @@ -171,11 +171,22 @@ module.exports = ({ db, configuration, emails, middlewares, logger }) => {
ip: getRemoteAddress(req)
});

return res.status(201).send(result.value);
return res.status(201).send(await db.collection('accounts').findOne({ _id: organisme._id },
{
projection: {
profile: true,
codeRegion: true,
siret: true,
courriel: true,
courriels: true,
raison_sociale: true,
}
}
));
}));

router.post('/api/backoffice/moderateur/organismes/:id/resendEmailAccount', checkAuth, checkProfile('moderateur'), tryAndCatch(async (req, res) => {
let idNonModifie = (await Joi.validate(req.params, { id: Joi.required() }, { abortEarly: false })).id;
let idNonModifie = (await Joi.validate(req.params, { id: Joi.string().required() }, { abortEarly: false })).id;

let bonId = await recupererIdOrganisme(idNonModifie);

Expand Down
16 changes: 8 additions & 8 deletions ui/src/backoffice/components/anonymous/LoginPage.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,17 +45,17 @@ export default class LoginPage extends React.Component {
this.setState({ loading: true });

if (this.state.password === '' && this.state.identifiant === '') {
this.setState({ errorMessage: "Veuillez remplir tous les champs.", emptyField: 'both', loading: false });
this.setState({ errorMessage: "Veuillez remplir tous les champs.", emptyField: 'both', loading: false, errorid: 'empty-error' });
if (this.inputRef.current && this.inputRef.current.focus) {
this.inputRef.current.focus();
}
} else if (this.state.password === '') {
this.setState({ errorMessage: "Veuillez remplir votre mot de passe.", emptyField: 'password', loading: false });
this.setState({ errorMessage: "Veuillez remplir votre mot de passe.", emptyField: 'password', loading: false, errorid: 'empty-password-error' });
if (this.passwordInputRef.current && this.passwordInputRef.current.focus) {
this.passwordInputRef.current.focus();
}
} else if (this.state.identifiant === '') {
this.setState({ errorMessage: "Veuillez remplir votre identifiant.", emptyField: 'identifiant', loading: false });
this.setState({ errorMessage: "Veuillez remplir votre identifiant.", emptyField: 'identifiant', loading: false, errorid: 'empty-identifiant-error' });
if (this.inputRef.current && this.inputRef.current.focus) {
this.inputRef.current.focus();
}
Expand All @@ -65,7 +65,7 @@ export default class LoginPage extends React.Component {
.catch(() => {
const errorMessage = 'Votre identifiant et/ou votre mot de passe sont incorrects. ' +
'Si vous êtes un organisme, vous devez désormais vous identifier avec votre numéro de SIRET';
this.setState({ errorMessage: errorMessage, emptyField: 'incorrect' , loading: false });
this.setState({ errorMessage: errorMessage, emptyField: 'incorrect' , loading: false, errorid: 'bad-password-or-id-error' });
if (this.inputRef.current && this.inputRef.current.focus) {
this.inputRef.current.focus();
}
Expand Down Expand Up @@ -110,7 +110,7 @@ export default class LoginPage extends React.Component {
elements={
<>
<p className="clarification mt-1">Tous les champs sont obligatoires.</p>
<label for="identifiant">Identifiant</label>
<label htmlFor="identifiant">Identifiant</label>
<InputText
id="identifiant"
value={this.state.identifiant}
Expand All @@ -120,16 +120,16 @@ export default class LoginPage extends React.Component {
(this.state.emptyField === 'identifiant' || this.state.emptyField === 'both' || this.state.emptyField === 'incorrect') ?
this.state.errorMessage : ''
}
errorid={this.state.errorid}
autoComplete="username"
className="placeholder-opaque"
inputRef={this.inputRef}
aria-describedby="exemple-siret"
aria-invalid="true"
aria-required="true"
/>
<p id="exemple-siret" className="clarification mt-1">Le numero de SIRET se compose de 14 chiffres.<br/>Exemple&nbsp;:&nbsp;01234567890123</p>

<label for="motDePasse" className="mt-3">Mot de passe</label>
<label htmlFor="motDePasse" className="mt-3">Mot de passe</label>
<InputText
id="motDePasse"
type="password"
Expand All @@ -142,9 +142,9 @@ export default class LoginPage extends React.Component {
}
autoComplete="current-password"
className="placeholder-opaque"
aria-invalid="true"
inputRef={this.passwordInputRef}
aria-required="true"
invalid={this.state.emptyField === 'both' || this.state.emptyField === 'incorrect' || this.state.emptyField === 'password'}
/>
</>
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ export default class MotDePasseOubliePage extends React.Component {
title="Mot de passe oublié"
elements={
<>
<label for="identifiant">Entrez votre identifiant</label>
<label htmlFor="identifiant">Entrez votre identifiant</label>
<InputText
id="identifiant"
value={this.state.identifiant}
Expand All @@ -78,8 +78,9 @@ export default class MotDePasseOubliePage extends React.Component {
onChange={event => this.setState({ identifiant: event.target.value })}
autoComplete="username"
inputRef={this.inputRef}
aria-describedby="clarification-1"
/>
<p className="clarification mt-3">
<p className="clarification mt-3" id="clarification-1">
Si vous êtes un organisme, vous devez désormais renseigner votre numéro de
SIRET.
</p>
Expand All @@ -101,7 +102,6 @@ export default class MotDePasseOubliePage extends React.Component {
<>
<Button
size="small"
type="submit"
onClick={this.props.router.goBack}
>
Retour
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ export default class ReinitialisationMotDePassePage extends React.Component {
title="Créer un nouveau mot de passe"
elements={
<>
<label for="newMotDePasse" className="mt-3">Nouveau mot de passe</label>
<label htmlFor="newMotDePasse" className="mt-3">Nouveau mot de passe</label>
<InputText
id="newMotDePasse"
type="password"
Expand All @@ -117,12 +117,11 @@ export default class ReinitialisationMotDePassePage extends React.Component {
error={errors.emptyField || errors.passwordNotStrongEnough}
onChange={event => this.setState({ password: event.target.value })}
autoComplete="new-password"
aria-invalid="true"
inputRef={this.inputRef}
aria-required="true"
/>

<label for="confMotDePasse" className="mt-3">Confirmer le nouveau mot de passe</label>
<label htmlFor="confMotDePasse" className="mt-3">Confirmer le nouveau mot de passe</label>
<InputText
id="confMotDePasse"
type="password"
Expand All @@ -131,7 +130,6 @@ export default class ReinitialisationMotDePassePage extends React.Component {
error={errors.emptyField || errors.isNotSamePassword}
onChange={event => this.setState({ confirmation: event.target.value })}
autoComplete="new-password"
aria-invalid="true"
aria-required="true"
/>
</>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ export default class StatsForm extends React.Component {
<Form className="a-width-50">
<div className="d-flex justify-content-between align-items-end">
<div className="flex-grow-1 mr-2">
<label for="choix-region" style={{fontSize: "1.125rem", fontWeight: 700}}>Filtrer par région</label>
<label htmlFor="choix-region" style={{fontSize: "1.125rem", fontWeight: 700}}>Filtrer par région</label>
<Select
id="choix-region"
placeholder={'Toutes les régions'}
Expand Down
36 changes: 22 additions & 14 deletions ui/src/backoffice/components/common/MonComptePage.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,10 @@ export default class MonComptePage extends React.Component {
errors: {
passwordNotStrongEnough: null,
isNotSamePassword: null,
emptyField: null,
emptyCurrent: null,
emptyPasswordNew: null,
emptyPasswordConf: null,
invalidPassword: null,
},
};
}
Expand All @@ -40,7 +43,9 @@ export default class MonComptePage extends React.Component {
null : 'Le mot de passe doit contenir au moins 8 caractères dont au moins une minuscule, une majuscule, un chiffre et un caractère spécial.',
isNotSamePassword: password === confirmation ?
null : 'Les mots de passes ne sont pas identiques.',
emptyField: (current === '' || password === '' || confirmation === '') ? 'Veuillez remplir tous les champs.' : null,
emptyCurrent: (current === '') ? 'Veuillez remplir tous les champs.' : null,
emptyPasswordNew: (password === '') ? 'Veuillez remplir tous les champs.' : null,
emptyPasswordConf: (confirmation === '') ? 'Veuillez remplir tous les champs.' : null,
}
}, async () => {
let isFormValid = _.every(Object.values(this.state.errors), v => !v);
Expand All @@ -65,16 +70,16 @@ export default class MonComptePage extends React.Component {
confirmation: '',
});
})
.catch(async error => {
let json = await error.json();

.catch(() => {
showMessage({
text: json.message,
text: "Le mot de passe n'est pas correct",
color: 'red',
});

this.setState({
loading: false,
errors: {
invalidPassword: "Le mot de passe n'est pas correct",
loading: false,
}
});
});
}
Expand All @@ -95,36 +100,39 @@ export default class MonComptePage extends React.Component {
title="Mise à jour du mot de passe"
elements={
<>
<label for="motDePasseActu">Mot de passe actuel</label>
<label htmlFor="motDePasseActu">Mot de passe actuel</label>
<InputText
id="motDePasseActu"
type="password"
value={this.state.current}
placeholder="Mot de passe"
onChange={event => this.setState({ current: event.target.value })}
autoComplete="current-password"
error={errors.emptyField}
error={errors.emptyCurrent || errors.invalidPassword}
errorid={errors.emptyCurrent ? 'empty-password-actu' : (errors.invalidPassword ? 'password-invalid' : null)}
inputRef={this.inputRef}
/>

<label for="motDePasseNew" className="mt-3">Nouveau mot de passe</label>
<label htmlFor="motDePasseNew" className="mt-3">Nouveau mot de passe</label>
<InputText
id="motDePasseNew"
type="password"
value={this.state.password}
placeholder="Mot de passe"
error={errors.emptyField || errors.passwordNotStrongEnough}
error={errors.emptyPasswordNew || errors.passwordNotStrongEnough}
errorid={errors.emptyPasswordNew ? 'empty-password-new' : (errors.passwordNotStrongEnough ? 'password-not-strong-enough' : null)}
onChange={event => this.setState({ password: event.target.value })}
autoComplete="new-password"
/>

<label for="motDePasseConf" className="mt-3">Confirmer le nouveau mot de passe</label>
<label htmlFor="motDePasseConf" className="mt-3">Confirmer le nouveau mot de passe</label>
<InputText
id="motDePasseConf"
type="password"
value={this.state.confirmation}
placeholder="Mot de passe"
error={errors.emptyField || errors.isNotSamePassword}
error={errors.emptyPasswordConf || errors.isNotSamePassword}
errorid={errors.emptyPasswordConf ? 'empty-password-conf' : (errors.isNotSamePassword ? 'not-same-password' : null)}
onChange={event => this.setState({ confirmation: event.target.value })}
autoComplete="new-password"
/>
Expand Down
2 changes: 1 addition & 1 deletion ui/src/backoffice/components/common/avis/Notes.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ export default class Notes extends React.Component {
<div aria-hidden="true" className="text">
{note}/5 <Star />
</div>
<p class="sr-only">{note} sur 5</p>
<p className="sr-only">{note} sur 5</p>
</div>
);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const NoteCriteria = props => {
<span className="value">{props.note.moyenne}</span>/5
<Star svg={false} />
</div>
<p class="sr-only">{props.note.moyenne} sur 5</p>
<p className="sr-only">{props.note.moyenne} sur 5</p>
</div>
<div className="d-flex flex-column">
<div className="explication">
Expand Down Expand Up @@ -45,7 +45,7 @@ const NoteGlobale = props => {
<span className="value">{props.note.moyenne}</span>/5
<Star svg={false}/>
</div>
<p class="sr-only">{props.note.moyenne} sur 5</p>
<p className="sr-only">{props.note.moyenne} sur 5</p>
<div className="total">{props.total} notes</div>
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const NoteGauges = props => {
<div aria-hidden="true" className="note">
<span className="value">{props.note.moyenne}</span>/5<Star />
</div>
<p class="sr-only">{props.note.moyenne} sur 5</p>
<p className="sr-only">{props.note.moyenne} sur 5</p>
</div>
<ul className="d-flex flex-column no-space">
<li className="repartition">
Expand Down Expand Up @@ -91,7 +91,7 @@ const NoteGlobale = props => {
<div aria-hidden="true" className="note">
<span className="value">{props.note.moyenne}</span>/5<Star />
</div>
<p class="sr-only">{props.note.moyenne} sur 5</p>
<p className="sr-only">{props.note.moyenne} sur 5</p>
</div>
<div className="total">
{props.total} notes
Expand Down
Loading