@@ -234,7 +234,7 @@ <h3 id="inputs">Properties</h3>
234234
235235
236236 < div class ="tab-pane fade tab-source-code " id ="source ">
237- < pre class ="line-numbers compodoc-sourcecode "> < code class ="language-typescript "> import {InjectRedis} from '@nestjs-modules/ioredis';
237+ < pre class ="line-numbers compodoc-sourcecode "> < code class ="language-typescript "> import { InjectRedis } from '@nestjs-modules/ioredis';
238238import {
239239 BadRequestException,
240240 HttpException,
@@ -244,30 +244,31 @@ <h3 id="inputs">Properties</h3>
244244 NotFoundException,
245245} from '@nestjs/common';
246246import * as crypto from 'crypto';
247- import {randomInt} from 'crypto';
247+ import { randomInt } from 'crypto';
248248import Redis from 'ioredis';
249- import {AbstractService} from '~/_common/abstracts/abstract.service';
250- import {ActionType} from '~/core/backends/_enum/action-type.enum';
251- import {BackendsService} from '~/core/backends/backends.service';
252- import {Jobs} from '~/core/jobs/_schemas/jobs.schema';
253- import {AskTokenDto} from './_dto/ask-token.dto';
254- import {ChangePasswordDto} from './_dto/change-password.dto';
255- import {ResetPasswordDto} from './_dto/reset-password.dto';
256- import {IdentitiesCrudService} from '../identities/identities-crud.service';
257- import {get} from 'radash';
258- import {Identities} from '../identities/_schemas/identities.schema';
259- import {MailerService} from '@nestjs-modules/mailer';
260- import {InitAccountDto} from '~/management/passwd/_dto/init-account.dto';
261- import {ConfigService} from '@nestjs/config';
262- import {ResetByCodeDto} from '~/management/passwd/_dto/reset-by-code.dto';
263- import {PasswdadmService} from '~/settings/passwdadm.service';
264- import {IdentityState} from '~/management/identities/_enums/states.enum';
265- import {InitResetDto} from '~/management/passwd/_dto/init-reset.dto';
266- import {SmsadmService} from '~/settings/smsadm.service';
267- import {InitManyDto} from '~/management/passwd/_dto/init-many.dto';
268- import {InitStatesEnum} from '~/management/identities/_enums/init-state.enum';
269- import {MailadmService} from '~/settings/mailadm.service';
270- import {DataStatusEnum} from "~/management/identities/_enums/data-status";
249+ import { AbstractService } from '~/_common/abstracts/abstract.service';
250+ import { ActionType } from '~/core/backends/_enum/action-type.enum';
251+ import { BackendsService } from '~/core/backends/backends.service';
252+ import { Jobs } from '~/core/jobs/_schemas/jobs.schema';
253+ import { AskTokenDto } from './_dto/ask-token.dto';
254+ import { ChangePasswordDto } from './_dto/change-password.dto';
255+ import { ResetPasswordDto } from './_dto/reset-password.dto';
256+ import { IdentitiesCrudService } from '../identities/identities-crud.service';
257+ import { get } from 'radash';
258+ import { Identities } from '../identities/_schemas/identities.schema';
259+ import { MailerService } from '@nestjs-modules/mailer';
260+ import { InitAccountDto } from '~/management/passwd/_dto/init-account.dto';
261+ import { ConfigService } from '@nestjs/config';
262+ import { ResetByCodeDto } from '~/management/passwd/_dto/reset-by-code.dto';
263+ import { PasswdadmService } from '~/settings/passwdadm.service';
264+ import { IdentityState } from '~/management/identities/_enums/states.enum';
265+ import { InitResetDto } from '~/management/passwd/_dto/init-reset.dto';
266+ import { SmsadmService } from '~/settings/smsadm.service';
267+ import { InitManyDto } from '~/management/passwd/_dto/init-many.dto';
268+ import { InitStatesEnum } from '~/management/identities/_enums/init-state.enum';
269+ import { MailadmService } from '~/settings/mailadm.service';
270+ import { DataStatusEnum } from "~/management/identities/_enums/data-status";
271+ import { SentMessageInfo } from 'nodemailer';
271272
272273interface TokenData {
273274 k: string;
@@ -299,14 +300,15 @@ <h3 id="inputs">Properties</h3>
299300 ) {
300301 super();
301302 }
303+
302304 //Initialisation du reset de mot de passe envoie un email ou par sms un code et fourni un token au front.
303305 // Le code est la clé du token
304306 public async initReset(initDto: InitResetDto): Promise<any> {
305307 //envoi du mail
306308 try {
307309 const identity = (await this.identities.findOne({ 'inetOrgPerson.uid': initDto.uid })) as Identities;
308310 //test si on peu reninitialiser le compte
309- if ( identity.dataStatus === DataStatusEnum.INACTIVE || identity.dataStatus === DataStatusEnum.DELETED){
311+ if (identity.dataStatus === DataStatusEnum.INACTIVE || identity.dataStatus === DataStatusEnum.DELETED) {
310312 throw new BadRequestException(
311313 'Une erreur est survenue : Tentative de réinitialisation de mot de passe impossible',
312314 );
@@ -379,67 +381,70 @@ <h3 id="inputs">Properties</h3>
379381 return falseToken;
380382 }
381383 }
384+
382385 //Initialisation du compte. Envoi d' un mail avec un token pour l'init du compte
383- public async initAccount(initDto: InitAccountDto): Promise<any> {
384- //recherche de l'identity
386+ public async initAccount(initDto: InitAccountDto): Promise<SentMessageInfo> {
387+ const identity = (await this.identities.findOne({ 'inetOrgPerson.uid': initDto.uid })) as Identities;
388+ //test si on peu reninitialiser le compte
389+ if (identity.dataStatus === DataStatusEnum.INACTIVE || identity.dataStatus === DataStatusEnum.DELETED) {
390+ throw new BadRequestException(
391+ 'Une erreur est survenue : Tentative de réinitialisation de mot de passe impossible',
392+ );
393+ }
394+ //envoi du mail
395+ const params = await this.passwdadmService.getPolicies();
396+ const mailAttribute = params.emailAttribute;
397+ this.logger.log('mailer.identityMailAttribute : ' + mailAttribute);
398+
399+ if (!mailAttribute) {
400+ this.logger.error('Error while initAccount identityMailAttribute Empty');
401+ throw new BadRequestException({
402+ message: "Une erreur est survenue : l'attribut de l'adresse mail n'est pas défini",
403+ error: 'Bad Request',
404+ statusCode: 400,
405+ });
406+ }
407+
408+ const mail = <string>get(identity.toObject(), mailAttribute);
409+ if (!mail) {
410+ this.logger.error('Error while initAccount identityMailAttribute not defined');
411+ throw new BadRequestException({
412+ message: "Une erreur est survenue : L'identité <" + (identity.inetOrgPerson?.cn || identity._id) + "> n'a pas d'adresse mail",
413+ error: 'Bad Request',
414+ statusCode: 400,
415+ });
416+ }
417+
418+ const smtpParams = await this.mailadmService.getParams();
419+ //demande du token
420+ const k = crypto.randomBytes(PasswdService.RANDOM_BYTES_K).toString('hex');
421+ const token = await this.askToken({ mail: mail, uid: initDto.uid }, k, params.initTokenTTL);
422+ //envoi du token
423+
385424 try {
386- const identity = (await this.identities.findOne({ 'inetOrgPerson.uid': initDto.uid })) as Identities;
387- //test si on peu reninitialiser le compte
388- if ( identity.dataStatus === DataStatusEnum.INACTIVE || identity.dataStatus === DataStatusEnum.DELETED){
389- throw new BadRequestException(
390- 'Une erreur est survenue : Tentative de réinitialisation de mot de passe impossible',
391- );
392- }
393- //envoi du mail
394- const params = await this.passwdadmService.getPolicies();
395- const mailAttribute = params.emailAttribute;
396- this.logger.log('mailer.identityMailAttribute : ' + mailAttribute);
397- if (mailAttribute !== '') {
398- const mail = <string>get(identity.toObject(), mailAttribute);
399- if (mail) {
400- const smtpParams = await this.mailadmService.getParams();
401- //demande du token
402- const k = crypto.randomBytes(PasswdService.RANDOM_BYTES_K).toString('hex');
403- const token = await this.askToken({ mail: mail, uid: initDto.uid }, k, params.initTokenTTL);
404- //envoi du token
405- this.mailer
406- .sendMail({
407- from: smtpParams.sender,
408- to: mail,
409- subject: 'Activation de votre compte',
410- template: 'initaccount',
411- context: {
412- displayName: identity.inetOrgPerson.displayName,
413- uid: initDto.uid,
414- url: this.config.get('frontPwd.url') + '/initaccount/' + token,
415- mail: identity.inetOrgPerson.mail
416- },
417- })
418- .then(() => {
419- this.logger.log('Init compte envoyé pour uid' + initDto.uid + ' à ' + mail);
420- this.setInitState(identity, InitStatesEnum.SENT);
421- })
422- .catch((e) => {
423- this.logger.error('Erreur serveur lors de l envoi du mail' + e);
424- throw new BadRequestException({
425- message: 'Erreur serveur lors de l envoi du mail' + e,
426- error: 'Bad Request',
427- statusCode: 400,
428- });
429- });
425+ const send = await this.mailer.sendMail({
426+ from: smtpParams.sender,
427+ to: mail,
428+ subject: 'Activation de votre compte',
429+ template: 'initaccount',
430+ context: {
431+ displayName: identity.inetOrgPerson.displayName,
432+ uid: initDto.uid,
433+ url: this.config.get('frontPwd.url') + '/initaccount/' + token,
434+ mail: identity.inetOrgPerson.mail
435+ },
436+ })
437+ this.logger.log('Init compte envoyé pour uid ' + initDto.uid + ' à ' + mail);
438+ this.setInitState(identity, InitStatesEnum.SENT);
430439
431- return true;
432- } else {
433- this.logger.error('Error while initAccount identityMailAttribute Empty');
434- return false;
435- }
436- } else {
437- this.logger.error('Error while initAccount identityMailAttribute not defined');
438- return false;
439- }
440+ return send;
440441 } catch (e) {
441- this.logger.error('Error while initialize password. ' + e + ` (uid=${initDto?.uid})`);
442- return false;
442+ this.logger.error('Error while sending init account email: ' + e);
443+ throw new BadRequestException({
444+ message: 'Erreur serveur lors de l envoi du mail',
445+ error: 'Bad Request',
446+ statusCode: 400,
447+ });
443448 }
444449 }
445450
@@ -450,7 +455,7 @@ <h3 id="inputs">Properties</h3>
450455 'inetOrgPerson.uid': passwdDto.uid,
451456 state: IdentityState.SYNCED,
452457 })) as Identities;
453- if ( identity.dataStatus === DataStatusEnum.INACTIVE || identity.dataStatus === DataStatusEnum.DELETED){
458+ if (identity.dataStatus === DataStatusEnum.INACTIVE || identity.dataStatus === DataStatusEnum.DELETED) {
454459 throw new BadRequestException(
455460 'Une erreur est survenue : Tentative de réinitialisation de mot de passe impossible',
456461 );
@@ -482,7 +487,7 @@ <h3 id="inputs">Properties</h3>
482487 },
483488 );
484489 // on met actif l'identité
485- await this.identities.model.updateOne({ _id:identity._id},{ dataStatus: DataStatusEnum.ACTIVE})
490+ await this.identities.model.updateOne({ _id: identity._id }, { dataStatus: DataStatusEnum.ACTIVE })
486491 return result;
487492 } catch (e) {
488493 let job = undefined;
@@ -682,12 +687,19 @@ <h3 id="inputs">Properties</h3>
682687 if (identities.length === 0) {
683688 throw new HttpException('Aucune identité trouvée.', 404);
684689 }
690+
685691 const updated = await Promise.all(
686- identities.map((identity) => {
692+ identities.map(async (identity) => {
687693 this.logger.verbose('send To :' + identity.get('inetOrgPerson.uid'));
688- return this.initAccount({ uid: identity.get('inetOrgPerson.uid') });
694+ try {
695+ return await this.initAccount({ uid: identity.get('inetOrgPerson.uid') });
696+ } catch (e) {
697+ this.logger.error('Error while init account for ' + identity.get('inetOrgPerson.uid') + ': ' + e);
698+ return null;
699+ }
689700 }),
690701 );
702+
691703 return updated as any;
692704 }
693705
0 commit comments