Skip to content

Commit 6b73133

Browse files
committed
force password
1 parent b5e82e6 commit 6b73133

File tree

5 files changed

+115
-0
lines changed

5 files changed

+115
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { ApiProperty } from '@nestjs/swagger';
2+
import { IsString } from 'class-validator';
3+
4+
export class ForcePasswordDto {
5+
@IsString()
6+
@ApiProperty({ example: '66d80ab41821baca9bf965b2', description: 'User object id', type: String })
7+
public id: string;
8+
9+
@IsString()
10+
@ApiProperty({ example: 'MyNewPassword', description: 'New password', type: String })
11+
public newPassword: string;
12+
}

src/management/identities/abstract-identities.service.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@ import { BackendsService } from '~/core/backends/backends.service';
1313
import { construct, omit } from 'radash';
1414
import { toPlainAndCrush } from '~/_common/functions/to-plain-and-crush';
1515
import { createHash } from 'node:crypto';
16+
import {PasswdadmService} from "~/settings/passwdadm.service";
1617

1718
@Injectable()
1819
export abstract class AbstractIdentitiesService extends AbstractServiceSchema {
1920
public constructor(
2021
@InjectModel(Identities.name) protected _model: Model<Identities>,
2122
protected readonly _validation: IdentitiesValidationService,
2223
protected readonly storage: FactorydriveService,
24+
protected readonly passwdAdmService: PasswdadmService,
2325
@Inject(forwardRef(() => BackendsService)) protected readonly backends: BackendsService,
2426
) {
2527
super();
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { AbstractController } from '~/_common/abstracts/abstract.controller';
2+
import { IdentitiesActivationService } from '~/management/identities/identities-activation.service';
3+
import { ApiOperation, ApiResponse, ApiTags} from '@nestjs/swagger';
4+
import { Body, Controller, HttpStatus, Post, Res} from '@nestjs/common';
5+
import { Response } from 'express';
6+
import { ActivationDto } from '~/management/identities/_dto/_parts/activation-dto';
7+
import {ForcePasswordDto} from "~/management/identities/_dto/force-password-dto";
8+
import {IdentitiesForcepasswordService} from "~/management/identities/identities-forcepassword.service";
9+
10+
@ApiTags('management/identities')
11+
@Controller('identities')
12+
export class IdentitiesForcePasswordController extends AbstractController {
13+
public constructor(protected readonly _service: IdentitiesForcepasswordService) {
14+
super();
15+
}
16+
@Post('forcepassword')
17+
@ApiOperation({ summary: 'force le mot de passe de l identite' })
18+
@ApiResponse({ status: HttpStatus.OK })
19+
public async forcePassword(@Res() res: Response, @Body() body: ForcePasswordDto): Promise<Response> {
20+
try {
21+
const data = await this._service.forcePassword(body.id, body.newPassword);
22+
return res.status(HttpStatus.OK).json({
23+
statusCode: HttpStatus.OK,
24+
data,
25+
});
26+
} catch (error) {
27+
return res.status(HttpStatus.BAD_REQUEST).json({
28+
statusCode: HttpStatus.BAD_REQUEST,
29+
message: error.message,
30+
});
31+
}
32+
}
33+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { AbstractIdentitiesService } from '~/management/identities/abstract-identities.service';
2+
import { Identities } from '~/management/identities/_schemas/identities.schema';
3+
import {BadRequestException, HttpException, Injectable} from '@nestjs/common';
4+
import { DataStatusEnum } from '~/management/identities/_enums/data-status';
5+
import {ActionType} from "~/core/backends/_enum/action-type.enum";
6+
7+
8+
9+
@Injectable()
10+
export class IdentitiesForcepasswordService extends AbstractIdentitiesService {
11+
12+
public async forcePassword(id: string, newPassword: string) {
13+
//recherche de l'identité
14+
let identity: Identities = null;
15+
try {
16+
identity = await this.findById<Identities>(id);
17+
} catch (error) {
18+
throw new HttpException('Id not found', 400);
19+
}
20+
if (identity.lastBackendSync === null) {
21+
throw new HttpException('Identity has never been synced', 400);
22+
}
23+
if (identity.dataStatus === DataStatusEnum.DELETED) {
24+
throw new BadRequestException('Identity is in status deleted');
25+
}
26+
//changement du password check de la policy
27+
if ((await this.passwdAdmService.checkPolicies(newPassword)) === false) {
28+
throw new BadRequestException({
29+
message: 'Une erreur est survenue : Le mot de passe ne respecte pas la politique des mots de passe',
30+
error: 'Bad Request',
31+
statusCode: 400,
32+
});
33+
//ok on envoie le changement de mdp
34+
try{
35+
const [_, response] = await this.backends.executeJob(
36+
ActionType.IDENTITY_PASSWORD_RESET,
37+
identity._id,
38+
{ uid: identity.inetOrgPerson.uid, newPassword: newPassword, ...identity.toJSON() },
39+
{
40+
async: false,
41+
timeoutDiscard: true,
42+
disableLogs: false,
43+
switchToProcessing: false,
44+
updateStatus: false,
45+
},
46+
);
47+
if (response?.status === 0) {
48+
return [_, response];
49+
}
50+
}catch (e) {
51+
this.logger.error('Error while reseting password. ' + e + ` (uid=${identity.inetOrgPerson.uid})`);
52+
throw new BadRequestException(
53+
'Une erreur est survenue : Tentative de réinitialisation de mot de passe impossible',
54+
);
55+
}
56+
57+
58+
}
59+
}
60+
}

src/management/identities/identities.module.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ import { IdentitiesPhotoController } from '~/management/identities/identities-ph
1818
import { IdentitiesActivationController } from '~/management/identities/identities-activation.controller';
1919
import { IdentitiesActivationService } from '~/management/identities/identities-activation.service';
2020
import { IdentitiesDoublonController } from '~/management/identities/identities-doublon.controller';
21+
import {IdentitiesForcePasswordController} from "~/management/identities/identities-forcepassword.controller";
22+
import {IdentitiesForcepasswordService} from "~/management/identities/identities-forcepassword.service";
23+
import {SettingsModule} from "~/settings/settings.module";
24+
import {PasswdadmService} from "~/settings/passwdadm.service";
25+
import {PasswdModule} from "~/management/passwd/passwd.module";
2126

2227
@Module({
2328
imports: [
@@ -31,6 +36,7 @@ import { IdentitiesDoublonController } from '~/management/identities/identities-
3136
]),
3237
FilestorageModule,
3338
forwardRef(() => BackendsModule),
39+
SettingsModule
3440
],
3541
providers: [
3642
IdentitiesUpsertService,
@@ -43,13 +49,15 @@ import { IdentitiesDoublonController } from '~/management/identities/identities-
4349
useClass: IdentitiesValidationFilter,
4450
},
4551
IdentitiesJsonformsService,
52+
IdentitiesForcepasswordService
4653
],
4754
controllers: [
4855
IdentitiesCrudController,
4956
IdentitiesUpsertController,
5057
IdentitiesPhotoController,
5158
IdentitiesDoublonController,
5259
IdentitiesActivationController,
60+
IdentitiesForcePasswordController
5361
],
5462
exports: [IdentitiesCrudService],
5563
})

0 commit comments

Comments
 (0)